3 * @class Roo.bootstrap.form.HtmlEditorToolbar.Context
4 * @parent Roo.bootstrap.form.HtmlEditor
5 * @extends Roo.bootstrap.nav.Simplebar
11 new Roo.bootstrap.form.HtmlEditor({
16 disable : { fonts: 1 , format: 1, ..., ... , ...],
29 Roo.bootstrap.form.HtmlEditorToolbar.Context = function(config)
32 Roo.apply(this, config);
35 Roo.bootstrap.form.HtmlEditorToolbar.Context.superclass.constructor.call(this, config);
37 this.editor = config.editor;
38 this.editorcore = config.editor.editorcore;
40 this.buttons = new Roo.util.MixedCollection(false, function(o) { return o.cmd; });
44 Roo.bootstrap.form.HtmlEditorToolbar.Context.types = {
59 opts : [ [""],[ "left"],[ "right"],[ "center"],[ "top"]],
149 name : 'selectoptions',
155 // should we really allow this??
156 // should this just be
173 Roo.extend(Roo.bootstrap.form.HtmlEditorToolbar.Context, Roo.bootstrap.nav.Simplebar, {
179 button_groups : false, // subtoolbars... - buttson?
180 active_group : false,
182 selectedNode : false,
184 onRender : function(ct, position)
186 // Roo.log("Call onRender: " + this.xtype);
188 this.constructor.superclass.onRender.call(this, ct, position);
194 // disable everything...
195 var ty = this.constructor.types;
196 this.button_groups = {};
197 // block toolbars are built in updateToolbar when needed.
199 this.button_groups[i] = this.buildToolbarGroup(ty[i],i);
201 this.buildToolbarDelete();
204 this.editor.on('editorevent', this.updateToolbar, this);
207 onFirstFocus: function() {
212 buildToolbarGroup: function(tlist, key )
214 var editor = this.editor;
215 var editorcore = this.editorcore;
220 for (var i = 0; i < tlist.length; i++) {
222 // newer versions will use xtype cfg to create menus.
223 if (typeof(tlist[i].xtype) != 'undefined') {
224 tb[typeof(tlist[i].name)== 'undefined' ? 'add' : 'addField'](Roo.factory(tlist[i]));
233 cls : 'roo-htmleditor-context-label-' + key + '-' + item.name,
238 // add a text entry!?
242 xns : Roo.bootstrap.form,
243 cls : 'roo-htmleditor-context-entry-' + key + '-' + item.name,
244 name: '-roo-edit-' + item.name,
245 attrname : item.name,
250 'change' : function(f, nv, ov) {
251 tb.selectedNode.setAttribute(f.attrname, nv);
252 editorcore.syncValue();
260 ret.forEach(function(e) {
267 buildToolbarDelete : function()
273 cls : 'roo-htmleditor-fill'
276 this.deleteBtn = this.addxtypeChild({
282 click : this.onDelete.createDelegate(this)
285 this.deleteBtn.hide();
290 onDelete : function()
292 var range = editorcore.createRange();
293 var selection = this.editorcore.getSelection();
294 range.setStart(stn,0);
297 var sn = this.selectedNode;
298 if (sn.hasAttribute('data-block')) {
299 var block = Roo.htmleditor.Block.factory(tb.selectedNode)
302 selection.removeAllRanges();
303 selection.addRange(range);
304 this.updateToolbar(null, null, null);
309 return; // should not really happen..
311 if (sn && sn.tagName == 'BODY') {
314 var stn = sn.childNodes[0] || sn.nextSibling || sn.previousSibling || sn.parentNode;
316 // remove and keep parents.
317 a = new Roo.htmleditor.FilterKeepChildren({tag : false});
320 selection.removeAllRanges();
321 selection.addRange(range);
322 this.updateToolbar(null, null, null);
327 * Protected method that will not generally be called directly. It triggers
328 * a toolbar update by reading the markup state of the current selection in the editor.
330 * Note you can force an update by calling on('editorevent', scope, false)
332 updateToolbar: function(editor ,ev, sel)
334 var ty = this.constructor.types;
338 ev.stopEvent(); // se if we can stop this looping with mutiple events.
342 // capture mouse up - this is handy for selecting images..
343 // perhaps should go somewhere else...
344 if(!this.editorcore.activated){
345 this.editor.onFirstFocus();
348 //Roo.log(ev ? ev.target : 'NOTARGET');
351 // http://developer.yahoo.com/yui/docs/simple-editor.js.html
352 // selectNode - might want to handle IE?
355 (ev.type == 'mouseup' || ev.type == 'click' ) &&
356 ev.target && ev.target.tagName != 'BODY' ) { // && ev.target.tagName == 'IMG') {
357 // they have click on an image...
358 // let's see if we can change the selection...
361 // this triggers looping?
362 //this.editorcore.selectNode(sel);
366 // this forces an id..
367 Array.from(this.editorcore.doc.body.querySelectorAll('.roo-ed-selection')).forEach(function(e) {
368 e.classList.remove('roo-ed-selection');
371 var ans = this.editorcore.getAllAncestors();
375 sel = ans.length ? (ans[0] ? ans[0] : ans[1]) : this.editorcore.doc.body;
376 sel = sel ? sel : this.editorcore.doc.body;
377 sel = sel.tagName.length ? sel : this.editorcore.doc.body;
381 var tn = sel.tagName.toUpperCase();
382 var lastSel = this.selectedNode;
383 this.selectedNode = sel;
386 // ok see if we are editing a block?
389 // you are not actually selecting the block.
390 if (sel && sel.hasAttribute('data-block')) {
392 } else if (sel && sel.closest('[data-block]')) {
394 db = sel.closest('[data-block]');
400 if (db && this.editorcore.enableBlocks) {
401 block = Roo.htmleditor.Block.factory(db);
406 db.classList.length > 0 ? db.className + ' ' : ''
407 ) + 'roo-ed-selection';
409 // since we removed it earlier... its not there..
410 tn = 'BLOCK.' + db.getAttribute('data-block');
412 //this.editorcore.selectNode(db);
413 if (typeof(this.button_groups[tn]) == 'undefined') {
414 this.button_groups[tn] = this.buildBlockToolbar( block );
416 this.selectedNode = db;
417 left_label = block.friendly_name;
418 ans = this.editorcore.getAllAncestors();
425 if ( this.active_group !== false && this.active_group.name == tn && lastSel == this.selectedNode && ev !== false) {
426 return; // no change?
429 if (this.active_group) {
430 this.hideActiveGroup();
432 this.showActiveGroup(tn);
435 hideActiveGroup : function()
438 if (this.active_group === false) {
441 this.active_group.forEach(function(e) {
444 this.active_group = false;
446 showActiveGroup : function(tn)
448 if (typeof(this.button_groups[tn]) == 'undefined') {
452 this.active_group = this.button_groups[tn];
454 this.active_group.forEach(function(e) {
459 if (this.selectedNode.hasAttribute('data-block') ) {
460 var block = Roo.htmleditor.Block.factory(this.selectedNode);
461 this.active_group.forEach(function(e) {
462 e.setValue(this.selectedNode.getAttribute(block[e.name]));
468 // based on attributes...
469 this.active_group.forEach(function(e) {
470 e.setValue(this.selectedNode.getAttribute(e.attrname));