/* * Copyright (C) 2007 The Android Open Source Project * * Licensed under the Eclipse Public License, Version 1.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.eclipse.org/org/documents/epl-v10.php * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ 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.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; import java.util.regex.Pattern; /** * A dialog to let the user select a resource based on a resource type. */ public class ResourceChooser extends AbstractElementListSelectionDialog { private Pattern mProjectResourcePattern; private ResourceType mResourceType; private IResourceRepository mProjectResources; private final static boolean SHOW_SYSTEM_RESOURCE = false; // TODO re-enable at some point private Pattern mSystemResourcePattern; private IResourceRepository mSystemResources; private Button mProjectButton; 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 projectResources The repository for the project * @param systemResources The System resource repository * @param parent the parent shell */ public ResourceChooser(IProject project, ResourceType type, IResourceRepository projectResources, IResourceRepository systemResources, Shell parent) { super(parent, new ResourceLabelProvider()); mProject = project; mResourceType = type; mProjectResources = projectResources; mProjectResourcePattern = Pattern.compile( "@" + mResourceType.getName() + "/(.+)"); //$NON-NLS-1$ //$NON-NLS-2$ if (SHOW_SYSTEM_RESOURCE) { mSystemResources = systemResources; mSystemResourcePattern = Pattern.compile( "@android:" + mResourceType.getName() + "/(.+)"); //$NON-NLS-1$ //$NON-NLS-2$ } setTitle("Resource Chooser"); setMessage(String.format("Choose a %1$s resource", mResourceType.getDisplayName().toLowerCase())); } public void setCurrentResource(String resource) { mCurrentResource = resource; } public String getCurrentResource() { return mCurrentResource; } @Override protected void computeResult() { Object[] elements = getSelectedElements(); if (elements.length == 1 && elements[0] instanceof ResourceItem) { ResourceItem item = (ResourceItem)elements[0]; mCurrentResource = mResourceType.getXmlString(item, SHOW_SYSTEM_RESOURCE && mSystemButton.getSelection()); } } @Override protected Control createDialogArea(Composite parent) { Composite top = (Composite)super.createDialogArea(parent); createMessageArea(top); createButtons(top); createFilterText(top); createFilteredList(top); // create the "New Resource" button createNewResButtons(top); setupResourceList(); selectResourceString(mCurrentResource); return top; } /** * Creates the radio button to switch between project and system resources. * @param top the parent composite */ private void createButtons(Composite top) { if (!SHOW_SYSTEM_RESOURCE) { return; } mProjectButton = new Button(top, SWT.RADIO); mProjectButton.setText("Project Resources"); mProjectButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { super.widgetSelected(e); if (mProjectButton.getSelection()) { setListElements(mProjectResources.getResources(mResourceType)); } } }); mSystemButton = new Button(top, SWT.RADIO); mSystemButton.setText("System Resources"); mSystemButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { super.widgetSelected(e); if (mProjectButton.getSelection()) { setListElements(mSystemResources.getResources(mResourceType)); } } }); } /** * Creates the "New Resource" button. * @param top the parent composite */ private void createNewResButtons(Composite top) { Button newResButton = new Button(top, SWT.NONE); 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(); } } }); } 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)); } /** * Select an item by its name, if possible. */ private void selectItemName(String itemName) { if (itemName == null) { return; } 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); } } // 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); } } }