package com.github.gwtbootstrap.client.ui.incubator;
import com.github.gwtbootstrap.client.ui.Button;
import com.github.gwtbootstrap.client.ui.Label;
import com.github.gwtbootstrap.client.ui.ListBox;
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.uibinder.client.UiHandler;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.VerticalPanel;
import java.util.ArrayList;
import java.util.List;
/**
*
* Usage Example:<br/>
* <ul><li>
* Put following code into your ui.xml file:<br/>
* <code>
* <bi:PickList ui:field="pickList" />
* </code><br/><br/>
*
* </li><li>
* Populate your picklist using {@link NameValuePairImpl}:<br/>
* <code>
* List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();<br/>
* nameValuePairs.add(new NameValuePairImpl("item 1", "item_1"));<br/>
* nameValuePairs.add(new NameValuePairImpl("item 2", "item_2"));<br/>
* nameValuePairs.add(new NameValuePairImpl("item 3", "item_3"));<br/>
* pickList.setLeftListElements(nameValuePairs);
* pickList.setRightListElements(nameValuePairs);
* </code><br/>
* </li></ul>
*
* Screenshot:
* <br/>
* <img src="http://gamenism.com/gwt/picklist.png"/>
* <br/>
*
* User: Halil Karakose
* Date: 10/18/13
* Time: 3:53 PM
*
* @see NameValuePairImpl
*/
public class PickList extends Composite {
private static PickListUiBinder ourUiBinder = GWT.create(PickListUiBinder.class);
@UiField
VerticalPanel leftPanel;
@UiField
VerticalPanel rightPanel;
@UiField
VerticalPanel buttonPanel;
@UiField
Button toRightButton;
@UiField
Button toLeftButton;
@UiField
ListBox leftList;
@UiField
ListBox rightList;
@UiField
Label rightPanelLabel;
@UiField
Label leftPanelLabel;
public PickList() {
initWidget(ourUiBinder.createAndBindUi(this));
//set padding between cells to make the component look better
this.getElement().setAttribute("cellpadding", "1");
leftPanel.getElement().setAttribute("cellpadding", "1");
buttonPanel.getElement().setAttribute("cellpadding", "1");
rightPanel.getElement().setAttribute("cellpadding", "1");
setLeftListElements(new ArrayList<NameValuePair>());
setRightListElements(new ArrayList<NameValuePair>());
}
public void clearLeftList() {
clear(leftList);
}
public void clearRightList() {
clear(rightList);
}
private void clear(ListBox listBox) {
listBox.clear();
}
public void addElementToLeftList(NameValuePair element) {
addElement(leftList, element);
}
public void addElementToRightList(NameValuePair element) {
addElement(rightList, element);
}
private void addElement(ListBox listBox, NameValuePair element) {
listBox.addItem(element.name(), element.value());
}
public List<NameValuePair> getLeftListElements() {
return getListBoxElements(leftList);
}
public void setLeftListElements(List<NameValuePair> elements) {
populate(elements, leftList);
}
public List<NameValuePair> getRightListElements() {
return getListBoxElements(rightList);
}
public void setRightListElements(List<NameValuePair> elements) {
populate(elements, rightList);
}
public String getSelectedLabelText() {
return rightPanelLabel.getText();
}
public void setSelectedLabelText(String selectedLabelText) {
rightPanelLabel.setText(selectedLabelText);
}
public String getCandidateLabelText() {
return leftPanelLabel.getText();
}
public void setCandidateLabelText(String selectedLabelText) {
leftPanelLabel.setText(selectedLabelText);
}
private List<NameValuePair> getListBoxElements(ListBox listBox) {
ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
for (int i = 0; i < listBox.getItemCount(); i++) {
NameValuePairImpl nameValuePair = new NameValuePairImpl(listBox.getItemText(i), listBox.getValue(i));
nameValuePairs.add(nameValuePair);
}
return nameValuePairs;
}
private void populate(List<NameValuePair> leftListElements, ListBox listBox) {
for (NameValuePair element : leftListElements) {
listBox.addItem(element.name(), element.value());
}
}
@UiHandler("toRightButton")
public void toRightButtonClicked(ClickEvent event) {
moveItem(leftList, rightList, event);
if (leftList.getItemCount() == 0) {
toRightButton.setEnabled(false);
}
if (rightList.getItemCount() >= 1) { // !>= 1! is preferred instead of !== 1! to handle multiple selections
toLeftButton.setEnabled(true);
}
}
@UiHandler("toLeftButton")
public void toLeftButtonClicked(ClickEvent event) {
moveItem(rightList, leftList, event);
if (rightList.getItemCount() == 0) {
toLeftButton.setEnabled(false);
}
if (leftList.getItemCount() >= 1) { // !>= 1! is preferred instead of !== 1! to handle multiple selections
toRightButton.setEnabled(true);
}
}
private void moveItem(ListBox from, ListBox to, ClickEvent event) {
String value = from.getValue();
if (value == null) {
Window.alert("Select an item first!");
return;
}
int itemIndex = from.getSelectedIndex();
String item = from.getItemText(itemIndex);
GWT.log("value: " + value + "\n"
+ "selected index: " + itemIndex + "\n"
+ "selected text: " + item);
to.addItem(item, value);
from.removeItem(itemIndex);
if (from.getItemCount() > itemIndex) {
from.setSelectedIndex(itemIndex);
} else if (from.getItemCount() > 0) {
from.setSelectedIndex(itemIndex-1); //enters here when last item in the list is removed
}
}
interface PickListUiBinder extends UiBinder<HorizontalPanel, PickList> {
}
}