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

J2ME

开发平台:

Java

  1. /*
  2.  *    MFRadio - stream radio client for Java 2 Micro Edition
  3.  *    Copyright (C) 2001 - 2007 Mobicom-Kavkaz, Inc
  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 javax.microedition.lcdui.Canvas;
  27. import java.io.IOException;
  28. import javax.microedition.lcdui.Command;
  29. import javax.microedition.lcdui.CommandListener;
  30. import javax.microedition.lcdui.Displayable;
  31. import javax.microedition.lcdui.Font;
  32. import javax.microedition.lcdui.Graphics;
  33. import javax.microedition.lcdui.Image;
  34. import javax.microedition.lcdui.game.Sprite;
  35. import ru.mobicomk.mfradio.Constants;
  36. import ru.mobicomk.mfradio.controller.UIController;
  37. import ru.mobicomk.mfradio.iface.ProgressObserver;
  38. /**
  39.  * Progress bar form class.
  40.  *
  41.  * <p>Progress bar form contents progress bar, status message and (optionally) 
  42.  * <i>Stop</i> command menu item. This form shows when application performs 
  43.  * long-time operations.</p>
  44.  *
  45.  * <p>If <i>Stop</i> menu item enabled, then user can break current operation 
  46.  * by selecting this command.</p>
  47.  *
  48.  * <p>Programmer can enable or disable <i>Stop</i> menu item through 
  49.  * <i>Stoppable</i> flag. To enable <i>Stop</i> command programmer must set 
  50.  * <i>Stoppable</i> flag to <b>true</b>. Correspondingly <b>false</b> turns 
  51.  * it to disabled state.</p>
  52.  *
  53.  * @author  Roman Bondarenko
  54.  */
  55. public class ProgressBarUI 
  56.     extends Canvas
  57.     implements ProgressObserver, CommandListener {
  58.     private static final int PROGRESS_MAX = 10;
  59.     
  60.     private int progress_ ;
  61.     private Image buffer_ = null;
  62.     private String message_ = null;
  63.     private boolean stoppable_ = false;
  64.     private boolean stopped_ = false;
  65.     private Command stopCommand_;
  66.     // GUI componets
  67.     private static final int ICON_DOT                   = 0;
  68.     private static final int ICON_BLUE_GREEN_TOP_LEFT   = 1;
  69.     private static final int ICON_WHITE_BLUE_TOP_RIGHT  = 2;
  70.     private static final int ICON_WHITE_GREEN_TOP_RIGHT = 3;
  71.     private static final int ICON_BLUE_GREEN_TOP_RIGHT  = 4;
  72.     private static final int ICON_WHITE_BLUE_RIGHT      = 5;
  73.     private static final int ICON_BLACK_WHITE_TOP_LEFT  = 6;
  74.     private static final int ICON_DOT_INACTIVE          = 7;
  75.     
  76.     private static final String[] iconPaths_ = { 
  77.         "/i/dot.png"      // 0
  78.         , "/i/bg-tl.png"    // 1
  79.         , "/i/b-tr.png"     // 2
  80.         , "/i/g-tr.png"     // 3
  81.         , "/i/bg-tr.png"    // 4
  82.         , "/i/b-tr-2.png"   // 5
  83.         , "/i/black-tl.png" // 6
  84.         , "/i/dot-inactive.png"      // 7
  85.     };
  86.     private Image[] icons_ = new Image[iconPaths_.length];
  87.     
  88.     private Font bigFont_       = Font.getFont(Font.FACE_PROPORTIONAL, Font.STYLE_PLAIN, Font.SIZE_LARGE);
  89.     private Font smallFont_     = Font.getFont(Font.FACE_PROPORTIONAL, Font.STYLE_PLAIN, Font.SIZE_SMALL);
  90.     private UIController controller;
  91.     
  92.     /** 
  93.      * Creates a new instance of Progress bar and initialize it. 
  94.      */
  95.     public ProgressBarUI(UIController controller) {
  96. this.controller = controller;
  97.         initCommand();
  98.         initUI();
  99.     }
  100.     /**
  101.      * Second-level initialization. Called before show this form.
  102.      * @param message Progress bar status message.
  103.      * @param stoppable New stoppable flag value. If it is <b>true</b>, then 
  104.      * <i>Stop</i> button will be show on <i>Progress bar</i> form and user can 
  105.      * break current long-time operation. Othrwise, if stoppable flag is 
  106.      * <b>false</b>, then user can't break opration.
  107.      */
  108.     public void init(String message, boolean stoppable) {
  109.         setMessage(message);
  110.         setStoppable(stoppable);
  111.         progress_ = 0;
  112.         stopped_ = false;
  113.     }
  114.     
  115.     // ProgressObserver implementation /////////////////////////////////////////
  116.     
  117.     /**
  118.      * This method called for update long-time operation progress.
  119.      * @see ru.mobicomk.mfradio.iface.ProgressObserver
  120.      * @see ru.mobicomk.mfradio.iface.ProgressObserver#updateProgress
  121.      */
  122.     public void updateProgress() {
  123.         progress_++;
  124.         if (progress_ > PROGRESS_MAX) {
  125.             progress_ = 0;
  126.         }
  127.         repaint();
  128.     }
  129.     /**
  130.      * Set new progress bar status message.
  131.      * @param message New status message value.
  132.      * @see ru.mobicomk.mfradio.iface.ProgressObserver
  133.      * @see ru.mobicomk.mfradio.iface.ProgressObserver#setMessage
  134.      */
  135.     public void setMessage(String message) {
  136.         message_ = message;
  137.         repaint();
  138.     } 
  139.     /**
  140.      * Get <i>stoppable</i> flag value.
  141.      * @return <b>true</b> if <i>stoppable</i> flag is set, <b>false</b> othrwise.
  142.      * @see ru.mobicomk.mfradio.ui.ProgressBarUI
  143.      * @see ru.mobicomk.mfradio.iface.ProgressObserver
  144.      * @see ru.mobicomk.mfradio.iface.ProgressObserver#isStoppable
  145.      */
  146.     
  147.     public boolean isStoppable() {
  148.         return stoppable_;
  149.     } 
  150.     /**
  151.      * Set <i>stoppable</i> flag to new state.
  152.      * @param stoppable New value for <i>stoppable</i> flag.
  153.      * @see ru.mobicomk.mfradio.ui.ProgressBarUI
  154.      * @see ru.mobicomk.mfradio.iface.ProgressObserver
  155.      * @see ru.mobicomk.mfradio.iface.ProgressObserver#setStoppable
  156.      */
  157.     public void setStoppable(boolean stoppable) {
  158.         stoppable_ = stoppable;
  159.         if (stoppable_) {
  160.             addCommand(stopCommand_);
  161.         } else {
  162.             removeCommand(stopCommand_);
  163.         } 
  164.     } 
  165.     
  166.     /**
  167.      * Check if user select <i>Stop</i> command.
  168.      * @return <b>true</b> if user selects a <i>Stop</i> command, 
  169.      * <b>false</b> in other case.
  170.      * @see ru.mobicomk.mfradio.iface.ProgressObserver
  171.      * @see ru.mobicomk.mfradio.iface.ProgressObserver#isStopped
  172.      */
  173.     public boolean isStopped() {
  174.         return stopped_;
  175.     } 
  176.     
  177.     // CommandListener implementation //////////////////////////////////////////
  178.     
  179.     /** 
  180.      * CommandListener interface implementation.
  181.      * @see javax.microedition.lcdui.CommandListener
  182.      * @see javax.microedition.lcdui.CommandListener#commandAction
  183.      */
  184.     public void commandAction(Command c, Displayable d) {
  185.         if (c == stopCommand_) {
  186.             stopped_ = true;
  187.         } 
  188.     } 
  189.     // Canvas implementation ///////////////////////////////////////////////////
  190.     
  191.     /*
  192.      * {@link Canvas} interface implementaion.
  193.      * @see javax.microedition.lcdui.Canvas
  194.      * @see javax.microedition.lcdui.Canvas#paint
  195.      */
  196.     protected void paint(Graphics graphics) {
  197.         if (buffer_ == null) {
  198.             buffer_ = Image.createImage(graphics.getClipWidth(), graphics.getClipHeight());
  199.         }
  200.         
  201.         int width = buffer_.getWidth();
  202.         int height = buffer_.getHeight();
  203.         Graphics g = buffer_.getGraphics();
  204.         
  205.         paintBackground(g, 0, 0, width, height);
  206.         paintProgress(g, 0, 0, width, height);
  207.         
  208.         if (message_ != null) {
  209.             paintMessage(g, 0, 0, width, height);
  210.         }
  211.         
  212.         graphics.drawImage(buffer_, 0, 0, Graphics.TOP | Graphics.LEFT);        
  213.     }
  214.     // Privates ////////////////////////////////////////////////////////////////
  215.     
  216.     /*
  217.      * Initialize all UI components and add it to the form.
  218.      */
  219.     private void initUI() {
  220.         for (int i = 0; i < iconPaths_.length; i++) {
  221.             try {
  222.                 icons_[i] = Image.createImage(iconPaths_[i]);
  223.             } catch (IOException ioe) {
  224.             }
  225.         }
  226.     }
  227.     
  228.     private void initCommand() {
  229.         stopCommand_ = new Command(controller.getLocale().getString(Constants.STR_Stop), Command.STOP, 10);
  230.         setCommandListener(this);        
  231.     }
  232.     
  233.     private void paintBackground(Graphics g, int x, int y, int width, int height) {
  234.         Image img = icons_[ICON_BLACK_WHITE_TOP_LEFT];
  235.         int span2 = Constants.UI_ITEM_SPAN * 2;        
  236.         int left = x + Constants.UI_ITEM_SPAN;
  237.         int right = x + width - Constants.UI_ITEM_SPAN - img.getWidth();
  238.         int top = y + Constants.UI_ITEM_SPAN;
  239.         int bottom = y + height - Constants.UI_ITEM_SPAN - img.getHeight();
  240.         
  241.         g.setColor(Constants.COLOR_BLACK);
  242.         g.fillRect(x, y, width, height);
  243.         g.setColor(Constants.COLOR_BACKGROUND);
  244.         g.fillRect(left, top, width - span2, height - span2);
  245.         
  246.         drawImageTL(g, img, Sprite.TRANS_NONE, left, top);
  247.         drawImageTL(g, img, Sprite.TRANS_ROT90, right, top);
  248.         drawImageTL(g, img, Sprite.TRANS_ROT180, right, bottom);
  249.         drawImageTL(g, img, Sprite.TRANS_ROT270, left, bottom);
  250.     }
  251.     private void drawImageTL(Graphics g, Image image, int transform, int x, int y) {
  252.         g.drawRegion(image, 0, 0, image.getWidth(), image.getHeight(), transform, x, y, Graphics.TOP | Graphics.LEFT);
  253.     }
  254.     private void paintProgress(Graphics g, int x, int y, int width, int height) {
  255.         int margin2 = Constants.UI_ITEM_MARGIN * 2;
  256.         int x0 = x + Constants.UI_ITEM_MARGIN;
  257.         int y0 = y + Constants.UI_ITEM_MARGIN;
  258.         int clientX = x0 + Constants.UI_ITEM_SPAN;
  259.         int clientY = y0 + Constants.UI_ITEM_SPAN;
  260.         int clientWidth = width - ((Constants.UI_ITEM_MARGIN + Constants.UI_ITEM_SPAN) * 2);
  261.         
  262.         Image imgDot = icons_[ICON_DOT];
  263.         //Image imgDotInactive = icons_[ICON_DOT_INACTIVE];
  264.         Image imgBlueGreenTL = icons_[ICON_BLUE_GREEN_TOP_LEFT];
  265.         Image imgBlueTR = icons_[ICON_WHITE_BLUE_TOP_RIGHT];
  266.         Image imgGreenTR = icons_[ICON_WHITE_GREEN_TOP_RIGHT];
  267.         Image imgBlueGreenTR = icons_[ICON_BLUE_GREEN_TOP_RIGHT];
  268.         Image imgBlueTR1 = icons_[ICON_WHITE_BLUE_RIGHT];
  269.         
  270.         Font font;
  271.         int color;
  272.         int songX = 0;
  273.         int songY = 0;
  274.         
  275.         // draw progress background
  276.         g.setColor(Constants.COLOR_LIST_BACKGROUND);
  277.         g.fillRect(x0, y0, width - margin2, height - margin2);
  278.         
  279.         // draw corners
  280.         drawImageTL(g, imgBlueTR, Sprite.TRANS_ROT270
  281.             , x0 - 1 
  282.             , y0 - 1);
  283.         drawImageTL(g, imgBlueTR, Sprite.TRANS_NONE
  284.             , x + width - Constants.UI_ITEM_MARGIN - imgBlueTR.getWidth() + 1
  285.             , y0 - 1);        
  286.         drawImageTL(g, imgBlueTR, Sprite.TRANS_ROT90
  287.             , x + width - Constants.UI_ITEM_MARGIN - imgBlueTR.getHeight() + 1
  288.             , y + height - Constants.UI_ITEM_MARGIN - imgBlueTR.getWidth() + 1);
  289.         drawImageTL(g, imgBlueTR, Sprite.TRANS_ROT180
  290.             , x0 - 1
  291.             , y + height - Constants.UI_ITEM_MARGIN - imgBlueTR.getWidth() + 1);
  292.         
  293.         font = bigFont_;
  294.         color = Constants.COLOR_LIST_TEXT;
  295.         songX = clientX;
  296.         songY = (height - font.getHeight())/2;
  297.             
  298.         g.setColor(Constants.COLOR_BACKGROUND);
  299.         g.fillRect(clientX + Constants.UI_ITEM_SPAN, songY - 1, clientWidth , font.getHeight() + 2);
  300.         
  301.         int x1 = clientX + Constants.UI_ITEM_SPAN + clientWidth + 1 - imgBlueTR.getHeight();
  302.         if (songY - 1 - imgBlueTR.getHeight() > y0) {
  303.             drawImageTL(g, imgBlueTR, Sprite.TRANS_ROT90
  304.                 , x1
  305.                 , songY - imgBlueTR.getHeight());
  306.         } else {
  307.             drawImageTL(g, imgBlueTR1, Sprite.TRANS_NONE
  308.                 , x1-1
  309.                 , songY - 1 - imgBlueTR1.getWidth());
  310.         }
  311.         
  312.         if ((songY + font.getHeight() + imgBlueTR.getHeight()) < (y0 + height - margin2)) {
  313.             drawImageTL(g, imgBlueTR, Sprite.TRANS_NONE
  314.                 , x1
  315.                 , songY + font.getHeight());
  316.         } else {
  317.             drawImageTL(g, imgBlueTR1, Sprite.TRANS_NONE
  318.                 , x1-1
  319.                 , songY + font.getHeight() + 1);
  320.         }
  321.         
  322.         // draw cursor
  323.         g.setColor(Constants.COLOR_SELECTED);
  324.         g.fillRect(clientX + Constants.UI_ITEM_SPAN + 1, songY, clientWidth - 1, font.getHeight());
  325.         
  326.         x1 = clientX + Constants.UI_ITEM_SPAN + 1 + clientWidth - imgGreenTR.getWidth();
  327.         
  328.         drawImageTL(g, imgGreenTR, Sprite.TRANS_NONE
  329.             , x1
  330.             , songY - 1);
  331.         drawImageTL(g, imgGreenTR, Sprite.TRANS_ROT90
  332.             , x1
  333.             , songY + font.getHeight() + 1 - imgGreenTR.getWidth());
  334.         
  335.         drawImageTL(g, imgBlueGreenTL, Sprite.TRANS_NONE
  336.             , clientX + Constants.UI_ITEM_SPAN
  337.             , songY - 1);        
  338.         drawImageTL(g, imgBlueGreenTL, Sprite.TRANS_ROT270
  339.             , clientX + Constants.UI_ITEM_SPAN
  340.             , songY + font.getHeight() + 1 - imgBlueGreenTL.getWidth());
  341.         
  342.         // dots
  343.         int dotShift = (clientWidth - (Constants.UI_ITEM_SPAN * 2)) / PROGRESS_MAX;
  344.         int dotX = clientX + Constants.UI_ITEM_SPAN + dotShift/2;
  345.         int dotY = songY + (font.getHeight() / 2) - imgDot.getHeight()/2;
  346.         
  347.         //int dotShift = imgDot.getWidth() + Constants.UI_ITEM_SPAN;
  348.         /*
  349.         for (int i = 0; i< progress_; i++) {
  350.             g.drawImage(imgDot, dotX + i * dotShift, dotY, Graphics.TOP | Graphics.LEFT);
  351.         }*/
  352.         
  353.         for (int i = 0; i< PROGRESS_MAX; i++) {
  354.             if (i >= (progress_ - 2) && i <= progress_)
  355.                 g.drawImage(imgDot, dotX + i * dotShift, dotY, Graphics.TOP | Graphics.LEFT);
  356.         }
  357.     }
  358.     private void paintMessage(Graphics g, int x, int y, int width, int height) {
  359.         int margin2 = Constants.UI_ITEM_MARGIN * 2;
  360.         int x0 = x + Constants.UI_ITEM_MARGIN;
  361.         int y0 = y + height - Constants.UI_ITEM_MARGIN;
  362.         int left = x0 + Constants.UI_ITEM_SPAN + Constants.UI_ITEM_MARGIN;
  363.         int bottom = y0;
  364.         int maxStringWidth = width - ((Constants.UI_ITEM_MARGIN + Constants.UI_ITEM_SPAN) * 2);
  365.         
  366.         char[] chars = message_.toCharArray();
  367.         int length = message_.length();
  368.         while (smallFont_.charsWidth(chars, 0, length) > maxStringWidth) {
  369.            length--;
  370.         }
  371.         g.setColor(Constants.COLOR_WHITE);
  372.         g.setFont(smallFont_);
  373.         g.drawSubstring(message_, 0, length, left, bottom, Graphics.LEFT | Graphics.BOTTOM);
  374.     }
  375.     
  376. }