Java tutorial
/*! * 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; } }