📄 abstractswingcalendar.java
字号:
/*--------------------------------------------------------------------------*
| Copyright (C) 2006 Gereon Fassbender, Christopher Kohlhaas |
| |
| This program is free software; you can redistribute it and/or modify |
| it under the terms of the GNU General Public License as published by the |
| Free Software Foundation. A copy of the license has been included with |
| these distribution in the COPYING file, if not go to www.fsf.org |
| |
| As a special exception, you are granted the permissions to link this |
| program with every library, which license fulfills the Open Source |
| Definition as published by the Open Source Initiative (OSI). |
*--------------------------------------------------------------------------*/
package org.rapla.components.calendarview.swing;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Point;
import java.awt.Rectangle;
import java.text.DateFormat;
import java.text.FieldPosition;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collection;
import java.util.Collections;
import java.util.Date;
import java.util.Iterator;
import java.util.Locale;
import java.util.TimeZone;
import javax.swing.BoxLayout;
import javax.swing.JPanel;
import javax.swing.JScrollBar;
import javax.swing.JScrollPane;
import javax.swing.JViewport;
import javax.swing.ScrollPaneConstants;
import javax.swing.border.Border;
import javax.swing.border.EtchedBorder;
import org.rapla.components.calendarview.Block;
import org.rapla.components.calendarview.Builder;
import org.rapla.components.calendarview.CalendarView;
import org.rapla.components.calendarview.WeekdayMapper;
import org.rapla.components.layout.TableLayout;
public abstract class AbstractSwingCalendar extends JPanel implements CalendarView {
static Border SLOTHEADER_BORDER = new EtchedBorder();
int slotSize = 100;
boolean bEditable = true;
protected Collection excludeDays = Collections.EMPTY_SET;
WeekdayMapper weekdayMapper;
TimeZone timeZone;
private Date startDate;
private Date endDate;
ArrayList listenerList = new ArrayList();
JScrollPane scrollPane = new JScrollPane();
JPanel jHeader = new JPanel();
BoxLayout boxLayout1 = new BoxLayout(jHeader, BoxLayout.X_AXIS);
JPanel jCenter = new JPanel();
Locale locale;
Collection builders = new ArrayList();
/** Calendar used by the put block method */
protected Calendar blockCalendar;
AbstractSwingCalendar(boolean showScrollPane) {
jHeader.setLayout(boxLayout1);
jHeader.setOpaque( false );
jCenter.setOpaque( false );
if (showScrollPane) {
setLayout(new BorderLayout());
add(scrollPane,BorderLayout.CENTER);
scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED);
scrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
scrollPane.setViewportView(jCenter);
scrollPane.setColumnHeaderView(jHeader);
scrollPane.getVerticalScrollBar().setUnitIncrement(10);
scrollPane.getHorizontalScrollBar().setUnitIncrement(10);
scrollPane.setBorder(null);
} else {
setLayout(new TableLayout(new double[][] {
{TableLayout.PREFERRED,TableLayout.FILL}
,{TableLayout.PREFERRED,TableLayout.FILL}
}));
add(jHeader,"1,0");
add(jCenter,"1,1");
}
this.timeZone = TimeZone.getDefault();
setLocale( Locale.getDefault() );
}
public void setTimeZone(TimeZone timeZone) {
this.timeZone = timeZone;
blockCalendar = createCalendar();
}
Calendar createCalendar() {
return Calendar.getInstance(getTimeZone(),locale);
}
public TimeZone getTimeZone() {
return timeZone;
}
public void setLocale(Locale locale) {
this.locale = locale;
weekdayMapper = new WeekdayMapper( locale );
super.setLocale( locale);
// Constructor called?
if (timeZone != null) {
setTimeZone( timeZone );
blockCalendar = createCalendar();
}
}
public void setToDate(Date date) {
calcMinMaxDates( date );
}
protected void setStartDate( Date startDate )
{
this.startDate = startDate;
}
public Date getStartDate()
{
return startDate;
}
protected void setEndDate( Date endDate )
{
this.endDate = endDate;
}
public Date getEndDate()
{
return endDate;
}
public void setExcludeDays(Collection excludeDays) {
this.excludeDays = excludeDays;
if (getStartDate() != null)
calcMinMaxDates( getStartDate() );
}
abstract void calcMinMaxDates(Date date);
void checkBlock( Block bl ) {
if ( !bl.getStart().before(this.getEndDate())) {
throw new IllegalStateException("Start-date " +bl.getStart() + " must be before calendar end at " +this.getEndDate());
}
}
public boolean isEditable() {
return bEditable;
}
public void setEditable( boolean editable ) {
bEditable = editable;
}
/**
Width of a single slot in pixel.
*/
public void setSlotSize(int slotSize) {
this.slotSize = Math.max(40, Math.min(300,slotSize));
}
public int getSlotSize() {
return slotSize;
}
public void setBackground(Color color) {
super.setBackground(color);
if (scrollPane != null)
scrollPane.setBackground(color);
if (jCenter != null)
jCenter.setBackground(color);
if (jHeader != null)
jHeader.setBackground(color);
}
public Iterator getBuilders() {
return builders.iterator();
}
public void addBuilder(Builder b) {
builders.add(b);
}
public void removeBuilder(Builder b) {
builders.remove(b);
}
public void addCalendarViewListener(ViewListener listener) {
listenerList.add(listener);
}
public void removeCalendarViewListener(ViewListener listener) {
listenerList.remove(listener);
}
JScrollPane getScrollPane() {
return scrollPane;
}
void scrollTo(int x, int y) {
JViewport viewport = scrollPane.getViewport();
Rectangle rect = viewport.getViewRect();
int leftBound = rect.x;
int upperBound = rect.y;
int lowerBound = rect.y + rect.height;
int rightBound = rect.x + rect.width;
int maxX = viewport.getView().getWidth();
int maxY = viewport.getView().getHeight();
JScrollBar scrollBar = scrollPane.getVerticalScrollBar();
if ( y > lowerBound && lowerBound < maxY) {
scrollBar.setValue(scrollBar.getValue() + 20);
}
if ( y < upperBound && upperBound >0) {
scrollBar.setValue(scrollBar.getValue() - 20);
}
scrollBar = scrollPane.getHorizontalScrollBar();
if ( x > rightBound && rightBound < maxX) {
scrollBar.setValue(scrollBar.getValue() + 20);
}
if ( x < leftBound && leftBound >0) {
scrollBar.setValue(scrollBar.getValue() - 20);
}
}
public void rebuild(Builder builder) {
try {
addBuilder( builder);
rebuild();
} finally {
removeBuilder( builder );
}
}
public ViewListener[] getWeekViewListeners() {
return (ViewListener[])listenerList.toArray(new ViewListener[]{});
}
final void fireSelectionChanged(Date start, Date end) {
// Fire the popup event
ViewListener[] listeners = getWeekViewListeners();
for (int i=0;i<listeners.length;i++) {
listeners[i].selectionChanged(start,end);
}
}
final void fireSelectionPopup(Component slot, Point p, Date start, Date end, int slotNr) {
// Fire the popup event
ViewListener[] listeners = getWeekViewListeners();
for (int i=0;i<listeners.length;i++) {
listeners[i].selectionPopup(slot,p,start,end, slotNr);
}
}
final void fireMoved(SwingBlock block, Point p, Date newTime) {
// Fire the popup event
ViewListener[] listeners = getWeekViewListeners();
for (int i=0;i<listeners.length;i++) {
listeners[i].moved(block,p,newTime);
}
}
final void fireResized(SwingBlock block, Point p, Date newStart, Date newEnd) {
// Fire the popup event
ViewListener[] listeners = getWeekViewListeners();
for (int i=0;i<listeners.length;i++) {
listeners[i].resized(block,p,newStart,newEnd);
}
}
void fireResized(SwingBlock block, Point p, Date newTime) {
// Fire the popup event
ViewListener[] listeners = getWeekViewListeners();
for (int i=0;i<listeners.length;i++) {
listeners[i].moved(block,p,newTime);
}
}
void fireBlockPopup(SwingBlock block, Point p) {
// Fire the popup event
ViewListener[] listeners = getWeekViewListeners();
for (int i=0;i<listeners.length;i++) {
listeners[i].blockPopup(block,p);
}
}
void fireBlockEdit(SwingBlock block, Point p) {
// Fire the popup event
ViewListener[] listeners = getWeekViewListeners();
for (int i=0;i<listeners.length;i++) {
listeners[i].blockEdit(block,p);
}
}
/** formats the date and month in the selected locale and timeZone*/
public static String formatDateMonth(Date date, Locale locale, TimeZone timeZone) {
FieldPosition fieldPosition = new FieldPosition( DateFormat.YEAR_FIELD );
StringBuffer buf = new StringBuffer();
DateFormat format = DateFormat.getDateInstance( DateFormat.SHORT, locale);
format.setTimeZone( timeZone );
buf = format.format(date,
buf,
fieldPosition
);
if ( fieldPosition.getEndIndex()<buf.length() ) {
buf.delete( fieldPosition.getBeginIndex(), fieldPosition.getEndIndex()+1 );
} else if ( (fieldPosition.getBeginIndex()>=0) ) {
buf.delete( fieldPosition.getBeginIndex(), fieldPosition.getEndIndex() );
}
if (buf.charAt(buf.length()-1) == '/')
return buf.substring(0,buf.length()-1);
else
return buf.toString();
}
/** formats the day of week, date and month in the selected locale and timeZone*/
public static String formatDayOfWeekDateMonth(Date date, Locale locale, TimeZone timeZone) {
SimpleDateFormat format = new SimpleDateFormat("EEE", locale);
format.setTimeZone(timeZone);
return format.format(date) + " " + formatDateMonth( date,locale,timeZone ) ;
}
/** returns the name of the weekday */
String formatDayOfWeek(Date date) {
SimpleDateFormat format = new SimpleDateFormat("EEEEE", locale);
format.setTimeZone(getTimeZone());
return format.format(date);
}
abstract int getDayCount();
abstract DaySlot getDay(int num);
abstract int calcSlotNr( int x, int y);
abstract int getSlotNr( DaySlot slot);
abstract int getRowsPerDay();
abstract Date createDate( DaySlot slot, int row, boolean startOfRow);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -