X-Git-Url: https://scm.cri.ensmp.fr/git/PlinnDocument.git/blobdiff_plain/57a4d385a1d2806d5877f53b1fdb0bd94efa2dbb..3b91dbcbb0b99d3d796a01813018db0e540bd0ec:/Products/PlinnDocument/skins/layout_objects.js diff --git a/Products/PlinnDocument/skins/layout_objects.js b/Products/PlinnDocument/skins/layout_objects.js new file mode 100644 index 0000000..2d4ca89 --- /dev/null +++ b/Products/PlinnDocument/skins/layout_objects.js @@ -0,0 +1,269 @@ +// (c) Benoît PIN 2006-2007 +// http://plinn.org +// Licence GPL + +var ELEMENTS_POOL = {}; + +function initElementsPool() { + // Element pool (for cloning) + ELEMENTS_POOL["DIV_ELEMENT"] = {"node" : document.getElementById("div"), + "beforeDraw" : null, + "getRawData" : null, + "putData" : null }; + + imgBeforeDraw = function() { + if (!this.node.src) { + var dispatch = document.getElementById("ImgDispatcher"); + var strRatio = dispatch.value.split("_", 1)[0]; + var src = dispatch.value.substring(strRatio.length+1); + this.ratio = new Number(strRatio).valueOf(); + this.node.src = PLINN_DOCUMENT_URL + '/' + src; + var w = this.width; + var size = (this.ratio > 1) ? + new Point(w, Math.round(w * this.ratio)) : + new Point(Math.round(w / this.ratio), w); + + this.resizeTo(size); + } + } + + ELEMENTS_POOL["IMG_ELEMENT"] = {"node" : document.getElementById("img"), + "beforeDraw" : imgBeforeDraw, + "getRawData" : function() { + var src = this.node.src; + src = src.split('/'); + return "attachments/" + src[src.length - 2] + "/getThumbnail"; + }, + "putData" : function(raw) { + this.node.src = PLINN_DOCUMENT_URL+"/attachments/"+raw; + } + }; + + epozBeforeDraw = function() { + var rect = this + var iframe = this.node.childNodes[0]; + var name = String(Math.floor(Math.random() * 10000)); + addListener(iframe, 'load', function(){initTextRectangle(iframe, name, rect);}); + + var ta = this.node.childNodes[1]; + ta.name = name; + ta.id = name; + } + + ELEMENTS_POOL["EPOZ_ELEMENT"] = {"node" : document.getElementById("epoz"), + "beforeDraw" : epozBeforeDraw, + "getRawData" : function() { + return this.node.childNodes[0].contentWindow.document.body.innerHTML; + }, + "putData" : function(raw) { + this.node.childNodes[1].value = raw; + } + }; + + for (var i = 0 ; i < ELEMENTS_POOL.length ; i++) + ELEMENTS_POOL[i].removeAttribute("id"); +} + +function Rectangle(upperLeftCorner, width, height, elementKey, ddOptions, ratio) { + this.meta_type = "Rectangle"; // ;-) + this.upperLeftCorner = upperLeftCorner; + this.width = width; + this.height = height; + this.elementKey = elementKey; + this.node = ELEMENTS_POOL[elementKey]["node"].cloneNode(true); + with (this.node.style) { + width="100%"; + height="100%"; + } + this.beforeDraw = ELEMENTS_POOL[elementKey]["beforeDraw"]; + this.getRawData = ELEMENTS_POOL[elementKey]["getRawData"]; + this.ddOptions = (!ddOptions) ? 11 : ddOptions; // 11-> drag, resize, delete + this.ratio = ratio; + + this.hostDiv = document.createElement("div"); + this.hostDiv.appendChild(this.node); + + this.resizeHandle = document.createElement("span"); + this.resizeHandle.className = "resize_handle"; + this.hostDiv.appendChild(this.resizeHandle); + + if((this.ddOptions & 8) == 8) { // move allowed + this.movDelHandle = document.createElement("div"); + this.movDelHandle.className = "rectangle_header"; + var delImg = document.createElement("img"); + delImg.src = "delete_rectangle.gif"; + delImg.className = "rectangle_delimg"; + delImg.onmouseover=function(){this.src="delete_rectangle_hover.gif";} + delImg.onmouseout=function(){this.src="delete_rectangle.gif";} + this.movDelHandle.appendChild(delImg); + this.hostDiv.appendChild(this.movDelHandle); + this.movDelHandle.rectangle = this; + delImg.rectangle = this; + + } + + // backward references + this.style = this.hostDiv.style; + this.node.rectangle = this; + this.hostDiv.rectangle = this; + this.resizeHandle.rectangle = this; +} + +Rectangle.prototype.showHandles = function() { + if (this.resizeHandle) + this.resizeHandle.style.visibility = "visible"; + if (this.movDelHandle) + this.movDelHandle.style.visibility = "visible"; +}; + +Rectangle.prototype.hideHandles = function() { + if (this.resizeHandle) + this.resizeHandle.style.visibility = "hidden"; + if (this.movDelHandle) + this.movDelHandle.style.visibility = "hidden"; +}; + +Rectangle.prototype._mac_moveDelHandle = function() { + // fix height + var epozWindow = this.node.childNodes[0].contentWindow; + if (epozWindow.scrollMaxY) + this.resizeHandle.style.right = "15px"; + else + this.resizeHandle.style.right = "0px"; + + // fix width + if (epozWindow.scrollMaxX) + this.resizeHandle.style.bottom = "15px"; + else + this.resizeHandle.style.bottom = "0px"; +}; + + +Rectangle.prototype.draw = function(container, position) { + if (this.beforeDraw) + this.beforeDraw(); + var style = this.style; + style.left = String(this.upperLeftCorner.x) + "px"; + style.top = String(this.upperLeftCorner.y) + "px"; + style.width = String(this.width) + "px"; + style.height = String(this.height) + "px"; + + style.display="block"; + var pos; + if (!position) + pos = "absolute"; + else + pos = position; + style.position = pos; + setBorderStyle(this, "solid"); + setBorderWidth(this, "1px"); + style.visibility = "inherit"; +/* style.overflow = "hidden";*/ + if (container.meta_type == "Rectangle") + setBorderColor(this, container.style.borderTopColor); + + container.appendChild(this.hostDiv); +}; + + +Rectangle.prototype.moveTo = function(upperLeftCorner) { + this.upperLeftCorner = upperLeftCorner; + var style = this.style; + style.left = String(this.upperLeftCorner.x) + "px"; + style.top = String(this.upperLeftCorner.y) + "px"; +}; + +Rectangle.prototype.resizeTo = function(size, cancelOnresize) { + if (size.x >= 10) + this.width = size.x; + if (size.y >= 10) + this.height = size.y; + + var style = this.style; + style.width = String(this.width) + "px"; + style.height = String(this.height) + "px"; + if (this.onresize && !cancelOnresize) + this.onresize(); +}; + +Rectangle.prototype.appendChild = function(node) { + this.node.appendChild(node); +}; + +Rectangle.prototype.setId = function(id) { + this.node.id = id; +}; + + + +function initTextRectangle(iframe, name, rect) { + var ta = iframe.nextSibling; // ta -> textarea + var data = ta.value; + + if (browser.isGecko) { + // Just a few cleanups for Mozilla + data = data.replace(//ig,''); + data = data.replace(/]*)>/ig,''); + data = data.replace(/<\/strong>/ig,''); + + data = data.replace(//ig,''); + data = data.replace(/]*)>/ig,''); + data = data.replace(/<\/em>/ig,''); + } + + // change iframe id + iframe.id = IFramePrefix + name; + iframe.style.border = "0px none transparent"; + + + iframe.contentWindow.document.body.innerHTML = data; + iframe.contentWindow.document.id = DocPrefix + name; + addListener(iframe, "click", handlePlinnEpozRedirect); + if (browser.isMac) { + addListener(iframe.contentWindow.document, 'overflow', function(){rect._mac_moveDelHandle();}); + addListener(iframe.contentWindow.document, 'underflow', function(){rect._mac_moveDelHandle();}); + } + + if (browser.isGecko) { + scriptExpr = 'EnableDesignMode("' + iframe.id + '");'; + window.setTimeout(scriptExpr, 10); + } +} + +// « overloads » + +function handlePlinnEpozRedirect(evt) { + redirectPlinnEpoz(getTargetedObject(evt)); +} + +function redirectPlinnEpoz(iframe) { + if(EpozElement) { + if (EpozElement == iframe) + return; + unwrapPlinnEpozVariables(); + } + + // update Epoz variables + wrapPlinnEpozVariables(iframe); + EpozElement.contentWindow.focus(); +} + +function wrapPlinnEpozVariables(iframe) { + fieldId = iframe.contentWindow.document.id.slice(DocPrefixLength); + + iframe.id = Epoz ; + EpozElement=iframe; + EpozTextArea = document.getElementById(fieldId); +} + + +function unwrapPlinnEpozVariables() { + if (!EpozElement) // no redirection happens yet. + return; + try { + fieldId = EpozElement.contentWindow.document.id.slice(DocPrefixLength); + } + catch (e) { } + + EpozElement.id = IFramePrefix + fieldId; +}