/******************************************************************************* * Copyright (c) 2002, 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 Rational Software - Initial API and implementation *******************************************************************************/ package org.eclipse.cdt.ui.newui; import java.util.Arrays; import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IConfigurationElement; import org.eclipse.core.runtime.IExtension; import org.eclipse.core.runtime.IExtensionPoint; import org.eclipse.core.runtime.Platform; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.osgi.util.NLS; 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.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableColumn; import org.eclipse.swt.widgets.TableItem; import org.eclipse.cdt.core.model.util.CDTListComparator; import org.eclipse.cdt.core.settings.model.ICConfigurationDescription; import org.eclipse.cdt.core.settings.model.ICProjectDescription; import org.eclipse.cdt.ui.CUIPlugin; import org.eclipse.cdt.internal.ui.newui.Messages; /** * @noextend This class is not intended to be subclassed by clients. */ public class ManageConfigDialog extends Dialog { private static final String EXTENSION_POINT_ID = "org.eclipse.cdt.ui.newCfgDialog"; //$NON-NLS-1$ public static final String ELEMENT_NAME = "dialog"; //$NON-NLS-1$ public static final String CLASS_NAME = "class"; //$NON-NLS-1$ public static final String TITLE_NAME = "title"; //$NON-NLS-1$ public static final String ID_NAME = "mbs_id"; //$NON-NLS-1$ // The list of configurations to delete private ICProjectDescription des; private IProject prj; private String title; private String mbs_id; protected Table table; protected Button actBtn; protected Button newBtn; protected Button renBtn; protected Button delBtn; /** * @param parentShell */ ManageConfigDialog(Shell parentShell, String _title, IProject _prj) { super(parentShell); setShellStyle(getShellStyle() | SWT.RESIZE); title = _title; prj = _prj; } @Override protected void configureShell(Shell shell) { super.configureShell(shell); if (title != null) shell.setText(title); } /* (non-Javadoc) * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite) */ @Override protected Control createDialogArea(Composite parent) { Composite composite = new Composite(parent, SWT.NULL); composite.setFont(parent.getFont()); composite.setLayout(new GridLayout(4, true)); composite.setLayoutData(new GridData(GridData.FILL_BOTH)); // Create the current config table table = new Table(composite, SWT.BORDER | SWT.SINGLE | SWT.V_SCROLL | SWT.H_SCROLL | SWT.FULL_SELECTION); GridData gd = new GridData(GridData.FILL_BOTH); gd.horizontalSpan = 4; table.setLayoutData(gd); table.setHeaderVisible(true); table.setLinesVisible(true); table.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { updateButtons(); }}); TableColumn col = new TableColumn(table, SWT.NONE); col.setText(Messages.ManageConfigDialog_1); col.setWidth(100); col = new TableColumn(table, SWT.NONE); col.setText(Messages.ManageConfigDialog_2); col.setWidth(120); col = new TableColumn(table, SWT.NONE); col.setText(Messages.ManageConfigDialog_3); col.setWidth(80); actBtn = new Button(composite, SWT.PUSH); actBtn.setText(Messages.ManageConfigDialog_4); actBtn.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); actBtn.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { TableItem[] tis = table.getSelection(); if (tis == null || tis.length != 1) return; ICConfigurationDescription cfgd = (ICConfigurationDescription)tis[0].getData(); // cfgd.setActive(); des.setActiveConfiguration(cfgd); updateData(); }} ); newBtn = new Button(composite, SWT.PUSH); newBtn.setText(Messages.BuildPropertyCommon_label_new); newBtn.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); newBtn.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { handleNewPressed(); }} ); delBtn = new Button(composite, SWT.PUSH); delBtn.setText(Messages.BuildPropertyCommon_label_remove); delBtn.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); delBtn.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { handleRemovePressed(); }} ); renBtn = new Button(composite, SWT.PUSH); renBtn.setText(Messages.ManageConfig_label_rename); renBtn.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); renBtn.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { handleRenamePressed(); }} ); des = CDTPropertyManager.getProjectDescription(composite, prj); // comp = composite; updateData(); return composite; } /* * Event handler for the add button */ protected void handleNewPressed() { INewCfgDialog dialog = handleSpecificMBS(mbs_id); if (dialog == null) { // default (core) implementation. dialog = new NewConfigurationDialog(getShell()); dialog.setTitle(Messages.ManageConfig_label_new_config_dialog); } dialog.setProject(des); if (dialog.open() == OK) updateData(); } /** * Tries to load MBS-specific creation dialog a * @return false if there's no such feature */ protected INewCfgDialog handleSpecificMBS(String id) { IExtensionPoint extensionPoint = Platform.getExtensionRegistry() .getExtensionPoint(EXTENSION_POINT_ID); if (extensionPoint == null) return null; IExtension[] extensions = extensionPoint.getExtensions(); if (extensions == null) return null; for (int i = 0; i < extensions.length; ++i) { IConfigurationElement[] elements = extensions[i].getConfigurationElements(); for (int k = 0; k < elements.length; k++) { if (elements[k].getName().equals(ELEMENT_NAME)) { if (! id.equals(elements[k].getAttribute(ID_NAME))) continue; INewCfgDialog dialog = null; try { dialog = (INewCfgDialog) elements[k].createExecutableExtension(CLASS_NAME); dialog.setTitle(elements[k].getAttribute(TITLE_NAME)); dialog.setShell(getShell()); return dialog; } catch (CoreException e) { System.out.println("Cannot create dialog: " + e.getLocalizedMessage()); //$NON-NLS-1$ return null; } } } } return null; } /* * (non-javadoc) Event handler for the rename button */ protected void handleRenamePressed() { int sel = table.getSelectionIndex(); if (sel != -1) { ICConfigurationDescription cfgd = (ICConfigurationDescription) table.getItem(sel).getData(); RenameConfigurationDialog dialog = new RenameConfigurationDialog( getShell(), cfgd, des.getConfigurations(), Messages.ManageConfig_label_rename_config_dialog); if (dialog.open() == OK) { cfgd.setName(dialog.getNewName()); cfgd.setDescription(dialog.getNewDescription()); updateData(); } } } /* * (non-javadoc) Event handler for the remove button */ protected void handleRemovePressed() { TableItem[] tis = table.getSelection(); if (tis == null || tis.length < 1) return; String[] names = new String[tis.length]; for (int i=0; i<tis.length; i++) names[i] = tis[i].getText(0); // Get the confirmation from user before deleting the configuration Shell shell = CUIPlugin.getActiveWorkbenchShell(); boolean shouldDelete = MessageDialog.openQuestion(shell, Messages.ManageConfig_deletedialog_title, NLS.bind(Messages.ManageConfig_deletedialog_message, names)); if (shouldDelete) { boolean wasActive = false; for (int j=0; j<tis.length; j++) { ICConfigurationDescription cfgd = (ICConfigurationDescription)tis[j].getData(); if (cfgd.isActive()) wasActive = true; des.removeConfiguration(cfgd); } ICConfigurationDescription[] cfgds = des.getConfigurations(); if (wasActive && cfgds.length > 0) { cfgds[0].setActive(); des.setActiveConfiguration(cfgds[0]); } updateData(); } } private void updateButtons() { int sel = table.getSelectionCount(); delBtn.setEnabled(sel > 0 & sel < table.getItemCount()); renBtn.setEnabled(sel == 1); if (sel == 1) { ICConfigurationDescription c = (ICConfigurationDescription)table.getSelection()[0].getData(); actBtn.setEnabled(c != null && !c.isActive()); } else actBtn.setEnabled(false); } /** * refresh configs table after changes */ private void updateData() { table.removeAll(); ICConfigurationDescription[] cfgds = des.getConfigurations(); mbs_id = cfgds[0].getBuildSystemId(); Arrays.sort(cfgds, CDTListComparator.getInstance()); for (int i=0; i<cfgds.length; i++ ) { TableItem t = new TableItem(table, 0); t.setText(0, cfgds[i].getName()); t.setText(1, cfgds[i].getDescription()); t.setText(2, cfgds[i].isActive() ? Messages.ManageConfigDialog_5 : ""); //$NON-NLS-1$ t.setData(cfgds[i]); } if (table.getItemCount() > 0) table.select(0); table.setFocus(); updateButtons(); } ICProjectDescription getProjectDescription(){ return des; } }