| <?xml version="1.0" encoding="UTF-8"?> |
| <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [ |
| <!ATTLIST svg |
| xmlns:attrib CDATA #IMPLIED |
| xmlns:batik CDATA #IMPLIED |
| > |
| <!ATTLIST text |
| attrib:buttonText CDATA #IMPLIED |
| > |
| ]> |
| <?AdobeSVGViewer save="snapshot"?> |
| <svg width="100%" height="100%" viewBox="0 0 1024 700" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:attrib="http://www.carto.net/attrib" xmlns:batik="http://xml.apache.org/batik/ext" onload="runRepaintTest()"> |
| <script type="text/ecmascript" xlink:href="../../fast/repaint/resources/repaint.js"></script> |
| <script type="text/ecmascript" xlink:href="resources/helper_functions.js"/> |
| <script type="text/ecmascript" xlink:href="resources/mapApp.js"/> |
| <script type="text/ecmascript" xlink:href="resources/timer.js"/> |
| <script type="text/ecmascript" xlink:href="resources/window.js"/> |
| <script type="text/ecmascript"><![CDATA[ |
| // WebKit modification: do not terminate before all create functions |
| // have been called. This call, the notifyDone() below, and all calls |
| // to createCalled() were added to prevent a race in which the test may |
| // terminate before the final window decoration is added. |
| // See <https://bugs.webkit.org/show_bug.cgi?id=21531>. |
| if (window.testRunner) |
| testRunner.waitUntilDone(); |
| |
| var numberOfWindows = 7; |
| var createCalls = 0; |
| |
| function createCalled() { |
| if (++createCalls == numberOfWindows && window.testRunner) |
| testRunner.notifyDone(); |
| } |
| |
| //global variables for map application and navigation |
| var myMapApp = new mapApp(false,undefined); |
| function repaintTest() { |
| //start a new window array in myMapApp |
| myMapApp.Windows = new Array(); |
| //first a few styles |
| var winPlaceholderStyles = {"fill":"none","stroke":"dimgray","stroke-width":1.5}; |
| var windowStyles = {"fill":"aliceblue","stroke":"dimgray","stroke-width":1}; |
| var titlebarStyles = {"fill":"gainsboro","stroke":"dimgray","stroke-width":1}; |
| var statusbarStyles = {"fill":"aliceblue","stroke":"dimgray","stroke-width":1}; |
| var titletextStyles = {"font-family":"Arial,Helvetica","font-size":14,"fill":"dimgray"}; |
| var statustextStyles = {"font-family":"Arial,Helvetica","font-size":10,"fill":"dimgray"}; |
| var buttonStyles = {"fill":"none","stroke":"dimgray","stroke-width":1}; |
| var titlebarHeight = 17; |
| var statusbarHeight = 13; |
| //create new window instance and add it to the Windows array with the windowId as a key |
| myMapApp.Windows["navWindow"] = new Window("navWindow","Windows",220,200,800,85,true,0,80,1024,700,true,winPlaceholderStyles,windowStyles,3,false,true,"Navigation Window","Statusbar",true,true,true,titlebarStyles,titlebarHeight,statusbarStyles,statusbarHeight,titletextStyles,statustextStyles,buttonStyles,buttonTextChange); |
| myMapApp.Windows["bigWindow"] = new Window("bigWindow","Windows",700,500,50,150,true,0,80,1024,700,false,winPlaceholderStyles,windowStyles,3,true,true,"Big Window","This is a big movable window",true,true,true,titlebarStyles,titlebarHeight,statusbarStyles,statusbarHeight,titletextStyles,statustextStyles,buttonStyles,buttonTextChange); |
| myMapApp.Windows["nestedWindow"] = new Window("nestedWindow","windowMainGroupbigWindow",400,300,50,50,true,0,17,700,487,false,winPlaceholderStyles,windowStyles,3,true,true,"Nested middlesize Window","This window contains other windows",true,true,true,titlebarStyles,titlebarHeight,statusbarStyles,statusbarHeight,titletextStyles,statustextStyles,buttonStyles,buttonTextChange); |
| myMapApp.Windows["smallWindow"] = new Window("smallWindow","windowMainGroupbigWindow",200,180,350,300,true,0,17,700,487,true,winPlaceholderStyles,windowStyles,3,true,true,"Small Window","Callback function is active",true,true,true,titlebarStyles,titlebarHeight,statusbarStyles,statusbarHeight,titletextStyles,statustextStyles,buttonStyles,windowEvents); |
| myMapApp.Windows["colourPickerWindow"] = new Window("colourPickerWindow","windowMainGroupnestedWindow",220,180,0,17,true,0,17,400,287,true,winPlaceholderStyles,windowStyles,3,true,true,"Colour Picker","Changing a colour changes background",true,true,true,titlebarStyles,titlebarHeight,statusbarStyles,statusbarHeight,titletextStyles,statustextStyles,buttonStyles,buttonTextChange); |
| myMapApp.Windows["statusWindow"] = new Window("statusWindow","windowMainGroupnestedWindow",180,80,220,207,false,0,17,400,287,true,winPlaceholderStyles,windowStyles,3,true,false,"Status Window","This window is non-moveable",false,true,true,titlebarStyles,titlebarHeight,statusbarStyles,statusbarHeight,titletextStyles,statustextStyles,buttonStyles,createCalled); |
| myMapApp.Windows["minimalWindow"] = new Window("minimalWindow","windowMainGroupbigWindow",150,60,1,426,false,0,0,700,500,true,winPlaceholderStyles,windowStyles,3,false,false,"","",false,false,false,titlebarStyles,titlebarHeight,statusbarStyles,statusbarHeight,titletextStyles,statustextStyles,buttonStyles,createCalled); |
| myMapApp.Windows["navWindow"].appendContent("textNavWindow",true); |
| myMapApp.Windows["statusWindow"].appendContent("textStatusWindow",true); |
| myMapApp.Windows["smallWindow"].appendContent("textSmallWindow",true); |
| myMapApp.Windows["minimalWindow"].appendContent("textMinimalWindow",true); |
| } |
| |
| function windowEvents(id,evtType) { |
| if (evtType == "removed") { |
| alert("window with id " + id + " was removed"); |
| } |
| if (evtType == "closed") { |
| buttonTextChange(id,evtType); |
| alert("window with id " + id + " was closed"); |
| } |
| if (evtType == "opened") { |
| buttonTextChange(id,evtType); |
| alert("window with id " + id + " was opened"); |
| } |
| if (evtType == "minimized") { |
| alert("window with id " + id + " was minimized"); |
| } |
| if (evtType == "maximized") { |
| alert("window with id " + id + " was maximized"); |
| } |
| if (evtType == "movedTo") { |
| alert("window with id " + id + " was moved to a new position"); |
| } |
| if (evtType == "moved") { |
| statusChange("window with id " + id + " was moved to "+Math.round(myMapApp.Windows[id].transX) + ", " + Math.round(myMapApp.Windows[id].transY)); |
| } |
| if (evtType == "moveStart") { |
| statusChange("window with id " + id + " just started movement"); |
| } |
| if (evtType == "moveEnd") { |
| statusChange("window with id " + id + " just stopped movement"); |
| } |
| if (evtType == "created") { |
| createCalled(); |
| } |
| } |
| function openCloseWindow(id) { |
| if (myMapApp.Windows[id].closed) { |
| myMapApp.Windows[id].open(true); |
| } |
| else { |
| myMapApp.Windows[id].close(true); |
| } |
| } |
| function buttonTextChange(id,status) { |
| if (status == "closed" || status == "opened") { |
| var buttonText = document.getElementById("buttonText"+id); |
| butText = buttonText.getAttributeNS(attribNS,"buttonText"); |
| if (myMapApp.Windows[id].closed) { |
| buttonText.firstChild.nodeValue = "Open " + butText; |
| } |
| else { |
| buttonText.firstChild.nodeValue = "Close " + butText; |
| } |
| } |
| if (id == "navWindow") { |
| if (status == "created" || status == "resized") { |
| addOrUpdateWindowDecoration(id); |
| } |
| } |
| if (status == "created") { |
| createCalled(); |
| } |
| } |
| function resizeNavWindow() { |
| var width = 220 + Math.round(Math.random() * 100); |
| var height = 220 + Math.round(Math.random() * 100); |
| myMapApp.Windows["navWindow"].resize(width,height,true); |
| } |
| function addOrUpdateWindowDecoration(id) { |
| var myWindow = myMapApp.Windows[id]; |
| var group = document.createElementNS(svgNS,"g"); |
| var rect1 = document.createElementNS(svgNS,"rect"); |
| rect1.setAttributeNS(null,"x",-15); |
| rect1.setAttributeNS(null,"y",-15); |
| rect1.setAttributeNS(null,"width",20); |
| rect1.setAttributeNS(null,"height",(myWindow.height+2)); |
| rect1.setAttributeNS(null,"fill","lightsteelblue"); |
| rect1.setAttributeNS(null,"stroke","none"); |
| group.appendChild(rect1); |
| var rect2 = document.createElementNS(svgNS,"rect"); |
| rect2.setAttributeNS(null,"x",-15); |
| rect2.setAttributeNS(null,"y",-15); |
| rect2.setAttributeNS(null,"width",(myWindow.width + 16)); |
| rect2.setAttributeNS(null,"height",20); |
| rect2.setAttributeNS(null,"fill","lightsteelblue"); |
| rect2.setAttributeNS(null,"stroke","none"); |
| rect2.setAttributeNS(null,"id","decoGroupMinimized"+myWindow.id); |
| group.appendChild(rect2); |
| var text = document.createElementNS(svgNS,"text"); |
| text.setAttributeNS(null,"x",0); |
| text.setAttributeNS(null,"y",myWindow.height-20); |
| text.setAttributeNS(null,"font-family","Arial,Helvetica"); |
| text.setAttributeNS(null,"font-size",12); |
| text.setAttributeNS(null,"fill","dimgray"); |
| text.setAttributeNS(null,"transform","rotate(-90,0,"+(myWindow.height-20)+")"); |
| text.setAttributeNS(null,"pointer-events","none"); |
| var textNode = document.createTextNode(myWindow.titleText); |
| text.appendChild(textNode); |
| group.appendChild(text); |
| //move buttons |
| var x = -5; |
| var curY = -5; |
| if (myWindow.closeButton) { |
| myWindow.closeButtonInstance.setAttributeNS(null,"x",x); |
| myWindow.closeButtonInstance.setAttributeNS(null,"y",curY); |
| curY += 20; |
| } |
| if (myWindow.maximizeButton) { |
| myWindow.maximizeButtonInstance.setAttributeNS(null,"x",x); |
| myWindow.maximizeButtonInstance.setAttributeNS(null,"y",curY); |
| curY += 20; |
| } |
| if (myWindow.minimizeButton) { |
| myWindow.minimizeButtonInstance.setAttributeNS(null,"x",x); |
| myWindow.minimizeButtonInstance.setAttributeNS(null,"y",curY); |
| } |
| myWindow.addWindowDecoration(group,true,"top"); |
| } |
| ]]></script> |
| <defs> |
| <!-- this symbol is used for the primitive button widgets --> |
| <symbol id="buttonRect" overflow="visible"> |
| <rect x="-70" y="-10" width="140" height="20" fill="gainsboro" stroke="dimgray" stroke-width="1" /> |
| </symbol> |
| </defs> |
| <rect id="background" fill="lightgray" stroke="none" x="-5000" y="-5000" width="15000" height="15000" /> |
| <rect id="titlerect" fill="white" stroke="none" x="-5000" y="0" width="15000" height="80" /> |
| <!-- rects for indicating boundaries --> |
| <rect fill="white" stroke="none" x="-5000" y="-5000" width="5000" height="15000" /> |
| <rect fill="white" stroke="none" x="1024" y="-5000" width="5000" height="15000" /> |
| <rect fill="white" stroke="none" x="-5000" y="700" width="15000" height="5000" /> |
| <text id="titleText" font-family="Arial,Helvetica" fill="dimgray" font-size="20px" x="10" y="30">Demonstration of the Window object</text> |
| <text id="statusText" font-family="Arial,Helvetica" fill="dimgray" font-size="14px" x="10" y="50">Statustext</text> |
| <text id="textNavWindow" x="10" y="25" font-family="Arial,Helvetica" fill="dimgray" font-size="14px" pointer-events="none" display="none">This window should<tspan x="10" dy="16">contain navigation tools</tspan><tspan x="10" dy="22">Click on button</tspan><tspan x="10" dy="16">'Resize Navigation Window' for a</tspan><tspan x="10" dy="16">random resize of this Window</tspan><tspan x="10" dy="22">Note that this window also</tspan><tspan x="10" dy="16">features a window decoration</tspan></text> |
| <text id="textStatusWindow" x="10" y="40" font-family="Arial,Helvetica" fill="dimgray" font-size="14px" pointer-events="none" display="none">This is a none-moveable<tspan x="10" dy="16">none-closeable status</tspan><tspan x="10" dy="16">window</tspan></text> |
| <text id="textSmallWindow" x="10" y="40" font-family="Arial,Helvetica" fill="dimgray" font-size="14px" pointer-events="none" display="none">This window has a callback<tspan x="10" dy="16">function indicating mouse</tspan><tspan x="10" dy="16">movements in the statusbar</tspan><tspan x="10" dy="16">and alerting window</tspan><tspan x="10" dy="16">events</tspan></text> |
| <text id="textMinimalWindow" x="5" y="16" font-family="Arial,Helvetica" fill="dimgray" font-size="12px" pointer-events="none" display="none">This is a minimal window<tspan x="5" dy="16">without title and status bar.</tspan><tspan x="5" dy="16">it is also not moveable</tspan></text> |
| <!-- primitive buttons for opening and closing windows --> |
| <use x="480" y="20" xlink:href="#buttonRect" onclick="openCloseWindow('navWindow')"/> |
| <text id="buttonTextnavWindow" font-family="Arial,Helvetica" fill="dimgray" text-anchor="middle" font-size="11px" attrib:buttonText="Navigation Window" x="480" y="25" pointer-events="none">Close Navigation Window</text> |
| <use x="630" y="20" xlink:href="#buttonRect" onclick="openCloseWindow('bigWindow')"/> |
| <text id="buttonTextbigWindow" font-family="Arial,Helvetica" fill="dimgray" text-anchor="middle" font-size="11px" attrib:buttonText="Big Window" x="630" y="25" pointer-events="none">Close Big Window</text> |
| <use x="780" y="20" xlink:href="#buttonRect" onclick="openCloseWindow('nestedWindow')"/> |
| <text id="buttonTextnestedWindow" font-family="Arial,Helvetica" fill="dimgray" text-anchor="middle" font-size="11px" attrib:buttonText="Middlesize Window" x="780" y="25" pointer-events="none">Close Middlesize Window</text> |
| <use x="930" y="20" xlink:href="#buttonRect" onclick="openCloseWindow('colourPickerWindow')"/> |
| <text id="buttonTextcolourPickerWindow" font-family="Arial,Helvetica" fill="dimgray" text-anchor="middle" font-size="11px" attrib:buttonText="Colour Picker" x="930" y="25" pointer-events="none">Close Colour Picker</text> |
| <use x="930" y="50" xlink:href="#buttonRect" onclick="openCloseWindow('smallWindow')"/> |
| <text id="buttonTextsmallWindow" font-family="Arial,Helvetica" fill="dimgray" text-anchor="middle" font-size="11px" attrib:buttonText="Small Window" x="930" y="55" pointer-events="none">Close Small Window</text> |
| <use x="480" y="50" xlink:href="#buttonRect" onclick="resizeNavWindow()"/> |
| <text id="buttonTextResizeNavWindow" font-family="Arial,Helvetica" fill="dimgray" text-anchor="middle" font-size="11px" attrib:buttonText="Resize Navigation Window" x="480" y="55" pointer-events="none">Resize Navigation Window</text> |
| </svg> |