| /* |
| * 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); |
| } |
| |
| } |