org.apache.directory.studio.ldapservers.views.ServersView.java Source code

Java tutorial

Introduction

Here is the source code for org.apache.directory.studio.ldapservers.views.ServersView.java

Source

/*
 *  Licensed to the Apache Software Foundation (ASF) under one
 *  or more contributor license agreements.  See the NOTICE file
 *  distributed with this work for additional information
 *  regarding copyright ownership.  The ASF 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.apache.directory.studio.ldapservers.views;

import org.apache.directory.studio.ldapservers.LdapServersManager;
import org.apache.directory.studio.ldapservers.LdapServersManagerListener;
import org.apache.directory.studio.ldapservers.LdapServersPluginConstants;
import org.apache.directory.studio.ldapservers.actions.DeleteAction;
import org.apache.directory.studio.ldapservers.actions.NewServerAction;
import org.apache.directory.studio.ldapservers.actions.OpenConfigurationAction;
import org.apache.directory.studio.ldapservers.actions.PropertiesAction;
import org.apache.directory.studio.ldapservers.actions.RenameAction;
import org.apache.directory.studio.ldapservers.actions.StartAction;
import org.apache.directory.studio.ldapservers.actions.StopAction;
import org.apache.directory.studio.ldapservers.model.LdapServer;
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.action.Separator;
import org.eclipse.jface.commands.ActionHandler;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeColumn;
import org.eclipse.ui.IMemento;
import org.eclipse.ui.IPartListener2;
import org.eclipse.ui.IViewSite;
import org.eclipse.ui.IWorkbenchActionConstants;
import org.eclipse.ui.IWorkbenchPartReference;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.commands.ICommandService;
import org.eclipse.ui.contexts.IContextActivation;
import org.eclipse.ui.contexts.IContextService;
import org.eclipse.ui.part.ViewPart;

/**
 * This class implements the Servers view.
 * <p>
 * It displays the list of Apache Directory Servers.
 *
 * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
 */
public class ServersView extends ViewPart {
    /** The ID of the view */
    //    public static final String ID = ApacheDsPluginConstants.VIEW_SERVERS_VIEW; // TODO

    /** The tree*/
    private Tree tree;

    /** The table viewer */
    private ServersTableViewer tableViewer;

    /** The view instance */
    private ServersView instance;

    /** Token used to activate and deactivate shortcuts in the view */
    private IContextActivation contextActivation;

    private static final String TAG_COLUMN_WIDTH = "columnWidth"; //$NON-NLS-1$
    protected int[] columnWidths;

    // Actions
    private NewServerAction newServer;
    private OpenConfigurationAction openConfiguration;
    private DeleteAction delete;
    private RenameAction rename;
    private StartAction start;
    private StopAction stop;
    private PropertiesAction properties;

    // Listeners
    private LdapServersManagerListener ldapServersManagerListener = new LdapServersManagerListener() {
        public void serverAdded(LdapServer server) {
            asyncRefresh();
        }

        public void serverRemoved(LdapServer server) {
            asyncRefresh();
        }

        public void serverUpdated(LdapServer server) {
            asyncRefresh();
        }
    };

    /**
     * {@inheritDoc}
     */
    public void createPartControl(Composite parent) {
        instance = this;

        // Creating the Tree
        tree = new Tree(parent, SWT.SINGLE | SWT.FULL_SELECTION | SWT.H_SCROLL | SWT.V_SCROLL);
        tree.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
        tree.setHeaderVisible(true);
        tree.setLinesVisible(false);

        // Adding columns
        TreeColumn serverColumn = new TreeColumn(tree, SWT.SINGLE);
        serverColumn.setText(Messages.getString("ServersView.server")); //$NON-NLS-1$
        serverColumn.setWidth(columnWidths[0]);
        serverColumn.addSelectionListener(getColumnSelectionListener(0));
        tree.setSortColumn(serverColumn);
        tree.setSortDirection(SWT.UP);

        TreeColumn stateColumn = new TreeColumn(tree, SWT.SINGLE);
        stateColumn.setText(Messages.getString("ServersView.state")); //$NON-NLS-1$
        stateColumn.setWidth(columnWidths[1]);
        stateColumn.addSelectionListener(getColumnSelectionListener(1));

        // Creating the viewer
        tableViewer = new ServersTableViewer(tree);

        initActions();
        initToolbar();
        initContextMenu();
        initListeners();

        // set help context
        // TODO
        //        PlatformUI.getWorkbench().getHelpSystem()
        //            .setHelp( parent, ApacheDsPluginConstants.PLUGIN_ID + "." + "gettingstarted_views_servers" ); //$NON-NLS-1$ //$NON-NLS-2$
    }

