/*******************************************************************************
* Copyright (c) 2007 Exadel, Inc. and Red Hat, Inc.
* Distributed under license by Red Hat, Inc. All rights reserved.
* This program is made available under the terms of the
* Eclipse Public License v1.0 which accompanies this distribution,
* and is available at http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Exadel, Inc. and Red Hat, Inc. - initial API and implementation
******************************************************************************/
package org.jboss.tools.common.model.ui.outline;
import java.util.ArrayList;
import org.eclipse.swt.widgets.*;
import org.jboss.tools.common.model.*;
import org.jboss.tools.common.model.util.*;
import org.eclipse.ui.ISelectionListener;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.part.IPageSite;
import org.eclipse.ui.part.ViewPart;
import org.eclipse.ui.views.contentoutline.*;
import org.jboss.tools.common.model.ui.dnd.ControlDragDrop;
import org.jboss.tools.common.model.ui.navigator.*;
import org.jboss.tools.common.model.ui.select.XModelObjectSelectionProvider;
import org.eclipse.jface.viewers.*;
public class XModelObjectContentOutlineProvider extends ContentOutlinePage {
XModel model;
XModelObjectCache cache;
java.util.List<XFilteredTreeConstraint> filters = new ArrayList<XFilteredTreeConstraint>();
OutlineContentProvider content = new OutlineContentProvider();
TreeViewerMenuInvoker menu = new OutlineMenuInvoker();
TreeViewerModelListenerImpl listener = new TreeViewerModelListenerImpl();
XModelTreeListenerSWTSync syncListener = new XModelTreeListenerSWTSync(listener);
private TreeDragDropProvider dndProvider = new TreeDragDropProvider();
private ControlDragDrop dnd = new ControlDragDrop();
private XModelObjectSelectionProvider selectionProvider = new XModelObjectSelectionProvider();
private NavigatorStatusLineProvider statusLineProvider = new NavigatorStatusLineProvider();
public void init(IPageSite pageSite) {
super.init(pageSite);
getSite().getWorkbenchWindow().getSelectionService().addPostSelectionListener(getSelectionListener());
}
public void dispose() {
super.dispose();
model.removeModelTreeListener(syncListener);
if (syncListener!=null) syncListener.dispose();
syncListener = null;
listener = null;
if (content!=null) content.dispose();
content = null;
if (selectionProvider!=null) selectionProvider.dispose();
selectionProvider = new XModelObjectSelectionProvider();
if(getSite() == null) return;
getSite().getWorkbenchWindow().getSelectionService().removePostSelectionListener(getSelectionListener());
}
public void setCache(XModelObjectCache cache) {
this.cache = cache;
model = cache.getObject().getModel();
}
public void createControl(Composite parent) {
super.createControl(parent);
content = new OutlineContentProvider();
for (XFilteredTreeConstraint filter: filters) {
content.addFilter(filter);
}
content.setRoot(cache);
selectionProvider.addHost("tree", getTreeViewer(), true); //$NON-NLS-1$
getSite().setSelectionProvider(selectionProvider);
getTreeViewer().setContentProvider(content);
getTreeViewer().setInput(cache);
getTreeViewer().setLabelProvider(new NavigatorLabelProvider());
menu.setViewer(getTreeViewer());
if(!content.isProjectEnabled) {
getTreeViewer().getTree().addMouseListener(menu);
getTreeViewer().getTree().addKeyListener(menu);
}
listener = new TreeViewerModelListenerImpl();
syncListener = new XModelTreeListenerSWTSync(listener);
listener.setViewer(getTreeViewer());
model.addModelTreeListener(syncListener);
dnd.setProvider(dndProvider);
dndProvider.setTree(getTreeViewer().getTree());
if(!content.isProjectEnabled) {
dnd.enable();
} else {
dnd.enableDrag();
}
initListeners(getTreeViewer());
getTreeViewer().setExpandedState(cache.getObject(), true);
}
public void addFilter(XFilteredTreeConstraint filter) {
filters.add(filter);
}
protected void initListeners(TreeViewer viewer) {
viewer.addSelectionChangedListener(new ISelectionChangedListener() {
public void selectionChanged(SelectionChangedEvent event) {
handleSelectionChanged(event);
}
});
}
protected void handleSelectionChanged(SelectionChangedEvent event) {
IStructuredSelection sel = (IStructuredSelection) event.getSelection();
updateStatusLine(sel);
}
protected void updateStatusLine(IStructuredSelection selection) {
String msg = statusLineProvider.getStatusLineMessage(selection);
getSite().getActionBars().getStatusLineManager().setMessage(msg);
}
public TreeViewerMenuInvoker getOutlineMenuInvoker() {
return menu;
}
/* (non-Javadoc)
* @see org.eclipse.ui.views.contentoutline.ContentOutlinePage#getTreeViewer()
*/
public TreeViewer getTreeViewer() {
// TODO Auto-generated method stub
return super.getTreeViewer();
}
//ds Opportunity of disabling dnd in outline is added.
public void disableDnd() {
dnd.setProvider(null);
}
//endds
private ISelectionListener fSelectionListener = null;
private ISelectionListener getSelectionListener() {
if (fSelectionListener == null) {
fSelectionListener = new PostSelectionServiceListener();
}
return fSelectionListener;
}
private class PostSelectionServiceListener implements ISelectionListener {
public void selectionChanged(IWorkbenchPart part, ISelection selection) {
if (getControl() != null && !getControl().isDisposed() && !getControl().isFocusControl() && !selectionProvider.isFiringSelection()) {
if(part instanceof ViewPart) {
//WebProjectsNavigator
return;
}
ISelection validContentSelection = mapSelection(getTreeViewer(), selection);
// Why this refresh was needed? It deteriorates performance.
// If some problems with selection in outline appear,
// they should be treated in a different way than
// completely refresh the viewer at each selection change.
// getTreeViewer().refresh(true);
boolean isLinked = true; ///getConfiguration().isLinkedWithEditor(getTreeViewer());
if (isLinked) {
getTreeViewer().setSelection(validContentSelection, true);
}
}
}
}
private ISelection mapSelection(TreeViewer viewer, ISelection selection) {
return selection;
}
}