package org.archstudio.eclipse.ui.views;
import org.archstudio.bna.ui.utils.AbstractBNAUI;
import org.archstudio.eclipse.ui.IFocusEditorListener;
import org.archstudio.resources.IResources;
import org.archstudio.swtutils.IMenuFiller;
import org.archstudio.swtutils.SWTWidgetUtils;
import org.archstudio.xarchadt.IXArchADT;
import org.archstudio.xarchadt.ObjRef;
import org.eclipse.core.commands.operations.IUndoContext;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.IKeyBindingService;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.IWorkbenchPartSite;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.operations.UndoRedoActionGroup;
import org.eclipse.ui.part.IPageSite;
import org.eclipse.ui.views.contentoutline.ContentOutlinePage;
@SuppressWarnings("deprecation")
public abstract class AbstractArchStudioOutlinePage extends ContentOutlinePage implements IFocusEditorListener {
protected IXArchADT xarch;
protected IResources resources = null;
protected ObjRef documentRootRef = null;
protected boolean hasPulldownMenu = false;
protected boolean hasContextMenu = false;
public AbstractArchStudioOutlinePage(IXArchADT xarch, ObjRef documentRootRef, IResources resources,
boolean hasPulldownMenu, boolean hasContextMenu) {
this.xarch = xarch;
this.documentRootRef = documentRootRef;
this.resources = resources;
this.hasPulldownMenu = hasPulldownMenu;
this.hasContextMenu = hasContextMenu;
}
@Override
public void setActionBars(IActionBars actionBars) {
super.setActionBars(actionBars);
// enable undo/redo
IUndoContext undoContext = PlatformUI.getWorkbench().getOperationSupport().getUndoContext();
UndoRedoActionGroup undoRedo = new UndoRedoActionGroup(new IWorkbenchPartSite() {
@Override
public IWorkbenchPage getPage() {
return getSite().getPage();
}
@Override
public ISelectionProvider getSelectionProvider() {
throw new UnsupportedOperationException();
}
@Override
public Shell getShell() {
throw new UnsupportedOperationException();
}
@Override
public IWorkbenchWindow getWorkbenchWindow() {
return getSite().getWorkbenchWindow();
}
@Override
public void setSelectionProvider(ISelectionProvider provider) {
throw new UnsupportedOperationException();
}
@Override
@SuppressWarnings("all")
public Object getAdapter(Class adapter) {
throw new UnsupportedOperationException();
}
@Override
@SuppressWarnings("all")
public Object getService(Class api) {
throw new UnsupportedOperationException();
}
@Override
@SuppressWarnings("rawtypes")
public boolean hasService(Class api) {
throw new UnsupportedOperationException();
}
@Override
public String getId() {
throw new UnsupportedOperationException();
}
@Override
public String getPluginId() {
throw new UnsupportedOperationException();
}
@Override
public String getRegisteredName() {
throw new UnsupportedOperationException();
}
@Override
public void registerContextMenu(String menuId, MenuManager menuManager,
ISelectionProvider selectionProvider) {
throw new UnsupportedOperationException();
}
@Override
public void registerContextMenu(MenuManager menuManager, ISelectionProvider selectionProvider) {
throw new UnsupportedOperationException();
}
@Override
public IKeyBindingService getKeyBindingService() {
throw new UnsupportedOperationException();
}
@Override
public IWorkbenchPart getPart() {
return getSite().getPage().getActivePart();
}
}, undoContext, true);
undoRedo.fillActionBars(actionBars);
actionBars.updateActionBars();
}
@Override
public void init(IPageSite pageSite) {
super.init(pageSite);
}
@Override
public void createControl(Composite parent) {
super.createControl(parent);
if (documentRootRef == null) {
return;
}
TreeViewer viewer = getTreeViewer();
viewer.setContentProvider(createViewContentProvider());
viewer.setLabelProvider(createViewLabelProvider());
// viewer.addSelectionChangedListener(this);
viewer.setInput(getSite());
// Do Pulldown Menu
if (hasPulldownMenu) {
IMenuManager menu = getSite().getActionBars().getMenuManager();
IAction[] actions = createPulldownMenuItems();
for (IAction action : actions) {
menu.add(action);
}
}
// Do Context Menu
if (hasContextMenu) {
SWTWidgetUtils.setupContextMenu("#PopupMenu", getTreeViewer().getControl(), getSite(), new IMenuFiller() {
@Override
public void fillMenu(IMenuManager m) {
AbstractBNAUI.addMenuSeparators(m);
fillContextMenu(m);
}
});
}
}
protected abstract ITreeContentProvider createViewContentProvider();
protected abstract ILabelProvider createViewLabelProvider();
protected IAction[] createPulldownMenuItems() {
return new IAction[0];
}
protected void fillContextMenu(IMenuManager m) {
}
public void updateOutlinePage() {
if (getTreeViewer() == null) {
return;
}
if (getTreeViewer().getTree() == null) {
return;
}
if (getTreeViewer().getTree().isDisposed()) {
return;
}
Object[] expandedElements = getTreeViewer().getExpandedElements();
getTreeViewer().refresh(true);
getTreeViewer().setExpandedElements(expandedElements);
}
public Object[] getSelectedObjects() {
ISelection selection = getSelection();
if (selection instanceof IStructuredSelection) {
IStructuredSelection ss = (IStructuredSelection) selection;
Object[] nodes = ss.toArray();
return nodes;
}
else {
return new Object[0];
}
}
@Override
public void focusEditor(String editorName, ObjRef[] refs) {
focusEditor(refs);
}
}