javauis/eswt_qt/org.eclipse.swt/Eclipse_SWT_PI/qt/org/eclipse/swt/internal/qt/CommandArranger.java
author hgs
Mon, 04 Oct 2010 11:29:25 +0300
changeset 78 71ad690e91f5
parent 35 85266cc22c7f
child 80 d6dafc5d983f
permissions -rw-r--r--
v2.2.17_1
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
21
2a9601315dfc Revision: v2.1.22
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
     1
/*******************************************************************************
2a9601315dfc Revision: v2.1.22
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
     2
 * Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies).
2a9601315dfc Revision: v2.1.22
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
     3
 * All rights reserved. This program and the accompanying materials
2a9601315dfc Revision: v2.1.22
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
     4
 * are made available under the terms of the Eclipse Public License v1.0
2a9601315dfc Revision: v2.1.22
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
     5
 * which accompanies this distribution, and is available at
2a9601315dfc Revision: v2.1.22
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
     6
 * http://www.eclipse.org/legal/epl-v10.html
2a9601315dfc Revision: v2.1.22
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
     7
 *
2a9601315dfc Revision: v2.1.22
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
     8
 * Contributors:
2a9601315dfc Revision: v2.1.22
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
     9
 *     Nokia Corporation - initial implementation
2a9601315dfc Revision: v2.1.22
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    10
 *******************************************************************************/
2a9601315dfc Revision: v2.1.22
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    11
package org.eclipse.swt.internal.qt;
2a9601315dfc Revision: v2.1.22
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    12
2a9601315dfc Revision: v2.1.22
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    13
import org.eclipse.ercp.swt.mobile.Command;
2a9601315dfc Revision: v2.1.22
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    14
import org.eclipse.swt.widgets.Control;
2a9601315dfc Revision: v2.1.22
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    15
import org.eclipse.swt.widgets.Decorations;
2a9601315dfc Revision: v2.1.22
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    16
import org.eclipse.swt.widgets.Display;
78
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
    17
import org.eclipse.swt.widgets.Internal_PackageSupport;
21
2a9601315dfc Revision: v2.1.22
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    18
import org.eclipse.swt.widgets.Menu;
2a9601315dfc Revision: v2.1.22
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    19
import org.eclipse.swt.widgets.Shell;
78
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
    20
import org.eclipse.swt.widgets.Widget;
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
    21
21
2a9601315dfc Revision: v2.1.22
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    22
/**
2a9601315dfc Revision: v2.1.22
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    23
 * Manages the Command presentation cycle. This is a singleton object that gets
2a9601315dfc Revision: v2.1.22
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    24
 * notified about the events that can have an effect on the way the Commands are
2a9601315dfc Revision: v2.1.22
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    25
 * represented. It maintains an ordered list of Commands on the current focus
2a9601315dfc Revision: v2.1.22
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    26
 * context with the help of {@link CommandCollection}. It also notifies the
2a9601315dfc Revision: v2.1.22
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    27
 * currently active {@link CommandPresentationStrategy} so that the presentation
2a9601315dfc Revision: v2.1.22
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    28
 * is updated if necessary.
78
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
    29
 * 
21
2a9601315dfc Revision: v2.1.22
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    30
 * @see Command
2a9601315dfc Revision: v2.1.22
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    31
 * @see CommandCollection
2a9601315dfc Revision: v2.1.22
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    32
 * @see CommandPresentationStrategy
2a9601315dfc Revision: v2.1.22
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    33
 */
