package com.iambookmaster.client.editor; import java.util.HashSet; import java.util.Iterator; import java.util.Set; import com.google.gwt.event.dom.client.ChangeEvent; import com.google.gwt.event.dom.client.ChangeHandler; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.user.client.Window; import com.google.gwt.user.client.ui.FlexTable; import com.google.gwt.user.client.ui.Image; import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.Widget; import com.iambookmaster.client.Images; import com.iambookmaster.client.Styles; import com.iambookmaster.client.beans.ObjectBean; import com.iambookmaster.client.common.SimpleObjectsListBox; import com.iambookmaster.client.locale.AppLocale; import com.iambookmaster.client.model.Model; import com.iambookmaster.client.model.ObjectListener; public class ObjectsList extends FlexTable implements ObjectListener{ private Model model; private Image addObject; private ChangeHandler changeListener; private SimpleObjectsListBox list; public ObjectsList(Model model) { this.model = model; setStyleName(Styles.BORDER); model.addObjectsListener(this); list = new SimpleObjectsListBox(model); addObject = new Image(Images.ADD_CONNECTION); addObject.addClickHandler(new ClickHandler() { public void onClick(ClickEvent event) { ObjectBean sel = list.getSelectedObject(); if (sel != null) { for (int i = 1; i < getRowCount(); i++) { Widget widget = getWidget(i, 0); if (widget instanceof ItemWidget) { ItemWidget itemWidget = (ItemWidget) widget; if (sel==itemWidget.object) { //already added return; } } } addObjectToList(sel); list.setSelectedIndex(0); } } }); list.addChangeHandler(new ChangeHandler(){ public void onChange(ChangeEvent event) { ObjectBean sel = list.getSelectedObject(); if (sel != null) { for (int i = 1; i < getRowCount(); i++) { Widget widget = getWidget(i, 0); if (widget instanceof ItemWidget) { ItemWidget itemWidget = (ItemWidget) widget; if (sel==itemWidget.object) { //already added list.setSelectedIndex(0); break; } } } } //in other cases - fire event changeListener.onChange(null); } }); addObject.setStyleName(Styles.CLICKABLE); addObject.setTitle(AppLocale.getAppConstants().titleAddObjectToList()); addControls(); } private void addControls() { insertRow(0); addCell(0); setWidget(0, 0, list); addCell(0); setWidget(0, 1, addObject); getColumnFormatter().setWidth(0, "99%"); getColumnFormatter().setWidth(1, "1%"); } public void addNewObject(ObjectBean object) { } public void refreshAll() { } public void select(ObjectBean object) { } public void unselect(ObjectBean object) { } public void update(ObjectBean object) { for (int i = 1; i < getRowCount(); i++) { Widget widget = getWidget(i, 0); if (widget instanceof ItemWidget) { ItemWidget itemWidget = (ItemWidget) widget; if (itemWidget.object==object) { itemWidget.refresh(); } } } } public HashSet<ObjectBean> getSelectedObjects() { HashSet<ObjectBean> res = new HashSet<ObjectBean>(); ObjectBean sel = list.getSelectedObject(); if (sel != null) { res.add(sel); } for (int i = 1; i < getRowCount(); i++) { Widget widget = getWidget(i, 0); if (widget instanceof ItemWidget) { ItemWidget itemWidget = (ItemWidget) widget; res.add(itemWidget.object); } } return res; } public void setSelectedObjects(Set<ObjectBean> selectedObject) { int s = selectedObject.size(); if (s==0) { while (getRowCount()>1) { removeRow(1); } list.setSelectedIndex(0); return; } HashSet<ObjectBean> curr = getSelectedObjects(); if (curr.containsAll(selectedObject)) { return; } else { while (getRowCount()>1) { removeRow(1); } //add other objects Iterator<ObjectBean> iterator = selectedObject.iterator(); list.setSelectedObject(iterator.next()); while (iterator.hasNext()) { addObjectToList(iterator.next()); } } } private void addObjectToList(ObjectBean bean) { ItemWidget widget = new ItemWidget(bean); int row = insertRow(1); addCell(row); setWidget(row, 0, widget); addCell(row); setWidget(row, 1, widget.removeButton); } protected void onDetach() { super.onDetach(); model.removeObjectsListener(this); } public void remove(ObjectBean object) { } public void addChangeHandler(ChangeHandler listener) { this.changeListener = listener; } private void removeObject(ItemWidget itemWidget) { for (int i = 1; i < getRowCount(); i++) { Widget widget = getWidget(i, 0); if (widget==itemWidget) { removeRow(i); changeListener.onChange(null); break; } } } public class ItemWidget extends Label implements ClickHandler { private Image removeButton; private ObjectBean object; public ItemWidget(ObjectBean object) { this.object = object; setWordWrap(false); removeButton = new Image(Images.REMOVE); removeButton.setTitle(AppLocale.getAppConstants().titleRemoveObjectFromList()); removeButton.addClickHandler(this); refresh(); } public void refresh() { if (model.getSettings().isShowParagraphNumbers()) { StringBuilder builder = new StringBuilder(); if (object.getKey() > 0) { builder.append('+'); } builder.append(object.getKey()); builder.append(' '); builder.append(object.getName()); setText(builder.toString()); } else { setText(object.getName()); } } public void onClick(ClickEvent event) { if (Window.confirm(AppLocale.getAppMessages().confirmRemoveObjectFromList(object.getName()))) { removeObject(this); } } } public void showInfo(ObjectBean object) { } }