/**
*
*/
package com.piki.client.view;
import com.google.gwt.dom.client.Style.Unit;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
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.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.FileUpload;
import com.google.gwt.user.client.ui.FormPanel;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.HasHTML;
import com.google.gwt.user.client.ui.HasText;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.TabLayoutPanel;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.Widget;
import com.piki.client.mvp.AbstractView;
import com.piki.client.presenter.WikiPagePresenterCallback;
import com.piki.client.ui.HasWikiPageName;
import com.piki.client.ui.WikiPage;
import com.piki.client.ui.WikiPageArea;
/**
* Implementation of the WikiView
*
*/
public class WikiPageViewImpl extends AbstractView<TabLayoutPanel, WikiPagePresenterCallback> implements WikiPageView {
/** private final static String WIKI_HELP = "<h1>Wiki markup help</h1>\n"
+ "<br/>"
+ "<h1>=Heading1=</h1><br/>\n"
+ "<h2>==Heading2==</h2><br/>\n"
+ "<h3>==Heading3==</h3><br/>\n"
+ "\n"
+ "<b>'''bold'''</b> <i>''italic''</i><br/>\n"
+ "<code>inline code</code><>\n"
+ "\n"
+ "Indent lists 2 spaces:<br/>\n"
+ "<li>* bullet item</li<br/>\n"
+ "<li># numbered list</li><br/>\n"
+ "\n"
+ "horizontal rule<br/>\n"
+ "----\n"
+ "\n"
+ "WikiWordLink <br/>\n"
+ "[http://domain/page label]<br/>\n"
+ "http://domain/page\n"
+ "\n"
+ "{|<br/>\n"
+ "! column1 header<br/>\n"
+ "! column2 header<br/>\n"
+ "|<br/>\n"
+ "| column1<br/>\n"
+ "| column2<br/>\n"
+ "|}\n"
+ "\n" + "[http://code.google.com/p/piki piki homepage]";
*/
private final static String WIKI_HELP = "<h1>Wiki markup help</h1>"
+ "<br/>"
+ "<h1>=Heading1=</h1><br/>\n"
+ "<h2>==Heading2==</h2><br/>\n"
+ "<h3>==Heading3==</h3><br/>\n"
+ "\n"
+ "<b>'''bold'''</b> <i>''italic''</i><br/>\n"
+ "<code>inline code</code><>\n"
+ "\n"
+ "Indent lists 2 spaces:<br/>\n"
+ "<li>* bullet item</li<br/>\n"
+ "<li># numbered list</li><br/>\n"
+ "\n"
+ "horizontal rule<br/>\n"
+ "----\n"
+ "\n"
+ "WikiWordLink <br/>\n"
+ "[http://domain/page label]<br/>\n"
+ "http://domain/page\n"
+ "\n"
+ "{|<br/>\n"
+ "! column1 header<br/>\n"
+ "! column2 header<br/>\n"
+ "|<br/>\n"
+ "| column1<br/>\n"
+ "| column2<br/>\n"
+ "|}\n"
+ "\n" + "[http://code.google.com/p/piki piki homepage]";
/**
* css sstyle name of the view
*/
private static final String STYLE_NAME = "WikiPage-view";
/**
* style name of the edit area
*/
private static final String STYLE_NAME_EDIT = "WikiPage-edit";
private static final String STYLE_NAME_EDIT_FOOTER = "WikiPage-footer";
private static final String STYLE_NAME_BUTTON = "WikiPage-button";
private static final String STYLE_NAME_READ = "WikiPage-read";
// content of the wiki page
WikiPage wikiPage = new WikiPage();
// editing erea of the wiki page
WikiPageArea wikiPageArea = new WikiPageArea();
// preview of the wiki page
WikiPage wikiPagePreview = new WikiPage();
// wiki page name
HasWikiPageName wikiPageName = new HasWikiPageName() {
@Override
public void setWikiPageName(String name) {
wikiPage.setWikiPageName(name);
wikiPageArea.setWikiPageName(name);
wikiPagePreview.setWikiPageName(name + " - Vorschau");
}
@Override
public String getWikiPageName() {
return wikiPage.getWikiPageName();
}
};
/**
* tab Panel
*/
TabLayoutPanel deckPanel = null;
@Override
public HasWikiPageName name() {
return wikiPageName;
}
@Override
public HasHTML read() {
return wikiPage;
}
@Override
public HasText editing() {
return wikiPageArea;
}
@Override
protected TabLayoutPanel onInitialize() {
final WikiPagePresenterCallback callback = getPresenterCallback();
deckPanel = new TabLayoutPanel(2.5, Unit.EM);
deckPanel.setStyleName(STYLE_NAME);
// add panels
deckPanel.add(decorateWidget(createReadPanel()), "Lesen");
deckPanel.add(decorateWidget(createEditPanel()), "Bearbeiten");
// select read Tab
deckPanel.selectTab(0);
deckPanel.addSelectionHandler(new SelectionHandler<Integer>() {
@Override
public void onSelection(SelectionEvent<Integer> event) {
int tabId = event.getSelectedItem();
if (tabId == 1) {
callback.toBeEdit(new AsyncCallback<Boolean>() {
@Override
public void onSuccess(Boolean result) {
if (result == null)
Window.alert("Seite kann leider nicht geladen werden: unerwarteter Rückgabewert (result == null");
if (result != null)
if (!result)
Window.alert("Seite kann leider nicht geladen werden: unerwarteter Rückgabewert (result == false");
}
@Override
public void onFailure(Throwable caught) {
Window.alert("Seite kann leider nicht geladen werden: caught.getMessage()");
}
});
}
}
});
return deckPanel;
}
/**
* create the read panel
* @return read panel
*/
protected Widget createReadPanel() {
wikiPage.setStyleName(STYLE_NAME_READ);
return wikiPage;
}
/**
* create the edit panel
* @return edit panel
*/
private Widget createEditPanel() {
final WikiPagePresenterCallback callback = getPresenterCallback();
HorizontalPanel deckPanel = new HorizontalPanel();
deckPanel.setWidth("100%");
deckPanel.setStyleName(STYLE_NAME_EDIT);
deckPanel.add(wikiPageArea);
// footer panel
VerticalPanel footerPanel = new VerticalPanel();
footerPanel.setStyleName(STYLE_NAME_EDIT_FOOTER);
// Hilfe
HTML help = new HTML(WIKI_HELP);
footerPanel.add(help);
// save button
Button save = new Button("Seite speichern");
save.setStyleName(STYLE_NAME_BUTTON);
save.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
callback.toBeSaved(wikiPageArea.getText(), new AsyncCallback<Boolean>() {
@Override
public void onSuccess(Boolean result) {
if (result == null)
Window.alert("Seite kann leider nicht gespeichert werden: unerwarteter Rückgabewert (result == null");
if (result != null) {
if (result)
selectReadPanel();
else
Window.alert("Seite kann leider nicht gespeichert werden: unerwarteter Rückgabewert (result == false");
}
}
@Override
public void onFailure(Throwable caught) {
Window.alert("Seite kann leider nicht gespeichert werden: caught.getMessage()");
}
});
}
});
footerPanel.add(save);
// preview button
Button preview = new Button("Vorschau anzeigen");
preview.setStyleName(STYLE_NAME_BUTTON);
preview.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
callback.toBePreview(wikiPageArea.getText(), new AsyncCallback<Boolean>() {
@Override
public void onSuccess(Boolean result) {
if (result == null)
Window.alert("Vorschau auf Seite leider nicht möglich: unerwarteter Rückgabewert (result == null");
if (result != null) {
if (!result)
Window.alert("Vorschau auf Seite leider nicht möglich: unerwarteter Rückgabewert (result == false");
}
}
@Override
public void onFailure(Throwable caught) {
Window.alert("Vorschau auf Seite nicht möglich: caught.getMessage()");
}
});
}
});
footerPanel.add(preview);
// discard button
Button discard = new Button("Abbrechen");
discard.setStyleName(STYLE_NAME_BUTTON);
discard.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
try {
if (!callback.discard())
Window.alert("Änderung kann nicht zurückgenommen werden");
} catch (Exception exception) {
Window.alert("Änderung kann nicht zurückgenommen werden: " + exception.getMessage());
}
}
});
footerPanel.add(discard);
// Create a FormPanel and point it at a service.
final FormPanel form = new FormPanel();
form.setAction("/image");
// Because we're going to add a FileUpload widget, we'll need to set the
// form to use the POST method, and multipart MIME encoding.
form.setEncoding(FormPanel.ENCODING_MULTIPART);
form.setMethod(FormPanel.METHOD_POST);
// Create a panel to hold all of the form widgets.
VerticalPanel panel = new VerticalPanel();
form.setWidget(panel);
// add label
panel.add(new Label("select a file:"));
// Create a FileUpload widget.
final FileUpload upload = new FileUpload();
upload.setName("uploadFormElement");
panel.add(upload);
// Add a 'submit' button.
panel.add(new Button("Submit", new ClickHandler() {
public void onClick(ClickEvent event) {
upload.setName(upload.getFilename());
form.submit();
}
}));
footerPanel.add(form);
deckPanel.add(footerPanel);
return deckPanel;
}
/**
* decorate the widget of the tab panel
* @param widget widget to be decorated
* @return decorated panel
*/
protected Widget decorateWidget(Widget widget) {
widget.setVisible(true);
return widget;
}
protected void selectReadPanel() {
if (deckPanel != null)
deckPanel.selectTab(0);
}
@Override
public HasHTML preview() {
return wikiPagePreview;
}
@Override
public void newWikiPage() {
if (deckPanel != null)
deckPanel.selectTab(1);
}
}