witten
/
luminotes
Archived
1
0
Fork 0

More work on the reusable iframe. Now visually appears seamless.

This commit is contained in:
Dan Helfman 2009-01-22 12:08:20 -08:00
parent 9fa3cf2001
commit 58827c4ebd
3 changed files with 45 additions and 46 deletions

View File

@ -525,10 +525,10 @@ h1 {
.note_frame {
-moz-border-radius: 5px;
position: absolute;
padding: 0em;
margin: 0em;
overflow: hidden;
width: 100%;
border: 2px solid #999999;
margin-bottom: 0.75em;
background-color: #ffffff;
@ -773,10 +773,6 @@ h1 {
.invisible {
visibility: hidden;
height: 0;
padding: 0;
margin: 0;
border: 0;
}
.undisplayed {

View File

@ -4,15 +4,31 @@ MSIE6 = /MSIE 6\.0/.test( navigator.userAgent );
MSIE = /MSIE/.test( navigator.userAgent );
OPERA = /Opera/.test( navigator.userAgent );
REUSABLE_IFRAME = createDOM( "iframe",
{
// iframe src attribute is necessary in IE 6 on an HTTPS site to prevent annoying warnings
"src": MSIE6 && "/static/html/blank.html" || "about:blank",
"frameBorder": "0",
"scrolling": "no",
"class": "note_frame invisible"
FRAME_BORDER_WIDTH = 2;
FRAME_BORDER_HEIGHT = 2;
function Shared_iframe() {
this.iframe = createDOM( "iframe",
{
// iframe src attribute is necessary in IE 6 on an HTTPS site to prevent annoying warnings
"src": MSIE6 && "/static/html/blank.html" || "about:blank",
"frameBorder": "0",
"scrolling": "no",
"class": "note_frame invisible"
}
);
insertSiblingNodesAfter( "iframe_area", this.iframe );
// enable design mode
if ( this.iframe.contentDocument ) { // browsers such as Firefox
this.iframe.contentDocument.designMode = "On";
} else { // browsers such as IE
this.iframe.contentWindow.document.designMode = "On";
}
);
}
function Editor( id, notebook_id, note_text, deleted_from_id, revision, read_write, startup, highlight, focus, position_after, start_dirty, own_notes_only ) {
this.id = id;
@ -37,6 +53,10 @@ function Editor( id, notebook_id, note_text, deleted_from_id, revision, read_wri
this.div = null;
this.title = "";
// all editors share a common design mode iframe, each claiming use of it as necessary
if ( !Editor.shared_iframe )
Editor.shared_iframe = new Shared_iframe();
this.create_div( position_after );
// if the Editor is to be focused, create an editable iframe. otherwise just create a static div
@ -191,7 +211,7 @@ Editor.prototype.claim_iframe = function ( position_after, click_position ) {
return;
// claim the reusable iframe for this note, stealing it from the note that's using it (if any)
this.iframe = REUSABLE_IFRAME;
this.iframe = Editor.shared_iframe.iframe;
this.iframe.setAttribute( "id", iframe_id );
this.iframe.setAttribute( "name", iframe_id );
var other_div;
@ -208,10 +228,8 @@ Editor.prototype.claim_iframe = function ( position_after, click_position ) {
this.iframe.editor = this;
// hide the iframe and show a div in its place
setStyle( this.iframe, { "position": "fixed" } );
if ( other_div )
removeElementClass( other_div, "invisible" );
addElementClass( this.iframe, "invisible" );
// setup the note controls
this.note_controls = getElement( "note_controls_" + this.id );
@ -220,7 +238,7 @@ Editor.prototype.claim_iframe = function ( position_after, click_position ) {
// hide the iframe to make this transition appear seamless
addElementClass( this.iframe, "invisible" );
var frame_height = elementDimensions( this.div ).h;
insertSiblingNodesAfter( this.div, this.iframe );
var frame_width = elementDimensions( this.div ).w;
// give the invisible iframe the exact same position as the div it will replace
setElementPosition( this.iframe, getElementPosition( this.div ) );
@ -229,28 +247,20 @@ Editor.prototype.claim_iframe = function ( position_after, click_position ) {
var range = this.add_selection_bookmark();
this.set_iframe_contents( this.contents() );
this.remove_selection_bookmark( range );
this.resize( frame_height, frame_width );
// make the completed iframe visible and hide the static div
addElementClass( this.iframe, "focused_note_frame" );
removeElementClass( this.iframe, "invisible" );
addElementClass( this.div, "invisible" );
// set the iframe positioning back to standard static positioning
setStyle( this.iframe, { "position": "static" } );
// finally, turn on design mode so the iframe is editable
this.enable_design_mode();
function finish_init() {
self.position_cursor( click_position, range );
self.connect_handlers();
}
// this small delay gives IE enough lag time after design mode is enabled to setup document.body
if ( MSIE )
setTimeout( finish_init, 1 );
else
finish_init();
// this small delay gives the browser enough lag time after set_iframe_contents() to process the HTML
setTimeout( finish_init, 1 );
}
Editor.prototype.set_iframe_contents = function ( contents_text ) {
@ -284,19 +294,6 @@ Editor.prototype.set_iframe_contents = function ( contents_text ) {
this.document.close();
}
Editor.prototype.enable_design_mode = function () {
if ( this.iframe.contentDocument ) { // browsers such as Firefox
if ( this.edit_enabled )
this.document.designMode = "On";
} else { // browsers such as IE
if ( this.edit_enabled ) {
this.document.designMode = "On";
// work-around for IE bug: reget the document after designMode is turned on
this.document = this.iframe.contentWindow.document;
}
}
}
Editor.prototype.focus_default_text_field = function () {
// special-case: focus any username field found within this div
var username = getElement( "username" );
@ -379,8 +376,6 @@ Editor.prototype.position_cursor = function ( click_position, div_range ) {
return;
}
} else if ( click_position && this.document.selection ) { // browsers such as IE
var FRAME_BORDER_WIDTH = 2;
// position the cursor by using given click position coordinates
var range = this.document.selection.createRange();
range.moveToPoint(
@ -562,9 +557,8 @@ Editor.prototype.query_command_value = function ( command ) {
}
// resize the editor's frame to fit the dimensions of its content
Editor.prototype.resize = function ( height ) {
Editor.prototype.resize = function ( height, width ) {
if ( !this.document ) return;
var FRAME_BORDER_HEIGHT = 2;
if ( height ) {
height -= FRAME_BORDER_HEIGHT * 2; // 2 pixels at the top and 2 at the bottom
@ -577,7 +571,13 @@ Editor.prototype.resize = function ( height ) {
}
}
setElementDimensions( this.iframe, { "h": height } );
var size = { "h": height };
if ( width ) {
width -= FRAME_BORDER_WIDTH * 2; // 2 pixels at the top and 2 at the bottom
size[ "w" ] = width;
}
setElementDimensions( this.iframe, size );
}
Editor.prototype.key_pressed = function ( event ) {

View File

@ -284,6 +284,9 @@ class Main_page( Page ):
),
id = u"center_content_area",
),
Div(
id = u"iframe_area",
),
Div(
Note_tree_area(
notebook,