diff options
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.java | 298 |
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) { + } +} |