HelpUI.java
上传用户:liming6160
上传日期:2022-06-07
资源大小:785k
文件大小:10k
源码类别:

J2ME

开发平台:

Java

  1. /*
  2.  *    Copyright (C) 2001 - 2007 Mobicom-Kavkaz, Inc
  3.  *    MFRadio - stream radio client for Java 2 Micro Edition
  4.  *    
  5.  *    Visit the project page at: http://mfradio.sourceforge.net
  6.  *
  7.  *    This program is free software; you can redistribute it and/or modify
  8.  *    it under the terms of the GNU General Public License as published by
  9.  *    the Free Software Foundation; either version 2 of the License, or
  10.  *    (at your option) any later version.
  11.  *
  12.  *    This program is distributed in the hope that it will be useful,
  13.  *    but WITHOUT ANY WARRANTY; without even the implied warranty of
  14.  *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15.  *    GNU General Public License for more details.
  16.  *
  17.  *    You should have received a copy of the GNU General Public License
  18.  *    along with this program; if not, write to the Free Software
  19.  *    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  20.  *
  21.  *    Java (TM) and all Java (TM)-based marks are a trademark or 
  22.  *    registered trademark of Sun Microsystems, Inc, in the United States 
  23.  *    and other countries.
  24.  */
  25. package ru.mobicomk.mfradio.ui;
  26. import java.io.IOException;
  27. import java.util.Enumeration;
  28. import java.util.Vector;
  29. import javax.microedition.lcdui.Command;
  30. import javax.microedition.lcdui.CommandListener;
  31. import javax.microedition.lcdui.Displayable;
  32. import javax.microedition.lcdui.Font;
  33. import javax.microedition.lcdui.Form;
  34. import javax.microedition.lcdui.Image;
  35. import javax.microedition.lcdui.ImageItem;
  36. import javax.microedition.lcdui.Item;
  37. import javax.microedition.lcdui.StringItem;
  38. import ru.mobicomk.mfradio.Constants;
  39. import ru.mobicomk.mfradio.controller.UIController;
  40. import ru.mobicomk.mfradio.util.Locale;
  41. /**
  42.  * Form for help topics display.
  43.  *
  44.  * @author  Roman Bondarenko
  45.  */
  46. public class HelpUI 
  47.     extends Form
  48.     implements CommandListener {
  49.     /** Help topic for <i>Player</i> form. */
  50.     public static final int HELP_PLAYERUI_TOPIC = 1;
  51.     
  52.     /** Help topic for <i>Edit station information</i> form. */
  53.     public static final int HELP_EDITSTATIONUI_TOPIC = 2;
  54.     
  55.     /** Help topic for <i>New station information</i> form. */
  56.     public static final int HELP_ADDSTATIONUI_TOPIC = 3;
  57.     
  58.     /** Help topic for <i>WAP browser</i> form. */
  59.     public static final int HELP_WAPBROWSERUI_TOPIC = 4;
  60.     
  61.     // Controller
  62.     private UIController controller_;
  63.     private Displayable nextDisplayable_;
  64.         
  65.     // Commands
  66.     private Command okCommand_;
  67.     // UI Items
  68.     private String text_  = null;
  69.     
  70.     private static final int ICON_LINK                  = 0;
  71.     private static final int ICON_NOT_LINK              = 1;
  72.     private static final int ICON_UNKNOWN               = 2;
  73.     private static final String[] iconPaths_ = { 
  74.           "/i/doc.png"          // 0
  75.         , "/i/doc3.png"    // 1
  76.         , "/i/unknown.png"      // 2
  77.     };
  78.     private Image[] icons_ = new Image[iconPaths_.length];
  79.     
  80.     private Font bigFont_       = Font.getFont(Font.FACE_PROPORTIONAL, Font.STYLE_BOLD, Font.SIZE_MEDIUM);
  81.     private Font smallFont_     = Font.getFont(Font.FACE_PROPORTIONAL, Font.STYLE_PLAIN, Font.SIZE_SMALL);
  82.     private Font smallBoldFont_ = Font.getFont(Font.FACE_PROPORTIONAL, Font.STYLE_BOLD, Font.SIZE_SMALL);
  83.     // Ctor ////////////////////////////////////////////////////////////////////
  84.     
  85.     /**
  86.      * Create new <i>Help</i> form object and init it.
  87.      * @param controller Application controller object.
  88.      */
  89.     public HelpUI(UIController controller) {
  90.         super("");
  91.         
  92.         controller_ = controller;
  93.         
  94.         initCommands();
  95.         initUI();
  96.     }
  97.     /**
  98.      * Second-level initialization. Must be called before each show form.
  99.      * @param topic Help topic ID.
  100.      * @param nextDisplayable Object which well be displayed after <i>Help</i> form.
  101.      */
  102.     public void init(int topic, Displayable nextDisplayable) {
  103.         nextDisplayable_ = nextDisplayable;
  104.         final Locale locale = controller_.getLocale();
  105.         switch (topic) {
  106.             case HELP_ADDSTATIONUI_TOPIC: 
  107.                 setTitle(locale.getString(Constants.STR_Edit_Station));
  108.                 text_ = locale.getString(Constants.STR_EditUI_Add_help_text);
  109.                 updateUI();
  110.                 break;
  111.             case HELP_EDITSTATIONUI_TOPIC: 
  112.                 setTitle(locale.getString(Constants.STR_Edit_Station));
  113.                 text_ = locale.getString(Constants.STR_EditUI_Edit_help_text);
  114.                 updateUI();
  115.                 break;
  116.             case HELP_PLAYERUI_TOPIC:
  117.                 setTitle(locale.getString(Constants.STR_Player));
  118.                 text_ = locale.getString(Constants.STR_PlayerUI_help_text);
  119.                 updateUI();
  120.                 break;
  121.             case HELP_WAPBROWSERUI_TOPIC:
  122.                 setTitle(locale.getString(Constants.STR_Online_repository));
  123.                 text_ = locale.getString(Constants.STR_WAPUI_help_text);
  124.                 updateUI();
  125.                 break;
  126.         }
  127.     }
  128.     
  129.     // CommandListener interface ///////////////////////////////////////////////
  130.     
  131.     /** 
  132.      * CommandListener interface implementation.
  133.      * @see javax.microedition.lcdui.CommandListener 
  134.      */
  135.     public void commandAction(Command command, Displayable displayable) {
  136.         if (command == okCommand_) {
  137.             controller_.endShowHelp(nextDisplayable_);
  138.         }
  139.     }
  140.     // Privates ////////////////////////////////////////////////////////////////
  141.     private void initUI() {
  142.         for (int i = 0; i < iconPaths_.length; i++) {
  143.             try {
  144.                 icons_[i] = Image.createImage(iconPaths_[i]);
  145.             } catch (IOException ioe) {
  146.             }
  147.         }
  148.     }
  149.     
  150.     private void initCommands() {
  151.         okCommand_ = new Command(controller_.getLocale().getString(Constants.STR_OK), Command.OK, 1);
  152.         addCommand(okCommand_);
  153.         setCommandListener(this);        
  154.     }
  155.     private void updateUI() {
  156.         deleteAll();
  157.         
  158.         Vector items = null;
  159.         Object o;
  160.         items = makeItemsFromString(text_); 
  161.         Enumeration e = items.elements();
  162.         while (e.hasMoreElements()) {
  163.             o = e.nextElement();
  164.             if (null != o) {
  165.                 append((Item)o);
  166.             }
  167.         }
  168.     }
  169.     
  170.     private Vector makeItemsFromString(String string) {
  171.         Vector items = new Vector(5,5);
  172.         String line = null;
  173.         String token = null;
  174.         Item item = null;
  175.         int spaceIdx = 0;
  176.         int slashIdx = 0;
  177.         
  178.         MultiLineStringParser parser = new MultiLineStringParser(string);
  179.         
  180.         while (!parser.endOfString()) {
  181.             line = parser.nextLine();
  182.             if (line.charAt(0) == '\') {
  183.                 spaceIdx = line.indexOf(' ');
  184.                 token = line.substring(0, spaceIdx);
  185.                 if (token.equals("\h1")) {
  186.                     item = header1(line.substring(spaceIdx + 1));
  187.                 } else if (token.equals("\h2")) {
  188.                     item = header2(line.substring(spaceIdx + 1));
  189.                 } else if (token.equals("\p")) {
  190.                     item = normalText(line.substring(spaceIdx + 1));
  191.                 } else if (token.equals("\i")) {
  192.                     item = image(line.substring(spaceIdx + 1));
  193.                 }
  194.             } else {
  195.                 item = normalText(line); // 'p' by default
  196.             }
  197.             items.addElement(item);
  198.         }
  199.         return items;
  200.     }
  201.     
  202.     // TODO: to separate class (xxDrawer)
  203.     private StringItem header1(String text) {
  204.         if (text == null) {
  205.             return null;
  206.         }
  207.         
  208.         StringItem h = new StringItem(null, text);
  209.         h.setFont(bigFont_);
  210.         h.setLayout(Item.LAYOUT_2
  211.             | Item.LAYOUT_CENTER
  212.             | Item.LAYOUT_EXPAND
  213.             | Item.LAYOUT_NEWLINE_AFTER 
  214.             | Item.LAYOUT_NEWLINE_BEFORE
  215.             );
  216.         return h;
  217.     }
  218.     // TODO: to separate class (xxDrawer)
  219.     private StringItem header2(String text) {
  220.         StringItem h = new StringItem(text, null);
  221.         h.setFont(smallBoldFont_);
  222.         h.setLayout(Item.LAYOUT_2
  223.             | Item.LAYOUT_LEFT
  224.             | Item.LAYOUT_EXPAND
  225.             | Item.LAYOUT_NEWLINE_AFTER | Item.LAYOUT_NEWLINE_BEFORE);
  226.         return h;
  227.     }
  228.     
  229.     // TODO: to separate class (xxDrawer)
  230.     private StringItem normalText(String text) {
  231.         StringItem t = new StringItem(null, text);
  232.         t.setFont(smallFont_);
  233.         t.setLayout(Item.LAYOUT_2
  234.             | Item.LAYOUT_LEFT
  235.             | Item.LAYOUT_EXPAND
  236.             | Item.LAYOUT_NEWLINE_AFTER
  237.             );
  238.         return t;
  239.     }
  240.     
  241.     // TODO: to separate class (xxDrawer)
  242.     private ImageItem image(String text) {
  243.         Image img = null;
  244.         ImageItem imgItem = null;
  245.         
  246.         for (int idx = 0; idx<iconPaths_.length; idx++) {
  247.             if (iconPaths_[idx].equals(text)) {
  248.                 img = icons_[idx];
  249.                 break;
  250.             }
  251.         }
  252.         if (img != null) {
  253.             imgItem = new ImageItem("n", img
  254.                 , Item.LAYOUT_2 
  255.                 | Item.LAYOUT_LEFT 
  256.                 //| Item.LAYOUT_NEWLINE_BEFORE
  257.                 , "[image]");
  258.         } 
  259.         return imgItem;
  260.     }
  261.     /*
  262.      *
  263.      */
  264.     private class MultiLineStringParser {
  265.         private String string_;
  266.         private int pos_;
  267.         
  268.         public MultiLineStringParser(String string) {
  269.             pos_ = 0;
  270.             string_ = string;
  271.         }
  272.         
  273.         public boolean endOfString() {
  274.             return (string_ == null) || (string_.length() == pos_);
  275.         }
  276.         
  277.         public String nextLine() {
  278.             String line = null;
  279.             if (string_ != null) {
  280.                 int eol = string_.indexOf('n', pos_ + 1);
  281.                 if (eol == -1) {
  282.                     line = string_.substring(pos_);
  283.                     pos_ = string_.length();
  284.                 } else {
  285.                     line = string_.substring(pos_, eol);
  286.                     pos_ = eol;
  287.                     char ch = string_.charAt(pos_);
  288.                     while ((ch == 'n' || ch == 'r') && (pos_ < (string_.length() - 1))) {
  289.                         pos_++;
  290.                         ch = string_.charAt(pos_);
  291.                     }
  292.                 }
  293.             }
  294.             return line;
  295.         }
  296.     }
  297. }