diff -r e8e63152f320 -r 2a9601315dfc javauis/eswt_qt/org.eclipse.swt/Eclipse_SWT_PI/qt/org/eclipse/swt/internal/qt/DesktopCommandPresentationStrategy.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/javauis/eswt_qt/org.eclipse.swt/Eclipse_SWT_PI/qt/org/eclipse/swt/internal/qt/DesktopCommandPresentationStrategy.java Mon May 03 12:27:20 2010 +0300 @@ -0,0 +1,115 @@ +/******************************************************************************* + * Copyright (c) 2008, 2010 Nokia Corporation and/or its subsidiary(-ies). + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Nokia Corporation - initial implementation + *******************************************************************************/ +package org.eclipse.swt.internal.qt; + +import org.eclipse.ercp.swt.mobile.Command; +import org.eclipse.swt.internal.qt.CommandArranger.CommandCollection; +import org.eclipse.swt.widgets.Control; +import org.eclipse.swt.widgets.Internal_PackageSupport; +import org.eclipse.swt.widgets.Shell; +import org.eclipse.swt.widgets.Widget; + +public class DesktopCommandPresentationStrategy extends + CommandPresentationStrategy { + + private int commandsMenu; + private int commandsMenuAction; + private Control previousFocus; + + public DesktopCommandPresentationStrategy(){ + super(); + initCommandsMenu(); + } + + protected void handleCommandListChange(Command added, Command removed, + CommandCollection commands) { + + Shell shell = null; + if ( added != null ){ + shell = added.control.getShell(); + OS.QMenu_addAction(commandsMenu, handle(added) ); + } + else{ + shell = removed.control.getShell(); + OS.QWidget_removeAction(commandsMenu, handle(removed) ); + } + + OS.QMenuBar_addAction(shell.internal_getOwnMenuBar(), commandsMenuAction ); + } + + protected void handleFocusChange(Control focused, + CommandCollection oldCommands, CommandCollection commands) { + Shell shell = focused.getShell(); + + if( oldCommands != null && oldCommands.getSize() >0 ){ + Command[] remove = oldCommands.getCommands(null); + for(int i=0; i< remove.length; i++){ + if (previousFocus!= null && remove[i].control == previousFocus){ + OS.QWidget_removeAction(handle(previousFocus), handle(remove[i])); + }else{ + OS.QWidget_removeAction(commandsMenu, handle(remove[i])); + } + } + } + + if ( commands != null && commands.getSize() > 0 ){ + OS.QMenuBar_addAction(shell.internal_getOwnMenuBar(), commandsMenuAction ); + Command[] add = commands.getCommands(null); + CommandUtils.sort(add); + for(int i=0 ; i < add.length; i++){ + if ( add[i].control != focused ){ + OS.QMenu_addAction( commandsMenu, handle(add[i]) ); + } + else{ + OS.QWidget_addAction(handle(focused), handle(add[i])); + } + if (add[i].isDefaultCommand() )OS.QMenu_setDefaultAction( commandsMenu, handle(add[i]) ); + } + } + //Store for use next time. + previousFocus=focused; + } + + protected void handleMenuBarChanged(int newMenuBar, + CommandCollection commands) { + OS.QMenuBar_addAction(newMenuBar, commandsMenuAction ); + } + + + protected void dispose() { + if (commandsMenu != 0 ){ + QObjectDeleteWrapper.deleteSafely( commandsMenu ); + commandsMenu = 0; + } + if (commandsMenuAction != 0 ){ + QObjectDeleteWrapper.deleteSafely( commandsMenuAction ); + commandsMenuAction = 0; + } + } + + private void initCommandsMenu (){ + commandsMenuAction = OS.QAction_new( 0 ); + OS.QAction_setText( commandsMenuAction, "Commands"); + commandsMenu = OS.QMenu_new( 0 ); + OS.QAction_setMenu( commandsMenuAction, commandsMenu ); + } + + protected void handleDefaultCommandChange(Command defaultCommand) { + int handle = 0; + if (defaultCommand != null ) handle = handle(defaultCommand); + OS.QMenu_setDefaultAction( commandsMenu, handle ); + } + + + private final int handle(Widget w) { + return Internal_PackageSupport.handle(w); + } +}