2a9601315dfc Revision: v2.1.22
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    34
public class CommandArranger {
2a9601315dfc Revision: v2.1.22
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    35
78
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
    36
/**
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
    37
 * A helper for keeping an ordered list of {@link Command}s in the current focus
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
    38
 * context. The Commands are ordered according to their proximity to the
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
    39
 * currently focused control. The ordered list starts with Commands from the
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
    40
 * currently focused Control if any and ends with the active Shell and includes
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
    41
 * all the Commands in between. If a Control has more than one Command they are
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
    42
 * ordered among themselves according to creation order.
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
    43
 */
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
    44
public class CommandCollection {
21
2a9601315dfc Revision: v2.1.22
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    45
78
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
    46
private Command[] fCommands;
21
2a9601315dfc Revision: v2.1.22
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    47
78
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
    48
CommandCollection() {
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
    49
    super();
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
    50
}
21
2a9601315dfc Revision: v2.1.22
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    51
78
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
    52
/**
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
    53
 * Adds the command to the collection. Warning: This does not make duplicate
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
    54
 * control.
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
    55
 * 
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
    56
 * @param command
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
    57
 */
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
    58
void addCommand(Command command) {
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
    59
    if (command == null)
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
    60
        return;
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
    61
    if (fCommands == null) {
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
    62
        fCommands = new Command[1];
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
    63
        fCommands[0] = command;
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
    64
        return;
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
    65
    }
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
    66
    int size = fCommands.length + 1;
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
    67
    Command[] newList = new Command[size];
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
    68
    // find the insertion point so that the order is correct
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
    69
    int insertPoint = 0;
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
    70
    Shell activeShell = display.getActiveShell();
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
    71
    Control ctrl = display.getFocusControl();
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
    72
    while (ctrl != null && ctrl != activeShell) {
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
    73
        if (ctrl == command.control) {
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
    74
            // Adding a command to focused control increment by one.
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
    75
            // adding Command.internal_getCommands(ctrl).length will
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
    76
            // just duplicate the count for Commands already in array.
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
    77
            insertPoint++;
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
    78
            break;
21
2a9601315dfc Revision: v2.1.22
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    79
        }
78
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
    80
        insertPoint += Command.internal_getCommands(ctrl).length;
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
    81
        ctrl = ctrl.getParent();
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
    82
    }
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
    83
    System.arraycopy(fCommands, 0, newList, 0, insertPoint);
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
    84
    System.arraycopy(fCommands, insertPoint, newList, insertPoint + 1, fCommands.length
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
    85
        - insertPoint);
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
    86
    newList[insertPoint] = command;
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
    87
    fCommands = newList;
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
    88
}
21
2a9601315dfc Revision: v2.1.22
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    89
78
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
    90
/**
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
    91
 * Adds the list of Commands to the collection.
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
    92
 * 
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
    93
 * @param commands
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
    94
 */
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
    95
void addCommand(Command[] commands) {
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
    96
    if (commands == null || commands.length == 0)
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
    97
        return;
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
    98
    if (fCommands == null) {
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
    99
        fCommands = new Command[commands.length];
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   100
        System.arraycopy(commands, 0, fCommands, 0, commands.length);
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   101
        return;
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   102
    }
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   103
    int size = commands.length + fCommands.length;
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   104
    Command[] newList = new Command[size];
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   105
    System.arraycopy(fCommands, 0, newList, 0, fCommands.length);
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   106
    System.arraycopy(commands, 0, newList, fCommands.length, commands.length);
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   107
    fCommands = newList;
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   108
}
21
2a9601315dfc Revision: v2.1.22
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   109
78
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   110
/**
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   111
 * Removes the command from the list.
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   112
 * 
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   113
 * @param command
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   114
 */
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   115
void removeCommand(Command command) {
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   116
    if (command == null)
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   117
        return;
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   118
    if (fCommands == null || fCommands.length == 0)
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   119
        return;
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   120
    int removeIndex = -1;
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   121
    for (int i = 0; i < fCommands.length; i++) {
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   122
        if (fCommands[i] == command) {
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   123
            removeIndex = i;
21
2a9601315dfc Revision: v2.1.22
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   124
        }
78
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   125
    }
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   126
    if (removeIndex == -1)
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   127
        return;
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   128
    Command[] newList = new Command[fCommands.length - 1];
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   129
    System.arraycopy(fCommands, 0, newList, 0, removeIndex);
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   130
    System.arraycopy(fCommands, removeIndex + 1, newList, removeIndex, (fCommands.length
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   131
        - removeIndex - 1));
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   132
    fCommands = newList;
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   133
}
21
2a9601315dfc Revision: v2.1.22
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   134
78
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   135
/**
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   136
 * Returns the number of the Commands
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   137
 * 
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   138
 * @return boolean
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   139
 */
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   140
int getSize() {
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   141
    int size = 0;
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   142
    if (fCommands != null)
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   143
        size = fCommands.length;
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   144
    return size;
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   145
}
21
2a9601315dfc Revision: v2.1.22
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   146
78
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   147
/**
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   148
 * Retrieves the Commands of the types indicated by the commandTypes array. The
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   149
 * order of the commandTypes array has no significance. Passing a null parameter
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   150
 * or an empty array retrieves all the available Commands.
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   151
 * 
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   152
 * @param commandTypes
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   153
 * @return Command list
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   154
 */
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   155
Command[] getCommands(int[] commandTypes) {
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   156
    if (commandTypes == null || commandTypes.length == 0) {
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   157
        return fCommands;
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   158
    }
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   159
    int size = getSize();
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   160
    Command[] filteredCommands = new Command[size];
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   161
    int index = 0;
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   162
    for (int i = 0; i < fCommands.length; i++) {
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   163
        for (int j = 0; j < commandTypes.length; j++) {
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   164
            if (fCommands[i].type == commandTypes[j]) {
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   165
                filteredCommands[index] = fCommands[i];
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   166
                index++;
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   167
                break;
21
2a9601315dfc Revision: v2.1.22
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   168
            }
2a9601315dfc Revision: v2.1.22
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   169
        }
78
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   170
    }
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   171
    if (size > (index)) {// Some commands filtered resize the Array
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   172
        Command[] shrunk = new Command[index];
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   173
        System.arraycopy(filteredCommands, 0, shrunk, 0, index);
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   174
        return shrunk;
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   175
    }
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   176
    return filteredCommands;
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   177
}
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   178
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   179
}// CommandCollection
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   180
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   181
private CommandCollection currentCommands;
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   182
private Command defaultCommand;
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   183
private Display display;
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   184
Control focusedControl;
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   185
Shell lastKnownActiveShell;
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   186
private Command[] positiveKeyCommands;
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   187
private Command negativeKeyCommand;
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   188
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   189
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   190
public CommandArranger(Display display) {
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   191
    super();
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   192
    this.display = display;
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   193
    currentCommands = new CommandCollection();
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   194
}
21
2a9601315dfc Revision: v2.1.22
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   195
78
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   196
/**
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   197
 * Called when the application changes the QMenuBar. This method does not handle
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   198
 * the cases when the QMenuBar may change when the active top-level Shell
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   199
 * changes. Since this does not cause a menu bar change on all platforms.
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   200
 * 
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   201
 * @see org.eclipse.swt.widgets.Decorations#setMenuBar(Menu)
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   202
 * 
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   203
 **/
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   204
public void menuBarChanged(Decorations decorations) {
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   205
    if (currentCommands == null || currentCommands.getSize() < 1)
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   206
        return;
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   207
    // if the changed menu bar is not on the active shell ignore and leave
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   208
    // it to focus change.
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   209
    if (decorations.getShell() != decorations.getDisplay().getActiveShell())
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   210
        return;
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   211
    // Call internal_getOwnMenuBar because the menu bar can be set to null
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   212
    // in Decorations and
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   213
    // we may need to create the internal one.
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   214
    int menuBarHandle = decorations.internal_getOwnMenuBar();
21
2a9601315dfc Revision: v2.1.22
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   215
78
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   216
    handleMenuBarChanged(menuBarHandle, currentCommands);
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   217
}
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   218
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   219
/**
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   220
 * Called when a new Shell becomes active.
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   221
 * 
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   222
 * @see Control#qt_swt_event_focusWasGained() //TODO
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   223
 */
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   224
public void shellActivityChanged() {
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   225
    if (display == null) {
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   226
        return;
21
2a9601315dfc Revision: v2.1.22
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   227
    }
2a9601315dfc Revision: v2.1.22
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   228
78
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   229
    Shell activeShell = display.getActiveShell();
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   230
    
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   231
    if (activeShell == lastKnownActiveShell) {
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   232
        return;
21
2a9601315dfc Revision: v2.1.22
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   233
    }
78
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   234
    lastKnownActiveShell = activeShell;
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   235
    
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   236
    cleanPositiveCommands();
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   237
    cleanNegativeCommand();
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   238
    
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   239
    currentCommands = new CommandCollection();
21
2a9601315dfc Revision: v2.1.22
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   240
78
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   241
    if (activeShell != null && Command.internal_getCommands(activeShell).length > 0) {
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   242
        currentCommands.addCommand(Command.internal_getCommands(activeShell));
21
2a9601315dfc Revision: v2.1.22
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   243
    }
2a9601315dfc Revision: v2.1.22
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   244
78
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   245
    // Determine where the commands go
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   246
    if (currentCommands.getSize() > 0) {
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   247
        Command[] add = currentCommands.getCommands(null);
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   248
        updateCommandPositions(add);
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   249
        placePositiveCommands();
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   250
        placeNegativeCommand();
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   251
    }
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   252
}
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   253
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   254
/**
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   255
 * Called when a new Command is created
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   256
 * 
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   257
 * @param command
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   258
 */
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   259
public void commandAdded(Command command) {
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   260
    if (isInFocusContext(command.control)) {
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   261
        currentCommands.addCommand(command);
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   262
        handleCommandListChange(command, null, currentCommands);
21
2a9601315dfc Revision: v2.1.22
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   263
    }
78
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   264
}
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   265
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   266
/**
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   267
 * Called when a Command is disposed
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   268
 * 
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   269
 * @param command
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   270
 */
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   271
public void commandRemoved(Command command) {
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   272
    if (command == defaultCommand)
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   273
        defaultCommand = null;
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   274
    if (isInFocusContext(command.control)) {
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   275
        currentCommands.removeCommand(command);
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   276
        handleCommandListChange(null, command, currentCommands);
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   277
    }
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   278
}
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   279
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   280
/**
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   281
 * Called when the Display is getting disposed.
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   282
 */
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   283
public void dispose() {
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   284
    currentCommands = null;
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   285
    display = null;
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   286
    positiveKeyCommands = null;
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   287
    negativeKeyCommand = null;
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   288
    defaultCommand = null;
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   289
    lastKnownActiveShell = null;
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   290
}
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   291
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   292
/**
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   293
 * Called when a Command is set default
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   294
 * 
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   295
 * @param command
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   296
 * @see Command#setDefaultCommand();
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   297
 */
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   298
public void setDefaultCommand(Command command) {
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   299
    defaultCommand = command;
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   300
    if (isInFocusContext(command.control)) {
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   301
        handleDefaultCommandChange(command);
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   302
    }
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   303
}
21
2a9601315dfc Revision: v2.1.22
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   304
78
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   305
/**
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   306
 * Returns the default command or null if there is none.
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   307
 * 
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   308
 * @return
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   309
 * @see Command#isDefaultCommand()
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   310
 */
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   311
public Command getDefaultCommand() {
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   312
    return defaultCommand;
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   313
}
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   314
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   315
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   316
private boolean isInFocusContext(Control control) {
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   317
    Display display = control.getDisplay();
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   318
    Shell activeShell = display.getActiveShell();
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   319
    return control == activeShell;
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   320
}
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   321
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   322
private void handleCommandListChange(Command added, Command removed, CommandCollection commands) {
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   323
    cleanNegativeCommand();
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   324
    cleanPositiveCommands();
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   325
    updateCommandPositions(commands.getCommands(null));
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   326
    placeNegativeCommand();
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   327
    placePositiveCommands();
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   328
}
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   329
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   330
private void handleDefaultCommandChange(Command defaultCommand) {
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   331
    this.defaultCommand = defaultCommand;
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   332
    cleanPositiveCommands();
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   333
    placePositiveCommands();
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   334
}
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   335
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   336
private void updateCommandPositions(Command[] commands) {
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   337
    positiveKeyCommands = new Command[commands.length];
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   338
    int positiveKeyIndex = 0;
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   339
    for (int i = 0; i < commands.length; i++) {
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   340
        Command cmd = commands[i];
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   341
        if (cmd.isDefaultCommand()) {
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   342
            defaultCommand = cmd;
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   343
            continue;
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   344
        }
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   345
        if (CommandUtils.isNegativeType(cmd.type)) {
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   346
            if (negativeKeyCommand == null || negativeKeyCommand.isDisposed()) {
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   347
                negativeKeyCommand = cmd;
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   348
            } else if (negativeKeyCommand.getPriority() <= cmd.getPriority()) {
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   349
                positiveKeyCommands[positiveKeyIndex] = negativeKeyCommand;
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   350
                positiveKeyIndex++;
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   351
                negativeKeyCommand = cmd;
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   352
            } else {
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   353
                positiveKeyCommands[positiveKeyIndex] = cmd;
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   354
                positiveKeyIndex++;
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   355
            }
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   356
            continue;
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   357
        }
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   358
        positiveKeyCommands[positiveKeyIndex] = cmd;
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   359
        positiveKeyIndex++;
21
2a9601315dfc Revision: v2.1.22
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   360
    }
78
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   361
    if ((positiveKeyIndex) < positiveKeyCommands.length) {// needs to shrink
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   362
        Command[] rightSized = new Command[positiveKeyIndex];
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   363
        System.arraycopy(positiveKeyCommands, 0, rightSized, 0, rightSized.length);
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   364
        positiveKeyCommands = rightSized;
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   365
    }
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   366
}
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   367
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   368
private void cleanPositiveCommands() {
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   369
    boolean useBar = false;
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   370
    if ((positiveKeyCommands != null && positiveKeyCommands.length > 1)
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   371
        || (defaultCommand != null && positiveKeyCommands != null)) {
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   372
        useBar = true;
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   373
    }
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   374
    if (defaultCommand != null && !defaultCommand.isDisposed()
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   375
        && !defaultCommand.control.isDisposed()) {
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   376
        if (useBar) {
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   377
            OS.QWidget_removeAction(defaultCommand.control.getShell().internal_getOwnMenuBar(),
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   378
                topHandle(defaultCommand));
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   379
        } else {
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   380
            OS.QWidget_removeAction(topHandle(defaultCommand.control), topHandle(defaultCommand));
21
2a9601315dfc Revision: v2.1.22
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   381
        }
2a9601315dfc Revision: v2.1.22
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   382
    }
78
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   383
    if (positiveKeyCommands != null) {
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   384
        for (int i = 0; i < positiveKeyCommands.length; i++) {
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   385
            Command cmd = positiveKeyCommands[i];
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   386
            if (cmd == null || cmd.isDisposed() || cmd.control.isDisposed()) {
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   387
                continue;
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   388
            }
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   389
            int handle = 0;
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   390
            if (useBar) {
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   391
                handle = cmd.control.getShell().internal_getOwnMenuBar();
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   392
            } else {
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   393
                handle = topHandle(positiveKeyCommands[0].control);
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   394
            }
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   395
            OS.QWidget_removeAction(handle, topHandle(cmd));
21
2a9601315dfc Revision: v2.1.22
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   396
2a9601315dfc Revision: v2.1.22
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   397
        }
2a9601315dfc Revision: v2.1.22
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   398
    }
78
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   399
}
21
2a9601315dfc Revision: v2.1.22
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   400
78
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   401
private void cleanNegativeCommand() {
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   402
    if (negativeKeyCommand != null && !negativeKeyCommand.isDisposed()
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   403
        && !negativeKeyCommand.control.isDisposed()) {
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   404
        OS.QWidget_removeAction(topHandle(negativeKeyCommand.control),
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   405
            topHandle(negativeKeyCommand));
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   406
    }
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   407
}
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   408
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   409
private void placeNegativeCommand() {
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   410
    if (negativeKeyCommand != null) {
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   411
        OS.QWidget_addAction(Internal_PackageSupport.topHandle(negativeKeyCommand.control),
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   412
            topHandle(negativeKeyCommand));
21
2a9601315dfc Revision: v2.1.22
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   413
    }
78
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   414
}
21
2a9601315dfc Revision: v2.1.22
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   415
78
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   416
private void placePositiveCommands() {
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   417
    if (defaultCommand != null) {
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   418
        int defaultCmdHandle = topHandle(defaultCommand);
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   419
        if (positiveKeyCommands != null) {
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   420
            OS.QMenuBar_addAction(defaultCommand.control.getShell().internal_getOwnMenuBar(),
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   421
                defaultCmdHandle);
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   422
        } else {
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   423
            OS.QWidget_addAction(Internal_PackageSupport.topHandle(defaultCommand.control),
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   424
                defaultCmdHandle);
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   425
        }
21
2a9601315dfc Revision: v2.1.22
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   426
    }
78
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   427
    if (positiveKeyCommands != null) {
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   428
        if (positiveKeyCommands.length == 1 && defaultCommand == null) {
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   429
            OS.QWidget_addAction(Internal_PackageSupport.topHandle(positiveKeyCommands[0].control),
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   430
                topHandle(positiveKeyCommands[0]));
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   431
        } else {
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   432
            CommandUtils.sort(positiveKeyCommands);
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   433
            for (int i = 0; i < positiveKeyCommands.length; i++) {
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   434
                OS.QMenuBar_addAction(positiveKeyCommands[i].control.getShell()
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   435
                    .internal_getOwnMenuBar(), topHandle(positiveKeyCommands[i]));
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   436
            }
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   437
        }
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   438
    }
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   439
}
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   440
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   441
private void handleMenuBarChanged(int newMenuBar, CommandCollection commands) {
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   442
    placePositiveCommands();
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   443
}
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   444
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   445
private static final int topHandle(Widget w) {
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   446
    return Internal_PackageSupport.topHandle(w);
71ad690e91f5 v2.2.17_1
hgs
parents: 35
diff changeset
   447
}
21
2a9601315dfc Revision: v2.1.22
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   448
2a9601315dfc Revision: v2.1.22
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   449
}