LookAndFeel.java
上传用户:haobig99
上传日期:2022-06-15
资源大小:369k
文件大小:29k
源码类别:

J2ME

开发平台:

Java

  1. /*
  2.  * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
  3.  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  4.  *
  5.  * This code is free software; you can redistribute it and/or modify it
  6.  * under the terms of the GNU General Public License version 2 only, as
  7.  * published by the Free Software Foundation.  Sun designates this
  8.  * particular file as subject to the "Classpath" exception as provided
  9.  * by Sun in the LICENSE file that accompanied this code.
  10.  *
  11.  * This code is distributed in the hope that it will be useful, but WITHOUT
  12.  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  13.  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  14.  * version 2 for more details (a copy is included in the LICENSE file that
  15.  * accompanied this code).
  16.  *
  17.  * You should have received a copy of the GNU General Public License version
  18.  * 2 along with this work; if not, write to the Free Software Foundation,
  19.  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  20.  *
  21.  * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
  22.  * CA 95054 USA or visit www.sun.com if you need additional information or
  23.  * have any questions.
  24.  */
  25. package com.sun.lwuit.plaf;
  26. import com.sun.lwuit.geom.Dimension;
  27. import com.sun.lwuit.*;
  28. import com.sun.lwuit.animations.Transition;
  29. import com.sun.lwuit.geom.Rectangle;
  30. import com.sun.lwuit.list.*;
  31. /**
  32.  * Allows a UI developer to completely customize the look of the application by
  33.  * overriding drawing/sizing methods appropriately.
  34.  *
  35.  * @author Chen Fishbein
  36.  */
  37. public abstract class LookAndFeel {
  38.     private Component verticalScroll;
  39.     private Component horizontalScroll;
  40.     private Component verticalScrollThumb;
  41.     private Component horizontalScrollThumb;
  42. /**
  43.  * Right-To-Left. Default false.
  44.  */
  45. private boolean rtl;
  46.     private long tickerSpeed = 50;
  47.     /**
  48.      * Tint color is set when a form is partially covered be it by a menu or by a 
  49.      * dialog. A look and feel can override this default value.
  50.      */
  51.     private int defaultFormTintColor = 0x77000000;
  52.     /**
  53.      * This color is used to paint disable mode.
  54.      */
  55.     private int disableColor = 0xcccccc;
  56.     /**
  57.      * This member allows us to define a default animation that will draw the transition for
  58.      * entering a form
  59.      */
  60.     private Transition defaultFormTransitionIn;
  61.     /**
  62.      * This member allows us to define a default animation that will draw the transition for
  63.      * exiting a form
  64.      */
  65.     private Transition defaultFormTransitionOut;
  66.     /**
  67.      * This member allows us to define a default animation that will draw the transition for
  68.      * entering a menu
  69.      */
  70.     private Transition defaultMenuTransitionIn;
  71.     /**
  72.      * This member allows us to define a default animation that will draw the transition for
  73.      * exiting a menu
  74.      */
  75.     private Transition defaultMenuTransitionOut;
  76.     /**
  77.      * This member allows us to define a default animation that will draw the transition for
  78.      * entering a dialog
  79.      */
  80.     private Transition defaultDialogTransitionIn;
  81.     /**
  82.      * This member allows us to define a default animation that will draw the transition for
  83.      * exiting a form
  84.      */
  85.     private Transition defaultDialogTransitionOut;
  86.     /**
  87.      * Indicates whether lists and containers should have smooth scrolling by default
  88.      */
  89.     private boolean defaultSmoothScrolling = true;
  90.     /**
  91.      * Indicates the default speed for smooth scrolling
  92.      */
  93.     private int defaultSmoothScrollingSpeed = 150;
  94.     /**
  95.      * Indicates whether softbuttons should be reversed from their default orientation
  96.      */
  97.     private boolean reverseSoftButtons;
  98.     /**
  99.      * This renderer is assigned to all Forms Menu's by default.
  100.      */
  101.     private ListCellRenderer menuRenderer;
  102.     private Image[] menuIcons = new Image[3];
  103.     /**
  104.      * Indicates whether the menu UI should target a touch based device or a
  105.      * standard cell phone
  106.      */
  107.     private boolean touchMenus;
  108.     /**
  109.      * Allows defining a tactile touch device that vibrates when the user presses a component
  110.      * that should respond with tactile feedback on a touch device (e.g. vibrate).
  111.      * Setting this to 0 disables tactile feedback completely
  112.      */
  113.     private int tactileTouchDuration = 0;
  114.     /**
  115.      * Every component binds itself to the look and feel thus allowing the look 
  116.      * and feel to customize the component.  Binding occurs at the end of the
  117.      * constructor when the component is in a valid state and ready to be used.
  118.      * Notice that a component might be bound twice or more and it is the 
  119.      * responsibility of the LookAndFeel to protect against that.
  120.      * 
  121.      * @param cmp component instance that may be customized by the look and feel
  122.      */
  123.     public void bind(Component cmp) {
  124.     }
  125.     /**
  126.      * Invoked when a look and feel is removed, allows a look and feel to release 
  127.      * resources related to binding components.
  128.      * 
  129.      * @see #bind(Component)
  130.      */
  131.     public void uninstall() {
  132.     }
  133.     /**
  134.      * Invoked for drawing a button widget
  135.      * 
  136.      * @param g graphics context
  137.      * @param b component to draw
  138.      */
  139.     public abstract void drawButton(Graphics g, Button b);
  140.     /**
  141.      * Invoked for drawing a checkbox widget
  142.      * 
  143.      * @param g graphics context
  144.      * @param cb component to draw
  145.      */
  146.     public abstract void drawCheckBox(Graphics g, Button cb);
  147.     /**
  148.      * Invoked for drawing a combo box widget
  149.      * 
  150.      * @param g graphics context
  151.      * @param cb component to draw
  152.      */
  153.     public abstract void drawComboBox(Graphics g, List cb);
  154.     /**
  155.      * Invoked for drawing a label widget
  156.      * 
  157.      * @param g graphics context
  158.      * @param l component to draw
  159.      */
  160.     public abstract void drawLabel(Graphics g, Label l);
  161.     /**
  162.      * Invoked for drawing a list widget
  163.      * 
  164.      * @param g graphics context
  165.      * @param l component to draw
  166.      */
  167.     public abstract void drawList(Graphics g, List l);
  168.     /**
  169.      * Invoked for drawing the radio button widget
  170.      * 
  171.      * @param g graphics context
  172.      * @param rb component to draw
  173.      */
  174.     public abstract void drawRadioButton(Graphics g, Button rb);
  175.     /**
  176.      * Draw the given text area
  177.      * 
  178.      * @param g graphics context
  179.      * @param ta component to draw
  180.      */
  181.     public abstract void drawTextArea(Graphics g, TextArea ta);
  182.     /**
  183.      * Draws the text field without its cursor which is drawn in a separate method
  184.      * input mode indication can also be drawn using this method.
  185.      * 
  186.      * @param g graphics context
  187.      * @param ta component to draw
  188.      */
  189.     public abstract void drawTextField(Graphics g, TextArea ta);
  190.     /**
  191.      * Draws the cursor of the text field, blinking is handled simply by avoiding
  192.      * a call to this method.
  193.      * 
  194.      * @param g graphics context
  195.      * @param ta component to draw
  196.      */
  197.     public abstract void drawTextFieldCursor(Graphics g, TextArea ta);
  198.     /**
  199.      * Invoked for drawing the Tab Pane widget
  200.      * 
  201.      * @param g graphics context
  202.      * @param tp component to draw
  203.      */
  204.     public abstract void drawTabbedPane(Graphics g, TabbedPane tp);
  205.     /**
  206.      * Calculate the preferred size of the component
  207.      * 
  208.      * @param b component whose size should be calculated
  209.      * @return the preferred size for the button
  210.      */
  211.     public abstract Dimension getButtonPreferredSize(Button b);
  212.     /**
  213.      * Calculate the preferred size of the component
  214.      * 
  215.      * @param cb component whose size should be calculated
  216.      * @return the preferred size for the component
  217.      */
  218.     public abstract Dimension getCheckBoxPreferredSize(Button cb);
  219.     /**
  220.      * Calculate the preferred size of the component
  221.      * 
  222.      * @param l component whose size should be calculated
  223.      * @return the preferred size for the component
  224.      */
  225.     public abstract Dimension getLabelPreferredSize(Label l);
  226.     /**
  227.      * Calculate the preferred size of the component
  228.      * 
  229.      * @param l component whose size should be calculated
  230.      * @return the preferred size for the component
  231.      */
  232.     public abstract Dimension getListPreferredSize(List l);
  233.     /**
  234.      * Calculate the preferred size of the component
  235.      * 
  236.      * @param rb component whose size should be calculated
  237.      * @return the preferred size for the component
  238.      */
  239.     public abstract Dimension getRadioButtonPreferredSize(Button rb);
  240.     //public abstract Dimension getSpinnerPreferredSize(Spinner sp);
  241.     /**
  242.      * Calculate the preferred size of the component
  243.      * 
  244.      * @param ta component whose size should be calculated
  245.      * @param pref indicates whether preferred or scroll size should be returned
  246.      * @return the preferred size for the component
  247.      */
  248.     public abstract Dimension getTextAreaSize(TextArea ta, boolean pref);
  249.     /**
  250.      * Calculate the preferred size of the component
  251.      * 
  252.      * @param ta component whose size should be calculated
  253.      * @return the preferred size for the component
  254.      */
  255.     public abstract Dimension getTextFieldPreferredSize(TextArea ta);
  256.     /**
  257.      * Calculate the preferred size of the component
  258.      * 
  259.      * @param box component whose size should be calculated
  260.      * @return the preferred size for the component
  261.      */
  262.     public abstract Dimension getComboBoxPreferredSize(List box);
  263.     /**
  264.      * Draws a vertical scroll bar in the given component
  265.      * 
  266.      * @param g graphics context
  267.      * @param c component to draw on
  268.      * @param offsetRatio ratio of the scroll bar from 0 to 1
  269.      * @param blockSizeRatio block size for the scroll from 0 to 1
  270.      */
  271.     public void drawVerticalScroll(Graphics g, Component c, float offsetRatio, float blockSizeRatio) {
  272.         if(verticalScroll == null) {
  273.             initScroll();
  274.         }
  275.         int x = c.getX();
  276.         if(!c.isRTL()) {
  277.             x += c.getWidth() - getVerticalScrollWidth();
  278.         }
  279.         int y = c.getY();
  280.         int height = c.getHeight();
  281.         int width = getVerticalScrollWidth();
  282.         drawScroll(g, c, offsetRatio, blockSizeRatio, true, x, y, width, height, verticalScroll, verticalScrollThumb);
  283.     }
  284.     /**
  285.      * Draws a horizontal scroll bar in the given component
  286.      * 
  287.      * @param g graphics context
  288.      * @param c component to draw on
  289.      * @param offsetRatio ratio of the scroll bar from 0 to 1
  290.      * @param blockSizeRatio block size for the scroll from 0 to 1
  291.      */
  292.     public void drawHorizontalScroll(Graphics g, Component c, float offsetRatio, float blockSizeRatio) {
  293.         if(horizontalScroll == null) {
  294.             initScroll();
  295.         }
  296.         int x = c.getX();
  297.         int y = c.getY() + c.getHeight() - getHorizontalScrollHeight();
  298.         int width = c.getWidth();
  299.         int height = getHorizontalScrollHeight();
  300.         drawScroll(g, c, offsetRatio, blockSizeRatio, false, x, y, width, height, horizontalScroll, horizontalScrollThumb);
  301.     }
  302.     private void drawScroll(Graphics g, Component c, float offsetRatio,
  303.             float blockSizeRatio, boolean isVertical, int x, int y, int width, int height,
  304.             Component scroll, Component scrollThumb) {
  305.         Style scrollStyle = scroll.getUnselectedStyle();
  306.         Style scrollThumbStyle = scrollThumb.getUnselectedStyle();
  307.         // take margin into consideration when positioning the scroll
  308.         int marginLeft = scrollStyle.getMargin(c.isRTL(), Component.LEFT);
  309.         int marginTop = scrollStyle.getMargin(false, Component.TOP);
  310.         x += marginLeft;
  311.         width -= (marginLeft + scrollStyle.getMargin(c.isRTL(), Component.RIGHT));
  312.         y += marginTop;
  313.         height -= (marginTop + scrollStyle.getMargin(false, Component.BOTTOM));
  314.         scroll.setX(x);
  315.         scroll.setY(y);
  316.         scroll.setWidth(width);
  317.         scroll.setHeight(height);
  318.         int cx = g.getClipX();
  319.         int cy = g.getClipY();
  320.         int cw = g.getClipWidth();
  321.         int ch = g.getClipHeight();
  322.         scroll.paintComponent(g);
  323.         marginLeft = scrollThumbStyle.getMargin(c.isRTL(), Component.LEFT);
  324.         marginTop = scrollThumbStyle.getMargin(false, Component.TOP);
  325.         x += marginLeft;
  326.         width -= (marginLeft + scrollThumbStyle.getMargin(c.isRTL(), Component.RIGHT));
  327.         y += marginTop;
  328.         height -= (marginTop + scrollThumbStyle.getMargin(false, Component.BOTTOM));
  329.         int offset, blockSize;
  330.         if (isVertical) {
  331.             blockSize = (int) (c.getHeight() * blockSizeRatio) + 2;
  332.             offset = (int) ((c.getHeight()) * offsetRatio);
  333.         } else {
  334.             blockSize = (int) (c.getWidth() * blockSizeRatio) + 2;
  335.             offset = (int) ((c.getWidth()) * offsetRatio);
  336.         }
  337.         
  338.         if (isVertical) {
  339.             scrollThumb.setX(x);
  340.             scrollThumb.setY(y + offset);
  341.             scrollThumb.setWidth(width);
  342.             scrollThumb.setHeight(blockSize);
  343.         } else {
  344.             scrollThumb.setX(x + offset);
  345.             scrollThumb.setY(y);
  346.             scrollThumb.setWidth(blockSize);
  347.             scrollThumb.setHeight(height);
  348.         }
  349.         
  350.         g.setClip(cx, cy, cw, ch);
  351.         scrollThumb.paintComponent(g);
  352.         g.setClip(cx, cy, cw, ch);
  353.     }
  354.     /**
  355.      * Sets the foreground color and font for a generic component, reuse-able by most component
  356.      * drawing code
  357.      * 
  358.      * @param g graphics context
  359.      * @param c component from which fg styles should be set
  360.      */
  361.     public void setFG(Graphics g, Component c) {
  362.         Style s = c.getStyle();
  363.         g.setFont(s.getFont());
  364.         if (c.isEnabled()) {
  365.             g.setColor(s.getFgColor());
  366.         } else {
  367.             g.setColor(disableColor);
  368.         }
  369.     }
  370.     /**
  371.      * Returns the default width of a vertical scroll bar
  372.      * 
  373.      * @return default width of a vertical scroll bar
  374.      */
  375.     public int getVerticalScrollWidth() {
  376.         if(verticalScroll == null) {
  377.             initScroll();
  378.         }
  379.         Style scrollStyle = verticalScroll.getStyle();
  380.         // bidi doesn't matter for width calculations
  381.         return scrollStyle.getMargin(false, Component.LEFT) + scrollStyle.getMargin(false, Component.RIGHT) +
  382.                 scrollStyle.getPadding(false, Component.LEFT) + scrollStyle.getPadding(false, Component.RIGHT);
  383.     }
  384.     /**
  385.      * Returns the default height of a horizontal scroll bar
  386.      * 
  387.      * @return default height of a horizontal scroll bar
  388.      */
  389.     public int getHorizontalScrollHeight() {
  390.         if(horizontalScroll == null) {
  391.             initScroll();
  392.         }
  393.         Style scrollStyle = horizontalScroll.getStyle();
  394.         // bidi doesn't matter for height calculations
  395.         return scrollStyle.getMargin(false, Component.TOP) + scrollStyle.getMargin(false, Component.BOTTOM) +
  396.                 scrollStyle.getPadding(false, Component.TOP) + scrollStyle.getPadding(false, Component.BOTTOM);
  397.     }
  398.     /**
  399.      * Draws generic component border
  400.      */
  401.     void drawBorder(Graphics g, Component c, int color, int borderWidth) {
  402.         drawBorder(g, c, color, color, borderWidth);
  403.     }
  404.     /**
  405.      * Draws generic component border
  406.      */
  407.     void drawBorder(Graphics g, Component c, int topAndRightColor, int bottomAndLeftColor, int borderWidth) {
  408.         g.setColor(topAndRightColor);     //Text Component upper border color
  409.         g.fillRect(c.getX(), c.getY(), c.getWidth(), borderWidth);
  410.         g.fillRect(c.getX(), c.getY(), borderWidth, c.getHeight());
  411.         g.setColor(bottomAndLeftColor);     //Text Component lower border color
  412.         g.fillRect(c.getX(), c.getY() + c.getHeight() - borderWidth, c.getWidth(), borderWidth);
  413.         g.fillRect(c.getX() + c.getWidth() - borderWidth, c.getY(), borderWidth, c.getHeight());
  414.     }
  415.     /**
  416.      * Draws and return the TabbedPane cell component (renderer)
  417.      * according to each tab orientation, the borders are getting draws
  418.      * 
  419.      * @param tp the TabbedPane
  420.      * @param text the cell text
  421.      * @param icon the cell icon image
  422.      * @param isSelected is the cell is the selected one
  423.      * @param cellHasFocus is the cell has focus
  424.      * @param cellStyle the cell Style object
  425.      * @param cellSelectedStyle the selected style for the cell object
  426.      * @param tabbedPaneStyle the TabbedPane Style object
  427.      * @param cellOffsetX the offset when the cell is on TOP or BOTTOM orientation
  428.      * @param cellOffsetY the offset when the cell is on LEFT or RIGHT orientation
  429.      * @param cellsPreferredSize the total cells PreferredSize
  430.      * @param contentPaneSize the contentPaneSize
  431.      * @return A TabbedPane cell component
  432.      */
  433.     public abstract Component getTabbedPaneCell(final TabbedPane tp,
  434.             final String text, final Image icon, final boolean isSelected,
  435.             final boolean cellHasFocus, final Style cellStyle, Style cellSelectedStyle,
  436.             final Style tabbedPaneStyle, final int cellOffsetX,
  437.             final int cellOffsetY, final Dimension cellsPreferredSize,
  438.             final Dimension contentPaneSize);
  439.     /**
  440.      * Draws and return the TabbedPane contentpane painter
  441.      * 
  442.      * @param tp the TabbedPane
  443.      * @param g the content pane graphics
  444.      * @param rect the content pane painting rectangle area
  445.      * @param cellsPreferredSize the total cells PreferredSize
  446.      * @param numOfTabs number of tabs
  447.      * @param selectedTabIndex the selected tab index
  448.      * @param tabsSize the tabs size
  449.      * @param cellOffsetX the offset when the cell is on TOP or BOTTOM orientation
  450.      * @param cellOffsetY the offset when the cell is on LEFT or RIGHT orientation
  451.      */
  452.     public abstract void drawTabbedPaneContentPane(final TabbedPane tp,
  453.             final Graphics g, final Rectangle rect,
  454.             final Dimension cellsPreferredSize, final int numOfTabs,
  455.             final int selectedTabIndex, final Dimension tabsSize,
  456.             final int cellOffsetX, final int cellOffsetY);
  457.     /**
  458.      * Allows us to define a default animation that will draw the transition for
  459.      * entering a form
  460.      * 
  461.      * @return default transition
  462.      */
  463.     public Transition getDefaultFormTransitionIn() {
  464.         return defaultFormTransitionIn;
  465.     }
  466.     /**
  467.      * Allows us to define a default animation that will draw the transition for
  468.      * entering a form
  469.      * 
  470.      * @param defaultFormTransitionIn the default transition
  471.      */
  472.     public void setDefaultFormTransitionIn(Transition defaultFormTransitionIn) {
  473.         this.defaultFormTransitionIn = defaultFormTransitionIn;
  474.     }
  475.     /**
  476.      * Allows us to define a default animation that will draw the transition for
  477.      * exiting a form
  478.      * 
  479.      * @return default transition
  480.      */
  481.     public Transition getDefaultFormTransitionOut() {
  482.         return defaultFormTransitionOut;
  483.     }
  484.     /**
  485.      * Allows us to define a default animation that will draw the transition for
  486.      * exiting a form
  487.      * 
  488.      * @param defaultFormTransitionOut the default transition
  489.      */
  490.     public void setDefaultFormTransitionOut(Transition defaultFormTransitionOut) {
  491.         this.defaultFormTransitionOut = defaultFormTransitionOut;
  492.     }
  493.     /**
  494.      * Allows us to define a default animation that will draw the transition for
  495.      * entering a Menu
  496.      * 
  497.      * @return default transition
  498.      */
  499.     public Transition getDefaultMenuTransitionIn() {
  500.         return defaultMenuTransitionIn;
  501.     }
  502.     /**
  503.      * Allows us to define a default animation that will draw the transition for
  504.      * entering a Menu
  505.      * 
  506.      * @param defaultMenuTransitionIn the default transition
  507.      */
  508.     public void setDefaultMenuTransitionIn(Transition defaultMenuTransitionIn) {
  509.         this.defaultMenuTransitionIn = defaultMenuTransitionIn;
  510.     }
  511.     /**
  512.      * Allows us to define a default animation that will draw the transition for
  513.      * exiting a Menu
  514.      * 
  515.      * @return default transition
  516.      */
  517.     public Transition getDefaultMenuTransitionOut() {
  518.         return defaultMenuTransitionOut;
  519.     }
  520.     /**
  521.      * Allows us to define a default animation that will draw the transition for
  522.      * exiting a Menu
  523.      * 
  524.      * @param defaultMenuTransitionOut the default transition
  525.      */
  526.     public void setDefaultMenuTransitionOut(Transition defaultMenuTransitionOut) {
  527.         this.defaultMenuTransitionOut = defaultMenuTransitionOut;
  528.     }
  529.     /**
  530.      * Allows us to define a default animation that will draw the transition for
  531.      * entering a dialog
  532.      * 
  533.      * @return default transition
  534.      */
  535.     public Transition getDefaultDialogTransitionIn() {
  536.         return defaultDialogTransitionIn;
  537.     }
  538.     /**
  539.      * Allows us to define a default animation that will draw the transition for
  540.      * entering a dialog
  541.      * 
  542.      * @param defaultDialogTransitionIn the default transition
  543.      */
  544.     public void setDefaultDialogTransitionIn(Transition defaultDialogTransitionIn) {
  545.         this.defaultDialogTransitionIn = defaultDialogTransitionIn;
  546.     }
  547.     /**
  548.      * Allows us to define a default animation that will draw the transition for
  549.      * exiting a dialog
  550.      * 
  551.      * @return default transition
  552.      */
  553.     public Transition getDefaultDialogTransitionOut() {
  554.         return defaultDialogTransitionOut;
  555.     }
  556.     /**
  557.      * Allows us to define a default animation that will draw the transition for
  558.      * exiting a dialog
  559.      * 
  560.      * @param defaultDialogTransitionOut the default transition
  561.      */
  562.     public void setDefaultDialogTransitionOut(Transition defaultDialogTransitionOut) {
  563.         this.defaultDialogTransitionOut = defaultDialogTransitionOut;
  564.     }
  565.     /**
  566.      * Tint color is set when a form is partially covered be it by a menu or by a 
  567.      * dialog. A look and feel can override this default value.
  568.      * 
  569.      * @return default tint color
  570.      */
  571.     public int getDefaultFormTintColor() {
  572.         return defaultFormTintColor;
  573.     }
  574.     /**
  575.      * Tint color is set when a form is partially covered be it by a menu or by a 
  576.      * dialog. A look and feel can override this default value.
  577.      * 
  578.      * @param defaultFormTintColor the default tint color
  579.      */
  580.     public void setDefaultFormTintColor(int defaultFormTintColor) {
  581.         this.defaultFormTintColor = defaultFormTintColor;
  582.     }
  583.     /**
  584.      * This color is used to paint disable mode text color.
  585.     
  586.      * @return the color value
  587.      */
  588.     public int getDisableColor() {
  589.         return disableColor;
  590.     }
  591.     /**
  592.      * Simple setter to disable color
  593.      * 
  594.      * @param disableColor the disable color value
  595.      */
  596.     public void setDisableColor(int disableColor) {
  597.         this.disableColor = disableColor;
  598.     }
  599.     /**
  600.      * Indicates whether lists and containers should have smooth scrolling by default
  601.      * 
  602.      * @return true if smooth scrolling should be on by default
  603.      */
  604.     public boolean isDefaultSmoothScrolling() {
  605.         return defaultSmoothScrolling;
  606.     }
  607.     /**
  608.      * Indicates whether lists and containers should have smooth scrolling by default
  609.      * 
  610.      * @param defaultSmoothScrolling  true if smooth scrolling should be on by default
  611.      */
  612.     public void setDefaultSmoothScrolling(boolean defaultSmoothScrolling) {
  613.         this.defaultSmoothScrolling = defaultSmoothScrolling;
  614.     }
  615.     /**
  616.      * Indicates the default speed for smooth scrolling
  617.      * 
  618.      * @return speed for smooth scrollin
  619.      */
  620.     public int getDefaultSmoothScrollingSpeed() {
  621.         return defaultSmoothScrollingSpeed;
  622.     }
  623.     /**
  624.      * Indicates the default speed for smooth scrolling
  625.      * 
  626.      * @param defaultSmoothScrollingSpeed speed for smooth scrollin
  627.      */
  628.     public void setDefaultSmoothScrollingSpeed(int defaultSmoothScrollingSpeed) {
  629.         this.defaultSmoothScrollingSpeed = defaultSmoothScrollingSpeed;
  630.     }
  631.     /**
  632.      * Indicates whether softbuttons should be reversed from their default orientation
  633.      * 
  634.      * @return true if softbuttons should be reversed
  635.      */
  636.     public boolean isReverseSoftButtons() {
  637.         return reverseSoftButtons;
  638.     }
  639.     /**
  640.      * Indicates whether softbuttons should be reversed from their default orientation
  641.      * 
  642.      * @param reverseSoftButtons  true if softbuttons should be reversed
  643.      */
  644.     public void setReverseSoftButtons(boolean reverseSoftButtons) {
  645.         this.reverseSoftButtons = reverseSoftButtons;
  646.     }
  647.     /**
  648.      * Returns the Menu default renderer
  649.      * 
  650.      * @return default renderer for the menu
  651.      */
  652.     public ListCellRenderer getMenuRenderer() {
  653.         return menuRenderer;
  654.     }
  655.     /**
  656.      * Sets the Menu default renderer
  657.      * 
  658.      * @param menuRenderer default renderer for the menu
  659.      */
  660.     public void setMenuRenderer(ListCellRenderer menuRenderer) {
  661.         this.menuRenderer = menuRenderer;
  662.     }
  663.     /**
  664.      * Sets globally the Menu icons
  665.      * 
  666.      * @param select select icon
  667.      * @param cancel cancel icon
  668.      * @param menu menu icon
  669.      */
  670.     public void setMenuIcons(Image select, Image cancel, Image menu) {
  671.         menuIcons[0] = select;
  672.         menuIcons[1] = cancel;
  673.         menuIcons[2] = menu;
  674.     }
  675.     /**
  676.      * Simple getter for the menu icons
  677.      * 
  678.      * @return an Image array at size of 3, where the first is the select image
  679.      * the second is the cancel image and the last is the menu image.
  680.      */
  681.     public Image[] getMenuIcons() {
  682.         return menuIcons;
  683.     }
  684.     /**
  685.      * Gets the ticker speed
  686.      *
  687.      * @return ticker speed in milliseconds
  688.      */
  689.     public long getTickerSpeed() {
  690.         return tickerSpeed;
  691.     }
  692.     /**
  693.      * Sets the ticker speed
  694.      *
  695.      * @param tickerSpeed the speed in milliseconds
  696.      */
  697.     public void setTickerSpeed(long tickerSpeed) {
  698.         this.tickerSpeed = tickerSpeed;
  699.     }
  700.     private void initScroll() {
  701.         verticalScroll = new Label();
  702.         verticalScroll.setUIID("Scroll");
  703.         horizontalScroll = new Label();
  704.         horizontalScroll.setUIID("HorizontalScroll");
  705.         verticalScrollThumb = new Label();;
  706.         verticalScrollThumb.setUIID("ScrollThumb");
  707.         horizontalScrollThumb = new Label();
  708.         horizontalScrollThumb.setUIID("HorizontalScrollThumb");
  709.     }
  710.     /**
  711.      * This method is a callback to the LookAndFeel when a theme is being 
  712.      * changed in the UIManager
  713.      */
  714.     public void refreshTheme() {
  715.         initScroll();
  716.         if(menuRenderer != null) {
  717.             if(menuRenderer instanceof Component) {
  718.                 ((Component)menuRenderer).refreshTheme();
  719.             }
  720.         }
  721.     }
  722.     /**
  723.      * Indicates whether the menu UI should target a touch based device or a
  724.      * standard cell phone
  725.      *
  726.      * @return true for touch menus
  727.      */
  728.     public boolean isTouchMenus() {
  729.         return touchMenus;
  730.     }
  731.     /**
  732.      * Indicates whether the menu UI should target a touch based device or a
  733.      * standard cell phone
  734.      *
  735.      * @param touchMenus true to enable touch menus false to disable
  736.      */
  737.     public void setTouchMenus(boolean touchMenus) {
  738.         this.touchMenus = touchMenus;
  739.     }
  740. /**
  741.  * Sets this LookAndFeel to operate in right-to-left mode.
  742.  *
  743.  * @param rtl - true if right-to-left, false if left-to-right
  744.  */
  745. public void setRTL(boolean rtl) {
  746. this.rtl = rtl;
  747.         if(rtl) {
  748.             Display.getInstance().setBidiAlgorithm(true);
  749.         }
  750. }
  751. /**
  752.  * Use this to check if the LookAndFeel is in RTL mode
  753.  *
  754.  * @return true if the LookAndFeel is in right-to-left mode, false otherwise
  755.  */
  756. public boolean isRTL() {
  757. return rtl;
  758. }
  759.     /**
  760.      * Allows defining a tactile touch device that vibrates when the user presses a component
  761.      * that should respond with tactile feedback on a touch device (e.g. vibrate).
  762.      * Setting this to 0 disables tactile feedback completely
  763.      * @return the tactileTouchDuration
  764.      */
  765.     public int getTactileTouchDuration() {
  766.         return tactileTouchDuration;
  767.     }
  768.     /**
  769.      * Allows defining a tactile touch device that vibrates when the user presses a component
  770.      * that should respond with tactile feedback on a touch device (e.g. vibrate).
  771.      * Setting this to 0 disables tactile feedback completely
  772.      *
  773.      * @param tactileTouchDuration the duration of vibration
  774.      */
  775.     public void setTactileTouchDuration(int tactileTouchDuration) {
  776.         this.tactileTouchDuration = tactileTouchDuration;
  777.     }
  778. }