X-Git-Url: http://lambda.jimpryor.net/git/gitweb.cgi?p=lambda.git;a=blobdiff_plain;f=jsMath%2Fextensions%2Fdouble-click.js;h=b0a7e873cb5a9b6800640eff48ff5ad998284e17;hp=0000000000000000000000000000000000000000;hb=f084723ab17e56d39e05a8a8da8d976e670dfd42;hpb=b3b3c1c988e48e53f295529431d640528bb17927 diff --git a/jsMath/extensions/double-click.js b/jsMath/extensions/double-click.js new file mode 100644 index 00000000..b0a7e873 --- /dev/null +++ b/jsMath/extensions/double-click.js @@ -0,0 +1,250 @@ +/* + * extensions/double-click.js + * + * Part of the jsMath package for mathematics on the web. + * + * This file allows users to double click on typeset mathematics + * to view the TeX source for the given expression. It will be loaded + * automatically when needed, or can be loaded by + * + * jsMath.Extension.Require('double-click'); + * + * --------------------------------------------------------------------- + * + * Copyright 2005-2008 by Davide P. Cervone + * + * 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. + */ + +/********************************************************************/ + +if (jsMath.Click && jsMath.Click.styles) + {jsMath.Click.oldStyles = jsMath.Click.styles} + +jsMath.Add(jsMath.Click,{ + + dragging: 0, + + styles: { + // Floating windows for displaying TeX source + '#jsMath_float': { + position: 'absolute', top: '0px', left: '0px', 'z-index': '101', + 'max-width': '80%', width: 'auto', height: 'auto', + padding: '0px', margin: '0px', 'font-size': '100%' + }, + '#jsMath_float .drag': { + 'background-color': '#DDDDDD', + border: 'outset 1px', padding: '0px', margin: '0px', + width: 'auto', height: '12px', 'font-size': '1px' + }, + '#jsMath_float .close': { + 'background-color': '#E6E6E6', + border: 'inset 1px', margin: '1px 2px', padding: '0px', + width: '8px', height: '8px' + }, + '#jsMath_float .source': { + 'background-color': '#E2E2E2', + border: 'outset 1px', margin: '0px', padding: '8px 15px', + width: 'auto', height: 'auto', + 'font-family': 'courier, fixed', 'font-size': '90%' + } + }, + + /* + * Create the hidden DIV used for the tex source window + */ + Init: function () { + if (this.oldStyles) {jsMath.Insert(this.styles,this.oldStyles)} + jsMath.Setup.Styles(this.styles); + this.source = jsMath.Setup.DIV("float",{display:'none'}); + this.source.innerHTML = + '
' + + '
'; + this.drag = this.source.firstChild; + this.tex = this.drag.nextSibling.firstChild; + this.drag.firstChild.onclick = jsMath.Click.CloseSource; + this.drag.onmousedown = jsMath.Click.StartDragging; + this.drag.ondragstart = jsMath.Click.False; + this.drag.onselectstart = jsMath.Click.False; + this.source.onclick = jsMath.Click.CheckClose; + }, + False: function () {return false}, + + /* + * Handle a double-click on an equation + */ + DblClick: function (data) { + var event = data[0]; var TeX = data[1]; + var event = jsMath.Click.Event(event); + + var source = jsMath.Click.source + var tex = jsMath.Click.tex; + + source.style.visibility = 'hidden'; + source.style.display = ''; source.style.width = ''; + source.style.left = ''; source.style.top = ''; + tex.innerHTML = ''; + + TeX = TeX.replace(/^\s+|\s+$/g,''); + TeX = TeX.replace(/&/g,'&'); + TeX = TeX.replace(//g,'>'); + TeX = TeX.replace(/\n/g,'
'); + tex.innerHTML = TeX; + + var h = source.offsetHeight; var w; + if (jsMath.Browser.msieDivWidthBug) { + tex.className = 'source'; // Work around MSIE bug where + w = tex.offsetWidth + 5; // DIV's don't collapse to + tex.className = ''; // their natural widths + } else { + w = source.offsetWidth; + } + w = Math.max(50,Math.min(w,.8*event.W,event.W-40)); + var x = Math.floor(event.x-w/2); var y = Math.floor(event.y-h/2); + x = event.X + Math.max(Math.min(x,event.W-w-20),20); + y = event.Y + Math.max(Math.min(y,event.H-h-5),5); + + source.style.left = x+'px'; source.style.top = y+'px'; + source.style.width = w+'px'; + source.style.visibility = ''; + jsMath.Click.left = x + event.X; jsMath.Click.top = y + event.Y; + jsMath.Click.w = w; jsMath.Click.h = source.offsetHeight; + + jsMath.Click.DeselectText(x,y); + return false; + }, + + /* + * Get window width, height, and offsets plus + * position of pointer relative to the window + */ + Event: function (event) { + var W = jsMath.window.innerWidth || jsMath.document.body.clientWidth; + var H = jsMath.window.innerHeight || jsMath.document.body.clientHeight; + var X = jsMath.window.pageXOffset; var Y = jsMath.window.pageYOffset; + if (X == null) { + X = jsMath.document.body.clientLeft; + Y = jsMath.document.body.clientTop; + } + var x = event.pageX; var y = event.pageY; + if (x == null) { + x = event.clientX; y = event.clientY; + if (jsMath.browser == 'MSIE' && jsMath.document.compatMode == 'CSS1Compat') { + X = jsMath.document.documentElement.scrollLeft; + Y = jsMath.document.documentElement.scrollTop; + W = jsMath.document.documentElement.clientWidth; + H = jsMath.document.documentElement.clientHeight; + } else { + X = jsMath.document.body.scrollLeft; + Y = jsMath.document.body.scrollTop; + } + } else {x -= X; y -= Y} + + return {x: x, y: y, W: W, H: H, X: X, Y: Y}; + }, + + /* + * Unselect whatever text is selected (since double-clicking + * usually selects something) + */ + DeselectText: function (x,y) { + if (jsMath.window.getSelection && jsMath.window.getSelection().removeAllRanges) + {jsMath.window.getSelection().removeAllRanges()} + else if (jsMath.document.getSelection && jsMath.document.getSelection().removeAllRanges) + {jsMath.document.getSelection().removeAllRanges()} + else if (jsMath.document.selection && jsMath.document.selection.empty) + {jsMath.document.selection.empty()} + else { + /* Hack to deselect the text in Opera and Safari */ + if (jsMath.browser == 'MSIE') return; // don't try it if MISE on Mac + jsMath.hiddenTop.innerHTML = + ''; + jsMath.hiddenTop.firstChild.style.position = 'absolute'; + jsMath.hiddenTop.firstChild.style.left = x+'px'; + jsMath.hiddenTop.firstChild.style.top = y+'px'; + setTimeout(jsMath.Click.SelectHidden,1); + } + }, + SelectHidden: function () { + jsMath.hiddenTop.firstChild.focus(); + jsMath.hiddenTop.firstChild.select(); + jsMath.hiddenTop.innerHTML = ''; + }, + + /* + * Close the TeX source window + */ + CloseSource: function () { + jsMath.Click.tex.innerHTML = ''; + jsMath.Click.source.style.display = 'none'; + jsMath.Click.source.style.visibility = 'hidden'; + jsMath.Click.StopDragging(); + return false; + }, + CheckClose: function (event) { + if (!event) {event = jsMath.window.event} + if (event.altKey) {jsMath.Click.CloseSource(); return false} + }, + + /* + * Set up for dragging the source panel + */ + StartDragging: function (event) { + if (!event) {event = jsMath.window.event} + if (jsMath.Click.dragging) {jsMath.Click.StopDragging(event)} + var event = jsMath.Click.Event(event); + jsMath.Click.dragging = 1; + jsMath.Click.x = event.x + 2*event.X - jsMath.Click.left; + jsMath.Click.y = event.y + 2*event.Y - jsMath.Click.top; + jsMath.Click.oldonmousemove = jsMath.document.onmousemove; + jsMath.Click.oldonmouseup = jsMath.document.onmouseup; + jsMath.document.onmousemove = jsMath.Click.DragSource; + jsMath.document.onmouseup = jsMath.Click.StopDragging; + return false; + }, + + /* + * Stop dragging the source window + */ + StopDragging: function (event) { + if (jsMath.Click.dragging) { + jsMath.document.onmousemove = jsMath.Click.oldonmousemove; + jsMath.document.onmouseup = jsMath.Click.oldonmouseup; + jsMath.Click.oldonmousemove = null; + jsMath.Click.oldonmouseup = null; + jsMath.Click.dragging = 0; + } + return false; + }, + + /* + * Move the source window (but stay within the browser window) + */ + DragSource: function (event) { + if (!event) {event = jsMath.window.event} + if (jsMath.Browser.buttonCheck && !event.button) {return jsMath.Click.StopDragging(event)} + event = jsMath.Click.Event(event); + var x = event.x + event.X - jsMath.Click.x; + var y = event.y + event.Y - jsMath.Click.y; + x = Math.max(event.X,Math.min(event.W+event.X-jsMath.Click.w,x)); + y = Math.max(event.Y,Math.min(event.H+event.Y-jsMath.Click.h,y)); + jsMath.Click.source.style.left = x + 'px'; + jsMath.Click.source.style.top = y + 'px'; + jsMath.Click.left = x + event.X; jsMath.Click.top = y + event.Y; + return false; + } + +}); + +jsMath.Click.Init();