source: trunk/hiptop/pester/net/sabi/pester/AlarmListView.java@ 248

Last change on this file since 248 was 248, checked in by Nicholas Riley, 18 years ago

Better way of retrieving selected unit (thanks, Jean-Sebastien Payette)

File size: 7.7 KB
RevLine 
[237]1package net.sabi.pester;
2
3import danger.app.Application;
4import danger.app.Event;
[244]5import danger.audio.ToneClass;
6import danger.audio.ToneRights;
7
[240]8import danger.internal.Date;
[237]9import danger.ui.ActiveListView;
[238]10import danger.ui.Button;
[240]11import danger.ui.CheckBox;
12import danger.ui.DateTimeEditor;
13import danger.ui.DatePicker;
[237]14import danger.ui.DialogWindow;
[241]15import danger.ui.MenuItem;
[240]16import danger.ui.NumberEditor;
17import danger.ui.PopupMenu;
[239]18import danger.ui.RadioButton;
[237]19import danger.ui.Rect;
[244]20import danger.ui.RingTonePicker;
[237]21import danger.ui.TypeAheadTextField;
22import danger.util.ActiveList;
23import danger.util.StdActiveList;
24import danger.util.DEBUG;
25
26public class AlarmListView extends ActiveListView
27 implements Resources, Commands {
28 private static Pester sPester;
29 private static AlarmListWindow sAlarmListWindow;
30 // XXX some of these shouldn't conceptually be static, but who cares
31 private static StdActiveList sAlarmList;
32 private static Alarms sAlarms;
33
34 private static DialogWindow sEditWindow;
35 private TypeAheadTextField sMessageField;
[239]36 private RadioButton sInButton, sAtButton;
[240]37 private NumberEditor sPeriodField;
38 private PopupMenu sPeriodUnitsPopup;
[242]39 // XXX don't allow <5 second repeating alarms
[240]40 private CheckBox sRepeatCheckBox;
41 private DateTimeEditor sTimeEditor, sDateEditor;
42 private DatePicker sDatePicker;
[244]43 private RingTonePicker sAlertPicker;
[240]44 private Button sDiscardAlarmButton, sSetAlarmButton;
[237]45
46 private static Alarm sFocusedAlarm, sEditingAlarm;
47
48 private static final int EVENT_CANCEL_ALARM = -1; // XXX move this?
49
50 public void onDecoded() {
51 sPester = (Pester)Application.getCurrentApp();
52 sAlarmListWindow = (AlarmListWindow)getWindow();
53 sAlarmList = new StdActiveList();
54 setList(sAlarmList);
55
56 sEditWindow = sPester.getDialog(ID_ALARM_SET_DIALOG, this);
57 sEditWindow.setCancelButtonEvent(new Event(this, EVENT_CANCEL_ALARM));
58 sMessageField = (TypeAheadTextField)sEditWindow.getDescendantWithID(ID_MESSAGE_FIELD);
59 sEditWindow.disableBottomRightButtonOnEmptyField(sMessageField);
[239]60 sInButton = (RadioButton)sEditWindow.getDescendantWithID(ID_IN_BUTTON);
61 sAtButton = (RadioButton)sEditWindow.getDescendantWithID(ID_AT_BUTTON);
[240]62 sPeriodField = (NumberEditor)sEditWindow.getDescendantWithID(ID_PERIOD_FIELD);
63 sPeriodUnitsPopup = (PopupMenu)sEditWindow.getDescendantWithID(ID_PERIOD_UNITS_POPUP);
64 sRepeatCheckBox = (CheckBox)sEditWindow.getDescendantWithID(ID_PERIOD_REPEAT_CHECKBOX);
65 sTimeEditor = (DateTimeEditor)sEditWindow.getDescendantWithID(ID_TIME_EDITOR);
66 sDateEditor = (DateTimeEditor)sEditWindow.getDescendantWithID(ID_DATE_EDITOR);
67 sDatePicker = (DatePicker)sEditWindow.getDescendantWithID(ID_DATE_PICKER);
[244]68 sAlertPicker = (RingTonePicker)sEditWindow.getDescendantWithID(ID_ALERT_PICKER);
[240]69 sSetAlarmButton = (Button)sEditWindow.getDescendantWithID(ID_SET_ALARM_BUTTON);
[238]70 sDiscardAlarmButton = (Button)sEditWindow.getDescendantWithID(ID_DISCARD_ALARM_BUTTON);
[240]71 sInButton.setValue(1);
72 sDateEditor.limitToDangerEpoch();
[245]73 sAlertPicker.setGroupFilter(ToneClass.FOREGROUND | ToneClass.CUSTOM);
[244]74 sAlertPicker.setRights(ToneRights.FULL);
[245]75 // this doesn't work properly yet
76 // sAlertPicker.setCanRecord(true);
[237]77
78 super.onDecoded();
79 }
80
81 public boolean eventWidgetUp(int widget, Event e) {
82 switch (widget) {
83 case Event.DEVICE_BUTTON_BACK:
84 case Event.DEVICE_BUTTON_CANCEL:
85 sPester.returnToLauncher();
86 return true;
87 }
88 return super.eventWidgetUp(widget, e);
89 }
90
[240]91 protected void editDateOrPeriod(Alarm alarm) {
92 boolean usesPeriod = alarm.getUsesPeriod();
93 if (usesPeriod) {
94 int period = alarm.getPeriod();
95 for (int i = sPeriodUnitsPopup.itemCount() - 1 ; i >= 0 ; --i) {
[248]96 int unitsPerSec = sPeriodUnitsPopup.getItem(i).getEvent().data;
[241]97 if (period % unitsPerSec == 0) {
[248]98 sPeriodUnitsPopup.setValue(i);
[241]99 sPeriodField.setValue(period / unitsPerSec);
100 break;
101 }
[240]102 }
103 sRepeatCheckBox.setValue(alarm.getRepeating() ? 1 : 0);
104 }
105
106 Date date = alarm.getDate();
107 sTimeEditor.setDate(date);
108 sDateEditor.setDate(date);
109 sDatePicker.setDate(date);
110
111 sInButton.setValue(usesPeriod ? 1 : 0);
112 sAtButton.setValue(usesPeriod ? 0 : 1);
113 }
114
115 protected void editAlarm(Alarm alarm, boolean asNew) {
[237]116 sEditingAlarm = alarm;
117 alarm.beginEditing();
[238]118 if (asNew) {
119 sDiscardAlarmButton.hide();
120 } else {
[246]121 sMessageField.setText(alarm.getMessage());
[238]122 sDiscardAlarmButton.show();
[240]123 editDateOrPeriod(alarm);
[246]124 sAlertPicker.setRingTone(sEditingAlarm.getAlert());
[238]125 }
[240]126 constrainDate();
[237]127 sEditWindow.show();
128 }
129
[240]130 protected Date editingDate() {
131 Date date = sDateEditor.getDate();
132 date.setTime(sTimeEditor.getDate().getTime());
[243]133 date.setSeconds(0);
[240]134 return date;
135 }
136
[248]137 // XXX make this into a more general validation method;
138 // XXX check before dismissing dialog that alarm is valid
139 // XXX and display alarm date
[240]140 protected void constrainDate() {
141 // XXX schedule every minute (second?) if in AT mode
[242]142 // XXX could use onPeriodicPulse() perhaps
[240]143 Date now = new Date();
144 sDateEditor.min(now);
145 sDatePicker.min(now);
[242]146 sSetAlarmButton.setEnabled(sInButton.getValue() == 1 ||
147 editingDate().compareTo(now) > 0);
[240]148 }
149
[237]150 public boolean receiveEvent(Event e) {
151 switch (e.type) {
152 case EVENT_NEW_ALARM:
[238]153 editAlarm(new Alarm(), true);
[237]154 return true;
155 case EVENT_SET_ALARM:
[240]156 sEditingAlarm.setMessage(sMessageField.toString());
157 if (sInButton.getValue() == 1) {
[248]158 int itemIndex = sPeriodUnitsPopup.getValue();
159 MenuItem itemAtIndex = sPeriodUnitsPopup.getItem(itemIndex);
160 Event event = itemAtIndex.getEvent();
[241]161 sEditingAlarm.setPeriod(sPeriodField.getValue() * event.data,
[240]162 sRepeatCheckBox.getValue() == 1);
163 } else {
164 sEditingAlarm.setDate(editingDate());
165 }
[244]166 sEditingAlarm.setAlert(sAlertPicker.getRingTone());
[243]167 // schedule before adding so the tooltip is correct
168 sEditingAlarm.schedule();
[237]169 if (sEditingAlarm != sFocusedAlarm) { // new alarm
170 sAlarmList.addItem(sEditingAlarm);
171 setFocusedItem(sEditingAlarm);
[242]172 sFocusedAlarm = sEditingAlarm;
[237]173 }
[243]174 return true;
[237]175 case EVENT_CANCEL_ALARM:
[243]176 if (sEditingAlarm == sFocusedAlarm) // existing alarm
177 sEditingAlarm.resume();
[241]178 sEditingAlarm = null;
[237]179 return true;
180 case EVENT_DISCARD_ALARM:
181 // XXX confirmation
182 sAlarmList.removeItem(sFocusedAlarm);
183 return true;
[239]184 case EVENT_IN:
185 sAtButton.setValue(0);
[242]186 constrainDate();
[239]187 return true;
188 case EVENT_AT:
189 sInButton.setValue(0);
[240]190 constrainDate();
[239]191 return true;
[240]192 case EVENT_TIME_EDITOR:
193 Date date = editingDate();
194 // XXX do this on exit from the field, not on change
195 if (date.compareTo(new Date()) <= 0) {
196 date.addDays(1);
197 sDatePicker.setDate(date);
198 sDateEditor.setDate(date);
199 }
200 constrainDate();
201 return true;
202 case EVENT_DATE_EDITOR:
203 sDatePicker.setDate(sDateEditor.getDate());
204 constrainDate();
205 return true;
206 case EVENT_DATE_PICKER:
207 sDateEditor.setDate((Date)e.argument);
208 constrainDate();
209 return true;
[237]210 }
211 return super.receiveEvent(e);
212 }
213
214 protected void itemActivated(Object item) {
[238]215 editAlarm(sFocusedAlarm, false);
[237]216 }
217 protected void itemFocused(Object item) {
218 sFocusedAlarm = (Alarm)item;
219 }
220
221 public int alarmsSet() {
222 return getListSize();
223 }
224 public void onItemAdded(ActiveList list, Object item, int index) {
225 sAlarmListWindow.updateAlarmCount();
226 super.onItemAdded(list, item, index);
227 }
228 public void onItemRemoved(ActiveList list, Object item, int index) {
[242]229 ((Alarm)item).cancel();
[237]230 sAlarmListWindow.updateAlarmCount();
231 super.onItemRemoved(list, item, index);
232 }
233
234 protected CharSequence getToolTipForItem(Object item) {
235 if (item == null) // this is dumb, why do we get asked for a tooltip?
236 return null;
[243]237 // XXX need "in XXX minutes" too
238 return ((Alarm)item).getDateTimeString();
[237]239 }
240}
Note: See TracBrowser for help on using the repository browser.