javauis/lcdui_qt/src/javax/microedition/lcdui/FormLayouter.java
author hgs
Fri, 29 Oct 2010 11:49:32 +0300
changeset 87 1627c337e51e
parent 57 59b3b4473dc8
permissions -rw-r--r--
v2.2.21_1
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
57
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
     1
/*
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
     2
* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
     3
* All rights reserved.
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
     4
* This component and the accompanying materials are made available
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
     5
* under the terms of "Eclipse Public License v1.0"
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
     6
* which accompanies this distribution, and is available
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
     7
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
     8
*
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
     9
* Initial Contributors:
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
    10
* Nokia Corporation - initial contribution.
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
    11
*
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
    12
* Contributors:
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
    13
*
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
    14
* Description:
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
    15
*
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
    16
*/
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
    17
package javax.microedition.lcdui;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
    18
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
    19
import java.util.NoSuchElementException;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
    20
import java.util.Vector;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
    21
import java.util.Enumeration;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
    22
import java.util.Timer;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
    23
import java.util.TimerTask;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
    24
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
    25
import org.eclipse.swt.SWT;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
    26
import org.eclipse.swt.graphics.Point;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
    27
import org.eclipse.swt.widgets.Composite;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
    28
import org.eclipse.swt.widgets.Control;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
    29
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
    30
/**
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
    31
 * FormLayouter implements form layout algorithm.
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
    32
 */
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
    33
