Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • af3/kernel
  • diewald/kernel
2 results
Show changes
Showing
with 148 additions and 12 deletions
......@@ -15,6 +15,7 @@
+--------------------------------------------------------------------------*/
package org.fortiss.tooling.kernel.ui.extension.base.factory;
import static java.util.Optional.empty;
import static java.util.stream.Collectors.toList;
import static org.apache.commons.lang3.reflect.ConstructorUtils.getMatchingAccessibleConstructor;
import static org.conqat.lib.commons.collections.CollectionUtils.isNullOrEmpty;
......@@ -32,9 +33,9 @@ import org.fortiss.tooling.common.ui.javafx.lwfxef.model.IModelFactory;
import org.fortiss.tooling.kernel.ui.ToolingKernelUIActivator;
/**
* Delegates the creational and getter calls to concrete {@link IModelFactory}s. The first non-null
* element returned by the factories of the initially given list is returned. If no element is
* created (all delegates returned null), this factory also returns null.
* Delegates the creational and getter calls to concrete {@link IModelFactory}s. The first
* non-{@code null} element returned by the factories of the initially given list is returned. If no
* element is created (all delegates returned {@code null}), this factory also returns {@code null}.
* <p>
* Only the root model must be identical for all delegate factories. Hence, the root element of the
* first delegate is returned.
......@@ -65,7 +66,7 @@ public class DelegatingModelFactory extends DelegatingFactoryBase<IModelFactory>
InvocationTargetException e) {
error(ToolingKernelUIActivator.getDefault(), "Failed to instantiate the factory " +
delegateFactory.getSimpleName() + ".");
return Optional.empty();
return empty();
}
} catch(NullPointerException | SecurityException e1) {
error(ToolingKernelUIActivator.getDefault(), "The factory " +
......@@ -73,7 +74,7 @@ public class DelegatingModelFactory extends DelegatingFactoryBase<IModelFactory>
" is missing a single argument Constructor accepting the edited model." +
" Only such constructors are allowed for " +
IModelFactory.class.getSimpleName() + "s.");
return Optional.empty();
return empty();
}
}
......@@ -109,7 +110,8 @@ public class DelegatingModelFactory extends DelegatingFactoryBase<IModelFactory>
/** {@inheritDoc} */
@Override
public Object getRootModel() {
return editedObject;
return getDelegateFactories().stream().map(f -> f.getRootModel()).filter(cc -> cc != null)
.findFirst().orElse(null);
}
/** {@inheritDoc} */
......
......@@ -32,9 +32,9 @@ import org.fortiss.tooling.kernel.ui.extension.base.LWFXEFEditorBase;
/**
* Base class for {@link IVisualFactory}s of extendable {@link LWFXEFEditorBase}
* {@link IEditorPart}s.The first non-null element returned by the factories of the initially given
* list is returned. If no element is
* created (all delegates returned null), this factory also returns null.
* {@link IEditorPart}s.The first non-{@code null} element returned by the factories of the
* initially given list is returned. If no element is created (all delegates returned null), this
* factory also returns {@code null}.
* <P>
* This class uses the {@link ITransformationService} to find a delegate visual factory for the
* model elements in question.
......
......@@ -3,8 +3,8 @@ AllocationEditPartFactoryService.java 81bd227736013f1157ba9d0f79a9f3deefe10064 G
ContextMenuService.java ca3c899293f25b70ce8e5f0d86ca2f9683329d81 GREEN
EditPartFactoryService.java e9180c0020f1769d9e24ef3c08f9ca5599dbc5c3 GREEN
MarkerService.java 208f97f3ccabf0947702a17ddca23d8766a268f4 GREEN
ModelEditorBindingService.java 948fcdc298a74e366351ad8835a145af6cd238be GREEN
ModelElementHandlerService.java 07a30545ad687ff0fe13bf7a9348c41fb03e0b2c GREEN
ModelEditorBindingService.java 577f5db41abf240291434dbad6bc6b0fde1eeb2b GREEN
ModelElementHandlerService.java eeb07f6926012aa98256d452d1e554a5486dc657 GREEN
NavigatorService.java 2b1361eac805996e22e5409dafff9707fbac3376 GREEN
ToolingKernelUIInternal.java a70d19883dfb315d860233156d8524cf1ac2952f GREEN
TutorialUIService.java b1d632eca91b4feb583f3930cd6ee4722dd9bfed GREEN
......@@ -33,6 +33,8 @@ import org.fortiss.tooling.kernel.ui.extension.IModelElementHandler;
import org.fortiss.tooling.kernel.ui.internal.introspection.items.ModelElementHandlerServiceIntrospectionDetailsItem;
import org.fortiss.tooling.kernel.ui.service.IModelElementHandlerService;
import javafx.scene.Node;
/**
* This class implements the {@link IModelElementHandlerService} interface. It
* requires a unique and singleton model element handler per model element
......@@ -145,6 +147,13 @@ public class ModelElementHandlerService
return handler == null ? null : handler.getIcon(modelElement);
}
/** {@inheritDoc} */
@Override
public Node getFXIcon(EObject modelElement) {
IModelElementHandler<EObject> handler = getModelElementHandler(modelElement);
return handler == null ? null : handler.getFXIcon(modelElement);
}
/** {@inheritDoc} */
@Override
public String getWrappedNameDescription(EObject modelElement) {
......
......@@ -4,6 +4,6 @@ IContextMenuService.java cfb6b8237b6cd2b0e461991a9ceb95969f330265 GREEN
IEditPartFactoryService.java c448bff63fb81f57037c9f1dc5319859c12d0c4d GREEN
IMarkerService.java d433e838e387dd2fe61b8dea7395ebb7203ae39b GREEN
IModelEditorBindingService.java ce2ae1957e2232bb0fac1d1d262103f9adfc5266 GREEN
IModelElementHandlerService.java c04c2876ccb8b3f8597c8e443f9c7c3db0945430 GREEN
IModelElementHandlerService.java 1ff2bda9054f6bbd4017fc0ddc118b7702196815 GREEN
INavigatorService.java 8d2ffeb6f075d3abea904b84d8a40090d97837fd GREEN
ITutorialUIService.java 72707c60c3d23d8ffc5c579cb9b022bb614eb094 GREEN
......@@ -20,6 +20,8 @@ import org.eclipse.swt.graphics.Image;
import org.fortiss.tooling.kernel.ui.extension.IModelElementHandler;
import org.fortiss.tooling.kernel.ui.internal.ModelElementHandlerService;
import javafx.scene.Node;
/**
* The model element handler service provides access to registered model element
* handlers.
......@@ -63,6 +65,12 @@ public interface IModelElementHandlerService {
*/
Image getIcon(EObject modelElement);
/**
* Returns the (JavaFX) icon of the model element (or <code>null</code> if no handler
* was found).
*/
Node getFXIcon(EObject modelElement);
/**
* Returns a wrapped string built from the name and description returned by
* the underlying handler.
......
......@@ -7,6 +7,7 @@ HierarchicalNameComparator.java 6face1b673126701a0721af48ead2f9766c17d46 GREEN
IdentifierUtils.java fff43dc4e84cdd89c3ece4f5d9d89aec4b0749c2 GREEN
JavaUtils.java 65cdadfb9137a240ad59992eacf53a15b7f20804 GREEN
KernelModelElementUtils.java fded09befe7e543fc04ea5184ffc1c8a309d7a66 GREEN
KernelServiceBasedModelListenerBase.java 8d916509ae75f7118ce72564ee715c46556fb709 GREEN
LoggingUtils.java 0e0aa5d466d80ea29cfc7e91178b23a5cdd4ddf7 GREEN
PrototypesUtils.java ec75bed75cfc5103f1f38e3a29df86f729428775 GREEN
ResourceUtils.java 7f4941a83115dfbed75eb58b79c0a372fe1cbb94 GREEN
......
/*-------------------------------------------------------------------------+
| Copyright 2019 fortiss GmbH |
| |
| Licensed under the Apache License, Version 2.0 (the "License"); |
| you may not use this file except in compliance with the License. |
| You may obtain a copy of the License at |
| |
| http://www.apache.org/licenses/LICENSE-2.0 |
| |
| Unless required by applicable law or agreed to in writing, software |
| distributed under the License is distributed on an "AS IS" BASIS, |
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| See the License for the specific language governing permissions and |
| limitations under the License. |
+--------------------------------------------------------------------------*/
package org.fortiss.tooling.kernel.utils;
import java.util.ArrayList;
import java.util.EventObject;
import java.util.List;
import org.eclipse.emf.common.command.CommandStackListener;
import org.eclipse.emf.common.notify.Adapter;
import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.util.EContentAdapter;
import org.fortiss.tooling.kernel.extension.data.ITopLevelElement;
import org.fortiss.tooling.kernel.service.ICommandStackService;
import org.fortiss.tooling.kernel.service.IPersistencyService;
/**
* Base class for listeners using EMF {@link Adapter}s and {@link ICommandStackService}.
* <P>
* Sub-classes should override {@link #updateComplete(List)} in order to be notified when an
* update cycle has completed (one or more EMF notifications followed by a command stack
* change).
* <P>
* Sub-classes may also provide their custom EMF {@link Adapter}, but must call
* {@link #addNotification(Notification)} whenever a relevant EMF notification occurs.
*
* @author hoelzl
*/
public abstract class KernelServiceBasedModelListenerBase<T extends EObject>
implements CommandStackListener {
/** The persistency service reference. */
private static final IPersistencyService persistencyService = IPersistencyService.getInstance();
/** The command stack service. */
private static final ICommandStackService commandStackService =
ICommandStackService.getInstance();
/** List of relevant {@link Notification}s recorded during a change transaction. */
private final List<Notification> notifications = new ArrayList<>();
/** The model element. */
private final T modelElement;
/** The EMF notification listener. */
private Adapter emfAdapter = new EContentAdapter() {
/** {@inheritDoc} */
@Override
public void notifyChanged(Notification notification) {
super.notifyChanged(notification);
addNotification(notification);
}
};
/** Constructor. */
public KernelServiceBasedModelListenerBase(T modelElement, Adapter emfAdapter) {
this.modelElement = modelElement;
this.emfAdapter = emfAdapter;
}
/** Constructor. */
public KernelServiceBasedModelListenerBase(T modelElement) {
this.modelElement = modelElement;
}
/**
* Called when the update cycle is completed.
*
* @param notifications
* the list of notifications of the completed cycle
*/
public void updateComplete(List<Notification> notifications) {
// default does nothing.
}
/** Adds the given {@link Notification} to list of notifications. */
protected final void addNotification(Notification event) {
notifications.add(event);
}
/** Registers the listener with the model and the command stack service. */
public final void register() {
notifications.clear();
ITopLevelElement root = persistencyService.getTopLevelElementFor(modelElement);
commandStackService.addCommandStackListener(root, this);
modelElement.eAdapters().add(emfAdapter);
}
/** Unregisters the listener from the model and the command stack service. */
public final void unregister() {
modelElement.eAdapters().remove(emfAdapter);
ITopLevelElement root = persistencyService.getTopLevelElementFor(modelElement);
commandStackService.removeCommandStackListener(root, this);
notifications.clear();
}
/** {@inheritDoc} */
@Override
public void commandStackChanged(EventObject event) {
if(notifications.isEmpty()) {
return;
}
updateComplete(notifications);
notifications.clear();
}
}