/* * 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) { } }