📄 datechooserpanel.java
字号:
/*--------------------------------------------------------------------------*
| Copyright (C) 2006 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.plugin.abstractcalendar;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collection;
import java.util.Date;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JPanel;
import org.apache.avalon.framework.activity.Disposable;
import org.apache.avalon.framework.container.ContainerUtil;
import org.rapla.components.calendar.DateChangeEvent;
import org.rapla.components.calendar.DateChangeListener;
import org.rapla.components.calendar.RaplaArrowButton;
import org.rapla.components.calendar.RaplaCalendar;
import org.rapla.components.layout.TableLayout;
import org.rapla.entities.domain.Period;
import org.rapla.framework.RaplaContext;
import org.rapla.framework.RaplaException;
import org.rapla.gui.CalendarModel;
import org.rapla.gui.RaplaGUIComponent;
import org.rapla.gui.internal.common.PeriodChooser;
import org.rapla.gui.toolkit.RaplaWidget;
public class DateChooserPanel extends RaplaGUIComponent
implements
Disposable
,RaplaWidget
{
Collection listenerList = new ArrayList();
JPanel panel = new JPanel();
JButton prevButton = new RaplaArrowButton('<', 28);
RaplaCalendar dateSelection;
PeriodChooser periodChooser;
JButton nextButton = new RaplaArrowButton('>', 28);
int incrementSize = Calendar.WEEK_OF_YEAR;
CalendarModel model;
Listener listener = new Listener();
public DateChooserPanel(RaplaContext sm, CalendarModel model) throws RaplaException {
super( sm );
boolean hasPeriodChooser = true;
this.model = model;
periodChooser = new PeriodChooser(getContext(),PeriodChooser.START_ONLY);
dateSelection = createRaplaCalendar();
//prevButton.setText("<");
//nextButton.setText(">");
double pre =TableLayout.PREFERRED;
double[][] sizes = {{0.02,pre,5,pre,2,0.9,5,pre,0.02}
,{0.5,pre,0.5}};
TableLayout tableLayout = new TableLayout(sizes);
panel.setLayout(tableLayout);
panel.add(prevButton,"1,1");
panel.add(dateSelection,"3,1");
if ( hasPeriodChooser ) {
panel.add(periodChooser,"5,1");
}
panel.add(nextButton,"7,1");
periodChooser.setDate(getQuery().today());
nextButton.addActionListener( listener );
prevButton.addActionListener( listener);
dateSelection.addDateChangeListener( listener);
periodChooser.addActionListener( listener);
update();
}
boolean listenersEnabled = true;
public void update() throws RaplaException
{
listenersEnabled = false;
try {
periodChooser.setPeriodModel( getPeriodModel());
if ( model.getSelectedDate() == null) {
model.setSelectedDate( getQuery().today());
}
Date date = model.getSelectedDate();
periodChooser.setDate( date);
dateSelection.setDate( date);
} finally {
listenersEnabled = true;
}
}
public void dispose() {
periodChooser.removeActionListener( listener );
ContainerUtil.dispose( periodChooser );
}
public void setNavigationVisible( boolean enable) {
nextButton.setVisible( enable);
prevButton.setVisible( enable);
}
/** possible values are Calendar.DATE, Calendar.WEEK_OF_YEAR, Calendar.MONTH and Calendar.YEAR.
Default is Calendar.WEEK_OF_YEAR.
*/
public void setIncrementSize(int incrementSize) {
this.incrementSize = incrementSize;
}
/** registers new DateChangeListener for this component.
* An DateChangeEvent will be fired to every registered DateChangeListener
* when the a different date is selected.
* @see DateChangeListener
* @see DateChangeEvent
*/
public void addDateChangeListener(DateChangeListener listener) {
listenerList.add(listener);
}
/** removes a listener from this component.*/
public void removeDateChangeListener(DateChangeListener listener) {
listenerList.remove(listener);
}
public DateChangeListener[] getDateChangeListeners() {
return (DateChangeListener[])listenerList.toArray(new DateChangeListener[]{});
}
/** An ActionEvent will be fired to every registered ActionListener
* when the a different date is selected.
*/
protected void fireDateChange(Date date) {
if (listenerList.size() == 0)
return;
DateChangeListener[] listeners = getDateChangeListeners();
DateChangeEvent evt = new DateChangeEvent(this,date);
for (int i = 0;i<listeners.length;i++) {
listeners[i].dateChanged(evt);
}
}
public JComponent getComponent() {
return panel;
}
class Listener implements ActionListener, DateChangeListener {
public void actionPerformed(ActionEvent evt) {
if (!listenersEnabled)
return;
Date date;
Calendar calendar = getRaplaLocale().createCalendar();
calendar.setTime(dateSelection.getDate());
if (evt.getSource() == prevButton) {
calendar.add(incrementSize,-1);
}
if (evt.getSource() == nextButton) {
calendar.add(incrementSize,1);
}
if (evt.getSource() == periodChooser) {
date = periodChooser.getDate();
Period period = periodChooser.getPeriod();
model.setStartDate( period.getStart() );
model.setEndDate( period.getEnd() );
} else {
date = calendar.getTime();
}
updateDates( date );
fireDateChange( date);
}
public void dateChanged(DateChangeEvent evt) {
if ( !listenersEnabled)
return;
try {
listenersEnabled = false;
} finally {
listenersEnabled = true;
}
updateDates( evt.getDate());
fireDateChange(evt.getDate());
}
private void updateDates(Date date) {
try {
listenersEnabled = false;
model.setSelectedDate( date );
// EXCO: It seems not nice to me that the start date
// is in the parameter and the end date is extracted
// from the model.
// But, with this way, I am certain that
// nothing can get broken.
periodChooser.setDate( date, model.getEndDate() );
dateSelection.setDate( date);
} finally {
listenersEnabled = true;
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -