/** * Copyright 2008-2016 Qualogy Solutions B.V. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.qualogy.qafe.gwt.client.factory; import org.gwt.mosaic.core.client.Dimension; import org.gwt.mosaic.ui.client.WindowPanel; import com.google.gwt.user.client.Command; import com.google.gwt.user.client.Cookies; import com.google.gwt.user.client.Window; import com.google.gwt.user.client.ui.Hidden; import com.google.gwt.user.client.ui.MenuBar; import com.google.gwt.user.client.ui.MenuItem; import com.google.gwt.user.client.ui.MenuItemSeparator; import com.google.gwt.user.client.ui.RootPanel; import com.google.gwt.user.client.ui.SimplePanel; import com.google.gwt.user.client.ui.Widget; import com.qualogy.qafe.gwt.client.component.QRootPanel; import com.qualogy.qafe.gwt.client.component.QWindowPanel; import com.qualogy.qafe.gwt.client.context.ClientApplicationContext; import com.qualogy.qafe.gwt.client.ui.GWTUIGenerator; import com.qualogy.qafe.gwt.client.ui.renderer.RendererHelper; import com.qualogy.qafe.gwt.client.ui.renderer.events.EventFactory; import com.qualogy.qafe.gwt.client.vo.ui.MenuItemGVO; import com.qualogy.qafe.gwt.client.vo.ui.MenuItemSeparatorGVO; import com.qualogy.qafe.gwt.client.vo.ui.QAFEKeywordsGVO; import com.qualogy.qafe.gwt.client.vo.ui.UIGVO; import com.qualogy.qafe.gwt.client.vo.ui.WindowGVO; import com.qualogy.qafe.gwt.client.vo.ui.event.EventListenerGVO; public class WindowFactory { private static final String LOG_TITLE = "Execution log window"; private static String currentWindowTitle; private WindowFactory() { }; // CHECKSTYLE.OFF: CyclomaticComplexity public static void createWindow(UIGVO ui, String windowId) { Widget w= GWTUIGenerator.createView(ui, windowId); if (ClientApplicationContext.getInstance().isMDI()) { WindowGVO windowGVO = getWindow(ui, windowId); String windowTitle = getWindowTitle(ui, windowId); if (windowGVO != null) { windowTitle = windowGVO.getTitle(); } if (w != null) { WindowPanel window = new QWindowPanel(windowTitle); window.getHeader().setText(windowTitle); if(w instanceof QRootPanel) { ((QWindowPanel)window).setQRootPanel((QRootPanel)w); } window.setAnimationEnabled(true); ((QWindowPanel) window).setManaged(true); // Do not pack the windows if the "width" or "height" attributes // are on boolean bPack = true; // window.updateSize(); if (windowGVO.getHeight() != null && windowGVO.getHeight().length() > 0) { try { int height = Integer.parseInt(windowGVO.getHeight()); // Test if the height is not negative if (height < 0) throw new NumberFormatException(); bPack = false; window.setHeight(height + "px"); } catch (NumberFormatException e) { ClientApplicationContext.getInstance().log("could not set height on Window (it's not a valid integer):" + windowGVO.getHeight()); } } if (windowGVO.getWidth() != null && windowGVO.getWidth().length() > 0) { try { int width = Integer.parseInt(windowGVO.getWidth()); // Test if the width is not negative if (width < 0) throw new NumberFormatException(); bPack = false; window.setWidth(width + "px"); } catch (NumberFormatException e) { ClientApplicationContext.getInstance().log("could not set width on Window (it's not a valid integer):" + windowGVO.getWidth()); } } if (currentWindowTitle == null) currentWindowTitle = windowGVO.getTitle(); if (!windowTitle.equalsIgnoreCase(currentWindowTitle)) { ClientApplicationContext.getInstance().updatePosition(); } currentWindowTitle = windowTitle; int left = ClientApplicationContext.getInstance().getStartXPosition(); int top = ClientApplicationContext.getInstance().getStartYPosition(); if (windowGVO.getLeft() != null) { left = windowGVO.getLeft(); } if (windowGVO.getTop() != null) { top = windowGVO.getTop(); } window.setPopupPosition(left, top); ClientApplicationContext.getInstance().addWindows(ui, window, windowId); if (Cookies.getCookie(ui.getUuid() + "-top-" + windowId) != null && Cookies.getCookie(ui.getUuid() + "-left-" + windowId) != null) { // There is a known bug that causes the parsing of the position stored as string in the cookie to be // returned as a double. double leftPos = Double.parseDouble(Cookies.getCookie(ui.getUuid() + "-left-" + windowId)); double rightPos = Double.parseDouble(Cookies.getCookie(ui.getUuid() + "-top-" + windowId)); int roundedLeftPos = (int)Math.round(leftPos); int roundedRightPos = (int)Math.round(rightPos); window.setPopupPosition(roundedLeftPos, roundedRightPos); } window.setWidget(w); // If the width or the height attributes were set then we don't // pack the window // Use the default width and height that you got in the ClientApplicationContext. if(ClientApplicationContext.getInstance().getGlobalConfigurations().get("window.default.height") != null && windowGVO.getHeight() == null){ window.setHeight(ClientApplicationContext.getInstance().getGlobalConfigurations().get("window.default.height")); bPack = false; } if(ClientApplicationContext.getInstance().getGlobalConfigurations().get("window.default.width") != null && windowGVO.getWidth() == null){ window.setWidth(ClientApplicationContext.getInstance().getGlobalConfigurations().get("window.default.width")); bPack = false; } if (bPack) { window.pack(); if (window.getContentHeight() > (int)(Window.getClientHeight()*0.8)){ Dimension d =window.getContentSize(); Dimension newD = new Dimension(d.getWidth(),Window.getClientHeight()/2); window.setContentSize(newD); } if (window.getContentWidth() > (int)(Window.getClientWidth()*0.8)){ Dimension d =window.getContentSize(); Dimension newD = new Dimension(Window.getClientWidth()/2,d.getHeight()); window.setContentSize(newD); } } window.show(); modifyWindowSize(w, window); EventFactory.createWindowSizeEvent(ui.getUuid(), windowId, window); if (windowGVO != null) { RendererHelper.addStyle(windowGVO.getRootPanel(), ((QWindowPanel)window).getQRootPanel()); if (windowGVO.getClosable() != null) { ((QWindowPanel) window).setClosable(windowGVO.getClosable().booleanValue()); } if (windowGVO.getMaximizable() != null && windowGVO.getMaximizable().booleanValue()) { ((QWindowPanel) window).addMaximizeButton();// setMaximizable(windowGVO.getMaximizable().booleanValue()); } if (windowGVO.getMinimizable() != null && windowGVO.getMinimizable().booleanValue()) { ((QWindowPanel) window).addMinimizeButton(); } if (windowGVO.getResizable() != null) { window.setResizable(windowGVO.getResizable().booleanValue()); } // The id of the ui-window is winId|winId|appId (<id>|<parent>|<context>), // while the id of ui-components within a window is componentId|winId|appId RendererHelper.addId(windowGVO, window, ui.getUuid(), windowGVO.getId(), windowGVO.getContext(), true); RendererHelper.addUUID(windowGVO, window, ui.getUuid()); // /// TODO Check the unload and window actions... EventFactory.createDefaultCloseEvent(windowGVO, window, ClientApplicationContext.getInstance().getWindowSession(),ui.getUuid()); EventFactory.createWindowStateChangeListener(window, windowTitle, ui.getUuid(), windowId); } } else { ClientApplicationContext.getInstance().log("Opening Window failed", "Window with id '" + windowId + "' could not be opened.\n This Window might not exist in this application context", true); } } else { WindowGVO windowGVO = getWindow(ui, windowId); setWidgetToMainPanel(w, windowGVO); } } // CHECKSTYLE.ON: CyclomaticComplexity public static void modifyWindowSize(Widget w, WindowPanel window) { int menuHeight = 0; int toolbarHeight = 0; int extra = 17; if(((QRootPanel)w).getMenuBar() != null && ((QRootPanel)w).getToolbar() == null){ menuHeight = ((QRootPanel)w).getMenuBar().getOffsetHeight(); extra = 25; } if(((QRootPanel)w).getToolbar() != null && ((QRootPanel)w).getMenuBar() == null){ toolbarHeight = ((QRootPanel)w).getToolbar().getOffsetHeight(); extra = 15; } if(((QRootPanel)w).getToolbar() != null && ((QRootPanel)w).getMenuBar() != null){ extra = 74; } int headerHeight = window.getHeader().getOffsetHeight(); int modifiedHeight = window.getContentHeight()+menuHeight+toolbarHeight+headerHeight+extra; window.setHeight(modifiedHeight+"px"); window.setWidth((window.getContentWidth()+26)+"px"); window.show(); } public static void setWidgetToMainPanel(Widget w, WindowGVO windowGVO) { if (w != null) { clearWidgetFromMainPanel(); SimplePanel mainPanel = ClientApplicationContext.getInstance().getMainPanel(); if (mainPanel==null){ mainPanel = new SimplePanel(); mainPanel.setWidth(Window.getClientWidth() + "px"); mainPanel.setHeight(Window.getClientHeight() + "px"); ClientApplicationContext.getInstance().setMainPanel(mainPanel); MenuBar menuBar = ClientApplicationContext.getInstance().getApplicationsMenu(); if(menuBar != null){ menuBar.addStyleName("SDIMenu"); RootPanel.get().add((Widget) mainPanel,0,24); } else { RootPanel.get().add((Widget) mainPanel,0,0); } } w.setWidth(Window.getClientWidth() + "px"); w.setHeight(Window.getClientHeight() + "px"); mainPanel.addStyleName("SDIWrapper"); mainPanel.setWidget(w); w.addStyleName("SDIPanel"); if(windowGVO != null) { RendererHelper.addStyle(windowGVO.getRootPanel(), w); } } } public static void clearWidgetFromMainPanel() { SimplePanel mainPanel = ClientApplicationContext.getInstance().getMainPanel(); if (mainPanel!=null){ Hidden hidden = new Hidden(); mainPanel.setWidget(hidden); } } private static WindowGVO getWindow(UIGVO ui, String windowId) { WindowGVO windowGVO = null; if (ui != null) { WindowGVO[] windows = ui.getWindows(); for (int i = 0; i < windows.length; i++) { if (windowId != null && windowId.equals(windows[i].getId())) { windowGVO = windows[i]; break; } } } return windowGVO; } private static String getWindowTitle(UIGVO ui, String windowId) { String name = null; WindowGVO window = getWindow(ui, windowId); if (window != null) { if (window.getTitle() != null) { name = window.getTitle(); } } // if (ui != null) { // // WindowGVO[] windows = ui.getWindows(); // for (int i = 0; i < windows.length; i++) { // if (windowId != null && windowId.equals(windows[i].getId())) { // if (windows[i].getTitle() != null) { // name = windows[i].getTitle(); // } // break; // } // } // // } return name; } public static Widget createWindow(UIGVO ui) { return GWTUIGenerator.createView(ui); } public static void createMenu(UIGVO systemMenuApp) { if (systemMenuApp != null) { MenuItemGVO systemMenu = systemMenuApp.getMenus(); ClientApplicationContext.getInstance().addMenu(systemMenu.getId(),ClientApplicationContext.getInstance().getMainMenu()); if (systemMenu.getSubMenus() != null) { for (int i = 0; i < systemMenu.getSubMenus().length; i++) { MenuItemGVO root = systemMenu.getSubMenus()[i]; MenuBar menuBar = ClientApplicationContext.getInstance().getMainMenu(); processMenu(systemMenu.getSubMenus()[i], menuBar, systemMenuApp.getUuid()); } } } } private static void processMenu(MenuItemGVO root, MenuBar menuBar, final String uuid) { MenuBar subMenuBar = null; if (QAFEKeywordsGVO.SYSTEM_MENU_APPLICATIONS.equals(root.getId())) { MenuBar applicationsMenu = new MenuBar(true); applicationsMenu.setAutoOpen(true); ClientApplicationContext.getInstance().setApplicationsMenu(applicationsMenu); subMenuBar = ClientApplicationContext.getInstance().getApplicationsMenu(); subMenuBar.setAnimationEnabled(true); subMenuBar.setAutoOpen(true); MenuItem menuItem = GWTUIGenerator.createMenuItem(root.getId(), root.getDisplayname(), uuid, root.getContext(), subMenuBar); menuBar.addItem(menuItem); } if (root.getSubMenus() != null) { if (subMenuBar==null){ subMenuBar = new MenuBar(true); subMenuBar.setAnimationEnabled(true); subMenuBar.setAutoOpen(true); MenuItem menuItem = GWTUIGenerator.createMenuItem(root.getId(), root.getDisplayname(), uuid, root.getContext(), subMenuBar); menuBar.addItem(menuItem); } for (int i = 0; i < root.getSubMenus().length; i++) { processMenu(root.getSubMenus()[i], subMenuBar, uuid); } ClientApplicationContext.getInstance().addMenu(root.getId(),subMenuBar); } else { if (!QAFEKeywordsGVO.SYSTEM_MENU_APPLICATIONS.equals(root.getId())&& root.getDisplayname()!=null && !root.getDisplayname().equals(menuBar.getTitle())) { MenuItem menuItem = new MenuItem(root.getDisplayname(), (Command) null); RendererHelper.fillIn(root, menuItem, uuid, null, root.getContext()); // DOM.setElementAttribute(menuItem.getElement(), "id", // root.getId()); Command cmd = null; if (QAFEKeywordsGVO.SYSTEM_MENUITEM_LOGGING.equals(root.getId())) { cmd = new Command() { public void execute() { } }; } else if (QAFEKeywordsGVO.SYSTEM_MENUITEM_RELOAD.equals(root.getId())) { cmd = new Command() { public void execute() { if (ClientApplicationContext.getInstance().getReloadable()) { MainFactoryActions.processReloadUIFromApplicationContext(); } else { ClientApplicationContext.getInstance().log("Not available", "Reloading of application is only available in debug mode", true); } } }; } else if (QAFEKeywordsGVO.SYSTEM_MENUITEM_TRYME.equals(root.getId())) { cmd = new Command() { public void execute() { if (ClientApplicationContext.getInstance().isDebugMode()) { MainFactory.createTryMeWindow(QAFEKeywordsGVO.SYSTEM_MENUITEM_TRYME); } else { ClientApplicationContext.getInstance().log("Not available", "Try me feature is only available in debug mode", true); } } }; } else if (QAFEKeywordsGVO.SYSTEM_MENUITEM_TRYME_FORMS.equals(root.getId())) { cmd = new Command() { public void execute() { if (ClientApplicationContext.getInstance().isDebugMode()) { MainFactory.createTryMeWindow(QAFEKeywordsGVO.SYSTEM_MENUITEM_TRYME_FORMS); } else { ClientApplicationContext.getInstance().log("Not available", "Try me feature is only available in debug mode", true); } } }; } else { if ((root.getEvents() != null) && (root.getEvents().length > 0)) { EventListenerGVO eventListenerGVO = root.getEvents()[0]; cmd = EventFactory.createCommandListener(menuItem, eventListenerGVO, null); } } menuItem.setCommand(cmd); menuBar.addItem(menuItem); } else if(root instanceof MenuItemSeparatorGVO){ MenuItemSeparator menuItemSeparator = new MenuItemSeparator(); menuBar.addSeparator(menuItemSeparator); //menuBar.addItem((MenuItem)menuItemSeparator); } } } }