/*
* ====================================================================
*
* The ObjectStyle Group Software License, Version 1.0
*
* Copyright (c) 2006 The ObjectStyle Group and individual authors of the
* software. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* 3. The end-user documentation included with the redistribution, if any, must
* include the following acknowlegement: "This product includes software
* developed by the ObjectStyle Group (http://objectstyle.org/)." Alternately,
* this acknowlegement may appear in the software itself, if and wherever such
* third-party acknowlegements normally appear.
*
* 4. The names "ObjectStyle Group" and "Cayenne" must not be used to endorse or
* promote products derived from this software without prior written permission.
* For written permission, please contact andrus@objectstyle.org.
*
* 5. Products derived from this software may not be called "ObjectStyle" nor
* may "ObjectStyle" appear in their names without prior written permission of
* the ObjectStyle Group.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* OBJECTSTYLE GROUP OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many individuals on
* behalf of the ObjectStyle Group. For more information on the ObjectStyle
* Group, please see <http://objectstyle.org/>.
*
*/
package org.objectstyle.wolips.eomodeler.editors;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.io.File;
import java.net.URI;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;
import org.eclipse.core.commands.operations.IUndoContext;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IMarker;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IResourceChangeEvent;
import org.eclipse.core.resources.IResourceChangeListener;
import org.eclipse.core.resources.IStorage;
import org.eclipse.core.resources.IWorkspace;
import org.eclipse.core.resources.IWorkspaceRunnable;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.ListenerList;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.jface.dialogs.ErrorDialog;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.ISelectionProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IEditorReference;
import org.eclipse.ui.IEditorSite;
import org.eclipse.ui.IStorageEditorInput;
import org.eclipse.ui.IURIEditorInput;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.WorkbenchException;
import org.eclipse.ui.part.MultiPageEditorPart;
import org.eclipse.ui.views.contentoutline.IContentOutlinePage;
import org.eclipse.ui.views.properties.IPropertySheetPage;
import org.eclipse.ui.views.properties.PropertySheet;
import org.eclipse.ui.views.properties.tabbed.ITabbedPropertySheetPageContributor;
import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;
import org.objectstyle.wolips.baseforplugins.util.ComparisonUtils;
import org.objectstyle.wolips.baseforplugins.util.URLUtils;
import org.objectstyle.wolips.baseforuiplugins.utils.ErrorUtils;
import org.objectstyle.wolips.eomodeler.Activator;
import org.objectstyle.wolips.eomodeler.EOModelerPerspectiveFactory;
import org.objectstyle.wolips.eomodeler.Messages;
import org.objectstyle.wolips.eomodeler.core.model.AbstractEOAttributePath;
import org.objectstyle.wolips.eomodeler.core.model.EOArgument;
import org.objectstyle.wolips.eomodeler.core.model.EOAttribute;
import org.objectstyle.wolips.eomodeler.core.model.EODatabaseConfig;
import org.objectstyle.wolips.eomodeler.core.model.EOEntity;
import org.objectstyle.wolips.eomodeler.core.model.EOEntityIndex;
import org.objectstyle.wolips.eomodeler.core.model.EOFetchSpecification;
import org.objectstyle.wolips.eomodeler.core.model.EOLastModified;
import org.objectstyle.wolips.eomodeler.core.model.EOModel;
import org.objectstyle.wolips.eomodeler.core.model.EOModelGroup;
import org.objectstyle.wolips.eomodeler.core.model.EOModelVerificationFailure;
import org.objectstyle.wolips.eomodeler.core.model.EORelationship;
import org.objectstyle.wolips.eomodeler.core.model.EORelationshipOptionalityMismatchFailure;
import org.objectstyle.wolips.eomodeler.core.model.EOStoredProcedure;
import org.objectstyle.wolips.eomodeler.core.model.IEOAttribute;
import org.objectstyle.wolips.eomodeler.core.model.IEOModelGroupFactory;
import org.objectstyle.wolips.eomodeler.core.utils.EOModelUtils;
import org.objectstyle.wolips.eomodeler.editors.arguments.EOArgumentsTableEditor;
import org.objectstyle.wolips.eomodeler.editors.entities.EOEntitiesTableEditor;
import org.objectstyle.wolips.eomodeler.editors.entity.EOEntityEditor;
import org.objectstyle.wolips.eomodeler.outline.EOModelContentOutlinePage;
import org.objectstyle.wolips.eomodeler.preferences.PreferenceConstants;
import org.objectstyle.wolips.eomodeler.utils.AbstractAddRemoveChangeRefresher;
import org.objectstyle.wolips.eomodeler.utils.EclipseFileUtils;
public class EOModelEditor extends MultiPageEditorPart implements IResourceChangeListener, ITabbedPropertySheetPageContributor, ISelectionProvider, IEOModelEditor {
protected class ArgumentDeletedRefresher extends AbstractAddRemoveChangeRefresher<EOArgument> {
public ArgumentDeletedRefresher() {
super("ArgumentDeleted");
}
public void changeSelection(final ISelection selection) {
EOModelEditor.this.setSelection(selection);
}
@Override
protected void objectsAdded(final List<EOArgument> _addedObjects) {
// DO NOTHING
}
@Override
protected void objectsRemoved(final List<EOArgument> _removedObjects) {
EOModelEditor.this.setSelection(new StructuredSelection(EOModelEditor.this.getSelectedStoredProcedure()));
EOModelEditor.this.setActivePage(getPageNum(EOModelEditor.EOSTOREDPROCEDURE_PAGE));
}
}
protected class AttributeAndRelationshipDeletedRefresher extends AbstractAddRemoveChangeRefresher<IEOAttribute> {
public AttributeAndRelationshipDeletedRefresher() {
super("AttributeAndRelationshipDeleted");
}
public void changeSelection(final ISelection selection) {
EOModelEditor.this.setSelection(selection);
}
@Override
protected void objectsAdded(final List<IEOAttribute> _addedObjects) {
// DO NOTHING
}
@Override
protected void objectsRemoved(final List<IEOAttribute> _removedObjects) {
EOModelEditor.this.setSelection(new StructuredSelection(EOModelEditor.this.getSelectedEntity()));
EOModelEditor.this.setActivePage(getPageNum(EOModelEditor.EOENTITY_PAGE));
}
}
protected class DatabaseConfigsChangeRefresher extends AbstractAddRemoveChangeRefresher<EODatabaseConfig> {
public DatabaseConfigsChangeRefresher() {
super("DatabaseConfigsChange");
}
public void changeSelection(final ISelection selection) {
EOModelEditor.this.setSelection(selection);
}
@Override
protected void objectsAdded(final List<EODatabaseConfig> _addedObjects) {
// DO NOTHING
}
@Override
protected void objectsRemoved(final List<EODatabaseConfig> _removedObjects) {
EOModelEditor.this.setSelection(new StructuredSelection(EOModelEditor.this.getModel()));
EOModelEditor.this.setActivePage(getPageNum(EOModelEditor.EOMODEL_PAGE));
}
}
protected class DirtyModelListener implements PropertyChangeListener {
public void propertyChange(final PropertyChangeEvent _event) {
String propertyName = _event.getPropertyName();
if (EOModel.DIRTY.equals(propertyName)) {
EOModelEditor.this.editorDirtyStateChanged();
}
}
}
protected class EntitiesChangeRefresher extends AbstractAddRemoveChangeRefresher<EOEntity> {
public EntitiesChangeRefresher() {
super("EntitiesChange");
}
public void changeSelection(final ISelection selection) {
EOModelEditor.this.setSelection(selection);
EOModelEditor.this.setActivePage(getPageNum(EOModelEditor.EOENTITY_PAGE));
}
@Override
protected void objectsAdded(final List<EOEntity> _addedObjects) {
// DO NOTHING
}
@Override
protected void objectsRemoved(final List<EOEntity> _removedObjects) {
EOModelEditor.this.setSelection(new StructuredSelection(EOModelEditor.this.getModel()));
EOModelEditor.this.setActivePage(getPageNum(EOModelEditor.EOMODEL_PAGE));
}
}
protected class EntityIndexesChangeRefresher extends AbstractAddRemoveChangeRefresher<EOEntityIndex> {
public EntityIndexesChangeRefresher() {
super("EntityIndexesChange");
}
public void changeSelection(final ISelection selection) {
EOModelEditor.this.setSelection(selection);
EOModelEditor.this.setActivePage(getPageNum(EOModelEditor.EOENTITY_PAGE));
}
@Override
protected void objectsAdded(final List<EOEntityIndex> _addedObjects) {
// DO NOTHING
}
@Override
protected void objectsRemoved(final List<EOEntityIndex> _removedObjects) {
EOModelEditor.this.setSelection(new StructuredSelection(EOModelEditor.this.getModel()));
EOModelEditor.this.setActivePage(getPageNum(EOModelEditor.EOMODEL_PAGE));
}
}
protected class EOArgumentSelectionChangedListener implements ISelectionChangedListener {
public void selectionChanged(final SelectionChangedEvent _event) {
IStructuredSelection selection = (IStructuredSelection) _event.getSelection();
setSelection(selection);
}
}
protected class EOEntitySelectionChangedListener implements ISelectionChangedListener {
public void selectionChanged(final SelectionChangedEvent _event) {
IStructuredSelection selection = (IStructuredSelection) _event.getSelection();
setSelection(selection);
}
}
protected class EOModelContentSelectionChangedListener implements ISelectionChangedListener {
private Object mySelectedObject;
public void selectionChanged(final SelectionChangedEvent _event) {
IStructuredSelection selection = (IStructuredSelection) _event.getSelection();
Object selectedObject = selection.getFirstElement();
setSelection(selection, false);
if (myContentOutlinePage.isSelectedWithOutline()) {
EOModelEditor.this.doubleClickedObjectInOutline(selectedObject);
} else {
if (mySelectedObject == null) {
mySelectedObject = selectedObject;
} else if (mySelectedObject == selectedObject) {
EOModelEditor.this.doubleClickedObjectInOutline(selectedObject);
mySelectedObject = null;
} else {
mySelectedObject = selectedObject;
}
}
}
}
protected class EOModelEditorUndoContext implements IUndoContext {
public String getLabel() {
return EOModelUtils.getUndoContext(EOModelEditor.this.getModel()).getLabel();
}
public boolean matches(final IUndoContext context) {
return EOModelUtils.getUndoContext(EOModelEditor.this.getModel()).matches(context);
}
}
protected class EOModelSelectionChangedListener implements ISelectionChangedListener {
public void selectionChanged(final SelectionChangedEvent _event) {
IStructuredSelection selection = (IStructuredSelection) _event.getSelection();
setSelection(selection);
}
}
protected class FetchSpecsChangeRefresher extends AbstractAddRemoveChangeRefresher<EOFetchSpecification> {
public FetchSpecsChangeRefresher() {
super("FetchSpecsChange");
}
public void changeSelection(final ISelection selection) {
EOModelEditor.this.setSelection(selection);
EOModelEditor.this.setActivePage(getPageNum(EOModelEditor.EOENTITY_PAGE));
}
@Override
protected void objectsAdded(final List<EOFetchSpecification> _addedObjects) {
// DO NOTHING
}
@Override
protected void objectsRemoved(final List<EOFetchSpecification> _removedObjects) {
EOModelEditor.this.setSelection(new StructuredSelection(EOModelEditor.this.getModel()));
EOModelEditor.this.setActivePage(getPageNum(EOModelEditor.EOMODEL_PAGE));
}
}
protected class StoredProceduresChangeRefresher extends AbstractAddRemoveChangeRefresher<EOStoredProcedure> {
public StoredProceduresChangeRefresher() {
super("StoredProceduresChange");
}
public void changeSelection(final ISelection selection) {
EOModelEditor.this.setSelection(selection);
EOModelEditor.this.setActivePage(getPageNum(EOModelEditor.EOSTOREDPROCEDURE_PAGE));
}
@Override
protected void objectsAdded(final List<EOStoredProcedure> _addedObjects) {
// DO NOTHING
}
@Override
protected void objectsRemoved(final List<EOStoredProcedure> _removedObjects) {
EOModelEditor.this.setSelection(new StructuredSelection(EOModelEditor.this.getModel()));
EOModelEditor.this.setActivePage(getPageNum(EOModelEditor.EOMODEL_PAGE));
}
}
public static final String EOMODEL_EDITOR_ID = "org.objectstyle.wolips.eomodeler.editors.EOModelEditor";
public static final String EOMODEL_PAGE = "eomodel";
public static final String EOENTITY_PAGE = "eoentity";
public static final String EOSTOREDPROCEDURE_PAGE = "eostoredprocedure";
private EOEntitiesTableEditor myEntitiesTableEditor;
private EOEntityEditor myEntityEditor;
private EOArgumentsTableEditor myStoredProcedureEditor;
private EOModelContentOutlinePage myContentOutlinePage;
private final ListenerList mySelectionChangedListeners;
private IStructuredSelection mySelection;
private final PropertyChangeListener myDirtyModelListener;
private final EntitiesChangeRefresher myEntitiesChangeListener;
private final FetchSpecsChangeRefresher myFetchSpecsChangeListener;
private final EntityIndexesChangeRefresher myEntityIndexesChangeListener;
private final StoredProceduresChangeRefresher myStoredProceduresChangeListener;
private final DatabaseConfigsChangeRefresher myDatabaseConfigsChangeListener;
private final AttributeAndRelationshipDeletedRefresher myAttributeAndRelationshipListener;
private final ArgumentDeletedRefresher myArgumentListener;
private EOStoredProcedure mySelectedStoredProcedure;
private EOEntity mySelectedEntity;
private EOEntity myOpeningEntity;
private EOModel myModel;
private Set<EOModelVerificationFailure> myLoadFailures;
private boolean myEntityPageVisible;
private boolean myStoredProcedurePageVisible;
private int mySelectionDepth;
private final Object myCreatePagesLock = new Object();
private int _failuresHashCode;
public EOModelEditor() {
mySelectionChangedListeners = new ListenerList();
myDirtyModelListener = new DirtyModelListener();
myEntitiesChangeListener = new EntitiesChangeRefresher();
myFetchSpecsChangeListener = new FetchSpecsChangeRefresher();
myEntityIndexesChangeListener = new EntityIndexesChangeRefresher();
myStoredProceduresChangeListener = new StoredProceduresChangeRefresher();
myDatabaseConfigsChangeListener = new DatabaseConfigsChangeRefresher();
myAttributeAndRelationshipListener = new AttributeAndRelationshipDeletedRefresher();
myArgumentListener = new ArgumentDeletedRefresher();
ResourcesPlugin.getWorkspace().addResourceChangeListener(this);
}
public void _loadInBackground(final IProgressMonitor progressMonitor) {
myLoadFailures = new LinkedHashSet<EOModelVerificationFailure>();
try {
IEditorInput editorInput = getEditorInput();
URI indexURL = null;
if (editorInput instanceof IURIEditorInput) {
indexURL = ((IURIEditorInput) editorInput).getURI();
} else if (editorInput instanceof IStorageEditorInput) {
// MS: This is a total hackfest here ... This supports
// double-clicking an index.eomodeld from
// inside of a jar
IStorage storage = ((IStorageEditorInput) editorInput).getStorage();
Class jarEntryClass = storage.getClass();
IPath jarEntryPath = (IPath) jarEntryClass.getMethod("getFullPath").invoke(storage);
Object root = jarEntryClass.getMethod("getPackageFragmentRoot").invoke(storage);
Class packageFragmentRootClass = root.getClass();
IResource jarResource = (IResource)packageFragmentRootClass.getMethod("getUnderlyingResource").invoke(root);
IPath jarPath;
if (jarResource == null) {
jarPath = (IPath) packageFragmentRootClass.getMethod("getPath").invoke(root);
}
else {
jarPath = jarResource.getLocation();
}
indexURL = new URI("jar:" + jarPath.toFile().toURL() + "!" + jarEntryPath.toPortableString());
}
if (myModel != null) {
if (myModel.getModelGroup() != null) {
myModel.getModelGroup().removePropertyChangeListener(EOModel.DIRTY, myDirtyModelListener);
}
myModel.removePropertyChangeListener(EOModel.DIRTY, myDirtyModelListener);
myEntitiesChangeListener.stop();
myModel.removePropertyChangeListener(EOModel.ENTITIES, myEntitiesChangeListener);
myStoredProceduresChangeListener.stop();
myModel.removePropertyChangeListener(EOModel.STORED_PROCEDURES, myStoredProceduresChangeListener);
myDatabaseConfigsChangeListener.stop();
myModel.removePropertyChangeListener(EOModel.DATABASE_CONFIGS, myDatabaseConfigsChangeListener);
myFetchSpecsChangeListener.stop();
myModel.removePropertyChangeListener(EOModel.ENTITY + "." + EOEntity.FETCH_SPECIFICATIONS, myFetchSpecsChangeListener);
myEntityIndexesChangeListener.stop();
myModel.removePropertyChangeListener(EOModel.ENTITY + "." + EOEntity.ENTITY_INDEXES, myEntityIndexesChangeListener);
}
String openingEntityName = null;
String extension = URLUtils.getExtension(indexURL);
if ("plist".equalsIgnoreCase(extension)) {
String name = URLUtils.getName(indexURL);
openingEntityName = name.substring(0, name.indexOf('.'));
indexURL = new File(URLUtils.cheatAndTurnIntoFile(indexURL).getParentFile(), "index.eomodeld").toURI();
} else if ("fspec".equalsIgnoreCase(extension)) {
indexURL = new File(URLUtils.cheatAndTurnIntoFile(indexURL).getParentFile(), "index.eomodeld").toURI();
}
EOModelGroup modelGroup = new EOModelGroup();
modelGroup.addPropertyChangeListener(EOModelGroup.MODELS, getContentOutlinePage());
try {
IEOModelGroupFactory.Utility.loadModelGroup(indexURL, modelGroup, myLoadFailures, true, indexURL.toURL(), progressMonitor);
} finally {
modelGroup.removePropertyChangeListener(EOModelGroup.MODELS, getContentOutlinePage());
}
EOModel model = modelGroup.getEditingModel();
boolean showModelGroup = true;
if (model == null) {
handleModelErrors(myLoadFailures, true, null);
Set<EOModel> models = modelGroup.getModels();
if (models.size() > 0) {
model = models.iterator().next();
showModelGroup = true;
}
}
if (model == null) {
// DO NOTHING
} else {
//EclipseFileUtils.getEditorInput(model);
if (openingEntityName != null) {
myOpeningEntity = model.getEntityNamed(openingEntityName);
}
handleModelErrors(myLoadFailures, false, null);
if (model.getModelGroup() != null) {
model.getModelGroup().addPropertyChangeListener(EOModel.DIRTY, myDirtyModelListener);
}
model.addPropertyChangeListener(EOModel.DIRTY, myDirtyModelListener);
myEntitiesChangeListener.start();
model.addPropertyChangeListener(EOModel.ENTITIES, myEntitiesChangeListener);
myStoredProceduresChangeListener.start();
model.addPropertyChangeListener(EOModel.STORED_PROCEDURES, myStoredProceduresChangeListener);
myDatabaseConfigsChangeListener.start();
model.addPropertyChangeListener(EOModel.DATABASE_CONFIGS, myDatabaseConfigsChangeListener);
myFetchSpecsChangeListener.start();
model.addPropertyChangeListener(EOModel.ENTITY + "." + EOEntity.FETCH_SPECIFICATIONS, myFetchSpecsChangeListener);
myEntityIndexesChangeListener.start();
model.addPropertyChangeListener(EOModel.ENTITY + "." + EOEntity.ENTITY_INDEXES, myEntityIndexesChangeListener);
// setInput(new EOModelEditorInput(fileEditorInput));
// init(getEditorSite(), new
// EOModelEditorInput(fileEditorInput));
updatePartName();
getEditorSite().setSelectionProvider(this);
Display.getDefault().asyncExec(new Runnable() {
public void run() {
EOModelEditor.this.editorDirtyStateChanged();
}
});
synchronized (myCreatePagesLock) {
myModel = model;
if (myEntitiesTableEditor != null) {
final boolean finalShowModelGroup = showModelGroup;
Display.getDefault().asyncExec(new Runnable() {
public void run() {
if (myEntitiesTableEditor != null) {
myEntitiesTableEditor.setModel(myModel);
}
if (getContentOutlinePage() != null && getContentOutlinePage().getUpdater() != null) {
getContentOutlinePage().getUpdater().setModel(myModel);
if (finalShowModelGroup) {
getContentOutlinePage().showModelGroup();
}
}
}
});
}
}
if (myOpeningEntity != null) {
Display.getDefault().asyncExec(new Runnable() {
public void run() {
setSelectedEntity(myOpeningEntity);
setActivePage(getPageNum(EOModelEditor.EOENTITY_PAGE));
}
});
}
}
} catch (Throwable e) {
myLoadFailures.add(new EOModelVerificationFailure(null, "Failed to load model.", false, e));
handleModelErrors(myLoadFailures, true, null);
e.printStackTrace();
// throw new PartInitException("Failed to create EOModelEditorInput
// for " + getEditorInput() + ".", e);
}
}
public void addSelectionChangedListener(final ISelectionChangedListener _listener) {
mySelectionChangedListeners.add(_listener);
}
protected int computeFailuresHashCode(final Set<EOModelVerificationFailure> failures) {
StringBuffer sb = new StringBuffer();
for (EOModelVerificationFailure failure : failures) {
sb.append(failure.getMessage());
}
return sb.toString().hashCode();
}
@Override
protected void createPages() {
synchronized (myCreatePagesLock) {
try {
myEntitiesTableEditor = new EOEntitiesTableEditor();
addPage(myEntitiesTableEditor, getEditorInput());
setPageText(getPageNum(EOModelEditor.EOMODEL_PAGE), Messages.getString("EOModelEditor.entitiesTab"));
myEntityEditor = new EOEntityEditor();
EOModelSelectionChangedListener modelSelectionChangedListener = new EOModelSelectionChangedListener();
myEntitiesTableEditor.addSelectionChangedListener(modelSelectionChangedListener);
myEntitiesTableEditor.setModel(myModel);
EOEntitySelectionChangedListener entitySelectionChangedListener = new EOEntitySelectionChangedListener();
myEntityEditor.addSelectionChangedListener(entitySelectionChangedListener);
myStoredProcedureEditor = new EOArgumentsTableEditor();
EOArgumentSelectionChangedListener argumentSelectionChangedListener = new EOArgumentSelectionChangedListener();
myStoredProcedureEditor.addSelectionChangedListener(argumentSelectionChangedListener);
} catch (PartInitException e) {
ErrorDialog.openError(getSite().getShell(), "Error creating editor.", null, e.getStatus());
}
}
}
@Override
public void dispose() {
ResourcesPlugin.getWorkspace().removeResourceChangeListener(this);
myEntitiesChangeListener.stop();
myStoredProceduresChangeListener.stop();
myDatabaseConfigsChangeListener.stop();
myFetchSpecsChangeListener.stop();
myEntityIndexesChangeListener.stop();
super.dispose();
switchFromEntityModelerPerspective();
}
@Override
public void doSave(final IProgressMonitor monitor) {
// if (!myModel.isEditing()) {
// ErrorUtils.openErrorDialog(Display.getDefault().getActiveShell(),
// "You cannot save this model because it is read-only.");
// return;
// }
showBusy(true);
try {
IEditorInput input = getEditorInput();
if (input != null && myModel != null) {
Set<EOModelVerificationFailure> failures = new HashSet<EOModelVerificationFailure>();
final List<EOModel> dirtyModels = new LinkedList<EOModel>();
for (EOModel model : myModel.getModelGroup().getModels()) {
if (model.isDirty()) {
dirtyModels.add(model);
}
}
boolean saveAllModels = true;
if (dirtyModels.size() > 1 || !dirtyModels.contains(myModel)) {
Set<String> modelNames = new TreeSet<String>();
for (EOModel model : dirtyModels) {
if (model != myModel) {
modelNames.add(model.getName());
}
}
saveAllModels = MessageDialog.openQuestion(getSite().getShell(), "Additional Models Modified", "You modified the following additional models in this model group: " + modelNames + ". Would you like to save them, also?");
}
Set<EOModel> doNotSaveModels = new HashSet<EOModel>();
for (EOModel model : dirtyModels) {
if (model == myModel || saveAllModels) {
Set<EOLastModified> lastModified = new HashSet<EOLastModified>();
model.checkLastModified(lastModified);
if (!lastModified.isEmpty()) {
if (!MessageDialog.openConfirm(Display.getDefault().getActiveShell(), "Model Changed on Disk", "The model '" + model.getName() + "' changed on disk since you opened it. Are you want to overwrite those changes?")) {
doNotSaveModels.add(model);
}
}
}
}
dirtyModels.removeAll(doNotSaveModels);
for (EOModel model : dirtyModels) {
if (model == myModel || saveAllModels) {
monitor.beginTask("Checking " + model.getName() + " ...", IProgressMonitor.UNKNOWN);
try {
model.verify(failures);
if (!model.canSave()) {
failures.add(new EOModelVerificationFailure(model, "You modified the model '" + model.getName() + "', but you are not able to save it to '" + model.getIndexURL() + "'.", false));
}
} finally {
monitor.done();
}
}
}
final boolean finalSaveAllModels = saveAllModels;
handleModelErrors(failures, false, new Runnable() {
public void run() {
showBusy(true);
try {
for (EOModel model : dirtyModels) {
if (model.canSave() && (model == myModel || finalSaveAllModels)) {
monitor.beginTask("Saving " + model.getName() + " ...", IProgressMonitor.UNKNOWN);
try {
model.save();
IFile eclipseIndexFile = EclipseFileUtils.getEclipseFile(myModel.getIndexURL());
if (eclipseIndexFile != null) {
eclipseIndexFile.getParent().getParent().refreshLocal(IResource.DEPTH_INFINITE, monitor);
}
} finally {
monitor.done();
}
}
}
}
catch (Throwable t) {
ErrorUtils.openErrorDialog(Display.getDefault().getActiveShell(), t);
} finally {
showBusy(false);
}
}
});
}
} catch (Throwable t) {
ErrorUtils.openErrorDialog(Display.getDefault().getActiveShell(), t);
} finally {
showBusy(false);
}
}
@Override
public void doSaveAs() {
doSave(null);
}
protected void doubleClickedObjectInOutline(final Object _obj) {
if (_obj instanceof EOEntity) {
setActivePage(getPageNum(EOModelEditor.EOENTITY_PAGE));
} else if (_obj instanceof EOStoredProcedure) {
setActivePage(getPageNum(EOModelEditor.EOSTOREDPROCEDURE_PAGE));
}
}
protected void editorDirtyStateChanged() {
firePropertyChange(IEditorPart.PROP_DIRTY);
}
protected void fireSelectionChanged(final ISelection _selection) {
// MS: It appears 3.5.1, at least, no longer requires this hack
// Hack: When the selection changes, update the focus on the outline
// view or the properties view can sometimes not refresh properly -- It's really
// silly and I don't know why it's happening.
// MS: 3.6 needs it again :\ I still don't understand it, but we're a little better now -- we
// steal away focus and then steal it back.
IWorkbenchPart activePart = getSite().getPage().getActivePart();
if (activePart instanceof PropertySheet) {
if (getContentOutlinePage().getControl() != null) {
getContentOutlinePage().setFocus();
}
getSite().getPage().activate(activePart);
}
Object[] selectionChangedListeners = mySelectionChangedListeners.getListeners();
SelectionChangedEvent selectionChangedEvent = new SelectionChangedEvent(this, _selection);
for (int listenerNum = 0; listenerNum < selectionChangedListeners.length; listenerNum++) {
ISelectionChangedListener listener = (ISelectionChangedListener) selectionChangedListeners[listenerNum];
listener.selectionChanged(selectionChangedEvent);
}
}
@Override
public Object getAdapter(final Class _adapterClass) {
Object adapter;
if (_adapterClass == IPropertySheetPage.class) {
adapter = new TabbedPropertySheetPage(this);
} else if (_adapterClass == IContentOutlinePage.class) {
IContentOutlinePage outlinePage = getContentOutlinePage();
adapter = outlinePage;
} else {
adapter = super.getAdapter(_adapterClass);
}
return adapter;
}
public EOModelContentOutlinePage getContentOutlinePage() {
if (myContentOutlinePage == null) {
myContentOutlinePage = new EOModelContentOutlinePage(this);
myContentOutlinePage.addSelectionChangedListener(new EOModelContentSelectionChangedListener());
}
return myContentOutlinePage;
}
public String getContributorId() {
return getSite().getId();
}
public EOEntitiesTableEditor getEntitiesTableEditor() {
return myEntitiesTableEditor;
}
public EOEntityEditor getEntityEditor() {
return myEntityEditor;
}
public EOModel getModel() {
return myModel;
}
protected int getPageNum(final IEditorPart _editorPart) {
int matchingPageNum = -1;
int pageCount = getPageCount();
for (int pageNum = 0; matchingPageNum == -1 && pageNum < pageCount; pageNum++) {
IEditorPart editorPart = getEditor(pageNum);
if (editorPart == _editorPart) {
matchingPageNum = pageNum;
}
}
return matchingPageNum;
}
protected int getPageNum(final String _pageType) {
int pageNum;
if (_pageType == EOModelEditor.EOENTITY_PAGE) {
pageNum = getPageNum(myEntityEditor);
} else if (_pageType == EOModelEditor.EOMODEL_PAGE) {
pageNum = getPageNum(myEntitiesTableEditor);
} else if (_pageType == EOModelEditor.EOSTOREDPROCEDURE_PAGE) {
pageNum = getPageNum(myStoredProcedureEditor);
} else {
pageNum = -1;
}
return pageNum;
}
public EOEntity getSelectedEntity() {
return mySelectedEntity;
}
public EOStoredProcedure getSelectedStoredProcedure() {
return mySelectedStoredProcedure;
}
public ISelection getSelection() {
return mySelection;
}
public EOArgumentsTableEditor getStoredProcedureEditor() {
return myStoredProcedureEditor;
}
public IUndoContext getUndoContext() {
return new EOModelEditorUndoContext();
}
protected void handleModelErrors(final Set<EOModelVerificationFailure> failures, final boolean forceOpen, final Runnable executeWhenApproved) {
if (myModel != null) {
try {
if (Activator.getDefault().getPreferenceStore().getBoolean(PreferenceConstants.SHOW_ERRORS_IN_PROBLEMS_VIEW_KEY)) {
final EOModel editingModel = myModel;
IWorkspaceRunnable body = new IWorkspaceRunnable() {
public void run(final IProgressMonitor monitor) throws CoreException {
for (EOModel model : editingModel.getModelGroup().getModels()) {
try {
IFile indexFile = EclipseFileUtils.getEclipseIndexFile(model);
if (indexFile != null) {
IMarker[] oldMarkers = indexFile.findMarkers(IMarker.PROBLEM, true, IResource.DEPTH_INFINITE);
for (int markerNum = 0; markerNum < oldMarkers.length; markerNum++) {
// System.out.println("EOModelEditor.handleModelErrors:
// deleting " + markers[markerNum]);
oldMarkers[markerNum].delete();
}
IMarker[] newMarkers = indexFile.findMarkers(org.objectstyle.wolips.eomodeler.core.Activator.EOMODEL_PROBLEM_MARKER, true, IResource.DEPTH_INFINITE);
for (int markerNum = 0; markerNum < newMarkers.length; markerNum++) {
// System.out.println("EOModelEditor.handleModelErrors:
// deleting " + markers[markerNum]);
newMarkers[markerNum].delete();
}
}
} catch (Exception e) {
Activator.getDefault().log(e);
}
}
for (EOModelVerificationFailure failure : failures) {
EOModel model = failure.getModel();
IFile indexFile;
try {
indexFile = EclipseFileUtils.getEclipseIndexFile(model);
if (indexFile != null) {
IMarker marker = indexFile.createMarker(org.objectstyle.wolips.eomodeler.core.Activator.EOMODEL_PROBLEM_MARKER);
marker.setAttribute(IMarker.MESSAGE, failure.getMessage());
int severity;
if (failure.isWarning()) {
severity = IMarker.SEVERITY_WARNING;
} else {
severity = IMarker.SEVERITY_ERROR;
}
marker.setAttribute(IMarker.SEVERITY, new Integer(severity));
marker.setAttribute(IMarker.TRANSIENT, false);
}
} catch (Exception e) {
Activator.getDefault().log(e);
}
}
}
};
IWorkspace workspace = ResourcesPlugin.getWorkspace();
workspace.run(body, new NullProgressMonitor());
}
} catch (Exception e) {
Activator.getDefault().log(e);
}
}
if (!Activator.getDefault().getPreferenceStore().getBoolean(PreferenceConstants.SHOW_RELATIONSHIP_ATTRIBUTE_OPTIONALITY_MISMATCH)) {
Iterator<EOModelVerificationFailure> failuresIter = failures.iterator();
while (failuresIter.hasNext()) {
EOModelVerificationFailure failure = failuresIter.next();
if (failure instanceof EORelationshipOptionalityMismatchFailure) {
failuresIter.remove();
}
}
}
boolean warnings = false;
boolean errors = false;
for (EOModelVerificationFailure failure : failures) {
if (failure.isWarning()) {
warnings = true;
} else {
errors = true;
}
}
boolean openWindow = false;
if (forceOpen) {
openWindow = true;
} else {
if (errors && Activator.getDefault().getPreferenceStore().getBoolean(PreferenceConstants.OPEN_WINDOW_ON_VERIFICATION_ERRORS_KEY)) {
openWindow = true;
}
if (warnings && Activator.getDefault().getPreferenceStore().getBoolean(PreferenceConstants.OPEN_WINDOW_ON_VERIFICATION_WARNINGS_KEY)) {
openWindow = true;
}
}
int newFailuresHashCode = computeFailuresHashCode(failures);
if (openWindow && _failuresHashCode != 0 && newFailuresHashCode == _failuresHashCode) {
openWindow = false;
}
_failuresHashCode = newFailuresHashCode;
if (openWindow) {
Display.getDefault().asyncExec(new Runnable() {
public void run() {
if (!failures.isEmpty()) {
EOModelErrorDialog dialog;
if (executeWhenApproved != null) {
dialog = new EOModelSaveErrorDialog(Display.getCurrent().getActiveShell(), failures, EOModelEditor.this);
}
else {
dialog = new EOModelErrorDialog(Display.getCurrent().getActiveShell(), failures, EOModelEditor.this);
}
dialog.setBlockOnOpen(true);
int result = dialog.open();
if (executeWhenApproved != null) {
if (result == Window.OK) {
executeWhenApproved.run();
}
else {
_failuresHashCode = 0;
}
}
}
}
});
}
else if (executeWhenApproved != null) {
executeWhenApproved.run();
}
}
@Override
public void init(final IEditorSite site, final IEditorInput editorInput) throws PartInitException {
try {
switchToEntityModelerPerspective();
super.init(site, editorInput);
LoadEOModelWorkspaceJob loadModelJob = new LoadEOModelWorkspaceJob(this, editorInput);
loadModelJob.schedule();
} catch (WorkbenchException e) {
e.printStackTrace();
}
}
@Override
public boolean isDirty() {
boolean dirty = false;
if (myModel != null) {
if (myModel.isDirty()) {
dirty = true;
} else if (myModel.getModelGroup() != null) {
dirty = myModel.getModelGroup().isDirty();
}
}
return dirty;
}
@Override
public boolean isSaveAsAllowed() {
return false;
}
@Override
protected void pageChange(final int _newPageIndex) {
super.pageChange(_newPageIndex);
ISelectionProvider selectionProvider = (ISelectionProvider) getEditor(_newPageIndex);
getSite().setSelectionProvider(selectionProvider);
}
public void removeSelectionChangedListener(final ISelectionChangedListener _listener) {
mySelectionChangedListeners.remove(_listener);
}
public void resourceChanged(final IResourceChangeEvent _event) {
if (_event.getType() == IResourceChangeEvent.PRE_CLOSE) {
final IURIEditorInput input = (IURIEditorInput) getEditorInput();
Display.getDefault().asyncExec(new Runnable() {
public void run() {
IWorkbenchPage[] pages = getSite().getWorkbenchWindow().getPages();
for (int pageNum = 0; pageNum < pages.length; pageNum++) {
IFile eclipseIndexFile = EclipseFileUtils.getEclipseFile(input.getURI());
if (eclipseIndexFile != null && eclipseIndexFile.getProject().equals(_event.getResource())) {
IEditorPart editorPart = pages[pageNum].findEditor(input);
pages[pageNum].closeEditor(editorPart, true);
}
}
}
});
}
}
public void revert() {
boolean confirmed = MessageDialog.openConfirm(Display.getDefault().getActiveShell(), Messages.getString("EOModelEditor.revertTitle"), Messages.getString("EOModelEditor.revertMessage"));
if (confirmed) {
try {
init((IEditorSite) getSite(), getEditorInput());
} catch (PartInitException e) {
e.printStackTrace();
}
}
}
@Override
public void setActivePage(final int _pageIndex) {
if (_pageIndex != getActivePage()) {
super.setActivePage(_pageIndex);
}
}
protected void setEntityPageVisible(final boolean _entityPageVisible) {
try {
if (_entityPageVisible) {
if (!myEntityPageVisible) {
addPage(myEntityEditor, getEditorInput());
}
String entityName = mySelectedEntity.getName();
if (entityName == null) {
entityName = "?";
}
setPageText(getPageNum(EOModelEditor.EOENTITY_PAGE), entityName);
} else if (myEntityPageVisible) {
removePage(getPageNum(EOModelEditor.EOENTITY_PAGE));
}
myEntityPageVisible = _entityPageVisible;
} catch (PartInitException e) {
ErrorDialog.openError(getSite().getShell(), "Error creating editor.", null, e.getStatus());
}
}
@Override
public void setFocus() {
super.setFocus();
// MS: I'm not sure the right way to do this, but without
// this call, selecting a relationship in the EOModelEditor
// before ever activing the outline would not cause the
// property view to update.
getSite().setSelectionProvider(this);
// MS: If an Entity Modeler editor receives focus, and there is
// more than one editor in the perspective, we want to switch
// to Entity Modeler perspective. The "more than one editor"
// restriction is in place, because if you only have an
// Entity Modeler editor in the perspective, you won't be
// able to ever switch perspectives to temporarily get access
// to package explorer, for instance, because it will keep
// forcing you back. This MIGHT actually be the correct
// behavior, but it seemed really aggressive.
if (Activator.getDefault().getPreferenceStore().getBoolean(PreferenceConstants.CHANGE_PERSPECTIVES_KEY)) {
boolean shouldSwitchToEntityModeler = false;
IWorkbench workbench = Activator.getDefault().getWorkbench();
IWorkbenchWindow activeWindow = workbench.getActiveWorkbenchWindow();
if (activeWindow != null) {
if (activeWindow != null) {
IWorkbenchPage workbenchPage = activeWindow.getActivePage();
if (workbenchPage != null) {
IEditorReference[] editorReferences = workbenchPage.getEditorReferences();
if (editorReferences.length > 1) {
shouldSwitchToEntityModeler = true;
}
}
}
}
if (shouldSwitchToEntityModeler) {
switchToEntityModelerPerspective();
}
}
}
public void setSelectedEntity(final EOEntity _selectedEntity) {
if (!ComparisonUtils.equals(mySelectedEntity, _selectedEntity)) {
if (mySelectedEntity != null) {
mySelectedEntity.removePropertyChangeListener(EOEntity.ATTRIBUTES, myAttributeAndRelationshipListener);
mySelectedEntity.removePropertyChangeListener(EOEntity.RELATIONSHIPS, myAttributeAndRelationshipListener);
}
mySelectedEntity = _selectedEntity;
if (mySelectedEntity != null) {
mySelectedEntity.addPropertyChangeListener(EOEntity.ATTRIBUTES, myAttributeAndRelationshipListener);
mySelectedEntity.addPropertyChangeListener(EOEntity.RELATIONSHIPS, myAttributeAndRelationshipListener);
}
if (_selectedEntity == null) {
setEntityPageVisible(false);
} else {
setEntityPageVisible(true);
}
myEntitiesTableEditor.setSelectedEntity(_selectedEntity);
myEntityEditor.setEntity(_selectedEntity);
// Fix a problem where the entity properties view does not refresh
// This is a hack, but if we steal focus onto the outline, it DOES
// refresh
updatePartName();
}
if (_selectedEntity != null) {
setSelectedStoredProcedure(null);
}
}
public void setSelectedStoredProcedure(final EOStoredProcedure _selectedStoredProcedure) {
if (!ComparisonUtils.equals(mySelectedStoredProcedure, _selectedStoredProcedure)) {
if (mySelectedStoredProcedure != null) {
mySelectedStoredProcedure.removePropertyChangeListener(EOStoredProcedure.ARGUMENTS, myArgumentListener);
}
mySelectedStoredProcedure = _selectedStoredProcedure;
if (mySelectedStoredProcedure != null) {
mySelectedStoredProcedure.addPropertyChangeListener(EOStoredProcedure.ARGUMENTS, myArgumentListener);
}
if (_selectedStoredProcedure == null) {
setStoredProcedurePageVisible(false);
} else {
setStoredProcedurePageVisible(true);
}
myStoredProcedureEditor.setStoredProcedure(_selectedStoredProcedure);
updatePartName();
}
if (_selectedStoredProcedure != null) {
setSelectedEntity(null);
}
}
public void setSelection(final ISelection _selection) {
setSelection(_selection, true);
}
public synchronized void setSelection(final ISelection _selection, final boolean _updateOutline) {
// MS: it's really easy to setup a selection loop with so many
// interrelated components. In reality, we only want the top selection
// to count, and
// if the call to setSelection is called again from within this stack,
// then
// that's pretty much bad.
mySelectionDepth++;
try {
if (mySelectionDepth == 1) {
IStructuredSelection previousSelection = mySelection;
IStructuredSelection selection = (IStructuredSelection) _selection;
mySelection = selection;
if (previousSelection == null || !selection.toList().equals(previousSelection.toList())) {
Object selectedObject = null;
if (!selection.isEmpty()) {
selectedObject = selection.getFirstElement();
}
if (selectedObject instanceof EOModel) {
// EOModel selectedModel = (EOModel) selectedObject;
setSelectedEntity(null);
setSelectedStoredProcedure(null);
setActivePage(getPageNum(EOModelEditor.EOMODEL_PAGE));
} else if (selectedObject instanceof EOEntity) {
EOEntity selectedEntity = (EOEntity) selectedObject;
setSelectedEntity(selectedEntity);
// setActivePage(EOModelEditor.EOENTITY_PAGE);
} else if (selectedObject instanceof EOAttribute) {
EOAttribute selectedAttribute = (EOAttribute) selectedObject;
setSelectedEntity(selectedAttribute.getEntity());
getEntityEditor().setSelection(_selection);
setActivePage(getPageNum(EOModelEditor.EOENTITY_PAGE));
} else if (selectedObject instanceof EORelationship) {
EORelationship selectedRelationship = (EORelationship) selectedObject;
setSelectedEntity(selectedRelationship.getEntity());
getEntityEditor().setSelection(selection);
setActivePage(getPageNum(EOModelEditor.EOENTITY_PAGE));
} else if (selectedObject instanceof EOFetchSpecification) {
EOFetchSpecification selectedFetchSpec = (EOFetchSpecification) selectedObject;
setSelectedEntity(selectedFetchSpec.getEntity());
getEntityEditor().setSelection(selection);
// setActivePage(EOModelEditor.EOENTITY_PAGE);
} else if (selectedObject instanceof AbstractEOAttributePath) {
AbstractEOAttributePath selectedAttributePath = (AbstractEOAttributePath) selectedObject;
setSelectedEntity(selectedAttributePath.getChildIEOAttribute().getEntity());
getEntityEditor().setSelection(new StructuredSelection(selectedAttributePath.getChildIEOAttribute()));
setActivePage(getPageNum(EOModelEditor.EOENTITY_PAGE));
} else if (selectedObject instanceof EOStoredProcedure) {
EOStoredProcedure selectedStoredProcedure = (EOStoredProcedure) selectedObject;
setSelectedStoredProcedure(selectedStoredProcedure);
// setActivePage(EOModel)
} else if (selectedObject instanceof EOArgument) {
EOArgument selectedArgument = (EOArgument) selectedObject;
setSelectedStoredProcedure(selectedArgument.getStoredProcedure());
getStoredProcedureEditor().setSelection(_selection);
setActivePage(getPageNum(EOModelEditor.EOSTOREDPROCEDURE_PAGE));
} else if (selectedObject instanceof EODatabaseConfig) {
// EODatabaseConfig selectedDatabaseConfig =
// (EODatabaseConfig) selectedObject;
setSelectedEntity(null);
setActivePage(getPageNum(EOModelEditor.EOMODEL_PAGE));
}
if (_updateOutline) {
getContentOutlinePage().setSelection(selection);
}
fireSelectionChanged(selection);
}
}
} finally {
mySelectionDepth--;
}
}
protected void setStoredProcedurePageVisible(final boolean _storedProcedurePageVisible) {
try {
if (_storedProcedurePageVisible) {
if (!myStoredProcedurePageVisible) {
addPage(myStoredProcedureEditor, getEditorInput());
}
String storedProcedureName = mySelectedStoredProcedure.getName();
if (storedProcedureName == null) {
storedProcedureName = "?";
}
setPageText(getPageNum(EOModelEditor.EOSTOREDPROCEDURE_PAGE), storedProcedureName);
} else if (myStoredProcedurePageVisible) {
removePage(getPageNum(EOModelEditor.EOSTOREDPROCEDURE_PAGE));
}
myStoredProcedurePageVisible = _storedProcedurePageVisible;
} catch (PartInitException e) {
ErrorDialog.openError(getSite().getShell(), "Error creating editor.", null, e.getStatus());
}
}
/**
* Called when Entity Modeler should switch from Entity Modeler Perspective
* back to WOLips perspective.
*/
public void switchFromEntityModelerPerspective() {
// MS: If "Open in New Window" is selected, then we want to watch for
// the case where
// you were in Entity Modeler and then close the editor, which also
// close the new window,
// so we don't leave you sitting in a blank window.
boolean closedWindow = false;
if (Activator.getDefault().getPreferenceStore().getBoolean(PreferenceConstants.OPEN_IN_WINDOW_KEY)) {
IWorkbench workbench = Activator.getDefault().getWorkbench();
if (workbench.getWorkbenchWindows().length > 1) {
IWorkbenchPage workbenchPage = workbench.getActiveWorkbenchWindow().getActivePage();
if (workbenchPage != null && EOModelerPerspectiveFactory.EOMODELER_PERSPECTIVE_ID.equals(workbenchPage.getPerspective().getId())) {
IEditorReference[] editorReferences = workbenchPage.getEditorReferences();
if (editorReferences.length == 0) {
closedWindow = workbench.getActiveWorkbenchWindow().close();
}
}
}
}
// MS: If the window didn't need to close, then we want to switch
// perspectives on your current
// window from Entity Modeler over to the WOLips perspective.
if (!closedWindow && Activator.getDefault().getPreferenceStore().getBoolean(PreferenceConstants.CHANGE_PERSPECTIVES_KEY)) {
try {
IWorkbench workbench = Activator.getDefault().getWorkbench();
IWorkbenchWindow activeWorkbenchWindow = workbench.getActiveWorkbenchWindow();
if (activeWorkbenchWindow != null) {
IWorkbenchPage workbenchPage = activeWorkbenchWindow.getActivePage();
if (workbenchPage != null && EOModelerPerspectiveFactory.EOMODELER_PERSPECTIVE_ID.equals(workbenchPage.getPerspective().getId())) {
IEditorReference[] editorReferences = workbenchPage.getEditorReferences();
int eomodelerEditorCount = 0;
for (int editorReferenceNum = 0; editorReferenceNum < editorReferences.length; editorReferenceNum++) {
IEditorReference editorReference = editorReferences[editorReferenceNum];
if (EOModelEditor.EOMODEL_EDITOR_ID.equals(editorReference.getId())) {
eomodelerEditorCount++;
}
}
if (eomodelerEditorCount == 0) {
workbench.showPerspective("org.objectstyle.wolips.ui.Perspective", activeWorkbenchWindow);
}
}
}
} catch (WorkbenchException e) {
// ErrorUtils.openErrorDialog(Display.getDefault().getActiveShell(),
// e);
Activator.getDefault().log(e);
}
}
}
/**
* Called when Entity Modeler should switch from whatever the current
* perspective is to Entity Modeler perspective.
*/
public void switchToEntityModelerPerspective() {
try {
if (Activator.getDefault().getPreferenceStore().getBoolean(PreferenceConstants.CHANGE_PERSPECTIVES_KEY)) {
IWorkbench workbench = Activator.getDefault().getWorkbench();
IWorkbenchWindow activeWorkbenchWindow = workbench.getActiveWorkbenchWindow();
if (activeWorkbenchWindow != null) {
workbench.showPerspective(EOModelerPerspectiveFactory.EOMODELER_PERSPECTIVE_ID, activeWorkbenchWindow);
}
}
} catch (WorkbenchException e) {
Activator.getDefault().log(e);
}
}
protected void updatePartName() {
String partName;
if (myModel != null) {
partName = myModel.getName();
} else {
partName = Messages.getString("EOModelEditor.partName");
}
setPartName(partName);
}
}