package com.iambookmaster.client.editor; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.Iterator; import java.util.List; 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.CheckBox; import com.google.gwt.user.client.ui.FlexTable; import com.google.gwt.user.client.ui.HTML; 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.AbstractParameter; import com.iambookmaster.client.beans.NPC; import com.iambookmaster.client.beans.NPCParams; import com.iambookmaster.client.beans.ObjectBean; import com.iambookmaster.client.common.NumberTextBox; import com.iambookmaster.client.common.SimpleAbstractParameterListBox; import com.iambookmaster.client.locale.AppConstants; import com.iambookmaster.client.locale.AppLocale; import com.iambookmaster.client.locale.AppMessages; import com.iambookmaster.client.model.Model; import com.iambookmaster.client.model.ParameterListener; public class NPCList extends FlexTable { private static final AppConstants constants = AppLocale.getAppConstants(); private static final AppMessages messages = AppLocale.getAppMessages(); private Model model; private Image addObject; private ChangeHandler changeListener; private SimpleAbstractParameterListBox<NPC> list; private ParameterListener listener; private CheckBox fightTogether; public NPCList(Model model) { this.model = model; setStyleName(Styles.BORDER); listener = new ParameterListener() { public void addNewParameter(AbstractParameter parameter) { } public void refreshAll() { } public void remove(AbstractParameter parameter) { } public void select(AbstractParameter parameter) { } public void update(AbstractParameter parameter) { for (int i = 1; i < getRowCount(); i++) { Widget widget = getWidget(i, 0); if (widget instanceof ItemWidget) { ItemWidget itemWidget = (ItemWidget) widget; if (itemWidget.object.getNpc()==parameter) { itemWidget.refresh(); } } } } public void showInfo(AbstractParameter parameter) { } }; model.addParamaterListener(listener); list = new SimpleAbstractParameterListBox<NPC>(NPC.class,model,true); list.addChangeHandler(new ChangeHandler(){ public void onChange(ChangeEvent event) { //in other cases - fire event changeListener.onChange(null); } }); addObject = new Image(Images.ADD_CONNECTION); addObject.addClickHandler(new ClickHandler() { public void onClick(ClickEvent event) { NPC sel = list.getSelectedParameter(); if (sel != null) { addObjectToList(new NPCParams(sel)); list.setSelectedIndex(0); fireUpdate(); } } }); addObject.setStyleName(Styles.CLICKABLE); addObject.setTitle(constants.titleAddObjectToList()); fightTogether = new CheckBox(); fightTogether.setTitle(constants.ParagraphEditorFightTogether()); fightTogether.addClickHandler(new ClickHandler() { public void onClick(ClickEvent event) { fireUpdate(); } }); addControls(); } private void addControls() { insertRow(0); addCell(0); setWidget(0, 0, list); addCell(0); setWidget(0, 1, addObject); addCell(0); setWidget(0, 2, fightTogether); addCell(0); setWidget(0, 3, new HTML(" ")); getColumnFormatter().setWidth(0, "99%"); getColumnFormatter().setWidth(1, "1%"); getColumnFormatter().setWidth(2, "1%"); getColumnFormatter().setWidth(3, "1%"); } public ArrayList<NPCParams> getSelectedNPCs() { ArrayList<NPCParams> res = new ArrayList<NPCParams>(); NPC sel = list.getSelectedParameter(); // 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); } } if (res.size()>1) { Collections.sort(res,new Comparator<NPCParams>() { public int compare(NPCParams o1, NPCParams o2) { if (o1.getRound()==o2.getRound()) { if (o1.isFriend()==o2.isFriend()) { return o1.getNpc().getName().compareTo(o2.getNpc().getName()); } else if (o1.isFriend()){ return -1; } else { return 1; } } else { return o1.getRound()-o2.getRound(); } } }); } return res; } public void setSelectedObjects(List<NPCParams> selectedObject) { if (selectedObject == null || selectedObject.size()==0) { while (getRowCount()>1) { removeRow(1); } list.setSelectedIndex(0); return; } ArrayList<NPCParams> curr = getSelectedNPCs(); if ((curr.size()==0 && selectedObject.size()==0) || curr.equals(selectedObject)) { return; } else { while (getRowCount()>1) { removeRow(1); } //add other objects Iterator<NPCParams> iterator = selectedObject.iterator(); while (iterator.hasNext()) { addObjectToList(iterator.next()); } } } private void addObjectToList(NPCParams bean) { ItemWidget widget = new ItemWidget(bean); int row = insertRow(getRowCount()); addCell(row); setWidget(row, 0, widget); addCell(row); setWidget(row, 1, widget.rounds); addCell(row); setWidget(row, 2, widget.friend); addCell(row); setWidget(row, 3, widget.removeButton); } protected void onDetach() { super.onDetach(); model.removeParamaterListener(listener); } 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); fireUpdate(); break; } } } public class ItemWidget extends Label implements ClickHandler,ChangeHandler { private Image removeButton; private NPCParams object; private NumberTextBox rounds; private CheckBox friend; public ItemWidget(NPCParams object) { this.object = object; setWordWrap(false); rounds = new NumberTextBox(); rounds.setRange(0,99); rounds.setVisibleLength(2); rounds.setMaxLength(2); rounds.addChangeHandler(this); rounds.setTitle(constants.paragraphEditorEnemyRoundsTitle()); friend = new CheckBox(); friend.addClickHandler(this); friend.setTitle(constants.paragraphEditorEnemyFriendTitle()); removeButton = new Image(Images.REMOVE); removeButton.setTitle(constants.titleRemoveObjectFromList()); removeButton.addClickHandler(this); refresh(); } public void refresh() { setText(object.getNpc().getName()); friend.setValue(object.isFriend()); rounds.setValue(object.getRound()); } public void onClick(ClickEvent event) { if (event.getSource()==removeButton) { if (Window.confirm(messages.confirmRemoveNPCFromList(object.getNpc().getName()))) { removeObject(this); } } else if (event.getSource()==friend) { object.setFriend(friend.getValue()); fireUpdate(); } } public void onChange(ChangeEvent event) { if (event.getSource()==rounds) { object.setRound(rounds.getIntegerValue()); fireUpdate(); } } } public void showInfo(ObjectBean object) { } public void fireUpdate() { changeListener.onChange(null); } public boolean isFightTogether() { return fightTogether.getValue()==false; } public void setFightTogether(boolean fightTogether) { this.fightTogether.setValue(fightTogether==false); } }