org.pentaho.mantle.client.ui.xul.MantleController.java Source code

Java tutorial

Introduction

Here is the source code for org.pentaho.mantle.client.ui.xul.MantleController.java

Source

/*!
 * This program is free software; you can redistribute it and/or modify it under the
 * terms of the GNU Lesser General Public License, version 2.1 as published by the Free Software
 * Foundation.
 *
 * You should have received a copy of the GNU Lesser General Public License along with this
 * program; if not, you can obtain a copy at http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html
 * or from the Free Software Foundation, Inc.,
 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * 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 Lesser General Public License for more details.
 *
 * Copyright (c) 2002-2017 Pentaho Corporation..  All rights reserved.
 */

package org.pentaho.mantle.client.ui.xul;

import com.google.gwt.core.client.GWT;
import com.google.gwt.core.client.JavaScriptObject;
import com.google.gwt.core.client.JsArray;
import com.google.gwt.core.client.JsonUtils;
import com.google.gwt.core.client.RunAsyncCallback;
import com.google.gwt.http.client.Request;
import com.google.gwt.http.client.RequestBuilder;
import com.google.gwt.http.client.RequestCallback;
import com.google.gwt.http.client.RequestException;
import com.google.gwt.http.client.Response;
import com.google.gwt.json.client.JSONArray;
import com.google.gwt.json.client.JSONParser;
import com.google.gwt.user.client.Command;
import com.google.gwt.user.client.Element;
import com.google.gwt.user.client.Timer;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.MenuBar;
import com.google.gwt.user.client.ui.MenuItem;
import com.google.gwt.user.client.ui.Widget;
import org.pentaho.gwt.widgets.client.dialogs.MessageDialogBox;
import org.pentaho.gwt.widgets.client.menuitem.PentahoMenuItem;
import org.pentaho.gwt.widgets.client.utils.string.StringTokenizer;
import org.pentaho.mantle.client.admin.ContentCleanerPanel;
import org.pentaho.mantle.client.admin.EmailAdminPanelController;
import org.pentaho.mantle.client.admin.ISysAdminPanel;
import org.pentaho.mantle.client.admin.JsSysAdminPanel;
import org.pentaho.mantle.client.admin.UserRolesAdminPanelController;
import org.pentaho.mantle.client.commands.ShowBrowserCommand;
import org.pentaho.mantle.client.commands.SwitchLocaleCommand;
import org.pentaho.mantle.client.commands.SwitchThemeCommand;
import org.pentaho.mantle.client.events.EventBusUtil;
import org.pentaho.mantle.client.events.FavoritesChangedEvent;
import org.pentaho.mantle.client.events.PerspectivesLoadedEvent;
import org.pentaho.mantle.client.events.PerspectivesLoadedEventHandler;
import org.pentaho.mantle.client.events.RecentsChangedEvent;
import org.pentaho.mantle.client.events.UserSettingsLoadedEvent;
import org.pentaho.mantle.client.events.UserSettingsLoadedEventHandler;
import org.pentaho.mantle.client.messages.Messages;
import org.pentaho.mantle.client.solutionbrowser.SolutionBrowserPanel;
import org.pentaho.mantle.client.solutionbrowser.filelist.FileCommand.COMMAND;
import org.pentaho.mantle.client.solutionbrowser.filepicklist.AbstractFilePickList;
import org.pentaho.mantle.client.solutionbrowser.filepicklist.FavoritePickItem;
import org.pentaho.mantle.client.solutionbrowser.filepicklist.FavoritePickList;
import org.pentaho.mantle.client.solutionbrowser.filepicklist.IFilePickItem;
import org.pentaho.mantle.client.solutionbrowser.filepicklist.IFilePickListListener;
import org.pentaho.mantle.client.solutionbrowser.filepicklist.RecentPickItem;
import org.pentaho.mantle.client.solutionbrowser.filepicklist.RecentPickList;
import org.pentaho.mantle.client.ui.PerspectiveManager;
import org.pentaho.mantle.client.usersettings.IMantleUserSettingsConstants;
import org.pentaho.mantle.client.usersettings.JsSetting;
import org.pentaho.mantle.client.usersettings.UserSettingsManager;
import org.pentaho.ui.xul.XulComponent;
import org.pentaho.ui.xul.XulException;
import org.pentaho.ui.xul.binding.BindingFactory;
import org.pentaho.ui.xul.components.XulMenuitem;
import org.pentaho.ui.xul.components.XulToolbarbutton;
import org.pentaho.ui.xul.containers.XulMenubar;
import org.pentaho.ui.xul.gwt.GwtXulDomContainer;
import org.pentaho.ui.xul.gwt.binding.GwtBindingFactory;
import org.pentaho.ui.xul.gwt.tags.GwtConfirmBox;
import org.pentaho.ui.xul.gwt.tags.GwtMessageBox;
import org.pentaho.ui.xul.impl.AbstractXulEventHandler;
import org.pentaho.ui.xul.stereotype.Bindable;
import org.pentaho.ui.xul.util.XulDialogCallback;

import java.util.HashMap;
import java.util.Map;

public class MantleController extends AbstractXulEventHandler {

    private MantleModel model;

    private XulToolbarbutton openBtn;

    private XulToolbarbutton newBtn;

    private XulToolbarbutton saveBtn;

