From 8652fb4175d5faa6827de06f2a2d825b0c07d2a0 Mon Sep 17 00:00:00 2001 From: Raphael Moll <> Date: Tue, 24 Mar 2009 22:30:00 -0700 Subject: [PATCH] Automated import from //branches/master/...@142292,142292 --- .../com.android.ide.eclipse.adt/plugin.xml | 2 +- .../extractstring/ExtractStringAction.java | 4 +- .../extractstring/ExtractStringInputPage.java | 392 ++++++++++++++++-- .../ExtractStringRefactoring.java | 7 +- .../extractstring/ExtractStringWizard.java | 14 +- .../wizards/NewXmlFileCreationPage.java | 26 +- 6 files changed, 375 insertions(+), 70 deletions(-) diff --git a/tools/eclipse/plugins/com.android.ide.eclipse.adt/plugin.xml b/tools/eclipse/plugins/com.android.ide.eclipse.adt/plugin.xml index 81bb60634..2c1394cd2 100644 --- a/tools/eclipse/plugins/com.android.ide.eclipse.adt/plugin.xml +++ b/tools/eclipse/plugins/com.android.ide.eclipse.adt/plugin.xml @@ -501,7 +501,7 @@ class="com.android.ide.eclipse.adt.refactorings.extractstring.ExtractStringAction" definitionId="com.android.ide.eclipse.adt.refactoring.extract.string" id="com.android.ide.eclipse.adt.actions.ExtractString" - label="Extract Android String" + label="Extract Android String..." menubarPath="org.eclipse.jdt.ui.refactoring.menu/codingGroup" style="push" tooltip="Extracts a string into Android resource string"> diff --git a/tools/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/refactorings/extractstring/ExtractStringAction.java b/tools/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/refactorings/extractstring/ExtractStringAction.java index dceb1441d..4ef1268de 100644 --- a/tools/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/refactorings/extractstring/ExtractStringAction.java +++ b/tools/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/refactorings/extractstring/ExtractStringAction.java @@ -22,9 +22,7 @@ import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.CoreException; import org.eclipse.jdt.core.ICompilationUnit; -import org.eclipse.jdt.core.ITypeRoot; import org.eclipse.jdt.core.JavaCore; -import org.eclipse.jdt.ui.JavaUI; import org.eclipse.jface.action.IAction; import org.eclipse.jface.text.ITextSelection; import org.eclipse.jface.viewers.ISelection; @@ -122,7 +120,7 @@ public class ExtractStringAction implements IWorkbenchWindowActionDelegate { public void run(IAction action) { if (mSelection != null && mFile != null) { ExtractStringRefactoring ref = new ExtractStringRefactoring(mFile, mSelection); - RefactoringWizard wizard = new ExtractStringWizard(ref, "Extract Android String"); + RefactoringWizard wizard = new ExtractStringWizard(ref, mFile.getProject()); RefactoringWizardOpenOperation op = new RefactoringWizardOpenOperation(wizard); try { op.run(mWindow.getShell(), wizard.getDefaultPageTitle()); diff --git a/tools/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/refactorings/extractstring/ExtractStringInputPage.java b/tools/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/refactorings/extractstring/ExtractStringInputPage.java index cb449f02e..5ffeeb05f 100644 --- a/tools/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/refactorings/extractstring/ExtractStringInputPage.java +++ b/tools/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/refactorings/extractstring/ExtractStringInputPage.java @@ -16,29 +16,74 @@ package com.android.ide.eclipse.adt.refactorings.extractstring; + +import com.android.ide.eclipse.common.AndroidConstants; +import com.android.ide.eclipse.editors.resources.configurations.FolderConfiguration; +import com.android.ide.eclipse.editors.resources.manager.ResourceFolderType; +import com.android.ide.eclipse.editors.wizards.ConfigurationSelector; +import com.android.sdklib.SdkConstants; + +import org.eclipse.core.resources.IFolder; +import org.eclipse.core.resources.IProject; +import org.eclipse.core.resources.IResource; +import org.eclipse.core.runtime.CoreException; import org.eclipse.jface.wizard.IWizardPage; +import org.eclipse.jface.wizard.WizardPage; import org.eclipse.ltk.ui.refactoring.UserInputWizardPage; import org.eclipse.swt.SWT; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Combo; import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Group; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Text; +import java.util.HashMap; +import java.util.TreeSet; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + /** * @see ExtractStringRefactoring */ class ExtractStringInputPage extends UserInputWizardPage implements IWizardPage { - public ExtractStringInputPage() { - super("ExtractStringInputPage"); //$NON-NLS-1$ - } + /** Last res file path used, shared across the session instances but specific to the + * current project. The default for unknown projects is {@link #DEFAULT_RES_FILE_PATH}. */ + private static HashMap sLastResFilePath = new HashMap(); + /** The project where the user selection happened. */ + private final IProject mProject; + + /** Field displaying the user-selected string to be replaced. */ private Label mStringLabel; + /** Test field where the user enters the new ID to be generated or replaced with. */ private Text mNewIdTextField; - private Label mFileLabel; + /** The configuration selector, to select the resource path of the XML file. */ + private ConfigurationSelector mConfigSelector; + /** The combo to display the existing XML files or enter a new one. */ + private Combo mResFileCombo; + + /** Regex pattern to read a valid res XML file path. It checks that the are 2 folders and + * a leaf file name ending with .xml */ + private static final Pattern RES_XML_FILE_REGEX = Pattern.compile( + "/res/[a-z][a-zA-Z0-9_-]+/[^.]+\\.xml"); //$NON-NLS-1$ + /** Absolute destination folder root, e.g. "/res/" */ + private static final String RES_FOLDER_ABS = + AndroidConstants.WS_RESOURCES + AndroidConstants.WS_SEP; + /** Relative destination folder root, e.g. "res/" */ + private static final String RES_FOLDER_REL = + SdkConstants.FD_RESOURCES + AndroidConstants.WS_SEP; + + private static final String DEFAULT_RES_FILE_PATH = "/res/values/strings.xml"; + + public ExtractStringInputPage(IProject project) { + super("ExtractStringInputPage"); //$NON-NLS-1$ + mProject = project; + } /** * Create the UI for the refactoring wizard. @@ -48,34 +93,57 @@ class ExtractStringInputPage extends UserInputWizardPage implements IWizardPage */ public void createControl(Composite parent) { - final ExtractStringRefactoring ref = getOurRefactoring(); - Composite content = new Composite(parent, SWT.NONE); GridLayout layout = new GridLayout(); - layout.numColumns = 2; + layout.numColumns = 1; content.setLayout(layout); - - // line 1: String found in selection - Label label = new Label(content, SWT.NONE); + createStringReplacementGroup(content); + createResFileGroup(content); + + validatePage(); + setControl(content); + } + + /** + * Creates the top group with the field to replace which string and by what + * and by which options. + * + * @param content A composite with a 1-column grid layout + */ + private void createStringReplacementGroup(Composite content) { + + final ExtractStringRefactoring ref = getOurRefactoring(); + + Group group = new Group(content, SWT.NONE); + group.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); + group.setText("String Replacement"); + + GridLayout layout = new GridLayout(); + layout.numColumns = 2; + group.setLayout(layout); + + // line: String found in selection + + Label label = new Label(group, SWT.NONE); label.setText("String:"); String selectedString = ref.getTokenString(); - mStringLabel = new Label(content, SWT.NONE); + mStringLabel = new Label(group, SWT.NONE); mStringLabel.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); mStringLabel.setText(selectedString != null ? selectedString : ""); // TODO provide an option to replace all occurences of this string instead of // just the one. - // line 2 : Textfield for new ID + // line : Textfield for new ID - label = new Label(content, SWT.NONE); + label = new Label(group, SWT.NONE); label.setText("Replace by R.string."); - mNewIdTextField = new Text(content, SWT.SINGLE | SWT.LEFT | SWT.BORDER); + mNewIdTextField = new Text(group, SWT.SINGLE | SWT.LEFT | SWT.BORDER); mNewIdTextField.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); mNewIdTextField.setText(guessId(selectedString)); @@ -83,37 +151,65 @@ class ExtractStringInputPage extends UserInputWizardPage implements IWizardPage mNewIdTextField.addModifyListener(new ModifyListener() { public void modifyText(ModifyEvent e) { - if (validatePage(ref)) { + if (validatePage()) { ref.setReplacementStringId(mNewIdTextField.getText().trim()); } } }); - - // line 3: selection of the output file - // TODO add a file field/chooser combo to let the user select the file to edit. - - label = new Label(content, SWT.NONE); - label.setText("Resource file:"); - - mFileLabel = new Label(content, SWT.NONE); - mFileLabel.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); - mFileLabel.setText("/res/values/strings.xml"); - ref.setTargetFile(mFileLabel.getText()); - - // line 4: selection of the res config - // TODO add the Configuration Selector to decide with strings.xml to change - - label = new Label(content, SWT.NONE); - label.setText("Configuration:"); - - label = new Label(content, SWT.NONE); - label.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); - label.setText("default"); - - validatePage(ref); - setControl(content); } + /** + * Creates the lower group with the fields to choose the resource confirmation and + * the target XML file. + * + * @param content A composite with a 1-column grid layout + */ + private void createResFileGroup(Composite content) { + + Group group = new Group(content, SWT.NONE); + group.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); + group.setText("XML resource to edit"); + + GridLayout layout = new GridLayout(); + layout.numColumns = 2; + group.setLayout(layout); + + // line: selection of the res config + + Label label; + label = new Label(group, SWT.NONE); + label.setText("Configuration:"); + + mConfigSelector = new ConfigurationSelector(group); + GridData gd = new GridData(2, GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL); + gd.widthHint = ConfigurationSelector.WIDTH_HINT; + gd.heightHint = ConfigurationSelector.HEIGHT_HINT; + mConfigSelector.setLayoutData(gd); + OnConfigSelectorUpdated onConfigSelectorUpdated = new OnConfigSelectorUpdated(); + mConfigSelector.setOnChangeListener(onConfigSelectorUpdated); + + // line: selection of the output file + + label = new Label(group, SWT.NONE); + label.setText("Resource file:"); + + mResFileCombo = new Combo(group, SWT.DROP_DOWN); + mResFileCombo.select(0); + mResFileCombo.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); + mResFileCombo.addModifyListener(onConfigSelectorUpdated); + + // set output file name to the last one used + + String projPath = mProject.getFullPath().toPortableString(); + String filePath = sLastResFilePath.get(projPath); + + mResFileCombo.setText(filePath != null ? filePath : DEFAULT_RES_FILE_PATH); + onConfigSelectorUpdated.run(); + } + + /** + * Utility method to guess a suitable new XML ID based on the selected string. + */ private String guessId(String text) { // make lower case text = text.toLowerCase(); @@ -128,16 +224,25 @@ class ExtractStringInputPage extends UserInputWizardPage implements IWizardPage return text; } + /** + * Returns the {@link ExtractStringRefactoring} instance used by this wizard page. + */ private ExtractStringRefactoring getOurRefactoring() { return (ExtractStringRefactoring) getRefactoring(); } - private boolean validatePage(ExtractStringRefactoring ref) { - String text = mNewIdTextField.getText().trim(); + /** + * Validates fields of the wizard input page. Displays errors as appropriate and + * enable the "Next" button (or not) by calling {@link #setPageComplete(boolean)}. + * + * @return True if the page has been positively validated. It may still have warnings. + */ + private boolean validatePage() { boolean success = true; // Analyze fatal errors. + String text = mNewIdTextField.getText().trim(); if (text == null || text.length() < 1) { setErrorMessage("Please provide a resource ID to replace with."); success = false; @@ -157,21 +262,216 @@ class ExtractStringInputPage extends UserInputWizardPage implements IWizardPage } } + String resFile = mResFileCombo.getText(); + if (success) { + if (resFile == null || resFile.length() == 0) { + setErrorMessage("A resource file name is required."); + success = false; + } else if (!RES_XML_FILE_REGEX.matcher(resFile).matches()) { + setErrorMessage("The XML file name is not valid."); + success = false; + } + } + // Analyze info & warnings. if (success) { - if (ref.isResIdDuplicate(mFileLabel.getText(), text)) { - setErrorMessage(null); + setErrorMessage(null); + + ExtractStringRefactoring ref = getOurRefactoring(); + + ref.setTargetFile(resFile); + sLastResFilePath.put(mProject.getFullPath().toPortableString(), resFile); + + if (ref.isResIdDuplicate(resFile, text)) { setMessage( - String.format("Warning: There's already a string item called '%1$s' in %2$s.", - text, mFileLabel.getText())); + String.format("There's already a string item called '%1$s' in %2$s.", + text, resFile), + WizardPage.WARNING); + } else if (mProject.findMember(resFile) == null) { + setMessage( + String.format("File %2$s does not exist and will be created.", + text, resFile), + WizardPage.INFORMATION); } else { setMessage(null); - setErrorMessage(null); } } setPageComplete(success); return success; } + + public class OnConfigSelectorUpdated implements Runnable, ModifyListener { + + /** Regex pattern to parse a valid res path: it reads (/res/folder-name/)+(filename). */ + private final Pattern mPathRegex = Pattern.compile( + "(/res/[a-z][a-zA-Z0-9_-]+/)(.+)"); //$NON-NLS-1$ + + /** Temporary config object used to retrieve the Config Selector value. */ + private FolderConfiguration mTempConfig = new FolderConfiguration(); + + private HashMap> mFolderCache = + new HashMap>(); + private String mLastFolderUsedInCombo = null; + private boolean mInternalConfigChange; + private boolean mInternalFileComboChange; + + /** + * Callback invoked when the {@link ConfigurationSelector} has been changed. + *

