/******************************************************************************* * Copyright (c) 2014 Zend Technologies Ltd. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Zend Technologies Ltd. - initial API and implementation *******************************************************************************/ package org.zend.php.server.internal.ui.views; import java.util.ArrayList; import java.util.List; import org.eclipse.core.runtime.preferences.IEclipsePreferences; import org.eclipse.core.runtime.preferences.IEclipsePreferences.IPreferenceChangeListener; import org.eclipse.core.runtime.preferences.IEclipsePreferences.PreferenceChangeEvent; import org.eclipse.core.runtime.preferences.InstanceScope; import org.eclipse.jface.action.IAction; 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.viewers.DoubleClickEvent; import org.eclipse.jface.viewers.IDoubleClickListener; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.ISelectionProvider; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.php.internal.server.core.Activator; import org.eclipse.php.internal.server.core.Server; import org.eclipse.php.internal.server.core.manager.IServersManagerListener; import org.eclipse.php.internal.server.core.manager.ServerManagerEvent; import org.eclipse.php.internal.server.core.manager.ServersManager; import org.eclipse.php.server.core.types.IServerType; import org.eclipse.php.server.core.types.ServerTypesManager; import org.eclipse.swt.SWT; import org.eclipse.swt.dnd.DND; import org.eclipse.swt.dnd.Transfer; import org.eclipse.swt.events.HelpEvent; import org.eclipse.swt.events.HelpListener; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Menu; import org.eclipse.ui.IActionBars; import org.eclipse.ui.IWorkbenchActionConstants; import org.eclipse.ui.internal.help.WorkbenchHelpSystem; import org.eclipse.ui.part.ResourceTransfer; import org.eclipse.ui.part.ViewPart; import org.zend.php.server.internal.ui.actions.ActionContributionsManager; import org.zend.php.server.internal.ui.actions.AddServerAction; import org.zend.php.server.internal.ui.actions.EditServerAction; import org.zend.php.server.internal.ui.actions.RemoveServerAction; import org.zend.php.server.internal.ui.actions.SetDefaultServerAction; /** * @author Wojciech Galanciak, 2014 * */ @SuppressWarnings("restriction") public class ServersView extends ViewPart implements IServersManagerListener, IPreferenceChangeListener { public static final String ID = "org.zend.php.server.ui.views.ServersView"; //$NON-NLS-1$ private TreeViewer viewer; private IAction editAction; private IAction removeAction; private IAction setDefaultAction; public ServersView() { ServersManager.addManagerListener(this); IEclipsePreferences prefs = InstanceScope.INSTANCE .getNode(Activator.PLUGIN_ID); prefs.addPreferenceChangeListener(this); } @Override public void createPartControl(Composite parent) { viewer = new TreeViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL); viewer.setContentProvider(new ViewContentProvider()); viewer.setLabelProvider(new ViewLabelProvider(viewer.getTree() .getFont())); viewer.setInput(ServersManager.getInstance()); DropTransferListener transferListener = new DropTransferListener(viewer); transferListener.setExpandEnabled(false); ResourceTransfer resourceTransfer = ResourceTransfer.getInstance(); Transfer[] transfers = new Transfer[] { resourceTransfer }; viewer.addDropSupport(DND.DROP_COPY | DND.DROP_MOVE, transfers, transferListener); createActions(); contributeToActionBars(); hookDoubleClickAction(); hookContextMenu(); viewer.getControl().setData(WorkbenchHelpSystem.HELP_KEY, ID); viewer.getControl().addHelpListener(new HelpListener() { public void helpRequested(HelpEvent arg0) { org.eclipse.swt.program.Program.launch(ID); } }); } @Override public void dispose() { ServersManager.removeManagerListener(this); IEclipsePreferences prefs = InstanceScope.INSTANCE .getNode(Activator.PLUGIN_ID); prefs.removePreferenceChangeListener(this); super.dispose(); } @Override public void setFocus() { viewer.getControl().setFocus(); } @Override public void serverAdded(ServerManagerEvent event) { refreshViewer(); } @Override public void serverRemoved(ServerManagerEvent event) { refreshViewer(); } @Override public void serverModified(ServerManagerEvent event) { refreshViewer(); } @Override public void preferenceChange(PreferenceChangeEvent event) { if (ServersManager.DEFAULT_SERVER_PREFERENCES_KEY .equals(event.getKey())) { refreshViewer(); } } public ISelectionProvider getSelectionProvider() { return viewer; } private void createActions() { setDefaultAction = new SetDefaultServerAction(getSelectionProvider()); editAction = new EditServerAction(getSelectionProvider()); removeAction = new RemoveServerAction(getSelectionProvider()); } private void contributeToActionBars() { IActionBars actionBars = getViewSite().getActionBars(); IToolBarManager toolBarManager = actionBars.getToolBarManager(); toolBarManager.add(new AddServerAction()); toolBarManager.add(setDefaultAction); toolBarManager.add(editAction); toolBarManager.add(removeAction); } private void refreshViewer() { if (viewer == null || viewer.getTree() == null || viewer.getTree().isDisposed()) { return; } viewer.getControl().getDisplay().asyncExec(new Runnable() { public void run() { viewer.refresh(); } }); } private void hookDoubleClickAction() { viewer.addDoubleClickListener(new IDoubleClickListener() { public void doubleClick(DoubleClickEvent event) { editAction.run(); } }); } private void hookContextMenu() { MenuManager menuMgr = new MenuManager("#PopupMenu"); //$NON-NLS-1$ menuMgr.setRemoveAllWhenShown(true); menuMgr.addMenuListener(new IMenuListener() { public void menuAboutToShow(IMenuManager manager) { ServersView.this.fillContextMenu(manager); } }); Menu menu = menuMgr.createContextMenu(viewer.getControl()); viewer.getControl().setMenu(menu); getSite().registerContextMenu(menuMgr, viewer); // ZSTD-4911 - make the viewer selection available to avoid other // plugins contributing arbitrary items to this context menu getSite().setSelectionProvider(viewer); } private void fillContextMenu(IMenuManager manager) { List<Server> servers = getSelection(getSelectionProvider()); if (servers != null && servers.size() > 0) { if (servers.size() == 1) { Server server = servers.get(0); IServerType type = ServerTypesManager.getInstance().getType( server); IAction[] actions = ActionContributionsManager.getInstance() .getActions(type, server); if (actions != null) { for (IAction action : actions) { manager.add(action); } } manager.add(setDefaultAction); manager.add(editAction); } manager.add(removeAction); manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS)); } } private List<Server> getSelection(ISelectionProvider provider) { List<Server> result = new ArrayList<Server>(); if (provider != null) { ISelection selection = provider.getSelection(); if (selection != null && !selection.isEmpty()) { List<?> list = ((IStructuredSelection) selection).toList(); for (Object object : list) { if (object instanceof Server) { result.add((Server) object); } } } } return result; } }