diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/viewsupport/ProblemsLabelDecorator.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/viewsupport/ProblemsLabelDecorator.java index 499f1d0236e..5ae3b4e6a81 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/viewsupport/ProblemsLabelDecorator.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/viewsupport/ProblemsLabelDecorator.java @@ -389,7 +389,7 @@ public class ProblemsLabelDecorator implements ILabelDecorator, ILightweightLabe ICResourceDescription out = cf[i].getResourceDescription(path, true); if (out != null) result |= TICK_CONFIGURATION; out = cf[i].getResourceDescription(path, false); - if (out.isExcluded()) result |= TICK_EXCLUDE; + if (out != null && out.isExcluded()) result |= TICK_EXCLUDE; } } } diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/newui/AbstractPage.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/newui/AbstractPage.java index 9ec4984fb59..aabe72a90e2 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/newui/AbstractPage.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/newui/AbstractPage.java @@ -31,7 +31,6 @@ import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.Platform; import org.eclipse.core.runtime.Preferences; import org.eclipse.core.runtime.QualifiedName; -import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.dialogs.ProgressMonitorDialog; import org.eclipse.jface.operation.IRunnableWithProgress; import org.eclipse.jface.preference.IPreferencePageContainer; @@ -53,7 +52,6 @@ import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Group; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Listener; -import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.TabFolder; import org.eclipse.swt.widgets.TabItem; import org.eclipse.ui.IWorkbenchPropertyPage; @@ -99,28 +97,16 @@ implements IPreferencePageContainer, // dynamic pages ICPropertyProvider // utility methods for tabs { - // Toggle this constant to - // to hide "Manage configurations" button. - // Corresponding menu items and toolbar button - // will not be affected by this change. - private static final boolean ENABLE_MANAGE = true; - + // All(Multiple) configuration support is now disabled + private static final boolean ENABLE_MULTI_CFG = false; + private static ArrayList pages = new ArrayList(5); private static ICResourceDescription resd = null; private static ICConfigurationDescription[] cfgDescs = null; + private static ICConfigurationDescription[] multiCfgs = null; // selected multi cfg private static ICProjectDescription prjd = null; private static int cfgIndex = 0; private static boolean doneOK = false; - /* - * String constants - */ - private static final String PREFIX = "CLanguagesPropertyPage"; //$NON-NLS-1$ - private static final String LABEL = PREFIX + ".label"; //$NON-NLS-1$ - private static final String TIP = PREFIX + ".tip"; //$NON-NLS-1$ - private static final String CONFIG_LABEL = LABEL + ".Configuration"; //$NON-NLS-1$ - private static final String ALL_CONFS = PREFIX + ".selection.configuration.all"; //$NON-NLS-1$ - private static final String CONF_TIP = TIP + ".config"; //$NON-NLS-1$ - // tabs private static final String EXTENSION_POINT_ID = "org.eclipse.cdt.ui.cPropertyTab"; //$NON-NLS-1$ public static final String ELEMENT_NAME = "tab"; //$NON-NLS-1$ @@ -145,12 +131,11 @@ implements */ private boolean noContentOnPage = false; protected boolean displayedConfig = false; - protected boolean isDirty = false; - protected IResource internalElement = null; protected boolean isProject = false; protected boolean isFolder = false; protected boolean isFile = false; + protected boolean isMulti = false; // tabs TabFolder folder; @@ -245,7 +230,8 @@ implements // Use the form layout inside the group composite GridLayout ff = new GridLayout(3, false); configGroup.setLayout(ff); - Label configLabel = ControlFactory.createLabel(configGroup, NewUIMessages.getResourceString(CONFIG_LABEL)); + Label configLabel = new Label(configGroup, SWT.NONE); + configLabel.setText(NewUIMessages.getResourceString("AbstractPage.6")); //$NON-NLS-1$ configLabel.setLayoutData(new GridData(GridData.BEGINNING)); configSelector = new Combo(configGroup, SWT.READ_ONLY | SWT.DROP_DOWN); @@ -254,7 +240,6 @@ implements handleConfigSelection(); } }); - configSelector.setToolTipText(NewUIMessages.getResourceString(CONF_TIP)); gd = new GridData(GridData.FILL); gd.grabExcessHorizontalSpace = true; gd.grabExcessVerticalSpace = true; @@ -263,9 +248,9 @@ implements configSelector.setLayoutData(gd); - if (ENABLE_MANAGE) { + if (CDTPrefUtil.getBool(CDTPrefUtil.KEY_MANAGE)) { manageButton = new Button(configGroup, SWT.PUSH); - manageButton.setText("Manage configurations"); //$NON-NLS-1$ + manageButton.setText(NewUIMessages.getResourceString("AbstractPage.12")); //$NON-NLS-1$ gd = new GridData(GridData.END); gd.widthHint = 150; manageButton.setLayoutData(gd); @@ -285,7 +270,7 @@ implements if (isForFolder() || isForFile()) { excludeFromBuildCheck = new Button(configGroup, SWT.CHECK); - excludeFromBuildCheck.setText("Exclude resource from build"); //$NON-NLS-1$ + excludeFromBuildCheck.setText(NewUIMessages.getResourceString("AbstractPage.7")); //$NON-NLS-1$ gd = new GridData(GridData.FILL_HORIZONTAL); gd.horizontalSpan = 3; excludeFromBuildCheck.setLayoutData(gd); @@ -358,43 +343,44 @@ implements * Event Handlers */ private void handleConfigSelection() { + isMulti = false; // no multi config selection by default // If there is nothing in config selection widget just bail if (configSelector.getItemCount() == 0) return; int selectionIndex = configSelector.getSelectionIndex(); if (selectionIndex == -1) return; - // Check if the user has selected the "all" configuration - String configName = configSelector.getItem(selectionIndex); - if (configName.equals(NewUIMessages.getResourceString(ALL_CONFS))) { - // This is the all config + + // Check if the user has selected the "all / multiple" configuration + if (selectionIndex >= cfgDescs.length) { + if ((selectionIndex - cfgDescs.length) == 0) // all + multiCfgs = cfgDescs; + else { + ICConfigurationDescription[] mcfgs = ConfigMultiSelectionDialog.select(cfgDescs); + if (mcfgs == null || mcfgs.length == 0) { + // return back to previous selection, but not to multi ! + if (cfgIndex >= cfgDescs.length) { + cfgIndex = 0; + configSelector.select(0); + cfgChanged(cfgDescs[0]); + } else { + configSelector.select(cfgIndex); + } + return; + } + multiCfgs = mcfgs; + } + + isMulti = true; + // if tab does not support multi cfg, + // it will show 1st cfg, at least. + cfgChanged(multiCfgs[0]); return; } else { ICConfigurationDescription newConfig = cfgDescs[selectionIndex]; if (newConfig != getResDesc()) { - // If the user has changed values, and is now switching configurations, prompt for saving - if (getResDesc() != null) { - if (isDirty) { - Shell shell = CUIPlugin.getActiveWorkbenchShell(); - boolean shouldApply = MessageDialog.openQuestion(shell, - NewUIMessages.getResourceString("BuildPropertyPage.changes.save.title"), //$NON-NLS-1$ - NewUIMessages.getFormattedString("BuildPropertyPage.changes.save.question", //$NON-NLS-1$ - new String[] {getResDesc().getName(), newConfig.getName()})); - if (shouldApply) { - if (performOk()) { - isDirty = false; - } else { - MessageDialog.openWarning(shell, - NewUIMessages.getResourceString("BuildPropertyPage.changes.save.title"), //$NON-NLS-1$ - NewUIMessages.getResourceString("BuildPropertyPage.changes.save.error")); //$NON-NLS-1$ - } - } - } - } - // Set the new selected configuration - cfgIndex = selectionIndex; + cfgIndex = selectionIndex; cfgChanged(newConfig); } } - return; } /** @@ -431,7 +417,7 @@ implements try { CoreModel.getDefault().setProjectDescription(getProject(), local_prjd); } catch (CoreException e) { - System.out.println("setProjectDescription: " + e.getLocalizedMessage()); //$NON-NLS-1$ + System.out.println(NewUIMessages.getResourceString("AbstractPage.11") + e.getLocalizedMessage()); //$NON-NLS-1$ } updateViews(internalElement); } @@ -441,7 +427,9 @@ implements new ProgressMonitorDialog(getShell()).run(false, true, op); } catch (InvocationTargetException e) { Throwable e1 = e.getTargetException(); - CUIPlugin.errorDialog(getShell(), "Cannot apply", "Internal error", e1, true); //$NON-NLS-1$ //$NON-NLS-2$ + CUIPlugin.errorDialog(getShell(), + NewUIMessages.getResourceString("AbstractPage.8"), //$NON-NLS-1$ + NewUIMessages.getResourceString("AbstractPage.9"), e1, true); //$NON-NLS-1$ } catch (InterruptedException e) {} } @@ -485,6 +473,13 @@ implements configSelector.add(cfgDescs[i].getName()); if (cfgDescs[i].isActive()) cfgIndex = i; } + // Handling of All/Multiple configurations can be disabled + if (ENABLE_MULTI_CFG) { + if (cfgDescs.length > 1) // "All cfgs" - shown if at least 2 cfgs available + configSelector.add(NewUIMessages.getResourceString("AbstractPage.4")); //$NON-NLS-1$ + if (cfgDescs.length > 2)// "Multi cfgs" - shown if at least 3 cfgs available + configSelector.add(NewUIMessages.getResourceString("AbstractPage.5")); //$NON-NLS-1$ + } configSelector.select(cfgIndex); handleConfigSelection(); } @@ -617,7 +612,7 @@ implements else out = cf.createFileDescription(p, out); } catch (CoreException e) { - System.out.println("Cannot create resource configuration for " + //$NON-NLS-1$ + System.out.println(NewUIMessages.getResourceString("AbstractPage.10") + //$NON-NLS-1$ p.toOSString() + "\n" + e.getLocalizedMessage()); //$NON-NLS-1$ } } @@ -696,7 +691,7 @@ implements if (elements[k].getName().equals(ELEMENT_NAME)) { if (loadTab(elements[k], parent)) return; } else { - System.out.println("Cannot load " + elements[k].getName()); //$NON-NLS-1$ + System.out.println(NewUIMessages.getResourceString("AbstractPage.13") + elements[k].getName()); //$NON-NLS-1$ } } } @@ -719,7 +714,8 @@ implements try { page = (ICPropertyTab) element.createExecutableExtension(CLASS_NAME); } catch (CoreException e) { - System.out.println("Cannot create page: " + e.getLocalizedMessage()); //$NON-NLS-1$ + System.out.println(NewUIMessages.getResourceString("AbstractPage.14") + //$NON-NLS-1$ + e.getLocalizedMessage()); return false; } if (page == null) return false; @@ -783,7 +779,6 @@ implements case ICPropertyTab.MANAGEDBUILDSTATE: // generally, single-tabbed pages are not intended to handle this message if (folder == null) return; - boolean willAdd = false; TabItem[] ts = folder.getItems(); int x = folder.getSelectionIndex(); @@ -847,7 +842,7 @@ implements // override parent's method to use proper class public IAdaptable getElement() { if (internalElement == null && !checkElement()) - throw (new NullPointerException("element not initialized !")); //$NON-NLS-1$ + throw (new NullPointerException(NewUIMessages.getResourceString("AbstractPage.15"))); //$NON-NLS-1$ return internalElement; } @@ -856,6 +851,9 @@ implements public boolean isForFile() { return isFile; } public boolean isForPrefs() { return false; } + public boolean isMultiCfg() { return isMulti; } + public ICConfigurationDescription[] getMultiCfg() { return (isMulti) ? multiCfgs : null; } + /** * Checks whether CDT property pages can be open for given object. * In particular, header files and text files are not allowed. diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/newui/CDTPrefUtil.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/newui/CDTPrefUtil.java new file mode 100644 index 00000000000..1c83ec30e2e --- /dev/null +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/newui/CDTPrefUtil.java @@ -0,0 +1,72 @@ +/******************************************************************************* + * Copyright (c) 2007 Intel 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: + * Intel Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.cdt.ui.newui; + +import java.util.Arrays; +import java.util.Iterator; +import java.util.LinkedList; +import java.util.List; + +import org.eclipse.cdt.ui.CUIPlugin; +import org.eclipse.jface.preference.IPreferenceStore; + +public class CDTPrefUtil { + public static final String KEY_UNSUPP = "wizard.default.show.unsupported"; //$NON-NLS-1$ + public static final String KEY_OTHERS = "wizard.default.group.others"; //$NON-NLS-1$ + public static final String KEY_PREFTC = "wizard.preferred.toolchains"; //$NON-NLS-1$ + public static final String KEY_MANAGE = "properties.manage.config.button"; //$NON-NLS-1$ + + public static final String NULL = "NULL"; //$NON-NLS-1$ + private static final IPreferenceStore pref = CUIPlugin.getDefault().getPreferenceStore(); + private static final String DELIMITER = " "; //$NON-NLS-1$ + private static LinkedList preferredTCs = null; + + // low-level methods + public static boolean getBool(String key) { return pref.getBoolean(key); } + public static void setBool(String key, boolean val) { pref.setValue(key, val); } + public static int getInt(String key) { return pref.getInt(key); } + public static void setInt(String key, int val) { pref.setValue(key, val); } + public static String getStr(String key) { return pref.getString(key); } + public static void setStr(String key, String val) { pref.setValue(key, val); } + + // up-level methods + public static void readPreferredTCs() { + preferredTCs = new LinkedList(Arrays.asList(getStr(KEY_PREFTC).split(DELIMITER))); + } + public static List getPreferredTCs() { + if (preferredTCs == null) readPreferredTCs(); + return preferredTCs; + } + public static void delPreferredTC(String s) { + if (preferredTCs == null) readPreferredTCs(); + preferredTCs.remove(s); + } + public static void addPreferredTC(String s) { + if (preferredTCs == null) readPreferredTCs(); + if (!preferredTCs.contains(s)) preferredTCs.add(s); + } + public static void cleanPreferredTCs() { + setStr(KEY_PREFTC, IPreferenceStore.STRING_DEFAULT_DEFAULT); + readPreferredTCs(); + } + public static void savePreferredTCs() { + if (preferredTCs == null) return; + Iterator it = preferredTCs.iterator(); + StringBuffer b = new StringBuffer(); + while (it.hasNext()) { + String s = (String)it.next(); + if (s == null) continue; + b.append(s); + b.append(DELIMITER); + } + setStr(KEY_PREFTC, b.toString().trim()); + } +} diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/newui/ConfigMultiSelectionDialog.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/newui/ConfigMultiSelectionDialog.java new file mode 100644 index 00000000000..9f37461a01e --- /dev/null +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/newui/ConfigMultiSelectionDialog.java @@ -0,0 +1,126 @@ +/******************************************************************************* + * Copyright (c) 2002, 2007 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 org.eclipse.jface.dialogs.Dialog; +import org.eclipse.jface.dialogs.IDialogConstants; +import org.eclipse.jface.viewers.CheckStateChangedEvent; +import org.eclipse.jface.viewers.CheckboxTableViewer; +import org.eclipse.jface.viewers.ICheckStateListener; +import org.eclipse.jface.viewers.ILabelProviderListener; +import org.eclipse.jface.viewers.IStructuredContentProvider; +import org.eclipse.jface.viewers.ITableLabelProvider; +import org.eclipse.jface.viewers.Viewer; +import org.eclipse.swt.SWT; +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.Control; +import org.eclipse.swt.widgets.Label; +import org.eclipse.swt.widgets.Shell; +import org.eclipse.swt.widgets.Table; +import org.eclipse.swt.widgets.TableColumn; + +import org.eclipse.cdt.core.settings.model.ICConfigurationDescription; +import org.eclipse.cdt.ui.CUIPlugin; + +public class ConfigMultiSelectionDialog extends Dialog { + static private ICConfigurationDescription[] cfgds; + private Table table; + private CheckboxTableViewer tv; + private Button b_ok; + private Label message; + + public static ICConfigurationDescription[] select(ICConfigurationDescription[] _cfgds) { + cfgds = _cfgds; + ConfigMultiSelectionDialog d = new ConfigMultiSelectionDialog(CUIPlugin.getActiveWorkbenchShell()); + if (d.open() == OK) + return (ICConfigurationDescription[])d.tv.getCheckedElements(); + return null; + } + + public ConfigMultiSelectionDialog(Shell parentShell) { super(parentShell); } + + protected void configureShell(Shell shell) { + super.configureShell(shell); + shell.setText(NewUIMessages.getResourceString("ConfigMultiSelectionDialog.0")); //$NON-NLS-1$ + } + + /** + * Method is overridden to disable "OK" button at start + */ + protected Control createContents(Composite parent) { + Control out = super.createContents(parent); + b_ok = getButton(IDialogConstants.OK_ID); + b_ok.setEnabled(false); + return out; + } + + /* (non-Javadoc) + * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite) + */ + protected Control createDialogArea(Composite parent) { + Composite composite = new Composite(parent, SWT.NULL); + composite.setFont(parent.getFont()); + composite.setLayout(new GridLayout(1, true)); + composite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); + + // Create the current config table + table = new Table(composite, SWT.CHECK | SWT.BORDER | SWT.SINGLE | SWT.V_SCROLL | SWT.H_SCROLL | SWT.FULL_SELECTION); + table.setLayoutData(new GridData(GridData.FILL)); + table.setHeaderVisible(true); + table.setLinesVisible(true); + + message = new Label(composite, SWT.NONE); + message.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); + message.setText(NewUIMessages.getResourceString("ConfigMultiSelectionDialog.1")); //$NON-NLS-1$ + message.setForeground(composite.getDisplay().getSystemColor(SWT.COLOR_RED)); + + TableColumn col = new TableColumn(table, SWT.NONE); + col.setText(NewUIMessages.getResourceString("ManageConfigDialog.1")); //$NON-NLS-1$ + col.setWidth(100); + col = new TableColumn(table, SWT.NONE); + col.setText(NewUIMessages.getResourceString("ManageConfigDialog.2")); //$NON-NLS-1$ + col.setWidth(120); + + tv = new CheckboxTableViewer(table); + tv.setContentProvider(new IStructuredContentProvider() { + public Object[] getElements(Object inputElement) { return cfgds; } + public void dispose() {} + public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {} + }); + tv.addCheckStateListener(new ICheckStateListener() { + public void checkStateChanged(CheckStateChangedEvent e) { + boolean enabled = (tv.getCheckedElements().length > 1); + if (b_ok != null) b_ok.setEnabled(enabled); + message.setVisible(!enabled); + }}); + tv.setLabelProvider(new ITableLabelProvider() { + public Image getColumnImage(Object element, int columnIndex) { return null; } + public void addListener(ILabelProviderListener listener) {} + public void dispose() {} + public boolean isLabelProperty(Object element, String property) { return false;} + public void removeListener(ILabelProviderListener listener) {} + + public String getColumnText(Object element, int index) { + ICConfigurationDescription cfg = (ICConfigurationDescription)element; + if (index == 0) return cfg.getName(); + if (index == 1) return cfg.getDescription(); + return AbstractPage.EMPTY_STR; + }}); + tv.setInput(cfgds); + table.setFocus(); + return composite; + } + +} diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/newui/ICPropertyProvider.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/newui/ICPropertyProvider.java index cb65aaa48bc..95bca684ec4 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/newui/ICPropertyProvider.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/newui/ICPropertyProvider.java @@ -63,4 +63,7 @@ public interface ICPropertyProvider extends ICOptionContainer { // Checks whether a project is new CDT model-style boolean isCDTProject(IProject p); + boolean isMultiCfg(); + ICConfigurationDescription[] getMultiCfg(); + } diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/newui/PluginResources.properties b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/newui/PluginResources.properties index a480ada6868..10e32a859d9 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/newui/PluginResources.properties +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/newui/PluginResources.properties @@ -420,9 +420,19 @@ AbstractCPropertyTab.0=Select build variable AbstractCPropertyTab.1=Variables... AbstractPage.0=Unknown element selected AbstractPage.1=This file has no properties to display +AbstractPage.12=Manage configurations +AbstractPage.11=setProjectDescription: +AbstractPage.10=Cannot create resource configuration for +AbstractPage.13=Cannot load +AbstractPage.14=Cannot create page: +AbstractPage.15=element not initialized \! AbstractPage.2=This project is not a CDT project AbstractPage.4=[ All configurations ] AbstractPage.5=[ Multiple configurations...] +AbstractPage.6=Configuration: +AbstractPage.7=Exclude resource from build +AbstractPage.8=Cannot apply +AbstractPage.9=Internal error AbstractLangsListTab.0=Show built-in values AbstractLangsListTab.1=Languages