blob: 155ccf31dd617abde027b64c4ee69508a713a6eb [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2011, 2015 Wind River Systems, Inc. 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:
* Wind River Systems - initial API and implementation
*******************************************************************************/
package org.eclipse.tcf.te.tcf.filesystem.ui.internal.search;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
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.Label;
import org.eclipse.swt.widgets.Text;
import org.eclipse.tcf.te.tcf.filesystem.core.interfaces.runtime.IFSTreeNode;
import org.eclipse.tcf.te.tcf.filesystem.ui.nls.Messages;
import org.eclipse.tcf.te.ui.controls.BaseEditBrowseTextControl;
import org.eclipse.tcf.te.ui.search.TreeViewerSearchDialog;
/**
* The searchable that provides a UI to collect and test
* the size of a file during searching.
*/
public class FSSizeSearchable extends FSBaseSearchable {
// Constant values of size options
private static final int OPTION_NOT_REMEMBER = 0;
private static final int OPTION_SIZE_SMALL = 1;
private static final int OPTION_SIZE_MEDIUM = 2;
private static final int OPTION_SIZE_LARGE = 3;
private static final int OPTION_SIZE_SPECIFIED = 4;
// Constant values of different size unit, used for matching purpose.
private static final long KB = 1024;
private static final long MB = 1024 * KB;
private static final long SIZE_SMALL = 100 * KB;
private static final long SIZE_MEDIUM = 1*MB;
// The choice selected
private int choice;
// The lower bound of size
private int lowerSize;
// The upper bound of size
private int upperSize;
// UI elements for input
private Button fBtnSizeNotRem;
private Button fBtnSizeSmall;
private Button fBtnSizeMedium;
private Button fBtnSizeLarge;
private Button fBtnSizeSpecified;
private BaseEditBrowseTextControl txtSizeFrom;
private BaseEditBrowseTextControl txtSizeTo;
/* (non-Javadoc)
* @see org.eclipse.tcf.te.ui.utils.AbstractSearchable#createAdvancedPart(org.eclipse.tcf.te.ui.search.TreeViewerSearchDialog, org.eclipse.swt.widgets.Composite)
*/
@Override
public void createAdvancedPart(TreeViewerSearchDialog dialog, Composite parent) {
SelectionListener l = new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
optionChecked(e);
}
};
Composite sizeComp = createSection(parent, Messages.FSSizeSearchable_WhatSize);
sizeComp.setLayout(new GridLayout(5, false));
fBtnSizeNotRem = new Button(sizeComp, SWT.RADIO);
fBtnSizeNotRem.setText(Messages.FSSizeSearchable_DontRemember);
fBtnSizeNotRem.setSelection(true);
GridData data = new GridData();
data.horizontalSpan = 5;
fBtnSizeNotRem.setLayoutData(data);
fBtnSizeNotRem.addSelectionListener(l);
fBtnSizeSmall = new Button(sizeComp, SWT.RADIO);
fBtnSizeSmall.setText(Messages.FSSizeSearchable_Small);
data = new GridData();
data.horizontalSpan = 5;
fBtnSizeSmall.setLayoutData(data);
fBtnSizeSmall.addSelectionListener(l);
fBtnSizeMedium = new Button(sizeComp, SWT.RADIO);
fBtnSizeMedium.setText(Messages.FSSizeSearchable_Medium);
data = new GridData();
data.horizontalSpan = 5;
fBtnSizeMedium.setLayoutData(data);
fBtnSizeMedium.addSelectionListener(l);
fBtnSizeLarge = new Button(sizeComp, SWT.RADIO);
fBtnSizeLarge.setText(Messages.FSSizeSearchable_Large);
data = new GridData();
data.horizontalSpan = 5;
fBtnSizeLarge.setLayoutData(data);
fBtnSizeLarge.addSelectionListener(l);
fBtnSizeSpecified = new Button(sizeComp, SWT.RADIO);
fBtnSizeSpecified.setText(Messages.FSSizeSearchable_SpecifySize);
data = new GridData();
fBtnSizeSpecified.setLayoutData(data);
fBtnSizeSpecified.addSelectionListener(l);
Composite cmpFrom = new Composite(sizeComp, SWT.NONE);
GridLayout layout = new GridLayout(2, false);
layout.marginWidth = 0;
layout.marginHeight = 0;
layout.horizontalSpacing = 0;
layout.verticalSpacing = 0;
cmpFrom.setLayout(layout);
data = new GridData();
cmpFrom.setLayoutData(data);
txtSizeFrom = new BaseEditBrowseTextControl(null);
txtSizeFrom.setIsGroup(false);
txtSizeFrom.setHasHistory(false);
txtSizeFrom.setHideBrowseButton(true);
txtSizeFrom.setParentControlIsInnerPanel(true);
txtSizeFrom.setupPanel(cmpFrom);
txtSizeFrom.setEnabled(false);
txtSizeFrom.setEditFieldValidator(new SizeValidator());
Text text = (Text) txtSizeFrom.getEditFieldControl();
text.addModifyListener(new ModifyListener() {
@Override
public void modifyText(ModifyEvent e) {
sizeModified();
}
});
Label label = new Label(sizeComp, SWT.NONE);
label.setText(Messages.FSSizeSearchable_ToText);
Composite cmpTo = new Composite(sizeComp, SWT.NONE);
layout = new GridLayout(2, false);
layout.marginWidth = 0;
layout.marginHeight = 0;
layout.horizontalSpacing = 0;
layout.verticalSpacing = 0;
cmpTo.setLayout(layout);
data = new GridData();
cmpTo.setLayoutData(data);
txtSizeTo = new BaseEditBrowseTextControl(null);
txtSizeTo.setIsGroup(false);
txtSizeTo.setHasHistory(false);
txtSizeTo.setHideBrowseButton(true);
txtSizeTo.setParentControlIsInnerPanel(true);
txtSizeTo.setupPanel(cmpTo);
txtSizeTo.setEnabled(false);
txtSizeTo.setEditFieldValidator(new SizeValidator());
text = (Text) txtSizeTo.getEditFieldControl();
text.addModifyListener(new ModifyListener() {
@Override
public void modifyText(ModifyEvent e) {
sizeModified();
}
});
label = new Label(sizeComp, SWT.NONE);
label.setText(Messages.FSSizeSearchable_KBS);
}
/**
* The modified event of the size fields.
*/
protected void sizeModified() {
fireOptionChanged();
}
/*
* (non-Javadoc)
* @see org.eclipse.tcf.te.ui.utils.AbstractSearchable#isInputValid()
*/
@Override
public boolean isInputValid() {
if(choice == OPTION_SIZE_SPECIFIED && txtSizeFrom != null && txtSizeTo != null) {
boolean vFrom = txtSizeFrom.isValid();
boolean vTo = txtSizeTo.isValid();
if(vFrom) {
String fromText = txtSizeFrom.getEditFieldControlText();
this.lowerSize = Integer.parseInt(fromText);
}
if(vTo) {
String toText = txtSizeTo.getEditFieldControlText();
this.upperSize = Integer.parseInt(toText);
}
return vFrom && vTo;
}
return true;
}
/**
* The method handling the selection event.
*
* @param e The selection event.
*/
protected void optionChecked(SelectionEvent e) {
Object src = e.getSource();
boolean specified = false;
if(src == fBtnSizeNotRem) {
choice = OPTION_NOT_REMEMBER;
}
else if(src == fBtnSizeSmall) {
choice = OPTION_SIZE_SMALL;
}
else if(src == fBtnSizeMedium) {
choice = OPTION_SIZE_MEDIUM;
}
else if(src == fBtnSizeLarge) {
choice = OPTION_SIZE_LARGE;
}
else if(src == fBtnSizeSpecified) {
choice = OPTION_SIZE_SPECIFIED;
specified = true;
}
if (txtSizeFrom != null) txtSizeFrom.setEnabled(specified);
if (txtSizeTo != null) txtSizeTo.setEnabled(specified);
fireOptionChanged();
}
/*
* (non-Javadoc)
* @see org.eclipse.tcf.te.ui.interfaces.ISearchMatcher#match(java.lang.Object)
*/
@Override
public boolean match(Object element) {
if (element instanceof IFSTreeNode) {
IFSTreeNode node = (IFSTreeNode) element;
switch (choice) {
case OPTION_NOT_REMEMBER:
return true;
case OPTION_SIZE_SMALL:
return node.getSize() <= SIZE_SMALL;
case OPTION_SIZE_MEDIUM:
return node.getSize() <= SIZE_MEDIUM;
case OPTION_SIZE_LARGE:
return node.getSize() > SIZE_MEDIUM;
case OPTION_SIZE_SPECIFIED:
return node.getSize() >= lowerSize && node.getSize() < upperSize;
}
}
return false;
}
}