/******************************************************************************* * Copyright (c) 2015 Zend Technologies 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: * Zend Technologies - initial API and implementation *******************************************************************************/ package org.eclipse.php.internal.server.ui; import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; import java.util.List; import org.eclipse.jface.operation.IRunnableWithProgress; import org.eclipse.jface.wizard.WizardPage; 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.wizards.CompositeFragment; import org.eclipse.php.internal.ui.wizards.IControlHandler; 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.ServerTypesDescriptorRegistry; import org.eclipse.php.server.ui.types.IServerTypeDescriptor.ImageType; import org.eclipse.php.ui.wizards.ICompositeFragmentFactory; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.TabFolder; import org.eclipse.swt.widgets.TabItem; /** * Wizard page for editing PHP server settings. */ @SuppressWarnings("restriction") public class ServerEditPage extends WizardPage implements IControlHandler { protected static final String FRAGMENT_GROUP_ID = "org.eclipse.php.server.ui.serverWizardAndComposite"; //$NON-NLS-1$ public interface IPostFinish { /** * Performs post finish action. */ public void perform(); } private Server server; private ArrayList<CompositeFragment> runtimeComposites; private TabFolder tabs; private String tabID; private List<IPostFinish> postFinish = new ArrayList<IPostFinish>(); /** * Instantiate a new server edit wizard page. * * @param server * An assigned IServer */ public ServerEditPage(Server server) { super(PHPServerUIMessages.getString("ServerEditPage.Title")); //$NON-NLS-1$ this.server = server; this.runtimeComposites = new ArrayList<CompositeFragment>(); } /** * Instantiate a new server edit wizard page. * * @param server * An assigned IServer * @param init * selected tabe ID. */ public ServerEditPage(Server server, String tabID) { this(server); this.tabID = tabID; } /* * (non-Javadoc) * * @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt. * widgets .Composite) */ public void createControl(Composite parent) { // Create a tabbed container that will hold all the fragments tabs = new TabFolder(parent, SWT.NONE); GridData gd = new GridData(GridData.FILL_BOTH); gd.horizontalSpan = 2; tabs.setLayoutData(gd); IServerType serverType = ServerTypesManager.getInstance().getType(server); IServerTypeDescriptor serverTypeDescriptor = ServerTypesDescriptorRegistry.getDescriptor(serverType); ICompositeFragmentFactory[] factories = serverTypeDescriptor.getEditorFragmentFactories(); for (ICompositeFragmentFactory element : factories) { TabItem tabItem = new TabItem(tabs, SWT.NONE); CompositeFragment fragment = element.createComposite(tabs, this); fragment.setData(server); tabItem.setText(fragment.getDisplayName()); tabItem.setControl(fragment); tabItem.setData(fragment.getId()); runtimeComposites.add(fragment); } getShell().setText(PHPServerUIMessages.getString("ServerEditDialog.editServer")); //$NON-NLS-1$ getShell().setImage(ServersPluginImages.get(ServersPluginImages.IMG_SERVER)); tabs.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { TabItem item = (TabItem) e.item; CompositeFragment fragment = (CompositeFragment) item.getControl(); if (fragment instanceof ServerCompositeFragment) { IServerType type = ServerTypesManager.getInstance().getType(server); if (type != null) { IServerTypeDescriptor serverTypeDescriptor = ServerTypesDescriptorRegistry.getDescriptor(type); ((ServerCompositeFragment) fragment) .setImageDescriptor(serverTypeDescriptor.getImageDescriptor(ImageType.WIZARD)); } } setImageDescriptor(fragment.getImageDescriptor()); setDescription(fragment.getDescription()); setTitle(fragment.getTitle()); fragment.validate(); } }); // set the init selection of tabitem. if (tabID != null) { setSelect(tabID); } int selectionIndex = tabs.getSelectionIndex() != -1 ? tabs.getSelectionIndex() : 0; CompositeFragment selectedFragment = runtimeComposites.get(selectionIndex); setTitle(selectedFragment.getTitle()); setDescription(selectedFragment.getDescription()); setControl(tabs); IServerType type = ServerTypesManager.getInstance().getType(server); if (type != null) { serverTypeDescriptor = ServerTypesDescriptorRegistry.getDescriptor(type); setImageDescriptor(serverTypeDescriptor.getImageDescriptor(ImageType.WIZARD)); } } /* * (non-Javadoc) * * @see org.eclipse.php.internal.ui.wizards.IControlHandler#getKind() */ @Override public Kind getKind() { return Kind.EDITOR; } /* * (non-Javadoc) * * @see * org.eclipse.php.internal.server.apache.ui.IControlHandler#setDescription * (java.lang.String) */ public void setDescription(String desc) { super.setMessage(desc); } /* * (non-Javadoc) * * @see org.eclipse.php.internal.ui.wizards.IControlHandler#update() */ public void update() { for (CompositeFragment composite : runtimeComposites) { if (!composite.isComplete()) { setPageComplete(false); return; } } setPageComplete(true); } /* * (non-Javadoc) * * @see org.eclipse.php.internal.ui.wizards.IControlHandler#run(boolean, * boolean, org.eclipse.jface.operation.IRunnableWithProgress) */ public void run(boolean fork, boolean cancelable, IRunnableWithProgress runnable) throws InvocationTargetException, InterruptedException { getContainer().run(fork, cancelable, runnable); } /* * (non-Javadoc) * * @see * org.eclipse.php.internal.server.apache.ui.IControlHandler#getServer() */ public Server getServer() { return server; } /* * (non-Javadoc) * * @see * org.eclipse.php.internal.server.apache.ui.IControlHandler#setServer(org * .eclipse.wst.server.core.IServer) */ public void setServer(Server server) { this.server = server; } public void performCancel() { for (CompositeFragment composite : runtimeComposites) { composite.performCancel(); } } public boolean performFinish() { for (CompositeFragment composite : runtimeComposites) { if (!composite.performOk()) { return false; } } // Save original server try { Server originalServer = ServersManager.findServer(server.getUniqueId()); // Server exists, update it if (originalServer != null) { originalServer.update(server); } } catch (Throwable e) { Logger.logException("Error while saving the server settings", e); //$NON-NLS-1$ return false; } // Perform post finish actions performPostFinish(); return true; } public void addPostFinish(IPostFinish operation) { postFinish.add(operation); } private void performPostFinish() { for (IPostFinish operation : postFinish) { operation.perform(); } } private void setSelect(String id) { if (id == null) { return; } for (int i = 0; i < tabs.getItemCount(); i++) { if (id.equals(tabs.getItem(i).getData())) { tabs.setSelection(i); break; } } } }