    private XulToolbarbutton saveAsBtn;

    private XulToolbarbutton newAdhocBtn;

    private XulToolbarbutton contentEditBtn;

    private XulToolbarbutton printBtn;

    private XulMenuitem saveMenuItem;

    private XulMenuitem saveAsMenuItem;

    private XulMenuitem useDescriptionsMenuItem;

    private XulMenuitem showHiddenFilesMenuItem;

    private XulMenubar languageMenu;

    private XulMenubar themesMenu;

    private XulMenubar toolsMenu;

    private XulMenubar recentMenu;

    private XulMenubar favoriteMenu;

    private BindingFactory bf;

    private String overrideContentPanelId;

    private String overrideContentUrl;

    HashMap<String, ISysAdminPanel> sysAdminPanelsMap = new HashMap<String, ISysAdminPanel>();

    RecentPickList recentPickList = RecentPickList.getInstance();

    FavoritePickList favoritePickList = FavoritePickList.getInstance();

    class SysAdminPanelInfo {
        String id;

        String url;

        public SysAdminPanelInfo() {

        };

        public SysAdminPanelInfo(String panelId, String panelUrl) {
            id = panelId;
            url = panelUrl;
        };
    }

    SysAdminPanelInfo adminPanelAwaitingActivation = null;

    public MantleController(MantleModel model) {
        this.model = model;
    }

