001: /*
002: *
003: *
004: * Copyright 1990-2007 Sun Microsystems, Inc. All Rights Reserved.
005: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
006: *
007: * This program is free software; you can redistribute it and/or
008: * modify it under the terms of the GNU General Public License version
009: * 2 only, as published by the Free Software Foundation.
010: *
011: * This program is distributed in the hope that it will be useful, but
012: * WITHOUT ANY WARRANTY; without even the implied warranty of
013: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
014: * General Public License version 2 for more details (a copy is
015: * included at /legal/license.txt).
016: *
017: * You should have received a copy of the GNU General Public License
018: * version 2 along with this work; if not, write to the Free Software
019: * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
020: * 02110-1301 USA
021: *
022: * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
023: * Clara, CA 95054 or visit www.sun.com if you need additional
024: * information or have any questions.
025: */
026:
027: package com.sun.midp.appmanager;
028:
029: import java.util.*;
030: import javax.microedition.lcdui.*;
031: import com.sun.midp.midletsuite.*;
032: import com.sun.midp.i18n.Resource;
033: import com.sun.midp.i18n.ResourceConstants;
034: import com.sun.midp.configurator.Constants;
035:
036: /**
037: * The Graphical MIDlet swicher.
038: *
039: * Switcher provides a simple user interface to select MIDlets to
040: * bring into foreground from the list of running midlets.
041: */
042:
043: class MIDletSwitcher extends javax.microedition.lcdui.List implements
044: CommandListener {
045: /**
046: * Number of midlets in minfo.
047: */
048: private int mcount;
049: /**
050: * MIDlet information, class, name, icon; one per MIDlet.
051: */
052: private RunningMIDletSuiteInfo[] minfo;
053:
054: /** Number of reserved elements in minfo array. */
055: private final int pitch = 4;
056:
057: /** Application Manager. */
058: ApplicationManager manager;
059:
060: /** Application Manager main form. */
061: AppManagerUI managerUI;
062:
063: /** Display for the Manager MIDlet. */
064: Display display; // = null
065:
066: /** Command object for "Bring to foreground". */
067: private Command fgCmd = new Command(Resource
068: .getString(ResourceConstants.AMS_SWITCHER_SEL),
069: Command.ITEM, 1);
070:
071: /**
072: * Create and initialize a new MIDlet Switcher.
073: *
074: * @param managerUI the aplication manager main form
075: * @param manager the parent application manager
076: * @param display the Display
077: */
078: MIDletSwitcher(AppManagerUI managerUI, ApplicationManager manager,
079: Display display) {
080: super ("", Choice.IMPLICIT);
081: this .manager = manager;
082: this .managerUI = managerUI;
083: this .display = display;
084: mcount = 0;
085: minfo = new RunningMIDletSuiteInfo[Constants.MAX_ISOLATES];
086:
087: setSelectCommand(fgCmd);
088: setFitPolicy(TEXT_WRAP_OFF);
089: setCommandListener(this ); // Listen for the selection
090: }
091:
092: /**
093: * Append launched suite info to the list.
094: */
095: synchronized void append(RunningMIDletSuiteInfo msi) {
096: checkInfoArraySize();
097: minfo[mcount++] = msi;
098: append(msi.displayName, msi.icon);
099: }
100:
101: /**
102: * Remove suite info from the list.
103: */
104: synchronized void remove(MIDletSuiteInfo msi) {
105: int pos = -1;
106: for (int i = 0; i < mcount; i++) {
107: if (minfo[i] == msi) {
108: pos = i;
109: break;
110: }
111: }
112: if (pos >= 0) {
113: for (int i = pos + 1; i < mcount; i++) {
114: minfo[i - 1] = minfo[i];
115: }
116: mcount--;
117: checkInfoArraySize();
118: delete(pos);
119: }
120: }
121:
122: /**
123: * Ensures that info array has enough capacity.
124: */
125: private void checkInfoArraySize() {
126: if ((mcount + pitch < minfo.length) || (mcount >= minfo.length)) {
127: RunningMIDletSuiteInfo[] n = new RunningMIDletSuiteInfo[mcount
128: + pitch];
129: System.arraycopy(minfo, 0, n, 0, mcount);
130: minfo = n;
131: }
132: }
133:
134: /**
135: * If switcher hase any items.
136: *
137: * equivalent statement - if there is any launched MIDlet
138: */
139: synchronized boolean hasItems() {
140: return (mcount > 0);
141: }
142:
143: /**
144: * Respond to a command issued on any Screen.
145: *
146: * @param c command activated by the user
147: * @param s the Displayable the command was on.
148: */
149: public synchronized void commandAction(Command c, Displayable s) {
150: if (c == fgCmd) {
151: //bring to foreground appropriate midlet
152: int ind = getSelectedIndex();
153: if (ind != -1) {
154: manager.moveToForeground(minfo[ind]);
155: }
156: display.setCurrent(managerUI);
157: }
158: }
159:
160: }
|