/* * Copyright 2012 OSBI Ltd * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /** * Class which handles individual tabs */ var Tab = Backbone.View.extend({ tagName: 'li', events: { 'click a': 'select', 'mousedown a': 'remove', 'click .close_tab': 'remove' }, template: function() { // Create tab return _.template("<%= caption %>" + "Close tab") ({ id: this.id, caption: this.caption }); }, /** * Assign a unique ID and assign a Backbone view * to handle the tab's contents * @param args */ initialize: function(args) { _.extend(this, Backbone.Events); _.extend(this, args); this.content.tab = this; this.caption = this.content.caption(); this.id = _.uniqueId('tab_'); this.close = args.close; }, /** * Render the tab and its contents * @returns tab */ render: function() { var self = this; // Render the content this.content.render(); // Generate the element $(this.el).html(this.template()); if(this.close === false){ $(this.el).find('.close_tab').hide(); $(this.el).css('padding-right','10px'); } var menuitems = { "new": {name: "New", i18n: true }, "duplicate": { name: "Duplicate", i18n: true}, "closeothers": {name: "Close Others", i18n: true }, "closethis": {name: "Close This", i18n: true } }; $.each(menuitems, function(key, item){ recursive_menu_translate(item, Saiku.i18n.po_file); }); $.contextMenu('destroy', '.saikutab'); $.contextMenu({ selector: '.saikutab', callback: function(key, options) { var selected = options.$trigger.attr('href').replace('#',''); var tab = Saiku.tabs.find(selected); if (key == "closethis") { tab.remove(); self.select(); return; } else if (key == "closeothers") { tab.select(); Saiku.tabs.close_others(tab); } else if (key == "duplicate") { Saiku.tabs.duplicate(tab); } else if (key == "new") { Saiku.tabs.new_tab(); } //self.workspace.chart.exportChart(key); }, items: menuitems }); return this; }, set_caption: function(caption) { $(this.el).find('.saikutab').html(caption); }, /** * Destroy any data associated with this tab and ensure proper * garbage collection to avoid memory leaks */ destroy: function() { // Delete data if (this.content && this.content.query) { this.content.query.destroy(); } }, /** * Select a tab * @param el */ select: function() { var self = this; // Deselect all tabs this.parent.select(this); // Select the selected tab $(this.el).addClass('selected'); // Trigger select event this.trigger('tab:select'); return false; }, /** * Remove a tab * @returns {Boolean} */ remove: function(event) { if (!event || event.which === 2 || $(event.target).hasClass('close_tab')) { // Remote the tab object from the container this.parent.remove(this); try { // Remove the tab element $(this.el).remove(); // Remove the tab this.destroy(); } catch (e) { Log.log(JSON.stringify({ Message: "Tab could not be removed", Tab: JSON.stringify(this) })); } } return false; }, rendered: function() { return $.contains( document, this.el ); } }); /** * Class which controls tab pager */ var TabPager = Backbone.View.extend({ className: 'pager_contents', events: { 'click a': 'select' }, initialize: function(args) { this.tabset = args.tabset; $(this.el).hide().appendTo('body'); // Hide when focus is lost $(window).click(function(event) { if (! $(event.target).hasClass('pager_contents')) { $('.pager_contents').hide(); } }); }, render: function() { var pager = ""; for (var i = 0, len = this.tabset._tabs.length; i < len; i++) { var caption = this.tabset._tabs[i].caption; pager += "" + caption + "
"; } $(this.el).html(pager); $(this.el).find(".i18n").i18n(Saiku.i18n.po_file); }, select: function(event) { var index; if ($(event.target).attr('href') != null) { index = $(event.target).attr('href').replace('#', ''); } else { index = $(event.target).parent().attr('href').replace('#', ''); } this.tabset._tabs[index].select(); $(this.el).hide(); event.preventDefault(); return false; } });