/*******************************************************************************
* 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.HashSet;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.preference.PreferencePage;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.CheckStateChangedEvent;
import org.eclipse.jface.viewers.CheckboxTableViewer;
import org.eclipse.jface.viewers.ComboViewer;
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.LabelProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.wizard.WizardDialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.MouseAdapter;
import org.eclipse.swt.events.MouseEvent;
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 org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPreferencePage;
import org.eclipse.ui.menus.CommandContributionItem;
import org.eclipse.ui.menus.CommandContributionItemParameter;
import ca.uvic.chisel.logging.eclipse.ILoggingCategory;
import ca.uvic.chisel.logging.eclipse.WorkbenchLoggingPlugin;
import ca.uvic.chisel.logging.eclipse.internal.LoggingCategory;
import ca.uvic.chisel.logging.eclipse.internal.network.UploadJob;
public class WorkbenchLoggerPreferencePage extends PreferencePage implements
IWorkbenchPreferencePage {
private static final String EDIT_COPY = "org.eclipse.ui.edit.copy";
private HashSet<String> enabledCategories;
private CheckboxTableViewer viewer;
private Button aboutButton;
private ComboViewer intervalViewer;
public WorkbenchLoggerPreferencePage() {
enabledCategories = new HashSet<String>();
}
public WorkbenchLoggerPreferencePage(String title) {
super(title);
}
public WorkbenchLoggerPreferencePage(String title, ImageDescriptor image) {
super(title, image);
}
@Override
protected Control createContents(Composite parent) {
Composite page = new Composite(parent, SWT.NONE);
page.setLayout(new GridLayout(2, false));
// create a list viewer that will display all of the
// different loggers
viewer = CheckboxTableViewer
.newCheckList(page, 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
boolean stale = false;
for (ILoggingCategory category : WorkbenchLoggingPlugin.getDefault()
.getCategoryManager().getCategories()) {
if (category.isEnabled()) {
enabledCategories.add(category.getCategoryID());
viewer.setChecked(category, true);
}
// also set the stale state... used for enabling the upload button.
stale |= ((LoggingCategory) category).isStale();
}
viewer.addCheckStateListener(new ICheckStateListener() {
public void checkStateChanged(CheckStateChangedEvent event) {
if (event.getElement() instanceof ILoggingCategory) {
ILoggingCategory category = (ILoggingCategory) event
.getElement();
if (event.getChecked()) {
enabledCategories.add(category.getCategoryID());
} else {
enabledCategories.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(page, SWT.NONE);
buttonArea.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false));
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()) {
enabledCategories.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);
enabledCategories.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("About...");
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);
spacer = new Composite(buttonArea, SWT.NONE);
d = gdf.create();
d.heightHint = 40;
spacer.setLayoutData(d);
Button uploadButton = new Button(buttonArea, SWT.PUSH);
uploadButton.setText("Upload Now...");
uploadButton.setLayoutData(gdf.create());
uploadButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
WizardDialog dialog = new WizardDialog(getShell(),
new UploadWizard());
dialog.open();
}
});
uploadButton.setEnabled(stale);
Composite intervalComposite = new Composite(page, SWT.NONE);
GridData gd = gdf.create();
gd.grabExcessVerticalSpace = false;
gd.grabExcessHorizontalSpace = true;
intervalComposite.setLayoutData(gd);
intervalComposite.setLayout(new GridLayout(2, false));
Label intervalLabel = new Label(intervalComposite, SWT.NONE);
intervalLabel.setText("Upload Interval: ");
gd = gdf.create();
gd.grabExcessVerticalSpace = false;
gd.grabExcessHorizontalSpace = false;
intervalLabel.setLayoutData(gd);
intervalViewer = new ComboViewer(intervalComposite, SWT.BORDER | SWT.SINGLE);
Long[] intervals = new Long[] { UploadJob.UPLOAD_INTERVAL_DAILY,
UploadJob.UPLOAD_INTERVAL_WEEKLY,
UploadJob.UPLOAD_INTERVAL_MONTHLY };
intervalViewer.setContentProvider(new ArrayContentProvider());
intervalViewer.setLabelProvider(new LabelProvider() {
@Override
public String getText(Object element) {
if (element instanceof Long) {
long interval = (Long) element;
if (interval == UploadJob.UPLOAD_INTERVAL_DAILY) {
return "Daily";
} else if (interval == UploadJob.UPLOAD_INTERVAL_WEEKLY) {
return "Every Seven Days";
} else if (interval == UploadJob.UPLOAD_INTERVAL_MONTHLY) {
return "Every Thirty Days";
}
}
return super.getText(element);
}
});
intervalViewer.setInput(intervals);
long interval = WorkbenchLoggingPlugin
.getDefault().getPreferenceStore().getLong(
UploadJob.UPLOAD_INTERVAL_KEY);
if (interval <= 0) {
interval = WorkbenchLoggingPlugin
.getDefault().getPreferenceStore().getDefaultLong(
UploadJob.UPLOAD_INTERVAL_KEY);
}
intervalViewer.setSelection(new StructuredSelection(interval));
intervalViewer.getControl().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
spacer = new Composite(page, SWT.NONE);
gd = gdf.create();
gd.grabExcessVerticalSpace = false;
gd.grabExcessHorizontalSpace = false;
gd.heightHint = 2;
spacer.setLayoutData(gd);
Composite uidComposite = new Composite(page, SWT.NONE);
uidComposite.setLayout(new GridLayout(2, false));
gd = gdf.create();
gd.grabExcessVerticalSpace = false;
gd.grabExcessHorizontalSpace = false;
gd.horizontalSpan = 2;
uidComposite.setLayoutData(gd);
Label uidLabel = new Label(uidComposite, SWT.NONE);
uidLabel.setText("User ID:");
gd = gdf.create();
gd.grabExcessVerticalSpace = false;
gd.grabExcessHorizontalSpace = false;
uidLabel.setLayoutData(gd);
final Text uidText = new Text(uidComposite, SWT.SINGLE | SWT.READ_ONLY);
uidText.setText(WorkbenchLoggingPlugin.getDefault().getLocalUser());
uidText.addMouseListener(new MouseAdapter() {
/* (non-Javadoc)
* @see org.eclipse.swt.events.MouseAdapter#mouseUp(org.eclipse.swt.events.MouseEvent)
*/
@Override
public void mouseUp(MouseEvent e) {
uidText.selectAll();
}
});
MenuManager manager = new MenuManager();
Menu menu = manager.createContextMenu(uidText);
uidText.setMenu(menu);
CommandContributionItemParameter parameters = new CommandContributionItemParameter(
WorkbenchLoggingPlugin.getDefault().getWorkbench(), null, EDIT_COPY, SWT.PUSH);
manager.add(new CommandContributionItem(parameters));
return page;
}
public void init(IWorkbench workbench) {
}
@Override
protected void performApply() {
super.performApply();
}
@Override
public boolean performOk() {
for (ILoggingCategory category : WorkbenchLoggingPlugin.getDefault()
.getCategoryManager().getCategories()) {
boolean enabled = enabledCategories.contains(category
.getCategoryID());
if (category.isEnabled() != enabled) {
category.setEnabled(enabled);
}
}
IPreferenceStore store = WorkbenchLoggingPlugin.getDefault().getPreferenceStore();
IStructuredSelection selection = (IStructuredSelection) intervalViewer.getSelection();
store.setValue(UploadJob.UPLOAD_INTERVAL_KEY, (long)((Long)selection.getFirstElement()));
return super.performOk();
}
}