001: /*--------------------------------------------------------------------------*
002: | Copyright (C) 2006 Christopher Kohlhaas, Bettina Lademann |
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: package org.rapla.gui.internal.common;
014:
015: import java.awt.Component;
016: import java.util.Date;
017:
018: import javax.swing.DefaultComboBoxModel;
019: import javax.swing.DefaultListCellRenderer;
020: import javax.swing.JComboBox;
021: import javax.swing.JList;
022:
023: import org.rapla.components.xmlbundle.I18nBundle;
024: import org.rapla.entities.domain.Period;
025: import org.rapla.facade.ClientFacade;
026: import org.rapla.facade.PeriodModel;
027: import org.rapla.framework.RaplaContext;
028: import org.rapla.framework.RaplaException;
029:
030: public class PeriodChooser extends JComboBox {
031: private static final long serialVersionUID = 1L;
032:
033: Date selectedDate = null;
034: Period selectedPeriod = null;
035:
036: public static int START_ONLY = 1;
037: public static int START_AND_END = 0;
038: public static int END_ONLY = -1;
039:
040: int visiblePeriods;
041: I18nBundle i18n;
042: PeriodModel periodModel;
043: private boolean listenersEnabled = true;
044: private boolean isWeekOfPeriodVisible = true;
045:
046: public PeriodChooser(RaplaContext sm) throws RaplaException {
047: this (sm, START_AND_END);
048: }
049:
050: public PeriodChooser(RaplaContext sm, int visiblePeriods)
051: throws RaplaException {
052: // super(RaplaButton.SMALL);
053: this .visiblePeriods = visiblePeriods;
054: i18n = (I18nBundle) sm.lookup(I18nBundle.ROLE
055: + "/org.rapla.RaplaResources");
056: setPeriodModel(((ClientFacade) sm.lookup(ClientFacade.ROLE))
057: .getPeriodModel());
058: }
059:
060: public void setPeriodModel(PeriodModel model) {
061: this .periodModel = model;
062: if (periodModel != null) {
063: try {
064: listenersEnabled = false;
065: this .setModel(new DefaultComboBoxModel(model
066: .getAllPeriods()));
067: } finally {
068: listenersEnabled = true;
069: }
070: }
071: this .setRenderer(new PeriodListCellRenderer());
072: update();
073: }
074:
075: private String formatPeriod(Period period) {
076: if (!isWeekOfPeriodVisible) {
077: return period.getName();
078: }
079:
080: int lastWeek = period.getWeeks();
081: int week = period.weekOf(selectedDate);
082: if (week != 1 && week >= lastWeek) {
083: return i18n.format("period.format.end", period.getName());
084: } else {
085: return i18n.format("period.format.week", String
086: .valueOf(period.weekOf(selectedDate)), period
087: .getName());
088: }
089: }
090:
091: private String formatPeriodList(Period period) {
092: if (visiblePeriods == START_ONLY) {
093: return i18n.format("period.format.start", period.getName());
094: } else if (visiblePeriods == END_ONLY) {
095: return i18n.format("period.format.end", period.getName());
096: } else {
097: return period.getName();
098: }
099: }
100:
101: public void setDate(Date date, Date endDate) {
102: try {
103: listenersEnabled = false;
104:
105: if (date != selectedDate) // Compute period only on date change
106: {
107: selectedPeriod = getPeriod(date, endDate);
108: }
109:
110: if (selectedPeriod != null) {
111: selectedDate = date;
112: setSelectedItem(selectedPeriod);
113: } else {
114: selectedDate = date;
115: setSelectedItem(null);
116: }
117: repaint();
118: revalidate();
119: } finally {
120: listenersEnabled = true;
121: }
122: }
123:
124: public void setDate(Date date) {
125: setDate(date, null);
126: }
127:
128: private String getSelectionText() {
129: Period period = selectedPeriod;
130: if (period != null) {
131: return formatPeriod(period);
132: } else {
133: return i18n.getString("period.not_set");
134: }
135: }
136:
137: public void setSelectedPeriod(Period period) {
138: selectedPeriod = period; // EXCO
139: listenersEnabled = false;
140: setSelectedItem(period);
141: listenersEnabled = true;
142: if (visiblePeriods == END_ONLY) {
143: selectedDate = period.getEnd();
144: } else {
145: selectedDate = period.getStart();
146: }
147: }
148:
149: public Period getPeriod() {
150: return selectedPeriod; // getPeriod(selectedDate);
151: }
152:
153: private Period getPeriod(Date date, Date endDate) {
154: if (periodModel == null)
155: return null;
156: if (visiblePeriods == END_ONLY) {
157: return periodModel.getNearestPeriodForEndDate(date);
158: } else {
159: return periodModel.getNearestPeriodForStartDate(date,
160: endDate);
161: }
162: }
163:
164: public Date getDate() {
165: return selectedDate;
166: }
167:
168: private void update() {
169: setVisible(periodModel != null && periodModel.getSize() > 0);
170: setDate(getDate());
171: }
172:
173: protected void fireActionEvent() {
174: if (!listenersEnabled) {
175: return;
176: }
177: Period period = (Period) getSelectedItem();
178: selectedPeriod = period; // EXCO
179: if (period != null) {
180: if (visiblePeriods == END_ONLY) {
181: selectedDate = period.getEnd();
182: } else {
183: selectedDate = period.getStart();
184: }
185: }
186: super .fireActionEvent();
187: }
188:
189: class PeriodListCellRenderer extends DefaultListCellRenderer {
190: private static final long serialVersionUID = 1L;
191:
192: public Component getListCellRendererComponent(JList list,
193: Object value, int index, boolean isSelected,
194: boolean cellHasFocus) {
195: if (index == -1) {
196: value = getSelectionText();
197: } else {
198: Period period = (Period) value;
199: value = formatPeriodList(period);
200: }
201: return super .getListCellRendererComponent(list, value,
202: index, isSelected, cellHasFocus);
203: }
204: }
205:
206: public boolean isWeekOfPeriodVisible() {
207: return isWeekOfPeriodVisible;
208: }
209:
210: public void setWeekOfPeriodVisible(boolean isWeekOfPeriodVisible) {
211: this.isWeekOfPeriodVisible = isWeekOfPeriodVisible;
212: }
213:
214: }
|