/**
* Copyright (C) 2014 JBoss Inc
*
* 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.dashbuilder.renderer.selector.client;
import java.util.List;
import com.google.gwt.dom.client.NodeList;
import com.google.gwt.dom.client.OptionElement;
import com.google.gwt.dom.client.SelectElement;
import com.google.gwt.event.dom.client.ChangeEvent;
import com.google.gwt.event.dom.client.ChangeHandler;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.ListBox;
import com.google.gwt.user.client.ui.Widget;
import org.dashbuilder.common.client.StringUtils;
import org.dashbuilder.dataset.DataSet;
import org.dashbuilder.dataset.client.DataSetReadyCallback;
import org.dashbuilder.displayer.DisplayerSettingsColumn;
import org.dashbuilder.displayer.client.AbstractDisplayer;
import org.dashbuilder.renderer.selector.client.resources.i18n.SelectorConstants;
public class SelectorDisplayer extends AbstractDisplayer {
protected FlowPanel panel = new FlowPanel();
ListBox listBox = null;
protected boolean drawn = false;
protected DataSet dataSet = null;
public SelectorDisplayer() {
initWidget(panel);
}
public void draw() {
if ( !drawn ) {
drawn = true;
if ( displayerSettings == null ) {
displayMessage( "ERROR: DisplayerSettings property not set" );
} else if ( dataSetHandler == null ) {
displayMessage( "ERROR: DataSetHandler property not set" );
} else {
try {
String initMsg = SelectorConstants.INSTANCE.selectorDisplayer_initializing();
if (!StringUtils.isBlank(displayerSettings.getTitle())) initMsg += " '" + displayerSettings.getTitle() + "'";
displayMessage(initMsg + " ...");
dataSetHandler.lookupDataSet(new DataSetReadyCallback() {
public void callback(DataSet result) {
dataSet = result;
Widget w = createSelector();
panel.clear();
panel.add(w);
// Set the id of the container panel so that the displayer can be easily located
// by testing tools for instance.
String id = getDisplayerId();
if (!StringUtils.isBlank(id)) {
panel.getElement().setId(id);
}
}
public void notFound() {
displayMessage("ERROR: Data set not found.");
}
});
} catch ( Exception e ) {
displayMessage( "ERROR: " + e.getMessage() );
}
}
}
}
public void redraw() {
if (!drawn) {
draw();
} else {
try {
dataSetHandler.lookupDataSet(new DataSetReadyCallback() {
public void callback(DataSet result) {
dataSet = result;
populateSelector();
}
public void notFound() {
displayMessage("ERROR: Data set not found.");
}
});
} catch ( Exception e ) {
displayMessage( "ERROR: " + e.getMessage() );
}
}
}
/**
* Clear the current display and show a notification message.
*/
public void displayMessage(String msg) {
panel.clear();
Label label = new Label();
panel.add(label);
label.setText(msg);
}
protected Widget createSelector() {
listBox = new ListBox();
populateSelector();
// Catch list selections
listBox.addChangeHandler(new ChangeHandler() {
public void onChange(ChangeEvent event) {
// Reset the current filter (if any)
String firstColumnId = getColumnId(dataSet, 0);
List<String> currentFilter = filterValues(firstColumnId);
if (currentFilter != null && !currentFilter.isEmpty()) {
filterReset();
}
// Filter by the selected value (if any)
int index = listBox.getSelectedIndex();
if (index > 0) {
filterUpdate(firstColumnId, listBox.getValue(index));
}
}
});
return listBox;
}
protected void populateSelector() {
listBox.clear();
final String firstColumnId = getColumnId(dataSet, 0);
final String firstColumnName = getColumnName(dataSet, 0);
listBox.addItem("- Select " + firstColumnName + " -");
SelectElement selectElement = SelectElement.as(listBox.getElement());
NodeList<OptionElement> options = selectElement.getOptions();
// Generate the list entries from the current data set
List<String> currentFilter = filterValues(firstColumnId);
for (int i = 0; i < dataSet.getRowCount(); i++) {
String value = dataSet.getValueAt(i, firstColumnId).toString();
listBox.addItem(value);
if (currentFilter != null && currentFilter.contains(value)) {
listBox.setSelectedIndex(i+1);
}
// Generate an option tooltip (only if extra data set columns are defined)
int ncolumns = getNumberOfColumns(dataSet);
if (ncolumns > 1) {
StringBuilder out = new StringBuilder();
for (int j = 1; j < ncolumns; j++) {
String extraColumnId = getColumnId(dataSet, j);
String extraColumnName = getColumnName(dataSet, j);
Object extraValue = dataSet.getValueAt(i, extraColumnId);
if (j > 1) out.append(" ");
out.append(extraColumnName).append("=").append(extraValue.toString());
}
options.getItem(i+1).setTitle(out.toString());
}
}
}
protected int getNumberOfColumns(DataSet dataSet) {
List<DisplayerSettingsColumn> columnSettingsList = displayerSettings.getColumnList();
if (!columnSettingsList.isEmpty()) return columnSettingsList.size();
return dataSet.getColumns().size();
}
protected String getColumnId(DataSet dataSet, int index) {
List<DisplayerSettingsColumn> columnSettingsList = displayerSettings.getColumnList();
if (index < columnSettingsList.size()) {
DisplayerSettingsColumn settingsColumn = columnSettingsList.get(index);
if (settingsColumn.getColumnId() != null) return settingsColumn.getColumnId();
}
int ncolumns = dataSet.getColumns().size();
if (index < ncolumns) {
return dataSet.getColumnByIndex(index).getId();
}
throw new IndexOutOfBoundsException("Index " + index + " is greater than " +
"the number of columns in the data set " + ncolumns);
}
protected String getColumnName(DataSet dataSet, int index) {
List<DisplayerSettingsColumn> columnSettingsList = displayerSettings.getColumnList();
if (index < columnSettingsList.size()) {
return columnSettingsList.get(index).getDisplayName();
}
int ncolumns = dataSet.getColumns().size();
if (index < ncolumns) {
return dataSet.getColumnByIndex(index).getId();
}
throw new IndexOutOfBoundsException("Index " + index + " is greater than " +
"the number of columns in the data set " + ncolumns);
}
}