From 2d963989a0c0d0c477fc0341bbe709b3086288a0 Mon Sep 17 00:00:00 2001 From: Markus Schorn Date: Tue, 24 Apr 2007 12:32:15 +0000 Subject: [PATCH] Fix for 172919, ui for selecting build configuration for indexer. --- .../ui/preferences/IndexerPreferencePage.java | 1 - .../ui/preferences}/IndexerStrategyBlock.java | 46 ++++-- .../cdt/ui/dialogs/DialogsMessages.java | 1 + .../cdt/ui/dialogs/DialogsMessages.properties | 1 + .../eclipse/cdt/ui/dialogs/IndexerBlock.java | 141 ++++++++++++++++-- 5 files changed, 165 insertions(+), 25 deletions(-) rename core/org.eclipse.cdt.ui/src/org/eclipse/cdt/{ui/dialogs => internal/ui/preferences}/IndexerStrategyBlock.java (62%) diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/preferences/IndexerPreferencePage.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/preferences/IndexerPreferencePage.java index 0a59ac86289..7d2a3bd9f4f 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/preferences/IndexerPreferencePage.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/preferences/IndexerPreferencePage.java @@ -27,7 +27,6 @@ import org.eclipse.ui.IWorkbenchPreferencePage; import org.eclipse.cdt.ui.dialogs.CacheSizeBlock; import org.eclipse.cdt.ui.dialogs.ICOptionContainer; import org.eclipse.cdt.ui.dialogs.IndexerBlock; -import org.eclipse.cdt.ui.dialogs.IndexerStrategyBlock; public class IndexerPreferencePage extends PreferencePage implements IWorkbenchPreferencePage, ICOptionContainer { diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/dialogs/IndexerStrategyBlock.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/preferences/IndexerStrategyBlock.java similarity index 62% rename from core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/dialogs/IndexerStrategyBlock.java rename to core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/preferences/IndexerStrategyBlock.java index b6ea5a5d88e..d7b198116d4 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/dialogs/IndexerStrategyBlock.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/preferences/IndexerStrategyBlock.java @@ -8,10 +8,11 @@ * Contributors: * Markus Schorn - initial API and implementation *******************************************************************************/ -package org.eclipse.cdt.ui.dialogs; +package org.eclipse.cdt.internal.ui.preferences; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; @@ -21,6 +22,13 @@ import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Group; +import org.eclipse.cdt.core.CCorePlugin; +import org.eclipse.cdt.core.settings.model.ICProjectDescriptionManager; +import org.eclipse.cdt.core.settings.model.ICProjectDescriptionPreferences; +import org.eclipse.cdt.core.settings.model.ICProjectDescriptionWorkspacePreferences; +import org.eclipse.cdt.ui.dialogs.AbstractCOptionPage; +import org.eclipse.cdt.ui.dialogs.DialogsMessages; +import org.eclipse.cdt.ui.dialogs.ICOptionContainer; import org.eclipse.cdt.utils.ui.controls.ControlFactory; import org.eclipse.cdt.internal.core.pdom.indexer.IndexerPreferences; @@ -33,8 +41,8 @@ public class IndexerStrategyBlock extends AbstractCOptionPage { private Button fAutoUpdateButton; private Button fImmediateUpdateButton; -// private Button fUseActiveBuildButton; -// private Button fUseFixedBuildConfig; + private Button fUseActiveBuildButton; + private Button fUseFixedBuildConfig; public IndexerStrategyBlock(ICOptionContainer container){ setContainer(container); @@ -68,12 +76,12 @@ public class IndexerStrategyBlock extends AbstractCOptionPage { fImmediateUpdateButton= ControlFactory.createCheckBox(group, DialogsMessages.IndexerStrategyBlock_immediateUpdate); fAutoUpdateButton.addSelectionListener(updateEnablement); -// group= ControlFactory.createGroup(composite, DialogsMessages.IndexerStrategyBlock_buildConfigGroup, 1); -// gd= (GridData) group.getLayoutData(); -// gd.grabExcessHorizontalSpace= true; -// gd.horizontalAlignment= GridData.FILL; -// fUseActiveBuildButton= ControlFactory.createRadioButton(group, DialogsMessages.IndexerStrategyBlock_activeBuildConfig, null, null); -// fUseFixedBuildConfig= ControlFactory.createRadioButton(group, DialogsMessages.IndexerStrategyBlock_specificBuildConfig, null, null); + group= ControlFactory.createGroup(composite, DialogsMessages.IndexerStrategyBlock_buildConfigGroup, 1); + gd= (GridData) group.getLayoutData(); + gd.grabExcessHorizontalSpace= true; + gd.horizontalAlignment= GridData.FILL; + fUseActiveBuildButton= ControlFactory.createRadioButton(group, DialogsMessages.IndexerStrategyBlock_activeBuildConfig, null, null); + fUseFixedBuildConfig= ControlFactory.createRadioButton(group, DialogsMessages.IndexerStrategyBlock_specificBuildConfig, null, null); initializeValues(); } @@ -86,8 +94,11 @@ public class IndexerStrategyBlock extends AbstractCOptionPage { int updatePolicy= IndexerPreferences.getUpdatePolicy(null); initUpdatePolicy(updatePolicy); -// fUseActiveBuildButton.setSelection(false); -// fUseFixedBuildConfig.setSelection(false); + ICProjectDescriptionManager prjDescMgr= CCorePlugin.getDefault().getProjectDescriptionManager(); + ICProjectDescriptionWorkspacePreferences prefs= prjDescMgr.getProjectDescriptionWorkspacePreferences(false); + boolean useActive= prefs.getConfigurationReltations() == ICProjectDescriptionPreferences.CONFIGS_LINK_SETTINGS_AND_ACTIVE; + fUseActiveBuildButton.setSelection(useActive); + fUseFixedBuildConfig.setSelection(!useActive); updateEnablement(); } @@ -109,10 +120,21 @@ public class IndexerStrategyBlock extends AbstractCOptionPage { updatePolicy= IndexerPreferences.UPDATE_POLICY_LAZY; } IndexerPreferences.setUpdatePolicy(null, updatePolicy); - } + + boolean useActive= fUseActiveBuildButton.getSelection(); + int relation= useActive + ? ICProjectDescriptionPreferences.CONFIGS_LINK_SETTINGS_AND_ACTIVE + : ICProjectDescriptionPreferences.CONFIGS_INDEPENDENT; + ICProjectDescriptionManager prjDescMgr= CCorePlugin.getDefault().getProjectDescriptionManager(); + ICProjectDescriptionWorkspacePreferences prefs= prjDescMgr.getProjectDescriptionWorkspacePreferences(true); + prefs.setConfigurationRelations(relation); + prjDescMgr.setProjectDescriptionWorkspacePreferences(prefs, false, new NullProgressMonitor()); + } public void performDefaults() { initUpdatePolicy(IndexerPreferences.getDefaultUpdatePolicy()); + fAutoUpdateButton.setSelection(false); + fImmediateUpdateButton.setSelection(true); updateEnablement(); } } diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/dialogs/DialogsMessages.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/dialogs/DialogsMessages.java index da737be9a1a..409d8a06fc8 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/dialogs/DialogsMessages.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/dialogs/DialogsMessages.java @@ -19,6 +19,7 @@ public class DialogsMessages extends NLS { public static String AbstractIndexerPage_indexUpFront; public static String AbstractIndexerPage_skipAllReferences; public static String AbstractIndexerPage_skipTypeReferences; + public static String IndexerBlock_fixedBuildConfig; public static String IndexerStrategyBlock_activeBuildConfig; public static String IndexerStrategyBlock_autoUpdate; public static String IndexerStrategyBlock_buildConfigGroup; diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/dialogs/DialogsMessages.properties b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/dialogs/DialogsMessages.properties index dd8e0bb380b..59a8cafe0fe 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/dialogs/DialogsMessages.properties +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/dialogs/DialogsMessages.properties @@ -22,6 +22,7 @@ CacheSizeBlock_absoluteLimit=Absolute Limit: CacheSizeBlock_headerFileCache=Header file cache (used by full indexer and refactoring): IndexerStrategyBlock_strategyGroup=Indexing strategy IndexerStrategyBlock_autoUpdate=Automatically update the index +IndexerBlock_fixedBuildConfig=Use a fixed build configuration IndexerStrategyBlock_immediateUpdate=Update index immediately after every file-change IndexerStrategyBlock_buildConfigGroup=Build configuration for the indexer IndexerStrategyBlock_activeBuildConfig=Use active build configuration diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/dialogs/IndexerBlock.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/dialogs/IndexerBlock.java index e3794e98958..6da11b7f534 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/dialogs/IndexerBlock.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/dialogs/IndexerBlock.java @@ -28,12 +28,20 @@ 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.Combo; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Group; +import org.eclipse.ui.dialogs.PropertyPage; import com.ibm.icu.text.Collator; +import org.eclipse.cdt.core.CCorePlugin; +import org.eclipse.cdt.core.settings.model.ICConfigurationDescription; +import org.eclipse.cdt.core.settings.model.ICProjectDescription; +import org.eclipse.cdt.core.settings.model.ICProjectDescriptionManager; +import org.eclipse.cdt.core.settings.model.ICProjectDescriptionPreferences; +import org.eclipse.cdt.core.settings.model.ICProjectDescriptionWorkspacePreferences; import org.eclipse.cdt.ui.CUIPlugin; import org.eclipse.cdt.utils.ui.controls.ControlFactory; import org.eclipse.cdt.utils.ui.controls.TabFolderLayout; @@ -58,9 +66,9 @@ public class IndexerBlock extends AbstractCOptionPage { private static final String PREF_PAGE_ID = "org.eclipse.cdt.ui.preferences.IndexerPreferencePage"; //$NON-NLS-1$ - private static final String INDEXER_LABEL = CUIPlugin.getResourceString("BaseIndexerBlock.label" ); //$NON-NLS-1$ - private static final String INDEXER_DESCRIPTION = CUIPlugin.getResourceString("BaseIndexerBlock.desc"); //$NON-NLS-1$ - private static final String INDEXER_COMBO_LABEL = CUIPlugin.getResourceString("BaseIndexerBlock.comboLabel"); //$NON-NLS-1$ + private static final String INDEXER_LABEL = "C/C++ Indexer"; //$NON-NLS-1$ + private static final String INDEXER_DESCRIPTION = "C/C++ Indexer setting for this project."; //$NON-NLS-1$ + private static final String INDEXER_COMBO_LABEL = "Select indexer"; //$NON-NLS-1$ private PreferenceScopeBlock fPrefScopeBlock; private Combo fIndexersComboBox; @@ -68,9 +76,12 @@ public class IndexerBlock extends AbstractCOptionPage { private Composite fIndexerPageComposite; private AbstractIndexerPage fCurrentPage; private Properties fCurrentProperties; + private Composite fPreferenceContent; + private Composite fParent; + private Button fUseActiveBuildButton; + private Button fUseFixedBuildConfig; + private Combo fBuildConfigComboBox; private ControlEnableState fEnableState; - private Composite fPreferenceContent; - private Composite fParent; public IndexerBlock(){ super(INDEXER_LABEL); @@ -140,14 +151,8 @@ public class IndexerBlock extends AbstractCOptionPage { gd= (GridData) fPreferenceContent.getLayoutData(); gd.horizontalIndent= 0; - Composite isc = ControlFactory.createComposite(fPreferenceContent, 1); - GridLayout gridLayout = ((GridLayout)isc.getLayout()); - gridLayout.makeColumnsEqualWidth= false; - gridLayout.marginHeight = 0; - gridLayout.marginWidth= 0; - // add combo to select indexer - Group group= ControlFactory.createGroup(isc,INDEXER_COMBO_LABEL, 1); + Group group= ControlFactory.createGroup(fPreferenceContent,INDEXER_COMBO_LABEL, 1); gd= (GridData) group.getLayoutData(); gd.grabExcessHorizontalSpace= true; fIndexersComboBox = ControlFactory.createSelectCombo(group,"", ""); //$NON-NLS-1$ //$NON-NLS-2$ @@ -162,21 +167,87 @@ public class IndexerBlock extends AbstractCOptionPage { fIndexerPageComposite.setLayoutData(new GridData(GridData.FILL, GridData.FILL, true, true, 2, 1)); fIndexerPageComposite.setLayout(new TabFolderLayout()); + if (needBuildConfigOptions()) { + group= ControlFactory.createGroup(composite, DialogsMessages.IndexerStrategyBlock_buildConfigGroup, 1); + gd= (GridData) group.getLayoutData(); + gd.grabExcessHorizontalSpace= true; + fUseActiveBuildButton= ControlFactory.createRadioButton(group, DialogsMessages.IndexerStrategyBlock_activeBuildConfig, null, null); + fUseFixedBuildConfig= ControlFactory.createRadioButton(group, DialogsMessages.IndexerBlock_fixedBuildConfig, null, null); + fBuildConfigComboBox= ControlFactory.createSelectCombo(group, "", ""); //$NON-NLS-1$ //$NON-NLS-2$ + final SelectionAdapter listener = new SelectionAdapter() { + public void widgetSelected(SelectionEvent e) { + setUseActiveBuildConfig(fUseActiveBuildButton.getSelection()); + } + }; + fUseActiveBuildButton.addSelectionListener(listener); + fUseFixedBuildConfig.addSelectionListener(listener); + } + initializeScope(); initializeIndexerCombo(); + initializeBuildConfigs(); onPreferenceScopeChange(); fParent.layout(true); } + protected boolean needBuildConfigOptions() { + if (fPrefScopeBlock == null || !(getContainer() instanceof PropertyPage)) { + return false; + } + IProject prj= getProject(); + if (prj != null) { + ICProjectDescriptionManager prjDescMgr= CCorePlugin.getDefault().getProjectDescriptionManager(); + if (prjDescMgr.isNewStyleProject(prj)) { + return true; + } + } + return false; + } + + private void updateBuildConfigForScope(int scope) { + if (fBuildConfigComboBox != null) { + if (scope == IndexerPreferences.SCOPE_INSTANCE) { + ICProjectDescriptionManager prjDescMgr= CCorePlugin.getDefault().getProjectDescriptionManager(); + ICProjectDescriptionWorkspacePreferences prefs= prjDescMgr.getProjectDescriptionWorkspacePreferences(false); + boolean useActive= prefs.getConfigurationReltations() == ICProjectDescriptionPreferences.CONFIGS_LINK_SETTINGS_AND_ACTIVE; + setUseActiveBuildConfig(useActive); + } + } + } + + protected void setUseActiveBuildConfig(boolean useActive) { + if (fBuildConfigComboBox != null) { + if (useActive) { + ICProjectDescriptionManager prjDescMgr= CCorePlugin.getDefault().getProjectDescriptionManager(); + ICProjectDescription prefs= prjDescMgr.getProjectDescription(getProject(), false); + selectBuildConfigInCombo(prefs.getActiveConfiguration().getName()); + fBuildConfigComboBox.setEnabled(false); + } + else { + fBuildConfigComboBox.setEnabled(true); + } + fUseActiveBuildButton.setSelection(useActive); + fUseFixedBuildConfig.setSelection(!useActive); + } + } + private void enablePreferenceContent(boolean enable) { if (fEnableState != null) { fEnableState.restore(); + if (fUseActiveBuildButton != null) { + fUseActiveBuildButton.setEnabled(true); + fUseFixedBuildConfig.setEnabled(true); + } } if (enable) { fEnableState= null; } else { fEnableState= ControlEnableState.disable(fPreferenceContent); + if (fUseActiveBuildButton != null) { + fUseActiveBuildButton.setEnabled(false); + fUseFixedBuildConfig.setEnabled(false); + } } } @@ -211,8 +282,36 @@ public class IndexerBlock extends AbstractCOptionPage { fIndexersComboBox.setItems(names); } + private void initializeBuildConfigs() { + if (fBuildConfigComboBox != null) { + ICProjectDescriptionManager prjDescMgr= CCorePlugin.getDefault().getProjectDescriptionManager(); + ICProjectDescription prefs= prjDescMgr.getProjectDescription(getProject(), false); + setUseActiveBuildConfig(prefs.getConfigurationReltations() == ICProjectDescriptionPreferences.CONFIGS_LINK_SETTINGS_AND_ACTIVE); + ICConfigurationDescription[] configs= prefs.getConfigurations(); + String[] names= new String[configs.length]; + for (int i = 0; i < configs.length; i++) { + ICConfigurationDescription config = configs[i]; + names[i]= config.getName(); + } + Arrays.sort(names, Collator.getInstance()); + fBuildConfigComboBox.setItems(names); + selectBuildConfigInCombo(prefs.getDefaultSettingConfiguration().getName()); + } + } + + private void selectBuildConfigInCombo(String useName) { + String[] names= fBuildConfigComboBox.getItems(); + int selectedIndex = 0; + for (int i=0; i