/*******************************************************************************
* Copyright (c) 2011 LogSaw project 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:
* LogSaw project committers - initial API and implementation
*******************************************************************************/
package net.sf.logsaw.dialect.log4j.ui.pattern;
import java.io.IOException;
import java.util.Set;
import net.sf.logsaw.dialect.log4j.Log4JDialectPlugin;
import net.sf.logsaw.dialect.log4j.ui.Log4JDialectUIPlugin;
import net.sf.logsaw.dialect.log4j.ui.Messages;
import net.sf.logsaw.dialect.pattern.APatternDialect;
import net.sf.logsaw.ui.UIPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.preference.PreferencePage;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.ListViewer;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.ViewerSorter;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.SWT;
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.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPreferencePage;
/**
* @author Philipp Nanz
*/
public class Log4JPatternLayoutPreferencePage extends PreferencePage implements
IWorkbenchPreferencePage {
private APatternDialect patternDialect;
private Set<String> patternSet;
private Button editButton;
private Button removeButton;
private ListViewer listViewer;
/* (non-Javadoc)
* @see org.eclipse.ui.IWorkbenchPreferencePage#init(org.eclipse.ui.IWorkbench)
*/
@Override
public void init(IWorkbench workbench) {
try {
patternSet = Log4JDialectUIPlugin.getDefault().loadKnownPatterns();
patternDialect = (APatternDialect) Log4JDialectPlugin.getDefault()
.getPatternLayoutDialectFactory().createLogDialect();
} catch (IOException e) {
// Log and show error
UIPlugin.logAndShowError(new CoreException(new Status(IStatus.ERROR,
UIPlugin.PLUGIN_ID, e.getLocalizedMessage(), e)), false);
}
}
/* (non-Javadoc)
* @see org.eclipse.jface.preference.PreferencePage#performOk()
*/
@Override
public boolean performOk() {
try {
Log4JDialectUIPlugin.getDefault().saveKnownPatterns(patternSet);
} catch (IOException e) {
// Log and show error
UIPlugin.logAndShowError(new CoreException(new Status(IStatus.ERROR,
UIPlugin.PLUGIN_ID, e.getLocalizedMessage(), e)), false);
}
return super.performOk();
}
/* (non-Javadoc)
* @see org.eclipse.jface.preference.PreferencePage#createContents(org.eclipse.swt.widgets.Composite)
*/
@Override
protected Control createContents(Composite parent) {
Composite root = new Composite(parent, SWT.NONE);
root.setLayout(new GridLayout(2, false));
listViewer = new ListViewer(root, SWT.BORDER | SWT.SINGLE |
SWT.H_SCROLL | SWT.V_SCROLL);
listViewer.getControl().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
listViewer.addSelectionChangedListener(new ISelectionChangedListener() {
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
*/
@Override
public void selectionChanged(SelectionChangedEvent event) {
IStructuredSelection sel = (IStructuredSelection) event.getSelection();
editButton.setEnabled(!sel.isEmpty());
removeButton.setEnabled(!sel.isEmpty());
}
});
listViewer.setContentProvider(new ArrayContentProvider());
listViewer.setLabelProvider(new LabelProvider());
listViewer.setSorter(new ViewerSorter());
Composite buttonArea = new Composite(root, SWT.NONE);
buttonArea.setLayout(new GridLayout());
GridData gridData = new GridData();
gridData.verticalAlignment = SWT.BEGINNING;
buttonArea.setLayoutData(gridData);
Button addButton = new Button(buttonArea, SWT.PUSH);
addButton.setText(Messages.Log4JPatternLayoutPreferencePage_label_add);
addButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
PatternDialog dlg = new PatternDialog(getShell(), patternDialect, null);
if (dlg.open() == Window.OK) {
patternSet.add(dlg.getPattern());
refreshList();
}
}
});
addButton.setLayoutData(new GridData(SWT.FILL, SWT.NONE, false, false));
editButton = new Button(buttonArea, SWT.PUSH);
editButton.setText(Messages.Log4JPatternLayoutPreferencePage_label_edit);
editButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
IStructuredSelection sel = (IStructuredSelection) listViewer.getSelection();
String oldPattern = (String) sel.getFirstElement();
PatternDialog dlg = new PatternDialog(getShell(), patternDialect, oldPattern);
if (dlg.open() == Window.OK) {
patternSet.remove(oldPattern);
patternSet.add(dlg.getPattern());
refreshList();
}
}
});
editButton.setLayoutData(new GridData(SWT.FILL, SWT.NONE, false, false));
removeButton = new Button(buttonArea, SWT.PUSH);
removeButton.setText(Messages.Log4JPatternLayoutPreferencePage_label_remove);
removeButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent event) {
IStructuredSelection sel = (IStructuredSelection) listViewer.getSelection();
patternSet.remove(sel.getFirstElement());
listViewer.setSelection(StructuredSelection.EMPTY);
refreshList();
}
});
removeButton.setLayoutData(new GridData(SWT.FILL, SWT.NONE, false, false));
refreshList();
listViewer.setSelection(StructuredSelection.EMPTY);
return root;
}
private void refreshList() {
listViewer.setInput(patternSet.toArray());
}
}