/******************************************************************************* * Copyright (c) 2010 the CHISEL group and contributors. * 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: * Del Myers - initial API and implementation *******************************************************************************/ /** * */ package ca.uvic.chisel.logging.eclipse.internal.ui; import java.util.Arrays; import java.util.HashSet; import org.eclipse.jface.layout.GridDataFactory; import org.eclipse.jface.viewers.ArrayContentProvider; import org.eclipse.jface.viewers.CheckStateChangedEvent; import org.eclipse.jface.viewers.CheckboxTableViewer; import org.eclipse.jface.viewers.ICheckStateListener; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.wizard.WizardPage; import org.eclipse.swt.SWT; import org.eclipse.swt.browser.Browser; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; 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 ca.uvic.chisel.logging.eclipse.ILoggingCategory; import ca.uvic.chisel.logging.eclipse.WorkbenchLoggingPlugin; /** * A Wizard page that allows users to upload their usage data. * @author Del Myers * */ public class UploadWizardPage1 extends WizardPage { private Button aboutButton; private CheckboxTableViewer viewer; private HashSet<String> selectedCategories; private Button acceptButton; protected UploadWizardPage1() { super("Workbench Logs", "Select Logs to Upload", null); selectedCategories = new HashSet<String>(); setPageComplete(false); } /* (non-Javadoc) * @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite) */ public void createControl(Composite parent) { Composite page = new Composite(parent, SWT.BORDER); page.setLayout(new GridLayout()); Browser b = new Browser(page, SWT.NONE); b.setText("<HTML><body>" + "<p>You have selected to log various user interactions in you Eclipse " + "workbench. The following loggers have been installed and the data gathered " + "by them will now be uploaded to thier servers. Please review the logs, accept " + "the disclaimers, and select <i>Finish</i> to upload the data.</p>" + "<p>You can disable the loggers at any time using the <i>Workbench Logger</i> " + "preference page</p>" + "</body></html>"); GridData gd = new GridData(SWT.FILL, SWT.FILL, true, true); gd.heightHint = 200; b.setLayoutData(gd); Composite categoriesArea = createCategoriesArea(page); categoriesArea.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false)); acceptButton = new Button(page, SWT.CHECK); acceptButton.setText("I accept the disclaimers of the selected loggers."); acceptButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { boolean complete = ((Button)e.widget).getSelection(); if (!complete) { setErrorMessage("You must accept the disclaimers for the selected loggers"); } else { setErrorMessage(null); } setPageComplete(complete); } }); setControl(page); setErrorMessage("You must accept the disclaimers for the selected loggers"); } private Composite createCategoriesArea(Composite parent) { Composite categoriesArea = new Composite(parent, SWT.NONE); categoriesArea.setLayout(new GridLayout(2, false)); //create a list viewer that will display all of the //different loggers viewer = CheckboxTableViewer.newCheckList(categoriesArea, SWT.BORDER|SWT.SINGLE); viewer.setContentProvider(new ArrayContentProvider()); viewer.setLabelProvider(new LoggingCategoryLabelProvider()); viewer.setInput(WorkbenchLoggingPlugin.getDefault().getCategoryManager().getCategories()); //set all of the enabled categories to the checked state for (ILoggingCategory category : WorkbenchLoggingPlugin.getDefault().getCategoryManager().getCategories()) { selectedCategories.add(category.getCategoryID()); } viewer.setAllChecked(true); viewer.addCheckStateListener(new ICheckStateListener() { public void checkStateChanged(CheckStateChangedEvent event) { if (event.getElement() instanceof ILoggingCategory) { ILoggingCategory category = (ILoggingCategory) event.getElement(); if (event.getChecked()){ selectedCategories.add(category.getCategoryID()); } else { selectedCategories.remove(category.getCategoryID()); } } } }); viewer.addSelectionChangedListener(new ISelectionChangedListener() { public void selectionChanged(SelectionChangedEvent event) { if (aboutButton != null && !aboutButton.isDisposed()) { aboutButton.setEnabled(!event.getSelection().isEmpty()); } } }); viewer.getControl().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); //create a button area Composite buttonArea = new Composite(categoriesArea, SWT.NONE); buttonArea.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); buttonArea.setLayout(new GridLayout()); GridDataFactory gdf = GridDataFactory.createFrom(new GridData(SWT.FILL, SWT.FILL, true, false)); Button selectAll = new Button(buttonArea, SWT.PUSH); selectAll.setText("Select All"); selectAll.setLayoutData(gdf.create()); selectAll.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { viewer.setAllChecked(true); for (ILoggingCategory category : WorkbenchLoggingPlugin.getDefault().getCategoryManager().getCategories()) { selectedCategories.add(category.getCategoryID()); } } }); Button selectNone = new Button(buttonArea, SWT.PUSH); selectNone.setText("Select None"); selectNone.setLayoutData(gdf.create()); selectNone.addSelectionListener(new SelectionAdapter(){ @Override public void widgetSelected(SelectionEvent e) { viewer.setAllChecked(false); selectedCategories.clear(); } }); Control spacer = new Composite(buttonArea, SWT.NONE); GridData d = gdf.create(); d.heightHint = 40; spacer.setLayoutData(d); aboutButton = new Button(buttonArea, SWT.PUSH); aboutButton.setText("Disclaimer..."); aboutButton.setLayoutData(gdf.create()); aboutButton.addSelectionListener(new SelectionAdapter(){ @Override public void widgetDefaultSelected(SelectionEvent e) { widgetSelected(e); } @Override public void widgetSelected(SelectionEvent e) { ISelection selection = viewer.getSelection(); if (selection instanceof IStructuredSelection) { IStructuredSelection ss = (IStructuredSelection) selection; if (!ss.isEmpty() && ss.getFirstElement() instanceof ILoggingCategory) { AboutCategoryDialog dialog = new AboutCategoryDialog(getShell(), (ILoggingCategory)ss.getFirstElement()); dialog.open(); } } } }); aboutButton.setEnabled(false); return categoriesArea; } public String[] getSelectedCategories() { String[] categories = selectedCategories.toArray(new String[selectedCategories.size()]); Arrays.sort(categories); return categories; } }