    /**
     * {@inheritDoc}
     */
    public void init(IViewSite site, IMemento memento) throws PartInitException {
        super.init(site, memento);
        columnWidths = new int[] { 150, 80 };
        for (int i = 0; i < 2; i++) {
            if (memento != null) {
                Integer in = memento.getInteger(TAG_COLUMN_WIDTH + i);
                if (in != null && in.intValue() > 5) {
                    columnWidths[i] = in.intValue();
                }
            }
        }
    }

    /**
     * {@inheritDoc}
     */
    public void saveState(IMemento memento) {
        TreeColumn[] tc = tableViewer.getTree().getColumns();
        for (int i = 0; i < 2; i++) {
            int width = tc[i].getWidth();
            if (width != 0) {
                memento.putInteger(TAG_COLUMN_WIDTH + i, width);
            }
        }
    }

    /**
     * {@inheritDoc}
     */
    public void setFocus() {
        if (tree != null) {
            tree.setFocus();
        }
    }

    /**
     * Initializes the actions.
     */
    private void initActions() {
        newServer = new NewServerAction();

        openConfiguration = new OpenConfigurationAction(this);
        openConfiguration.setEnabled(false);

        delete = new DeleteAction(this);
        delete.setEnabled(false);

        rename = new RenameAction(this);
        rename.setEnabled(false);

        start = new StartAction(this);
        start.setEnabled(false);

        stop = new StopAction(this);
        stop.setEnabled(false);

        properties = new PropertiesAction(this);
        properties.setEnabled(false);
    }

    /**
     * Initializes the toolbar.
     */
    private void initToolbar() {
        IToolBarManager toolbar = getViewSite().getActionBars().getToolBarManager();
        toolbar.add(newServer);
        toolbar.add(new Separator());
        toolbar.add(start);
        toolbar.add(stop);
    }

    /**
     * Initializes the Context Menu.
     */
    private void initContextMenu() {
        MenuManager contextMenu = new MenuManager(""); //$NON-NLS-1$
        contextMenu.setRemoveAllWhenShown(true);
        contextMenu.addMenuListener(new IMenuListener() {
            public void menuAboutToShow(IMenuManager manager) {
                MenuManager newManager = new MenuManager(Messages.getString("ServersView.new")); //$NON-NLS-1$
                newManager.add(newServer);
                manager.add(newManager);
                manager.add(openConfiguration);
                manager.add(new Separator());
                manager.add(delete);
                manager.add(rename);
                manager.add(new Separator());
                manager.add(start);
                manager.add(stop);
                manager.add(new Separator());
                manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
                manager.add(new Separator());
                manager.add(new Separator());
                manager.add(properties);
            }
        });

        // set the context menu to the table viewer
        tableViewer.getControl().setMenu(contextMenu.createContextMenu(tableViewer.getControl()));

        // register the context menu to enable extension actions
        getSite().registerContextMenu(contextMenu, tableViewer);
    }

