Re: r5654 - trunk/woproject/wolips/core/plugins/org.objectstyle.wolips.eomodeler/java/org/objectstyle/wolips/eomodeler/editors

From: Mike Schrag (mschra..dimension.com)
Date: Wed Jan 28 2009 - 09:44:11 EST

  • Next message: Henrique Prange: "Re: r5654 - trunk/woproject/wolips/core/plugins/org.objectstyle.wolips.eomodeler/java/org/objectstyle/wolips/eomodeler/editors"

    What actually changed in this commit? it looks like there was a
    reformat applied, so I can't tell what the real changes were ... I'm
    also curious what's different about your config than mine, because I
    did jar tests and it worked for me. Can you send me a sample project
    that wasn't working?

    On Jan 28, 2009, at 9:13 AM, hprang..bjectstyle.org wrote:

    > Author: hprange
    > Date: 2009-01-28 09:13:26 -0500 (Wed, 28 Jan 2009)
    > New Revision: 5654
    >
    > Modified:
    > trunk/woproject/wolips/core/plugins/
    > org.objectstyle.wolips.eomodeler/java/org/objectstyle/wolips/
    > eomodeler/editors/EOModelEditor.java
    > Log:
    > Fix for NullPointerException while opening EOModels inside jar
    > files. It still doesn't open the model correctly though.
    >
    > Modified: trunk/woproject/wolips/core/plugins/
    > org.objectstyle.wolips.eomodeler/java/org/objectstyle/wolips/
    > eomodeler/editors/EOModelEditor.java
    > ===================================================================
    > --- trunk/woproject/wolips/core/plugins/
    > org.objectstyle.wolips.eomodeler/java/org/objectstyle/wolips/
    > eomodeler/editors/EOModelEditor.java 2009-01-27 22:34:47 UTC (rev
    > 5653)
    > +++ trunk/woproject/wolips/core/plugins/
    > org.objectstyle.wolips.eomodeler/java/org/objectstyle/wolips/
    > eomodeler/editors/EOModelEditor.java 2009-01-28 14:13:26 UTC (rev
    > 5654)
    >.. -1,35 +1,35 @@
    > /*
    > *
    > ====================================================================
    > - *
    > + *
    > * 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 andru..bjectstyle.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
    >.. -41,11 +41,11 @@
    > * 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;
    >
    >.. -130,385 +130,307 @@
    > import org.objectstyle.wolips.eomodeler.utils.EclipseFileUtils;
    >
    > public class EOModelEditor extends MultiPageEditorPart implements
    > IResourceChangeListener, ITabbedPropertySheetPageContributor,
    > ISelectionProvider, IEOModelEditor {
    > - public static final String EOMODEL_EDITOR_ID =
    > "org.objectstyle.wolips.eomodeler.editors.EOModelEditor";
    > + protected class ArgumentDeletedRefresher extends
    > AbstractAddRemoveChangeRefresher<EOArgument> {
    > + public ArgumentDeletedRefresher() {
    > + super("ArgumentDeleted");
    > + }
    >
    > - public static final String EOMODEL_PAGE = "eomodel";
    > + public void changeSelection(final ISelection selection) {
    > + EOModelEditor.this.setSelection(selection);
    > + }
    >
    > - public static final String EOENTITY_PAGE = "eoentity";
    > + ..verride
    > + protected void objectsAdded(final List<EOArgument> _addedObjects) {
    > + // DO NOTHING
    > + }
    >
    > - public static final String EOSTOREDPROCEDURE_PAGE =
    > "eostoredprocedure";
    > + ..verride
    > + protected void objectsRemoved(final List<EOArgument>
    > _removedObjects) {
    > + EOModelEditor.this.setSelection(new
    > StructuredSelection(EOModelEditor.this.getSelectedStoredProcedure()));
    > +
    > EOModelEditor
    > .this.setActivePage(getPageNum(EOModelEditor.EOSTOREDPROCEDURE_PAGE));
    > + }
    > + }
    >
    > - private EOEntitiesTableEditor myEntitiesTableEditor;
    > + protected class AttributeAndRelationshipDeletedRefresher extends
    > AbstractAddRemoveChangeRefresher<IEOAttribute> {
    > + public AttributeAndRelationshipDeletedRefresher() {
    > + super("AttributeAndRelationshipDeleted");
    > + }
    >
    > - private EOEntityEditor myEntityEditor;
    > + public void changeSelection(final ISelection selection) {
    > + EOModelEditor.this.setSelection(selection);
    > + }
    >
    > - private EOArgumentsTableEditor myStoredProcedureEditor;
    > + ..verride
    > + protected void objectsAdded(final List<IEOAttribute>
    > _addedObjects) {
    > + // DO NOTHING
    > + }
    >
    > - private EOModelContentOutlinePage myContentOutlinePage;
    > + ..verride
    > + protected void objectsRemoved(final List<IEOAttribute>
    > _removedObjects) {
    > + EOModelEditor.this.setSelection(new
    > StructuredSelection(EOModelEditor.this.getSelectedEntity()));
    > +
    > EOModelEditor
    > .this.setActivePage(getPageNum(EOModelEditor.EOENTITY_PAGE));
    > + }
    > + }
    >
    > - private ListenerList mySelectionChangedListeners;
    > + protected class DatabaseConfigsChangeRefresher extends
    > AbstractAddRemoveChangeRefresher<EODatabaseConfig> {
    > + public DatabaseConfigsChangeRefresher() {
    > + super("DatabaseConfigsChange");
    > + }
    >
    > - private IStructuredSelection mySelection;
    > + public void changeSelection(final ISelection selection) {
    > + EOModelEditor.this.setSelection(selection);
    > + }
    >
    > - private PropertyChangeListener myDirtyModelListener;
    > + ..verride
    > + protected void objectsAdded(final List<EODatabaseConfig>
    > _addedObjects) {
    > + // DO NOTHING
    > + }
    >
    > - private EntitiesChangeRefresher myEntitiesChangeListener;
    > + ..verride
    > + protected void objectsRemoved(final List<EODatabaseConfig>
    > _removedObjects) {
    > + EOModelEditor.this.setSelection(new
    > StructuredSelection(EOModelEditor.this.getModel()));
    > +
    > EOModelEditor
    > .this.setActivePage(getPageNum(EOModelEditor.EOMODEL_PAGE));
    > + }
    > + }
    >
    > - private FetchSpecsChangeRefresher myFetchSpecsChangeListener;
    > + protected class DirtyModelListener implements
    > PropertyChangeListener {
    > + public void propertyChange(final PropertyChangeEvent _event) {
    > + String propertyName = _event.getPropertyName();
    > + if (EOModel.DIRTY.equals(propertyName)) {
    > + EOModelEditor.this.editorDirtyStateChanged();
    > + }
    > + }
    > + }
    >
    > - private EntityIndexesChangeRefresher myEntityIndexesChangeListener;
    > + protected class EntitiesChangeRefresher extends
    > AbstractAddRemoveChangeRefresher<EOEntity> {
    > + public EntitiesChangeRefresher() {
    > + super("EntitiesChange");
    > + }
    >
    > - private StoredProceduresChangeRefresher
    > myStoredProceduresChangeListener;
    > + public void changeSelection(final ISelection selection) {
    > + EOModelEditor.this.setSelection(selection);
    > +
    > EOModelEditor
    > .this.setActivePage(getPageNum(EOModelEditor.EOENTITY_PAGE));
    > + }
    >
    > - private DatabaseConfigsChangeRefresher
    > myDatabaseConfigsChangeListener;
    > + ..verride
    > + protected void objectsAdded(final List<EOEntity> _addedObjects) {
    > + // DO NOTHING
    > + }
    >
    > - private AttributeAndRelationshipDeletedRefresher
    > myAttributeAndRelationshipListener;
    > + ..verride
    > + protected void objectsRemoved(final List<EOEntity>
    > _removedObjects) {
    > + EOModelEditor.this.setSelection(new
    > StructuredSelection(EOModelEditor.this.getModel()));
    > +
    > EOModelEditor
    > .this.setActivePage(getPageNum(EOModelEditor.EOMODEL_PAGE));
    > + }
    > + }
    >
    > - private ArgumentDeletedRefresher myArgumentListener;
    > + protected class EntityIndexesChangeRefresher extends
    > AbstractAddRemoveChangeRefresher<EOEntityIndex> {
    > + public EntityIndexesChangeRefresher() {
    > + super("EntityIndexesChange");
    > + }
    >
    > - private EOStoredProcedure mySelectedStoredProcedure;
    > + public void changeSelection(final ISelection selection) {
    > + EOModelEditor.this.setSelection(selection);
    > +
    > EOModelEditor
    > .this.setActivePage(getPageNum(EOModelEditor.EOENTITY_PAGE));
    > + }
    >
    > - private EOEntity mySelectedEntity;
    > + ..verride
    > + protected void objectsAdded(final List<EOEntityIndex>
    > _addedObjects) {
    > + // DO NOTHING
    > + }
    >
    > - private EOEntity myOpeningEntity;
    > + ..verride
    > + protected void objectsRemoved(final List<EOEntityIndex>
    > _removedObjects) {
    > + EOModelEditor.this.setSelection(new
    > StructuredSelection(EOModelEditor.this.getModel()));
    > +
    > EOModelEditor
    > .this.setActivePage(getPageNum(EOModelEditor.EOMODEL_PAGE));
    > + }
    > + }
    >
    > - private EOModel myModel;
    > + protected class EOArgumentSelectionChangedListener implements
    > ISelectionChangedListener {
    > + public void selectionChanged(final SelectionChangedEvent _event) {
    > + IStructuredSelection selection = (IStructuredSelection)
    > _event.getSelection();
    > + setSelection(selection);
    > + }
    > + }
    >
    > - private Set<EOModelVerificationFailure> myLoadFailures;
    > + protected class EOEntitySelectionChangedListener implements
    > ISelectionChangedListener {
    > + public void selectionChanged(final SelectionChangedEvent _event) {
    > + IStructuredSelection selection = (IStructuredSelection)
    > _event.getSelection();
    > + setSelection(selection);
    > + }
    > + }
    >
    > - private boolean myEntityPageVisible;
    > + protected class EOModelContentSelectionChangedListener implements
    > ISelectionChangedListener {
    > + private Object mySelectedObject;
    >
    > - private boolean myStoredProcedurePageVisible;
    > -
    > - private int mySelectionDepth;
    > -
    > - private 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 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;
    > + }
    > + }
    > + }
    > }
    >
    > - public IUndoContext getUndoContext() {
    > - return new EOModelEditorUndoContext();
    > - }
    > -
    > protected class EOModelEditorUndoContext implements IUndoContext {
    > public String getLabel() {
    > return
    > EOModelUtils.getUndoContext(EOModelEditor.this.getModel()).getLabel();
    > }
    >
    > - public boolean matches(IUndoContext context) {
    > + public boolean matches(final IUndoContext context) {
    > return
    > EOModelUtils
    > .getUndoContext(EOModelEditor.this.getModel()).matches(context);
    > }
    > }
    >
    > - public EOModelContentOutlinePage getContentOutlinePage() {
    > - if (myContentOutlinePage == null) {
    > - myContentOutlinePage = new EOModelContentOutlinePage(this);
    > - myContentOutlinePage.addSelectionChangedListener(new
    > EOModelContentSelectionChangedListener());
    > + protected class EOModelSelectionChangedListener implements
    > ISelectionChangedListener {
    > + public void selectionChanged(final SelectionChangedEvent _event) {
    > + IStructuredSelection selection = (IStructuredSelection)
    > _event.getSelection();
    > + setSelection(selection);
    > }
    > - return myContentOutlinePage;
    > }
    >
    > - public EOModel getModel() {
    > - return myModel;
    > - }
    > + protected class FetchSpecsChangeRefresher extends
    > AbstractAddRemoveChangeRefresher<EOFetchSpecification> {
    > + public FetchSpecsChangeRefresher() {
    > + super("FetchSpecsChange");
    > + }
    >
    > - public EOEntity getSelectedEntity() {
    > - return mySelectedEntity;
    > - }
    > + public void changeSelection(final ISelection selection) {
    > + EOModelEditor.this.setSelection(selection);
    > +
    > EOModelEditor
    > .this.setActivePage(getPageNum(EOModelEditor.EOENTITY_PAGE));
    > + }
    >
    > - public String getContributorId() {
    > - return getSite().getId();
    > - }
    > + ..verride
    > + protected void objectsAdded(final List<EOFetchSpecification>
    > _addedObjects) {
    > + // DO NOTHING
    > + }
    >
    > - public Object getAdapter(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);
    > + ..verride
    > + protected void objectsRemoved(final List<EOFetchSpecification>
    > _removedObjects) {
    > + EOModelEditor.this.setSelection(new
    > StructuredSelection(EOModelEditor.this.getModel()));
    > +
    > EOModelEditor
    > .this.setActivePage(getPageNum(EOModelEditor.EOMODEL_PAGE));
    > }
    > - return adapter;
    > }
    >
    > - protected int getPageNum(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;
    > + protected class StoredProceduresChangeRefresher extends
    > AbstractAddRemoveChangeRefresher<EOStoredProcedure> {
    > + public StoredProceduresChangeRefresher() {
    > + super("StoredProceduresChange");
    > }
    > - return pageNum;
    > - }
    >
    > - protected int getPageNum(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;
    > - }
    > + public void changeSelection(final ISelection selection) {
    > + EOModelEditor.this.setSelection(selection);
    > +
    > EOModelEditor
    > .this.setActivePage(getPageNum(EOModelEditor.EOSTOREDPROCEDURE_PAGE));
    > }
    > - return matchingPageNum;
    > +
    > + ..verride
    > + protected void objectsAdded(final List<EOStoredProcedure>
    > _addedObjects) {
    > + // DO NOTHING
    > + }
    > +
    > + ..verride
    > + protected void objectsRemoved(final List<EOStoredProcedure>
    > _removedObjects) {
    > + EOModelEditor.this.setSelection(new
    > StructuredSelection(EOModelEditor.this.getModel()));
    > +
    > EOModelEditor
    > .this.setActivePage(getPageNum(EOModelEditor.EOMODEL_PAGE));
    > + }
    > }
    >
    > - protected void createPages() {
    > - synchronized (myCreatePagesLock) {
    > - try {
    > - myEntitiesTableEditor = new EOEntitiesTableEditor();
    > + public static final String EOMODEL_EDITOR_ID =
    > "org.objectstyle.wolips.eomodeler.editors.EOModelEditor";
    >
    > - addPage(myEntitiesTableEditor, getEditorInput());
    > - setPageText(getPageNum(EOModelEditor.EOMODEL_PAGE),
    > Messages.getString("EOModelEditor.entitiesTab"));
    > + public static final String EOMODEL_PAGE = "eomodel";
    >
    > - myEntityEditor = new EOEntityEditor();
    > + public static final String EOENTITY_PAGE = "eoentity";
    >
    > - EOModelSelectionChangedListener modelSelectionChangedListener =
    > new EOModelSelectionChangedListener();
    > -
    > myEntitiesTableEditor
    > .addSelectionChangedListener(modelSelectionChangedListener);
    > - myEntitiesTableEditor.setModel(myModel);
    > + public static final String EOSTOREDPROCEDURE_PAGE =
    > "eostoredprocedure";
    >
    > - EOEntitySelectionChangedListener entitySelectionChangedListener
    > = new EOEntitySelectionChangedListener();
    > -
    > myEntityEditor
    > .addSelectionChangedListener(entitySelectionChangedListener);
    > + private EOEntitiesTableEditor myEntitiesTableEditor;
    >
    > - myStoredProcedureEditor = new EOArgumentsTableEditor();
    > - EOArgumentSelectionChangedListener
    > argumentSelectionChangedListener = new
    > EOArgumentSelectionChangedListener();
    > -
    > myStoredProcedureEditor
    > .addSelectionChangedListener(argumentSelectionChangedListener);
    > + private EOEntityEditor myEntityEditor;
    >
    > - if (myOpeningEntity != null) {
    > - setSelectedEntity(myOpeningEntity);
    > - setActivePage(getPageNum(EOModelEditor.EOENTITY_PAGE));
    > - }
    > + private EOArgumentsTableEditor myStoredProcedureEditor;
    >
    > - } catch (PartInitException e) {
    > - ErrorDialog.openError(getSite().getShell(), "Error creating
    > editor.", null, e.getStatus());
    > - }
    > - }
    > - }
    > + private EOModelContentOutlinePage myContentOutlinePage;
    >
    > - protected void setEntityPageVisible(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());
    > - }
    > - }
    > + private final ListenerList mySelectionChangedListeners;
    >
    > - protected void setStoredProcedurePageVisible(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());
    > - }
    > - }
    > + private IStructuredSelection mySelection;
    >
    > - public void setSelectedEntity(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);
    > - }
    > - }
    > + private final PropertyChangeListener myDirtyModelListener;
    >
    > - public EOStoredProcedure getSelectedStoredProcedure() {
    > - return mySelectedStoredProcedure;
    > - }
    > + private final EntitiesChangeRefresher myEntitiesChangeListener;
    >
    > - public void setSelectedStoredProcedure(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);
    > - }
    > - }
    > + private final FetchSpecsChangeRefresher myFetchSpecsChangeListener;
    >
    > - public void dispose() {
    > - ResourcesPlugin.getWorkspace().removeResourceChangeListener(this);
    > + private final EntityIndexesChangeRefresher
    > myEntityIndexesChangeListener;
    >
    > - myEntitiesChangeListener.stop();
    > - myStoredProceduresChangeListener.stop();
    > - myDatabaseConfigsChangeListener.stop();
    > - myFetchSpecsChangeListener.stop();
    > - myEntityIndexesChangeListener.stop();
    > + private final StoredProceduresChangeRefresher
    > myStoredProceduresChangeListener;
    >
    > - super.dispose();
    > + private final DatabaseConfigsChangeRefresher
    > myDatabaseConfigsChangeListener;
    >
    > - switchFromEntityModelerPerspective();
    > - }
    > + private final AttributeAndRelationshipDeletedRefresher
    > myAttributeAndRelationshipListener;
    >
    > - public void doSave(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>();
    > + private final ArgumentDeletedRefresher myArgumentListener;
    >
    > - for (EOModel model : myModel.getModelGroup().getModels()) {
    > - if (model.isDirty()) {
    > - 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();
    > - }
    > - }
    > - }
    > + private EOStoredProcedure mySelectedStoredProcedure;
    >
    > - handleModelErrors(failures, false);
    > + private EOEntity mySelectedEntity;
    >
    > - for (EOModel model : myModel.getModelGroup().getModels()) {
    > - if (model.isDirty() && model.canSave()) {
    > - monitor.beginTask("Saving " + model.getName() + " ...",
    > IProgressMonitor.UNKNOWN);
    > - try {
    > - model.save();
    > + private EOEntity myOpeningEntity;
    >
    > - 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);
    > - }
    > - }
    > + private EOModel myModel;
    >
    > - 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;
    > - }
    > + private Set<EOModelVerificationFailure> myLoadFailures;
    >
    > - public void doSaveAs() {
    > - doSave(null);
    > - }
    > + private boolean myEntityPageVisible;
    >
    > - 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();
    > - }
    > - }
    > + 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(IProgressMonitor progressMonitor) {
    > + 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
    > + } 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();
    > + IStorage storage = ((IStorageEditorInput)
    > editorInput).getStorage();
    > Class jarEntryClass = storage.getClass();
    > - IPath jarEntryPath =
    > (IPath)jarEntryClass.getMethod("getFullPath").invoke(storage);
    > + IPath jarEntryPath = (IPath)
    > jarEntryClass.getMethod("getFullPath").invoke(storage);
    > Object root =
    > jarEntryClass.getMethod("getPackageFragmentRoot").invoke(storage);
    > Class packageFragmentRootClass = root.getClass();
    > - IResource jarFile =
    > (IResource
    > )packageFragmentRootClass
    > .getMethod("getUnderlyingResource").invoke(root);
    > - indexURL = new URI("jar:" +
    > jarFile.getLocation().toFile().toURL() + "!" +
    > jarEntryPath.toPortableString());
    > + IPath jarFile = (IPath)
    > packageFragmentRootClass.getMethod("getPath").invoke(root);
    > + indexURL = new URI("jar:" + jarFile.toFile().toURL() + "!" +
    > jarEntryPath.toPortableString());
    > }
    > if (myModel != null) {
    > if (myModel.getModelGroup() != null) {
    >.. -618,19 +540,11 @@
    > }
    > }
    >
    > - public void init(IEditorSite site, IEditorInput editorInput)
    > throws PartInitException {
    > - try {
    > - switchToEntityModelerPerspective();
    > - super.init(site, editorInput);
    > -
    > - LoadEOModelWorkspaceJob loadModelJob = new
    > LoadEOModelWorkspaceJob(this, editorInput);
    > - loadModelJob.schedule();
    > - } catch (WorkbenchException e) {
    > - e.printStackTrace();
    > - }
    > + public void addSelectionChangedListener(final
    > ISelectionChangedListener _listener) {
    > + mySelectionChangedListeners.add(_listener);
    > }
    >
    > - protected int
    > computeFailuresHashCode(Set<EOModelVerificationFailure> failures) {
    > + protected int computeFailuresHashCode(final
    > Set<EOModelVerificationFailure> failures) {
    > StringBuffer sb = new StringBuffer();
    > for (EOModelVerificationFailure failure : failures) {
    > sb.append(failure.getMessage());
    >.. -638,13 +552,229 @@
    > return sb.toString().hashCode();
    > }
    >
    > - protected void handleModelErrors(final
    > Set<EOModelVerificationFailure> failures, boolean forceOpen) {
    > +..verride
    > + 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);
    > +
    > + if (myOpeningEntity != null) {
    > + setSelectedEntity(myOpeningEntity);
    > + setActivePage(getPageNum(EOModelEditor.EOENTITY_PAGE));
    > + }
    > +
    > + } catch (PartInitException e) {
    > + ErrorDialog.openError(getSite().getShell(), "Error creating
    > editor.", null, e.getStatus());
    > + }
    > + }
    > + }
    > +
    > +..verride
    > + public void dispose() {
    > + ResourcesPlugin.getWorkspace().removeResourceChangeListener(this);
    > +
    > + myEntitiesChangeListener.stop();
    > + myStoredProceduresChangeListener.stop();
    > + myDatabaseConfigsChangeListener.stop();
    > + myFetchSpecsChangeListener.stop();
    > + myEntityIndexesChangeListener.stop();
    > +
    > + super.dispose();
    > +
    > + switchFromEntityModelerPerspective();
    > + }
    > +
    > +..verride
    > + 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>();
    > +
    > + for (EOModel model : myModel.getModelGroup().getModels()) {
    > + if (model.isDirty()) {
    > + 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();
    > + }
    > + }
    > + }
    > +
    > + handleModelErrors(failures, false);
    > +
    > + for (EOModel model : myModel.getModelGroup().getModels()) {
    > + if (model.isDirty() && model.canSave()) {
    > + 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);
    > + }
    > + }
    > +
    > +..verride
    > + 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) {
    > + // 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.
    > + getContentOutlinePage().setFocus();
    > + 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);
    > + }
    > + }
    > +
    > +..verride
    > + 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) {
    > 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(IProgressMonitor monitor) throws
    > CoreException {
    > + public void run(final IProgressMonitor monitor) throws
    > CoreException {
    > for (EOModel model :
    > editingModel.getModelGroup().getModels()) {
    > try {
    > IFile indexFile =
    > EclipseFileUtils.getEclipseIndexFile(model);
    >.. -749,26 +879,48 @@
    > }
    > }
    >
    > - protected void updatePartName() {
    > - String partName;
    > +..verride
    > + 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();
    > + }
    > + }
    > +
    > +..verride
    > + public boolean isDirty() {
    > + boolean dirty = false;
    > if (myModel != null) {
    > - partName = myModel.getName();
    > - } else {
    > - partName = Messages.getString("EOModelEditor.partName");
    > + if (myModel.isDirty()) {
    > + dirty = true;
    > + } else if (myModel.getModelGroup() != null) {
    > + dirty = myModel.getModelGroup().isDirty();
    > + }
    > }
    > - setPartName(partName);
    > + return dirty;
    > }
    >
    > +..verride
    > public boolean isSaveAsAllowed() {
    > return false;
    > }
    >
    > - protected void pageChange(int _newPageIndex) {
    > +..verride
    > + 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();
    >.. -787,33 +939,138 @@
    > }
    > }
    >
    > - public EOEntitiesTableEditor getEntitiesTableEditor() {
    > - return myEntitiesTableEditor;
    > + 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();
    > + }
    > + }
    > }
    >
    > - public EOEntityEditor getEntityEditor() {
    > - return myEntityEditor;
    > +..verride
    > + public void setActivePage(final int _pageIndex) {
    > + if (_pageIndex != getActivePage()) {
    > + super.setActivePage(_pageIndex);
    > + }
    > }
    >
    > - public EOArgumentsTableEditor getStoredProcedureEditor() {
    > - return myStoredProcedureEditor;
    > + 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());
    > + }
    > }
    >
    > - public void setActivePage(int _pageIndex) {
    > - if (_pageIndex != getActivePage()) {
    > - super.setActivePage(_pageIndex);
    > +..verride
    > + 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 ISelection getSelection() {
    > - return mySelection;
    > + 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 setSelection(ISelection _selection) {
    > + 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(ISelection _selection,
    > boolean _updateOutline) {
    > + 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
    >.. -886,21 +1143,35 @@
    > }
    > }
    >
    > - public void addSelectionChangedListener(ISelectionChangedListener
    > _listener) {
    > - mySelectionChangedListeners.add(_listener);
    > + 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());
    > + }
    > }
    >
    > - public void
    > removeSelectionChangedListener(ISelectionChangedListener _listener) {
    > - mySelectionChangedListeners.remove(_listener);
    > - }
    > -
    > /**
    > * 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,
    > + // 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)) {
    >.. -916,7 +1187,8 @@
    > }
    > }
    >
    > - // MS: If the window didn't need to close, then we want to switch
    > perspectives on your current
    > + // 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 {
    >.. -965,255 +1237,13 @@
    > }
    > }
    >
    > - 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();
    > - }
    > + protected void updatePartName() {
    > + String partName;
    > + if (myModel != null) {
    > + partName = myModel.getName();
    > + } else {
    > + partName = Messages.getString("EOModelEditor.partName");
    > }
    > + setPartName(partName);
    > }
    > -
    > - protected void fireSelectionChanged(ISelection _selection) {
    > - // 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.
    > - getContentOutlinePage().setFocus();
    > - 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);
    > - }
    > - }
    > -
    > - protected void editorDirtyStateChanged() {
    > - firePropertyChange(IEditorPart.PROP_DIRTY);
    > - }
    > -
    > - protected void doubleClickedObjectInOutline(Object _obj) {
    > - if (_obj instanceof EOEntity) {
    > - setActivePage(getPageNum(EOModelEditor.EOENTITY_PAGE));
    > - } else if (_obj instanceof EOStoredProcedure) {
    > - setActivePage(getPageNum(EOModelEditor.EOSTOREDPROCEDURE_PAGE));
    > - }
    > - }
    > -
    > - protected class EOModelContentSelectionChangedListener implements
    > ISelectionChangedListener {
    > - private Object mySelectedObject;
    > -
    > - public void selectionChanged(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 EOModelSelectionChangedListener implements
    > ISelectionChangedListener {
    > - public void selectionChanged(SelectionChangedEvent _event) {
    > - IStructuredSelection selection = (IStructuredSelection)
    > _event.getSelection();
    > - setSelection(selection);
    > - }
    > - }
    > -
    > - protected class EOEntitySelectionChangedListener implements
    > ISelectionChangedListener {
    > - public void selectionChanged(SelectionChangedEvent _event) {
    > - IStructuredSelection selection = (IStructuredSelection)
    > _event.getSelection();
    > - setSelection(selection);
    > - }
    > - }
    > -
    > - protected class EOArgumentSelectionChangedListener implements
    > ISelectionChangedListener {
    > - public void selectionChanged(SelectionChangedEvent _event) {
    > - IStructuredSelection selection = (IStructuredSelection)
    > _event.getSelection();
    > - setSelection(selection);
    > - }
    > - }
    > -
    > - protected class DirtyModelListener implements
    > PropertyChangeListener {
    > - public void propertyChange(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(ISelection selection) {
    > - EOModelEditor.this.setSelection(selection);
    > -
    > EOModelEditor
    > .this.setActivePage(getPageNum(EOModelEditor.EOENTITY_PAGE));
    > - }
    > -
    > - protected void objectsAdded(List<EOEntity> _addedObjects) {
    > - // DO NOTHING
    > - }
    > -
    > - protected void objectsRemoved(List<EOEntity> _removedObjects) {
    > - EOModelEditor.this.setSelection(new
    > StructuredSelection(EOModelEditor.this.getModel()));
    > -
    > EOModelEditor
    > .this.setActivePage(getPageNum(EOModelEditor.EOMODEL_PAGE));
    > - }
    > - }
    > -
    > - protected class FetchSpecsChangeRefresher extends
    > AbstractAddRemoveChangeRefresher<EOFetchSpecification> {
    > - public FetchSpecsChangeRefresher() {
    > - super("FetchSpecsChange");
    > - }
    > -
    > - public void changeSelection(ISelection selection) {
    > - EOModelEditor.this.setSelection(selection);
    > -
    > EOModelEditor
    > .this.setActivePage(getPageNum(EOModelEditor.EOENTITY_PAGE));
    > - }
    > -
    > - protected void objectsAdded(List<EOFetchSpecification>
    > _addedObjects) {
    > - // DO NOTHING
    > - }
    > -
    > - protected void objectsRemoved(List<EOFetchSpecification>
    > _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(ISelection selection) {
    > - EOModelEditor.this.setSelection(selection);
    > -
    > EOModelEditor
    > .this.setActivePage(getPageNum(EOModelEditor.EOENTITY_PAGE));
    > - }
    > -
    > - protected void objectsAdded(List<EOEntityIndex> _addedObjects) {
    > - // DO NOTHING
    > - }
    > -
    > - protected void objectsRemoved(List<EOEntityIndex>
    > _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(ISelection selection) {
    > - EOModelEditor.this.setSelection(selection);
    > -
    > EOModelEditor
    > .this.setActivePage(getPageNum(EOModelEditor.EOSTOREDPROCEDURE_PAGE));
    > - }
    > -
    > - protected void objectsAdded(List<EOStoredProcedure>
    > _addedObjects) {
    > - // DO NOTHING
    > - }
    > -
    > - protected void objectsRemoved(List<EOStoredProcedure>
    > _removedObjects) {
    > - EOModelEditor.this.setSelection(new
    > StructuredSelection(EOModelEditor.this.getModel()));
    > -
    > EOModelEditor
    > .this.setActivePage(getPageNum(EOModelEditor.EOMODEL_PAGE));
    > - }
    > - }
    > -
    > - protected class DatabaseConfigsChangeRefresher extends
    > AbstractAddRemoveChangeRefresher<EODatabaseConfig> {
    > - public DatabaseConfigsChangeRefresher() {
    > - super("DatabaseConfigsChange");
    > - }
    > -
    > - public void changeSelection(ISelection selection) {
    > - EOModelEditor.this.setSelection(selection);
    > - }
    > -
    > - protected void objectsAdded(List<EODatabaseConfig> _addedObjects) {
    > - // DO NOTHING
    > - }
    > -
    > - protected void objectsRemoved(List<EODatabaseConfig>
    > _removedObjects) {
    > - EOModelEditor.this.setSelection(new
    > StructuredSelection(EOModelEditor.this.getModel()));
    > -
    > EOModelEditor
    > .this.setActivePage(getPageNum(EOModelEditor.EOMODEL_PAGE));
    > - }
    > - }
    > -
    > - protected class ArgumentDeletedRefresher extends
    > AbstractAddRemoveChangeRefresher<EOArgument> {
    > - public ArgumentDeletedRefresher() {
    > - super("ArgumentDeleted");
    > - }
    > -
    > - public void changeSelection(ISelection selection) {
    > - EOModelEditor.this.setSelection(selection);
    > - }
    > -
    > - protected void objectsAdded(List<EOArgument> _addedObjects) {
    > - // DO NOTHING
    > - }
    > -
    > - protected void objectsRemoved(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(ISelection selection) {
    > - EOModelEditor.this.setSelection(selection);
    > - }
    > -
    > - protected void objectsAdded(List<IEOAttribute> _addedObjects) {
    > - // DO NOTHING
    > - }
    > -
    > - protected void objectsRemoved(List<IEOAttribute> _removedObjects) {
    > - EOModelEditor.this.setSelection(new
    > StructuredSelection(EOModelEditor.this.getSelectedEntity()));
    > -
    > EOModelEditor
    > .this.setActivePage(getPageNum(EOModelEditor.EOENTITY_PAGE));
    > - }
    > - }
    > }
    > \ No newline at end of file
    >



    This archive was generated by hypermail 2.0.0 : Wed Jan 28 2009 - 09:45:15 EST