summaryrefslogtreecommitdiff
path: root/src/plugins/android.codeutils/src/com/motorola/studio/android/model/BuildingBlockModel.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/android.codeutils/src/com/motorola/studio/android/model/BuildingBlockModel.java')
-rw-r--r--src/plugins/android.codeutils/src/com/motorola/studio/android/model/BuildingBlockModel.java562
1 files changed, 562 insertions, 0 deletions
diff --git a/src/plugins/android.codeutils/src/com/motorola/studio/android/model/BuildingBlockModel.java b/src/plugins/android.codeutils/src/com/motorola/studio/android/model/BuildingBlockModel.java
new file mode 100644
index 0000000..fc5c289
--- /dev/null
+++ b/src/plugins/android.codeutils/src/com/motorola/studio/android/model/BuildingBlockModel.java
@@ -0,0 +1,562 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
+ *
+ * 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.motorola.studio.android.model;
+
+import java.security.InvalidParameterException;
+import java.util.HashSet;
+import java.util.Set;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jdt.core.IJavaElement;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.IPackageFragment;
+import org.eclipse.jdt.core.IPackageFragmentRoot;
+import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.TreeSelection;
+
+import com.motorola.studio.android.codeutils.CodeUtilsActivator;
+import com.motorola.studio.android.common.IAndroidConstants;
+import com.motorola.studio.android.common.exception.AndroidException;
+import com.motorola.studio.android.common.log.StudioLogger;
+import com.motorola.studio.android.common.utilities.AndroidUtils;
+import com.motorola.studio.android.common.utilities.EclipseUtils;
+import com.motorola.studio.android.model.java.JavaClass;
+
+/**
+ * Controller for Building Blocks.
+ */
+public abstract class BuildingBlockModel implements IWizardModel
+{
+ private String name = "";
+
+ private final Set<String> intentFilterPermissions = new HashSet<String>();
+
+ /**
+ * Constructor for Building class
+ * @param superClass the Building block superclass
+ */
+ public BuildingBlockModel(String superClass)
+ {
+ if ((superClass == null) || (superClass.length() == 0))
+ {
+ throw new InvalidParameterException();
+ }
+ this.superClass = superClass;
+ }
+
+ private String superClass;
+
+ private IPackageFragmentRoot packageFragmentRoot;
+
+ private IPackageFragment packageFragment;
+
+ private IStatus nameStatus = new Status(IStatus.OK, CodeUtilsActivator.PLUGIN_ID, null);
+
+ private IStatus packageStatus = new Status(IStatus.OK, CodeUtilsActivator.PLUGIN_ID, null);
+
+ private IStatus packageFragmentRootStatus = new Status(IStatus.OK,
+ CodeUtilsActivator.PLUGIN_ID, null);
+
+ private String label;
+
+ private IStatus labelStatus = new Status(IStatus.OK, CodeUtilsActivator.PLUGIN_ID, null);
+
+ private int apiVersion;
+
+ /**
+ * Return building block name
+ * @return
+ */
+ public String getName()
+ {
+ return name;
+ }
+
+ /**
+ * Return superclass
+ * @return
+ */
+ public String getSuperClass()
+ {
+ return superClass;
+ }
+
+ /**
+ * Set building block name
+ * @param typeName
+ */
+ public void setName(String typeName)
+ {
+ this.name = typeName;
+ }
+
+ /**
+ * Set superclass
+ * @param superClass
+ */
+ public void setSuperClass(String superClass)
+ {
+ this.superClass = superClass;
+ }
+
+ /**
+ * Change source folder
+ * @return
+ */
+ public IPackageFragmentRoot getPackageFragmentRoot()
+ {
+ return packageFragmentRoot;
+ }
+
+ /**
+ * Check if using extended Class
+ * @return
+ */
+ public boolean useExtendedClass()
+ {
+ return false;
+ }
+
+ /**
+ * Change source folder
+ * @param pack
+ */
+ public void setPackageFragmentRoot(IPackageFragmentRoot pack)
+ {
+ this.packageFragmentRoot = pack;
+ }
+
+ /**
+ * Change package
+ * @param packageFragment
+ */
+ public void setPackageFragment(IPackageFragment packageFragment)
+ {
+ if ((packageFragmentRoot != null) && (packageFragment != null)
+ && !packageFragmentRoot.getJavaProject().equals(packageFragment.getJavaProject()))
+ {
+ throw new InvalidParameterException();
+ }
+ else
+ {
+ this.packageFragment = packageFragment;
+ }
+ }
+
+ /**
+ * Return package
+ * @return
+ */
+ public IPackageFragment getPackageFragment()
+ {
+ return packageFragment;
+ }
+
+ /**
+ * Configure source folder and package from workbench selection
+ * @param selection
+ */
+ public void configure(IStructuredSelection selection)
+ {
+ try
+ {
+ IPackageFragmentRoot srcFolder = extractPackageFragmentRoot(selection);
+ setPackageFragmentRoot(srcFolder);
+ IJavaProject javaProject = srcFolder == null ? null : srcFolder.getJavaProject();
+ setPackageFragment(extractPackageFragment(selection, javaProject));
+ if (javaProject != null)
+ {
+ apiVersion = AndroidUtils.getApiVersionNumberForProject(javaProject.getProject());
+ }
+
+ }
+ catch (Exception e)
+ {
+ StudioLogger.error(BuildingBlockModel.class,
+ "Error configuring building block from selection.", e);
+ }
+ }
+
+ /**
+ * Extract Package from selection
+ * @param selection
+ * @param javaProject
+ * @return
+ * @throws CoreException
+ */
+ private IPackageFragment extractPackageFragment(IStructuredSelection selection,
+ IJavaProject javaProject) throws CoreException
+ {
+ IPackageFragment pack = null;
+ Object object = selection.getFirstElement();
+ if ((object instanceof IPackageFragment)
+ && ((IPackageFragment) object).getJavaProject().equals(javaProject))
+ {
+ pack = (IPackageFragment) object;
+ }
+ else if ((object instanceof IJavaElement)
+ && ((IJavaElement) object).getJavaProject().equals(javaProject))
+ {
+ pack =
+ (IPackageFragment) ((IJavaElement) object)
+ .getAncestor(IJavaElement.PACKAGE_FRAGMENT);
+ if (pack == null)
+ {
+ pack =
+ EclipseUtils.getDefaultPackageFragment(((IJavaElement) object)
+ .getJavaProject());
+ }
+ }
+ else if (object instanceof IResource)
+ {
+ pack =
+ EclipseUtils.getDefaultPackageFragment(javaProject == null ? JavaCore
+ .create(((IResource) object).getProject()) : javaProject);
+ }
+ else
+ {
+ if (javaProject != null)
+ {
+ pack = EclipseUtils.getDefaultPackageFragment(javaProject);
+ }
+ else
+ {
+ IJavaProject[] prjs =
+ JavaCore.create(ResourcesPlugin.getWorkspace().getRoot()).getJavaProjects();
+ if (prjs.length > 0)
+ {
+ pack = EclipseUtils.getDefaultPackageFragment(prjs[0]);
+ }
+ }
+
+ }
+
+ if (pack != null)
+ {
+ if (!pack.getJavaProject().getProject().hasNature(IAndroidConstants.ANDROID_NATURE))
+ {
+ pack = extractPackageFragment(new TreeSelection(), javaProject);
+ }
+ }
+ return pack;
+ }
+
+ /**
+ * Extract source folder from selection.
+ * @param selection
+ * @return
+ * @throws CoreException
+ */
+ private static IPackageFragmentRoot extractPackageFragmentRoot(IStructuredSelection selection)
+ throws CoreException
+ {
+ IPackageFragmentRoot pack = null;
+ Object selectionElement = selection.getFirstElement();
+
+ if (selectionElement instanceof IPackageFragmentRoot)
+ {
+ pack = (IPackageFragmentRoot) selectionElement;
+ }
+ else if (selectionElement instanceof IJavaElement)
+ {
+ pack =
+ (IPackageFragmentRoot) ((IJavaElement) selectionElement)
+ .getAncestor(IJavaElement.PACKAGE_FRAGMENT_ROOT);
+ if (pack == null)
+ {
+ IJavaProject element = ((IJavaElement) selectionElement).getJavaProject();
+
+ for (IPackageFragmentRoot root : element.getPackageFragmentRoots())
+ {
+ if (root.getResource() != null)
+ {
+ boolean isSrc =
+ (root.getElementType() & IPackageFragmentRoot.K_SOURCE) == IPackageFragmentRoot.K_SOURCE;
+ boolean isGen =
+ root.getElementName().equals(IAndroidConstants.GEN_SRC_FOLDER)
+ && (root.getParent() instanceof IJavaProject);
+ if (isSrc && !isGen)
+ {
+ pack = root;
+ break;
+ }
+ }
+ }
+ }
+ }
+ else if (selectionElement instanceof IResource)
+ {
+ IJavaProject element = JavaCore.create(((IResource) selectionElement).getProject());
+
+ if (element.isOpen())
+ {
+ for (IPackageFragmentRoot root : element.getPackageFragmentRoots())
+ {
+ if (root.getResource() != null)
+ {
+ boolean isSrc =
+ (root.getElementType() & IPackageFragmentRoot.K_SOURCE) == IPackageFragmentRoot.K_SOURCE;
+ boolean isGen =
+ root.getElementName().equals(IAndroidConstants.GEN_SRC_FOLDER)
+ && (root.getParent() instanceof IJavaProject);
+ if (isSrc && !isGen)
+ {
+ pack = root;
+ break;
+ }
+ }
+ }
+ }
+ }
+ else
+ {
+ IJavaProject[] allProjects =
+ JavaCore.create(ResourcesPlugin.getWorkspace().getRoot()).getJavaProjects();
+ if ((allProjects != null) && (allProjects.length > 0))
+ {
+ for (IJavaProject project : allProjects)
+ {
+ if (project.getResource().getProject()
+ .hasNature(IAndroidConstants.ANDROID_NATURE))
+ {
+ IPackageFragmentRoot[] roots = project.getPackageFragmentRoots();
+
+ if ((roots != null) && (roots.length > 0))
+ {
+ boolean found = false;
+
+ for (IPackageFragmentRoot root : roots)
+ {
+ boolean isSrc =
+ (root.getElementType() & IPackageFragmentRoot.K_SOURCE) == IPackageFragmentRoot.K_SOURCE;
+ boolean isGen =
+ root.getElementName().equals(
+ IAndroidConstants.GEN_SRC_FOLDER)
+ && (root.getParent() instanceof IJavaProject);
+ if (isSrc && !isGen)
+ {
+ found = true;
+ pack = root;
+ break;
+ }
+ }
+
+ if (found)
+ {
+ break;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ if (pack != null)
+ {
+ if (!pack.getJavaProject().getProject().hasNature(IAndroidConstants.ANDROID_NATURE))
+ {
+ pack = extractPackageFragmentRoot(new TreeSelection());
+ }
+ }
+ return pack;
+ }
+
+ /**
+ * Return selected project.
+ * @return
+ */
+ public IProject getProject()
+ {
+ IProject project = null;
+ if (packageFragmentRoot != null)
+ {
+ project = packageFragmentRoot.getJavaProject().getProject();
+ }
+ else if (packageFragment != null)
+ {
+ project = packageFragment.getJavaProject().getProject();
+ }
+ return project;
+ }
+
+ /**
+ * Change status from name. Use JDT validation.
+ * @param nameStatus
+ */
+ public void setNameStatus(IStatus nameStatus)
+ {
+ this.nameStatus = nameStatus;
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see com.motorola.studio.android.model.IWizardModel#getStatus()
+ */
+ public IStatus getStatus()
+ {
+ return getMostSevere(new IStatus[]
+ {
+ packageFragmentRootStatus, nameStatus, packageStatus, labelStatus
+ });
+ }
+
+ /**
+ * Find most severe status.
+ * @param status
+ * @return
+ */
+ protected static IStatus getMostSevere(IStatus[] status)
+ {
+ IStatus max = null;
+ for (int i = 0; i < status.length; i++)
+ {
+ IStatus curr = status[i];
+ if (curr.matches(IStatus.ERROR))
+ {
+ return curr;
+ }
+ if ((max == null) || (curr.getSeverity() > max.getSeverity()))
+ {
+ max = curr;
+ }
+ }
+
+ return max;
+ }
+
+ /**
+ * Change package status. Use JDT Validation
+ * @param packageStatus
+ */
+ public void setPackageStatus(IStatus packageStatus)
+ {
+ this.packageStatus = packageStatus;
+ }
+
+ /**
+ * Change source folder status. Use JDT Validation
+ * @param packageFragmentRootStatus
+ */
+ public void setPackageFragmentRootStatus(IStatus packageFragmentRootStatus)
+ {
+ this.packageFragmentRootStatus = packageFragmentRootStatus;
+ }
+
+ /**
+ * Change label.
+ * @param label
+ */
+ public void setLabel(String label)
+ {
+ this.label = label;
+ }
+
+ /**
+ * Return Label.
+ * @return
+ */
+ public String getLabel()
+ {
+ return label;
+ }
+
+ /**
+ * Change Label Status. Don't uses JDT validation.
+ * @param labelStatus
+ */
+ public void setLabelStatus(IStatus labelStatus)
+ {
+ this.labelStatus = labelStatus;
+ }
+
+ /**
+ * Creates the Java Class file
+ *
+ * @param javaClass The Java Class model
+ * @param monitor The progress monitor
+ * @throws JavaModelException
+ * @throws AndroidException
+ */
+ protected void createJavaClassFile(JavaClass javaClass, IProgressMonitor monitor)
+ throws JavaModelException, AndroidException
+ {
+ final String JAVA_EXTENSION = ".java";
+
+ IPackageFragment targetPackage =
+ getPackageFragmentRoot().getPackageFragment(getPackageFragment().getElementName());
+
+ if (!targetPackage.exists())
+ {
+ getPackageFragmentRoot().createPackageFragment(targetPackage.getElementName(), true,
+ monitor);
+ }
+
+ targetPackage.createCompilationUnit(getName() + JAVA_EXTENSION, //$NON-NLS-1$
+ javaClass.getClassContent().get(), true, monitor);
+ }
+
+ /**
+ * Return all Filter Permissions as an Array.
+ * @return
+ */
+ public String[] getIntentFilterPermissionsAsArray()
+ {
+ return intentFilterPermissions.toArray(new String[intentFilterPermissions.size()]);
+ }
+
+ /**
+ * Returns all intent filter permissions.
+ * @return
+ */
+ public Set<String> getIntentFilterPermissions()
+ {
+ return intentFilterPermissions;
+ }
+
+ /**
+ * Adds an intent filter permission to this launcher.
+ * @param category
+ */
+ public void addIntentFilterPermissions(String permission)
+ {
+ intentFilterPermissions.add(permission);
+ }
+
+ /**
+ * Remove intent filter permission.
+ * @param category
+ */
+ public void removeIntentFilterPermissions(String permission)
+ {
+ intentFilterPermissions.remove(permission);
+ }
+
+ /**
+ * @return the apiVersion
+ */
+ public int getApiVersion()
+ {
+ return apiVersion;
+ }
+}