    /**
     * Initializes the listeners
     */
    private void initListeners() {
        LdapServersManager serversHandler = LdapServersManager.getDefault();
        serversHandler.addListener(ldapServersManagerListener);

        tableViewer.addDoubleClickListener(new IDoubleClickListener() {
            public void doubleClick(DoubleClickEvent event) {
                openConfiguration.run();
            }
        });

        tableViewer.addSelectionChangedListener(new ISelectionChangedListener() {
            public void selectionChanged(SelectionChangedEvent event) {
                updateActionsStates();
            }
        });

        // Initializing the PartListener
        getSite().getPage().addPartListener(new IPartListener2() {
            /**
              * This implementation deactivates the shortcuts when the part is deactivated.
              */
            public void partDeactivated(IWorkbenchPartReference partRef) {
                if (partRef.getPart(false) == instance && contextActivation != null) {
                    ICommandService commandService = (ICommandService) PlatformUI.getWorkbench()
                            .getAdapter(ICommandService.class);
                    if (commandService != null) {
                        commandService.getCommand(newServer.getActionDefinitionId()).setHandler(null);
                        commandService.getCommand(openConfiguration.getActionDefinitionId()).setHandler(null);
                        commandService.getCommand(delete.getActionDefinitionId()).setHandler(null);
                        commandService.getCommand(rename.getActionDefinitionId()).setHandler(null);
                        commandService.getCommand(start.getActionDefinitionId()).setHandler(null);
                        commandService.getCommand(stop.getActionDefinitionId()).setHandler(null);
                        commandService.getCommand(properties.getActionDefinitionId()).setHandler(null);
                    }

                    IContextService contextService = (IContextService) PlatformUI.getWorkbench()
                            .getAdapter(IContextService.class);
                    contextService.deactivateContext(contextActivation);
                    contextActivation = null;
                }
            }

            /**
             * This implementation activates the shortcuts when the part is activated.
             */
            public void partActivated(IWorkbenchPartReference partRef) {
                if (partRef.getPart(false) == instance) {
                    IContextService contextService = (IContextService) PlatformUI.getWorkbench()
                            .getAdapter(IContextService.class);
                    contextActivation = contextService
                            .activateContext(LdapServersPluginConstants.CONTEXTS_SERVERS_VIEW);

                    ICommandService commandService = (ICommandService) PlatformUI.getWorkbench()
                            .getAdapter(ICommandService.class);
                    if (commandService != null) {
                        commandService.getCommand(newServer.getActionDefinitionId())
                                .setHandler(new ActionHandler(newServer));
                        commandService.getCommand(openConfiguration.getActionDefinitionId())
                                .setHandler(new ActionHandler(openConfiguration));
                        commandService.getCommand(delete.getActionDefinitionId())
                                .setHandler(new ActionHandler(delete));
                        commandService.getCommand(rename.getActionDefinitionId())
                                .setHandler(new ActionHandler(rename));
                        commandService.getCommand(start.getActionDefinitionId())
                                .setHandler(new ActionHandler(start));
                        commandService.getCommand(stop.getActionDefinitionId()).setHandler(new ActionHandler(stop));
                        commandService.getCommand(properties.getActionDefinitionId())
                                .setHandler(new ActionHandler(properties));
                    }
                }
            }

            public void partBroughtToTop(IWorkbenchPartReference partRef) {
            }

            public void partClosed(IWorkbenchPartReference partRef) {
            }

            public void partHidden(IWorkbenchPartReference partRef) {
            }

            public void partInputChanged(IWorkbenchPartReference partRef) {
            }

            public void partOpened(IWorkbenchPartReference partRef) {
            }

            public void partVisible(IWorkbenchPartReference partRef) {
            }
        });
    }

    /**
     * Enables or disables the actions according to the current selection 
     * in the viewer.
     */
    public void updateActionsStates() {
        // Getting the selection
        StructuredSelection selection = (StructuredSelection) tableViewer.getSelection();

        if (!selection.isEmpty()) {
            LdapServer server = (LdapServer) selection.getFirstElement();

            switch (server.getStatus()) {
            case STARTED:
                start.setEnabled(false);
                stop.setEnabled(true);
                break;
            case REPAIRING:
            case STARTING:
                start.setEnabled(false);
                stop.setEnabled(false);
                break;
            case STOPPED:
                start.setEnabled(true);
                stop.setEnabled(false);
                break;
            case STOPPING:
                start.setEnabled(false);
                stop.setEnabled(false);
                break;
            case UNKNOWN:
                start.setEnabled(false);
                stop.setEnabled(false);
                break;
            }

            openConfiguration.setEnabled(server.getLdapServerAdapterExtension().isOpenConfigurationActionEnabled());
            delete.setEnabled(true);
            rename.setEnabled(true);
            properties.setEnabled(true);
        } else {
            openConfiguration.setEnabled(false);
            delete.setEnabled(false);
            rename.setEnabled(false);
            start.setEnabled(false);
            stop.setEnabled(false);
            properties.setEnabled(false);
        }
    }

    /**
     * Gets the table viewer.
     *
     * @return
     *      the table viewer
     */
    public TreeViewer getViewer() {
        return tableViewer;
    }

    /**
     * {@inheritDoc}
     */
    public void dispose() {
        LdapServersManager.getDefault().removeListener(ldapServersManagerListener);

        super.dispose();
    }

    /**
     * Refreshes the Servers View asynchronously.
     */
    private void asyncRefresh() {
        Display.getDefault().asyncExec(new Runnable() {
            public void run() {
                tableViewer.refresh();
            }
        });
    }

    private SelectionListener getColumnSelectionListener(final int column) {
        return new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                TreeColumn treeColumn = (TreeColumn) e.widget;
                tableViewer.sort(treeColumn, column);
            }
        };
    }
}