/*
* 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.installer.ui.dialogs;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import org.eclipse.jface.dialogs.TitleAreaDialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.SashForm;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Color;
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.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.swt.widgets.Text;
import com.motorola.studio.android.installer.InstallerPlugin;
import com.motorola.studio.android.installer.i18n.InstallerNLS;
import com.motorola.studio.android.installer.utilities.InstallableItem;
/**
* Accept Licenses Dialog
* Show all unaccepted licenses and a single radio to allow accept the licenses
*/
public class AcceptLicensesDialog extends TitleAreaDialog
{
private Table table;
private Text licenseArea;
private Text detailsArea;
private final InstallableItem[] unitsToInstall;
private final List<InstallableItem> unitsWithUnacceptedLicenses;
private String license;
private boolean isDetailsDisplayed = false;
public AcceptLicensesDialog(Shell parentShell, InstallableItem[] iInstallableUnits,
boolean isDetailsDisplayed, boolean forceShowLicenseDialog)
{
super(parentShell);
this.unitsToInstall = iInstallableUnits;
this.isDetailsDisplayed = isDetailsDisplayed;
if (forceShowLicenseDialog)
{
unitsWithUnacceptedLicenses = Arrays.asList(iInstallableUnits);
}
else
{
unitsWithUnacceptedLicenses = new ArrayList<InstallableItem>();
findUnitsWithUnacceptedLicenses();
}
}
private void findUnitsWithUnacceptedLicenses()
{
for (InstallableItem iu : unitsToInstall)
{
if (iu.hasLicenseNotAccepted())
{
unitsWithUnacceptedLicenses.add(iu);
}
}
Collections.sort(unitsWithUnacceptedLicenses, new IUComparator());
}
/*
* (non-Javadoc)
* @see org.eclipse.jface.dialogs.TitleAreaDialog#createDialogArea(org.eclipse.swt.widgets.Composite)
*/
@Override
protected Control createDialogArea(Composite parent)
{
//create main area
super.createDialogArea(parent).setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
Composite mainComposite = new Composite(parent, SWT.NONE);
mainComposite.setLayoutData(new GridData(GridData.FILL_BOTH));
mainComposite.setLayout(new GridLayout());
//create sash
SashForm sash = new SashForm(mainComposite, SWT.HORIZONTAL);
sash.setLayoutData(new GridData(GridData.FILL_BOTH));
// lay out form for displaying details
if (isDetailsDisplayed)
{
table = new Table(sash, SWT.BORDER | SWT.SINGLE);
SashForm sashLeft = new SashForm(sash, SWT.VERTICAL);
licenseArea = new Text(sashLeft, SWT.MULTI | SWT.BORDER | SWT.V_SCROLL | SWT.WRAP);
detailsArea = new Text(sashLeft, SWT.MULTI | SWT.BORDER | SWT.V_SCROLL | SWT.WRAP);
sash.setWeights(new int[]
{
35, 65
});
sashLeft.setWeights(new int[]
{
80, 20
});
}
// lay out form NOT to display details
else
{
table = new Table(sash, SWT.BORDER | SWT.SINGLE);
licenseArea = new Text(sash, SWT.MULTI | SWT.BORDER | SWT.V_SCROLL | SWT.WRAP);
sash.setWeights(new int[]
{
35, 65
});
}
Button acceptLicense = new Button(mainComposite, SWT.RADIO);
acceptLicense.setText(InstallerNLS.AcceptLicensesDialog_AcceptLicenseButton);
acceptLicense.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
acceptLicense.setSelection(false);
acceptLicense.addSelectionListener(new SelectionListener()
{
public void widgetSelected(SelectionEvent e)
{
getButton(OK).setEnabled(true);
}
public void widgetDefaultSelected(SelectionEvent e)
{
//do nothing
}
});
Button doNotAcceptLicense = new Button(mainComposite, SWT.RADIO);
doNotAcceptLicense.setText(InstallerNLS.AcceptLicensesDialog_RejectLicenseButton);
doNotAcceptLicense.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
doNotAcceptLicense.setSelection(true);
doNotAcceptLicense.addSelectionListener(new SelectionListener()
{
public void widgetSelected(SelectionEvent e)
{
getButton(OK).setEnabled(false);
}
public void widgetDefaultSelected(SelectionEvent e)
{
//do nothing
}
});
populateTable();
setTitle(InstallerNLS.AcceptLicensesDialog_Title);
setMessage(InstallerNLS.AcceptLicensesDialog_Description);
setTitleImage(InstallerPlugin.imageDescriptorFromPlugin(InstallerPlugin.PLUGIN_ID,
"icons/wizban/installer_image_top.png").createImage()); //$NON-NLS-1$
return mainComposite;
}
/**
* Populate the list of available ius
*/
private void populateTable()
{
for (InstallableItem iu : unitsWithUnacceptedLicenses)
{
TableItem item = new TableItem(table, SWT.NONE);
item.setData(iu);
item.setText(iu.getDisplayName());
}
if (table.getItemCount() > 0)
{
table.select(0);
if (license != null)
{
showLicense(null);
}
else
{
showLicense((InstallableItem) table.getItem(0).getData());
}
// only add "show details" listener, in case details are to be displayed.
if (isDetailsDisplayed)
{
showDetails((InstallableItem) table.getItem(0).getData());
}
}
table.addSelectionListener(new SelectionListener()
{
public void widgetSelected(SelectionEvent e)
{
TableItem[] selection = ((Table) e.widget).getSelection();
TableItem item = selection[0];
if (item != null)
{
if (license != null)
{
showLicense(null);
}
else
{
showLicense((InstallableItem) item.getData());
}
// only add "show details" listener, in case details are to be displayed.
if (isDetailsDisplayed)
{
showDetails((InstallableItem) item.getData());
}
}
}
public void widgetDefaultSelected(SelectionEvent e)
{
//do nothing
}
});
}
/**
* Show the license in the text area
* @param iu
*/
private void showLicense(InstallableItem iu)
{
StringBuffer buffer = new StringBuffer();
if (iu != null)
{
String licenseText = iu.getLicense();
buffer.append(licenseText);
}
else
{
buffer.append(license);
}
licenseArea.setText(buffer.toString());
Color originalColor = licenseArea.getBackground();
licenseArea.setEditable(false);
licenseArea.setBackground(originalColor);
}
/**
* Set details.
*
* @param iu Installable item.
*/
private void showDetails(InstallableItem iu)
{
StringBuffer buffer = new StringBuffer();
if (iu != null)
{
String detailsText = iu.getDescription();
buffer.append(InstallerNLS.AcceptLicensesDialog_IUDescriptionLabel + ": " + detailsText); //$NON-NLS-2$
}
detailsArea.setText(buffer.toString());
}
/**
* Save the licenses accepted
*/
private void acceptLicenses()
{
for (TableItem item : table.getItems())
{
InstallableItem ii = (InstallableItem) item.getData();
ii.acceptLicenses();
}
}
@Override
protected void createButtonsForButtonBar(Composite parent)
{
super.createButtonsForButtonBar(parent);
getButton(OK).setEnabled(false);
}
/*
* (non-Javadoc)
* @see org.eclipse.jface.dialogs.Dialog#isResizable()
*/
@Override
protected boolean isResizable()
{
return true;
}
/*
* (non-Javadoc)
* @see org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets.Shell)
*/
@Override
protected void configureShell(Shell newShell)
{
super.configureShell(newShell);
newShell.setSize(600, 600);
newShell.setText(InstallerNLS.ConfigurationDialog_DialogTitle);
}
/*
* (non-Javadoc)
* @see org.eclipse.jface.dialogs.Dialog#okPressed()
*/
@Override
protected void okPressed()
{
acceptLicenses();
super.okPressed();
}
@Override
public int open()
{
int returnCode = OK;
if (unitsWithUnacceptedLicenses.size() > 0)
{
returnCode = super.open();
}
return returnCode;
}
private class IUComparator implements Comparator<InstallableItem>
{
public int compare(InstallableItem arg0, InstallableItem arg1)
{
return arg0.getDisplayName().compareTo(arg1.getDisplayName());
}
}
}