/*******************************************************************************
* Copyright (c) 2009 IBM Corporation and others.
* 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:
* IBM Corporation - initial API and implementation
* Zend Technologies
*******************************************************************************/
package org.eclipse.php.internal.server.ui;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.runtime.Assert;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.jface.preference.PreferencePage;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.jface.viewers.*;
import org.eclipse.jface.window.Window;
import org.eclipse.php.internal.server.PHPServerUIMessages;
import org.eclipse.php.internal.server.core.Server;
import org.eclipse.php.internal.server.core.manager.ServersManager;
import org.eclipse.php.internal.ui.preferences.IPreferenceConfigurationBlock;
import org.eclipse.php.internal.ui.preferences.ScrolledCompositeImpl;
import org.eclipse.php.internal.ui.util.StatusInfo;
import org.eclipse.php.internal.ui.util.StatusUtil;
import org.eclipse.php.internal.ui.util.TableSorter;
import org.eclipse.php.internal.ui.wizards.WizardModel;
import org.eclipse.php.internal.ui.wizards.fields.DialogField;
import org.eclipse.php.internal.ui.wizards.fields.IDialogFieldListener;
import org.eclipse.php.internal.ui.wizards.fields.IListAdapter;
import org.eclipse.php.internal.ui.wizards.fields.ListDialogField;
import org.eclipse.php.server.core.types.IServerType;
import org.eclipse.php.server.core.types.ServerTypesManager;
import org.eclipse.php.server.ui.types.IServerTypeDescriptor;
import org.eclipse.php.server.ui.types.IServerTypeDescriptor.ImageType;
import org.eclipse.php.server.ui.types.ServerTypesDescriptorRegistry;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.*;
import org.eclipse.ui.PlatformUI;
import org.eclipse.wst.sse.ui.internal.preferences.OverlayPreferenceStore;
public class PHPServersConfigurationBlock implements IPreferenceConfigurationBlock {
private static final int IDX_ADD = 0;
private static final int IDX_EDIT = 1;
private static final int IDX_REMOVE = 2;
private static final int IDX_DEFAULT = 3;
private IStatus fServersStatus;
private ListDialogField fServersList;
private PreferencePage fMainPreferencePage;
public PHPServersConfigurationBlock(PreferencePage mainPreferencePage, OverlayPreferenceStore store) {
Assert.isNotNull(mainPreferencePage);
Assert.isNotNull(store);
fMainPreferencePage = mainPreferencePage;
}
public Control createControl(Composite parent) {
ServerAdapter adapter = new ServerAdapter();
String buttons[] = new String[] { PHPServerUIMessages.getString("PHPServersConfigurationBlock.new"), //$NON-NLS-1$
PHPServerUIMessages.getString("PHPServersConfigurationBlock.edit"), //$NON-NLS-1$
PHPServerUIMessages.getString("PHPServersConfigurationBlock.remove"), //$NON-NLS-1$
PHPServerUIMessages.getString("PHPServersConfigurationBlock.setDefault") }; //$NON-NLS-1$
fServersList = new ListDialogField(adapter, buttons, new PHPServersLabelProvider(), new TableSorter()) {
protected boolean managedButtonPressed(int index) {
if (index == getRemoveButtonIndex()) {
handleRemoveServer();
}
return super.managedButtonPressed(index);
}
};
fServersList.setDialogFieldListener(adapter);
fServersList.setRemoveButtonIndex(IDX_REMOVE);
String[] columnsHeaders = new String[] { PHPServerUIMessages.getString("PHPServersConfigurationBlock.name"), //$NON-NLS-1$
PHPServerUIMessages.getString("PHPServersConfigurationBlock.url") }; //$NON-NLS-1$
ColumnLayoutData[] layoutDatas = new ColumnLayoutData[] { new ColumnWeightData(40), new ColumnWeightData(40) };
fServersList.setTableColumns(new ListDialogField.ColumnsDescription(layoutDatas, columnsHeaders, true));
if (fServersList.getSize() > 0) {
fServersList.selectFirstElement();
} else {
fServersList.enableButton(IDX_EDIT, false);
}
fServersStatus = new StatusInfo();
GridLayout layout = new GridLayout();
layout.marginHeight = 0;
layout.marginWidth = 0;
layout.numColumns = 2;
PixelConverter conv = new PixelConverter(parent);
ScrolledCompositeImpl scrolledCompositeImpl = new ScrolledCompositeImpl(parent, SWT.V_SCROLL | SWT.H_SCROLL);
Composite composite = new Composite(scrolledCompositeImpl, SWT.NONE);
composite.setLayout(layout);
scrolledCompositeImpl.setContent(composite);
scrolledCompositeImpl.setLayout(layout);
scrolledCompositeImpl.setFont(parent.getFont());
GridData data = new GridData(GridData.FILL_BOTH);
data.widthHint = conv.convertWidthInCharsToPixels(50);
Control listControl = fServersList.getListControl(composite);
listControl.setLayoutData(data);
Control buttonsControl = fServersList.getButtonBox(composite);
buttonsControl.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_BEGINNING));
addFiller(composite);
Point size = composite.computeSize(SWT.DEFAULT, SWT.DEFAULT);
scrolledCompositeImpl.setMinSize(size.x, size.y);
return scrolledCompositeImpl;
}
private void addFiller(Composite composite) {
PixelConverter pixelConverter = new PixelConverter(composite);
Label filler = new Label(composite, SWT.LEFT);
GridData gd = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
gd.horizontalSpan = 2;
gd.heightHint = pixelConverter.convertHeightInCharsToPixels(1) / 2;
filler.setLayoutData(gd);
}
protected void sideButtonPressed(int index) {
if (index == IDX_ADD) {
Server newServer = getServerFromWizard();
if (newServer != null) {
fServersList.addElement(newServer);
ServersManager.addServer(newServer);
ServersManager.save();
Display.getDefault().asyncExec(new Runnable() {
public void run() {
fServersList.refresh();
}
});
}
} else if (index == IDX_EDIT) {
handleEditServerButtonSelected();
fServersList.refresh();
} else if (index == IDX_DEFAULT) {
List selectedElements = fServersList.getSelectedElements();
if (selectedElements.size() > 0) {
Server server = (Server) selectedElements.get(0);
ServersManager.setDefaultServer(null, server);
ServersManager.save();
fServersList.refresh();
}
}
}
protected Server getServerFromWizard() {
Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();
NullProgressMonitor monitor = new NullProgressMonitor();
Server theServer = null;
ServerWizard wizard = new ServerWizard();
ClosableWizardDialog dialog = new ClosableWizardDialog(shell, wizard);
if (dialog.open() == Window.CANCEL) {
monitor.setCanceled(true);
return null;
}
theServer = (Server) wizard.getRootFragment().getWizardModel().getObject(WizardModel.SERVER);
return theServer;
}
protected void handleEditServerButtonSelected() {
Server server = (Server) fServersList.getSelectedElements().get(0);
NullProgressMonitor monitor = new NullProgressMonitor();
if (ServerEditWizardRunner.runWizard(server) == Window.CANCEL) {
monitor.setCanceled(true);
return;
}
ServersManager.save();
}
protected void handleRemoveServer() {
Server server = (Server) fServersList.getSelectedElements().get(0);
ServersManager.removeServer(server.getName());
ServersManager.save();
Display.getDefault().asyncExec(new Runnable() {
public void run() {
fServersList.refresh();
}
});
}
protected void updateStatus() {
fMainPreferencePage.setValid(fServersStatus.isOK());
StatusUtil.applyToStatusLine(fMainPreferencePage, fServersStatus);
}
public void initialize() {
List servers = new ArrayList();
populateServerList(servers);
fServersList.setElements(servers);
}
public void dispose() {
// nothing to dispose
}
public void performDefaults() {
// Do nothing - We do not have the defaults button on this page.
}
public void performOk() {
// Do nothing
}
protected void populateServerList(List serverList) {
Server[] servers = ServersManager.getServers();
if (serverList == null)
serverList = new ArrayList();
if (servers != null) {
int size = servers.length;
for (int i = 0; i < size; i++) {
Server server = servers[i];
if (!ServersManager.isNoneServer(server)) {
serverList.add(server);
}
}
}
}
protected boolean isDefault(Server element) {
return ServersManager.getDefaultServer(null) == element;
}
private class ServerAdapter implements IListAdapter, IDialogFieldListener {
private boolean hasActiveSelection(List selectedElements) {
return selectedElements.size() == 1;
}
public void dialogFieldChanged(DialogField field) {
}
public void customButtonPressed(ListDialogField field, int index) {
sideButtonPressed(index);
}
public void doubleClicked(ListDialogField field) {
sideButtonPressed(IDX_EDIT);
}
public void selectionChanged(ListDialogField field) {
List selectedElements = field.getSelectedElements();
field.enableButton(IDX_EDIT, hasActiveSelection(selectedElements));
// Do not allow the removal of the last element
field.enableButton(IDX_REMOVE, hasActiveSelection(selectedElements));
// handle default button enablement
if (selectedElements.size() == 1) {
field.enableButton(IDX_DEFAULT, !selectedElements.get(0).equals(ServersManager.getDefaultServer(null)));
} else {
field.enableButton(IDX_DEFAULT, false);
}
}
}
private class PHPServersLabelProvider extends LabelProvider implements ITableLabelProvider, IFontProvider {
public Font getFont(Object element) {
if (isDefault((Server) element)) {
return JFaceResources.getFontRegistry().getBold(JFaceResources.DIALOG_FONT);
}
return null;
}
public Image getColumnImage(Object element, int columnIndex) {
if (columnIndex == 0) {
if (element instanceof Server) {
IServerType serverType = ServerTypesManager.getInstance().getType((Server) element);
IServerTypeDescriptor serverTypeDescriptor = ServerTypesDescriptorRegistry
.getDescriptor(serverType);
return serverTypeDescriptor.getImage(ImageType.ICON_16);
}
return ServersPluginImages.get(ServersPluginImages.IMG_SERVER);
}
return null;
}
public String getColumnText(Object element, int columnIndex) {
Server server = null;
if (element instanceof Server) {
server = (Server) element;
} else {
return super.getText(element);
}
if (columnIndex == 0) {
String serverName = server.getName();
if (isDefault((Server) element)) {
serverName += PHPServerUIMessages.getString("PHPServersConfigurationBlock.workspaceDefault"); //$NON-NLS-1$
}
return serverName;
} else if (columnIndex == 1) {
return server.getBaseURL();
}
return element.toString();
}
}
}