    /**
     * Called when the Xul Dom is ready, grab all Xul references here.
     */
    @Bindable
    public void init() {

        openBtn = (XulToolbarbutton) document.getElementById("openButton"); //$NON-NLS-1$
        newBtn = (XulToolbarbutton) document.getElementById("newButton"); //$NON-NLS-1$
        saveBtn = (XulToolbarbutton) document.getElementById("saveButton"); //$NON-NLS-1$
        saveAsBtn = (XulToolbarbutton) document.getElementById("saveAsButton"); //$NON-NLS-1$
        printBtn = (XulToolbarbutton) document.getElementById("printButton");

        contentEditBtn = (XulToolbarbutton) document.getElementById("editContentButton"); //$NON-NLS-1$

        bf = new GwtBindingFactory(document);
        bf.createBinding(model, "saveEnabled", saveBtn, "visible"); //$NON-NLS-1$ //$NON-NLS-2$
        bf.createBinding(model, "saveAsEnabled", saveAsBtn, "visible"); //$NON-NLS-1$ //$NON-NLS-2$
        bf.createBinding(model, "contentEditEnabled", contentEditBtn, "visible"); //$NON-NLS-1$ //$NON-NLS-2$
        bf.createBinding(model, "contentEditSelected", this, "editContentSelected"); //$NON-NLS-1$ //$NON-NLS-2$
        bf.createBinding(model, "printVisible", printBtn, "visible");

        saveMenuItem = (XulMenuitem) document.getElementById("saveMenuItem"); //$NON-NLS-1$
        saveAsMenuItem = (XulMenuitem) document.getElementById("saveAsMenuItem"); //$NON-NLS-1$
        useDescriptionsMenuItem = (XulMenuitem) document.getElementById("useDescriptionsMenuItem"); //$NON-NLS-1$
        showHiddenFilesMenuItem = (XulMenuitem) document.getElementById("showHiddenFilesMenuItem"); //$NON-NLS-1$
        languageMenu = (XulMenubar) document.getElementById("languagemenu"); //$NON-NLS-1$
        themesMenu = (XulMenubar) document.getElementById("themesmenu"); //$NON-NLS-1$
        toolsMenu = (XulMenubar) document.getElementById("toolsmenu"); //$NON-NLS-1$
        recentMenu = (XulMenubar) document.getElementById("recentmenu"); //$NON-NLS-1$
        favoriteMenu = (XulMenubar) document.getElementById("favoritesmenu"); //$NON-NLS-1$

        if (PerspectiveManager.getInstance().isLoaded()) {
            PerspectiveManager.getInstance().enablePerspective(PerspectiveManager.OPENED_PERSPECTIVE, false);
        } else {
            EventBusUtil.EVENT_BUS.addHandler(PerspectivesLoadedEvent.TYPE, new PerspectivesLoadedEventHandler() {
                public void onPerspectivesLoaded(PerspectivesLoadedEvent event) {
                    PerspectiveManager.getInstance().enablePerspective(PerspectiveManager.OPENED_PERSPECTIVE,
                            false);
                }
            });
        }

        // install language sub-menus
        Map<String, String> supportedLanguages = Messages.getResourceBundle().getSupportedLanguages();
        if (supportedLanguages != null && supportedLanguages.keySet() != null && !supportedLanguages.isEmpty()) {
            MenuBar langMenu = (MenuBar) languageMenu.getManagedObject();
            langMenu.insertSeparator(0);
            for (String lang : supportedLanguages.keySet()) {
                MenuItem langMenuItem = new MenuItem(supportedLanguages.get(lang), new SwitchLocaleCommand(lang));
                langMenuItem.getElement().setId(supportedLanguages.get(lang) + "_menu_item"); //$NON-NLS-1$
                langMenu.insertItem(langMenuItem, 0);
            }
        }
        buildFavoritesAndRecent(false);

        UserSettingsManager.getInstance().getUserSettings(new AsyncCallback<JsArray<JsSetting>>() {
            public void onSuccess(JsArray<JsSetting> settings) {
                processSettings(settings);
            }

            public void onFailure(Throwable caught) {
            }
        }, false);

        EventBusUtil.EVENT_BUS.addHandler(UserSettingsLoadedEvent.TYPE, new UserSettingsLoadedEventHandler() {
            public void onUserSettingsLoaded(UserSettingsLoadedEvent event) {
                processSettings(event.getSettings());
            }

        });

        // install themes
        RequestBuilder getActiveThemeRequestBuilder = new RequestBuilder(RequestBuilder.GET,
                GWT.getHostPageBaseURL() + "api/theme/active"); //$NON-NLS-1$
        try {
            getActiveThemeRequestBuilder.setHeader("If-Modified-Since", "01 Jan 1970 00:00:00 GMT");
            getActiveThemeRequestBuilder.sendRequest(null, new RequestCallback() {

                public void onError(Request request, Throwable exception) {
                    // showError(exception);
                }

                public void onResponseReceived(Request request, Response response) {
                    final String activeTheme = response.getText();
                    RequestBuilder getThemesRequestBuilder = new RequestBuilder(RequestBuilder.GET,
                            GWT.getHostPageBaseURL() + "api/theme/list"); //$NON-NLS-1$
                    getThemesRequestBuilder.setHeader("If-Modified-Since", "01 Jan 1970 00:00:00 GMT");
                    getThemesRequestBuilder.setHeader("accept", "application/json"); //$NON-NLS-1$ //$NON-NLS-2$

                    try {
                        getThemesRequestBuilder.sendRequest(null, new RequestCallback() {
                            public void onError(Request arg0, Throwable arg1) {
                            }

                            public void onResponseReceived(Request request, Response response) {
                                try {
                                    final String url = GWT.getHostPageBaseURL() + "api/repo/files/canAdminister"; //$NON-NLS-1$
                                    RequestBuilder requestBuilder = new RequestBuilder(RequestBuilder.GET, url);
                                    requestBuilder.setHeader("If-Modified-Since", "01 Jan 1970 00:00:00 GMT");
                                    requestBuilder.setHeader("accept", "text/plain"); //$NON-NLS-1$ //$NON-NLS-2$
                                    requestBuilder.sendRequest(null, new RequestCallback() {

                                        public void onError(Request request, Throwable caught) {
                                        }

                                        public void onResponseReceived(Request request, Response response) {
                                            toolsMenu.setVisible("true".equalsIgnoreCase(response.getText())); //$NON-NLS-1$
                                            showHiddenFilesMenuItem
                                                    .setVisible("true".equalsIgnoreCase(response.getText())); //$NON-NLS-1$
                                        }

                                    });
                                } catch (RequestException e) {
                                    Window.alert(e.getMessage());
                                }

                                JsArray<JsTheme> themes = JsTheme
                                        .getThemes(JsonUtils.escapeJsonForEval(response.getText()));

                                for (int i = 0; i < themes.length(); i++) {
                                    JsTheme theme = themes.get(i);
                                    PentahoMenuItem themeMenuItem = new PentahoMenuItem(theme.getName(),
                                            new SwitchThemeCommand(theme.getId()));
                                    themeMenuItem.getElement().setId(theme.getId() + "_menu_item"); //$NON-NLS-1$
                                    themeMenuItem.setChecked(theme.getId().equals(activeTheme));
                                    ((MenuBar) themesMenu.getManagedObject()).addItem(themeMenuItem);
                                }

                                bf.createBinding(model, "saveEnabled", saveMenuItem, "visible"); //$NON-NLS-1$ //$NON-NLS-2$
                                bf.createBinding(model, "saveAsEnabled", saveAsMenuItem, "visible"); //$NON-NLS-1$ //$NON-NLS-2$

                                if (PerspectiveManager.getInstance().isLoaded()) {
                                    executeAdminContent();
                                } else {
                                    EventBusUtil.EVENT_BUS.addHandler(PerspectivesLoadedEvent.TYPE,
                                            new PerspectivesLoadedEventHandler() {
                                                public void onPerspectivesLoaded(PerspectivesLoadedEvent event) {
                                                    executeAdminContent();
                                                }
                                            });
                                }

                                setupNativeHooks(MantleController.this);
                            }
                        });

                    } catch (RequestException e) {
                        // showError(e);
                    }
                }

            });

        } catch (RequestException e) {
            Window.alert(e.getMessage());
            // showError(e);
        }
    }

    public void processSettings(JsArray<JsSetting> settings) {
        if (settings == null) {
            return;
        }

        for (int i = 0; i < settings.length(); i++) {
            JsSetting setting = settings.get(i);
            try {
                if (IMantleUserSettingsConstants.MANTLE_SHOW_NAVIGATOR.equals(setting.getName())) {
                    boolean showNavigator = "true".equals(setting.getValue()); //$NON-NLS-1$
                    model.setShowNavigatorSelected(showNavigator);
                } else if (IMantleUserSettingsConstants.MANTLE_SHOW_DESCRIPTIONS_FOR_TOOLTIPS
                        .equals(setting.getName())) {
                    boolean checked = "true".equals(setting.getValue()); //$NON-NLS-1$
                    ((PentahoMenuItem) useDescriptionsMenuItem.getManagedObject()).setChecked(checked);
                } else if (IMantleUserSettingsConstants.MANTLE_SHOW_HIDDEN_FILES.equals(setting.getName())) {
                    boolean checked = "true".equals(setting.getValue()); //$NON-NLS-1$
                    ((PentahoMenuItem) showHiddenFilesMenuItem.getManagedObject()).setChecked(checked);
                }
            } catch (Exception e) {
                MessageDialogBox dialogBox = new MessageDialogBox(Messages.getString("error"), //$NON-NLS-1$
                        Messages.getString("couldNotGetUserSettings"), false, false, true); //$NON-NLS-1$
                dialogBox.center();
            }
        }

    }

