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    }