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

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;
  26. import com.sun.lwuit.animations.CommonTransitions;
  27. import com.sun.lwuit.geom.Dimension;
  28. import com.sun.lwuit.geom.Rectangle;
  29. import com.sun.lwuit.plaf.Style;
  30. import com.sun.lwuit.layouts.BorderLayout;
  31. import com.sun.lwuit.list.DefaultListCellRenderer;
  32. import com.sun.lwuit.list.DefaultListModel;
  33. import com.sun.lwuit.list.ListCellRenderer;
  34. import com.sun.lwuit.list.ListModel;
  35. import com.sun.lwuit.plaf.UIManager;
  36. import java.util.Vector;
  37. /**
  38.  * A combo box is a list that allows only one selection at a time, when a user clicks
  39.  * the combo box a popup button with the full list of elements allows the selection of
  40.  * a single element. The combo box is driven by the list model and allows all the renderer
  41.  * features of the List as well. 
  42.  * 
  43.  * @see List
  44.  * @author Chen Fishbein
  45.  */
  46. public class ComboBox extends List {
  47.     /** 
  48.      * Creates a new instance of ComboBox 
  49.      * 
  50.      * @param items set of items placed into the combo box model
  51.      */
  52.     public ComboBox(Vector items) {
  53.         this(new DefaultListModel(items));
  54.     }
  55.     /** 
  56.      * Creates a new instance of ComboBox 
  57.      * 
  58.      * @param items set of items placed into the combo box model
  59.      */
  60.     public ComboBox(Object[] items) {
  61.         this(new DefaultListModel(items));
  62.     }
  63.     /** 
  64.      * Constructs an empty combo box
  65.      */
  66.     public ComboBox() {
  67.         this(new DefaultListModel());
  68.     }
  69.     /**
  70.      * Creates a new instance of ComboBox 
  71.      * 
  72.      * @param model the model for the combo box elements and selection
  73.      */
  74.     public ComboBox(ListModel model) {
  75.         super(model);
  76.         setUIID("ComboBox");
  77.         ((DefaultListCellRenderer) super.getRenderer()).setShowNumbers(false);
  78.         setInputOnFocus(false);
  79.         setIsScrollVisible(false);
  80.         setFixedSelection(FIXED_NONE_CYCLIC);
  81.         ListCellRenderer r = getRenderer();
  82.         if(r instanceof Component) {
  83.             Component c = (Component) getRenderer();
  84.             c.setUIID("ComboBoxItem");
  85.         }
  86.         Component c = getRenderer().getListFocusComponent(this);
  87.         if(c != null){
  88.             c.setUIID("ComboBoxFocus");
  89.         }
  90.     }
  91.     /**
  92.      * @inheritDoc
  93.      */
  94.     public int getBaseline(int width, int height) {
  95.         Component selected;
  96.         if (getRenderingPrototype() != null) {
  97.             selected = getRenderer().getListCellRendererComponent(this, getRenderingPrototype(), 0, true);
  98.         }
  99.         if (getModel().getSize() > 0) {
  100.             selected = getRenderer().getListCellRendererComponent(this, getModel().getItemAt(0), 0, true);
  101.         } else {
  102.             selected = getRenderer().getListCellRendererComponent(this, "XXXXXXXXXXX", 0, true);
  103.         }
  104.         return getHeight() - getStyle().getPadding(false, BOTTOM) - selected.getStyle().getPadding(false, BOTTOM);
  105.     }
  106.     /**
  107.      * @inheritDoc
  108.      */
  109.     protected void laidOut() {
  110.     }
  111.     /**
  112.      * @inheritDoc
  113.      */
  114.     protected Rectangle getVisibleBounds() {
  115.         return getBounds();
  116.     }
  117.     
  118.     /**
  119.      * @inheritDoc
  120.      */
  121.     public void setSelectedIndex(int selection) {
  122.         super.setSelectedIndex(selection, false);
  123.     }
  124.     /**
  125.      * @inheritDoc
  126.      */
  127.     public void setSelectedIndex(int selection, boolean scroll) {
  128.         super.setSelectedIndex(selection, false);
  129.     }
  130.     /**
  131.      * @inheritDoc
  132.      */
  133.     public void pointerHover(int[] x, int[] y) {
  134.     }
  135.     /**
  136.      * @inheritDoc
  137.      */
  138.     public void pointerHoverReleased(int[] x, int[] y) {
  139.     }
  140.     /**
  141.      * @inheritDoc
  142.      */
  143.     protected void fireClicked() {
  144.         Dialog popupDialog = new Dialog("ComboBoxPopup", "");
  145.         popupDialog.setDisposeWhenPointerOutOfBounds(true);
  146.         popupDialog.setTransitionInAnimator(CommonTransitions.createEmpty());
  147.         popupDialog.setTransitionOutAnimator(CommonTransitions.createEmpty());
  148.         popupDialog.setLayout(new BorderLayout());
  149.         List l = createPopupList();
  150.         l.dispatcher = dispatcher;
  151.         l.eventSource = this;
  152.         popupDialog.addComponent(BorderLayout.CENTER, l);
  153.         Form parentForm = getComponentForm();
  154.         l.getSelectedStyle().setBorder(null);
  155.         Style popupDialogStyle = popupDialog.getContentPane().getStyle();
  156.         int listW = Math.min(getWidth() + UIManager.getInstance().getLookAndFeel().getVerticalScrollWidth(), parentForm.getContentPane().getWidth());
  157.         int listH = popupDialog.getContentPane().getPreferredH() 
  158.                  + popupDialogStyle.getPadding(false, TOP) + popupDialogStyle.getPadding(false, BOTTOM);
  159.         int bottom = 0;
  160.         int top = getAbsoluteY();
  161.         int formHeight = parentForm.getHeight();
  162.         if(parentForm.getSoftButtonCount() > 1) {
  163.             Component c = parentForm.getSoftButton(0).getParent();
  164.             formHeight -= c.getHeight();
  165.             Style s = c.getStyle();
  166.             formHeight -= (s.getMargin(TOP) + s.getMargin(BOTTOM));
  167.         }
  168.         if(listH < formHeight) {
  169.             // pop up or down?
  170.             if(top > formHeight / 2) {
  171.                 bottom = formHeight - top;
  172.                 top = top - listH;
  173.             } else {
  174.                 top +=  getHeight();
  175.                 bottom = formHeight - top - listH;
  176.             }
  177.         } else {
  178.             top = 0;
  179.         }
  180.         int left = getAbsoluteX();
  181.         int right = parentForm.getWidth() - left - listW;
  182.         if(right < 0) {
  183.             left += right;
  184.             right = 0;
  185.         }
  186.         l.disposeDialogOnSelection = true;
  187.         popupDialog.setBackCommand(popupDialog.cancelMenuItem);
  188.         popupDialog.setScrollable(false);
  189.         if (Display.getInstance().isThirdSoftButton()) {
  190.             popupDialog.addCommand(popupDialog.selectMenuItem);
  191.             popupDialog.addCommand(popupDialog.cancelMenuItem);
  192.         } else {
  193.             popupDialog.addCommand(popupDialog.cancelMenuItem);
  194.             popupDialog.addCommand(popupDialog.selectMenuItem);
  195.         }
  196.         int originalSel = getSelectedIndex();
  197.         int tint = parentForm.getTintColor();
  198.         parentForm.setTintColor(0);
  199.         Form.comboLock = true;
  200.         Command result = popupDialog.show(Math.max(top, 0), 
  201.                 Math.max(bottom, 0), 
  202.                 Math.max(left, 0), 
  203.                 Math.max(right, 0), false, true);
  204.         Form.comboLock = false;
  205.         parentForm.setTintColor(tint);
  206.         if(result == popupDialog.cancelMenuItem) {
  207.             setSelectedIndex(originalSel);
  208.         }
  209.     }
  210.     /**
  211.      * Creates the list object used within the popup dialog. This method allows subclasses
  212.      * to customize the list creation for the popup dialog shown when the combo box is pressed.
  213.      * 
  214.      * @return a newly created list object used when the user presses the combo box.
  215.      */
  216.     protected List createPopupList() {
  217.         List l = new List(getModel());
  218.         l.setSmoothScrolling(isSmoothScrolling());
  219.         l.setFixedSelection(getFixedSelection());
  220.         l.setListCellRenderer(getRenderer());
  221.         l.setItemGap(getItemGap());
  222.         l.setUIID("ComboBoxList");
  223.         return l;
  224.     }
  225.     /**
  226.      * @inheritDoc
  227.      */
  228.     public void keyReleased(int keyCode) {
  229.         // other events are in keyReleased to prevent the next event from reaching the next form
  230.         int gameAction = Display.getInstance().getGameAction(keyCode);
  231.         if (gameAction == Display.GAME_FIRE) {
  232.             fireClicked();
  233.             return;
  234.         }
  235.         super.keyPressed(keyCode);
  236.     }
  237.     /**
  238.      * Prevent the combo box from losing selection in some use cases
  239.      */
  240.     void selectElement(int selectedIndex) {
  241.     }
  242.     /**
  243.      * @inheritDoc
  244.      */
  245.     public void pointerReleased(int x, int y) {
  246.         if(isEnabled()) {
  247.             fireClicked();
  248.         }
  249.     }
  250.     /**
  251.      * @inheritDoc
  252.      */
  253.     public void paint(Graphics g) {
  254.         UIManager.getInstance().getLookAndFeel().drawComboBox(g, this);
  255.     }
  256.     /**
  257.      * @inheritDoc
  258.      */
  259.     protected Dimension calcPreferredSize() {
  260.         return UIManager.getInstance().getLookAndFeel().getComboBoxPreferredSize(this);
  261.     }
  262.     /**
  263.      * @inheritDoc
  264.      */
  265.     public int getOrientation() {
  266.         return COMBO;
  267.     }
  268. }