/* * SpinnerDemoScreen.java * * Copyright � 1998-2011 Research In Motion Limited * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * * Note: For the sake of simplicity, this sample application may not leverage * resource bundles and resource strings. However, it is STRONGLY recommended * that application developers make use of the localization features available * within the BlackBerry development platform to ensure a seamless application * experience across a variety of languages and geographies. For more information * on localizing your application, please refer to the BlackBerry Java Development * Environment Development Guide associated with this release. */ package com.rim.samples.device.ui.spinnerdemo; import java.util.Calendar; import net.rim.device.api.i18n.DateFormat; import net.rim.device.api.i18n.SimpleDateFormat; import net.rim.device.api.ui.Color; import net.rim.device.api.ui.Field; import net.rim.device.api.ui.Keypad; import net.rim.device.api.ui.Screen; import net.rim.device.api.ui.TouchEvent; import net.rim.device.api.ui.TouchGesture; import net.rim.device.api.ui.UiApplication; import net.rim.device.api.ui.component.BasicEditField; import net.rim.device.api.ui.component.DateField; import net.rim.device.api.ui.component.LabelField; import net.rim.device.api.ui.component.SeparatorField; import net.rim.device.api.ui.component.TextSpinBoxField; import net.rim.device.api.ui.container.HorizontalFieldManager; import net.rim.device.api.ui.container.MainScreen; import net.rim.device.api.ui.container.PopupScreen; import net.rim.device.api.ui.container.VerticalFieldManager; import net.rim.device.api.ui.decor.Background; import net.rim.device.api.ui.decor.BackgroundFactory; import net.rim.device.api.ui.picker.DateTimePicker; /** * MainScreen class for the Date Time Picker Spinner Demo application */ public class SpinnerDemoScreen extends MainScreen { private static final int DEFAULT = 1; private static final int DATE = 2; private static final int TIME = 3; private static final int LONG = 4; private static final int EXPIRY = 5; private static final int SPINBOX = 6; private static final int SELECTION_FIELD_HEIGHT = 50; private final DateField _dateField; private final SelectionField _editFieldDefault; private final SelectionField _editFieldDate; private final SelectionField _editFieldTime; private final SelectionField _editFieldLong; private final SelectionField _editFieldExpiry; private final SelectionField _editFieldSpinbox; private final SimpleDateFormat _defaultDateFormat = new SimpleDateFormat( SimpleDateFormat.DATETIME_DEFAULT | SimpleDateFormat.TIME_DEFAULT); private final SimpleDateFormat _dateFormat = new SimpleDateFormat( "yyyy-MM-dd"); private final SimpleDateFormat _timeFormat = new SimpleDateFormat( "hh:mm:ss aa"); private final SimpleDateFormat _longDateFormat = new SimpleDateFormat( SimpleDateFormat.DATE_LONG | SimpleDateFormat.TIME_DEFAULT); private final SimpleDateFormat _expiryDateFormat = new SimpleDateFormat( "MM/yyyy"); private Calendar _defaultCal; private Calendar _dateCal; private Calendar _timeCal; private Calendar _longDateCal; private Calendar _expiryDateCal; private CustomSpinnerPopup _customSpinnerPopup; /** * Creates a new SpinnerDemoScreen object */ public SpinnerDemoScreen() { setTitle("Spinner Demo"); // Initialize a VerticalFieldManager final VerticalFieldManager fieldManager = new VerticalFieldManager(); final Background background = BackgroundFactory.createSolidBackground(Color.LIGHTBLUE); final LabelField dateLabel = new LabelField("Date Field", Field.FIELD_HCENTER); dateLabel.setBackground(background); fieldManager.add(dateLabel); // Add a typical date field to the VerticalFieldManager _dateField = new DateField("Date/time: ", System.currentTimeMillis(), DateField.DATE_TIME); fieldManager.add(_dateField); fieldManager.add(new SeparatorField()); // Add UI elements to the VerticalFieldManager, including fields // which will allow a user to make selections from date/time and // custom spinners. final LabelField dateTimeLabel = new LabelField("Date Time Picker", Field.FIELD_HCENTER); dateTimeLabel.setBackground(background); fieldManager.add(dateTimeLabel); _editFieldDefault = new SelectionField("Default: "); fieldManager.add(_editFieldDefault); _editFieldDate = new SelectionField("Date only: "); fieldManager.add(_editFieldDate); _editFieldTime = new SelectionField("Time only: "); fieldManager.add(_editFieldTime); _editFieldLong = new SelectionField("Long date: "); fieldManager.add(_editFieldLong); _editFieldExpiry = new SelectionField("Expiry date: "); fieldManager.add(_editFieldExpiry); fieldManager.add(new SeparatorField()); final LabelField textSpinLabel = new LabelField("Text Spin Box Field", Field.FIELD_HCENTER); textSpinLabel.setBackground(background); fieldManager.add(textSpinLabel); _editFieldSpinbox = new SelectionField("City: "); fieldManager.add(_editFieldSpinbox); // Add the VerticalFieldManager to the screen add(fieldManager); } /** * Displays a spinner dialog for a given type * * @param type * Type of spinner to display */ void showSpinnerDialog(final int type) { switch (type) { case DEFAULT: final DateTimePicker datePicker = DateTimePicker.createInstance(_defaultCal); if (datePicker.doModal()) { final StringBuffer dateStr = new StringBuffer(); _defaultCal = datePicker.getDateTime(); _defaultDateFormat.format(_defaultCal, dateStr, null); _editFieldDefault.setText(dateStr.toString()); } break; case DATE: final DateTimePicker datePickerDate = DateTimePicker.createInstance(_dateCal, "yyyy-MM-dd", null); if (datePickerDate.doModal()) { final StringBuffer dateStrDate = new StringBuffer(); _dateCal = datePickerDate.getDateTime(); _dateFormat.format(_dateCal, dateStrDate, null); _editFieldDate.setText(dateStrDate.toString()); } break; case TIME: final DateTimePicker datePickerTime = DateTimePicker .createInstance(_timeCal, null, "hh:mm:ss aa"); if (datePickerTime.doModal()) { final StringBuffer dateStrTime = new StringBuffer(); _timeCal = datePickerTime.getDateTime(); _timeFormat.format(_timeCal, dateStrTime, null); _editFieldTime.setText(dateStrTime.toString()); } break; case LONG: final DateTimePicker datePickerLong = DateTimePicker.createInstance(_longDateCal, DateFormat.DATE_LONG, DateFormat.TIME_DEFAULT); if (datePickerLong.doModal()) { final StringBuffer dateStrLong = new StringBuffer(); _longDateCal = datePickerLong.getDateTime(); _longDateFormat.format(_longDateCal, dateStrLong, null); _editFieldLong.setText(dateStrLong.toString()); } break; case EXPIRY: final DateTimePicker datePickerExpiry = DateTimePicker.createInstance(_expiryDateCal, _expiryDateFormat.toPattern(), null); if (datePickerExpiry.doModal()) { final StringBuffer dateStrExpiry = new StringBuffer(); _expiryDateCal = datePickerExpiry.getDateTime(); _expiryDateFormat.format(_expiryDateCal, dateStrExpiry, null); _editFieldExpiry.setText(dateStrExpiry.toString()); } break; case SPINBOX: if (_customSpinnerPopup == null) { _customSpinnerPopup = new CustomSpinnerPopup(); } UiApplication.getUiApplication().pushModalScreen( _customSpinnerPopup); if (_customSpinnerPopup.isSet()) { final String choice = _customSpinnerPopup.getChoice(); _editFieldSpinbox.setText(choice); } break; } } /** * @see Screen#touchEvent(TouchEvent) */ protected boolean touchEvent(final TouchEvent message) { TouchGesture touchGesture = null; final int event = message.getEvent(); if (event == TouchEvent.GESTURE) { touchGesture = message.getGesture(); } if (message.getEvent() == TouchEvent.CLICK || touchGesture != null && touchGesture.getEvent() == TouchGesture.TAP) { int type = 0; if (_editFieldDefault.isFocus()) { type = DEFAULT; } else if (_editFieldDate.isFocus()) { type = DATE; } else if (_editFieldTime.isFocus()) { type = TIME; } else if (_editFieldLong.isFocus()) { type = LONG; } else if (_editFieldExpiry.isFocus()) { type = EXPIRY; } else if (_editFieldSpinbox.isFocus()) { type = SPINBOX; } if (type > 0) { showSpinnerDialog(type); } if (!_dateField.isFocus()) { return true; } } return super.touchEvent(message); } /** * @see Screen#navigationClick(int, int) */ protected boolean navigationClick(final int status, final int time) { int type = 0; boolean eventConsumed = false; if (_editFieldDefault.isFocus()) { type = DEFAULT; eventConsumed = true; } else if (_editFieldDate.isFocus()) { type = DATE; eventConsumed = true; } else if (_editFieldTime.isFocus()) { type = TIME; eventConsumed = true; } else if (_editFieldLong.isFocus()) { type = LONG; eventConsumed = true; } else if (_editFieldExpiry.isFocus()) { type = EXPIRY; eventConsumed = true; } else if (_editFieldSpinbox.isFocus()) { type = SPINBOX; eventConsumed = true; } if (type > 0) { showSpinnerDialog(type); } return eventConsumed; } /** * @see MainScreen#onSavePrompt() */ protected boolean onSavePrompt() { // Suppress the save dialog return true; } /** * @see Screen#keyChar(char, int, int) */ protected boolean keyChar(final char key, final int status, final int time) { if (key == Keypad.KEY_ENTER) { return navigationClick(status, time); } return super.keyChar(key, status, time); } /** * A BasicEditField which can not be edited manually */ static class SelectionField extends BasicEditField { /** * Creates a new SelectionField object * * @param label * Label for this field * @param text * Display text for this field */ SelectionField(final String label) { super(label, "Click or tap to select"); } /** * @see BasicEditField#layout(int, int) */ protected void layout(final int width, final int height) { super.layout(width, height); setExtent(width, SELECTION_FIELD_HEIGHT); } /** * @see Field#keyChar(char, int, int) */ protected boolean keyChar(final char key, final int status, final int time) { if (key == Keypad.KEY_ENTER) { return false; } return super.keyChar(key, status, time); } } /** * A PopupScreen to display a TextSpinBoxField */ public final static class CustomSpinnerPopup extends PopupScreen { private final TextSpinBoxField _spinBoxField; private boolean _isSet; /** * Creates a new CustomSpinnerPopup object */ public CustomSpinnerPopup() { super(new VerticalFieldManager(), Screen.DEFAULT_CLOSE); final String[] choices = { "New York", "Paris", "Barcelona", "Beijing", "Moscow", "Brasilia", "Melbourne" }; _spinBoxField = new TextSpinBoxField(choices); _spinBoxField.setVisibleRows(3); add(new LabelField("Choose city:")); add(new SeparatorField()); final HorizontalFieldManager hfm = new HorizontalFieldManager(Field.FIELD_HCENTER); hfm.add(_spinBoxField); add(hfm); } /** * Retrieves the currently selected choice * * @return The currently selected choice */ public String getChoice() { return (String) _spinBoxField.get(_spinBoxField.getSelectedIndex()); } /** * Indicates whether the TextSpinBoxField has changed from its initial * state. * * @return True if the selected choice has been modified, otherwise * false */ public boolean isSet() { return _isSet; } /** * @see Screen#touchEvent(TouchEvent) */ protected boolean touchEvent(final TouchEvent message) { if (message.getEvent() == TouchEvent.GESTURE) { final TouchGesture touchGesture = message.getGesture(); if (touchGesture.getEvent() == TouchGesture.TAP) { _isSet = true; close(); return true; } } return super.touchEvent(message); } /** * @see Screen#invokeAction(int) */ protected boolean invokeAction(final int action) { if (action == ACTION_INVOKE) { _isSet = true; close(); return true; } return super.invokeAction(action); } /** * @see Screen#keyChar(char, int, int) */ protected boolean keyChar(final char key, final int status, final int time) { if (key == Keypad.KEY_ENTER) { _isSet = true; close(); return true; } return super.keyChar(key, status, time); } /** * @see Screen#close() */ public void close() { if (!_isSet) { _spinBoxField.setSelectedIndex(0); } super.close(); } } }