diff --git a/org.fortiss.tooling.kernel.ui/META-INF/MANIFEST.MF b/org.fortiss.tooling.kernel.ui/META-INF/MANIFEST.MF index d97f766684abd4577b6729d877aaedb6da57701a..42452ac708700fc5d00ba48a053d87656216458a 100644 --- a/org.fortiss.tooling.kernel.ui/META-INF/MANIFEST.MF +++ b/org.fortiss.tooling.kernel.ui/META-INF/MANIFEST.MF @@ -23,6 +23,7 @@ Export-Package: org.fortiss.tooling.kernel.ui, org.fortiss.tooling.kernel.ui.internal.editor, org.fortiss.tooling.kernel.ui.internal.properties, org.fortiss.tooling.kernel.ui.internal.views, + org.fortiss.tooling.kernel.ui.internal.views.library, org.fortiss.tooling.kernel.ui.listener, org.fortiss.tooling.kernel.ui.presentation, org.fortiss.tooling.kernel.ui.service, diff --git a/org.fortiss.tooling.kernel.ui/plugin.xml b/org.fortiss.tooling.kernel.ui/plugin.xml index 314a127591cb64707af017c6b9a0b78b003f5221..49ada2a0098929caeaf43f51087c5eeed666d69c 100644 --- a/org.fortiss.tooling.kernel.ui/plugin.xml +++ b/org.fortiss.tooling.kernel.ui/plugin.xml @@ -54,6 +54,13 @@ name="Kernel Introspection System Service (KISS)" restorable="true"> </view> + <view + class="org.fortiss.tooling.kernel.ui.internal.views.library.LibraryViewPart" + icon="icons/library.png" + id="org.fortiss.tooling.kernel.ui.internal.views.library.LibraryViewPart" + name="Library View" + restorable="true"> + </view> </extension> <extension point="org.eclipse.core.runtime.adapters"> diff --git a/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/.ratings b/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/.ratings index e5179fafce002378ce1029a73e389de29079f4d5..4c8db7b8f82b4874d000ac500f3dfbe3033ec88e 100644 --- a/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/.ratings +++ b/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/.ratings @@ -1,3 +1,3 @@ -ESharedImages.java dd65be1d1ee807db8460064d9b970847e6303ff0 GREEN +ESharedImages.java d33fea62344c1654b5da296fb51a18098cb09eed GREEN ToolingKernelUI.java 250e5dde230272e286aa8d327fd597cf542774fe GREEN ToolingKernelUIActivator.java fc281e60592e54bd606d0b6667168afdfde8389e GREEN diff --git a/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/ESharedImages.java b/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/ESharedImages.java index dd65be1d1ee807db8460064d9b970847e6303ff0..d33fea62344c1654b5da296fb51a18098cb09eed 100644 --- a/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/ESharedImages.java +++ b/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/ESharedImages.java @@ -47,6 +47,9 @@ public enum ESharedImages { /** The navigator image. */ NAVIGATOR, + /** Library image. */ + LIBRARY, + /** Error (non-overlay) icon. */ ERROR, diff --git a/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/.ratings b/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/.ratings index 47d763c0b8c828c45fb79c3acb051e06400a72bd..bb65e43fe71feacf8e73f7fb1bd1b652bdc7564e 100644 --- a/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/.ratings +++ b/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/.ratings @@ -3,8 +3,8 @@ AllocationEditPartFactoryService.java 81bd227736013f1157ba9d0f79a9f3deefe10064 G ContextMenuService.java ca3c899293f25b70ce8e5f0d86ca2f9683329d81 GREEN EditPartFactoryService.java e9180c0020f1769d9e24ef3c08f9ca5599dbc5c3 GREEN MarkerService.java 208f97f3ccabf0947702a17ddca23d8766a268f4 GREEN -ModelEditorBindingService.java 577f5db41abf240291434dbad6bc6b0fde1eeb2b GREEN +ModelEditorBindingService.java d980691db4b700714c0669050014d08751354d5e GREEN ModelElementHandlerService.java eeb07f6926012aa98256d452d1e554a5486dc657 GREEN -NavigatorService.java 2b1361eac805996e22e5409dafff9707fbac3376 GREEN +NavigatorService.java 1d773dde3791ddf7051616fe249558e7e307757d GREEN ToolingKernelUIInternal.java a70d19883dfb315d860233156d8524cf1ac2952f GREEN TutorialUIService.java b1d632eca91b4feb583f3930cd6ee4722dd9bfed GREEN diff --git a/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/ModelEditorBindingService.java b/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/ModelEditorBindingService.java index 577f5db41abf240291434dbad6bc6b0fde1eeb2b..d980691db4b700714c0669050014d08751354d5e 100644 --- a/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/ModelEditorBindingService.java +++ b/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/ModelEditorBindingService.java @@ -28,6 +28,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import org.conqat.ide.commons.ui.ui.WorkbenchUtils; import org.eclipse.emf.common.command.CommandStackListener; import org.eclipse.emf.ecore.EObject; import org.eclipse.ui.IEditorPart; @@ -58,9 +59,9 @@ import org.fortiss.tooling.kernel.ui.extension.ModelEditorNotAvailableBinding; import org.fortiss.tooling.kernel.ui.internal.editor.ExtendableMultiPageEditor; import org.fortiss.tooling.kernel.ui.internal.editor.ModelElementEditorInput; import org.fortiss.tooling.kernel.ui.internal.introspection.items.ModelEditorBindingServiceIntrospectionDetailsItem; +import org.fortiss.tooling.kernel.ui.internal.views.library.LibraryViewPart; import org.fortiss.tooling.kernel.ui.service.IModelEditorBindingService; import org.fortiss.tooling.kernel.ui.service.IModelElementHandlerService; -import org.fortiss.tooling.kernel.ui.service.INavigatorService; /** * This class implements the {@link IModelEditorBindingService} interface. @@ -141,7 +142,12 @@ public class ModelEditorBindingService extends EObjectAwareServiceBase<IModelEdi IModelElementHandlerService.getInstance().getModelElementHandler(libElement); if(handler != null) { EObject displayedElement = handler.handleOpenModelElementRequest(libElement); - INavigatorService.getInstance().setLibraryViewActive(); + try { + WorkbenchUtils.getActiveWorkbenchPage().showView(LibraryViewPart.ID); + } catch(PartInitException e) { + error(ToolingKernelActivator.getDefault(), + "Could not open Library View with ID " + LibraryViewPart.ID, e); + } openInEditor(displayedElement); } return; diff --git a/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/NavigatorService.java b/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/NavigatorService.java index 2b1361eac805996e22e5409dafff9707fbac3376..1d773dde3791ddf7051616fe249558e7e307757d 100644 --- a/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/NavigatorService.java +++ b/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/NavigatorService.java @@ -89,7 +89,7 @@ public class NavigatorService implements INavigatorService, IPersistencyServiceL public String getIntrospectionDescription() { return getIntrospectionLabel() + "\n\nThis service manages the model element navigator view including the handling of" + - "\nsaveables, the dirty state, and the expert and library mode."; + "\nsaveables, the dirty state, and the expert mode."; } /** Initializes the service. */ @@ -362,12 +362,6 @@ public class NavigatorService implements INavigatorService, IPersistencyServiceL saveablesChanged(SaveablesLifecycleEvent.DIRTY_CHANGED, element, false); } - /** {@inheritDoc} */ - @Override - public void setLibraryViewActive() { - getNavigatorViewPart().setLibraryViewActive(); - } - /** {@inheritDoc} */ @Override public void tutorialStarted(ITutorialProvider provider) { diff --git a/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/views/.ratings b/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/views/.ratings index cde02f1cf9f9a4c2db5896be05fcf3f9706f7ca1..3eaf205055aa0f29358d52b9ec081c6466a441ba 100644 --- a/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/views/.ratings +++ b/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/views/.ratings @@ -1,6 +1,5 @@ -DoubleClick.java fd00e7737c0bad903433c0adb67dad92220ff451 GREEN +DoubleClick.java a94d27299814a93b0d8914050a5da7378a7eccd1 GREEN GenericNewMenu.java 7e0dd435cb5ca6d4b486235ec17eef3e5c7aa5f6 GREEN -LibraryView.java 44107622da7bcf431e1177e462d711646488957f GREEN LibraryViewDragSourceAdapter.java 56ef61b214ef5d6cb5b751791a92158bda0391ec GREEN LinkWithEditorPartListener.java c5ab74424378e7b158a805c4dd14fc03c8abeded GREEN MarkerViewContentProvider.java 4cb1192baebe21bca951c439c163d0c171512515 GREEN @@ -9,4 +8,4 @@ ModelElementsViewFX.java b1d03d57b67bf2c7b1d8da0ad3b16ea7d59efab5 GREEN NavigatorNewMenu.java a35e391960d1dacbe7f77982e53e1891e9382d5a GREEN NavigatorTreeContentComparator.java d9f1354cfdff78b104b28887d2397e5ca0e9755b GREEN NavigatorTreeContentProvider.java 1fbe97bebf3805cc1af190cecd784fc1cfd12306 GREEN -NavigatorViewPart.java 79872dfaab92f20e8767cff84b66dc9e173601d1 GREEN +NavigatorViewPart.java d0d93194b40a7ecd171d0f4703a784e1fdbe9346 GREEN diff --git a/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/views/DoubleClick.java b/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/views/DoubleClick.java index fd00e7737c0bad903433c0adb67dad92220ff451..a94d27299814a93b0d8914050a5da7378a7eccd1 100644 --- a/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/views/DoubleClick.java +++ b/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/views/DoubleClick.java @@ -31,7 +31,7 @@ import org.fortiss.tooling.kernel.ui.util.EObjectSelectionUtils; * * @author hoelzl */ -class DoubleClick implements IDoubleClickListener { +public class DoubleClick implements IDoubleClickListener { /** Stores the use-raw-eobject flag. */ private final boolean useRawEObject; diff --git a/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/views/LibraryView.java b/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/views/LibraryView.java deleted file mode 100644 index 44107622da7bcf431e1177e462d711646488957f..0000000000000000000000000000000000000000 --- a/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/views/LibraryView.java +++ /dev/null @@ -1,267 +0,0 @@ -/*-------------------------------------------------------------------------+ -| Copyright 2011 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.ui.internal.views; - -import static org.fortiss.tooling.kernel.utils.EcoreUtils.filterOutInstanceOf; -import static org.fortiss.tooling.kernel.utils.KernelModelElementUtils.getParentElement; - -import java.util.List; -import java.util.Set; - -import org.conqat.ide.commons.ui.jface.TreeContentProviderBase; -import org.conqat.ide.commons.ui.ui.EmptyPartListener; -import org.conqat.lib.commons.collections.IdentityHashSet; -import org.eclipse.emf.ecore.EObject; -import org.eclipse.jface.viewers.LabelProvider; -import org.eclipse.jface.viewers.TreeViewer; -import org.eclipse.jface.viewers.Viewer; -import org.eclipse.jface.viewers.ViewerFilter; -import org.eclipse.swt.SWT; -import org.eclipse.swt.dnd.Transfer; -import org.eclipse.swt.graphics.Image; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Control; -import org.eclipse.ui.IEditorPart; -import org.eclipse.ui.IWorkbenchPart; -import org.eclipse.ui.dialogs.FilteredTree; -import org.eclipse.ui.dialogs.PatternFilter; -import org.eclipse.ui.part.ViewPart; -import org.fortiss.tooling.kernel.extension.data.LibraryPrototype; -import org.fortiss.tooling.kernel.extension.data.Prototype; -import org.fortiss.tooling.kernel.extension.data.PrototypeCategory; -import org.fortiss.tooling.kernel.model.ILibraryElement; -import org.fortiss.tooling.kernel.service.IPrototypeService; -import org.fortiss.tooling.kernel.ui.extension.IModelElementHandler; -import org.fortiss.tooling.kernel.ui.extension.base.EditorBase; -import org.fortiss.tooling.kernel.ui.internal.editor.ExtendableMultiPageEditor; -import org.fortiss.tooling.kernel.ui.listener.ExtendableMultiPageEditorPageChangeListener; -import org.fortiss.tooling.kernel.ui.service.IModelElementHandlerService; - -/** - * {@link ViewPart} for the model element library view. - * - * @author hoelzl - * @author eder - */ -public class LibraryView extends ViewPart { - - /** The viewer. */ - private TreeViewer viewer; - - /** Filter text field for the tree viewer. */ - private FilteredTree filteredTree; - - /** Current active {@link ExtendableMultiPageEditor}. */ - private ExtendableMultiPageEditor activeBindingEditor = null; - - /** Stores the editor activation listener. */ - private EditorActivationListener editorActivationListener = new EditorActivationListener(); - - /** The container object used. */ - private EObject containerObject = null; - - /** The prototypes supported by the current editor. */ - private Set<Prototype> supportedBaseClasses = new IdentityHashSet<Prototype>(); - - /** Listener for reacting to changes of the embedded editor. */ - private final ExtendableMultiPageEditorPageChangeListener bindingEditorPageChangeListener = - new ExtendableMultiPageEditorPageChangeListener() { - @Override - public void pageChanged() { - updateEditorFilters(activeBindingEditor.getActiveModelEditor()); - } - }; - - /** {@inheritDoc} */ - @Override - public void createPartControl(Composite parent) { - PatternFilter patternFilter = new PatternFilter(); - patternFilter.setIncludeLeadingWildcard(true); - - filteredTree = new FilteredTree(parent, SWT.H_SCROLL | SWT.V_SCROLL, patternFilter, false); - viewer = filteredTree.getViewer(); - - viewer.setContentProvider(new LibraryTreeContentProvider()); - viewer.setLabelProvider(new LibraryLabelProvider()); - - LibraryViewDragSourceAdapter dndAdapter = new LibraryViewDragSourceAdapter(viewer); - viewer.addDragSupport(dndAdapter.getSupportedDNDOperations(), - new Transfer[] {dndAdapter.getPreferredTransfer()}, dndAdapter); - - viewer.setInput(IPrototypeService.getInstance().getAllTopLevelPrototypesCategories()); - - viewer.addFilter(new LibraryViewerFilter()); - - getViewSite().setSelectionProvider(viewer); - getSite().getWorkbenchWindow().getPartService().addPartListener(editorActivationListener); - } - - /** Switches to the given workbench editor part. */ - private void switchWorkbenchEditor(IEditorPart editor) { - if(activeBindingEditor != null) { - activeBindingEditor.removeBindingEditorListener(bindingEditorPageChangeListener); - activeBindingEditor = null; - } - - if(editor instanceof ExtendableMultiPageEditor) { - activeBindingEditor = (ExtendableMultiPageEditor)editor; - activeBindingEditor.addBindingEditorListener(bindingEditorPageChangeListener); - updateEditorFilters(activeBindingEditor.getActiveModelEditor()); - } else if(editor != null) { - updateEditorFilters(editor); - } - } - - /** Updates the filters according to the given editor. */ - @SuppressWarnings("unchecked") - private void updateEditorFilters(IEditorPart editor) { - supportedBaseClasses.clear(); - if(editor instanceof EditorBase && - ((EditorBase<? extends EObject>)editor).enableLibraryView()) { - EditorBase<? extends EObject> editorBase = (EditorBase<? extends EObject>)editor; - containerObject = editorBase.getEditedObject(); - - for(Class<? extends EObject> clazz : editorBase.getVisibleEObjectTypes()) { - List<Prototype> composablePrototypes = - IPrototypeService.getInstance().getComposablePrototypes(clazz); - if(getParentElement(containerObject, ILibraryElement.class, true) == null) { - supportedBaseClasses.addAll(composablePrototypes); - } else { - supportedBaseClasses.addAll( - filterOutInstanceOf(LibraryPrototype.class, composablePrototypes)); - } - } - } else { - containerObject = null; - } - - if(!viewer.getControl().isDisposed()) { - viewer.refresh(); - viewer.expandAll(); - } - } - - /** {@inheritDoc} */ - @Override - public void setFocus() { - viewer.getControl().setFocus(); - } - - /** The label provider used in the library view. */ - private class LibraryLabelProvider extends LabelProvider { - - /** {@inheritDoc} */ - @Override - public String getText(Object element) { - if(element instanceof Prototype) { - Prototype prototype = (Prototype)element; - return prototype.getName(); - } - if(element instanceof PrototypeCategory) { - return ((PrototypeCategory)element).getName(); - } - return super.getText(element); - } - - /** {@inheritDoc} */ - @Override - public Image getImage(Object element) { - if(element instanceof Prototype) { - // delegate to the model element handlers - EObject prototype = ((Prototype)element).getPrototype(); - IModelElementHandler<EObject> handler = - IModelElementHandlerService.getInstance().getModelElementHandler(prototype); - if(handler != null) { - return handler.getIcon(prototype); - } - } - if(element instanceof PrototypeCategory && - ((PrototypeCategory)element).getChildren().length > 0) { - return getImage(((PrototypeCategory)element).getChildren()[0]); - } - return super.getImage(element); - } - } - - /** The content provider used in the library view. */ - private class LibraryTreeContentProvider extends TreeContentProviderBase { - - /** {@inheritDoc} */ - @SuppressWarnings("rawtypes") - @Override - public Object[] getElements(Object inputElement) { - if(inputElement instanceof Object[]) { - return (Object[])inputElement; - } - if(inputElement instanceof List) { - return ((List)inputElement).toArray(); - } - return new Object[0]; - } - - /** {@inheritDoc} */ - @Override - public Object[] getChildren(Object parentElement) { - if(parentElement instanceof PrototypeCategory) { - return ((PrototypeCategory)parentElement).getChildren(); - } - return new Object[0]; - } - } - - /** The filter used in the library view. */ - private class LibraryViewerFilter extends ViewerFilter { - - /** {@inheritDoc} */ - @Override - public boolean select(Viewer viewer, Object parentElement, Object element) { - if(containerObject == null || supportedBaseClasses.isEmpty()) { - return false; - } - if(element instanceof PrototypeCategory) { - PrototypeCategory pc = (PrototypeCategory)element; - for(Object child : pc.getChildren()) { - if(select(viewer, pc, child)) { - return true; - } - } - return false; - } - return supportedBaseClasses.contains(element); - } - } - - /** If an editor in a different Project is opened the Model is reinitialized */ - private class EditorActivationListener extends EmptyPartListener { - - /** Change the tree viewer content whenever workbench part changes. */ - @Override - public void partActivated(IWorkbenchPart workbenchPart) { - if(!(workbenchPart instanceof IEditorPart)) { - return; - } - - Control control = viewer.getControl(); - if(control == null || control.isDisposed()) { - return; - } - - IEditorPart part = (IEditorPart)workbenchPart; - viewer.setInput(IPrototypeService.getInstance().getAllTopLevelPrototypesCategories()); - switchWorkbenchEditor(part); - } - } -} diff --git a/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/views/NavigatorViewPart.java b/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/views/NavigatorViewPart.java index 79872dfaab92f20e8767cff84b66dc9e173601d1..d0d93194b40a7ecd171d0f4703a784e1fdbe9346 100644 --- a/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/views/NavigatorViewPart.java +++ b/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/views/NavigatorViewPart.java @@ -99,9 +99,6 @@ public final class NavigatorViewPart extends ViewPart implements ISelectionListe /** Toggle expert view filter action. */ private Action toggleExpertViewAction = null; - /** Change to library/non-library view action. */ - private Action toggleLibraryViewAction = null; - /** Dialog setting ID for the link with editor action flag. */ private static final String LINK_WITH_EDITOR_FLAG = "navigatorSettingLinkWithEditor"; @@ -226,19 +223,6 @@ public final class NavigatorViewPart extends ViewPart implements ISelectionListe linkWithEditorAction.setToolTipText("Link with editor"); linkWithEditorAction.setChecked(settings.getBoolean(LINK_WITH_EDITOR_FLAG)); - toggleLibraryViewAction = new Action("Toggle library view", SWT.TOGGLE) { - - @Override - public void run() { - ((NavigatorTreeContentProvider)viewer.getContentProvider()).toggleLibraryView(); - viewer.refresh(); - } - }; - - toggleLibraryViewAction.setImageDescriptor( - ToolingKernelUIActivator.getImageDescriptor("icons/library.png")); - toggleLibraryViewAction.setToolTipText("Toggle library view"); - toggleExpertViewAction = new Action("Toggle expert view", SWT.TOGGLE) { @Override @@ -259,7 +243,6 @@ public final class NavigatorViewPart extends ViewPart implements ISelectionListe toolBarManager.insertAfter("additions", toggleExpertViewAction); toolBarManager.insertAfter("additions", linkWithEditorAction); - toolBarManager.insertAfter("additions", toggleLibraryViewAction); } /** Creates the context menu. */ @@ -418,17 +401,6 @@ public final class NavigatorViewPart extends ViewPart implements ISelectionListe return INavigatorService.getInstance().isExpertViewActive(); } - /** Sets the library view to be active. */ - public void setLibraryViewActive() { - NavigatorTreeContentProvider contentProvider = - (NavigatorTreeContentProvider)viewer.getContentProvider(); - if(!contentProvider.isLibraryViewActive()) { - contentProvider.toggleLibraryView(); - viewer.refresh(); - toggleLibraryViewAction.setChecked(true); - } - } - /** Refreshes the viewer and reveals the given element. */ public void refreshAndReveal(Object element) { elementToBeRevealed = element; diff --git a/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/views/library/.ratings b/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/views/library/.ratings new file mode 100644 index 0000000000000000000000000000000000000000..02b479be9ed32b2728183f01b47e3c56d076b47d --- /dev/null +++ b/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/views/library/.ratings @@ -0,0 +1,2 @@ +LibraryTreeContentProvider.java dadf37cf8e54da481aac354d2c1b1360a018ea31 GREEN +LibraryViewPart.java ec13bcdbe0c577bb4594be3b93c4b5ba16a003cc GREEN diff --git a/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/views/library/LibraryTreeContentProvider.java b/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/views/library/LibraryTreeContentProvider.java new file mode 100644 index 0000000000000000000000000000000000000000..dadf37cf8e54da481aac354d2c1b1360a018ea31 --- /dev/null +++ b/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/views/library/LibraryTreeContentProvider.java @@ -0,0 +1,88 @@ +/*-------------------------------------------------------------------------+ +| Copyright 2011 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.ui.internal.views.library; + +import java.util.ArrayList; +import java.util.LinkedList; +import java.util.List; + +import org.conqat.ide.commons.ui.jface.TreeContentProviderBase; +import org.eclipse.emf.ecore.EObject; +import org.fortiss.tooling.kernel.extension.data.ITopLevelElement; +import org.fortiss.tooling.kernel.model.ILibrary; +import org.fortiss.tooling.kernel.model.ILibraryElementReference; +import org.fortiss.tooling.kernel.service.IPersistencyService; +import org.fortiss.tooling.kernel.ui.extension.IModelElementHandler; +import org.fortiss.tooling.kernel.ui.internal.views.NavigatorTreeContentProvider; +import org.fortiss.tooling.kernel.ui.service.IModelElementHandlerService; + +/** + * Content provider for the library tree viewer. Reduced form of the + * {@link NavigatorTreeContentProvider}. + * + * @author eder + */ +public class LibraryTreeContentProvider extends TreeContentProviderBase { + + /** {@inheritDoc} */ + @Override + public Object[] getElements(Object inputElement) { + // delegate to the top-level element contexts of the persistency service + List<Object> result = new LinkedList<Object>(); + for(ITopLevelElement context : IPersistencyService.getInstance().getTopLevelElements()) { + EObject root = context.getRootModelElement(); + if(root instanceof ILibrary) { + result.add(root); + } + } + return result.toArray(); + } + + /** {@inheritDoc} */ + @Override + public Object[] getChildren(Object parent) { + // delegate to the model element handlers + if(parent instanceof EObject) { + EObject parentElement = (EObject)parent; + if(parentElement instanceof ILibraryElementReference) { + return new Object[0]; + } + IModelElementHandler<EObject> handler = + IModelElementHandlerService.getInstance().getModelElementHandler(parentElement); + if(handler != null) { + List<EObject> children = new ArrayList<EObject>(); + children.addAll(handler.getSubnodes(parentElement)); + children.addAll(handler.getSpecifications(parentElement)); + return children.toArray(); + } + } + return new Object[0]; + } + + /** {@inheritDoc} */ + @Override + public Object getParent(Object element) { + if(element instanceof EObject) { + EObject me = (EObject)element; + if(IPersistencyService.getInstance().isTopLevelElement(me)) { + // delegate to persistency service + return IPersistencyService.getInstance(); + } + return me.eContainer(); + } + return null; + } +} diff --git a/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/views/library/LibraryViewPart.java b/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/views/library/LibraryViewPart.java new file mode 100644 index 0000000000000000000000000000000000000000..ec13bcdbe0c577bb4594be3b93c4b5ba16a003cc --- /dev/null +++ b/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/views/library/LibraryViewPart.java @@ -0,0 +1,321 @@ +/*-------------------------------------------------------------------------+ +| Copyright 2011 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.ui.internal.views.library; + +import static org.fortiss.tooling.kernel.ui.util.EObjectSelectionUtils.getEObjectElements; +import static org.fortiss.tooling.kernel.ui.util.EObjectSelectionUtils.getFirstElement; +import static org.fortiss.tooling.kernel.ui.util.EObjectSelectionUtils.getSelectionService; + +import java.util.List; + +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.Status; +import org.eclipse.emf.ecore.EObject; +import org.eclipse.jface.action.MenuManager; +import org.eclipse.jface.viewers.DecoratingLabelProvider; +import org.eclipse.jface.viewers.ISelection; +import org.eclipse.jface.viewers.ISelectionChangedListener; +import org.eclipse.jface.viewers.SelectionChangedEvent; +import org.eclipse.jface.viewers.StructuredSelection; +import org.eclipse.jface.viewers.TreePath; +import org.eclipse.jface.viewers.TreeSelection; +import org.eclipse.jface.viewers.TreeViewer; +import org.eclipse.swt.SWT; +import org.eclipse.swt.graphics.Image; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Menu; +import org.eclipse.ui.IDecoratorManager; +import org.eclipse.ui.ISaveablePart; +import org.eclipse.ui.ISaveablesSource; +import org.eclipse.ui.ISelectionListener; +import org.eclipse.ui.IWorkbenchPart; +import org.eclipse.ui.IWorkbenchPartConstants; +import org.eclipse.ui.PlatformUI; +import org.eclipse.ui.Saveable; +import org.eclipse.ui.part.ViewPart; +import org.eclipse.ui.progress.UIJob; +import org.eclipse.ui.views.properties.IPropertySheetPage; +import org.eclipse.ui.views.properties.tabbed.ITabbedPropertySheetPageContributor; +import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage; +import org.fortiss.tooling.kernel.service.IPersistencyService; +import org.fortiss.tooling.kernel.ui.ESharedImages; +import org.fortiss.tooling.kernel.ui.extension.data.ContextMenuContextProvider; +import org.fortiss.tooling.kernel.ui.internal.NavigatorService; +import org.fortiss.tooling.kernel.ui.internal.views.DoubleClick; +import org.fortiss.tooling.kernel.ui.internal.views.NavigatorTreeContentComparator; +import org.fortiss.tooling.kernel.ui.internal.views.NavigatorViewPart; +import org.fortiss.tooling.kernel.ui.presentation.TutorialDefinitionModelElementLabelProvider; +import org.fortiss.tooling.kernel.ui.service.IActionService; +import org.fortiss.tooling.kernel.ui.service.IContextMenuService; +import org.fortiss.tooling.kernel.ui.service.INavigatorService; +import org.fortiss.tooling.kernel.ui.util.PropertiesConstantUtils; +import org.fortiss.tooling.kernel.ui.util.SelectionUtils; + +/** + * {@link ViewPart} for the library view. Basically, a reduced form of the + * {@link NavigatorViewPart}. + * + * @author hoelzl + * @author eder + */ +public final class LibraryViewPart extends ViewPart implements ISelectionListener, + ISelectionChangedListener, ITabbedPropertySheetPageContributor, ContextMenuContextProvider, + ISaveablesSource, ISaveablePart { + + /** The ID of this view. */ + public static final String ID = LibraryViewPart.class.getName(); + + /** Stores the TreeViewer. */ + private TreeViewer viewer; + + /** Stores the menu manager. */ + private MenuManager menuManager; + + /** Element used to ensure that the selection of the {@link LibraryViewPart} is not empty. */ + private EObject backupElementToBeSelected; + + /** Element to be revealed during the UI update. */ + private Object elementToBeRevealed = null; + + /** Stores the UI update job. */ + private final UIJob updateUI = new UIJob("Update Library View") { + @Override + public IStatus runInUIThread(IProgressMonitor monitor) { + if(viewer.getControl().isDisposed()) { + return Status.OK_STATUS; + } + IActionService.getInstance().refresh(); + viewer.refresh(); + + LibraryViewPart.this.refreshPartTitleAndImage(); + + // Ensure that the selection of the {@link NavigatorViewPart} is not empty. Otherwise + // undo/redo (and also other global commands) is not enabled when model elements are + // added directly using the context menu of the model navigator. + ISelection selection = viewer.getSelection(); + if(selection instanceof TreeSelection && !selection.isEmpty()) { + Object firstSelectedElement = ((TreeSelection)selection).getFirstElement(); + if(firstSelectedElement instanceof EObject) { + // Preserve container of current element. This is required to determine a valid + // model element in case the next operation is to delete the currently selected + // element + backupElementToBeSelected = ((EObject)firstSelectedElement).eContainer(); + } + } else if(backupElementToBeSelected != null) { + // Selection would be empty. Use backup element to force selection to the container + // of the element that has been selected last. + TreePath treePath = new TreePath(new Object[] {backupElementToBeSelected}); + viewer.setSelection(new TreeSelection(treePath)); + backupElementToBeSelected = null; + } + + if(elementToBeRevealed != null) { + revealModelElement(elementToBeRevealed); + elementToBeRevealed = null; + } + + firePropertyChange(IWorkbenchPartConstants.PROP_DIRTY); + return Status.OK_STATUS; + } + }; + + /** {@inheritDoc} */ + @Override + public void createPartControl(Composite parent) { + viewer = new TreeViewer(parent, SWT.MULTI); + + // NOTE that the order of this is important. See also JDT package + // explorer. + IDecoratorManager decoratorManager = PlatformUI.getWorkbench().getDecoratorManager(); + viewer.setLabelProvider( + new DecoratingLabelProvider(new TutorialDefinitionModelElementLabelProvider(), + decoratorManager.getLabelDecorator())); + viewer.setContentProvider(new LibraryTreeContentProvider()); + viewer.setComparator(new NavigatorTreeContentComparator()); + + getSite().setSelectionProvider(viewer); + createContextMenu(); + viewer.addSelectionChangedListener(this); + + viewer.setInput(IPersistencyService.getInstance()); + + viewer.addDoubleClickListener(new DoubleClick()); + + IActionService.getInstance().registerGlobalActions(getViewSite().getActionBars()); + + getSelectionService().addSelectionListener(this); + + refreshPartTitleAndImage(); + } + + /** Creates the context menu. */ + private void createContextMenu() { + menuManager = IContextMenuService.getInstance().createDefaultContextMenu(this); + + Menu contextMenu = menuManager.createContextMenu(viewer.getControl()); + viewer.getControl().setMenu(contextMenu); + + getSite().registerContextMenu(menuManager, viewer); + } + + /** {@inheritDoc} */ + @Override + public void setFocus() { + viewer.getControl().setFocus(); + viewer.refresh(); + } + + /** Reveals the given element in the navigator view. */ + public void revealModelElement(Object element) { + if(element == null) { + return; + } + if(!viewer.getExpandedState(element)) { + viewer.expandToLevel(element, 2); + } + viewer.setSelection(new StructuredSelection(element), true); + } + + /** {@inheritDoc} */ + @Override + public void selectionChanged(IWorkbenchPart part, ISelection selection) { + IActionService.getInstance().refresh(); + // do not fire property change here, since it was not the viewers + // selection that changed but the workbench-wide selection + } + + /** {@inheritDoc} */ + @Override + public void selectionChanged(SelectionChangedEvent event) { + // Ignore programmatic selection of backup model element + if(backupElementToBeSelected != null) { + return; + } + + IActionService.getInstance().refresh(); + // Sync selection of active editor with model navigator + SelectionUtils.setSelection(getSelectedModelElementList(), false, true); + + // fire upon viewer selection change + firePropertyChange(IWorkbenchPartConstants.PROP_DIRTY); + } + + /** {@inheritDoc} */ + @Override + public void dispose() { + ((NavigatorService)INavigatorService.getInstance()).setNavigatorViewPart(null); + + getSelectionService().removeSelectionListener(this); + getSite().setSelectionProvider(null); + + super.dispose(); + } + + /** {@inheritDoc} */ + @Override + public String getContributorId() { + return PropertiesConstantUtils.TABBED_PROPERTY_CONTRIBUTOR_ID; + } + + /** {@inheritDoc} */ + @SuppressWarnings("unchecked") + @Override + public <S> S getAdapter(Class<S> adapter) { + if(adapter == IPropertySheetPage.class) { + return (S)new TabbedPropertySheetPage(this); + } + return super.getAdapter(adapter); + } + + /** Refreshes the navigator view. */ + public void refresh() { + updateUI.schedule(); + } + + /** Refreshes the part's header image and title. */ + private void refreshPartTitleAndImage() { + String partName = "Library"; + Image partImage = ESharedImages.LIBRARY.getImage(); + setPartName(partName); + setTitleImage(partImage); + } + + /** {@inheritDoc} */ + @Override + public Saveable[] getSaveables() { + return INavigatorService.getInstance().getSaveables(); + } + + /** {@inheritDoc} */ + @Override + public Saveable[] getActiveSaveables() { + return INavigatorService.getInstance().getActiveSaveables(); + } + + /** {@inheritDoc} */ + @Override + public void doSave(IProgressMonitor monitor) { + // ignore. SaveableSource is used instead. + } + + /** {@inheritDoc} */ + @Override + public void doSaveAs() { + // ignore + } + + /** {@inheritDoc} */ + @Override + public boolean isDirty() { + return IPersistencyService.getInstance().isDirty(); + } + + /** {@inheritDoc} */ + @Override + public boolean isSaveAsAllowed() { + return false; + } + + /** {@inheritDoc} */ + @Override + public boolean isSaveOnCloseNeeded() { + return isDirty(); + } + + /** {@inheritDoc} */ + @Override + public EObject getSelectedModelElement() { + return getFirstElement(getSite().getSelectionProvider().getSelection()); + } + + /** {@inheritDoc} */ + @Override + public List<EObject> getSelectedModelElementList() { + return getEObjectElements(getSite().getSelectionProvider().getSelection()); + } + + /** Returns whether expert view is active. */ + public boolean isExpertViewActive() { + return INavigatorService.getInstance().isExpertViewActive(); + } + + /** Refreshes the viewer and reveals the given element. */ + public void refreshAndReveal(Object element) { + elementToBeRevealed = element; + refresh(); + } +} diff --git a/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/service/.ratings b/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/service/.ratings index 1ded5ea76b623771ecae670bf1ee96d08ee6e421..c551f593428eb93077d2566f0329de729970a97a 100644 --- a/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/service/.ratings +++ b/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/service/.ratings @@ -5,5 +5,5 @@ IEditPartFactoryService.java c448bff63fb81f57037c9f1dc5319859c12d0c4d GREEN IMarkerService.java d433e838e387dd2fe61b8dea7395ebb7203ae39b GREEN IModelEditorBindingService.java ce2ae1957e2232bb0fac1d1d262103f9adfc5266 GREEN IModelElementHandlerService.java 748ffd22d6836a5599f8785f023469eb58c80ece GREEN -INavigatorService.java 8d2ffeb6f075d3abea904b84d8a40090d97837fd GREEN +INavigatorService.java 8fc66f7e554cfb547f2ce65dec9f48ac0559c54e GREEN ITutorialUIService.java 72707c60c3d23d8ffc5c579cb9b022bb614eb094 GREEN diff --git a/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/service/INavigatorService.java b/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/service/INavigatorService.java index 8d2ffeb6f075d3abea904b84d8a40090d97837fd..8fc66f7e554cfb547f2ce65dec9f48ac0559c54e 100644 --- a/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/service/INavigatorService.java +++ b/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/service/INavigatorService.java @@ -73,7 +73,4 @@ public interface INavigatorService { /** Refreshes the navigator view part. */ void refresh(); - - /** Sets the library view active. */ - void setLibraryViewActive(); }