package org.aplikator.client.local;
import javax.annotation.PostConstruct;
import javax.inject.Inject;
import java.util.List;
import org.aplikator.client.local.command.WelcomeScreen;
import org.aplikator.client.local.processes.ProcessInformations;
import org.aplikator.client.local.widgets.Messages;
import org.aplikator.client.shared.descriptor.ActionDTO;
import org.aplikator.client.shared.descriptor.ApplicationDTO;
import org.aplikator.client.shared.descriptor.MenuDTO;
import org.aplikator.client.shared.rpc.AplikatorErrorCallback;
import org.aplikator.client.shared.rpc.AplikatorService;
import org.gwtbootstrap3.client.ui.AnchorButton;
import org.gwtbootstrap3.client.ui.AnchorListItem;
import org.gwtbootstrap3.client.ui.Button;
import org.gwtbootstrap3.client.ui.DropDownMenu;
import org.gwtbootstrap3.client.ui.Label;
import org.gwtbootstrap3.client.ui.ListDropDown;
import org.gwtbootstrap3.client.ui.NavbarBrand;
import org.gwtbootstrap3.client.ui.NavbarNav;
import org.gwtbootstrap3.client.ui.constants.Toggle;
import org.gwtbootstrap3.client.ui.html.Div;
import org.jboss.errai.common.client.api.RemoteCallback;
import org.jboss.errai.enterprise.client.jaxrs.api.RestClient;
import org.jboss.errai.ioc.client.api.EntryPoint;
import org.jboss.errai.ui.nav.client.local.HistoryWrapper;
import org.jboss.errai.ui.nav.client.local.Navigation;
import org.jboss.errai.ui.nav.client.local.TransitionTo;
import org.slf4j.LoggerFactory;
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.uibinder.client.UiHandler;
import com.google.gwt.user.client.ui.RootPanel;
import com.google.gwt.user.client.ui.SimplePanel;
/**
* Entry point class of Aplikator application (defines <code>onModuleLoad()</code> ).
*/
@EntryPoint
public class Aplikator {
public static final int MAINMENUBAR_HEIGHT = 52;
private static final org.slf4j.Logger LOG = LoggerFactory.getLogger(Aplikator.class);
public static ApplicationDTO application;
private static AplikatorUiBinder ourUiBinder = GWT.create(AplikatorUiBinder.class);
@UiField
Div mainPanel;
@UiField
NavbarNav mainMenuHolder;
@UiField
NavbarBrand homeButton;
@UiField
AnchorListItem processes;
//@UiField
//AnchorListItem profile;
@UiField
Label username;
@UiField
Button login;
@UiField
SimplePanel contents;
@Inject
TransitionTo<WelcomeScreen> homeButtonClicked;
@Inject
private WelcomeScreen welcomeScreen;
@Inject
private Navigation navigation;
public static String getBaseURL() {
String moduleBase = GWT.getModuleBaseURL();
String moduleName = GWT.getModuleName();
return moduleBase.substring(0, moduleBase.lastIndexOf(moduleName));
}
/**
* Aplikator client entry point method.
*/
@PostConstruct
public final void onModuleLoad() {
//PushStateUtil.enablePushState(true);
Navigation.setAppContext("");
RestClient.setApplicationRoot("");
//RestClient.setJacksonMarshallingActive(true);
GWT.setUncaughtExceptionHandler(new GWT.UncaughtExceptionHandler() {
public void onUncaughtException(Throwable e) {
LOG.error(e.getMessage(), e);
}
});
mainPanel = ourUiBinder.createAndBindUi(this);
contents.add(navigation.getContentPanel());
RootPanel.get().add(mainPanel);
reloadApplication(false);
}
public void reloadApplication(final boolean forceHome) {
RestClient.create(AplikatorService.class, new RemoteCallback<ApplicationDTO>() {
@Override
public void callback(ApplicationDTO resp) {
application = resp;
initPanels();
Messages.cleanAll();
if (application.isShowNavigation()) {
setupMainMenu(application.getMenus());
}
if (application.getDefaultActionToken() != null) {
HistoryWrapper.newItem(application.getDefaultActionToken(), true);
} else if (forceHome) {
homeButtonClicked.go();
}
}
}, new AplikatorErrorCallback(null)
).getApplication();
}
private void initPanels() {
homeButton.setText(application.getConfigString("aplikator.brand"));
if (application.isShowNavigation()) {
homeButton.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
homeButtonClicked.go();
}
});
}
processes.setText(application.getConfigString("aplikator.menu.processes"));
if (application.getUsername() == null) {
username.setText("");
login.setText(application.getConfigString("aplikator.menu.login"));
} else {
username.setText(application.getUsername());
login.setText(application.getConfigString("aplikator.menu.logout"));
}
}
@UiHandler("processes")
public void displayProcesses(ClickEvent event) {
ProcessInformations pi = new ProcessInformations();
pi.display();
}
@UiHandler("login")
public void displayProfile(ClickEvent event) {
if (application.getUsername() == null) {
HistoryWrapper.newItem("login", true);
} else {
RestClient.create(AplikatorService.class, new RemoteCallback<Void>() {
@Override
public void callback(Void response) {
reloadApplication(true);
}
},
new AplikatorErrorCallback()
).logout();
}
}
private void setupMainMenu(List<MenuDTO> menus) {
mainMenuHolder.clear();
for (MenuDTO menu : menus) {
ListDropDown menuDropdown = new ListDropDown();
AnchorButton menuButton = new AnchorButton();
menuButton.setText(menu.getLocalizedName());
menuButton.setDataToggle(Toggle.DROPDOWN);
DropDownMenu menuItems = new DropDownMenu();
menuDropdown.add(menuButton);
menuDropdown.add(menuItems);
mainMenuHolder.add(menuDropdown);
for (final ActionDTO action : menu.getActions()) {
AnchorListItem menuItem = new AnchorListItem();
menuItem.setText(action.getLocalizedName());
menuItem.setHref("#" + action.getToken());
menuItem.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
HistoryWrapper.newItem(action.getToken(), true);
}
});
menuItems.add(menuItem);
}
}
}
interface AplikatorUiBinder extends UiBinder<Div, Aplikator> {
}
public void displayLoginButton(boolean displayLoginButton) {
login.setVisible(displayLoginButton);
}
}