/**
* Licensed to Neo Technology under one or more contributor
* license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright
* ownership. Neo Technology licenses this file to you under
* the Apache License, Version 2.0 (the "License"); you may
* not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.neo4j.neoclipse.connection;
import org.eclipse.jface.action.ActionContributionItem;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.action.IContributionItem;
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.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.ui.part.ViewPart;
import org.neo4j.neoclipse.Activator;
import org.neo4j.neoclipse.connection.actions.ForceStartHandler;
import org.neo4j.neoclipse.connection.actions.NewAliasAction;
import org.neo4j.neoclipse.connection.actions.SqlEditorAction;
import org.neo4j.neoclipse.event.NeoclipseEvent;
import org.neo4j.neoclipse.event.NeoclipseEventListener;
import org.neo4j.neoclipse.event.NeoclipseListenerList;
import org.neo4j.neoclipse.graphdb.GraphDbServiceManager;
import org.neo4j.neoclipse.graphdb.GraphDbServiceStatus;
import org.neo4j.neoclipse.view.ErrorMessage;
import org.neo4j.neoclipse.view.NeoGraphViewPart;
import org.neo4j.neoclipse.view.UiHelper;
/**
*
* @author Radhakrishna Kalyan
*/
public class ConnectionsView extends ViewPart implements NeoclipseEventListener
{
public static final String ID = ConnectionsView.class.getCanonicalName();
private final NeoclipseListenerList connectionListeners = new NeoclipseListenerList();
private TreeViewer _treeViewer;
public ConnectionsView()
{
super();
Activator.getDefault().setConnectionsView( this );
connectionListeners.add( new ForceStartHandler() );
}
@Override
public void createPartControl( Composite parent )
{
Activator.getDefault().getAliasManager().registerConnetionListener( this );
_treeViewer = new TreeViewer( parent, SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL );
getSite().setSelectionProvider( _treeViewer );
IToolBarManager toolBarMgr = getViewSite().getActionBars().getToolBarManager();
toolBarMgr.add( new NewAliasAction() );
toolBarMgr.add( new SqlEditorAction() );
_treeViewer.setUseHashlookup( true );
_treeViewer.setContentProvider( new ConnectionTreeContentProvider() );
_treeViewer.setLabelProvider( new ConnectionTreeLabelProvider() );
_treeViewer.setInput( Activator.getDefault().getAliasManager() );
// doubleclick on alias opens session
_treeViewer.addDoubleClickListener( new IDoubleClickListener()
{
@Override
public void doubleClick( final DoubleClickEvent event )
{
UiHelper.asyncExec( new Runnable()
{
@Override
public void run()
{
IStructuredSelection selection = (IStructuredSelection) event.getSelection();
if ( selection != null )
{
Object selected = selection.getFirstElement();
if ( selected instanceof Alias )
{
Alias alias = (Alias) selection.getFirstElement();
startOrStopConnection( alias );
}
}
}
} );
}
} );
_treeViewer.addSelectionChangedListener( new ISelectionChangedListener()
{
@Override
public void selectionChanged( final SelectionChangedEvent event )
{
UiHelper.asyncExec( new Runnable()
{
@Override
public void run()
{
refreshToolbar();
Activator.getDefault().fireServiceChangedEvent( GraphDbServiceStatus.DB_SELECT );
}
} );
}
} );
// add context menu
final ConnectionTreeActionGroup actionGroup = new ConnectionTreeActionGroup();
MenuManager menuManager = new MenuManager( "ConnectionTreeContextMenu" );
menuManager.setRemoveAllWhenShown( true );
Menu contextMenu = menuManager.createContextMenu( _treeViewer.getTree() );
_treeViewer.getTree().setMenu( contextMenu );
menuManager.addMenuListener( new IMenuListener()
{
@Override
public void menuAboutToShow( IMenuManager manager )
{
actionGroup.fillContextMenu( manager );
}
} );
_treeViewer.setAutoExpandLevel( 2 );
parent.layout();
}
public void startOrStopConnection( final Alias alias )
{
UiHelper.asyncExec( new Runnable()
{
@Override
public void run()
{
GraphDbServiceManager gsm = Activator.getDefault().getGraphDbServiceManager();
NeoGraphViewPart graphView = Activator.getDefault().getNeoGraphViewPart();
try
{
if ( gsm.isRunning() )
{
if ( !gsm.getCurrentAlias().equals( alias ) )
{
ErrorMessage.showDialog( "Database problem",
"Another Database view is already active. Please close it before starting another one." );
}
else
{
graphView.cleanTransactionBeforeShutdown();
gsm.stopGraphDbService().get();
}
}
else if ( !gsm.isRunning() )
{
gsm.startGraphDbService( alias ).get();
graphView.showSomeNode();
}
}
catch ( Exception e )
{
ErrorMessage.showDialog( "Database problem", e );
}
Activator.getDefault().getAliasManager().notifyListners();
}
} );
}
public Alias getSelectedAlias()
{
IStructuredSelection selection = (IStructuredSelection) _treeViewer.getSelection();
return (Alias) selection.getFirstElement();
}
@Override
public void setFocus()
{
_treeViewer.getControl().setFocus();
}
@Override
public void stateChanged( NeoclipseEvent event )
{
UiHelper.asyncExec( new Runnable()
{
@Override
public void run()
{
if ( !_treeViewer.getTree().isDisposed() )
{
_treeViewer.refresh();
refreshToolbar();
}
}
} );
}
private void refreshToolbar()
{
IToolBarManager toolbar = getViewSite().getActionBars().getToolBarManager();
IContributionItem[] items = toolbar.getItems();
for ( IContributionItem item : items )
{
if ( item instanceof ActionContributionItem )
{
ActionContributionItem contrib = (ActionContributionItem) item;
IAction contribAction = contrib.getAction();
if ( contribAction instanceof AbstractConnectionTreeAction )
{
AbstractConnectionTreeAction action = (AbstractConnectionTreeAction) contribAction;
action.setEnabled( action.isAvailable() );
}
}
}
}
public void notifyListners()
{
connectionListeners.notifyListeners();
}
}