/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package com.totsp.crossword.web.client; import com.google.gwt.dom.client.Style.Unit; import com.google.gwt.user.client.ui.FlexTable; import com.google.gwt.user.client.ui.HTML; import com.google.gwt.user.client.ui.HTMLTable.CellFormatter; import com.google.gwt.user.client.ui.SourcesTableEvents; import com.google.gwt.user.client.ui.TableListener; import com.google.gwt.user.client.ui.Widget; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; import com.totsp.crossword.puz.Box; import com.totsp.crossword.puz.Playboard; import com.totsp.crossword.puz.Playboard.Position; import com.totsp.crossword.puz.Playboard.Word; import com.totsp.crossword.web.client.resources.Resources; import java.util.HashMap; import java.util.Map; /** * * @author kebernet */ @Singleton public class Renderer { private Resources resources; private Provider<BoxView> boxViewProvider; private ClickListener listener; private Playboard board; private FlexTable table; private Map<String, String> colorMap = new HashMap<String,String>(); private HashMap<String, Position> cursors = new HashMap<String, Position>(); @Inject public Renderer(Resources resources, Provider<BoxView> boxViewProvider){ this.resources = resources; this.boxViewProvider = boxViewProvider; } public FlexTable initialize(Playboard playboard){ this.board = playboard; table = new FlexTable(); table.setCellSpacing(1); table.setCellPadding(0); table.setStyleName(resources.css().table()); for(int across=0; across < this.board.getBoxes().length; across++){ for(int down=0; down < this.board.getBoxes()[across].length; down++){ Box b = board.getBoxes()[across][down]; if(b == null){ table.getCellFormatter().setStyleName(down, across, this.resources.css().black()); table.setWidget(down, across, new HTML(" ")); } else { table.getCellFormatter().setStyleName(down, across, this.resources.css().square()); BoxView view = this.boxViewProvider.get(); view.setValue(b); table.setWidget(down, across, view); } } } table.addTableListener(new TableListener(){ @Override public void onCellClicked(SourcesTableEvents sender, int down, int across) { if(Renderer.this.listener != null){ Renderer.this.listener.onClick(across, down); } } }); this.render(); return table; } public void updateCursor(String responder, Position position){ Widget w = null; Position old = this.cursors.get(responder); if(old != null){ w = table.getWidget(old.down, old.across); if(w instanceof BoxView && w != null){ w.setStyleName(resources.css().boxPanel()); } } else { cursors.put(responder, position); return; } w = table.getWidget(position.down, position.across); if(w instanceof BoxView && w != null){ w.setStyleName(resources.css().cursor()); w.getElement().getStyle().setBorderColor(colorMap.get(responder)); cursors.put(responder, position); } } public void setClickListener(ClickListener l){ this.listener = l; } public void render(){ this.render(null); } public void render(Word w){ Word currentWord = this.board.getCurrentWord(); Position currentHighlightLetter = this.board.getHighlightLetter(); for(int across = 0; across < this.board.getBoxes().length; across++){ for(int down=0; down < this.board.getBoxes()[across].length; down++){ CellFormatter formatter = this.table.getCellFormatter(); Box box = this.board.getBoxes()[across][down]; if(!currentWord.checkInWord(across, down) && w != null && !w.checkInWord(across, down)){ continue; } if(box == null){ continue; } BoxView view = (BoxView) table.getWidget(down, across); view.setValue(box); if(box.isCheated()){ formatter.addStyleName(down, across, resources.css().cheated()); } if(currentHighlightLetter.across == across && currentHighlightLetter.down == down){ formatter.addStyleName(down, across, resources.css().currentLetterHighlight()); } else { formatter.removeStyleName(down, across, resources.css().currentLetterHighlight()); } if(board.isShowErrors() && box.getResponse() != ' ' && box.getResponse() != box.getSolution() ){ formatter.addStyleName(down, across, resources.css().error()); } else { formatter.removeStyleName(down, across, resources.css().error()); } if(box.getResponder() != null && colorMap.get(box.getResponder()) != null){ view.getElement().getStyle().setColor(colorMap.get(box.getResponder())); } if(currentWord.checkInWord(across, down)){ formatter.addStyleName(down, across, resources.css().currentHighlightWord()); } else { formatter.removeStyleName(down, across, resources.css().currentHighlightWord()); } } } } /** * @return the colorMap */ public Map<String, String> getColorMap() { return colorMap; } /** * @param colorMap the colorMap to set */ public void setColorMap(Map<String, String> colorMap) { this.colorMap = colorMap; } public static interface ClickListener { public void onClick(int acoss, int down); } }