You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tapestry.apache.org by jk...@apache.org on 2006/09/23 01:22:51 UTC
svn commit: r449122 [25/40] - in
/tapestry/tapestry4/trunk/tapestry-framework/src: java/org/apache/tapestry/
java/org/apache/tapestry/dojo/ java/org/apache/tapestry/dojo/form/
java/org/apache/tapestry/dojo/html/ java/org/apache/tapestry/form/
java/org/...
Added: tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/Editor.js
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/Editor.js?view=auto&rev=449122
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/Editor.js (added)
+++ tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/Editor.js Fri Sep 22 16:22:30 2006
@@ -0,0 +1,535 @@
+/*
+ Copyright (c) 2004-2006, The Dojo Foundation
+ All Rights Reserved.
+
+ Licensed under the Academic Free License version 2.1 or above OR the
+ modified BSD license. For more information on Dojo licensing, see:
+
+ http://dojotoolkit.org/community/licensing.shtml
+*/
+
+/* TODO:
+ * - font selector
+ * - test, bug fix, more features :)
+*/
+dojo.provide("dojo.widget.Editor");
+dojo.provide("dojo.widget.Editor");
+dojo.deprecated("dojo.widget.Editor", "is replaced by dojo.widget.Editor2", "0.5");
+
+dojo.require("dojo.io.*");
+dojo.require("dojo.widget.*");
+dojo.require("dojo.widget.Toolbar");
+dojo.require("dojo.widget.RichText");
+dojo.require("dojo.widget.ColorPalette");
+dojo.require("dojo.string.extras");
+
+dojo.widget.tags.addParseTreeHandler("dojo:Editor");
+
+dojo.widget.Editor = function() {
+ dojo.widget.HtmlWidget.call(this);
+ this.contentFilters = [];
+ this._toolbars = [];
+}
+dojo.inherits(dojo.widget.Editor, dojo.widget.HtmlWidget);
+
+dojo.widget.Editor.itemGroups = {
+ textGroup: ["bold", "italic", "underline", "strikethrough"],
+ blockGroup: ["formatBlock", "fontName", "fontSize"],
+ justifyGroup: ["justifyleft", "justifycenter", "justifyright"],
+ commandGroup: ["save", "cancel"],
+ colorGroup: ["forecolor", "hilitecolor"],
+ listGroup: ["insertorderedlist", "insertunorderedlist"],
+ indentGroup: ["outdent", "indent"],
+ linkGroup: ["createlink", "insertimage", "inserthorizontalrule"]
+};
+
+dojo.widget.Editor.formatBlockValues = {
+ "Normal": "p",
+ "Main heading": "h2",
+ "Sub heading": "h3",
+ "Sub sub heading": "h4",
+ "Preformatted": "pre"
+};
+
+dojo.widget.Editor.fontNameValues = {
+ "Arial": "Arial, Helvetica, sans-serif",
+ "Verdana": "Verdana, sans-serif",
+ "Times New Roman": "Times New Roman, serif",
+ "Courier": "Courier New, monospace"
+};
+
+dojo.widget.Editor.fontSizeValues = {
+ "1 (8 pt)" : "1",
+ "2 (10 pt)": "2",
+ "3 (12 pt)": "3",
+ "4 (14 pt)": "4",
+ "5 (18 pt)": "5",
+ "6 (24 pt)": "6",
+ "7 (36 pt)": "7"
+};
+
+dojo.widget.Editor.defaultItems = [
+ "commandGroup", "|", "blockGroup", "|", "textGroup", "|", "colorGroup", "|", "justifyGroup", "|", "listGroup", "indentGroup", "|", "linkGroup"
+];
+
+// ones we support by default without asking the RichText component
+// NOTE: you shouldn't put buttons like bold, italic, etc in here
+dojo.widget.Editor.supportedCommands = ["save", "cancel", "|", "-", "/", " "];
+
+dojo.lang.extend(dojo.widget.Editor, {
+ widgetType: "Editor",
+
+ saveUrl: "",
+ saveMethod: "post",
+ saveArgName: "editorContent",
+ closeOnSave: false,
+ items: dojo.widget.Editor.defaultItems,
+ formatBlockItems: dojo.lang.shallowCopy(dojo.widget.Editor.formatBlockValues),
+ fontNameItems: dojo.lang.shallowCopy(dojo.widget.Editor.fontNameValues),
+ fontSizeItems: dojo.lang.shallowCopy(dojo.widget.Editor.fontSizeValues),
+
+ // used to get the properties of an item if it is given as a string
+ getItemProperties: function(name) {
+ var props = {};
+ switch(name.toLowerCase()) {
+ case "bold":
+ case "italic":
+ case "underline":
+ case "strikethrough":
+ props.toggleItem = true;
+ break;
+
+ case "justifygroup":
+ props.defaultButton = "justifyleft";
+ props.preventDeselect = true;
+ props.buttonGroup = true;
+ break;
+
+ case "listgroup":
+ props.buttonGroup = true;
+ break;
+
+ case "save":
+ case "cancel":
+ props.label = dojo.string.capitalize(name);
+ break;
+
+ case "forecolor":
+ case "hilitecolor":
+ props.name = name;
+ props.toggleItem = true; // FIXME: they aren't exactly toggle items
+ props.icon = this.getCommandImage(name);
+ break;
+
+ case "formatblock":
+ props.name = "formatBlock";
+ props.values = this.formatBlockItems;
+ break;
+
+ case "fontname":
+ props.name = "fontName";
+ props.values = this.fontNameItems;
+
+ case "fontsize":
+ props.name = "fontSize";
+ props.values = this.fontSizeItems;
+ }
+ return props;
+ },
+
+ validateItems: true, // set to false to add items, regardless of support
+ focusOnLoad: true,
+ minHeight: "1em",
+
+ _richText: null, // RichText widget
+ _richTextType: "RichText",
+
+ _toolbarContainer: null, // ToolbarContainer widget
+ _toolbarContainerType: "ToolbarContainer",
+
+ _toolbars: [],
+ _toolbarType: "Toolbar",
+
+ _toolbarItemType: "ToolbarItem",
+
+ buildRendering: function(args, frag) {
+ // get the node from args/frag
+ var node = frag["dojo:"+this.widgetType.toLowerCase()]["nodeRef"];
+ var trt = dojo.widget.createWidget(this._richTextType, {
+ focusOnLoad: this.focusOnLoad,
+ minHeight: this.minHeight
+ }, node)
+ var _this = this;
+ // this appears to fix a weird timing bug on Safari
+ setTimeout(function(){
+ _this.setRichText(trt);
+
+ _this.initToolbar();
+
+ _this.fillInTemplate(args, frag);
+ }, 0);
+ },
+
+ setRichText: function(richText) {
+ if(this._richText && this._richText == richText) {
+ dojo.debug("Already set the richText to this richText!");
+ return;
+ }
+
+ if(this._richText && !this._richText.isClosed) {
+ dojo.debug("You are switching richTexts yet you haven't closed the current one. Losing reference!");
+ }
+ this._richText = richText;
+ dojo.event.connect(this._richText, "close", this, "onClose");
+ dojo.event.connect(this._richText, "onLoad", this, "onLoad");
+ dojo.event.connect(this._richText, "onDisplayChanged", this, "updateToolbar");
+ if(this._toolbarContainer) {
+ this._toolbarContainer.enable();
+ this.updateToolbar(true);
+ }
+ },
+
+ initToolbar: function() {
+ // var tic = new Date();
+ if(this._toolbarContainer) { return; } // only create it once
+ this._toolbarContainer = dojo.widget.createWidget(this._toolbarContainerType);
+ var tb = this.addToolbar();
+ var last = true;
+ for(var i = 0; i < this.items.length; i++) {
+ if(this.items[i] == "\n") { // new row
+ tb = this.addToolbar();
+ } else {
+ if((this.items[i] == "|")&&(!last)){
+ last = true;
+ }else{
+ last = this.addItem(this.items[i], tb);
+ }
+ }
+ }
+ this.insertToolbar(this._toolbarContainer.domNode, this._richText.domNode);
+ // alert(new Date - tic);
+ },
+
+ // allow people to override this so they can make their own placement logic
+ insertToolbar: function(tbNode, richTextNode) {
+ dojo.html.insertBefore(tbNode, richTextNode);
+ //dojo.html.insertBefore(this._toolbarContainer.domNode, this._richText.domNode);
+ },
+
+ addToolbar: function(toolbar) {
+ this.initToolbar();
+ if(!(toolbar instanceof dojo.widget.Toolbar)) {
+ toolbar = dojo.widget.createWidget(this._toolbarType);
+ }
+ this._toolbarContainer.addChild(toolbar);
+ this._toolbars.push(toolbar);
+ return toolbar;
+ },
+
+ addItem: function(item, tb, dontValidate) {
+ if(!tb) { tb = this._toolbars[0]; }
+ var cmd = ((item)&&(!dojo.lang.isUndefined(item["getValue"]))) ? cmd = item["getValue"](): item;
+
+ var groups = dojo.widget.Editor.itemGroups;
+ if(item instanceof dojo.widget.ToolbarItem) {
+ tb.addChild(item);
+ } else if(groups[cmd]) {
+ var group = groups[cmd];
+ var worked = true;
+ if(cmd == "justifyGroup" || cmd == "listGroup") {
+ var btnGroup = [cmd];
+ for(var i = 0 ; i < group.length; i++) {
+ if(dontValidate || this.isSupportedCommand(group[i])) {
+ btnGroup.push(this.getCommandImage(group[i]));
+ }else{
+ worked = false;
+ }
+ }
+ if(btnGroup.length){
+ /*
+ // the addChild interface is assinine. Work around it.
+ var tprops = this.getItemProperties(cmd);
+ var tmpGroup = dojo.widget.createWidget("ToolbarButtonGroup", tprops);
+ dojo.debug(btnGroup);
+ dojo.event.connect(tmpGroup, "onClick", this, "_action");
+ dojo.event.connect(tmpGroup, "onChangeSelect", this, "_action");
+ */
+ var btn = tb.addChild(btnGroup, null, this.getItemProperties(cmd));
+ dojo.event.connect(btn, "onClick", this, "_action");
+ dojo.event.connect(btn, "onChangeSelect", this, "_action");
+ }
+ return worked;
+ } else {
+ for(var i = 0; i < group.length; i++) {
+ if(!this.addItem(group[i], tb)){
+ worked = false;
+ }
+ }
+ return worked;
+ }
+ } else {
+ if((!dontValidate)&&(!this.isSupportedCommand(cmd))){
+ return false;
+ }
+ if(dontValidate || this.isSupportedCommand(cmd)) {
+ cmd = cmd.toLowerCase();
+ if(cmd == "formatblock") {
+ var select = dojo.widget.createWidget("ToolbarSelect", {
+ name: "formatBlock",
+ values: this.formatBlockItems
+ });
+ tb.addChild(select);
+ var _this = this;
+ dojo.event.connect(select, "onSetValue", function(item, value) {
+ _this.onAction("formatBlock", value);
+ });
+ } else if(cmd == "fontname") {
+ var select = dojo.widget.createWidget("ToolbarSelect", {
+ name: "fontName",
+ values: this.fontNameItems
+ });
+ tb.addChild(select);
+ dojo.event.connect(select, "onSetValue", dojo.lang.hitch(this, function(item, value) {
+ this.onAction("fontName", value);
+ }));
+ } else if(cmd == "fontsize") {
+ var select = dojo.widget.createWidget("ToolbarSelect", {
+ name: "fontSize",
+ values: this.fontSizeItems
+ });
+ tb.addChild(select);
+ dojo.event.connect(select, "onSetValue", dojo.lang.hitch(this, function(item, value) {
+ this.onAction("fontSize", value);
+ }));
+ } else if(dojo.lang.inArray(cmd, ["forecolor", "hilitecolor"])) {
+ var btn = tb.addChild(dojo.widget.createWidget("ToolbarColorDialog", this.getItemProperties(cmd)));
+ dojo.event.connect(btn, "onSetValue", this, "_setValue");
+ } else {
+ var btn = tb.addChild(this.getCommandImage(cmd), null, this.getItemProperties(cmd));
+ if(cmd == "save"){
+ dojo.event.connect(btn, "onClick", this, "_save");
+ }else if(cmd == "cancel"){
+ dojo.event.connect(btn, "onClick", this, "_close");
+ } else {
+ dojo.event.connect(btn, "onClick", this, "_action");
+ dojo.event.connect(btn, "onChangeSelect", this, "_action");
+ }
+ }
+ }
+ }
+ return true;
+ },
+
+ enableToolbar: function() {
+ if(this._toolbarContainer) {
+ this._toolbarContainer.domNode.style.display = "";
+ this._toolbarContainer.enable();
+ }
+ },
+
+ disableToolbar: function(hide){
+ if(hide){
+ if(this._toolbarContainer){
+ this._toolbarContainer.domNode.style.display = "none";
+ }
+ }else{
+ if(this._toolbarContainer){
+ this._toolbarContainer.disable();
+ }
+ }
+ },
+
+ _updateToolbarLastRan: null,
+ _updateToolbarTimer: null,
+ _updateToolbarFrequency: 500,
+
+ updateToolbar: function(force) {
+ if(!this._toolbarContainer) { return; }
+
+ // keeps the toolbar from updating too frequently
+ // TODO: generalize this functionality?
+ var diff = new Date() - this._updateToolbarLastRan;
+ if(!force && this._updateToolbarLastRan && (diff < this._updateToolbarFrequency)) {
+ clearTimeout(this._updateToolbarTimer);
+ var _this = this;
+ this._updateToolbarTimer = setTimeout(function() {
+ _this.updateToolbar();
+ }, this._updateToolbarFrequency/2);
+ return;
+ } else {
+ this._updateToolbarLastRan = new Date();
+ }
+ // end frequency checker
+
+ var items = this._toolbarContainer.getItems();
+ for(var i = 0; i < items.length; i++) {
+ var item = items[i];
+ if(item instanceof dojo.widget.ToolbarSeparator) { continue; }
+ var cmd = item._name;
+ if (cmd == "save" || cmd == "cancel") { continue; }
+ else if(cmd == "justifyGroup") {
+ try {
+ if(!this._richText.queryCommandEnabled("justifyleft")) {
+ item.disable(false, true);
+ } else {
+ item.enable(false, true);
+ var jitems = item.getItems();
+ for(var j = 0; j < jitems.length; j++) {
+ var name = jitems[j]._name;
+ var value = this._richText.queryCommandValue(name);
+ if(typeof value == "boolean" && value) {
+ value = name;
+ break;
+ } else if(typeof value == "string") {
+ value = "justify"+value;
+ } else {
+ value = null;
+ }
+ }
+ if(!value) { value = "justifyleft"; } // TODO: query actual style
+ item.setValue(value, false, true);
+ }
+ } catch(err) {}
+ } else if(cmd == "listGroup") {
+ var litems = item.getItems();
+ for(var j = 0; j < litems.length; j++) {
+ this.updateItem(litems[j]);
+ }
+ } else {
+ this.updateItem(item);
+ }
+ }
+ },
+
+ updateItem: function(item) {
+ try {
+ var cmd = item._name;
+ var enabled = this._richText.queryCommandEnabled(cmd);
+ item.setEnabled(enabled, false, true);
+
+ var active = this._richText.queryCommandState(cmd);
+ if(active && cmd == "underline") {
+ // don't activate underlining if we are on a link
+ active = !this._richText.queryCommandEnabled("unlink");
+ }
+ item.setSelected(active, false, true);
+ return true;
+ } catch(err) {
+ return false;
+ }
+ },
+
+ supportedCommands: dojo.widget.Editor.supportedCommands.concat(),
+
+ isSupportedCommand: function(cmd) {
+ // FIXME: how do we check for ActiveX?
+ var yes = dojo.lang.inArray(cmd, this.supportedCommands);
+ if(!yes) {
+ try {
+ var richText = this._richText || dojo.widget.HtmlRichText.prototype;
+ yes = richText.queryCommandAvailable(cmd);
+ } catch(E) {}
+ }
+ return yes;
+ },
+
+ getCommandImage: function(cmd) {
+ if(cmd == "|") {
+ return cmd;
+ } else {
+ return dojo.uri.dojoUri("src/widget/templates/buttons/" + cmd + ".gif");
+ }
+ },
+
+ _action: function(e) {
+ this._fire("onAction", e.getValue());
+ },
+
+ _setValue: function(a, b) {
+ this._fire("onAction", a.getValue(), b);
+ },
+
+ _save: function(e){
+ // FIXME: how should this behave when there's a larger form in play?
+ if(!this._richText.isClosed){
+ if(this.saveUrl.length){
+ var content = {};
+ content[this.saveArgName] = this.getHtml();
+ dojo.io.bind({
+ method: this.saveMethod,
+ url: this.saveUrl,
+ content: content
+ });
+ }else{
+ dojo.debug("please set a saveUrl for the editor");
+ }
+ if(this.closeOnSave){
+ this._richText.close(e.getName().toLowerCase() == "save");
+ }
+ }
+ },
+
+ _close: function(e) {
+ if(!this._richText.isClosed) {
+ this._richText.close(e.getName().toLowerCase() == "save");
+ }
+ },
+
+ onAction: function(cmd, value) {
+ switch(cmd) {
+ case "createlink":
+ if(!(value = prompt("Please enter the URL of the link:", "http://"))) {
+ return;
+ }
+ break;
+ case "insertimage":
+ if(!(value = prompt("Please enter the URL of the image:", "http://"))) {
+ return;
+ }
+ break;
+ }
+ this._richText.execCommand(cmd, value);
+ },
+
+ fillInTemplate: function(args, frag) {
+ // dojo.event.connect(this, "onResized", this._richText, "onResized");
+ },
+
+ _fire: function(eventName) {
+ if(dojo.lang.isFunction(this[eventName])) {
+ var args = [];
+ if(arguments.length == 1) {
+ args.push(this);
+ } else {
+ for(var i = 1; i < arguments.length; i++) {
+ args.push(arguments[i]);
+ }
+ }
+ this[eventName].apply(this, args);
+ }
+ },
+
+ getHtml: function(){
+ this._richText.contentFilters = this._richText.contentFilters.concat(this.contentFilters);
+ return this._richText.getEditorContent();
+ },
+
+ getEditorContent: function(){
+ return this.getHtml();
+ },
+
+ onClose: function(save, hide){
+ this.disableToolbar(hide);
+ if(save) {
+ this._fire("onSave");
+ } else {
+ this._fire("onCancel");
+ }
+ },
+
+ // events baby!
+ onLoad: function(){},
+ onSave: function(){},
+ onCancel: function(){}
+});
+
Propchange: tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/Editor.js
------------------------------------------------------------------------------
svn:eol-style = native
Added: tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/Editor2.js
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/Editor2.js?view=auto&rev=449122
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/Editor2.js (added)
+++ tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/Editor2.js Fri Sep 22 16:22:30 2006
@@ -0,0 +1,610 @@
+/*
+ Copyright (c) 2004-2006, The Dojo Foundation
+ All Rights Reserved.
+
+ Licensed under the Academic Free License version 2.1 or above OR the
+ modified BSD license. For more information on Dojo licensing, see:
+
+ http://dojotoolkit.org/community/licensing.shtml
+*/
+
+/* TODO:
+ * - font selector
+ * - test, bug fix, more features :)
+*/
+dojo.provide("dojo.widget.Editor2");
+dojo.provide("dojo.widget.Editor2Manager");
+
+dojo.require("dojo.io.*");
+dojo.require("dojo.html.*");
+dojo.require("dojo.html.layout");
+dojo.require("dojo.widget.*");
+dojo.require("dojo.widget.RichText");
+dojo.require("dojo.widget.Editor2Toolbar");
+
+// dojo.require("dojo.widget.ColorPalette");
+// dojo.require("dojo.string.extras");
+
+//API to manage current focused Editor2 Instance
+dojo.widget.Editor2Manager = {
+ //private variables
+ _currentInstance: null,
+ _loadedCommands: {},
+
+ destroy: function(){
+ this._currentInstance = null;
+ for(var cmd in this._loadedCommands){
+ this._loadedCommands[cmd].destory();
+ }
+ },
+
+ commandState: {Disabled: 0, Latched: 1, Enabled: 2},
+ //Public API
+ getCurrentInstance: function(){
+ return this._currentInstance;
+ },
+ setCurrentInstance: function(inst){
+ this._currentInstance = inst;
+ },
+ registerCommand: function(name, cmd){
+ name = name.toLowerCase();
+ if(this._loadedCommands[name]){
+ delete this._loadedCommands[name];
+ }
+ this._loadedCommands[name] = cmd;
+ },
+ getCommand: function(name){
+ name = name.toLowerCase();
+ var oCommand = this._loadedCommands[name];
+ if(oCommand){
+ return oCommand;
+ }
+
+ switch(name){
+ case 'htmltoggle':
+ //Editor2 natively provide the htmltoggle functionalitity
+ //and it is treated as a builtin command
+ oCommand = new dojo.widget.Editor2BrowserCommand(name);
+ break;
+ case 'formatblock':
+ oCommand = new dojo.widget.Editor2FormatBlockCommand(name);
+ break;
+ case 'anchor':
+ oCommand = new dojo.widget.Editor2Command(name);
+ break;
+
+ //dialog command
+ case 'createlink':
+ oCommand = new dojo.widget.Editor2DialogCommand(name,
+ {contentFile: "dojo.widget.Editor2Plugin.CreateLinkDialog",
+ contentClass: "Editor2CreateLinkDialog",
+ title: "Insert/Edit Link", width: "300px", height: "200px"});
+ break;
+ case 'insertimage':
+ oCommand = new dojo.widget.Editor2DialogCommand(name,
+ {contentFile: "dojo.widget.Editor2Plugin.InsertImageDialog",
+ contentClass: "Editor2InsertImageDialog",
+ title: "Insert/Edit Image", width: "400px", height: "270px"});
+ break;
+ // By default we assume that it is a builtin simple command.
+ default:
+ var curtInst = this.getCurrentInstance();
+ if((curtInst && curtInst.queryCommandAvailable(name)) ||
+ (!curtInst && dojo.widget.Editor2.prototype.queryCommandAvailable(name))){
+ oCommand = new dojo.widget.Editor2BrowserCommand(name);
+ }else{
+ dojo.debug("dojo.widget.Editor2Manager.getCommand: Unknown command "+name);
+ return;
+ }
+ }
+ this._loadedCommands[name] = oCommand;
+ return oCommand;
+ }
+};
+
+dojo.addOnUnload(dojo.widget.Editor2Manager, "destroy");
+
+/* base class for all command in Editor2 */
+dojo.lang.declare("dojo.widget.Editor2Command",null,{
+ initializer: function(name){
+ this._name = name;
+ },
+ //this function should be re-implemented in subclass
+ execute: function(para){
+ alert("Please implement your own execute() function for subclass of Editor2Command.");
+ },
+ //default implemetation always returns Enabled
+ getState: function(){
+ return dojo.widget.Editor2Manager.commandState.Enabled;
+ },
+ destory: function(){}
+ }
+);
+
+dojo.lang.declare("dojo.widget.Editor2BrowserCommand", dojo.widget.Editor2Command, {
+ execute: function(para){
+ var curInst = dojo.widget.Editor2Manager.getCurrentInstance();
+ if(curInst){
+ curInst.execCommand(this._name, para);
+ }
+ },
+ getState: function(){
+ var curInst = dojo.widget.Editor2Manager.getCurrentInstance();
+ if(curInst){
+ try{
+ if(curInst.queryCommandEnabled(this._name)){
+ if(curInst.queryCommandState(this._name)){
+ return dojo.widget.Editor2Manager.commandState.Latched;
+ }else{
+ return dojo.widget.Editor2Manager.commandState.Enabled;
+ }
+ }else{
+ return dojo.widget.Editor2Manager.commandState.Disabled;
+ }
+ }catch (e) {
+ //dojo.debug("exception when getting state for command "+this._name+": "+e);
+ return dojo.widget.Editor2Manager.commandState.Enabled;
+ }
+ }
+ return dojo.widget.Editor2Manager.commandState.Disabled;
+ },
+ getValue: function(){
+ var curInst = dojo.widget.Editor2Manager.getCurrentInstance();
+ if(curInst){
+ try{
+ return curInst.queryCommandValue(this._name);
+ }catch(e){}
+ }
+ }
+ }
+);
+
+dojo.lang.declare("dojo.widget.Editor2FormatBlockCommand", dojo.widget.Editor2BrowserCommand, {
+ /* In none-ActiveX mode under IE, <p> and no <p> text can not be distinguished
+ getCurrentValue: function(){
+ var curInst = dojo.widget.Editor2Manager.getCurrentInstance();
+ if(!curInst){ return ''; }
+
+ var h = dojo.render.html;
+
+ // safari f's us for selection primitives
+ if(h.safari){ return ''; }
+
+ var selectedNode = (h.ie) ? curInst.document.selection.createRange().parentElement() : curInst.window.getSelection().anchorNode;
+ // make sure we actuall have an element
+ while((selectedNode)&&(selectedNode.nodeType != 1)){
+ selectedNode = selectedNode.parentNode;
+ }
+ if(!selectedNode){ return ''; }
+
+ var formats = ["p", "pre", "h1", "h2", "h3", "h4", "h5", "h6", "address"];
+ // gotta run some specialized updates for the various
+ // formatting options
+ var type = formats[dojo.lang.find(formats, selectedNode.nodeName.toLowerCase())];
+ while((selectedNode!=curInst.editNode)&&(!type)){
+ selectedNode = selectedNode.parentNode;
+ if(!selectedNode){ break; }
+ type = formats[dojo.lang.find(formats, selectedNode.nodeName.toLowerCase())];
+ }
+ if(!type){
+ type = "";
+ }
+ return type;
+ }*/
+ }
+);
+
+dojo.require("dojo.widget.FloatingPane");
+dojo.widget.defineWidget(
+ "dojo.widget.Editor2Dialog",
+ [dojo.widget.HtmlWidget, dojo.widget.FloatingPaneBase, dojo.widget.ModalDialogBase],
+ {
+ modal: true,
+ templatePath: dojo.uri.dojoUri("src/widget/templates/Editor2/EditorDialog.html"),
+ executeScripts: true,
+ refreshOnShow: true, //for debug for now
+
+ width: false,
+ height: false,
+
+ windowState: "minimized",
+ displayCloseAction: true,
+
+ contentFile: "",
+ contentClass: "",
+
+ fillInTemplate: function(args, frag){
+ this.fillInFloatingPaneTemplate(args, frag);
+ dojo.widget.Editor2Dialog.superclass.fillInTemplate.call(this, args, frag);
+ },
+ postCreate: function(){
+ if(this.contentFile){
+ dojo.require(this.contentFile);
+ }
+ if(this.modal){
+ dojo.widget.ModalDialogBase.prototype.postCreate.call(this);
+ }else{
+ with(this.domNode.style) {
+ zIndex = 999;
+ display = "none";
+ }
+ }
+ dojo.widget.FloatingPaneBase.prototype.postCreate.apply(this, arguments);
+ dojo.widget.Editor2Dialog.superclass.postCreate.call(this);
+ if(this.width && this.height){
+ with(this.domNode.style){
+ width = this.width;
+ height = this.height;
+ }
+ }
+ },
+ createContent: function(){
+ if(!this.contentWidget && this.contentClass){
+ this.contentWidget = dojo.widget.createWidget(this.contentClass, {parent: this});
+ this.containerNode.appendChild(this.contentWidget.domNode);
+ dojo.event.connect(this, "destroy", this.contentWidget, "destroy");
+ }
+ },
+ show: function(){
+ if(!this.contentWidget){
+ //buggy IE: if the dialog is hidden, the button widgets
+ //in the dialog can not be shown, so show it temporary (as the
+ //dialog may decide not to show it in loadContent() later)
+ dojo.widget.Editor2Dialog.superclass.show.apply(this, arguments);
+ this.createContent();
+ dojo.widget.Editor2Dialog.superclass.hide.call(this);
+ }
+
+ if(!this.contentWidget || !this.contentWidget.loadContent()){
+ return;
+ }
+ this.showFloatingPane();
+ dojo.widget.Editor2Dialog.superclass.show.apply(this, arguments);
+ if(this.modal){
+ this.showModalDialog();
+ }
+ this.placeModalDialog();
+ if(this.modal){
+ //place the background div under this modal pane
+ this.shared.bg.style.zIndex = this.domNode.style.zIndex-1;
+ }
+ },
+ onShow: function(){
+ dojo.widget.Editor2Dialog.superclass.onShow.call(this);
+ this.onFloatingPaneShow();
+ },
+ closeWindow: function(){
+ this.hide();
+ dojo.widget.Editor2Dialog.superclass.closeWindow.apply(this, arguments);
+ },
+ hide: function(){
+ if(this.modal){
+ this.hideModalDialog();
+ }
+ dojo.widget.Editor2Dialog.superclass.hide.call(this);
+ }
+ }
+);
+
+dojo.widget.defineWidget(
+ "dojo.widget.Editor2DialogContent",
+ dojo.widget.HtmlWidget,
+{
+ enableSubWidgets: true,
+
+ loadContent:function(){
+ return true;
+ },
+ cancel: function(){
+ this.parent.hide();
+ }
+});
+
+dojo.lang.declare("dojo.widget.Editor2DialogCommand", dojo.widget.Editor2BrowserCommand,
+ function(name, dialogParas){
+ this.dialogParas = dialogParas;
+ },
+{
+ execute: function(){
+ if(!this.dialog){
+ if(!this.dialogParas.contentFile || !this.dialogParas.contentClass){
+ alert("contentFile and contentClass should be set for dojo.widget.Editor2DialogCommand.dialogParas!");
+ return;
+ }
+ this.dialog = dojo.widget.createWidget("Editor2Dialog", this.dialogParas);
+
+ dojo.body().appendChild(this.dialog.domNode);
+
+ dojo.event.connect(this, "destroy", this.dialog, "destroy");
+ }
+ this.dialog.show();
+ }
+});
+
+dojo.widget.defineWidget(
+ "dojo.widget.Editor2",
+ dojo.widget.RichText,
+ {
+ saveUrl: "",
+ saveMethod: "post",
+ saveArgName: "editorContent",
+ closeOnSave: false,
+ shareToolbar: false,
+ toolbarAlwaysVisible: false,
+ htmlEditing: false,
+ _inSourceMode: false,
+ _htmlEditNode: null,
+
+ toolbarWidget: null,
+ scrollInterval: null,
+ toolbarTemplatePath: dojo.uri.dojoUri("src/widget/templates/EditorToolbarOneline.html"),
+// toolbarTemplatePath: dojo.uri.dojoUri("src/widget/templates/Editor2/EditorToolbarFCKStyle.html"),
+// toolbarTemplateCssPath: dojo.uri.dojoUri("src/widget/templates/Editor2/FCKDefault/EditorToolbarFCKStyle.css"),
+
+ plugins: "",
+
+ editorOnLoad: function(){
+// dojo.profile.start("dojo.widget.Editor2::editorOnLoad");
+
+ dojo.event.topic.publish("dojo.widget.Editor2::preLoadingToolbar", this);
+ if(this.toolbarAlwaysVisible){
+ dojo.require("dojo.widget.Editor2Plugin.AlwaysShowToolbar");
+ }
+
+ var toolbars = dojo.widget.byType("Editor2Toolbar");
+ if((!toolbars.length)||(!this.shareToolbar)){
+ if(this.toolbarWidget){
+ this.toolbarWidget.show();
+ //re-add the toolbar to the new domNode (caused by open() on another element)
+ dojo.html.insertBefore(this.toolbarWidget.domNode, this.domNode.firstChild);
+ }else{
+ var tbOpts = {};
+ tbOpts.templatePath = this.toolbarTemplatePath;
+ if(this.toolbarTemplateCssPath){
+ tbOpts.templateCssPath = this.toolbarTemplateCssPath;
+ }
+ this.toolbarWidget = dojo.widget.createWidget("Editor2Toolbar", tbOpts, this.domNode.firstChild, "before");
+
+ dojo.event.connect(this, "close", this.toolbarWidget, "hide");
+
+ this.toolbarLoaded();
+ }
+ }else{
+ // FIXME: selecting in one shared toolbar doesn't clobber
+ // selection in the others. This is problematic.
+ this.toolbarWidget = toolbars[0];
+ }
+
+ dojo.event.topic.registerPublisher("Editor2.clobberFocus", this, "clobberFocus");
+ dojo.event.topic.subscribe("Editor2.clobberFocus", this, "setBlur");
+
+ dojo.event.topic.publish("dojo.widget.Editor2::onLoad", this);
+// dojo.profile.end("dojo.widget.Editor2::editorOnLoad");
+ },
+
+ //event for plugins to use
+ toolbarLoaded: function(){},
+
+ //TODO: provide a query mechanism about loaded plugins?
+ registerLoadedPlugin: function(/*Object*/obj){
+ if(!this.loadedPlugins){
+ this.loadedPlugins = [];
+ }
+ this.loadedPlugins.push(obj);
+ },
+ unregisterLoadedPlugin: function(/*Object*/obj){
+ for(var i in this.loadedPlugins){
+ if(this.loadedPlugins[i] === obj){
+ delete this.loadedPlugins[i];
+ return;
+ }
+ }
+ dojo.debug("dojo.widget.Editor2.unregisterLoadedPlugin: unknow plugin object: "+obj);
+ },
+
+ //overload the default one to provide extra commands
+ execCommand: function(command, argument){
+ switch(command.toLowerCase()){
+ case 'htmltoggle':
+ this.toggleHtmlEditing();
+ break;
+ default:
+ dojo.widget.Editor2.superclass.execCommand.call(this, command, argument);
+ }
+ },
+ queryCommandEnabled: function(command, argument){
+ switch(command.toLowerCase()){
+ case 'htmltoggle':
+ return true;
+ default:
+ if(this._inSourceMode){ return false;}
+ return dojo.widget.Editor2.superclass.queryCommandEnabled.call(this, command, argument);
+ }
+ },
+ queryCommandState: function(command, argument){
+ switch(command.toLowerCase()){
+ case 'htmltoggle':
+ return this._inSourceMode;
+ default:
+ return dojo.widget.Editor2.superclass.queryCommandState.call(this, command, argument);
+ }
+ },
+
+ onClick: function(e){
+ dojo.widget.Editor2.superclass.onClick.call(this, e);
+ //if Popup is used, call dojo.widget.PopupManager.onClick
+ //manually when click in the editing area to close all
+ //open popups (dropdowns)
+ if(dojo.widget.PopupManager){
+ if(!e){ //IE
+ e = this.window.event;
+ }
+ dojo.widget.PopupManager.onClick(e);
+ }
+ },
+
+ clobberFocus: function(){},
+ toggleHtmlEditing: function(){
+ if(this===dojo.widget.Editor2Manager.getCurrentInstance()){
+ if(!this._inSourceMode){
+ this._inSourceMode = true;
+
+ if(!this._htmlEditNode){
+ this._htmlEditNode = dojo.doc().createElement("textarea");
+ dojo.html.insertAfter(this._htmlEditNode, this.editorObject);
+ }
+ this._htmlEditNode.style.display = "";
+ this._htmlEditNode.style.width = "100%";
+ this._htmlEditNode.style.height = dojo.html.getBorderBox(this.editNode).height+"px";
+ this._htmlEditNode.value = this.editNode.innerHTML;
+
+ //activeX object (IE) doesn't like to be hidden, so move it outside of screen instead
+ with(this.editorObject.style){
+ position = "absolute";
+ left = "-2000px";
+ top = "-2000px";
+ }
+ }else{
+ this._inSourceMode = false;
+
+ //In IE activeX mode, if _htmlEditNode is focused,
+ //when toggling, an error would occur, so unfocus it
+ this._htmlEditNode.blur();
+
+ with(this.editorObject.style){
+ position = "";
+ left = "";
+ top = "";
+ }
+
+ dojo.lang.setTimeout(this, "replaceEditorContent", 1, this._htmlEditNode.value);
+ this._htmlEditNode.style.display = "none";
+ this.focus();
+ }
+ this.updateToolbar(true);
+ }
+ },
+
+ setFocus: function(){
+ dojo.debug("setFocus: start "+this.widgetId);
+ if(dojo.widget.Editor2Manager.getCurrentInstance() === this){ return; }
+
+ this.clobberFocus();
+ dojo.debug("setFocus:", this);
+ dojo.widget.Editor2Manager.setCurrentInstance(this);
+ },
+
+ setBlur: function(){
+ dojo.debug("setBlur:", this);
+ //dojo.event.disconnect(this.toolbarWidget, "exec", this, "execCommand");
+ },
+
+ _updateToolbarLastRan: null,
+ _updateToolbarTimer: null,
+ _updateToolbarFrequency: 500,
+
+ updateToolbar: function(force){
+ if((!this.isLoaded)||(!this.toolbarWidget)){ return; }
+
+ // keeps the toolbar from updating too frequently
+ // TODO: generalize this functionality?
+ var diff = new Date() - this._updateToolbarLastRan;
+ if( (!force)&&(this._updateToolbarLastRan)&&
+ ((diff < this._updateToolbarFrequency)) ){
+
+ clearTimeout(this._updateToolbarTimer);
+ var _this = this;
+ this._updateToolbarTimer = setTimeout(function() {
+ _this.updateToolbar();
+ }, this._updateToolbarFrequency/2);
+ return;
+
+ }else{
+ this._updateToolbarLastRan = new Date();
+ }
+ // end frequency checker
+
+ //TODO
+ //if((cmd == "inserthtml") || (cmd == "save")){ return; }
+
+ //IE has the habit of generating events even when this editor is blurred, prevent this
+ if(dojo.widget.Editor2Manager.getCurrentInstance() !== this){ return; }
+
+ this.toolbarWidget.update();
+ },
+
+ destroy: function(finalize){
+ this._htmlEditNode = null;
+ dojo.event.disconnect(this, "close", this.toolbarWidget, "hide");
+ if(!finalize){
+ this.toolbarWidget.destroy();
+ }
+ dojo.widget.Editor2.superclass.destroy.call(this);
+ },
+
+ onDisplayChanged: function(e){
+ dojo.widget.Editor2.superclass.onDisplayChanged.call(this,e);
+ this.updateToolbar();
+ },
+
+ onLoad: function(){
+ try{
+ dojo.widget.Editor2.superclass.onLoad.call(this);
+ }catch(e){ // FIXME: debug why this is throwing errors in IE!
+ dojo.debug(e);
+ }
+ this.editorOnLoad();
+ },
+
+ onFocus: function(){
+ dojo.widget.Editor2.superclass.onFocus.call(this);
+ this.setFocus();
+ },
+
+ //overload to support source editing mode
+ getEditorContent: function(){
+ if(this._inSourceMode){
+ this.replaceEditorContent(this._htmlEditNode.value);
+ }
+ return dojo.widget.Editor2.superclass.getEditorContent.call(this);
+ }// FIXME: probably not needed any more with new design, but need to verify
+ /*,
+
+ _save: function(e){
+ // FIXME: how should this behave when there's a larger form in play?
+ if(!this.isClosed){
+ dojo.debug("save attempt");
+ if(this.saveUrl.length){
+ var content = {};
+ content[this.saveArgName] = this.getEditorContent();
+ dojo.io.bind({
+ method: this.saveMethod,
+ url: this.saveUrl,
+ content: content
+ });
+ }else{
+ dojo.debug("please set a saveUrl for the editor");
+ }
+ if(this.closeOnSave){
+ this.close(e.getName().toLowerCase() == "save");
+ }
+ }
+ }*/
+ },
+ "html"
+);
+
+//ContextMenu plugin should come before all other plugins which support
+//contextmenu, otherwise the menu for that plugin won't be shown
+dojo.require("dojo.widget.Editor2Plugin.ContextMenu");
+
+// plugins are available using dojo's require syntax:
+// dojo.widget.Editor2Plugin.FindReplace
+//dojo.widget.Editor2Plugin.TableOperation
+//dojo.widget.Editor2Plugin.ToolbarDndSupport
+//dojo.widget.Editor2Plugin.ContextMenu
+//use this plugin to have the old save/insertImage stub called when the
+//corresponding button is clicked.
+//Attention: this plugin overwrites the new builtin insertImage dialog
+//see comments in the plugin file
+//dojo.widget.Editor2Plugin.SimpleSignalCommands
\ No newline at end of file
Propchange: tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/Editor2.js
------------------------------------------------------------------------------
svn:eol-style = native
Added: tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/Editor2Plugin/AlwaysShowToolbar.js
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/Editor2Plugin/AlwaysShowToolbar.js?view=auto&rev=449122
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/Editor2Plugin/AlwaysShowToolbar.js (added)
+++ tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/Editor2Plugin/AlwaysShowToolbar.js Fri Sep 22 16:22:30 2006
@@ -0,0 +1,132 @@
+/*
+ Copyright (c) 2004-2006, The Dojo Foundation
+ All Rights Reserved.
+
+ Licensed under the Academic Free License version 2.1 or above OR the
+ modified BSD license. For more information on Dojo licensing, see:
+
+ http://dojotoolkit.org/community/licensing.shtml
+*/
+
+dojo.provide("dojo.widget.Editor2Plugin.AlwaysShowToolbar");
+
+//dojo.widget.Editor2Manager.registerPerInstancePlugin("dojo.widget.Editor2Plugin.AlwaysShowToolbar");
+
+dojo.event.topic.subscribe("dojo.widget.Editor2::onLoad", function(editor){
+ if(editor.toolbarAlwaysVisible){
+ var p = new dojo.widget.Editor2Plugin.AlwaysShowToolbar(editor);
+ }
+});
+dojo.declare("dojo.widget.Editor2Plugin.AlwaysShowToolbar", null,
+ function(editor){
+ this.editor = editor;
+ this.editor.registerLoadedPlugin(this);
+ this.setup();
+ },
+ {
+ _scrollSetUp: false,
+ _fixEnabled: false,
+ _scrollThreshold: false,
+ _handleScroll: true,
+
+ setup: function(){
+ var tdn = this.editor.toolbarWidget;
+ if(!tdn.tbBgIframe){
+ tdn.tbBgIframe = new dojo.html.BackgroundIframe(tdn.domNode);
+ tdn.tbBgIframe.onResized();
+ }
+ this.scrollInterval = setInterval(dojo.lang.hitch(this, "globalOnScrollHandler"), 100);
+
+ dojo.event.connect("before", this.editor.toolbarWidget, "destroy", this, "destroy");
+ },
+
+ globalOnScrollHandler: function(){
+ var isIE = dojo.render.html.ie;
+ if(!this._handleScroll){ return; }
+ var dh = dojo.html;
+ var tdn = this.editor.toolbarWidget.domNode;
+ var db = dojo.body();
+
+ if(!this._scrollSetUp){
+ this._scrollSetUp = true;
+ var editorWidth = dh.getMarginBox(this.editor.domNode).width;
+ this._scrollThreshold = dh.abs(tdn, true).y;
+ // dojo.debug("threshold:", this._scrollThreshold);
+ if((isIE)&&(db)&&(dh.getStyle(db, "background-image")=="none")){
+ with(db.style){
+ backgroundImage = "url(" + dojo.uri.dojoUri("src/widget/templates/images/blank.gif") + ")";
+ backgroundAttachment = "fixed";
+ }
+ }
+ }
+
+ var scrollPos = (window["pageYOffset"]) ? window["pageYOffset"] : (document["documentElement"]||document["body"]).scrollTop;
+
+ // FIXME: need to have top and bottom thresholds so toolbar doesn't keep scrolling past the bottom
+ if(scrollPos > this._scrollThreshold){
+ // dojo.debug(scrollPos);
+ if(!this._fixEnabled){
+ var tdnbox = dojo.html.getMarginBox(tdn);
+ this.editor.editorObject.style.marginTop = tdnbox.height+"px";
+
+ if(isIE){
+ // FIXME: should we just use setBehvior() here instead?
+ tdn.style.left = dojo.html.abs(tdn, dojo.html.boxSizing.MARGIN_BOX).x;
+ dojo.body().appendChild(tdn);
+
+ dojo.html.addClass(tdn, "IEFixedToolbar");
+ }else{
+ with(tdn.style){
+ position = "fixed";
+ top = "0px";
+ }
+ }
+
+ tdn.style.width = tdnbox.width + "px";
+ tdn.style.zIndex = 1000;
+ this._fixEnabled = true;
+ }
+ // if we're showing the floating toolbar, make sure that if
+ // we've scrolled past the bottom of the editor that we hide
+ // the toolbar for this instance of the editor.
+
+ // TODO: when we get multiple editor toolbar support working
+ // correctly, ensure that we check this against the scroll
+ // position of the bottom-most editor instance.
+ if(!dojo.render.html.safari){
+ // safari reports a bunch of things incorrectly here
+ var eHeight = (this.height) ? parseInt(this.editor.height) : this.editor._lastHeight;
+ if(scrollPos > (this._scrollThreshold+eHeight)){
+ tdn.style.display = "none";
+ }else{
+ tdn.style.display = "";
+ }
+ }
+ }else if(this._fixEnabled){
+ (this.editor.object || this.editor.iframe).style.marginTop = null;
+ with(tdn.style){
+ position = "";
+ top = "";
+ zIndex = "";
+ display = "";
+ }
+ if(isIE){
+ tdn.style.left = "";
+ dojo.html.removeClass(tdn, "IEFixedToolbar");
+ dojo.html.insertBefore(tdn, this.editor.object||this.editor.iframe);
+ }
+ tdn.style.width = "";
+ this._fixEnabled = false;
+ }
+ },
+
+ destroy: function(){
+ this._handleScroll = false;
+ clearInterval(this.scrollInterval);
+ this.editor.unregisterLoadedPlugin(this);
+
+ if(dojo.render.html.ie){
+ dojo.html.removeClass(this.editor.toolbarWidget.domNode, "IEFixedToolbar");
+ }
+ }
+});
\ No newline at end of file
Propchange: tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/Editor2Plugin/AlwaysShowToolbar.js
------------------------------------------------------------------------------
svn:eol-style = native
Added: tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/Editor2Plugin/ContextMenu.js
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/Editor2Plugin/ContextMenu.js?view=auto&rev=449122
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/Editor2Plugin/ContextMenu.js (added)
+++ tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/Editor2Plugin/ContextMenu.js Fri Sep 22 16:22:30 2006
@@ -0,0 +1,243 @@
+/*
+ Copyright (c) 2004-2006, The Dojo Foundation
+ All Rights Reserved.
+
+ Licensed under the Academic Free License version 2.1 or above OR the
+ modified BSD license. For more information on Dojo licensing, see:
+
+ http://dojotoolkit.org/community/licensing.shtml
+*/
+
+dojo.provide("dojo.widget.Editor2Plugin.ContextMenu");
+
+dojo.require("dojo.widget.Menu2");
+
+dojo.event.topic.subscribe("dojo.widget.Editor2::onLoad", function(editor){
+ var p = new dojo.widget.Editor2Plugin.ContextMenu(editor);
+});
+dojo.widget.Editor2Plugin.ContextMenuManager = {
+ menuGroups: ['Generic', 'Link', 'Anchor', 'Image', 'List', 'Table'],
+ _registeredGroups: {},
+ registerGroup: function(name, handler){
+ if(this._registeredGroups[name]){
+ alert("dojo.widget.Editor2Plugin.ContextMenuManager.registerGroup: menu group "+name+"is already registered. Ignored.");
+ return;
+ }
+ this._registeredGroups[name] = handler;
+ },
+ removeGroup: function(name){
+ delete this._registeredGroups[name];
+ },
+ getGroup: function(name, contextmenuplugin){
+ if(this._registeredGroups[name]){
+ var item = this._registeredGroups[name](name, contextmenuplugin);
+ if(item){
+ return item;
+ }
+ }
+ switch(name){
+ case 'Generic':
+ case 'Link':
+ case 'Image':
+ return new dojo.widget.Editor2Plugin[name+"ContextMenu"](contextmenuplugin);
+ //TODO
+ case 'Anchor':
+ case 'List':
+ }
+ }
+};
+
+dojo.declare("dojo.widget.Editor2Plugin.ContextMenu", null,
+ function(editor){
+ this.groups = [];
+ this.separators = [];
+ this.editor = editor;
+ this.editor.registerLoadedPlugin(this);
+ this.contextMenu = dojo.widget.createWidget("PopupMenu2", {});
+ dojo.body().appendChild(this.contextMenu.domNode);
+ this.contextMenu.bindDomNode(this.editor.document.body);
+
+ dojo.event.connect(this.contextMenu, "aboutToShow", this, "aboutToShow");
+ dojo.event.connect(this.editor, "destroy", this, "destroy");
+
+ this.setup();
+ },
+ {
+ setup: function(){
+ var gs = dojo.widget.Editor2Plugin.ContextMenuManager.menuGroups;
+ for(i in gs){
+ var g = dojo.widget.Editor2Plugin.ContextMenuManager.getGroup(gs[i], this);
+ if(g){
+ this.groups.push(g);
+ }
+ }
+ },
+ aboutToShow: function(){
+ var first = true;
+ for(var i in this.groups){
+ if(i>0 && this.separators.length != this.groups.length-1){
+ this.separators.push(dojo.widget.createWidget("MenuSeparator2", {}));
+ this.contextMenu.addChild(this.separators[this.separators.length-1]);
+ }
+ if(this.groups[i].refresh()){
+ if(i>0){
+ if(first){
+ this.separators[i-1].hide();
+ }else{
+ this.separators[i-1].show();
+ }
+ }
+ if(first){ first = false; }
+ }else{
+ if(i>0){
+ this.separators[i-1].hide();
+ }
+ }
+ }
+ },
+ destroy: function(){
+ this.editor.unregisterLoadedPlugin(this);
+ delete this.groups;
+ delete this.separators;
+ this.contextMenu.destroy();
+ delete this.contextMenu;
+ }
+});
+
+dojo.widget.defineWidget(
+ "dojo.widget.Editor2ContextMenuItem",
+ dojo.widget.MenuItem2, {
+ command: null,
+ postCreate: function(){
+ if(!this.command){
+ this.command = this.caption;
+ }
+
+ dojo.widget.Editor2ContextMenuItem.superclass.postCreate.apply(this, arguments);
+ },
+ setup: function(){
+ this.cmd = dojo.widget.Editor2Manager.getCommand(this.command);
+ if(!this.cmd){
+ alert("command " + this.command + " is not recognized!");
+ }
+ },
+ onClick: function(){
+ if(!this.cmd){
+ this.setup();
+ }
+ if(this.cmd){
+ this.cmd.execute();
+ }
+ },
+ refresh: function(){
+ if(!this.cmd){
+ this.setup();
+ }
+ if(this.cmd){
+ if(this.cmd.getState() == dojo.widget.Editor2Manager.commandState.Disabled){
+ this.disable();
+ return false;
+ }else{
+ this.enable();
+ return true;
+ }
+ }
+ },
+ //improve performance by skipping animation
+ hide: function(){
+ this.domNode.style.display = "none";
+ },
+ show: function(){
+ this.domNode.style.display = "";
+ }
+});
+dojo.declare("dojo.widget.Editor2Plugin.SimpleContextMenu", null,
+ function(contextmenuplugin){
+ this.contextMenu = contextmenuplugin.contextMenu;
+ this.items = [];
+
+ dojo.event.connect(contextmenuplugin, "destroy", this, "destroy");
+ },
+ {
+ refresh: function(){
+ if(!this.items.length){
+ this.createItems();
+ for(var i in this.items){
+ this.contextMenu.addChild(this.items[i]);
+ }
+ }
+
+ return this.checkVisibility();
+ },
+ destroy: function(){
+ this.contextmenu = null;
+ delete this.items;
+ delete this.contextMenu;
+ },
+ //implement this to fill in the menu items
+ createItems: function(){ },
+
+ //overload this to show/hide items
+ checkVisibility: function(){
+ var show = false;
+ for(var i in this.items){
+ show = show || this.items[i].refresh();
+ }
+ var action = show ? "show" : "hide";
+ for(var i in this.items){
+ this.items[i][action]();
+ }
+ return show;
+ }
+});
+dojo.declare("dojo.widget.Editor2Plugin.GenericContextMenu",
+ dojo.widget.Editor2Plugin.SimpleContextMenu,
+{
+ createItems: function(){
+ this.items.push(dojo.widget.createWidget("Editor2ContextMenuItem", {caption: "Cut", iconClass: "dojoE2TBIcon dojoE2TBIcon_Cut"}));
+ this.items.push(dojo.widget.createWidget("Editor2ContextMenuItem", {caption: "Copy", iconClass: "dojoE2TBIcon dojoE2TBIcon_Copy"}));
+ this.items.push(dojo.widget.createWidget("Editor2ContextMenuItem", {caption: "Paste", iconClass: "dojoE2TBIcon dojoE2TBIcon_Paste"}));
+ }
+});
+dojo.declare("dojo.widget.Editor2Plugin.LinkContextMenu",
+ dojo.widget.Editor2Plugin.SimpleContextMenu,
+{
+ createItems: function(){
+ this.items.push(dojo.widget.createWidget("Editor2ContextMenuItem", {caption: "Modify Link", command: 'createlink', iconClass: "dojoE2TBIcon dojoE2TBIcon_Link"}));
+ this.items.push(dojo.widget.createWidget("Editor2ContextMenuItem", {caption: "Remove Link", command: 'unlink', iconClass: "dojoE2TBIcon dojoE2TBIcon_UnLink"}));
+ },
+ checkVisibility: function(){
+ var show = this.items[1].refresh();
+ if(show){
+ this.items[0].refresh();
+ for(var i in this.items){
+ this.items[i].show();
+ }
+ }else{
+ for(var i in this.items){
+ this.items[i].hide();
+ }
+ }
+
+ return show;
+ }
+});
+dojo.declare("dojo.widget.Editor2Plugin.ImageContextMenu",
+ dojo.widget.Editor2Plugin.SimpleContextMenu,
+{
+ createItems: function(){
+ this.items.push(dojo.widget.createWidget("Editor2ContextMenuItem", {caption: "Edit Image", command: 'insertimage', iconClass: "dojoE2TBIcon dojoE2TBIcon_Image"}));
+ },
+ checkVisibility: function(){
+ var curInst = dojo.widget.Editor2Manager.getCurrentInstance();
+ var img = dojo.withGlobal(curInst.window, "getSelectedElement", dojo.html.selection);
+
+ if(img && img.tagName.toLowerCase() == 'img'){
+ this.items[0].show();
+ return true;
+ }else{
+ this.items[0].hide();
+ return false;
+ }
+ }
+});
Propchange: tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/Editor2Plugin/ContextMenu.js
------------------------------------------------------------------------------
svn:eol-style = native
Added: tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/Editor2Plugin/CreateLinkDialog.js
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/Editor2Plugin/CreateLinkDialog.js?view=auto&rev=449122
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/Editor2Plugin/CreateLinkDialog.js (added)
+++ tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/Editor2Plugin/CreateLinkDialog.js Fri Sep 22 16:22:30 2006
@@ -0,0 +1,74 @@
+/*
+ Copyright (c) 2004-2006, The Dojo Foundation
+ All Rights Reserved.
+
+ Licensed under the Academic Free License version 2.1 or above OR the
+ modified BSD license. For more information on Dojo licensing, see:
+
+ http://dojotoolkit.org/community/licensing.shtml
+*/
+
+dojo.provide("dojo.widget.Editor2Plugin.CreateLinkDialog");
+dojo.provide("dojo.widget.Editor2CreateLinkDialog");
+
+dojo.widget.defineWidget(
+ "dojo.widget.Editor2CreateLinkDialog",
+ dojo.widget.Editor2DialogContent,
+{
+ templatePath: dojo.uri.dojoUri("src/widget/templates/Editor2/Dialog/createlink.html"),
+
+ editableAttributes: ['href', 'target', 'class'],
+ loadContent: function(){
+ var curInst = dojo.widget.Editor2Manager.getCurrentInstance();
+
+ this.linkNode = dojo.withGlobal(curInst.window, "getAncestorElement", dojo.html.selection, ['a']);
+ var linkAttributes = {};
+ this.extraAttribText = "";
+ if(this.linkNode){
+ var attrs = this.linkNode.attributes;
+ for(var i=0; i<attrs.length; i++) {
+ if(dojo.lang.find(this.editableAttributes, attrs[i].name.toLowerCase())>-1){
+ linkAttributes[attrs[i].name] = attrs[i].value;
+ }else{
+ //IE lists all attributes, even default ones, filter them
+ if(attrs[i].specified == undefined || attrs[i].specified){
+ this.extraAttribText += attrs[i].name + '="'+attrs[i].value+'" ';
+ }
+ }
+ }
+ }else{
+ var html = dojo.withGlobal(curInst.window, "getSelectedText", dojo.html.selection);
+ if(html == null || html.length == 0){
+ alert("Please select some text to create a link.");
+ return false;//do not show the dialog
+ }
+ }
+
+ for(var i=0; i<this.editableAttributes.length; ++i){
+ name = this.editableAttributes[i];
+ this["link_"+name].value = (linkAttributes[name] == undefined) ? "" : linkAttributes[name] ;
+ }
+ return true;
+ },
+ ok: function(){
+ var curInst = dojo.widget.Editor2Manager.getCurrentInstance();
+ if(!this.linkNode){
+ var html = dojo.withGlobal(curInst.window, "getSelectedHtml", dojo.html.selection);
+ }else{
+ var html = this.linkNode.innerHTML;
+ dojo.withGlobal(curInst.window, "selectElement", dojo.html.selection, [this.linkNode]);
+ }
+
+ var attstr='';
+ for(var i=0; i<this.editableAttributes.length; ++i){
+ name = this.editableAttributes[i];
+ var value = this["link_"+name].value;
+ if(value.length > 0){
+ attstr += name + '="'+value+'" ';
+ }
+ }
+ curInst.execCommand('inserthtml', '<a '+attstr+this.extraAttribText+'>'+html+'</a>');
+
+ this.cancel();
+ }
+});
\ No newline at end of file
Propchange: tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/Editor2Plugin/CreateLinkDialog.js
------------------------------------------------------------------------------
svn:eol-style = native
Added: tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/Editor2Plugin/FindReplace.js
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/Editor2Plugin/FindReplace.js?view=auto&rev=449122
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/Editor2Plugin/FindReplace.js (added)
+++ tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/Editor2Plugin/FindReplace.js Fri Sep 22 16:22:30 2006
@@ -0,0 +1,74 @@
+/*
+ Copyright (c) 2004-2006, The Dojo Foundation
+ All Rights Reserved.
+
+ Licensed under the Academic Free License version 2.1 or above OR the
+ modified BSD license. For more information on Dojo licensing, see:
+
+ http://dojotoolkit.org/community/licensing.shtml
+*/
+
+dojo.provide("dojo.widget.Editor2Plugin.FindReplace");
+
+dojo.require("dojo.widget.Editor2");
+
+//TODO replace, better GUI
+
+dojo.declare("dojo.widget.Editor2Plugin.FindCommand", dojo.widget.Editor2DialogCommand,{
+ SearchOption: {
+ CaseSensitive: 4,
+ SearchBackwards: 64,
+ WholeWord: 2,
+ WrapSearch: 128
+ },
+ find: function(text, option){
+ var curInst = dojo.widget.Editor2Manager.getCurrentInstance();
+ if(curInst){
+ curInst.focus();
+ if(window.find){ //moz
+ curInst.window.find(text,
+ option & this.SearchOption.CaseSensitive ? true : false,
+ option & this.SearchOption.SearchBackwards ? true : false,
+ option & this.SearchOption.WrapSearch ? true : false,
+ option & this.SearchOption.WholeWord ? true : false
+ );
+ }else if(dojo.body().createTextRange){ //IE
+ var range = curInst.document.body.createTextRange();
+ var found = range.findText(text, (option&this.SearchOption.SearchBackwards)?1:-1, option );
+ if(found){
+ range.scrollIntoView() ;
+ range.select() ;
+ }else{
+ alert("Can not find "+text+" in the document");
+ }
+ }else{
+ alert("No idea how to search in this browser. Please submit patch if you know.");
+ }
+ }
+ }
+});
+
+dojo.widget.Editor2Manager.registerCommand("Find", new dojo.widget.Editor2Plugin.FindCommand('find',
+ {contentFile: "dojo.widget.Editor2Plugin.FindReplaceDialog",
+ contentClass: "Editor2FindDialog",
+ title: "Find", width: "350px", height: "150px", modal: false}));
+dojo.widget.Editor2Manager.registerCommand("Replace", new dojo.widget.Editor2DialogCommand('replace',
+ {contentFile: "dojo.widget.Editor2Plugin.FindReplaceDialog",
+ contentClass: "Editor2ReplaceDialog",
+ href: dojo.uri.dojoUri("src/widget/templates/Editor2/Dialog/replace.html"),
+ title: "Replace", width: "350px", height: "200px", modal: false}));
+
+dojo.widget.Editor2Plugin.FindReplace = function(name){
+ var name = name.toLowerCase();
+
+ var item;
+ if(name == 'replace'){
+ item = new dojo.widget.Editor2ToolbarButton('Replace');
+ }else if(name == 'find') {
+ item = new dojo.widget.Editor2ToolbarButton('Find');
+ }
+
+ return item;
+}
+
+dojo.widget.Editor2ToolbarItemManager.registerHandler(dojo.widget.Editor2Plugin.FindReplace);
\ No newline at end of file
Propchange: tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/Editor2Plugin/FindReplace.js
------------------------------------------------------------------------------
svn:eol-style = native
Added: tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/Editor2Plugin/FindReplaceDialog.js
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/Editor2Plugin/FindReplaceDialog.js?view=auto&rev=449122
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/Editor2Plugin/FindReplaceDialog.js (added)
+++ tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/Editor2Plugin/FindReplaceDialog.js Fri Sep 22 16:22:30 2006
@@ -0,0 +1,51 @@
+/*
+ Copyright (c) 2004-2006, The Dojo Foundation
+ All Rights Reserved.
+
+ Licensed under the Academic Free License version 2.1 or above OR the
+ modified BSD license. For more information on Dojo licensing, see:
+
+ http://dojotoolkit.org/community/licensing.shtml
+*/
+
+dojo.provide("dojo.widget.Editor2Plugin.FindReplaceDialog");
+dojo.provide("dojo.widget.Editor2FindDialog");
+dojo.provide("dojo.widget.Editor2ReplaceDialog");
+
+dojo.widget.defineWidget(
+ "dojo.widget.Editor2FindDialog",
+ dojo.widget.Editor2DialogContent,
+{
+ templatePath: dojo.uri.dojoUri("src/widget/templates/Editor2/Dialog/find.html"),
+
+ find: function(){
+ var findcmd = dojo.widget.Editor2Manager.getCommand('find');
+ var option = 0;
+
+ if(this["find_option_casesens"].checked){
+ option |= findcmd.SearchOption.CaseSensitive;
+ }
+ if(this["find_option_backwards"].checked){
+ option |= findcmd.SearchOption.SearchBackwards;
+ }
+
+ if(this["find_option_wholeword"].checked){
+ option |= findcmd.SearchOption.WholeWord;
+ }
+ findcmd.find(this["find_text"].value, option);
+ }
+});
+
+dojo.widget.defineWidget(
+ "dojo.widget.Editor2ReplaceDialog",
+ dojo.widget.Editor2DialogContent,
+{
+ templatePath: dojo.uri.dojoUri("src/widget/templates/Editor2/Dialog/replace.html"),
+
+ replace: function(){
+ alert("not implemented yet");
+ },
+ replaceAll: function(){
+ alert("not implemented yet");
+ }
+});
\ No newline at end of file
Propchange: tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/Editor2Plugin/FindReplaceDialog.js
------------------------------------------------------------------------------
svn:eol-style = native
Added: tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/Editor2Plugin/InsertImageDialog.js
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/Editor2Plugin/InsertImageDialog.js?view=auto&rev=449122
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/Editor2Plugin/InsertImageDialog.js (added)
+++ tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/Editor2Plugin/InsertImageDialog.js Fri Sep 22 16:22:30 2006
@@ -0,0 +1,65 @@
+/*
+ Copyright (c) 2004-2006, The Dojo Foundation
+ All Rights Reserved.
+
+ Licensed under the Academic Free License version 2.1 or above OR the
+ modified BSD license. For more information on Dojo licensing, see:
+
+ http://dojotoolkit.org/community/licensing.shtml
+*/
+
+dojo.provide("dojo.widget.Editor2Plugin.InsertImageDialog");
+dojo.provide("dojo.widget.Editor2InsertImageDialog");
+
+dojo.widget.defineWidget(
+ "dojo.widget.Editor2InsertImageDialog",
+ dojo.widget.Editor2DialogContent,
+{
+ templatePath: dojo.uri.dojoUri("src/widget/templates/Editor2/Dialog/insertimage.html"),
+
+ editableAttributes: ['src', 'alt', 'width', 'height', 'hspace', 'vspace', 'border', 'align'],
+ loadContent: function(){
+ var curInst = dojo.widget.Editor2Manager.getCurrentInstance();
+ this.imageNode = dojo.withGlobal(curInst.window, "getSelectedElement", dojo.html.selection);
+ if(!this.imageNode){
+ this.imageNode = dojo.withGlobal(curInst.window, "getAncestorElement", dojo.html.selection, ['img']);
+ }
+ var imageAttributes = {};
+ this.extraAttribText = "";
+ if(this.imageNode){
+ var attrs = this.imageNode.attributes;
+ for(var i=0; i<attrs.length; i++) {
+ if(dojo.lang.find(this.editableAttributes, attrs[i].name.toLowerCase())>-1){
+ imageAttributes[attrs[i].name] = attrs[i].value;
+ }else{
+ this.extraAttribText += attrs[i].name + '="'+attrs[i].value+'" ';
+ }
+ }
+ }
+ for(var i=0; i<this.editableAttributes.length; ++i){
+ name = this.editableAttributes[i];
+ this["image_"+name].value = (imageAttributes[name] == undefined) ? "" : imageAttributes[name] ;
+ }
+ return true;
+ },
+ ok: function(){
+ var curInst = dojo.widget.Editor2Manager.getCurrentInstance();
+ var insertcmd = dojo.widget.Editor2Manager.getCommand('inserthtml');
+ var option = 0;
+
+ var attstr='';
+ for(var i=0; i<this.editableAttributes.length; ++i){
+ name = this.editableAttributes[i];
+ var value = this["image_"+name].value;
+ if(value.length > 0){
+ attstr += name + '="'+value+'" ';
+ }
+ }
+ if(this.imageNode){
+ dojo.withGlobal(curInst.window, "selectElement", dojo.html.selection, [this.imageNode]);
+ }
+ insertcmd.execute('<img '+attstr+this.extraAttribText+'/>');
+
+ this.cancel();
+ }
+});
\ No newline at end of file
Propchange: tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/Editor2Plugin/InsertImageDialog.js
------------------------------------------------------------------------------
svn:eol-style = native
Added: tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/Editor2Plugin/InsertTableDialog.js
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/Editor2Plugin/InsertTableDialog.js?view=auto&rev=449122
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/Editor2Plugin/InsertTableDialog.js (added)
+++ tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/Editor2Plugin/InsertTableDialog.js Fri Sep 22 16:22:30 2006
@@ -0,0 +1,148 @@
+/*
+ Copyright (c) 2004-2006, The Dojo Foundation
+ All Rights Reserved.
+
+ Licensed under the Academic Free License version 2.1 or above OR the
+ modified BSD license. For more information on Dojo licensing, see:
+
+ http://dojotoolkit.org/community/licensing.shtml
+*/
+
+dojo.provide("dojo.widget.Editor2Plugin.InsertTableDialog");
+dojo.provide("dojo.widget.Editor2InsertTableDialog");
+
+dojo.widget.defineWidget(
+ "dojo.widget.Editor2InsertTableDialog",
+ dojo.widget.Editor2DialogContent,
+{
+ templatePath: dojo.uri.dojoUri("src/widget/templates/Editor2/Dialog/inserttable.html"),
+
+ editableAttributes: ['summery', 'height', 'cellspacing', 'cellpadding', 'border', 'align'],
+
+ loadContent: function(){
+ var curInst = dojo.widget.Editor2Manager.getCurrentInstance();
+ this.tableNode = dojo.withGlobal(curInst.window, "getSelectedElement", dojo.html.selection);
+ if(!this.tableNode || this.tableNode.tagName.toLowerCase() != 'table'){
+ this.tableNode = dojo.withGlobal(curInst.window, "getAncestorElement", dojo.html.selection, ['table']);
+ }
+
+ var tableAttributes = {};
+ this.extraAttribText = "";
+ if(this.tableNode){
+ this["table_rows"].value = this.tableNode.rows.length;
+ this["table_rows"].disabled = true;
+ this["table_cols"].value = this.tableNode.rows[0].cells.length;
+ this["table_cols"].disabled = true;
+
+ if (this.tableNode.caption){
+ this["table_caption"].value = this.tableNode.caption.innerHTML;
+ }else{
+ this["table_caption"].value = "";
+ }
+
+ var width = this.tableNode.style.width || this.tableNode.width;
+ if(width){
+ this["table_width"].value = parseInt(width);
+ if (width.indexOf('%') > -1){
+ this["table_widthtype"].value = "percent";
+ }else{
+ this["table_widthtype"].value = "pixels";
+ }
+ }else{
+ this["table_width"].value = "100";
+ }
+
+ var height = this.tableNode.style.height || this.tableNode.height;
+ if(height){
+ this["table_height"].value = parseInt(width);
+ }else{
+ this["table_height"].value = "";
+ }
+
+ var attrs = this.tableNode.attributes;
+ for(var i=0; i<attrs.length; i++) {
+ if(dojo.lang.find(this.editableAttributes, attrs[i].name.toLowerCase())>-1){
+ tableAttributes[attrs[i].name] = attrs[i].value;
+ }else{
+ this.extraAttribText += attrs[i].name + '="'+attrs[i].value+'" ';
+ }
+ }
+ }else{
+ this["table_rows"].value = 3;
+ this["table_rows"].disabled = false;
+ this["table_cols"].value = 2;
+ this["table_cols"].disabled = false;
+ this["table_width"].value = 100;
+ this["table_widthtype"].value = "percent";
+ this["table_height"].value = "";
+ }
+
+ for(var i=0; i<this.editableAttributes.length; ++i){
+ name = this.editableAttributes[i];
+ this["table_"+name].value = (tableAttributes[name] == undefined) ? "" : tableAttributes[name];
+ if(name == 'height' && tableAttributes[name] != undefined){
+ this["table_"+name].value = tableAttributes[name];
+ }
+ }
+ return true;
+ },
+ ok: function(){
+ var curInst = dojo.widget.Editor2Manager.getCurrentInstance();
+ var args = {};
+
+ args['rows'] = this["table_rows"].value;
+ args['cols'] = this["table_cols"].value;
+ args['caption'] = this["table_caption"].value;
+ args["tableattrs"] = "";
+ if(this["table_widthtype"].value == "percent"){
+ args["tableattrs"] += 'width="'+this["table_width"].value +'%" ';
+ }else{
+ args["tableattrs"] += 'width="'+this["table_width"].value +'px" ';
+ }
+ for(var i=0; i<this.editableAttributes.length; ++i){
+ var name = this.editableAttributes[i];
+ var value = this["table_"+name].value;
+ if(value.length > 0){
+ args["tableattrs"] += name + '="'+value+'" ';
+ }
+ }
+
+ if(!args["tableattrs"]){
+ args["tableattrs"] = "";
+ }
+
+ //show the border in IE by applying a custom class
+ if(dojo.render.html.ie && !this["table_border"].value){
+ args["tableattrs"] += 'class="dojoShowIETableBorders" ';
+ }
+
+ var html = "<table "+args["tableattrs"]+">";
+ if(args['caption']){
+ html += "<caption>"+args["caption"]+"</caption>";
+ }
+ var outertbody = "<tbody>";
+ if(this.tableNode){
+ //retain the content
+ var tbody = this.tableNode.getElementsByTagName("tbody")[0];
+ outertbody = tbody.outerHTML;
+ if(!outertbody){
+ var cnode = tbody.cloneNode(true);
+ var tmpnode = tbody.ownerDocument.createElement("div");
+ tmpnode.appendChild(cnode);
+ outertbody = tmpnode.innerHTML;
+ }
+ //TODO: save current selection and restore it later
+ dojo.withGlobal(curInst.window, "selectElement", dojo.html.selection, [this.tableNode]);
+ }else{
+ var cols = "<tr>";
+ for (var i = 0; i < +args.cols; i++) { cols += "<td></td>"; }
+ cols += "</tr>";
+ for (var i = 0; i < args.rows; i++) { outertbody += cols; }
+ outertbody += "</tbody>";
+ }
+ html += outertbody+"</table>";
+ curInst.execCommand("inserthtml", html);
+
+ this.cancel();
+ }
+});
\ No newline at end of file
Propchange: tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/Editor2Plugin/InsertTableDialog.js
------------------------------------------------------------------------------
svn:eol-style = native
Added: tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/Editor2Plugin/SimpleSignalCommands.js
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/Editor2Plugin/SimpleSignalCommands.js?view=auto&rev=449122
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/Editor2Plugin/SimpleSignalCommands.js (added)
+++ tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/Editor2Plugin/SimpleSignalCommands.js Fri Sep 22 16:22:30 2006
@@ -0,0 +1,72 @@
+/*
+ Copyright (c) 2004-2006, The Dojo Foundation
+ All Rights Reserved.
+
+ Licensed under the Academic Free License version 2.1 or above OR the
+ modified BSD license. For more information on Dojo licensing, see:
+
+ http://dojotoolkit.org/community/licensing.shtml
+*/
+
+/*
+ * This plugin adds save() and insertImage() to Editor2 widget, and add two commands for each
+ * of them. When the corresponding button is clicked in the toolbar, the added function in the
+ * Editor2 widget is called. This mimics the original Editor2 behavior. If you want to have other
+ * signals on the Editor2 widget, add them to dojo.widget.Editor2Plugin.SimpleSignalCommands.signals
+ * NOTE: Please consider writing your own Editor2 plugin rather than using this backward compatible
+ * plugin
+ * ATTENTION: This plugin overwrites the new built-in insertImage dialog. (If this is not desired, set
+ * dojo.widget.Editor2Plugin.SimpleSignalCommands.signals to not contain insertImage)
+ */
+
+//uncomment this line to add save only (do not overwrite the new built-in insertImage dialog
+//this line should present before require dojo.widget.Editor2Plugin.SimpleSignalCommands
+//dojo.widget.Editor2Plugin['SimpleSignalCommands'] = {signals: ['save']};
+
+dojo.provide("dojo.widget.Editor2Plugin.SimpleSignalCommands");
+
+dojo.require("dojo.widget.Editor2");
+
+dojo.declare("dojo.widget.Editor2Plugin.SimpleSignalCommand", dojo.widget.Editor2Command,
+ function(name){
+ if(dojo.widget.Editor2.prototype[name] == undefined){
+ dojo.widget.Editor2.prototype[name] = function(){ dojo.debug("Editor2::"+name); };
+ }
+ },
+{
+ execute: function(){
+ var curInst = dojo.widget.Editor2Manager.getCurrentInstance();
+
+ if(curInst){
+ curInst[this._name]();
+ }
+ }
+});
+
+if(dojo.widget.Editor2Plugin['SimpleSignalCommands']){
+ dojo.widget.Editor2Plugin['_SimpleSignalCommands']=dojo.widget.Editor2Plugin['SimpleSignalCommands'];
+}
+
+dojo.widget.Editor2Plugin.SimpleSignalCommands = {
+ signals: ['save', 'insertImage'],
+ Handler: function(name){
+ if(name.toLowerCase() == 'save'){
+ return new dojo.widget.Editor2ToolbarButton('Save');
+ }else if(name.toLowerCase() == 'insertimage'){
+ return new dojo.widget.Editor2ToolbarButton('InsertImage');
+ }
+ },
+ registerAllSignalCommands: function(){
+ for(var i=0;i<this.signals.length;i++){
+ dojo.widget.Editor2Manager.registerCommand(this.signals[i],
+ new dojo.widget.Editor2Plugin.SimpleSignalCommand(this.signals[i]));
+ }
+ }
+};
+
+if(dojo.widget.Editor2Plugin['_SimpleSignalCommands']){
+ dojo.lang.mixin(dojo.widget.Editor2Plugin.SimpleSignalCommands, dojo.widget.Editor2Plugin['_SimpleSignalCommands']);
+}
+
+dojo.widget.Editor2Plugin.SimpleSignalCommands.registerAllSignalCommands();
+dojo.widget.Editor2ToolbarItemManager.registerHandler(dojo.widget.Editor2Plugin.SimpleSignalCommands.Handler);
\ No newline at end of file
Propchange: tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/Editor2Plugin/SimpleSignalCommands.js
------------------------------------------------------------------------------
svn:eol-style = native
Added: tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/Editor2Plugin/TableOperation.js
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/Editor2Plugin/TableOperation.js?view=auto&rev=449122
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/Editor2Plugin/TableOperation.js (added)
+++ tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/Editor2Plugin/TableOperation.js Fri Sep 22 16:22:30 2006
@@ -0,0 +1,114 @@
+/*
+ Copyright (c) 2004-2006, The Dojo Foundation
+ All Rights Reserved.
+
+ Licensed under the Academic Free License version 2.1 or above OR the
+ modified BSD license. For more information on Dojo licensing, see:
+
+ http://dojotoolkit.org/community/licensing.shtml
+*/
+
+dojo.provide("dojo.widget.Editor2Plugin.TableOperation");
+
+dojo.require("dojo.widget.Editor2");
+
+//subscribe to dojo.widget.RichText::init, not onLoad because after onLoad
+//the stylesheets for the editing areas are already applied and the prefilters
+//are executed, so we have to insert our own trick before that point
+dojo.event.topic.subscribe("dojo.widget.RichText::init", function(editor){
+ if(dojo.render.html.moz){
+ //include the css file to show table border when border=0
+ editor.editingAreaStyleSheets.push(dojo.uri.dojoUri("src/widget/templates/Editor2/showtableborder_gecko.css"));
+ }else if(dojo.render.html.ie){
+ //add/remove a class to a table with border=0 to show the border when loading/saving
+ editor.contentDomPreFilters.push(dojo.widget.Editor2Plugin.TableOperation.showIETableBorder);
+ editor.contentDomPostFilters.push(dojo.widget.Editor2Plugin.TableOperation.removeIEFakeClass);
+ //include the css file to show table border when border=0
+ editor.editingAreaStyleSheets.push(dojo.uri.dojoUri("src/widget/templates/Editor2/showtableborder_ie.css"));
+ }
+});
+
+dojo.widget.Editor2Plugin.TableOperation = {
+ getToolbarItem: function(name){
+ var name = name.toLowerCase();
+
+ var item;
+ if(name == 'inserttable'){
+ item = new dojo.widget.Editor2ToolbarButton(name);
+ }
+
+ return item;
+ },
+ getContextMenuGroup: function(name, contextmenuplugin){
+ return new dojo.widget.Editor2Plugin.TableContextMenu(contextmenuplugin);
+ },
+ deleteTableCommand: {
+ execute: function(){
+ var curInst = dojo.widget.Editor2Manager.getCurrentInstance();
+ var table = dojo.withGlobal(curInst.window, "getAncestorElement", dojo.html.selection, ['table']);
+ if(table){
+ dojo.withGlobal(curInst.window, "selectElement", dojo.html.selection, [table]);
+ curInst.execCommand("inserthtml", " "); //Moz does not like an empty string, so a space here instead
+ }
+ },
+ getState: function(){
+ var curInst = dojo.widget.Editor2Manager.getCurrentInstance();
+ var table = dojo.withGlobal(curInst.window, "hasAncestorElement", dojo.html.selection, ['table']);
+ return table ? dojo.widget.Editor2Manager.commandState.Enabled : dojo.widget.Editor2Manager.commandState.Disabled;
+ },
+ destory: function(){}
+ },
+ showIETableBorder: function(dom){
+ var tables = dom.getElementsByTagName('table');
+ dojo.lang.forEach(tables, function(t){
+ dojo.html.addClass(t, "dojoShowIETableBorders");
+ });
+ return dom;
+ },
+ removeIEFakeClass: function(dom){
+ var tables = dom.getElementsByTagName('table');
+ dojo.lang.forEach(tables, function(t){
+ dojo.html.removeClass(t, "dojoShowIETableBorders");
+ });
+ return dom;
+ }
+}
+
+//register commands: inserttable, deletetable
+dojo.widget.Editor2Manager.registerCommand("inserttable", new dojo.widget.Editor2DialogCommand('inserttable',
+ {contentFile: "dojo.widget.Editor2Plugin.InsertTableDialog",
+ contentClass: "Editor2InsertTableDialog",
+ title: "Insert/Edit Table", width: "450px", height: "250px"}));
+
+dojo.widget.Editor2Manager.registerCommand("deletetable", dojo.widget.Editor2Plugin.TableOperation.deleteTableCommand);
+
+//register inserttable as toolbar item
+dojo.widget.Editor2ToolbarItemManager.registerHandler(dojo.widget.Editor2Plugin.TableOperation.getToolbarItem);
+
+//add context menu support if dojo.widget.Editor2Plugin.ContextMenu is included before this plugin
+if(dojo.widget.Editor2Plugin.ContextMenuManager){
+ dojo.widget.Editor2Plugin.ContextMenuManager.registerGroup('Table', dojo.widget.Editor2Plugin.TableOperation.getContextMenuGroup);
+
+ dojo.declare("dojo.widget.Editor2Plugin.TableContextMenu",
+ dojo.widget.Editor2Plugin.SimpleContextMenu,
+ {
+ createItems: function(){
+ this.items.push(dojo.widget.createWidget("Editor2ContextMenuItem", {caption: "Delete Table", command: 'deletetable'}));
+ this.items.push(dojo.widget.createWidget("Editor2ContextMenuItem", {caption: "Table Property", command: 'inserttable', iconClass: "TB_Button_Icon TB_Button_Table"}));
+ },
+ checkVisibility: function(){
+ var curInst = dojo.widget.Editor2Manager.getCurrentInstance();
+ var table = dojo.withGlobal(curInst.window, "hasAncestorElement", dojo.html.selection, ['table']);
+
+ if(dojo.withGlobal(curInst.window, "hasAncestorElement", dojo.html.selection, ['table'])){
+ this.items[0].show();
+ this.items[1].show();
+ return true;
+ }else{
+ this.items[0].hide();
+ this.items[1].hide();
+ return false;
+ }
+ }
+ });
+}
\ No newline at end of file
Propchange: tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/Editor2Plugin/TableOperation.js
------------------------------------------------------------------------------
svn:eol-style = native
Added: tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/Editor2Plugin/ToolbarDndSupport.js
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/Editor2Plugin/ToolbarDndSupport.js?view=auto&rev=449122
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/Editor2Plugin/ToolbarDndSupport.js (added)
+++ tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/Editor2Plugin/ToolbarDndSupport.js Fri Sep 22 16:22:30 2006
@@ -0,0 +1,68 @@
+/*
+ Copyright (c) 2004-2006, The Dojo Foundation
+ All Rights Reserved.
+
+ Licensed under the Academic Free License version 2.1 or above OR the
+ modified BSD license. For more information on Dojo licensing, see:
+
+ http://dojotoolkit.org/community/licensing.shtml
+*/
+
+/*TODO:
+ * Add a command to toggle DnD support for a toolbar
+ * Save/restore order of toolbar/item
+ */
+dojo.provide("dojo.widget.Editor2Plugin.ToolbarDndSupport");
+dojo.require("dojo.dnd.*");
+
+dojo.event.topic.subscribe("dojo.widget.Editor2::preLoadingToolbar", function(editor){
+ dojo.dnd.dragManager.nestedTargets = true;
+ var p = new dojo.widget.Editor2Plugin.ToolbarDndSupport(editor);
+});
+
+dojo.declare("dojo.widget.Editor2Plugin.ToolbarDndSupport", null,{
+ lookForClass: "dojoEditorToolbarDnd TB_ToolbarSet TB_Toolbar",
+ initializer: function(editor){
+ this.editor = editor;
+ dojo.event.connect(this.editor, "toolbarLoaded", this, "setup");
+ this.editor.registerLoadedPlugin(this);
+ },
+
+ setup: function(){
+ dojo.event.disconnect(this.editor, "toolbarLoaded", this, "setup");
+ var tbw = this.editor.toolbarWidget;
+ dojo.event.connect("before", tbw, "destroy", this, "destroy");
+
+ var nodes = dojo.html.getElementsByClass(this.lookForClass, tbw.domNode, null, dojo.html.classMatchType.ContainsAny);
+ if(!nodes){
+ dojo.debug("dojo.widget.Editor2Plugin.ToolbarDndSupport: No dom node with class in "+this.lookForClass);
+ return;
+ }
+ for(var i=0; i<nodes.length; i++){
+ var node = nodes[i];
+ var droptarget = node.getAttribute("dojoETDropTarget");
+ if(droptarget){
+ (new dojo.dnd.HtmlDropTarget(node, [droptarget+tbw.widgetId])).vertical = true;
+ }
+ var dragsource = node.getAttribute("dojoETDragSource");
+ if(dragsource){
+ new dojo.dnd.HtmlDragSource(node, dragsource+tbw.widgetId);
+ }
+ }
+ },
+
+ destroy: function(){
+ this.editor.unregisterLoadedPlugin(this);
+ }
+});
+
+//let's have a command to enable DnD
+/*dojo.declare("dojo.widget.Editor2Plugin.ToolbarDndCommand", dojo.widget.Editor2Command,{
+ execute: function(text, option){
+ var curInst = dojo.widget.Editor2Manager.getCurrentInstance();
+ if(curInst){
+ }
+ },
+ getState: function(){
+ }
+});*/
\ No newline at end of file
Propchange: tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/Editor2Plugin/ToolbarDndSupport.js
------------------------------------------------------------------------------
svn:eol-style = native
Added: tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/Editor2Plugin/__package__.js
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/Editor2Plugin/__package__.js?view=auto&rev=449122
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/Editor2Plugin/__package__.js (added)
+++ tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/Editor2Plugin/__package__.js Fri Sep 22 16:22:30 2006
@@ -0,0 +1,15 @@
+/*
+ Copyright (c) 2004-2006, The Dojo Foundation
+ All Rights Reserved.
+
+ Licensed under the Academic Free License version 2.1 or above OR the
+ modified BSD license. For more information on Dojo licensing, see:
+
+ http://dojotoolkit.org/community/licensing.shtml
+*/
+
+dojo.kwCompoundRequire({
+ common: [ "dojo.widget.Editor2",
+ "dojo.widget.Editor2Toolbar"]
+});
+dojo.provide("dojo.widget.Editor2Plugin.*");
Propchange: tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/widget/Editor2Plugin/__package__.js
------------------------------------------------------------------------------
svn:eol-style = native