package scrum.client.collaboration; import ilarkesto.core.scope.Scope; import ilarkesto.gwt.client.ButtonWidget; import ilarkesto.gwt.client.DropdownMenuButtonWidget; import ilarkesto.gwt.client.Gwt; import ilarkesto.gwt.client.TableBuilder; import ilarkesto.gwt.client.editor.RichtextEditorWidget; import scrum.client.ScrumGwt; import scrum.client.common.AScrumAction; import scrum.client.common.AScrumWidget; import scrum.client.journal.ActivateChangeHistoryAction; import scrum.client.journal.ChangeHistoryWidget; import scrum.client.workspace.PagePanel; import com.google.gwt.event.dom.client.KeyCodes; import com.google.gwt.event.dom.client.KeyPressEvent; import com.google.gwt.event.dom.client.KeyPressHandler; import com.google.gwt.event.logical.shared.SelectionEvent; import com.google.gwt.event.logical.shared.SelectionHandler; import com.google.gwt.user.client.ui.FlowPanel; import com.google.gwt.user.client.ui.SuggestBox; import com.google.gwt.user.client.ui.SuggestOracle.Suggestion; import com.google.gwt.user.client.ui.Widget; public class WikiWidget extends AScrumWidget { private static final String START_PAGE_NAME = "Start"; private String pageName; private Wikipage wikipage; private Wiki wiki; private FlowPanel panel; private RichtextEditorWidget editor; private Widget emoticonsAndComments; @Override protected Widget onInitialization() { wiki = Scope.get().getComponent(Wiki.class); panel = new FlowPanel(); panel.setStyleName("WikiWidget"); return panel; } @Override protected void onUpdate() { if (editor != null && editor.isEditMode()) return; if (pageName == null || pageName.trim().length() == 0) pageName = START_PAGE_NAME; Wikipage newWikipage = getCurrentProject().getWikipage(pageName); if (newWikipage != null && wikipage != newWikipage) { emoticonsAndComments = ScrumGwt.createEmoticonsAndComments(newWikipage); } wikipage = newWikipage; PagePanel page = new PagePanel(); if (wikipage == null) { page.addHeader(pageName, createPageSelector()); page.addSection("Page does not exist."); page.addSection(new ButtonWidget(new CreateWikipageAction(pageName))); } else { page.addHeader(wikipage.getName(), createPageSelector(), new EmoticonsWidget(wikipage)); editor = new RichtextEditorWidget(wikipage.getTextModel()); editor.setEditorHeight(600); FlowPanel right = new FlowPanel(); right.add(new CommentsWidget(wikipage)); page.addSection(TableBuilder.row(20, editor, emoticonsAndComments)); page.addHeader("Page properties", createActionsDropdown()); FlowPanel left = new FlowPanel(); left.add(ScrumGwt.createPdfLink("Downlad as PDF", "wikipage", wikipage)); left.add(Gwt.createSpacer(1, 10)); left.add(new ChangeHistoryWidget(wikipage)); page.addSection(left); } panel.clear(); panel.add(page); Gwt.update(panel); } private Widget createActionsDropdown() { DropdownMenuButtonWidget dropdown = new DropdownMenuButtonWidget(); dropdown.addAction(new ActivateChangeHistoryAction(wikipage)); dropdown.addAction(new DeleteWikipageAction(wikipage)); return dropdown; } private Widget createPageSelector() { SuggestBox pageNameBox = new SuggestBox(wiki.createPagesSuggestOracle()); pageNameBox.getElement().setId("wikiPageNameInput"); pageNameBox.setAutoSelectEnabled(false); pageNameBox.setTitle("Enter name of wiki page"); pageNameBox.addSelectionHandler(new PageNameHandler()); pageNameBox.addKeyPressHandler(new PageNameHandler()); pageNameBox.setText(pageName); DropdownMenuButtonWidget dropdown = new DropdownMenuButtonWidget(); for (Wikipage page : getCurrentProject().getWikipages()) { dropdown.addAction(new ShowPageAction("", page.getName())); } return TableBuilder.row(5, new ButtonWidget(new ShowPageAction("Go to ", START_PAGE_NAME)), pageNameBox, dropdown); } public void showPage(String name) { this.pageName = name; update(); } public void showPage(Wikipage page) { this.pageName = page == null ? null : page.getName(); update(); } class ShowPageAction extends AScrumAction { private String prefix; private String pageName; public ShowPageAction(String prefix, String pageName) { super(); this.prefix = prefix; this.pageName = pageName; } @Override public String getLabel() { return prefix + pageName; } @Override public String getTooltip() { return "Goto wiki page " + pageName; } @Override protected void onExecute() { showPage(pageName); } } class PageNameHandler implements KeyPressHandler, SelectionHandler<Suggestion> { public void onKeyPress(KeyPressEvent event) { SuggestBox pageNameBox = (SuggestBox) event.getSource(); if (pageNameBox.isSuggestionListShowing()) return; if (event.getCharCode() == KeyCodes.KEY_ENTER) { event.stopPropagation(); showPage(pageNameBox.getText()); } } public void onSelection(SelectionEvent<Suggestion> event) { showPage(event.getSelectedItem().getReplacementString()); } } }