/******************************************************************************* * 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.debug.ui.wizards; import java.lang.reflect.InvocationTargetException; import java.util.*; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.jface.dialogs.TitleAreaDialog; import org.eclipse.jface.operation.IRunnableWithProgress; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.php.internal.debug.core.preferences.PHPexeItem; import org.eclipse.php.internal.debug.core.preferences.PHPexes; import org.eclipse.php.internal.ui.util.SWTUtil; import org.eclipse.php.internal.ui.wizards.CompositeFragment; import org.eclipse.php.internal.ui.wizards.IControlHandler; import org.eclipse.php.internal.ui.wizards.WizardFragmentsFactoryRegistry; import org.eclipse.php.ui.wizards.ICompositeFragmentFactory; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.CTabFolder; import org.eclipse.swt.custom.CTabItem; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Shell; @SuppressWarnings("restriction") public class PHPExeEditDialog extends TitleAreaDialog implements IControlHandler { protected static final String FRAGMENT_GROUP_ID = "org.eclipse.php.debug.ui.phpExeWizardCompositeFragment"; //$NON-NLS-1$ private List<CompositeFragment> runtimeComposites; private PHPexeItem phpExeItem; private PHPexeItem[] existingItems; private String tabID; private CTabFolder tabs; public PHPExeEditDialog(Shell shell, PHPexeItem phpExeItem, PHPexeItem[] existingItems) { super(shell); setShellStyle(getShellStyle() | SWT.RESIZE); // Work on a simple working copy this.phpExeItem = phpExeItem.makeCopy(); this.existingItems = existingItems; runtimeComposites = new ArrayList<CompositeFragment>(3); } public PHPExeEditDialog(Shell shell, PHPexeItem phpExeItem, PHPexeItem[] existingItems, String tabID) { this(shell, phpExeItem, existingItems); this.tabID = tabID; } public void setDescription(String desc) { super.setMessage(desc); } public PHPexeItem[] getExistingItems() { return existingItems; } public void setPHPExeItem(PHPexeItem phpExeItem) { this.phpExeItem = phpExeItem; } public PHPexeItem getPHPExeItem() { return phpExeItem; } public void setImageDescriptor(ImageDescriptor image) { super.setTitleImage(image.createImage()); } protected Control createDialogArea(Composite parent) { // Create a tabbed container that will hold all the fragments tabs = SWTUtil.createTabFolder(parent); Map<String, ICompositeFragmentFactory> factories = WizardFragmentsFactoryRegistry .getFragmentsFactories(FRAGMENT_GROUP_ID); Collection<ICompositeFragmentFactory> factoriesList = factories.values(); for (ICompositeFragmentFactory element : factoriesList) { CTabItem tabItem = new CTabItem(tabs, SWT.BORDER); CompositeFragment fragment = element.createComposite(tabs, this); fragment.setData(phpExeItem); if (fragment instanceof IPHPExeCompositeFragment) { ((IPHPExeCompositeFragment) fragment).setExistingItems(existingItems); } tabItem.setText(fragment.getDisplayName()); tabItem.setControl(fragment); tabItem.setData(fragment.getId()); runtimeComposites.add(fragment); } tabs.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { CTabItem item = (CTabItem) e.item; CompositeFragment fragment = (CompositeFragment) item.getControl(); setTitle(fragment.getTitle()); setDescription(fragment.getDescription()); setImageDescriptor(fragment.getImageDescriptor()); fragment.setData(phpExeItem); } }); getShell().setText(Messages.PHPExeEditDialog_1); // set the init selection of tabitem. if (tabID != null) { setSelect(tabID); } return tabs; } protected void cancelPressed() { Iterator<CompositeFragment> composites = runtimeComposites.iterator(); while (composites.hasNext()) { composites.next().performCancel(); } super.cancelPressed(); } protected void okPressed() { Iterator<CompositeFragment> composites = runtimeComposites.iterator(); while (composites.hasNext()) { composites.next().performOk(); } PHPexeItem original = PHPexes.getInstance().findItem(phpExeItem.getUniqueId()); // Update original item PHPexes.getInstance().updateItem(original, phpExeItem); // Save changes PHPexes.getInstance().save(); super.okPressed(); } @Override protected void handleShellCloseEvent() { cancelPressed(); super.handleShellCloseEvent(); } public void update() { Button button = getButton(IDialogConstants.OK_ID); if (button != null) { Iterator<CompositeFragment> composites = runtimeComposites.iterator(); while (composites.hasNext()) { if (!composites.next().isComplete()) { button.setEnabled(false); return; } } button.setEnabled(true); } } @Override protected Point getInitialSize() { Point size = super.getInitialSize(); size.y += 100; return size; } @Override public Kind getKind() { return Kind.EDITOR; } @Override public void run(boolean fork, boolean cancelable, IRunnableWithProgress runnable) throws InvocationTargetException, InterruptedException { // not supported } 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); // Update tab CompositeFragment fragment = (CompositeFragment) tabs.getItem(i).getControl(); setTitle(fragment.getTitle()); setImageDescriptor(fragment.getImageDescriptor()); setDescription(fragment.getDescription()); fragment.validate(); break; } } } }