/* * RMSDemo.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.rmsdemo; import java.io.IOException; import javax.microedition.lcdui.Alert; import javax.microedition.lcdui.AlertType; import javax.microedition.lcdui.Choice; import javax.microedition.lcdui.Command; import javax.microedition.lcdui.CommandListener; import javax.microedition.lcdui.Display; import javax.microedition.lcdui.Displayable; import javax.microedition.lcdui.Form; import javax.microedition.lcdui.List; import javax.microedition.lcdui.TextField; import javax.microedition.midlet.MIDlet; import javax.microedition.rms.RecordEnumeration; import javax.microedition.rms.RecordStoreException; import javax.microedition.rms.RecordStoreNotOpenException; /** * Sample to demonstrate the usage of a Record Management Store in a MIDlet. The * sample uses an RMS back end to store a collection of CDs. CD objects can be * added, deleted, and edited. */ public final class RMSDemo extends MIDlet implements CommandListener { private CDdb _db; // RMS reference private RecordEnumeration _enum; // Enumeration for the RMS private Display _display; private Form _addForm; // The Add CD form // Input text fields for adding a new CD private TextField _artistCD; private TextField _titleCD; // Menu items for add CD form private Command _addSave; // Save menu item private Command _addCancel; // Cancel menu item private List _list; // The My CD Collection list // Menu items for list private Command _mainAdd; // Add CD menu item private Command _mainDelete; // Delete CD menu item private Command _mainEdit; // Edit CD menu item private Command _mainExit; // Exit app menu item // Id of CD being edited. -1 if no CD is being edited. private int _editCDRecordId = -1; // Constructor public RMSDemo() { try { // Initialize members _db = new CDdb("My Music"); _enum = _db.enumerate(); _list = new List("My CD Collection", Choice.IMPLICIT); _mainAdd = new Command("Add CD", Command.ITEM, 1); _mainEdit = new Command("Edit CD", Command.ITEM, 2); _mainDelete = new Command("Delete CD", Command.ITEM, 3); _mainExit = new Command("Close", Command.EXIT, 4); _addSave = new Command("Save", Command.SCREEN, 1); _addCancel = new Command("Cancel", Command.BACK, 2); refreshList(); _list.addCommand(_mainAdd); _list.addCommand(_mainExit); _list.setSelectCommand(_mainEdit); _list.setCommandListener(this); _addForm = new Form("Add CD"); _artistCD = new TextField("Artist: ", null, 20, TextField.ANY); _titleCD = new TextField("Title: ", null, 20, TextField.ANY); _addForm.append(_artistCD); _addForm.append(_titleCD); _addForm.addCommand(_addSave); _addForm.addCommand(_addCancel); _addForm.setCommandListener(this); _display = Display.getDisplay(this); } catch (final Exception e) { errorDialog("Exception thrown!", e.toString(), _list); } } /** * Refreshes the 'My CD Collection' list * * @throws RecordStoreNotOpenException * Thrown if the records holding the cd information is not open * @throws RecordStoreException * Thrown if an error occurs when accessing the record store * @throws IOException * Thrown if a read error occurs */ private void refreshList() throws RecordStoreNotOpenException, RecordStoreException, java.io.IOException { // Clear list _list.deleteAll(); _enum.rebuild(); int recordId; // Loop through the RMS and add records to list while (_enum.hasNextElement()) { recordId = _enum.nextRecordId(); _list.append(_db.getCD(recordId).toString(), null); } // If there are CDs in the RMS, add edit and delete CD menu items if (_list.size() > 0) { _list.addCommand(_mainEdit); _list.addCommand(_mainDelete); } else { _list.removeCommand(_mainEdit); _list.removeCommand(_mainDelete); } } /** * Retrieves the RMS record id * * @param index * The index of the record for which to to retrieve the record * ID. * @return The RMS record id. */ private int getRecordId(final int index) throws RecordStoreNotOpenException, RecordStoreException { _enum.rebuild(); int recordId = -1; int count = 0; while (_enum.hasNextElement()) { recordId = _enum.nextRecordId(); if (count == index) { return recordId; } count++; } return recordId; } /** * Command listener implementation * * @param c * The menu item clicked * @param d * The current displayable * @see javax.microedition.lcdui.CommandListener#commandAction(Command, * Displayable) */ public void commandAction(final Command c, final Displayable d) { // A list command has been executed if (d == _list) { if (c == _mainAdd) { // Add CD _addForm.setTitle("Add CD"); _display.setCurrent(_addForm); _display.setCurrentItem(_artistCD); } else if (c == _mainDelete) { // Delete CD try { final int i = getRecordId(_list.getSelectedIndex()); _db.delete(i); refreshList(); } catch (final Exception e) { errorDialog("Exception thrown!", e.toString(), _list); } } else if (c == _mainEdit) { // Edit CD try { _addForm.setTitle("Edit CD"); _editCDRecordId = getRecordId(_list.getSelectedIndex()); final CD selectedCD = _db.getCD(_editCDRecordId); _artistCD.setString(selectedCD.getArtist()); _titleCD.setString(selectedCD.getTitle()); _display.setCurrent(_addForm); _display.setCurrentItem(_artistCD); } catch (final Exception e) { errorDialog("Exception thrown!", e.toString(), _addForm); } } else if (c == _mainExit) { notifyDestroyed(); } } // An add form command has been clicked else if (d == _addForm) { if (c == _addSave) { // Save try { if (_editCDRecordId == -1) { _db.add(_artistCD.getString(), _titleCD.getString()); } else { _db.edit(_editCDRecordId, _artistCD.getString(), _titleCD.getString()); _editCDRecordId = -1; } refreshList(); } catch (final Exception e) { errorDialog("Exception thrown!", e.toString(), _list); } } else if (c == _addCancel) { _editCDRecordId = -1; } // Clear text fields _artistCD.setString(""); _titleCD.setString(""); // Switch to list _display.setCurrent(_list); } } /** * <p> * Signals the MIDlet that it has entered the Active state * * @see javax.microedition.midlet.MIDlet#startApp() */ public void startApp() { _display.setCurrent(_list); } /** * Not implemented * * @see javax.microedition.midlet.MIDlet#pauseApp() */ public void pauseApp() { // Not implemented. } /** * Not implemented. * * @see javax.microedition.midlet.MIDlet#destroyApp(boolean) */ public void destroyApp(final boolean unconditional) { // Not implemented } /** * Presents an alert to the user with a given message * * @param methodThrown * The source for the exception * @param errorThrown * The exception thrown by the method * @param nextDisplayable * The Form appearing after the alert is dismissed */ public void errorDialog(final String methodThrown, final String errorThrown, final Displayable nextDisplayable) { final Alert exceptionThrown = new Alert(methodThrown, errorThrown, null, AlertType.ERROR); _display.setCurrent(exceptionThrown, nextDisplayable); } }