Author: mgrigorov Date: Sun Jul 18 09:44:46 2010 New Revision: 965186 URL: http://svn.apache.org/viewvc?rev=965186&view=rev Log: Port from wicket-1.4.x
r931519 Author: jcompagner Date: Wed Apr 7 12:21:42 2010 UTC (3 months, 1 week ago) Changed paths: 2 Log Message: open up the api a bit for custom showing and closing Modified: wicket/trunk/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/modal/ModalWindow.java wicket/trunk/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/modal/res/modal.js Modified: wicket/trunk/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/modal/ModalWindow.java URL: http://svn.apache.org/viewvc/wicket/trunk/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/modal/ModalWindow.java?rev=965186&r1=965185&r2=965186&view=diff ============================================================================== --- wicket/trunk/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/modal/ModalWindow.java (original) +++ wicket/trunk/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/modal/ModalWindow.java Sun Jul 18 09:44:46 2010 @@ -25,6 +25,7 @@ import org.apache.wicket.ajax.AjaxReques import org.apache.wicket.ajax.IAjaxCallDecorator; import org.apache.wicket.ajax.calldecorator.CancelEventIfNoAjaxDecorator; import org.apache.wicket.behavior.HeaderContributor; +import org.apache.wicket.extensions.ajax.markup.html.modal.ModalWindow.PageCreator; import org.apache.wicket.markup.ComponentTag; import org.apache.wicket.markup.html.WebMarkupContainer; import org.apache.wicket.markup.html.panel.Panel; @@ -334,7 +335,7 @@ public class ModalWindow extends Panel */ public static final void closeCurrent(AjaxRequestTarget target) { - target.appendJavascript(getCloseJavacript()); + target.appendJavascript(getCloseJavacriptInternal()); } /** @@ -351,9 +352,16 @@ public class ModalWindow extends Panel } /** - * @return javascript that closes current modal window + * Method that allows alternate script for showing the window. + * + * @return the script that actually shows the window. */ - private static String getCloseJavacript() + protected CharSequence getShowJavascript() + { + return "Wicket.Window.create(settings).show();\n"; + } + + private static String getCloseJavacriptInternal() { return "var win;\n" // + "try {\n" @@ -374,6 +382,16 @@ public class ModalWindow extends Panel } /** + * Method that allows alternate script for closing the window. + * + * @return the script that actually closes the window. + */ + protected String getCloseJavacript() + { + return getCloseJavacriptInternal(); + } + + /** * Returns the id of content component. * * <pre> @@ -811,7 +829,7 @@ public class ModalWindow extends Panel * * @return True if user has added own component to the window, false otherwise. */ - private boolean isCustomComponent() + protected boolean isCustomComponent() { return getContent() != empty; } @@ -1052,7 +1070,7 @@ public class ModalWindow extends Panel postProcessSettings(buffer); - buffer.append("Wicket.Window.create(settings).show();\n"); + buffer.append(getShowJavascript()); return buffer.toString(); } Modified: wicket/trunk/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/modal/res/modal.js URL: http://svn.apache.org/viewvc/wicket/trunk/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/modal/res/modal.js?rev=965186&r1=965185&r2=965186&view=diff ============================================================================== --- wicket/trunk/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/modal/res/modal.js (original) +++ wicket/trunk/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/modal/res/modal.js Sun Jul 18 09:44:46 2010 @@ -631,34 +631,34 @@ Wicket.Window.prototype = { show: function() { // create the DOM elements - this.createDOM(); + this.createDOM(); // set the class of window (blue or silver by default) - this.classElement.className = this.settings.className; + this.classElement.className = this.settings.className; // is it an iframe window? if (this.isIframe()) { // load the file - this.load(); + this.load(); } else { // it's an element content - // is the element specified? + // is the element specified? if (this.settings.element == null) { throw "Either src or element must be set."; - } + } // reparent the element this.oldParent = this.settings.element.parentNode; - this.settings.element.parentNode.removeChild(this.settings.element); + this.settings.element.parentNode.removeChild(this.settings.element); this.content.appendChild(this.settings.element); // set the overflow style so that scrollbars are shown when the element is bigger than window this.content.style.overflow="auto"; - } + } // bind the events - this.bindInit(); + this.bindInit(); // if the title is specified set it if (this.settings.title != null) @@ -668,73 +668,79 @@ Wicket.Window.prototype = { // initial width and height this.window.style.width = this.settings.width + (this.settings.resizable ? "px" : this.settings.widthUnit); - if (this.settings.height != null) - this.content.style.height = this.settings.height + (this.settings.resizable ? "px" : this.settings.heightUnit); + if (this.settings.height != null) + this.content.style.height = this.settings.height + (this.settings.resizable ? "px" : this.settings.heightUnit); // center the window - this.center(); + this.center(); // load position from cookie this.loadPosition(); var doShow = function() { - // if there is a previous window - if (this.oldWindow != null) { - // lower it's z-index so that it's moved under the mask - this.oldWindow.window.style.zIndex = Wicket.Window.Mask.zIndex - 1; - } - + this.adjustOpenWindowZIndexesOnShow(); this.window.style.visibility="visible"; }.bind(this); - - // is there a window displayed already? - if (Wicket.Window.current != null) { - // save the reference to it - this.oldWindow = Wicket.Window.current; - } - // keep reference to this window - Wicket.Window.current = this; - - // show the window + this.adjustOpenWindowsStatusOnShow(); + + // show the window if (Wicket.Browser.isGecko() && this.isIframe()) { // HACK // gecko flickers when showing the window - // unless the showing is postponed a little + // unless the showing is postponed a little window.setTimeout(function() { doShow(); }, 0); } else { doShow(); - } + } // if the content supports focus and blur it, which means - // that the already focused element will lose it's focus + // that the already focused element will lose it's focus if (this.content.focus) { this.content.focus(); this.content.blur(); - } + } // preserve old unload hanler this.old_onunload = window.onunload; - // new unload handler - close the window to prevent memory leaks in ie - window.onunload = function() { + // new unload handler - close the window to prevent memory leaks in ie + window.onunload = function() { this.close(true); if (this.old_onunload != null) return this.old_onunload(); - }.bind(this); + }.bind(this); // preserve old beforeunload handler this.old_onbeforeunload = window.onbeforeunload; if (Wicket.Window.unloadConfirmation == true) { // new beforeunload handler - ask user before reloading window - window.onbeforeunload = function() { + window.onbeforeunload = function() { return "Reloading this page will cause the modal window to disappear."; - } + } } - // create the mask that covers the background - this.createMask(); + // create the mask that covers the background + this.createMask(); + }, + + adjustOpenWindowZIndexesOnShow: function() { + // if there is a previous window + if ((this.oldWindow != null) && (typeof(this.oldWindow) != "undefined")) { + // lower it's z-index so that it's moved under the mask + this.oldWindow.window.style.zIndex = Wicket.Window.Mask.zIndex - 1; + } + }, + + adjustOpenWindowsStatusOnShow: function() { + // is there a window displayed already? + if (Wicket.Window.current != null) { + // save the reference to it + this.oldWindow = Wicket.Window.current; + } + // keep reference to this window + Wicket.Window.current = this; }, /** @@ -747,20 +753,20 @@ Wicket.Window.prototype = { /** * Prevent user from closing the window if there's another (nested) modal window in the iframe. */ - canCloseInternal: function() { + canCloseInternal: function() { try { - if (this.isIframe() == true) { - var current = this.content.contentWindow.Wicket.Window.current; + if (this.isIframe() == true) { + var current = this.content.contentWindow.Wicket.Window.current; if (typeof(current) != "undefined" && current != null) { alert('You can\'t close this modal window. Close the top-level modal window first.'); return false; } } } catch (ignore) { - } + } return true; }, - + /** * Closes the window. * @param {Boolean} force - internal argument @@ -814,17 +820,7 @@ Wicket.Window.prototype = { this.settings.onClose(); } - // if there was a window shown before this one - if (this.oldWindow != null) { - // set the old as current - Wicket.Window.current = this.oldWindow; - // increase it's z-index so that it's moved above the mask - Wicket.Window.current.window.style.zIndex = Wicket.Window.Mask.zIndex + 1; - this.oldWindow = null; - } else { - // remove reference to the window - Wicket.Window.current = null; - } + this.adjustOpenWindowsStatusAndZIndexesOnClose(); if (Wicket.Browser.isIE()) { // There's a strange focus problem in IE that disables focus on entire page, @@ -841,6 +837,20 @@ Wicket.Window.prototype = { } }, + adjustOpenWindowsStatusAndZIndexesOnClose: function() { + // if there was a window shown before this one + if (this.oldWindow != null) { + // set the old as current + Wicket.Window.current = this.oldWindow; + // increase it's z-index so that it's moved above the mask + Wicket.Window.current.window.style.zIndex = Wicket.Window.Mask.zIndex + 1; + this.oldWindow = null; + } else { + // remove reference to the window + Wicket.Window.current = null; + } + }, + /** * Cleans the internal state of the window */ @@ -1251,50 +1261,60 @@ Wicket.Window.Mask.prototype = { this.dontHide = true; } - var doc = document; - var old = Wicket.Window.current.oldWindow; - if (typeof(old) != "undefined" && old != null) { - doc = old.getContentDocument(); - } - - this.document = doc; - - // disable user interaction - setTimeout(function() {this.hideSelectBoxes()}.bind(this), 300); - setTimeout(function() {this.disableTabs()}.bind(this), 400); - setTimeout(function() {this.disableFocus()}.bind(this), 1000); + this.disableCoveredContent(); }, /** * Hides the mask. */ hide: function() { - + // if the mask is visible and we can hide it if (typeof(Wicket.Window.Mask.element) != "undefined" && typeof(this.dontHide) == "undefined") { // remove element from document document.body.removeChild(this.element); - this.element = null; + this.element = null; // restore old handlers window.onscroll = this.old_onscroll; window.onresize = this.old_onresize; - Wicket.Window.Mask.element = null; - } + Wicket.Window.Mask.element = null; + } + this.reenableCoveredContent(); + }, + + // disable user interaction for content that is covered by the mask + disableCoveredContent: function() { + var doc = document; + var old = Wicket.Window.current.oldWindow; + if (typeof(old) != "undefined" && old != null) { + doc = old.getContentDocument(); + } + + this.doDisable(doc, Wicket.Window.current); + }, + + // disable user interaction for content that is covered by the mask inside the given document, taking into consideration that this modal window is or not in an iframe + // and has the given content + doDisable: function(doc, win) { + setTimeout(function() {this.hideSelectBoxes(doc, win)}.bind(this), 300); + setTimeout(function() {this.disableTabs(doc, win)}.bind(this), 400); + setTimeout(function() {this.disableFocus(doc, win)}.bind(this), 1000); + }, + + // reenable user interaction for content that was covered by the mask + reenableCoveredContent: function() { // show old select boxes (ie only) this.showSelectBoxes(); - + // restore tab order this.restoreTabs(); - + // revert onfocus handlers this.enableFocus(); - - this.document = null; - }, /** @@ -1340,12 +1360,10 @@ Wicket.Window.Mask.prototype = { * For internet explorer hides the select boxes (because they * have always bigger z-order than any other elements). */ - hideSelectBoxes : function() { + hideSelectBoxes : function(doc, win) { if (Wicket.Browser.isIE() && Wicket.Browser.isIE7() == false) { - var win = Wicket.Window.current; - this.boxes = new Array(); - var selects = this.document.getElementsByTagName("select"); + var selects = doc.getElementsByTagName("select"); for (var i = 0; i < selects.length; i++) { var element = selects[i]; @@ -1379,17 +1397,17 @@ Wicket.Window.Mask.prototype = { /** * Disable focus on element and all it's children. */ - disableFocusElement: function(element, revertList) { + disableFocusElement: function(element, revertList, win) { - if (typeof(Wicket.Window.current) != "undefined" && - Wicket.Window.current != null && - Wicket.Window.current.window != element) { + if (typeof(win) != "undefined" && + win != null && + win.window != element) { revertList.push([element, element.onfocus]); element.onfocus = function() { element.blur(); } for (var i = 0; i < element.childNodes.length; ++i) { - this.disableFocusElement(element.childNodes[i], revertList); + this.disableFocusElement(element.childNodes[i], revertList, win); } } }, @@ -1397,14 +1415,14 @@ Wicket.Window.Mask.prototype = { /** * Disable focus on all elements in document */ - disableFocus: function() { + disableFocus: function(doc, win) { // explorer doesn't need this, because for IE disableTabs() is called. // plus in IE this causes problems because it scrolls document ); if (Wicket.Browser.isIE() == false) { this.focusRevertList = new Array(); - var body = this.document.getElementsByTagName("body")[0]; + var body = doc.getElementsByTagName("body")[0]; for (var i = 0; i < body.childNodes.length; ++i) { - this.disableFocusElement(body.childNodes[i], this.focusRevertList); + this.disableFocusElement(body.childNodes[i], this.focusRevertList, win); } } }, @@ -1426,44 +1444,39 @@ Wicket.Window.Mask.prototype = { /** * Disable tab indexes (ie). */ - disableTabs: function () { - this.tabbableTags = new Array("A","BUTTON","TEXTAREA","INPUT","IFRAME", "SELECT"); + disableTabs: function (doc, win) { + if (typeof (this.tabbableTags) == "undefined") this.tabbableTags = new Array("A","BUTTON","TEXTAREA","INPUT","IFRAME", "SELECT"); if (Wicket.Browser.isIE()) { - var win = Wicket.Window.current; - this.tabsAreDisabled = 'true'; + this.disabledTabsRevertList = new Array(); for (var j = 0; j < this.tabbableTags.length; j++) { - var tagElements = this.document.getElementsByTagName(this.tabbableTags[j]); + var tagElements = doc.getElementsByTagName(this.tabbableTags[j]); for (var k = 0 ; k < tagElements.length; k++) { - // if this is not an iframe window and the element is child of window content, // don't disable tab on it - if (win.isIframe() == true || this.isParent(tagElements[k], win.content) == false) { + if (win.isIframe() == true || this.isParent(tagElements[k], win.content) == false) { var element = tagElements[k]; element.hiddenTabIndex = element.tabIndex; element.tabIndex="-1"; + this.disabledTabsRevertList.push(element); } } } } }, - + /** * Restore tab indexes if they were disabled. */ restoreTabs: function() { - if (typeof(this.tabsAreDisabled) != 'undefined') { - for (var j = 0; j < this.tabbableTags.length; j++) { - var tagElements = this.document.getElementsByTagName(this.tabbableTags[j]); - for (var k = 0 ; k < tagElements.length; k++) { - var element = tagElements[k]; - if (typeof(element.hiddenTabIndex) != 'undefined') { - element.tabIndex = element.hiddenTabIndex; - element.hiddenTabIndex = null; - } - element.tabEnabled = true; + if (typeof (this.disabledTabsRevertList) != "undefined" && this.disabledTabsRevertList != null) { + for (var i = 0; i < this.disabledTabsRevertList.length; ++i) { + var element = this.disabledTabsRevertList[i]; + if (typeof(element.hiddenTabIndex) != 'undefined') { + element.tabIndex = element.hiddenTabIndex; + delete element.hiddenTabIndex; } } - this.tabsAreDisabled = null; + this.disabledTabsRevertList = null; } } @@ -1536,7 +1549,7 @@ Wicket.Cookie = { end = document.cookie.length; } return unescape(document.cookie.substring(start,end)) - } + } } else { return null }