/*
* ====================================================================
*
* 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.HashSet;
import java.util.Set;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IMenuListener;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.viewers.ColumnViewerEditor;
import org.eclipse.jface.viewers.ColumnViewerEditorActivationEvent;
import org.eclipse.jface.viewers.ColumnViewerEditorActivationStrategy;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.TreeViewerColumn;
import org.eclipse.jface.viewers.TreeViewerEditor;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.IWorkbenchActionConstants;
import org.eclipse.ui.part.IPageSite;
import org.eclipse.ui.views.contentoutline.ContentOutlinePage;
import org.objectstyle.wolips.eomodeler.Activator;
import org.objectstyle.wolips.eomodeler.core.model.EOModel;
import org.objectstyle.wolips.eomodeler.editors.EOModelClipboardHandler;
import org.objectstyle.wolips.eomodeler.editors.EOModelEditor;
public class EOModelContentOutlinePage extends ContentOutlinePage implements PropertyChangeListener {
private EOModelTreeViewUpdater _updater;
private EOModelEditor _editor;
private EOModelClipboardHandler _clipboardHandler;
private ToggleNonClassPropertiesAction _toggleNonClassPropertiesAction;
private ToggleModelGroupAction _toggleModelGroupAction;
private Menu _contextMenu;
private boolean _selectedWithOutline;
public EOModelContentOutlinePage(EOModelEditor editor) {
_selectedWithOutline = true;
_clipboardHandler = new EOModelClipboardHandler();
_editor = editor;
}
protected void updateClipboardHandler() {
IPageSite site = getSite();
if (site != null && _editor != null) {
IActionBars actionBars = site.getActionBars();
_clipboardHandler.attach(actionBars, _editor);
}
}
public void createControl(Composite parent) {
super.createControl(parent);
TreeViewer treeViewer = getTreeViewer();
//TreeColumnLayout outlineTreeLayout = new TreeColumnLayout();
//_treeComposite.setLayout(outlineTreeLayout);
final TreeViewerColumn column = new TreeViewerColumn(treeViewer, SWT.NONE);
column.setLabelProvider(new EOModelOutlineColumnLabelProvider(treeViewer));
column.setEditingSupport(new EOModelOutlineEditingSupport(treeViewer));
column.getColumn().setWidth(400);
//outlineTreeLayout.setColumnData(column.getColumn(), new ColumnWeightData(100, true));
ColumnViewerEditorActivationStrategy strategy = new ColumnViewerEditorActivationStrategy(treeViewer) {
@Override
protected boolean isEditorActivationEvent(ColumnViewerEditorActivationEvent event) {
return event.eventType == ColumnViewerEditorActivationEvent.MOUSE_DOUBLE_CLICK_SELECTION;
}
};
TreeViewerEditor.create(treeViewer, null, strategy, ColumnViewerEditor.DEFAULT);
/*
parent.addControlListener(new ControlAdapter() {
@Override
public void controlResized(ControlEvent e) {
super.controlResized(e);
Composite widget = (Composite)e.getSource();
column.getColumn().setWidth(widget.getSize().x);
System.out.println(".controlResized: " + widget.getSize());
}
});
*/
if (_updater != null) {
_updater.dispose();
}
_updater = new EOModelTreeViewUpdater(treeViewer, new EOModelOutlineContentProvider(true, true, true, true, true, true, true, true));
_updater.setModel(_editor.getModel());
updateClipboardHandler();
// AK: commenting prevents an error in swt
// setFocus();
IActionBars actionBars = getSite().getActionBars();
IToolBarManager toolBarManager = actionBars.getToolBarManager();
_toggleNonClassPropertiesAction = new ToggleNonClassPropertiesAction();
toolBarManager.add(_toggleNonClassPropertiesAction);
_toggleModelGroupAction = new ToggleModelGroupAction();
toolBarManager.add(_toggleModelGroupAction);
MenuManager menuManager = new MenuManager();
menuManager.setRemoveAllWhenShown(true);
menuManager.addMenuListener(new IMenuListener() {
public void menuAboutToShow(IMenuManager m) {
m.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
}
});
Tree tree = treeViewer.getTree();
_contextMenu = menuManager.createContextMenu(treeViewer.getTree());
tree.setMenu(_contextMenu);
getSite().registerContextMenu("org.objectstyle.wolips.eomodeler.outline", menuManager, treeViewer);
if (_editor.getModel() == null) {
treeViewer.setInput(new EOModelLoading(null));
treeViewer.expandAll();
}
}
@SuppressWarnings("unchecked")
public void propertyChange(PropertyChangeEvent evt) {
TreeViewer treeViewer = getTreeViewer();
if (treeViewer != null) {
Set<EOModel> oldModels = (Set<EOModel>) evt.getOldValue();
Set<EOModel> newModels = new HashSet<EOModel>((Set<EOModel>) evt.getNewValue());
newModels.removeAll(oldModels);
if (newModels.size() == 1) {
EOModel newModel = newModels.iterator().next();
Object input = treeViewer.getInput();
if (input instanceof EOModelLoading) {
((EOModelLoading) input).setModel(newModel);
}
Display.getDefault().asyncExec(new Runnable() {
public void run() {
getTreeViewer().refresh(getTreeViewer().getInput());
getTreeViewer().expandAll();
}
});
}
}
}
@Override
public void dispose() {
if (_contextMenu != null && !_contextMenu.isDisposed()) {
_contextMenu.dispose();
_contextMenu = null;
}
if (_updater != null) {
_updater.dispose();
}
super.dispose();
}
public void init(IPageSite pageSite) {
super.init(pageSite);
updateClipboardHandler();
}
public boolean isSelectedWithOutline() {
return _selectedWithOutline;
}
@Override
protected void fireSelectionChanged(ISelection selection) {
super.fireSelectionChanged(selection);
}
public void selectionChanged(SelectionChangedEvent event) {
super.selectionChanged(event);
_clipboardHandler.selectionChanged(event);
}
public void setSelection(ISelection selection) {
_selectedWithOutline = false;
try {
super.setSelection(selection);
} finally {
_selectedWithOutline = true;
}
}
public EOModelTreeViewUpdater getUpdater() {
return _updater;
}
public void showModelGroup() {
_toggleModelGroupAction.showModelGroup();
}
public void showModel() {
_toggleModelGroupAction.showModel();
}
public class ToggleModelGroupAction extends Action {
private boolean _showModel;
public ToggleModelGroupAction() {
_showModel = true;
refreshUI();
setImageDescriptor(Activator.getDefault().getImageRegistry().getDescriptor(Activator.EOMODEL_ICON));
}
public void toggleChanged() {
_showModel = !_showModel;
refreshUI();
}
public void showModelGroup() {
_showModel = false;
refreshUI();
}
public void showModel() {
_showModel = true;
refreshUI();
}
public void refreshUI() {
if (_showModel) {
getUpdater().showModel();
setToolTipText("Show ModelGroup");
setChecked(false);
} else {
getUpdater().showModelGroup();
setToolTipText("Show Model");
setChecked(true);
}
}
@Override
public void run() {
toggleChanged();
}
}
public class ToggleNonClassPropertiesAction extends Action {
private boolean _showNonClassProperties;
public ToggleNonClassPropertiesAction() {
_showNonClassProperties = true;
refreshUI();
setImageDescriptor(Activator.getDefault().getImageRegistry().getDescriptor(Activator.CLASS_PROPERTY_ICON));
}
public void toggleChanged() {
_showNonClassProperties = !_showNonClassProperties;
refreshUI();
}
public void refreshUI() {
if (_showNonClassProperties) {
getUpdater().showNonClassProperties();
setToolTipText("Hide Non-Class Properties");
setChecked(true);
} else {
getUpdater().hideNonClassProperties();
setToolTipText("Show Non-Class Properties");
setChecked(false);
}
}
@Override
public void run() {
toggleChanged();
}
}
}