From ec0f826863d2583d2d810515fddf9b1a42d4cb2f Mon Sep 17 00:00:00 2001 From: Andrew Gvozdev Date: Mon, 8 Feb 2010 23:01:45 +0000 Subject: [PATCH] bug 300707: Add ability to specify file-extension filter for build-options that support file browsing Patch from Baltasar Belyavsky --- .../schema/buildDefinitions.exsd | 7 +++ .../cdt/managedbuilder/core/IOption.java | 16 ++++++ .../managedbuilder/internal/core/Option.java | 55 +++++++++++++++++++ .../internal/core/OptionReference.java | 13 +++++ .../ui/properties/BuildOptionSettingsUI.java | 3 + .../FileListControlFieldEditor.java | 10 ++++ .../utils/ui/controls/FileListControl.java | 14 +++++ 7 files changed, 118 insertions(+) diff --git a/build/org.eclipse.cdt.managedbuilder.core/schema/buildDefinitions.exsd b/build/org.eclipse.cdt.managedbuilder.core/schema/buildDefinitions.exsd index c2ea8df08a3..a761e12a1fd 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/schema/buildDefinitions.exsd +++ b/build/org.eclipse.cdt.managedbuilder.core/schema/buildDefinitions.exsd @@ -1306,6 +1306,13 @@ Additional special types exist to flag options of special relevance to the build + + + + An optional value that specifies a comma-separated string of file-extension filters for the underlying file browse-dialog. For filters with multiple extensions, use semicolon as a separator - eg. "*.lib;*.a;*.cmd,*.*". This attribute only applies when user chooses to browse the file-system, and only when browseType is 'file'. + + + diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/core/IOption.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/core/IOption.java index 31c6d4a94f2..2476b725348 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/core/IOption.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/core/IOption.java @@ -75,6 +75,8 @@ public interface IOption extends IBuildObject { // Schema attribute names for option elements public static final String BROWSE_TYPE = "browseType"; //$NON-NLS-1$ + /** @since 7.0 */ + public static final String BROWSE_FILTER_EXTENSIONS = "browseFilterExtensions"; //$NON-NLS-1$ public static final String CATEGORY = "category"; //$NON-NLS-1$ public static final String COMMAND = "command"; //$NON-NLS-1$ public static final String COMMAND_FALSE = "commandFalse"; //$NON-NLS-1$ @@ -173,6 +175,20 @@ public interface IOption extends IBuildObject { */ public void setBrowseType(int type); + /** + * @return the setting of the browseFilterExtensions attribute. For options of {@link #BROWSE_FILE} type. + * @since 7.0 + */ + public String[] getBrowseFilterExtensions(); + + /** + * Sets the browseFilterExtensions attribute. For options of {@link #BROWSE_FILE} type. + * @param extensions - file extensions to show in browse files dialog + * + * @since 7.0 + */ + public void setBrowseFilterExtensions(String[] extensions); + /** * Returns the setting of the resourceFilter attribute * diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/Option.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/Option.java index b3cad1158ef..b697811638b 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/Option.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/Option.java @@ -56,6 +56,7 @@ public class Option extends BuildObject implements IOption, IBuildPropertiesRest // Managed Build model attributes private String unusedChildren; private Integer browseType; + private String[] browseFilterExtensions; private List builtIns; private IOptionCategory category; private String categoryId; @@ -202,6 +203,9 @@ public class Option extends BuildObject implements IOption, IBuildPropertiesRest if (option.browseType != null) { browseType = new Integer(option.browseType.intValue()); } + if (option.browseFilterExtensions != null) { + browseFilterExtensions = option.browseFilterExtensions.clone(); + } if (option.resourceFilter != null) { resourceFilter = new Integer(option.resourceFilter.intValue()); } @@ -356,6 +360,12 @@ public class Option extends BuildObject implements IOption, IBuildPropertiesRest browseType = new Integer(BROWSE_DIR); } + // Get the browseFilterExtensions attribute + String browseFilterExtensionsStr = element.getAttribute(BROWSE_FILTER_EXTENSIONS); + if (browseFilterExtensionsStr != null) { + this.browseFilterExtensions = browseFilterExtensionsStr.split("\\s*,\\s*"); //$NON-NLS-1$ + } + categoryId = element.getAttribute(CATEGORY); // Get the resourceFilter attribute @@ -588,6 +598,14 @@ public class Option extends BuildObject implements IOption, IBuildPropertiesRest } } + // Get the browseFilterExtensions attribute + if (element.getAttribute(BROWSE_FILTER_EXTENSIONS) != null) { + String browseFilterExtensionsStr = element.getAttribute(BROWSE_FILTER_EXTENSIONS); + if (browseFilterExtensionsStr != null) { + this.browseFilterExtensions = browseFilterExtensionsStr.split("\\s*,\\s*"); //$NON-NLS-1$ + } + } + if (element.getAttribute(CATEGORY) != null) { categoryId = element.getAttribute(CATEGORY); if (categoryId != null) { @@ -861,6 +879,15 @@ public class Option extends BuildObject implements IOption, IBuildPropertiesRest element.setAttribute(BROWSE_TYPE, str); } + // browse filter extensions + if (browseFilterExtensions != null) { + StringBuilder sb = new StringBuilder(); + for(String ext : browseFilterExtensions) { + sb.append(ext + ','); + } + element.setAttribute(BROWSE_FILTER_EXTENSIONS, sb.toString()); + } + if (categoryId != null) { element.setAttribute(CATEGORY, categoryId); } @@ -985,6 +1012,20 @@ public class Option extends BuildObject implements IOption, IBuildPropertiesRest return browseType.intValue(); } + /* (non-Javadoc) + * @see org.eclipse.cdt.managedbuilder.core.IOption#getBrowseFilterExtensions() + */ + public String[] getBrowseFilterExtensions() { + if (browseFilterExtensions == null) { + if (superClass != null) { + return superClass.getBrowseFilterExtensions(); + } else { + return null; + } + } + return browseFilterExtensions.clone(); + } + /* (non-Javadoc) * @see org.eclipse.cdt.managedbuilder.core.IOption#getResourceFilter() */ @@ -1674,6 +1715,19 @@ public class Option extends BuildObject implements IOption, IBuildPropertiesRest } } + /* (non-Javadoc) + * @see org.eclipse.cdt.managedbuilder.core.IOption#setBrowseFilterExtensions(java.lang.String[]) + */ + public void setBrowseFilterExtensions(String[] extensions) { + if (browseFilterExtensions == null || !(browseFilterExtensions.equals(extensions))) { + browseFilterExtensions = extensions; + if(!isExtensionElement()) { + isDirty = true; + rebuildState = true; + } + } + } + /* (non-Javadoc) * @see org.eclipse.cdt.managedbuilder.core.IOption#setValue(boolean) */ @@ -1901,6 +1955,7 @@ public class Option extends BuildObject implements IOption, IBuildPropertiesRest if (superClass != null && unusedChildren == null && browseType == null && + browseFilterExtensions == null && (builtIns == null || builtIns.size() == 0) && category == null && categoryId == null && diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/OptionReference.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/OptionReference.java index 84a0da761d2..c55bdf24e67 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/OptionReference.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/OptionReference.java @@ -476,6 +476,13 @@ public class OptionReference implements IOption { return option.getBrowseType(); } + /* (non-Javadoc) + * @see org.eclipse.cdt.managedbuilder.core.IOption#getBrowseFilterExtensions() + */ + public String[] getBrowseFilterExtensions() { + return option.getBrowseFilterExtensions(); + } + private List getBuiltInList() { if (builtIns == null) { builtIns = new ArrayList(); @@ -786,6 +793,12 @@ public class OptionReference implements IOption { public void setBrowseType(int type) { } + /* (non-Javadoc) + * @see org.eclipse.cdt.managedbuilder.core.IOption#setBrowseFilterExtensions(java.lang.String[]) + */ + public void setBrowseFilterExtensions(String[] extensions) { + } + /* (non-Javadoc) * @see org.eclipse.cdt.core.build.managed.IOption#setCategory(org.eclipse.cdt.core.build.managed.IOptionCategory) */ diff --git a/build/org.eclipse.cdt.managedbuilder.ui/src/org/eclipse/cdt/managedbuilder/ui/properties/BuildOptionSettingsUI.java b/build/org.eclipse.cdt.managedbuilder.ui/src/org/eclipse/cdt/managedbuilder/ui/properties/BuildOptionSettingsUI.java index 360b400c402..7e3d934dc5c 100644 --- a/build/org.eclipse.cdt.managedbuilder.ui/src/org/eclipse/cdt/managedbuilder/ui/properties/BuildOptionSettingsUI.java +++ b/build/org.eclipse.cdt.managedbuilder.ui/src/org/eclipse/cdt/managedbuilder/ui/properties/BuildOptionSettingsUI.java @@ -226,6 +226,7 @@ public class BuildOptionSettingsUI extends AbstractToolSettingUI { return true; } }; + ((FileFieldEditor)stringField).setFileExtensions(opt.getBrowseFilterExtensions()); } break; case IOption.BROWSE_NONE: { @@ -325,6 +326,8 @@ public class BuildOptionSettingsUI extends AbstractToolSettingUI { String tooltipHoverStr = displayFixedTip ? null : tipStr; fieldEditor = new FileListControlFieldEditor(optId, nameStr, tooltipHoverStr, contextId, fieldEditorParent, opt.getBrowseType()); + ((FileListControlFieldEditor)fieldEditor).setFilterExtensions(opt.getBrowseFilterExtensions()); + if (pageHasToolTipBox) { Label label = fieldEditor.getLabelControl(fieldEditorParent); label.setData(new TipInfo(nameStr,tipStr)); diff --git a/build/org.eclipse.cdt.managedbuilder.ui/src/org/eclipse/cdt/managedbuilder/ui/properties/FileListControlFieldEditor.java b/build/org.eclipse.cdt.managedbuilder.ui/src/org/eclipse/cdt/managedbuilder/ui/properties/FileListControlFieldEditor.java index d64ae9ff5b1..6e66029da09 100644 --- a/build/org.eclipse.cdt.managedbuilder.ui/src/org/eclipse/cdt/managedbuilder/ui/properties/FileListControlFieldEditor.java +++ b/build/org.eclipse.cdt.managedbuilder.ui/src/org/eclipse/cdt/managedbuilder/ui/properties/FileListControlFieldEditor.java @@ -142,6 +142,16 @@ public class FileListControlFieldEditor extends FieldEditor { // this.values = parseString(value); } + /** + * Sets the filter-extensions for the underlying Browse dialog. Only applies when browseType is 'file'. + * @param filterExtensions + * + * @since 7.0 + */ + public void setFilterExtensions(String[] filterExtensions) { + list.setFilterExtensions(filterExtensions); + } + /** * Fills this field editor's basic controls into the given parent. */ diff --git a/core/org.eclipse.cdt.ui/utils.ui/org/eclipse/cdt/utils/ui/controls/FileListControl.java b/core/org.eclipse.cdt.ui/utils.ui/org/eclipse/cdt/utils/ui/controls/FileListControl.java index 4fa827fb3e2..62a2883b51f 100644 --- a/core/org.eclipse.cdt.ui/utils.ui/org/eclipse/cdt/utils/ui/controls/FileListControl.java +++ b/core/org.eclipse.cdt.ui/utils.ui/org/eclipse/cdt/utils/ui/controls/FileListControl.java @@ -319,6 +319,9 @@ public class FileListControl { if (currentName != null && currentName.trim().length() != 0) { browseDialog.setFilterPath(currentName); } + if (FileListControl.this.filterExtensions != null) { + browseDialog.setFilterExtensions(FileListControl.this.filterExtensions); + } result = browseDialog.open(); if (result != null) { fSetByBrowseDialog = true; @@ -465,6 +468,7 @@ public class FileListControl { // The type of browse support that is required private int browseType; + private String[] filterExtensions; /** The base path that should be used when adding new resources */ private IPath path = new Path(""); //$NON-NLS-1$ @@ -955,6 +959,16 @@ public class FileListControl { promptForDelete = type == BROWSE_FILE || type == BROWSE_DIR; } + /** + * Sets the filter-extensions for the underlying Browse dialog. Only applies when browseType is 'file'. + * @param filterExtensions + * + * @since 5.2 + */ + public void setFilterExtensions(String[] filterExtensions) { + this.filterExtensions = filterExtensions; + } + /** * Enable/Disable workspace support. If enabled, the workspace browse button * will be visible in the SelectPathInputDialog.