package com.iambookmaster.client.quick;
import java.util.ArrayList;
import java.util.HashMap;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.DOM;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.HasVerticalAlignment;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Image;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.Tree;
import com.google.gwt.user.client.ui.TreeItem;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.iambookmaster.client.Images;
import com.iambookmaster.client.Styles;
import com.iambookmaster.client.beans.AbstractParameter;
import com.iambookmaster.client.beans.Alchemy;
import com.iambookmaster.client.beans.Battle;
import com.iambookmaster.client.beans.Modificator;
import com.iambookmaster.client.beans.NPC;
import com.iambookmaster.client.beans.Parameter;
import com.iambookmaster.client.common.ScrollContainer;
import com.iambookmaster.client.editor.ModelPersist;
import com.iambookmaster.client.locale.AppConstants;
import com.iambookmaster.client.locale.AppLocale;
import com.iambookmaster.client.model.Model;
import com.iambookmaster.client.model.ParameterListener;
public class ModelsTree extends ScrollContainer {
private AppConstants appConstants = AppLocale.getAppConstants();
private HashMap<AbstractParameter,AbstractParameterWidget> widgets;
private Tree tree;
private ModelPersist model;
// private ObjectWidget selected;
private boolean activationNeed=true;
private TreeItem npcItem;
private TreeItem parametersItem;
private TreeItem battlesItem;
private TreeItem modificatorsItem;
private TreeItem alchemyItem;
private ParameterListener listener;
public void activate() {
if (activationNeed) {
activationNeed = false;
resetHeight();
}
}
public void activateLater() {
activationNeed = true;
}
public ModelsTree(Model mod) {
this.model = (ModelPersist)mod;
VerticalPanel mainPanel = new VerticalPanel();
mainPanel.setSize("100%", "100%");
tree = new Tree();
tree.setWidth("100%");
npcItem = createBasicItem(appConstants.parametersNPCName(),appConstants.parametersNPCAddTitle(),new ClickHandler() {
public void onClick(ClickEvent event) {
model.addNewNPC(null);
}
},Images.NPC_ICON,new ClickHandler() {
public void onClick(ClickEvent event) {
model.sortNPC();
}
});
parametersItem = createBasicItem(appConstants.parametersName(),appConstants.parametersAddTitle(),new ClickHandler() {
public void onClick(ClickEvent event) {
model.addNewParameter(null);
}
},Images.PARAMETER_ICON,new ClickHandler() {
public void onClick(ClickEvent event) {
model.sortParameters();
}
});
battlesItem = createBasicItem(appConstants.parametersBattleName(),appConstants.parametersBattleAddTitle(),new ClickHandler() {
public void onClick(ClickEvent event) {
model.addNewBattle(null);
}
},Images.BATTLE_ICON,new ClickHandler() {
public void onClick(ClickEvent event) {
model.sortBattles();
}
});
modificatorsItem = createBasicItem(appConstants.parametersModificatorName(),appConstants.parametersModificatorAddTitle(),new ClickHandler() {
public void onClick(ClickEvent event) {
model.addNewModificator(null);
}
},Images.MODIFICATOR_ICON,new ClickHandler() {
public void onClick(ClickEvent event) {
model.sortModificators();
}
});
alchemyItem = createBasicItem(appConstants.parametersConvertersName(),appConstants.parametersConverteAddTitle(),new ClickHandler() {
public void onClick(ClickEvent event) {
model.addNewAlchemy(null);
}
},Images.PARAMETER_CONVERTER,new ClickHandler() {
public void onClick(ClickEvent event) {
model.sortAlchemy();
}
});
mainPanel.add(tree);
mainPanel.setCellHeight(tree,"1%");
addStyleName("objects_list");
setScrollWidget(mainPanel);
HTML html = new HTML(" ");
html.setStyleName("location_list_filler");
mainPanel.add(html);
mainPanel.setCellHeight(html,"99%");
listener = new ParameterListener(){
public void addNewParameter(AbstractParameter parameter) {
if (parameter instanceof Parameter) {
addParameter((Parameter) parameter,true);
} else if (parameter instanceof NPC) {
addNPC((NPC) parameter,true);
} else if (parameter instanceof Battle) {
addBattle((Battle) parameter,true);
} else if (parameter instanceof Modificator) {
addModificator((Modificator) parameter,true);
} else if (parameter instanceof Alchemy) {
addAlchemy((Alchemy) parameter,true);
}
}
public void refreshAll() {
reloadTree();
}
public void remove(AbstractParameter parameter) {
TreeItem widget = widgets.get(parameter);
if (widget != null) {
widget.getParentItem().removeItem(widget);
}
}
public void select(AbstractParameter parameter) {
TreeItem widget = widgets.get(parameter);
if (widget != null) {
TreeItem selected = tree.getSelectedItem();
if (selected != widget) {
selected.setSelected(false);
widget.setSelected(true);
}
}
}
public void update(AbstractParameter parameter) {
AbstractParameterWidget widget = widgets.get(parameter);
if (widget != null) {
widget.update(parameter);
}
}
public void showInfo(AbstractParameter parameter) {
}
};
model.addParamaterListener(listener);
reloadTree();
}
private void addBattle(Battle parameter,boolean show) {
addItemToNode(battlesItem,new AbstractParameterWidget(parameter),show);
}
private void addNPC(NPC parameter,boolean show) {
addItemToNode(npcItem,new AbstractParameterWidget(parameter),show);
}
private void addParameter(Parameter parameter,boolean show) {
addItemToNode(parametersItem,new AbstractParameterWidget(parameter),show);
}
private void addModificator(Modificator parameter,boolean show) {
addItemToNode(modificatorsItem,new AbstractParameterWidget(parameter),show);
}
private void addAlchemy(Alchemy parameter,boolean show) {
addItemToNode(alchemyItem,new AbstractParameterWidget(parameter),show);
}
private void addItemToNode(TreeItem treeItem, AbstractParameterWidget abstractParameterWidget,boolean show) {
treeItem.addItem(abstractParameterWidget);
widgets.put(abstractParameterWidget.parameter, abstractParameterWidget);
if (show) {
if (treeItem.getState()==false) {
treeItem.setState(true);
}
tree.setSelectedItem(abstractParameterWidget);
ensureVisible(abstractParameterWidget);
model.selectParameter(abstractParameterWidget.getParameter(),listener);
}
}
private TreeItem createBasicItem(String name,String title, ClickHandler handler,String imageURL, ClickHandler sortHandler) {
HorizontalPanel panel = new HorizontalPanel();
panel.setVerticalAlignment(HasVerticalAlignment.ALIGN_MIDDLE);
panel.setSize("1%", "1%");
panel.add(new Image(imageURL));
Label label = new Label(name,false);
panel.add(label);
Image image = new Image(Images.SORT);
image.addClickHandler(sortHandler);
image.setTitle(appConstants.sort());
image.setStyleName(Styles.CLICKABLE);
panel.add(image);
image = new Image(Images.ADD_CONNECTION);
image.addClickHandler(handler);
image.setTitle(title);
image.setStyleName(Styles.CLICKABLE);
panel.add(image);
final TreeItem item = new TreeItem(panel);
applyItemStyle(item);
tree.addItem(item);
return item;
}
private void applyItemStyle(TreeItem item) {
DOM.setStyleAttribute(item.getElement(),"paddingBottom","0px");
DOM.setStyleAttribute(item.getElement(),"paddingTop","1px");
DOM.setStyleAttribute(DOM.getChild(item.getElement(),0),"display","inline-block");
item.setSize("1%", "1%");
}
private void reloadTree() {
widgets=new HashMap<AbstractParameter, AbstractParameterWidget>();
npcItem.removeItems();
parametersItem.removeItems();
battlesItem.removeItems();
alchemyItem.removeItems();
modificatorsItem.removeItems();
ArrayList<AbstractParameter> params = model.getParameters();
for (AbstractParameter abstractParameter : params) {
if (abstractParameter instanceof Parameter) {
addParameter((Parameter) abstractParameter,false);
} else if (abstractParameter instanceof NPC) {
addNPC((NPC) abstractParameter,false);
} else if (abstractParameter instanceof Battle) {
addBattle((Battle) abstractParameter,false);
} else if (abstractParameter instanceof Modificator) {
addModificator((Modificator) abstractParameter,false);
} else if (abstractParameter instanceof Alchemy) {
addAlchemy((Alchemy) abstractParameter,false);
} else {
throw new IllegalArgumentException("Unsupported class "+abstractParameter);
}
}
}
public AbstractParameter getSelected() {
TreeItem item = tree.getSelectedItem();
if (item instanceof AbstractParameterWidget) {
AbstractParameterWidget widget = (AbstractParameterWidget) item;
return widget.getParameter();
} else {
return null;
}
}
public class AbstractParameterWidget extends TreeItem implements ClickHandler{
private Label title;
private Image findInfo;
private Image remove;
private AbstractParameter parameter;
public AbstractParameterWidget(AbstractParameter parameter) {
applyItemStyle(this);
title = new Label();
title.setWordWrap(false);
remove = new Image(Images.REMOVE);
remove.setTitle(appConstants.buttonRemove());
remove.addClickHandler(this);
remove.setStyleName(Styles.CLICKABLE);
findInfo = new Image(Images.PREVIEW);
findInfo.addClickHandler(this);
findInfo.setTitle(AppLocale.getAppConstants().quicShowInfo());
HorizontalPanel panel = new HorizontalPanel();
panel.setSize("1%", "1%");
panel.add(title);
panel.add(findInfo);
panel.add(remove);
setWidget(panel);
update(parameter);
}
public AbstractParameter getParameter() {
return parameter;
}
public void update(AbstractParameter parameter) {
this.parameter = parameter;
title.setText(parameter.getName());
}
public void setTitle(String title) {
this.title.setText(title);
}
public void onClick(ClickEvent event) {
if (event.getSource()==remove) {
if (Window.confirm(appConstants.confirmRemove())) {
model.removeParameter(getParameter(),null);
}
} else if (event.getSource()==findInfo) {
model.showInfo(parameter);
}
}
}
}