    /**
     * 
     * @param force
     *          Force the reload of user settings from server rather than use cache.
     * 
     */
    public void buildFavoritesAndRecent(boolean force) {

        loadRecentAndFavorites(force);
        refreshPickListMenu(recentMenu, recentPickList, PickListType.RECENT);
        refreshPickListMenu(favoriteMenu, favoritePickList, PickListType.FAVORITE);

        recentPickList.addPickListListener(new IFilePickListListener<RecentPickItem>() {

            public void itemsChanged(AbstractFilePickList<RecentPickItem> filePickList) {
                refreshPickListMenu(recentMenu, recentPickList, PickListType.RECENT);
                recentPickList.save("recent");
            }

            public void onSaveComplete(AbstractFilePickList<RecentPickItem> filePickList) {
                EventBusUtil.EVENT_BUS.fireEvent(new RecentsChangedEvent());
            }
        });

        favoritePickList.addPickListListener(new IFilePickListListener<FavoritePickItem>() {

            public void itemsChanged(AbstractFilePickList<FavoritePickItem> filePickList) {
                refreshPickListMenu(favoriteMenu, favoritePickList, PickListType.FAVORITE);
                favoritePickList.save("favorites");
            }

            public void onSaveComplete(AbstractFilePickList<FavoritePickItem> filePickList) {
                EventBusUtil.EVENT_BUS.fireEvent(new FavoritesChangedEvent());
            }
        });
    }

    /**
     * Loads an arbitrary <code>FilePickList</code> into a menu
     * 
     * @param pickMenu
     *          The XulMenuBar to host the menu entries
     * @param filePickList
     *          The files to list in natural order
     */
    private void refreshPickListMenu(XulMenubar pickMenu,
            final AbstractFilePickList<? extends IFilePickItem> filePickList, PickListType type) {
        final MenuBar menuBar = (MenuBar) pickMenu.getManagedObject();
        menuBar.clearItems();

        final String menuClearMessage = Messages.getString(type.getMenuItemKey());
        final String clearMessage = Messages.getString(type.getMessageKey());

        if (filePickList.size() > 0) {
            for (IFilePickItem filePickItem : filePickList.getFilePickList()) {
                final String text = filePickItem.getFullPath();
                menuBar.addItem(filePickItem.getTitle(), new Command() {
                    public void execute() {
                        SolutionBrowserPanel.getInstance().openFile(text, COMMAND.RUN);
                    }
                });
            }
            menuBar.addSeparator();
            menuBar.addItem(menuClearMessage, new Command() {
                public void execute() {
                    // confirm the clear
                    GwtConfirmBox warning = new GwtConfirmBox();
                    warning.setHeight(117);
                    warning.setMessage(clearMessage);
                    warning.setTitle(menuClearMessage);
                    warning.setAcceptLabel(Messages.getString("clearRecentAcceptButtonLabel"));
                    warning.setCancelLabel(Messages.getString("clearRecentCancelButtonLabel"));
                    warning.addDialogCallback(new XulDialogCallback<String>() {
                        public void onClose(XulComponent sender, Status returnCode, String retVal) {
                            if (returnCode == Status.ACCEPT) {
                                filePickList.clear();
                            }
                        }

                        public void onError(XulComponent sender, Throwable t) {
                        }
                    });
                    warning.show();
                }
            });
        } else {
            menuBar.addItem(Messages.getString("empty"), new Command() { //$NON-NLS-1$
                public void execute() {
                    // Do nothing
                }
            });
        }
    }

    private void loadRecentAndFavorites(boolean force) {
        UserSettingsManager.getInstance().getUserSettings(new AsyncCallback<JsArray<JsSetting>>() {

            public void onSuccess(JsArray<JsSetting> result) {
                if (result == null) {
                    return;
                }
                JsSetting setting;
                for (int j = 0; j < result.length(); j++) {
                    setting = result.get(j);
                    if ("favorites".equalsIgnoreCase(setting.getName())) { //$NON-NLS-1$
                        try {
                            // handle favorite
                            JSONArray favorites = JSONParser.parseLenient(setting.getValue()).isArray();
                            if (favorites != null) {
                                // Create the FavoritePickList object from the JSONArray
                                favoritePickList = FavoritePickList.getInstanceFromJSON(favorites);
                            } else {
                                favoritePickList = FavoritePickList.getInstance();
                            }
                        } catch (Throwable t) {
                            //ignore
                        }
                    } else if ("recent".equalsIgnoreCase(setting.getName())) { //$NON-NLS-1$
                        try {
                            // handle recent
                            JSONArray recents = JSONParser.parseLenient(setting.getValue()).isArray();
                            if (recents != null) {
                                // Create the RecentPickList object from the JSONArray
                                recentPickList = RecentPickList.getInstanceFromJSON(recents);
                            } else {
                                recentPickList = RecentPickList.getInstance();
                            }
                            recentPickList.setMaxSize(10);
                        } catch (Throwable t) {
                            //ignore
                        }
                    }
                }
            }

            public void onFailure(Throwable caught) {
            }

        }, force);
    }

