Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
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.java123
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());
}
}

Back to the top