diff options
Diffstat (limited to 'plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/internal/ui/editor/CDOEditor.java')
-rw-r--r-- | plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/internal/ui/editor/CDOEditor.java | 123 |
1 files changed, 86 insertions, 37 deletions
diff --git a/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/internal/ui/editor/CDOEditor.java b/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/internal/ui/editor/CDOEditor.java index 9f851b89dd..b71b8a8569 100644 --- a/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/internal/ui/editor/CDOEditor.java +++ b/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/internal/ui/editor/CDOEditor.java @@ -12,14 +12,15 @@ package org.eclipse.emf.cdo.internal.ui.editor; import org.eclipse.emf.cdo.CDOObject; -import org.eclipse.emf.cdo.common.model.CDOClass; -import org.eclipse.emf.cdo.common.model.CDOPackage; +import org.eclipse.emf.cdo.common.model.CDOPackageInfo; +import org.eclipse.emf.cdo.common.model.CDOPackageRegistry; +import org.eclipse.emf.cdo.common.model.CDOPackageUnit; +import org.eclipse.emf.cdo.common.model.EMFUtil; import org.eclipse.emf.cdo.eresource.CDOResource; import org.eclipse.emf.cdo.internal.ui.SharedIcons; import org.eclipse.emf.cdo.internal.ui.bundle.OM; import org.eclipse.emf.cdo.internal.ui.dialogs.BulkAddDialog; import org.eclipse.emf.cdo.internal.ui.dialogs.RollbackTransactionDialog; -import org.eclipse.emf.cdo.session.CDOSessionPackageManager; import org.eclipse.emf.cdo.transaction.CDOTransaction; import org.eclipse.emf.cdo.ui.CDOEditorInput; import org.eclipse.emf.cdo.ui.CDOEventHandler; @@ -50,7 +51,10 @@ import org.eclipse.emf.common.util.BasicDiagnostic; import org.eclipse.emf.common.util.Diagnostic; import org.eclipse.emf.common.util.EList; import org.eclipse.emf.common.util.URI; +import org.eclipse.emf.ecore.EClass; +import org.eclipse.emf.ecore.EClassifier; import org.eclipse.emf.ecore.EObject; +import org.eclipse.emf.ecore.EPackage; import org.eclipse.emf.ecore.EReference; import org.eclipse.emf.ecore.EValidator; import org.eclipse.emf.ecore.resource.Resource; @@ -77,7 +81,6 @@ import org.eclipse.emf.edit.ui.util.EditUIMarkerHelper; import org.eclipse.emf.edit.ui.util.EditUIUtil; import org.eclipse.emf.edit.ui.view.ExtendedPropertySheetPage; import org.eclipse.emf.spi.cdo.InternalCDOObject; -import org.eclipse.emf.spi.cdo.InternalCDOTransaction; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IMarker; @@ -91,6 +94,8 @@ import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.SubProgressMonitor; +import org.eclipse.jface.action.Action; +import org.eclipse.jface.action.IContributionItem; import org.eclipse.jface.action.IMenuListener; import org.eclipse.jface.action.IMenuManager; import org.eclipse.jface.action.IStatusLineManager; @@ -100,6 +105,7 @@ import org.eclipse.jface.action.Separator; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.dialogs.ProgressMonitorDialog; import org.eclipse.jface.operation.IRunnableWithProgress; +import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.jface.viewers.DecoratingLabelProvider; import org.eclipse.jface.viewers.IContentProvider; import org.eclipse.jface.viewers.ILabelDecorator; @@ -152,9 +158,9 @@ import java.io.IOException; import java.io.InputStream; import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; -import java.util.Arrays; import java.util.Collection; import java.util.Collections; +import java.util.Comparator; import java.util.EventObject; import java.util.HashMap; import java.util.Iterator; @@ -2075,45 +2081,88 @@ public class CDOEditor extends MultiPageEditorPart implements IEditingDomainProv protected boolean populateNewRoot(MenuManager menuManager) { boolean populated = false; - CDOSessionPackageManager packageManager = view.getSession().getPackageManager(); - List<CDOPackage> cdoPackages = Arrays.asList(packageManager.getPackages()); - Collections.sort(cdoPackages); + CDOPackageRegistry packageRegistry = view.getSession().getPackageRegistry(); + for (Map.Entry<String, Object> entry : EMFUtil.getSortedRegistryEntries(packageRegistry)) + { + IContributionItem item = populateSubMenu(entry.getKey(), entry.getValue(), packageRegistry); + if (item != null) + { + menuManager.add(item); + populated = true; + } + } + + return populated; + } - for (CDOPackage cdoPackage : cdoPackages) + private IContributionItem populateSubMenu(String nsURI, Object value, final CDOPackageRegistry packageRegistry) + { + ImageDescriptor imageDescriptor = SharedIcons.getDescriptor(SharedIcons.OBJ_EPACKAGE); + final MenuManager submenuManager = new MenuManager(nsURI, imageDescriptor, nsURI); + if (value instanceof EPackage) { - if (!cdoPackage.isSystem()) + EPackage ePackage = (EPackage)value; + CDOPackageInfo packageInfo = packageRegistry.getPackageInfo(ePackage); + CDOPackageUnit packageUnit = packageInfo.getPackageUnit(); + if (packageUnit.isSystem()) { - try - { - packageManager.convert(cdoPackage); - } - catch (Exception ex) - { - continue; - } + return null; + } - List<CDOClass> cdoClasses = Arrays.asList(cdoPackage.getConcreteClasses()); - Collections.sort(cdoClasses); - // TODO Sorting by class name may not have the desired effect if the labels are computed by an ItemProvider! + populateSubMenu(ePackage, submenuManager); + } + else + { + submenuManager.add(new Action("Calculating...") + { + }); - if (!cdoClasses.isEmpty()) + submenuManager.addMenuListener(new IMenuListener() + { + public void menuAboutToShow(IMenuManager manager) { - MenuManager submenuManager = new MenuManager(cdoPackage.getPackageURI()); + String nsURI = submenuManager.getMenuText(); + EPackage ePackage = packageRegistry.getEPackage(nsURI); + submenuManager.removeAll(); + populateSubMenu(ePackage, submenuManager); + } + }); + } - for (CDOClass cdoClass : cdoClasses) - { - // TODO Optimize/cache this? - CreateRootAction action = new CreateRootAction(cdoClass); - submenuManager.add(action); - populated = true; - } + return submenuManager; + } - menuManager.add(submenuManager); + private void populateSubMenu(EPackage ePackage, final MenuManager submenuManager) + { + List<EClass> eClasses = new ArrayList<EClass>(); + for (EClassifier eClassifier : ePackage.getEClassifiers()) + { + if (eClassifier instanceof EClass) + { + EClass eClass = (EClass)eClassifier; + if (!eClass.isAbstract() && !eClass.isInterface()) + { + eClasses.add(eClass); } } } - return populated; + if (!eClasses.isEmpty()) + { + Collections.sort(eClasses, new Comparator<EClass>() + { + public int compare(EClass o1, EClass o2) + { + return o1.getName().compareTo(o2.getName()); + } + }); + + for (EClass eClass : eClasses) + { + CreateRootAction action = new CreateRootAction(eClass); + submenuManager.add(action); + } + } } /** @@ -2345,12 +2394,12 @@ public class CDOEditor extends MultiPageEditorPart implements IEditingDomainProv */ private final class CreateRootAction extends LongRunningAction { - private CDOClass cdoClass; + private EClass eClass; - private CreateRootAction(CDOClass cdoClass) + private CreateRootAction(EClass eClass) { - super(getEditorSite().getPage(), cdoClass.getName(), SharedIcons.getDescriptor(SharedIcons.OBJ_ECLASS)); - this.cdoClass = cdoClass; + super(getEditorSite().getPage(), eClass.getName(), SharedIcons.getDescriptor(SharedIcons.OBJ_ECLASS)); + this.eClass = eClass; } @Override @@ -2380,7 +2429,7 @@ public class CDOEditor extends MultiPageEditorPart implements IEditingDomainProv if (resource != null) { - InternalCDOObject object = (InternalCDOObject)((InternalCDOTransaction)view).newInstance(cdoClass); + InternalCDOObject object = (InternalCDOObject)EcoreUtil.create(eClass); resource.getContents().add(object.cdoInternalInstance()); } } |