/** * @param options.autohideTabBar * Whether to autohide the tab bar when only 1 tab showing */ morpheus.TabManager = function(options) { this.options = $.extend({}, { autohideTabBar : false }, options); var _this = this; this.activeTabObject = null; this.activeTabId = null; this.idToTabObject = new morpheus.Map(); this.$nav = $('
'); this.$nav.on('click', 'li > a', function(e) { var tabId = $(this).attr('href'); e.preventDefault(); if (_this.activeTabId !== tabId) { $(this).tab('show'); } }); function rename($a) { var builder = new morpheus.FormBuilder(); builder.append({ name : 'name', type : 'text', value : $.trim($a.contents().first().text()) }); morpheus.FormBuilder.showOkCancel({ title : 'Rename Tab', content : builder.$form, okCallback : function() { var name = $.trim(builder.getValue('name')); if (name !== '') { _this.activeTabObject.setName(name); $a.contents().first().replaceWith(name + ' '); } } }); // edit tab name } // rename this.$nav.on('dblclick', 'li > a', function(e) { e.preventDefault(); if ($(this).data('morpheus-rename')) { rename($(this)); } }); this.$nav.on('contextmenu.morpheus', 'li > a', function(e) { e.preventDefault(); e.stopPropagation(); e.stopImmediatePropagation(); var $a = $(this); if ($a.data('morpheus-rename')) { morpheus.Popup.showPopup([ { name : 'Rename' } ], { x : e.pageX, y : e.pageY }, e.target, function(event, item) { rename($a); }); } return false; }); this.$nav.on('click', 'button', function(e) { // close a tab // remove the link and tab content e.preventDefault(); var target = $(this).attr('data-target'); _this.remove(target); }); this.$tabContent = $(''); this.$nav.on('shown.bs.tab', 'a[data-toggle="tab"]', function(e) { if (_this.adding) { return; } // triggered when clicking tab var previous = _this.activeTabObject; _this.activeTabId = $(e.target).attr('href'); _this.activeTabObject = _this.idToTabObject.get(_this.activeTabId); _this.trigger('change', { tab : _this.activeTabObject, previous : previous }); }); }; morpheus.TabManager.prototype = { setTabText : function(id, text) { this.$nav.find('a').filter('[href=' + id + ']').contents().first() .replaceWith(text + ' '); this.idToTabObject.get(id).setName(name); }, /** * @param id * Tab id * @param task * @param task.worker * Optional worker that the task is run in. * @param task.name * @param task.tabId * Tab id for task */ addTask : function(task) { var $a = this.$nav.find('a[href=' + task.tabId + ']'); if ($a.length === 0) { throw new Error(task.tabId + ' not found.'); } var $i = $a.find('i'); var tasks = $i.data('tasks'); if (!tasks) { tasks = []; } task.id = _.uniqueId('task'); tasks.push(task); $i.data('tasks', tasks); $a .removeClass('animated flash') .addClass('animated flash') .one( 'webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend', function() { $(this).removeClass('animated flash'); }); $i.addClass('fa fa-spinner fa-spin'); }, removeTask : function(task) { var $a = this.$nav.find('a[href=' + task.tabId + ']'); var $i = $a.find('i'); var tasks = $i.data('tasks'); if (!tasks) { tasks = []; } var index = -1; for (var i = 0; i < tasks.length; i++) { if (tasks[i].id === task.id) { index = i; break; } } if (index === -1) { throw new Error(task.id + ' not found in ' + tasks.map(function(t) { return t.id; })); } tasks.splice(index, 1); $i.data('tasks', tasks); if (tasks.length === 0) { $i.removeClass('fa fa-spinner fa-spin'); } }, getWidth : function() { return this.$nav.outerWidth() || $(window).width(); }, getActiveTab : function() { return this.activeTabObject; }, getActiveTabId : function() { return this.activeTabId; }, /** * * @param options * @param options.$el * the tab element * @param options.title * the tab title * @param options.closeable * Whether tab can be closed * @param options.rename * Whether tab can be renamed * @param options.focus * Whether new tab should be focused-note the change event is not * triggered when true * @param options.enabled * Whether new tab is enabled * */ add : function(options) { this.adding = true; var id = _.uniqueId('tab'); this.idToTabObject.set('#' + id, options.object); var li = []; li.push('