org.apache.sling.ide.eclipse.ui.internal.ServersActionModeFiddlerActionDelegate.java Source code

Java tutorial

Introduction

Here is the source code for org.apache.sling.ide.eclipse.ui.internal.ServersActionModeFiddlerActionDelegate.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.sling.ide.eclipse.ui.internal;

import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;

import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.ActionContributionItem;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.action.IContributionItem;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.jface.viewers.DecorationOverlayIcon;
import org.eclipse.jface.viewers.IDecoration;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.IViewActionDelegate;
import org.eclipse.ui.IViewPart;
import org.eclipse.wst.server.core.IModule;
import org.eclipse.wst.server.core.IServer;
import org.eclipse.wst.server.ui.IServerModule;
import org.eclipse.wst.server.ui.internal.ImageResource;
import org.eclipse.wst.server.ui.internal.Messages;

/** prototype for changing icons and tooltip in the wst servers view - tbd properly **/
public class ServersActionModeFiddlerActionDelegate implements IViewActionDelegate {

    private IActionBars actionBars;
    private IViewPart view;
    private IPropertyChangeListener runTooltipListener;
    private IPropertyChangeListener debugTooltipListener;
    private IPropertyChangeListener disconnectTooltipListener;

    private List<ActionContributionItem> prependedToolbarActions = new LinkedList<>();
    private List<ActionContributionItem> appendedToolbarActionContributionItems = new LinkedList<>();
    private IServer server;
    private List<IModule[]> modules;
    private Action cleanAction;
    private Action publishAction;
    private ActionContributionItem wstPublishAction;
    private ActionContributionItem cleanActionContributionItem;
    private ActionContributionItem publishActionContributionItem;
    protected boolean doNotAskAgain = false; //TODO: move to preferences

    @Override
    public void run(IAction action) {

    }

    @Override
    public void selectionChanged(IAction action, ISelection selection) {
        server = null;
        modules = null;
        if (selection != null && (selection instanceof IStructuredSelection)) {
            IStructuredSelection iss = (IStructuredSelection) selection;
            Object first = iss.getFirstElement();
            if (first instanceof IServer) {
                server = (IServer) first;
                modules = null;
                if (iss.size() > 1) {
                    // verify that all selected elements are of type IServer
                    Iterator<?> it = iss.iterator();
                    it.next(); // skip the first, we have that above already
                    while (it.hasNext()) {
                        Object next = it.next();
                        if (!(next instanceof IServer)) {
                            server = null;
                            modules = null;
                            break;
                        }
                    }
                }
            } else if (first instanceof IServerModule) {
                modules = new LinkedList<>();
                IServerModule module = (IServerModule) first;
                modules.add(module.getModule());
                server = module.getServer();
                if (iss.size() > 1) {
                    // verify that all selected elements are of type IServerModule
                    // plus add the module[] to the modules list
                    Iterator<?> it = iss.iterator();
                    it.next(); // skip the first, we have that above already
                    while (it.hasNext()) {
                        Object next = it.next();
                        if (!(next instanceof IServerModule)) {
                            server = null;
                            module = null;
                            break;
                        } else {
                            module = (IServerModule) next;
                            modules.add(module.getModule());
                        }
                    }
                }
            }
        }

        if (server != null) {
            if (server.getServerState() != IServer.STATE_STARTED) {
                server = null;
                modules = null;
            }
        }
        cleanAction.setEnabled(server != null);
        publishAction.setEnabled(server != null);

        action.setEnabled(true);
        final IAction serverRunAction = actionBars.getGlobalActionHandler("org.eclipse.wst.server.run");
        final IAction serverDebugAction = actionBars.getGlobalActionHandler("org.eclipse.wst.server.debug");
        IAction stopRunAction = actionBars.getGlobalActionHandler("org.eclipse.wst.server.stop");
        if (serverRunAction == null || stopRunAction == null || serverDebugAction == null) {
            return;
        }
        //      serverRunAction.setHoverImageDescriptor(SharedImages.SLING_LOG);
        serverRunAction.setHoverImageDescriptor(SharedImages.RUN_CONNECT);
        serverDebugAction.setHoverImageDescriptor(SharedImages.DEBUG_CONNECT);
        stopRunAction.setHoverImageDescriptor(SharedImages.DISCONNECT);

        findWstPublishAction();

        for (ActionContributionItem appendedAction : appendedToolbarActionContributionItems) {
            if (!contributionAdded(appendedAction)) {
                actionBars.getToolBarManager().add(appendedAction);
            }
        }
        if (wstPublishAction != null) {
            wstPublishAction.setVisible(false);
            publishActionContributionItem.setVisible(true);
        } else {
            // otherwise hide it, as it is an unexpected situation
            publishActionContributionItem.setVisible(false);
        }

        final String runText = "Connect to server in run mode";
        if (runTooltipListener == null) {
            runTooltipListener = new IPropertyChangeListener() {

                @Override
                public void propertyChange(PropertyChangeEvent event) {
                    if (event.getProperty().equals(IAction.TOOL_TIP_TEXT)) {
                        if (!event.getNewValue().equals(runText)) {
                            serverRunAction.setToolTipText(runText);
                        }
                    }
                }
            };
            serverRunAction.addPropertyChangeListener(runTooltipListener);
        }
        final String debugText = "Connect to server in debug mode";
        if (debugTooltipListener == null) {
            debugTooltipListener = new IPropertyChangeListener() {

                @Override
                public void propertyChange(PropertyChangeEvent event) {
                    if (event.getProperty().equals(IAction.TOOL_TIP_TEXT)) {
                        if (!event.getNewValue().equals(debugText)) {
                            serverDebugAction.setToolTipText(debugText);
                        }
                    }
                }
            };
            serverDebugAction.addPropertyChangeListener(debugTooltipListener);
        }
        final String disconnectText = "Disconnect from server";
        if (disconnectTooltipListener == null) {
            disconnectTooltipListener = new IPropertyChangeListener() {

                @Override
                public void propertyChange(PropertyChangeEvent event) {
                    if (event.getProperty().equals(IAction.TOOL_TIP_TEXT)) {
                        if (!event.getNewValue().equals(disconnectText)) {
                            serverRunAction.setToolTipText(disconnectText);
                        }
                    }
                }
            };
            stopRunAction.addPropertyChangeListener(disconnectTooltipListener);
        }

        serverRunAction.setToolTipText(runText);
        serverDebugAction.setToolTipText(debugText);
        stopRunAction.setToolTipText(disconnectText);

    }

