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;
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;
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$
}
createFilterText(top);
createFilteredList(top);
- setupResourceListAndCurrent();
+ // create the "New Resource" button
+ createNewResButtons(top);
+
+ setupResourceList();
+ selectResourceString(mCurrentResource);
return top;
}
@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);
@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);
+ }
}
}