package scrum.client.collaboration; import ilarkesto.gwt.client.BetterTextArea; import ilarkesto.gwt.client.Gwt; import ilarkesto.gwt.client.Initializer; import ilarkesto.gwt.client.RichtextFormater; import ilarkesto.gwt.client.ToolbarWidget; import ilarkesto.gwt.client.editor.RichtextEditorWidget; import scrum.client.files.File; import scrum.client.files.Uploader; import scrum.client.img.Img; import scrum.client.wiki.ScrumHtmlContext; import scrum.client.wiki.WikiModel; import scrum.client.wiki.WikiParser; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.user.client.ui.Image; import com.google.gwt.user.client.ui.MultiWordSuggestOracle; import com.google.gwt.user.client.ui.PushButton; import com.google.gwt.user.client.ui.SuggestOracle; import com.google.gwt.user.client.ui.Widget; public class Wiki extends GWiki implements RichtextFormater { @Override public void initialize() { Gwt.setDefaultRichtextFormater(this); Gwt.setRichtextEditorEditInitializer(new RichtextEditorEditInitializer()); Gwt.setDefaultRichtextSyntaxInfo(WikiParser.SYNTAX_INFO_HTML); } public String getTemplate(String name) { Wikipage page = project.getWikipage("template:" + name); return page == null ? null : page.getText(); } public String richtextToHtml(String text) { return toHtml(text); } public static String toHtml(String wiki) { if (wiki == null) return null; if (wiki.trim().length() == 0) return ""; WikiParser parser = new WikiParser(wiki); WikiModel model = parser.parse(true); return model.toHtml(new ScrumHtmlContext()); } public SuggestOracle createPagesSuggestOracle() { MultiWordSuggestOracle oracle = new MultiWordSuggestOracle(); for (Wikipage page : project.getWikipages()) { oracle.add(page.getName()); } return oracle; } class RichtextEditorEditInitializer implements Initializer<RichtextEditorWidget> { public void initialize(final RichtextEditorWidget editor) { final ToolbarWidget toolbar = editor.getEditorToolbar(); toolbar.insert(createToolbarButton(Img.bundle.upload().createImage(), "Upload file", new ClickHandler() { public void onClick(ClickEvent event) { BetterTextArea textArea = editor.getEditor(); int topPosition = textArea.getAbsoluteTop() + 20; ReferenceInserter refInserter = new ReferenceInserter(textArea); uploader.showUploadDialog(topPosition, refInserter); } }), 0); toolbar.insert(createToolbarButton(Img.bundle.formatTextCode().createImage(), "Code", new ClickHandler() { public void onClick(ClickEvent event) { BetterTextArea textArea = editor.getEditor(); textArea.wrapSelection("<code>", "</code>"); textArea.setFocus(true); } }), 0); toolbar.insert(createToolbarButton(Img.bundle.image().createImage(), "Image", new ClickHandler() { public void onClick(ClickEvent event) { BetterTextArea textArea = editor.getEditor(); String selected = textArea.getSelectedText(); if (selected != null && (selected.startsWith("http") || selected.startsWith("www."))) { textArea.wrapSelection("[Image:", "|thumb]"); } else { textArea.wrapSelection("[Image:http://", "|thumb]"); } textArea.setFocus(true); } }), 0); toolbar.insert(createToolbarButton(Img.bundle.table().createImage(), "Table", new ClickHandler() { public void onClick(ClickEvent event) { BetterTextArea textArea = editor.getEditor(); textArea.wrapSelection("\n{|\n! Header 1\n! Header 2\n|-\n| ", "\n| \n|}\n"); textArea.setFocus(true); } }), 0); toolbar.insert(createToolbarButton(Img.bundle.hyperlink().createImage(), "Hyperlink", new ClickHandler() { public void onClick(ClickEvent event) { BetterTextArea textArea = editor.getEditor(); String selected = textArea.getSelectedText(); if (selected != null && (selected.startsWith("http") || selected.startsWith("www."))) { textArea.wrapSelection("[", "]"); } else { textArea.wrapSelection("[http:// ", "]"); } textArea.setFocus(true); } }), 0); toolbar.insert( createToolbarButton(Img.bundle.enumlist().createImage(), "Numbered list", new ClickHandler() { public void onClick(ClickEvent event) { BetterTextArea textArea = editor.getEditor(); textArea.wrapSelection("\n# ", "\n# "); textArea.setFocus(true); } }), 0); toolbar.insert( createToolbarButton(Img.bundle.itemlist().createImage(), "Bulleted list", new ClickHandler() { public void onClick(ClickEvent event) { BetterTextArea textArea = editor.getEditor(); textArea.wrapSelection("\n* ", "\n* "); textArea.setFocus(true); } }), 0); toolbar.insert(createToolbarButton(Img.bundle.formatTextBold().createImage(), "Bold", new ClickHandler() { public void onClick(ClickEvent event) { BetterTextArea textArea = editor.getEditor(); textArea.wrapSelection("'''", "'''"); textArea.setFocus(true); } }), 0); toolbar.insert( createToolbarButton(Img.bundle.formatTextItalic().createImage(), "Italic", new ClickHandler() { public void onClick(ClickEvent event) { BetterTextArea textArea = editor.getEditor(); textArea.wrapSelection("''", "''"); textArea.setFocus(true); } }), 0); } } protected final Widget createToolbarButton(Image icon, String tooltip, ClickHandler clickHandler) { PushButton button = new PushButton(icon, clickHandler); button.setTitle(tooltip); return button; } private class ReferenceInserter implements Uploader.UploadedFileHandler { private BetterTextArea textArea; public ReferenceInserter(BetterTextArea textArea) { super(); this.textArea = textArea; } public void onFileUploaded(File file) { textArea.wrapSelection(file.getReference() + " ", ""); textArea.setFocus(true); } } }