package com.eas.grid;
import java.util.List;
import com.eas.ui.Orientation;
import com.eas.widgets.containers.AnchorsPanel;
import com.eas.widgets.containers.BoxPanel;
import com.eas.window.ToolsCaption;
import com.eas.window.WindowPanel;
import com.eas.window.WindowPopupPanel;
import com.google.gwt.core.client.JavaScriptObject;
import com.google.gwt.core.client.Scheduler;
import com.google.gwt.core.client.Scheduler.ScheduledCommand;
import com.google.gwt.core.shared.GWT;
import com.google.gwt.dom.client.Element;
import com.google.gwt.dom.client.Node;
import com.google.gwt.dom.client.Style;
import com.google.gwt.dom.client.TableCellElement;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.dom.client.KeyCodes;
import com.google.gwt.event.dom.client.KeyDownEvent;
import com.google.gwt.event.dom.client.KeyDownHandler;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.CheckBox;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.Widget;
import com.google.gwt.view.client.SetSelectionModel;
public class FindWindow extends WindowPanel {
protected static GridMessages messages = GWT.create(GridMessages.class);
private WindowPopupPanel popup = new WindowPopupPanel(this, true, false);
private Label label;
private TextBox field;
private CheckBox checkCase;
private CheckBox checkWhole;
private Button btnFind;
private Button closeButton;
private Grid<JavaScriptObject> grid;
private int row;
private int col;
public FindWindow(Grid<JavaScriptObject> aGrid) {
super();
popup.setResizable(false);
popup.setMinimizable(false);
popup.setMaximizable(false);
ToolsCaption caption = new ToolsCaption(this, messages.heading());
setCaptionWidget(caption);
grid = aGrid;
initComponents();
setSize(345, 95);
}
@Override
protected Widget getMovableTarget() {
return popup != null ? popup : this;
}
private void initComponents() {
label = new Label(messages.find());
field = new TextBox();
field.addKeyDownHandler(new KeyDownHandler() {
@Override
public void onKeyDown(KeyDownEvent event) {
if(event.getNativeKeyCode() == KeyCodes.KEY_ENTER){
findNext();
}
}
});
checkCase = new CheckBox();
checkCase.setText(messages.caseSensitive());
checkWhole = new CheckBox();
checkWhole.setText(messages.wholeWords());
btnFind = new Button(messages.findNext());
btnFind.setPixelSize(90, 25);
closeButton = new Button(messages.close());
closeButton.setPixelSize(90, 25);
btnFind.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
findNext();
}
});
closeButton.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
close();
}
});
BoxPanel findBox = new BoxPanel();
findBox.setOrientation(Orientation.VERTICAL);
findBox.setVgap(10);
BoxPanel settingsBox = new BoxPanel();
settingsBox.setHgap(10);
settingsBox.add(checkCase);
settingsBox.add(checkWhole);
findBox.add(field);
findBox.add(settingsBox);
AnchorsPanel anchors = new AnchorsPanel();
anchors.add(label);
anchors.setWidgetLeftWidth(label, 5, Style.Unit.PX, 40, Style.Unit.PX);
anchors.setWidgetTopHeight(label, 5, Style.Unit.PX, 20, Style.Unit.PX);
anchors.add(findBox);
anchors.setWidgetLeftWidth(findBox, 60, Style.Unit.PX, 280, Style.Unit.PX);
anchors.setWidgetTopHeight(findBox, 5, Style.Unit.PX, 50, Style.Unit.PX);
anchors.add(btnFind);
anchors.setWidgetRightWidth(btnFind, 5, Style.Unit.PX, 75, Style.Unit.PX);
anchors.setWidgetTopHeight(btnFind, 65, Style.Unit.PX, 25, Style.Unit.PX);
anchors.add(closeButton);
anchors.setWidgetRightWidth(closeButton, 85, Style.Unit.PX, 75, Style.Unit.PX);
anchors.setWidgetTopHeight(closeButton, 65, Style.Unit.PX, 25, Style.Unit.PX);
setWidget(anchors);
}
public boolean findNext() {
List<JavaScriptObject> data = grid.getDataProvider().getList();
boolean caseSensitive = checkCase.getValue();
boolean wholeString = checkWhole.getValue();
String findText = field.getText();
if (findText.isEmpty()) {
return false;
}
if (!caseSensitive) {
findText = findText.toLowerCase();
}
if (row >= data.size()) {
row = 0;
col = 0;
} else {
col++;
if (row < 0) {
row = 0;
col = 0;
}
if (col >= grid.getDataColumnCount()) {
col = 0;
row++;
}
}
for (; row < data.size(); row++) {
for (; col < grid.getDataColumnCount(); col++) {
if (findInnerText(grid.getViewCell(row, col), findText, caseSensitive, wholeString)) {
selectCell(row, col);
return true;
}
}
col = 0;
}
// AlertMessageBox alert = new AlertMessageBox(messages.heading(),
// messages.endSearch());
// alert.show();
Window.alert(messages.endSearch());
return false;
}
private boolean findInnerText(Node aNode, String aFindText, boolean aCaseSensitive, boolean aWholeString) {
if (aNode != null) {
int cnt = aNode.getChildCount();
if (cnt == 0) {
if (aNode instanceof Element) {
Element element = (Element) aNode;
String cellText = element.getInnerText();
if (!aCaseSensitive) {
cellText = cellText.toLowerCase();
}
if (aWholeString) {
return cellText.equals(aFindText);
} else {
return cellText.contains(aFindText);
}
}
} else {
for (int i = 0; i < cnt; i++) {
if (findInnerText(aNode.getChild(i), aFindText, aCaseSensitive, aWholeString)) {
return true;
}
}
}
}
return false;
}
private void selectCell(int aRow, int aCol) {
List<JavaScriptObject> data = grid.getDataProvider().getList();
if (grid.getSelectionModel() instanceof SetSelectionModel) {
SetSelectionModel<JavaScriptObject> ssm = (SetSelectionModel<JavaScriptObject>) grid.getSelectionModel();
ssm.clear();
ssm.setSelected(data.get(aRow), true);
}
TableCellElement cell = grid.getViewCell(aRow, aCol);
if (cell != null) {
cell.scrollIntoView();
//grid.focusViewCell(aRow, aCol);// this call leads to cell editing in subsequent enter hit
}
}
public void show() {
row = 0;
col = 0;
popup.center();
activate();
Scheduler.get().scheduleDeferred(new ScheduledCommand() {
@Override
public void execute() {
field.setFocus(true);
}
});
}
}