| <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> |
| <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> |
| <head> |
| <meta http-equiv="content-type" content="text/html; charset=UTF-8" /> |
| <meta name="description" content="The Visual Editor - David Orme, RCP consultant and trainer muses about visual programming and model-driven architectures" /> |
| <meta name="keywords" content="Eclipse Plugin RCP SWT Java Visual Editor CompositeTable data binding JFace Platform VE training consulting" /> |
| <link rel="alternate" type="application/rss+xml" title="RSS 2.0" href="http://www.coconut-palm-software.com/the_visual_editor/?feed=rss2" /> |
| <link rel="alternate" type="text/xml" title="RSS .92" href="http://www.coconut-palm-software.com/the_visual_editor/?feed=rss" /> |
| <link rel="alternate" type="application/atom+xml" title="Atom 0.3" href="http://www.coconut-palm-software.com/the_visual_editor/?feed=atom" /> |
| <link rel="pingback" href="http://www.coconut-palm-software.com/the_visual_editor/xmlrpc.php" /> |
| <title>Coconut Palm Software -- Eclipse RCP training and consulting</title> |
| <link rel="EditURI" type="application/rsd+xml" title="RSD" href="http://www.coconut-palm-software.com/the_visual_editor/xmlrpc.php?rsd" /> |
| <script language="javascript"> |
| /* Jesse Ruderman |
| * July 18, 2004 |
| * |
| * Remaining problems: |
| * IE sometimes crashes on exit after using the this script. |
| * In IE, it is a little ugly because IE doesn't support border-radius. |
| * In IE, it does not work at standalone Flash URLs. |
| */ |
| |
| function setupSeekBar() { |
| |
| setTimeout(initFlashControls, 100); |
| |
| function initFlashControls() |
| { |
| var count = 0; |
| |
| function tt(elem) |
| { |
| if (typeof elem.TotalFrames != "undefined") /* do not coerce elem.StopPlay to bool, because that breaks IE */ |
| { |
| addFlashControls(elem); |
| ++count; |
| } |
| } |
| |
| var i, x; |
| |
| for (i = 0; x = document.getElementsByTagName("object")[i]; ++i) |
| tt(x); |
| |
| for (i = 0; x = document.getElementsByTagName("embed")[i]; ++i) |
| tt(x); |
| |
| } |
| |
| |
| function addFlashControls(flash) |
| { |
| var controlsDiv = document.createElement("div"); |
| |
| /* Put the controls under the Flash. |
| * |
| * If the Flash is an <embed> in an <object>, we do not want to touch the <object>, because that would make |
| * Mozilla re-test whether the <object> is broken and reset the <embed>. So in that case, we put the controls |
| * under the <object>. |
| */ |
| var where = flash; |
| while (where.parentNode.tagName.toLowerCase() == "object") |
| where = where.parentNode; |
| where.parentNode.insertBefore(controlsDiv, where.nextSibling); |
| |
| /* Construct controls using DOM2 instead of innerHTML. |
| * In Mozilla, innerHTML= is like innerText= at standalone flash URLs. |
| */ |
| var table = document.createElement("table"); |
| controlsDiv.appendChild(table); |
| |
| var row = table.insertRow(-1); |
| |
| var pauseButton = document.createElement("button"); |
| pauseButton.appendChild(document.createTextNode("Pause")); |
| var buttonCell = row.insertCell(-1); |
| buttonCell.appendChild(pauseButton); |
| |
| var slider = row.insertCell(-1); |
| slider.width = "100%"; |
| |
| var visibleSlider = document.createElement("div"); |
| visibleSlider.style.position = "relative"; |
| visibleSlider.style.height = "10px"; |
| visibleSlider.style.width = "100%"; |
| visibleSlider.style.MozBorderRadius = "4px"; |
| visibleSlider.style.background = "#aaa"; |
| slider.appendChild(visibleSlider); |
| |
| var thumb = document.createElement("div"); |
| thumb.style.position = "absolute"; |
| thumb.style.height = "20px"; |
| thumb.style.width = "10px"; |
| thumb.style.top = "-5px"; |
| thumb.style.MozBorderRadius = "4px"; |
| thumb.style.background = "#666"; |
| visibleSlider.appendChild(thumb); |
| |
| |
| var sliderWidth; |
| var paused = false; |
| var dragging = false; |
| |
| table.width = Math.max(parseInt(flash.width) || 0, 400); |
| |
| addEvent(pauseButton, "click", pauseUnpause); |
| addEvent(slider, "mousedown", drag); |
| addEvent(slider, "drag", function() { return false; }); /* For IE */ |
| window.setInterval(update, 30); |
| |
| function pauseUnpause() |
| { |
| paused = !paused; |
| |
| pauseButton.style.borderStyle = paused ? "inset" : ""; |
| |
| if (paused) |
| flash.StopPlay(); |
| else |
| flash.Play(); |
| } |
| |
| function update() |
| { |
| sliderWidth = parseInt(getWidth(slider) - getWidth(thumb)); |
| |
| if (!paused && !dragging) |
| thumb.style.left = parseInt(flash.CurrentFrame() / totalFrames() * sliderWidth) + "px"; |
| } |
| |
| function dragMousemove(e) |
| { |
| var pageX = e.clientX + document.body.scrollLeft; /* cross-browser, unlike e.pageX, which IE does not support */ |
| var pos = bounds(0, pageX - getX(slider) - 5, sliderWidth); |
| var frame = bounds(1, Math.ceil(totalFrames() * pos / sliderWidth), totalFrames() - 2); |
| |
| thumb.style.left = pos + "px"; |
| |
| flash.GotoFrame(frame); |
| } |
| |
| function release(e) |
| { |
| removeEvent(document, "mousemove", dragMousemove); |
| removeEvent(document, "mouseup", release); |
| if (!paused) |
| flash.Play(); |
| dragging = false; |
| } |
| |
| function drag(e) |
| { |
| addEvent(document, "mousemove", dragMousemove); |
| addEvent(document, "mouseup", release); |
| dragging = true; |
| dragMousemove(e); |
| } |
| |
| |
| |
| /* Boring functions, some of which only exist to hide differences between IE and Mozilla. */ |
| |
| function bounds(min, val, max) |
| { |
| return Math.min(Math.max(min, val), max); |
| } |
| |
| function totalFrames() |
| { |
| /* This is weird. TotalFrames differs between IE and Mozilla. CurrentFrame does not. */ |
| |
| if (typeof flash.TotalFrames == "number") |
| return flash.TotalFrames; /* IE */ |
| else if (typeof flash.TotalFrames == "function") |
| return flash.TotalFrames(); /* Mozilla */ |
| else |
| return 1; /* Partially loaded Flash in IE? */ |
| } |
| |
| function getWidth(elem) |
| { |
| if (document.defaultView && document.defaultView.getComputedStyle) |
| return parseFloat(document.defaultView.getComputedStyle(elem,null).getPropertyValue("width")); /* Mozilla */ |
| else |
| return parseFloat(elem.offsetWidth); /* IE (currentStyle.width can be "auto" or "100%") */ |
| } |
| |
| function getX(elem) |
| { |
| if (!elem) return 0; |
| return (elem.offsetLeft) + getX(elem.offsetParent); |
| } |
| |
| function addEvent(elem, eventName, fun) |
| { |
| if (elem.addEventListener) /* Mozilla */ |
| elem.addEventListener(eventName, fun, false); |
| else /* IE */ |
| elem.attachEvent("on" + eventName, fun); |
| } |
| |
| function removeEvent(elem, eventName, fun) |
| { |
| if (elem.addEventListener) |
| elem.removeEventListener(eventName, fun, false); |
| else |
| elem.detachEvent("on" + eventName, fun); |
| } |
| |
| } |
| |
| } |
| </script> |
| </head> |
| |
| <body onload="setupSeekBar();"> |
| |
| <center> |
| <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="1024" height="768" |
| codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=5,0,0,0"> |
| <param name="movie" value="compositetable-30sec.swf"> |
| <param name="play" value="true"> |
| <param name="loop" value="false"> |
| <param name="quality" value="low"> |
| <embed src="compositetable-30sec.swf" width="1024" height="768" play="true" |
| loop="false" quality="low" type="application/x-shockwave-flash" |
| pluginspage="http://www.macromedia.com/go/getflashplayer"> |
| </embed></object> |
| |
| <p>Coconut Palm Software offers Eclipse consulting, training, and mentoring</p> |
| |
| <p> |
| <a href="/"><i>Return to Coconut Palm Software home page</i></a><br/> |
| <a href="/the_visual_editor"><i>Return to The Visual Editor</i></a><br/> |
| <a href="http://www.eclipse.org/nebula/widgets/compositetable/compositetable.php"><i>Return to Eclipse CompositeTable home page</i></a> |
| </p> |
| |
| </center> |
| |
| </body> |
| </html> |