Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristian W. Damus2015-12-14 16:33:55 +0000
committerChristian W. Damus2015-12-14 16:41:56 +0000
commitb00d4101f6626435e92af1b678a454980685ec1f (patch)
tree25e3459b72a5dbd8af5e44c931c402966db496d1 /plugins/infra/editor
parent4e5d60fe35f36400265700b7cdf50494c6065849 (diff)
downloadorg.eclipse.papyrus-b00d4101f6626435e92af1b678a454980685ec1f.tar.gz
org.eclipse.papyrus-b00d4101f6626435e92af1b678a454980685ec1f.tar.xz
org.eclipse.papyrus-b00d4101f6626435e92af1b678a454980685ec1f.zip
Bug 469188: [Editor] Page management improvements in the Papyrus multi-editor
https://bugs.eclipse.org/bugs/show_bug.cgi?id=469188 Support for saving the active Welcome Page layout as the default for all other (non-customized) welcome pages. This includes: * saving the user-defined layout in the workspace metadata area as the default Welcome Page model * notifying all other open editors that are using the default welcome model to refresh their layouts * a new button in the Welcome Page preferences to reset the default layout to factory defaults. This deletes the default welcome model and notifies editors to recompute the layout
Diffstat (limited to 'plugins/infra/editor')
-rw-r--r--plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/META-INF/MANIFEST.MF7
-rw-r--r--plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/plugin.properties3
-rw-r--r--plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/plugin.xml20
-rw-r--r--plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src/org/eclipse/papyrus/infra/editor/welcome/IWelcomePageService.java19
-rw-r--r--plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src/org/eclipse/papyrus/infra/editor/welcome/internal/Activator.java16
-rw-r--r--plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src/org/eclipse/papyrus/infra/editor/welcome/internal/WelcomeLayout.java48
-rw-r--r--plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src/org/eclipse/papyrus/infra/editor/welcome/internal/WelcomeModelManager.java370
-rw-r--r--plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src/org/eclipse/papyrus/infra/editor/welcome/internal/WelcomePage.java4
-rw-r--r--plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src/org/eclipse/papyrus/infra/editor/welcome/internal/WelcomePageService.java191
-rw-r--r--plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src/org/eclipse/papyrus/infra/editor/welcome/internal/commands/AbstractWelcomePageHandler.java86
-rw-r--r--plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src/org/eclipse/papyrus/infra/editor/welcome/internal/commands/ResetWelcomePageHandler.java45
-rw-r--r--plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src/org/eclipse/papyrus/infra/editor/welcome/internal/commands/SaveDefaultWelcomePageHandler.java46
-rw-r--r--plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src/org/eclipse/papyrus/infra/editor/welcome/internal/commands/ShowWelcomePageHandler.java42
-rw-r--r--plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src/org/eclipse/papyrus/infra/editor/welcome/internal/preferences/WelcomeContentPreferencePage.java64
14 files changed, 717 insertions, 244 deletions
diff --git a/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/META-INF/MANIFEST.MF b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/META-INF/MANIFEST.MF
index 32798bbebe3..95b038a73c0 100644
--- a/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/META-INF/MANIFEST.MF
+++ b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/META-INF/MANIFEST.MF
@@ -3,10 +3,11 @@ Export-Package: org.eclipse.papyrus.infra.editor.welcome,
org.eclipse.papyrus.infra.editor.welcome.internal;x-internal:=true,
org.eclipse.papyrus.infra.editor.welcome.internal.commands;x-internal:=true,
org.eclipse.papyrus.infra.editor.welcome.internal.constraints;x-internal:=true,
+ org.eclipse.papyrus.infra.editor.welcome.internal.dnd,
org.eclipse.papyrus.infra.editor.welcome.internal.impl;x-internal:=true,
- org.eclipse.papyrus.infra.editor.welcome.internal.operations,
- org.eclipse.papyrus.infra.editor.welcome.internal.modelelements;
- x-friends:="org.eclipse.papyrus.infra.editor.welcome.nattable",
+ org.eclipse.papyrus.infra.editor.welcome.internal.modelelements;x-friends:="org.eclipse.papyrus.infra.editor.welcome.nattable",
+ org.eclipse.papyrus.infra.editor.welcome.internal.operations;x-internal:=true,
+ org.eclipse.papyrus.infra.editor.welcome.internal.preferences;x-internal:=true,
org.eclipse.papyrus.infra.editor.welcome.internal.widgets;x-internal:=true,
org.eclipse.papyrus.infra.editor.welcome.util
Require-Bundle: org.eclipse.core.runtime;bundle-version="3.12.0",
diff --git a/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/plugin.properties b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/plugin.properties
index 7a6fd800447..c05dc20386d 100644
--- a/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/plugin.properties
+++ b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/plugin.properties
@@ -18,4 +18,7 @@ cmd.showWelcome.tip = Open the overview (welcome) page
cmd.resetWelcome.desc = Resets the arrangement of the welcome page
cmd.resetWelcome.name = Reset Welcome Page
cmd.resetWelcome.tip = Resets the arrangement of the welcome page
+cmd.setDefaultWelcome.desc = Sets the arrangement of the welcome page as the default for all editors
+cmd.setDefaultWelcome.name = Make Default Welcome Page
+cmd.setDefaultWelcome.tip = Sets the arrangement of the welcome page as the default for all editors
prefpage.welcome.name = Editor Welcome Page
diff --git a/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/plugin.xml b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/plugin.xml
index a7e1ef425ba..c702fdd5a23 100644
--- a/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/plugin.xml
+++ b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/plugin.xml
@@ -53,6 +53,12 @@
id="org.eclipse.papyrus.infra.editor.welcome.resetWelcomePage"
name="%cmd.resetWelcome.name">
</command>
+ <command
+ defaultHandler="org.eclipse.papyrus.infra.editor.welcome.internal.commands.SaveDefaultWelcomePageHandler"
+ description="%cmd.setDefaultWelcome.desc"
+ id="org.eclipse.papyrus.infra.editor.welcome.setAsDefaultWelcomePage"
+ name="%cmd.setDefaultWelcome.name">
+ </command>
</extension>
<extension
point="org.eclipse.ui.menus">
@@ -84,6 +90,12 @@
tooltip="%cmd.resetWelcome.tip">
<visibleWhen checkEnabled="true"/>
</command>
+ <command
+ commandId="org.eclipse.papyrus.infra.editor.welcome.setAsDefaultWelcomePage"
+ style="push"
+ tooltip="%cmd.setDefaultWelcome.tip">
+ <visibleWhen checkEnabled="true"/>
+ </command>
</menuContribution>
<menuContribution
locationURI="menu:org.eclipse.papyrus.infra.core.commands.dropdowncommand?before=additions">
@@ -114,6 +126,12 @@
tooltip="%cmd.resetWelcome.tip">
<visibleWhen checkEnabled="true"/>
</command>
+ <command
+ commandId="org.eclipse.papyrus.infra.editor.welcome.setAsDefaultWelcomePage"
+ style="push"
+ tooltip="%cmd.setDefaultWelcome.tip">
+ <visibleWhen checkEnabled="true"/>
+ </command>
</menuContribution>
</extension>
<extension
@@ -130,7 +148,7 @@
point="org.eclipse.ui.preferencePages">
<page
category="org.eclipse.papyrus.infra.core.sasheditor.preferences.generalcategory"
- class="org.eclipse.papyrus.views.properties/org.eclipse.papyrus.views.properties.preferences.Preferences"
+ class="org.eclipse.papyrus.infra.editor.welcome.internal.preferences.WelcomeContentPreferencePage"
id="org.eclipse.papyrus.infra.editor.welcome.content"
name="%prefpage.welcome.name">
</page>
diff --git a/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src/org/eclipse/papyrus/infra/editor/welcome/IWelcomePageService.java b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src/org/eclipse/papyrus/infra/editor/welcome/IWelcomePageService.java
index bad7c025be4..63d05cdf17a 100644
--- a/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src/org/eclipse/papyrus/infra/editor/welcome/IWelcomePageService.java
+++ b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src/org/eclipse/papyrus/infra/editor/welcome/IWelcomePageService.java
@@ -13,6 +13,7 @@
package org.eclipse.papyrus.infra.editor.welcome;
+import org.eclipse.core.runtime.CoreException;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.papyrus.infra.core.services.IService;
import org.eclipse.papyrus.infra.core.services.ServicesRegistry;
@@ -48,7 +49,25 @@ public interface IWelcomePageService extends IService {
*/
void resetWelcomePage();
+ /**
+ * Saves the current Welcome Page layout as the default layout.
+ *
+ * @throws CoreException
+ * on failure to save the new default layout
+ */
+ void saveWelcomePageAsDefault() throws CoreException;
+
+ /**
+ * Obtains the resource that stores the {@linkplain #getWelcome() Welcome model}.
+ *
+ * @return the Welcome resource
+ */
Resource getWelcomeResource();
+ /**
+ * Obtains the Welcome model for the current editor.
+ *
+ * @return the Welcome model
+ */
Welcome getWelcome();
}
diff --git a/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src/org/eclipse/papyrus/infra/editor/welcome/internal/Activator.java b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src/org/eclipse/papyrus/infra/editor/welcome/internal/Activator.java
index 96256781ca1..714c0ff01b4 100644
--- a/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src/org/eclipse/papyrus/infra/editor/welcome/internal/Activator.java
+++ b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src/org/eclipse/papyrus/infra/editor/welcome/internal/Activator.java
@@ -12,6 +12,8 @@
*****************************************************************************/
package org.eclipse.papyrus.infra.editor.welcome.internal;
+import java.nio.file.Paths;
+
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.resource.ImageRegistry;
import org.eclipse.papyrus.infra.core.log.LogHelper;
@@ -34,10 +36,10 @@ public class Activator extends AbstractUIPlugin {
public static LogHelper log;
- /**
- * The constructor
- */
+ private WelcomeModelManager welcomeModelManager;
+
public Activator() {
+ super();
}
@Override
@@ -45,10 +47,14 @@ public class Activator extends AbstractUIPlugin {
super.start(context);
plugin = this;
log = new LogHelper(this);
+
+ welcomeModelManager = new WelcomeModelManager(Paths.get(getStateLocation().toOSString()));
}
@Override
public void stop(BundleContext context) throws Exception {
+ welcomeModelManager = null;
+
plugin = null;
super.stop(context);
}
@@ -77,4 +83,8 @@ public class Activator extends AbstractUIPlugin {
protected ImageDescriptor getImageDescriptor(String path) {
return imageDescriptorFromPlugin(PLUGIN_ID, path);
}
+
+ public WelcomeModelManager getWelcomeModelManager() {
+ return welcomeModelManager;
+ }
}
diff --git a/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src/org/eclipse/papyrus/infra/editor/welcome/internal/WelcomeLayout.java b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src/org/eclipse/papyrus/infra/editor/welcome/internal/WelcomeLayout.java
index eb5a866cd2d..8b313e60dc6 100644
--- a/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src/org/eclipse/papyrus/infra/editor/welcome/internal/WelcomeLayout.java
+++ b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src/org/eclipse/papyrus/infra/editor/welcome/internal/WelcomeLayout.java
@@ -15,6 +15,7 @@ package org.eclipse.papyrus.infra.editor.welcome.internal;
import static java.lang.Math.max;
import static java.lang.Math.min;
+import static org.eclipse.papyrus.infra.editor.welcome.internal.WelcomeModelManager.become;
import java.lang.reflect.Field;
import java.util.ArrayList;
@@ -31,6 +32,8 @@ import java.util.stream.Stream;
import org.eclipse.emf.common.util.ECollections;
import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.ecore.util.EcoreUtil;
+import org.eclipse.papyrus.infra.core.resource.ModelSet;
import org.eclipse.papyrus.infra.core.resource.sasheditor.SashModel;
import org.eclipse.papyrus.infra.core.resource.sasheditor.SashModelUtils;
import org.eclipse.papyrus.infra.core.sasheditor.di.contentprovider.utils.TransactionHelper;
@@ -39,6 +42,7 @@ import org.eclipse.papyrus.infra.editor.welcome.SashColumn;
import org.eclipse.papyrus.infra.editor.welcome.SashRow;
import org.eclipse.papyrus.infra.editor.welcome.Welcome;
import org.eclipse.papyrus.infra.editor.welcome.WelcomeFactory;
+import org.eclipse.papyrus.infra.editor.welcome.WelcomePackage;
import org.eclipse.papyrus.infra.editor.welcome.WelcomePage;
import org.eclipse.papyrus.infra.editor.welcome.WelcomeSection;
import org.eclipse.papyrus.infra.editor.welcome.internal.dnd.WelcomeSectionTransfer;
@@ -72,7 +76,6 @@ import org.eclipse.ui.forms.events.HyperlinkEvent;
import org.eclipse.ui.forms.widgets.ExpandableComposite;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.eclipse.ui.forms.widgets.Hyperlink;
-import org.eclipse.uml2.common.util.UML2Util;
/**
* @author damus
@@ -564,23 +567,32 @@ class WelcomeLayout {
void resetLayoutModel() {
Welcome welcome = welcomeService.getWelcome();
Resource res = welcomeService.getWelcomeResource();
+ ModelSet modelSet = (ModelSet) res.getResourceSet();
+ Resource sashResource = SashModelUtils.getSashModel(modelSet).getResource();
+ Resource welcomeResource = Activator.getDefault().getWelcomeModelManager().getWelcomeResource(modelSet);
+
boolean[] recompute = { false };
try {
TransactionHelper.run(EMFHelper.resolveEditingDomain(welcome), () -> {
- if (welcome.eResource() != res) {
- // Move it
- res.getContents().add(welcome);
+ Welcome defaultWelcome = (Welcome) EcoreUtil.getObjectByType(welcomeResource.getContents(), WelcomePackage.Literals.WELCOME);
+
+ if (res == sashResource) {
+ // Move it back to the default resource
+ if (defaultWelcome != null) {
+ EcoreUtil.replace(defaultWelcome, welcome);
+ } else {
+ res.getContents().add(welcome);
+ }
}
- WelcomePage page = welcome.getWelcomePage();
- if (page != null) {
- new UML2Util() {
- {
- destroy(page);
- recompute[0] = true;
- }
- };
+ if (!EcoreUtil.equals(defaultWelcome, welcome)) {
+ recompute[0] = true;
+
+ // We need to keep the identity of the welcome object to maintain
+ // the reference from the sash model page, so make it look like the
+ // default welcome
+ become(welcome, defaultWelcome);
}
});
} catch (Exception e) {
@@ -588,10 +600,7 @@ class WelcomeLayout {
}
if (recompute[0]) {
- sort(tabs);
- layoutSashes();
- layoutTabSections();
- parent.layout();
+ layout();
}
}
@@ -601,6 +610,13 @@ class WelcomeLayout {
}
}
+ void layout() {
+ sort(tabs);
+ layoutSashes();
+ layoutTabSections();
+ parent.layout();
+ }
+
//
// Reflection hacks
//
diff --git a/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src/org/eclipse/papyrus/infra/editor/welcome/internal/WelcomeModelManager.java b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src/org/eclipse/papyrus/infra/editor/welcome/internal/WelcomeModelManager.java
new file mode 100644
index 00000000000..0dda87a6082
--- /dev/null
+++ b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src/org/eclipse/papyrus/infra/editor/welcome/internal/WelcomeModelManager.java
@@ -0,0 +1,370 @@
+/*****************************************************************************
+ * Copyright (c) 2015 Christian W. Damus and others.
+ *
+ * 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:
+ * Christian W. Damus - Initial API and implementation
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.infra.editor.welcome.internal;
+
+import static java.nio.file.StandardOpenOption.CREATE;
+import static java.nio.file.StandardOpenOption.WRITE;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.StandardOpenOption;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Objects;
+import java.util.function.Consumer;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationChain;
+import org.eclipse.emf.common.notify.Notifier;
+import org.eclipse.emf.common.notify.impl.AdapterImpl;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EStructuralFeature;
+import org.eclipse.emf.ecore.InternalEObject;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.ecore.resource.ResourceSet;
+import org.eclipse.emf.ecore.resource.URIConverter;
+import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl.ResourceLocator;
+import org.eclipse.emf.ecore.util.EcoreUtil;
+import org.eclipse.emf.ecore.xmi.impl.XMIResourceImpl;
+import org.eclipse.emf.transaction.RollbackException;
+import org.eclipse.emf.transaction.util.TransactionUtil;
+import org.eclipse.papyrus.infra.core.resource.ModelSet;
+import org.eclipse.papyrus.infra.core.sasheditor.di.contentprovider.utils.TransactionHelper;
+import org.eclipse.papyrus.infra.editor.welcome.Welcome;
+import org.eclipse.papyrus.infra.editor.welcome.WelcomeFactory;
+import org.eclipse.papyrus.infra.editor.welcome.WelcomePackage;
+
+/**
+ * A manager of the default {@link Welcome} model for the workspace.
+ */
+public class WelcomeModelManager {
+ private final URI welcomeURI = URI.createURI("papyrus.welcome:dynamic"); //$NON-NLS-1$
+
+ private final Path welcomePath;
+
+ private final Map<ModelSet, WelcomeLocator> resourceSets = new HashMap<>();
+
+ // Useful for validating our Welcome changes
+ private Consumer<Welcome> welcomeChangedHandler = Objects::requireNonNull;
+
+ public WelcomeModelManager(Path stateLocation) {
+ super();
+
+ welcomePath = stateLocation.resolve("welcome.xmi").toAbsolutePath(); //$NON-NLS-1$
+ }
+
+ public URI getWelcomeURI() {
+ return welcomeURI;
+ }
+
+ public boolean welcomeModelExists() {
+ return Files.exists(welcomePath);
+ }
+
+ public Welcome getWelcome(ResourceSet resourceSet) {
+ Resource resource = getWelcomeResource(resourceSet);
+ return (resource == null) ? null : getWelcome(resource);
+ }
+
+ public Resource getWelcomeResource(ResourceSet resourceSet) {
+ return resourceSet.getResource(getWelcomeURI(), true);
+ }
+
+ public void connect(ModelSet resourceSet) {
+ resourceSets.put(resourceSet, new WelcomeLocator(resourceSet));
+ }
+
+ public void disconnect(ModelSet resourceSet) {
+ WelcomeLocator locator = resourceSets.remove(resourceSet);
+ if (locator != null) {
+ locator.dispose();
+ }
+ }
+
+ public void onWelcomeChanged(Consumer<? super Welcome> welcomeChangedHandler) {
+ // Chain handlers
+ this.welcomeChangedHandler = this.welcomeChangedHandler.andThen(welcomeChangedHandler);
+ }
+
+ public void createDefaultWelcomeResource(Welcome welcome) throws IOException {
+ Resource welcomeResource = new XMIResourceImpl(getWelcomeURI());
+ welcomeResource.getContents().add(EcoreUtil.copy(welcome));
+
+ try (OutputStream output = Files.newOutputStream(welcomePath, WRITE, CREATE)) {
+ welcomeResource.save(output, null);
+
+ notifyDefaultChanged();
+ } catch (IOException e) {
+ // Make sure that any partial file is cleaned up
+ Files.deleteIfExists(welcomePath);
+ throw e;
+ } finally {
+ welcomeResource.unload();
+ welcomeResource.eAdapters().clear();
+ }
+ }
+
+ public void deleteDefaultWelcomeResource() throws IOException {
+ Files.deleteIfExists(welcomePath);
+
+ notifyDefaultChanged();
+ }
+
+ private void notifyDefaultChanged() {
+ resourceSets.keySet().stream()
+ .map(this::getWelcomeResource)
+ // This notifies the adapter, which re-loads the resource and notifies clients
+ .forEach(Resource::unload);
+ }
+
+ static Welcome getWelcome(Resource resource) {
+ return (Welcome) EcoreUtil.getObjectByType(resource.getContents(), WelcomePackage.Literals.WELCOME);
+ }
+
+ /**
+ * Make an on old object become something new by morphing into its likeness.
+ *
+ * @param oldObject
+ * the old object, which identity we need to keep
+ * @param newObject
+ * what the old object should be transformed into to look like
+ *
+ * @return the {@code oldObject}
+ */
+ static Welcome become(Welcome oldObject, Welcome newObject) {
+ if (oldObject == newObject) {
+ return oldObject;
+ }
+
+ // Re-initialize the old object
+ oldObject.eClass().getEAllStructuralFeatures().stream()
+ .filter(EStructuralFeature::isChangeable)
+ .forEach(f -> oldObject.eUnset(f));
+
+ // And repopuplate it from the new state
+ @SuppressWarnings("serial")
+ EcoreUtil.Copier copier = new EcoreUtil.Copier(true, true) {
+ @Override
+ protected EObject createCopy(EObject eObject) {
+ // We already have this "copy"
+ return (eObject == newObject) ? oldObject : super.createCopy(eObject);
+ }
+ };
+
+ // Replace the new object with the old
+ EcoreUtil.replace(newObject, oldObject);
+
+ return (Welcome) copier.copy(newObject);
+ }
+
+ //
+ // Nested types
+ //
+
+ private class WelcomeLocator extends ResourceLocator {
+ private final Resource welcomeResource;
+
+ WelcomeLocator(ModelSet modelSet) {
+ super(modelSet);
+
+ welcomeResource = new XMIResourceImpl(getWelcomeURI()) {
+ @Override
+ public ResourceSet getResourceSet() {
+ // Yes, this is a violation of the opposite constraint
+ return modelSet;
+ }
+
+ @Override
+ public NotificationChain basicSetResourceSet(ResourceSet resourceSet, NotificationChain notifications) {
+ throw new UnsupportedOperationException("setResourceSet");
+ }
+ };
+
+ welcomeResource.eAdapters().add(new DefaultWelcomeAdapter());
+ }
+
+ @Override
+ public Resource getResource(URI uri, boolean loadOnDemand) {
+ Resource result;
+
+ if (uri.equals(welcomeResource.getURI())) {
+ // Always implicitly load this one
+ result = getWelcomeResource();
+ } else {
+ result = basicGetResource(uri, loadOnDemand);
+ }
+
+ return result;
+ }
+
+ @Override
+ protected void demandLoadHelper(Resource resource) {
+ if (getWelcomeURI().equals(resource.getURI())) {
+ Welcome welcome = null;
+
+ if (welcomeModelExists()) {
+ try {
+ try (InputStream input = Files.newInputStream(welcomePath, StandardOpenOption.READ)) {
+ welcomeResource.load(input, null);
+ welcome = WelcomeModelManager.getWelcome(welcomeResource);
+ }
+ } catch (IOException e) {
+ Activator.log.error("Failed to load default welcome page layout", e); //$NON-NLS-1$
+ welcomeResource.getContents().clear(); // In case of partial load
+ }
+ }
+
+ if (welcome == null) {
+ welcome = WelcomeFactory.eINSTANCE.createWelcome();
+ welcomeResource.getContents().add(welcome);
+ }
+ } else {
+ super.demandLoadHelper(resource);
+ }
+ }
+
+ // More or less copied from EMF
+ @Override
+ protected Resource basicGetResource(URI uri, boolean loadOnDemand) {
+ Map<URI, Resource> map = resourceSet.getURIResourceMap();
+ if (map != null) {
+ Resource resource = map.get(uri);
+ if (resource != null) {
+ if (loadOnDemand && !resource.isLoaded()) {
+ demandLoadHelper(resource);
+ }
+ return resource;
+ }
+ }
+
+ URIConverter theURIConverter = resourceSet.getURIConverter();
+ URI normalizedURI = theURIConverter.normalize(uri);
+ for (Resource resource : resourceSet.getResources()) {
+ if (theURIConverter.normalize(resource.getURI()).equals(normalizedURI)) {
+ if (loadOnDemand && !resource.isLoaded()) {
+ demandLoadHelper(resource);
+ }
+
+ if (map != null) {
+ map.put(uri, resource);
+ }
+ return resource;
+ }
+ }
+
+ Resource delegatedResource = delegatedGetResource(uri, loadOnDemand);
+ if (delegatedResource != null) {
+ if (map != null) {
+ map.put(uri, delegatedResource);
+ }
+ return delegatedResource;
+ }
+
+ if (loadOnDemand) {
+ Resource resource = demandCreateResource(uri);
+ if (resource == null) {
+ throw new IllegalArgumentException(String.format("Cannot create a resource for '%s'; a registered resource factory is needed", uri));
+ }
+
+ demandLoadHelper(resource);
+
+ if (map != null) {
+ map.put(uri, resource);
+ }
+ return resource;
+ }
+
+ return null;
+
+ }
+
+ @Override
+ public void dispose() {
+ super.dispose();
+
+ // Ensure that our adapter is no longer listening to re-load the resource
+ welcomeResource.eAdapters().clear();
+ welcomeResource.unload();
+ }
+
+ Resource getWelcomeResource() {
+ if (!welcomeResource.isLoaded()) {
+ demandLoadHelper(welcomeResource);
+ }
+ return welcomeResource;
+ }
+ }
+
+ private class DefaultWelcomeAdapter extends AdapterImpl {
+ private Welcome realWelcome;
+
+ @Override
+ public void unsetTarget(Notifier oldTarget) {
+ super.unsetTarget(oldTarget);
+ realWelcome = null;
+ }
+
+ @Override
+ public void notifyChanged(Notification msg) {
+ if (msg.getNotifier() instanceof Resource) {
+ switch (msg.getFeatureID(Resource.class)) {
+ case Resource.RESOURCE__CONTENTS:
+ switch (msg.getEventType()) {
+ case Notification.REMOVE:
+ if (msg.getOldValue() instanceof Welcome) {
+ realWelcome = (Welcome) msg.getOldValue();
+ }
+ break;
+ case Notification.REMOVE_MANY:
+ realWelcome = (Welcome) EcoreUtil.getObjectByType((Collection<?>) msg.getOldValue(), WelcomePackage.Literals.WELCOME);
+ break;
+ }
+ break;
+ case Resource.RESOURCE__IS_LOADED:
+ if (msg.getOldBooleanValue() && !msg.getNewBooleanValue()) {
+ ResourceSet rset = ((Resource) msg.getNotifier()).getResourceSet();
+
+ // The resource was unloaded. Re-load it and push
+ // the new Welcome object into the Welcome Page if
+ // necessary. Be sure to maintain the old welcome's identity
+ // for integrity of the welcome page reference
+ try {
+ TransactionHelper.run(TransactionUtil.getEditingDomain(rset), () -> {
+ Welcome newWelcome = getWelcome(rset);
+ become(realWelcome, newWelcome);
+
+ // And it was unloaded, so it has a proxy URI that it shouldn't
+ ((InternalEObject) realWelcome).eSetProxyURI(null);
+ });
+ } catch (InterruptedException | RollbackException e) {
+ Activator.log.error("Failed to re-load the default welcome model.", e); //$NON-NLS-1$
+ }
+
+ // Notify the client
+ welcomeChangedHandler.accept(realWelcome);
+
+ realWelcome = null; // Don't need to hang onto this any longer
+ }
+ break;
+ }
+ }
+ }
+ }
+
+}
diff --git a/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src/org/eclipse/papyrus/infra/editor/welcome/internal/WelcomePage.java b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src/org/eclipse/papyrus/infra/editor/welcome/internal/WelcomePage.java
index d5a0e1e75fe..115e5669c66 100644
--- a/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src/org/eclipse/papyrus/infra/editor/welcome/internal/WelcomePage.java
+++ b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src/org/eclipse/papyrus/infra/editor/welcome/internal/WelcomePage.java
@@ -205,6 +205,10 @@ public class WelcomePage implements ICloseablePart {
welcomeLayout.resetLayoutModel();
}
+ void layout() {
+ welcomeLayout.layout();
+ }
+
@Override
public void addPropertyListener(IPropertyListener listener) {
propertyListeners.addIfAbsent(listener);
diff --git a/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src/org/eclipse/papyrus/infra/editor/welcome/internal/WelcomePageService.java b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src/org/eclipse/papyrus/infra/editor/welcome/internal/WelcomePageService.java
index bcf2ba2fb68..249c37e5b8a 100644
--- a/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src/org/eclipse/papyrus/infra/editor/welcome/internal/WelcomePageService.java
+++ b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src/org/eclipse/papyrus/infra/editor/welcome/internal/WelcomePageService.java
@@ -16,22 +16,18 @@ package org.eclipse.papyrus.infra.editor.welcome.internal;
import static java.util.Spliterators.spliteratorUnknownSize;
import static java.util.stream.StreamSupport.stream;
+import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
-import java.util.Map;
import java.util.Optional;
import java.util.Spliterator;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.emf.common.notify.NotificationChain;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
import org.eclipse.emf.common.notify.Notifier;
import org.eclipse.emf.common.notify.impl.AdapterImpl;
-import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.ecore.resource.ResourceSet;
-import org.eclipse.emf.ecore.resource.URIConverter;
-import org.eclipse.emf.ecore.resource.impl.ResourceImpl;
-import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl.ResourceLocator;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.emf.edit.domain.EditingDomain;
import org.eclipse.papyrus.infra.core.editor.IMultiDiagramEditor;
@@ -58,9 +54,9 @@ import org.eclipse.papyrus.infra.core.services.ServicesRegistry;
import org.eclipse.papyrus.infra.core.utils.TransactionHelper;
import org.eclipse.papyrus.infra.editor.welcome.IWelcomePageService;
import org.eclipse.papyrus.infra.editor.welcome.Welcome;
-import org.eclipse.papyrus.infra.editor.welcome.WelcomeFactory;
import org.eclipse.papyrus.infra.editor.welcome.WelcomePackage;
import org.eclipse.papyrus.infra.emf.utils.EMFHelper;
+import org.eclipse.papyrus.infra.tools.util.PlatformHelper;
import org.eclipse.swt.widgets.Display;
/**
@@ -69,11 +65,12 @@ import org.eclipse.swt.widgets.Display;
public class WelcomePageService implements IWelcomePageService {
private ServicesRegistry services;
+ private ModelSet modelSet;
private ISashWindowsContainer sashContainer;
private IPageManager pageManager;
private EditorLifecycleManager editorManager;
- private WelcomeLocator welcomeLocator;
+ private WelcomeModelManager welcomeManager;
private IPageLifeCycleEventsListener sashListener;
private EditorLifecycleEventListener editorListener;
@@ -96,7 +93,10 @@ public class WelcomePageService implements IWelcomePageService {
@Override
public void startService() throws ServiceException {
- welcomeLocator = new WelcomeLocator(services.getService(ModelSet.class));
+ welcomeManager = Activator.getDefault().getWelcomeModelManager();
+ modelSet = services.getService(ModelSet.class);
+ welcomeManager.connect(modelSet);
+ welcomeManager.onWelcomeChanged(this::handleWelcomeChanged);
pageManager = services.getService(IPageManager.class);
@@ -111,11 +111,12 @@ public class WelcomePageService implements IWelcomePageService {
public void disposeService() throws ServiceException {
uninstallPageRemovalValidator();
- if (welcomeLocator != null) {
- welcomeLocator.dispose();
- welcomeLocator = null;
+ if (welcomeManager != null) {
+ welcomeManager.disconnect(modelSet);
+ welcomeManager = null;
}
+ modelSet = null;
pageManager = null;
if (editorManager != null) {
@@ -164,11 +165,26 @@ public class WelcomePageService implements IWelcomePageService {
@Override
public void resetWelcomePage() {
- if (welcomePage instanceof IAdaptable) {
- ((IAdaptable) welcomePage).getAdapter(WelcomePage.class).reset();
+ getWelcomePage().ifPresent(WelcomePage::reset);
+ }
+
+ Optional<WelcomePage> getWelcomePage() {
+ return Optional.ofNullable(PlatformHelper.getAdapter(welcomePage, WelcomePage.class));
+ }
+
+ @Override
+ public void saveWelcomePageAsDefault() throws CoreException {
+ try {
+ welcomeManager.createDefaultWelcomeResource(getWelcome());
+ } catch (IOException e) {
+ throw new CoreException(new Status(IStatus.ERROR, Activator.PLUGIN_ID, "Failed to set default welcome page", e));
}
}
+ void handleWelcomeChanged(Welcome welcome) {
+ getWelcomePage().ifPresent(WelcomePage::layout);
+ }
+
void checkWelcomePage() {
Display.getDefault().asyncExec(() -> {
// Check that the editor hasn't been disposed in the mean-time
@@ -177,21 +193,29 @@ public class WelcomePageService implements IWelcomePageService {
openWelcomePage();
}
- if (welcomePage instanceof IAdaptable) {
- ((IAdaptable) welcomePage).getAdapter(WelcomePage.class).fireCanCloseChanged();
- }
+ getWelcomePage().ifPresent(WelcomePage::fireCanCloseChanged);
}
});
}
@Override
public Welcome getWelcome() {
- return welcomeLocator.getWelcome();
+ Welcome override = getWelcomeOverride();
+ return (override != null) ? override : welcomeManager.getWelcome(modelSet);
}
@Override
public Resource getWelcomeResource() {
- return welcomeLocator.getWelcomeResource();
+ Welcome override = getWelcomeOverride();
+ return (override != null) ? override.eResource() : welcomeManager.getWelcomeResource(modelSet);
+ }
+
+ /** Get the welcome model stored in the editor's sash resource, if any. */
+ private Welcome getWelcomeOverride() {
+ Resource sashResource = SashModelUtils.getSashModel(modelSet).getResource();
+ return (sashResource == null)
+ ? null
+ : (Welcome) EcoreUtil.getObjectByType(sashResource.getContents(), WelcomePackage.Literals.WELCOME);
}
Object getModel() {
@@ -243,7 +267,6 @@ public class WelcomePageService implements IWelcomePageService {
}
private SashModel getSashModel() {
- ModelSet modelSet = (ModelSet) getWelcomeResource().getResourceSet();
// Resource may have been unloaded and removed
SashWindowsMngr sashMngr = (modelSet == null) ? null : SashModelUtils.getSashWindowsMngr(modelSet);
return (sashMngr == null) ? null : sashMngr.getSashModel();
@@ -312,6 +335,10 @@ public class WelcomePageService implements IWelcomePageService {
sashContainer.addPageLifeCycleListener(sashListener);
welcomePage = IPageUtils.lookupModelPage(sashContainer, getModel());
+ if (welcomePage == null) {
+ // Maybe we have a left-over override that we're not using?
+ welcomePage = IPageUtils.lookupModelPage(sashContainer, welcomeManager.getWelcome(modelSet));
+ }
checkWelcomePage();
initializeActivePages();
@@ -331,126 +358,6 @@ public class WelcomePageService implements IWelcomePageService {
}
- private static class WelcomeLocator extends ResourceLocator {
- private final Resource welcomeResource;
- private final Welcome welcome;
-
- WelcomeLocator(ModelSet modelSet) {
- super(modelSet);
-
- // TODO: Store this resource in the workspace metadata area for custom default layout
- welcomeResource = new ResourceImpl(URI.createURI("papyrus.welcome:dynamic")) {
- @Override
- public ResourceSet getResourceSet() {
- // Yes, this is a violation of the opposite constraint
- return modelSet;
- }
-
- @Override
- public NotificationChain basicSetResourceSet(ResourceSet resourceSet, NotificationChain notifications) {
- throw new UnsupportedOperationException("setResourceSet");
- }
- };
-
- org.eclipse.papyrus.infra.core.resource.sasheditor.SashModel sashModel = SashModelUtils.getSashModel(modelSet);
- Resource sashRes = (sashModel == null) ? null : sashModel.getResource();
- Welcome sashWelcome = (sashRes == null) ? null : (Welcome) EcoreUtil.getObjectByType(sashRes.getContents(), WelcomePackage.Literals.WELCOME);
-
- if (sashWelcome != null) {
- // The user has customized this one
- welcome = sashWelcome;
- } else {
- // Create the empty prototype
- welcome = WelcomeFactory.eINSTANCE.createWelcome();
- welcomeResource.getContents().add(welcome);
- }
- }
-
- @Override
- public Resource getResource(URI uri, boolean loadOnDemand) {
- Resource result;
-
- if (uri.equals(welcomeResource.getURI())) {
- // The welcome resource is always implicitly loaded
- result = welcomeResource;
- } else {
- result = basicGetResource(uri, loadOnDemand);
- }
-
- return result;
- }
-
- // More or less copied from EMF
- @Override
- protected Resource basicGetResource(URI uri, boolean loadOnDemand) {
- Map<URI, Resource> map = resourceSet.getURIResourceMap();
- if (map != null) {
- Resource resource = map.get(uri);
- if (resource != null) {
- if (loadOnDemand && !resource.isLoaded()) {
- demandLoadHelper(resource);
- }
- return resource;
- }
- }
-
- URIConverter theURIConverter = resourceSet.getURIConverter();
- URI normalizedURI = theURIConverter.normalize(uri);
- for (Resource resource : resourceSet.getResources()) {
- if (theURIConverter.normalize(resource.getURI()).equals(normalizedURI)) {
- if (loadOnDemand && !resource.isLoaded()) {
- demandLoadHelper(resource);
- }
-
- if (map != null) {
- map.put(uri, resource);
- }
- return resource;
- }
- }
-
- Resource delegatedResource = delegatedGetResource(uri, loadOnDemand);
- if (delegatedResource != null) {
- if (map != null) {
- map.put(uri, delegatedResource);
- }
- return delegatedResource;
- }
-
- if (loadOnDemand) {
- Resource resource = demandCreateResource(uri);
- if (resource == null) {
- throw new IllegalArgumentException(String.format("Cannot create a resource for '%s'; a registered resource factory is needed", uri));
- }
-
- demandLoadHelper(resource);
-
- if (map != null) {
- map.put(uri, resource);
- }
- return resource;
- }
-
- return null;
-
- }
-
- @Override
- public void dispose() {
- super.dispose();
-
- welcomeResource.unload();
- }
-
- Welcome getWelcome() {
- return welcome;
- }
-
- Resource getWelcomeResource() {
- return welcomeResource;
- }
- }
-
private class CloseValidator extends AdapterImpl implements PageRemovalValidator {
private SashModel sashModel;
diff --git a/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src/org/eclipse/papyrus/infra/editor/welcome/internal/commands/AbstractWelcomePageHandler.java b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src/org/eclipse/papyrus/infra/editor/welcome/internal/commands/AbstractWelcomePageHandler.java
new file mode 100644
index 00000000000..cbee268e9f9
--- /dev/null
+++ b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src/org/eclipse/papyrus/infra/editor/welcome/internal/commands/AbstractWelcomePageHandler.java
@@ -0,0 +1,86 @@
+/*****************************************************************************
+ * Copyright (c) 2015 Christian W. Damus and others.
+ *
+ * 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:
+ * Christian W. Damus - Initial API and implementation
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.infra.editor.welcome.internal.commands;
+
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.papyrus.infra.core.editor.IMultiDiagramEditor;
+import org.eclipse.papyrus.infra.core.sasheditor.di.contentprovider.utils.IPageUtils;
+import org.eclipse.papyrus.infra.core.sasheditor.editor.IPage;
+import org.eclipse.papyrus.infra.core.sasheditor.editor.ISashWindowsContainer;
+import org.eclipse.papyrus.infra.core.services.ServiceException;
+import org.eclipse.papyrus.infra.editor.welcome.IWelcomePageService;
+import org.eclipse.papyrus.infra.editor.welcome.internal.Activator;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.ISources;
+import org.eclipse.ui.handlers.HandlerUtil;
+
+/**
+ * Abstract handler for the Welcome Page menu commands.
+ */
+public abstract class AbstractWelcomePageHandler extends AbstractHandler {
+
+ public AbstractWelcomePageHandler() {
+ super();
+ }
+
+ @Override
+ public Object execute(ExecutionEvent event) throws ExecutionException {
+ IEditorPart editor = HandlerUtil.getActiveEditor(event);
+
+ if (editor instanceof IMultiDiagramEditor) {
+ IMultiDiagramEditor multiEditor = (IMultiDiagramEditor) editor;
+ try {
+ IWelcomePageService welcomeService = multiEditor.getServicesRegistry().getService(IWelcomePageService.class);
+ doExecute(multiEditor, welcomeService);
+ } catch (ServiceException e) {
+ throw new ExecutionException("Could not obtain the welcome-page service.", e); //$NON-NLS-1$
+ }
+ }
+
+ return null;
+ }
+
+ protected abstract void doExecute(IMultiDiagramEditor editor, IWelcomePageService welcomeService);
+
+ @Override
+ public void setEnabled(Object evaluationContext) {
+ boolean enable = false;
+
+ Object editor = HandlerUtil.getVariable(evaluationContext, ISources.ACTIVE_EDITOR_NAME);
+
+ if (editor instanceof IMultiDiagramEditor) {
+ IMultiDiagramEditor multiEditor = (IMultiDiagramEditor) editor;
+ ISashWindowsContainer sashContainer = multiEditor.getAdapter(ISashWindowsContainer.class);
+ if ((sashContainer != null) && !sashContainer.isDisposed()) {
+ IPage activePage = sashContainer.getActiveSashWindowsPage();
+
+ try {
+ IWelcomePageService welcomeService = multiEditor.getServicesRegistry().getService(IWelcomePageService.class);
+ enable = isEnabled(multiEditor, activePage, welcomeService);
+ } catch (ServiceException e) {
+ // Not enabled if there's no Welcome Service
+ Activator.log.error("Could not obtain the welcome-page service.", e); //$NON-NLS-1$
+ }
+ }
+ }
+
+ setBaseEnabled(enable);
+ }
+
+ protected boolean isEnabled(IMultiDiagramEditor editor, IPage activePage, IWelcomePageService welcomeService) {
+ return (activePage != null) && (IPageUtils.getRawModel(activePage) == welcomeService.getWelcome());
+ }
+}
diff --git a/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src/org/eclipse/papyrus/infra/editor/welcome/internal/commands/ResetWelcomePageHandler.java b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src/org/eclipse/papyrus/infra/editor/welcome/internal/commands/ResetWelcomePageHandler.java
index dcca8434288..42c646b50b1 100644
--- a/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src/org/eclipse/papyrus/infra/editor/welcome/internal/commands/ResetWelcomePageHandler.java
+++ b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src/org/eclipse/papyrus/infra/editor/welcome/internal/commands/ResetWelcomePageHandler.java
@@ -13,59 +13,20 @@
package org.eclipse.papyrus.infra.editor.welcome.internal.commands;
-import org.eclipse.core.commands.AbstractHandler;
-import org.eclipse.core.commands.ExecutionEvent;
-import org.eclipse.core.commands.ExecutionException;
import org.eclipse.papyrus.infra.core.editor.IMultiDiagramEditor;
-import org.eclipse.papyrus.infra.core.sasheditor.di.contentprovider.utils.IPageUtils;
-import org.eclipse.papyrus.infra.core.sasheditor.editor.IPage;
-import org.eclipse.papyrus.infra.core.sasheditor.editor.ISashWindowsContainer;
-import org.eclipse.papyrus.infra.core.services.ServiceException;
import org.eclipse.papyrus.infra.editor.welcome.IWelcomePageService;
-import org.eclipse.papyrus.infra.editor.welcome.Welcome;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.ISources;
-import org.eclipse.ui.handlers.HandlerUtil;
/**
* Handler for the <em>Reset Welcome Page</em> menu command.
*/
-public class ResetWelcomePageHandler extends AbstractHandler {
+public class ResetWelcomePageHandler extends AbstractWelcomePageHandler {
public ResetWelcomePageHandler() {
super();
}
@Override
- public Object execute(ExecutionEvent event) throws ExecutionException {
- IEditorPart editor = HandlerUtil.getActiveEditor(event);
-
- if (editor instanceof IMultiDiagramEditor) {
- try {
- IWelcomePageService welcomeService = ((IMultiDiagramEditor) editor).getServicesRegistry().getService(IWelcomePageService.class);
- welcomeService.resetWelcomePage();
- } catch (ServiceException e) {
- throw new ExecutionException("Could not obtain the welcome-page service.", e); //$NON-NLS-1$
- }
- }
-
- return null;
- }
-
- @Override
- public void setEnabled(Object evaluationContext) {
- boolean enable = false;
-
- Object editor = HandlerUtil.getVariable(evaluationContext, ISources.ACTIVE_EDITOR_NAME);
-
- if (editor instanceof IMultiDiagramEditor) {
- ISashWindowsContainer sashContainer = ((IMultiDiagramEditor) editor).getAdapter(ISashWindowsContainer.class);
- if ((sashContainer != null) && !sashContainer.isDisposed()) {
- IPage activePage = sashContainer.getActiveSashWindowsPage();
- enable = (activePage != null) && (IPageUtils.getRawModel(activePage) instanceof Welcome);
- }
- }
-
- setBaseEnabled(enable);
+ protected void doExecute(IMultiDiagramEditor editor, IWelcomePageService welcomeService) {
+ welcomeService.resetWelcomePage();
}
}
diff --git a/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src/org/eclipse/papyrus/infra/editor/welcome/internal/commands/SaveDefaultWelcomePageHandler.java b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src/org/eclipse/papyrus/infra/editor/welcome/internal/commands/SaveDefaultWelcomePageHandler.java
new file mode 100644
index 00000000000..b554132a04e
--- /dev/null
+++ b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src/org/eclipse/papyrus/infra/editor/welcome/internal/commands/SaveDefaultWelcomePageHandler.java
@@ -0,0 +1,46 @@
+/*****************************************************************************
+ * Copyright (c) 2015 Christian W. Damus and others.
+ *
+ * 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:
+ * Christian W. Damus - Initial API and implementation
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.infra.editor.welcome.internal.commands;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.papyrus.infra.core.editor.IMultiDiagramEditor;
+import org.eclipse.papyrus.infra.editor.welcome.IWelcomePageService;
+import org.eclipse.ui.statushandlers.IStatusAdapterConstants;
+import org.eclipse.ui.statushandlers.StatusAdapter;
+import org.eclipse.ui.statushandlers.StatusManager;
+
+/**
+ * Handler for the <em>Set as Default Welcome Page</em> menu command.
+ */
+public class SaveDefaultWelcomePageHandler extends AbstractWelcomePageHandler {
+
+ public SaveDefaultWelcomePageHandler() {
+ super();
+ }
+
+ @Override
+ protected void doExecute(IMultiDiagramEditor editor, IWelcomePageService welcomeService) {
+ try {
+ welcomeService.saveWelcomePageAsDefault();
+ welcomeService.resetWelcomePage(); // And pick up this new default layout
+ } catch (CoreException e) {
+ StatusAdapter adapter = new StatusAdapter(e.getStatus());
+ adapter.setProperty(IStatusAdapterConstants.TIMESTAMP_PROPERTY, System.currentTimeMillis());
+ adapter.setProperty(IStatusAdapterConstants.EXPLANATION_PROPERTY, "The Welcome Page layout could not be saved in the workspace.");
+ adapter.setProperty(IStatusAdapterConstants.TITLE_PROPERTY, "Set Default Welcome Page Layout");
+
+ StatusManager.getManager().handle(adapter, StatusManager.SHOW);
+ }
+ }
+}
diff --git a/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src/org/eclipse/papyrus/infra/editor/welcome/internal/commands/ShowWelcomePageHandler.java b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src/org/eclipse/papyrus/infra/editor/welcome/internal/commands/ShowWelcomePageHandler.java
index 9b4fbf2c5bc..4e835244c9a 100644
--- a/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src/org/eclipse/papyrus/infra/editor/welcome/internal/commands/ShowWelcomePageHandler.java
+++ b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src/org/eclipse/papyrus/infra/editor/welcome/internal/commands/ShowWelcomePageHandler.java
@@ -13,59 +13,27 @@
package org.eclipse.papyrus.infra.editor.welcome.internal.commands;
-import org.eclipse.core.commands.AbstractHandler;
-import org.eclipse.core.commands.ExecutionEvent;
-import org.eclipse.core.commands.ExecutionException;
import org.eclipse.papyrus.infra.core.editor.IMultiDiagramEditor;
import org.eclipse.papyrus.infra.core.sasheditor.di.contentprovider.utils.IPageUtils;
import org.eclipse.papyrus.infra.core.sasheditor.editor.IPage;
-import org.eclipse.papyrus.infra.core.sasheditor.editor.ISashWindowsContainer;
-import org.eclipse.papyrus.infra.core.services.ServiceException;
import org.eclipse.papyrus.infra.editor.welcome.IWelcomePageService;
-import org.eclipse.papyrus.infra.editor.welcome.Welcome;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.ISources;
-import org.eclipse.ui.handlers.HandlerUtil;
/**
* Handler for the <em>Show Welcome Page</em> menu command.
*/
-public class ShowWelcomePageHandler extends AbstractHandler {
+public class ShowWelcomePageHandler extends AbstractWelcomePageHandler {
public ShowWelcomePageHandler() {
super();
}
@Override
- public Object execute(ExecutionEvent event) throws ExecutionException {
- IEditorPart editor = HandlerUtil.getActiveEditor(event);
-
- if (editor instanceof IMultiDiagramEditor) {
- try {
- IWelcomePageService welcomeService = ((IMultiDiagramEditor) editor).getServicesRegistry().getService(IWelcomePageService.class);
- welcomeService.openWelcomePage();
- } catch (ServiceException e) {
- throw new ExecutionException("Could not obtain the welcome-page service.", e); //$NON-NLS-1$
- }
- }
-
- return null;
+ protected void doExecute(IMultiDiagramEditor editor, IWelcomePageService welcomeService) {
+ welcomeService.openWelcomePage();
}
@Override
- public void setEnabled(Object evaluationContext) {
- boolean enable = true;
-
- Object editor = HandlerUtil.getVariable(evaluationContext, ISources.ACTIVE_EDITOR_NAME);
-
- if (editor instanceof IMultiDiagramEditor) {
- ISashWindowsContainer sashContainer = ((IMultiDiagramEditor) editor).getAdapter(ISashWindowsContainer.class);
- if ((sashContainer != null) && !sashContainer.isDisposed()) {
- IPage activePage = sashContainer.getActiveSashWindowsPage();
- enable = (activePage == null) || !(IPageUtils.getRawModel(activePage) instanceof Welcome);
- }
- }
-
- setBaseEnabled(enable);
+ protected boolean isEnabled(IMultiDiagramEditor editor, IPage activePage, IWelcomePageService welcomeService) {
+ return (activePage == null) || (IPageUtils.getRawModel(activePage) != welcomeService.getWelcome());
}
}
diff --git a/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src/org/eclipse/papyrus/infra/editor/welcome/internal/preferences/WelcomeContentPreferencePage.java b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src/org/eclipse/papyrus/infra/editor/welcome/internal/preferences/WelcomeContentPreferencePage.java
new file mode 100644
index 00000000000..e981eb4cbda
--- /dev/null
+++ b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src/org/eclipse/papyrus/infra/editor/welcome/internal/preferences/WelcomeContentPreferencePage.java
@@ -0,0 +1,64 @@
+/*****************************************************************************
+ * Copyright (c) 2015 Christian W. Damus and others.
+ *
+ * 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:
+ * Christian W. Damus - Initial API and implementation
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.infra.editor.welcome.internal.preferences;
+
+import java.io.IOException;
+
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.layout.GridLayoutFactory;
+import org.eclipse.papyrus.infra.editor.welcome.internal.Activator;
+import org.eclipse.papyrus.views.properties.preferences.Preferences;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+
+/**
+ * The specialized preference page for the <em>Welcome Page</em> contents.
+ */
+public class WelcomeContentPreferencePage extends Preferences {
+
+ public WelcomeContentPreferencePage() {
+ super();
+ }
+
+ @Override
+ protected void createHeaderContents(Composite parent) {
+ Composite header = new Composite(parent, SWT.NONE);
+ GridLayoutFactory.swtDefaults().numColumns(2).margins(0, 0).applyTo(header);
+
+ new Label(header, SWT.NONE).setText("Default Welcome Page layout:");
+ Button resetButton = new Button(header, SWT.PUSH);
+ resetButton.setText("Reset");
+ resetButton.setToolTipText("Revert the default Welcome Page layout to factory defaults");
+ resetButton.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ resetWelcomePageLayout();
+ }
+ });
+ }
+
+ private void resetWelcomePageLayout() {
+ if (MessageDialog.openConfirm(getShell(), "Reset Default Welcome Page Layout", "Are you sure you want to reset the default Welcome Page layout to factory defaults?\nThis will affect all Welcome Pages that have not customized the layout.")) {
+ try {
+ Activator.getDefault().getWelcomeModelManager().deleteDefaultWelcomeResource();
+ } catch (IOException e) {
+ Activator.log.error("Failed to delete the workspace's default welcome layout.", e); //$NON-NLS-1$
+ }
+ }
+ }
+}

Back to the top