Package org.objectstyle.wolips.eomodeler.editors

Source Code of org.objectstyle.wolips.eomodeler.editors.EOModelEditor$EOModelEditorUndoContext

/*
* ====================================================================
*
* 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);
  }
}
TOP

Related Classes of org.objectstyle.wolips.eomodeler.editors.EOModelEditor$EOModelEditorUndoContext

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.