/*
*
* @file WPalo.java
*
* Copyright (C) 2006-2009 Tensegrity Software GmbH
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License (Version 2) as published
* by the Free Software Foundation at http://www.gnu.org/copyleft/gpl.html.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along with
* this program; if not, write to the Free Software Foundation, Inc., 59 Temple
* Place, Suite 330, Boston, MA 02111-1307 USA
*
* If you are developing and distributing open source applications under the
* GPL License, then you are free to use JPalo Modules under the GPL License. For OEMs,
* ISVs, and VARs who distribute JPalo Modules with their products, and do not license
* and distribute their source code under the GPL, Tensegrity provides a flexible
* OEM Commercial License.
*
* @author Philipp Bouillon <Philipp.Bouillon@tensegrity-software.com>
*
* @version $Id: WPalo.java,v 1.36 2010/04/13 09:45:15 PhilippBouillon Exp $
*
*/
package com.tensegrity.wpalo.client;
import java.util.Date;
import java.util.List;
import com.extjs.gxt.ui.client.GXT;
import com.extjs.gxt.ui.client.Registry;
import com.extjs.gxt.ui.client.event.BaseEvent;
import com.extjs.gxt.ui.client.event.Listener;
import com.extjs.gxt.ui.client.mvc.Dispatcher;
import com.extjs.gxt.ui.client.util.Theme;
import com.extjs.gxt.ui.client.widget.MessageBox;
import com.extjs.gxt.ui.client.widget.Viewport;
import com.extjs.gxt.ui.client.widget.layout.MarginData;
import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.core.client.GWT;
import com.google.gwt.user.client.Cookies;
import com.google.gwt.user.client.DOM;
import com.google.gwt.user.client.Element;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.RootPanel;
import com.google.gwt.user.client.ui.Widget;
import com.tensegrity.palo.gwt.core.client.models.admin.XUser;
import com.tensegrity.palo.gwt.core.client.models.cubeviews.XDirectLinkData;
import com.tensegrity.palo.gwt.core.client.models.cubeviews.XView;
import com.tensegrity.wpalo.client.async.Callback;
import com.tensegrity.wpalo.client.exceptions.WPaloUncaughtExceptionHandler;
import com.tensegrity.wpalo.client.i18n.ILocalConstants;
import com.tensegrity.wpalo.client.i18n.ILocalMessages;
import com.tensegrity.wpalo.client.i18n.Resources;
import com.tensegrity.wpalo.client.services.folder.WPaloFolderServiceProvider;
import com.tensegrity.wpalo.client.services.wpalo.WPaloController;
import com.tensegrity.wpalo.client.services.wpalo.WPaloControllerServiceProvider;
import com.tensegrity.wpalo.client.ui.mvc.account.AccountController;
import com.tensegrity.wpalo.client.ui.mvc.admin.AdminController;
import com.tensegrity.wpalo.client.ui.mvc.cubeview.LargeQueryWarningDialog;
import com.tensegrity.wpalo.client.ui.mvc.cubeview.PrintDialog;
import com.tensegrity.wpalo.client.ui.mvc.viewbrowser.ViewBrowserController;
import com.tensegrity.wpalo.client.ui.mvc.viewbrowser.importer.PaloSuiteViewCreationDialog;
import com.tensegrity.wpalo.client.ui.mvc.viewbrowser.importer.ViewImportDialog;
import com.tensegrity.wpalo.client.ui.mvc.workbench.Workbench;
import com.tensegrity.wpalo.client.ui.mvc.workbench.WorkbenchController;
import com.tensegrity.wpalo.client.ui.widgets.BusyIndicatorPanel;
/**
* Entry point classes define <code>onModuleLoad()</code>.
*/
public class WPalo implements EntryPoint {
protected transient final ILocalConstants constants = Resources.getInstance().getConstants();
protected transient final ILocalMessages messages = Resources.getInstance().getMessages();
public static final String ID = "WPalo";
public static WPaloConstants i18n;
private BusyIndicatorPanel waitPanel = null;
// the main panel for the content
private Viewport contentPane = null;
public static native void refreshSubobjects(String id) /*-{
$wnd.alert(id);
$wnd.msgToSend = 'Sub Object Saved!!';
$wnd.sendMessage({'id': id, 'msg': msgToSend},'subobjectsaved');
}-*/;
public void show(Widget panel) {
contentPane.setVisible(false);
contentPane.removeAll();
contentPane.add(panel, new MarginData(0));
contentPane.setVisible(true);
contentPane.layout();
}
public void attach(Widget panel) {
contentPane.setVisible(false);
contentPane.removeAll();
contentPane.add(panel, new MarginData(0));
contentPane.layout();
}
public static void loadCss(String filename) {
Element link = DOM.createElement("link");
DOM.setElementAttribute(link, "rel", "stylesheet");
DOM.setElementAttribute(link, "type", "text/css");
DOM.setElementAttribute(link, "href", filename);
Element headElement = DOM.getElementById("head");
DOM.appendChild(headElement, link);
}
public void show() {
contentPane.setVisible(true);
}
private final String getValue(String key, String link) {
String temp = link.toLowerCase();
int index = temp.indexOf(key);
if (index == -1) {
return null;
}
int begin = temp.indexOf("\"", index);
int end = temp.indexOf("\"", begin + 1);
if (begin == -1 || end == -1) {
return null;
}
return link.substring(begin + 1, end);
}
private final void createView(XView xView, final String viewId, final List <Boolean> displayFlags, final List <Boolean> globalFlags) {
((Workbench) Registry.get(Workbench.ID)).showWaitCursor(constants.creatingView());
String sessionId = ((Workbench)Registry.get(Workbench.ID)).getUser().getSessionId();
WPaloFolderServiceProvider.getInstance().importView(sessionId,
xView,
new Callback<XView>(constants.couldNotCreateView()) {
public void onSuccess(XView xView) {
hideWaitCursor();
((Workbench) Registry.get(Workbench.ID)).showWaitCursor(constants.openingView());
XUser user = ((Workbench)Registry.get(Workbench.ID)).getUser();
DisplayFlags.setDisplayFlagsFor(xView, user, displayFlags, globalFlags);
xView.setExternalId(viewId);
Dispatcher.get().dispatch(WPaloEvent.EDIT_VIEWBROWSER_VIEW, xView);
String subobjId = "OK - 4";
refreshSubobjects(subobjId);
}
});
}
private final void parsePaloSuiteLinkData(final Dispatcher dispatcher, final ViewBrowserController viewBrowserController) {
final String directLink = Window.Location.getQueryString();
final String locale = Window.Location.getParameter("locale");
WPaloServiceProvider.getInstance().openPaloSuiteView(locale, directLink,
new AsyncCallback<XDirectLinkData>() {
public void onFailure(Throwable t) {
MessageBox.alert(constants.error(), t.getMessage(), null);
}
public void onSuccess(final XDirectLinkData data) {
if (data.getErrors().length > 0) {
StringBuffer buf = new StringBuffer();
for (String s: data.getErrors()) {
buf.append(s + "\n");
}
MessageBox.alert(constants.errorsWhileProcessingOptions(), buf.toString(), null);
} else {
// CubeViewEditor.hasBeenResized = true;
WPaloControllerServiceProvider.getInstance().loginHash(
Window.Location.getParameter("user"),
data.getUserPassword(),
Window.Location.getParameter("locale"),
new Callback<XUser>() {
public void onFailure(Throwable t) {
super.onFailure(t);
}
public void onSuccess(XUser user) {
XView [] xViews = data.getViews();
if (xViews == null || xViews.length == 0) {
try {
DisplayFlags df = DisplayFlags.createDisplayFlags(user, data.getGlobalDisplayFlags());
dispatcher.dispatch(WPaloEvent.INIT, df);
((Workbench)Registry.get(Workbench.ID)).directLogin(user);
((Workbench)Registry.get(Workbench.ID)).setPaloSuite(true);
} catch (Throwable t) {
t.printStackTrace();
}
try {
final PaloSuiteViewCreationDialog dia =
new PaloSuiteViewCreationDialog();
dia.addButtonListener(ViewImportDialog.BUTTON_OK,
new Listener<BaseEvent>() {
public void handleEvent(BaseEvent be) {
XView[] xViews = dia.getSelectedViews();
if (xViews != null && xViews.length == 1) {
xViews[0].setExternalId(data.getPaloSuiteViewId());
createView(xViews[0], data.getPaloSuiteViewId(), data.getDisplayFlags(), data.getGlobalDisplayFlags());
}
}
});
dia.show();
} catch (Throwable t) {
t.printStackTrace();
}
} else {
try {
XView xView = xViews[0];
DisplayFlags.setDisplayFlagsFor(xView, user, xView.getDisplayFlags(), data.getGlobalDisplayFlags());
DisplayFlags displayFlags = DisplayFlags.getDisplayFlagsFor(xView);
dispatcher.dispatch(WPaloEvent.INIT, displayFlags);
((Workbench)Registry.get(Workbench.ID)).directLogin(user);
((Workbench)Registry.get(Workbench.ID)).setPaloSuite(true);
dispatcher.dispatch(WPaloEvent.EDIT_VIEWBROWSER_VIEW, xView);
if (data.getErrors().length > 0) {
StringBuffer buf = new StringBuffer();
for (String s: data.getErrors()) {
buf.append(s + "\n");
}
MessageBox.alert(constants.errorsWhileProcessingOptions(), buf.toString(), null);
}
} catch (Throwable t) {
t.printStackTrace();
}
}
}
});
}
}
});
}
private final void parseDefaultLinkData(final Dispatcher dispatcher, final ViewBrowserController viewBrowserController) {
final String directLink = Window.Location.getParameter("options");
final String locale = Window.Location.getParameter("locale");
if (directLink == null) {
// ...and dispatch start event, i.e. we begin with login ;)
dispatcher.dispatch(WPaloEvent.APP_START);
} else {
final String user = getValue("user", directLink);
final String pass = getValue("pass", directLink);
if (user == null || pass == null) {
dispatcher.dispatch(WPaloEvent.APP_START);
} else {
waitPanel = new BusyIndicatorPanel();
waitPanel.show(constants.startingApplication(), false);
WPaloServiceProvider.getInstance().openViewDirectly(locale, directLink,
new AsyncCallback<XDirectLinkData>() {
public void onSuccess(final XDirectLinkData data) {
if (!data.isAuthenticated()) {
waitPanel.hide();
dispatcher.dispatch(WPaloEvent.APP_START);
if (data.getErrors().length > 0) {
StringBuffer buf = new StringBuffer();
for (String s: data.getErrors()) {
buf.append(s + "\n");
}
MessageBox.alert(constants.errorsWhileProcessingOptions(), buf.toString(), null);
}
} else {
// CubeViewEditor.hasBeenResized = true;
// CubeViewEditor.fromDirectLink = true;
WPaloControllerServiceProvider.getInstance().loginHash(
user,
pass,
Window.Location.getParameter("locale"),
new Callback<XUser>() {
public void onFailure(Throwable t) {
super.onFailure(t);
waitPanel.hide();
}
public void onSuccess(XUser user) {
XView [] xViews = data.getViews();
if (xViews == null || xViews.length == 0) {
try {
dispatcher.dispatch(WPaloEvent.INIT, DisplayFlags.createDisplayFlags(user, data.getGlobalDisplayFlags()));
((Workbench)Registry.get(Workbench.ID)).directLogin(user);
} catch (Throwable t) {
t.printStackTrace();
MessageBox.alert(t.getMessage(), t.getCause().getMessage(), null);
}
waitPanel.hide();
if (data.getErrors().length > 0) {
StringBuffer buf = new StringBuffer();
for (String s: data.getErrors()) {
buf.append(s + "\n");
}
MessageBox.alert(constants.errorsWhileProcessingOptions(), buf.toString(), null);
}
return;
}
LargeQueryWarningDialog.hideWarnDialog = true;
for (int i = 1; i < xViews.length; i++) {
viewBrowserController.addViewToLoad(xViews[i]);
}
XView xView = xViews[0];
DisplayFlags.setDisplayFlagsFor(xView, user, xView.getDisplayFlags(), data.getGlobalDisplayFlags());
DisplayFlags displayFlags = DisplayFlags.getDisplayFlagsFor(xView);
dispatcher.dispatch(WPaloEvent.INIT, displayFlags);
((Workbench)Registry.get(Workbench.ID)).directLogin(user);
// CubeViewEditor.hasBeenResized = true;
dispatcher.dispatch(WPaloEvent.EDIT_VIEWBROWSER_VIEW, xView);
waitPanel.hide();
if (data.getErrors().length > 0) {
StringBuffer buf = new StringBuffer();
for (String s: data.getErrors()) {
buf.append(s + "\n");
}
MessageBox.alert(constants.errorsWhileProcessingOptions(), buf.toString(), null);
}
}
});
}
}
public void onFailure(Throwable arg0) {
dispatcher.dispatch(WPaloEvent.APP_START);
}
});
}
}
}
private final String setLocale() {
String val = Window.Location.getParameter("locale");
if (val == null) {
val = Cookies.getCookie("locale");
if (val != null) {
String url = Window.Location.getHref();
int index;
if ((index = url.indexOf("locale=")) != -1) {
int i2 = url.indexOf("&", index);
if (i2 == -1) {
url = url.substring(0, index) + "locale=" + val;
} else {
url = url.substring(0, index) + "locale=" + val + url.substring(i2);
}
} else {
if (url.indexOf("?") != -1) {
url += "&locale=" + val;
} else {
url += "?locale=" + val;
}
}
//Window.Location.assign(url);
return url;
}
}
if (val == null || val.isEmpty()) {
return null;
}
if (val.equals(Cookies.getCookie("locale"))) {
return null;
}
Date date = new Date(System.currentTimeMillis() + 1000l
* 60l * 60l * 24l * 30l);
Cookies.setCookie("locale", val, date);
return null;
}
private final String setTheme(String url) {
String val = Window.Location.getParameter("theme");
if (val == null) {
val = Cookies.getCookie("theme");
if (val != null) {
if (url == null) {
url = Window.Location.getHref();
}
int index;
if ((index = url.indexOf("theme=")) != -1) {
int i2 = url.indexOf("&", index);
if (i2 == -1) {
url = url.substring(0, index) + "theme=" + val;
} else {
url = url.substring(0, index) + "theme=" + val + url.substring(i2);
}
} else {
if (url.indexOf("?") != -1) {
url += "&theme=" + val;
} else {
url += "?theme=" + val;
}
}
//Window.Location.assign(url);
return url;
}
}
if (val == null || val.isEmpty()) {
return url;
}
if (val.equals(Cookies.getCookie("theme"))) {
return url;
}
Date date = new Date(System.currentTimeMillis() + 1000l
* 60l * 60l * 24l * 30l);
Cookies.setCookie("theme", val, date);
return url;
}
/**
* This is the entry point method.
*/
public void onModuleLoad() {
String theme = Window.Location.getParameter("theme");
if (theme == null || theme.isEmpty() || theme.equalsIgnoreCase("blue") || theme.equalsIgnoreCase("default")) {
GXT.setDefaultTheme(Theme.BLUE, true);
loadCss("blue_theme.css");
} else if (theme.equalsIgnoreCase("grey") || theme.equalsIgnoreCase("gray")) {
GXT.setDefaultTheme(Theme.GRAY, true);
loadCss("gray_theme.css");
} else {
GXT.setDefaultTheme(Theme.BLUE, true);
loadCss("blue_theme.css");
}
Registry.register(ID, this);
String url = setLocale();
url = setTheme(url);
if (url != null) {
Window.Location.assign(url);
}
initialize();
if (!GXT.isIE) {
loadCss("firefox.css");
}
// simply register main controller...
final Dispatcher dispatcher = Dispatcher.get();
dispatcher.addController(new WPaloController());
WorkbenchController wBenchController = new WorkbenchController();
dispatcher.addController(wBenchController);
// the left side content:
final ViewBrowserController viewBrowserController = new ViewBrowserController();
wBenchController.setViewBrowserController(viewBrowserController);
dispatcher.addController(viewBrowserController);
// dispatcher.addController(new ReportController());
// dispatcher.addController(new ReportStructureController());
// dispatcher.addController(new ModellerController());
dispatcher.addController(new AdminController());
dispatcher.addController(new AccountController());
// dispatcher.addController(new ViewModeWorkbenchController());
// dispatcher.addController(new ViewModeController());
PrintDialog.setDefaults();
WPaloPropertyServiceProvider.getInstance().getBooleanProperty("isPaloSuite", false,
new AsyncCallback<Boolean>() {
public void onFailure(Throwable arg0) {
parseDefaultLinkData(dispatcher, viewBrowserController);
}
public void onSuccess(Boolean result) {
if (result) {
parsePaloSuiteLinkData(dispatcher, viewBrowserController);
} else {
parseDefaultLinkData(dispatcher, viewBrowserController);
}
}
});
}
private final void initialize() {
// Initialize i18n:
i18n = GWT.create(WPaloConstants.class);
GWT.setUncaughtExceptionHandler(new WPaloUncaughtExceptionHandler());
// init();
// required for palo cube table!!
// PaloTableJSBridge.defineMethods();
// main panel:
if (contentPane == null) {
contentPane = new Viewport();
// {
// protected void onWindowResize(int width, int height) {
// if (waitPanel != null) {
// waitPanel.hide();
// waitPanel = null;
// }
// super.onWindowResize(width, height);
// }
// };
contentPane.setMonitorWindowResize(true);
contentPane.setSize("100%", "100%");
RootPanel.get().add(contentPane);
}
}
// static void onResize() {
// if (waitPanel == null) {
// waitPanel = new BusyIndicatorPanel();
// waitPanel.show("Resizing, please wait...");
// System.out.println("Resizing, please wait...");
// }
// }
// private static native void init() /*-{
// // Magic function defined by the selection script.
// __gwt_initHandlers(
// function() {
// @com.tensegrity.wpalo.client.WPalo::onResize()();
// },
// function() {
// return @com.google.gwt.user.client.Window::onClosing()();
// },
// function() {
// @com.google.gwt.user.client.Window::onClosed()();
// }
// );
// }-*/;
}