org.objectstyle.wolips.eomodeler.outline.EOModelTreeViewUpdater.java Source code

Java tutorial

Introduction

Here is the source code for org.objectstyle.wolips.eomodeler.outline.EOModelTreeViewUpdater.java

Source

/*
 * ====================================================================
 * 
 * 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.outline;

import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;

import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TreeViewer;
import org.objectstyle.wolips.eomodeler.core.model.EOEntity;
import org.objectstyle.wolips.eomodeler.core.model.EOModel;
import org.objectstyle.wolips.eomodeler.core.model.EOModelContainer;
import org.objectstyle.wolips.eomodeler.core.model.EORelationshipPath;
import org.objectstyle.wolips.eomodeler.core.model.EOStoredProcedure;

public class EOModelTreeViewUpdater {
    private TreeViewer _treeViewer;

    private EOModelOutlineContentProvider _contentProvider;

    private ModelPropertyChangeListener _modelListener;

    private EntityPropertyChangeListener _entityListener;

    private StoredProcedurePropertyChangeListener _storedProcedureListener;

    private EOModel _model;

    private List<EOEntity> _entities;

    private List<EOStoredProcedure> _storedProcedures;

    private boolean _shouldRefresh;

    public EOModelTreeViewUpdater(TreeViewer treeViewer, EOModelOutlineContentProvider contentProvider) {
        _treeViewer = treeViewer;
        _contentProvider = contentProvider;
        _treeViewer.setContentProvider(contentProvider);
        _treeViewer.setLabelProvider(new EOModelOutlineLabelProvider(_treeViewer));
        _treeViewer.setSorter(new EOModelOutlineViewerSorter());
        _modelListener = new ModelPropertyChangeListener();
        _entityListener = new EntityPropertyChangeListener();
        _storedProcedureListener = new StoredProcedurePropertyChangeListener();
        _shouldRefresh = true;
    }

    public void setModel(EOModel model) {
        removePropertyChangeListeners();
        _model = model;
        addPropertyChangeListeners();
        if (_treeViewer != null) {
            setInput();
        }
    }

    public void showModelGroup() {
        if (_model != null) {
            _treeViewer.setInput(_model.getModelGroup());
            _treeViewer.expandToLevel(_model, 1);
            _treeViewer.setSelection(new StructuredSelection(_model));
        }
    }

    public void showModel() {
        if (_model != null) {
            EOModelContainer container = new EOModelContainer(_model);
            _treeViewer.setInput(container);
            _treeViewer.expandToLevel(_model, 1);
            _treeViewer.setSelection(new StructuredSelection(_model));
        }
    }

    public void showNonClassProperties() {
        if (_treeViewer != null && _contentProvider != null && !_contentProvider.isShowNonClassProperties()) {
            _contentProvider.setShowNonClassProperties(true);
            _treeViewer.refresh(true);
        }
    }

    public void hideNonClassProperties() {
        if (_treeViewer != null && _contentProvider != null && _contentProvider.isShowNonClassProperties()) {
            _contentProvider.setShowNonClassProperties(false);
            _treeViewer.refresh(true);
        }
    }

    protected void setInput() {
        showModel();
    }

    protected void refreshPropertyChangeListeners() {
        removePropertyChangeListeners();
        addPropertyChangeListeners();
    }

    public EOModel getModel() {
        return _model;
    }

    public void dispose() {
        removePropertyChangeListeners();
    }

    protected TreeViewer getTreeViewer() {
        return _treeViewer;
    }

    protected void removePropertyChangeListeners() {
        if (_model != null) {
            _model.removePropertyChangeListener(_modelListener);
            for (EOModel model : _model.getModelGroup().getModels()) {
                model.removePropertyChangeListener(_modelListener);
                if (_entities != null) {
                    Iterator oldEntitiesIter = _entities.iterator();
                    while (oldEntitiesIter.hasNext()) {
                        EOEntity entity = (EOEntity) oldEntitiesIter.next();
                        entity.removePropertyChangeListener(_entityListener);
                    }
                }
                if (_storedProcedures != null) {
                    Iterator oldStoredProceduresIter = _storedProcedures.iterator();
                    while (oldStoredProceduresIter.hasNext()) {
                        EOStoredProcedure storedProcedure = (EOStoredProcedure) oldStoredProceduresIter.next();
                        storedProcedure.removePropertyChangeListener(_storedProcedureListener);
                    }
                }
            }
        }
    }

    protected void addPropertyChangeListeners() {
        if (_model != null) {
            for (EOModel model : _model.getModelGroup().getModels()) {
                _entities = new LinkedList<EOEntity>(model.getEntities());
                _storedProcedures = new LinkedList<EOStoredProcedure>(model.getStoredProcedures());

                if (_storedProcedures != null) {
                    Iterator oldStoredProceduresIter = _storedProcedures.iterator();
                    while (oldStoredProceduresIter.hasNext()) {
                        EOStoredProcedure storedProcedure = (EOStoredProcedure) oldStoredProceduresIter.next();
                        storedProcedure.addPropertyChangeListener(_storedProcedureListener);
                    }
                }

                Iterator newEntitiesIter = _entities.iterator();
                while (newEntitiesIter.hasNext()) {
                    EOEntity entity = (EOEntity) newEntitiesIter.next();
                    entity.addPropertyChangeListener(_entityListener);
                }
                model.addPropertyChangeListener(_modelListener);
            }
        }
    }

    protected void refreshRelationshipsForEntity(EOEntity entity) {
        TreeViewer treeViewer = getTreeViewer();
        if (treeViewer != null) {
            treeViewer.refresh(entity, true);
            Object[] expandedElements = treeViewer.getExpandedElements();
            for (int expandedElementNum = 0; expandedElementNum < expandedElements.length; expandedElementNum++) {
                if (expandedElements[expandedElementNum] instanceof EORelationshipPath) {
                    EORelationshipPath relationshipPath = (EORelationshipPath) expandedElements[expandedElementNum];
                    if (relationshipPath.getChildRelationship().getEntity().equals(entity)) {
                        treeViewer.refresh(relationshipPath, true);
                    }
                }
            }
        }
    }

    protected void refresh() {
        if (_shouldRefresh) {
            TreeViewer treeViewer = getTreeViewer();
            treeViewer.refresh(true);
        }
    }

    protected class ModelPropertyChangeListener implements PropertyChangeListener {
        public void propertyChange(PropertyChangeEvent event) {
            TreeViewer treeViewer = getTreeViewer();
            if (treeViewer != null && !treeViewer.getTree().isDisposed()) {
                String changedPropertyName = event.getPropertyName();
                if (EOModel.MODEL_SAVING.equals(changedPropertyName)) {
                    Boolean saving = (Boolean) event.getNewValue();
                    _shouldRefresh = !saving.booleanValue();
                    refresh();
                } else if (EOModel.ENTITIES.equals(changedPropertyName)
                        || EOModel.STORED_PROCEDURES.equals(changedPropertyName)
                        || EOModel.DATABASE_CONFIGS.equals(changedPropertyName)
                        || EOModel.DATABASE_CONFIG.equals(changedPropertyName)) {
                    // getTreeViewer().refresh(true);
                    refresh();
                    refreshPropertyChangeListeners();
                } else if (EOModel.ACTIVE_DATABASE_CONFIG.equals(changedPropertyName)) {
                    refresh();
                } else if (EOModel.DIRTY.equals(changedPropertyName)) {
                    refresh();
                }
            }
        }
    }

    protected class StoredProcedurePropertyChangeListener implements PropertyChangeListener {
        public void propertyChange(PropertyChangeEvent event) {
            TreeViewer treeViewer = EOModelTreeViewUpdater.this.getTreeViewer();
            if (treeViewer != null && !treeViewer.getTree().isDisposed()) {
                String changedPropertyName = event.getPropertyName();
                if (EOStoredProcedure.NAME.equals(changedPropertyName)) {
                    refresh();
                } else if (EOStoredProcedure.ARGUMENTS.equals(changedPropertyName)) {
                    refresh();
                } else if (EOStoredProcedure.ARGUMENT.equals(changedPropertyName)) {
                    refresh();
                }
            }
        }
    }

    protected class EntityPropertyChangeListener implements PropertyChangeListener {
        public void propertyChange(PropertyChangeEvent event) {
            TreeViewer treeViewer = EOModelTreeViewUpdater.this.getTreeViewer();
            if (treeViewer != null && !treeViewer.getTree().isDisposed()) {
                String changedPropertyName = event.getPropertyName();
                if (EOEntity.NAME.equals(changedPropertyName)) {
                    refresh();
                } else if (EOEntity.FETCH_SPECIFICATIONS.equals(changedPropertyName)) {
                    refresh();
                } else if (EOEntity.FETCH_SPECIFICATION.equals(changedPropertyName)) {
                    refresh();
                } else if (EOEntity.ATTRIBUTES.equals(changedPropertyName)) {
                    refresh();
                } else if (EOEntity.ATTRIBUTE.equals(changedPropertyName)) {
                    refresh();
                } else if (EOEntity.RELATIONSHIPS.equals(changedPropertyName)) {
                    EOEntity entity = (EOEntity) event.getSource();
                    EOModelTreeViewUpdater.this.refreshRelationshipsForEntity(entity);
                } else if (EOEntity.RELATIONSHIP.equals(changedPropertyName)) {
                    EOEntity entity = (EOEntity) event.getSource();
                    EOModelTreeViewUpdater.this.refreshRelationshipsForEntity(entity);
                } else if (EOEntity.ENTITY_INDEX.equals(changedPropertyName)) {
                    refresh();
                } else if (EOEntity.ENTITY_INDEXES.equals(changedPropertyName)) {
                    refresh();
                }
            }
        }
    }
}