/* * Copyright (C) 2012 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.internal.refactorings.core; import static com.android.SdkConstants.PREFIX_RESOURCE_REF; import static com.android.SdkConstants.R_CLASS; import com.android.ide.eclipse.adt.internal.resources.ResourceNameValidator; import com.android.resources.ResourceType; import org.eclipse.jdt.internal.ui.refactoring.TextInputWizardPage; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.ltk.core.refactoring.RefactoringStatus; import org.eclipse.ltk.core.refactoring.participants.RenameRefactoring; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Text; import java.util.Set; @SuppressWarnings("restriction") // JDT refactoring UI class RenameResourcePage extends TextInputWizardPage implements SelectionListener { private Label mXmlLabel; private Label mJavaLabel; private Button mUpdateReferences; private boolean mCanClear; private ResourceType mType; private ResourceNameValidator mValidator; /** * Create the wizard. * @param type the type of the resource to be renamed * @param initial initial renamed value * @param canClear whether the dialog should allow clearing the field */ public RenameResourcePage(ResourceType type, String initial, boolean canClear) { super(type.getName(), true, initial); mType = type; mCanClear = canClear; mValidator = ResourceNameValidator.create(false /*allowXmlExtension*/, (Set<String>) null, mType); } @SuppressWarnings("unused") // SWT constructors aren't really unused, they have side effects @Override public void createControl(Composite parent) { Composite container = new Composite(parent, SWT.NULL); setControl(container); initializeDialogUnits(container); container.setLayout(new GridLayout(2, false)); Label nameLabel = new Label(container, SWT.NONE); nameLabel.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1)); nameLabel.setText("New Name:"); Text text = super.createTextInputField(container); text.selectAll(); text.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1)); Label xmlLabel = new Label(container, SWT.NONE); xmlLabel.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1)); xmlLabel.setText("XML:"); mXmlLabel = new Label(container, SWT.NONE); mXmlLabel.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1)); Label javaLabel = new Label(container, SWT.NONE); javaLabel.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1)); javaLabel.setText("Java:"); mJavaLabel = new Label(container, SWT.NONE); mJavaLabel.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1)); new Label(container, SWT.NONE); new Label(container, SWT.NONE); mUpdateReferences = new Button(container, SWT.CHECK); mUpdateReferences.setSelection(true); mUpdateReferences.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 2, 1)); mUpdateReferences.setText("Update References"); mUpdateReferences.addSelectionListener(this); Dialog.applyDialogFont(container); } @Override public void setVisible(boolean visible) { if (visible) { RenameResourceProcessor processor = getProcessor(); String newName = processor.getNewName(); if (newName != null && newName.length() > 0 && !newName.equals(getInitialValue())) { Text textField = getTextField(); textField.setText(newName); textField.setSelection(0, newName.length()); } } super.setVisible(visible); } @Override protected RefactoringStatus validateTextField(String newName) { if (newName.isEmpty() && isEmptyInputValid()) { getProcessor().setNewName(""); return RefactoringStatus.createWarningStatus( "The resource definition will be deleted"); } String error = mValidator.isValid(newName); if (error != null) { return RefactoringStatus.createErrorStatus(error); } RenameResourceProcessor processor = getProcessor(); processor.setNewName(newName); return processor.checkNewName(newName); } private RenameResourceProcessor getProcessor() { RenameRefactoring refactoring = (RenameRefactoring) getRefactoring(); return (RenameResourceProcessor) refactoring.getProcessor(); } @Override protected boolean isEmptyInputValid() { return mCanClear; } @Override protected boolean isInitialInputValid() { RenameResourceProcessor processor = getProcessor(); return processor.getNewName() != null && !processor.getNewName().equals(processor.getCurrentName()); } @Override protected void textModified(String text) { super.textModified(text); if (mXmlLabel != null && mJavaLabel != null) { String xml = PREFIX_RESOURCE_REF + mType.getName() + '/' + text; String java = R_CLASS + '.' + mType.getName() + '.' + text; if (text.isEmpty()) { xml = java = ""; } mXmlLabel.setText(xml); mJavaLabel.setText(java); } } // ---- Implements SelectionListener ---- @Override public void widgetSelected(SelectionEvent e) { if (e.getSource() == mUpdateReferences) { RenameResourceProcessor processor = getProcessor(); boolean update = mUpdateReferences.getSelection(); processor.setUpdateReferences(update); } } @Override public void widgetDefaultSelected(SelectionEvent e) { } }