package com.iambookmaster.client; import java.util.ArrayList; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.user.client.ui.Button; import com.google.gwt.user.client.ui.FlexTable; import com.google.gwt.user.client.ui.FlowPanel; 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.VerticalPanel; 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.ObjectBean; import com.iambookmaster.client.beans.Paragraph; import com.iambookmaster.client.beans.ParagraphConnection; import com.iambookmaster.client.beans.Parameter; import com.iambookmaster.client.beans.Picture; import com.iambookmaster.client.beans.Sound; import com.iambookmaster.client.common.EditorTab; import com.iambookmaster.client.common.ScrollContainer; import com.iambookmaster.client.common.SpanLabel; import com.iambookmaster.client.locale.AppConstants; import com.iambookmaster.client.locale.AppLocale; import com.iambookmaster.client.model.Model; public class InfoPanel extends VerticalPanel implements EditorTab{ private Model model; private final AppConstants appConstants = AppLocale.getAppConstants(); private boolean activationNeed; private Label type; private Label name; private Button update; private ScrollContainer scrollContainer; private VerticalPanel info; private Object item; public void activate() { if (activationNeed) { activationNeed = false; onResize(); } } private void onResize() { scrollContainer.resetHeight(); } public void deactivate() { } public void activateLater() { activationNeed = true; } public InfoPanel(Model mod) { model=mod; setSize("100%", "100%"); setStyleName("location_editor_panel"); HorizontalPanel panel = new HorizontalPanel(); panel.setSpacing(5); panel.setVerticalAlignment(HasVerticalAlignment.ALIGN_MIDDLE); panel.setSize("100%", "100%"); type = new Label(); type.setWordWrap(false); panel.add(type); panel.setCellWidth(type,"1%"); name = new Label(); name.setStyleName(Styles.BOLD); name.setWordWrap(false); panel.add(name); panel.setCellWidth(name,"99%"); update = new Button(appConstants.refreshButton(),new ClickHandler(){ public void onClick(ClickEvent event) { refresh(); } }); panel.add(update); panel.setCellWidth(update,"1%"); add(panel); setCellWidth(panel,"100%"); setCellHeight(panel,"1%"); scrollContainer = new ScrollContainer(); info = new VerticalPanel(); info.setSize("100%", "100%"); scrollContainer.setScrollWidget(info); add(scrollContainer); setCellWidth(scrollContainer,"100%"); setCellHeight(scrollContainer,"99%"); } public void close() { } public void showInfo(ObjectBean object) { type.setText(appConstants.infoPanelObject()); name.setText(object.getName()); item = object; refresh(); } public void showInfo(Picture object) { type.setText(appConstants.infoPanelPicture()); name.setText(object.getName()); item = object; refresh(); } public void showInfo(Sound object) { type.setText(appConstants.infoPanelSound()); name.setText(object.getName()); item = object; refresh(); } public void showInfo(AbstractParameter parameter) { type.setText(getAbstractParameterTypeName(parameter)); name.setText(parameter.getName()); item = parameter; refresh(); } private String getAbstractParameterTypeName(AbstractParameter parameter) { if (parameter instanceof Alchemy) { return appConstants.menuNewAlchemy(); } else if (parameter instanceof Parameter) { return appConstants.menuNewParameter(); } else if (parameter instanceof Battle) { return appConstants.menuNewBattle(); } else if (parameter instanceof NPC) { return appConstants.menuNewNPC(); } else if (parameter instanceof Modificator) { return appConstants.menuNewModificator(); } else { return "???"; } } private String getAbstractParameterTypeImageURL(AbstractParameter parameter) { if (parameter instanceof Alchemy) { return Images.PARAMETER_CONVERTER; } else if (parameter instanceof Parameter) { return Images.PARAMETER_ICON; } else if (parameter instanceof Battle) { return Images.BATTLE_ICON; } else if (parameter instanceof NPC) { return Images.NPC_ICON; } else if (parameter instanceof Modificator) { return Images.MODIFICATOR_ICON; } else { return null; } } private void refresh() { info.clear(); if (item instanceof ObjectBean) { updateObject((ObjectBean) item); } if (item instanceof Picture) { updatePicture((Picture) item); } if (item instanceof Sound) { updateSound((Sound) item); } if (item instanceof AbstractParameter) { updateAbstractParameter((AbstractParameter) item); } } private void updateAbstractParameter(AbstractParameter parameter) { ArrayList<Paragraph> paragraphs = model.getParagraphs(); for (Paragraph paragraph : paragraphs) { if (paragraph.dependsOn(parameter)) { ParagraphWidget widget = new ParagraphWidget(paragraph,true); info.add(widget); info.setCellWidth(widget,"100%"); } } ArrayList<ParagraphConnection> connections = model.getParagraphConnections(); for (ParagraphConnection connection : connections) { if (connection.dependsOn(parameter)) { FlowPanel panel = new FlowPanel(); panel.setWidth("100%"); ParagraphWidget from = new ParagraphWidget(connection.getFrom(),true); ParagraphWidget to = new ParagraphWidget(connection.getTo(),true); Image img = new Image(Images.RIGHT_GREEN); panel.add(from); panel.add(img); panel.add(to); info.add(panel); info.setCellWidth(panel,"100%"); } } ArrayList<AbstractParameter> params = model.getParameters(); for (AbstractParameter abstractParameter : params) { if (abstractParameter.dependsOn(parameter)) { FlowPanel panel = new FlowPanel(); panel.add(new Image(getAbstractParameterTypeImageURL(abstractParameter))); SpanLabel label = new SpanLabel(getAbstractParameterTypeName(abstractParameter)); label.addStyleName(Styles.MARGINE_RIGHT); panel.add(label); label = new SpanLabel(abstractParameter.getName()); label.addStyleName(Styles.BOLD); panel.add(label); panel.setWidth("100%"); info.add(panel); info.setCellWidth(panel,"100%"); } } HTML html = new HTML(" "); html.setStyleName(Styles.FILLER); info.add(html); info.setCellHeight(html,"100%"); info.setCellWidth(html,"100%"); } private void updateSound(Sound sound) { VerticalPanel usedPanel = new VerticalPanel(); usedPanel.setSpacing(5); usedPanel.setWidth("100%"); ArrayList<Paragraph> paragraphs = model.getParagraphs(); for (Paragraph paragraph : paragraphs) { if (paragraph.getBackgroundSounds().contains(sound) || paragraph.getSounds().contains(sound)) { ParagraphWidget widget = new ParagraphWidget(paragraph,true); usedPanel.add(widget); usedPanel.setCellWidth(widget,"100%"); } } if (usedPanel.getWidgetCount()>0) { Label title = new Label(appConstants.infoPanelSoundUsed()); info.add(title); info.setCellHeight(title,"1%"); info.setCellWidth(title,"100%"); usedPanel.setStyleName(Styles.BORDER); info.add(usedPanel); info.setCellHeight(usedPanel,"1%"); info.setCellWidth(usedPanel,"100%"); } HTML html = new HTML(" "); html.setStyleName(Styles.FILLER); info.add(html); info.setCellHeight(html,"100%"); info.setCellWidth(html,"100%"); } private void updatePicture(Picture picture) { VerticalPanel usedPanel = new VerticalPanel(); usedPanel.setSpacing(5); usedPanel.setWidth("100%"); ArrayList<Paragraph> paragraphs = model.getParagraphs(); for (Paragraph paragraph : paragraphs) { if (paragraph.getBackgroundImages().contains(picture) || paragraph.getBottomImages().contains(picture) || paragraph.getTopImages().contains(picture)) { ParagraphWidget widget = new ParagraphWidget(paragraph,true); usedPanel.add(widget); usedPanel.setCellWidth(widget,"100%"); } } if (usedPanel.getWidgetCount()>0) { Label title = new Label(appConstants.infoPanelImagesUsed()); info.add(title); info.setCellHeight(title,"1%"); info.setCellWidth(title,"100%"); usedPanel.setStyleName(Styles.BORDER); info.add(usedPanel); info.setCellHeight(usedPanel,"1%"); info.setCellWidth(usedPanel,"100%"); } HTML html = new HTML(" "); html.setStyleName(Styles.FILLER); info.add(html); info.setCellHeight(html,"100%"); info.setCellWidth(html,"100%"); } private void updateObject(ObjectBean object) { VerticalPanel gotPanel = new VerticalPanel(); gotPanel.setSpacing(5); gotPanel.setWidth("100%"); VerticalPanel lostPanel = new VerticalPanel(); lostPanel.setWidth("100%"); lostPanel.setSpacing(5); FlexTable usedPanel = new FlexTable(); usedPanel.setWidth("100%"); ArrayList<Paragraph> paragraphs = model.getParagraphs(); for (Paragraph paragraph : paragraphs) { if (paragraph.getGotObjects().contains(object)) { ParagraphWidget widget = new ParagraphWidget(paragraph,false); gotPanel.add(widget); gotPanel.setCellWidth(widget,"100%"); } if (paragraph.getLostObjects().contains(object)) { ParagraphWidget widget = new ParagraphWidget(paragraph,false); lostPanel.add(widget); lostPanel.setCellWidth(widget,"100%"); } } ArrayList<ParagraphConnection> connections = model.getParagraphConnections(); int i=0; for (ParagraphConnection connection : connections) { if (connection.getObject()==object) { ParagraphWidget from = new ParagraphWidget(connection.getFrom(),true); ParagraphWidget to = new ParagraphWidget(connection.getTo(),true); Image img = new Image(Images.RIGHT_GREEN); i = usedPanel.insertRow(i); usedPanel.addCell(i); usedPanel.setWidget(i,0,from); usedPanel.addCell(i); usedPanel.setWidget(i,1,img); usedPanel.addCell(i); usedPanel.setWidget(i,2,to); i++; } } if (gotPanel.getWidgetCount()>0) { Label title = new Label(appConstants.infoPanelGotObject()); info.add(title); info.setCellHeight(title,"1%"); info.setCellWidth(title,"100%"); gotPanel.setStyleName(Styles.BORDER); info.add(gotPanel); info.setCellHeight(gotPanel,"1%"); info.setCellWidth(gotPanel,"100%"); } if (lostPanel.getWidgetCount()>0) { Label title = new Label(appConstants.infoPanelLostObject()); info.add(title); info.setCellHeight(title,"1%"); info.setCellWidth(title,"100%"); lostPanel.setStyleName(Styles.BORDER); info.add(lostPanel); info.setCellHeight(lostPanel,"1%"); info.setCellWidth(lostPanel,"100%"); } if (usedPanel.getRowCount()>0) { Label title = new Label(appConstants.infoPanelUsedObject()); info.add(title); info.setCellHeight(title,"1%"); info.setCellWidth(title,"100%"); usedPanel.setStyleName(Styles.BORDER); usedPanel.getColumnFormatter().setWidth(0, "49%"); usedPanel.getColumnFormatter().setWidth(1, "1%"); usedPanel.getColumnFormatter().setWidth(2, "50%"); info.add(usedPanel); info.setCellHeight(usedPanel,"1%"); info.setCellWidth(usedPanel,"100%"); } HTML html = new HTML(" "); html.setStyleName(Styles.FILLER); info.add(html); info.setCellHeight(html,"100%"); info.setCellWidth(html,"100%"); } public class ParagraphWidget extends SpanLabel { public ParagraphWidget(final Paragraph paragraph,final boolean openForEdit) { super((model.getSettings().isShowParagraphNumbers() ? String.valueOf(paragraph.getNumber())+" ":"")+paragraph.getName()); setStyleName(Styles.CLICKABLE); addClickHandler(new ClickHandler(){ public void onClick(ClickEvent event) { if (openForEdit) { model.editParagraph(paragraph, null); } else { model.selectParagraph(paragraph, null); } } }); } } }