aboutsummaryrefslogtreecommitdiff
path: root/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/refactorings/core/RefactoringUtil.java
diff options
context:
space:
mode:
Diffstat (limited to 'eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/refactorings/core/RefactoringUtil.java')
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/refactorings/core/RefactoringUtil.java224
1 files changed, 224 insertions, 0 deletions
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/refactorings/core/RefactoringUtil.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/refactorings/core/RefactoringUtil.java
new file mode 100644
index 000000000..04ebcfa26
--- /dev/null
+++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/refactorings/core/RefactoringUtil.java
@@ -0,0 +1,224 @@
+/*
+ * Copyright (C) 2010 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.ANDROID_URI;
+import static com.android.SdkConstants.ATTR_NAME;
+import static com.android.xml.AndroidManifest.ATTRIBUTE_BACKUP_AGENT;
+import static com.android.xml.AndroidManifest.ATTRIBUTE_MANAGE_SPACE_ACTIVITY;
+import static com.android.xml.AndroidManifest.ATTRIBUTE_PARENT_ACTIVITY_NAME;
+import static com.android.xml.AndroidManifest.ATTRIBUTE_TARGET_ACTIVITY;
+
+import com.android.annotations.NonNull;
+import com.android.annotations.Nullable;
+import com.android.ide.eclipse.adt.AdtPlugin;
+import com.android.xml.AndroidManifest;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.wst.sse.core.StructuredModelManager;
+import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
+import org.eclipse.wst.sse.core.internal.provisional.IndexedRegion;
+import org.w3c.dom.Attr;
+import org.w3c.dom.Element;
+
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+
+/**
+ * The utility class for android refactoring
+ *
+ */
+@SuppressWarnings("restriction")
+public class RefactoringUtil {
+
+ private static boolean sRefactorAppPackage = false;
+
+ /**
+ * Releases SSE read model; saves SSE model if exists edit model
+ * Called in dispose method of refactoring change classes
+ *
+ * @param model the SSE model
+ * @param document the document
+ */
+ public static void fixModel(IStructuredModel model, IDocument document) {
+ if (model != null) {
+ model.releaseFromRead();
+ }
+ model = null;
+ if (document == null) {
+ return;
+ }
+ try {
+ model = StructuredModelManager.getModelManager().getExistingModelForEdit(document);
+ if (model != null) {
+ model.save();
+ }
+ } catch (UnsupportedEncodingException e1) {
+ // ignore
+ } catch (IOException e1) {
+ // ignore
+ } catch (CoreException e1) {
+ // ignore
+ } finally {
+ if (model != null) {
+ model.releaseFromEdit();
+ }
+ }
+ }
+
+ /**
+ * Logs the info message
+ *
+ * @param message the message
+ */
+ public static void logInfo(String message) {
+ AdtPlugin.log(IStatus.INFO, AdtPlugin.PLUGIN_ID, message);
+ }
+
+ /**
+ * Logs the the exception
+ *
+ * @param e the exception
+ */
+ public static void log(Throwable e) {
+ AdtPlugin.log(e, e.getMessage());
+ }
+
+ /**
+ * @return true if Rename/Move package needs to change the application package
+ * default is false
+ *
+ */
+ public static boolean isRefactorAppPackage() {
+ return sRefactorAppPackage;
+ }
+
+ /**
+ * @param refactorAppPackage true if Rename/Move package needs to change the application package
+ */
+ public static void setRefactorAppPackage(boolean refactorAppPackage) {
+ RefactoringUtil.sRefactorAppPackage = refactorAppPackage;
+ }
+
+ /**
+ * Returns the range of the attribute value in the given document
+ *
+ * @param attr the attribute to look up
+ * @param document the document containing the attribute
+ * @return the range of the value text, not including quotes, in the document
+ */
+ public static int getAttributeValueRangeStart(
+ @NonNull Attr attr,
+ @NonNull IDocument document) {
+ IndexedRegion region = (IndexedRegion) attr;
+ int potentialStart = attr.getName().length() + 2; // + 2: add ="
+ String text;
+ try {
+ text = document.get(region.getStartOffset(),
+ region.getEndOffset() - region.getStartOffset());
+ } catch (BadLocationException e) {
+ return -1;
+ }
+ String value = attr.getValue();
+ int index = text.indexOf(value, potentialStart);
+ if (index != -1) {
+ return region.getStartOffset() + index;
+ } else {
+ return -1;
+ }
+ }
+
+ /**
+ * Returns the start of the tag name of the given element
+ *
+ * @param element the element to look up
+ * @param document the document containing the attribute
+ * @return the index of the start tag in the document
+ */
+ public static int getTagNameRangeStart(
+ @NonNull Element element,
+ @NonNull IDocument document) {
+ IndexedRegion region = (IndexedRegion) element;
+ int potentialStart = 1; // add '<'
+ String text;
+ try {
+ text = document.get(region.getStartOffset(),
+ region.getEndOffset() - region.getStartOffset());
+ } catch (BadLocationException e) {
+ return -1;
+ }
+ int index = text.indexOf(element.getTagName(), potentialStart);
+ if (index != -1) {
+ return region.getStartOffset() + index;
+ } else {
+ return -1;
+ }
+ }
+
+ /**
+ * Returns whether the given manifest attribute should be considered to describe
+ * a class name. These will be eligible for refactoring when classes are renamed
+ * or moved.
+ *
+ * @param attribute the manifest attribute
+ * @return true if this attribute can describe a class
+ */
+ public static boolean isManifestClassAttribute(@NonNull Attr attribute) {
+ return isManifestClassAttribute(
+ attribute.getOwnerElement().getTagName(),
+ attribute.getNamespaceURI(),
+ attribute.getLocalName());
+ }
+
+ /**
+ * Returns whether the given manifest attribute should be considered to describe
+ * a class name. These will be eligible for refactoring when classes are renamed
+ * or moved.
+ *
+ * @param tag the tag, if known
+ * @param uri the attribute namespace, if any
+ * @param name the attribute local name, if any
+ * @return true if this attribute can describe a class
+ */
+ public static boolean isManifestClassAttribute(
+ @Nullable String tag,
+ @Nullable String uri,
+ @Nullable String name) {
+ if (name == null) {
+ return false;
+ }
+
+ if ((name.equals(ATTR_NAME)
+ && (AndroidManifest.NODE_ACTIVITY.equals(tag)
+ || AndroidManifest.NODE_APPLICATION.equals(tag)
+ || AndroidManifest.NODE_INSTRUMENTATION.equals(tag)
+ || AndroidManifest.NODE_PROVIDER.equals(tag)
+ || AndroidManifest.NODE_SERVICE.equals(tag)
+ || AndroidManifest.NODE_RECEIVER.equals(tag)))
+ || name.equals(ATTRIBUTE_TARGET_ACTIVITY)
+ || name.equals(ATTRIBUTE_MANAGE_SPACE_ACTIVITY)
+ || name.equals(ATTRIBUTE_BACKUP_AGENT)
+ || name.equals(ATTRIBUTE_PARENT_ACTIVITY_NAME)) {
+ return ANDROID_URI.equals(uri);
+ }
+
+ return false;
+ }
+}