diff static/js/tiny_mce/utils/mctabs.js @ 442:6c182ceb7147

Fixing #217; upgrade TinyMCE to 3.4.2 and enable the paste plugin.
author Brian Neal <bgneal@gmail.com>
date Thu, 26 May 2011 00:43:49 +0000
parents 88b2b9cb8c1f
children
line wrap: on
line diff
--- a/static/js/tiny_mce/utils/mctabs.js	Wed May 25 02:39:08 2011 +0000
+++ b/static/js/tiny_mce/utils/mctabs.js	Thu May 26 00:43:49 2011 +0000
@@ -10,6 +10,7 @@
 
 function MCTabs() {
 	this.settings = [];
+	this.onChange = tinyMCEPopup.editor.windowManager.createInstance('tinymce.util.Dispatcher');
 };
 
 MCTabs.prototype.init = function(settings) {
@@ -28,26 +29,62 @@
 	return value;
 };
 
-MCTabs.prototype.displayTab = function(tab_id, panel_id) {
-	var panelElm, panelContainerElm, tabElm, tabContainerElm, selectionClass, nodes, i;
+MCTabs.prototype.showTab =function(tab){
+	tab.className = 'current';
+	tab.setAttribute("aria-selected", true);
+	tab.setAttribute("aria-expanded", true);
+	tab.tabIndex = 0;
+};
+
+MCTabs.prototype.hideTab =function(tab){
+	var t=this;
+
+	tab.className = '';
+	tab.setAttribute("aria-selected", false);
+	tab.setAttribute("aria-expanded", false);
+	tab.tabIndex = -1;
+};
+
+MCTabs.prototype.showPanel = function(panel) {
+	panel.className = 'current'; 
+	panel.setAttribute("aria-hidden", false);
+};
+
+MCTabs.prototype.hidePanel = function(panel) {
+	panel.className = 'panel';
+	panel.setAttribute("aria-hidden", true);
+}; 
+
+MCTabs.prototype.getPanelForTab = function(tabElm) {
+	return tinyMCEPopup.dom.getAttrib(tabElm, "aria-controls");
+};
+
+MCTabs.prototype.displayTab = function(tab_id, panel_id, avoid_focus) {
+	var panelElm, panelContainerElm, tabElm, tabContainerElm, selectionClass, nodes, i, t = this;
+
+	tabElm = document.getElementById(tab_id);
+
+	if (panel_id === undefined) {
+		panel_id = t.getPanelForTab(tabElm);
+	}
 
 	panelElm= document.getElementById(panel_id);
 	panelContainerElm = panelElm ? panelElm.parentNode : null;
-	tabElm = document.getElementById(tab_id);
 	tabContainerElm = tabElm ? tabElm.parentNode : null;
-	selectionClass = this.getParam('selection_class', 'current');
+	selectionClass = t.getParam('selection_class', 'current');
 
 	if (tabElm && tabContainerElm) {
 		nodes = tabContainerElm.childNodes;
 
 		// Hide all other tabs
 		for (i = 0; i < nodes.length; i++) {
-			if (nodes[i].nodeName == "LI")
-				nodes[i].className = '';
+			if (nodes[i].nodeName == "LI") {
+				t.hideTab(nodes[i]);
+			}
 		}
 
 		// Show selected tab
-		tabElm.className = 'current';
+		t.showTab(tabElm);
 	}
 
 	if (panelElm && panelContainerElm) {
@@ -56,11 +93,15 @@
 		// Hide all other panels
 		for (i = 0; i < nodes.length; i++) {
 			if (nodes[i].nodeName == "DIV")
-				nodes[i].className = 'panel';
+				t.hidePanel(nodes[i]);
+		}
+
+		if (!avoid_focus) { 
+			tabElm.focus();
 		}
 
 		// Show selected panel
-		panelElm.className = 'current';
+		t.showPanel(panelElm);
 	}
 };
 
@@ -73,5 +114,49 @@
 	return "";
 };
 
-// Global instance
+
+//Global instance
 var mcTabs = new MCTabs();
+
+tinyMCEPopup.onInit.add(function() {
+	var tinymce = tinyMCEPopup.getWin().tinymce, dom = tinyMCEPopup.dom, each = tinymce.each;
+
+	each(dom.select('div.tabs'), function(tabContainerElm) {
+		var keyNav;
+
+		dom.setAttrib(tabContainerElm, "role", "tablist"); 
+
+		var items = tinyMCEPopup.dom.select('li', tabContainerElm);
+		var action = function(id) {
+			mcTabs.displayTab(id, mcTabs.getPanelForTab(id));
+			mcTabs.onChange.dispatch(id);
+		};
+
+		each(items, function(item) {
+			dom.setAttrib(item, 'role', 'tab');
+			dom.bind(item, 'click', function(evt) {
+				action(item.id);
+			});
+		});
+
+		dom.bind(dom.getRoot(), 'keydown', function(evt) {
+			if (evt.keyCode === 9 && evt.ctrlKey && !evt.altKey) { // Tab
+				keyNav.moveFocus(evt.shiftKey ? -1 : 1);
+				tinymce.dom.Event.cancel(evt);
+			}
+		});
+
+		each(dom.select('a', tabContainerElm), function(a) {
+			dom.setAttrib(a, 'tabindex', '-1');
+		});
+
+		keyNav = tinyMCEPopup.editor.windowManager.createInstance('tinymce.ui.KeyboardNavigation', {
+			root: tabContainerElm,
+			items: items,
+			onAction: action,
+			actOnFocus: true,
+			enableLeftRight: true,
+			enableUpDown: true
+		}, tinyMCEPopup.dom);
+	});
+});
\ No newline at end of file