/*
* JBoss by Red Hat
* Copyright 2006-2009, Red Hat Middleware, LLC, and individual contributors as indicated
* by the @authors tag. See the copyright.txt in the distribution for a
* full listing of individual contributors.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.jboss.ide.eclipse.freemarker.outline;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jdt.core.search.SearchEngine;
import org.eclipse.jdt.ui.IJavaElementSearchConstants;
import org.eclipse.jdt.ui.JavaUI;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.IStatusLineManager;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeItem;
import org.eclipse.ui.dialogs.SelectionDialog;
import org.eclipse.ui.views.contentoutline.ContentOutlinePage;
import org.jboss.ide.eclipse.freemarker.Messages;
import org.jboss.ide.eclipse.freemarker.Plugin;
import org.jboss.ide.eclipse.freemarker.configuration.ConfigurationManager;
import org.jboss.ide.eclipse.freemarker.configuration.ContextValue;
import org.jboss.ide.eclipse.freemarker.editor.Editor;
import org.jboss.ide.eclipse.freemarker.model.Interpolation;
import org.jboss.ide.eclipse.freemarker.model.Item;
import org.jboss.ide.eclipse.freemarker.model.ItemSet;
import org.w3c.dom.Document;
/**
* @author <a href="mailto:joe@binamics.com">Joe Hudson</a>
*/
public class OutlinePage extends ContentOutlinePage implements IDoubleClickListener {
private Editor fEditor;
private Object fInput;
private OutlineLabelProvider fLabelProvider;
public OutlinePage(Editor anEditor) {
fEditor = anEditor;
}
/**
* @see org.eclipse.ui.part.IPart#createControl(Composite)
*/
public void createControl(Composite aParent) {
super.createControl(aParent);
fLabelProvider = new OutlineLabelProvider();
// Init tree viewer
TreeViewer viewer = getTreeViewer();
viewer.setContentProvider(new OutlineContentProvider(fEditor));
viewer.setLabelProvider(fLabelProvider);
viewer.addSelectionChangedListener(this);
viewer.addDoubleClickListener(this);
if (fInput != null) {
viewer.setInput(fInput);
}
// Refresh outline according to initial cursor position
update(null);
}
public void setInput(Object aInput) {
fInput = aInput;
update(null);
}
private ItemSet selectedItemSet;
private Item selectedItem;
public void update(Item item) {
if ((null == item && null != selectedItem)
|| null == selectedItem && null != item
|| (null != item && null != selectedItem && !item.equals(selectedItem))) {
if (null == selectedItemSet || !fEditor.getItemSet().equals(selectedItemSet)) {
TreeViewer viewer = getTreeViewer();
if (viewer != null) {
Control control = viewer.getControl();
if (control != null && !control.isDisposed()) {
viewer.removeSelectionChangedListener(this);
control.setRedraw(false);
viewer.setInput(fInput);
control.setRedraw(true);
viewer.expandToLevel(3);
}
}
selectedItemSet = fEditor.getItemSet();
}
select(item);
}
selectedItem = item;
selectedItemSet = fEditor.getItemSet();
}
public void select (Item item) {
if (null != item && item.isEndItem())
item = item.getStartItem();
if (null != getTreeViewer()) {
if (null == item)
getTreeViewer().setSelection(
new StructuredSelection(new Object[0]), true);
else if (null != item)
getTreeViewer().setSelection(
new StructuredSelection(item), true);
}
}
/**
* @see org.eclipse.ui.part.Page#dispose()
*/
public void dispose() {
super.dispose();
}
public void doubleClick(DoubleClickEvent event) {
IStructuredSelection selection = (IStructuredSelection) event.getSelection();
Item item = (Item) selection.getFirstElement();
if (null != item) {
fEditor.select(item);
}
}
public void makeContributions(IMenuManager menuManager, IToolBarManager toolBarManager, IStatusLineManager statusLineManager) {
MenuManager menuMgr = new MenuManager();
Menu menu = menuMgr.createContextMenu(getTreeViewer().getTree());
menuMgr.add(new SetContextEntryAction(this));
getTreeViewer().getTree().setMenu(menu);
super.makeContributions(menuManager, toolBarManager, statusLineManager);
}
public class SetContextEntryAction extends Action {
private OutlinePage outlinePage;
public SetContextEntryAction (OutlinePage outlinePage) {
this.outlinePage = outlinePage;
this.setText(Messages.OutlinePage_SetContextClassEntryAction);
this.setEnabled(true);
}
public void runWithEvent(Event event) {
Tree tree = getTreeViewer().getTree();
TreeItem[] items = tree.getSelection();
Document doc = null;
Interpolation interpolation = null;
for (int i=0; i<items.length; i++) {
TreeItem item = items[i];
if (item.getData() instanceof Interpolation) {
interpolation = (Interpolation) item.getData();
try {
SelectionDialog sd = JavaUI.createTypeDialog(new Shell(), null, SearchEngine.createWorkspaceScope(),
IJavaElementSearchConstants.CONSIDER_CLASSES_AND_INTERFACES, false);
sd.open();
Object[] objects = sd.getResult();
if (null != objects && objects.length > 0) {
ConfigurationManager configuration = ConfigurationManager.getInstance(interpolation.getResource().getProject());
IType type = (IType) objects[0];
try {
configuration.addContextValue(
new ContextValue(interpolation.getFirstToken(),
configuration.getClass(type.getFullyQualifiedName()), null), interpolation.getResource());
}
catch (ClassNotFoundException e) {
Plugin.log(e);
}
}
}
catch (JavaModelException jme) {
Plugin.error(jme);
}
}
}
}
}
}