Merge branch 'readonly-p4-donut' into donut

This commit is contained in:
Raphael Moll
2009-04-15 11:16:37 -07:00
committed by The Android Open Source Project
5 changed files with 128 additions and 79 deletions

View File

@@ -205,6 +205,7 @@ public final class AndroidManifestDescriptors implements IDescriptorProvider {
overrideClassName(overrides, "receiver", AndroidConstants.CLASS_BROADCASTRECEIVER); //$NON-NLS-1$
overrideClassName(overrides, "service", AndroidConstants.CLASS_SERVICE); //$NON-NLS-1$
overrideClassName(overrides, "provider", AndroidConstants.CLASS_CONTENTPROVIDER); //$NON-NLS-1$
overrideClassName(overrides, "instrumentation", AndroidConstants.CLASS_INSTRUMENTATION); //$NON-NLS-1$
// -- list element nodes already created --
// These elements are referenced by already opened editors, so we want to update them
@@ -244,27 +245,42 @@ public final class AndroidManifestDescriptors implements IDescriptorProvider {
new DescriptorsUtils.ITextAttributeCreator() {
public TextAttributeDescriptor create(String xmlName, String uiName, String nsUri,
String tooltip) {
uiName += "*"; //$NON-NLS-1$
if (AndroidConstants.CLASS_ACTIVITY.equals(className)) {
return new ClassAttributeDescriptor(
className,
PostActivityCreationAction.getAction(),
xmlName, uiName + "*", //$NON-NLS-1$
xmlName,
uiName,
nsUri,
tooltip,
true /*mandatory */);
true /*mandatory */,
true /*defaultToProjectOnly*/);
} else if (AndroidConstants.CLASS_BROADCASTRECEIVER.equals(className)) {
return new ClassAttributeDescriptor(
className,
PostReceiverCreationAction.getAction(),
xmlName, uiName + "*", //$NON-NLS-1$
xmlName,
uiName,
nsUri,
tooltip,
true /*mandatory */);
true /*mandatory */,
true /*defaultToProjectOnly*/);
} else if (AndroidConstants.CLASS_INSTRUMENTATION.equals(className)) {
return new ClassAttributeDescriptor(
className,
null, // no post action
xmlName,
uiName,
nsUri,
tooltip,
true /*mandatory */,
false /*defaultToProjectOnly*/);
} else {
return new ClassAttributeDescriptor(
className,
xmlName, uiName + "*", //$NON-NLS-1$
xmlName,
uiName,
nsUri,
tooltip,
true /*mandatory */);

View File

@@ -39,6 +39,7 @@ public class ApplicationAttributeDescriptor extends TextAttributeDescriptor {
@Override
public UiAttributeNode createUiNode(UiElementNode uiParent) {
return new UiClassAttributeNode("android.app.Application", //$NON-NLS-1$
null /* postCreationAction */, false /* mandatory */, this, uiParent);
null /* postCreationAction */, false /* mandatory */, this, uiParent,
true /*defaultToProjectOnly*/);
}
}

View File

@@ -37,6 +37,8 @@ public class ClassAttributeDescriptor extends TextAttributeDescriptor {
/** indicates if the class parameter is mandatory */
boolean mMandatory;
private final boolean mDefaultToProjectOnly;
/**
* Creates a new {@link ClassAttributeDescriptor}
* @param superClassName the fully qualified name of the superclass of the class represented
@@ -49,10 +51,14 @@ public class ClassAttributeDescriptor extends TextAttributeDescriptor {
* @param mandatory indicates if the class attribute is mandatory.
*/
public ClassAttributeDescriptor(String superClassName,
String xmlLocalName, String uiName, String nsUri,
String tooltip, boolean mandatory) {
String xmlLocalName,
String uiName,
String nsUri,
String tooltip,
boolean mandatory) {
super(xmlLocalName, uiName, nsUri, tooltip);
mSuperClassName = superClassName;
mDefaultToProjectOnly = true;
}
/**
@@ -67,14 +73,21 @@ public class ClassAttributeDescriptor extends TextAttributeDescriptor {
* See {@link SdkConstants#NS_RESOURCES} for a common value.
* @param tooltip A non-empty tooltip string or null.
* @param mandatory indicates if the class attribute is mandatory.
* @param defaultToProjectOnly True if only classes from the sources of this project should
* be shown by default in the class browser.
*/
public ClassAttributeDescriptor(String superClassName,
IPostTypeCreationAction postCreationAction,
String xmlLocalName, String uiName, String nsUri,
String tooltip, boolean mandatory) {
String xmlLocalName,
String uiName,
String nsUri,
String tooltip,
boolean mandatory,
boolean defaultToProjectOnly) {
super(xmlLocalName, uiName, nsUri, tooltip);
mSuperClassName = superClassName;
mPostCreationAction = postCreationAction;
mDefaultToProjectOnly = defaultToProjectOnly;
}
/**
@@ -83,6 +96,6 @@ public class ClassAttributeDescriptor extends TextAttributeDescriptor {
@Override
public UiAttributeNode createUiNode(UiElementNode uiParent) {
return new UiClassAttributeNode(mSuperClassName, mPostCreationAction,
mMandatory, this, uiParent);
mMandatory, this, uiParent, mDefaultToProjectOnly);
}
}

View File

@@ -1,46 +0,0 @@
/*
* 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.editors.manifest.descriptors;
import com.android.ide.eclipse.common.AndroidConstants;
import com.android.ide.eclipse.editors.descriptors.TextAttributeDescriptor;
import com.android.ide.eclipse.editors.manifest.model.UiClassAttributeNode;
import com.android.ide.eclipse.editors.uimodel.UiAttributeNode;
import com.android.ide.eclipse.editors.uimodel.UiElementNode;
/**
* Describes a 'Instrumentation' class XML attribute. It is displayed by a
* {@link UiClassAttributeNode}, that restricts creation and selection to classes inheriting from
* android.app.Instrumentation.
*/
public class InstrumentationAttributeDescriptor extends TextAttributeDescriptor {
public InstrumentationAttributeDescriptor(String xmlLocalName, String uiName, String nsUri,
String tooltip) {
super(xmlLocalName, uiName, nsUri, tooltip);
}
/**
* @return A new {@link UiClassAttributeNode} linked to this descriptor.
*/
@Override
public UiAttributeNode createUiNode(UiElementNode uiParent) {
return new UiClassAttributeNode(AndroidConstants.CLASS_INSTRUMENTATION,
null /* postCreationAction */, true /* mandatory */, this, uiParent);
}
}

View File

@@ -16,6 +16,7 @@
package com.android.ide.eclipse.editors.manifest.model;
import com.android.ide.eclipse.adt.AdtPlugin;
import com.android.ide.eclipse.common.AndroidConstants;
import com.android.ide.eclipse.common.project.AndroidManifestParser;
import com.android.ide.eclipse.common.project.BaseProjectHelper;
@@ -31,6 +32,7 @@ import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.jdt.core.Flags;
import org.eclipse.jdt.core.IClasspathEntry;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IJavaProject;
@@ -63,6 +65,7 @@ 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.Control;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IFileEditorInput;
@@ -90,20 +93,28 @@ public class UiClassAttributeNode extends UiTextAttributeNode {
private String mReferenceClass;
private IPostTypeCreationAction mPostCreationAction;
private boolean mMandatory;
private final boolean mDefaultToProjectOnly;
private class HierarchyTypeSelection extends TypeSelectionExtension {
private IJavaProject mJavaProject;
private IType mReferenceType;
private Button mProjectOnly;
private boolean mUseProjectOnly;
public HierarchyTypeSelection(IProject project, String referenceClass) {
public HierarchyTypeSelection(IProject project, String referenceClass)
throws JavaModelException {
mJavaProject = JavaCore.create(project);
mReferenceClass = referenceClass;
mReferenceType = mJavaProject.findType(referenceClass);
}
@Override
public ITypeInfoFilterExtension getFilterExtension() {
return new ITypeInfoFilterExtension() {
public boolean select(ITypeInfoRequestor typeInfoRequestor) {
boolean projectOnly = mUseProjectOnly;
String packageName = typeInfoRequestor.getPackageName();
String typeName = typeInfoRequestor.getTypeName();
String enclosingType = typeInfoRequestor.getEnclosingName();
@@ -121,21 +132,37 @@ public class UiClassAttributeNode extends UiTextAttributeNode {
try {
IType type = mJavaProject.findType(className);
if (type != null) {
// get the type hierarchy
if (type == null) {
return false;
}
// don't display abstract classes
if ((type.getFlags() & Flags.AccAbstract) != 0) {
return false;
}
// if project-only is selected, make sure the package fragment is
// an actual source (thus "from this project").
if (projectOnly) {
IPackageFragment frag = type.getPackageFragment();
if (frag == null || frag.getKind() != IPackageFragmentRoot.K_SOURCE) {
return false;
}
}
// get the type hierarchy and reference type is one of the super classes.
ITypeHierarchy hierarchy = type.newSupertypeHierarchy(
new NullProgressMonitor());
// if the super class is not the reference class, it may inherit from
// it so we get its supertype. At some point it will be null and we
// will return false;
IType superType = type;
while ((superType = hierarchy.getSuperclass(superType)) != null) {
if (mReferenceClass.equals(superType.getFullyQualifiedName())) {
IType[] supertypes = hierarchy.getAllSupertypes(type);
int n = supertypes.length;
for (int i = 0; i < n; i++) {
IType st = supertypes[i];
if (mReferenceType.equals(st)) {
return true;
}
}
}
} catch (JavaModelException e) {
}
@@ -143,6 +170,29 @@ public class UiClassAttributeNode extends UiTextAttributeNode {
}
};
}
@Override
public Control createContentArea(Composite parent) {
mProjectOnly = new Button(parent, SWT.CHECK);
mProjectOnly.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
mProjectOnly.setText(String.format("Display classes from sources of project '%s' only",
mJavaProject.getProject().getName()));
mUseProjectOnly = mDefaultToProjectOnly;
mProjectOnly.setSelection(mUseProjectOnly);
mProjectOnly.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
super.widgetSelected(e);
mUseProjectOnly = mProjectOnly.getSelection();
getTypeSelectionComponent().triggerSearch();
}
});
return super.createContentArea(parent);
}
}
/**
@@ -165,14 +215,18 @@ public class UiClassAttributeNode extends UiTextAttributeNode {
* modification of the class.
* @param mandatory indicates if the class value is mandatory
* @param attributeDescriptor the {@link AttributeDescriptor} object linked to the Ui Node.
* @param defaultToProjectOnly When true display classes of this project only by default.
* When false any class path will be considered. The user can always toggle this.
*/
public UiClassAttributeNode(String referenceClass, IPostTypeCreationAction postCreationAction,
boolean mandatory, AttributeDescriptor attributeDescriptor, UiElementNode uiParent) {
boolean mandatory, AttributeDescriptor attributeDescriptor, UiElementNode uiParent,
boolean defaultToProjectOnly) {
super(attributeDescriptor, uiParent);
mReferenceClass = referenceClass;
mPostCreationAction = postCreationAction;
mMandatory = mandatory;
mDefaultToProjectOnly = defaultToProjectOnly;
}
/* (non-java doc)
@@ -292,8 +346,11 @@ public class UiClassAttributeNode extends UiTextAttributeNode {
// Create a search scope including only the source folder of the current
// project.
IPackageFragmentRoot[] packageFragmentRoots = getPackageFragmentRoots(project,
true /*include_containers*/);
IJavaSearchScope scope = SearchEngine.createJavaSearchScope(
getPackageFragmentRoots(project), false);
packageFragmentRoots,
false);
try {
SelectionDialog dlg = JavaUI.createTypeDialog(text.getShell(),
@@ -316,6 +373,7 @@ public class UiClassAttributeNode extends UiTextAttributeNode {
}
}
} catch (JavaModelException e1) {
AdtPlugin.log(e1, "UiClassAttributeNode HandleBrowser failed");
}
}
}
@@ -363,7 +421,9 @@ public class UiClassAttributeNode extends UiTextAttributeNode {
}
}
} catch (JavaModelException e) {
AdtPlugin.log(e, "UiClassAttributeNode HandleLabel failed");
} catch (PartInitException e) {
AdtPlugin.log(e, "UiClassAttributeNode HandleLabel failed");
}
}
}
@@ -403,16 +463,20 @@ public class UiClassAttributeNode extends UiTextAttributeNode {
* Computes and return the {@link IPackageFragmentRoot}s corresponding to the source folders of
* the specified project.
* @param project the project
* @param b
* @return an array of IPackageFragmentRoot.
*/
private IPackageFragmentRoot[] getPackageFragmentRoots(IProject project) {
private IPackageFragmentRoot[] getPackageFragmentRoots(IProject project,
boolean include_containers) {
ArrayList<IPackageFragmentRoot> result = new ArrayList<IPackageFragmentRoot>();
try {
IJavaProject javaProject = JavaCore.create(project);
IPackageFragmentRoot[] roots = javaProject.getPackageFragmentRoots();
for (int i = 0; i < roots.length; i++) {
IClasspathEntry entry = roots[i].getRawClasspathEntry();
if (entry.getEntryKind() == IClasspathEntry.CPE_SOURCE) {
if (entry.getEntryKind() == IClasspathEntry.CPE_SOURCE ||
(include_containers &&
entry.getEntryKind() == IClasspathEntry.CPE_CONTAINER)) {
result.add(roots[i]);
}
}
@@ -457,7 +521,8 @@ public class UiClassAttributeNode extends UiTextAttributeNode {
page.setSuperClass(mReferenceClass, true /* canBeModified */);
// get the source folders as java elements.
IPackageFragmentRoot[] roots = getPackageFragmentRoots(getProject());
IPackageFragmentRoot[] roots = getPackageFragmentRoots(getProject(),
true /*include_containers*/);
IPackageFragmentRoot currentRoot = null;
IPackageFragment currentFragment = null;