    private void findWstPublishAction() {
        if (wstPublishAction != null) {
            return;
        }
        IContributionItem[] items = actionBars.getToolBarManager().getItems();
        for (IContributionItem item : items) {
            if (item instanceof ActionContributionItem) {
                ActionContributionItem actionItem = (ActionContributionItem) item;
                IAction a = actionItem.getAction();
                if ("org.eclipse.wst.server.publish".equals(a.getActionDefinitionId())) {
                    wstPublishAction = actionItem;
                    //                    item.setVisible(false);
                    //                    actionBars.getToolBarManager().remove(item);
                }
            }
        }

    }

    private boolean contributionAdded(ActionContributionItem action) {
        IContributionItem[] items = actionBars.getToolBarManager().getItems();
        for (IContributionItem iContributionItem : items) {
            if (iContributionItem == action) {
                return true;
            }
        }
        return false;
    }

    @Override
    public void init(IViewPart view) {
        this.view = view;
        actionBars = view.getViewSite().getActionBars();
        initToolbarContributedActions();
        for (ActionContributionItem actionContributionItem : prependedToolbarActions) {
            // TODO - this looks wrong
            IAction action = (IAction) actionContributionItem;
            final ActionContributionItem contribution = new ActionContributionItem(action);
            actionBars.getToolBarManager().add(contribution);
        }
    }

    private void initToolbarContributedActions() {
        cleanAction = new Action("Clean Publish...", IAction.AS_PUSH_BUTTON) {
            public void run() {
                if (server == null) {
                    MessageDialog.openInformation(view.getSite().getShell(), "No server selected",
                            "A server must be selected");
                    return;
                }
                int selection = 2;
                if (!doNotAskAgain) {
                    MessageDialog dialog = new MessageDialog(view.getSite().getShell(), Messages.defaultDialogTitle,
                            null, Messages.dialogPublishClean, MessageDialog.QUESTION_WITH_CANCEL,
                            new String[] { "Cancel", "OK (do not ask again)", "OK" }, 1) {
                        @Override
                        protected void configureShell(Shell shell) {
                            super.configureShell(shell);
                            setShellStyle(getShellStyle() | SWT.SHEET);
                        }
                    };
                    selection = dialog.open();
                }
                if (selection != 0) {
                    if (selection == 1) {
                        doNotAskAgain = true;
                    }
                    IAdaptable info = new IAdaptable() {
                        public Object getAdapter(Class adapter) {
                            if (Shell.class.equals(adapter))
                                return view.getSite().getShell();
                            if (String.class.equals(adapter))
                                return "user";
                            return null;
                        }
                    };

                    server.publish(IServer.PUBLISH_CLEAN, modules, info, null);
                }
            }
        };
        cleanAction.setText("Clean Publish...");
        cleanAction.setToolTipText("Clean and Publish...");
        ImageDescriptor cleanAndPublishImageDesc = new DecorationOverlayIcon(
                ImageResource.getImageDescriptor(ImageResource.IMG_CLCL_PUBLISH).createImage(),
                ImageDescriptor.createFromFile(SharedImages.class, "refresh.gif"), IDecoration.BOTTOM_RIGHT);
        cleanAction.setImageDescriptor(cleanAndPublishImageDesc);
        cleanAction.setId("org.apache.sling.ide.eclipse.ui.actions.CleanPublishAction");
        publishAction = new Action("Publish", IAction.AS_PUSH_BUTTON) {
            public void run() {
                if (server == null) {
                    MessageDialog.openInformation(view.getSite().getShell(), "No server selected",
                            "A server must be selected");
                    return;
                }
                IAdaptable info = new IAdaptable() {
                    public Object getAdapter(Class adapter) {
                        if (Shell.class.equals(adapter))
                            return view.getSite().getShell();
                        if (String.class.equals(adapter))
                            return "user";
                        return null;
                    }
                };

                server.publish(IServer.PUBLISH_INCREMENTAL, modules, info, null);
            }
        };
        publishAction.setText("Publish");
        publishAction.setToolTipText("Publish");
        publishAction.setImageDescriptor(ImageResource.getImageDescriptor(ImageResource.IMG_CLCL_PUBLISH));
        publishAction.setId("org.apache.sling.ide.eclipse.ui.actions.PublishAction");
        cleanAction.setEnabled(false);
        publishAction.setEnabled(false);

        cleanActionContributionItem = new ActionContributionItem(cleanAction);
        publishActionContributionItem = new ActionContributionItem(publishAction);

        appendedToolbarActionContributionItems.add(publishActionContributionItem);
        appendedToolbarActionContributionItems.add(cleanActionContributionItem);
    }

}