/*
* JBoss, Home of Professional Open Source
* Copyright 2005, JBoss Inc., 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.hibernate.eclipse.console.views;
import java.io.FileNotFoundException;
import org.eclipse.debug.internal.ui.DebugUIPlugin;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IMenuListener;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.TreePath;
import org.eclipse.jface.viewers.TreeSelection;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.IWorkbenchActionConstants;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.actions.ActionContext;
import org.eclipse.ui.actions.ActionGroup;
import org.eclipse.ui.part.ViewPart;
import org.eclipse.ui.plugin.AbstractUIPlugin;
import org.eclipse.ui.views.properties.IPropertySheetPage;
import org.eclipse.ui.views.properties.PropertySheetPage;
import org.hibernate.console.ConsoleConfiguration;
import org.hibernate.console.KnownConfigurations;
import org.hibernate.console.node.BaseNode;
import org.hibernate.eclipse.console.HibernateConsolePlugin;
import org.hibernate.eclipse.console.actions.EditConsoleConfiguration;
import org.hibernate.eclipse.console.actions.OpenMappingAction;
import org.hibernate.eclipse.console.viewers.xpl.MTreeViewer;
import org.hibernate.eclipse.console.workbench.xpl.AnyAdaptableLabelProvider;
import org.jboss.tools.hibernate.runtime.spi.IPersistentClass;
import org.jboss.tools.hibernate.runtime.spi.IProperty;
/**
* @author max
*
*/
@SuppressWarnings("restriction")
public class KnownConfigurationsView extends ViewPart {
public static final String ID = "org.hibernate.eclipse.console.views.KnownConfigurationsView"; //$NON-NLS-1$
TreeViewer viewer;
private ActionGroup actionGroup;
private Action doubleAction;
public KnownConfigurationsView() {
super();
}
public void createPartControl(Composite parent) {
//viewer = new TreeViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
viewer = new MTreeViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
/*viewer.setContentProvider(new ConfigurationsContentProvider() );*/
/*viewer.setLabelProvider(new ConfigurationsLabelProvider() );*/
viewer.setLabelProvider(new AnyAdaptableLabelProvider());
final KnownConfigurationsProvider cp = new KnownConfigurationsProvider();
viewer.setContentProvider(cp);
getDebugUIPlugin().getPreferenceStore().addPropertyChangeListener(cp);
viewer.getTree().addDisposeListener(new DisposeListener() {
public void widgetDisposed(DisposeEvent e) {
getDebugUIPlugin().getPreferenceStore().removePropertyChangeListener(cp);
}
});
//viewer.setInput(KnownConfigurations.getInstance().getRootNode() );
viewer.setInput( KnownConfigurations.getInstance() );
makeActions();
createContextMenu();
hookDoubleClick();
provideSelection();
}
private AbstractUIPlugin getDebugUIPlugin() {
return DebugUIPlugin.getDefault();
}
private void hookDoubleClick() {
viewer.addDoubleClickListener(new IDoubleClickListener() {
public void doubleClick(DoubleClickEvent event) {
doubleAction.run();
}
});
}
private void provideSelection() {
getSite().setSelectionProvider(viewer);
}
private void createContextMenu ()
{
MenuManager menuMgr = new MenuManager("#PopupMenu"); //$NON-NLS-1$
menuMgr.setRemoveAllWhenShown(true);
menuMgr.addMenuListener(new IMenuListener() {
public void menuAboutToShow(IMenuManager manager) {
fillContextMenu(manager);
}
});
Menu menu = menuMgr.createContextMenu(viewer.getControl() );
viewer.getControl().setMenu(menu);
getSite().registerContextMenu(menuMgr, viewer);
IActionBars actionBars = getViewSite().getActionBars();
IMenuManager dropDownMenu = actionBars.getMenuManager();
actionGroup.fillContextMenu(dropDownMenu);
actionGroup.fillActionBars(actionBars);
}
protected void fillContextMenu(IMenuManager menuMgr) {
actionGroup.setContext(new ActionContext(viewer.getSelection() ) );
actionGroup.fillContextMenu(menuMgr);
menuMgr.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS) );
}
/**
*
*/
private void makeActions() {
this.actionGroup = new ConfigurationsViewActionGroup(this, viewer);
this.doubleAction = new Action() {
public void run() {
// TODO: make action dependent on having a connected console configuration!
ISelection selection = viewer.getSelection();
if (selection == null || selection.isEmpty()) {
return;
}
Object firstElement = ( (IStructuredSelection)selection).getFirstElement();
if(firstElement instanceof ConsoleConfiguration) {
new EditConsoleConfiguration((ConsoleConfiguration)firstElement).run();
} else if (firstElement instanceof BaseNode){
BaseNode node = (BaseNode) firstElement;
ConsoleConfiguration consoleConfiguration = node.getConsoleConfiguration();
if(consoleConfiguration.isSessionFactoryCreated() ) {
String hql = node.getHQL();
// open HQL Editor
HibernateConsolePlugin.getDefault().openScratchHQLEditor(consoleConfiguration.getName(), hql);
/** /
// execute query and show results in
// Hibernate Query result view - commented cause old version
if(StringHelper.isNotEmpty( hql )) {
try {
if (getSite() != null && getSite().getPage() != null) {
getSite().getPage().showView(QueryPageTabView.ID);
}
} catch (PartInitException e) {
HibernateConsolePlugin.getDefault().logErrorMessage("Can't show QueryPageTabView.", e); //$NON-NLS-1$
}
consoleConfiguration.executeHQLQuery( hql );
}
/**/
}
} else if (selection instanceof TreeSelection){
TreePath[] paths = ((TreeSelection)selection).getPaths();
TreePath path = paths[0];
Object last = path.getLastSegment();
ConsoleConfiguration consoleConfig = (ConsoleConfiguration)(path.getSegment(0));
if (last instanceof IPersistentClass || (last instanceof IProperty && ((IProperty)last).classIsPropertyClass())){
try {
OpenMappingAction.run(consoleConfig, path);
} catch (PartInitException e) {
HibernateConsolePlugin.getDefault().logErrorMessage("Can't find mapping file.", e); //$NON-NLS-1$
} catch (JavaModelException e) {
HibernateConsolePlugin.getDefault().logErrorMessage("Can't find mapping file.", e); //$NON-NLS-1$
} catch (FileNotFoundException e) {
HibernateConsolePlugin.getDefault().logErrorMessage("Can't find mapping file.", e); //$NON-NLS-1$
}
}
else {
for (int i = 0; i < paths.length; i++) {
if (viewer.getExpandedState(paths[i])) {
viewer.collapseToLevel(paths[i], 1);
}
else {
viewer.expandToLevel(paths[i], 1);
}
}
}
}
}
};
}
public void dispose() {
super.dispose();
if (actionGroup != null) {
actionGroup.dispose();
}
}
public void setFocus() {
viewer.getTree().setFocus();
}
@Override
public <T> T getAdapter(Class<T> adapter) {
if (adapter.equals(IPropertySheetPage.class) )
{
PropertySheetPage page = new PropertySheetPage();
page.setPropertySourceProvider(new ConsoleConfigurationPropertySourceProvider() );
return adapter.cast(page);
}
return super.getAdapter( adapter );
}
}