/*******************************************************************************
* Copyright (c) 2006 IBM Corporation.
* 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 - Jeff Briggs, Henry Hughes, Ryan Morse
*******************************************************************************/
package org.eclipse.linuxtools.internal.systemtap.graphing.ui.wizards.filter;
import org.eclipse.linuxtools.internal.systemtap.graphing.ui.Localization;
import org.eclipse.linuxtools.systemtap.graphing.core.filters.RangeFilter;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.KeyAdapter;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.KeyListener;
import org.eclipse.swt.layout.FormAttachment;
import org.eclipse.swt.layout.FormData;
import org.eclipse.swt.layout.FormLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.forms.widgets.ColumnLayout;
public class RangeFilterWizardPage extends FilterWizardPage {
public RangeFilterWizardPage() {
super("selectFilterOptions"); //$NON-NLS-1$
setTitle(Localization.getString("RangeFilterWizardPage.CreateRangeFilter")); //$NON-NLS-1$
}
@Override
public void createControl(Composite parent) {
super.createControl(parent);
Composite comp = new Composite(parent, SWT.NULL);
comp.setLayout(new FormLayout());
FormData data1 = new FormData();
data1.left = new FormAttachment(0, 0);
data1.top = new FormAttachment(0, 0);
data1.right = new FormAttachment(40, 0);
data1.bottom = new FormAttachment(100, 0);
Composite cmpFilterOpts = new Composite(comp, SWT.NONE);
cmpFilterOpts.setLayoutData(data1);
ColumnLayout colLayout = new ColumnLayout();
colLayout.maxNumColumns = 1;
cmpFilterOpts.setLayout(colLayout);
//Column
Label lblColumn = new Label(cmpFilterOpts, SWT.NONE);
lblColumn.setText(Localization.getString("RangeFilterWizardPage.Column")); //$NON-NLS-1$
cboColumn = new Combo(cmpFilterOpts, SWT.DROP_DOWN | SWT.READ_ONLY);
cboColumn.addSelectionListener(selectionListener);
for(int i=0; i<wizard.series.length; i++) {
cboColumn.add(wizard.series[i]);
}
new Label(cmpFilterOpts, SWT.NONE); //Spacer
//Low
Label lblLow = new Label(cmpFilterOpts, SWT.NONE);
lblLow.setText(Localization.getString("RangeFilterWizardPage.LowerBound")); //$NON-NLS-1$
txtLow = new Text(cmpFilterOpts, SWT.BORDER);
txtLow.addModifyListener(modifyListener);
txtLow.addKeyListener(numberKeyListener);
//High
Label lblHigh = new Label(cmpFilterOpts, SWT.NONE);
lblHigh.setText(Localization.getString("RangeFilterWizardPage.UpperBound")); //$NON-NLS-1$
txtHigh = new Text(cmpFilterOpts, SWT.BORDER);
txtHigh.addModifyListener(modifyListener);
txtHigh.addKeyListener(numberKeyListener);
new Label(cmpFilterOpts, SWT.NONE); //Spacer
//Style
radInside = new Button(cmpFilterOpts, SWT.RADIO);
radInside.setText(Localization.getString("RangeFilterWizardPage.InsideBounds")); //$NON-NLS-1$
radInside.addSelectionListener(selectionListener);
radInside.setSelection(true);
radOutside = new Button(cmpFilterOpts, SWT.RADIO);
radOutside.setText(Localization.getString("RangeFilterWizardPage.OutsideBounds")); //$NON-NLS-1$
radOutside.addSelectionListener(selectionListener);
chkInclusive = new Button(cmpFilterOpts, SWT.CHECK);
chkInclusive.setText(Localization.getString("RangeFilterWizardPage.Inclusive")); //$NON-NLS-1$
chkInclusive.addSelectionListener(selectionListener);
new Label(cmpFilterOpts, SWT.NONE); //Spacer
cboColumn.select(0);
createFilter();
setControl(comp);
}
@Override
public boolean canFlipToNextPage() {
return false;
}
@Override
protected void createFilter() {
filter = null;
setErrorMessage(null);
String highText = txtHigh.getText().trim();
String lowText = txtLow.getText().trim();
// Allow inside/outside bounds only if the range is bounded (has upper & lower bounds)
boolean bounded = highText.length() * lowText.length() != 0;
radInside.setEnabled(bounded);
radOutside.setEnabled(bounded);
if (highText.length() + lowText.length() == 0) {
setErrorMessage(Localization.getString("RangeFilterWizardPage.EmptyError")); //$NON-NLS-1$
return;
}
try {
Double high = highText.length() > 0 ? Double.parseDouble(txtHigh.getText().trim()) : null;
Double low = lowText.length() > 0 ? Double.parseDouble(txtLow.getText().trim()) : null;
if (low != null && high != null && low >= high) {
setErrorMessage(Localization.getString("RangeFilterWizardPage.BoundError")); //$NON-NLS-1$
return;
}
// By default, if range is unbounded, force "inside" bounds to apply.
int style = (!radInside.isEnabled() || radInside.getSelection() ? RangeFilter.INSIDE_BOUNDS : RangeFilter.OUTSIDE_BOUNDS);
int selected = cboColumn.getSelectionIndex();
if(chkInclusive.getSelection()) {
style |= RangeFilter.INCLUSIVE;
}
filter = new RangeFilter(selected, low, high, style);
} catch(NumberFormatException nfe) {}
}
@Override
public void dispose() {
super.dispose();
if(null != cboColumn) {
cboColumn.removeSelectionListener(selectionListener);
cboColumn.dispose();
cboColumn = null;
}
if(null != txtLow) {
txtLow.removeModifyListener(modifyListener);
txtLow.removeKeyListener(numberKeyListener);
txtLow.dispose();
txtLow = null;
}
if(null != txtHigh) {
txtHigh.removeModifyListener(modifyListener);
txtHigh.removeKeyListener(numberKeyListener);
txtHigh.dispose();
txtHigh = null;
}
if(null != chkInclusive) {
chkInclusive.removeSelectionListener(selectionListener);
chkInclusive.dispose();
chkInclusive = null;
}
if(null != radInside) {
radInside.removeSelectionListener(selectionListener);
radInside.dispose();
radInside = null;
}
if(null != radOutside) {
radOutside.removeSelectionListener(selectionListener);
radOutside.dispose();
radOutside = null;
}
}
private final KeyListener numberKeyListener = new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
if((e.character >= ' ' && e.character <= '~')
&& (e.character > '9' || e.character < '0')) {
e.doit = false;
}
if(e.character == '.' && !((Text)e.widget).getText().contains(".")) { //$NON-NLS-1$
e.doit = true;
}
}
};
private Combo cboColumn;
private Text txtLow, txtHigh;
private Button chkInclusive;
private Button radInside, radOutside;
}