/* * PromptMgr.java * * Copyright (C) 2007 Irving Bunton * http://code.google.com/p/mobile-rss-reader/ * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ // Expand to define MIDP define //#define DMIDP20 // Expand to define test define //#define DNOTEST // Expand to define test ui define //#define DNOTESTUI // Expand to define logging define //#define DNOLOGGING package com.substanceofcode.rssreader.presentation; import java.util.Hashtable; import javax.microedition.midlet.MIDlet; import javax.microedition.lcdui.Alert; import javax.microedition.lcdui.AlertType; import javax.microedition.lcdui.Command; import javax.microedition.lcdui.CommandListener; import javax.microedition.lcdui.Display; import javax.microedition.lcdui.Displayable; import javax.microedition.lcdui.Image; //#ifndef DTESTUI //@import javax.microedition.lcdui.Form; //@import javax.microedition.lcdui.StringItem; //#else import com.substanceofcode.testlcdui.Form; import com.substanceofcode.testlcdui.StringItem; //#endif import com.substanceofcode.utils.CauseException; //#ifdef DLOGGING import net.sf.jlogmicro.util.logging.Logger; import net.sf.jlogmicro.util.logging.LogManager; import net.sf.jlogmicro.util.logging.Level; //#endif /* Form with optional commands added with addPromptCommand which if used, will give prompt message with OK/Cancel. Due to peculiarities with setCurrent, we do it twice so that it will work with most phones. Otherwise, it may be ignored for some phones. */ final public class PromptMgr implements CommandListener, Runnable { private Hashtable promptCommands = new Hashtable(); private Displayable disp; private Command origCmd = null; protected RssReaderMIDlet midlet; private Alert promptAlert = null; //#ifdef DLOGGING private Logger logger = Logger.getLogger("PromptMgr"); private boolean fineLoggable = false; private boolean finestLoggable = false; //#endif private CommandListener cmdListener; public PromptMgr (RssReaderMIDlet midlet, Displayable disp) { this.midlet = midlet; this.disp = disp; //#ifdef DLOGGING fineLoggable = logger.isLoggable(Level.FINE); logger.fine("obj,fineLoggable=" + this + "," + fineLoggable); finestLoggable = logger.isLoggable(Level.FINEST); logger.finest("obj,finestLoggable=" + this + "," + finestLoggable); //#endif } final public void setCommandListener(CommandListener cmdListener) { this.cmdListener = cmdListener; } final public void addPromptCommand(Command cmd, String prompt) { promptCommands.put(cmd, prompt); } final public void removeCommand(Command cmd) { promptCommands.remove(cmd); } /* Create prompt alert. */ public void run() { // Due to a quirk on T637 (MIDP 1.0), we need to create a form // before the alert or the alert will not be seen. Form formAlert = new Form(origCmd.getLabel()); Image question = UiUtil.getImage("/icons/questionMk.png"); formAlert.append(question); int ix = formAlert.append(new StringItem(null, (String)promptCommands.get(origCmd))); Command okCmd = UiUtil.getCmdRsc("cmd.ok", Command.OK, 1); formAlert.addCommand(okCmd); Command cancelCmd = UiUtil.getCmdRsc("cmd.cancel", Command.CANCEL, 2); formAlert.addCommand(cancelCmd); promptAlert = new Alert(origCmd.getLabel(), ((StringItem)formAlert.get(ix)).getText(), question, AlertType.CONFIRMATION); promptAlert.setTimeout(Alert.FOREVER); promptAlert.addCommand(okCmd); promptAlert.addCommand(cancelCmd); promptAlert.setCommandListener(this); midlet.setCurrent(promptAlert); } /* Prompt if command is in prompt camands. */ public void commandAction(Command cmd, Displayable cdisp) { try { //#ifdef DLOGGING if (finestLoggable) {logger.finest("cmd,containsKey=" + cmd.getLabel() + "," + promptCommands.containsKey(cmd));} //#endif if (promptCommands.containsKey(cmd)) { if ((promptAlert == null) || !cdisp.equals(promptAlert)) { origCmd = cmd; } new Thread(this).start(); return; } else if (cdisp.equals(disp)) { midlet.setCurrent(disp); cmdListener.commandAction(cmd, disp); } else if ((cmd.getCommandType() == Command.OK) //#ifdef DMIDP20 || cmd.equals(Alert.DISMISS_COMMAND) //#endif ) { //#ifdef DLOGGING if (fineLoggable) { logger.fine("origCmd,type=" + origCmd.getLabel() + "," + origCmd.getCommandType()); } //#endif midlet.setCurrent(disp); cmdListener.commandAction(origCmd, disp); } else if (cmd.getCommandType() == Command.CANCEL) { midlet.setCurrent(disp); return; } } catch (Throwable e) { final CauseException ce = new CauseException( "Unable to show alert.", e); //#ifdef DLOGGING logger.severe(ce.getMessage(), e); //#endif /** Error while parsing RSS feed */ System.out.println(e.getClass().getName() + " " + ce.getMessage()); e.printStackTrace(); } } }