/**
* This file Copyright (c) 2005-2008 Aptana, Inc. This program is
* dual-licensed under both the Aptana Public License and the GNU General
* Public license. You may elect to use one or the other of these licenses.
*
* This program is distributed in the hope that it will be useful, but
* AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or
* NONINFRINGEMENT. Redistribution, except as permitted by whichever of
* the GPL or APL you select, is prohibited.
*
* 1. For the GPL license (GPL), you can redistribute and/or modify this
* program under the terms of the GNU General Public License,
* Version 3, as published by the Free Software Foundation. You should
* have received a copy of the GNU General Public License, Version 3 along
* with this program; if not, write to the Free Software Foundation, Inc., 51
* Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Aptana provides a special exception to allow redistribution of this file
* with certain other free and open source software ("FOSS") code and certain additional terms
* pursuant to Section 7 of the GPL. You may view the exception and these
* terms on the web at http://www.aptana.com/legal/gpl/.
*
* 2. For the Aptana Public License (APL), this program and the
* accompanying materials are made available under the terms of the APL
* v1.0 which accompanies this distribution, and is available at
* http://www.aptana.com/legal/apl/.
*
* You may view the GPL, Aptana's exception and additional terms, and the
* APL in the file titled license.html at the root of the corresponding
* plugin containing this source file.
*
* Any modifications to this file must keep this entire header intact.
*/
package com.aptana.ide.server.ui.views;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
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.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.action.ToolBarManager;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.layout.GridLayoutFactory;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ITreeViewerListener;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TreeExpansionEvent;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.ToolBar;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeColumn;
import org.eclipse.ui.IWorkbenchActionConstants;
import org.eclipse.ui.actions.ActionFactory;
import org.eclipse.ui.actions.ActionFactory.IWorkbenchAction;
import org.eclipse.ui.forms.widgets.FormText;
import org.eclipse.ui.part.ViewPart;
import org.eclipse.ui.progress.UIJob;
import com.aptana.ide.core.IdeLog;
import com.aptana.ide.core.StringUtils;
import com.aptana.ide.core.ui.CoreUIPlugin;
import com.aptana.ide.core.ui.PreferenceUtils;
import com.aptana.ide.core.ui.widgets.ToolbarTooltip;
import com.aptana.ide.core.ui.widgets.TreeViewerSorter;
import com.aptana.ide.server.ServerCore;
import com.aptana.ide.server.core.IAbstractConfiguration;
import com.aptana.ide.server.core.IServer;
import com.aptana.ide.server.core.IServerManagerListener;
import com.aptana.ide.server.core.ServerManagerEvent;
import com.aptana.ide.server.core.impl.Configuration;
import com.aptana.ide.server.core.impl.servers.ServerManager;
import com.aptana.ide.server.ui.IConfigurationDialog;
import com.aptana.ide.server.ui.ServerDialogPageRegistry;
import com.aptana.ide.server.ui.ServerUIPlugin;
import com.aptana.ide.server.ui.preferences.IPreferenceConstants;
import com.aptana.ide.server.ui.views.actions.GenericAddServerAction;
import com.aptana.ide.server.ui.views.actions.ICanEdit;
import com.aptana.ide.server.ui.views.actions.OpenConsole;
import com.aptana.ide.server.ui.views.actions.OpenLogAction;
import com.aptana.ide.server.ui.views.actions.OpenStatisticsAction;
import com.aptana.ide.server.ui.views.actions.RestartServerAction;
import com.aptana.ide.server.ui.views.actions.StartServerAction;
import com.aptana.ide.server.ui.views.actions.StopServerAction;
import com.aptana.ide.server.ui.views.actions.SuspendServerAction;
/**
* This view displays the existing web servers in the workspace. Users can start, stop and edit the servers from this
* view.
*
* @author Pavel Petrochenko
*/
public class GenericServersView extends ViewPart
{
/**
* @author Pavel Petrochenko
*/
private final class DeleteServerConfirmDialog extends MessageDialog
{
private Button stopServer;
private boolean shouldStop;
private boolean mayStop;
private boolean askStopBeforeDelete;
private DeleteServerConfirmDialog(Shell parentShell, String dialogTitle, Image dialogTitleImage,
String dialogMessage, int dialogImageType, String[] dialogButtonLabels, int defaultIndex,
boolean mayStop, boolean askStopBeforeDelete)
{
super(parentShell, dialogTitle, dialogTitleImage, dialogMessage, dialogImageType, dialogButtonLabels,
defaultIndex);
this.mayStop = mayStop;
this.askStopBeforeDelete = askStopBeforeDelete;
}
/**
* @see org.eclipse.jface.dialogs.MessageDialog#createButtonsForButtonBar(org.eclipse.swt.widgets.Composite)
*/
@Override
protected void createButtonsForButtonBar(Composite parent)
{
if (askStopBeforeDelete) {
GridLayout ll = (GridLayout) parent.getLayout();
ll.numColumns++;
ll.makeColumnsEqualWidth = false;
GridData layoutData = (GridData) parent.getLayoutData();
layoutData.grabExcessHorizontalSpace = true;
layoutData.horizontalAlignment = SWT.FILL;
stopServer = new Button(parent, SWT.CHECK);
stopServer.setText(Messages.GenericServersView_STOP_SERVER_BEFORE_DELETING);
stopServer.setEnabled(mayStop);
stopServer.setSelection(mayStop);
stopServer.addSelectionListener(new SelectionAdapter()
{
public void widgetSelected(SelectionEvent e)
{
shouldStop = stopServer.getSelection();
}
});
GridData gridData = new GridData();
gridData.horizontalAlignment = SWT.LEFT;
gridData.grabExcessHorizontalSpace = true;
gridData.horizontalIndent = 5;
stopServer.setLayoutData(gridData);
}
super.createButtonsForButtonBar(parent);
}
}
private static final int MAX_SHOWN_SERVER_NAME = 15;
/**
* ID
*/
public static final String ID = "com.aptana.ide.server.ui.serversView"; //$NON-NLS-1$
/**
*
*/
private static final String ELLIPSIS = "..."; //$NON-NLS-1$
private TreeViewer serverViewer;
private Action startAction;
private IContributionItem debugActionItem;
private IContributionItem profileActionItem;
private Action debugAction;
private Action profileAction;
private Action stopAction;
private Action restartAction;
private Action collapseAction;
private Action expandAction;
private IServerManagerListener externalServerRegistryListener;
private SuspendServerAction pauseAction;
private OpenLogAction openLog;
private OpenStatisticsAction openStats;
/**
* Constructor.
*/
public GenericServersView()
{
super();
}
/**
* @see org.eclipse.ui.IWorkbenchPart#dispose()
*/
public void dispose()
{
ServerCore.getServerManager().removeServerManagerListener(externalServerRegistryListener);
super.dispose();
}
/**
* @return selection
*/
public ISelection getSelection()
{
return serverViewer.getSelection();
}
/**
* @see org.eclipse.ui.IWorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite)
*/
public void createPartControl(Composite parent)
{
GridLayout gridLayout = new GridLayout();
gridLayout.marginWidth = 0;
gridLayout.marginHeight = 0;
parent.setLayout(gridLayout);
createTableViewer(parent);
// PreferenceUtils.registerBackgroundColorPreference(serverViewer.getControl(),
// "com.aptana.ide.core.ui.background.color.serversView"); //$NON-NLS-1$
createPopupMenu();
createToolbar();
ToolBarManager toolBarManager = (ToolBarManager) getViewSite().getActionBars().getToolBarManager();
final Image smallGlobe = ServerUIPlugin.getImageDescriptor("icons/server/small_globe.png").createImage(); //$NON-NLS-1$
final Image jaxerImage = ServerUIPlugin.getImageDescriptor("icons/server/jaxer_decorator.gif").createImage(); //$NON-NLS-1$
final ToolBar control = toolBarManager.getControl();
final ToolbarTooltip toolbarTooltip = new ToolbarTooltip(control,
"com.aptana.ide.server.ui.servers_context_view") { //$NON-NLS-1$
@Override
protected Composite createToolTipContentArea(Event event, Composite parent)
{
Composite sm = new Composite(parent, SWT.NONE);
sm.setLayout(GridLayoutFactory.fillDefaults().margins(10, 10).create());
FormText ts = new FormText(sm, SWT.NONE);
ts.setImage("jaxer", jaxerImage); //$NON-NLS-1$
ts.setImage("web", smallGlobe); //$NON-NLS-1$
ts.setText(Messages.GenericServersView_LEGEND, true, false);
ts.setLayoutData(new GridData(320, 75));
return sm;
}
};
this.serverViewer.getControl().addDisposeListener(new DisposeListener()
{
public void widgetDisposed(DisposeEvent e)
{
smallGlobe.dispose();
jaxerImage.dispose();
toolbarTooltip.deactivate();
}
});
TreeViewerSorter.bind(serverViewer);
}
/**
* Helper method to create the table viewer.
*
* @param parent
*/
private void createTableViewer(Composite parent)
{
serverViewer = new TreeViewer(parent, SWT.SINGLE | SWT.FULL_SELECTION);
serverViewer.getTree().setLinesVisible(true);
serverViewer.addTreeListener(new ITreeViewerListener()
{
public void treeExpanded(TreeExpansionEvent event)
{
Object server = event.getElement();
if (server instanceof IServer)
{
ServerUIPlugin.getDefault().getPreferenceStore().setValue(
IPreferenceConstants.COLLAPSE_SERVER + "." + ((IServer) server).getId(), false); //$NON-NLS-1$
}
updateCollapseAllAction();
}
public void treeCollapsed(TreeExpansionEvent event)
{
Object server = event.getElement();
if (server instanceof IServer)
{
ServerUIPlugin.getDefault().getPreferenceStore().setValue(
IPreferenceConstants.COLLAPSE_SERVER + "." + ((IServer) server).getId(), true); //$NON-NLS-1$
}
updateCollapseAllAction();
}
});
PreferenceUtils.registerBackgroundColorPreference(serverViewer.getControl(),
"com.aptana.ide.core.ui.background.color.serversView"); //$NON-NLS-1$
PreferenceUtils.registerForegroundColorPreference(serverViewer.getControl(),
"com.aptana.ide.core.ui.foreground.color.serversView"); //$NON-NLS-1$
createTree();
}
private void updateStartActions()
{
boolean canDebug = false;
boolean canProfile = false;
IServer[] servers = ServerManager.getInstance().getServers();
if (debugActionItem != null)
{
for (int i = 0; i < servers.length; i++)
{
IStatus status = servers[i].canStart("debug"); //$NON-NLS-1$
if (status != null && status.isOK())
{
canDebug = true;
break;
}
}
debugActionItem.setVisible(canDebug);
}
if (profileActionItem != null)
{
for (int i = 0; i < servers.length; i++)
{
IStatus status = servers[i].canStart("profile"); //$NON-NLS-1$
if (status != null && status.isOK())
{
canProfile = true;
break;
}
}
profileActionItem.setVisible(canProfile);
}
}
private void updateCollapseAllAction()
{
UIJob updateActionState = new UIJob("") {
public IStatus runInUIThread(IProgressMonitor monitor) {
if (collapseAction != null) {
collapseAction.setEnabled(serverViewer.getExpandedElements().length > 0);
}
return Status.OK_STATUS;
}
};
updateActionState.setPriority(UIJob.INTERACTIVE);
updateActionState.setSystem(true);
updateActionState.schedule(10);
}
private void updateExpandAllAction()
{
UIJob updateActionState = new UIJob("") {
public IStatus runInUIThread(IProgressMonitor monitor) {
if (expandAction != null) {
IStructuredContentProvider contentProvider = (IStructuredContentProvider) serverViewer.getContentProvider();
Object[] elements = contentProvider.getElements(serverViewer.getInput());
boolean atleastOneExpandable = false;
for (Object element : elements) {
if (serverViewer.isExpandable(element)) {
atleastOneExpandable = true;
break;
}
}
expandAction.setEnabled(atleastOneExpandable);
}
return Status.OK_STATUS;
}
};
updateActionState.setPriority(UIJob.INTERACTIVE);
updateActionState.setSystem(true);
updateActionState.schedule(10);
}
private void createToolbar()
{
final IToolBarManager toolBarManager = getViewSite().getActionBars().getToolBarManager();
toolBarManager.add(new Separator());
this.startAction = new StartServerAction(serverViewer, "run"); //$NON-NLS-1$
this.debugAction = new StartServerAction(serverViewer, "debug"); //$NON-NLS-1$
this.profileAction = new StartServerAction(serverViewer, "profile"); //$NON-NLS-1$
debugActionItem = new ActionContributionItem(this.debugAction);
profileActionItem = new ActionContributionItem(this.profileAction);
this.restartAction = new RestartServerAction(serverViewer);
this.pauseAction = new SuspendServerAction(serverViewer);
this.stopAction = new StopServerAction(serverViewer);
this.openLog = new OpenLogAction(serverViewer);
this.openStats = new OpenStatisticsAction(serverViewer);
this.collapseAction = new Action()
{
public void run()
{
serverViewer.collapseAll();
updateCollapseAllAction();
}
};
this.collapseAction.setImageDescriptor(CoreUIPlugin.getImageDescriptor("icons/collapse.gif")); //$NON-NLS-1$
this.collapseAction.setToolTipText(Messages.GenericServersView_TTP_Collapse);
this.expandAction = new Action()
{
public void run()
{
serverViewer.expandAll();
updateCollapseAllAction();
}
};
this.expandAction.setImageDescriptor(CoreUIPlugin.getImageDescriptor("icons/expand.gif")); //$NON-NLS-1$
this.expandAction.setToolTipText(Messages.GenericServersView_TTP_Expand);
toolBarManager.add(new GenericAddServerAction());
toolBarManager.add(this.startAction);
toolBarManager.add(debugActionItem);
toolBarManager.add(profileActionItem);
toolBarManager.add(this.restartAction);
toolBarManager.add(this.pauseAction);
toolBarManager.add(this.stopAction);
serverViewer.addSelectionChangedListener(new ISelectionChangedListener()
{
public void selectionChanged(SelectionChangedEvent event)
{
updateToolbar(toolBarManager);
}
});
externalServerRegistryListener = new IServerManagerListener()
{
public void serversChanged(final ServerManagerEvent event)
{
Display.getDefault().asyncExec(new Runnable()
{
public void run()
{
if (serverViewer.getControl().isDisposed())
{
return;
}
if (event.getKind() == ServerManagerEvent.KIND_CHANGED)
{
serverViewer.refresh(event.getServer(), true);
}
else
{
serverViewer.refresh(true);
if (event.getKind() == ServerManagerEvent.KIND_ADDED)
{
if (!ServerUIPlugin.getDefault().getPreferenceStore().getBoolean(
IPreferenceConstants.COLLAPSE_SERVER + "." + event.getServer().getId())) //$NON-NLS-1$
{
serverViewer.expandToLevel(event.getServer(), 2);
}
}
}
updateToolbar(toolBarManager);
}
});
}
};
ServerCore.getServerManager().addServerManagerListener(externalServerRegistryListener);
startAction.setEnabled(false);
restartAction.setEnabled(false);
stopAction.setEnabled(false);
toolBarManager.add(new Separator());
openConsole = new OpenConsole(serverViewer);
toolBarManager.add(new Separator("helpEnd")); //$NON-NLS-1$
toolBarManager.add(openConsole);
toolBarManager.add(openLog);
toolBarManager.add(openStats);
toolBarManager.add(new Separator());
toolBarManager.add(collapseAction);
toolBarManager.add(expandAction);
updateStartActions();
updateToolbar(toolBarManager);
}
private void updateToolbar(final IToolBarManager toolBarManager)
{
IStructuredSelection selection = (IStructuredSelection) serverViewer.getSelection();
this.pauseAction.selectionChanged(new SelectionChangedEvent(this.serverViewer, selection));
this.openLog.selectionChanged(new SelectionChangedEvent(this.serverViewer, selection));
if (selection.isEmpty())
{
startAction.setEnabled(false);
debugAction.setEnabled(false);
profileAction.setEnabled(false);
restartAction.setEnabled(false);
stopAction.setEnabled(false);
}
else
{
IServer server = (IServer) selection.getFirstElement();
// boolean isStopped = server.getServerState() == IServer.STATE_STOPPED;
IStatus canStart0 = server.canStart("run");//$NON-NLS-1$
startAction.setEnabled(canStart0.isOK());
if (!canStart0.isOK())
{
startAction.setToolTipText(canStart0.getMessage());
}
else
{
startAction.setToolTipText(Messages.ServersView_START);
}
IStatus canStart = server.canStart("debug");//$NON-NLS-1$
debugAction.setEnabled(canStart.isOK());
if (!canStart.isOK())
{
debugAction.setToolTipText(canStart.getMessage());
}
else
{
debugAction.setToolTipText(Messages.ServersView_DEBUG);
}
IStatus canStart2 = server.canStart("profile"); //$NON-NLS-1$
profileAction.setEnabled(canStart2.isOK());
if (!canStart2.isOK())
{
profileAction.setToolTipText(canStart2.getMessage());
}
else
{
profileAction.setToolTipText(Messages.ServersView_PROFILE);
}
restartAction.setEnabled(server.canRestart(server.getMode()).getSeverity() == IStatus.OK);
stopAction.setEnabled(server.canStop().getSeverity() == IStatus.OK);
openConsole.selectionChanged(new SelectionChangedEvent(serverViewer, serverViewer.getSelection()));
}
updateStartActions();
updateCollapseAllAction();
updateExpandAllAction();
toolBarManager.update(true);
}
private void createTree()
{
final Tree serverTable = serverViewer.getTree();
serverTable.setHeaderVisible(true);
serverTable.setLayoutData(new GridData(GridData.FILL_BOTH));
TreeColumn nameColumn = new TreeColumn(serverTable, SWT.LEFT);
nameColumn.setText(Messages.ServersView_NAME);
nameColumn.setWidth(200);
TreeColumn statusColumn = new TreeColumn(serverTable, SWT.LEFT);
statusColumn.setText(Messages.ServersView_STATUS);
statusColumn.setWidth(100);
TreeColumn projectColumn = new TreeColumn(serverTable, SWT.LEFT);
projectColumn.setText(Messages.ServersView_DESCRIPTION);
projectColumn.setWidth(400);
TreeColumn typeColumn = new TreeColumn(serverTable, SWT.LEFT);
typeColumn.setText(Messages.ServersView_TYPE);
typeColumn.setWidth(100);
TreeColumn hostColumn = new TreeColumn(serverTable, SWT.LEFT);
hostColumn.setText(Messages.GenericServersView_HOST);
hostColumn.setWidth(100);
TreeColumn portColumn = new TreeColumn(serverTable, SWT.LEFT);
portColumn.setText(Messages.GenericServersView_PORT);
portColumn.setWidth(50);
serverViewer.setLabelProvider(new ServerLabelProvider());
serverViewer.setContentProvider(new ServerContentProvider());
serverViewer.setInput(ServerCore.getServerManager());
serverViewer.addDoubleClickListener(new IDoubleClickListener()
{
public void doubleClick(DoubleClickEvent event)
{
IStructuredSelection selection = (IStructuredSelection) serverViewer.getSelection();
final IServer server = (IServer) selection.getFirstElement();
if (server != null)
{
doEdit(server);
}
}
});
getSite().setSelectionProvider(serverViewer);
ServerUIPlugin default1 = ServerUIPlugin.getDefault();
final IPreferenceStore preferenceStore = default1.getPreferenceStore();
PreferenceUtils.persist(preferenceStore, serverTable, "serversView"); //$NON-NLS-1$
}
/**
* @see org.eclipse.ui.IWorkbenchPart#setFocus()
*/
public void setFocus()
{
serverViewer.getTree().setFocus();
}
private static IWorkbenchAction deleteAction;
private OpenConsole openConsole;
/**
* Creates and registers the context menu
*/
private void createPopupMenu()
{
deleteAction = ActionFactory.DELETE.create(getViewSite().getWorkbenchWindow());
MenuManager menuMgr = new MenuManager("#PopupMenu"); //$NON-NLS-1$
menuMgr.setRemoveAllWhenShown(true);
getViewSite().getActionBars().setGlobalActionHandler(ActionFactory.DELETE.getId(), new Action()
{
public void run()
{
doDelete();
}
});
menuMgr.addMenuListener(new IMenuListener()
{
public void menuAboutToShow(IMenuManager manager)
{
IContributionItem[] items = getViewSite().getActionBars().getToolBarManager().getItems();
for (int i = 0; i < items.length; i++)
{
if (items[i] instanceof ActionContributionItem)
{
ActionContributionItem aci = (ActionContributionItem) items[i];
IAction action = aci.getAction();
if (action == openLog)
{
// adds the Open Log action to the context menu as a push button instead of
// drop-down
boolean enabled = action.isEnabled();
action = new OpenLogAction(serverViewer, Action.AS_PUSH_BUTTON);
action.setEnabled(enabled);
}
if (action.isEnabled() && action.getStyle() != Action.AS_DROP_DOWN_MENU)
{
if (action.getText() == null || action.getText().length() == 0)
{
action.setText(action.getToolTipText());
}
manager.add(action);
}
}
else
{
if (items[i] instanceof Separator)
{
manager.add(new Separator());
}
}
}
manager.add(new Separator());
IStructuredSelection selection = (IStructuredSelection) serverViewer.getSelection();
final IServer server = (IServer) selection.getFirstElement();
if (server != null)
{
deleteAction.setText(StringUtils.format(Messages.ServersView_DELETE, getShortenName(server)));
// deleteAction.setEnabled(server.getServerState() == IServer.STATE_STOPPED);
deleteAction.setEnabled(server.canDelete().isOK());
manager.add(deleteAction);
Action action = new Action()
{
public void run()
{
doEdit(server);
}
};
action.setText(StringUtils.format(Messages.ServersView_EDIT, getShortenName(server)));
IStatus canModify = server.canModify();
IStatus canModifyInStoppedStateOnly = server.canModifyInStoppedStateOnly();
action.setEnabled(
((canModifyInStoppedStateOnly == null || canModifyInStoppedStateOnly.getCode() == IStatus.OK) ? server.getServerState() == IServer.STATE_STOPPED : true)
&& (canModify == null || canModify.getCode() == IStatus.OK));
manager.add(action);
}
// deleteAction.setEnabled(!selection.isEmpty());
manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS)); // Allow
}
private String getShortenName(final IServer server)
{
String name = server.getName();
int length = name.length();
if (length > MAX_SHOWN_SERVER_NAME)
{
int delta = (length - 15) / 2;
int pivot = length / 2;
int start = pivot - delta;
int end = pivot + delta;
String s1 = name.substring(0, start);
String s2 = name.substring(end, length);
String s = s1 + ELLIPSIS + s2;
return s;
}
return name;
}
});
Menu menu = menuMgr.createContextMenu(serverViewer.getControl());
serverViewer.getControl().setMenu(menu);
getSite().registerContextMenu(menuMgr, serverViewer);
}
private void doDelete()
{
IStructuredSelection selection = (IStructuredSelection) serverViewer.getSelection();
if (selection.isEmpty())
{
return;
}
IServer server = (IServer) selection.getFirstElement();
if (!server.canDelete().isOK())
{
return;
}
boolean mayStop = (server.getServerState() != IServer.STATE_STOPPED && server.getServerState() != IServer.STATE_UNKNOWN);
boolean askStopBeforeDelete = (server.askStopBeforeDelete().getCode() == IStatus.OK);
DeleteServerConfirmDialog dlg = new DeleteServerConfirmDialog(getViewSite().getShell(),
Messages.ServersView_CONFIRM_DELETE, null, StringUtils.format(Messages.ServersView_CONFIRM_DELETE_TEXT,
server.getName()), MessageDialog.QUESTION, new String[] { Messages.GenericServersView_YES,
Messages.GenericServersView_NO }, 0, mayStop, askStopBeforeDelete);
int openConfirm = dlg.open();
if (openConfirm != 0)
{
return;
}
boolean doStop = dlg.shouldStop;
if (doStop)
{
server.stop(true, null, null);
}
try
{
ServerCore.getServerManager().removeServer(server);
}
catch (CoreException e)
{
MessageDialog.openError(getViewSite().getShell(), Messages.ServersView_CONFIRM_DELETE, StringUtils.format(
Messages.ServersView_CONFIRM_DELETE_TEXT, server.getName()));
}
}
private void doEdit(final IServer server)
{
// if (server.getServerState() != IServer.STATE_STOPPED && server.getServerState() != IServer.STATE_UNKNOWN)
// {
// MessageDialog.openInformation(serverViewer.getControl().getShell(),
// Messages.GenericServersView_ServerReadOnly_TITLE,
// Messages.GenericServersView_ServerReadOnlyDescription);
// return;
// }
IStatus canModify = server.canModify();
if (canModify != null && canModify.getCode() != IStatus.OK)
{
MessageDialog.openInformation(serverViewer.getControl().getShell(),
Messages.GenericServersView_READONLY_TITLE, Messages.GenericServersView_READONLY_DESCRIPTION);
return;
}
ICanEdit adapter = (ICanEdit) server.getAdapter(ICanEdit.class);
if (adapter != null)
{
adapter.doEdit();
return;
}
IConfigurationDialog dialog = ServerDialogPageRegistry.getInstance().getDialog(server.getServerType().getId());
Configuration cf = new Configuration();
server.storeConfiguration(cf);
dialog.setConfiguration(cf);
dialog.setServer(server);
dialog.setEdit(true);
int open = dialog.getDialog().open();
if (open == Dialog.OK)
{
IAbstractConfiguration configuration = dialog.getConfiguration();
// configuration.setStringAttribute(IServer.KEY_ID,ServerManager.getFreeId());
configuration.setStringAttribute(IServer.KEY_TYPE, server.getServerType().getId());
try
{
server.reconfigure(configuration);
}
catch (CoreException e)
{
MessageDialog.openError(Display.getCurrent().getActiveShell(),
Messages.GenericServersView_ERROR_WHILE_EDITING_DESCRIPTION, e.getMessage());
IdeLog.log(ServerUIPlugin.getDefault(), IStatus.ERROR,
Messages.GenericServersView_ERROR_WHILE_EDITING_TITLE, e);
}
}
IStructuredSelection selection = (IStructuredSelection) serverViewer.getSelection();
this.pauseAction.selectionChanged(new SelectionChangedEvent(this.serverViewer, selection));
}
/**
* @param srv
*/
public void select(IServer srv)
{
serverViewer.setSelection(new StructuredSelection(srv), true);
}
}