package com.iambookmaster.client; import java.util.ArrayList; import com.google.gwt.event.dom.client.MouseDownEvent; import com.google.gwt.event.dom.client.MouseDownHandler; import com.google.gwt.event.dom.client.MouseOutEvent; import com.google.gwt.event.dom.client.MouseOutHandler; import com.google.gwt.event.dom.client.MouseOverEvent; import com.google.gwt.event.dom.client.MouseOverHandler; import com.google.gwt.event.logical.shared.BeforeSelectionEvent; import com.google.gwt.event.logical.shared.BeforeSelectionHandler; import com.google.gwt.event.logical.shared.SelectionEvent; import com.google.gwt.event.logical.shared.SelectionHandler; import com.google.gwt.user.client.Window; 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.TabPanel; import com.google.gwt.user.client.ui.VerticalPanel; import com.google.gwt.user.client.ui.Widget; import com.iambookmaster.client.beans.AbstractParameter; import com.iambookmaster.client.beans.ObjectBean; import com.iambookmaster.client.beans.Paragraph; import com.iambookmaster.client.beans.Picture; import com.iambookmaster.client.beans.Sound; import com.iambookmaster.client.common.EditorPlayer; import com.iambookmaster.client.common.EditorTab; import com.iambookmaster.client.editor.ModelPersist; import com.iambookmaster.client.locale.AppConstants; import com.iambookmaster.client.locale.AppLocale; import com.iambookmaster.client.model.ContentListener; import com.iambookmaster.client.model.Model; import com.iambookmaster.client.model.ObjectListener; import com.iambookmaster.client.model.ParagraphListener; import com.iambookmaster.client.model.ParameterListener; import com.iambookmaster.client.paragraph.ExportBookCallback; import com.iambookmaster.client.paragraph.ParagraphEditor; import com.iambookmaster.client.paragraph.ParagraphFindAndReplace; import com.iambookmaster.client.paragraph.ParagraphStoryReader; import com.iambookmaster.client.paragraph.ParagraphValidator; import com.iambookmaster.client.paragraph.ParagraphsMapEditor; import com.iambookmaster.client.player.Player; import com.iambookmaster.client.player.PlayerListener; public class EditorPanel extends VerticalPanel{ public static final int PLAYER_WEB = 0; public static final int PLAYER_IPHONE = 1; public static final int PLAYER_IPAD = 2; public static final int PLAYER_800X600 = 3; public static final int PLAYER_1024X600 = 4; public static final int PLAYER_URQ = 5; private AppConstants appConstants = AppLocale.getAppConstants(); private TabPanel tabPanel; private ParagraphsMapEditor mapEditor; private PlotEditor plotEditor; private EditorPlayer player; private ParagraphValidator validator; private ParagraphStoryReader wholeReader; private ModelPersist model; private ParagraphEditor paragraphEditor; private int currentWidget; private ServerExchangePanel serverExchangePanel; private InfoPanel infoPanel; private ParagraphFindAndReplace replacer; private RulesEditor rules; private int currentPlayerMode; private CommercialTextEditor commercial; public EditorPanel(Model model) { this.model = (ModelPersist)model; setSize("100%", "100%"); tabPanel = new TabPanel(); tabPanel.setSize("100%", "100%"); tabPanel.addBeforeSelectionHandler(new BeforeSelectionHandler<Integer>() { public void onBeforeSelection(BeforeSelectionEvent<Integer> event) { if (event.getItem() != currentWidget) { Widget widget = tabPanel.getWidget(currentWidget); if (widget instanceof EditorTab) { EditorTab editorTab = (EditorTab)widget; editorTab.deactivate(); } } } }); tabPanel.addSelectionHandler(new SelectionHandler<Integer>() { public void onSelection(SelectionEvent<Integer> event) { currentWidget = event.getSelectedItem(); Widget widget = tabPanel.getWidget(event.getSelectedItem()); if (widget instanceof EditorTab) { EditorTab editorTab = (EditorTab)widget; editorTab.activate(); } } }); //add initial tabs mapEditor = new ParagraphsMapEditor(model); tabPanel.add(mapEditor, appConstants.ParagraphsMapEditorTitle()); plotEditor = new PlotEditor(model); tabPanel.add(plotEditor, appConstants.PlotEditor()); serverExchangePanel = new ServerExchangePanel(); tabPanel.add(serverExchangePanel, appConstants.serverPanelTitle()); //set parameters to Tabs tabPanel.getDeckPanel().setSize("100%", "100%"); add(tabPanel); setCellHeight(tabPanel, "100%"); setCellWidth(tabPanel, "100%"); tabPanel.selectTab(0); model.addParagraphListener(new ParagraphListener() { public void addNewParagraph(Paragraph location) { } public void edit(Paragraph location) { if (paragraphEditor==null) { paragraphEditor = new ParagraphEditor(EditorPanel.this.model,location); tabPanel.add(paragraphEditor, new TabWidget(appConstants.ParagraphEditorTitle(),paragraphEditor)); } else { paragraphEditor.open(location); } tabPanel.selectTab(tabPanel.getWidgetIndex(paragraphEditor)); } public void refreshAll() { } public void select(Paragraph location) { } public void unselect(Paragraph location) { } public void update(Paragraph location) { } public void remove(Paragraph location) { } }); model.addObjectsListener(new ObjectListener(){ public void addNewObject(ObjectBean object) { } public void refreshAll() { } public void remove(ObjectBean object) { } public void select(ObjectBean object) { } public void showInfo(ObjectBean object) { checkAndSelectInfoPanel(); infoPanel.showInfo(object); } public void unselect(ObjectBean object) { } public void update(ObjectBean object) { } }); model.addContentListener(new ContentListener(){ public void addNew(Picture picture) { } public void addNew(Sound sound) { } public void refreshAll() { } public void remove(Picture picture) { } public void remove(Sound sound) { } public void select(Sound sound) { } public void select(Picture picture) { } public void showInfo(Picture picture) { checkAndSelectInfoPanel(); infoPanel.showInfo(picture); } public void showInfo(Sound sound) { checkAndSelectInfoPanel(); infoPanel.showInfo(sound); } public void unselect(Sound sound) { } public void unselect(Picture picture) { } public void update(Picture picture) { } public void update(Sound sound) { } }); model.addParamaterListener(new ParameterListener(){ public void addNewParameter(AbstractParameter parameter) { } public void refreshAll() { } public void remove(AbstractParameter parameter) { } public void select(AbstractParameter parameter) { } public void showInfo(AbstractParameter parameter) { checkAndSelectInfoPanel(); infoPanel.showInfo(parameter); } public void update(AbstractParameter parameter) { } }); } public void onResize() { mapEditor.resetHeight(); if (paragraphEditor != null) { if (paragraphEditor.isVisible()) { paragraphEditor.onResize(); } else { paragraphEditor.activateLater(); } } } public void play(int mode) { if (player!=null && currentPlayerMode != mode) { removeTab(player); } if (player==null) { PlayerListener listener = new PlayerListener() { public void edit(Paragraph location) { } public void showErrors(Paragraph location,ArrayList<String> errors) { StringBuffer buffer = new StringBuffer(appConstants.TheFollowinErrorsWereDetect()); for (int i = 0; i < errors.size(); i++) { buffer.append(errors.get(i)); buffer.append('\n'); } Window.alert(buffer.toString()); } public void emptyDescription(Paragraph location) { EditorPanel.this.model.regenerateText(location, Model.EXPORT_ALL); } }; currentPlayerMode = mode; switch (mode) { case PLAYER_WEB: player = new Player(model,listener,null); break; case PLAYER_IPHONE: player = new IPhonePlayerWrapper(model,listener,480,320); break; case PLAYER_1024X600: player = new IPadPlayerWrapper(model,listener,1024,600); break; case PLAYER_800X600: player = new IPadPlayerWrapper(model,listener,800,600); break; case PLAYER_IPAD: player = new IPadPlayerWrapper(model,listener,1024,768); break; case PLAYER_URQ: player = new IPhoneURQWrapper(listener,480,320); break; } tabPanel.add((Widget)player, new TabWidget(appConstants.PlayerTitle(),player)); } tabPanel.selectTab(tabPanel.getWidgetIndex((Widget)player)); player.start(); } public void validateAll() { checkAndSelectValidator(); validator.startTesting(true,true); } private void checkAndSelectInfoPanel() { if (infoPanel==null) { infoPanel = new InfoPanel(EditorPanel.this.model); } if (tabPanel.getWidgetIndex(infoPanel)<0) { tabPanel.add(infoPanel, new TabWidget(appConstants.infoPanelTitle(),infoPanel)); } tabPanel.selectTab(tabPanel.getWidgetIndex(infoPanel)); } private void checkAndSelectValidator() { if (validator==null) { validator = new ParagraphValidator(model); tabPanel.add(validator, new TabWidget(appConstants.ValidatorTitle(),validator)); } tabPanel.selectTab(tabPanel.getWidgetIndex(validator)); } public void wholeRead() { showStories(); wholeReader.create(ParagraphStoryReader.TYPE_WHOLE_STORY); } public void successRead() { if (Window.confirm(appConstants.WarininCollectionAllStories())) { showStories(); wholeReader.create(ParagraphStoryReader.TYPE_ALL_SUCCESS); } } public void successLongAndShort() { showStories(); wholeReader.create(ParagraphStoryReader.TYPE_LONG_AND_SHORT_SUCCESS); } private void showStories() { if (wholeReader==null) { wholeReader = new ParagraphStoryReader(model); tabPanel.add(wholeReader, new TabWidget(appConstants.StoryReaderTitle(),wholeReader)); } tabPanel.selectTab(tabPanel.getWidgetIndex(wholeReader)); } public void validateMap() { checkAndSelectValidator(); validator.startTesting(false,true); } public void validateText() { checkAndSelectValidator(); validator.startTesting(true,false); } public void validateConnectionNames() { checkAndSelectValidator(); validator.testConnections(); } public void exportBook(boolean reExport, ExportBookCallback callback) { checkAndSelectValidator(); validator.createText(callback,reExport); } public void externalCorrection() { showStories(); wholeReader.externalCorrection(); } private void removeTab(EditorTab tab) { tab.close(); //select other tab tabPanel.selectTab(0); tabPanel.remove((Widget)tab); if (tab==player) { player = null; } else if (tab==paragraphEditor) { paragraphEditor = null; } else if (tab==wholeReader) { wholeReader = null; } else if (tab==validator) { validator = null; } } public class TabWidget extends HorizontalPanel { private EditorTab tab; private Image image; public TabWidget(String name,EditorTab tb) { this.tab = tb; Label label = new Label(name,false); label.setStyleName(Styles.TAB_LABEL); add(label); image = new Image(Images.CLOSE_PANEL); image.setStyleName(Styles.CLICKABLE); image.setTitle("Close tab"); image.addMouseDownHandler(new MouseDownHandler() { public void onMouseDown(MouseDownEvent event) { if (Window.confirm(appConstants.CloseTabConfirm())) { removeTab(tab); } } }); image.addMouseOverHandler(new MouseOverHandler() { public void onMouseOver(MouseOverEvent event) { image.setUrl(Images.CLOSE_PANEL_ON); } }); image.addMouseOutHandler(new MouseOutHandler() { public void onMouseOut(MouseOutEvent event) { image.setUrl(Images.CLOSE_PANEL); } }); add(image); } } public void serverLogin() { serverExchangePanel.performLogin(); tabPanel.selectTab(tabPanel.getWidgetIndex(serverExchangePanel)); } public void publishBook(final boolean reExport) { checkAndSelectValidator(); validator.startTesting(true,true,true,new ExportBookCallback() { public void onError() { //all errors were already shown } public void onSuccess(String text) { serverExchangePanel.performPublishing((ModelPersist)model,reExport); tabPanel.selectTab(tabPanel.getWidgetIndex(serverExchangePanel)); } }); } public void setServerURL(String url) { serverExchangePanel.setServerURL(url); } public void saveBookToServer() { serverExchangePanel.performSave((ModelPersist)model); tabPanel.selectTab(tabPanel.getWidgetIndex(serverExchangePanel)); } public void serverDone() { serverExchangePanel.done(); } public void activateParagraphMap() { tabPanel.selectTab(tabPanel.getWidgetIndex(mapEditor)); } private void checkAndSelectFindAndReplace() { if (replacer==null) { replacer = new ParagraphFindAndReplace(model); tabPanel.add(replacer, new TabWidget(appConstants.FindAndReplaceTitle(),replacer)); } tabPanel.selectTab(tabPanel.getWidgetIndex(replacer)); } public void findAndReplace() { checkAndSelectFindAndReplace(); } private void checkAndSelectRules() { if (rules==null) { rules = new RulesEditor(model); tabPanel.add(rules, new TabWidget(appConstants.EditRulesTitle(),rules)); } tabPanel.selectTab(tabPanel.getWidgetIndex(rules)); } public void editRules() { checkAndSelectRules(); } public void findAllCommercials() { if (Window.confirm(appConstants.confirmFindCommercial())) { checkAndSelectValidator(); validator.findCommercialParagraph(); } } public void editCommercialWelcome() { if (commercial==null) { commercial = new CommercialTextEditor(model); tabPanel.add(commercial, new TabWidget(appConstants.commercialWelcomeText(),commercial)); } tabPanel.selectTab(tabPanel.getWidgetIndex(commercial)); } }