javauis/lcdui_qt/src/javax/microedition/lcdui/Row.java
changeset 21 2a9601315dfc
child 23 98ccebc37403
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/lcdui_qt/src/javax/microedition/lcdui/Row.java	Mon May 03 12:27:20 2010 +0300
@@ -0,0 +1,349 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+package javax.microedition.lcdui;
+
+import java.util.Vector;
+
+/**
+ * Class which represents one row in the Form.
+ */
+class Row {
+
+    private Vector layoutObjects = new Vector();
+
+    private int xShift;
+    private int yShift;
+    private int rowHeight;
+    private int rowWidth;
+    private int occupiedSpace;
+
+    private int rowHLayout;
+
+    /**
+     * Constructor.
+     *
+     * @param rowWidth - total row width.
+     * @param hLayout horizontal layout
+     */
+    Row(int rowWidth, int hLayout) {
+        this.rowWidth = rowWidth;
+        setRowHLayout(hLayout);
+    }
+
+    /**
+     * Add new LayoutObject to the Row.
+     *
+     * @param layoutObj structure which represents Item or part Of Item.
+     */
+    void addLayoutObject(final LayoutObject layoutObj) {
+        ESWTUIThreadRunner.syncExec(new Runnable() {
+            public void run() {
+                eswtAddLayoutObject(layoutObj);
+            }
+        });
+    }
+
+    /**
+     * eSWT specific calls to implement addLayoutObject.
+     *
+     * @param lo structure which represents Item or part Of Item.
+     */
+    void eswtAddLayoutObject(LayoutObject lo) {
+        layoutObjects.addElement(lo);
+        // update actual occupiedSpace
+        occupiedSpace += lo.getWidth();
+        // update rowHeight
+        rowHeight = Math.max(rowHeight, lo.getHeight());
+    }
+
+    /**
+     * Get the number of items with the given layout.
+     */
+    int getNumLayoutObjects(int layoutMask) {
+        int ret = 0;
+        int num = layoutObjects.size();
+        LayoutObject lo = null;
+        for (int i = 0; i < num; i++) {
+            lo = (LayoutObject) layoutObjects.elementAt(i);
+            if (lo.getOwningItem().hasLayout(layoutMask)) {
+                ret++;
+            }
+        }
+        return ret;
+    }
+
+    /**
+     * Get available space in the Row for layout calculation.
+     *
+     * @return space available for Items on that Row in pixels.
+     */
+    int getFreeSpace() {
+        return getFreeSpace(Item.LAYOUT_SHRINK | Item.LAYOUT_EXPAND);
+    }
+
+    /**
+     * Get free space based on LAYOUT mask. Item matching the layout mask will
+     * be counted with their layouting size (not actual size). Used for LAYOUT_2
+     * row resizing.
+     *
+     * @param layoutMask layout mask
+     */
+    int getFreeSpace(int layoutMask) {
+        int ret = 0;
+        int num = layoutObjects.size();
+        LayoutObject lo = null;
+        for (int i = 0; i < num; i++) {
+            lo = (LayoutObject) layoutObjects.elementAt(i);
+            ret += getObjectWidth(lo, layoutMask);
+        }
+        return rowWidth - ret;
+    }
+
+    /**
+     * Get row height based on LAYOUT mask. Item matching the layout mask will
+     * be counted with their layouting size (not actual size). Used for LAYOUT_2
+     * row resizing.
+     *
+     * @param layoutMask layout mask
+     */
+    int getRowHeight(int layoutMask) {
+        int ret = 0;
+        int num = layoutObjects.size();
+        LayoutObject lo = null;
+        for (int i = 0; i < num; i++) {
+            lo = (LayoutObject) layoutObjects.elementAt(i);
+            ret = Math.max(ret, getObjectHeight(lo, layoutMask));
+        }
+        return ret;
+    }
+
+    private int getObjectWidth(LayoutObject lo, int layoutMask) {
+        if (lo.getOwningItem().hasLayout(layoutMask)) {
+            // this returns the min/pref width
+            return lo.getOwningItem().getLayoutWidth();
+        }
+        else {
+            return lo.getWidth();
+        }
+    }
+
+    private int getObjectHeight(LayoutObject lo, int layoutMask) {
+        if (lo.getOwningItem().hasLayout(layoutMask)) {
+            // this returns the min/pref width
+            return lo.getOwningItem().getLayoutHeight();
+        }
+        else {
+            return lo.getHeight();
+        }
+    }
+
+    /**
+     * Clean row, free resources.
+     *
+     * @param keepItem Last Item to leave in a row.
+     */
+    boolean cleanRow(Item keepItem) {
+        LayoutObject lo = null;
+        for (int i = (layoutObjects.size() - 1); i >= 0; i--) {
+            lo = (LayoutObject) layoutObjects.elementAt(i);
+            if (keepItem != null && keepItem == lo.getOwningItem()) {
+                updateRowInternals();
+                return true;
+            }
+            else {
+                layoutObjects.removeElement(lo);
+                lo.dispose();
+            }
+        }
+        updateRowInternals();
+        return false;
+    }
+
+    /**
+     * Update item positions in a row.<br>
+     * This method called by Layouters or FormLayoutPolicy when row is full and
+     * ready for layout.
+     */
+    void updateRowLayout(boolean isLeftToRight) {
+        // update xShift
+        xShift = ItemLayouter.getXLocation(rowWidth, occupiedSpace, rowHLayout);
+        int xDelta = 0;
+        LayoutObject lo = null;
+        if (isLeftToRight) {
+            for (int i = 0; i < layoutObjects.size(); i++) {
+                lo = (LayoutObject) layoutObjects.elementAt(i);
+                int yDelta = ItemLayouter.getYLocation(rowHeight,
+                        lo.getHeight(), lo.getVerticalLayout());
+                lo.eswtSetLocation(xShift + xDelta, yShift + yDelta);
+                xDelta += lo.getWidth();
+            }
+        }
+        else {
+            for (int i = layoutObjects.size() - 1; i > 0; i--) {
+                lo = (LayoutObject) layoutObjects.elementAt(i);
+                int yDelta = ItemLayouter.getYLocation(rowHeight,
+                        lo.getHeight(), lo.getVerticalLayout());
+                lo.eswtSetLocation(xShift + xDelta, yShift + yDelta);
+                xDelta += lo.getWidth();
+            }
+        }
+    }
+
+    /**
+     * Update width and height of a row if some layout objects were removed or
+     * changed.
+     */
+    void updateRowInternals() {
+        int newRowHeight = 0;
+        int newOccupiedSpace = 0;
+        int num = layoutObjects.size();
+        LayoutObject lo = null;
+        for (int i = 0; i < num; i++) {
+            lo = (LayoutObject) layoutObjects.elementAt(i);
+            newRowHeight = Math.max(newRowHeight, lo.getHeight());
+            newOccupiedSpace += lo.getWidth();
+        }
+        rowHeight = newRowHeight;
+        occupiedSpace = newOccupiedSpace;
+    }
+
+    /**
+     * Set the yShift to corresponding in ScrolledComposite which represents
+     * Form.
+     *
+     * @param aYShift yPosition of the row inside ScrolledComposite
+     */
+    void setYShift(int aYShift) {
+        yShift = aYShift;
+    }
+
+    /**
+     * Get the yPosition of a Row inside of ScrolledComposite.
+     *
+     * @return yShift in pixels
+     */
+    int getYShift() {
+        return yShift;
+    }
+
+    /**
+     * Gets the width of the row in pixels.
+     *
+     * @return - row's total width.
+     */
+    int getRowWidth() {
+        return rowWidth;
+    }
+
+    /**
+     * Get the height of a row in pixels (height of tallest item).
+     *
+     * @return height of a row;
+     */
+    int getRowHeight() {
+        return rowHeight;
+    }
+
+    /**
+     * Get the bottom (yPosition + rowHeight) of a Row .
+     */
+    int getBottomPosition() {
+        return yShift + rowHeight;
+    }
+
+    /**
+     * Get the yPosition of a Row's height inside of ScrolledComposite.
+     *
+     * @param yPosition the y position
+     * @return yShift + rowHeight in pixels
+     */
+    boolean isInsideRow(int yPosition) {
+        return (yShift <= yPosition && yPosition < yShift + rowHeight);
+    }
+
+    /**
+     * set new horizontal Layout of a row.
+     *
+     * @param aRowHLayout - set new horizontal of the row.
+     */
+    void setRowHLayout(int aRowHLayout) {
+        rowHLayout = aRowHLayout;
+    }
+
+    /**
+     * Get horizontal Layout of row.
+     *
+     * @return horizontal Layout of a row;
+     */
+    int getRowHLayout() {
+        return rowHLayout;
+    }
+
+    boolean isEmpty() {
+        return ((occupiedSpace == 0) && (layoutObjects.size() == 0));
+    }
+
+    LayoutObject getNextLayoutObject(LayoutObject lo, Item item) {
+        int startIdx = layoutObjects.indexOf(lo);
+        startIdx = (startIdx < 0 ? 0 : startIdx + 1);
+        int num = layoutObjects.size();
+        LayoutObject temp = null;
+        for (int i = startIdx; i < num; i++) {
+            temp = getLayoutObject(i);
+            if (item == null || item == temp.getOwningItem()) {
+                return temp;
+            }
+        }
+        return null;
+    }
+
+    LayoutObject getPrevLayoutObject(LayoutObject lo, Item item) {
+        int startIdx = layoutObjects.indexOf(lo);
+        startIdx = (startIdx < 0 ? layoutObjects.size() - 1 : startIdx - 1);
+        LayoutObject temp = null;
+        for (int i = startIdx; i >= 0; i--) {
+            temp = getLayoutObject(i);
+            if (item == null || item == temp.getOwningItem()) {
+                return temp;
+            }
+        }
+        return null;
+    }
+
+    LayoutObject getNextLayoutObject(LayoutObject lo, int layoutMask) {
+        int startIdx = layoutObjects.indexOf(lo);
+        startIdx = (startIdx < 0 ? 0 : startIdx + 1);
+        int num = layoutObjects.size();
+        LayoutObject temp = null;
+        for (int i = startIdx; i < num; i++) {
+            temp = getLayoutObject(i);
+            if (temp.getOwningItem().hasLayout(layoutMask)) {
+                return temp;
+            }
+        }
+        return null;
+    }
+
+    LayoutObject getLayoutObject(int index) {
+        return (LayoutObject) layoutObjects.elementAt(index);
+    }
+
+    int size() {
+        return layoutObjects.size();
+    }
+
+}