package kornell.gui.client.personnel;
import static kornell.core.util.StringUtils.isSome;
import static kornell.core.util.StringUtils.mkurl;
import com.google.gwt.core.client.Callback;
import com.google.gwt.dom.client.Document;
import com.google.gwt.user.client.Timer;
import com.google.web.bindery.event.shared.EventBus;
import kornell.api.client.KornellSession;
import kornell.core.to.UnreadChatThreadTO;
import kornell.gui.client.event.LogoutEvent;
import kornell.gui.client.event.LogoutEventHandler;
import kornell.gui.client.event.UnreadMessagesCountChangedEvent;
import kornell.gui.client.event.UnreadMessagesCountChangedEventHandler;
import kornell.gui.client.event.UnreadMessagesPerThreadFetchedEvent;
import kornell.gui.client.event.UnreadMessagesPerThreadFetchedEventHandler;
import kornell.gui.client.util.CSSInjector;
import kornell.gui.client.util.view.KornellMaintenance;
public class Dean implements LogoutEventHandler, UnreadMessagesPerThreadFetchedEventHandler,
UnreadMessagesCountChangedEventHandler {
private String ICON_NAME = "favicon.ico";
private String DEFAULT_SITE_TITLE = "Kornell";
private EventBus bus;
private KornellSession session;
private int totalCount;
public Dean(EventBus bus, KornellSession session) {
this.bus = bus;
this.session = session;
bus.addHandler(LogoutEvent.TYPE, this);
bus.addHandler(UnreadMessagesPerThreadFetchedEvent.TYPE, this);
bus.addHandler(UnreadMessagesCountChangedEvent.TYPE, this);
initInstitutionAssets();
}
private void initInstitutionAssets() {
showContentNative(false);
setFavicon();
setPageTitle();
setSkin();
}
private void setFavicon(){
String url = session.getAssetsURL();
if (url != null) {
updateFaviconNative(mkurl(url, ICON_NAME));
} else {
updateFaviconNative(ICON_NAME);
}
}
private void setSkin() {
Callback<Void, Exception> callback = new Callback<Void, Exception>() {
public void onFailure(Exception reason) {
KornellMaintenance.show();
}
public void onSuccess(Void result) {
showContentNative(true);
}
};
String skinName = isSome(session.getInstitution().getSkin()) ? session.getInstitution().getSkin() : "";
CSSInjector.updateSkin(skinName, callback);
}
private void setPageTitle() {
String name = session.getInstitution().getFullName();
String title = DEFAULT_SITE_TITLE;
if (name != null) {
title = name;
if (totalCount > 0)
title = "(" + totalCount + ") " + name;
}
Document.get().setTitle(title);
}
@Override
public void onUnreadMessagesPerThreadFetched(UnreadMessagesPerThreadFetchedEvent event) {
int count = 0;
for (UnreadChatThreadTO unreadChatThreadTO : event.getUnreadChatThreadTOs()) {
count = count + Integer.parseInt(unreadChatThreadTO.getUnreadMessages());
}
totalCount = count;
setPageTitle();
}
@Override
public void onUnreadMessagesCountChanged(UnreadMessagesCountChangedEvent event) {
totalCount = event.isIncrement() ? totalCount + event.getCountChange() : totalCount - event.getCountChange();
setPageTitle();
}
@Override
public void onLogout() {
showBodyNative(false);
}
private static native void updateFaviconNative(String url) /*-{
var link = $wnd.document.createElement('link'), oldLink = $wnd.document
.getElementById('icon');
link.id = 'icon';
link.rel = 'shortcut icon';
link.type = 'image/x-icon';
link.href = url;
if (oldLink) {
$wnd.document.head.removeChild(oldLink);
}
$wnd.document.getElementsByTagName('head')[0].appendChild(link);
}-*/;
public static native void showContentNative(boolean show) /*-{
var menuBar = $wnd.document.getElementsByClassName('menuBar'),
vScrollBar = $wnd.document.getElementsByClassName('vScrollBar'),
activityBarWrapper = $wnd.document.getElementsByClassName('activityBarWrapper'),
style = 'display: ' + (show ? 'block' : 'none');
if(menuBar && menuBar.length){
menuBar[0].setAttribute('style', style);
}
if(vScrollBar && vScrollBar.length){
vScrollBar[0].setAttribute('style', style);
}
if(activityBarWrapper && activityBarWrapper.length){
activityBarWrapper[0].setAttribute('style', style);
}
}-*/;
private static native void showBodyNative(boolean show) /*-{
$wnd.document.getElementsByTagName('body')[0].setAttribute('style',
'display: ' + (show ? 'block' : 'none'));
}-*/;
}