From d7c946dcef7e69a96ee00bc0f34b8bbb7db1a68c Mon Sep 17 00:00:00 2001 From: Raphael Moll <> Date: Fri, 3 Apr 2009 13:33:43 -0700 Subject: [PATCH] AI 144487: ADT: Add "New String" refactoring to the other Resource Chooser. BUG=1722971 Automated import of CL 144487 --- .../ide/eclipse/adt/ui/ResourceChooser.java | 195 +++++++++++++++------ .../editors/uimodel/UiResourceAttributeNode.java | 7 +- 2 files changed, 150 insertions(+), 52 deletions(-) diff --git a/tools/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/ui/ResourceChooser.java b/tools/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/ui/ResourceChooser.java index 26396116..d7eeb045 100644 --- a/tools/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/ui/ResourceChooser.java +++ b/tools/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/ui/ResourceChooser.java @@ -16,10 +16,16 @@ package com.android.ide.eclipse.adt.ui; +import com.android.ide.eclipse.adt.refactorings.extractstring.ExtractStringRefactoring; +import com.android.ide.eclipse.adt.refactorings.extractstring.ExtractStringWizard; import com.android.ide.eclipse.common.resources.IResourceRepository; import com.android.ide.eclipse.common.resources.ResourceItem; import com.android.ide.eclipse.common.resources.ResourceType; +import org.eclipse.core.resources.IProject; +import org.eclipse.jface.dialogs.IDialogConstants; +import org.eclipse.ltk.ui.refactoring.RefactoringWizard; +import org.eclipse.ltk.ui.refactoring.RefactoringWizardOpenOperation; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; @@ -27,6 +33,8 @@ 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.ui.IWorkbench; +import org.eclipse.ui.PlatformUI; import org.eclipse.ui.dialogs.AbstractElementListSelectionDialog; import java.util.regex.Matcher; @@ -50,26 +58,32 @@ public class ResourceChooser extends AbstractElementListSelectionDialog { private Button mSystemButton; private String mCurrentResource; + + private final IProject mProject; /** * Creates a Resource Chooser dialog. + * @param project Project being worked on * @param type The type of the resource to choose - * @param project The repository for the project - * @param system The System resource repository + * @param projectResources The repository for the project + * @param systemResources The System resource repository * @param parent the parent shell */ - public ResourceChooser(ResourceType type, IResourceRepository project, - IResourceRepository system, Shell parent) { + public ResourceChooser(IProject project, ResourceType type, + IResourceRepository projectResources, + IResourceRepository systemResources, + Shell parent) { super(parent, new ResourceLabelProvider()); + mProject = project; mResourceType = type; - mProjectResources = project; + mProjectResources = projectResources; mProjectResourcePattern = Pattern.compile( "@" + mResourceType.getName() + "/(.+)"); //$NON-NLS-1$ //$NON-NLS-2$ if (SHOW_SYSTEM_RESOURCE) { - mSystemResources = system; + mSystemResources = systemResources; mSystemResourcePattern = Pattern.compile( "@android:" + mResourceType.getName() + "/(.+)"); //$NON-NLS-1$ //$NON-NLS-2$ } @@ -108,7 +122,11 @@ public class ResourceChooser extends AbstractElementListSelectionDialog { createFilterText(top); createFilteredList(top); - setupResourceListAndCurrent(); + // create the "New Resource" button + createNewResButtons(top); + + setupResourceList(); + selectResourceString(mCurrentResource); return top; } @@ -127,7 +145,9 @@ public class ResourceChooser extends AbstractElementListSelectionDialog { @Override public void widgetSelected(SelectionEvent e) { super.widgetSelected(e); - setListElements(mProjectResources.getResources(mResourceType)); + if (mProjectButton.getSelection()) { + setListElements(mProjectResources.getResources(mResourceType)); + } } }); mSystemButton = new Button(top, SWT.RADIO); @@ -136,63 +156,138 @@ public class ResourceChooser extends AbstractElementListSelectionDialog { @Override public void widgetSelected(SelectionEvent e) { super.widgetSelected(e); - setListElements(mSystemResources.getResources(mResourceType)); + if (mProjectButton.getSelection()) { + setListElements(mSystemResources.getResources(mResourceType)); + } } }); } - + /** - * Setups the current list based on the current resource. + * Creates the "New Resource" button. + * @param top the parent composite */ - private void setupResourceListAndCurrent() { - if (setupInitialSelection(mProjectResourcePattern, mProjectResources) == false) { - // if we couldn't understand the current value, we default to the project resources - ResourceItem[] items = mProjectResources.getResources(mResourceType); - setListElements(items); - } + private void createNewResButtons(Composite top) { + + Button newResButton = new Button(top, SWT.NONE); - if (SHOW_SYSTEM_RESOURCE) { - if (setupInitialSelection(mProjectResourcePattern, mProjectResources) == false) { - if (setupInitialSelection(mSystemResourcePattern, mSystemResources) == false) { - // if we couldn't understand the current value, - // we default to the project resources - ResourceItem[] items = mProjectResources.getResources(mResourceType); - setListElements(items); - mProjectButton.setSelection(true); - } else { - mSystemButton.setSelection(true); + String title = String.format("New %1$s...", mResourceType.getDisplayName()); + newResButton.setText(title); + + // We only support adding new strings right now + newResButton.setEnabled(mResourceType == ResourceType.STRING); + + newResButton.addSelectionListener(new SelectionAdapter() { + @Override + public void widgetSelected(SelectionEvent e) { + super.widgetSelected(e); + + if (mResourceType == ResourceType.STRING) { + createNewString(); } - } else { - mProjectButton.setSelection(true); } + }); + } + + private void createNewString() { + ExtractStringRefactoring ref = new ExtractStringRefactoring( + mProject, true /*enforceNew*/); + RefactoringWizard wizard = new ExtractStringWizard(ref, mProject); + RefactoringWizardOpenOperation op = new RefactoringWizardOpenOperation(wizard); + try { + IWorkbench w = PlatformUI.getWorkbench(); + if (op.run(w.getDisplay().getActiveShell(), wizard.getDefaultPageTitle()) == + IDialogConstants.OK_ID) { + + // Recompute the "current resource" to select the new id + setupResourceList(); + + // select it if possible + selectItemName(ref.getXmlStringId()); + } + } catch (InterruptedException ex) { + // Interrupted. Pass. } } + + /** + * @return The repository currently selected. + */ + private IResourceRepository getCurrentRepository() { + IResourceRepository repo = mProjectResources; + + if (SHOW_SYSTEM_RESOURCE && mSystemButton.getSelection()) { + repo = mSystemResources; + } + return repo; + } + + /** + * Setups the current list. + */ + private void setupResourceList() { + IResourceRepository repo = getCurrentRepository(); + setListElements(repo.getResources(mResourceType)); + } /** - * Attempts to setup the list of element from a repository if the current resource - * matches the provided pattern. - * @param pattern the pattern to test the current value - * @param repository the repository to use if the pattern matches. - * @return true if success. + * Select an item by its name, if possible. */ - private boolean setupInitialSelection(Pattern pattern, IResourceRepository repository) { - Matcher m = pattern.matcher(mCurrentResource); - if (m.matches()) { - // we have a project resource, let's setup the list - ResourceItem[] items = repository.getResources(mResourceType); - setListElements(items); - - // and let's look for the item we found - String name = m.group(1); + private void selectItemName(String itemName) { + if (itemName == null) { + return; + } - for (ResourceItem item : items) { - if (name.equals(item.getName())) { - setSelection(new Object[] { item }); - break; - } + IResourceRepository repo = getCurrentRepository(); + + ResourceItem[] items = repo.getResources(mResourceType); + + for (ResourceItem item : items) { + if (itemName.equals(item.getName())) { + setSelection(new Object[] { item }); + break; + } + } + } + + /** + * Select an item by its full resource string. + * This also selects between project and system repository based on the resource string. + */ + private void selectResourceString(String resourceString) { + boolean isSystem = false; + String itemName = null; + + // Is this a system resource? + // If not a system resource or if they are not available, this will be a project res. + if (SHOW_SYSTEM_RESOURCE) { + Matcher m = mSystemResourcePattern.matcher(resourceString); + if (m.matches()) { + itemName = m.group(1); + isSystem = true; + } + } + + if (!isSystem && itemName == null) { + // Try to match project resource name + Matcher m = mProjectResourcePattern.matcher(resourceString); + if (m.matches()) { + itemName = m.group(1); } - return true; } - return false; + + // Update the repository selection + if (SHOW_SYSTEM_RESOURCE) { + mProjectButton.setSelection(!isSystem); + mSystemButton.setSelection(isSystem); + } + + // Update the list + setupResourceList(); + + // If we have a selection name, select it + if (itemName != null) { + selectItemName(itemName); + } } } diff --git a/tools/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/editors/uimodel/UiResourceAttributeNode.java b/tools/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/editors/uimodel/UiResourceAttributeNode.java index 56bb8f49..284cff4c 100644 --- a/tools/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/editors/uimodel/UiResourceAttributeNode.java +++ b/tools/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/editors/uimodel/UiResourceAttributeNode.java @@ -135,8 +135,11 @@ public class UiResourceAttributeNode extends UiTextAttributeNode { IResourceRepository systemRepository = data.getSystemResources(); // open a resource chooser dialog for specified resource type. - ResourceChooser dlg = new ResourceChooser(mType, - projectRepository, systemRepository, shell); + ResourceChooser dlg = new ResourceChooser(project, + mType, + projectRepository, + systemRepository, + shell); dlg.setCurrentResource(currentValue); -- 2.11.0