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

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

Audio support.

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