/**
*
* Copyright (C) 2013 Vanderbilt University <csaba.toth, b.malin @vanderbilt.edu>
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package org.openempi.webapp.client.mvc.search;
import java.util.ArrayList;
import java.util.List;
import org.openempi.webapp.client.AppEvents;
import org.openempi.webapp.client.Constants;
import org.openempi.webapp.client.model.ModelPropertyWeb;
import org.openempi.webapp.client.model.PersonWeb;
import org.openempi.webapp.client.model.RealSearchCriteria;
import org.openempi.webapp.client.widget.ClientUtils;
import com.extjs.gxt.ui.client.Registry;
import com.extjs.gxt.ui.client.Style.HorizontalAlignment;
import com.extjs.gxt.ui.client.Style.LayoutRegion;
import com.extjs.gxt.ui.client.event.ButtonEvent;
import com.extjs.gxt.ui.client.event.SelectionListener;
import com.extjs.gxt.ui.client.mvc.AppEvent;
import com.extjs.gxt.ui.client.mvc.Controller;
import com.extjs.gxt.ui.client.mvc.View;
import com.extjs.gxt.ui.client.store.ListStore;
import com.extjs.gxt.ui.client.util.Margins;
import com.extjs.gxt.ui.client.widget.Info;
import com.extjs.gxt.ui.client.widget.LayoutContainer;
import com.extjs.gxt.ui.client.widget.Status;
import com.extjs.gxt.ui.client.widget.button.Button;
import com.extjs.gxt.ui.client.widget.form.ComboBox;
import com.extjs.gxt.ui.client.widget.form.FormPanel;
import com.extjs.gxt.ui.client.widget.form.TextField;
import com.extjs.gxt.ui.client.widget.form.ComboBox.TriggerAction;
import com.extjs.gxt.ui.client.widget.form.FormPanel.LabelAlign;
import com.extjs.gxt.ui.client.widget.grid.ColumnConfig;
import com.extjs.gxt.ui.client.widget.grid.ColumnModel;
import com.extjs.gxt.ui.client.widget.grid.Grid;
import com.extjs.gxt.ui.client.widget.layout.BorderLayout;
import com.extjs.gxt.ui.client.widget.layout.BorderLayoutData;
import com.extjs.gxt.ui.client.widget.layout.ColumnData;
import com.extjs.gxt.ui.client.widget.layout.ColumnLayout;
import com.extjs.gxt.ui.client.widget.layout.FitLayout;
import com.extjs.gxt.ui.client.widget.layout.FormData;
import com.extjs.gxt.ui.client.widget.layout.FormLayout;
import com.extjs.gxt.ui.client.widget.toolbar.FillToolItem;
import com.google.gwt.core.client.GWT;
public class RealSearchView extends View
{
private Grid<PersonWeb> grid;
private ListStore<PersonWeb> personStore = new ListStore<PersonWeb>();
private LayoutContainer container;
private LayoutContainer gridContainer;
private Status status;
private Button searchButton;
private ListStore<ModelPropertyWeb> attributeNameStore = new ListStore<ModelPropertyWeb>();
private ComboBox<ModelPropertyWeb> attributeNameCombo = new ComboBox<ModelPropertyWeb>();
private String tableName;
public RealSearchView(Controller controller) {
super(controller);
}
@SuppressWarnings("unchecked")
@Override
protected void handleEvent(AppEvent event) {
if (event.getType() == AppEvents.RealSearchView) {
grid = null;
initUI();
} else if (event.getType() == AppEvents.RealSearchRenderData) {
displayRecords((List<PersonWeb>) event.getData());
} else if (event.getType() == AppEvents.LeftDatasetColumnNamesArrived) {
List<ModelPropertyWeb> fieldNames = (List<ModelPropertyWeb>) event.getData();
reloadAttributeNameCombo(fieldNames);
} else if (event.getType() == AppEvents.LeftDatasetSelected) {
tableName = (String)event.getData();
}
}
private void reloadAttributeNameCombo(List<ModelPropertyWeb> columnNameModelPropertyList) {
String attributeName = ClientUtils.getSelectedStringOfComboBox(attributeNameCombo);
List<ModelPropertyWeb> attributeNames = columnNameModelPropertyList;
try {
attributeNameStore.removeAll();
attributeNameStore.add(attributeNames);
} catch (Exception e) {
Info.display("Message", e.getMessage());
}
if (attributeName != null) {
attributeNameCombo.select(new ModelPropertyWeb(attributeName));
}
}
private void displayRecords(List<PersonWeb> persons) {
if (grid == null) {
setupPersonGrid();
}
personStore.removeAll();
personStore.add(persons);
container.layout();
status.hide();
searchButton.unmask();
}
private void setupPersonGrid() {
List<ColumnConfig> configs = new ArrayList<ColumnConfig>();
ColumnConfig column = new ColumnConfig();
column.setId(PersonWeb.PERSON_ID);
column.setHeader("Person ID");
column.setWidth(100);
configs.add(column);
column = new ColumnConfig();
column.setId(PersonWeb.ATTRIBUTES);
column.setHeader("Attributes");
column.setWidth(800);
configs.add(column);
ColumnModel cm = new ColumnModel(configs);
grid = new Grid<PersonWeb>(personStore, cm);
grid.setStyleAttribute("borderTop", "none");
grid.setBorders(true);
grid.setStripeRows(true);
gridContainer.add(grid);
}
private void initUI() {
long time = new java.util.Date().getTime();
GWT.log("Initializing the UI ", null);
FormData formData = new FormData("100%");
container = new LayoutContainer();
container.setLayout(new BorderLayout());
FormPanel panel = new FormPanel();
panel.setFrame(true);
panel.setHeaderVisible(false);
panel.setLabelAlign(LabelAlign.TOP);
panel.setButtonAlign(HorizontalAlignment.CENTER);
panel.setBorders(true);
LayoutContainer main = new LayoutContainer();
main.setLayout(new ColumnLayout());
LayoutContainer left = new LayoutContainer();
left.setStyleAttribute("paddingRight", "10px");
FormLayout layout = new FormLayout();
layout.setLabelAlign(LabelAlign.TOP);
left.setLayout(layout);
final TextField<String> attributeValue = new TextField<String>();
attributeValue.setFieldLabel("Attribute Value");
left.add(attributeValue, formData);
LayoutContainer right = new LayoutContainer();
right.setStyleAttribute("paddingLeft", "10px");
layout = new FormLayout();
layout.setLabelAlign(LabelAlign.TOP);
right.setLayout(layout);
attributeNameCombo.setEmptyText("Select attribute...");
attributeNameCombo.setForceSelection(true);
attributeNameCombo.setDisplayField("name");
// attributeNameCombo.setWidth(150);
attributeNameCombo.setStore(attributeNameStore);
attributeNameCombo.setTypeAhead(true);
attributeNameCombo.setTriggerAction(TriggerAction.ALL);
attributeNameCombo.setFieldLabel("Attribute Name");
right.add(attributeNameCombo);
main.add(left, new ColumnData(.5));
main.add(right, new ColumnData(.5));
panel.add(main, new FormData("60%"));
searchButton = new Button("Search", new SelectionListener<ButtonEvent> () {
@Override
public void componentSelected(ButtonEvent ce) {
String attribName = ClientUtils.getSelectedStringOfComboBox(attributeNameCombo);
if (attribName == null) {
Info.display("Warning", "You must select/enter an attribute name before pressing the search button.");
return;
}
String attributValueString = attributeValue.getValue();
if (attributValueString == null) {
Info.display("Warning", "You must enter at least a partial attribute value before pressing the search button.");
return;
}
RealSearchCriteria searchCriteria = new RealSearchCriteria(attribName, attributValueString);
// Info.display("Information", "The basic search criteria is: " + searchCriteria);
List<Object> params = new ArrayList<Object>();
params.add(tableName);
params.add(searchCriteria);
controller.handleEvent(new AppEvent(AppEvents.RealSearchInitiate, params));
status.show();
searchButton.mask();
}
});
status = new Status();
status.setBusy("please wait...");
panel.getButtonBar().add(status);
status.hide();
panel.getButtonBar().add(new FillToolItem());
panel.getButtonBar().add(searchButton);
container.add(panel, new BorderLayoutData(LayoutRegion.NORTH, 39));
gridContainer = new LayoutContainer();
gridContainer.setBorders(true);
gridContainer.setLayout(new FitLayout());
BorderLayoutData data = new BorderLayoutData(LayoutRegion.CENTER);
data.setMargins(new Margins(80, 2, 2, 2));
container.add(gridContainer, data);
LayoutContainer wrapper = (LayoutContainer) Registry.get(Constants.CENTER_PANEL);
wrapper.removeAll();
wrapper.add(container);
wrapper.layout();
GWT.log("Done Initializing the UI in " + (new java.util.Date().getTime()-time), null);
}
}