diff options
| author | Andreas Hoegger | 2014-03-05 16:44:42 +0000 |
|---|---|---|
| committer | Andreas Hoegger | 2014-03-06 14:20:24 +0000 |
| commit | 4e8bfce5858c0a150c8aad09ceeab81747c2ddc7 (patch) | |
| tree | d18d987efff7afae2c44c3d62fa01bdeca36d669 | |
| parent | 95f5309098d92c7b054b4bdf9148548cf2cf8142 (diff) | |
| download | org.eclipse.scout.rt-4e8bfce5858c0a150c8aad09ceeab81747c2ddc7.tar.gz org.eclipse.scout.rt-4e8bfce5858c0a150c8aad09ceeab81747c2ddc7.tar.xz org.eclipse.scout.rt-4e8bfce5858c0a150c8aad09ceeab81747c2ddc7.zip | |
bug 422646: Possibility to add Toolbuttons in Form
https://bugs.eclipse.org/bugs/show_bug.cgi?id=422646
Change-Id: I02211d2583b4ee171611dd7729969dc590b569a1
Reviewed-on: https://git.eclipse.org/r/22950
Tested-by: Hudson CI
Reviewed-by: Andreas Hoegger <Andreas.Hoegger@bsiag.com>
IP-Clean: Andreas Hoegger <Andreas.Hoegger@bsiag.com>
95 files changed, 1604 insertions, 1445 deletions
diff --git a/org.eclipse.scout.commons/src/org/eclipse/scout/commons/annotations/ConfigProperty.java b/org.eclipse.scout.commons/src/org/eclipse/scout/commons/annotations/ConfigProperty.java index 1504d69558..ea0daf9923 100644 --- a/org.eclipse.scout.commons/src/org/eclipse/scout/commons/annotations/ConfigProperty.java +++ b/org.eclipse.scout.commons/src/org/eclipse/scout/commons/annotations/ConfigProperty.java @@ -219,4 +219,9 @@ public @interface ConfigProperty { * java.math.RoundingMode */ String ROUNDING_MODE = "ROUNDING_MODE"; + + /** + * int one of [TOOLBAR_FORM_HEADER, TOOLBAR_VIEW_PART] of IForm + */ + String TOOLBAR_LOCATION = "TOOLBAR_LOCATION"; } diff --git a/org.eclipse.scout.rt.client.mobile/src/org/eclipse/scout/rt/client/mobile/ui/action/ActionButtonBarUtility.java b/org.eclipse.scout.rt.client.mobile/src/org/eclipse/scout/rt/client/mobile/ui/action/ActionButtonBarUtility.java index 121d74831c..4974df0aea 100644 --- a/org.eclipse.scout.rt.client.mobile/src/org/eclipse/scout/rt/client/mobile/ui/action/ActionButtonBarUtility.java +++ b/org.eclipse.scout.rt.client.mobile/src/org/eclipse/scout/rt/client/mobile/ui/action/ActionButtonBarUtility.java @@ -15,6 +15,7 @@ import java.util.LinkedList; import java.util.List; import org.eclipse.scout.commons.CollectionUtility; +import org.eclipse.scout.commons.exception.ProcessingException; import org.eclipse.scout.rt.client.mobile.ui.form.IMobileAction; import org.eclipse.scout.rt.client.mobile.ui.form.outline.AutoLeafPageWithNodes; import org.eclipse.scout.rt.client.ui.action.menu.IMenu; @@ -26,7 +27,7 @@ import org.eclipse.scout.rt.client.ui.form.fields.button.IButton; */ public class ActionButtonBarUtility { - public static List<IMobileAction> convertButtonsToActions(List<IButton> buttons) { + public static List<IMobileAction> convertButtonsToActions(List<IButton> buttons) throws ProcessingException { List<IMobileAction> menuList = new ArrayList<IMobileAction>(); for (IButton button : buttons) { IMobileAction action = convertButtonToAction(button); @@ -38,12 +39,14 @@ public class ActionButtonBarUtility { return menuList; } - public static IMobileAction convertButtonToAction(IButton button) { + public static IMobileAction convertButtonToAction(IButton button) throws ProcessingException { if (button == null) { return null; } - return new ButtonWrappingAction(button); + ButtonWrappingAction mAction = new ButtonWrappingAction(button); + mAction.initAction(); + return mAction; } /** diff --git a/org.eclipse.scout.rt.client.mobile/src/org/eclipse/scout/rt/client/mobile/ui/form/AbstractFormActionFetcher.java b/org.eclipse.scout.rt.client.mobile/src/org/eclipse/scout/rt/client/mobile/ui/form/AbstractFormActionFetcher.java index 8fa229d5de..08397e14c8 100644 --- a/org.eclipse.scout.rt.client.mobile/src/org/eclipse/scout/rt/client/mobile/ui/form/AbstractFormActionFetcher.java +++ b/org.eclipse.scout.rt.client.mobile/src/org/eclipse/scout/rt/client/mobile/ui/form/AbstractFormActionFetcher.java @@ -14,8 +14,8 @@ import java.util.Collections; import java.util.List; import org.eclipse.scout.commons.CollectionUtility; +import org.eclipse.scout.commons.exception.ProcessingException; import org.eclipse.scout.rt.client.mobile.ui.action.ActionButtonBarUtility; -import org.eclipse.scout.rt.client.ui.action.menu.IMenu; import org.eclipse.scout.rt.client.ui.form.IForm; import org.eclipse.scout.rt.client.ui.form.fields.button.IButton; @@ -30,11 +30,9 @@ public abstract class AbstractFormActionFetcher implements IActionFetcher { return m_form; } - @Override - public abstract List<IMenu> fetch(); - - protected List<IMobileAction> convertCustomProcessButtons() { + protected List<IMobileAction> convertCustomProcessButtons() throws ProcessingException { List<IButton> customProcessButtons = getForm().getRootGroupBox().getCustomProcessButtons(); + if (CollectionUtility.hasElements(customProcessButtons)) { return ActionButtonBarUtility.convertButtonsToActions(getForm().getRootGroupBox().getCustomProcessButtons()); } diff --git a/org.eclipse.scout.rt.client.mobile/src/org/eclipse/scout/rt/client/mobile/ui/form/FormFooterActionFetcher.java b/org.eclipse.scout.rt.client.mobile/src/org/eclipse/scout/rt/client/mobile/ui/form/FormFooterActionFetcher.java index 36c5b33b11..4bf27ef7f3 100644 --- a/org.eclipse.scout.rt.client.mobile/src/org/eclipse/scout/rt/client/mobile/ui/form/FormFooterActionFetcher.java +++ b/org.eclipse.scout.rt.client.mobile/src/org/eclipse/scout/rt/client/mobile/ui/form/FormFooterActionFetcher.java @@ -13,6 +13,7 @@ package org.eclipse.scout.rt.client.mobile.ui.form; import java.util.LinkedList; import java.util.List; +import org.eclipse.scout.commons.exception.ProcessingException; import org.eclipse.scout.rt.client.ui.action.menu.IMenu; import org.eclipse.scout.rt.client.ui.form.IForm; @@ -28,7 +29,7 @@ public class FormFooterActionFetcher extends AbstractFormActionFetcher { } @Override - public List<IMenu> fetch() { + public List<IMenu> fetch() throws ProcessingException { List<IMenu> formActions = new LinkedList<IMenu>(); if (getForm().getRootGroupBox().getCustomProcessButtonCount() > 0) { List<IMobileAction> leftActions = createLeftFooterActions(); @@ -40,7 +41,7 @@ public class FormFooterActionFetcher extends AbstractFormActionFetcher { return formActions; } - protected List<IMobileAction> createLeftFooterActions() { + protected List<IMobileAction> createLeftFooterActions() throws ProcessingException { return convertCustomProcessButtons(); } diff --git a/org.eclipse.scout.rt.client.mobile/src/org/eclipse/scout/rt/client/mobile/ui/form/FormHeaderActionFetcher.java b/org.eclipse.scout.rt.client.mobile/src/org/eclipse/scout/rt/client/mobile/ui/form/FormHeaderActionFetcher.java index f49700c3c8..7619977f3f 100644 --- a/org.eclipse.scout.rt.client.mobile/src/org/eclipse/scout/rt/client/mobile/ui/form/FormHeaderActionFetcher.java +++ b/org.eclipse.scout.rt.client.mobile/src/org/eclipse/scout/rt/client/mobile/ui/form/FormHeaderActionFetcher.java @@ -18,6 +18,9 @@ import java.util.LinkedList; import java.util.List; import org.eclipse.scout.commons.CollectionUtility; +import org.eclipse.scout.commons.exception.ProcessingException; +import org.eclipse.scout.commons.logger.IScoutLogger; +import org.eclipse.scout.commons.logger.ScoutLogManager; import org.eclipse.scout.rt.client.mobile.ui.action.ActionButtonBarUtility; import org.eclipse.scout.rt.client.mobile.ui.form.fields.button.IMobileButton; import org.eclipse.scout.rt.client.ui.action.menu.IMenu; @@ -32,6 +35,7 @@ import org.eclipse.scout.rt.client.ui.form.fields.button.IButton; * {@link #getRelevantSystemTypesForRightHeader()}) */ public class FormHeaderActionFetcher extends AbstractFormActionFetcher { + private static final IScoutLogger LOG = ScoutLogManager.getLogger(FormHeaderActionFetcher.class); public FormHeaderActionFetcher(IForm form) { super(form); @@ -96,7 +100,12 @@ public class FormHeaderActionFetcher extends AbstractFormActionFetcher { List<IMobileAction> sortedActions = new ArrayList<IMobileAction>(); for (IButton scoutButton : array) { if (relevantSystemTypes.contains(scoutButton.getSystemType())) { - sortedActions.add(ActionButtonBarUtility.convertButtonToAction(scoutButton)); + try { + sortedActions.add(ActionButtonBarUtility.convertButtonToAction(scoutButton)); + } + catch (ProcessingException e) { + LOG.error("could not initialize actions.", e); + } } } return Collections.unmodifiableList(sortedActions); @@ -114,7 +123,12 @@ public class FormHeaderActionFetcher extends AbstractFormActionFetcher { actions.addAll(systemActions); } - actions.addAll(convertCustomProcessButtons()); + try { + actions.addAll(convertCustomProcessButtons()); + } + catch (ProcessingException e) { + LOG.error("could not initialze actions.", e); + } return actions; } diff --git a/org.eclipse.scout.rt.client.mobile/src/org/eclipse/scout/rt/client/mobile/ui/form/IActionFetcher.java b/org.eclipse.scout.rt.client.mobile/src/org/eclipse/scout/rt/client/mobile/ui/form/IActionFetcher.java index 380499e09b..ec11095262 100644 --- a/org.eclipse.scout.rt.client.mobile/src/org/eclipse/scout/rt/client/mobile/ui/form/IActionFetcher.java +++ b/org.eclipse.scout.rt.client.mobile/src/org/eclipse/scout/rt/client/mobile/ui/form/IActionFetcher.java @@ -12,11 +12,12 @@ package org.eclipse.scout.rt.client.mobile.ui.form; import java.util.List; +import org.eclipse.scout.commons.exception.ProcessingException; import org.eclipse.scout.rt.client.ui.action.menu.IMenu; /** * @since 3.9.0 */ public interface IActionFetcher { - List<IMenu> fetch(); + List<IMenu> fetch() throws ProcessingException; } diff --git a/org.eclipse.scout.rt.client.mobile/src/org/eclipse/scout/rt/client/mobile/ui/form/outline/PageFormFooterActionFetcher.java b/org.eclipse.scout.rt.client.mobile/src/org/eclipse/scout/rt/client/mobile/ui/form/outline/PageFormFooterActionFetcher.java index 316e512cfc..914d9680cc 100644 --- a/org.eclipse.scout.rt.client.mobile/src/org/eclipse/scout/rt/client/mobile/ui/form/outline/PageFormFooterActionFetcher.java +++ b/org.eclipse.scout.rt.client.mobile/src/org/eclipse/scout/rt/client/mobile/ui/form/outline/PageFormFooterActionFetcher.java @@ -12,6 +12,7 @@ package org.eclipse.scout.rt.client.mobile.ui.form.outline; import java.util.List; +import org.eclipse.scout.commons.exception.ProcessingException; import org.eclipse.scout.rt.client.mobile.ui.action.ActionButtonBarUtility; import org.eclipse.scout.rt.client.mobile.ui.form.AbstractMobileAction; import org.eclipse.scout.rt.client.mobile.ui.form.FormFooterActionFetcher; @@ -34,7 +35,7 @@ public class PageFormFooterActionFetcher extends FormFooterActionFetcher { } @Override - public List<IMenu> fetch() { + public List<IMenu> fetch() throws ProcessingException { List<IMenu> footerActions = super.fetch(); IPage page = getForm().getPage(); diff --git a/org.eclipse.scout.rt.client.test/META-INF/MANIFEST.MF b/org.eclipse.scout.rt.client.test/META-INF/MANIFEST.MF index 24d6f69a18..e1aed20a6e 100644 --- a/org.eclipse.scout.rt.client.test/META-INF/MANIFEST.MF +++ b/org.eclipse.scout.rt.client.test/META-INF/MANIFEST.MF @@ -7,9 +7,12 @@ Bundle-Vendor: Eclipse Scout Project Fragment-Host: org.eclipse.scout.rt.client;bundle-version="3.10.0" Bundle-RequiredExecutionEnvironment: JavaSE-1.6 Import-Package: org.easymock;version="[2.4.0,3.0.0)", - org.hamcrest.core;version="[1.3.0,2.0.0)", + org.hamcrest.core;version="[1.1.0,2.0.0)", org.junit;version="[4.9.0,5.0.0)", - org.junit.runner;version="[4.9.0,5.0.0)" + org.junit.runner;version="[4.9.0,5.0.0)", + org.junit.runners;version="[4.9.0,5.0.0)", + org.mockito;version="1.9.5", + org.mockito.stubbing;version="1.9.5" Require-Bundle: org.eclipse.scout.rt.testing.shared;bundle-version="[3.10.0,4.1.0)", org.eclipse.scout.rt.testing.client;bundle-version="[3.10.0,4.1.0)", org.eclipse.scout.rt.client.testenvironment;bundle-version="[3.10.0,4.1.0)", diff --git a/org.eclipse.scout.rt.client.test/src/org/eclipse/scout/rt/client/ui/action/ActionTest.java b/org.eclipse.scout.rt.client.test/src/org/eclipse/scout/rt/client/ui/action/ActionTest.java index 275d0236e4..9443424855 100644 --- a/org.eclipse.scout.rt.client.test/src/org/eclipse/scout/rt/client/ui/action/ActionTest.java +++ b/org.eclipse.scout.rt.client.test/src/org/eclipse/scout/rt/client/ui/action/ActionTest.java @@ -11,7 +11,9 @@ package org.eclipse.scout.rt.client.ui.action; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotEquals; +import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import java.util.List; @@ -20,12 +22,17 @@ import org.eclipse.scout.commons.CollectionUtility; import org.eclipse.scout.commons.annotations.ClassId; import org.eclipse.scout.commons.annotations.Replace; import org.eclipse.scout.commons.exception.ProcessingException; +import org.eclipse.scout.commons.holders.IntegerHolder; import org.eclipse.scout.rt.client.ui.action.fixture.TestFormWithTemplateSmartfield; import org.eclipse.scout.rt.client.ui.action.fixture.TestFormWithTemplateSmartfield.MainBox.SmartField1; import org.eclipse.scout.rt.client.ui.action.fixture.TestFormWithTemplateSmartfield.MainBox.SmartField2; import org.eclipse.scout.rt.client.ui.action.menu.AbstractMenu; import org.eclipse.scout.rt.client.ui.action.menu.IMenu; +import org.eclipse.scout.rt.client.ui.desktop.IDesktop; +import org.eclipse.scout.rt.client.ui.desktop.outline.AbstractOutlineViewButton; +import org.eclipse.scout.rt.client.ui.desktop.outline.IOutline; import org.junit.Test; +import org.mockito.Mockito; /** * JUnit tests for {@link AbstractAction} @@ -36,6 +43,42 @@ public class ActionTest { private static final String TEST_CLASS_ID = "TEST_CLASS_ID"; @Test + public void testOutlineButton() throws ProcessingException { + IDesktop desktopMock = Mockito.mock(IDesktop.class); + IOutline outlineMock = Mockito.mock(IOutline.class); + + Mockito.when(desktopMock.getAvailableOutlines()).thenReturn(CollectionUtility.arrayList(outlineMock)); + final IntegerHolder execActionHolder = new IntegerHolder(0); + final IntegerHolder execToggleHolder = new IntegerHolder(0); + AbstractOutlineViewButton b = new AbstractOutlineViewButton(desktopMock, outlineMock.getClass()) { + @Override + protected void execAction() throws ProcessingException { + execActionHolder.setValue(execActionHolder.getValue() + 1); + } + + @Override + protected void execToggleAction(boolean selected) throws ProcessingException { + execToggleHolder.setValue(execToggleHolder.getValue() + 1); + } + }; + b.getUIFacade().fireActionFromUI(); + assertEquals(1, execActionHolder.getValue().intValue()); + assertEquals(1, execToggleHolder.getValue().intValue()); + assertTrue(b.isSelected()); + + b.getUIFacade().fireActionFromUI(); + assertEquals(1, execActionHolder.getValue().intValue()); + assertEquals(1, execToggleHolder.getValue().intValue()); + assertTrue(b.isSelected()); + + b.setSelected(false); + assertEquals(1, execActionHolder.getValue().intValue()); + assertEquals(2, execToggleHolder.getValue().intValue()); + assertFalse(b.isSelected()); + + } + + @Test public void testGetFieldId() { assertEquals("BaseAction", new BaseAction().getActionId()); assertEquals("BaseAction", new ExtendedTestAction().getActionId()); diff --git a/org.eclipse.scout.rt.client.test/src/org/eclipse/scout/rt/client/ui/action/ActionUtilityTest.java b/org.eclipse.scout.rt.client.test/src/org/eclipse/scout/rt/client/ui/action/ActionUtilityTest.java new file mode 100644 index 0000000000..3e43dcffd0 --- /dev/null +++ b/org.eclipse.scout.rt.client.test/src/org/eclipse/scout/rt/client/ui/action/ActionUtilityTest.java @@ -0,0 +1,106 @@ +/******************************************************************************* + * Copyright (c) 2010 BSI Business Systems Integration AG. + * 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: + * BSI Business Systems Integration AG - initial API and implementation + ******************************************************************************/ +package org.eclipse.scout.rt.client.ui.action; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +import java.util.Collections; +import java.util.List; + +import org.easymock.EasyMock; +import org.eclipse.scout.commons.CollectionUtility; +import org.eclipse.scout.rt.client.ui.action.menu.IMenu; +import org.junit.Test; + +/** + * Tests for {@link ActionUtility} + * + * @since 4.0.0-M6 + */ +public class ActionUtilityTest { + + @Test + public void testCleanupWithEmptyList() { + List<IMenu> cleanList = ActionUtility.visibleNormalizedActions(Collections.<IMenu> emptyList()); + assertTrue(cleanList.isEmpty()); + } + + @Test + public void testCleanupWithOnlySeparators() { + IMenu s1 = createMenu("s1", true, true); + IMenu s2 = createMenu("s2", true, true); + IMenu s3 = createMenu("s3", true, true); + List<IMenu> cleanList = ActionUtility.visibleNormalizedActions(CollectionUtility.arrayList(s1, s2, s3)); + assertTrue(cleanList.isEmpty()); + } + + @Test + public void testCleanupWithLeadingSeparators() { + IMenu s1 = createMenu("s1", true, true); + IMenu s2 = createMenu("s2", true, true); + IMenu s3 = createMenu("s3", true, true); + IMenu m4 = createMenu("m4", false, true); + List<IMenu> cleanList = ActionUtility.visibleNormalizedActions(CollectionUtility.arrayList(s1, s2, s3, m4)); + assertEquals(1, cleanList.size()); + assertEquals("m4", cleanList.get(0).getText()); + } + + @Test + public void testCleanupWithEndingSeparators() { + + IMenu s1 = createMenu("s1", true, true); + IMenu s2 = createMenu("s2", true, true); + IMenu s3 = createMenu("s3", true, true); + IMenu m4 = createMenu("m4", false, true); + IMenu s5 = createMenu("s5", true, true); + IMenu s6 = createMenu("s6", true, true); + IMenu s7 = createMenu("s7", true, true); + List<IMenu> cleanList = ActionUtility.visibleNormalizedActions(CollectionUtility.arrayList(s1, s2, s3, m4, s5, s6, s7)); + assertEquals(1, cleanList.size()); + assertEquals("m4", cleanList.get(0).getText()); + } + + @Test + public void testCleanupWithDoubleSeparators() { + IMenu s1 = createMenu("s1", true, true); + IMenu s2 = createMenu("s2", true, true); + IMenu s3 = createMenu("s3", true, true); + IMenu m4 = createMenu("m4", false, true); + IMenu s5 = createMenu("s5", true, true); + IMenu s6 = createMenu("s6", true, true); + IMenu s7 = createMenu("s7", true, true); + IMenu m8 = createMenu("m8", false, true); + List<IMenu> cleanList = ActionUtility.visibleNormalizedActions(CollectionUtility.arrayList(s1, s2, s3, m4, s5, s6, s7, m8)); + assertEquals(3, cleanList.size()); + assertEquals("m4", cleanList.get(0).getText()); + assertEquals("s5", cleanList.get(1).getText()); + assertEquals("m8", cleanList.get(2).getText()); + + } + + private IMenu createMenu(String label, boolean separator, boolean visible) { + IMenu menu = mock(IMenu.class); + when(menu.isVisible()).thenReturn(visible); + when(menu.isSeparator()).thenReturn(separator); + when(menu.getText()).thenReturn(label); + + return menu; + } + + private void setChildMenus(IMenu parentMenu, List<IMenu> childMenus) { + EasyMock.expect(parentMenu.getChildActions()).andReturn(childMenus); + EasyMock.expect(parentMenu.getChildActionCount()).andReturn(childMenus.size()); + } + +} diff --git a/org.eclipse.scout.rt.client.test/src/org/eclipse/scout/rt/client/ui/form/FormWithToolbuttonsFormTest.java b/org.eclipse.scout.rt.client.test/src/org/eclipse/scout/rt/client/ui/form/FormWithToolbuttonsFormTest.java new file mode 100644 index 0000000000..f132e73dfe --- /dev/null +++ b/org.eclipse.scout.rt.client.test/src/org/eclipse/scout/rt/client/ui/form/FormWithToolbuttonsFormTest.java @@ -0,0 +1,124 @@ +/******************************************************************************* + * Copyright (c) 2013 BSI Business Systems Integration AG. + * 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: + * BSI Business Systems Integration AG - initial API and implementation + ******************************************************************************/ +package org.eclipse.scout.rt.client.ui.form; + +import static org.junit.Assert.assertEquals; + +import org.eclipse.scout.commons.annotations.Order; +import org.eclipse.scout.commons.exception.ProcessingException; +import org.eclipse.scout.rt.client.ui.action.tool.AbstractToolButton; +import org.eclipse.scout.rt.client.ui.form.FormWithToolbuttonsFormTest.FormWithToolbuttonsForm.MainBox.CloseButton; +import org.eclipse.scout.rt.client.ui.form.FormWithToolbuttonsFormTest.FormWithToolbuttonsForm.MainBox.GroupBox; +import org.eclipse.scout.rt.client.ui.form.FormWithToolbuttonsFormTest.FormWithToolbuttonsForm.MainBox.GroupBox.DefaultField; +import org.eclipse.scout.rt.client.ui.form.FormWithToolbuttonsFormTest.FormWithToolbuttonsForm.Toolbutton01; +import org.eclipse.scout.rt.client.ui.form.fields.button.AbstractCloseButton; +import org.eclipse.scout.rt.client.ui.form.fields.groupbox.AbstractGroupBox; +import org.eclipse.scout.rt.client.ui.form.fields.stringfield.AbstractStringField; +import org.eclipse.scout.rt.shared.AbstractIcons; +import org.eclipse.scout.rt.shared.TEXTS; +import org.eclipse.scout.testing.client.runner.ScoutClientTestRunner; +import org.junit.Test; +import org.junit.runner.RunWith; + +@RunWith(ScoutClientTestRunner.class) +public class FormWithToolbuttonsFormTest { + + @Test + public void testForm() throws ProcessingException { + FormWithToolbuttonsForm form = new FormWithToolbuttonsForm(); + assertEquals(1, form.getToolbuttons().size()); + assertEquals(Toolbutton01.class.getSimpleName(), form.getToolbuttons().get(0).getClass().getSimpleName()); + } + + public class FormWithToolbuttonsForm extends AbstractForm { + + public FormWithToolbuttonsForm() throws ProcessingException { + super(); + } + + @Override + protected boolean getConfiguredAskIfNeedSave() { + return false; + } + + @Override + protected String getConfiguredTitle() { + return TEXTS.get("StringField"); + } + + public void startPageForm() throws ProcessingException { + startInternal(new PageFormHandler()); + } + + public CloseButton getCloseButton() { + return getFieldByClass(CloseButton.class); + } + + public DefaultField getDefaultField() { + return getFieldByClass(DefaultField.class); + } + + public GroupBox getGroupBox() { + return getFieldByClass(GroupBox.class); + } + + public MainBox getMainBox() { + return getFieldByClass(MainBox.class); + } + + @Order(10.0) + public class MainBox extends AbstractGroupBox { + + @Order(10.0) + public class GroupBox extends AbstractGroupBox { + + @Order(10.0) + public class DefaultField extends AbstractStringField { + + @Override + protected int getConfiguredGridW() { + return 2; + } + + @Override + protected String getConfiguredLabel() { + return TEXTS.get("Default"); + } + } + } + + @Order(30.0) + public class CloseButton extends AbstractCloseButton { + } + } + + @Order(200) + public class Toolbutton01 extends AbstractToolButton { + @Override + protected String getConfiguredText() { + return "Toolbutton"; + } + + @Override + protected String getConfiguredIconId() { + return AbstractIcons.Bookmark; + } + } + + public class PageFormHandler extends AbstractFormHandler { + + @Override + protected void execLoad() throws ProcessingException { + getDefaultField().setValue(TEXTS.get("Lorem")); + } + } + } +} diff --git a/org.eclipse.scout.rt.client.test/src/org/eclipse/scout/rt/client/ui/form/fields/groupbox/internal/GroupBoxLayoutTest01.java b/org.eclipse.scout.rt.client.test/src/org/eclipse/scout/rt/client/ui/form/fields/groupbox/internal/GroupBoxLayoutTest01.java index 9f50e1a033..9dcc67d1f7 100644 --- a/org.eclipse.scout.rt.client.test/src/org/eclipse/scout/rt/client/ui/form/fields/groupbox/internal/GroupBoxLayoutTest01.java +++ b/org.eclipse.scout.rt.client.test/src/org/eclipse/scout/rt/client/ui/form/fields/groupbox/internal/GroupBoxLayoutTest01.java @@ -14,6 +14,7 @@ import static org.junit.Assert.assertEquals; import org.eclipse.scout.commons.annotations.Order; import org.eclipse.scout.rt.client.ui.form.fields.groupbox.AbstractGroupBox; +import org.eclipse.scout.rt.client.ui.form.fields.groupbox.IGroupBoxBodyGrid; import org.eclipse.scout.rt.client.ui.form.fields.groupbox.internal.GroupBoxLayoutTest01.MainBox.Field01; import org.eclipse.scout.rt.client.ui.form.fields.groupbox.internal.GroupBoxLayoutTest01.MainBox.Field02; import org.eclipse.scout.rt.client.ui.form.fields.groupbox.internal.GroupBoxLayoutTest01.MainBox.Field03; diff --git a/org.eclipse.scout.rt.client.test/src/org/eclipse/scout/rt/client/ui/form/fields/groupbox/internal/GroupBoxLayoutTest0100.java b/org.eclipse.scout.rt.client.test/src/org/eclipse/scout/rt/client/ui/form/fields/groupbox/internal/GroupBoxLayoutTest0100.java index 6afb601109..2dea1d80a0 100644 --- a/org.eclipse.scout.rt.client.test/src/org/eclipse/scout/rt/client/ui/form/fields/groupbox/internal/GroupBoxLayoutTest0100.java +++ b/org.eclipse.scout.rt.client.test/src/org/eclipse/scout/rt/client/ui/form/fields/groupbox/internal/GroupBoxLayoutTest0100.java @@ -16,6 +16,7 @@ import org.eclipse.scout.commons.annotations.Order; import org.eclipse.scout.rt.client.ui.form.fields.GridData; import org.eclipse.scout.rt.client.ui.form.fields.button.AbstractCloseButton; import org.eclipse.scout.rt.client.ui.form.fields.groupbox.AbstractGroupBox; +import org.eclipse.scout.rt.client.ui.form.fields.groupbox.IGroupBoxBodyGrid; import org.eclipse.scout.rt.client.ui.form.fields.stringfield.AbstractStringField; import org.junit.Test; diff --git a/org.eclipse.scout.rt.client.test/src/org/eclipse/scout/rt/client/ui/form/fields/groupbox/internal/GroupBoxLayoutTest04.java b/org.eclipse.scout.rt.client.test/src/org/eclipse/scout/rt/client/ui/form/fields/groupbox/internal/GroupBoxLayoutTest04.java index 2b7248da2f..2682965e0b 100644 --- a/org.eclipse.scout.rt.client.test/src/org/eclipse/scout/rt/client/ui/form/fields/groupbox/internal/GroupBoxLayoutTest04.java +++ b/org.eclipse.scout.rt.client.test/src/org/eclipse/scout/rt/client/ui/form/fields/groupbox/internal/GroupBoxLayoutTest04.java @@ -15,6 +15,7 @@ import static org.junit.Assert.assertEquals; import org.eclipse.scout.commons.annotations.Order; import org.eclipse.scout.rt.client.ui.form.fields.button.AbstractCloseButton; import org.eclipse.scout.rt.client.ui.form.fields.groupbox.AbstractGroupBox; +import org.eclipse.scout.rt.client.ui.form.fields.groupbox.IGroupBoxBodyGrid; import org.eclipse.scout.rt.client.ui.form.fields.stringfield.AbstractStringField; import org.junit.Test; diff --git a/org.eclipse.scout.rt.client.test/src/org/eclipse/scout/rt/client/ui/form/fields/groupbox/internal/GroupBoxLayoutTest05.java b/org.eclipse.scout.rt.client.test/src/org/eclipse/scout/rt/client/ui/form/fields/groupbox/internal/GroupBoxLayoutTest05.java index a80b8dffa1..48e6dbc1c0 100644 --- a/org.eclipse.scout.rt.client.test/src/org/eclipse/scout/rt/client/ui/form/fields/groupbox/internal/GroupBoxLayoutTest05.java +++ b/org.eclipse.scout.rt.client.test/src/org/eclipse/scout/rt/client/ui/form/fields/groupbox/internal/GroupBoxLayoutTest05.java @@ -15,6 +15,7 @@ import static org.junit.Assert.assertEquals; import org.eclipse.scout.commons.annotations.Order; import org.eclipse.scout.rt.client.ui.form.fields.button.AbstractCloseButton; import org.eclipse.scout.rt.client.ui.form.fields.groupbox.AbstractGroupBox; +import org.eclipse.scout.rt.client.ui.form.fields.groupbox.IGroupBoxBodyGrid; import org.eclipse.scout.rt.client.ui.form.fields.stringfield.AbstractStringField; import org.junit.Test; diff --git a/org.eclipse.scout.rt.client.test/src/org/eclipse/scout/rt/client/ui/form/fields/groupbox/internal/GroupBoxLayoutTest06.java b/org.eclipse.scout.rt.client.test/src/org/eclipse/scout/rt/client/ui/form/fields/groupbox/internal/GroupBoxLayoutTest06.java index 9237fc98a2..3699b836b7 100644 --- a/org.eclipse.scout.rt.client.test/src/org/eclipse/scout/rt/client/ui/form/fields/groupbox/internal/GroupBoxLayoutTest06.java +++ b/org.eclipse.scout.rt.client.test/src/org/eclipse/scout/rt/client/ui/form/fields/groupbox/internal/GroupBoxLayoutTest06.java @@ -15,6 +15,7 @@ import static org.junit.Assert.assertEquals; import org.eclipse.scout.commons.annotations.Order; import org.eclipse.scout.rt.client.ui.form.fields.button.AbstractCloseButton; import org.eclipse.scout.rt.client.ui.form.fields.groupbox.AbstractGroupBox; +import org.eclipse.scout.rt.client.ui.form.fields.groupbox.IGroupBoxBodyGrid; import org.eclipse.scout.rt.client.ui.form.fields.stringfield.AbstractStringField; import org.junit.Test; diff --git a/org.eclipse.scout.rt.client.test/src/org/eclipse/scout/rt/client/ui/form/fields/groupbox/internal/GroupBoxLayoutTest07.java b/org.eclipse.scout.rt.client.test/src/org/eclipse/scout/rt/client/ui/form/fields/groupbox/internal/GroupBoxLayoutTest07.java index 9773d0703c..871e893769 100644 --- a/org.eclipse.scout.rt.client.test/src/org/eclipse/scout/rt/client/ui/form/fields/groupbox/internal/GroupBoxLayoutTest07.java +++ b/org.eclipse.scout.rt.client.test/src/org/eclipse/scout/rt/client/ui/form/fields/groupbox/internal/GroupBoxLayoutTest07.java @@ -15,6 +15,7 @@ import static org.junit.Assert.assertEquals; import org.eclipse.scout.commons.annotations.Order; import org.eclipse.scout.rt.client.ui.form.fields.button.AbstractCloseButton; import org.eclipse.scout.rt.client.ui.form.fields.groupbox.AbstractGroupBox; +import org.eclipse.scout.rt.client.ui.form.fields.groupbox.IGroupBoxBodyGrid; import org.eclipse.scout.rt.client.ui.form.fields.stringfield.AbstractStringField; import org.junit.Test; diff --git a/org.eclipse.scout.rt.client.test/src/org/eclipse/scout/rt/client/ui/form/fields/groupbox/internal/GroupBoxLayoutTest08.java b/org.eclipse.scout.rt.client.test/src/org/eclipse/scout/rt/client/ui/form/fields/groupbox/internal/GroupBoxLayoutTest08.java index 99381a570a..1869617329 100644 --- a/org.eclipse.scout.rt.client.test/src/org/eclipse/scout/rt/client/ui/form/fields/groupbox/internal/GroupBoxLayoutTest08.java +++ b/org.eclipse.scout.rt.client.test/src/org/eclipse/scout/rt/client/ui/form/fields/groupbox/internal/GroupBoxLayoutTest08.java @@ -16,6 +16,7 @@ import org.eclipse.scout.commons.annotations.Order; import org.eclipse.scout.rt.client.ui.basic.table.AbstractTable; import org.eclipse.scout.rt.client.ui.form.fields.button.AbstractCloseButton; import org.eclipse.scout.rt.client.ui.form.fields.groupbox.AbstractGroupBox; +import org.eclipse.scout.rt.client.ui.form.fields.groupbox.IGroupBoxBodyGrid; import org.eclipse.scout.rt.client.ui.form.fields.tablefield.AbstractTableField; import org.junit.Test; diff --git a/org.eclipse.scout.rt.client.test/src/org/eclipse/scout/rt/client/ui/form/fields/groupbox/internal/GroupBoxLayoutTest09.java b/org.eclipse.scout.rt.client.test/src/org/eclipse/scout/rt/client/ui/form/fields/groupbox/internal/GroupBoxLayoutTest09.java index 37c6fd5983..a3fd883606 100644 --- a/org.eclipse.scout.rt.client.test/src/org/eclipse/scout/rt/client/ui/form/fields/groupbox/internal/GroupBoxLayoutTest09.java +++ b/org.eclipse.scout.rt.client.test/src/org/eclipse/scout/rt/client/ui/form/fields/groupbox/internal/GroupBoxLayoutTest09.java @@ -15,6 +15,7 @@ import static org.junit.Assert.assertEquals; import org.eclipse.scout.commons.annotations.Order; import org.eclipse.scout.rt.client.ui.form.fields.button.AbstractCloseButton; import org.eclipse.scout.rt.client.ui.form.fields.groupbox.AbstractGroupBox; +import org.eclipse.scout.rt.client.ui.form.fields.groupbox.IGroupBoxBodyGrid; import org.eclipse.scout.rt.client.ui.form.fields.stringfield.AbstractStringField; import org.junit.Test; diff --git a/org.eclipse.scout.rt.client.test/src/org/eclipse/scout/rt/client/ui/form/fields/groupbox/internal/GroupBoxLayoutTest10.java b/org.eclipse.scout.rt.client.test/src/org/eclipse/scout/rt/client/ui/form/fields/groupbox/internal/GroupBoxLayoutTest10.java index 688ebd5ec5..a871d38159 100644 --- a/org.eclipse.scout.rt.client.test/src/org/eclipse/scout/rt/client/ui/form/fields/groupbox/internal/GroupBoxLayoutTest10.java +++ b/org.eclipse.scout.rt.client.test/src/org/eclipse/scout/rt/client/ui/form/fields/groupbox/internal/GroupBoxLayoutTest10.java @@ -18,6 +18,7 @@ import org.eclipse.scout.rt.client.ui.form.fields.button.AbstractButton; import org.eclipse.scout.rt.client.ui.form.fields.button.AbstractCloseButton; import org.eclipse.scout.rt.client.ui.form.fields.button.IButton; import org.eclipse.scout.rt.client.ui.form.fields.groupbox.AbstractGroupBox; +import org.eclipse.scout.rt.client.ui.form.fields.groupbox.IGroupBoxBodyGrid; import org.eclipse.scout.rt.client.ui.form.fields.stringfield.AbstractStringField; import org.junit.Test; diff --git a/org.eclipse.scout.rt.client/META-INF/MANIFEST.MF b/org.eclipse.scout.rt.client/META-INF/MANIFEST.MF index 7ea16a8fc7..a8c222b86c 100644 --- a/org.eclipse.scout.rt.client/META-INF/MANIFEST.MF +++ b/org.eclipse.scout.rt.client/META-INF/MANIFEST.MF @@ -13,21 +13,29 @@ Require-Bundle: org.eclipse.core.runtime;bundle-version="[3.4.0,4.0.0)";visibili Import-Package: org.osgi.framework;version="[1.3.0,2.0.0)" Export-Package: org.eclipse.scout.rt.client, org.eclipse.scout.rt.client.busy, + org.eclipse.scout.rt.client.internal, org.eclipse.scout.rt.client.services, org.eclipse.scout.rt.client.services.common.bookmark, + org.eclipse.scout.rt.client.services.common.bookmark.internal, org.eclipse.scout.rt.client.services.common.clientnotification, + org.eclipse.scout.rt.client.services.common.clientnotification.internal, org.eclipse.scout.rt.client.services.common.clipboard, org.eclipse.scout.rt.client.services.common.code, org.eclipse.scout.rt.client.services.common.exceptionhandler, + org.eclipse.scout.rt.client.services.common.exceptionhandler.internal, org.eclipse.scout.rt.client.services.common.file, org.eclipse.scout.rt.client.services.common.icon, org.eclipse.scout.rt.client.services.common.perf, + org.eclipse.scout.rt.client.services.common.perf.internal, org.eclipse.scout.rt.client.services.common.platform, + org.eclipse.scout.rt.client.services.common.prefs, org.eclipse.scout.rt.client.services.common.progress, + org.eclipse.scout.rt.client.services.common.progress.internal, org.eclipse.scout.rt.client.services.common.pwd, org.eclipse.scout.rt.client.services.common.search, org.eclipse.scout.rt.client.services.common.security, org.eclipse.scout.rt.client.services.common.session, + org.eclipse.scout.rt.client.services.common.session.internal, org.eclipse.scout.rt.client.services.common.shell, org.eclipse.scout.rt.client.services.common.spellchecker, org.eclipse.scout.rt.client.services.common.spellchecker.forms, @@ -36,6 +44,7 @@ Export-Package: org.eclipse.scout.rt.client, org.eclipse.scout.rt.client.services.lookup, org.eclipse.scout.rt.client.servicetunnel, org.eclipse.scout.rt.client.servicetunnel.http, + org.eclipse.scout.rt.client.servicetunnel.http.internal, org.eclipse.scout.rt.client.ui, org.eclipse.scout.rt.client.ui.action, org.eclipse.scout.rt.client.ui.action.keystroke, @@ -54,6 +63,7 @@ Export-Package: org.eclipse.scout.rt.client, org.eclipse.scout.rt.client.ui.basic.table.columnfilter, org.eclipse.scout.rt.client.ui.basic.table.columns, org.eclipse.scout.rt.client.ui.basic.table.customizer, + org.eclipse.scout.rt.client.ui.basic.table.internal, org.eclipse.scout.rt.client.ui.basic.table.menus, org.eclipse.scout.rt.client.ui.basic.tree, org.eclipse.scout.rt.client.ui.desktop, @@ -61,7 +71,9 @@ Export-Package: org.eclipse.scout.rt.client, org.eclipse.scout.rt.client.ui.desktop.bookmark.internal, org.eclipse.scout.rt.client.ui.desktop.bookmark.menu, org.eclipse.scout.rt.client.ui.desktop.bookmark.view, + org.eclipse.scout.rt.client.ui.desktop.internal, org.eclipse.scout.rt.client.ui.desktop.navigation, + org.eclipse.scout.rt.client.ui.desktop.navigation.internal, org.eclipse.scout.rt.client.ui.desktop.outline, org.eclipse.scout.rt.client.ui.desktop.outline.pages, org.eclipse.scout.rt.client.ui.form, @@ -88,9 +100,11 @@ Export-Package: org.eclipse.scout.rt.client, org.eclipse.scout.rt.client.ui.form.fields.filechooserfield, org.eclipse.scout.rt.client.ui.form.fields.groupbox, org.eclipse.scout.rt.client.ui.form.fields.groupbox.internal, + org.eclipse.scout.rt.client.ui.form.fields.groupbox.internal.matrix, org.eclipse.scout.rt.client.ui.form.fields.htmlfield, org.eclipse.scout.rt.client.ui.form.fields.imagebox, org.eclipse.scout.rt.client.ui.form.fields.integerfield, + org.eclipse.scout.rt.client.ui.form.fields.internal, org.eclipse.scout.rt.client.ui.form.fields.labelfield, org.eclipse.scout.rt.client.ui.form.fields.listbox, org.eclipse.scout.rt.client.ui.form.fields.longfield, @@ -100,10 +114,14 @@ Export-Package: org.eclipse.scout.rt.client, org.eclipse.scout.rt.client.ui.form.fields.placeholder, org.eclipse.scout.rt.client.ui.form.fields.plannerfield, org.eclipse.scout.rt.client.ui.form.fields.radiobuttongroup, + org.eclipse.scout.rt.client.ui.form.fields.radiobuttongroup.internal, org.eclipse.scout.rt.client.ui.form.fields.sequencebox, + org.eclipse.scout.rt.client.ui.form.fields.sequencebox.internal, org.eclipse.scout.rt.client.ui.form.fields.smartfield, org.eclipse.scout.rt.client.ui.form.fields.snapbox, + org.eclipse.scout.rt.client.ui.form.fields.snapbox.internal, org.eclipse.scout.rt.client.ui.form.fields.splitbox, + org.eclipse.scout.rt.client.ui.form.fields.splitbox.internal, org.eclipse.scout.rt.client.ui.form.fields.stringfield, org.eclipse.scout.rt.client.ui.form.fields.tabbox, org.eclipse.scout.rt.client.ui.form.fields.tabbox.internal;x-friends:="com.bsiag.bsicase.designer", diff --git a/org.eclipse.scout.rt.client/src/org/eclipse/scout/rt/client/ui/action/AbstractAction.java b/org.eclipse.scout.rt.client/src/org/eclipse/scout/rt/client/ui/action/AbstractAction.java index e7fe8f0524..bbd579c606 100644 --- a/org.eclipse.scout.rt.client/src/org/eclipse/scout/rt/client/ui/action/AbstractAction.java +++ b/org.eclipse.scout.rt.client/src/org/eclipse/scout/rt/client/ui/action/AbstractAction.java @@ -64,16 +64,19 @@ public abstract class AbstractAction extends AbstractPropertyObserver implements protected void callInitializer() { if (!m_initialized) { initConfig(); - try { - execInitAction(); - } - catch (Throwable t) { - LOG.warn("Action " + getClass().getName(), t); - } m_initialized = true; } } + /** + * This is the init of the runtime model after the environment (form, fields, ..) are built + * and configured + */ + @Override + public final void initAction() throws ProcessingException { + execInitAction(); + } + /* * Configuration */ @@ -268,8 +271,7 @@ public abstract class AbstractAction extends AbstractPropertyObserver implements if (isEnabled() && isVisible()) { try { setEnabledProcessingAction(false); - - execAction(); + doActionInternal(); } finally { setEnabledProcessingAction(true); @@ -277,6 +279,19 @@ public abstract class AbstractAction extends AbstractPropertyObserver implements } } + /** + * Please double check if implementing this method! + * Consider using {@link #execAction()} instead. If no other option ensure super call when overriding this method. + * + * @throws ProcessingException + */ + protected void doActionInternal() throws ProcessingException { + if (isToggleAction()) { + setSelected(!isSelected()); + } + execAction(); + } + @Override public String getIconId() { return propertySupport.getPropertyString(PROP_ICON_ID); @@ -407,8 +422,7 @@ public abstract class AbstractAction extends AbstractPropertyObserver implements @Override public void setSelected(boolean b) { - boolean changed = propertySupport.setPropertyBool(PROP_SELECTED, b); - if (changed) { + if (setSelectedInternal(b)) { try { execToggleAction(b); } @@ -418,6 +432,10 @@ public abstract class AbstractAction extends AbstractPropertyObserver implements } } + protected boolean setSelectedInternal(boolean b) { + return propertySupport.setPropertyBool(PROP_SELECTED, b); + } + @Override public boolean isToggleAction() { return m_toggleAction; @@ -643,6 +661,7 @@ public abstract class AbstractAction extends AbstractPropertyObserver implements } } + @SuppressWarnings("deprecation") @Override public void setSelectedFromUI(boolean b) { setSelected(b); diff --git a/org.eclipse.scout.rt.client/src/org/eclipse/scout/rt/client/ui/action/ActionUtility.java b/org.eclipse.scout.rt.client/src/org/eclipse/scout/rt/client/ui/action/ActionUtility.java new file mode 100644 index 0000000000..f3b68fda7c --- /dev/null +++ b/org.eclipse.scout.rt.client/src/org/eclipse/scout/rt/client/ui/action/ActionUtility.java @@ -0,0 +1,121 @@ +/******************************************************************************* + * Copyright (c) 2010 BSI Business Systems Integration AG. + * 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: + * BSI Business Systems Integration AG - initial API and implementation + ******************************************************************************/ +package org.eclipse.scout.rt.client.ui.action; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.ListIterator; + +import org.eclipse.scout.commons.exception.ProcessingException; + +/** + * + */ +public final class ActionUtility { + + /** + * Removes invisible actions. Also removes leading and trailing separators as well as multiple consecutive separators. + * + * @since 3.8.1 + */ + public static <T extends IAction> List<T> visibleNormalizedActions(List<T> actionNodes) { + if (actionNodes == null) { + return Collections.emptyList(); + } + + // only visible + ArrayList<T> cleanedActions = getVisibleActions(actionNodes); + + // remove multiple and leading separators + T prevSeparator = null; + T prevAction = null; + ListIterator<T> it = cleanedActions.listIterator(); + while (it.hasNext()) { + T actionNode = it.next(); + + if (actionNode.isSeparator()) { + if (prevAction == null || prevSeparator != null) { + // remove leading + it.remove(); + } + prevAction = null; + prevSeparator = actionNode; + } + else { + prevSeparator = null; + prevAction = actionNode; + } + } + // remove ending separators + while (it.hasPrevious()) { + T previous = it.previous(); + if (previous.isSeparator()) { + it.remove(); + + } + else { + break; + } + } + + return cleanedActions; + } + + public static <T extends IAction> ArrayList<T> getVisibleActions(List<T> actions) { + ArrayList<T> result = new ArrayList<T>(); + if (actions != null) { + for (T a : actions) { + if (a.isVisible()) { + result.add(a); + } + } + } + return result; + } + + public static void initActions(List<? extends IAction> actions) throws ProcessingException { + InitActionVisitor v = new InitActionVisitor(); + for (IAction a : actions) { + a.acceptVisitor(v); + } + v.handleResult(); + } + + private static class InitActionVisitor implements IActionVisitor { + private ProcessingException m_firstEx; + + @Override + public int visit(IAction action) { + try { + action.initAction(); + } + catch (ProcessingException e) { + if (m_firstEx == null) { + m_firstEx = e; + } + } + catch (Throwable t) { + if (m_firstEx == null) { + m_firstEx = new ProcessingException("Unexpected", t); + } + } + return CONTINUE; + } + + public void handleResult() throws ProcessingException { + if (m_firstEx != null) { + throw m_firstEx; + } + } + } + +} diff --git a/org.eclipse.scout.rt.client/src/org/eclipse/scout/rt/client/ui/action/IAction.java b/org.eclipse.scout.rt.client/src/org/eclipse/scout/rt/client/ui/action/IAction.java index c84ac15c8e..6fa106bed0 100644 --- a/org.eclipse.scout.rt.client/src/org/eclipse/scout/rt/client/ui/action/IAction.java +++ b/org.eclipse.scout.rt.client/src/org/eclipse/scout/rt/client/ui/action/IAction.java @@ -43,6 +43,11 @@ public interface IAction extends IPropertyObserver, ITypeWithClassId { String PROP_SEPARATOR = "separator"; /** + * @throws ProcessingException + */ + void initAction() throws ProcessingException; + + /** * called to perform action */ void doAction() throws ProcessingException; diff --git a/org.eclipse.scout.rt.client/src/org/eclipse/scout/rt/client/ui/action/IActionUIFacade.java b/org.eclipse.scout.rt.client/src/org/eclipse/scout/rt/client/ui/action/IActionUIFacade.java index 13daa5902e..2715bf25bb 100644 --- a/org.eclipse.scout.rt.client/src/org/eclipse/scout/rt/client/ui/action/IActionUIFacade.java +++ b/org.eclipse.scout.rt.client/src/org/eclipse/scout/rt/client/ui/action/IActionUIFacade.java @@ -4,7 +4,7 @@ * 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: * BSI Business Systems Integration AG - initial API and implementation ******************************************************************************/ @@ -12,6 +12,10 @@ package org.eclipse.scout.rt.client.ui.action; public interface IActionUIFacade { + /** + * use {@link #fireActionFromUI()} instead + */ + @Deprecated void setSelectedFromUI(boolean b); void fireActionFromUI(); diff --git a/org.eclipse.scout.rt.client/src/org/eclipse/scout/rt/client/ui/action/menu/MenuUtility.java b/org.eclipse.scout.rt.client/src/org/eclipse/scout/rt/client/ui/action/menu/MenuUtility.java index a5d8302065..303b3e949b 100644 --- a/org.eclipse.scout.rt.client/src/org/eclipse/scout/rt/client/ui/action/menu/MenuUtility.java +++ b/org.eclipse.scout.rt.client/src/org/eclipse/scout/rt/client/ui/action/menu/MenuUtility.java @@ -16,6 +16,9 @@ import java.util.HashSet; import java.util.List; import java.util.Set; +import org.eclipse.scout.commons.exception.ProcessingException; +import org.eclipse.scout.commons.logger.IScoutLogger; +import org.eclipse.scout.commons.logger.ScoutLogManager; import org.eclipse.scout.rt.client.ui.action.keystroke.IKeyStroke; import org.eclipse.scout.rt.client.ui.action.keystroke.KeyStroke; @@ -25,6 +28,8 @@ import org.eclipse.scout.rt.client.ui.action.keystroke.KeyStroke; * @since 3.10.0-M4 */ public final class MenuUtility { + private static final IScoutLogger LOG = ScoutLogManager.getLogger(MenuUtility.class); + /** * Collects all keyStrokes from an array of menus * @@ -37,9 +42,15 @@ public final class MenuUtility { for (IMenu m : menu) { String s = m.getKeyStroke(); if (s != null && s.trim().length() > 0) { - KeyStroke ks = new KeyStroke(s, m); - if (keys.add(ks.getKeyStroke())) { - keyStrokes.add(ks); + try { + KeyStroke ks = new KeyStroke(s, m); + ks.initAction(); + if (keys.add(ks.getKeyStroke())) { + keyStrokes.add(ks); + } + } + catch (ProcessingException e) { + LOG.error("could not initialize enter key stroke.", e); } } } diff --git a/org.eclipse.scout.rt.client/src/org/eclipse/scout/rt/client/ui/action/menu/checkbox/AbstractCheckBoxMenu.java b/org.eclipse.scout.rt.client/src/org/eclipse/scout/rt/client/ui/action/menu/checkbox/AbstractCheckBoxMenu.java index 410682320f..80d1467914 100644 --- a/org.eclipse.scout.rt.client/src/org/eclipse/scout/rt/client/ui/action/menu/checkbox/AbstractCheckBoxMenu.java +++ b/org.eclipse.scout.rt.client/src/org/eclipse/scout/rt/client/ui/action/menu/checkbox/AbstractCheckBoxMenu.java @@ -4,7 +4,7 @@ * 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: * BSI Business Systems Integration AG - initial API and implementation ******************************************************************************/ @@ -14,6 +14,8 @@ import org.eclipse.scout.rt.client.ui.action.menu.AbstractMenu; public abstract class AbstractCheckBoxMenu extends AbstractMenu implements ICheckBoxMenu { + private boolean m_supportedChangeToggleBehaviour; + public AbstractCheckBoxMenu() { super(); } @@ -22,13 +24,32 @@ public abstract class AbstractCheckBoxMenu extends AbstractMenu implements IChec super(callInitializer); } - /* - * Runtime - */ + @Override + protected void initConfig() { + // enable setToggleAction for super init + try { + m_supportedChangeToggleBehaviour = true; + super.initConfig(); + } + finally { + m_supportedChangeToggleBehaviour = false; + } + } + + @Override + protected final boolean getConfiguredToggleAction() { + return true; + } @Override - protected void execAction() { - setSelected(!isSelected()); + public final void setToggleAction(boolean b) { + if (m_supportedChangeToggleBehaviour) { + super.setToggleAction(b); + } + else { + throw new UnsupportedOperationException("setToggleAction on " + AbstractCheckBoxMenu.class.getSimpleName() + " is not supported!"); + } + // void here } } diff --git a/org.eclipse.scout.rt.client/src/org/eclipse/scout/rt/client/ui/basic/activitymap/AbstractActivityMap.java b/org.eclipse.scout.rt.client/src/org/eclipse/scout/rt/client/ui/basic/activitymap/AbstractActivityMap.java index 5bc3e018fc..0fe4b0ec49 100644 --- a/org.eclipse.scout.rt.client/src/org/eclipse/scout/rt/client/ui/basic/activitymap/AbstractActivityMap.java +++ b/org.eclipse.scout.rt.client/src/org/eclipse/scout/rt/client/ui/basic/activitymap/AbstractActivityMap.java @@ -40,6 +40,7 @@ import org.eclipse.scout.commons.beans.AbstractPropertyObserver; import org.eclipse.scout.commons.exception.ProcessingException; import org.eclipse.scout.commons.logger.IScoutLogger; import org.eclipse.scout.commons.logger.ScoutLogManager; +import org.eclipse.scout.rt.client.ui.action.ActionUtility; import org.eclipse.scout.rt.client.ui.action.menu.IMenu; import org.eclipse.scout.rt.shared.services.common.exceptionhandler.IExceptionHandlerService; import org.eclipse.scout.service.SERVICES; @@ -333,6 +334,8 @@ public abstract class AbstractActivityMap<RI, AI> extends AbstractPropertyObserv public final void initActivityMap() throws ProcessingException { initActivityMapInternal(); execInitActivityMap(); + // init actions + ActionUtility.initActions(getMenus()); } protected void initActivityMapInternal() throws ProcessingException { diff --git a/org.eclipse.scout.rt.client/src/org/eclipse/scout/rt/client/ui/basic/calendar/AbstractCalendar.java b/org.eclipse.scout.rt.client/src/org/eclipse/scout/rt/client/ui/basic/calendar/AbstractCalendar.java index 21695c5c5c..1140559fc8 100644 --- a/org.eclipse.scout.rt.client/src/org/eclipse/scout/rt/client/ui/basic/calendar/AbstractCalendar.java +++ b/org.eclipse.scout.rt.client/src/org/eclipse/scout/rt/client/ui/basic/calendar/AbstractCalendar.java @@ -39,6 +39,7 @@ import org.eclipse.scout.commons.beans.AbstractPropertyObserver; import org.eclipse.scout.commons.exception.ProcessingException; import org.eclipse.scout.commons.logger.IScoutLogger; import org.eclipse.scout.commons.logger.ScoutLogManager; +import org.eclipse.scout.rt.client.ui.action.ActionUtility; import org.eclipse.scout.rt.client.ui.action.menu.IMenu; import org.eclipse.scout.rt.client.ui.basic.calendar.provider.ICalendarItemProvider; import org.eclipse.scout.rt.client.ui.basic.cell.Cell; @@ -185,7 +186,7 @@ public abstract class AbstractCalendar extends AbstractPropertyObserver implemen setMarkOutOfMonthDays(getConfiguredMarkOutOfMonthDays()); // menus - ArrayList<IMenu> menuList = new ArrayList<IMenu>(); + List<IMenu> menuList = new ArrayList<IMenu>(); for (Class<? extends IMenu> menuClazz : getConfiguredMenus()) { try { IMenu menu = ConfigurationUtility.newInnerInstance(this, menuClazz); @@ -251,6 +252,8 @@ public abstract class AbstractCalendar extends AbstractPropertyObserver implemen */ @Override public void initCalendar() throws ProcessingException { + // init menus + ActionUtility.initActions(getMenus()); execInitCalendar(); /* * add property change listener to - reload calendar items when view range diff --git a/org.eclipse.scout.rt.client/src/org/eclipse/scout/rt/client/ui/basic/calendar/provider/AbstractCalendarItemProvider.java b/org.eclipse.scout.rt.client/src/org/eclipse/scout/rt/client/ui/basic/calendar/provider/AbstractCalendarItemProvider.java index 02283155e1..59693143d5 100644 --- a/org.eclipse.scout.rt.client/src/org/eclipse/scout/rt/client/ui/basic/calendar/provider/AbstractCalendarItemProvider.java +++ b/org.eclipse.scout.rt.client/src/org/eclipse/scout/rt/client/ui/basic/calendar/provider/AbstractCalendarItemProvider.java @@ -156,7 +156,9 @@ public abstract class AbstractCalendarItemProvider extends AbstractPropertyObser List<IMenu> menuList = new ArrayList<IMenu>(); for (Class<? extends IMenu> menuClazz : getConfiguredMenus()) { try { - menuList.add(ConfigurationUtility.newInnerInstance(this, menuClazz)); + IMenu menu = ConfigurationUtility.newInnerInstance(this, menuClazz); + menu.initAction(); + menuList.add(menu); } catch (Exception e) { LOG.warn(null, e); diff --git a/org.eclipse.scout.rt.client/src/org/eclipse/scout/rt/client/ui/basic/table/AbstractTable.java b/org.eclipse.scout.rt.client/src/org/eclipse/scout/rt/client/ui/basic/table/AbstractTable.java index d19751b508..97ba85c4ca 100644 --- a/org.eclipse.scout.rt.client/src/org/eclipse/scout/rt/client/ui/basic/table/AbstractTable.java +++ b/org.eclipse.scout.rt.client/src/org/eclipse/scout/rt/client/ui/basic/table/AbstractTable.java @@ -53,6 +53,7 @@ import org.eclipse.scout.rt.client.ui.ClientUIPreferences; import org.eclipse.scout.rt.client.ui.IDNDSupport; import org.eclipse.scout.rt.client.ui.IEventHistory; import org.eclipse.scout.rt.client.ui.action.ActionFinder; +import org.eclipse.scout.rt.client.ui.action.ActionUtility; import org.eclipse.scout.rt.client.ui.action.keystroke.IKeyStroke; import org.eclipse.scout.rt.client.ui.action.keystroke.KeyStroke; import org.eclipse.scout.rt.client.ui.action.menu.IMenu; @@ -977,6 +978,7 @@ public abstract class AbstractTable extends AbstractPropertyObserver implements setTableChanging(true); // initTableInternal(); + ActionUtility.initActions(getMenus()); execInitTable(); } finally { diff --git a/org.eclipse.scout.rt.client/src/org/eclipse/scout/rt/client/ui/basic/tree/AbstractTree.java b/org.eclipse.scout.rt.client/src/org/eclipse/scout/rt/client/ui/basic/tree/AbstractTree.java index d08c33fa9b..39871d9298 100644 --- a/org.eclipse.scout.rt.client/src/org/eclipse/scout/rt/client/ui/basic/tree/AbstractTree.java +++ b/org.eclipse.scout.rt.client/src/org/eclipse/scout/rt/client/ui/basic/tree/AbstractTree.java @@ -37,6 +37,7 @@ import org.eclipse.scout.commons.logger.IScoutLogger; import org.eclipse.scout.commons.logger.ScoutLogManager; import org.eclipse.scout.rt.client.ui.IEventHistory; import org.eclipse.scout.rt.client.ui.action.ActionFinder; +import org.eclipse.scout.rt.client.ui.action.ActionUtility; import org.eclipse.scout.rt.client.ui.action.keystroke.IKeyStroke; import org.eclipse.scout.rt.client.ui.action.keystroke.KeyStroke; import org.eclipse.scout.rt.client.ui.action.menu.IMenu; @@ -434,6 +435,7 @@ public abstract class AbstractTree extends AbstractPropertyObserver implements I @Override public final void initTree() throws ProcessingException { initTreeInternal(); + ActionUtility.initActions(getMenus()); execInitTree(); } @@ -742,8 +744,14 @@ public abstract class AbstractTree extends AbstractPropertyObserver implements I List<IKeyStroke> ksList = new ArrayList<IKeyStroke>(m_baseKeyStrokes); for (IMenu menu : menus) { if (menu.getKeyStroke() != null) { - IKeyStroke ks = new KeyStroke(menu.getKeyStroke(), menu); - ksList.add(ks); + try { + IKeyStroke ks = new KeyStroke(menu.getKeyStroke(), menu); + ks.initAction(); + ksList.add(ks); + } + catch (ProcessingException e) { + LOG.error("could not initialize key stroke '" + menu.getKeyStroke() + "'", e); + } } } diff --git a/org.eclipse.scout.rt.client/src/org/eclipse/scout/rt/client/ui/basic/tree/AbstractTreeNode.java b/org.eclipse.scout.rt.client/src/org/eclipse/scout/rt/client/ui/basic/tree/AbstractTreeNode.java index f4bd94ac52..476a2baa83 100644 --- a/org.eclipse.scout.rt.client/src/org/eclipse/scout/rt/client/ui/basic/tree/AbstractTreeNode.java +++ b/org.eclipse.scout.rt.client/src/org/eclipse/scout/rt/client/ui/basic/tree/AbstractTreeNode.java @@ -27,6 +27,7 @@ import org.eclipse.scout.commons.exception.ProcessingException; import org.eclipse.scout.commons.logger.IScoutLogger; import org.eclipse.scout.commons.logger.ScoutLogManager; import org.eclipse.scout.rt.client.ui.action.ActionFinder; +import org.eclipse.scout.rt.client.ui.action.ActionUtility; import org.eclipse.scout.rt.client.ui.action.menu.IMenu; import org.eclipse.scout.rt.client.ui.basic.cell.Cell; import org.eclipse.scout.rt.client.ui.basic.cell.ICell; @@ -218,6 +219,13 @@ public abstract class AbstractTreeNode implements ITreeNode, ICellObserver { */ @Override public void initTreeNode() { + // init menus + try { + ActionUtility.initActions(getMenus()); + } + catch (ProcessingException e) { + LOG.error("could not initialize actions.", e); + } execInitTreeNode(); } diff --git a/org.eclipse.scout.rt.client/src/org/eclipse/scout/rt/client/ui/basic/tree/ITreeNode.java b/org.eclipse.scout.rt.client/src/org/eclipse/scout/rt/client/ui/basic/tree/ITreeNode.java index 8338b5da7b..ba2557d211 100644 --- a/org.eclipse.scout.rt.client/src/org/eclipse/scout/rt/client/ui/basic/tree/ITreeNode.java +++ b/org.eclipse.scout.rt.client/src/org/eclipse/scout/rt/client/ui/basic/tree/ITreeNode.java @@ -31,7 +31,7 @@ public interface ITreeNode { int STATUS_UPDATED = 2; int STATUS_DELETED = 3; - void initTreeNode(); + void initTreeNode() throws ProcessingException; String getNodeId(); diff --git a/org.eclipse.scout.rt.client/src/org/eclipse/scout/rt/client/ui/desktop/AbstractDesktop.java b/org.eclipse.scout.rt.client/src/org/eclipse/scout/rt/client/ui/desktop/AbstractDesktop.java index d347e64739..9d6840fbb7 100644 --- a/org.eclipse.scout.rt.client/src/org/eclipse/scout/rt/client/ui/desktop/AbstractDesktop.java +++ b/org.eclipse.scout.rt.client/src/org/eclipse/scout/rt/client/ui/desktop/AbstractDesktop.java @@ -44,6 +44,7 @@ import org.eclipse.scout.rt.client.ClientSyncJob; import org.eclipse.scout.rt.client.services.common.bookmark.internal.BookmarkUtility; import org.eclipse.scout.rt.client.ui.DataChangeListener; import org.eclipse.scout.rt.client.ui.action.ActionFinder; +import org.eclipse.scout.rt.client.ui.action.ActionUtility; import org.eclipse.scout.rt.client.ui.action.IAction; import org.eclipse.scout.rt.client.ui.action.keystroke.IKeyStroke; import org.eclipse.scout.rt.client.ui.action.keystroke.KeyStroke; @@ -449,6 +450,7 @@ public abstract class AbstractDesktop extends AbstractPropertyObserver implement if (menu.getKeyStroke() != null) { try { IKeyStroke ks = new KeyStroke(menu.getKeyStroke(), menu); + ks.initAction(); actionList.add(ks); } catch (Throwable t) { @@ -465,6 +467,14 @@ public abstract class AbstractDesktop extends AbstractPropertyObserver implement m_toolButtons = CollectionUtility.arrayList(ConfigurationUtility.sortByOrder(toolButtonList).toArray(new IToolButton[toolButtonList.size()])); //add dynamic keyStrokes List<IKeyStroke> ksList = new ActionFinder().findActions(actionList, IKeyStroke.class, true); + for (IKeyStroke ks : ksList) { + try { + ks.initAction(); + } + catch (ProcessingException e) { + LOG.error("could not initialize key stroke '" + ks + "'.", e); + } + } addKeyStrokes(ksList.toArray(new IKeyStroke[ksList.size()])); //init outlines for (IOutline o : m_availableOutlines) { @@ -517,6 +527,10 @@ public abstract class AbstractDesktop extends AbstractPropertyObserver implement LOG.error("extension " + ext); } } + // init actions + ActionUtility.initActions(getMenus()); + ActionUtility.initActions(getToolButtons()); + ActionUtility.initActions(getViewButtons()); } } diff --git a/org.eclipse.scout.rt.client/src/org/eclipse/scout/rt/client/ui/desktop/bookmark/menu/AbstractBookmarkMenu.java b/org.eclipse.scout.rt.client/src/org/eclipse/scout/rt/client/ui/desktop/bookmark/menu/AbstractBookmarkMenu.java index c2c5f5b81f..ede4fdf23d 100644 --- a/org.eclipse.scout.rt.client/src/org/eclipse/scout/rt/client/ui/desktop/bookmark/menu/AbstractBookmarkMenu.java +++ b/org.eclipse.scout.rt.client/src/org/eclipse/scout/rt/client/ui/desktop/bookmark/menu/AbstractBookmarkMenu.java @@ -23,7 +23,6 @@ import org.eclipse.scout.rt.client.ClientSyncJob; import org.eclipse.scout.rt.client.services.common.bookmark.BookmarkServiceEvent; import org.eclipse.scout.rt.client.services.common.bookmark.BookmarkServiceListener; import org.eclipse.scout.rt.client.services.common.bookmark.IBookmarkService; -import org.eclipse.scout.rt.client.ui.action.keystroke.IKeyStroke; import org.eclipse.scout.rt.client.ui.action.menu.AbstractMenu; import org.eclipse.scout.rt.client.ui.action.menu.IMenu; import org.eclipse.scout.rt.client.ui.action.menu.MenuSeparator; @@ -45,8 +44,6 @@ import org.eclipse.scout.service.SERVICES; public abstract class AbstractBookmarkMenu extends AbstractMenu { private static final IScoutLogger LOG = ScoutLogManager.getLogger(AbstractBookmarkMenu.class); - private ArrayList<IKeyStroke> m_keyStrokes; - public AbstractBookmarkMenu() { } @@ -123,7 +120,7 @@ public abstract class AbstractBookmarkMenu extends AbstractMenu { private void handleBookmarksChanged() { IBookmarkService service = SERVICES.getService(IBookmarkService.class); List<IMenu> oldList = getChildActions(); - ArrayList<IMenu> newList = new ArrayList<IMenu>(); + List<IMenu> newList = new ArrayList<IMenu>(); for (IMenu m : oldList) { if (m.getClass() == AddUserBookmarkMenu.class) { newList.add(m); diff --git a/org.eclipse.scout.rt.client/src/org/eclipse/scout/rt/client/ui/desktop/navigation/internal/UserNavigationHistory.java b/org.eclipse.scout.rt.client/src/org/eclipse/scout/rt/client/ui/desktop/navigation/internal/UserNavigationHistory.java index 258c777393..e8ee81725e 100644 --- a/org.eclipse.scout.rt.client/src/org/eclipse/scout/rt/client/ui/desktop/navigation/internal/UserNavigationHistory.java +++ b/org.eclipse.scout.rt.client/src/org/eclipse/scout/rt/client/ui/desktop/navigation/internal/UserNavigationHistory.java @@ -403,14 +403,20 @@ public class UserNavigationHistory { List<Bookmark> bookmarks = getBookmarks(); Bookmark current = getActiveBookmark(); // children - ArrayList<IMenu> newList = new ArrayList<IMenu>(); + List<IMenu> newList = new ArrayList<IMenu>(); for (Bookmark b : bookmarks) { - ActivateNavigationHistoryMenu m = new ActivateNavigationHistoryMenu(b); - if (b == current) { - m.setIconId(AbstractIcons.NavigationCurrent); - m.setEnabled(false); + try { + ActivateNavigationHistoryMenu m = new ActivateNavigationHistoryMenu(b); + m.initAction(); + if (b == current) { + m.setIconId(AbstractIcons.NavigationCurrent); + m.setEnabled(false); + } + newList.add(m); + } + catch (ProcessingException e) { + LOG.error("could not initialize menu for bookmark '" + b + "'.", e); } - newList.add(m); } return Collections.unmodifiableList(newList); } diff --git a/org.eclipse.scout.rt.client/src/org/eclipse/scout/rt/client/ui/desktop/outline/AbstractOutlineViewButton.java b/org.eclipse.scout.rt.client/src/org/eclipse/scout/rt/client/ui/desktop/outline/AbstractOutlineViewButton.java index 405d56d20b..f2848641fc 100644 --- a/org.eclipse.scout.rt.client/src/org/eclipse/scout/rt/client/ui/desktop/outline/AbstractOutlineViewButton.java +++ b/org.eclipse.scout.rt.client/src/org/eclipse/scout/rt/client/ui/desktop/outline/AbstractOutlineViewButton.java @@ -97,6 +97,16 @@ public abstract class AbstractOutlineViewButton extends AbstractViewButton { ); } + /** + * allow only to set on true on view buttons + */ + @Override + protected void doActionInternal() throws ProcessingException { + if (!isSelected()) { + super.doActionInternal(); + } + } + @Override protected boolean getConfiguredToggleAction() { return true; diff --git a/org.eclipse.scout.rt.client/src/org/eclipse/scout/rt/client/ui/form/AbstractForm.java b/org.eclipse.scout.rt.client/src/org/eclipse/scout/rt/client/ui/form/AbstractForm.java index 010eb4c197..b73d8282c8 100644 --- a/org.eclipse.scout.rt.client/src/org/eclipse/scout/rt/client/ui/form/AbstractForm.java +++ b/org.eclipse.scout.rt.client/src/org/eclipse/scout/rt/client/ui/form/AbstractForm.java @@ -21,6 +21,7 @@ import java.io.Serializable; import java.nio.charset.Charset; import java.security.Permission; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; import java.util.EventListener; import java.util.HashMap; @@ -32,6 +33,7 @@ import java.util.Map; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.scout.commons.BeanUtility; +import org.eclipse.scout.commons.CollectionUtility; import org.eclipse.scout.commons.ConfigurationUtility; import org.eclipse.scout.commons.EventListenerList; import org.eclipse.scout.commons.StoppableThread; @@ -58,7 +60,9 @@ import org.eclipse.scout.rt.client.services.common.search.ISearchFilterService; import org.eclipse.scout.rt.client.ui.DataChangeListener; import org.eclipse.scout.rt.client.ui.IEventHistory; import org.eclipse.scout.rt.client.ui.WeakDataChangeListener; +import org.eclipse.scout.rt.client.ui.action.ActionUtility; import org.eclipse.scout.rt.client.ui.action.keystroke.IKeyStroke; +import org.eclipse.scout.rt.client.ui.action.tool.IToolButton; import org.eclipse.scout.rt.client.ui.basic.filechooser.FileChooser; import org.eclipse.scout.rt.client.ui.desktop.AbstractDesktop; import org.eclipse.scout.rt.client.ui.desktop.IDesktop; @@ -122,6 +126,7 @@ public abstract class AbstractForm extends AbstractPropertyObserver implements I private IGroupBox m_mainBox; private IWrappedFormField m_wrappedFormField; private P_SystemButtonListener m_systemButtonListener; + private List<IToolButton> m_toolbuttons; private IFormHandler m_handler; // access control @@ -144,6 +149,8 @@ public abstract class AbstractForm extends AbstractPropertyObserver implements I private String m_classId; + private int m_toolbarLocation; + public AbstractForm() throws ProcessingException { this(true); } @@ -269,6 +276,12 @@ public abstract class AbstractForm extends AbstractPropertyObserver implements I return null; } + @ConfigProperty(ConfigProperty.TOOLBAR_LOCATION) + @Order(170) + public int getConfiguredToobarLocation() { + return TOOLBAR_FORM_HEADER; + } + /** * This method is called to get an exclusive key of the form. The key is used * to open the same form with the same handler only once. Obviously this @@ -444,10 +457,28 @@ public abstract class AbstractForm extends AbstractPropertyObserver implements I return ConfigurationUtility.filterClassesWithInjectFieldAnnotation(dca, IFormField.class); } + protected List<Class<? extends IToolButton>> getConfiguredToolButtons() { + Class[] dca = ConfigurationUtility.getDeclaredPublicClasses(getClass()); + return ConfigurationUtility.sortFilteredClassesByOrderAnnotation(Arrays.asList(dca), IToolButton.class); + } + protected void initConfig() throws ProcessingException { m_uiFacade = new P_UIFacade(); m_scoutTimerMap = new HashMap<String, P_Timer>(); m_autoRegisterInDesktopOnStart = true; + setToolbarLocation(getConfiguredToobarLocation()); + // toolbuttons + List<IToolButton> toolButtonList = new ArrayList<IToolButton>(); + for (Class<? extends IToolButton> clazz : getConfiguredToolButtons()) { + try { + IToolButton b = ConfigurationUtility.newInnerInstance(this, clazz); + toolButtonList.add(b); + }// end try + catch (Throwable t) { + SERVICES.getService(IExceptionHandlerService.class).handleException(new ProcessingException("toobutton: " + clazz.getName(), t)); + } + } + m_toolbuttons = toolButtonList; // prepare injected fields Class<? extends IFormField>[] fieldArray = getConfiguredInjectedFields(); DefaultFormFieldInjection injectedFields = null; @@ -597,6 +628,33 @@ public abstract class AbstractForm extends AbstractPropertyObserver implements I propertySupport.setPropertyString(PROP_PERSPECTIVE_ID, perspectiveId); } + @Override + public List<IToolButton> getToolbuttons() { + return CollectionUtility.unmodifiableListCopy(m_toolbuttons); + } + + /** + * @param configuredToolbuttonLocation + */ + private void setToolbarLocation(int toolbarLocation) { + m_toolbarLocation = toolbarLocation; + } + + @Override + public int getToolbarLocation() { + return m_toolbarLocation; + } + + @Override + public IToolButton getToolbuttonByClass(Class<? extends IToolButton> clazz) { + for (IToolButton b : m_toolbuttons) { + if (b.getClass() == clazz) { + return b; + } + } + return null; + } + /** * Register a {@link DataChangeListener} on the desktop for these dataTypes<br> * Example: @@ -1187,6 +1245,7 @@ public abstract class AbstractForm extends AbstractPropertyObserver implements I initFormInternal(); // fields FormUtility.initFormFields(this); + ActionUtility.initActions(getToolbuttons()); // custom execInitForm(); } diff --git a/org.eclipse.scout.rt.client/src/org/eclipse/scout/rt/client/ui/form/IForm.java b/org.eclipse.scout.rt.client/src/org/eclipse/scout/rt/client/ui/form/IForm.java index 0e195729cd..7c8795fd40 100644 --- a/org.eclipse.scout.rt.client/src/org/eclipse/scout/rt/client/ui/form/IForm.java +++ b/org.eclipse.scout.rt.client/src/org/eclipse/scout/rt/client/ui/form/IForm.java @@ -22,6 +22,7 @@ import org.eclipse.scout.commons.beans.IPropertyObserver; import org.eclipse.scout.commons.exception.ProcessingException; import org.eclipse.scout.commons.xmlparser.SimpleXmlElement; import org.eclipse.scout.rt.client.ui.IEventHistory; +import org.eclipse.scout.rt.client.ui.action.tool.IToolButton; import org.eclipse.scout.rt.client.ui.desktop.AbstractDesktop; import org.eclipse.scout.rt.client.ui.desktop.DesktopEvent; import org.eclipse.scout.rt.client.ui.desktop.IDesktop; @@ -85,6 +86,9 @@ public interface IForm extends IPropertyObserver, ITypeWithSettableClassId { */ int DISPLAY_HINT_VIEW = 20; + int TOOLBAR_FORM_HEADER = 30; + int TOOLBAR_VIEW_PART = 31; + String VIEW_ID_N = "N"; String VIEW_ID_NE = "NE"; String VIEW_ID_E = "E"; @@ -527,6 +531,10 @@ public interface IForm extends IPropertyObserver, ITypeWithSettableClassId { */ void setFormStored(boolean b); + List<IToolButton> getToolbuttons(); + + IToolButton getToolbuttonByClass(Class<? extends IToolButton> clazz); + Object getProperty(String name); /** @@ -629,4 +637,10 @@ public interface IForm extends IPropertyObserver, ITypeWithSettableClassId { IEventHistory<FormEvent> getEventHistory(); IFormUIFacade getUIFacade(); + + /** + * @return + */ + int getToolbarLocation(); + } diff --git a/org.eclipse.scout.rt.client/src/org/eclipse/scout/rt/client/ui/form/fields/AbstractFormField.java b/org.eclipse.scout.rt.client/src/org/eclipse/scout/rt/client/ui/form/fields/AbstractFormField.java index 79edfbfbf8..0e9a58637d 100644 --- a/org.eclipse.scout.rt.client/src/org/eclipse/scout/rt/client/ui/form/fields/AbstractFormField.java +++ b/org.eclipse.scout.rt.client/src/org/eclipse/scout/rt/client/ui/form/fields/AbstractFormField.java @@ -41,6 +41,7 @@ import org.eclipse.scout.rt.client.ClientSyncJob; import org.eclipse.scout.rt.client.services.common.search.ISearchFilterService; import org.eclipse.scout.rt.client.ui.DataChangeListener; import org.eclipse.scout.rt.client.ui.WeakDataChangeListener; +import org.eclipse.scout.rt.client.ui.action.ActionUtility; import org.eclipse.scout.rt.client.ui.action.keystroke.IKeyStroke; import org.eclipse.scout.rt.client.ui.desktop.IDesktop; import org.eclipse.scout.rt.client.ui.form.IForm; @@ -802,6 +803,8 @@ public abstract class AbstractFormField extends AbstractPropertyObserver impleme // initFieldInternal(); execInitField(); + // init key strokes + ActionUtility.initActions(getKeyStrokes()); } finally { setValueChangeTriggerEnabled(true); @@ -1756,6 +1759,7 @@ public abstract class AbstractFormField extends AbstractPropertyObserver impleme IKeyStroke ks; try { ks = ConfigurationUtility.newInnerInstance(this, keystrokeClazz); + ks.initAction(); ksMap.put(ks.getKeyStroke().toUpperCase(), ks); } catch (Throwable t) { diff --git a/org.eclipse.scout.rt.client/src/org/eclipse/scout/rt/client/ui/form/fields/button/AbstractButton.java b/org.eclipse.scout.rt.client/src/org/eclipse/scout/rt/client/ui/form/fields/button/AbstractButton.java index 11c53ddb6a..f48df08990 100644 --- a/org.eclipse.scout.rt.client/src/org/eclipse/scout/rt/client/ui/form/fields/button/AbstractButton.java +++ b/org.eclipse.scout.rt.client/src/org/eclipse/scout/rt/client/ui/form/fields/button/AbstractButton.java @@ -26,6 +26,7 @@ import org.eclipse.scout.commons.exception.ProcessingException; import org.eclipse.scout.commons.logger.IScoutLogger; import org.eclipse.scout.commons.logger.ScoutLogManager; import org.eclipse.scout.rt.client.services.common.icon.IIconProviderService; +import org.eclipse.scout.rt.client.ui.action.ActionUtility; import org.eclipse.scout.rt.client.ui.action.keystroke.IKeyStroke; import org.eclipse.scout.rt.client.ui.action.menu.IMenu; import org.eclipse.scout.rt.client.ui.action.menu.MenuUtility; @@ -225,7 +226,7 @@ public abstract class AbstractButton extends AbstractFormField implements IButto setIconId(getConfiguredIconId()); setRadioValue(getConfiguredRadioValue()); // menus - ArrayList<IMenu> menuList = new ArrayList<IMenu>(); + List<IMenu> menuList = new ArrayList<IMenu>(); for (Class<? extends IMenu> menuClazz : getConfiguredMenus()) { IMenu menu; try { @@ -245,6 +246,13 @@ public abstract class AbstractButton extends AbstractFormField implements IButto m_menus = menuList; } + @Override + protected void initFieldInternal() throws ProcessingException { + super.initFieldInternal(); + // init actions + ActionUtility.initActions(getMenus()); + } + /** * Override this internal method only in order to make use of dynamic menus<br> * Used to manage menu list and add/remove menus diff --git a/org.eclipse.scout.rt.client/src/org/eclipse/scout/rt/client/ui/form/fields/filechooserfield/AbstractFileChooserField.java b/org.eclipse.scout.rt.client/src/org/eclipse/scout/rt/client/ui/form/fields/filechooserfield/AbstractFileChooserField.java index 1cd50bbb03..d30f46bd8b 100644 --- a/org.eclipse.scout.rt.client/src/org/eclipse/scout/rt/client/ui/form/fields/filechooserfield/AbstractFileChooserField.java +++ b/org.eclipse.scout.rt.client/src/org/eclipse/scout/rt/client/ui/form/fields/filechooserfield/AbstractFileChooserField.java @@ -24,6 +24,7 @@ import org.eclipse.scout.commons.annotations.Order; import org.eclipse.scout.commons.exception.ProcessingException; import org.eclipse.scout.commons.logger.IScoutLogger; import org.eclipse.scout.commons.logger.ScoutLogManager; +import org.eclipse.scout.rt.client.ui.action.ActionUtility; import org.eclipse.scout.rt.client.ui.action.keystroke.IKeyStroke; import org.eclipse.scout.rt.client.ui.action.menu.IMenu; import org.eclipse.scout.rt.client.ui.action.menu.MenuUtility; @@ -168,6 +169,12 @@ public abstract class AbstractFileChooserField extends AbstractValueField<String m_menus = menuList; } + @Override + protected void initFieldInternal() throws ProcessingException { + super.initFieldInternal(); + ActionUtility.initActions(getMenus()); + } + /** * Override this internal method only in order to make use of dynamic menus<br> * Used to manage menu list and add/remove menus diff --git a/org.eclipse.scout.rt.client/src/org/eclipse/scout/rt/client/ui/form/fields/groupbox/AbstractGroupBox.java b/org.eclipse.scout.rt.client/src/org/eclipse/scout/rt/client/ui/form/fields/groupbox/AbstractGroupBox.java index ccda0f070b..69c8ad9524 100644 --- a/org.eclipse.scout.rt.client/src/org/eclipse/scout/rt/client/ui/form/fields/groupbox/AbstractGroupBox.java +++ b/org.eclipse.scout.rt.client/src/org/eclipse/scout/rt/client/ui/form/fields/groupbox/AbstractGroupBox.java @@ -18,6 +18,7 @@ import org.eclipse.scout.commons.CollectionUtility; import org.eclipse.scout.commons.annotations.ClassId; import org.eclipse.scout.commons.annotations.ConfigProperty; import org.eclipse.scout.commons.annotations.Order; +import org.eclipse.scout.commons.exception.ProcessingException; import org.eclipse.scout.commons.logger.IScoutLogger; import org.eclipse.scout.commons.logger.ScoutLogManager; import org.eclipse.scout.rt.client.services.common.icon.IIconProviderService; @@ -30,7 +31,6 @@ import org.eclipse.scout.rt.client.ui.form.fields.GridData; import org.eclipse.scout.rt.client.ui.form.fields.IFormField; import org.eclipse.scout.rt.client.ui.form.fields.button.IButton; import org.eclipse.scout.rt.client.ui.form.fields.groupbox.internal.GroupBoxProcessButtonGrid; -import org.eclipse.scout.rt.client.ui.form.fields.groupbox.internal.IGroupBoxBodyGrid; import org.eclipse.scout.rt.client.ui.form.fields.groupbox.internal.VerticalSmartGroupBoxBodyGrid; @ClassId("6a093505-c2b1-4df2-84d6-e799f91e6e7c") @@ -81,9 +81,7 @@ public abstract class AbstractGroupBox extends AbstractCompositeField implements } /** - * <code>true</code> to layout row first <code>false</code> to layout column first - * - * @return + * @return the body grid responsible to set {@link GridData} to the fields in this group box. */ @ConfigProperty(ConfigProperty.GROUP_BOX_BODY_GRID) @Order(210) @@ -318,10 +316,24 @@ public abstract class AbstractGroupBox extends AbstractCompositeField implements } } if (!hasEnter) { - list.add(new DefaultFormEnterKeyStroke(getForm())); + try { + DefaultFormEnterKeyStroke enterKeyStroke = new DefaultFormEnterKeyStroke(getForm()); + enterKeyStroke.initAction(); + list.add(enterKeyStroke); + } + catch (ProcessingException e) { + LOG.error("could not initialize enter key stroke.", e); + } } if (!hasEscape) { - list.add(new DefaultFormEscapeKeyStroke(getForm())); + try { + DefaultFormEscapeKeyStroke escKeyStroke = new DefaultFormEscapeKeyStroke(getForm()); + escKeyStroke.initAction(); + list.add(escKeyStroke); + } + catch (ProcessingException e) { + LOG.error("could not initialize esc key stroke.", e); + } } } return Collections.unmodifiableList(list); diff --git a/org.eclipse.scout.rt.client/src/org/eclipse/scout/rt/client/ui/form/fields/groupbox/IGroupBox.java b/org.eclipse.scout.rt.client/src/org/eclipse/scout/rt/client/ui/form/fields/groupbox/IGroupBox.java index 915a7e3b2c..7cdf7b28f4 100644 --- a/org.eclipse.scout.rt.client/src/org/eclipse/scout/rt/client/ui/form/fields/groupbox/IGroupBox.java +++ b/org.eclipse.scout.rt.client/src/org/eclipse/scout/rt/client/ui/form/fields/groupbox/IGroupBox.java @@ -15,7 +15,6 @@ import java.util.List; import org.eclipse.scout.rt.client.ui.form.fields.ICompositeField; import org.eclipse.scout.rt.client.ui.form.fields.IFormField; import org.eclipse.scout.rt.client.ui.form.fields.button.IButton; -import org.eclipse.scout.rt.client.ui.form.fields.groupbox.internal.IGroupBoxBodyGrid; public interface IGroupBox extends ICompositeField { diff --git a/org.eclipse.scout.rt.client/src/org/eclipse/scout/rt/client/ui/form/fields/groupbox/internal/IGroupBoxBodyGrid.java b/org.eclipse.scout.rt.client/src/org/eclipse/scout/rt/client/ui/form/fields/groupbox/IGroupBoxBodyGrid.java index 5a791e7bc4..0f859df2e8 100644 --- a/org.eclipse.scout.rt.client/src/org/eclipse/scout/rt/client/ui/form/fields/groupbox/internal/IGroupBoxBodyGrid.java +++ b/org.eclipse.scout.rt.client/src/org/eclipse/scout/rt/client/ui/form/fields/groupbox/IGroupBoxBodyGrid.java @@ -8,28 +8,34 @@ * Contributors: * BSI Business Systems Integration AG - initial API and implementation ******************************************************************************/ -package org.eclipse.scout.rt.client.ui.form.fields.groupbox.internal; +package org.eclipse.scout.rt.client.ui.form.fields.groupbox; -import org.eclipse.scout.rt.client.ui.form.fields.groupbox.IGroupBox; +import org.eclipse.scout.rt.client.ui.form.fields.GridData; +import org.eclipse.scout.rt.client.ui.form.fields.groupbox.internal.HorizontalGroupBoxBodyGrid; +import org.eclipse.scout.rt.client.ui.form.fields.groupbox.internal.VerticalSmartGroupBoxBodyGrid; /** + * This class is responsible to calculate {@link GridData} for all fields in a {@link IGroupBox}. Considering each + * fields {@link IGroupBox#getGridDataHints()} the {@link IGroupBox#setGridDataInternal(GridData)} must be set. + * * @author Andreas Hoegger * @since 4.0.0 M6 25.02.2014 + * @see {@link VerticalSmartGroupBoxBodyGrid}, {@link HorizontalGroupBoxBodyGrid} */ public interface IGroupBoxBodyGrid { /** - * + * validate the grid data of all fields in the given group box */ void validate(IGroupBox groupBox); /** - * @return + * @return the column count of the calculated grid */ int getGridColumnCount(); /** - * @return + * @return the row count of the calculated grid */ int getGridRowCount(); diff --git a/org.eclipse.scout.rt.client/src/org/eclipse/scout/rt/client/ui/form/fields/groupbox/internal/AbstractGroupBoxBodyGrid.java b/org.eclipse.scout.rt.client/src/org/eclipse/scout/rt/client/ui/form/fields/groupbox/internal/AbstractGroupBoxBodyGrid.java index 318cede37f..450433a6ec 100644 --- a/org.eclipse.scout.rt.client/src/org/eclipse/scout/rt/client/ui/form/fields/groupbox/internal/AbstractGroupBoxBodyGrid.java +++ b/org.eclipse.scout.rt.client/src/org/eclipse/scout/rt/client/ui/form/fields/groupbox/internal/AbstractGroupBoxBodyGrid.java @@ -17,6 +17,7 @@ import org.eclipse.scout.rt.client.ui.form.fields.GridData; import org.eclipse.scout.rt.client.ui.form.fields.IFormField; import org.eclipse.scout.rt.client.ui.form.fields.button.IButton; import org.eclipse.scout.rt.client.ui.form.fields.groupbox.IGroupBox; +import org.eclipse.scout.rt.client.ui.form.fields.groupbox.IGroupBoxBodyGrid; import org.eclipse.scout.rt.client.ui.form.fields.internal.GridDataBuilder; /** diff --git a/org.eclipse.scout.rt.client/src/org/eclipse/scout/rt/client/ui/form/fields/imagebox/AbstractImageField.java b/org.eclipse.scout.rt.client/src/org/eclipse/scout/rt/client/ui/form/fields/imagebox/AbstractImageField.java index 04445e3877..82d1ff054b 100644 --- a/org.eclipse.scout.rt.client/src/org/eclipse/scout/rt/client/ui/form/fields/imagebox/AbstractImageField.java +++ b/org.eclipse.scout.rt.client/src/org/eclipse/scout/rt/client/ui/form/fields/imagebox/AbstractImageField.java @@ -26,6 +26,7 @@ import org.eclipse.scout.commons.dnd.TransferObject; import org.eclipse.scout.commons.exception.ProcessingException; import org.eclipse.scout.commons.logger.IScoutLogger; import org.eclipse.scout.commons.logger.ScoutLogManager; +import org.eclipse.scout.rt.client.ui.action.ActionUtility; import org.eclipse.scout.rt.client.ui.action.keystroke.IKeyStroke; import org.eclipse.scout.rt.client.ui.action.menu.IMenu; import org.eclipse.scout.rt.client.ui.action.menu.MenuUtility; @@ -180,6 +181,13 @@ public abstract class AbstractImageField extends AbstractFormField implements II m_menus = Collections.unmodifiableList(menuList); } + @Override + protected void initFieldInternal() throws ProcessingException { + super.initFieldInternal(); + // init actions + ActionUtility.initActions(getMenus()); + } + /** * Override this internal method only in order to make use of dynamic menus<br> * Used to manage menu list and add/remove menus diff --git a/org.eclipse.scout.rt.client/src/org/eclipse/scout/rt/client/ui/form/fields/smartfield/AbstractContentAssistField.java b/org.eclipse.scout.rt.client/src/org/eclipse/scout/rt/client/ui/form/fields/smartfield/AbstractContentAssistField.java index 24de04b18c..03431342d9 100644 --- a/org.eclipse.scout.rt.client/src/org/eclipse/scout/rt/client/ui/form/fields/smartfield/AbstractContentAssistField.java +++ b/org.eclipse.scout.rt.client/src/org/eclipse/scout/rt/client/ui/form/fields/smartfield/AbstractContentAssistField.java @@ -38,6 +38,7 @@ import org.eclipse.scout.rt.client.ClientSyncJob; import org.eclipse.scout.rt.client.IClientSession; import org.eclipse.scout.rt.client.services.lookup.FormFieldProvisioningContext; import org.eclipse.scout.rt.client.services.lookup.ILookupCallProvisioningService; +import org.eclipse.scout.rt.client.ui.action.ActionUtility; import org.eclipse.scout.rt.client.ui.action.keystroke.IKeyStroke; import org.eclipse.scout.rt.client.ui.action.menu.IMenu; import org.eclipse.scout.rt.client.ui.action.menu.MenuUtility; @@ -448,6 +449,13 @@ public abstract class AbstractContentAssistField<VALUE_TYPE, KEY_TYPE> extends A } + @Override + protected void initFieldInternal() throws ProcessingException { + super.initFieldInternal(); + // init actions + ActionUtility.initActions(getMenus()); + } + /** * Override this internal method only in order to make use of dynamic menus<br> * Used to manage menu list and add/remove menus diff --git a/org.eclipse.scout.rt.extension.client/src/org/eclipse/scout/rt/extension/client/ui/desktop/internal/OrderedMenuWrapper.java b/org.eclipse.scout.rt.extension.client/src/org/eclipse/scout/rt/extension/client/ui/desktop/internal/OrderedMenuWrapper.java index cba3ce225b..57054e7295 100644 --- a/org.eclipse.scout.rt.extension.client/src/org/eclipse/scout/rt/extension/client/ui/desktop/internal/OrderedMenuWrapper.java +++ b/org.eclipse.scout.rt.extension.client/src/org/eclipse/scout/rt/extension/client/ui/desktop/internal/OrderedMenuWrapper.java @@ -48,6 +48,11 @@ public class OrderedMenuWrapper implements IMenu, IOrdered, IWrappedObject<IMenu } @Override + public void initAction() throws ProcessingException { + m_menu.initAction(); + } + + @Override public void addPropertyChangeListener(PropertyChangeListener listener) { m_menu.addPropertyChangeListener(listener); } diff --git a/org.eclipse.scout.rt.ui.rap.mobile/src/org/eclipse/scout/rt/ui/rap/mobile/action/RwtScoutActionButton.java b/org.eclipse.scout.rt.ui.rap.mobile/src/org/eclipse/scout/rt/ui/rap/mobile/action/RwtScoutActionButton.java index dd3ccbffbc..73bfb2a105 100644 --- a/org.eclipse.scout.rt.ui.rap.mobile/src/org/eclipse/scout/rt/ui/rap/mobile/action/RwtScoutActionButton.java +++ b/org.eclipse.scout.rt.ui.rap.mobile/src/org/eclipse/scout/rt/ui/rap/mobile/action/RwtScoutActionButton.java @@ -10,10 +10,12 @@ *******************************************************************************/ package org.eclipse.scout.rt.ui.rap.mobile.action; +import java.util.ArrayList; import java.util.List; import org.eclipse.scout.commons.StringUtility; import org.eclipse.scout.rt.client.ui.action.IAction; +import org.eclipse.scout.rt.client.ui.action.menu.IMenu; import org.eclipse.scout.rt.client.ui.action.tree.IActionNode; import org.eclipse.scout.rt.ui.rap.LogicalGridData; import org.eclipse.scout.rt.ui.rap.LogicalGridLayout; @@ -326,9 +328,15 @@ public class RwtScoutActionButton extends RwtScoutComposite<IAction> implements if (actions == null) { return; } + List<IMenu> scoutMenus = new ArrayList<IMenu>(actions.size()); + for (IActionNode a : actions) { + if (a instanceof IMenu) { + scoutMenus.add((IMenu) a); + } + } Menu menu = ((Menu) e.getSource()); - RwtMenuUtility.fillContextMenu(actions, getUiEnvironment(), menu); + RwtMenuUtility.fillContextMenu(scoutMenus, getUiEnvironment(), menu); } } diff --git a/org.eclipse.scout.rt.ui.rap.mobile/src/org/eclipse/scout/rt/ui/rap/mobile/form/AbstractRwtScoutFormHeader.java b/org.eclipse.scout.rt.ui.rap.mobile/src/org/eclipse/scout/rt/ui/rap/mobile/form/AbstractRwtScoutFormHeader.java index dc59b8cb74..bebb401fcd 100644 --- a/org.eclipse.scout.rt.ui.rap.mobile/src/org/eclipse/scout/rt/ui/rap/mobile/form/AbstractRwtScoutFormHeader.java +++ b/org.eclipse.scout.rt.ui.rap.mobile/src/org/eclipse/scout/rt/ui/rap/mobile/form/AbstractRwtScoutFormHeader.java @@ -13,6 +13,7 @@ package org.eclipse.scout.rt.ui.rap.mobile.form; import java.util.LinkedList; import java.util.List; +import org.eclipse.scout.commons.exception.ProcessingException; import org.eclipse.scout.commons.job.JobEx; import org.eclipse.scout.commons.logger.IScoutLogger; import org.eclipse.scout.commons.logger.ScoutLogManager; @@ -83,9 +84,14 @@ public class AbstractRwtScoutFormHeader extends AbstractRwtScoutActionBar<IForm> if (actionFetcher == null) { actionFetcher = new FormHeaderActionFetcher(getScoutObject()); } - List<IMenu> actions = actionFetcher.fetch(); - if (actions != null) { - actionList.addAll(actions); + try { + List<IMenu> actions = actionFetcher.fetch(); + if (actions != null) { + actionList.addAll(actions); + } + } + catch (ProcessingException e) { + LOG.error("cuold not initialize actions.", e); } } }; diff --git a/org.eclipse.scout.rt.ui.rap.mobile/src/org/eclipse/scout/rt/ui/rap/mobile/form/RwtScoutMobileFormFooter.java b/org.eclipse.scout.rt.ui.rap.mobile/src/org/eclipse/scout/rt/ui/rap/mobile/form/RwtScoutMobileFormFooter.java index 75d32fa950..d49edf7105 100644 --- a/org.eclipse.scout.rt.ui.rap.mobile/src/org/eclipse/scout/rt/ui/rap/mobile/form/RwtScoutMobileFormFooter.java +++ b/org.eclipse.scout.rt.ui.rap.mobile/src/org/eclipse/scout/rt/ui/rap/mobile/form/RwtScoutMobileFormFooter.java @@ -13,6 +13,7 @@ package org.eclipse.scout.rt.ui.rap.mobile.form; import java.util.LinkedList; import java.util.List; +import org.eclipse.scout.commons.exception.ProcessingException; import org.eclipse.scout.commons.job.JobEx; import org.eclipse.scout.commons.logger.IScoutLogger; import org.eclipse.scout.commons.logger.ScoutLogManager; @@ -91,9 +92,14 @@ public class RwtScoutMobileFormFooter extends AbstractRwtScoutActionBar<IForm> i if (actionFetcher == null) { actionFetcher = new FormFooterActionFetcher(getScoutObject()); } - List<IMenu> actions = actionFetcher.fetch(); - if (actions != null) { - actionList.addAll(actions); + try { + List<IMenu> actions = actionFetcher.fetch(); + if (actions != null) { + actionList.addAll(actions); + } + } + catch (ProcessingException e) { + LOG.error("could not initialze actions.", e); } } }; diff --git a/org.eclipse.scout.rt.ui.rap/plugin.xml b/org.eclipse.scout.rt.ui.rap/plugin.xml index 6c4718c37a..a7f0521689 100644 --- a/org.eclipse.scout.rt.ui.rap/plugin.xml +++ b/org.eclipse.scout.rt.ui.rap/plugin.xml @@ -358,13 +358,13 @@ </extension> <extension point="org.eclipse.scout.rt.server.commons.filters"> - <filter aliases="/" class="org.eclipse.scout.http.servletfilter.helper.DevelopmentAuthFilter" ranking="1000000"> + <filter aliases="/" class="org.eclipse.scout.rt.server.commons.servletfilter.helper.DevelopmentAuthFilter" ranking="1000000"> <init-param name="active" value="true"> </init-param> </filter> - <filter aliases="/" class="org.eclipse.scout.http.servletfilter.helper.HttpAuthJaasFilter" ranking="1000010"> + <filter aliases="/" class="org.eclipse.scout.rt.server.commons.servletfilter.helper.HttpAuthJaasFilter" ranking="1000010"> <init-param name="active" value="true"> diff --git a/org.eclipse.scout.rt.ui.rap/src/org/eclipse/scout/rt/ui/rap/RwtMenuUtility.java b/org.eclipse.scout.rt.ui.rap/src/org/eclipse/scout/rt/ui/rap/RwtMenuUtility.java index 8750346188..1f735f3d07 100644 --- a/org.eclipse.scout.rt.ui.rap/src/org/eclipse/scout/rt/ui/rap/RwtMenuUtility.java +++ b/org.eclipse.scout.rt.ui.rap/src/org/eclipse/scout/rt/ui/rap/RwtMenuUtility.java @@ -10,6 +10,7 @@ *******************************************************************************/ package org.eclipse.scout.rt.ui.rap; +import java.util.ArrayList; import java.util.Collections; import java.util.LinkedList; import java.util.List; @@ -32,22 +33,14 @@ public final class RwtMenuUtility { private RwtMenuUtility() { } - - public static void fillContextMenu(IMenu[] scoutMenus, IRwtEnvironment uiEnvironment, Menu menu) { + public static void fillContextMenu(List<? extends IMenu> scoutMenus, IRwtEnvironment uiEnvironment, Menu menu) { MenuFactory menuFactory = uiEnvironment.getMenuFactory(); if (menuFactory != null) { menuFactory.fillContextMenu(menu, scoutMenus, uiEnvironment); } } - public static void fillContextMenu(List<? extends IActionNode> scoutActionNodes, IRwtEnvironment uiEnvironment, Menu menu) { - MenuFactory menuFactory = uiEnvironment.getMenuFactory(); - if (menuFactory != null) { - menuFactory.fillContextMenu(menu, scoutActionNodes, uiEnvironment); - } - } - public static List<IMenu> collectMenus(final IButton button, IRwtEnvironment uiEnvironment) { final List<IMenu> menuList = new LinkedList<IMenu>(); Runnable t = new Runnable() { @@ -196,14 +189,14 @@ public final class RwtMenuUtility { * * @since 3.8.1 */ - public static List<IActionNode> cleanup(List<? extends IActionNode> scoutActionNodes) { + public static <T extends IActionNode<?>> List<T> cleanup(List<T> scoutActionNodes) { if (scoutActionNodes == null) { return null; } - List<IActionNode> cleanedActions = new LinkedList<IActionNode>(); + List<T> cleanedActions = new ArrayList<T>(scoutActionNodes.size()); for (int i = 0; i < scoutActionNodes.size(); i++) { - IActionNode actionNode = scoutActionNodes.get(i); + T actionNode = scoutActionNodes.get(i); //Ignore invisible actions if (!actionNode.isVisible()) { continue; diff --git a/org.eclipse.scout.rt.ui.rap/src/org/eclipse/scout/rt/ui/rap/action/MenuFactory.java b/org.eclipse.scout.rt.ui.rap/src/org/eclipse/scout/rt/ui/rap/action/MenuFactory.java index f0491d2d8f..bfc078544a 100644 --- a/org.eclipse.scout.rt.ui.rap/src/org/eclipse/scout/rt/ui/rap/action/MenuFactory.java +++ b/org.eclipse.scout.rt.ui.rap/src/org/eclipse/scout/rt/ui/rap/action/MenuFactory.java @@ -10,11 +10,10 @@ ******************************************************************************/ package org.eclipse.scout.rt.ui.rap.action; -import java.util.LinkedList; import java.util.List; +import org.eclipse.scout.commons.CollectionUtility; import org.eclipse.scout.rt.client.ui.action.menu.IMenu; -import org.eclipse.scout.rt.client.ui.action.menu.checkbox.ICheckBoxMenu; import org.eclipse.scout.rt.client.ui.action.tree.IActionNode; import org.eclipse.scout.rt.ui.rap.IRwtEnvironment; import org.eclipse.scout.rt.ui.rap.RwtMenuUtility; @@ -32,49 +31,35 @@ public class MenuFactory { m_addKeyStrokeTextEnabled = true; } - public void fillContextMenu(Menu menu, IMenu[] scoutMenus, IRwtEnvironment uiEnvironment) { - if (scoutMenus == null || scoutMenus.length == 0) { + public void fillContextMenu(Menu menu, List<? extends IMenu> scoutActionNodes, IRwtEnvironment uiEnvironment) { + if (CollectionUtility.isEmpty(scoutActionNodes)) { menu.setVisible(false); return; } - List<IActionNode> scoutActionNodes = new LinkedList<IActionNode>(); - for (IMenu scoutMenu : scoutMenus) { - scoutActionNodes.add(scoutMenu); - } - - fillContextMenu(menu, scoutActionNodes, uiEnvironment); - } - - public void fillContextMenu(Menu menu, List<? extends IActionNode> scoutActionNodes, IRwtEnvironment uiEnvironment) { - if (scoutActionNodes == null || scoutActionNodes.size() == 0) { - menu.setVisible(false); - return; - } - - List<IActionNode> cleanedScoutActions = RwtMenuUtility.cleanup(scoutActionNodes); - for (IActionNode scoutActionNode : cleanedScoutActions) { + List<? extends IMenu> cleanedScoutActions = RwtMenuUtility.cleanup(scoutActionNodes); + for (IMenu scoutActionNode : cleanedScoutActions) { fillContextMenuRec(menu, scoutActionNode, uiEnvironment); } } - private void fillContextMenuRec(Menu menu, IActionNode<?> scoutActionNode, IRwtEnvironment uiEnvironment) { + private void fillContextMenuRec(Menu menu, IMenu scoutActionNode, IRwtEnvironment uiEnvironment) { if (!scoutActionNode.isVisible()) { return; } if (scoutActionNode.isSeparator()) { new MenuItem(menu, SWT.SEPARATOR); } - else if (scoutActionNode instanceof ICheckBoxMenu) { + else if (scoutActionNode.isToggleAction()) { createCheckBoxMenuAction(menu, scoutActionNode, uiEnvironment); } else if (scoutActionNode.getChildActionCount() > 0) { AbstractRwtMenuAction group = createMenuGroup(menu, scoutActionNode, uiEnvironment); Menu subMenu = new Menu(menu); group.getUiMenuItem().setMenu(subMenu); - List<IActionNode> childActions = RwtMenuUtility.cleanup(scoutActionNode.getChildActions()); - for (IActionNode<?> subAction : childActions) { + List<IMenu> childActions = RwtMenuUtility.cleanup(scoutActionNode.getChildActions()); + for (IMenu subAction : childActions) { fillContextMenuRec(subMenu, subAction, uiEnvironment); } } @@ -90,8 +75,8 @@ public class MenuFactory { return group; } - protected AbstractRwtMenuAction createCheckBoxMenuAction(Menu menu, IActionNode<?> scoutActionNode, IRwtEnvironment uiEnvironment) { - RwtScoutCheckboxMenu action = new RwtScoutCheckboxMenu(menu, (ICheckBoxMenu) scoutActionNode, uiEnvironment, false); + protected AbstractRwtMenuAction createCheckBoxMenuAction(Menu menu, IMenu scoutActionNode, IRwtEnvironment uiEnvironment) { + RwtScoutCheckboxMenu action = new RwtScoutCheckboxMenu(menu, scoutActionNode, uiEnvironment, false); action.setAddKeyStrokeTextEnabled(isAddKeyStrokeTextEnabled()); action.init(); return action; diff --git a/org.eclipse.scout.rt.ui.rap/src/org/eclipse/scout/rt/ui/rap/action/RwtScoutCheckboxMenu.java b/org.eclipse.scout.rt.ui.rap/src/org/eclipse/scout/rt/ui/rap/action/RwtScoutCheckboxMenu.java index 95d159e7cb..31b084fd62 100644 --- a/org.eclipse.scout.rt.ui.rap/src/org/eclipse/scout/rt/ui/rap/action/RwtScoutCheckboxMenu.java +++ b/org.eclipse.scout.rt.ui.rap/src/org/eclipse/scout/rt/ui/rap/action/RwtScoutCheckboxMenu.java @@ -10,7 +10,7 @@ *******************************************************************************/ package org.eclipse.scout.rt.ui.rap.action; -import org.eclipse.scout.rt.client.ui.action.menu.checkbox.ICheckBoxMenu; +import org.eclipse.scout.rt.client.ui.action.menu.IMenu; import org.eclipse.scout.rt.ui.rap.IRwtEnvironment; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Menu; @@ -18,11 +18,11 @@ import org.eclipse.swt.widgets.MenuItem; public class RwtScoutCheckboxMenu extends AbstractRwtMenuAction { - public RwtScoutCheckboxMenu(Menu uiMenu, ICheckBoxMenu scoutMenu, IRwtEnvironment uiEnvironment, boolean callInitializer) { + public RwtScoutCheckboxMenu(Menu uiMenu, IMenu scoutMenu, IRwtEnvironment uiEnvironment, boolean callInitializer) { super(uiMenu, scoutMenu, uiEnvironment, callInitializer); } - public RwtScoutCheckboxMenu(Menu uiMenu, ICheckBoxMenu scoutMenu, IRwtEnvironment uiEnvironment) { + public RwtScoutCheckboxMenu(Menu uiMenu, IMenu scoutMenu, IRwtEnvironment uiEnvironment) { this(uiMenu, scoutMenu, uiEnvironment, true); } @@ -50,7 +50,7 @@ public class RwtScoutCheckboxMenu extends AbstractRwtMenuAction { @Override protected void handleScoutPropertyChange(String name, Object newValue) { super.handleScoutPropertyChange(name, newValue); - if (name.equals(ICheckBoxMenu.PROP_SELECTED)) { + if (name.equals(IMenu.PROP_SELECTED)) { setSelectedFromScout(); } } diff --git a/org.eclipse.scout.rt.ui.rap/src/org/eclipse/scout/rt/ui/rap/action/RwtScoutToolbarAction.java b/org.eclipse.scout.rt.ui.rap/src/org/eclipse/scout/rt/ui/rap/action/RwtScoutToolbarAction.java new file mode 100644 index 0000000000..ec9f105e40 --- /dev/null +++ b/org.eclipse.scout.rt.ui.rap/src/org/eclipse/scout/rt/ui/rap/action/RwtScoutToolbarAction.java @@ -0,0 +1,245 @@ +/** + * + */ +package org.eclipse.scout.rt.ui.rap.action; + +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; + +import org.eclipse.jface.action.Action; +import org.eclipse.jface.action.IToolBarManager; +import org.eclipse.scout.commons.OptimisticLock; +import org.eclipse.scout.commons.logger.IScoutLogger; +import org.eclipse.scout.commons.logger.ScoutLogManager; +import org.eclipse.scout.rt.client.ui.action.IAction; +import org.eclipse.scout.rt.client.ui.action.keystroke.KeyStroke; +import org.eclipse.scout.rt.client.ui.action.view.IViewButton; +import org.eclipse.scout.rt.ui.rap.IRwtEnvironment; +import org.eclipse.scout.rt.ui.rap.util.RwtUtility; +import org.eclipse.swt.SWT; + +public class RwtScoutToolbarAction extends Action { + private static final long serialVersionUID = 1L; + + private static final IScoutLogger LOG = ScoutLogManager.getLogger(RwtScoutToolbarAction.class); + + private IAction m_scoutAction; + private IRwtEnvironment m_swtEnvironment; + private final OptimisticLock m_updateSwtFromScoutLock; + private boolean m_updateUi = true; + + private P_ScoutPropertyChangeListener m_scoutPropertyListener; + + private IToolBarManager m_toolbarMananger; + + public RwtScoutToolbarAction(IAction scoutAction, IToolBarManager manager, IRwtEnvironment environment) { + super((scoutAction.getText() == null) ? (" ") : scoutAction.getText(), transformScoutStyle(scoutAction)); + m_toolbarMananger = manager; + m_swtEnvironment = environment; + m_updateSwtFromScoutLock = new OptimisticLock(); + m_scoutAction = scoutAction; + setId(getScoutObject().getActionId()); + attachScout(); + m_scoutAction.addPropertyChangeListener(new P_ScoutPropertyChangeListener()); + } + + private static int transformScoutStyle(IAction scoutAction) { + if (scoutAction.isToggleAction()) { + return SWT.TOGGLE; + } + return AS_PUSH_BUTTON; + } + + protected void attachScout() { + try { + setUpdateUi(false); + updateEnabledFromScout(); + updateIconFromScout(); + updateKeystrokeFromScout(); + updateSelectedFromScout(); + updateTextFromScout(); + updateTooltipTextFromScout(); + } + finally { + setUpdateUi(true); + } + } + + /** + * @return the swtEnvironment + */ + public IRwtEnvironment getEnvironment() { + return m_swtEnvironment; + } + + protected IAction getScoutObject() { + return m_scoutAction; + } + + /** + * @param updateUi + * the updateUi to set + */ + public void setUpdateUi(boolean updateUi) { + if (updateUi != m_updateUi) { + m_updateUi = updateUi; + if (updateUi) { + m_toolbarMananger.update(true); + } + } + } + + /** + * @return the updateUi + */ + public boolean isUpdateUi() { + return m_updateUi; + } + + protected void updateEnabledFromScout() { + setEnabled(getScoutObject().isEnabled()); + if (isUpdateUi()) { + m_toolbarMananger.update(true); + } + } + + protected void updateIconFromScout() { + setImageDescriptor(getEnvironment().getImageDescriptor(getScoutObject().getIconId())); + if (isUpdateUi()) { + m_toolbarMananger.update(true); + } + } + + protected void updateKeystrokeFromScout() { + String keyStroke = getScoutObject().getKeyStroke(); + if (keyStroke != null) { + int keyCode = RwtUtility.getRwtKeyCode(new KeyStroke(keyStroke)); + int stateMask = RwtUtility.getRwtStateMask(new KeyStroke(keyStroke)); + setAccelerator(stateMask | keyCode); + } + else { + setAccelerator(SWT.NONE); + } + if (isUpdateUi()) { + m_toolbarMananger.update(true); + } + } + + protected void updateTextFromScout() { + + setText(getScoutObject().getText()); + if (isUpdateUi()) { + m_toolbarMananger.update(true); + } + } + + protected void updateTooltipTextFromScout() { + setToolTipText(getScoutObject().getTooltipText()); + if (isUpdateUi()) { + m_toolbarMananger.update(true); + } + } + + protected void updateSelectedFromScout() { + setChecked(getScoutObject().isSelected()); + if (isUpdateUi()) { + m_toolbarMananger.update(true); + } + } + + protected void updateVisibleFromScout() { + LOG.warn("set visible on SWT action is not supported"); + } + + @Override + public void run() { + handleSwtAction(); + } + + protected void handleSwtAction() { + try { + if (getUpdateSwtFromScoutLock().acquire()) { + if (getScoutObject().isToggleAction() && getScoutObject() instanceof IViewButton && getScoutObject().isSelected()) { + // reset UI selection + updateSelectedFromScout(); + } + else { + Runnable t = new Runnable() { + @Override + public void run() { +// if (getScoutObject().isToggleAction()) { +// if (getScoutObject() instanceof IViewButton && getScoutObject().isSelected()) { +// // void +// } +// else { +// getScoutObject().getUIFacade().setSelectedFromUI(!getScoutObject().isSelected()); +// } +// } + + getScoutObject().getUIFacade().fireActionFromUI(); + } + }; + getEnvironment().invokeScoutLater(t, 0); + } + } + } + finally { + getUpdateSwtFromScoutLock().release(); + } + } + + /** + * @return the lock used in the Swt thread when applying scout changes + */ + public OptimisticLock getUpdateSwtFromScoutLock() { + return m_updateSwtFromScoutLock; + } + + protected void handleScoutPropertyChange(String propertyName, Object newValue) { + if (IAction.PROP_ENABLED.equals(propertyName)) { + updateEnabledFromScout(); + } + else if (IAction.PROP_ICON_ID.equals(propertyName)) { + updateIconFromScout(); + } + else if (IAction.PROP_KEYSTROKE.equals(propertyName)) { + updateKeystrokeFromScout(); + } + else if (IAction.PROP_SELECTED.equals(propertyName)) { + updateSelectedFromScout(); + } + else if (IAction.PROP_TEXT.equals(propertyName)) { + updateTextFromScout(); + } + else if (IAction.PROP_TOOLTIP_TEXT.equals(propertyName)) { + updateTooltipTextFromScout(); + } + else if (IAction.PROP_VISIBLE.equals(propertyName)) { + updateVisibleFromScout(); + } + + } + + private class P_ScoutPropertyChangeListener implements PropertyChangeListener { + @Override + public void propertyChange(final PropertyChangeEvent evt) { + Runnable t = new Runnable() { + @Override + public void run() { + try { + getUpdateSwtFromScoutLock().acquire(); + // + handleScoutPropertyChange(evt.getPropertyName(), evt.getNewValue()); + } + finally { + getUpdateSwtFromScoutLock().release(); + } + } + + }; + getEnvironment().invokeUiLater(t); + + } + } + +} diff --git a/org.eclipse.scout.rt.ui.rap/src/org/eclipse/scout/rt/ui/rap/window/AbstractRwtScoutPart.java b/org.eclipse.scout.rt.ui.rap/src/org/eclipse/scout/rt/ui/rap/window/AbstractRwtScoutPart.java index 73200e5e07..8c5bc10cd3 100644 --- a/org.eclipse.scout.rt.ui.rap/src/org/eclipse/scout/rt/ui/rap/window/AbstractRwtScoutPart.java +++ b/org.eclipse.scout.rt.ui.rap/src/org/eclipse/scout/rt/ui/rap/window/AbstractRwtScoutPart.java @@ -12,9 +12,13 @@ package org.eclipse.scout.rt.ui.rap.window; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; +import java.util.List; +import org.eclipse.jface.action.IToolBarManager; import org.eclipse.scout.commons.logger.IScoutLogger; import org.eclipse.scout.commons.logger.ScoutLogManager; +import org.eclipse.scout.rt.client.ui.action.ActionUtility; +import org.eclipse.scout.rt.client.ui.action.tool.IToolButton; import org.eclipse.scout.rt.client.ui.desktop.DesktopEvent; import org.eclipse.scout.rt.client.ui.desktop.DesktopListener; import org.eclipse.scout.rt.client.ui.desktop.IDesktop; @@ -22,6 +26,8 @@ import org.eclipse.scout.rt.client.ui.form.IForm; import org.eclipse.scout.rt.client.ui.form.fields.IFormField; import org.eclipse.scout.rt.client.ui.form.fields.button.IButton; import org.eclipse.scout.rt.ui.rap.IRwtEnvironment; +import org.eclipse.scout.rt.ui.rap.action.RwtScoutToolbarAction; +import org.eclipse.ui.forms.widgets.Form; /** * Abstract rwt scout part composite for a form. @@ -100,6 +106,7 @@ public abstract class AbstractRwtScoutPart implements IRwtScoutPart { } protected void attachScout() { + updateToolbarActionsFromScout(); IForm form = getScoutObject(); // listeners form.addPropertyChangeListener(m_formPropertyListener); @@ -128,6 +135,25 @@ public abstract class AbstractRwtScoutPart implements IRwtScoutPart { setCloseEnabledFromScout(closable); } + /** + * + */ + protected void updateToolbarActionsFromScout() { + Form uiForm = getUiForm(); + if (uiForm == null) { + return; + } + List<IToolButton> toolbuttons = ActionUtility.visibleNormalizedActions(getScoutObject().getToolbuttons()); + if (!toolbuttons.isEmpty()) { + IToolBarManager toolBarManager = uiForm.getToolBarManager(); + for (IToolButton b : toolbuttons) { + toolBarManager.add(new RwtScoutToolbarAction(b, toolBarManager, getUiEnvironment())); + } + toolBarManager.update(true); + } + + } + protected void detachScout() { // listeners getScoutObject().removePropertyChangeListener(m_formPropertyListener); diff --git a/org.eclipse.scout.rt.ui.rap/src/org/eclipse/scout/rt/ui/rap/window/desktop/nonmodalFormBar/RwtScoutFormButton.java b/org.eclipse.scout.rt.ui.rap/src/org/eclipse/scout/rt/ui/rap/window/desktop/nonmodalFormBar/RwtScoutFormButton.java index 5548eb9d2e..d38465e968 100644 --- a/org.eclipse.scout.rt.ui.rap/src/org/eclipse/scout/rt/ui/rap/window/desktop/nonmodalFormBar/RwtScoutFormButton.java +++ b/org.eclipse.scout.rt.ui.rap/src/org/eclipse/scout/rt/ui/rap/window/desktop/nonmodalFormBar/RwtScoutFormButton.java @@ -78,11 +78,9 @@ public class RwtScoutFormButton extends RwtScoutComposite<IAction> implements IR protected void handleUiSelection() { //notify Scout - final boolean selected = getUiField().getSelection(); Runnable t = new Runnable() { @Override public void run() { - getScoutObject().getUIFacade().setSelectedFromUI(selected); getScoutObject().getUIFacade().fireActionFromUI(); } }; diff --git a/org.eclipse.scout.rt.ui.rap/src/org/eclipse/scout/rt/ui/rap/window/desktop/toolbar/RwtScoutToolButton.java b/org.eclipse.scout.rt.ui.rap/src/org/eclipse/scout/rt/ui/rap/window/desktop/toolbar/RwtScoutToolButton.java index ac2369807b..7dc222c978 100644 --- a/org.eclipse.scout.rt.ui.rap/src/org/eclipse/scout/rt/ui/rap/window/desktop/toolbar/RwtScoutToolButton.java +++ b/org.eclipse.scout.rt.ui.rap/src/org/eclipse/scout/rt/ui/rap/window/desktop/toolbar/RwtScoutToolButton.java @@ -67,11 +67,9 @@ public class RwtScoutToolButton extends RwtScoutComposite<IAction> implements IR protected void handleUiSelection() { //notify Scout - final boolean selected = getUiField().getSelection(); Runnable t = new Runnable() { @Override public void run() { - getScoutObject().getUIFacade().setSelectedFromUI(selected); getScoutObject().getUIFacade().fireActionFromUI(); } }; diff --git a/org.eclipse.scout.rt.ui.rap/src/org/eclipse/scout/rt/ui/rap/window/desktop/toolbar/RwtScoutToolButtonBar.java b/org.eclipse.scout.rt.ui.rap/src/org/eclipse/scout/rt/ui/rap/window/desktop/toolbar/RwtScoutToolButtonBar.java index ee8dcaf632..e25798b372 100644 --- a/org.eclipse.scout.rt.ui.rap/src/org/eclipse/scout/rt/ui/rap/window/desktop/toolbar/RwtScoutToolButtonBar.java +++ b/org.eclipse.scout.rt.ui.rap/src/org/eclipse/scout/rt/ui/rap/window/desktop/toolbar/RwtScoutToolButtonBar.java @@ -187,7 +187,7 @@ public class RwtScoutToolButtonBar extends RwtScoutComposite<IDesktop> implement public void run() { for (IToolButton scoutButton : getScoutObject().getToolButtons()) { if (scoutButton.isSelected()) { - scoutButton.getUIFacade().setSelectedFromUI(false); + scoutButton.getUIFacade().fireActionFromUI(); } } } diff --git a/org.eclipse.scout.rt.ui.swing/src/org/eclipse/scout/rt/ui/swing/action/AbstractSwingScoutActionButton.java b/org.eclipse.scout.rt.ui.swing/src/org/eclipse/scout/rt/ui/swing/action/AbstractSwingScoutActionButton.java index 424c328302..2fa2428040 100644 --- a/org.eclipse.scout.rt.ui.swing/src/org/eclipse/scout/rt/ui/swing/action/AbstractSwingScoutActionButton.java +++ b/org.eclipse.scout.rt.ui.swing/src/org/eclipse/scout/rt/ui/swing/action/AbstractSwingScoutActionButton.java @@ -12,8 +12,6 @@ package org.eclipse.scout.rt.ui.swing.action; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; -import java.awt.event.ItemEvent; -import java.awt.event.ItemListener; import javax.swing.AbstractButton; import javax.swing.Action; @@ -52,7 +50,6 @@ public abstract class AbstractSwingScoutActionButton<T extends IAction> extends setSwingField(swingButton); // attach swing listeners swingButton.addActionListener(new P_SwingActionListener()); - swingButton.addItemListener(new P_SwingSelectionListener()); } @Override @@ -128,23 +125,6 @@ public abstract class AbstractSwingScoutActionButton<T extends IAction> extends } } - protected void setSelectionFromSwing(final boolean b) { - if (getUpdateSwingFromScoutLock().isAcquired()) { - return; - } - // - // notify Scout - Runnable t = new Runnable() { - @Override - public void run() { - getScoutObject().getUIFacade().setSelectedFromUI(b); - } - }; - - getSwingEnvironment().invokeScoutLater(t, 0); - // end notify - } - /** * in swing thread */ @@ -205,11 +185,4 @@ public abstract class AbstractSwingScoutActionButton<T extends IAction> extends } }// end class - private class P_SwingSelectionListener implements ItemListener { - @Override - public void itemStateChanged(ItemEvent e) { - setSelectionFromSwing(getSwingField().isSelected()); - } - }// end private class - } diff --git a/org.eclipse.scout.rt.ui.swing/src/org/eclipse/scout/rt/ui/swing/action/SwingScoutCheckBoxMenu.java b/org.eclipse.scout.rt.ui.swing/src/org/eclipse/scout/rt/ui/swing/action/SwingScoutCheckBoxMenu.java index 2c2f51e86b..5470dec6c9 100644 --- a/org.eclipse.scout.rt.ui.swing/src/org/eclipse/scout/rt/ui/swing/action/SwingScoutCheckBoxMenu.java +++ b/org.eclipse.scout.rt.ui.swing/src/org/eclipse/scout/rt/ui/swing/action/SwingScoutCheckBoxMenu.java @@ -4,7 +4,7 @@ * 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: * BSI Business Systems Integration AG - initial API and implementation ******************************************************************************/ @@ -17,10 +17,10 @@ import javax.swing.Action; import javax.swing.JCheckBoxMenuItem; import javax.swing.JComponent; -import org.eclipse.scout.rt.client.ui.action.menu.checkbox.ICheckBoxMenu; +import org.eclipse.scout.rt.client.ui.action.menu.IMenu; import org.eclipse.scout.rt.ui.swing.basic.SwingScoutComposite; -public class SwingScoutCheckBoxMenu<T extends ICheckBoxMenu> extends SwingScoutComposite<T> implements ISwingScoutAction<T> { +public class SwingScoutCheckBoxMenu<T extends IMenu> extends SwingScoutComposite<T> implements ISwingScoutAction<T> { private SwingScoutAction<T> m_actionComposite; @Override @@ -69,7 +69,7 @@ public class SwingScoutCheckBoxMenu<T extends ICheckBoxMenu> extends SwingScoutC @Override protected void attachScout() { super.attachScout(); - ICheckBoxMenu scoutAction = getScoutObject(); + IMenu scoutAction = getScoutObject(); setSelectedFromScout(scoutAction.isSelected()); } @@ -83,7 +83,7 @@ public class SwingScoutCheckBoxMenu<T extends ICheckBoxMenu> extends SwingScoutC @Override protected void handleScoutPropertyChange(String name, Object newValue) { super.handleScoutPropertyChange(name, newValue); - if (name.equals(ICheckBoxMenu.PROP_SELECTED)) { + if (name.equals(IMenu.PROP_SELECTED)) { setSelectedFromScout(((Boolean) newValue).booleanValue()); } } diff --git a/org.eclipse.scout.rt.ui.swing/src/org/eclipse/scout/rt/ui/swing/inject/ActionInjector.java b/org.eclipse.scout.rt.ui.swing/src/org/eclipse/scout/rt/ui/swing/inject/ActionInjector.java index 5ddc3987f7..8a2b589b8c 100644 --- a/org.eclipse.scout.rt.ui.swing/src/org/eclipse/scout/rt/ui/swing/inject/ActionInjector.java +++ b/org.eclipse.scout.rt.ui.swing/src/org/eclipse/scout/rt/ui/swing/inject/ActionInjector.java @@ -15,7 +15,7 @@ import javax.swing.JComponent; import org.eclipse.scout.commons.logger.IScoutLogger; import org.eclipse.scout.commons.logger.ScoutLogManager; import org.eclipse.scout.rt.client.ui.action.IAction; -import org.eclipse.scout.rt.client.ui.action.menu.checkbox.ICheckBoxMenu; +import org.eclipse.scout.rt.client.ui.action.menu.IMenu; import org.eclipse.scout.rt.client.ui.action.tool.IToolButton; import org.eclipse.scout.rt.client.ui.action.tree.IActionNode; import org.eclipse.scout.rt.client.ui.action.view.IViewButton; @@ -44,9 +44,9 @@ public class ActionInjector { else if (action instanceof IViewButton) { return createSwingScoutViewButton((IViewButton) action, env); } - else if (action instanceof ICheckBoxMenu) { - ISwingScoutAction<ICheckBoxMenu> ui = new SwingScoutCheckBoxMenu<ICheckBoxMenu>(); - ui.createField((ICheckBoxMenu) action, env); + else if (action instanceof IMenu && action.isToggleAction()) { + ISwingScoutAction<IMenu> ui = new SwingScoutCheckBoxMenu<IMenu>(); + ui.createField((IMenu) action, env); return ui; } else if (action instanceof IActionNode) { diff --git a/org.eclipse.scout.rt.ui.swt/META-INF/MANIFEST.MF b/org.eclipse.scout.rt.ui.swt/META-INF/MANIFEST.MF index c896f7f122..b251378e3a 100644 --- a/org.eclipse.scout.rt.ui.swt/META-INF/MANIFEST.MF +++ b/org.eclipse.scout.rt.ui.swt/META-INF/MANIFEST.MF @@ -16,9 +16,12 @@ Export-Package: org.eclipse.scout.rt.ui.swt, org.eclipse.scout.rt.ui.swt.action, org.eclipse.scout.rt.ui.swt.basic, org.eclipse.scout.rt.ui.swt.basic.application, - org.eclipse.scout.rt.ui.swt.basic.application.coolbar, + org.eclipse.scout.rt.ui.swt.basic.calendar, + org.eclipse.scout.rt.ui.swt.basic.calendar.layout, + org.eclipse.scout.rt.ui.swt.basic.calendar.widgets, org.eclipse.scout.rt.ui.swt.basic.comp, org.eclipse.scout.rt.ui.swt.basic.table, + org.eclipse.scout.rt.ui.swt.basic.table.celleditor, org.eclipse.scout.rt.ui.swt.basic.tree, org.eclipse.scout.rt.ui.swt.busy, org.eclipse.scout.rt.ui.swt.busy.strategy.simple, @@ -36,7 +39,9 @@ Export-Package: org.eclipse.scout.rt.ui.swt, org.eclipse.scout.rt.ui.swt.form.fields, org.eclipse.scout.rt.ui.swt.form.fields.browserfield, org.eclipse.scout.rt.ui.swt.form.fields.button, + org.eclipse.scout.rt.ui.swt.form.fields.calendar, org.eclipse.scout.rt.ui.swt.form.fields.checkbox, + org.eclipse.scout.rt.ui.swt.form.fields.composer, org.eclipse.scout.rt.ui.swt.form.fields.datefield, org.eclipse.scout.rt.ui.swt.form.fields.datefield.chooser, org.eclipse.scout.rt.ui.swt.form.fields.filechooserfield, @@ -52,6 +57,7 @@ Export-Package: org.eclipse.scout.rt.ui.swt, org.eclipse.scout.rt.ui.swt.form.fields.smartfield, org.eclipse.scout.rt.ui.swt.form.fields.snapbox, org.eclipse.scout.rt.ui.swt.form.fields.snapbox.button, + org.eclipse.scout.rt.ui.swt.form.fields.snapbox.layout, org.eclipse.scout.rt.ui.swt.form.fields.splitbox, org.eclipse.scout.rt.ui.swt.form.fields.stringfield, org.eclipse.scout.rt.ui.swt.form.fields.tabbox, @@ -60,11 +66,17 @@ Export-Package: org.eclipse.scout.rt.ui.swt, org.eclipse.scout.rt.ui.swt.form.fields.treefield, org.eclipse.scout.rt.ui.swt.form.fields.wrappedformfield, org.eclipse.scout.rt.ui.swt.form.radiobuttongroup, - org.eclipse.scout.rt.ui.swt.internal;x-friends:="org.eclipse.scout.james.ui.swt", + org.eclipse.scout.rt.ui.swt.form.radiobuttongroup.layout, + org.eclipse.scout.rt.ui.swt.icons, + org.eclipse.scout.rt.ui.swt.internal, + org.eclipse.scout.rt.ui.swt.internal.debug.layout.spy, org.eclipse.scout.rt.ui.swt.keystroke, - org.eclipse.scout.rt.ui.swt.menu, + org.eclipse.scout.rt.ui.swt.login.internal, org.eclipse.scout.rt.ui.swt.services, + org.eclipse.scout.rt.ui.swt.services.common.clipboard, + org.eclipse.scout.rt.ui.swt.services.common.icon, org.eclipse.scout.rt.ui.swt.util, + org.eclipse.scout.rt.ui.swt.util.debug, org.eclipse.scout.rt.ui.swt.util.listener, org.eclipse.scout.rt.ui.swt.window, org.eclipse.scout.rt.ui.swt.window.desktop, diff --git a/org.eclipse.scout.rt.ui.swt/src/org/eclipse/scout/rt/ui/swt/SwtMenuUtility.java b/org.eclipse.scout.rt.ui.swt/src/org/eclipse/scout/rt/ui/swt/SwtMenuUtility.java index 0b571da601..e41fb266ba 100644 --- a/org.eclipse.scout.rt.ui.swt/src/org/eclipse/scout/rt/ui/swt/SwtMenuUtility.java +++ b/org.eclipse.scout.rt.ui.swt/src/org/eclipse/scout/rt/ui/swt/SwtMenuUtility.java @@ -15,33 +15,19 @@ import java.util.Collections; import java.util.LinkedList; import java.util.List; -import org.eclipse.jface.action.Action; -import org.eclipse.jface.action.ActionContributionItem; -import org.eclipse.jface.action.IContributionItem; -import org.eclipse.jface.action.IMenuManager; -import org.eclipse.jface.action.MenuManager; -import org.eclipse.jface.action.Separator; +import org.eclipse.scout.commons.CollectionUtility; import org.eclipse.scout.commons.job.JobEx; import org.eclipse.scout.commons.logger.IScoutLogger; import org.eclipse.scout.commons.logger.ScoutLogManager; -import org.eclipse.scout.rt.client.ui.action.IAction; +import org.eclipse.scout.rt.client.ui.action.ActionUtility; import org.eclipse.scout.rt.client.ui.action.menu.IMenu; -import org.eclipse.scout.rt.client.ui.action.menu.checkbox.ICheckBoxMenu; -import org.eclipse.scout.rt.client.ui.action.tree.IActionNode; import org.eclipse.scout.rt.client.ui.basic.calendar.ICalendar; import org.eclipse.scout.rt.client.ui.basic.table.ITable; import org.eclipse.scout.rt.client.ui.basic.tree.ITree; -import org.eclipse.scout.rt.ui.swt.action.SwtScoutAction; -import org.eclipse.scout.rt.ui.swt.action.SwtScoutCheckboxMenu; -import org.eclipse.scout.rt.ui.swt.action.SwtScoutMenuAction; -import org.eclipse.scout.rt.ui.swt.action.SwtScoutMenuContributionItem; -import org.eclipse.scout.rt.ui.swt.action.SwtScoutMenuGroup; -import org.eclipse.scout.rt.ui.swt.menu.AbstractSwtScoutMenu; -import org.eclipse.scout.rt.ui.swt.menu.SwtScoutCheckboxMenuItem; -import org.eclipse.scout.rt.ui.swt.menu.SwtScoutMenuItem; -import org.eclipse.swt.SWT; +import org.eclipse.scout.rt.ui.swt.action.AbstractSwtScoutMenu; +import org.eclipse.scout.rt.ui.swt.action.SwtScoutCheckboxMenuItem; +import org.eclipse.scout.rt.ui.swt.action.SwtScoutMenuItem; import org.eclipse.swt.widgets.Menu; -import org.eclipse.swt.widgets.MenuItem; public final class SwtMenuUtility { private static final IScoutLogger LOG = ScoutLogManager.getLogger(SwtMenuUtility.class); @@ -49,14 +35,26 @@ public final class SwtMenuUtility { private SwtMenuUtility() { } + public static void fillContextMenu(List<? extends IMenu> scoutMenus, Menu menu, ISwtEnvironment environment) { + if (CollectionUtility.isEmpty(scoutMenus)) { + return; + } + for (IMenu scoutMenu : ActionUtility.visibleNormalizedActions(scoutMenus)) { + createMenuItem(scoutMenu, menu, environment); + } + } + + /** + * NEW + */ public static AbstractSwtScoutMenu createMenuItem(IMenu scoutMenu, Menu swtMenu, ISwtEnvironment environment) { if (!isVisible(scoutMenu)) { return null; } if (scoutMenu.hasChildActions()) { - return new org.eclipse.scout.rt.ui.swt.menu.SwtScoutMenuGroup(scoutMenu, swtMenu, environment); + return new org.eclipse.scout.rt.ui.swt.action.SwtScoutMenuGroup(scoutMenu, swtMenu, environment); } - if (scoutMenu instanceof ICheckBoxMenu) { + if (scoutMenu.isToggleAction()) { return new SwtScoutCheckboxMenuItem(scoutMenu, swtMenu, environment); } return new SwtScoutMenuItem(scoutMenu, swtMenu, environment); @@ -109,184 +107,173 @@ public final class SwtMenuUtility { return consolidatedMenus; } - /** - * @param scoutActionNodes - * @param environment - * @return - * @deprecated since 4.0.0 use {@link org.eclipse.scout.rt.ui.swt.menu.SwtScoutMenuContributionItem} instead - * - * <pre> - * IMenu[] menus = env.getClientSession().getDesktop().getMenus(); - * List<IMenu> consolidatedMenus = SwtMenuUtility.consolidateMenus(Arrays.asList(menus)); - * List<IContributionItem> swtContributionItems = new ArrayList<IContributionItem>(); - * for (IMenu menu : consolidatedMenus) { - * swtContributionItems.add(new SwtScoutMenuContributionItem(menu, env)); - * } - * return swtContributionItems.toArray(new IContributionItem[swtContributionItems.size()]); - * </pre> - */ - @Deprecated - public static IContributionItem[] getMenuContribution(List<? extends IActionNode<?>> scoutActionNodes, ISwtEnvironment environment) { - List<IContributionItem> contributionItems = new ArrayList<IContributionItem>(); - for (IActionNode<?> scoutAction : scoutActionNodes) { - if (!scoutAction.isVisible()) { - continue; - } - if (scoutAction.isSeparator() - //ignore trailing separator - && contributionItems.size() > 0 && contributionItems.get(contributionItems.size() - 1).isSeparator()) { - continue; - } - - contributionItems.add(getMenuContributionItem(scoutAction, environment)); - } - return contributionItems.toArray(new IContributionItem[contributionItems.size()]); - } - - private static void fillMenuManager(IActionNode<?>[] scoutActionNodes, IMenuManager manager, ISwtEnvironment environment, boolean disableChildren) { - for (IActionNode<?> scoutAction : scoutActionNodes) { - if (!scoutAction.isVisible()) { - continue; - } - if (scoutAction.isSeparator() - //ignore trailing separator - && manager.getItems().length > 0 && manager.getItems()[manager.getItems().length - 1].isSeparator()) { - continue; - } - - manager.add(getMenuContributionItem(scoutAction, environment, disableChildren)); - } - } - - /** - * @param scoutAction - * @param environment - * @return - * @deprecated since 4.0.0 - */ - @Deprecated - public static IContributionItem getMenuContributionItem(IActionNode<?> scoutAction, ISwtEnvironment environment) { - return getMenuContributionItem(scoutAction, environment, false); - } - - public static IContributionItem getMenuContributionItem(IActionNode<?> scoutAction, ISwtEnvironment environment, boolean disableItem) { - - if (!scoutAction.isVisible()) { - return null; - } - - if (scoutAction.isSeparator()) { - return new Separator(); - } - - if (scoutAction.hasChildActions()) { - IMenuManager manager = new MenuManager(scoutAction.getTextWithMnemonic(), scoutAction.getActionId()); - //Disable children since menuManager itself can't be disabled - boolean disableChilds = !scoutAction.isEnabled() || disableItem; - fillMenuManager(scoutAction.getChildActions().toArray(new IActionNode<?>[scoutAction.getChildActionCount()]), manager, environment, disableChilds); - return manager; - } - - if (scoutAction instanceof IMenu) { - return new SwtScoutMenuContributionItem((IMenu) scoutAction, environment); - } - - if (scoutAction instanceof ICheckBoxMenu) { - Action swtAction = new SwtScoutAction(scoutAction, environment, SWT.CHECK).getSwtAction(); - if (disableItem) { - swtAction.setEnabled(false); - } - return new ActionContributionItem(swtAction) { - @Override - public void fill(Menu parent, int index) { - super.fill(parent, index); - } - - @Override - public boolean isDynamic() { - return true; - } - - @Override - public boolean isDirty() { - System.out.println(getAction().getText()); - return super.isDirty(); - } - - @Override - public void update(String propertyName) { - super.update(propertyName); - } - }; - } - - Action swtAction = new SwtScoutAction(scoutAction, environment).getSwtAction(); - if (disableItem) { - swtAction.setEnabled(false); - } - return new ActionContributionItem(swtAction) { - @Override - public boolean isDynamic() { - return true; - } - - @Override - public void update(String propertyName) { - MenuItem widget = (MenuItem) getWidget(); - super.update(propertyName); - widget.setText(widget.getText() + "a"); - } - }; - } - - public static void fillContextMenu(IMenu[] scoutMenus, Menu menu, ISwtEnvironment environment) { - if (scoutMenus == null || scoutMenus.length == 0) { - return; - } - - List<IActionNode> scoutActionNodes = new LinkedList<IActionNode>(); - for (IMenu scoutMenu : scoutMenus) { - scoutActionNodes.add(scoutMenu); - } - - fillContextMenu(scoutActionNodes, menu, environment); - } - - public static void fillContextMenu(List<? extends IActionNode> scoutActionNodes, Menu menu, ISwtEnvironment environment) { - if (scoutActionNodes == null || scoutActionNodes.size() == 0) { - return; - } - - List<IActionNode> cleanedScoutActions = cleanup(scoutActionNodes); - for (IActionNode scoutActionNode : cleanedScoutActions) { - fillContextMenuRec(scoutActionNode, menu, environment); - } - } - - private static void fillContextMenuRec(IActionNode<?> scoutActionNode, Menu menu, ISwtEnvironment environment) { - if (!scoutActionNode.isVisible()) { - return; - } - if (scoutActionNode.isSeparator()) { - new MenuItem(menu, SWT.SEPARATOR); - } - else if (scoutActionNode instanceof ICheckBoxMenu) { - new SwtScoutCheckboxMenu(menu, (ICheckBoxMenu) scoutActionNode, environment); - - } - else if (scoutActionNode.getChildActionCount() > 0) { - SwtScoutMenuGroup group = new SwtScoutMenuGroup(menu, scoutActionNode, environment); - Menu subMenu = new Menu(menu); - group.getSwtMenuItem().setMenu(subMenu); - List<IActionNode> childActions = cleanup(scoutActionNode.getChildActions()); - for (IActionNode<?> subAction : childActions) { - fillContextMenuRec(subAction, subMenu, environment); - } - } - else { - new SwtScoutMenuAction(menu, scoutActionNode, environment); - } - } +// /** +// * @param scoutActionNodes +// * @param environment +// * @return +// * @deprecated since 4.0.0 use {@link org.eclipse.scout.rt.ui.swt.menu.SwtScoutMenuContributionItem} instead +// * +// * <pre> +// * IMenu[] menus = env.getClientSession().getDesktop().getMenus(); +// * List<IMenu> consolidatedMenus = SwtMenuUtility.consolidateMenus(Arrays.asList(menus)); +// * List<IContributionItem> swtContributionItems = new ArrayList<IContributionItem>(); +// * for (IMenu menu : consolidatedMenus) { +// * swtContributionItems.add(new SwtScoutMenuContributionItem(menu, env)); +// * } +// * return swtContributionItems.toArray(new IContributionItem[swtContributionItems.size()]); +// * </pre> +// */ +// @Deprecated +// public static IContributionItem[] getMenuContribution(List<? extends IActionNode<?>> scoutActionNodes, ISwtEnvironment environment) { +// List<IContributionItem> contributionItems = new ArrayList<IContributionItem>(); +// for (IActionNode<?> scoutAction : scoutActionNodes) { +// if (!scoutAction.isVisible()) { +// continue; +// } +// if (scoutAction.isSeparator() +// //ignore trailing separator +// && contributionItems.size() > 0 && contributionItems.get(contributionItems.size() - 1).isSeparator()) { +// continue; +// } +// +// contributionItems.add(getMenuContributionItem(scoutAction, environment)); +// } +// return contributionItems.toArray(new IContributionItem[contributionItems.size()]); +// } + +// private static void fillMenuManager(IActionNode<?>[] scoutActionNodes, IMenuManager manager, ISwtEnvironment environment, boolean disableChildren) { +// for (IActionNode<?> scoutAction : scoutActionNodes) { +// if (!scoutAction.isVisible()) { +// continue; +// } +// if (scoutAction.isSeparator() +// //ignore trailing separator +// && manager.getItems().length > 0 && manager.getItems()[manager.getItems().length - 1].isSeparator()) { +// continue; +// } +// +// manager.add(getMenuContributionItem(scoutAction, environment, disableChildren)); +// } +// } + +// /** +// * @param scoutAction +// * @param environment +// * @return +// * @deprecated since 4.0.0 +// */ +// @Deprecated +// public static IContributionItem getMenuContributionItem(IActionNode<?> scoutAction, ISwtEnvironment environment) { +// return getMenuContributionItem(scoutAction, environment, false); +// } + +// public static IContributionItem getMenuContributionItem(IActionNode<?> scoutAction, ISwtEnvironment environment, boolean disableItem) { +// +// if (!scoutAction.isVisible()) { +// return null; +// } +// +// if (scoutAction.isSeparator()) { +// return new Separator(); +// } +// +// if (scoutAction.hasChildActions()) { +// IMenuManager manager = new MenuManager(scoutAction.getTextWithMnemonic(), scoutAction.getActionId()); +// //Disable children since menuManager itself can't be disabled +// boolean disableChilds = !scoutAction.isEnabled() || disableItem; +// fillMenuManager(scoutAction.getChildActions().toArray(new IActionNode<?>[scoutAction.getChildActionCount()]), manager, environment, disableChilds); +// return manager; +// } +// +// if (scoutAction instanceof IMenu) { +// return new SwtScoutMenuContributionItem((IMenu) scoutAction, environment); +// } +// +// if (scoutAction instanceof ICheckBoxMenu) { +// Action swtAction = new SwtScoutAction(scoutAction, environment, SWT.CHECK).getSwtAction(); +// if (disableItem) { +// swtAction.setEnabled(false); +// } +// return new ActionContributionItem(swtAction) { +// @Override +// public void fill(Menu parent, int index) { +// super.fill(parent, index); +// } +// +// @Override +// public boolean isDynamic() { +// return true; +// } +// +// @Override +// public boolean isDirty() { +// System.out.println(getAction().getText()); +// return super.isDirty(); +// } +// +// @Override +// public void update(String propertyName) { +// super.update(propertyName); +// } +// }; +// } +// +// Action swtAction = new SwtScoutAction(scoutAction, environment).getSwtAction(); +// if (disableItem) { +// swtAction.setEnabled(false); +// } +// return new ActionContributionItem(swtAction) { +// @Override +// public boolean isDynamic() { +// return true; +// } +// +// @Override +// public void update(String propertyName) { +// MenuItem widget = (MenuItem) getWidget(); +// super.update(propertyName); +// widget.setText(widget.getText() + "a"); +// } +// }; +// } + +// public static void fillContextMenu(IMenu[] scoutMenus, Menu menu, ISwtEnvironment environment) { +// if (scoutMenus == null || scoutMenus.length == 0) { +// return; +// } +// +// List<IActionNode> scoutActionNodes = new LinkedList<IActionNode>(); +// for (IMenu scoutMenu : scoutMenus) { +// scoutActionNodes.add(scoutMenu); +// } +// +// fillContextMenu(scoutActionNodes, menu, environment); +// } + +// private static void fillContextMenuRec(IMenu scoutActionNode, Menu menu, ISwtEnvironment environment) { +// if (!scoutActionNode.isVisible()) { +// return; +// } +// if (scoutActionNode.isSeparator()) { +// new MenuItem(menu, SWT.SEPARATOR); +// } +// else if (scoutActionNode.isToggleAction()) { +// new SwtScoutCheckboxMenu(menu, (ICheckBoxMenu) scoutActionNode, environment); +// +// } +// else if (scoutActionNode.getChildActionCount() > 0) { +// SwtScoutMenuGroup group = new SwtScoutMenuGroup(menu, scoutActionNode, environment); +// Menu subMenu = new Menu(menu); +// group.getSwtMenuItem().setMenu(subMenu); +// List<IMenu> childActions = ActionUtility.visibleNormalizedActions(scoutActionNode.getChildActions()); +// for (IMenu subAction : childActions) { +// fillContextMenuRec(subAction, subMenu, environment); +// } +// } +// else { +// new SwtScoutMenuAction(menu, scoutActionNode, environment); +// } +// } public static List<IMenu> collectMenus(final ITree tree, final boolean emptySpaceActions, final boolean nodeActions, ISwtEnvironment uiEnvironment) { final List<IMenu> menuList = new LinkedList<IMenu>(); @@ -387,54 +374,54 @@ public final class SwtMenuUtility { return collectMenus(calendar, true, false, swtEnvironment); } - /** - * Removes invisible actions. Also removes leading and trailing separators as well as multiple consecutive separators. - * - * @since 3.8.1 - */ - public static List<IActionNode> cleanup(List<? extends IActionNode> scoutActionNodes) { - if (scoutActionNodes == null) { - return null; - } - - List<IActionNode> cleanedActions = new LinkedList<IActionNode>(); - for (int i = 0; i < scoutActionNodes.size(); i++) { - IActionNode actionNode = scoutActionNodes.get(i); - //Ignore invisible actions - if (!actionNode.isVisible()) { - continue; - } - if (actionNode.isSeparator()) { - //Ignore leading and trailing separators - if (i == 0 || i == scoutActionNodes.size() - 1) { - continue; - } - //Ignore multiple consecutive separators - IAction nextVisibleAction = getFirstVisibleAction(scoutActionNodes, i + 1); - if (nextVisibleAction == null || nextVisibleAction.isSeparator()) { - continue; - } - } - - cleanedActions.add(actionNode); - } - - return cleanedActions; - } - - private static IAction getFirstVisibleAction(List<? extends IActionNode> scoutActionNodes, int startIndex) { - if (scoutActionNodes == null) { - return null; - } - - for (int i = startIndex; i < scoutActionNodes.size(); i++) { - IActionNode action = scoutActionNodes.get(i); - if (action.isVisible()) { - return action; - } - } - - return null; - } +// /** +// * Removes invisible actions. Also removes leading and trailing separators as well as multiple consecutive separators. +// * +// * @since 3.8.1 +// */ +// public static <T extends IActionNode> List<T> cleanup(List<T> scoutActionNodes) { +// if (scoutActionNodes == null) { +// return null; +// } +// +// List<T> cleanedActions = new ArrayList<T>(scoutActionNodes.size()); +// for (int i = 0; i < scoutActionNodes.size(); i++) { +// T actionNode = scoutActionNodes.get(i); +// //Ignore invisible actions +// if (!actionNode.isVisible()) { +// continue; +// } +// if (actionNode.isSeparator()) { +// //Ignore leading and trailing separators +// if (i == 0 || i == scoutActionNodes.size() - 1) { +// continue; +// } +// //Ignore multiple consecutive separators +// IAction nextVisibleAction = getFirstVisibleAction(scoutActionNodes, i + 1); +// if (nextVisibleAction == null || nextVisibleAction.isSeparator()) { +// continue; +// } +// } +// +// cleanedActions.add(actionNode); +// } +// +// return cleanedActions; +// } + +// private static IAction getFirstVisibleAction(List<? extends IActionNode> scoutActionNodes, int startIndex) { +// if (scoutActionNodes == null) { +// return null; +// } +// +// for (int i = startIndex; i < scoutActionNodes.size(); i++) { +// IActionNode action = scoutActionNodes.get(i); +// if (action.isVisible()) { +// return action; +// } +// } +// +// return null; +// } } diff --git a/org.eclipse.scout.rt.ui.swt/src/org/eclipse/scout/rt/ui/swt/action/AbstractSwtMenuAction.java b/org.eclipse.scout.rt.ui.swt/src/org/eclipse/scout/rt/ui/swt/action/AbstractSwtMenuAction.java deleted file mode 100644 index 90d60a7576..0000000000 --- a/org.eclipse.scout.rt.ui.swt/src/org/eclipse/scout/rt/ui/swt/action/AbstractSwtMenuAction.java +++ /dev/null @@ -1,184 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2010 BSI Business Systems Integration AG. - * 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: - * BSI Business Systems Integration AG - initial API and implementation - ******************************************************************************/ -package org.eclipse.scout.rt.ui.swt.action; - -import org.eclipse.scout.commons.StringUtility; -import org.eclipse.scout.commons.logger.IScoutLogger; -import org.eclipse.scout.commons.logger.ScoutLogManager; -import org.eclipse.scout.rt.client.ui.action.IAction; -import org.eclipse.scout.rt.client.ui.action.keystroke.IKeyStroke; -import org.eclipse.scout.rt.client.ui.action.keystroke.KeyStroke; -import org.eclipse.scout.rt.ui.swt.ISwtEnvironment; -import org.eclipse.scout.rt.ui.swt.keystroke.ISwtKeyStroke; -import org.eclipse.scout.rt.ui.swt.util.SwtUtility; -import org.eclipse.swt.events.DisposeEvent; -import org.eclipse.swt.events.DisposeListener; -import org.eclipse.swt.events.SelectionAdapter; -import org.eclipse.swt.events.SelectionEvent; -import org.eclipse.swt.events.SelectionListener; -import org.eclipse.swt.widgets.Menu; -import org.eclipse.swt.widgets.MenuItem; - -/** - * Common code for the SWT widgets (sub classes of {@link MenuItem}) rendering {@link IAction}. - */ -public class AbstractSwtMenuAction extends AbstractSwtScoutAction { - private static final IScoutLogger LOG = ScoutLogManager.getLogger(AbstractSwtMenuAction.class); - - private boolean m_initialized; - private MenuItem m_swtMenuItem; - private final Menu m_swtMenu; - // cache - private ISwtKeyStroke[] m_swtKeyStrokes; - - private SelectionListener m_menuSelectionListener; - - public AbstractSwtMenuAction(Menu swtMenu, IAction action, boolean createInitial, ISwtEnvironment environment) { - super(action, environment); - m_swtMenu = swtMenu; - if (createInitial) { - callInitializers(m_swtMenu); - } - - m_swtMenu.addDisposeListener(new DisposeListener() { - private static final long serialVersionUID = 1L; - - @Override - public void widgetDisposed(DisposeEvent event) { - disconnectFromScout(); - } - }); - } - - protected final void callInitializers(Menu swtMenu) { - if (m_initialized) { - return; - } - else { - m_initialized = true; - // - initializeSwt(swtMenu); - connectToScout(); - } - } - - @Override - protected void setIconFromScout(String iconId) { - if (!getSwtMenuItem().isDisposed()) { - getSwtMenuItem().setImage(getEnvironment().getIcon(iconId)); - } - } - - @Override - protected void setTooltipTextFromScout(String tooltipText) { - if (!StringUtility.isNullOrEmpty(tooltipText)) { - LOG.warn("unsuported method on swt"); - } - } - - /** - * @deprecated Use {@link #setTextWithMnemonicFromScout(String)} instead. - * Will be removed with the M-Release. - */ - @Deprecated - protected void setTextFromScout(String text) { - setTextWithMnemonicFromScout(text); - } - - @Override - protected void setTextWithMnemonicFromScout(String textWithMnemonic) { - if (!getSwtMenuItem().isDisposed()) { - IAction action = getScoutAction(); - if (action != null && StringUtility.hasText(action.getKeyStroke())) { - textWithMnemonic += "\t" + SwtUtility.getKeyStrokePrettyPrinted(action); - } - getSwtMenuItem().setText(textWithMnemonic); - } - } - - @Override - protected void setEnabledFromScout(boolean enabled) { - if (!getSwtMenuItem().isDisposed()) { - getSwtMenuItem().setEnabled(enabled); - } - } - - @Override - protected void setKeyStrokeFromScout(String keyStroke) { - // remove old - if (m_swtKeyStrokes != null) { - for (ISwtKeyStroke swtStroke : m_swtKeyStrokes) { - getEnvironment().removeGlobalKeyStroke(swtStroke); - } - } - m_swtKeyStrokes = null; - if (keyStroke != null) { - IKeyStroke scoutKeyStroke = new KeyStroke(getScoutAction().getKeyStroke()); - m_swtKeyStrokes = SwtUtility.getKeyStrokes(scoutKeyStroke, getEnvironment()); - for (ISwtKeyStroke swtStroke : m_swtKeyStrokes) { - getEnvironment().addGlobalKeyStroke(swtStroke); - } - } - } - - protected void initializeSwt(Menu swtMenu) { - } - - public MenuItem getSwtMenuItem() { - return m_swtMenuItem; - } - - public void setSwtMenuItem(MenuItem swtMenuItem) { - if (m_swtMenuItem != null) { - m_swtMenuItem.removeSelectionListener(m_menuSelectionListener); - } - m_swtMenuItem = swtMenuItem; - if (m_menuSelectionListener == null) { - m_menuSelectionListener = new P_MenuItemSelectionListener(); - } - - m_swtMenuItem.addSelectionListener(m_menuSelectionListener); - } - - protected Menu getSwtMenu() { - return m_swtMenu; - } - - private void handleSwtAction() { - if (SwtUtility.runSwtInputVerifier()) { - Runnable t = new Runnable() { - @Override - public void run() { - getScoutAction().getUIFacade().fireActionFromUI(); - } - }; - getEnvironment().invokeScoutLater(t, 0); - } - } - - @Override - protected boolean isHandleScoutPropertyChangeSwtThread() { - return !getSwtMenu().isDisposed(); - } - - private class P_MenuItemSelectionListener extends SelectionAdapter { - @Override - public void widgetSelected(SelectionEvent e) { - handleSwtAction(); - } - - @Override - public void widgetDefaultSelected(SelectionEvent e) { - // TODO Auto-generated method stub - super.widgetDefaultSelected(e); - } - } -} diff --git a/org.eclipse.scout.rt.ui.swt/src/org/eclipse/scout/rt/ui/swt/action/AbstractSwtScoutAction.java b/org.eclipse.scout.rt.ui.swt/src/org/eclipse/scout/rt/ui/swt/action/AbstractSwtScoutAction.java deleted file mode 100644 index b69bcf77b8..0000000000 --- a/org.eclipse.scout.rt.ui.swt/src/org/eclipse/scout/rt/ui/swt/action/AbstractSwtScoutAction.java +++ /dev/null @@ -1,100 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2013 BSI Business Systems Integration AG. - * 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: - * BSI Business Systems Integration AG - initial API and implementation - ******************************************************************************/ -package org.eclipse.scout.rt.ui.swt.action; - -import org.eclipse.scout.rt.client.ui.action.IAction; -import org.eclipse.scout.rt.ui.swt.ISwtEnvironment; -import org.eclipse.scout.rt.ui.swt.basic.AbstractSwtScoutPropertyObserver; - -/** - * Common code for SWT elements rendering the Scout model {@link IAction}. - * - * @since 3.10.0-M5 - */ -public abstract class AbstractSwtScoutAction extends AbstractSwtScoutPropertyObserver<IAction> { - - /** - * @param scoutAction - * @param environment - */ - public AbstractSwtScoutAction(IAction scoutAction, ISwtEnvironment environment) { - setScoutObjectAndSwtEnvironment(scoutAction, environment); - } - - @Override - protected void applyScoutProperties() { - IAction scoutAction = getScoutAction(); - setEnabledFromScout(scoutAction.isEnabled()); - setTextWithMnemonicFromScout(scoutAction.getTextWithMnemonic()); - setTooltipTextFromScout(scoutAction.getTooltipText()); - setIconFromScout(scoutAction.getIconId()); - setKeyStrokeFromScout(scoutAction.getKeyStroke()); - } - - /** - * @param enabled - * value corresponding to {@link IAction#isEnabled()} - */ - protected abstract void setEnabledFromScout(boolean enabled); - - /** - * @param textWithMnemonic - * value corresponding to {@link IAction#getTextWithMnemonic()} - */ - protected abstract void setTextWithMnemonicFromScout(String textWithMnemonic); - - /** - * @param tooltipText - * value corresponding to {@link IAction#getTooltipText()} - */ - protected abstract void setTooltipTextFromScout(String tooltipText); - - /** - * @param iconId - * value corresponding to {@link IAction#getIconId()} - */ - protected abstract void setIconFromScout(String iconId); - - /** - * @param keyStroke - * value corresponding to {@link IAction#getKeyStroke()} - */ - protected abstract void setKeyStrokeFromScout(String keyStroke); - - /** - * Convenience for {@link #getScoutObject()}. - */ - public IAction getScoutAction() { - return getScoutObject(); - } - - /** - * in swt thread - */ - @Override - protected void handleScoutPropertyChange(String name, Object newValue) { - if (name.equals(IAction.PROP_ENABLED)) { - setEnabledFromScout(((Boolean) newValue).booleanValue()); - } - else if (name.equals(IAction.PROP_TEXT_WITH_MNEMONIC)) { - setTextWithMnemonicFromScout((String) newValue); - } - else if (name.equals(IAction.PROP_TOOLTIP_TEXT)) { - setTooltipTextFromScout((String) newValue); - } - else if (name.equals(IAction.PROP_ICON_ID)) { - setIconFromScout((String) newValue); - } - else if (name.equals(IAction.PROP_KEYSTROKE)) { - setKeyStrokeFromScout((String) newValue); - } - } -} diff --git a/org.eclipse.scout.rt.ui.swt/src/org/eclipse/scout/rt/ui/swt/menu/AbstractSwtScoutMenu.java b/org.eclipse.scout.rt.ui.swt/src/org/eclipse/scout/rt/ui/swt/action/AbstractSwtScoutMenu.java index d54a35031d..77648805e4 100644 --- a/org.eclipse.scout.rt.ui.swt/src/org/eclipse/scout/rt/ui/swt/menu/AbstractSwtScoutMenu.java +++ b/org.eclipse.scout.rt.ui.swt/src/org/eclipse/scout/rt/ui/swt/action/AbstractSwtScoutMenu.java @@ -8,13 +8,12 @@ * Contributors: * BSI Business Systems Integration AG - initial API and implementation ******************************************************************************/ -package org.eclipse.scout.rt.ui.swt.menu; +package org.eclipse.scout.rt.ui.swt.action; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import org.eclipse.scout.rt.client.ui.action.menu.IMenu; -import org.eclipse.scout.rt.client.ui.action.menu.checkbox.ICheckBoxMenu; import org.eclipse.scout.rt.ui.swt.ISwtEnvironment; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Event; @@ -89,7 +88,7 @@ public abstract class AbstractSwtScoutMenu { if (scoutMenu.hasChildActions()) { flags = SWT.CASCADE; } - else if (getScoutMenu() instanceof ICheckBoxMenu) { + else if (getScoutMenu().isToggleAction()) { flags = SWT.CHECK; } MenuItem swtMenuItem = new MenuItem(parentMenu, flags); diff --git a/org.eclipse.scout.rt.ui.swt/src/org/eclipse/scout/rt/ui/swt/action/SwtScoutAction.java b/org.eclipse.scout.rt.ui.swt/src/org/eclipse/scout/rt/ui/swt/action/SwtScoutAction.java deleted file mode 100644 index 72cd1f25c7..0000000000 --- a/org.eclipse.scout.rt.ui.swt/src/org/eclipse/scout/rt/ui/swt/action/SwtScoutAction.java +++ /dev/null @@ -1,137 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2010 BSI Business Systems Integration AG. - * 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: - * BSI Business Systems Integration AG - initial API and implementation - ******************************************************************************/ -package org.eclipse.scout.rt.ui.swt.action; - -import org.eclipse.jface.action.Action; -import org.eclipse.scout.commons.logger.IScoutLogger; -import org.eclipse.scout.commons.logger.ScoutLogManager; -import org.eclipse.scout.rt.client.ui.action.IAction; -import org.eclipse.scout.rt.client.ui.action.keystroke.KeyStroke; -import org.eclipse.scout.rt.ui.swt.ISwtEnvironment; -import org.eclipse.scout.rt.ui.swt.util.SwtUtility; -import org.eclipse.swt.SWT; - -/** - * <h3>SwtScoutAction</h3> ... - * - * @since 1.0.0 28.03.2008 - */ -public class SwtScoutAction extends AbstractSwtScoutAction { - private static final IScoutLogger LOG = ScoutLogManager.getLogger(SwtScoutAction.class); - - private boolean m_initialized; - private final Action m_swtAction; - //ticket 86811: avoid double-action in queue - private boolean m_handleActionPending; - - public SwtScoutAction(IAction scoutAction, ISwtEnvironment environment) { - this(scoutAction, environment, Action.AS_PUSH_BUTTON); - } - - public SwtScoutAction(IAction scoutAction, ISwtEnvironment environment, int style) { - super(scoutAction, environment); - m_swtAction = new P_SwtAction(style); - callInitializers(m_swtAction); - } - - /** - * @param swtAction - */ - private void callInitializers(Action swtAction) { - if (m_initialized) { - return; - } - else { - m_initialized = true; - // - initializeSwt(swtAction); - connectToScout(); - } - } - - /** - * @param swtAction - */ - protected void initializeSwt(Action swtAction) { - } - - protected void handleSwtAction() { - if (SwtUtility.runSwtInputVerifier()) { - if (!m_handleActionPending) { - m_handleActionPending = true; - Runnable job = new Runnable() { - @Override - public void run() { - try { - getScoutAction().getUIFacade().fireActionFromUI(); - } - finally { - m_handleActionPending = false; - } - } - }; - getEnvironment().invokeScoutLater(job, 0); - } - } - } - - public Action getSwtAction() { - return m_swtAction; - } - - private class P_SwtAction extends Action { - P_SwtAction(int style) { - super("", style); - } - - @Override - public void run() { - handleSwtAction(); - } - - @Override - public boolean isChecked() { - return super.isChecked(); - } - } // end P_SwtAction - - @Override - protected void setEnabledFromScout(boolean enabled) { - m_swtAction.setEnabled(enabled); - } - - @Override - protected void setTextWithMnemonicFromScout(String textWithMnemonic) { - m_swtAction.setText(textWithMnemonic); - } - - @Override - protected void setTooltipTextFromScout(String tooltipText) { - m_swtAction.setToolTipText(tooltipText); - } - - @Override - protected void setIconFromScout(String iconId) { - m_swtAction.setImageDescriptor(getEnvironment().getImageDescriptor(iconId)); - } - - @Override - protected void setKeyStrokeFromScout(String keyStroke) { - if (keyStroke != null) { - int keyCode = SwtUtility.getSwtKeyCode(new KeyStroke(keyStroke)); - int stateMask = SwtUtility.getSwtStateMask(new KeyStroke(keyStroke)); - getSwtAction().setAccelerator(stateMask | keyCode); - } - else { - getSwtAction().setAccelerator(SWT.NONE); - } - } -} diff --git a/org.eclipse.scout.rt.ui.swt/src/org/eclipse/scout/rt/ui/swt/action/SwtScoutCheckboxMenu.java b/org.eclipse.scout.rt.ui.swt/src/org/eclipse/scout/rt/ui/swt/action/SwtScoutCheckboxMenu.java deleted file mode 100644 index a07536e351..0000000000 --- a/org.eclipse.scout.rt.ui.swt/src/org/eclipse/scout/rt/ui/swt/action/SwtScoutCheckboxMenu.java +++ /dev/null @@ -1,54 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2010 BSI Business Systems Integration AG. - * 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: - * BSI Business Systems Integration AG - initial API and implementation - ******************************************************************************/ -package org.eclipse.scout.rt.ui.swt.action; - -import org.eclipse.scout.rt.client.ui.action.menu.checkbox.ICheckBoxMenu; -import org.eclipse.scout.rt.ui.swt.ISwtEnvironment; -import org.eclipse.swt.SWT; -import org.eclipse.swt.widgets.Menu; -import org.eclipse.swt.widgets.MenuItem; - -public class SwtScoutCheckboxMenu extends AbstractSwtMenuAction { - - public SwtScoutCheckboxMenu(Menu swtMenu, ICheckBoxMenu scoutMenu, ISwtEnvironment environment) { - super(swtMenu, scoutMenu, true, environment); - } - - @Override - protected void initializeSwt(Menu swtMenu) { - MenuItem item = new MenuItem(swtMenu, SWT.CHECK); - setSwtMenuItem(item); - } - - @Override - protected void applyScoutProperties() { - super.applyScoutProperties(); - setSelectedFromScout(); - } - - private void setSelectedFromScout() { - if (!getSwtMenuItem().isDisposed()) { - getSwtMenuItem().setSelection(getScoutAction().isSelected()); - } - } - - /** - * in swt thread - */ - @Override - protected void handleScoutPropertyChange(String name, Object newValue) { - super.handleScoutPropertyChange(name, newValue); - if (name.equals(ICheckBoxMenu.PROP_SELECTED)) { - setSelectedFromScout(); - } - } - -} diff --git a/org.eclipse.scout.rt.ui.swt/src/org/eclipse/scout/rt/ui/swt/menu/SwtScoutCheckboxMenuItem.java b/org.eclipse.scout.rt.ui.swt/src/org/eclipse/scout/rt/ui/swt/action/SwtScoutCheckboxMenuItem.java index b487330eae..53b9abaaef 100644 --- a/org.eclipse.scout.rt.ui.swt/src/org/eclipse/scout/rt/ui/swt/menu/SwtScoutCheckboxMenuItem.java +++ b/org.eclipse.scout.rt.ui.swt/src/org/eclipse/scout/rt/ui/swt/action/SwtScoutCheckboxMenuItem.java @@ -8,7 +8,7 @@ * Contributors: * BSI Business Systems Integration AG - initial API and implementation ******************************************************************************/ -package org.eclipse.scout.rt.ui.swt.menu; +package org.eclipse.scout.rt.ui.swt.action; import org.eclipse.scout.rt.client.ui.action.menu.IMenu; import org.eclipse.scout.rt.ui.swt.ISwtEnvironment; diff --git a/org.eclipse.scout.rt.ui.swt/src/org/eclipse/scout/rt/ui/swt/action/SwtScoutMenuAction.java b/org.eclipse.scout.rt.ui.swt/src/org/eclipse/scout/rt/ui/swt/action/SwtScoutMenuAction.java deleted file mode 100644 index 52b01bf8f2..0000000000 --- a/org.eclipse.scout.rt.ui.swt/src/org/eclipse/scout/rt/ui/swt/action/SwtScoutMenuAction.java +++ /dev/null @@ -1,36 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2010 BSI Business Systems Integration AG. - * 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: - * BSI Business Systems Integration AG - initial API and implementation - ******************************************************************************/ -package org.eclipse.scout.rt.ui.swt.action; - -import org.eclipse.scout.rt.client.ui.action.IAction; -import org.eclipse.scout.rt.ui.swt.ISwtEnvironment; -import org.eclipse.swt.SWT; -import org.eclipse.swt.widgets.Menu; -import org.eclipse.swt.widgets.MenuItem; - -/** - * <h3>SwtScoutAction</h3> ... - * - * @since 1.0.0 14.03.2008 - */ -public class SwtScoutMenuAction extends AbstractSwtMenuAction { - - public SwtScoutMenuAction(Menu swtMenu, IAction action, ISwtEnvironment environment) { - super(swtMenu, action, true, environment); - } - - @Override - protected void initializeSwt(Menu swtMenu) { - MenuItem item = new MenuItem(swtMenu, SWT.PUSH); - setSwtMenuItem(item); - } - -} diff --git a/org.eclipse.scout.rt.ui.swt/src/org/eclipse/scout/rt/ui/swt/action/SwtScoutMenuContributionItem.java b/org.eclipse.scout.rt.ui.swt/src/org/eclipse/scout/rt/ui/swt/action/SwtScoutMenuContributionItem.java index b00febde73..81bf2008f9 100644 --- a/org.eclipse.scout.rt.ui.swt/src/org/eclipse/scout/rt/ui/swt/action/SwtScoutMenuContributionItem.java +++ b/org.eclipse.scout.rt.ui.swt/src/org/eclipse/scout/rt/ui/swt/action/SwtScoutMenuContributionItem.java @@ -10,46 +10,24 @@ ******************************************************************************/ package org.eclipse.scout.rt.ui.swt.action; -import java.beans.PropertyChangeEvent; -import java.beans.PropertyChangeListener; - import org.eclipse.jface.action.ContributionItem; import org.eclipse.scout.rt.client.ui.action.menu.IMenu; -import org.eclipse.scout.rt.client.ui.action.menu.checkbox.ICheckBoxMenu; import org.eclipse.scout.rt.ui.swt.ISwtEnvironment; -import org.eclipse.swt.SWT; -import org.eclipse.swt.widgets.Event; -import org.eclipse.swt.widgets.Listener; +import org.eclipse.scout.rt.ui.swt.SwtMenuUtility; import org.eclipse.swt.widgets.Menu; -import org.eclipse.swt.widgets.MenuItem; /** * */ public class SwtScoutMenuContributionItem extends ContributionItem { - - private final IMenu m_scoutMenu; - private final ISwtEnvironment m_environment; - private MenuItem m_swtMenuItem; - private boolean m_handleSelectionPending; - - private PropertyChangeListener m_scoutPropertyListener; - Listener m_uiListener; + private IMenu m_scoutMenu; + private ISwtEnvironment m_environment; + private AbstractSwtScoutMenu m_swtMenuItem; public SwtScoutMenuContributionItem(IMenu scoutMenu, ISwtEnvironment environment) { m_scoutMenu = scoutMenu; m_environment = environment; - // add scout prop listener - m_scoutPropertyListener = new P_ScoutPropertyChangeListener(); - m_scoutMenu.addPropertyChangeListener(m_scoutPropertyListener); - } - - @Override - public void dispose() { - getScoutMenu().removePropertyChangeListener(m_scoutPropertyListener); - System.out.println("do dispose...."); - super.dispose(); } public IMenu getScoutMenu() { @@ -60,228 +38,13 @@ public class SwtScoutMenuContributionItem extends ContributionItem { return m_environment; } - public MenuItem getSwtMenuItem() { + public AbstractSwtScoutMenu getSwtMenuItem() { return m_swtMenuItem; } @Override public void fill(Menu menu, int index) { - if (m_swtMenuItem == null && menu != null) { - - int flags = SWT.PUSH; - if (getScoutMenu().hasChildActions()) { - flags = SWT.CASCADE; - } - else if (getScoutMenu() instanceof ICheckBoxMenu) { - flags = SWT.CHECK; - } - MenuItem mi = null; - if (index >= 0) { - mi = new MenuItem(menu, flags, index); - } - else { - mi = new MenuItem(menu, flags); - } - m_swtMenuItem = mi; - // listeners - m_uiListener = new P_SwtMenuListener(); - menu.addListener(SWT.Show, m_uiListener); - m_swtMenuItem.addListener(SWT.Selection, m_uiListener); - m_swtMenuItem.addListener(SWT.Dispose, m_uiListener); - - m_swtMenuItem.setData(getScoutMenu()); - updateEnabledFromScout(); - updateIconFromScout(); - updateKeyStrokeFromScout(); - updateTooltipTextFromScout(); - updateTextFromScout(); - -// // child menus -// if(flags == SWT.CASCADE){ -// -//// just create a proxy for now, if the user shows it then -// // fill it in -// Menu subMenu = new Menu(parent); -// subMenu.addListener(SWT.Show, getMenuCreatorListener()); -// subMenu.addListener(SWT.Hide, getMenuCreatorListener()); -// mi.setMenu(subMenu); -// } -// mi.addListener(SWT.Dispose, getMenuItemListener()); -// mi.addListener(SWT.Selection, getMenuItemListener()); -// if (action.getHelpListener() != null) { -// mi.addHelpListener(action.getHelpListener()); -// } -// -// if (flags == SWT.CASCADE) { -// // just create a proxy for now, if the user shows it then -// // fill it in -// Menu subMenu = new Menu(parent); -// subMenu.addListener(SWT.Show, getMenuCreatorListener()); -// subMenu.addListener(SWT.Hide, getMenuCreatorListener()); -// mi.setMenu(subMenu); -// } -// -// update(null); -// -// // Attach some extra listeners. -// action.addPropertyChangeListener(propertyListener); -// if (action != null) { -// String commandId = action.getActionDefinitionId(); -// ExternalActionManager.ICallback callback = ExternalActionManager -// .getInstance().getCallback(); -// -// if ((callback != null) && (commandId != null)) { -// callback.addPropertyChangeListener(commandId, -// actionTextListener); -// } -// } - } - } - - @Override - public boolean isDirty() { - return true; - } - - @Override - public void update() { - - } - - @Override - public void update(String id) { - - } - - protected void updateKeyStrokeFromScout() { - if (getSwtMenuItem() != null) { - // void see settext mnemonic - } - } - - protected void updateIconFromScout() { - if (getSwtMenuItem() != null) { - getSwtMenuItem().setImage(getEnvironment().getIcon(getScoutMenu().getIconId())); - } - } - - protected void updateTooltipTextFromScout() { - if (getSwtMenuItem() != null) { - // not supported in swt - } - } - - protected void updateTextFromScout() { - if (getSwtMenuItem() != null) { - getSwtMenuItem().setText(getScoutMenu().getTextWithMnemonic()); - } - } - - protected void updateEnabledFromScout() { - if (getSwtMenuItem() != null) { - getSwtMenuItem().setEnabled(getScoutMenu().isEnabled()); - } - } - - protected void handleSwtMenuShow() { - //notify Scout - Runnable t = new Runnable() { - @Override - public void run() { - getScoutMenu().prepareAction(); - } - }; - getEnvironment().invokeScoutLater(t, 0); - //end notify - } - - private void handleSwtMenuDispose() { - } - - private void handleSwtMenuSelection() { - if (!m_handleSelectionPending) { - m_handleSelectionPending = true; - //notify Scout - Runnable t = new Runnable() { - @Override - public void run() { - try { - getScoutMenu().getUIFacade().fireActionFromUI(); - } - finally { - m_handleSelectionPending = false; - } - } - }; - getEnvironment().invokeScoutLater(t, 0); - //end notify - } - } - - private boolean isHandleScoutPropertyChange(String propertyName, Object newValue) { - return true; - } - - /** - * in swt thread - */ - protected void handleScoutPropertyChange(String name, Object newValue) { - if (name.equals(IMenu.PROP_ENABLED)) { - updateEnabledFromScout(); - } - else if (name.equals(IMenu.PROP_TEXT_WITH_MNEMONIC)) { - System.out.println("text[m] changed to: " + getScoutMenu().getText()); - updateTextFromScout(); - } - else if (name.equals(IMenu.PROP_TEXT)) { - System.out.println("text changed to: " + getScoutMenu().getText()); - } - else if (name.equals(IMenu.PROP_TOOLTIP_TEXT)) { - updateTooltipTextFromScout(); - } - else if (name.equals(IMenu.PROP_ICON_ID)) { - updateIconFromScout(); - } - else if (name.equals(IMenu.PROP_KEYSTROKE)) { - updateKeyStrokeFromScout(); - } - } - - private class P_ScoutPropertyChangeListener implements PropertyChangeListener { - @Override - public void propertyChange(final PropertyChangeEvent e) { - if (isHandleScoutPropertyChange(e.getPropertyName(), e.getNewValue())) { - Runnable t = new Runnable() { - @Override - public void run() { - handleScoutPropertyChange(e.getPropertyName(), e.getNewValue()); - } - - }; - getEnvironment().invokeSwtLater(t); - } - } - - }// end private class - - private class P_SwtMenuListener implements Listener { - @Override - public void handleEvent(Event event) { - switch (event.type) { - case SWT.Show: - handleSwtMenuShow(); - break; - case SWT.Selection: - handleSwtMenuSelection(); - break; - case SWT.Dispose: - handleSwtMenuDispose(); - break; - - default: - break; - } - } + m_swtMenuItem = SwtMenuUtility.createMenuItem(getScoutMenu(), menu, getEnvironment()); } } diff --git a/org.eclipse.scout.rt.ui.swt/src/org/eclipse/scout/rt/ui/swt/action/SwtScoutMenuGroup.java b/org.eclipse.scout.rt.ui.swt/src/org/eclipse/scout/rt/ui/swt/action/SwtScoutMenuGroup.java index 192a294e70..68b432921e 100644 --- a/org.eclipse.scout.rt.ui.swt/src/org/eclipse/scout/rt/ui/swt/action/SwtScoutMenuGroup.java +++ b/org.eclipse.scout.rt.ui.swt/src/org/eclipse/scout/rt/ui/swt/action/SwtScoutMenuGroup.java @@ -4,33 +4,96 @@ * 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: * BSI Business Systems Integration AG - initial API and implementation ******************************************************************************/ package org.eclipse.scout.rt.ui.swt.action; -import org.eclipse.scout.rt.client.ui.action.IAction; +import java.util.ArrayList; +import java.util.List; + +import org.eclipse.scout.rt.client.ui.action.menu.IMenu; import org.eclipse.scout.rt.ui.swt.ISwtEnvironment; +import org.eclipse.scout.rt.ui.swt.SwtMenuUtility; import org.eclipse.swt.SWT; +import org.eclipse.swt.widgets.Event; +import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.Menu; import org.eclipse.swt.widgets.MenuItem; /** - * <h3>SwtScoutMenuGroup</h3> ... - * - * @since 1.0.0 14.03.2008 + * */ -public class SwtScoutMenuGroup extends AbstractSwtMenuAction { +public class SwtScoutMenuGroup extends AbstractSwtScoutMenu { + + private Menu m_childMenu; + private List<AbstractSwtScoutMenu> m_childMenus = new ArrayList<AbstractSwtScoutMenu>(); + private Listener m_uiMenuListener; - public SwtScoutMenuGroup(Menu swtMenu, IAction menu, ISwtEnvironment environment) { - super(swtMenu, menu, true, environment); + public SwtScoutMenuGroup(IMenu scoutMenu, Menu parentMenu, ISwtEnvironment environment) { + super(scoutMenu, parentMenu, environment, false); + createMenu(scoutMenu, parentMenu, environment); } @Override - protected void initializeSwt(Menu swtMenu) { - MenuItem item = new MenuItem(swtMenu, SWT.CASCADE); - setSwtMenuItem(item); + protected void initializeUi(MenuItem swtMenuItem) { + super.initializeUi(swtMenuItem); + IMenu scoutMenu = getScoutMenu(); + if (scoutMenu.hasChildActions()) { + m_childMenu = new Menu(swtMenuItem); + SwtMenuUtility.fillContextMenu(scoutMenu.getChildActions(), m_childMenu, getEnvironment()); + swtMenuItem.setMenu(m_childMenu); + m_uiMenuListener = new P_UiMenuListener(); + m_childMenu.addListener(SWT.Show, m_uiMenuListener); + m_childMenu.addListener(SWT.Hide, m_uiMenuListener); + m_childMenu.addListener(SWT.Dispose, m_uiMenuListener); + } + } + + protected void handleSwtMenuHide() { + } + + /** + * + */ + protected void handleSwtMenuShow() { + Runnable t = new Runnable() { + @Override + public void run() { + for (AbstractSwtScoutMenu menuItem : m_childMenus) { + menuItem.getScoutMenu().prepareAction(); + } + } + }; + getEnvironment().invokeScoutLater(t, 0); + //end notify + } + + protected void handleSwtMenuDispose() { + m_childMenu.removeListener(SWT.Show, m_uiMenuListener); + m_childMenu.removeListener(SWT.Hide, m_uiMenuListener); + m_childMenu.removeListener(SWT.Dispose, m_uiMenuListener); + m_uiMenuListener = null; + + } + + private class P_UiMenuListener implements Listener { + @Override + public void handleEvent(Event event) { + switch (event.type) { + case SWT.Show: + handleSwtMenuShow(); + break; + case SWT.Hide: + handleSwtMenuHide(); + break; + case SWT.Dispose: + handleSwtMenuDispose(); + break; + } + } } + } diff --git a/org.eclipse.scout.rt.ui.swt/src/org/eclipse/scout/rt/ui/swt/menu/SwtScoutMenuItem.java b/org.eclipse.scout.rt.ui.swt/src/org/eclipse/scout/rt/ui/swt/action/SwtScoutMenuItem.java index 87bddc5f35..7f6026107b 100644 --- a/org.eclipse.scout.rt.ui.swt/src/org/eclipse/scout/rt/ui/swt/menu/SwtScoutMenuItem.java +++ b/org.eclipse.scout.rt.ui.swt/src/org/eclipse/scout/rt/ui/swt/action/SwtScoutMenuItem.java @@ -8,7 +8,7 @@ * Contributors: * BSI Business Systems Integration AG - initial API and implementation ******************************************************************************/ -package org.eclipse.scout.rt.ui.swt.menu; +package org.eclipse.scout.rt.ui.swt.action; import java.util.ArrayList; import java.util.List; diff --git a/org.eclipse.scout.rt.ui.swt/src/org/eclipse/scout/rt/ui/swt/basic/application/coolbar/CoolbarButton.java b/org.eclipse.scout.rt.ui.swt/src/org/eclipse/scout/rt/ui/swt/action/SwtScoutToolbarAction.java index 3edfe0b1d2..64e9ecb2d9 100644 --- a/org.eclipse.scout.rt.ui.swt/src/org/eclipse/scout/rt/ui/swt/basic/application/coolbar/CoolbarButton.java +++ b/org.eclipse.scout.rt.ui.swt/src/org/eclipse/scout/rt/ui/swt/action/SwtScoutToolbarAction.java @@ -1,13 +1,13 @@ /** * */ -package org.eclipse.scout.rt.ui.swt.basic.application.coolbar; +package org.eclipse.scout.rt.ui.swt.action; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import org.eclipse.jface.action.Action; -import org.eclipse.jface.action.ToolBarManager; +import org.eclipse.jface.action.IToolBarManager; import org.eclipse.scout.commons.OptimisticLock; import org.eclipse.scout.commons.logger.IScoutLogger; import org.eclipse.scout.commons.logger.ScoutLogManager; @@ -18,8 +18,8 @@ import org.eclipse.scout.rt.ui.swt.ISwtEnvironment; import org.eclipse.scout.rt.ui.swt.util.SwtUtility; import org.eclipse.swt.SWT; -public class CoolbarButton extends Action { - private static final IScoutLogger LOG = ScoutLogManager.getLogger(CoolbarButton.class); +public class SwtScoutToolbarAction extends Action { + private static final IScoutLogger LOG = ScoutLogManager.getLogger(SwtScoutToolbarAction.class); private IAction m_scoutAction; private ISwtEnvironment m_swtEnvironment; @@ -28,9 +28,9 @@ public class CoolbarButton extends Action { private P_ScoutPropertyChangeListener m_scoutPropertyListener; - private ToolBarManager m_toolbarMananger; + private IToolBarManager m_toolbarMananger; - public CoolbarButton(IAction scoutAction, ToolBarManager manager, ISwtEnvironment environment) { + public SwtScoutToolbarAction(IAction scoutAction, IToolBarManager manager, ISwtEnvironment environment) { super((scoutAction.getText() == null) ? (" ") : scoutAction.getText(), transformScoutStyle(scoutAction)); m_toolbarMananger = manager; m_swtEnvironment = environment; @@ -165,14 +165,14 @@ public class CoolbarButton extends Action { Runnable t = new Runnable() { @Override public void run() { - if (getScoutObject().isToggleAction()) { - if (getScoutObject() instanceof IViewButton && getScoutObject().isSelected()) { - // void - } - else { - getScoutObject().getUIFacade().setSelectedFromUI(!getScoutObject().isSelected()); - } - } +// if (getScoutObject().isToggleAction()) { +// if (getScoutObject() instanceof IViewButton && getScoutObject().isSelected()) { +// // void +// } +// else { +// getScoutObject().getUIFacade().setSelectedFromUI(!getScoutObject().isSelected()); +// } +// } getScoutObject().getUIFacade().fireActionFromUI(); } diff --git a/org.eclipse.scout.rt.ui.swt/src/org/eclipse/scout/rt/ui/swt/basic/application/ApplicationActionBarAdvisor.java b/org.eclipse.scout.rt.ui.swt/src/org/eclipse/scout/rt/ui/swt/basic/application/ApplicationActionBarAdvisor.java index 3f906b217d..fcb053719a 100644 --- a/org.eclipse.scout.rt.ui.swt/src/org/eclipse/scout/rt/ui/swt/basic/application/ApplicationActionBarAdvisor.java +++ b/org.eclipse.scout.rt.ui.swt/src/org/eclipse/scout/rt/ui/swt/basic/application/ApplicationActionBarAdvisor.java @@ -15,7 +15,7 @@ import org.eclipse.scout.rt.client.ui.desktop.IDesktop; import org.eclipse.scout.rt.ui.swt.ISwtEnvironment; import org.eclipse.scout.rt.ui.swt.ISwtEnvironmentListener; import org.eclipse.scout.rt.ui.swt.SwtEnvironmentEvent; -import org.eclipse.scout.rt.ui.swt.basic.application.coolbar.CoolbarButton; +import org.eclipse.scout.rt.ui.swt.action.SwtScoutToolbarAction; import org.eclipse.swt.SWT; import org.eclipse.ui.IWorkbenchActionConstants; import org.eclipse.ui.application.ActionBarAdvisor; @@ -63,16 +63,14 @@ public class ApplicationActionBarAdvisor extends ActionBarAdvisor { if (d != null) { for (IViewButton scoutViewButton : d.getViewButtons()) { if (scoutViewButton.isVisible() && scoutViewButton.isVisibleGranted()) { - System.out.println("viewButton " + scoutViewButton.getText()); - CoolbarButton swtAction = new CoolbarButton(scoutViewButton, m_toolbar, getEnvironment()); + SwtScoutToolbarAction swtAction = new SwtScoutToolbarAction(scoutViewButton, m_toolbar, getEnvironment()); contributeToCoolBar(swtAction); } } for (IToolButton scoutToolButton : d.getToolButtons()) { if (scoutToolButton.isVisible() && scoutToolButton.isVisibleGranted()) { - System.out.println("toolbutton " + scoutToolButton.getText()); - CoolbarButton swtAction = new CoolbarButton(scoutToolButton, m_toolbar, getEnvironment()); + SwtScoutToolbarAction swtAction = new SwtScoutToolbarAction(scoutToolButton, m_toolbar, getEnvironment()); contributeToCoolBar(swtAction); } } diff --git a/org.eclipse.scout.rt.ui.swt/src/org/eclipse/scout/rt/ui/swt/basic/calendar/SwtScoutCalendar.java b/org.eclipse.scout.rt.ui.swt/src/org/eclipse/scout/rt/ui/swt/basic/calendar/SwtScoutCalendar.java index 50927b44dd..01c4fe8bae 100644 --- a/org.eclipse.scout.rt.ui.swt/src/org/eclipse/scout/rt/ui/swt/basic/calendar/SwtScoutCalendar.java +++ b/org.eclipse.scout.rt.ui.swt/src/org/eclipse/scout/rt/ui/swt/basic/calendar/SwtScoutCalendar.java @@ -17,23 +17,17 @@ import java.util.Calendar; import java.util.Collection; import java.util.Date; import java.util.HashMap; -import java.util.List; import java.util.Set; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; -import org.eclipse.jface.action.Action; -import org.eclipse.jface.action.IMenuManager; -import org.eclipse.jface.action.Separator; import org.eclipse.scout.commons.OptimisticLock; import org.eclipse.scout.commons.RunnableWithData; import org.eclipse.scout.commons.WeakEventListener; import org.eclipse.scout.commons.job.JobEx; -import org.eclipse.scout.rt.client.ui.action.menu.IMenu; import org.eclipse.scout.rt.client.ui.basic.calendar.CalendarComponent; import org.eclipse.scout.rt.client.ui.basic.calendar.ICalendar; import org.eclipse.scout.rt.ui.swt.SwtMenuUtility; -import org.eclipse.scout.rt.ui.swt.action.SwtScoutAction; import org.eclipse.scout.rt.ui.swt.basic.calendar.widgets.SwtCalendar; import org.eclipse.scout.rt.ui.swt.form.fields.calendar.SwtScoutCalendarField; import org.eclipse.swt.SWT; @@ -42,6 +36,7 @@ import org.eclipse.swt.graphics.Cursor; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Listener; +import org.eclipse.swt.widgets.Menu; /** * @author Michael Rudolf, Andreas Hoegger @@ -98,38 +93,13 @@ public class SwtScoutCalendar extends SwtCalendar { } @Override - public void showGeneralContextMenu(IMenuManager manager) { - // pop up with a general menu - List<IMenu> scoutMenus = SwtMenuUtility.collectEmptySpaceMenus(m_scoutCalendarModel, m_field.getEnvironment()); - if (scoutMenus != null) { - for (IMenu menuItem : scoutMenus) { - if (menuItem instanceof IMenu) { - if (menuItem.isSeparator()) { - manager.add(new Separator()); - } - else { - manager.add(new SwtScoutAction(menuItem, m_field.getEnvironment(), Action.AS_PUSH_BUTTON).getSwtAction()); - } - } - } - } + public void showGeneralContextMenu(Menu manager) { + SwtMenuUtility.fillContextMenu(SwtMenuUtility.collectEmptySpaceMenus(m_scoutCalendarModel, m_field.getEnvironment()), manager, m_field.getEnvironment()); } @Override - public void showItemContextMenu(IMenuManager manager, Object item) { - List<IMenu> scoutMenus = SwtMenuUtility.collectComponentMenus(m_scoutCalendarModel, m_field.getEnvironment()); - if (scoutMenus != null) { - for (IMenu menuItem : scoutMenus) { - if (menuItem instanceof IMenu) { - if (menuItem.isSeparator()) { - manager.add(new Separator()); - } - else { - manager.add(new SwtScoutAction(menuItem, m_field.getEnvironment(), Action.AS_PUSH_BUTTON).getSwtAction()); - } - } - } - } + public void showItemContextMenu(Menu manager, Object item) { + SwtMenuUtility.fillContextMenu(SwtMenuUtility.collectComponentMenus(m_scoutCalendarModel, m_field.getEnvironment()), manager, m_field.getEnvironment()); } @Override diff --git a/org.eclipse.scout.rt.ui.swt/src/org/eclipse/scout/rt/ui/swt/basic/calendar/widgets/AbstractCalendarItem.java b/org.eclipse.scout.rt.ui.swt/src/org/eclipse/scout/rt/ui/swt/basic/calendar/widgets/AbstractCalendarItem.java index f40f42d28e..e2e936d84e 100644 --- a/org.eclipse.scout.rt.ui.swt/src/org/eclipse/scout/rt/ui/swt/basic/calendar/widgets/AbstractCalendarItem.java +++ b/org.eclipse.scout.rt.ui.swt/src/org/eclipse/scout/rt/ui/swt/basic/calendar/widgets/AbstractCalendarItem.java @@ -1,9 +1,9 @@ package org.eclipse.scout.rt.ui.swt.basic.calendar.widgets; -import org.eclipse.jface.action.IMenuListener; -import org.eclipse.jface.action.IMenuManager; -import org.eclipse.jface.action.MenuManager; import org.eclipse.scout.rt.ui.swt.basic.calendar.CalendarItemContainer; +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.MenuAdapter; +import org.eclipse.swt.events.MenuEvent; import org.eclipse.swt.events.MouseAdapter; import org.eclipse.swt.events.MouseEvent; import org.eclipse.swt.events.MouseTrackListener; @@ -11,6 +11,7 @@ import org.eclipse.swt.events.PaintEvent; import org.eclipse.swt.events.PaintListener; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Menu; +import org.eclipse.swt.widgets.MenuItem; /** * Base class of a week or month calendar item. @@ -25,8 +26,7 @@ public abstract class AbstractCalendarItem extends Composite implements PaintLis /** reference to parent cell */ private AbstractCell m_cell; - /** manager for context menu regarding this cell */ - private MenuManager m_menuManager; + private Menu m_contextMenu; public AbstractCalendarItem(AbstractCell parent, int style, CalendarItemContainer item) { super(parent, style); @@ -68,23 +68,16 @@ public abstract class AbstractCalendarItem extends Composite implements PaintLis } private void setupMenu() { - // create context menu (dynamic, gets filled when used) - m_menuManager = new MenuManager(); - m_menuManager.setRemoveAllWhenShown(true); - Menu contextMenu = m_menuManager.createContextMenu(this); - this.setMenu(contextMenu); + // context menu + m_contextMenu = new Menu(getShell(), SWT.POP_UP); + setMenu(m_contextMenu); } protected void hookListeners() { addPaintListener(this); // menu listener for context menu - m_menuManager.addMenuListener(new IMenuListener() { - @Override - public void menuAboutToShow(IMenuManager manager) { - m_cell.getCalendar().showItemContextMenu(manager, m_item.getItem()); - } - }); + m_contextMenu.addMenuListener(new P_ContextMenuListener()); // intercept a mouse click addMouseListener(new MouseAdapter() { @@ -135,4 +128,32 @@ public abstract class AbstractCalendarItem extends Composite implements PaintLis } } + + private class P_ContextMenuListener extends MenuAdapter { + @Override + public void menuShown(MenuEvent e) { + // clear all previous + // Windows BUG: fires menu hide before the selection on the menu item is + // propagated. + if (m_contextMenu != null) { + for (MenuItem item : m_contextMenu.getItems()) { + disposeMenuItem(item); + } + } + m_cell.getCalendar().showItemContextMenu(m_contextMenu, m_item.getItem()); + + } + + private void disposeMenuItem(MenuItem item) { + Menu menu = item.getMenu(); + if (menu != null) { + for (MenuItem childItem : menu.getItems()) { + disposeMenuItem(childItem); + } + menu.dispose(); + } + item.dispose(); + } + + } // end class P_ContextMenuListener } diff --git a/org.eclipse.scout.rt.ui.swt/src/org/eclipse/scout/rt/ui/swt/basic/calendar/widgets/AbstractCell.java b/org.eclipse.scout.rt.ui.swt/src/org/eclipse/scout/rt/ui/swt/basic/calendar/widgets/AbstractCell.java index 7a3089e24b..cb4a4f950b 100644 --- a/org.eclipse.scout.rt.ui.swt/src/org/eclipse/scout/rt/ui/swt/basic/calendar/widgets/AbstractCell.java +++ b/org.eclipse.scout.rt.ui.swt/src/org/eclipse/scout/rt/ui/swt/basic/calendar/widgets/AbstractCell.java @@ -20,9 +20,6 @@ import java.util.Date; import java.util.Locale; import java.util.TreeSet; -import org.eclipse.jface.action.IMenuListener; -import org.eclipse.jface.action.IMenuManager; -import org.eclipse.jface.action.MenuManager; import org.eclipse.scout.commons.logger.IScoutLogger; import org.eclipse.scout.commons.logger.ScoutLogManager; import org.eclipse.scout.rt.client.ui.basic.calendar.CalendarComponent; @@ -31,6 +28,8 @@ import org.eclipse.scout.rt.ui.swt.basic.calendar.CalendarItemContainer; import org.eclipse.scout.rt.ui.swt.basic.calendar.SwtColors; import org.eclipse.scout.rt.ui.swt.util.SwtUtility; import org.eclipse.swt.SWT; +import org.eclipse.swt.events.MenuAdapter; +import org.eclipse.swt.events.MenuEvent; import org.eclipse.swt.events.MouseAdapter; import org.eclipse.swt.events.MouseEvent; import org.eclipse.swt.events.PaintEvent; @@ -45,6 +44,7 @@ import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.Menu; +import org.eclipse.swt.widgets.MenuItem; /** * Abstract SWT component for a calendar (week or month) cell. @@ -77,9 +77,6 @@ public abstract class AbstractCell extends Composite implements PaintListener { private String m_weekText = null; private String m_dayText = null; - /** manager for context menu regarding this cell */ - private MenuManager m_menuManager; - /** cached CalendarItemContainer */ private TreeSet<CalendarItemContainer> m_itemsCached; @@ -89,6 +86,8 @@ public abstract class AbstractCell extends Composite implements PaintListener { /** number of timeless items within that cell */ private int m_countTimeless; + private Menu m_contextMenu; + public AbstractCell(Composite parent, int style) { super(parent, style); @@ -96,15 +95,16 @@ public abstract class AbstractCell extends Composite implements PaintListener { m_isSelected = false; + // contextMenu setupMenu(); } /** create context menu (dynamically, gets filled when used) */ protected void setupMenu() { - m_menuManager = new MenuManager(); - m_menuManager.setRemoveAllWhenShown(true); - Menu contextMenu = m_menuManager.createContextMenu(this); - this.setMenu(contextMenu); + // context menu + m_contextMenu = new Menu(getShell(), SWT.POP_UP); + + setMenu(m_contextMenu); } /** get calendar items corresponding to that cell */ @@ -306,18 +306,12 @@ public abstract class AbstractCell extends Composite implements PaintListener { }); // menu listener for context menu - m_menuManager.addMenuListener(new IMenuListener() { - @Override - public void menuAboutToShow(IMenuManager manager) { - m_calendar.showGeneralContextMenu(manager); - } - }); + m_contextMenu.addMenuListener(new P_ContextMenuListener()); // tab traversal of cells this.addTraverseListener(new TraverseListener() { @Override public void keyTraversed(TraverseEvent e) { -// System.out.println(toString() + " got event " + e); switch (e.detail) { case SWT.TRAVERSE_TAB_NEXT: case SWT.TRAVERSE_ARROW_NEXT: @@ -350,6 +344,13 @@ public abstract class AbstractCell extends Composite implements PaintListener { public void handleEvent(Event e) { } }); + addListener(SWT.Dispose, new Listener() { + + @Override + public void handleEvent(Event event) { + dispose(); + } + }); } public void setSelected(boolean selected) { @@ -525,4 +526,32 @@ public abstract class AbstractCell extends Composite implements PaintListener { return "BoundsOrganizer[" + m_cc + "]"; } }//end class + + private class P_ContextMenuListener extends MenuAdapter { + @Override + public void menuShown(MenuEvent e) { + // clear all previous + // Windows BUG: fires menu hide before the selection on the menu item is + // propagated. + if (m_contextMenu != null) { + for (MenuItem item : m_contextMenu.getItems()) { + disposeMenuItem(item); + } + } + m_calendar.showGeneralContextMenu(m_contextMenu); + + } + + private void disposeMenuItem(MenuItem item) { + Menu menu = item.getMenu(); + if (menu != null) { + for (MenuItem childItem : menu.getItems()) { + disposeMenuItem(childItem); + } + menu.dispose(); + } + item.dispose(); + } + + } // end class P_ContextMenuListener } diff --git a/org.eclipse.scout.rt.ui.swt/src/org/eclipse/scout/rt/ui/swt/basic/calendar/widgets/SwtCalendar.java b/org.eclipse.scout.rt.ui.swt/src/org/eclipse/scout/rt/ui/swt/basic/calendar/widgets/SwtCalendar.java index ee16b586aa..4f60546e21 100644 --- a/org.eclipse.scout.rt.ui.swt/src/org/eclipse/scout/rt/ui/swt/basic/calendar/widgets/SwtCalendar.java +++ b/org.eclipse.scout.rt.ui.swt/src/org/eclipse/scout/rt/ui/swt/basic/calendar/widgets/SwtCalendar.java @@ -15,7 +15,6 @@ import java.util.Calendar; import java.util.Date; import java.util.Map; -import org.eclipse.jface.action.IMenuManager; import org.eclipse.scout.commons.logger.IScoutLogger; import org.eclipse.scout.commons.logger.ScoutLogManager; import org.eclipse.scout.rt.ui.swt.basic.calendar.CalendarConstants; @@ -32,6 +31,7 @@ import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Menu; /** * This class represents an SWT calendar widget.<br> @@ -414,14 +414,14 @@ public class SwtCalendar extends Composite implements PaintListener { * do nothing in the JCalendar version, needs to be overriden to do smth * e.g. in SWTScoutCalendar */ - public void showGeneralContextMenu(IMenuManager manager) { + public void showGeneralContextMenu(Menu manager) { } /** * do nothing in the JCalendar version, needs to be overriden to do smth * e.g. in SWTScoutCalendar */ - public void showItemContextMenu(IMenuManager manager, Object item) { + public void showItemContextMenu(Menu manager, Object item) { } @Override diff --git a/org.eclipse.scout.rt.ui.swt/src/org/eclipse/scout/rt/ui/swt/basic/table/SwtScoutTable.java b/org.eclipse.scout.rt.ui.swt/src/org/eclipse/scout/rt/ui/swt/basic/table/SwtScoutTable.java index 6dd300bc5a..21cdbd556c 100644 --- a/org.eclipse.scout.rt.ui.swt/src/org/eclipse/scout/rt/ui/swt/basic/table/SwtScoutTable.java +++ b/org.eclipse.scout.rt.ui.swt/src/org/eclipse/scout/rt/ui/swt/basic/table/SwtScoutTable.java @@ -1246,9 +1246,7 @@ public class SwtScoutTable extends SwtScoutComposite<ITable> implements ISwtScou } final boolean emptySelection = getSwtTableViewer().getSelection().isEmpty(); - List<IMenu> menus = SwtMenuUtility.collectMenus(getScoutObject(), emptySelection, !emptySelection, getEnvironment()); - - SwtMenuUtility.fillContextMenu(menus, m_contextMenu, getEnvironment()); + SwtMenuUtility.fillContextMenu(SwtMenuUtility.collectMenus(getScoutObject(), emptySelection, !emptySelection, getEnvironment()), m_contextMenu, getEnvironment()); } private void disposeMenuItem(MenuItem item) { @@ -1300,9 +1298,8 @@ public class SwtScoutTable extends SwtScoutComposite<ITable> implements ISwtScou } // grab the actions out of the job, when the actions are providden // within the scheduled time the popup will be handled. - if (scoutMenusRef.get() != null) { - SwtMenuUtility.fillContextMenu(scoutMenusRef.get(), m_headerMenu, getEnvironment()); - } + + SwtMenuUtility.fillContextMenu(scoutMenusRef.get(), m_headerMenu, getEnvironment()); } private void disposeMenuItem(MenuItem item) { diff --git a/org.eclipse.scout.rt.ui.swt/src/org/eclipse/scout/rt/ui/swt/basic/tree/SwtScoutTree.java b/org.eclipse.scout.rt.ui.swt/src/org/eclipse/scout/rt/ui/swt/basic/tree/SwtScoutTree.java index 7e01d03a3f..01752c582c 100644 --- a/org.eclipse.scout.rt.ui.swt/src/org/eclipse/scout/rt/ui/swt/basic/tree/SwtScoutTree.java +++ b/org.eclipse.scout.rt.ui.swt/src/org/eclipse/scout/rt/ui/swt/basic/tree/SwtScoutTree.java @@ -759,7 +759,6 @@ public class SwtScoutTree extends SwtScoutComposite<ITree> implements ISwtScoutT final boolean emptySpace = (getSwtField().getContextItem() == null); List<IMenu> menus = SwtMenuUtility.collectMenus(getScoutObject(), emptySpace, !emptySpace, getEnvironment()); - SwtMenuUtility.fillContextMenu(menus, m_contextMenu, getEnvironment()); } diff --git a/org.eclipse.scout.rt.ui.swt/src/org/eclipse/scout/rt/ui/swt/form/fields/button/SwtScoutButton.java b/org.eclipse.scout.rt.ui.swt/src/org/eclipse/scout/rt/ui/swt/form/fields/button/SwtScoutButton.java index 71bbcbef8f..15bddb4737 100644 --- a/org.eclipse.scout.rt.ui.swt/src/org/eclipse/scout/rt/ui/swt/form/fields/button/SwtScoutButton.java +++ b/org.eclipse.scout.rt.ui.swt/src/org/eclipse/scout/rt/ui/swt/form/fields/button/SwtScoutButton.java @@ -400,9 +400,7 @@ public class SwtScoutButton extends SwtScoutFieldComposite<IButton> implements I } // grab the actions out of the job, when the actions are providden within // the scheduled time the popup will be handled. - if (scoutMenusRef.get() != null) { - SwtMenuUtility.fillContextMenu(scoutMenusRef.get(), m_contextMenu, getEnvironment()); - } + SwtMenuUtility.fillContextMenu(scoutMenusRef.get(), m_contextMenu, getEnvironment()); } private void disposeMenuItem(MenuItem item) { diff --git a/org.eclipse.scout.rt.ui.swt/src/org/eclipse/scout/rt/ui/swt/form/fields/filechooserfield/SwtScoutFileChooserField.java b/org.eclipse.scout.rt.ui.swt/src/org/eclipse/scout/rt/ui/swt/form/fields/filechooserfield/SwtScoutFileChooserField.java index 5ef5537d6e..3dd6cc99c4 100644 --- a/org.eclipse.scout.rt.ui.swt/src/org/eclipse/scout/rt/ui/swt/form/fields/filechooserfield/SwtScoutFileChooserField.java +++ b/org.eclipse.scout.rt.ui.swt/src/org/eclipse/scout/rt/ui/swt/form/fields/filechooserfield/SwtScoutFileChooserField.java @@ -247,9 +247,7 @@ public class SwtScoutFileChooserField extends SwtScoutValueFieldComposite<IFileC } // grab the actions out of the job, when the actions are providden within // the scheduled time the popup will be handled. - if (scoutMenusRef.get() != null) { - SwtMenuUtility.fillContextMenu(scoutMenusRef.get(), m_contextMenu, getEnvironment()); - } + SwtMenuUtility.fillContextMenu(scoutMenusRef.get(), m_contextMenu, getEnvironment()); } private void disposeMenuItem(MenuItem item) { diff --git a/org.eclipse.scout.rt.ui.swt/src/org/eclipse/scout/rt/ui/swt/form/fields/imagebox/SwtScoutImageField.java b/org.eclipse.scout.rt.ui.swt/src/org/eclipse/scout/rt/ui/swt/form/fields/imagebox/SwtScoutImageField.java index 2bea5d016b..6d3dbe602f 100644 --- a/org.eclipse.scout.rt.ui.swt/src/org/eclipse/scout/rt/ui/swt/form/fields/imagebox/SwtScoutImageField.java +++ b/org.eclipse.scout.rt.ui.swt/src/org/eclipse/scout/rt/ui/swt/form/fields/imagebox/SwtScoutImageField.java @@ -205,10 +205,7 @@ public class SwtScoutImageField extends SwtScoutFieldComposite<IImageField> impl // grab the actions out of the job, when the actions are provided within // the scheduled time the popup will be handled. - if (scoutMenusRef.get() != null) { - Menu menu = ((Menu) e.getSource()); - SwtMenuUtility.fillContextMenu(scoutMenusRef.get(), menu, SwtScoutImageField.this.getEnvironment()); - } + SwtMenuUtility.fillContextMenu(scoutMenusRef.get(), ((Menu) e.getSource()), SwtScoutImageField.this.getEnvironment()); } } diff --git a/org.eclipse.scout.rt.ui.swt/src/org/eclipse/scout/rt/ui/swt/form/fields/smartfield/SwtScoutSmartField.java b/org.eclipse.scout.rt.ui.swt/src/org/eclipse/scout/rt/ui/swt/form/fields/smartfield/SwtScoutSmartField.java index 141c0814a2..1fd4735081 100644 --- a/org.eclipse.scout.rt.ui.swt/src/org/eclipse/scout/rt/ui/swt/form/fields/smartfield/SwtScoutSmartField.java +++ b/org.eclipse.scout.rt.ui.swt/src/org/eclipse/scout/rt/ui/swt/form/fields/smartfield/SwtScoutSmartField.java @@ -642,9 +642,7 @@ public class SwtScoutSmartField extends SwtScoutValueFieldComposite<IContentAssi } // grab the actions out of the job, when the actions are providden within // the scheduled time the popup will be handled. - if (scoutMenusRef.get() != null) { - SwtMenuUtility.fillContextMenu(scoutMenusRef.get(), m_contextMenu, getEnvironment()); - } + SwtMenuUtility.fillContextMenu(scoutMenusRef.get(), m_contextMenu, getEnvironment()); } private void disposeMenuItem(MenuItem item) { diff --git a/org.eclipse.scout.rt.ui.swt/src/org/eclipse/scout/rt/ui/swt/menu/SwtScoutMenuContributionItem.java b/org.eclipse.scout.rt.ui.swt/src/org/eclipse/scout/rt/ui/swt/menu/SwtScoutMenuContributionItem.java deleted file mode 100644 index 73f0399523..0000000000 --- a/org.eclipse.scout.rt.ui.swt/src/org/eclipse/scout/rt/ui/swt/menu/SwtScoutMenuContributionItem.java +++ /dev/null @@ -1,50 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2010 BSI Business Systems Integration AG. - * 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: - * BSI Business Systems Integration AG - initial API and implementation - ******************************************************************************/ -package org.eclipse.scout.rt.ui.swt.menu; - -import org.eclipse.jface.action.ContributionItem; -import org.eclipse.scout.rt.client.ui.action.menu.IMenu; -import org.eclipse.scout.rt.ui.swt.ISwtEnvironment; -import org.eclipse.scout.rt.ui.swt.SwtMenuUtility; -import org.eclipse.swt.widgets.Menu; - -/** - * - */ -public class SwtScoutMenuContributionItem extends ContributionItem { - private IMenu m_scoutMenu; - private ISwtEnvironment m_environment; - private AbstractSwtScoutMenu m_swtMenuItem; - - public SwtScoutMenuContributionItem(IMenu scoutMenu, ISwtEnvironment environment) { - m_scoutMenu = scoutMenu; - m_environment = environment; - - } - - public IMenu getScoutMenu() { - return m_scoutMenu; - } - - public ISwtEnvironment getEnvironment() { - return m_environment; - } - - public AbstractSwtScoutMenu getSwtMenuItem() { - return m_swtMenuItem; - } - - @Override - public void fill(Menu menu, int index) { - m_swtMenuItem = SwtMenuUtility.createMenuItem(getScoutMenu(), menu, getEnvironment()); - - } -} diff --git a/org.eclipse.scout.rt.ui.swt/src/org/eclipse/scout/rt/ui/swt/menu/SwtScoutMenuGroup.java b/org.eclipse.scout.rt.ui.swt/src/org/eclipse/scout/rt/ui/swt/menu/SwtScoutMenuGroup.java deleted file mode 100644 index e7cbee1b6f..0000000000 --- a/org.eclipse.scout.rt.ui.swt/src/org/eclipse/scout/rt/ui/swt/menu/SwtScoutMenuGroup.java +++ /dev/null @@ -1,104 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2010 BSI Business Systems Integration AG. - * 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: - * BSI Business Systems Integration AG - initial API and implementation - ******************************************************************************/ -package org.eclipse.scout.rt.ui.swt.menu; - -import java.util.ArrayList; -import java.util.List; - -import org.eclipse.scout.rt.client.ui.action.menu.IMenu; -import org.eclipse.scout.rt.ui.swt.ISwtEnvironment; -import org.eclipse.scout.rt.ui.swt.SwtMenuUtility; -import org.eclipse.swt.SWT; -import org.eclipse.swt.widgets.Event; -import org.eclipse.swt.widgets.Listener; -import org.eclipse.swt.widgets.Menu; -import org.eclipse.swt.widgets.MenuItem; - -/** - * - */ -public class SwtScoutMenuGroup extends AbstractSwtScoutMenu { - - private Menu m_childMenu; - private List<AbstractSwtScoutMenu> m_childMenus = new ArrayList<AbstractSwtScoutMenu>(); - private Listener m_uiMenuListener; - - public SwtScoutMenuGroup(IMenu scoutMenu, Menu parentMenu, ISwtEnvironment environment) { - super(scoutMenu, parentMenu, environment, false); - createMenu(scoutMenu, parentMenu, environment); - } - - @Override - protected void initializeUi(MenuItem swtMenuItem) { - super.initializeUi(swtMenuItem); - IMenu scoutMenu = getScoutMenu(); - if (scoutMenu.hasChildActions()) { - m_childMenu = new Menu(swtMenuItem); - for (IMenu subMenu : SwtMenuUtility.consolidateMenus(scoutMenu.getChildActions())) { - AbstractSwtScoutMenu menuItem = SwtMenuUtility.createMenuItem(subMenu, m_childMenu, getEnvironment()); - if (menuItem != null) { - m_childMenus.add(menuItem); - } - } - swtMenuItem.setMenu(m_childMenu); - m_uiMenuListener = new P_UiMenuListener(); - m_childMenu.addListener(SWT.Show, m_uiMenuListener); - m_childMenu.addListener(SWT.Hide, m_uiMenuListener); - m_childMenu.addListener(SWT.Dispose, m_uiMenuListener); - } - } - - protected void handleSwtMenuHide() { - } - - /** - * - */ - protected void handleSwtMenuShow() { - Runnable t = new Runnable() { - @Override - public void run() { - for (AbstractSwtScoutMenu menuItem : m_childMenus) { - menuItem.getScoutMenu().prepareAction(); - } - } - }; - getEnvironment().invokeScoutLater(t, 0); - //end notify - } - - protected void handleSwtMenuDispose() { - m_childMenu.removeListener(SWT.Show, m_uiMenuListener); - m_childMenu.removeListener(SWT.Hide, m_uiMenuListener); - m_childMenu.removeListener(SWT.Dispose, m_uiMenuListener); - m_uiMenuListener = null; - - } - - private class P_UiMenuListener implements Listener { - @Override - public void handleEvent(Event event) { - switch (event.type) { - case SWT.Show: - handleSwtMenuShow(); - break; - case SWT.Hide: - handleSwtMenuHide(); - break; - case SWT.Dispose: - handleSwtMenuDispose(); - break; - } - } - - } - -} diff --git a/org.eclipse.scout.rt.ui.swt/src/org/eclipse/scout/rt/ui/swt/window/desktop/editor/AbstractScoutEditorPart.java b/org.eclipse.scout.rt.ui.swt/src/org/eclipse/scout/rt/ui/swt/window/desktop/editor/AbstractScoutEditorPart.java index 61133a42bf..b2199771bf 100644 --- a/org.eclipse.scout.rt.ui.swt/src/org/eclipse/scout/rt/ui/swt/window/desktop/editor/AbstractScoutEditorPart.java +++ b/org.eclipse.scout.rt.ui.swt/src/org/eclipse/scout/rt/ui/swt/window/desktop/editor/AbstractScoutEditorPart.java @@ -12,18 +12,23 @@ package org.eclipse.scout.rt.ui.swt.window.desktop.editor; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; +import java.util.List; import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.jface.action.IToolBarManager; import org.eclipse.scout.commons.OptimisticLock; import org.eclipse.scout.commons.StringUtility; import org.eclipse.scout.commons.exception.ProcessingException; import org.eclipse.scout.commons.logger.IScoutLogger; import org.eclipse.scout.commons.logger.ScoutLogManager; import org.eclipse.scout.rt.client.ClientSyncJob; +import org.eclipse.scout.rt.client.ui.action.ActionUtility; +import org.eclipse.scout.rt.client.ui.action.tool.IToolButton; import org.eclipse.scout.rt.client.ui.form.IForm; import org.eclipse.scout.rt.client.ui.form.fields.IFormField; import org.eclipse.scout.rt.client.ui.form.fields.button.IButton; import org.eclipse.scout.rt.ui.swt.ISwtEnvironment; +import org.eclipse.scout.rt.ui.swt.action.SwtScoutToolbarAction; import org.eclipse.scout.rt.ui.swt.busy.AnimatedBusyImage; import org.eclipse.scout.rt.ui.swt.form.ISwtScoutForm; import org.eclipse.scout.rt.ui.swt.util.ScoutFormToolkit; @@ -91,6 +96,7 @@ public abstract class AbstractScoutEditorPart extends EditorPart implements ISwt } protected void attachScout() { + updateToolbarActionsFromScout(); IForm form = getForm(); setTitleFromScout(form.getTitle()); setImageFromScout(form.getIconId()); @@ -122,6 +128,24 @@ public abstract class AbstractScoutEditorPart extends EditorPart implements ISwt getSite().getPage().addPartListener(m_editorListener); } + /** + * + */ + protected void updateToolbarActionsFromScout() { + List<IToolButton> toolbuttons = ActionUtility.visibleNormalizedActions(getForm().getToolbuttons()); + if (!toolbuttons.isEmpty()) { + IToolBarManager toolBarManager = getRootForm().getToolBarManager(); + if (getForm().getToolbarLocation() == IForm.TOOLBAR_VIEW_PART) { + toolBarManager = getEditorSite().getActionBars().getToolBarManager(); + } + for (IToolButton b : toolbuttons) { + toolBarManager.add(new SwtScoutToolbarAction(b, toolBarManager, getSwtEnvironment())); + } + toolBarManager.update(true); + } + + } + protected void detachScout() { if (getForm() != null) { // listeners diff --git a/org.eclipse.scout.rt.ui.swt/src/org/eclipse/scout/rt/ui/swt/window/desktop/tray/SwtScoutTray.java b/org.eclipse.scout.rt.ui.swt/src/org/eclipse/scout/rt/ui/swt/window/desktop/tray/SwtScoutTray.java index feeac9acf9..904b0af2d9 100644 --- a/org.eclipse.scout.rt.ui.swt/src/org/eclipse/scout/rt/ui/swt/window/desktop/tray/SwtScoutTray.java +++ b/org.eclipse.scout.rt.ui.swt/src/org/eclipse/scout/rt/ui/swt/window/desktop/tray/SwtScoutTray.java @@ -13,7 +13,6 @@ package org.eclipse.scout.rt.ui.swt.window.desktop.tray; import java.util.List; import java.util.concurrent.atomic.AtomicReference; -import org.eclipse.scout.commons.CollectionUtility; import org.eclipse.scout.commons.logger.IScoutLogger; import org.eclipse.scout.commons.logger.ScoutLogManager; import org.eclipse.scout.rt.client.ui.action.menu.IMenu; @@ -108,9 +107,7 @@ public class SwtScoutTray extends SwtScoutComposite<IDesktop> implements ISwtSco //nop } // end notify - if (CollectionUtility.hasElements(scoutMenusRef.get())) { - SwtMenuUtility.fillContextMenu(scoutMenusRef.get(), m_popupMenu, getEnvironment()); - } + SwtMenuUtility.fillContextMenu(scoutMenusRef.get(), m_popupMenu, getEnvironment()); } } diff --git a/org.eclipse.scout.rt.ui.swt/src/org/eclipse/scout/rt/ui/swt/window/desktop/view/AbstractScoutView.java b/org.eclipse.scout.rt.ui.swt/src/org/eclipse/scout/rt/ui/swt/window/desktop/view/AbstractScoutView.java index fc5cd7c7e2..79971748ae 100644 --- a/org.eclipse.scout.rt.ui.swt/src/org/eclipse/scout/rt/ui/swt/window/desktop/view/AbstractScoutView.java +++ b/org.eclipse.scout.rt.ui.swt/src/org/eclipse/scout/rt/ui/swt/window/desktop/view/AbstractScoutView.java @@ -12,18 +12,23 @@ package org.eclipse.scout.rt.ui.swt.window.desktop.view; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; +import java.util.List; import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.jface.action.IToolBarManager; import org.eclipse.scout.commons.OptimisticLock; import org.eclipse.scout.commons.StringUtility; import org.eclipse.scout.commons.exception.ProcessingException; import org.eclipse.scout.commons.logger.IScoutLogger; import org.eclipse.scout.commons.logger.ScoutLogManager; import org.eclipse.scout.rt.client.ClientSyncJob; +import org.eclipse.scout.rt.client.ui.action.ActionUtility; +import org.eclipse.scout.rt.client.ui.action.tool.IToolButton; import org.eclipse.scout.rt.client.ui.form.IForm; import org.eclipse.scout.rt.client.ui.form.fields.IFormField; import org.eclipse.scout.rt.client.ui.form.fields.button.IButton; import org.eclipse.scout.rt.ui.swt.ISwtEnvironment; +import org.eclipse.scout.rt.ui.swt.action.SwtScoutToolbarAction; import org.eclipse.scout.rt.ui.swt.busy.AnimatedBusyImage; import org.eclipse.scout.rt.ui.swt.form.ISwtScoutForm; import org.eclipse.scout.rt.ui.swt.util.ScoutFormToolkit; @@ -162,6 +167,7 @@ public abstract class AbstractScoutView extends ViewPart implements ISwtScoutPar } protected void attachScout(IForm form) { + updateToolbarActionsFromScout(); setTitleFromScout(form.getTitle()); setImageFromScout(form.getIconId()); setMaximizeEnabledFromScout(form.isMaximizeEnabled()); @@ -188,6 +194,24 @@ public abstract class AbstractScoutView extends ViewPart implements ISwtScoutPar form.addPropertyChangeListener(m_formPropertyListener); } + /** + * + */ + protected void updateToolbarActionsFromScout() { + List<IToolButton> toolbuttons = ActionUtility.visibleNormalizedActions(getForm().getToolbuttons()); + if (!toolbuttons.isEmpty()) { + IToolBarManager toolBarManager = getRootForm().getToolBarManager(); + if (getForm().getToolbarLocation() == IForm.TOOLBAR_VIEW_PART) { + toolBarManager = getViewSite().getActionBars().getToolBarManager(); + } + for (IToolButton b : toolbuttons) { + toolBarManager.add(new SwtScoutToolbarAction(b, toolBarManager, getSwtEnvironment())); + } + toolBarManager.update(true); + } + + } + protected void detachScout(IForm form) { // listeners form.removePropertyChangeListener(m_formPropertyListener); diff --git a/org.eclipse.scout.rt.ui.swt/src/org/eclipse/scout/rt/ui/swt/window/dialog/SwtScoutDialog.java b/org.eclipse.scout.rt.ui.swt/src/org/eclipse/scout/rt/ui/swt/window/dialog/SwtScoutDialog.java index 70183b1818..4a52146aa7 100644 --- a/org.eclipse.scout.rt.ui.swt/src/org/eclipse/scout/rt/ui/swt/window/dialog/SwtScoutDialog.java +++ b/org.eclipse.scout.rt.ui.swt/src/org/eclipse/scout/rt/ui/swt/window/dialog/SwtScoutDialog.java @@ -13,12 +13,16 @@ package org.eclipse.scout.rt.ui.swt.window.dialog; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.lang.reflect.Method; +import java.util.List; +import org.eclipse.jface.action.IToolBarManager; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.scout.commons.StringUtility; import org.eclipse.scout.commons.exception.ProcessingException; import org.eclipse.scout.commons.logger.IScoutLogger; import org.eclipse.scout.commons.logger.ScoutLogManager; +import org.eclipse.scout.rt.client.ui.action.ActionUtility; +import org.eclipse.scout.rt.client.ui.action.tool.IToolButton; import org.eclipse.scout.rt.client.ui.form.IForm; import org.eclipse.scout.rt.client.ui.form.fields.IFormField; import org.eclipse.scout.rt.client.ui.form.fields.button.IButton; @@ -26,6 +30,7 @@ import org.eclipse.scout.rt.ui.swt.DefaultValidateRoot; import org.eclipse.scout.rt.ui.swt.ISwtEnvironment; import org.eclipse.scout.rt.ui.swt.IValidateRoot; import org.eclipse.scout.rt.ui.swt.SwtShellValidateRoot; +import org.eclipse.scout.rt.ui.swt.action.SwtScoutToolbarAction; import org.eclipse.scout.rt.ui.swt.form.ISwtScoutForm; import org.eclipse.scout.rt.ui.swt.util.SwtUtility; import org.eclipse.scout.rt.ui.swt.util.VersionUtility; @@ -131,6 +136,7 @@ public class SwtScoutDialog extends Dialog implements ISwtScoutPart { } protected void attachScout(IForm form) { + updateToolbarActionsFromScout(); setTitleFromScout(form.getTitle()); setImageFromScout(form.getIconId()); setMaximizeEnabledFromScout(form.isMaximizeEnabled()); @@ -157,6 +163,21 @@ public class SwtScoutDialog extends Dialog implements ISwtScoutPart { form.addPropertyChangeListener(m_formPropertyListener); } + /** + * + */ + protected void updateToolbarActionsFromScout() { + List<IToolButton> toolbuttons = ActionUtility.visibleNormalizedActions(getForm().getToolbuttons()); + if (!toolbuttons.isEmpty()) { + IToolBarManager toolBarManager = getRootForm().getToolBarManager(); + for (IToolButton b : toolbuttons) { + toolBarManager.add(new SwtScoutToolbarAction(b, toolBarManager, getEnvironment())); + } + toolBarManager.update(true); + } + + } + protected void detachScout(IForm form) { // listeners form.removePropertyChangeListener(m_formPropertyListener); |
