001 /*
002 * Licensed to the Apache Software Foundation (ASF) under one
003 * or more contributor license agreements. See the NOTICE file
004 * distributed with this work for additional information
005 * regarding copyright ownership. The ASF licenses this file
006 * to you under the Apache License, Version 2.0 (the
007 * "License"); you may not use this file except in compliance
008 * with the License. You may obtain a copy of the License at
009 *
010 * http://www.apache.org/licenses/LICENSE-2.0
011 *
012 * Unless required by applicable law or agreed to in writing,
013 * software distributed under the License is distributed on an
014 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
015 * KIND, either express or implied. See the License for the
016 * specific language governing permissions and limitations
017 * under the License.
018 *
019 */
020 package org.apache.directory.studio.apacheds.views;
021
022
023 import org.apache.directory.studio.apacheds.ApacheDsPluginConstants;
024 import org.apache.directory.studio.apacheds.actions.CreateConnectionAction;
025 import org.apache.directory.studio.apacheds.actions.DeleteAction;
026 import org.apache.directory.studio.apacheds.actions.NewServerAction;
027 import org.apache.directory.studio.apacheds.actions.OpenConfigurationAction;
028 import org.apache.directory.studio.apacheds.actions.PropertiesAction;
029 import org.apache.directory.studio.apacheds.actions.RenameAction;
030 import org.apache.directory.studio.apacheds.actions.RunAction;
031 import org.apache.directory.studio.apacheds.actions.StopAction;
032 import org.apache.directory.studio.apacheds.model.Server;
033 import org.apache.directory.studio.apacheds.model.ServersHandler;
034 import org.apache.directory.studio.apacheds.model.ServersHandlerListener;
035 import org.eclipse.jface.action.IMenuListener;
036 import org.eclipse.jface.action.IMenuManager;
037 import org.eclipse.jface.action.IToolBarManager;
038 import org.eclipse.jface.action.MenuManager;
039 import org.eclipse.jface.action.Separator;
040 import org.eclipse.jface.commands.ActionHandler;
041 import org.eclipse.jface.viewers.DoubleClickEvent;
042 import org.eclipse.jface.viewers.IDoubleClickListener;
043 import org.eclipse.jface.viewers.ISelectionChangedListener;
044 import org.eclipse.jface.viewers.SelectionChangedEvent;
045 import org.eclipse.jface.viewers.StructuredSelection;
046 import org.eclipse.jface.viewers.TreeViewer;
047 import org.eclipse.swt.SWT;
048 import org.eclipse.swt.events.SelectionAdapter;
049 import org.eclipse.swt.events.SelectionEvent;
050 import org.eclipse.swt.events.SelectionListener;
051 import org.eclipse.swt.layout.GridData;
052 import org.eclipse.swt.widgets.Composite;
053 import org.eclipse.swt.widgets.Tree;
054 import org.eclipse.swt.widgets.TreeColumn;
055 import org.eclipse.ui.IMemento;
056 import org.eclipse.ui.IPartListener2;
057 import org.eclipse.ui.IViewSite;
058 import org.eclipse.ui.IWorkbenchPartReference;
059 import org.eclipse.ui.PartInitException;
060 import org.eclipse.ui.PlatformUI;
061 import org.eclipse.ui.commands.ICommandService;
062 import org.eclipse.ui.contexts.IContextActivation;
063 import org.eclipse.ui.contexts.IContextService;
064 import org.eclipse.ui.part.ViewPart;
065
066
067 /**
068 * This class implements the Servers view.
069 * <p>
070 * It displays the list of Apache Directory Servers.
071 *
072 * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
073 * @version $Rev$, $Date$
074 */
075 public class ServersView extends ViewPart
076 {
077 /** The ID of the view */
078 public static final String ID = ApacheDsPluginConstants.VIEW_SERVERS_VIEW;
079
080 /** The tree*/
081 private Tree tree;
082
083 /** The table viewer */
084 private ServersTableViewer tableViewer;
085
086 /** The view instance */
087 private ServersView instance;
088
089 /** Token used to activate and deactivate shortcuts in the view */
090 private IContextActivation contextActivation;
091
092 private static final String TAG_COLUMN_WIDTH = "columnWidth"; //$NON-NLS-1$
093 protected int[] columnWidths;
094
095 // Actions
096 private NewServerAction newServer;
097 private OpenConfigurationAction openConfiguration;
098 private DeleteAction delete;
099 private RenameAction rename;
100 private RunAction run;
101 private StopAction stop;
102 private CreateConnectionAction createConnection;
103 private PropertiesAction properties;
104
105 // Listeners
106 private ServersHandlerListener serversHandlerListener = new ServersHandlerListener()
107 {
108 /* (non-Javadoc)
109 * @see org.apache.directory.studio.apacheds.model.ServersHandlerListener#serverAdded(org.apache.directory.studio.apacheds.model.Server)
110 */
111 public void serverAdded( Server server )
112 {
113 tableViewer.refresh();
114 }
115
116
117 /* (non-Javadoc)
118 * @see org.apache.directory.studio.apacheds.model.ServersHandlerListener#serverRemoved(org.apache.directory.studio.apacheds.model.Server)
119 */
120 public void serverRemoved( Server server )
121 {
122 tableViewer.refresh();
123 }
124
125
126 /* (non-Javadoc)
127 * @see org.apache.directory.studio.apacheds.model.ServersHandlerListener#serverUpdated(org.apache.directory.studio.apacheds.model.Server)
128 */
129 public void serverUpdated( Server server )
130 {
131 tableViewer.refresh();
132 }
133 };
134
135
136 /* (non-Javadoc)
137 * @see org.eclipse.ui.part.WorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite)
138 */
139 public void createPartControl( Composite parent )
140 {
141 instance = this;
142
143 // Creating the Tree
144 tree = new Tree( parent, SWT.SINGLE | SWT.FULL_SELECTION | SWT.H_SCROLL | SWT.V_SCROLL );
145 tree.setLayoutData( new GridData( SWT.FILL, SWT.FILL, true, true ) );
146 tree.setHeaderVisible( true );
147 tree.setLinesVisible( false );
148
149 // Adding columns
150 TreeColumn serverColumn = new TreeColumn( tree, SWT.SINGLE );
151 serverColumn.setText( Messages.getString("ServersView.server") ); //$NON-NLS-1$
152 serverColumn.setWidth( columnWidths[0] );
153 serverColumn.addSelectionListener( getHeaderListener( 0 ) );
154 tree.setSortColumn( serverColumn );
155 tree.setSortDirection( SWT.UP );
156
157 TreeColumn stateColumn = new TreeColumn( tree, SWT.SINGLE );
158 stateColumn.setText( Messages.getString("ServersView.state") ); //$NON-NLS-1$
159 stateColumn.setWidth( columnWidths[1] );
160 stateColumn.addSelectionListener( getHeaderListener( 1 ) );
161
162 // Creating the viewer
163 tableViewer = new ServersTableViewer( tree );
164
165 initActions();
166 initToolbar();
167 initContextMenu();
168 initListeners();
169
170 // set help context
171 PlatformUI.getWorkbench().getHelpSystem().setHelp( parent,
172 ApacheDsPluginConstants.PLUGIN_ID + "." + "gettingstarted_views_servers" ); //$NON-NLS-1$ //$NON-NLS-2$
173 }
174
175
176 /**
177 * Gets a header listener for the given column.
178 *
179 * @param col
180 * the column
181 * @return
182 * a header listener for the given column
183 */
184 private SelectionListener getHeaderListener( final int col )
185 {
186 return new SelectionAdapter()
187 {
188 /**
189 * Handles the case of user selecting the header area.
190 */
191 public void widgetSelected( SelectionEvent e )
192 {
193 if ( tableViewer == null )
194 return;
195 TreeColumn column = ( TreeColumn ) e.widget;
196 tableViewer.resortTable( column, col );
197 }
198 };
199 }
200
201
202 /* (non-Javadoc)
203 * @see org.eclipse.ui.part.ViewPart#init(org.eclipse.ui.IViewSite, org.eclipse.ui.IMemento)
204 */
205 public void init( IViewSite site, IMemento memento ) throws PartInitException
206 {
207 super.init( site, memento );
208 columnWidths = new int[]
209 { 150, 80 };
210 for ( int i = 0; i < 2; i++ )
211 {
212 if ( memento != null )
213 {
214 Integer in = memento.getInteger( TAG_COLUMN_WIDTH + i );
215 if ( in != null && in.intValue() > 5 )
216 {
217 columnWidths[i] = in.intValue();
218 }
219 }
220 }
221 }
222
223
224 /* (non-Javadoc)
225 * @see org.eclipse.ui.part.ViewPart#saveState(org.eclipse.ui.IMemento)
226 */
227 public void saveState( IMemento memento )
228 {
229 TreeColumn[] tc = tableViewer.getTree().getColumns();
230 for ( int i = 0; i < 2; i++ )
231 {
232 int width = tc[i].getWidth();
233 if ( width != 0 )
234 {
235 memento.putInteger( TAG_COLUMN_WIDTH + i, width );
236 }
237 }
238 }
239
240
241 /* (non-Javadoc)
242 * @see org.eclipse.ui.part.WorkbenchPart#setFocus()
243 */
244 public void setFocus()
245 {
246 if ( tree != null )
247 {
248 tree.setFocus();
249 }
250 }
251
252
253 /**
254 * Initializes the actions.
255 */
256 private void initActions()
257 {
258 newServer = new NewServerAction();
259
260 openConfiguration = new OpenConfigurationAction( this );
261 openConfiguration.setEnabled( false );
262
263 delete = new DeleteAction( this );
264 delete.setEnabled( false );
265
266 rename = new RenameAction( this );
267 rename.setEnabled( false );
268
269 run = new RunAction( this );
270 run.setEnabled( false );
271
272 stop = new StopAction( this );
273 stop.setEnabled( false );
274
275 createConnection = new CreateConnectionAction( this );
276 createConnection.setEnabled( false );
277
278 properties = new PropertiesAction( this );
279 properties.setEnabled( false );
280 }
281
282
283 /**
284 * Initializes the toolbar.
285 */
286 private void initToolbar()
287 {
288 IToolBarManager toolbar = getViewSite().getActionBars().getToolBarManager();
289 toolbar.add( newServer );
290 toolbar.add( new Separator() );
291 toolbar.add( run );
292 toolbar.add( stop );
293 }
294
295
296 /**
297 * Initializes the Context Menu.
298 */
299 private void initContextMenu()
300 {
301 MenuManager contextMenu = new MenuManager( "" ); //$NON-NLS-1$
302 contextMenu.setRemoveAllWhenShown( true );
303 contextMenu.addMenuListener( new IMenuListener()
304 {
305 public void menuAboutToShow( IMenuManager manager )
306 {
307 MenuManager newManager = new MenuManager( Messages.getString("ServersView.new") ); //$NON-NLS-1$
308 newManager.add( newServer );
309 manager.add( newManager );
310 manager.add( openConfiguration );
311 manager.add( new Separator() );
312 manager.add( delete );
313 manager.add( rename );
314 manager.add( new Separator() );
315 manager.add( run );
316 manager.add( stop );
317 manager.add( new Separator() );
318 MenuManager ldapBrowserManager = new MenuManager( Messages.getString("ServersView.ldapBrowser") ); //$NON-NLS-1$
319 ldapBrowserManager.add( createConnection );
320 manager.add( ldapBrowserManager );
321 manager.add( new Separator() );
322 manager.add( properties );
323 }
324 } );
325
326 // set the context menu to the table viewer
327 tableViewer.getControl().setMenu( contextMenu.createContextMenu( tableViewer.getControl() ) );
328
329 // register the context menu to enable extension actions
330 getSite().registerContextMenu( contextMenu, tableViewer );
331 }
332
333
334 /**
335 * Initializes the listeners
336 */
337 private void initListeners()
338 {
339 ServersHandler serversHandler = ServersHandler.getDefault();
340 serversHandler.addListener( serversHandlerListener );
341
342 tableViewer.addDoubleClickListener( new IDoubleClickListener()
343 {
344 public void doubleClick( DoubleClickEvent event )
345 {
346 openConfiguration.run();
347 }
348 } );
349
350 tableViewer.addSelectionChangedListener( new ISelectionChangedListener()
351 {
352 public void selectionChanged( SelectionChangedEvent event )
353 {
354 updateActionsStates();
355 }
356 } );
357
358 // Initializing the PartListener
359 getSite().getPage().addPartListener( new IPartListener2()
360 {
361 /**
362 * This implementation deactivates the shortcuts when the part is deactivated.
363 */
364 public void partDeactivated( IWorkbenchPartReference partRef )
365 {
366 if ( partRef.getPart( false ) == instance && contextActivation != null )
367 {
368 ICommandService commandService = ( ICommandService ) PlatformUI.getWorkbench().getAdapter(
369 ICommandService.class );
370 if ( commandService != null )
371 {
372 commandService.getCommand( newServer.getActionDefinitionId() ).setHandler( null );
373 commandService.getCommand( openConfiguration.getActionDefinitionId() ).setHandler( null );
374 commandService.getCommand( delete.getActionDefinitionId() ).setHandler( null );
375 commandService.getCommand( rename.getActionDefinitionId() ).setHandler( null );
376 commandService.getCommand( run.getActionDefinitionId() ).setHandler( null );
377 commandService.getCommand( stop.getActionDefinitionId() ).setHandler( null );
378 commandService.getCommand( properties.getActionDefinitionId() ).setHandler( null );
379 }
380
381 IContextService contextService = ( IContextService ) PlatformUI.getWorkbench().getAdapter(
382 IContextService.class );
383 contextService.deactivateContext( contextActivation );
384 contextActivation = null;
385 }
386 }
387
388
389 /**
390 * This implementation activates the shortcuts when the part is activated.
391 */
392 public void partActivated( IWorkbenchPartReference partRef )
393 {
394 if ( partRef.getPart( false ) == instance )
395 {
396 IContextService contextService = ( IContextService ) PlatformUI.getWorkbench().getAdapter(
397 IContextService.class );
398 contextActivation = contextService.activateContext( ApacheDsPluginConstants.CONTEXTS_SERVERS_VIEW );
399
400 ICommandService commandService = ( ICommandService ) PlatformUI.getWorkbench().getAdapter(
401 ICommandService.class );
402 if ( commandService != null )
403 {
404 commandService.getCommand( newServer.getActionDefinitionId() ).setHandler(
405 new ActionHandler( newServer ) );
406 commandService.getCommand( openConfiguration.getActionDefinitionId() ).setHandler(
407 new ActionHandler( openConfiguration ) );
408 commandService.getCommand( delete.getActionDefinitionId() ).setHandler(
409 new ActionHandler( delete ) );
410 commandService.getCommand( rename.getActionDefinitionId() ).setHandler(
411 new ActionHandler( rename ) );
412 commandService.getCommand( run.getActionDefinitionId() ).setHandler( new ActionHandler( run ) );
413 commandService.getCommand( stop.getActionDefinitionId() )
414 .setHandler( new ActionHandler( stop ) );
415 commandService.getCommand( properties.getActionDefinitionId() ).setHandler(
416 new ActionHandler( properties ) );
417 }
418 }
419 }
420
421
422 public void partBroughtToTop( IWorkbenchPartReference partRef )
423 {
424 }
425
426
427 public void partClosed( IWorkbenchPartReference partRef )
428 {
429 }
430
431
432 public void partHidden( IWorkbenchPartReference partRef )
433 {
434 }
435
436
437 public void partInputChanged( IWorkbenchPartReference partRef )
438 {
439 }
440
441
442 public void partOpened( IWorkbenchPartReference partRef )
443 {
444 }
445
446
447 public void partVisible( IWorkbenchPartReference partRef )
448 {
449 }
450
451 } );
452 }
453
454
455 /**
456 * Enables or disables the actions according to the current selection
457 * in the viewer.
458 */
459 public void updateActionsStates()
460 {
461 // Getting the selection
462 StructuredSelection selection = ( StructuredSelection ) tableViewer.getSelection();
463
464 if ( !selection.isEmpty() )
465 {
466 Server server = ( Server ) selection.getFirstElement();
467
468 switch ( server.getState() )
469 {
470 case STARTED:
471 run.setEnabled( false );
472 stop.setEnabled( true );
473 break;
474 case STARTING:
475 run.setEnabled( false );
476 stop.setEnabled( false );
477 break;
478 case STOPPED:
479 run.setEnabled( true );
480 stop.setEnabled( false );
481 break;
482 case STOPPING:
483 run.setEnabled( false );
484 stop.setEnabled( false );
485 break;
486 case UNKNONW:
487 run.setEnabled( false );
488 stop.setEnabled( false );
489 break;
490 }
491
492 openConfiguration.setEnabled( true );
493 delete.setEnabled( true );
494 rename.setEnabled( true );
495 createConnection.setEnabled( true );
496 properties.setEnabled( true );
497 }
498 else
499 {
500 openConfiguration.setEnabled( false );
501 delete.setEnabled( false );
502 rename.setEnabled( false );
503 run.setEnabled( false );
504 stop.setEnabled( false );
505 createConnection.setEnabled( false );
506 properties.setEnabled( false );
507 }
508 }
509
510
511 /**
512 * Gets the table viewer.
513 *
514 * @return
515 * the table viewer
516 */
517 public TreeViewer getViewer()
518 {
519 return tableViewer;
520 }
521
522
523 /* (non-Javadoc)
524 * @see org.eclipse.ui.part.WorkbenchPart#dispose()
525 */
526 public void dispose()
527 {
528 ServersHandler serversHandler = ServersHandler.getDefault();
529 serversHandler.removeListener( serversHandlerListener );
530
531 super.dispose();
532 }
533 }