(function(tinymce) {\r
var DOM = tinymce.DOM, Event = tinymce.dom.Event, extend = tinymce.extend, each = tinymce.each, Cookie = tinymce.util.Cookie, lastExtID, explode = tinymce.explode;\r
\r
+ // Generates a preview for a format\r
+ function getPreviewCss(ed, fmt) {\r
+ var previewElm, dom = ed.dom, previewCss = '', parentFontSize, previewStylesName;\r
+\r
+ previewStyles = ed.settings.preview_styles;\r
+\r
+ // No preview forced\r
+ if (previewStyles === false)\r
+ return '';\r
+\r
+ // Default preview\r
+ if (!previewStyles)\r
+ previewStyles = 'font-family font-size font-weight text-decoration text-transform color background-color';\r
+\r
+ // Removes any variables since these can't be previewed\r
+ function removeVars(val) {\r
+ return val.replace(/%(\w+)/g, '');\r
+ };\r
+\r
+ // Create block/inline element to use for preview\r
+ name = fmt.block || fmt.inline || 'span';\r
+ previewElm = dom.create(name);\r
+\r
+ // Add format styles to preview element\r
+ each(fmt.styles, function(value, name) {\r
+ value = removeVars(value);\r
+\r
+ if (value)\r
+ dom.setStyle(previewElm, name, value);\r
+ });\r
+\r
+ // Add attributes to preview element\r
+ each(fmt.attributes, function(value, name) {\r
+ value = removeVars(value);\r
+\r
+ if (value)\r
+ dom.setAttrib(previewElm, name, value);\r
+ });\r
+\r
+ // Add classes to preview element\r
+ each(fmt.classes, function(value) {\r
+ value = removeVars(value);\r
+\r
+ if (!dom.hasClass(previewElm, value))\r
+ dom.addClass(previewElm, value);\r
+ });\r
+\r
+ // Add the previewElm outside the visual area\r
+ dom.setStyles(previewElm, {position: 'absolute', left: -0xFFFF});\r
+ ed.getBody().appendChild(previewElm);\r
+\r
+ // Get parent container font size so we can compute px values out of em/% for older IE:s\r
+ parentFontSize = dom.getStyle(ed.getBody(), 'fontSize', true);\r
+ parentFontSize = /px$/.test(parentFontSize) ? parseInt(parentFontSize, 10) : 0;\r
+\r
+ each(previewStyles.split(' '), function(name) {\r
+ var value = dom.getStyle(previewElm, name, true);\r
+\r
+ // Old IE won't calculate the font size so we need to do that manually\r
+ if (name == 'font-size') {\r
+ if (/em|%$/.test(value)) {\r
+ if (parentFontSize === 0) {\r
+ return;\r
+ }\r
+\r
+ // Convert font size from em/% to px\r
+ value = parseFloat(value, 10) / (/%$/.test(value) ? 100 : 1);\r
+ value = (value * parentFontSize) + 'px';\r
+ }\r
+ }\r
+\r
+ previewCss += name + ':' + value + ';';\r
+ });\r
+\r
+ dom.remove(previewElm);\r
+\r
+ return previewCss;\r
+ };\r
+\r
// Tell it to load theme specific language pack(s)\r
tinymce.ThemeManager.requireLangPack('advanced');\r
\r
t.url = url;\r
t.onResolveName = new tinymce.util.Dispatcher(this);\r
\r
+ ed.forcedHighContrastMode = ed.settings.detect_highcontrast && t._isHighContrast();\r
+ ed.settings.skin = ed.forcedHighContrastMode ? 'highcontrast' : ed.settings.skin;\r
+\r
// Default settings\r
t.settings = s = extend({\r
theme_advanced_path : true,\r
theme_advanced_resize_horizontal : 1,\r
theme_advanced_resizing_use_cookie : 1,\r
theme_advanced_font_sizes : "1,2,3,4,5,6,7",\r
+ theme_advanced_font_selector : "span",\r
+ theme_advanced_show_current_color: 0,\r
readonly : ed.settings.readonly\r
}, ed.settings);\r
\r
if (s.theme_advanced_statusbar_location == 'none')\r
s.theme_advanced_statusbar_location = 0;\r
\r
+ if (ed.settings.content_css !== false)\r
+ ed.contentCSS.push(ed.baseURI.toAbsolute(url + "/skins/" + ed.settings.skin + "/content.css"));\r
+\r
// Init editor\r
ed.onInit.add(function() {\r
- if (!ed.settings.readonly)\r
+ if (!ed.settings.readonly) {\r
ed.onNodeChange.add(t._nodeChanged, t);\r
-\r
- if (ed.settings.content_css !== false)\r
- ed.dom.loadCSS(ed.baseURI.toAbsolute("themes/advanced/skins/" + ed.settings.skin + "/content.css"));\r
+ ed.onKeyUp.add(t._updateUndoStatus, t);\r
+ ed.onMouseUp.add(t._updateUndoStatus, t);\r
+ ed.dom.bind(ed.dom.getRoot(), 'dragend', function() {\r
+ t._updateUndoStatus(ed);\r
+ });\r
+ }\r
});\r
\r
ed.onSetProgressState.add(function(ed, b, ti) {\r
DOM.loadCSS(url + "/skins/" + ed.settings.skin + "/ui_" + s.skin_variant + ".css");\r
},\r
\r
+ _isHighContrast : function() {\r
+ var actualColor, div = DOM.add(DOM.getRoot(), 'div', {'style': 'background-color: rgb(171,239,86);'});\r
+\r
+ actualColor = (DOM.getStyle(div, 'background-color', true) + '').toLowerCase().replace(/ /g, '');\r
+ DOM.remove(div);\r
+\r
+ return actualColor != 'rgb(171,239,86)' && actualColor != '#abef56';\r
+ },\r
+\r
createControl : function(n, cf) {\r
var cd, c;\r
\r
\r
if (ctrl.getLength() == 0) {\r
each(ed.dom.getClasses(), function(o, idx) {\r
- var name = 'style_' + idx;\r
+ var name = 'style_' + idx, fmt;\r
\r
- ed.formatter.register(name, {\r
+ fmt = {\r
inline : 'span',\r
attributes : {'class' : o['class']},\r
selector : '*'\r
- });\r
+ };\r
+\r
+ ed.formatter.register(name, fmt);\r
\r
- ctrl.add(o['class'], name);\r
+ ctrl.add(o['class'], name, {\r
+ style: function() {\r
+ return getPreviewCss(ed, fmt);\r
+ }\r
+ });\r
});\r
}\r
},\r
ctrl = ctrlMan.createListBox('styleselect', {\r
title : 'advanced.style_select',\r
onselect : function(name) {\r
- var matches, formatNames = [];\r
+ var matches, formatNames = [], removedFormat;\r
\r
each(ctrl.items, function(item) {\r
formatNames.push(item.value);\r
ed.focus();\r
ed.undoManager.add();\r
\r
- // Toggle off the current format\r
+ // Toggle off the current format(s)\r
matches = ed.formatter.matchAll(formatNames);\r
- if (matches[0] == name)\r
- ed.formatter.remove(name);\r
- else\r
+ tinymce.each(matches, function(match) {\r
+ if (!name || match == name) {\r
+ if (match)\r
+ ed.formatter.remove(match);\r
+\r
+ removedFormat = true;\r
+ }\r
+ });\r
+\r
+ if (!removedFormat)\r
ed.formatter.apply(name);\r
\r
ed.undoManager.add();\r
});\r
\r
// Handle specified format\r
- ed.onInit.add(function() {\r
+ ed.onPreInit.add(function() {\r
var counter = 0, formats = ed.getParam('style_formats');\r
\r
if (formats) {\r
if (keys > 1) {\r
name = fmt.name = fmt.name || 'style_' + (counter++);\r
ed.formatter.register(name, fmt);\r
- ctrl.add(fmt.title, name);\r
+ ctrl.add(fmt.title, name, {\r
+ style: function() {\r
+ return getPreviewCss(ed, fmt);\r
+ }\r
+ });\r
} else\r
ctrl.add(fmt.title);\r
});\r
} else {\r
each(ed.getParam('theme_advanced_styles', '', 'hash'), function(val, key) {\r
- var name;\r
+ var name, fmt;\r
\r
if (val) {\r
name = 'style_' + (counter++);\r
-\r
- ed.formatter.register(name, {\r
+ fmt = {\r
inline : 'span',\r
classes : val,\r
selector : '*'\r
- });\r
+ };\r
\r
- ctrl.add(t.editor.translate(key), name);\r
+ ed.formatter.register(name, fmt);\r
+ ctrl.add(t.editor.translate(key), name, {\r
+ style: function() {\r
+ return getPreviewCss(ed, fmt);\r
+ }\r
+ });\r
}\r
});\r
}\r
c = ed.controlManager.createListBox('fontselect', {\r
title : 'advanced.fontdefault',\r
onselect : function(v) {\r
+ var cur = c.items[c.selectedIndex];\r
+\r
+ if (!v && cur) {\r
+ ed.execCommand('FontName', false, cur.value);\r
+ return;\r
+ }\r
+\r
ed.execCommand('FontName', false, v);\r
\r
// Fake selection, execCommand will fire a nodeChange and update the selection\r
return v == sv;\r
});\r
\r
+ if (cur && cur.value == v) {\r
+ c.select(null);\r
+ }\r
+\r
return false; // No auto select\r
}\r
});\r
var t = this, ed = t.editor, c, i = 0, cl = [];\r
\r
c = ed.controlManager.createListBox('fontsizeselect', {title : 'advanced.font_size', onselect : function(v) {\r
+ var cur = c.items[c.selectedIndex];\r
+\r
+ if (!v && cur) {\r
+ cur = cur.value;\r
+\r
+ if (cur['class']) {\r
+ ed.formatter.toggle('fontsize_class', {value : cur['class']});\r
+ ed.undoManager.add();\r
+ ed.nodeChanged();\r
+ } else {\r
+ ed.execCommand('FontSize', false, cur.fontSize);\r
+ }\r
+\r
+ return;\r
+ }\r
+\r
if (v['class']) {\r
ed.focus();\r
ed.undoManager.add();\r
return v == sv;\r
});\r
\r
+ if (cur && (cur.value.fontSize == v.fontSize || cur.value['class'] && cur.value['class'] == v['class'])) {\r
+ c.select(null);\r
+ }\r
+\r
return false; // No auto select\r
}});\r
\r
samp : 'advanced.samp'\r
}, t = this;\r
\r
- c = t.editor.controlManager.createListBox('formatselect', {title : 'advanced.block', cmd : 'FormatBlock'});\r
+ c = t.editor.controlManager.createListBox('formatselect', {title : 'advanced.block', onselect : function(v) {\r
+ t.editor.execCommand('FormatBlock', false, v);\r
+ return false;\r
+ }});\r
+\r
if (c) {\r
each(t.editor.getParam('theme_advanced_blockformats', t.settings.theme_advanced_blockformats, 'hash'), function(v, k) {\r
- c.add(t.editor.translate(k != v ? k : fmts[v]), v, {'class' : 'mce_formatPreview mce_' + v});\r
+ c.add(t.editor.translate(k != v ? k : fmts[v]), v, {'class' : 'mce_formatPreview mce_' + v, style: function() {\r
+ return getPreviewCss(t.editor, {block: v});\r
+ }});\r
});\r
}\r
\r
renderUI : function(o) {\r
var n, ic, tb, t = this, ed = t.editor, s = t.settings, sc, p, nl;\r
\r
- n = p = DOM.create('span', {id : ed.id + '_parent', 'class' : 'mceEditor ' + ed.settings.skin + 'Skin' + (s.skin_variant ? ' ' + ed.settings.skin + 'Skin' + t._ufirst(s.skin_variant) : '')});\r
+ if (ed.settings) {\r
+ ed.settings.aria_label = s.aria_label + ed.getLang('advanced.help_shortcut');\r
+ }\r
+\r
+ // TODO: ACC Should have an aria-describedby attribute which is user-configurable to describe what this field is actually for.\r
+ // Maybe actually inherit it from the original textara?\r
+ n = p = DOM.create('span', {role : 'application', 'aria-labelledby' : ed.id + '_voice', id : ed.id + '_parent', 'class' : 'mceEditor ' + ed.settings.skin + 'Skin' + (s.skin_variant ? ' ' + ed.settings.skin + 'Skin' + t._ufirst(s.skin_variant) : '')});\r
+ DOM.add(n, 'span', {'class': 'mceVoiceLabel', 'style': 'display:none;', id: ed.id + '_voice'}, s.aria_label);\r
\r
if (!DOM.boxModel)\r
n = DOM.add(n, 'div', {'class' : 'mceOldBoxModel'});\r
\r
- n = sc = DOM.add(n, 'table', {id : ed.id + '_tbl', 'class' : 'mceLayout', cellSpacing : 0, cellPadding : 0});\r
+ n = sc = DOM.add(n, 'table', {role : "presentation", id : ed.id + '_tbl', 'class' : 'mceLayout', cellSpacing : 0, cellPadding : 0});\r
n = tb = DOM.add(n, 'tbody');\r
\r
switch ((s.theme_advanced_layout_manager || '').toLowerCase()) {\r
n = o.targetNode;\r
\r
// Add classes to first and last TRs\r
- nl = DOM.stdMode ? sc.getElementsByTagName('tr') : sc.rows; // Quick fix for IE 8\r
+ nl = sc.rows;\r
DOM.addClass(nl[0], 'mceFirst');\r
DOM.addClass(nl[nl.length - 1], 'mceLast');\r
\r
\r
if (e.nodeName == 'A') {\r
t._sel(e.className.replace(/^.*mcePath_([0-9]+).*$/, '$1'));\r
-\r
- return Event.cancel(e);\r
+ return false;\r
}\r
});\r
/*\r
t.deltaHeight = o.deltaHeight;\r
o.targetNode = null;\r
\r
+ ed.onKeyDown.add(function(ed, evt) {\r
+ var DOM_VK_F10 = 121, DOM_VK_F11 = 122;\r
+\r
+ if (evt.altKey) {\r
+ if (evt.keyCode === DOM_VK_F10) {\r
+ // Make sure focus is given to toolbar in Safari.\r
+ // We can't do this in IE as it prevents giving focus to toolbar when editor is in a frame\r
+ if (tinymce.isWebKit) {\r
+ window.focus();\r
+ }\r
+ t.toolbarGroup.focus();\r
+ return Event.cancel(evt);\r
+ } else if (evt.keyCode === DOM_VK_F11) {\r
+ DOM.get(ed.id + '_path_row').focus();\r
+ return Event.cancel(evt);\r
+ }\r
+ }\r
+ });\r
+\r
+ // alt+0 is the UK recommended shortcut for accessing the list of access controls.\r
+ ed.addShortcut('alt+0', '', 'mceShortcuts', t);\r
+\r
return {\r
iframeContainer : ic,\r
editorContainer : ed.id + '_parent',\r
},\r
\r
resizeBy : function(dw, dh) {\r
- var e = DOM.get(this.editor.id + '_tbl');\r
+ var e = DOM.get(this.editor.id + '_ifr');\r
\r
this.resizeTo(e.clientWidth + dw, e.clientHeight + dh);\r
},\r
\r
- resizeTo : function(w, h) {\r
+ resizeTo : function(w, h, store) {\r
var ed = this.editor, s = this.settings, e = DOM.get(ed.id + '_tbl'), ifr = DOM.get(ed.id + '_ifr');\r
\r
// Boundery fix box\r
DOM.setStyle(ifr, 'width', w);\r
\r
// Make sure that the size is never smaller than the over all ui\r
- if (w < e.clientWidth)\r
+ if (w < e.clientWidth) {\r
+ w = e.clientWidth;\r
DOM.setStyle(ifr, 'width', e.clientWidth);\r
+ }\r
+ }\r
+\r
+ // Store away the size\r
+ if (store && s.theme_advanced_resizing_use_cookie) {\r
+ Cookie.setHash("TinyMCE_" + ed.id + "_size", {\r
+ cw : w,\r
+ ch : h\r
+ });\r
}\r
},\r
\r
each(explode(s.theme_advanced_containers || ''), function(c, i) {\r
var v = s['theme_advanced_container_' + c] || '';\r
\r
- switch (v.toLowerCase()) {\r
+ switch (c.toLowerCase()) {\r
case 'mceeditor':\r
n = DOM.add(tb, 'tr');\r
n = ic = DOM.add(n, 'td', {'class' : 'mceIframeContainer'});\r
},\r
\r
_addToolbars : function(c, o) {\r
- var t = this, i, tb, ed = t.editor, s = t.settings, v, cf = ed.controlManager, di, n, h = [], a;\r
+ var t = this, i, tb, ed = t.editor, s = t.settings, v, cf = ed.controlManager, di, n, h = [], a, toolbarGroup;\r
\r
- a = s.theme_advanced_toolbar_align.toLowerCase();\r
- a = 'mce' + t._ufirst(a);\r
+ toolbarGroup = cf.createToolbarGroup('toolbargroup', {\r
+ 'name': ed.getLang('advanced.toolbar'),\r
+ 'tab_focus_toolbar':ed.getParam('theme_advanced_tab_focus_toolbar')\r
+ });\r
\r
- n = DOM.add(DOM.add(c, 'tr'), 'td', {'class' : 'mceToolbar ' + a});\r
+ t.toolbarGroup = toolbarGroup;\r
\r
- if (!ed.getParam('accessibility_focus'))\r
- h.push(DOM.createHTML('a', {href : '#', onfocus : 'tinyMCE.get(\'' + ed.id + '\').focus();'}, '<!-- IE -->'));\r
+ a = s.theme_advanced_toolbar_align.toLowerCase();\r
+ a = 'mce' + t._ufirst(a);\r
\r
- h.push(DOM.createHTML('a', {href : '#', accesskey : 'q', title : ed.getLang("advanced.toolbar_focus")}, '<!-- IE -->'));\r
+ n = DOM.add(DOM.add(c, 'tr', {role: 'presentation'}), 'td', {'class' : 'mceToolbar ' + a, "role":"presentation"});\r
\r
// Create toolbar and add the controls\r
for (i=1; (v = s['theme_advanced_buttons' + i]); i++) {\r
v = s['theme_advanced_buttons' + i + '_add_before'] + ',' + v;\r
\r
t._addControls(v, tb);\r
-\r
- //n.appendChild(n = tb.render());\r
- h.push(tb.renderHTML());\r
+ toolbarGroup.add(tb);\r
\r
o.deltaHeight -= s.theme_advanced_row_height;\r
}\r
-\r
+ h.push(toolbarGroup.renderHTML());\r
h.push(DOM.createHTML('a', {href : '#', accesskey : 'z', title : ed.getLang("advanced.toolbar_focus"), onfocus : 'tinyMCE.getInstanceById(\'' + ed.id + '\').focus();'}, '<!-- IE -->'));\r
DOM.setHTML(n, h.join(''));\r
},\r
var n, t = this, ed = t.editor, s = t.settings, r, mf, me, td;\r
\r
n = DOM.add(tb, 'tr');\r
- n = td = DOM.add(n, 'td', {'class' : 'mceStatusbar'});\r
- n = DOM.add(n, 'div', {id : ed.id + '_path_row'}, s.theme_advanced_path ? ed.translate('advanced.path') + ': ' : ' ');\r
- DOM.add(n, 'a', {href : '#', accesskey : 'x'});\r
+ n = td = DOM.add(n, 'td', {'class' : 'mceStatusbar'}); \r
+ n = DOM.add(n, 'div', {id : ed.id + '_path_row', 'role': 'group', 'aria-labelledby': ed.id + '_path_voice'});\r
+ if (s.theme_advanced_path) {\r
+ DOM.add(n, 'span', {id: ed.id + '_path_voice'}, ed.translate('advanced.path'));\r
+ DOM.add(n, 'span', {}, ': ');\r
+ } else {\r
+ DOM.add(n, 'span', {}, ' ');\r
+ }\r
+ \r
\r
if (s.theme_advanced_resizing) {\r
- DOM.add(td, 'a', {id : ed.id + '_resize', href : 'javascript:;', onclick : "return false;", 'class' : 'mceResize'});\r
+ DOM.add(td, 'a', {id : ed.id + '_resize', href : 'javascript:;', onclick : "return false;", 'class' : 'mceResize', tabIndex:"-1"});\r
\r
if (s.theme_advanced_resizing_use_cookie) {\r
ed.onPostRender.add(function() {\r
}\r
\r
ed.onPostRender.add(function() {\r
+ Event.add(ed.id + '_resize', 'click', function(e) {\r
+ e.preventDefault();\r
+ });\r
+\r
Event.add(ed.id + '_resize', 'mousedown', function(e) {\r
var mouseMoveHandler1, mouseMoveHandler2,\r
mouseUpHandler1, mouseUpHandler2,\r
startX, startY, startWidth, startHeight, width, height, ifrElm;\r
\r
function resizeOnMove(e) {\r
+ e.preventDefault();\r
+\r
width = startWidth + (e.screenX - startX);\r
height = startHeight + (e.screenY - startY);\r
\r
Event.remove(DOM.doc, 'mouseup', mouseUpHandler1);\r
Event.remove(ed.getDoc(), 'mouseup', mouseUpHandler2);\r
\r
- // Store away the size\r
- if (s.theme_advanced_resizing_use_cookie) {\r
- Cookie.setHash("TinyMCE_" + ed.id + "_size", {\r
- cw : width,\r
- ch : height\r
- });\r
- }\r
+ width = startWidth + (e.screenX - startX);\r
+ height = startHeight + (e.screenY - startY);\r
+ t.resizeTo(width, height, true);\r
};\r
\r
e.preventDefault();\r
n = tb = null;\r
},\r
\r
+ _updateUndoStatus : function(ed) {\r
+ var cm = ed.controlManager, um = ed.undoManager;\r
+\r
+ cm.setDisabled('undo', !um.hasUndo() && !um.typing);\r
+ cm.setDisabled('redo', !um.hasRedo());\r
+ },\r
+\r
_nodeChanged : function(ed, cm, n, co, ob) {\r
- var t = this, p, de = 0, v, c, s = t.settings, cl, fz, fn, formatNames, matches;\r
+ var t = this, p, de = 0, v, c, s = t.settings, cl, fz, fn, fc, bc, formatNames, matches;\r
\r
tinymce.each(t.stateControls, function(c) {\r
cm.setActive(c, ed.queryCommandState(t.controls[c][1]));\r
};\r
\r
cm.setActive('visualaid', ed.hasVisual);\r
- cm.setDisabled('undo', !ed.undoManager.hasUndo() && !ed.typing);\r
- cm.setDisabled('redo', !ed.undoManager.hasRedo());\r
+ t._updateUndoStatus(ed);\r
cm.setDisabled('outdent', !ed.queryCommandState('Outdent'));\r
\r
p = getParent('A');\r
}\r
\r
if (c = cm.get('anchor')) {\r
- c.setActive(!!p && p.name);\r
+ c.setActive(!co && !!p && p.name);\r
}\r
\r
p = getParent('IMG');\r
if (c = cm.get('image'))\r
- c.setActive(!!p && n.className.indexOf('mceItem') == -1);\r
+ c.setActive(!co && !!p && n.className.indexOf('mceItem') == -1);\r
\r
if (c = cm.get('styleselect')) {\r
t._importClasses();\r
\r
matches = ed.formatter.matchAll(formatNames);\r
c.select(matches[0]);\r
+ tinymce.each(matches, function(match, index) {\r
+ if (index > 0) {\r
+ c.mark(match);\r
+ }\r
+ });\r
}\r
\r
if (c = cm.get('formatselect')) {\r
if (n.nodeName === 'SPAN') {\r
if (!cl && n.className)\r
cl = n.className;\r
+ }\r
\r
+ if (ed.dom.is(n, s.theme_advanced_font_selector)) {\r
if (!fz && n.style.fontSize)\r
fz = n.style.fontSize;\r
\r
if (!fn && n.style.fontFamily)\r
fn = n.style.fontFamily.replace(/[\"\']+/g, '').replace(/^([^,]+).*/, '$1').toLowerCase();\r
+ \r
+ if (!fc && n.style.color)\r
+ fc = n.style.color;\r
+\r
+ if (!bc && n.style.backgroundColor)\r
+ bc = n.style.backgroundColor;\r
}\r
\r
return false;\r
return true;\r
});\r
}\r
+ \r
+ if (s.theme_advanced_show_current_color) {\r
+ function updateColor(controlId, color) {\r
+ if (c = cm.get(controlId)) {\r
+ if (!color)\r
+ color = c.settings.default_color;\r
+ if (color !== c.value) {\r
+ c.displayColor(color);\r
+ }\r
+ }\r
+ }\r
+ updateColor('forecolor', fc);\r
+ updateColor('backcolor', bc);\r
+ }\r
+\r
+ if (s.theme_advanced_show_current_color) {\r
+ function updateColor(controlId, color) {\r
+ if (c = cm.get(controlId)) {\r
+ if (!color)\r
+ color = c.settings.default_color;\r
+ if (color !== c.value) {\r
+ c.displayColor(color);\r
+ }\r
+ }\r
+ };\r
+\r
+ updateColor('forecolor', fc);\r
+ updateColor('backcolor', bc);\r
+ }\r
\r
if (s.theme_advanced_path && s.theme_advanced_statusbar_location) {\r
p = DOM.get(ed.id + '_path') || DOM.add(ed.id + '_path_row', 'span', {id : ed.id + '_path'});\r
+\r
+ if (t.statusKeyboardNavigation) {\r
+ t.statusKeyboardNavigation.destroy();\r
+ t.statusKeyboardNavigation = null;\r
+ }\r
+\r
DOM.setHTML(p, '');\r
\r
getParent(function(n) {\r
var na = n.nodeName.toLowerCase(), u, pi, ti = '';\r
\r
- /*if (n.getAttribute('_mce_bogus'))\r
- return;\r
-*/\r
- // Ignore non element and hidden elements\r
- if (n.nodeType != 1 || n.nodeName === 'BR' || (DOM.hasClass(n, 'mceItemHidden') || DOM.hasClass(n, 'mceItemRemoved')))\r
+ // Ignore non element and bogus/hidden elements\r
+ if (n.nodeType != 1 || na === 'br' || n.getAttribute('data-mce-bogus') || DOM.hasClass(n, 'mceItemHidden') || DOM.hasClass(n, 'mceItemRemoved'))\r
return;\r
\r
- // Fake name\r
- if (v = DOM.getAttrib(n, 'mce_name'))\r
- na = v;\r
-\r
// Handle prefix\r
if (tinymce.isIE && n.scopeName !== 'HTML')\r
na = n.scopeName + ':' + na;\r
na = na.name;\r
\r
//u = "javascript:tinymce.EditorManager.get('" + ed.id + "').theme._sel('" + (de++) + "');";\r
- pi = DOM.create('a', {'href' : "javascript:;", onmousedown : "return false;", title : ti, 'class' : 'mcePath_' + (de++)}, na);\r
+ pi = DOM.create('a', {'href' : "javascript:;", role: 'button', onmousedown : "return false;", title : ti, 'class' : 'mcePath_' + (de++)}, na);\r
\r
if (p.hasChildNodes()) {\r
- p.insertBefore(DOM.doc.createTextNode(' \u00bb '), p.firstChild);\r
+ p.insertBefore(DOM.create('span', {'aria-hidden': 'true'}, '\u00a0\u00bb '), p.firstChild);\r
p.insertBefore(pi, p.firstChild);\r
} else\r
p.appendChild(pi);\r
}, ed.getBody());\r
+\r
+ if (DOM.select('a', p).length > 0) {\r
+ t.statusKeyboardNavigation = new tinymce.ui.KeyboardNavigation({\r
+ root: ed.id + "_path_row",\r
+ items: DOM.select('a', p),\r
+ excludeFromTabOrder: true,\r
+ onCancel: function() {\r
+ ed.focus();\r
+ }\r
+ }, DOM);\r
+ }\r
}\r
},\r
\r
var ed = this.editor;\r
\r
ed.windowManager.open({\r
- url : tinymce.baseURL + '/themes/advanced/anchor.htm',\r
+ url : this.url + '/anchor.htm',\r
width : 320 + parseInt(ed.getLang('advanced.anchor_delta_width', 0)),\r
height : 90 + parseInt(ed.getLang('advanced.anchor_delta_height', 0)),\r
inline : true\r
var ed = this.editor;\r
\r
ed.windowManager.open({\r
- url : tinymce.baseURL + '/themes/advanced/charmap.htm',\r
+ url : this.url + '/charmap.htm',\r
width : 550 + parseInt(ed.getLang('advanced.charmap_delta_width', 0)),\r
- height : 250 + parseInt(ed.getLang('advanced.charmap_delta_height', 0)),\r
+ height : 265 + parseInt(ed.getLang('advanced.charmap_delta_height', 0)),\r
inline : true\r
}, {\r
theme_url : this.url\r
var ed = this.editor;\r
\r
ed.windowManager.open({\r
- url : tinymce.baseURL + '/themes/advanced/about.htm',\r
+ url : this.url + '/about.htm',\r
width : 480,\r
height : 380,\r
inline : true\r
});\r
},\r
\r
+ _mceShortcuts : function() {\r
+ var ed = this.editor;\r
+ ed.windowManager.open({\r
+ url: this.url + '/shortcuts.htm',\r
+ width: 480,\r
+ height: 380,\r
+ inline: true\r
+ }, {\r
+ theme_url: this.url\r
+ });\r
+ },\r
+\r
_mceColorPicker : function(u, v) {\r
var ed = this.editor;\r
\r
v = v || {};\r
\r
ed.windowManager.open({\r
- url : tinymce.baseURL + '/themes/advanced/color_picker.htm',\r
+ url : this.url + '/color_picker.htm',\r
width : 375 + parseInt(ed.getLang('advanced.colorpicker_delta_width', 0)),\r
height : 250 + parseInt(ed.getLang('advanced.colorpicker_delta_height', 0)),\r
close_previous : false,\r
var ed = this.editor;\r
\r
ed.windowManager.open({\r
- url : tinymce.baseURL + '/themes/advanced/source_editor.htm',\r
+ url : this.url + '/source_editor.htm',\r
width : parseInt(ed.getParam("theme_advanced_source_editor_width", 720)),\r
height : parseInt(ed.getParam("theme_advanced_source_editor_height", 580)),\r
inline : true,\r
var ed = this.editor;\r
\r
// Internal image object like a flash placeholder\r
- if (ed.dom.getAttrib(ed.selection.getNode(), 'class').indexOf('mceItem') != -1)\r
+ if (ed.dom.getAttrib(ed.selection.getNode(), 'class', '').indexOf('mceItem') != -1)\r
return;\r
\r
ed.windowManager.open({\r
- url : tinymce.baseURL + '/themes/advanced/image.htm',\r
+ url : this.url + '/image.htm',\r
width : 355 + parseInt(ed.getLang('advanced.image_delta_width', 0)),\r
height : 275 + parseInt(ed.getLang('advanced.image_delta_height', 0)),\r
inline : true\r
var ed = this.editor;\r
\r
ed.windowManager.open({\r
- url : tinymce.baseURL + '/themes/advanced/link.htm',\r
+ url : this.url + '/link.htm',\r
width : 310 + parseInt(ed.getLang('advanced.link_delta_width', 0)),\r
height : 200 + parseInt(ed.getLang('advanced.link_delta_height', 0)),\r
inline : true\r
});\r
\r
tinymce.ThemeManager.add('advanced', tinymce.themes.AdvancedTheme);\r
-}(tinymce));
\ No newline at end of file
+}(tinymce));\r