    private void executeAdminContent() {

        try {
            RequestCallback internalCallback = new RequestCallback() {

                public void onError(Request request, Throwable exception) {
                }

                public void onResponseReceived(Request request, Response response) {
                    JsArray<JsSetting> jsSettings = null;
                    try {
                        jsSettings = JsSetting.parseSettingsJson(response.getText());
                    } catch (Throwable t) {
                        // happens when there are no settings
                    }
                    if (jsSettings == null) {
                        return;
                    }
                    for (int i = 0; i < jsSettings.length(); i++) {
                        String content = jsSettings.get(i).getValue();
                        StringTokenizer nameValuePairs = new StringTokenizer(content, ";"); //$NON-NLS-1$
                        String perspective = null, content_panel_id = null, content_url = null;
                        for (int j = 0; j < nameValuePairs.countTokens(); j++) {
                            String currentToken = nameValuePairs.tokenAt(j).trim();
                            if (currentToken.startsWith("perspective=")) { //$NON-NLS-1$
                                perspective = currentToken.substring("perspective=".length()); //$NON-NLS-1$
                            }
                            if (currentToken.startsWith("content-panel-id=")) { //$NON-NLS-1$
                                content_panel_id = currentToken.substring("content-panel-id=".length()); //$NON-NLS-1$
                            }
                            if (currentToken.startsWith("content-url=")) { //$NON-NLS-1$
                                content_url = currentToken.substring("content-url=".length()); //$NON-NLS-1$
                            }
                        }

                        if (content_panel_id != null && content_url != null) {
                            overrideContentPanelId = content_panel_id;
                            overrideContentUrl = content_url;
                        }

                        if (perspective != null) {
                            PerspectiveManager.getInstance().setPerspective(perspective);
                        }

                        if (perspective == null && content_panel_id == null && content_url == null) {
                            GwtMessageBox warning = new GwtMessageBox();
                            warning.setTitle(Messages.getString("warning")); //$NON-NLS-1$
                            warning.setMessage(content);
                            warning.setButtons(new Object[GwtMessageBox.ACCEPT]);
                            warning.setAcceptLabel(Messages.getString("close")); //$NON-NLS-1$
                            warning.show();
                        }
                    }
                }
            };

            RequestBuilder builder = new RequestBuilder(RequestBuilder.GET,
                    GWT.getHostPageBaseURL() + "api/mantle/getAdminContent"); //$NON-NLS-1$
            builder.setHeader("If-Modified-Since", "01 Jan 1970 00:00:00 GMT");
            builder.setHeader("accept", "application/json"); //$NON-NLS-1$ //$NON-NLS-2$
            builder.sendRequest(null, internalCallback);
            // TO DO Reset the menuItem click for browser and workspace here?
        } catch (RequestException e) {
            //ignore
        }
    }