class FormLayouter
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
    34
{
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
    35
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
    36
    /**
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
    37
     * Form instance (not owned).
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
    38
     */
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
    39
    private Form form;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
    40
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
    41
    /**
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
    42
     * Form's scrolled composite (not owned).
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
    43
     */
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
    44
    protected ScrolledComposite formComposite;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
    45
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
    46
    /**
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
    47
     * Controls vector.
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
    48
     */
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
    49
    private Vector layoutObjects = new Vector();
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
    50
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
    51
    /**
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
    52
     * Rows vector.
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
    53
     */
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
    54
    private Vector rows = new Vector();
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
    55
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
    56
    /**
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
    57
     * Form's current horizontal alignment
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
    58
     */
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
    59
    private int currentHLayoutDirective;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
    60
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
    61
    private ImageItemLayouter imIL;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
    62
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
    63
    private StringItemLayouter sIL;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
    64
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
    65
    private GaugeLayouter gL;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
    66
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
    67
    private TextFieldLayouter tfL;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
    68
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
    69
    private DateFieldLayouter dfL;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
    70
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
    71
    private ChoiceGroupLayouter cgL;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
    72
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
    73
    private CustomItemLayouter ciL;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
    74
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
    75
    private SpacerLayouter sL;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
    76
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
    77
    private int vPosition;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
    78
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
    79
    private Item deferredScrollToItem;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
    80
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
    81
    private boolean isCurrent;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
    82
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
    83
    private Control itemMainControl;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
    84
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
    85
    private static final int NO_DIRECTION = -1;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
    86
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
    87
    private Item currentSelectedItem;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
    88
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
    89
    private int direction = NO_DIRECTION;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
    90
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
    91
    private boolean mousePressed;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
    92
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
    93
    private LayoutObject currentlyUnderMouse;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
    94
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
    95
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
    96
    /**
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
    97
     * Constructor.
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
    98
     *
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
    99
     * @param form Form to perform layout on.
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   100
     */
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   101
    FormLayouter(Form form)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   102
    {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   103
        this.form = form;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   104
        formComposite = form.getFormComposite();
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   105
        imIL = new ImageItemLayouter(this);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   106
        sIL = new StringItemLayouter(this);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   107
        gL = new GaugeLayouter(this);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   108
        dfL = new DateFieldLayouter(this);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   109
        tfL = new TextFieldLayouter(this);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   110
        cgL = new ChoiceGroupLayouter(this);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   111
        ciL = new CustomItemLayouter(this);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   112
        sL = new SpacerLayouter(this);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   113
    }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   114
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   115
    /**
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   116
     * Dispose and cleanup layouted items.
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   117
     */
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   118
    void dispose()
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   119
    {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   120
        ESWTUIThreadRunner.syncExec(new Runnable()
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   121
        {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   122
            public void run()
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   123
            {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   124
                eswtClearRows(0, null);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   125
    			removeAllLayoutObjects();
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   126
				rows = null;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   127
				layoutObjects = null;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   128
            }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   129
        });
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   130
    }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   131
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   132
    /**
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   133
     * Log out a control with all its children at the given indentation level.
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   134
     */
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   135
    void logControl(int level, Control control)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   136
    {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   137
        if(control != null)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   138
        {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   139
            String s2 = control.toString();
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   140
            s2 = s2.substring(0, s2.indexOf('}') - 1);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   141
            String s3 = control.getBounds().toString();
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   142
            s3 = s3.substring(s3.indexOf('{'));
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   143
            Logger.verbose(Logger.indent(s2 + s3, level * 2));
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   144
            if(control instanceof Composite)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   145
            {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   146
                Control[] arr = ((Composite) control).getChildren();
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   147
                for(int i = 0; i < arr.length; i++)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   148
                {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   149
                    logControl(level + 1, arr[i]);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   150
                }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   151
            }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   152
        }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   153
    }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   154
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   155
    /**
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   156
     * Log out all layoutobjects for each item.
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   157
     */
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   158
    void logFormLayout()
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   159
    {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   160
        Logger.verbose(form + " ---------------------------------------------");
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   161
        LayoutObject lo = null;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   162
        Item item = null;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   163
        int line = -1;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   164
        while((lo = getNextLayoutObjectOfItem(lo, null)) != null)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   165
        {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   166
            if(lo.getOwningItem() != item)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   167
            {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   168
                item = lo.getOwningItem();
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   169
                Logger.verbose(item.toString());
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   170
            }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   171
            if(lo.getRowIdx() != line)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   172
            {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   173
                line = lo.getRowIdx();
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   174
            }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   175
            Logger.verbose(Logger.indent("Row:" + lo.getRowIdx(), 2));
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   176
            logControl(2, lo.getControl());
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   177
        }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   178
        Logger.verbose(form + " ---------------------------------------------");
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   179
    }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   180
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   181
    /**
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   182
     * Called when Form is about to be shown.<br>
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   183
     * NOTE: this is called from eSWT UI-thread
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   184
     */
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   185
    void handleShowCurrentEvent()
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   186
    {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   187
        Logger.method(this, "handleShowCurrentEvent");
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   188
        isCurrent = true;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   189
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   190
        // restore our scrolling position (eSWT resets it to 0 by default)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   191
        eswtSetScrollingPosition(vPosition, true);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   192
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   193
        Item item = null;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   194
        LayoutObject lo = null;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   195
        while((lo = getNextLayoutObjectOfItem(lo, null)) != null)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   196
        {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   197
            if(lo.getOwningItem() != item)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   198
            {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   199
                // item border
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   200
                item = lo.getOwningItem();
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   201
                getItemLayouter(item).eswtAddListeners(item, lo);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   202
            }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   203
        }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   204
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   205
		eswtApplyCurrentFocus();	
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   206
    }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   207
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   208
    /**
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   209
     * Called when Form is about to be hidden.<br>
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   210
     * NOTE: this is called from eSWT UI-thread
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   211
     */
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   212
    void handleHideCurrentEvent()
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   213
    {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   214
        Logger.method(this, "handleHideCurrentEvent");
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   215
        isCurrent = false;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   216
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   217
        Item item = null;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   218
        LayoutObject lo = null;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   219
        while((lo = getNextLayoutObjectOfItem(lo, null)) != null)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   220
        {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   221
            if(lo.getOwningItem() != item)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   222
            {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   223
                // item border
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   224
                item = lo.getOwningItem();
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   225
                getItemLayouter(item).eswtRemoveListeners(item, lo);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   226
                getItemLayouter(item).eswtHandleVisibilityChange(item, false);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   227
            }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   228
        }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   229
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   230
		direction = NO_DIRECTION;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   231
    }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   232
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   233
    /**
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   234
     * Called when Form is beeing resized.<br>
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   235
     * NOTE: this is called from eSWT UI-thread
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   236
     */
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   237
    void handleResizeEvent(int width, int height)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   238
    {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   239
        // Logger.method(this, "handleResizeEvent");
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   240
        int numitems = getItemCount();
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   241
        for(int i = 0; i < numitems; i++)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   242
        {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   243
            getItem(i).invalidateCachedSizes();
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   244
        }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   245
        ItemLayouter.eswtUpdateStaticShellSize(width, height);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   246
    }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   247
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   248
    /**
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   249
     * Do form layout according to startIndex.
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   250
     *
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   251
     * @param startItem - index of item which need to be layouted.
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   252
     */
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   253
    void layoutForm(final int startIndex)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   254
    {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   255
        ESWTUIThreadRunner.syncExec(new Runnable()
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   256
        {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   257
            public void run()
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   258
            {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   259
                eswtLayoutForm(startIndex);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   260
            }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   261
        });
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   262
    }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   263
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   264
    /**
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   265
     * eSWT callback for doLayout().
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   266
     */
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   267
    void eswtLayoutForm(int startIndex)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   268
    {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   269
        int numItems = getItemCount();
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   270
        Logger.method(this, "eswtLayoutForm", startIndex + " / " + numItems);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   271
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   272
        eswtUpdateFormComposite(false);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   273
        if(numItems > 0)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   274
        {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   275
            Item previousItem = null;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   276
            int startRowIndex = 0;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   277
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   278
            if(startIndex > 0)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   279
            {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   280
                // Find row with previous item.
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   281
                previousItem = getItem(startIndex - 1);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   282
                Row prevItemRow = getLastRowOfItem(previousItem);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   283
                if(prevItemRow != null)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   284
                {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   285
                    startRowIndex = rows.indexOf(prevItemRow);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   286
                }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   287
            }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   288
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   289
            // Clear rows starting from item - partial re-layouting
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   290
            eswtClearRows(startRowIndex, previousItem);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   291
            // Layout items
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   292
            for(int i = startIndex; i < numItems; i++)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   293
            {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   294
                eswtLayoutItem(getItem(i));
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   295
            }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   296
            // Update last row
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   297
            eswtUpdateRow(getLastRow());
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   298
        }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   299
        else
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   300
        {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   301
            eswtClearRows(0, null);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   302
        }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   303
        // check if we need to scroll to a particular item
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   304
        if(deferredScrollToItem != null)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   305
        {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   306
            eswtSetCurrentItem(deferredScrollToItem);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   307
            deferredScrollToItem = null;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   308
        }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   309
        eswtUpdateFormComposite(true);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   310
        eswtHandleVisibilityChanges();
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   311
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   312
        if(Logger.isLogVerbose())
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   313
        {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   314
            logFormLayout();
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   315
        }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   316
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   317
		// clear invalid selected item
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   318
		eswtCheckCurrentSelectedItem();
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   319
		
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   320
		if(currentSelectedItem != null
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   321
				&& (currentSelectedItem.isFocusable()))
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   322
		{
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   323
			eswtApplyCurrentFocus();
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   324
		}
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   325
		else
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   326
		{
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   327
			// If there's no item currently selected try to find first
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   328
			// focusable item and set it current (if found):
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   329
			Item found = eswtGetNextFocusableItem(
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   330
							 getItem(startIndex - 1), SWT.ARROW_RIGHT);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   331
			if(found != null)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   332
			{
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   333
				eswtSetCurrentSelectedItem(found, NO_DIRECTION);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   334
			}
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   335
			else
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   336
			{
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   337
				eswtApplyCurrentFocus();
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   338
			}
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   339
		}		
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   340
    }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   341
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   342
    /**
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   343
     * Returns if the parameter is a eSWT directional key code.
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   344
     *
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   345
     * @param keyCode key code
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   346
     */
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   347
    private boolean isDirectionKey(int keyCode)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   348
    {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   349
        return (keyCode == SWT.ARROW_DOWN || keyCode == SWT.ARROW_UP
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   350
                || keyCode == SWT.ARROW_LEFT || keyCode == SWT.ARROW_RIGHT);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   351
    }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   352
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   353
    /**
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   354
     * Handler for key events.<br>
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   355
     * The implementation moves focus and/or scrolls the form when
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   356
     * needed. The method is called by the Form.
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   357
     *
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   358
     * @param keyCode eSWT key code.
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   359
     * @param keyType eSWT key type.
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   360
     */
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   361
    final void handleKeyEvent(int keyCode, int keyType)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   362
    {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   363
        Logger.method(this, "handleKeyEvent", currentSelectedItem,
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   364
                      String.valueOf(keyCode), String.valueOf(keyType));
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   365
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   366
        boolean isDirectionalKey = isDirectionKey(keyCode);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   367
        if(keyType == SWT.KeyDown && isDirectionalKey)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   368
        {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   369
            eswtCheckCurrentSelectedItem();
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   370
        }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   371
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   372
        if(currentSelectedItem != null)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   373
        {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   374
            if(getItemLayouter(currentSelectedItem).eswtOfferKeyEvent(
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   375
                        currentSelectedItem, keyCode, keyType))
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   376
            {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   377
                // if the key has been consumed
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   378
                return;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   379
            }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   380
        }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   381
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   382
        // scrolling/focus traverse only happens on directional key's down event
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   383
        if(keyType == SWT.KeyDown && isDirectionalKey)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   384
        {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   385
            // try to find next focusable item
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   386
            Item next = eswtGetNextFocusableItem(currentSelectedItem, keyCode);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   387
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   388
            // if no visible & focusable item was found to transfer focus
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   389
            if(next == currentSelectedItem)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   390
            {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   391
                // try to scroll a bit
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   392
                eswtSetScrollingPosition(getNextScrollingPosition(keyCode),
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   393
                                         true);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   394
                // find next focusable after scrolling
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   395
                next = eswtGetNextFocusableItem(currentSelectedItem, keyCode);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   396
            }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   397
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   398
            if(next != currentSelectedItem)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   399
            {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   400
                //textfield always have to be fully visible when focused.
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   401
                if(next instanceof TextField)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   402
                {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   403
                    eswtScrollToItem(next);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   404
                }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   405
                eswtSetCurrentSelectedItem(next, keyCode);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   406
            }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   407
        }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   408
    }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   409
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   410
    /**
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   411
     * Handler for pointer events.<br>
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   412
     * The method is called by the Form.
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   413
     *
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   414
     * @param x coordinate relative to scrolledComposite
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   415
     * @param y coordinate relative to scrolledComposite
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   416
     * @param type event type: SWT.MouseDown, SWT.MouseMove, SWT.MouseUp
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   417
     */
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   418
    final void handlePointerEvent(int x, int y, int type)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   419
    {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   420
        Logger.method(this, "handlePointerEvent", String.valueOf(x),
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   421
                      String.valueOf(y), String.valueOf(type));
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   422
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   423
        // TODO: change when DirectUI style arrives.
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   424
        /*
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   425
        Item item;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   426
        if (type == SWT.MouseMove) {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   427
            if (currentlyUnderMouse == null
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   428
                    || !currentlyUnderMouse.contains(x, y)) {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   429
                if (currentlyUnderMouse != null) {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   430
                    //currentlyUnderMouse.getControl().setCapture(false);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   431
                }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   432
                item = eswtFindItemUnderMouse(x, y);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   433
                if (item != null && item != currentSelectedItem
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   434
                        && item.isFocusable()) {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   435
                    setCurrentItem(item);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   436
                    item.internalSetFocused(true);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   437
                    eswtSetCurrentSelectedItem(item);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   438
                    //following method causes all mouse events delivered to it
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   439
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   440
                    currentlyUnderMouse.getControl().setCapture(true);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   441
                    Logger.warning("seting capture to:" + item);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   442
                }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   443
            }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   444
            int currentVPosition = getVPosition();
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   445
            boolean isMouseDirectionUp = false;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   446
            boolean doScrolling = false;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   447
            int localY = y;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   448
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   449
            if (y <= currentVPosition) {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   450
                localY = Math.max(0, y);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   451
                eswtSetScrollingPosition(localY, true);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   452
                isMouseDirectionUp = true;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   453
                doScrolling = true;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   454
            }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   455
            else if (y > (currentVPosition + getFormHeight())) {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   456
                //check for maxVPosition
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   457
                if (y > (eswtGetMaxVPosition() + getFormHeight())) {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   458
                    localY = eswtGetMaxVPosition() + getFormHeight();
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   459
                }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   460
                else {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   461
                    localY = y;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   462
                }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   463
                currentVPosition = localY - getFormHeight();
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   464
                eswtSetScrollingPosition(currentVPosition, true);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   465
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   466
                isMouseDirectionUp = false;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   467
                doScrolling = true;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   468
            }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   469
            if (mousePressed && doScrolling) {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   470
                resetEventTimer(isMouseDirectionUp, localY);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   471
            }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   472
        }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   473
        else
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   474
        if (type == SWT.MouseDown) {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   475
            mousePressed = true;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   476
            item = eswtFindItemUnderMouse(x, y);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   477
            if (item != null && item != currentSelectedItem
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   478
                    && item.isFocusable() && getForm().getShell() ==
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   479
                        getForm().getShell().getDisplay().getActiveShell()) {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   480
                //eswtScrollToItem(item);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   481
                //following method causes all mouse events delivered to it
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   482
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   483
                //currentlyUnderMouse.getControl().setCapture(true);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   484
            }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   485
        }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   486
        else if (type == SWT.MouseUp) {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   487
            mousePressed = false;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   488
            if (currentlyUnderMouse != null) {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   489
                //currentlyUnderMouse.getControl().setCapture(false);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   490
            }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   491
        }*/
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   492
    }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   493
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   494
    /**
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   495
     * Find item at the specified point.
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   496
     *
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   497
     * @param x coordinate.
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   498
     * @param y coordinate.
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   499
     * @return Item.
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   500
     */
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   501
    Item eswtFindItemUnderMouse(int x, int y)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   502
    {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   503
        Row itemRow;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   504
        for(int i = 0; i < getRowCount(); i++)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   505
        {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   506
            itemRow = getRow(i);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   507
            if(itemRow.getYShift() <= y && y <= itemRow.getBottomPosition())
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   508
            {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   509
                LayoutObject lo;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   510
                for(int j = 0; j < itemRow.size(); j++)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   511
                {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   512
                    lo = itemRow.getLayoutObject(j);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   513
                    if(lo.contains(x, y))
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   514
                    {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   515
                        Logger.info("Item under mouse: "
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   516
                                    + lo.getOwningItem());
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   517
                        currentlyUnderMouse = lo;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   518
                        return lo.getOwningItem();
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   519
                    }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   520
                }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   521
                break;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   522
            }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   523
        }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   524
        return null;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   525
    }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   526
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   527
    /**
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   528
     * Gets next (or nearest) focusable item.
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   529
     *
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   530
     * @param fromItem Item where to start to search the next focusable item.
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   531
     * @param dir Search direction, one of the arrow key constants defined
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   532
     *      in class SWT.
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   533
     *
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   534
     * @return Nearest focusable item or null if no item found.
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   535
     */
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   536
    final Item eswtGetNextFocusableItem(Item fromItem, int dir)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   537
    {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   538
        Item nextItem = fromItem;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   539
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   540
        switch(dir)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   541
        {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   542
        case SWT.ARROW_RIGHT:
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   543
        {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   544
            LayoutObject obj = getLastLayoutObjectOfItem(fromItem);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   545
            while((obj = getNextLayoutObjectOfItem(obj, null)) != null)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   546
            {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   547
                Item owner = obj.getOwningItem();
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   548
                if(owner != null && owner != fromItem
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   549
                        && owner.isFocusable()
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   550
                        && isPartiallyVisible(obj, Config.DFI_VISIBILITY_PERCENT))
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   551
                {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   552
                    nextItem = owner;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   553
                    break;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   554
                }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   555
            }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   556
            break;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   557
        }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   558
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   559
        case SWT.ARROW_LEFT:
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   560
        {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   561
            LayoutObject obj = getFirstLayoutObjectOfItem(fromItem);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   562
            while((obj = getPrevLayoutObjectOfItem(obj, null)) != null)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   563
            {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   564
                Item owner = obj.getOwningItem();
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   565
                if(owner != null && owner != fromItem
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   566
                        && owner.isFocusable()
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   567
                        && isPartiallyVisible(obj, Config.DFI_VISIBILITY_PERCENT))
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   568
                {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   569
                    nextItem = owner;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   570
                    break;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   571
                }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   572
            }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   573
            break;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   574
        }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   575
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   576
        case SWT.ARROW_DOWN:
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   577
        {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   578
            int minDist = Integer.MAX_VALUE;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   579
            LayoutObject start = getLastLayoutObjectOfItem(fromItem);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   580
            LayoutObject obj = start;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   581
            while((obj = getNextLayoutObjectOfItem(obj, null)) != null)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   582
            {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   583
                Item owner = obj.getOwningItem();
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   584
                if(owner != null && owner != fromItem
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   585
                        && owner.isFocusable() && obj.isBelow(start)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   586
                        && isPartiallyVisible(obj, Config.DFI_VISIBILITY_PERCENT))
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   587
                {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   588
                    int dist = obj.distanceTo(start);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   589
                    if(dist < minDist)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   590
                    {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   591
                        minDist = dist;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   592
                        nextItem = owner;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   593
                    }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   594
                }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   595
            }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   596
            break;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   597
        }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   598
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   599
        case SWT.ARROW_UP:
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   600
        {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   601
            int minDist = Integer.MAX_VALUE;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   602
            LayoutObject start = getFirstLayoutObjectOfItem(fromItem);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   603
            LayoutObject obj = start;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   604
            while((obj = getPrevLayoutObjectOfItem(obj, null)) != null)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   605
            {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   606
                Item owner = obj.getOwningItem();
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   607
                if(owner != null && owner != fromItem
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   608
                        && owner.isFocusable() && obj.isAbove(start)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   609
                        && isPartiallyVisible(obj, Config.DFI_VISIBILITY_PERCENT))
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   610
                {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   611
                    int dist = obj.distanceTo(start);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   612
                    if(dist < minDist)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   613
                    {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   614
                        minDist = dist;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   615
                        nextItem = owner;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   616
                    }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   617
                }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   618
            }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   619
            break;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   620
        }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   621
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   622
        default:
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   623
        }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   624
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   625
        return nextItem;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   626
    }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   627
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   628
    /**
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   629
     * Check if the currentSelectedItem is valid and visible. If not then it
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   630
     * sets it to null.
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   631
     */
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   632
    final void eswtCheckCurrentSelectedItem()
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   633
    {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   634
        if(currentSelectedItem != null)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   635
        {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   636
            if(currentSelectedItem.getParent() != getForm()
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   637
                    || !currentSelectedItem.isVisible())
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   638
            {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   639
                // we need to find another
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   640
                Logger.method(this, "eswtCheckCurrentSelectedItem");
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   641
                eswtSetCurrentSelectedItem(null, NO_DIRECTION);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   642
            }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   643
        }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   644
    }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   645
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   646
    /**
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   647
     * Sets currentSelectedItem and sets focus to it.<br>
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   648
     * If one of form's items is already selected when this method is called,
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   649
     * removes focus from old item and then moves focus to new one.
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   650
     *
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   651
     * @param item Item to set as current selected. If null, nothing happens.
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   652
     * @param dir Direction which is delivered to layouter.
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   653
     */
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   654
    void eswtSetCurrentSelectedItem(Item item, int dir)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   655
    {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   656
        if(currentSelectedItem != item)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   657
        {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   658
            Logger.info(this + "::SelectedItem: "
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   659
                        + currentSelectedItem + " --(" + dir + ")--> " + item);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   660
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   661
            // Save direction
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   662
            direction = dir;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   663
            // Remove focus from currentSelectedItem and notify its Layouter.
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   664
            if(currentSelectedItem != null)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   665
            {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   666
                getItemLayouter(currentSelectedItem).eswtFocusLost(
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   667
                    currentSelectedItem);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   668
            }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   669
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   670
            // Set new currentSelectedItem, must be focusable or null
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   671
            currentSelectedItem = item;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   672
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   673
            // Set focus to currentSelectedItem and notify its Layouter.
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   674
            if(currentSelectedItem != null)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   675
            {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   676
                getItemLayouter(currentSelectedItem).eswtFocusGained(
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   677
                    currentSelectedItem, dir);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   678
            }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   679
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   680
            // Apply eSWT focus to currentSelectedItem's control
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   681
            eswtApplyCurrentFocus();
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   682
        }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   683
    }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   684
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   685
    /**
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   686
     * Sets currentSelectedItem and sets focus to it.<br>
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   687
     * If one of form's items is already selected when this method is called,
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   688
     * removes focus from old item and then moves focus to new one.
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   689
     *
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   690
     * @param item Item to set as current selected. If null, nothing happens.
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   691
     * @param dir Direction which is delivered to layouter.
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   692
     */
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   693
    void eswtSetCurrentSelectedItem(Item item)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   694
    {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   695
        if(currentSelectedItem != item)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   696
        {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   697
            Logger.info(this + "::SelectedItem: "
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   698
                        + currentSelectedItem + " ---> " + item);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   699
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   700
            // Remove focus from currentSelectedItem and notify its Layouter.
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   701
            if(currentSelectedItem != null)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   702
            {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   703
                getItemLayouter(currentSelectedItem).eswtFocusLost(
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   704
                    currentSelectedItem);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   705
            }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   706
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   707
            // Set new currentSelectedItem, must be focusable or null
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   708
            currentSelectedItem = item;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   709
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   710
            // Set focus to currentSelectedItem and notify its Layouter.
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   711
            if(currentSelectedItem != null)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   712
            {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   713
                getItemLayouter(currentSelectedItem).eswtFocusGained(
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   714
                    currentSelectedItem, NO_DIRECTION);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   715
            }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   716
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   717
            // Apply eSWT focus to currentSelectedItem's control
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   718
            //eswtApplyCurrentFocus();
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   719
        }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   720
    }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   721
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   722
    /**
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   723
     * Sets focus to currentSelectedItem's control if its partially visible.
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   724
     * Otherwise it sets dummy focus to form's composite.<br>
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   725
     * <br>
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   726
     * Note that this method applies focus only to eSWT control. Item focus
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   727
     * update and layouter notifications are handled in method
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   728
     * <code>eswtSetCurrentSelectedItem()</code>.<br>
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   729
     * If currentSelectedItem is null or form is not shown, this method has no
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   730
     * effect.
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   731
     */
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   732
    void eswtApplyCurrentFocus()
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   733
    {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   734
        if(isFormCurrent())
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   735
        {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   736
            // if any of the Item's LayoutObjects is visible
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   737
            if(isItemPartiallyVisible(currentSelectedItem))
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   738
            {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   739
                Logger.method(this, "ApplyFocus", currentSelectedItem);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   740
                eswtSetFocusToFirstControl(currentSelectedItem);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   741
            }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   742
            else
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   743
            {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   744
                Logger.method(this, "ApplyFocus", "dummy");
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   745
                formComposite.forceFocus();
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   746
            }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   747
        }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   748
    }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   749
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   750
    /**
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   751
     * If the Item is valid and it is layouted, then sets the Item's first
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   752
     * LayoutObject focused.
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   753
     *
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   754
     * @param item an item which first LayoutObject is set focused.
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   755
     */
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   756
    void eswtSetFocusToFirstControl(Item item)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   757
    {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   758
        if(item != null && item.isFocusable())
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   759
        {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   760
            LayoutObject lo = getFirstLayoutObjectOfItem(item);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   761
            if(lo != null)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   762
            {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   763
                lo.getControl().forceFocus();
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   764
            }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   765
        }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   766
    }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   767
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   768
    /**
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   769
     * Gets Current selected item.
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   770
     *
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   771
     * @return Current selected item. May also return null.
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   772
     */
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   773
    Item getCurrentSelectedItem()
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   774
    {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   775
        return currentSelectedItem;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   776
    }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   777
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   778
    /**
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   779
     * Get the direction of scrolling.
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   780
     *
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   781
     * @return direction of scrolling.
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   782
     */
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   783
    int getDirection()
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   784
    {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   785
        return direction;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   786
    }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   787
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   788
    /**
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   789
     * Set focus to an item if it is focusable and scroll form to make it
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   790
     * visible if it is not.
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   791
     *
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   792
     * @param item Item to set as current item.
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   793
     */
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   794
    void setCurrentItem(final Item item)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   795
    {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   796
        Logger.method(this, "setCurrentItem", item);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   797
        ESWTUIThreadRunner.syncExec(new Runnable()
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   798
        {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   799
            public void run()
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   800
            {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   801
                eswtSetCurrentItem(item);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   802
            }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   803
        });
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   804
    }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   805
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   806
    /**
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   807
     * eSWT callback for setCurrentItem.
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   808
     */
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   809
    boolean eswtSetCurrentItem(Item item)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   810
    {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   811
        if(item != null)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   812
        {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   813
            if(isItemLayouted(item))
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   814
            {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   815
                eswtScrollToItem(item);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   816
                deferredScrollToItem = null;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   817
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   818
				if(item.isFocusable())
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   819
				{
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   820
					eswtSetCurrentSelectedItem(item, NO_DIRECTION);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   821
					Logger.info("eswtSetCurrentItem" + item);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   822
				}
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   823
                return true;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   824
            }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   825
            else
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   826
            {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   827
                deferredScrollToItem = item;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   828
            }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   829
        }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   830
        return false;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   831
    }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   832
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   833
    void eswtScrollToItem(Item item)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   834
    {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   835
        if(item != null)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   836
        {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   837
            int pos = getItemBottomPosition(item) - getFormHeight();
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   838
            if(!isItemPartiallyVisible(item))
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   839
            {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   840
                eswtSetScrollingPosition(pos, true);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   841
            }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   842
            else if(item instanceof TextField && !isItemFullyVisible(item))
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   843
            {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   844
                eswtSetScrollingPosition(pos, true);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   845
            }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   846
        }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   847
    }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   848
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   849
    void eswtScrolltoRegion(int yTop, int yBottom, int swtDir)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   850
    {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   851
        if(yTop < vPosition || yBottom > vPosition + getFormHeight())
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   852
        {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   853
            // if the region is somewhat outside the screen
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   854
            if(swtDir == SWT.ARROW_DOWN || swtDir == SWT.ARROW_RIGHT)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   855
            {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   856
                // align to top
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   857
                eswtSetScrollingPosition(yTop, true);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   858
            }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   859
            else
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   860
            {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   861
                // align to bottom
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   862
                eswtSetScrollingPosition(yBottom - getFormHeight(), true);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   863
            }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   864
        }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   865
    }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   866
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   867
    void eswtScrollIfNeeded(final int top, final int bottom)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   868
    {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   869
        if(bottom > vPosition + getFormHeight())
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   870
        {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   871
            eswtSetScrollingPosition(bottom - (getFormHeight() / 2), true);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   872
        }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   873
        else if(top < vPosition)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   874
        {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   875
            eswtSetScrollingPosition(bottom - (getFormHeight() / 2), true);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   876
        }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   877
    }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   878
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   879
    /**
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   880
     * Get control's position relative to composite.
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   881
     */
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   882
    void getControlPositionOnComposite(Control control, Point location)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   883
    {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   884
        if(control != formComposite)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   885
        {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   886
            Point rel = control.getLocation();
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   887
            location.x += rel.x;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   888
            location.y += rel.y;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   889
            getControlPositionOnComposite(control.getParent(), location);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   890
        }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   891
    }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   892
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   893
    /**
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   894
     * eSWT specific calls to do update ScrolledComposite.
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   895
     */
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   896
    private void eswtUpdateFormComposite(boolean show)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   897
    {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   898
        if(getRowCount() > 0)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   899
        {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   900
            if(show)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   901
            {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   902
                formComposite.updateScrollbar(getLastRow().getBottomPosition());
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   903
                formComposite.pack();
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   904
            }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   905
        }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   906
        // Could happen if changing item from very tall to very short.
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   907
        // so we have to update VPosition
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   908
        if(getVPosition() > eswtGetMaxVPosition())
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   909
        {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   910
            eswtSetScrollingPosition(eswtGetMaxVPosition(), false);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   911
        }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   912
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   913
        formComposite.setRedraw(show);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   914
        formComposite.setVisible(show);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   915
    }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   916
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   917
    /**
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   918
     * Clean all form rows starting from startIndex.
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   919
     *
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   920
     * @param startIndex Start row from which to clean.
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   921
     * @param keepItem - item in a startRow which shouldn't be recreated.
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   922
     */
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   923
    private void eswtClearRows(int startIndex, Item keepItem)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   924
    {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   925
        Logger.method(this, "clearRows", String.valueOf(startIndex), keepItem);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   926
        Row row = null;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   927
        for(int i = (getRowCount() - 1); i >= startIndex; i--)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   928
        {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   929
            row = getRow(i);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   930
            if(row.cleanRow(keepItem))
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   931
            {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   932
                break;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   933
            }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   934
            else
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   935
            {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   936
                rows.removeElement(row);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   937
            }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   938
        }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   939
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   940
        // one row always should be available.
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   941
        if((getRowCount() == 0))
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   942
        {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   943
            // rows.addElement(tempRow);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   944
            currentHLayoutDirective = Item.LAYOUT_DEFAULT;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   945
            Row newRow = new Row(ItemLayouter.getMaximumItemWidth(null),
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   946
                                 getCurrentHLayoutDirective());
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   947
            rows.addElement(newRow);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   948
        }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   949
    }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   950
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   951
    /**
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   952
     * Update Row's internal layout. Handles LAYOUT_2 related post-processing.
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   953
     *
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   954
     * @param row Row
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   955
     */
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   956
    private void eswtUpdateRow(Row row)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   957
    {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   958
        if(row != null)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   959
        {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   960
            //Logger.verbose("updateRow start: " + row);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   961
            int numShrink = row.getNumLayoutObjects(Item.LAYOUT_SHRINK);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   962
            int numExpand = row.getNumLayoutObjects(Item.LAYOUT_EXPAND);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   963
            //Logger.verbose("shrink: " + numShrink + " expand: " + numExpand);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   964
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   965
            int vMask = Item.LAYOUT_VSHRINK | Item.LAYOUT_VEXPAND;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   966
            // Expand items vertically with VSHRINK or VEXPAND layout directive
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   967
            LayoutObject lo = null;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   968
            int maxHeight = row.getRowHeight(vMask);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   969
            while((lo = row.getNextLayoutObject(lo, vMask)) != null)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   970
            {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   971
                if(lo.getOwningItem().hasLayout(Item.LAYOUT_VSHRINK))
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   972
                {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   973
                    int pref = lo.getOwningItem().getPreferredHeight();
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   974
                    getItemLayouter(lo.getOwningItem()).eswtResizeObject(lo,
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   975
                            lo.getWidth(), Math.min(pref, maxHeight));
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   976
                }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   977
                else if(lo.getOwningItem().hasLayout(Item.LAYOUT_VEXPAND))
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   978
                {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   979
                    getItemLayouter(lo.getOwningItem()).eswtResizeObject(lo,
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   980
                            lo.getWidth(), maxHeight);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   981
                }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   982
            }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   983
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   984
            // Expand items with SHRINK layout directive
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   985
            if(numShrink > 0)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   986
            {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   987
                // Get extra space before shrink and expand
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   988
                int offset = row.getFreeSpace() / numShrink;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   989
                // Logger.verbose("shrinkOffset: " + offset);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   990
                if(offset >= 0)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   991
                {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   992
                    while((lo = row.getNextLayoutObject(lo, Item.LAYOUT_SHRINK)) != null)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   993
                    {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   994
                        int pref = lo.getOwningItem().getPreferredWidth();
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   995
                        int min = lo.getOwningItem().getMinimumWidth();
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   996
                        int itemWidth = Math.min(pref, min + offset);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   997
                        getItemLayouter(lo.getOwningItem()).eswtResizeObject(lo,
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   998
                                itemWidth, lo.getHeight());
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
   999
                    }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1000
                }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1001
            }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1002
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1003
            // Expand items with EXPAND layout directive
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1004
            if(numExpand > 0)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1005
            {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1006
                // Get extra space after shrink but before expand
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1007
                int offset = row.getFreeSpace(Item.LAYOUT_EXPAND) / numExpand;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1008
                if(offset >= 0)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1009
                {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1010
                    // Logger.verbose("expandOffset: " + offset);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1011
                    while((lo = row.getNextLayoutObject(lo, Item.LAYOUT_EXPAND)) != null)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1012
                    {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1013
                        int pref = lo.getOwningItem().getPreferredWidth();
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1014
                        getItemLayouter(lo.getOwningItem()).eswtResizeObject(lo,
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1015
                                pref + offset, lo.getHeight());
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1016
                    }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1017
                }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1018
            }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1019
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1020
            //if (numShrink > 0 || numExpand > 0) {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1021
            row.updateRowInternals();
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1022
            //}
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1023
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1024
            row.updateRowLayout(form.getLeftRightLanguage());
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1025
            // Logger.verbose("updateRow: " + row);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1026
        }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1027
    }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1028
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1029
    /**
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1030
     * Add a new Row.
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1031
     */
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1032
    private Row eswtAddNewRow()
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1033
    {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1034
        Row lastRow = getLastRow();
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1035
        eswtUpdateRow(lastRow);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1036
        int yShift = (lastRow == null ? 0 : lastRow.getBottomPosition());
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1037
        // create new Row
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1038
        Row newRow = new Row(ItemLayouter.getMaximumItemWidth(null),
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1039
                             getCurrentHLayoutDirective());
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1040
        newRow.setYShift(yShift);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1041
        rows.addElement(newRow);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1042
        return newRow;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1043
    }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1044
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1045
    /**
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1046
     * Add a LayoutObject to the last Row.
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1047
     *
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1048
     * @param layoutObject the layout object
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1049
     */
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1050
    void eswtAddNewLayoutObject(LayoutObject layoutObject)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1051
    {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1052
    	if(!layoutObjects.contains(layoutObject))
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1053
    	{
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1054
    		layoutObjects.addElement(layoutObject);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1055
    	}
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1056
        Row lastRow = getLastRow();
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1057
        // check if the current Row is full
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1058
        if(!lastRow.isEmpty()
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1059
                && lastRow.getFreeSpace() < layoutObject.getWidth())
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1060
        {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1061
            lastRow = eswtAddNewRow();
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1062
        }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1063
        lastRow.eswtAddLayoutObject(layoutObject);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1064
        layoutObject.setRowIdx(getRowCount() - 1);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1065
    }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1066
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1067
    /**
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1068
     * Optionally add a new Row and adds a LayoutObject.
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1069
     *
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1070
     * @param layoutObject the layout object
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1071
     * @param newRow adds a new row if true. If false, adds new row only if
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1072
     *            there's no space for layoutObject in current row.
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1073
     */
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1074
    void eswtAddNewLayoutObject(LayoutObject layoutObject, boolean newRow)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1075
    {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1076
        if(newRow)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1077
        {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1078
            eswtAddNewRow();
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1079
        }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1080
        eswtAddNewLayoutObject(layoutObject);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1081
    }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1082
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1083
    /**
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1084
     * Layout item in a row, if needed new row is added.
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1085
     *
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1086
     * @param row - where to startLayout.
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1087
     * @param item - Item to Layout
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1088
     */
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1089
    private void eswtLayoutItem(Item item)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1090
    {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1091
        Row lastRow = getLastRow();
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1092
        boolean hlChange = setCurrentHLayoutDirective(item.internalGetLayout());
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1093
        if(hlChange || getItemNewLineBefore(item))
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1094
        {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1095
            // newline directive or horizontal layout changed
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1096
            if(lastRow.isEmpty())
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1097
            {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1098
                // if the current/last row is empty - use that
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1099
                lastRow.setRowHLayout(getCurrentHLayoutDirective());
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1100
            }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1101
            else
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1102
            {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1103
                eswtAddNewRow();
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1104
            }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1105
        }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1106
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1107
        // Use the specific layouter to layout item in the last row
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1108
        getItemLayouter(item).eswtLayoutItem(getLastRow(), item);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1109
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1110
        if(form.eswtIsShown())
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1111
        {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1112
            LayoutObject lo = getFirstLayoutObjectOfItem(item);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1113
            if(lo != null)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1114
            {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1115
                getItemLayouter(item).eswtAddListeners(item, lo);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1116
            }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1117
        }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1118
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1119
        if(getItemNewLineAfter(item))
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1120
        {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1121
            eswtAddNewRow();
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1122
        }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1123
    }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1124
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1125
    /**
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1126
     * Set Form's Layout directive. if it differ from current set flag
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1127
     * startFromNewLine = true;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1128
     *
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1129
     * @param newLayoutDirective
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1130
     * @return true if a layout change has occured
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1131
     */
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1132
    private boolean setCurrentHLayoutDirective(int newLayoutDirective)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1133
    {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1134
        int newHLayoutDirective = Item.getHorizontalLayout(newLayoutDirective);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1135
        if((newHLayoutDirective != currentHLayoutDirective)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1136
                && (newHLayoutDirective != Item.LAYOUT_DEFAULT))
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1137
        {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1138
            currentHLayoutDirective = newHLayoutDirective;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1139
            return true;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1140
        }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1141
        return false;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1142
    }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1143
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1144
    /**
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1145
     * Get Form current Layout directive.
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1146
     *
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1147
     * @return current Layout directive for Form.
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1148
     */
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1149
    private int getCurrentHLayoutDirective()
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1150
    {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1151
        if(currentHLayoutDirective == Item.LAYOUT_DEFAULT)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1152
        {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1153
            return getLanguageSpecificLayoutDirective();
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1154
        }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1155
        return currentHLayoutDirective;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1156
    }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1157
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1158
    /**
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1159
     * Returns language specific layout directive.
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1160
     *
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1161
     * @return LAYOUT_LEFT or LAYOUT_RIGHT.
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1162
     */
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1163
    int getLanguageSpecificLayoutDirective()
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1164
    {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1165
        if(form.getLeftRightLanguage())
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1166
        {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1167
            return Item.LAYOUT_LEFT;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1168
        }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1169
        else
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1170
        {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1171
            return Item.LAYOUT_RIGHT;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1172
        }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1173
    }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1174
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1175
    private boolean getItemNewLineBefore(Item item)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1176
    {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1177
        return ((item.internalGetLayout() & Item.LAYOUT_NEWLINE_BEFORE) != 0);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1178
    }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1179
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1180
    private boolean getItemNewLineAfter(Item item)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1181
    {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1182
        return ((item.internalGetLayout() & Item.LAYOUT_NEWLINE_AFTER) != 0);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1183
    }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1184
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1185
    boolean isItemLayouted(Item item)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1186
    {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1187
        return (getFirstLayoutObjectOfItem(item) != null);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1188
    }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1189
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1190
    /**
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1191
     * Returns if the form is shown.
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1192
     */
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1193
    boolean isFormCurrent()
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1194
    {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1195
        return isCurrent;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1196
    }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1197
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1198
    /**
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1199
     * Returns if the region is partially visible.
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1200
     *
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1201
     * @param viewTop viewPort's top position
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1202
     * @param viewBottom viewPort's bottom position
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1203
     * @return true if visible
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1204
     */
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1205
    boolean isPartiallyVisible(int yTop, int yBottom)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1206
    {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1207
        int vBottomPosition = vPosition + getFormHeight();
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1208
        if((vPosition <= yTop && vBottomPosition <= yTop)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1209
                || (vPosition >= yBottom && vBottomPosition >= yBottom))
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1210
        {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1211
            return false;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1212
        }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1213
        return true;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1214
    }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1215
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1216
    /**
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1217
     * Returns if at least the region's given percentage is visible.
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1218
     */
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1219
    boolean isPartiallyVisible(int yTop, int yBottom, int minPercent)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1220
    {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1221
        int visPercent = getVisibilityPercent(yTop, yBottom);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1222
        if(visPercent > minPercent)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1223
        {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1224
            return true;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1225
        }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1226
        return false;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1227
    }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1228
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1229
    /**
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1230
     * Returns the region's visibility percentage.
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1231
     */
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1232
    int getVisibilityPercent(int yTop, int yBottom)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1233
    {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1234
        if(yTop >= yBottom)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1235
        {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1236
            return 0;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1237
        }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1238
        int vBottomPosition = vPosition + getFormHeight();
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1239
        int r1 = Math.max(vPosition, Math.min(yTop, vBottomPosition));
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1240
        int r2 = Math.min(vBottomPosition, Math.max(yBottom, vPosition));
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1241
        return ((r2 - r1) * 100) / (yBottom - yTop);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1242
    }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1243
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1244
    /**
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1245
     * Returns if the LayoutObject is partially visible.
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1246
     */
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1247
    boolean isPartiallyVisible(LayoutObject lo)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1248
    {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1249
        if(lo != null)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1250
        {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1251
            return isPartiallyVisible(lo.getY(), lo.getY() + lo.getHeight());
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1252
        }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1253
        return false;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1254
    }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1255
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1256
    /**
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1257
     * Returns if at least the LayoutObject's given percentage is visible.
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1258
     */
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1259
    boolean isPartiallyVisible(LayoutObject lo, int minPercent)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1260
    {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1261
        if(lo != null)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1262
        {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1263
            return isPartiallyVisible(lo.getY(), lo.getY() + lo.getHeight(),
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1264
                                      minPercent);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1265
        }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1266
        return false;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1267
    }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1268
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1269
    /**
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1270
     * Returns if the Item is partially visible (if one of its LayoutObjects is
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1271
     * partially visible).
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1272
     *
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1273
     * @param item the Item
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1274
     * @return true if partially visible
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1275
     */
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1276
    boolean isItemPartiallyVisible(Item item)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1277
    {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1278
        if(item != null)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1279
        {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1280
            LayoutObject lo = null;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1281
            while((lo = getNextLayoutObjectOfItem(lo, item)) != null)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1282
            {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1283
                if(isPartiallyVisible(lo))
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1284
                {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1285
                    return true;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1286
                }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1287
            }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1288
        }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1289
        return false;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1290
    }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1291
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1292
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1293
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1294
    /**
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1295
     * Returns true if item is fully visible.
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1296
     *
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1297
     * @param item the Item.
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1298
     * @return true if fully visible.
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1299
     */
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1300
    boolean isItemFullyVisible(Item item)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1301
    {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1302
        if(item != null)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1303
        {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1304
            LayoutObject lo = null;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1305
            while((lo = getNextLayoutObjectOfItem(lo, item)) != null)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1306
            {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1307
                if(!isLOFullyVisible(lo))
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1308
                {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1309
                    return false;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1310
                }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1311
            }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1312
        }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1313
        return true;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1314
    }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1315
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1316
    /**
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1317
     * Returns if the LayoutObject is fully visible.
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1318
     */
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1319
    boolean isLOFullyVisible(LayoutObject lo)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1320
    {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1321
        if(lo != null)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1322
        {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1323
            return isFullyVisible(lo.getY(), lo.getY() + lo.getHeight());
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1324
        }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1325
        return false;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1326
    }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1327
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1328
    /**
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1329
     * Returns if the region is fully visible.
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1330
     *
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1331
     * @param viewTop viewPort's top position
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1332
     * @param viewBottom viewPort's bottom position
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1333
     * @return true if visible
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1334
     */
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1335
    boolean isFullyVisible(int yTop, int yBottom)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1336
    {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1337
        int vBottomPosition = vPosition + getFormHeight();
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1338
        if((vPosition <= yTop && vBottomPosition >= yBottom))
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1339
        {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1340
            return true;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1341
        }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1342
        return false;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1343
    }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1344
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1345
    int getItemTopPosition(Item item)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1346
    {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1347
        LayoutObject lo = getFirstLayoutObjectOfItem(item);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1348
        if(lo != null)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1349
        {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1350
            return lo.getY();
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1351
        }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1352
        return 0;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1353
    }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1354
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1355
    int getItemBottomPosition(Item item)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1356
    {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1357
        LayoutObject lo = getLastLayoutObjectOfItem(item);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1358
        if(lo != null)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1359
        {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1360
            return lo.getY() + lo.getHeight();
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1361
        }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1362
        return 0;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1363
    }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1364
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1365
    int getItemCount()
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1366
    {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1367
        return form.size();
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1368
    }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1369
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1370
    Item getItem(int index)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1371
    {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1372
        try
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1373
        {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1374
            return (Item) form.getItems().elementAt(index);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1375
        }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1376
        catch(ArrayIndexOutOfBoundsException e)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1377
        {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1378
            // Logger.exception(e);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1379
            return null;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1380
        }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1381
    }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1382
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1383
    int getItemIndex(Item item)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1384
    {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1385
        return form.getItems().indexOf(item);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1386
    }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1387
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1388
    int getRowCount()
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1389
    {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1390
        return rows.size();
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1391
    }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1392
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1393
    /**
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1394
     * Return the Row with the given index.
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1395
     *
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1396
     * @param index Row's index
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1397
     * @return a Row
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1398
     */
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1399
    Row getRow(int index)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1400
    {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1401
        try
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1402
        {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1403
            return (Row) rows.elementAt(index);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1404
        }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1405
        catch(ArrayIndexOutOfBoundsException e)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1406
        {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1407
            Logger.exception("getRow", e);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1408
            return null;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1409
        }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1410
    }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1411
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1412
    /**
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1413
     * Return the Row to which the given LayoutObject belongs.
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1414
     *
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1415
     * @param lo LayoutObject
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1416
     * @return the owning Row
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1417
     */
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1418
    Row getRow(LayoutObject lo)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1419
    {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1420
        try
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1421
        {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1422
            return getRow(lo.getRowIdx());
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1423
        }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1424
        catch(NullPointerException e)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1425
        {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1426
            // Logger.exception("getRow", e);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1427
            return null;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1428
        }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1429
    }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1430
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1431
    /**
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1432
     * Returns the last row of the form.
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1433
     */
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1434
    Row getLastRow()
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1435
    {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1436
        try
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1437
        {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1438
            return (Row) rows.lastElement();
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1439
        }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1440
        catch(NoSuchElementException nse)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1441
        {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1442
            // Logger.exception("getLastRow", nse);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1443
            return null;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1444
        }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1445
    }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1446
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1447
    /**
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1448
     * Find last row which contains corresponding Item.
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1449
     *
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1450
     * @param item Item in a Row.
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1451
     * @return Last Row with that item.
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1452
     */
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1453
    Row getLastRowOfItem(Item item)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1454
    {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1455
        return getRow(getLastLayoutObjectOfItem(item));
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1456
    }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1457
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1458
    /**
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1459
     * Get Form which requires layout.
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1460
     *
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1461
     * @return form.
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1462
     */
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1463
    Form getForm()
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1464
    {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1465
        return form;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1466
    }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1467
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1468
    /**
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1469
     * Form's content height.
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1470
     */
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1471
    int getFormHeight()
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1472
    {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1473
        return form.getHeight();
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1474
    }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1475
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1476
    /**
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1477
     * Form's content width.
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1478
     */
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1479
    int getFormWidth()
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1480
    {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1481
        return form.getWidth();
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1482
    }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1483
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1484
    /**
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1485
     * Returns LayoutObject for the given Item.
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1486
     *
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1487
     * @param item Item to layout
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1488
     * @return LayoutObject
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1489
     */
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1490
    LayoutObject getLayoutObject(Item item)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1491
	{
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1492
		int num = layoutObjects.size();
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1493
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1494
		for(int i = 0; i < num; i++)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1495
		{
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1496
			if(((LayoutObject)layoutObjects.elementAt(i)).getOwningItem() == item)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1497
			{
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1498
				LayoutObject lo = (LayoutObject)(layoutObjects.elementAt(i));
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1499
				lo.setRowIdx(-1);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1500
				return lo;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1501
			}
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1502
		}
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1503
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1504
		return null;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1505
	}
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1506
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1507
    /**
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1508
     * Removes Layout Object for the given Item.
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1509
     *
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1510
     * @param item Item to remove LayoutObject
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1511
     */
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1512
    void removeLayoutObject(Item item)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1513
	{
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1514
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1515
		int num = layoutObjects.size();
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1516
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1517
		for(int i = 0; i < num; i++)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1518
		{
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1519
			if(((LayoutObject)layoutObjects.elementAt(i)).getOwningItem() == item)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1520
			{
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1521
				LayoutObject lo = (LayoutObject)(layoutObjects.elementAt(i));
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1522
				layoutObjects.removeElement(lo);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1523
				lo.dispose();
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1524
				break;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1525
			}
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1526
		}
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1527
	}
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1528
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1529
    /**
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1530
     * Removes all Layout Objects from the FormLayouter.
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1531
     */
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1532
    void removeAllLayoutObjects()
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1533
	{
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1534
		Enumeration e = layoutObjects.elements();
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1535
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1536
		while(e.hasMoreElements())
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1537
		{
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1538
			LayoutObject lo = (LayoutObject)e.nextElement();
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1539
			layoutObjects.removeElement(lo);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1540
			lo.dispose();
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1541
		}
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1542
	}
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1543
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1544
    /**
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1545
     * Returns the next LayoutObject belonging to this Item.<br>
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1546
     *
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1547
     * @param lo starting LayoutObject; if null then it start from first.
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1548
     * @param item specifies the parent Item; null means any Item
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1549
     * @return the next LayoutObject in the layout.
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1550
     */
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1551
    LayoutObject getNextLayoutObjectOfItem(LayoutObject lo, Item item)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1552
    {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1553
        int startRow = (lo == null ? 0 : lo.getRowIdx());
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1554
        LayoutObject temp = null;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1555
        for(int i = startRow; i < getRowCount(); i++)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1556
        {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1557
            temp = getRow(i).getNextLayoutObject(lo, item);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1558
            if(temp != null && temp != lo)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1559
            {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1560
                return temp;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1561
            }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1562
        }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1563
        return null;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1564
    }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1565
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1566
    /**
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1567
     * Returns the previous LayoutObject belonging to this Item.<br>
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1568
     *
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1569
     * @param lo starting LayoutObject; if null then it start from last.
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1570
     * @param item specifies the parent Item; null means any Item
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1571
     * @return the previous LayoutObject in the layout.
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1572
     */
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1573
    LayoutObject getPrevLayoutObjectOfItem(LayoutObject lo, Item item)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1574
    {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1575
        int startRow = (lo == null ? rows.size() - 1 : lo.getRowIdx());
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1576
        LayoutObject temp = null;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1577
        for(int i = startRow; i >= 0; i--)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1578
        {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1579
            temp = getRow(i).getPrevLayoutObject(lo, item);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1580
            if(temp != null && temp != lo)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1581
            {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1582
                return temp;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1583
            }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1584
        }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1585
        return null;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1586
    }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1587
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1588
    /**
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1589
     * Returns the first LayoutObject of a layouted item.
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1590
     *
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1591
     * @param item
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1592
     * @return the LO, or NULL if the item is not layouted
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1593
     */
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1594
    LayoutObject getFirstLayoutObjectOfItem(Item item)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1595
    {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1596
        if(item != null)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1597
        {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1598
            return getNextLayoutObjectOfItem(null, item);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1599
        }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1600
        return null;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1601
    }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1602
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1603
    /**
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1604
     * Returns the last LayoutObject of a layouted item.
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1605
     *
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1606
     * @param item
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1607
     * @return the LO, or NULL if the item is not layouted
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1608
     */
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1609
    LayoutObject getLastLayoutObjectOfItem(Item item)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1610
    {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1611
        if(item != null)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1612
        {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1613
            return getPrevLayoutObjectOfItem(null, item);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1614
        }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1615
        return null;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1616
    }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1617
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1618
    /**
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1619
     * Update item state in form.
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1620
     *
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1621
     * @param item
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1622
     * @param updateReason
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1623
     * @param param additional parameter
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1624
     */
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1625
    void updateItemState(Item item, int updateReason, Object param)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1626
    {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1627
        Logger.method(this, "updateItemState", item,
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1628
                      String.valueOf(updateReason), param);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1629
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1630
		LayoutObject lo = getFirstLayoutObjectOfItem(item);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1631
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1632
		if(lo != null)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1633
		{
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1634
			getItemLayouter(item).updateItem(item, lo.getControl(), updateReason,
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1635
										 param);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1636
		}
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1637
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1638
        // Clean reason - without resizing flags
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1639
        int reason = updateReason & Item.UPDATE_SIZE_MASK;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1640
        switch(reason)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1641
        {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1642
        case Item.UPDATE_ADDCOMMAND:
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1643
        {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1644
            if(isFormCurrent() && param != null)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1645
            {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1646
                if(lo != null && param instanceof Command)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1647
                {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1648
                    lo.addCommand((Command) param);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1649
                }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1650
            }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1651
            break;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1652
        }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1653
        case Item.UPDATE_REMOVECOMMAND:
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1654
        {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1655
            if(isFormCurrent() && param != null)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1656
            {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1657
                if(lo != null && param instanceof Command)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1658
                {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1659
                    lo.removeCommand((Command) param);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1660
                }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1661
            }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1662
            break;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1663
        }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1664
        }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1665
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1666
        // Check this always - because this is a flag
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1667
        if((updateReason & Item.UPDATE_HEIGHT_CHANGED)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1668
                == Item.UPDATE_HEIGHT_CHANGED)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1669
        {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1670
            resizeItemAndShift(item);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1671
        }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1672
    }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1673
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1674
    int eswtGetMaxVPosition()
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1675
    {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1676
        return formComposite.getSize().y - getFormHeight();
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1677
    }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1678
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1679
    /**
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1680
     * Called by key Form to compute new vertical coordinate to position form's
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1681
     * content.
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1682
     *
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1683
     * @param swtDir scrolling direction.
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1684
     * @return New vertical position of Form's content.
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1685
     */
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1686
    protected int getNextScrollingPosition(int swtDir)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1687
    {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1688
        boolean scrollDown = (swtDir == SWT.ARROW_DOWN
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1689
                              || swtDir == SWT.ARROW_RIGHT);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1690
        int formHeight = getFormHeight();
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1691
        int refPoint;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1692
        int ret = vPosition;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1693
        if(scrollDown)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1694
        {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1695
            ret += formHeight / 5;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1696
            refPoint = (vPosition + 1) + formHeight;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1697
        }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1698
        else
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1699
        {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1700
            ret -= formHeight / 5;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1701
            refPoint = (vPosition - 1);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1702
        }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1703
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1704
        Row row = null;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1705
        for(int i = 0; i < getRowCount(); i++)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1706
        {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1707
            row = getRow(i);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1708
            if(row.isInsideRow(refPoint)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1709
                    && (row.getRowHeight() < formHeight))
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1710
            {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1711
                if(scrollDown)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1712
                {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1713
                    ret = row.getBottomPosition() - formHeight;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1714
                }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1715
                else
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1716
                {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1717
                    ret = row.getYShift();
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1718
                }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1719
                break;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1720
            }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1721
        }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1722
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1723
        return ret;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1724
    }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1725
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1726
    /**
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1727
     * Set the scrolling to the specified position.<br>
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1728
     * This method also updates the Form's scrollbars.
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1729
     *
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1730
     * @param position new position
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1731
     */
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1732
    void eswtSetScrollingPosition(int position, boolean keyNav)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1733
    {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1734
        // check constraints
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1735
        int newVPosition = position;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1736
        int maxVPos = eswtGetMaxVPosition();
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1737
        newVPosition = Math.min(newVPosition, maxVPos);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1738
        newVPosition = Math.max(newVPosition, 0);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1739
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1740
        vPosition = newVPosition;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1741
        formComposite.setRedraw(false);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1742
        formComposite.setOrigin(0, vPosition, keyNav);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1743
        formComposite.pack();
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1744
        formComposite.setRedraw(true);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1745
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1746
        eswtHandleVisibilityChanges();
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1747
    }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1748
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1749
    /**
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1750
     * Returns the scrolling position.
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1751
     */
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1752
    protected int getScrollingPosition()
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1753
    {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1754
        return vPosition;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1755
    }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1756
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1757
    /**
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1758
     * Updates visibility status of all items.
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1759
     */
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1760
    protected void eswtHandleVisibilityChanges()
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1761
    {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1762
        // Logger.method(this, "eswtHandleVisibilityChanges");
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1763
        boolean shown = false;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1764
        Item item = null;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1765
        LayoutObject lo = null;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1766
        // Go through all LayoutObjects and check/update visibilities
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1767
        while((lo = getNextLayoutObjectOfItem(lo, null)) != null)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1768
        {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1769
            // check if owning item is changing
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1770
            if(lo.getOwningItem() != item)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1771
            {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1772
                if(item != null)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1773
                {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1774
                    // set current item's visibility
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1775
                    getItemLayouter(item).eswtHandleVisibilityChange(item, shown);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1776
                }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1777
                // new item
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1778
                item = lo.getOwningItem();
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1779
                shown = false;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1780
            }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1781
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1782
            // track current item's visibility
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1783
            if(!shown && isFormCurrent() && isPartiallyVisible(lo))
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1784
            {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1785
                shown = true;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1786
            }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1787
        }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1788
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1789
        // call it for last item
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1790
        if(item != null)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1791
        {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1792
            getItemLayouter(item).eswtHandleVisibilityChange(item, shown);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1793
        }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1794
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1795
		eswtCheckCurrentSelectedItem();
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1796
    }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1797
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1798
    /**
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1799
     * Changes item size and does shift of all Rows.
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1800
     *
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1801
     * @param item - item to changeSize.
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1802
     */
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1803
    void resizeItemAndShift(final Item item)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1804
    {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1805
        ESWTUIThreadRunner.syncExec(new Runnable()
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1806
        {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1807
            public void run()
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1808
            {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1809
                int newVPosition = eswtResizeItemAndShift(item);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1810
                if(newVPosition != vPosition)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1811
                {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1812
                    eswtSetScrollingPosition(newVPosition, true);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1813
                }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1814
                else
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1815
                {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1816
                    eswtHandleVisibilityChanges();
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1817
                }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1818
            }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1819
        });
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1820
    }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1821
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1822
    /**
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1823
     * eSWT callback for resizeItemAndShift.
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1824
     *
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1825
     * @param item Item to be resized.
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1826
     * @return new scrolling vPosition
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1827
     */
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1828
    int eswtResizeItemAndShift(Item item)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1829
    {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1830
		// save the state of the last row before resizing and Shifting.
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1831
		boolean itemWasVisible = isItemPartiallyVisible(item);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1832
        Row row = getLastRowOfItem(item);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1833
        int deltaYShift = row.getRowHeight();
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1834
        // if we un-comment this then when we set true,
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1835
        // focus will jump to first item.
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1836
        // eswtUpdateFormComposite(false);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1837
        LayoutObject lo = getFirstLayoutObjectOfItem(item);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1838
        if(lo != null)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1839
        {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1840
            getItemLayouter(item).eswtResizeObject(lo);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1841
        }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1842
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1843
        eswtUpdateRow(row);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1844
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1845
        /*
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1846
        // to avoid double call of updateRowInternals
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1847
        if (row.getNumLayoutObjects(Item.LAYOUT_SHRINK) > 0
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1848
                || row.getNumLayoutObjects(Item.LAYOUT_EXPAND) > 0) {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1849
            eswtUpdateRow(row);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1850
        }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1851
        else {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1852
            row.updateRowInternals();
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1853
        }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1854
        */
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1855
        deltaYShift = row.getRowHeight() - deltaYShift;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1856
        // row's height change - all remaining rows are shifted with this.
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1857
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1858
        Row lastRow = getLastRow();
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1859
        if(row != lastRow)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1860
        {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1861
            for(int i = rows.indexOf(row) + 1; i < getRowCount(); i++)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1862
            {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1863
                row = getRow(i);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1864
                row.setYShift(row.getYShift() + deltaYShift);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1865
                eswtUpdateRow(row);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1866
            }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1867
        }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1868
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1869
        // following code updates scrolling if needed.
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1870
        // need to check where in the form resize happeneed.
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1871
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1872
        int itemRowYShift = getLastRowOfItem(item).getYShift();
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1873
        // vPosition should be changed in syncexec
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1874
        int newVPosition = vPosition;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1875
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1876
        // we need to scroll only if changes happened above the screen.
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1877
        if(newVPosition >= itemRowYShift)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1878
        {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1879
            newVPosition = Math.max(0, newVPosition + deltaYShift);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1880
        }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1881
        // check to avoid gap in the bottom of the form
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1882
        if(newVPosition + getFormHeight() > lastRow.getBottomPosition())
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1883
        {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1884
            newVPosition = Math.max(0,
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1885
                                    lastRow.getBottomPosition() - getFormHeight());
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1886
        }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1887
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1888
        eswtUpdateFormComposite(true);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1889
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1890
        // formComposite.pack();
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1891
        // formComposite.updateScrollbarSize(lastRow.getBottomPosition());
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1892
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1893
		if(item == currentSelectedItem)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1894
		{
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1895
			if(itemWasVisible)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1896
			{
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1897
				int itemTop = getItemTopPosition(item);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1898
				int itemBottom = getItemBottomPosition(item);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1899
				// currentSelectedItem has to be focused if it was focused
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1900
				// before resizing e.g TextField when it is resized by adding a
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1901
				// new row and it was in the bottom of the Screen.
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1902
				if(newVPosition <= itemTop
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1903
						&& (newVPosition + getFormHeight()) >= itemBottom)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1904
				{
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1905
					// do not change vPosition;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1906
				}
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1907
				else if(newVPosition > itemTop)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1908
				{
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1909
					newVPosition = itemTop;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1910
				}
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1911
				else if((newVPosition + getFormHeight()) < itemBottom)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1912
				{
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1913
					newVPosition = itemBottom - getFormHeight();
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1914
				}
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1915
			}
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1916
		}
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1917
		return newVPosition;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1918
    }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1919
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1920
    /**
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1921
     * Gets layouter that can layout the specified item.
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1922
     *
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1923
     * @param item Item to be layouted.
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1924
     * @return ItemLayouter or null if no Layouter found.
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1925
     */
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1926
    protected final ItemLayouter getItemLayouter(Item item)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1927
    {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1928
        if(item instanceof StringItem)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1929
        {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1930
            return sIL;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1931
        }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1932
        else if(item instanceof ImageItem)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1933
        {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1934
            return imIL;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1935
        }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1936
        else if(item instanceof Gauge)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1937
        {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1938
            return gL;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1939
        }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1940
        else if(item instanceof TextField)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1941
        {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1942
            return tfL;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1943
        }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1944
        else if(item instanceof DateField)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1945
        {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1946
            return dfL;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1947
        }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1948
        else if(item instanceof ChoiceGroup)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1949
        {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1950
            return cgL;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1951
        }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1952
        else if(item instanceof CustomItem)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1953
        {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1954
            return ciL;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1955
        }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1956
        else if(item instanceof Spacer)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1957
        {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1958
            return sL;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1959
        }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1960
        return null;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1961
    }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1962
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1963
    /**
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1964
     * Returns eSWT Control that represents the item specified.
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1965
     */
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1966
    Control getItemControl(final Item item)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1967
    {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1968
        final LayoutObject lo = getFirstLayoutObjectOfItem(item);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1969
        if(lo != null)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1970
        {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1971
            ESWTUIThreadRunner.syncExec(new Runnable()
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1972
            {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1973
                public void run()
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1974
                {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1975
                    itemMainControl = getItemLayouter(item)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1976
                                      .eswtFindSpecificControl(item, lo.getControl());
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1977
                }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1978
            });
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1979
            return itemMainControl;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1980
        }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1981
        return null;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1982
    }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1983
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1984
    void updateScrolling(final int value, final boolean keyNav)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1985
    {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1986
        Logger.method("updateScrolling", String.valueOf(value));
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1987
        ESWTUIThreadRunner.syncExec(new Runnable()
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1988
        {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1989
            public void run()
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1990
            {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1991
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1992
                eswtSetScrollingPosition(value, keyNav);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1993
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1994
            }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1995
        });
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1996
    }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1997
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1998
    /**
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  1999
     * Get current scrolling value.
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  2000
     *
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  2001
     * @return vPosition.
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  2002
     */
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  2003
    int getVPosition()
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  2004
    {
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  2005
        return vPosition;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  2006
    }
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  2007
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  2008
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  2009
	private Timer eventTimer = new Timer();
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  2010
	private EventGeneratorTask eventTask;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  2011
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  2012
	/**
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  2013
	 * Reset timer for do layout with a given start index.
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  2014
	 */
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  2015
	private void resetEventTimer(boolean directionUp, int y)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  2016
	{
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  2017
		if(eventTimer != null)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  2018
		{
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  2019
			if(eventTask != null)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  2020
			{
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  2021
				eventTask.cancel();
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  2022
				eventTask = null;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  2023
			}
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  2024
			// schedule new timer
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  2025
			eventTask = new EventGeneratorTask(directionUp, y);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  2026
			eventTimer.schedule(eventTask, Config.DFI_EVENT_TIMER_DELAY);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  2027
		}
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  2028
	}
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  2029
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  2030
	/**
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  2031
	 * Form Timer task. Triggers the formComposite to Layout.
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  2032
	 */
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  2033
	class EventGeneratorTask extends TimerTask
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  2034
	{
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  2035
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  2036
		private boolean isUpDirection;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  2037
		private int localY;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  2038
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  2039
		public EventGeneratorTask(boolean direction, int y)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  2040
		{
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  2041
			isUpDirection = direction;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  2042
			localY = y;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  2043
			Logger.info("y is " + localY);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  2044
		}
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  2045
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  2046
		public void run()
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  2047
		{
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  2048
			if(isUpDirection)
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  2049
			{
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  2050
				localY -= Config.DFI_EVENT_MOVE_DELTA;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  2051
			}
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  2052
			else
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  2053
			{
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  2054
				localY += Config.DFI_EVENT_MOVE_DELTA;
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  2055
			}
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  2056
			handlePointerEvent(0, localY, SWT.MouseMove);
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  2057
		}
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  2058
	}
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  2059
59b3b4473dc8 v2.2.9_1
hgs
parents:
diff changeset
  2060
}