aboutsummaryrefslogtreecommitdiff
path: root/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/InstallDependencyPage.java
diff options
context:
space:
mode:
Diffstat (limited to 'eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/InstallDependencyPage.java')
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/InstallDependencyPage.java298
1 files changed, 298 insertions, 0 deletions
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/InstallDependencyPage.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/InstallDependencyPage.java
new file mode 100644
index 000000000..d806e7970
--- /dev/null
+++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/InstallDependencyPage.java
@@ -0,0 +1,298 @@
+/*
+ * 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.wizards.templates;
+
+import com.android.ide.eclipse.adt.AdtPlugin;
+import com.android.ide.eclipse.adt.internal.actions.AddSupportJarAction;
+import com.android.utils.Pair;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.dialogs.IMessageProvider;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.wizard.IWizard;
+import org.eclipse.jface.wizard.IWizardPage;
+import org.eclipse.jface.wizard.WizardPage;
+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.Link;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.browser.IWebBrowser;
+
+import java.io.File;
+import java.net.URL;
+import java.util.List;
+
+class InstallDependencyPage extends WizardPage implements SelectionListener {
+ /**
+ * The compatibility library. This is the only library the templates
+ * currently support. The appearance of any other dependency in this
+ * template will be flagged as a validation error (and the user encouraged
+ * to upgrade to a newer ADT
+ */
+ static final String SUPPORT_LIBRARY_NAME = "android-support-v4"; //$NON-NLS-1$
+
+ /** URL containing more info */
+ private static final String URL =
+ "http://developer.android.com/tools/extras/support-library.html"; //$NON-NLS-1$
+
+ private Button mCheckButton;
+ private Button mInstallButton;
+ private Link mLink;
+ private TemplateMetadata mTemplate;
+
+ InstallDependencyPage() {
+ super("dependency"); //$NON-NLS-1$
+ setTitle("Install Dependencies");
+ }
+
+ void setTemplate(TemplateMetadata template) {
+ if (template != mTemplate) {
+ mTemplate = template;
+ if (getControl() != null) {
+ validatePage();
+ }
+ }
+ }
+
+ @Override
+ public void setVisible(boolean visible) {
+ super.setVisible(visible);
+ if (visible) {
+ updateVersionLabels();
+ validatePage();
+ }
+ }
+
+ @Override
+ public void createControl(Composite parent) {
+ Composite container = new Composite(parent, SWT.NULL);
+ setControl(container);
+ container.setLayout(new GridLayout(2, false));
+ // Remaining contents are created lazily, since this page is always added to
+ // the page list, but typically not shown
+
+ Label dependLabel = new Label(container, SWT.WRAP);
+ GridData gd_dependLabel = new GridData(SWT.LEFT, SWT.TOP, true, false, 2, 1);
+ gd_dependLabel.widthHint = NewTemplatePage.WIZARD_PAGE_WIDTH - 50;
+ dependLabel.setLayoutData(gd_dependLabel);
+ dependLabel.setText("This template depends on the Android Support library, which is " +
+ "either not installed, or the template depends on a more recent version than " +
+ "the one you have installed.");
+
+ mLink = new Link(container, SWT.NONE);
+ mLink.setLayoutData(new GridData(SWT.LEFT, SWT.TOP, false, false, 2, 1));
+ mLink.setText("<a href=\"" + URL + "\">" + URL + "</a>"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+ mLink.addSelectionListener(this);
+
+ Label lblNewLabel_1 = new Label(container, SWT.NONE);
+ lblNewLabel_1.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 2, 1));
+
+ requiredLabel = new Label(container, SWT.NONE);
+ requiredLabel.setText("Required version:");
+
+ mRequiredVersion = new Label(container, SWT.NONE);
+ mRequiredVersion.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1));
+
+ installedLabel = new Label(container, SWT.NONE);
+ installedLabel.setText("Installed version:");
+
+ mInstalledVersion = new Label(container, SWT.NONE);
+ mInstalledVersion.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1));
+
+ Label lblNewLabel = new Label(container, SWT.NONE);
+ lblNewLabel.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 2, 1));
+
+ Label descLabel = new Label(container, SWT.WRAP);
+ GridData gd_descLabel = new GridData(SWT.LEFT, SWT.TOP, true, false, 2, 1);
+ gd_descLabel.widthHint = 550;
+ descLabel.setLayoutData(gd_descLabel);
+ descLabel.setText(
+ "You can install or upgrade it by clicking the Install button below, or " +
+ "alternatively, you can install it outside of Eclipse with the SDK Manager, " +
+ "then click on \"Check Again\" to proceed.");
+
+ mInstallButton = new Button(container, SWT.NONE);
+ mInstallButton.setText("Install/Upgrade");
+ mInstallButton.addSelectionListener(this);
+
+ mCheckButton = new Button(container, SWT.NONE);
+ mCheckButton.setText("Check Again");
+ mCheckButton.addSelectionListener(this);
+
+ mInstallButton.setFocus();
+ }
+
+ private void showNextPage() {
+ validatePage();
+ if (isPageComplete()) {
+ // Finish button will be enabled now
+ mInstallButton.setEnabled(false);
+ mCheckButton.setEnabled(false);
+
+ IWizard wizard = getWizard();
+ IWizardPage next = wizard.getNextPage(this);
+ if (next != null) {
+ wizard.getContainer().showPage(next);
+ }
+ }
+ }
+
+ @Override
+ public boolean isPageComplete() {
+ if (mTemplate == null) {
+ return true;
+ }
+
+ return super.isPageComplete() && isInstalled();
+ }
+
+ private boolean isInstalled() {
+ return isInstalled(mTemplate.getDependencies());
+ }
+
+ static String sCachedName;
+ static int sCachedVersion;
+ private Label requiredLabel;
+ private Label installedLabel;
+ private Label mRequiredVersion;
+ private Label mInstalledVersion;
+
+ public static boolean isInstalled(List<Pair<String, Integer>> dependencies) {
+ for (Pair<String, Integer> dependency : dependencies) {
+ String name = dependency.getFirst();
+ int required = dependency.getSecond();
+
+ int installed = -1;
+ if (SUPPORT_LIBRARY_NAME.equals(name)) {
+ installed = getInstalledSupportLibVersion();
+ }
+
+ if (installed == -1) {
+ return false;
+ }
+ if (required > installed) {
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ private static int getInstalledSupportLibVersion() {
+ if (SUPPORT_LIBRARY_NAME.equals(sCachedName)) {
+ return sCachedVersion;
+ } else {
+ int version = AddSupportJarAction.getInstalledRevision();
+ sCachedName = SUPPORT_LIBRARY_NAME;
+ sCachedVersion = version;
+ return version;
+ }
+ }
+
+ private void updateVersionLabels() {
+ int version = getInstalledSupportLibVersion();
+ if (version == -1) {
+ mInstalledVersion.setText("Not installed");
+ } else {
+ mInstalledVersion.setText(Integer.toString(version));
+ }
+
+ if (mTemplate != null) {
+ for (Pair<String, Integer> dependency : mTemplate.getDependencies()) {
+ String name = dependency.getFirst();
+ if (name.equals(SUPPORT_LIBRARY_NAME)) {
+ int required = dependency.getSecond();
+ mRequiredVersion.setText(Integer.toString(required));
+ break;
+ }
+ }
+ }
+ }
+
+ private void validatePage() {
+ if (mTemplate == null) {
+ return;
+ }
+
+ IStatus status = null;
+
+ List<Pair<String, Integer>> dependencies = mTemplate.getDependencies();
+ if (dependencies.size() > 1 || dependencies.size() == 1
+ && !dependencies.get(0).getFirst().equals(SUPPORT_LIBRARY_NAME)) {
+ status = new Status(IStatus.WARNING, AdtPlugin.PLUGIN_ID,
+ "Unsupported template dependency: Upgrade your Android Eclipse plugin");
+ }
+
+ setPageComplete(status == null || status.getSeverity() != IStatus.ERROR);
+ if (status != null) {
+ setMessage(status.getMessage(),
+ status.getSeverity() == IStatus.ERROR
+ ? IMessageProvider.ERROR : IMessageProvider.WARNING);
+ } else {
+ setErrorMessage(null);
+ setMessage(null);
+ }
+ }
+
+ // ---- Implements SelectionListener ----
+
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ Object source = e.getSource();
+ if (source == mCheckButton) {
+ sCachedName = null;
+ if (isInstalled()) {
+ showNextPage();
+ }
+ updateVersionLabels();
+ } else if (source == mInstallButton) {
+ sCachedName = null;
+ for (Pair<String, Integer> dependency : mTemplate.getDependencies()) {
+ String name = dependency.getFirst();
+ if (SUPPORT_LIBRARY_NAME.equals(name)) {
+ int version = dependency.getSecond();
+ File installed = AddSupportJarAction.installSupport(version);
+ if (installed != null) {
+ showNextPage();
+ }
+ updateVersionLabels();
+ }
+ }
+ } else if (source == mLink) {
+ try {
+ IWorkbench workbench = PlatformUI.getWorkbench();
+ IWebBrowser browser = workbench.getBrowserSupport().getExternalBrowser();
+ browser.openURL(new URL(URL));
+ } catch (Exception ex) {
+ String message = String.format("Could not open browser. Vist\n%1$s\ninstead.",
+ URL);
+ MessageDialog.openError(getShell(), "Browser Error", message);
+ }
+ }
+ }
+
+ @Override
+ public void widgetDefaultSelected(SelectionEvent e) {
+ }
+}