/**
*
*/
package com.piki.client.presenter;
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.shared.EventBus;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.piki.client.event.AddWikiPageEvent;
import com.piki.client.event.DeleteWikiPageEvent;
import com.piki.client.event.DeleteWikiPageEventHandler;
import com.piki.client.mvp.BasisChangeablePresenter;
import com.piki.client.mvp.HasEventBus;
import com.piki.client.rpc.FormatService;
import com.piki.client.rpc.FormatServiceAsync;
import com.piki.client.rpc.WikiPageDAOAsyn;
import com.piki.client.rpc.WikiPageDAOAsynImpl;
import com.piki.client.view.WikiPageView;
import com.piki.client.view.WikiPageViewImpl;
import com.piki.shared.model.WikiPage;
/**
* wiki page presenter
*/
public class WikiPagePresenter extends
BasisChangeablePresenter<WikiPageView, WikiPagePresenterCallback> implements
WikiPagePresenterCallback, DeleteWikiPageEventHandler, HasEventBus {
/**
* default content of the page
*/
private final static String NEW_WIKI_PAGE_CONTENT = "<Geben Sie bitte eine neue Seite ein>...";
/**
* format service
*/
private final FormatServiceAsync formatService = GWT
.create(FormatService.class);
private EventBus eventBus = null;
/**
* DAO
*/
private WikiPageDAOAsyn wikiPageDAO = null;
/**
* content
*/
private String content = null;
/**
* may stop
*/
private boolean mayStop = true;
private boolean newPage = false;
/**
* default constructor
*/
public WikiPagePresenter() {
wikiPageDAO = new WikiPageDAOAsynImpl(formatService);
init(new WikiPageViewImpl(), this);
}
public WikiPagePresenter(String name) {
this();
setName(name);
}
/**
* create a new wiki page
*
* @param pageName
* name of the page
*/
public void newPage(String pageName) {
setName(pageName);
content = NEW_WIKI_PAGE_CONTENT;
newPage = true;
mayStop = true;
final WikiPageView view = getView();
view.name().setWikiPageName(pageName);
view.editing().setText(NEW_WIKI_PAGE_CONTENT);
formatService.format(GWT.getHostPageBaseURL(), NEW_WIKI_PAGE_CONTENT,
new AsyncCallback<String>() {
@Override
public void onFailure(Throwable caught) {
Window.alert("Seite kann leider nicht geladen werden: "
+ caught.getMessage());
}
@Override
public void onSuccess(String result) {
view.read().setHTML(result);
view.preview().setHTML(result);
view.newWikiPage();
}
});
}
public void showPage(String pageName, String html) {
setName(pageName);
content = null;
mayStop = true;
final WikiPageView view = getView();
view.name().setWikiPageName(pageName);
view.read().setHTML(html);
view.preview().setHTML(html);
}
/*
* (non-Javadoc)
*
* @see
* com.piki.client.presenter.WikiPagePresenterCallback#toBeEdit(com.google
* .gwt.user.client.rpc.AsyncCallback)
*/
@Override
public void toBeEdit(final AsyncCallback<Boolean> success) {
if (content != null) {
mayStop = false;
success.onSuccess(true);
} else {
wikiPageDAO.read(getName(), new AsyncCallback<WikiPage>() {
@Override
public void onFailure(Throwable caught) {
success.onFailure(caught);
}
@Override
public void onSuccess(WikiPage result) {
mayStop = false;
content = result.getWiki();
final WikiPageView view = getView();
view.editing().setText(result.getWiki());
success.onSuccess(true);
}
});
}
}
/*
* (non-Javadoc)
*
* @see
* com.piki.client.presenter.WikiPagePresenterCallback#toBeSaved(com.google
* .gwt.user.client.rpc.AsyncCallback)
*/
@Override
public void toBeSaved(final String c, final AsyncCallback<Boolean> success) {
final WikiPage wpc = new WikiPage();
wpc.setName(getName());
wpc.setWiki(c);
wikiPageDAO.update(wpc, new AsyncCallback<WikiPage>() {
@Override
public void onFailure(Throwable caught) {
success.onFailure(caught);
}
@Override
public void onSuccess(WikiPage result) {
final WikiPageView view = getView();
view.read().setHTML(result.getHtml());
view.preview().setHTML(result.getHtml());
success.onSuccess(true);
if (newPage) {
EventBus eventBus = getEventBus();
eventBus.fireEvent(new AddWikiPageEvent(getName()));
newPage = false;
}
mayStop = true;
content = c;
}
});
}
/*
* (non-Javadoc)
*
* @see com.piki.client.presenter.WikiPagePresenterCallback#discard()
*/
@Override
public boolean discard() {
final WikiPageView view = getView();
view.editing().setText(content);
return true;
}
@Override
public void toBePreview(String wiki, final AsyncCallback<Boolean> success) {
formatService.format(GWT.getHostPageBaseURL(), wiki,
new AsyncCallback<String>() {
@Override
public void onFailure(Throwable caught) {
success.onFailure(caught);
}
@Override
public void onSuccess(String result) {
final WikiPageView view = getView();
view.preview().setHTML(result);
success.onSuccess(true);
}
});
}
@Override
public boolean isModify() {
return !mayStop;
}
@Override
public void save() {
final WikiPageView view = getView();
toBeSaved(view.editing().getText(), new AsyncCallback<Boolean>() {
@Override
public void onFailure(Throwable caught) {
Window.alert("Seite " + getName() + " konnte nicht gespeichert werden");
}
@Override
public void onSuccess(Boolean rc) {
if (!rc)
Window.alert("Seite " + getName() + " konnte nicht gespeichert werden");
}
});
}
private EventBus getEventBus() {
return eventBus;
}
@Override
public void setEventBus(EventBus eventBus) {
this.eventBus = eventBus;
eventBus.addHandler(DeleteWikiPageEvent.TYPE, this);
}
@Override
public void onDeleteWikiPage(DeleteWikiPageEvent event) {
if (event != null) {
String name = getName();
if (name != null) {
if (name.equals(event.getWikiPageName())) {
newPage(event.getWikiPageName());
}
}
}
}
public void read() {
wikiPageDAO.read(getName(),
new AsyncCallback<WikiPage>() {
@Override
public void onFailure(Throwable caught) {
newPage(getName());
}
@Override
public void onSuccess(WikiPage result) {
showPage(result.getName(), result.getHtml());
}
});
}
}