    public native void setupNativeHooks(MantleController controller)
    /*-{
      $wnd.mantle_isToolbarButtonEnabled = function(id) {
        //CHECKSTYLE IGNORE LineLength FOR NEXT 1 LINES
        return controller.@org.pentaho.mantle.client.ui.xul.MantleController::isToolbarButtonEnabled(Ljava/lang/String;)(id);      
      }
      $wnd.mantle_setToolbarButtonEnabled = function(id, enabled) {
        //CHECKSTYLE IGNORE LineLength FOR NEXT 1 LINES
        controller.@org.pentaho.mantle.client.ui.xul.MantleController::setToolbarButtonEnabled(Ljava/lang/String;Z)(id, enabled);      
      }
      $wnd.mantle_doesToolbarButtonExist = function(id) {
        //CHECKSTYLE IGNORE LineLength FOR NEXT 1 LINES
        return controller.@org.pentaho.mantle.client.ui.xul.MantleController::doesToolbarButtonExist(Ljava/lang/String;)(id);      
      }
      $wnd.mantle_isMenuItemEnabled = function(id) {
        //CHECKSTYLE IGNORE LineLength FOR NEXT 1 LINES
        return controller.@org.pentaho.mantle.client.ui.xul.MantleController::isMenuItemEnabled(Ljava/lang/String;)(id);      
      }
      $wnd.mantle_setMenuBarEnabled = function(id, enabled) {
      //CHECKSTYLE IGNORE LineLength FOR NEXT 1 LINES
      controller.@org.pentaho.mantle.client.ui.xul.MantleController::setMenuBarEnabled(Ljava/lang/String;Z)(id, enabled);
        }
      $wnd.mantle_setMenuItemEnabled = function(id, enabled) {
        //CHECKSTYLE IGNORE LineLength FOR NEXT 1 LINES
        controller.@org.pentaho.mantle.client.ui.xul.MantleController::setMenuItemEnabled(Ljava/lang/String;Z)(id, enabled);      
      }
      $wnd.mantle_doesMenuItemExist = function(id) {
        //CHECKSTYLE IGNORE LineLength FOR NEXT 1 LINES
        return controller.@org.pentaho.mantle.client.ui.xul.MantleController::doesMenuItemExist(Ljava/lang/String;)(id);      
      }
      $wnd.mantle_loadOverlay = function(id) { 
        controller.@org.pentaho.mantle.client.ui.xul.MantleController::loadOverlay(Ljava/lang/String;)(id);      
      }
      $wnd.mantle_removeOverlay = function(id) { 
        controller.@org.pentaho.mantle.client.ui.xul.MantleController::removeOverlay(Ljava/lang/String;)(id);      
      }    
      $wnd.mantle_registerSysAdminPanel = function(sysAdminPanel) {
        //CHECKSTYLE IGNORE LineLength FOR NEXT 1 LINES
        controller.@org.pentaho.mantle.client.ui.xul.MantleController::registerSysAdminPanel(Lorg/pentaho/mantle/client/admin/JsSysAdminPanel;)(sysAdminPanel);      
      } 
      $wnd.mantle_activateWaitingSecurityPanel = function(okToSwitchToNewPanel) {
        //CHECKSTYLE IGNORE LineLength FOR NEXT 1 LINES
        controller.@org.pentaho.mantle.client.ui.xul.MantleController::activateWaitingSecurityPanel(Z)(okToSwitchToNewPanel);      
      } 
      $wnd.mantle_enableUsersRolesTreeItem = function(enabled) { 
        controller.@org.pentaho.mantle.client.ui.xul.MantleController::enableUsersRolesTreeItem(Z)(enabled);      
      } 
      $wnd.mantle_selectAdminCatTreeTreeItem = function(treeLabel) {
        //CHECKSTYLE IGNORE LineLength FOR NEXT 1 LINES
        controller.@org.pentaho.mantle.client.ui.xul.MantleController::selectAdminCatTreeTreeItem(Ljava/lang/String;)(treeLabel);      
      }
      $wnd.mantle_buildFavoritesAndRecent = function(force) {
        controller.@org.pentaho.mantle.client.ui.xul.MantleController::buildFavoritesAndRecent(Z)(force);
      }
    }-*/;

    public void enableUsersRolesTreeItem(boolean enabled) {
        MantleXul.getInstance().enableUsersRolesTreeItem(enabled);
    }

    public void selectAdminCatTreeTreeItem(String treeLabel) {
        MantleXul.getInstance().selectAdminCatTreeTreeItem(treeLabel);
    }

    public void registerSysAdminPanel(JsSysAdminPanel sysAdminPanel) {
        sysAdminPanelsMap.put(sysAdminPanel.getId(), sysAdminPanel);
    }

    public void activateWaitingSecurityPanel(boolean activate) {
        if (activate && (adminPanelAwaitingActivation != null)) {
            for (int i = 0; i < MantleXul.getInstance().getAdminContentDeck().getWidgetCount(); i++) {
                Widget w = MantleXul.getInstance().getAdminContentDeck().getWidget(i);
                if (adminPanelAwaitingActivation.id.equals(w.getElement().getId())) {
                    ISysAdminPanel sysAdminPanel = sysAdminPanelsMap.get(adminPanelAwaitingActivation.id);
                    if (sysAdminPanel != null) {
                        sysAdminPanel.activate();
                    }
                    break;
                }
            }

            GWT.runAsync(new RunAsyncCallback() {
                public void onSuccess() {
                    if (UserRolesAdminPanelController.getInstance().getId()
                            .equals(adminPanelAwaitingActivation.id)) {
                        model.loadUserRolesAdminPanel();
                        UserRolesAdminPanelController.getInstance().getElement()
                                .setId((UserRolesAdminPanelController.getInstance()).getId());
                    } else if ((EmailAdminPanelController.getInstance()).getId()
                            .equals(adminPanelAwaitingActivation.id)) {
                        model.loadEmailAdminPanel();
                        EmailAdminPanelController.getInstance().getElement()
                                .setId((EmailAdminPanelController.getInstance()).getId());
                    } else if ((ContentCleanerPanel.getInstance()).getId()
                            .equals(adminPanelAwaitingActivation.id)) {
                        model.loadSettingsPanel();
                        ContentCleanerPanel.getInstance().getElement()
                                .setId((ContentCleanerPanel.getInstance()).getId());
                    } else {
                        model.loadAdminContent(adminPanelAwaitingActivation.id, adminPanelAwaitingActivation.url);
                    }
                }

                public void onFailure(Throwable reason) {
                }
            });

        } else if (!activate) {
            adminPanelAwaitingActivation = null;
        }
    }

    public boolean isToolbarButtonEnabled(String id) {
        XulToolbarbutton button = (XulToolbarbutton) document.getElementById(id);
        return !button.isDisabled();
    }

    public void setToolbarButtonEnabled(String id, boolean enabled) {
        XulToolbarbutton button = (XulToolbarbutton) document.getElementById(id);
        button.setDisabled(!enabled);
    }

    public boolean doesToolbarButtonExist(String id) {
        try {
            XulToolbarbutton button = (XulToolbarbutton) document.getElementById(id);
            return (button != null);
        } catch (Throwable t) {
            return false;
        }
    }

    @Bindable
    public void setEditContentSelected(boolean selected) {
        contentEditBtn.setSelected(selected, false);
    }