+ * The callback does the following: + *

    + *
  • Examine the current file name to retrieve the XML filename, if any. + *
  • Recompute the path based on the configuration selector (e.g. /res/values-fr/). + *
  • Examine the path to retrieve all the files in it. Keep those in a local cache. + *
  • If the XML filename from step 1 is not in the file list, it's a custom file name. + * Insert it and sort it. + *
  • Re-populate the file combo with all the choices. + *
  • Select the original XML file. + */ + public void run() { + if (mInternalConfigChange) { + return; + } + + // get current leafname, if any + String leafName = ""; + String currPath = mResFileCombo.getText(); + Matcher m = mPathRegex.matcher(currPath); + if (m.matches()) { + // Note: groups 1 and 2 cannot be null. + leafName = m.group(2); + currPath = m.group(1); + } else { + // There was a path but it was invalid. Ignore it. + currPath = ""; + } + + // recreate the res path from the current configuration + mConfigSelector.getConfiguration(mTempConfig); + StringBuffer sb = new StringBuffer(RES_FOLDER_ABS); + sb.append(mTempConfig.getFolderName(ResourceFolderType.VALUES)); + sb.append('/'); + + String newPath = sb.toString(); + if (newPath.equals(currPath) && newPath.equals(mLastFolderUsedInCombo)) { + // Path has not changed. No need to reload. + return; + } + + // Get all the files at the new path + + TreeSet filePaths = mFolderCache.get(newPath); + + if (filePaths == null) { + filePaths = new TreeSet(); + + IFolder folder = mProject.getFolder(newPath); + if (folder != null && folder.exists()) { + try { + for (IResource res : folder.members()) { + String name = res.getName(); + if (res.getType() == IResource.FILE && name.endsWith(".xml")) { + filePaths.add(newPath + name); + } + } + } catch (CoreException e) { + // Ignore. + } + } + + mFolderCache.put(newPath, filePaths); + } + + currPath = newPath + leafName; + if (leafName.length() > 0 && !filePaths.contains(currPath)) { + filePaths.add(currPath); + } + + // Fill the combo + try { + mInternalFileComboChange = true; + + mResFileCombo.removeAll(); + + for (String filePath : filePaths) { + mResFileCombo.add(filePath); + } + + int index = -1; + if (leafName.length() > 0) { + index = mResFileCombo.indexOf(currPath); + if (index >= 0) { + mResFileCombo.select(index); + } + } + + if (index == -1) { + mResFileCombo.setText(currPath); + } + + mLastFolderUsedInCombo = newPath; + + } finally { + mInternalFileComboChange = false; + } + + // finally validate the whole page + validatePage(); + } + + /** + * Callback invoked when {@link ExtractStringInputPage#mResFileCombo} has been + * modified. + */ + public void modifyText(ModifyEvent e) { + if (mInternalFileComboChange) { + return; + } + + String wsFolderPath = mResFileCombo.getText(); + + // This is a custom path, we need to sanitize it. + // First it should start with "/res/". Then we need to make sure there are no + // relative paths, things like "../" or "./" or even "//". + wsFolderPath = wsFolderPath.replaceAll("/+\\.\\./+|/+\\./+|//+|\\\\+|^/+", "/"); //$NON-NLS-1$ //$NON-NLS-2$ + wsFolderPath = wsFolderPath.replaceAll("^\\.\\./+|^\\./+", ""); //$NON-NLS-1$ //$NON-NLS-2$ + wsFolderPath = wsFolderPath.replaceAll("/+\\.\\.$|/+\\.$|/+$", ""); //$NON-NLS-1$ //$NON-NLS-2$ + + // We get "res/foo" from selections relative to the project when we want a "/res/foo" path. + if (wsFolderPath.startsWith(RES_FOLDER_REL)) { + wsFolderPath = RES_FOLDER_ABS + wsFolderPath.substring(RES_FOLDER_REL.length()); + + mInternalFileComboChange = true; + mResFileCombo.setText(wsFolderPath); + mInternalFileComboChange = false; + } + + if (wsFolderPath.startsWith(RES_FOLDER_ABS)) { + wsFolderPath = wsFolderPath.substring(RES_FOLDER_ABS.length()); + + int pos = wsFolderPath.indexOf(AndroidConstants.WS_SEP_CHAR); + if (pos >= 0) { + wsFolderPath = wsFolderPath.substring(0, pos); + } + + String[] folderSegments = wsFolderPath.split(FolderConfiguration.QUALIFIER_SEP); + + if (folderSegments.length > 0) { + String folderName = folderSegments[0]; + + if (folderName != null && !folderName.equals(wsFolderPath)) { + // update config selector + mInternalConfigChange = true; + mConfigSelector.setConfiguration(folderSegments); + mInternalConfigChange = false; + } + } + } + + validatePage(); + } + } + } diff --git a/tools/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/refactorings/extractstring/ExtractStringRefactoring.java b/tools/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/refactorings/extractstring/ExtractStringRefactoring.java index 99711bf20..6c88a38c1 100644 --- a/tools/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/refactorings/extractstring/ExtractStringRefactoring.java +++ b/tools/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/refactorings/extractstring/ExtractStringRefactoring.java @@ -177,7 +177,7 @@ class ExtractStringRefactoring extends Refactoring { public ExtractStringRefactoring(IFile file, ITextSelection selection) { mFile = file; mSelectionStart = selection.getOffset(); - mSelectionEnd = mSelectionStart + selection.getLength(); + mSelectionEnd = mSelectionStart + Math.max(0, selection.getLength() - 1); } /** @@ -906,9 +906,8 @@ class ExtractStringRefactoring extends Refactoring { * compilation unit. The resource may not exist. */ private IResource getTargetXmlResource(String xmlFileWsPath) { - IProject proj = mUnit.getPrimary().getResource().getProject(); - Path path = new Path(xmlFileWsPath); - IResource resource = proj.findMember(path); + IProject proj = mFile.getProject(); + IResource resource = proj.getFile(xmlFileWsPath); return resource; } diff --git a/tools/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/refactorings/extractstring/ExtractStringWizard.java b/tools/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/refactorings/extractstring/ExtractStringWizard.java index 2083a6e5d..c5b0c7d11 100644 --- a/tools/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/refactorings/extractstring/ExtractStringWizard.java +++ b/tools/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/refactorings/extractstring/ExtractStringWizard.java @@ -16,6 +16,7 @@ package com.android.ide.eclipse.adt.refactorings.extractstring; +import org.eclipse.core.resources.IProject; import org.eclipse.ltk.ui.refactoring.RefactoringWizard; /** @@ -26,17 +27,24 @@ import org.eclipse.ltk.ui.refactoring.RefactoringWizard; */ class ExtractStringWizard extends RefactoringWizard { + private final IProject mProject; + /** * Create a wizard for ExtractString based on a simple dialog with one page. + * + * @param ref The instance of {@link ExtractStringRefactoring} to associate to the wizard. + * @param project The project where the wizard was invoked from (e.g. where the user selection + * happened, so that we can retrieve project resources.) */ - public ExtractStringWizard(ExtractStringRefactoring ref, String title) { + public ExtractStringWizard(ExtractStringRefactoring ref, IProject project) { super(ref, DIALOG_BASED_USER_INTERFACE | PREVIEW_EXPAND_FIRST_NODE); - setDefaultPageTitle(title); + mProject = project; + setDefaultPageTitle(ref.getName()); } @Override protected void addUserInputPages() { - addPage(new ExtractStringInputPage()); + addPage(new ExtractStringInputPage(mProject)); } } diff --git a/tools/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/editors/wizards/NewXmlFileCreationPage.java b/tools/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/editors/wizards/NewXmlFileCreationPage.java index e84c05123..80cc0f5aa 100644 --- a/tools/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/editors/wizards/NewXmlFileCreationPage.java +++ b/tools/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/editors/wizards/NewXmlFileCreationPage.java @@ -271,9 +271,9 @@ class NewXmlFileCreationPage extends WizardPage { final static int NUM_COL = 4; /** Absolute destination folder root, e.g. "/res/" */ - private static String sResFolderAbs = AndroidConstants.WS_RESOURCES + AndroidConstants.WS_SEP; + private static final String RES_FOLDER_ABS = AndroidConstants.WS_RESOURCES + AndroidConstants.WS_SEP; /** Relative destination folder root, e.g. "res/" */ - private static String sResFolderRel = SdkConstants.FD_RESOURCES + AndroidConstants.WS_SEP; + private static final String RES_FOLDER_REL = SdkConstants.FD_RESOURCES + AndroidConstants.WS_SEP; private IProject mProject; private Text mProjectTextField; @@ -856,16 +856,16 @@ class NewXmlFileCreationPage extends WizardPage { ArrayList matches = new ArrayList(); // We get "res/foo" from selections relative to the project when we want a "/res/foo" path. - if (wsFolderPath.startsWith(sResFolderRel)) { - wsFolderPath = sResFolderAbs + wsFolderPath.substring(sResFolderRel.length()); + if (wsFolderPath.startsWith(RES_FOLDER_REL)) { + wsFolderPath = RES_FOLDER_ABS + wsFolderPath.substring(RES_FOLDER_REL.length()); mInternalWsFolderPathUpdate = true; mWsFolderPathTextField.setText(wsFolderPath); mInternalWsFolderPathUpdate = false; } - if (wsFolderPath.startsWith(sResFolderAbs)) { - wsFolderPath = wsFolderPath.substring(sResFolderAbs.length()); + if (wsFolderPath.startsWith(RES_FOLDER_ABS)) { + wsFolderPath = wsFolderPath.substring(RES_FOLDER_ABS.length()); int pos = wsFolderPath.indexOf(AndroidConstants.WS_SEP_CHAR); if (pos >= 0) { @@ -952,16 +952,16 @@ class NewXmlFileCreationPage extends WizardPage { // The configuration is valid. Reformat the folder path using the canonical // value from the configuration. - newPath = sResFolderAbs + mTempConfig.getFolderName(type.getResFolderType()); + newPath = RES_FOLDER_ABS + mTempConfig.getFolderName(type.getResFolderType()); } else { // The configuration is invalid. We still update the path but this time // do it manually on the string. - if (wsFolderPath.startsWith(sResFolderAbs)) { + if (wsFolderPath.startsWith(RES_FOLDER_ABS)) { wsFolderPath.replaceFirst( - "^(" + sResFolderAbs +")[^-]*(.*)", //$NON-NLS-1$ //$NON-NLS-2$ + "^(" + RES_FOLDER_ABS +")[^-]*(.*)", //$NON-NLS-1$ //$NON-NLS-2$ "\\1" + type.getResFolderName() + "\\2"); //$NON-NLS-1$ //$NON-NLS-2$ } else { - newPath = sResFolderAbs + mTempConfig.getFolderName(type.getResFolderType()); + newPath = RES_FOLDER_ABS + mTempConfig.getFolderName(type.getResFolderType()); } } @@ -1018,7 +1018,7 @@ class NewXmlFileCreationPage extends WizardPage { if (type != null) { mConfigSelector.getConfiguration(mTempConfig); - StringBuffer sb = new StringBuffer(sResFolderAbs); + StringBuffer sb = new StringBuffer(RES_FOLDER_ABS); sb.append(mTempConfig.getFolderName(type.getResFolderType())); mInternalWsFolderPathUpdate = true; @@ -1131,8 +1131,8 @@ class NewXmlFileCreationPage extends WizardPage { // -- validate generated path if (error == null) { String wsFolderPath = getWsFolderPath(); - if (!wsFolderPath.startsWith(sResFolderAbs)) { - error = String.format("Target folder must start with %1$s.", sResFolderAbs); + if (!wsFolderPath.startsWith(RES_FOLDER_ABS)) { + error = String.format("Target folder must start with %1$s.", RES_FOLDER_ABS); } }