ScrollableContainer.java
上传用户:luxiaowei
上传日期:2022-06-06
资源大小:58k
文件大小:19k
源码类别:

J2ME

开发平台:

Java

  1. /*
  2.  * To change this template, choose Tools | Templates
  3.  * and open the template in the editor.
  4.  */
  5. package com.framework;
  6. import java.util.Vector;
  7. import javax.microedition.lcdui.Graphics;
  8. /**
  9.  *
  10.  * @author swaroop_kumar
  11.  */
  12. public class ScrollableContainer extends UIControl implements ScrollBarInterface{
  13.     int totalHeight , barWidth;
  14.     int scrollBarBackgroundColor = ColorTheme.SCROLLBAR_BGCOLOR, scrollBarColor = ColorTheme.SCROLLBAR_COLOR;
  15.     int scrollSliderHeight;
  16.     protected int scrolledY = 0;
  17.     boolean paintUserDataFirst = true;
  18.     int start;
  19.     Layout layout;
  20.     public void setScrollType(int scrollType) {
  21.         this.scrollType = scrollType;
  22.     }
  23.     Vector childrens = new Vector();
  24.     static boolean selectChild = true;
  25.     int selectedChild = 0;
  26.     public static final int SMOOTH_SCROLL = 0;
  27.     public static final int SELECT_COMPONENT_SCROLL = 1;
  28.     int scrollType = SELECT_COMPONENT_SCROLL;
  29.     public static final int SCROLL_BAR_WIDTH = 3;
  30.     public void setEventManager(EventManager manager)
  31.     {
  32.         super.setEventManager(manager);
  33.         for (int idx = 0; idx < childrens.size(); idx++) {
  34.            UIControl control = (UIControl)childrens.elementAt(idx);
  35.            control.setEventManager(manager);
  36.         }
  37.     }
  38.     public void addChildren(UIControl control)
  39.     {
  40.         control.setParent(this);
  41.         childrens.addElement(control);
  42.         control.setEventManager(getEventListener());
  43.     }
  44.     public void setPosition(int x, int y)
  45.     {
  46.         this.x = x;
  47.         this.y = y;
  48.     }
  49.     public void setWidth(int width)
  50.     {
  51.         this.width = width;
  52.     }
  53.     public int getTotalHeight() {
  54.         return totalHeight;
  55.     }
  56.     public void setHeight(int height)
  57.     {
  58.         this.height = height;
  59.     }
  60.     public void setTotalHeight(int totalHeight)
  61.     {
  62.         this.totalHeight = totalHeight;
  63.        
  64.     }
  65.     public int getWidth()
  66.     {
  67.         return this.width - barWidth;
  68.     }
  69.     public int getChildrenIndex(UIControl control){
  70.         return childrens.indexOf(control);
  71.     }
  72.     public UIControl getChild(int index){
  73.         if(childrens.size()>index)
  74.             return (UIControl)childrens.elementAt(index);
  75.         else
  76.             return null;
  77.         
  78.     }
  79.     public int getSize()
  80.     {
  81.         return childrens.size();
  82.     }
  83.     public void addChildrenAt(UIControl control,int index){
  84.         control.setParent(this);
  85.         childrens.insertElementAt(control, index);
  86.     }
  87.     public void removeAll()
  88.     {
  89.         selectedChild = 0;
  90.         childrens.removeAllElements();
  91.         totalHeight = 0;
  92.         scrolledY = 0;
  93.     }
  94.     public void removeChildren(UIControl children) {
  95.         for (int i = 0; i < childrens.size(); i++) {
  96.             UIControl control = (UIControl) childrens.elementAt(i);
  97.             if (control.equals(children)) {
  98.                 childrens.removeElementAt(i);
  99.             }
  100.         }
  101.     }
  102.     public int getSelectedChildIndex()
  103.     {
  104.         return selectedChild;
  105.     }
  106.     public UIControl getSelectedChild()
  107.     {
  108.         if(selectedChild >= 0 && selectedChild < childrens.size())
  109.         {
  110.             UIControl control =  (UIControl)childrens.elementAt(selectedChild);
  111.             return control;
  112.         }
  113.             
  114.         else
  115.             return null;
  116.     }
  117.     protected boolean pointerDragged(int x, int y) {
  118.         for (int idx = 0; idx < childrens.size(); idx++) {
  119.            UIControl control = (UIControl)childrens.elementAt(idx);
  120.            if(control.isSelectable() && control.isVisible() && Util.isInRect(control, x, y - getY() + scrolledY))
  121.            {
  122.                if(control.pointerDragged(x, y - getY()))
  123.                     return true;
  124.            }
  125.         }
  126.        if(totalHeight > height)
  127.        {
  128.             if(moveScrollBar(-DisplayManager.getInst().getDiffrenceY()))
  129.                return true;
  130.        }
  131.         return false;
  132.     }
  133.     
  134.     protected boolean pointerReleased(int x, int y) {
  135.         for (int idx = 0; idx < childrens.size(); idx++) {
  136.            UIControl control = (UIControl)childrens.elementAt(idx);
  137.            if(control.isSelectable() && control.isVisible() && Util.isInRect(control, x, y - getY() + scrolledY ))
  138.            {
  139.                selectChild(idx);
  140.                return control.pointerReleased(x, y - getY());
  141.            }
  142.         }
  143.         return super.pointerReleased(x, y);
  144.     }
  145.     
  146.     public void paint(Graphics g)
  147.     {
  148.        int scrollBar_y  =0;
  149.        if(totalHeight > height)
  150.        {
  151.            barWidth = SCROLL_BAR_WIDTH;
  152.            int temp = ((((height - (barWidth ) - 2) * 100) << 14) / totalHeight);
  153.            scrollSliderHeight = ((temp * (height - (barWidth) -  2)) / 100) >> 14;
  154.            int percentage = ((((scrolledY + height) << 6) *100) / totalHeight) >> 6;
  155.            
  156.            scrollBar_y = (((((height - (barWidth >> 1) - 1) * percentage) << 14) / 100) >> 14 ) - scrollSliderHeight;
  157.            if(scrolledY == 0)
  158.               scrollBar_y = (barWidth >> 1)+1 ;
  159.           
  160.        }
  161.        g.translate(0, -scrolledY);
  162.        int transY = g.getTranslateY();
  163.         for (int idx = 0; idx < childrens.size(); idx++) {
  164.            UIControl control = (UIControl)childrens.elementAt(idx);
  165.            if( (transY + control.getY() +control.getHeight() < 0 || transY + control.getY() > DisplayManager.getInst().getHeight()))
  166.            {
  167.                continue;
  168.            }
  169.            control.paintUI(g);
  170.         }
  171.        
  172.         g.translate(0, scrolledY);
  173.        if(totalHeight > height)
  174.        {
  175.            g.setColor(scrollBarBackgroundColor);
  176.            g.fillRect(getWidth(), 0, barWidth, height);
  177.            g.setColor(scrollBarColor);
  178.            g.fillRect(getWidth(),scrollBar_y, barWidth, scrollSliderHeight);
  179.            Util.drawFilledTriangle(g, getWidth() , (barWidth >> 1) + 1, true, barWidth, false);
  180.            Util.drawFilledTriangle(g, getWidth() , height - (barWidth >> 1) - 1, false, barWidth, false); 
  181.        }
  182.       
  183.     }
  184.     
  185.     public void setPaintUserDataFirst(boolean paintUserDataFirst) {
  186.         this.paintUserDataFirst = paintUserDataFirst;
  187.     }
  188. //    protected void paintForground(Graphics g) {
  189. //       if(borderColor != -1)
  190. //       {
  191. //           g.setColor(borderColor);
  192. //           g.drawRect(0, 0, width - SCROLL_BAR_WIDTH - 1, height - 1);
  193. //       }
  194. //    }
  195.     public boolean keyRepeated(int key) {
  196.        if(selectedChild >= 0 && selectedChild < childrens.size())
  197.          {
  198.              UIControl control = (UIControl)childrens.elementAt(selectedChild);
  199.              if(control.keyRepeated(key))
  200.                 return true;
  201.             
  202.          }
  203.          return super.keyRepeated(key);
  204.          
  205.     }
  206.     private boolean moveScrollBar(int steps)
  207.     {
  208.          int oldPos = scrolledY;
  209.         if(steps > 0)
  210.         {
  211.             if(scrolledY + height < totalHeight)
  212.             {
  213.                 scrolledY+= steps;
  214.             }
  215.             else
  216.                 scrolledY = totalHeight - height;
  217.         }else if(steps < 0)
  218.         {
  219.              if(scrolledY > 0)
  220.                 scrolledY -= Math.abs(steps);
  221.              if(scrolledY < 0)
  222.                 scrolledY = 0;
  223.         }
  224.          if(scrolledY != oldPos)
  225.              return true;
  226.          else
  227.              return false;
  228.     }
  229.   
  230.     public boolean keyPressed(int keycode)
  231.     {
  232.        
  233.         if(scrollType == SMOOTH_SCROLL && totalHeight > height)
  234.         {
  235.             int gameKey = DisplayManager.getInst().getGameAction(keycode);
  236.             if(gameKey == DisplayManager.DOWN)
  237.             {
  238.                
  239.                if(moveScrollBar(15))
  240.                    return true;
  241.                 
  242.             }else  if(gameKey == DisplayManager.UP)
  243.             {
  244.                 if(moveScrollBar(-15))
  245.                     return true;
  246.             }
  247.            
  248.          }
  249.          if(selectedChild >= 0 && selectedChild < childrens.size())
  250.          {
  251.              UIControl control = (UIControl)childrens.elementAt(selectedChild);
  252.              if(control.keyPressed(keycode))
  253.                 return true;
  254.             
  255.          }
  256.         int gameKey = DisplayManager.getInst().getGameAction(keycode);
  257.          int newIndex = getNextChildIndex(keycode,selectedChild);
  258.          if(newIndex != -1 && newIndex != selectedChild)
  259.          {
  260.              selectChild(newIndex);
  261.              return true;
  262.          }else if(totalHeight > height){
  263.              if(gameKey == DisplayManager.UP)
  264.              {
  265.                  scrolledY = 0;
  266.              }else if(gameKey == DisplayManager.DOWN)
  267.              {
  268.                  scrolledY = totalHeight - height;
  269.              }
  270.          }
  271.          return false;
  272.     }
  273.     int getNextChildIndex(int keycode, int index)
  274.     {
  275.         int oldIndex = -1;
  276.         if(index >= 0 && index < childrens.size())
  277.         {
  278.              UIControl currentChild = (UIControl)childrens.elementAt(index);
  279.             int gameKey = DisplayManager.getInst().getGameAction(keycode);
  280.             int currentPosX = currentChild.getX();
  281.             int currentPosY = currentChild.getY();
  282.             switch(gameKey)
  283.             {
  284.                 case DisplayManager.UP:
  285.                     currentPosX += (currentChild.getWidth() >> 1);
  286.                 break;
  287.                 case DisplayManager.DOWN:
  288.                     currentPosY += currentChild.getHeight();
  289.                     currentPosX += (currentChild.getWidth() >> 1);
  290.                 break;
  291.                 case DisplayManager.LEFT:
  292.                     currentPosY += (currentChild.getHeight() >> 1);
  293.                 break;
  294.                 case DisplayManager.RIGHT:
  295.                     currentPosY += (currentChild.getHeight() >> 1);
  296.                     currentPosX += (currentChild.getWidth());
  297.                 break;
  298.             }
  299.             int oldDist = Integer.MAX_VALUE, dist;
  300.             for (int i = 0; i < childrens.size(); i++) {
  301.                 UIControl control = (UIControl)childrens.elementAt(i);
  302.                 
  303.                 if(control.isVisible() && control.isSelectable())
  304.                 {
  305.                     int controlX = control.getX() + (control.getWidth() >> 1);
  306.                     int controlY = control.getY() + (control.getHeight() >> 1);
  307.                     if( (gameKey == DisplayManager.UP && controlY < currentPosY ) || (gameKey == DisplayManager.DOWN && controlY > currentPosY) || (gameKey == DisplayManager.LEFT && controlX < currentPosX) || (gameKey == DisplayManager.RIGHT && controlX > currentPosX))
  308.                     {
  309.                         dist = Util.getApproxDistance(controlX,controlY , currentPosX , currentPosY);
  310.                         if(dist < oldDist)
  311.                         {
  312.                             oldDist = dist;
  313.                             oldIndex = i;
  314.                         }
  315.                     }     
  316.                     
  317.                 }
  318.             }
  319.          
  320.         }
  321.        return oldIndex;
  322.     }
  323. //    int getNextChildIndex(int keycode, int index)
  324. //    {
  325. //       int tmpIndex = index;
  326. //       int gameKey = DisplayManager.getInst().getGameAction(keycode);
  327. //       if(gameKey == DisplayManager.UP || gameKey == DisplayManager.LEFT)
  328. //       {
  329. //           tmpIndex--;
  330. //       }else if(gameKey == DisplayManager.DOWN || gameKey == DisplayManager.RIGHT)
  331. //       {
  332. //           tmpIndex++;
  333. //       }
  334. //       else
  335. //           return -1;
  336. //         if(tmpIndex >= 0 && tmpIndex < childrens.size())
  337. //         {
  338. //             UIControl control = (UIControl)childrens.elementAt(tmpIndex);
  339. //             if(control.isSelectable())
  340. //                return tmpIndex;
  341. //             else
  342. //                 return getNextChildIndex(keycode , tmpIndex);
  343. //         }
  344. //         else
  345. //             return -1;
  346. //           
  347. //    }
  348.     public void setSelected(boolean selected) {
  349.         super.setSelected(selected);
  350.         if(selected == true)
  351.         {
  352.             if(selectedChild >= 0 && selectedChild < childrens.size())
  353.             {
  354.                 UIControl control = (UIControl)childrens.elementAt(selectedChild);
  355.                 
  356.                 if(!control.isSelectable())
  357.                 {
  358.                     selectedChild = -1;
  359.                     selectedChild = getNextChildIndex(DisplayManager.DOWN,selectedChild);
  360.                     for (int i = 0; i < childrens.size(); i++) {
  361.                         UIControl object = (UIControl)childrens.elementAt(i);
  362.                         if(object.isSelectable())
  363.                         {
  364.                             selectedChild = i;
  365.                             break;
  366.                         }
  367.                             
  368.                    }
  369.                   
  370.                     
  371.                 }
  372.                 selectChild(selectedChild);
  373.             }
  374.            
  375.         }
  376.         else
  377.         {
  378.             if(selectedChild >= 0 && selectedChild < childrens.size())
  379.             {
  380.                 UIControl control = (UIControl)childrens.elementAt(selectedChild);
  381.                 control.setSelected(false);
  382.             }
  383.         }
  384.         
  385.     }
  386.     
  387.     protected void selectChild(int index)
  388.     {
  389.         if(selectedChild >= 0 && selectedChild < childrens.size())
  390.         {
  391.             UIControl control = (UIControl)childrens.elementAt(selectedChild);
  392.             control.setSelected(false);
  393.         }
  394.         if(index >= 0 && index < childrens.size())
  395.         {
  396.             
  397.             UIControl control = (UIControl)childrens.elementAt(index);
  398.             control.setSelected(true);
  399.             if(selectedChild != index && getEventListener() != null)
  400.             {
  401.                 getEventListener().event(EventManager.SELECTION_CHANGED, this,new Integer(index));
  402.             }
  403.             selectedChild = index;
  404.            
  405.             if(scrollType == SELECT_COMPONENT_SCROLL && totalHeight > height && ((UIControl) childrens.elementAt(selectedChild)) instanceof ScrollBarInterface)
  406.             {
  407.                 UIControl container = ((UIControl) childrens.elementAt(selectedChild));
  408.                 int bckUp = scrolledY;
  409.                 if (selectedChild == upperMostElement) {
  410.                     scrolledY = getScrolledY(container, 0);
  411.                 } else {
  412.                     scrolledY = getScrolledY(container, scrolledY);
  413.                 }
  414.                
  415. //                if(container.getY() + container.getHeight() > scrolledY + height)
  416. //                {
  417. //                     setScrollBarPosition(((UIControl) childrens.elementAt(this.selectedChild)).y,
  418. //                                ((UIControl) childrens.elementAt(selectedChild)).height);
  419. //                }
  420.                         
  421.             } else {
  422.                         setScrollBarPosition(((UIControl) childrens.elementAt(this.selectedChild)).y,
  423.                                 ((UIControl) childrens.elementAt(selectedChild)).height);
  424.                     }
  425.         }
  426.         
  427.     }
  428.    
  429.  private int getScrolledY(UIControl base, int virtualScrollHeight) {
  430.         int tmpHeight = 0;
  431.         if (base instanceof ScrollBarInterface) {
  432.             int _yPos = ((ScrollBarInterface) base).getDrawingYPos();
  433.             UIControl component = null;
  434.             component = ((ScrollBarInterface) base).getSelectedChild();
  435.             while (component instanceof ScrollBarInterface) {
  436.                 _yPos += component.getHeight();
  437.                 UIControl tmp = ((ScrollBarInterface) component).getSelectedChild();
  438.                 if (tmp == null) {
  439.                     break;
  440.                 }
  441.                 component = tmp;
  442.             }
  443.             if (component != null) {
  444.                 if (_yPos + component.getY() + component.getHeight() >= getHeight() + virtualScrollHeight) {
  445.                     tmpHeight = _yPos + component.getY() + component.getHeight() - height ;
  446.                 } else if (_yPos + component.getY() < virtualScrollHeight) {
  447.                     tmpHeight = _yPos + component.getY();
  448.                 }
  449.             }
  450.         } else {
  451.             if (base.getY() + base.getHeight() >= getHeight() + virtualScrollHeight) {
  452.                 tmpHeight = base.getY() + base.getHeight() - height ;
  453.             } else if (base.getY() < virtualScrollHeight) {
  454.                 tmpHeight = base.getY() ;
  455.             }
  456.         }
  457.         if (tmpHeight == 0) {
  458.             return virtualScrollHeight;
  459.         } else {
  460.             return tmpHeight;
  461.         }
  462.     }
  463.     public void setLayout(Layout layout) {
  464.         this.layout = layout;
  465.     }
  466.     public void resize()
  467.     {
  468.         if(layout != null)
  469.         {
  470.             layout.applyLayout(this);
  471.         }
  472.         if(height == 0)
  473.         {
  474.            int tmp = 0;
  475.             for (int i = 0; i < childrens.size(); i++) {
  476.              UIControl control = (UIControl)childrens.elementAt(i);
  477.              if(control.getY() + control.getHeight() > tmp)
  478.              {
  479.                  tmp = control.getY() + control.getHeight();
  480.              }
  481.              
  482.             }
  483.            setHeight(tmp);
  484.         }
  485.         if(width == 0)
  486.         {
  487.             setWidth(DisplayManager.getInst().getWidth());
  488.         }
  489.     }
  490.     int upperMostElement = -1;
  491.     public void showNotify() {
  492.        
  493.        resize();
  494.         if(childrens.size()>0)
  495.         start = getChild(0).getY();
  496.         int actHeight = 0;
  497.         upperMostElement = -1;
  498.         for (int i = 0; i < childrens.size(); i++) {
  499.              UIControl control = (UIControl)childrens.elementAt(i);
  500.              if ((upperMostElement == -1 || ((UIControl) childrens.elementAt(i)).getY() < ((UIControl) childrens.elementAt(upperMostElement)).y) && ((UIControl) childrens.elementAt(i)).isSelectable()) {
  501.                     upperMostElement = i;
  502.              }
  503.              if(control.getY() + control.getHeight() > actHeight)
  504.              {
  505.                  actHeight = control.getY() + control.getHeight();
  506.              }
  507.             if(selectChild)
  508.             {
  509.                 selectChild = false;
  510.                 control.showNotify();
  511.                 selectChild(i);
  512.                 
  513.             }else
  514.             {
  515.                   control.showNotify();
  516.                   control.setSelected(false);
  517.             }
  518.         }
  519.         if(actHeight > height)
  520.         {
  521.             totalHeight = actHeight;
  522.             if(layout != null)
  523.                 layout.applyLayout(this);
  524.         }
  525.     }
  526.     protected boolean isScrollBarPresent()
  527.     {
  528.         return (totalHeight > height);
  529.     }
  530.     public void hideNotify() {
  531.         selectChild = true;
  532.         super.hideNotify();
  533.         for (int i = 0; i < childrens.size(); i++) {
  534.               UIControl control = (UIControl)childrens.elementAt(i);
  535.             control.hideNotify();
  536.         }
  537.         
  538.     }
  539.     public void scrollTillLast()
  540.     {
  541.         if(totalHeight > height)
  542.          scrolledY = totalHeight - height;
  543.     }
  544.     public int getDrawingYPos() {
  545.        return getY();
  546.     }
  547.     public void setScrollBarPosition(int yPos, int controlHeight) {
  548.         if (totalHeight <= height) {
  549.             if (getParent() != null && getParent() instanceof ScrollBarInterface) {
  550.                 ((ScrollBarInterface) getParent()).setScrollBarPosition(((ScrollBarInterface) this).getDrawingYPos() + yPos - totalHeight, controlHeight);
  551.             }
  552.         } else {
  553.             
  554.             if (selectedChild == upperMostElement) {
  555.                 scrolledY = getScrolledY((UIControl) childrens.elementAt(selectedChild), 0);
  556.             } else if (yPos + controlHeight >= getHeight() + scrolledY) {
  557.                 scrolledY = yPos + controlHeight - height ;
  558.             } else if (yPos < scrolledY) {
  559.                 scrolledY = yPos;
  560.             }
  561.             if (getParent() != null && getParent() instanceof ScrollBarInterface) {
  562.                 ((ScrollBarInterface) getParent()).setScrollBarPosition(((ScrollBarInterface) this).getDrawingYPos() + yPos - scrolledY, controlHeight);
  563.             }
  564.             
  565.         }
  566.     }
  567.     
  568.   
  569.     
  570.             
  571. }