001: /*--------------------------------------------------------------------------*
002: | Copyright (C) 2006 Christopher Kohlhaas |
003: | |
004: | This program is free software; you can redistribute it and/or modify |
005: | it under the terms of the GNU General Public License as published by the |
006: | Free Software Foundation. A copy of the license has been included with |
007: | these distribution in the COPYING file, if not go to www.fsf.org |
008: | |
009: | As a special exception, you are granted the permissions to link this |
010: | program with every library, which license fulfills the Open Source |
011: | Definition as published by the Open Source Initiative (OSI). |
012: *--------------------------------------------------------------------------*/
013:
014: package org.rapla.plugin.abstractcalendar;
015:
016: import java.awt.Font;
017: import java.awt.event.ActionEvent;
018: import java.awt.event.ActionListener;
019: import java.util.ArrayList;
020: import java.util.Calendar;
021: import java.util.Collection;
022: import java.util.Date;
023:
024: import javax.swing.JComponent;
025: import javax.swing.JLabel;
026: import javax.swing.JPanel;
027:
028: import org.rapla.components.calendar.DateChangeEvent;
029: import org.rapla.components.calendar.DateChangeListener;
030: import org.rapla.components.calendar.RaplaCalendar;
031: import org.rapla.components.layout.TableLayout;
032: import org.rapla.components.util.DateTools;
033: import org.rapla.entities.domain.Period;
034: import org.rapla.framework.RaplaContext;
035: import org.rapla.framework.RaplaException;
036: import org.rapla.gui.CalendarModel;
037: import org.rapla.gui.RaplaGUIComponent;
038: import org.rapla.gui.internal.common.PeriodChooser;
039: import org.rapla.gui.toolkit.RaplaWidget;
040:
041: public class IntervallChooserPanel extends RaplaGUIComponent implements
042: RaplaWidget {
043: Collection listenerList = new ArrayList();
044: PeriodChooser periodChooser;
045:
046: JPanel panel = new JPanel();
047: RaplaCalendar startDateSelection;
048: RaplaCalendar endDateSelection;
049: boolean listenersEnabled = true;
050: CalendarModel model;
051: Listener listener = new Listener();
052:
053: public IntervallChooserPanel(RaplaContext sm, CalendarModel model)
054: throws RaplaException {
055: super (sm);
056: this .model = model;
057:
058: periodChooser = new PeriodChooser(getContext(),
059: PeriodChooser.START_AND_END);
060: periodChooser.setWeekOfPeriodVisible(false);
061:
062: startDateSelection = createRaplaCalendar();
063: endDateSelection = createRaplaCalendar();
064: //prevButton.setText("<");
065: //nextButton.setText(">");
066: double pre = TableLayout.PREFERRED;
067: double[][] sizes = { { 0.02, pre, 5, 0.9, 5, pre, 0.02 },
068: { 1, 9, pre, 0.5 } };
069: TableLayout tableLayout = new TableLayout(sizes);
070: panel.setLayout(tableLayout);
071: JLabel startLabel = new JLabel(getString("start_date") + ":");
072: Font labelFont = startLabel.getFont().deriveFont(Font.PLAIN,
073: (float) 10.0);
074: JLabel endLabel = new JLabel(getString("end_date") + ":");
075: startLabel.setFont(labelFont);
076: endLabel.setFont(labelFont);
077: panel.add(startLabel, "1,1");
078: panel.add(startDateSelection, "1,2");
079: panel.add(periodChooser, "3,2");
080: periodChooser.addActionListener(listener);
081: //panel.add(dateSelection,"3,1");
082: panel.add(endLabel, "5,1");
083: panel.add(endDateSelection, "5,2");
084:
085: startDateSelection.addDateChangeListener(listener);
086: endDateSelection.addDateChangeListener(listener);
087: update();
088: }
089:
090: public void update() throws RaplaException {
091: listenersEnabled = false;
092: try {
093: if (model.getStartDate() == null) {
094: model.setStartDate(getQuery().today());
095: }
096: if (model.getEndDate() == null) {
097: Calendar cal = getRaplaLocale().createCalendar();
098: cal.setTime(model.getStartDate());
099: cal.add(Calendar.YEAR, 1);
100: model.setEndDate(cal.getTime());
101: }
102: if (model.getSelectedDate() == null) {
103: model.setSelectedDate(model.getStartDate());
104: }
105: Date startDate = model.getStartDate();
106: startDateSelection.setDate(startDate);
107: periodChooser.setDate(startDate);
108: Date endDate = model.getEndDate();
109: endDateSelection.setDate(DateTools.subDay(endDate));
110: } finally {
111: listenersEnabled = true;
112: }
113: }
114:
115: /** registers new DateChangeListener for this component.
116: * An DateChangeEvent will be fired to every registered DateChangeListener
117: * when the a different date is selected.
118: * @see DateChangeListener
119: * @see DateChangeEvent
120: */
121: public void addDateChangeListener(DateChangeListener listener) {
122: listenerList.add(listener);
123: }
124:
125: /** removes a listener from this component.*/
126: public void removeDateChangeListener(DateChangeListener listener) {
127: listenerList.remove(listener);
128: }
129:
130: public DateChangeListener[] getDateChangeListeners() {
131: return (DateChangeListener[]) listenerList
132: .toArray(new DateChangeListener[] {});
133: }
134:
135: /** An ActionEvent will be fired to every registered ActionListener
136: * when the a different date is selected.
137: */
138: protected void fireDateChange(Date date) {
139: if (listenerList.size() == 0)
140: return;
141: DateChangeListener[] listeners = getDateChangeListeners();
142: DateChangeEvent evt = new DateChangeEvent(this , date);
143: for (int i = 0; i < listeners.length; i++) {
144: listeners[i].dateChanged(evt);
145: }
146: }
147:
148: public JComponent getComponent() {
149: return panel;
150: }
151:
152: class Listener implements DateChangeListener, ActionListener {
153: public void actionPerformed(ActionEvent e) {
154: if (!listenersEnabled)
155: return;
156: Period period = periodChooser.getPeriod();
157: if (period == null) {
158: return;
159: }
160: updateDates(period.getStart(), period.getEnd());
161: fireDateChange(period.getStart());
162: }
163:
164: public void dateChanged(DateChangeEvent evt) {
165: if (!listenersEnabled)
166: return;
167: updateDates(startDateSelection.getDate(), DateTools
168: .addDay(endDateSelection.getDate()));
169: fireDateChange(evt.getDate());
170: }
171:
172: private void updateDates(Date start, Date end) {
173: try {
174: listenersEnabled = false;
175: model.setStartDate(start);
176: model.setEndDate(end);
177: model.setSelectedDate(start);
178: // start
179: startDateSelection.setDate(start);
180: endDateSelection.setDate(end);
181: } finally {
182: listenersEnabled = true;
183: }
184:
185: }
186: }
187: }
|