/*******************************************************************************
* Copyright (c) 2004, 2007 Boeing.
* 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:
* Boeing - initial API and implementation
*******************************************************************************/
package org.eclipse.nebula.widgets.xviewer.customize;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.eclipse.nebula.widgets.xviewer.XViewer;
import org.eclipse.nebula.widgets.xviewer.XViewerText;
import org.eclipse.nebula.widgets.xviewer.util.internal.XViewerLib;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.KeyListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Text;
/**
* Provides UI for displaying/entering search string
*
* @author Andrew M. Finkbeiner
*/
public class SearchDataUI {
private Text searchText;
private final XViewer xViewer;
private Matcher match;
private boolean search = false;
private Button regularExpression;
private boolean regex;
private final boolean searchRealTime;
public SearchDataUI(XViewer xViewer, boolean searchRealTime) {
this.xViewer = xViewer;
this.searchRealTime = searchRealTime;
}
public void createWidgets(Composite bar) {
// ExpandBar bar = new ExpandBar(comp, SWT.V_SCROLL);
Label label = new Label(bar, SWT.NONE);
label.setText(XViewerText.get("SearchDataUI.prompt")); //$NON-NLS-1$
label.setToolTipText(XViewerText.get("SearchDataUI.prompt.tooltip")); //$NON-NLS-1$
GridData gd = new GridData(SWT.RIGHT, SWT.NONE, false, false);
label.setLayoutData(gd);
searchText = new Text(bar, SWT.SINGLE | SWT.BORDER);
gd = new GridData(SWT.RIGHT, SWT.NONE, false, false);
gd.widthHint = 100;
searchText.setLayoutData(gd);
searchText.addKeyListener(new KeyListener() {
@Override
public void keyPressed(KeyEvent e) {
// do nothing
}
@Override
public void keyReleased(KeyEvent e) {
// System.out.println(e.keyCode);
if (e.keyCode == SWT.CR || e.keyCode == SWT.KEYPAD_CR || searchRealTime) {
// xViewer.getCustomizeMgr().setSearchText(searchText.getText());
String newText = searchText.getText();
if (newText.trim().length() == 0) {
search = false;
match = Pattern.compile(searchText.getText()).matcher(""); //$NON-NLS-1$
} else {
regex = true;
if (!regularExpression.getSelection()) {
regex = false;
newText = newText.replace("*", ".*"); //$NON-NLS-1$ //$NON-NLS-2$
newText = ".*" + newText + ".*"; //$NON-NLS-1$ //$NON-NLS-2$
}
match =
Pattern.compile(newText, Pattern.CASE_INSENSITIVE | Pattern.DOTALL | Pattern.MULTILINE).matcher(""); //$NON-NLS-1$
search = true;
}
xViewer.refresh();
}
}
});
Label searchLabel = new Label(bar, SWT.NONE);
searchLabel.setLayoutData(new GridData(SWT.RIGHT, SWT.NONE, false, false));
searchLabel.setImage(XViewerLib.getImage("clear.gif")); //$NON-NLS-1$
regularExpression = new Button(bar, SWT.CHECK);
regularExpression.setText(XViewerText.get("regex.prompt")); //$NON-NLS-1$
regularExpression.setToolTipText(XViewerText.get("regex.prompt.tooltip")); //$NON-NLS-1$
regularExpression.setLayoutData(new GridData(SWT.RIGHT, SWT.NONE, false, false));
searchLabel.addListener(SWT.MouseUp, new Listener() {
@Override
public void handleEvent(Event event) {
searchText.setText(""); //$NON-NLS-1$
search = false;
match = Pattern.compile(searchText.getText()).matcher(""); //$NON-NLS-1$
xViewer.refresh();
}
});
}
public void clear() {
searchText.setText(""); //$NON-NLS-1$
xViewer.getCustomizeMgr().setFilterText("", false); //$NON-NLS-1$
}
public void appendToStatusLabel(StringBuffer sb) {
if (searchText != null && !searchText.getText().equals("")) { //$NON-NLS-1$
sb.append(XViewerText.get("SearchDataUI.status")); //$NON-NLS-1$
}
}
public boolean match(String textString) {
if (search) {
if (regex) {
match.reset(textString);
return match.matches();
} else {
match.reset(textString);
return match.matches();
}
} else {
return false;
}
}
public boolean isSearch() {
return search;
}
}