| /******************************************************************************* |
| * Copyright (c) 2001, 2006 IBM Corporation and others. |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License v1.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/epl-v10.html |
| * |
| * Contributors: |
| * IBM Corporation - initial API and implementation |
| *******************************************************************************/ |
| package org.eclipse.wst.internet.cache.internal; |
| |
| import java.io.BufferedReader; |
| import java.io.IOException; |
| import java.io.InputStream; |
| import java.io.InputStreamReader; |
| import java.net.URL; |
| import java.text.MessageFormat; |
| import java.util.Hashtable; |
| |
| import org.eclipse.jface.dialogs.IconAndMessageDialog; |
| import org.eclipse.jface.wizard.ProgressMonitorPart; |
| import org.eclipse.swt.SWT; |
| import org.eclipse.swt.browser.Browser; |
| import org.eclipse.swt.browser.ProgressEvent; |
| import org.eclipse.swt.browser.ProgressListener; |
| import org.eclipse.swt.custom.StackLayout; |
| import org.eclipse.swt.graphics.Image; |
| 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.Label; |
| import org.eclipse.swt.widgets.Shell; |
| |
| /** |
| * A dialog that prompts the user to accept a license agreement. |
| */ |
| public class LicenseAcceptanceDialog extends IconAndMessageDialog |
| { |
| /** |
| * Holds all the dialogs that are currently displayed keyed by the license URL. |
| */ |
| private static Hashtable dialogsInUse = new Hashtable(); |
| |
| /** |
| * The URL of the resource. |
| */ |
| private String url; |
| |
| /** |
| * The URL of the license. |
| */ |
| private String licenseURL; |
| |
| /** |
| * The agree button for the dialog. |
| */ |
| private Button agreeButton = null; |
| |
| /** |
| * Constructor. |
| * |
| * @param parent The parent of this dialog. |
| * @param url The license URL. |
| */ |
| protected LicenseAcceptanceDialog(Shell parent, String url, String licenseURL) |
| { |
| super(parent); |
| this.url = url; |
| this.licenseURL = licenseURL; |
| } |
| |
| /** |
| * @see org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets.Shell) |
| */ |
| protected void configureShell(Shell shell) |
| { |
| super.configureShell(shell); |
| shell.setText(CacheMessages._UI_CACHE_DIALOG_TITLE); |
| shell.setImage(null); |
| } |
| |
| /** |
| * @see org.eclipse.jface.dialogs.Dialog#createButtonBar(org.eclipse.swt.widgets.Composite) |
| */ |
| protected Control createButtonBar(Composite parent) |
| { |
| Composite buttonBar = new Composite(parent, SWT.NONE); |
| GridLayout layout = new GridLayout(); |
| layout.numColumns = 0; |
| layout.makeColumnsEqualWidth = true; |
| buttonBar.setLayout(layout); |
| GridData gd = new GridData(GridData.HORIZONTAL_ALIGN_CENTER); |
| buttonBar.setLayoutData(gd); |
| |
| // Create the agree button. |
| agreeButton = createButton(buttonBar, LicenseAcceptanceDialog.OK, |
| CacheMessages._UI_CACHE_DIALOG_AGREE_BUTTON, false); |
| agreeButton.setEnabled(false); |
| |
| // Create the disagree button. |
| createButton(buttonBar, LicenseAcceptanceDialog.CANCEL, |
| CacheMessages._UI_CACHE_DIALOG_DISAGREE_BUTTON, false); |
| |
| return buttonBar; |
| } |
| |
| /** |
| * @see org.eclipse.jface.window.Window#createContents(org.eclipse.swt.widgets.Composite) |
| */ |
| protected Control createContents(Composite parent) |
| { |
| Composite composite = new Composite(parent, SWT.NONE); |
| GridLayout layout = new GridLayout(); |
| composite.setLayout(layout); |
| GridData gd = new GridData(SWT.FILL); |
| gd.widthHint = 500; |
| composite.setLayoutData(gd); |
| |
| // Display a statement about the license. |
| Label licenseText1 = new Label(composite, SWT.NONE); |
| licenseText1.setText(CacheMessages._UI_CACHE_DIALOG_LICENSE_STATEMENT1); |
| Label urlText = new Label(composite, SWT.WRAP); |
| gd = new GridData(SWT.FILL, SWT.TOP, true, false, 1, 1); |
| urlText.setLayoutData(gd); |
| urlText.setText(url); |
| new Label(composite, SWT.NONE); // Spacing label. |
| Label licenseText2 = new Label(composite, SWT.WRAP); |
| gd = new GridData(SWT.FILL, SWT.TOP, true, false, 1, 1); |
| licenseText2.setLayoutData(gd); |
| |
| // Display the license in a browser. |
| try |
| { |
| final Composite licenseTextComposite = new Composite(composite, SWT.NONE); |
| final StackLayout stackLayout = new StackLayout(); |
| licenseTextComposite.setLayout(stackLayout); |
| gd = new GridData(SWT.FILL, SWT.FILL, true, true); |
| gd.heightHint = 400; |
| licenseTextComposite.setLayoutData(gd); |
| // Create the loading progress monitor composite and part. |
| Composite monitorComposite = new Composite(licenseTextComposite, SWT.NONE); |
| monitorComposite.setLayout(new GridLayout()); |
| gd = new GridData(SWT.FILL, SWT.FILL, true, true); |
| gd.heightHint = 400; |
| monitorComposite.setLayoutData(gd); |
| final ProgressMonitorPart monitor = new ProgressMonitorPart(monitorComposite, new GridLayout()); |
| gd = new GridData(SWT.FILL, SWT.BOTTOM, true, true); |
| monitor.setLayoutData(gd); |
| monitor.beginTask(CacheMessages._UI_LOADING_LICENSE, 100); |
| stackLayout.topControl = monitorComposite; |
| // Create the browser. |
| final Browser browser = new Browser(licenseTextComposite, SWT.BORDER); |
| gd = new GridData(SWT.FILL, SWT.FILL, true, true); |
| //gd.heightHint = 400; |
| |
| // It's important that the license URL is set even if we read |
| // the contents of the license file ourselves (see below) as |
| // otherwise the progress monitor will not be called on certain |
| // linux systems with certain browsers. |
| browser.setUrl(licenseURL); |
| |
| // The browser widget has problems loading files stored in jars |
| // so we read from the jar and set the browser text ourselves. |
| // See bug 154721. |
| if(licenseURL.startsWith("jar:")) |
| { |
| InputStream licenseStream = null; |
| InputStreamReader isreader = null; |
| BufferedReader breader = null; |
| try |
| { |
| URL browserURL = new URL(licenseURL); |
| licenseStream = browserURL.openStream(); |
| isreader = new InputStreamReader(licenseStream); |
| breader = new BufferedReader(isreader); |
| String str; |
| StringBuffer sb = new StringBuffer(); |
| while((str = breader.readLine())!=null){ |
| sb.append(str); |
| } |
| browser.setText(sb.toString()); |
| } |
| finally |
| { |
| if(licenseStream != null) |
| { |
| licenseStream.close(); |
| } |
| if(isreader != null) |
| { |
| isreader.close(); |
| } |
| if(breader != null) |
| { |
| breader.close(); |
| } |
| } |
| } |
| |
| browser.setLayoutData(gd); |
| browser.addProgressListener(new ProgressListener(){ |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.swt.browser.ProgressListener#changed(org.eclipse.swt.browser.ProgressEvent) |
| */ |
| public void changed(ProgressEvent event) |
| { |
| if (event.total != 0) |
| { |
| monitor.internalWorked(event.current * 100 / event.total); |
| } |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.swt.browser.ProgressListener#completed(org.eclipse.swt.browser.ProgressEvent) |
| */ |
| public void completed(ProgressEvent event) |
| { |
| monitor.done(); |
| |
| stackLayout.topControl = browser; |
| agreeButton.setEnabled(true); |
| licenseTextComposite.layout(); |
| } |
| }); |
| |
| licenseText2.setText(CacheMessages._UI_CACHE_DIALOG_LICENSE_STATEMENT2); |
| } |
| catch(Exception e) |
| { |
| // The browser throws an exception on platforms that do not support it. |
| // In this case we need to create an external browser. |
| try |
| { |
| CachePlugin.getDefault().getWorkbench().getBrowserSupport().getExternalBrowser().openURL(new URL(licenseURL)); |
| licenseText2.setText(CacheMessages._UI_CACHE_DIALOG_LICENSE_STATEMENT2_NO_INTERNAL); |
| } |
| catch(Exception ex) |
| { |
| // In this case the license cannot be display. Inform the user of this and give them the license location. |
| licenseText2.setText(MessageFormat.format(CacheMessages._UI_CACHE_DIALOG_LICENSE_STATEMENT2_NO_BROWSER, new Object[]{licenseURL})); |
| } |
| } |
| |
| createButtonBar(composite); |
| |
| return composite; |
| } |
| |
| /** |
| * @see org.eclipse.jface.dialogs.IconAndMessageDialog#getImage() |
| */ |
| protected Image getImage() |
| { |
| return getInfoImage(); |
| } |
| |
| /** |
| * Prompt the user to accept the specified license. This method creates the |
| * dialog and returns the result. |
| * |
| * @param parent The parent of this dialog. |
| * @param url The URL of the resource for which the license must be accepted. |
| * @param licenseURL The license URL. |
| * @return True if the license is accepted, false otherwise. |
| */ |
| public static boolean promptForLicense(Shell parent, String url, String licenseURL) throws IOException |
| { |
| boolean agreedToLicense = false; |
| boolean newDialog = true; |
| LicenseAcceptanceDialog dialog = null; |
| // If the dialog is already displayed for this license use it instead of |
| // displaying another dialog. |
| if(dialogsInUse.containsKey(licenseURL)) |
| { |
| newDialog = false; |
| dialog = (LicenseAcceptanceDialog)dialogsInUse.get(licenseURL); |
| } |
| else |
| { |
| InputStream is = null; |
| |
| try |
| { |
| URL urlObj = new URL(licenseURL); |
| is = urlObj.openStream(); |
| |
| dialog = new LicenseAcceptanceDialog(parent, url, licenseURL); |
| dialogsInUse.put(licenseURL, dialog); |
| dialog.setBlockOnOpen(true); |
| } |
| catch(Exception e) |
| { |
| throw new IOException("The license cannot be opened."); |
| } |
| finally |
| { |
| if(is != null) |
| { |
| try |
| { |
| is.close(); |
| } |
| catch(IOException e) |
| { |
| // Do nothing. |
| } |
| } |
| } |
| } |
| if(dialog != null) |
| { |
| dialog.open(); |
| |
| if (dialog.getReturnCode() == LicenseAcceptanceDialog.OK) |
| { |
| agreedToLicense = true; |
| } |
| |
| if(newDialog) |
| { |
| dialogsInUse.remove(licenseURL); |
| } |
| } |
| |
| return agreedToLicense; |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.jface.dialogs.Dialog#close() |
| */ |
| public boolean close() |
| { |
| if(agreeButton != null) |
| { |
| agreeButton.dispose(); |
| agreeButton = null; |
| } |
| return super.close(); |
| } |
| |
| } |