/* This file belongs to the Servoy development and deployment environment, Copyright (C) 1997-2010 Servoy BV This program is free software; you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. 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 Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program; if not, see http://www.gnu.org/licenses or write to the Free Software Foundation,Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 */ package com.servoy.j2db.server.headlessclient; import java.awt.Dimension; import java.awt.Insets; import java.awt.Rectangle; import javax.swing.border.Border; import org.apache.wicket.Application; import org.apache.wicket.Page; import org.apache.wicket.RequestCycle; import com.servoy.j2db.FormController; import com.servoy.j2db.FormManager; import com.servoy.j2db.IMainContainer; import com.servoy.j2db.IWebClientApplication; import com.servoy.j2db.persistence.Form; import com.servoy.j2db.plugins.IWebRuntimeWindow; import com.servoy.j2db.scripting.JSWindow; import com.servoy.j2db.scripting.RuntimeWindow; import com.servoy.j2db.server.headlessclient.dataui.WebDefaultRecordNavigator; import com.servoy.j2db.util.ComponentFactoryHelper; /** * Web implementation of the JSWindow. * @author acostescu * @since 6.0 */ public class WebRuntimeWindow extends RuntimeWindow implements IWebRuntimeWindow { public WebRuntimeWindow(IWebClientApplication application, String windowName, int windowType, RuntimeWindow parentWindow) { super(application, windowName, windowType, parentWindow); } @Override public IWebClientApplication getApplication() { return (IWebClientApplication)super.getApplication(); } @Override protected void doOldShow(String formName, boolean closeAll, boolean legacyV3Behavior) { FormManager fm = (FormManager)getApplication().getFormManager(); IMainContainer parentContainer = getParentContainerForShow(fm); IMainContainer dialogContainer = fm.getOrCreateMainContainer(windowName); //calling container can be set just after the creation of the container (needed for browser back button (wicket undo)) ((MainPage)dialogContainer).setCallingContainerIfNull((MainPage)parentContainer); if (formName != null) { final FormController fp = fm.showFormInMainPanel(formName, dialogContainer, title, closeAll || !legacyV3Behavior, windowName); if (fp != null && fp.getName().equals(formName) && dialogContainer != parentContainer) { Rectangle r2; if (FormManager.FULL_SCREEN.equals(initialBounds)) { r2 = initialBounds; } else { r2 = getSizeAndLocation(initialBounds, dialogContainer, fp); if (Application.get().getDebugSettings().isAjaxDebugModeEnabled()) { r2.height += 40; } } if (windowType == JSWindow.WINDOW) { ((MainPage)parentContainer).showPopupWindow((MainPage)dialogContainer, title, r2, resizable, closeAll || !legacyV3Behavior); } else { ((MainPage)parentContainer).showPopupDiv((MainPage)dialogContainer, title, r2, isUndecorated() ? false : resizable, closeAll || !legacyV3Behavior, (windowType == JSWindow.MODAL_DIALOG), isUndecorated(), storeBounds, getOpacity(), getTransparent()); } } } if (getTitle() != null) setTitle(getTitle()); if (windowType == JSWindow.MODAL_DIALOG && ((WebClient)getApplication()).getEventDispatcher() != null) { ((WebClient)getApplication()).getEventDispatcher().suspend(this); } } private IMainContainer getParentContainerForShow(FormManager fm) { IMainContainer parentContainer = null; if (initialParentWindow != null && initialParentWindow.isVisible()) parentContainer = fm.getMainContainer(initialParentWindow.getName()); if (parentContainer == null) parentContainer = fm.getCurrentContainer(); return parentContainer; } @Override public int getHeight() { MainPage mp = getMainPage(); if (mp == null) mp = (MainPage)((FormManager)getApplication().getFormManager()).getMainContainer(null); if (mp != null) return mp.getHeight(); // can never be null normally... else return 0; } @Override public int getWidth() { MainPage mp = getMainPage(); if (mp == null) mp = (MainPage)((FormManager)getApplication().getFormManager()).getMainContainer(null); if (mp != null) return mp.getWidth(); // can never be null normally... else return 0; } @Override public int getX() { MainPage mp = getMainPage(); if (mp == null) mp = (MainPage)((FormManager)getApplication().getFormManager()).getMainContainer(null); if (mp != null) return mp.getX(); // can never be null normally... else return 0; } @Override public int getY() { MainPage mp = getMainPage(); if (mp == null) mp = (MainPage)((FormManager)getApplication().getFormManager()).getMainContainer(null); if (mp != null) return mp.getY(); // can never be null normally... else return 0; } /* * (non-Javadoc) * * @see com.servoy.j2db.scripting.RuntimeWindow#hide(boolean) */ // @Override // public boolean hide(boolean closeAll) // { // boolean hide = super.hide(closeAll); // if (hide && (windowType == JSWindow.MODAL_DIALOG)) // { // IFunctionExecutor executor = (IFunctionExecutor)getApplication().getScriptEngine(); // executor.resume(this); // } // return hide; // } @Override public void hideUI() { MainPage mp = getMainPage(); if (mp != null) mp.close(); if (windowType == JSWindow.MODAL_DIALOG && ((WebClient)getApplication()).getEventDispatcher() != null) { ((WebClient)getApplication()).getEventDispatcher().resume(this); } } @Override public void setTitle(String title) { setTitle(title, false); } @Override public void setTitle(final String title, boolean delayed) { super.setTitle(title); final MainPage mp = getMainPage(); if (mp != null) { if (delayed) { getApplication().invokeLater(new Runnable() { public void run() { // see FormManager showFormInMainPanel, title is set delayed, have to delay here also mp.setTitle(title); } }); } else { mp.setTitle(title); } } } @Override public Object getWrappedObject() { return null; // not yet used in WC } @Override public void setLocation(int x, int y) { initialBounds.x = x; initialBounds.y = y; MainPage dialogContainer = (MainPage)((FormManager)getApplication().getFormManager()).getOrCreateMainContainer(windowName); if (windowType == JSWindow.WINDOW) { if (dialogContainer != null && dialogContainer.isShowingInWindow()) { dialogContainer.appendJavaScriptChanges("window.moveTo(" + x + "," + y + ");"); } } else { if (dialogContainer != null && dialogContainer.isShowingInDialog()) { dialogContainer.setDialogBounds(windowName, x, y, -1, -1); } } } @Override public void setSize(int width, int height) { initialBounds.width = width; initialBounds.height = height; MainPage dialogContainer = (MainPage)((FormManager)getApplication().getFormManager()).getOrCreateMainContainer(windowName); if (windowType == JSWindow.WINDOW) { if (dialogContainer != null && dialogContainer.isShowingInWindow()) { dialogContainer.appendJavaScriptChanges("window.resizeTo(" + width + "," + height + ");"); } } else { if (dialogContainer != null && dialogContainer.isShowingInDialog()) { dialogContainer.setDialogBounds(windowName, -1, -1, width, height); } } } @Override public void toBack() { MainPage mp = getMainPage(); if (mp != null) { mp.toBack(); } } @Override public void toFront() { MainPage mp = getMainPage(); if (mp != null) { mp.toFront(); } } @Override public boolean isVisible() { MainPage mp = getMainPage(); if (mp != null) { return (mp.isShowingInDialog() || mp.isShowingInWindow()); } return false; } private Rectangle getSizeAndLocation(Rectangle r, IMainContainer container, final FormController fp) { int navid = fp.getForm().getNavigatorID(); Dimension size = new Dimension(fp.getForm().getSize()); if (navid == Form.NAVIGATOR_DEFAULT && fp.getForm().getView() != FormController.TABLE_VIEW && fp.getForm().getView() != FormController.LOCKED_TABLE_VIEW) { size.width += WebDefaultRecordNavigator.DEFAULT_WIDTH; if (size.height < WebDefaultRecordNavigator.DEFAULT_HEIGHT_WEB) size.height = WebDefaultRecordNavigator.DEFAULT_HEIGHT_WEB; } else if (navid != Form.NAVIGATOR_NONE) { FormController currentNavFC = container.getNavigator(); if (currentNavFC != null) { size.width += currentNavFC.getForm().getSize().width; int navHeight = currentNavFC.getForm().getSize().height; if (size.height < navHeight) size.height = navHeight; } } // Why 22 here? From Wicket CSS: // "div.wicket-modal div.w_right_1" brings 10px through "margin-left" property // "div.wicket-modal div.w_right_1" brings 10px through "margin-right" property // "div.wicket-modal div.w_right_1" brings 2px through "border" property (1px from left and 1px from right) if (!isUndecorated()) size.width += 22; Border b = fp.getFormUI().getBorder(); if (b != null) { Insets bIns = ComponentFactoryHelper.getBorderInsetsForNoComponent(b); size.height = size.height + bIns.top + bIns.bottom; size.width = size.width + bIns.left + bIns.right; } Rectangle r2 = new Rectangle(size); if (r != null) { if (r.height > 0) { r2.height = r.height; } if (r.width > 0) { r2.width = r.width; } r2.x = r.x; r2.y = r.y; } return r2; } protected MainPage getMainPage() { return (MainPage)((FormManager)getApplication().getFormManager()).getMainContainer(windowName); } @Override public void resetBounds() { MainPage mp = getMainPage(); if (mp == null) { RequestCycle rc = RequestCycle.get(); if (rc != null) { Page tmp = rc.getResponsePage(); if ((tmp instanceof MainPage)) { mp = (MainPage)tmp; } } if (mp == null) mp = (MainPage)((FormManager)getApplication().getFormManager()).getMainContainer(null); } if (mp != null) { mp.resetBounds(windowName); } } }