    @Bindable
    public void openClicked() {
        model.executeOpenFileCommand();
    }

    @Bindable
    public void newClicked() {
        model.launchNewDropdownCommand(newBtn);
    }

    @Bindable
    public void saveClicked() {
        model.executeSaveCommand();
    }

    @Bindable
    public void saveAsClicked() {
        model.executeSaveAsCommand();
    }

    @Bindable
    public void showNavigatorClicked() {
        boolean show = !model.isShowNavigatorSelected();
        model.setShowNavigatorSelected(show); // toggle first
        ShowBrowserCommand showBrowserCommand = new ShowBrowserCommand(show);
        showBrowserCommand.execute();
    }

    @Bindable
    public void setSaveEnabled(boolean flag) {
        // called by the MainToolbarModel to change state.
        saveBtn.setVisible(flag);
    }

    @Bindable
    public void setSaveAsEnabled(boolean flag) {
        // called by the MainToolbarModel to change state.
        saveAsBtn.setVisible(flag);
    }

    @Override
    public String getName() {
        return "mantleXulHandler"; //$NON-NLS-1$
    }

    @Bindable
    public void executeCallback(String jsScript) {
        executeJS(model.getCallback(), jsScript);
    }

    @Bindable
    public void executeMantleFunc(String funct) {
        executeMantleCall(funct);
    }

    private native void executeMantleCall(String js)
    /*-{
      try{
        $wnd.eval(js);
      } catch (e){
        try {
    console.warn( "Error invoking: " + js + ": " + e.message );
        } catch ( ignore ) {}
      }
    }-*/;

    private void passivateActiveSecurityPanels(final String idOfSecurityPanelToBeActivated,
            final String urlOfSecurityPanelToBeActivated) {
        adminPanelAwaitingActivation = new SysAdminPanelInfo(idOfSecurityPanelToBeActivated,
                urlOfSecurityPanelToBeActivated);
        int visiblePanelIndex = MantleXul.getInstance().getAdminContentDeck().getVisibleWidget();
        if (visiblePanelIndex >= 0) {
            String visiblePanelId = MantleXul.getInstance().getAdminContentDeck().getWidget(visiblePanelIndex)
                    .getElement().getId();
            if ((visiblePanelId != null) && !visiblePanelId.equals(idOfSecurityPanelToBeActivated)) {
                ISysAdminPanel sysAdminPanel = sysAdminPanelsMap.get(visiblePanelId);
                if (sysAdminPanel != null) {
                    sysAdminPanel.passivate(new AsyncCallback<Boolean>() {
                        public void onFailure(Throwable caught) {
                        }

                        public void onSuccess(Boolean passivateComplete) {
                            if (passivateComplete) {
                                activateWaitingSecurityPanel(passivateComplete);
                            }
                        }
                    });
                } else {
                    activateWaitingSecurityPanel(true);
                }
            } else {
                activateWaitingSecurityPanel(false);
            }
        } else {
            activateWaitingSecurityPanel(true);
        }
    }

    @Bindable
    public void loadAdminContent(final String panelId, final String url) {
        passivateActiveSecurityPanels(panelId, url);
    }

    @Bindable
    public void loadSettingsPanel() {
        GWT.runAsync(new RunAsyncCallback() {
            public void onSuccess() {
                String contentCleanerPanelId = ContentCleanerPanel.getInstance().getId();
                if (!sysAdminPanelsMap.containsKey(contentCleanerPanelId)) {
                    sysAdminPanelsMap.put(contentCleanerPanelId, ContentCleanerPanel.getInstance());
                }
                loadAdminContent(contentCleanerPanelId, null);
            }

            public void onFailure(Throwable reason) {
            }
        });
    }

    @Bindable
    public void loadUserRolesAdminPanel() {
        GWT.runAsync(new RunAsyncCallback() {
            public void onSuccess() {

                if (overrideContentPanelId != null && overrideContentUrl != null) {
                    loadAdminContent(overrideContentPanelId, overrideContentUrl);
                    overrideContentPanelId = null;
                    overrideContentUrl = null;
                } else {
                    String usersAndGroupsPanelId = UserRolesAdminPanelController.getInstance().getId();
                    if (!sysAdminPanelsMap.containsKey(usersAndGroupsPanelId)) {
                        sysAdminPanelsMap.put(usersAndGroupsPanelId, UserRolesAdminPanelController.getInstance());
                    }
                    loadAdminContent(usersAndGroupsPanelId, null);
                }
            }

            public void onFailure(Throwable reason) {
            }
        });
    }

    @Bindable
    public void loadEmailAdminPanel() {
        GWT.runAsync(new RunAsyncCallback() {
            public void onSuccess() {
                String emailPanelId = EmailAdminPanelController.getInstance().getId();
                if (!sysAdminPanelsMap.containsKey(emailPanelId)) {
                    sysAdminPanelsMap.put(emailPanelId, EmailAdminPanelController.getInstance());
                }
                loadAdminContent(emailPanelId, null);
            }

            public void onFailure(Throwable reason) {
            }
        });
    }

    @Bindable
    public void executeMantleCommand(String cmd) {
        String js = "executeCommand('" + cmd + "')"; //$NON-NLS-1$ //$NON-NLS-2$
        executeMantleCall(js);
    }

