- Restored read-only mode for notes (using a separate HTML file, for lack of a better way)
- HTML file is now loaded on-demand the first time it's required
This commit is contained in:
parent
5e1ca7172a
commit
2bbf3d7c80
4 changed files with 141 additions and 72 deletions
|
@ -28,6 +28,7 @@
|
||||||
xmlns:xul="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
|
xmlns:xul="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
|
||||||
<binding id="styled-textbox">
|
<binding id="styled-textbox">
|
||||||
<implementation>
|
<implementation>
|
||||||
|
<field name="_editable"/>
|
||||||
<field name="_mode"/>
|
<field name="_mode"/>
|
||||||
<field name="_format"/>
|
<field name="_format"/>
|
||||||
<field name="_loadHandler"/>
|
<field name="_loadHandler"/>
|
||||||
|
@ -63,11 +64,6 @@
|
||||||
// tables, which wouldn't work here.
|
// tables, which wouldn't work here.
|
||||||
'<span class="tab"> </span>':"\t"
|
'<span class="tab"> </span>':"\t"
|
||||||
};
|
};
|
||||||
|
|
||||||
// not sure why an event is necessary here, but it is
|
|
||||||
var me = this;
|
|
||||||
this._loadHandler = function() {me._iframeLoaded()};
|
|
||||||
this._iframe.addEventListener("DOMContentLoaded", this._loadHandler, false);
|
|
||||||
]]></constructor>
|
]]></constructor>
|
||||||
|
|
||||||
<!-- Called when iframe browser is loaded. Until the browser is loaded, we can't do
|
<!-- Called when iframe browser is loaded. Until the browser is loaded, we can't do
|
||||||
|
@ -75,35 +71,6 @@
|
||||||
happen. -->
|
happen. -->
|
||||||
<method name="_iframeLoaded">
|
<method name="_iframeLoaded">
|
||||||
<body><![CDATA[
|
<body><![CDATA[
|
||||||
this._iframe.removeEventListener("DOMContentLoaded", this._loadHandler, false);
|
|
||||||
|
|
||||||
var ios = Components.classes["@mozilla.org/network/io-service;1"].
|
|
||||||
getService(Components.interfaces.nsIIOService);
|
|
||||||
var uri = ios.newURI("chrome://zotero/content/tinymce/" + this.mode + ".html", null, null);
|
|
||||||
var chromeReg = Components.classes["@mozilla.org/chrome/chrome-registry;1"].
|
|
||||||
getService(Components.interfaces.nsIChromeRegistry);
|
|
||||||
var fileURI = chromeReg.convertChromeURL(uri);
|
|
||||||
|
|
||||||
this._iframe.webNavigation.loadURI(fileURI.spec,
|
|
||||||
Components.interfaces.nsIWebNavigation.LOAD_FLAGS_BYPASS_HISTORY, null, null, null);
|
|
||||||
|
|
||||||
// Register handler for deferred setting of content
|
|
||||||
var me = this;
|
|
||||||
|
|
||||||
var listener = function() {
|
|
||||||
me._iframe.removeEventListener("DOMContentLoaded", listener, false);
|
|
||||||
var editor = me._iframe.contentWindow.wrappedJSObject.tinyMCE.get("tinymce");
|
|
||||||
|
|
||||||
editor.onInit.add(function() {
|
|
||||||
me._editor = editor;
|
|
||||||
if(me._value) me.value = me._value;
|
|
||||||
});
|
|
||||||
|
|
||||||
if (me._eventHandler) {
|
|
||||||
me._iframe.contentWindow.wrappedJSObject.handleEvent = me._eventHandler;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
this._iframe.addEventListener("DOMContentLoaded", listener, false);
|
|
||||||
]]></body>
|
]]></body>
|
||||||
</method>
|
</method>
|
||||||
|
|
||||||
|
@ -214,8 +181,13 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!this._editor) {
|
if(!this._editor) {
|
||||||
// if not loaded, wait until it is to set
|
Zotero.debug('No editor yet');
|
||||||
return this._value = val;
|
|
||||||
|
this._value = val;
|
||||||
|
if (!this._loaded) {
|
||||||
|
this._load();
|
||||||
|
}
|
||||||
|
return ;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this.value == val) {
|
if (this.value == val) {
|
||||||
|
@ -270,6 +242,51 @@
|
||||||
<property name="timeout"
|
<property name="timeout"
|
||||||
onset="this.setAttribute('timeout', val); return val;"
|
onset="this.setAttribute('timeout', val); return val;"
|
||||||
onget="return parseInt(this.getAttribute('timeout')) || 0;"/>
|
onget="return parseInt(this.getAttribute('timeout')) || 0;"/>
|
||||||
|
|
||||||
|
<field name="_loaded"/>
|
||||||
|
<method name="_load">
|
||||||
|
<body>
|
||||||
|
<![CDATA[
|
||||||
|
this._loaded = true;
|
||||||
|
|
||||||
|
// Unless we find a better way, use a separate HTML file
|
||||||
|
// for read-only mode
|
||||||
|
var htmlFile = this.mode + (this.getAttribute('readonly') != 'true' ? "" : "view");
|
||||||
|
|
||||||
|
var ios = Components.classes["@mozilla.org/network/io-service;1"].
|
||||||
|
getService(Components.interfaces.nsIIOService);
|
||||||
|
var uri = ios.newURI("chrome://zotero/content/tinymce/" + htmlFile + ".html", null, null);
|
||||||
|
var chromeReg = Components.classes["@mozilla.org/chrome/chrome-registry;1"].
|
||||||
|
getService(Components.interfaces.nsIChromeRegistry);
|
||||||
|
var fileURI = chromeReg.convertChromeURL(uri);
|
||||||
|
|
||||||
|
Zotero.debug("Loading " + fileURI.spec);
|
||||||
|
|
||||||
|
// Register handler for deferred setting of content
|
||||||
|
var self = this;
|
||||||
|
var listener = function() {
|
||||||
|
self._iframe.removeEventListener("DOMContentLoaded", listener, false);
|
||||||
|
var editor = self._iframe.contentWindow.wrappedJSObject.tinyMCE.get("tinymce");
|
||||||
|
|
||||||
|
editor.onInit.add(function() {
|
||||||
|
self._editor = editor;
|
||||||
|
if (self._value) {
|
||||||
|
self.value = self._value;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
if (self._eventHandler) {
|
||||||
|
self._iframe.contentWindow.wrappedJSObject.handleEvent = self._eventHandler;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
this._iframe.addEventListener("DOMContentLoaded", listener, false);
|
||||||
|
|
||||||
|
this._iframe.webNavigation.loadURI(fileURI.spec,
|
||||||
|
Components.interfaces.nsIWebNavigation.LOAD_FLAGS_BYPASS_HISTORY, null, null, null);
|
||||||
|
]]>
|
||||||
|
</body>
|
||||||
|
</method>
|
||||||
|
|
||||||
</implementation>
|
</implementation>
|
||||||
|
|
||||||
<content>
|
<content>
|
||||||
|
|
|
@ -2,39 +2,7 @@
|
||||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||||
<head>
|
<head>
|
||||||
<title>TinyMCE</title>
|
<title>TinyMCE</title>
|
||||||
<style>
|
<link type="text/css" rel="stylesheet" href="../../../skin/default/zotero/tinymce/note-ui.css"/>
|
||||||
html, body {
|
|
||||||
height: 100%;
|
|
||||||
margin: 0;
|
|
||||||
}
|
|
||||||
#tinymce_parent {
|
|
||||||
display: block;
|
|
||||||
height: 100%;
|
|
||||||
}
|
|
||||||
#tinymce_tbl {
|
|
||||||
height: 100% !important;
|
|
||||||
width: 100% !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
table.mceLayout > tbody > tr.mceLast {
|
|
||||||
position: absolute;
|
|
||||||
display: block;
|
|
||||||
top: 54px;
|
|
||||||
bottom: 2px;
|
|
||||||
left: 1px;
|
|
||||||
right: 1px;
|
|
||||||
}
|
|
||||||
|
|
||||||
td.mceIframeContainer {
|
|
||||||
display: block;
|
|
||||||
height: 100% !important;
|
|
||||||
width: 100% !important;
|
|
||||||
}
|
|
||||||
#tinymce_ifr {
|
|
||||||
height: 100% !important;
|
|
||||||
width: 100% !important;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
<script type="text/javascript" src="tiny_mce.js"></script>
|
<script type="text/javascript" src="tiny_mce.js"></script>
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
tinyMCE.init({
|
tinyMCE.init({
|
||||||
|
@ -65,13 +33,11 @@ td.mceIframeContainer {
|
||||||
/*plugins : "xhtmlxtras",*/
|
/*plugins : "xhtmlxtras",*/
|
||||||
|
|
||||||
// Theme options
|
// Theme options
|
||||||
theme_advanced_layout_manager : "SimpleLayout",
|
|
||||||
theme_advanced_buttons1 : "bold,italic,underline,strikethrough,|,sub,sup,|,forecolor,backcolor,|,blockquote,|,link,unlink",
|
theme_advanced_buttons1 : "bold,italic,underline,strikethrough,|,sub,sup,|,forecolor,backcolor,|,blockquote,|,link,unlink",
|
||||||
theme_advanced_buttons2 : "formatselect,|,justifyleft,justifycenter,justifyright,|,bullist,numlist,outdent,indent,|,removeformat,code",
|
theme_advanced_buttons2 : "formatselect,|,justifyleft,justifycenter,justifyright,|,bullist,numlist,outdent,indent,|,removeformat,code",
|
||||||
theme_advanced_buttons3 : "",
|
theme_advanced_buttons3 : "",
|
||||||
theme_advanced_toolbar_location : "top",
|
theme_advanced_toolbar_location : "top",
|
||||||
theme_advanced_toolbar_align : "left",
|
theme_advanced_toolbar_align : "left"
|
||||||
theme_advanced_resizing : true
|
|
||||||
});
|
});
|
||||||
tinyMCE.execCommand("mceAddControl", true, "tinymce");
|
tinyMCE.execCommand("mceAddControl", true, "tinymce");
|
||||||
</script>
|
</script>
|
||||||
|
|
54
chrome/content/zotero/tinymce/noteview.html
Normal file
54
chrome/content/zotero/tinymce/noteview.html
Normal file
|
@ -0,0 +1,54 @@
|
||||||
|
<!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">
|
||||||
|
<head>
|
||||||
|
<title>TinyMCE</title>
|
||||||
|
<link type="text/css" rel="stylesheet" href="../../../skin/default/zotero/tinymce/note-ui.css"/>
|
||||||
|
<style>
|
||||||
|
table.mceLayout > tbody > tr.mceLast {
|
||||||
|
top: 0;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
<script type="text/javascript" src="tiny_mce.js"></script>
|
||||||
|
<script type="text/javascript">
|
||||||
|
tinyMCE.init({
|
||||||
|
// General options
|
||||||
|
mode : "none",
|
||||||
|
theme : "advanced",
|
||||||
|
content_css : "../../../skin/default/zotero/tinymce/note-content.css",
|
||||||
|
button_tile_map : true,
|
||||||
|
language : "en", // TODO: localize
|
||||||
|
entity_encoding : "raw",
|
||||||
|
gecko_spellcheck : true,
|
||||||
|
readonly : true,
|
||||||
|
|
||||||
|
handle_event_callback : function (event) {
|
||||||
|
if (handleEvent) {
|
||||||
|
handleEvent(event);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
onchange_callback : function () {
|
||||||
|
var event = { type: 'change' };
|
||||||
|
if (handleEvent) {
|
||||||
|
handleEvent(event);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
fix_list_elements : true,
|
||||||
|
fix_table_elements : true,
|
||||||
|
/*plugins : "xhtmlxtras",*/
|
||||||
|
|
||||||
|
// Theme options
|
||||||
|
theme_advanced_buttons1 : "",
|
||||||
|
theme_advanced_buttons2 : "",
|
||||||
|
theme_advanced_buttons3 : "",
|
||||||
|
theme_advanced_toolbar_location : "top",
|
||||||
|
theme_advanced_toolbar_align : "left"
|
||||||
|
});
|
||||||
|
tinyMCE.execCommand("mceAddControl", true, "tinymce");
|
||||||
|
</script>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div id="tinymce"></div>
|
||||||
|
</body>
|
||||||
|
</html>
|
32
chrome/skin/default/zotero/tinymce/note-ui.css
Normal file
32
chrome/skin/default/zotero/tinymce/note-ui.css
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
html, body {
|
||||||
|
height: 100%;
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
#tinymce_parent {
|
||||||
|
display: block;
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
#tinymce_tbl {
|
||||||
|
height: 100% !important;
|
||||||
|
width: 100% !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.mceLayout > tbody > tr.mceLast {
|
||||||
|
position: absolute;
|
||||||
|
display: block;
|
||||||
|
top: 54px;
|
||||||
|
bottom: 2px;
|
||||||
|
left: 1px;
|
||||||
|
right: 1px;
|
||||||
|
}
|
||||||
|
|
||||||
|
td.mceIframeContainer {
|
||||||
|
display: block;
|
||||||
|
height: 100% !important;
|
||||||
|
width: 100% !important;
|
||||||
|
}
|
||||||
|
#tinymce_ifr {
|
||||||
|
height: 100% !important;
|
||||||
|
width: 100% !important;
|
||||||
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue