Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/customization/org.eclipse.papyrus.customization.properties/src/org/eclipse/papyrus/customization/properties/editor/actions/CreateSectionAction.java')
-rw-r--r--plugins/customization/org.eclipse.papyrus.customization.properties/src/org/eclipse/papyrus/customization/properties/editor/actions/CreateSectionAction.java201
1 files changed, 201 insertions, 0 deletions
diff --git a/plugins/customization/org.eclipse.papyrus.customization.properties/src/org/eclipse/papyrus/customization/properties/editor/actions/CreateSectionAction.java b/plugins/customization/org.eclipse.papyrus.customization.properties/src/org/eclipse/papyrus/customization/properties/editor/actions/CreateSectionAction.java
new file mode 100644
index 00000000000..e3c5e222c9b
--- /dev/null
+++ b/plugins/customization/org.eclipse.papyrus.customization.properties/src/org/eclipse/papyrus/customization/properties/editor/actions/CreateSectionAction.java
@@ -0,0 +1,201 @@
+/*****************************************************************************
+ * Copyright (c) 2010 CEA LIST.
+ *
+ * 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:
+ * Camille Letavernier (CEA LIST) camille.letavernier@cea.fr - Initial API and implementation
+ *****************************************************************************/
+package org.eclipse.papyrus.customization.properties.editor.actions;
+
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.emf.common.command.Command;
+import org.eclipse.emf.common.command.CompoundCommand;
+import org.eclipse.emf.common.command.UnexecutableCommand;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.edit.command.AddCommand;
+import org.eclipse.emf.edit.command.CommandParameter;
+import org.eclipse.emf.edit.command.CreateChildCommand;
+import org.eclipse.emf.edit.command.SetCommand;
+import org.eclipse.emf.edit.domain.EditingDomain;
+import org.eclipse.emf.edit.ui.action.StaticSelectionCommandAction;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.papyrus.views.properties.contexts.Context;
+import org.eclipse.papyrus.views.properties.contexts.ContextsFactory;
+import org.eclipse.papyrus.views.properties.contexts.Section;
+import org.eclipse.papyrus.views.properties.contexts.View;
+import org.eclipse.papyrus.views.properties.runtime.ConfigurationManager;
+import org.eclipse.papyrus.views.properties.ui.CompositeWidget;
+import org.eclipse.papyrus.views.properties.ui.Layout;
+import org.eclipse.papyrus.views.properties.ui.UiFactory;
+import org.eclipse.papyrus.views.properties.ui.ValueAttribute;
+
+/**
+ * A Command for create a {@link Section} in the given View.
+ *
+ * In the physical EMF Model, the section is owned by a Tab, and referenced
+ * by one or more views. However, in the logical model used by the Customization
+ * editor (Which is slightly different to be simpler), the view directly owns the
+ * section, and the section refers to its Tab.
+ *
+ * This command creates the section in the default Tab, and creates a reference
+ * from the view to the section.
+ *
+ * It also instantiates the XWT Resource associated to this sections, and fills
+ * it with a default Composite widget and Layout.
+ *
+ * The command can be undone in a single operation.
+ *
+ * @author Camille Letavernier
+ *
+ */
+public class CreateSectionAction extends StaticSelectionCommandAction {
+
+ private IStructuredSelection selection;
+
+ private String sectionName, sectionFile;
+
+ /**
+ * Constructor.
+ *
+ * Creates a new CreateSectionAction, with the given name and file.
+ * The sectionFile is a relative path from the section's URI, which is
+ * the same as it's owning view.
+ *
+ * @param selection
+ * The current selection
+ * @param sectionName
+ * The new section's name
+ * @param sectionFile
+ * The path to the section's XWT resource
+ */
+ public CreateSectionAction(ISelection selection, String sectionName, String sectionFile) {
+ this.sectionName = sectionName;
+ this.sectionFile = sectionFile;
+
+ if(selection instanceof IStructuredSelection) {
+ this.selection = (IStructuredSelection)selection;
+ configureAction(selection);
+ }
+ }
+
+ @Override
+ protected Command createActionCommand(EditingDomain editingDomain, Collection<?> collection) {
+ Object selectedElement = selection.getFirstElement();
+ View view = null;
+ if(selectedElement instanceof View) {
+ view = (View)selectedElement;
+ }
+
+ if(view == null) {
+ return UnexecutableCommand.INSTANCE;
+ }
+
+ EObject tab = null;
+
+ for(Section section : view.getSections()) {
+ if(section.getTab() != null) {
+ tab = section.getTab();
+ break;
+ }
+ }
+
+ if(tab == null) {
+ Context context = (Context)view.eContainer();
+ if(context.getTabs().size() > 0)
+ tab = context.getTabs().get(0);
+ }
+
+ if(tab == null) {
+ return UnexecutableCommand.INSTANCE;
+ }
+
+ Section newSection = ContextsFactory.eINSTANCE.createSection();
+ newSection.setName(getSectionName());
+
+ CompositeWidget newWidget = createWidget();
+
+ CommandParameter tabParameter = new CommandParameter(tab, tab.eClass().getEStructuralFeature("sections"), newSection); //$NON-NLS-1$
+
+ Command createInTab = CreateChildCommand.create(editingDomain, tab, tabParameter, collection);
+ Command addInView = AddCommand.create(editingDomain, view, view.eClass().getEStructuralFeature("sections"), newSection); //$NON-NLS-1$
+ Command createWidgetResource = getCreateResourceCommand(newWidget, newSection, view.eResource());
+ Command setWidget = getSetWidgetCommand(newWidget, newSection);
+
+
+ CompoundCommand createActionCommand = new CompoundCommandActionDelegate();
+ createActionCommand.append(createInTab);
+ createActionCommand.append(addInView);
+ createActionCommand.append(createWidgetResource);
+ createActionCommand.append(setWidget);
+
+ return createActionCommand;
+ }
+
+ private CompositeWidget createWidget() {
+ CompositeWidget newWidget = UiFactory.eINSTANCE.createCompositeWidget();
+
+
+ for(Map.Entry<String, String> entry : getNamespaces().entrySet()) {
+ ValueAttribute attribute = UiFactory.eINSTANCE.createValueAttribute();
+ attribute.setName(entry.getKey());
+ attribute.setValue(entry.getValue());
+ newWidget.getAttributes().add(attribute);
+ }
+
+ newWidget.setWidgetType(ConfigurationManager.instance.getDefaultCompositeType());
+
+ Layout layout = UiFactory.eINSTANCE.createLayout();
+ layout.setLayoutType(ConfigurationManager.instance.getDefaultLayoutType());
+ newWidget.setLayout(layout);
+
+ return newWidget;
+ }
+
+ private Map<String, String> getNamespaces() {
+ Map<String, String> namespaces = new HashMap<String, String>();
+ namespaces.put("xmlns", "http://www.eclipse.org/xwt/presentation"); //$NON-NLS-1$ //$NON-NLS-2$
+ namespaces.put("xmlns:x", "http://www.eclipse.org/xwt"); //$NON-NLS-1$ //$NON-NLS-2$
+ namespaces.put("xmlns:ppe", "clr-namespace:org.eclipse.papyrus.views.properties.widgets"); //$NON-NLS-1$ //$NON-NLS-2$
+ namespaces.put("xmlns:ppel", "clr-namespace:org.eclipse.papyrus.views.properties.widgets.layout"); //$NON-NLS-1$ //$NON-NLS-2$
+ return namespaces;
+ }
+
+ private Command getCreateResourceCommand(CompositeWidget newWidget, Section section, Resource baseResource) {
+ URI widgetURI;
+ if(section.getSectionFile() == null || section.getSectionFile().equals("")) { //$NON-NLS-1$
+ section.setSectionFile(getSectionFile());
+ }
+
+ widgetURI = URI.createURI(section.getSectionFile());
+ widgetURI = widgetURI.resolve(baseResource.getURI());
+ Command createWidget = new CreateResourceCommand(newWidget, widgetURI, baseResource.getResourceSet());
+
+ return createWidget;
+ }
+
+ private Command getSetWidgetCommand(CompositeWidget newWidget, Section section) {
+ if(section.getWidget() == null)
+ return SetCommand.create(editingDomain, section, section.eClass().getEStructuralFeature("widget"), newWidget); //$NON-NLS-1$
+ else
+ return UnexecutableCommand.INSTANCE;
+ }
+
+ private String getSectionFile() {
+ return sectionFile;
+ }
+
+ private String getSectionName() {
+ return sectionName;
+ }
+
+}

Back to the top