    private native void executeJS(JavaScriptObject obj, String js)
    /*-{
      try{
        var tempObj = obj;
        eval("tempObj."+js);
      } catch (e){
        $wnd.mantle_showMessage("Javascript Error",e.message+"          "+"tempObj."+js);
      }
    }-*/;

    @Bindable
    public native void openUrl(String title, String name, String uri)
    /*-{
      try {
        $wnd.eval("openURL('"+name+"','"+title+"','"+uri+"')");
      } catch (e) {
        $wnd.mantle_showMessage("Javascript Error",e.message);
      }
    }-*/;

    @Bindable
    public void setContentEditEnabled(boolean enable) {
        contentEditBtn.setVisible(enable);
    }

    @Bindable
    public void setContentEditSelected(boolean selected) {
        contentEditBtn.setSelected(selected);
    }

    @Bindable
    /*
     * Notifies currently active Javascript callback of an edit event.
     */
    public void editContentClicked() {
        // set delay for edit/view mode switching
        setContentEditEnabled(false);
        Timer loadOverlayTimer = new Timer() {
            public void run() {
                setContentEditEnabled(true);
            }
        };
        loadOverlayTimer.schedule(1800);

        model.setContentEditToggled();

        executeEditContentCallback(
                SolutionBrowserPanel.getInstance().getContentTabPanel().getCurrentFrame().getFrame().getElement(),
                model.isContentEditSelected());
    }

    @Bindable
    public void printClicked() {
        model.executePrintCommand();
    }

    private native void executeEditContentCallback(Element obj, boolean selected)
    /*-{
      try {
        obj.contentWindow.editContentToggled(selected);
      } catch (e){if(console){console.log(e);}}
    }-*/;

    public MantleModel getModel() {

        return model;
    }

    public void setModel(MantleModel model) {

        this.model = model;
    }

    public boolean isMenuItemEnabled(String id) {
        XulMenuitem item = (XulMenuitem) document.getElementById(id);
        return !item.isDisabled();
    }

    public void setMenuItemEnabled(String id, boolean enabled) {
        XulMenuitem item = (XulMenuitem) document.getElementById(id);
        item.setDisabled(!enabled);
    }

    public void setMenuBarEnabled(String id, boolean enabled) {
        XulMenubar bar = (XulMenubar) document.getElementById(id);
        bar.setVisible(enabled);
    }

    public void setToolBarButtonEnabled(String id, boolean enabled) {
        XulToolbarbutton button = (XulToolbarbutton) document.getElementById(id);
        button.setVisible(enabled);
    }

    public boolean doesMenuItemExist(String id) {
        try {
            XulMenuitem item = (XulMenuitem) document.getElementById(id);
            return (item != null);
        } catch (Throwable t) {
            return false;
        }
    }

    @Bindable
    public boolean isSaveEnabled() {
        return saveMenuItem.isVisible();
    }

    @Bindable
    public boolean isSaveAsEnabled() {
        return saveAsMenuItem.isVisible();
    }

    @Bindable
    public void propertiesClicked() {
        model.executePropertiesCommand();
    }

    @Bindable
    public void shareContentClicked() {
        model.executeShareContent();
    }

    @Bindable
    public void scheduleContentClicked() {
        model.executeScheduleContent();
    }

    @Bindable
    public void useDescriptionsForTooltipsClicked() {
        boolean checked = ((PentahoMenuItem) useDescriptionsMenuItem.getManagedObject()).isChecked();
        ((PentahoMenuItem) useDescriptionsMenuItem.getManagedObject()).setChecked(!checked);
        model.toggleUseDescriptionsForTooltips();
    }

    @Bindable
    public void showHiddenFilesClicked() {
        boolean checked = ((PentahoMenuItem) showHiddenFilesMenuItem.getManagedObject()).isChecked();
        ((PentahoMenuItem) showHiddenFilesMenuItem.getManagedObject()).setChecked(!checked);
        SolutionBrowserPanel.getInstance().toggleShowHideFilesCommand.execute();
    }

    @Bindable
    public void refreshContent() {

        model.refreshContent();
    }

    @Bindable
    public void documentationClicked() {
        model.openDocumentation();
    }

    @Bindable
    public void kettleStatusPageClicked() {
        model.openKettleStatusPage();
    }

    public void loadOverlay(String id) {
        // TODO We need to convert ths to use the common interface method,
        // once they become available
        GwtXulDomContainer container = (GwtXulDomContainer) getXulDomContainer();
        try {
            container.loadOverlay(id);
        } catch (XulException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    public void removeOverlay(String id) {
        // TODO We need to convert ths to use the common interface method,
        // once they become available
        GwtXulDomContainer container = (GwtXulDomContainer) getXulDomContainer();
        try {
            container.removeOverlay(id);
        } catch (XulException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

}

enum PickListType {
    FAVORITE("clearFavoriteList", "clearFavoriteItemsMessage"), RECENT("clearRecentList",
            "clearRecentItemsMessage");

    String menuItemKey = null;
    String messageKey = null;

    PickListType(String menuItemKey, String messageKey) {
        this.menuItemKey = menuItemKey;
        this.messageKey = messageKey;
    }

    String getMenuItemKey() {
        return this.menuItemKey;
    }

    String getMessageKey() {
        return this.messageKey;
    }

}