123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385 |
- /*!
- * B-JUI v1.2 (http://b-jui.com)
- * Git@OSC (http://git.oschina.net/xknaan/B-JUI)
- * Copyright 2014 K'naan (xknaan@163.com).
- * Licensed under Apache (http://www.apache.org/licenses/LICENSE-2.0)
- */
- /* ========================================================================
- * B-JUI: bjui-taskbar.js v1.2
- * reference: bjui-dialog.js
- * @author K'naan (xknaan@163.com)
- * -- Modified from dwz.taskBar.js (author:Roger Wu)
- * http://git.oschina.net/xknaan/B-JUI/blob/master/BJUI/js/bjui-taskbar.js
- * ========================================================================
- * Copyright 2014 K'naan.
- * Licensed under Apache (http://www.apache.org/licenses/LICENSE-2.0)
- * ======================================================================== */
- +function ($) {
- 'use strict';
-
- // TASKBAR GLOBAL ELEMENTS
- // ======================
-
- var $resizable
- var $taskBar, $taskBox, $taskList, $prevBtn, $nextBtn, taskDisabled, taskSelected, taskMargin
-
- $(function() {
- var INIT_TASKBAR = function() {
- $resizable = $('#bjui-resizable')
- $taskBar = $(FRAG.taskbar)
- $taskBox = $taskBar.find('.taskbarContent')
- $taskList = $taskBox.find('> ul')
- $prevBtn = $taskBar.find('.taskbarLeft')
- $nextBtn = $taskBar.find('.taskbarRight')
- taskDisabled = 'disabled'
- taskSelected = 'selected'
- taskMargin = 'taskbarMargin'
-
- $('body').append('<!-- dialog task bar -->').append($taskBar)
-
- //events
- $prevBtn.click(function(e) { $(this).taskbar('scrollLeft') })
- $nextBtn.click(function(e) { $(this).taskbar('scrollRight') })
- }
- INIT_TASKBAR()
- })
-
- // TASKBAR CLASS DEFINITION
- // ======================
-
- var Taskbar = function(element, options) {
- this.$element = $(element)
- this.$task = null
- this.options = options
- this.tools = this.TOOLS()
- }
-
- Taskbar.DEFAULTS = {
- id: undefined,
- title: undefined
- }
-
- Taskbar.prototype.init = function() {
- var that = this
- var $task = $taskList.find('#'+ this.options.id)
-
- this.show()
- if (!$task.length) {
- var taskFrag = '<li id="#taskid#"><div class="taskbutton"><span><i class="fa fa-th-large"></i></span> <span class="title">#title#</span></div><div class="close"><i class="fa fa-times-circle"></i></div></li>';
-
- $task = $(taskFrag.replace('#taskid#', this.options.id).replace('#title#', this.options.title))
- $task.appendTo($taskList)
- } else {
- $task.find('> div > span.title').html(this.options.title)
- }
- this.contextmenu($task)
- this.switchTask($task)
- this.tools.scrollTask($task)
-
- //events
- $task.click(function(e) {
- if ($(e.target).closest('div').hasClass('close') || $(e.target).hasClass('close')) {
- $task.dialog('close', that.options.id)
- } else {
- var $dialog = $('body').data(that.options.id)
-
- if ($task.hasClass('selected')) {
- $dialog.find('.dialogHeader a.minimize').trigger('click')
- } else {
- if ($dialog.is(':hidden')) {
- that.restoreDialog($dialog)
- } else {
- $dialog.trigger('click')
- $task.addClass(taskSelected)
- }
- }
- that.scrollCurrent($task)
- }
-
- return false
- })
- }
-
- Taskbar.prototype.TOOLS = function() {
- var that = this
- var tools = {
- scrollCurrent: function() {
- var iW = this.tasksW(this.getTasks())
-
- if (iW > this.getTaskBarW()) {
- var $tools = this
- var lTask = $taskList.find('> li:last-child')
- var left = this.getTaskBarW() - lTask.position().left - lTask.outerWidth(true)
-
- $taskList.animate({left: left}, 200, function() {
- $tools.ctrlScrollBtn()
- })
- } else {
- this.ctrlScrollBtn()
- }
- },
- getTaskBarW: function() {
- return $taskBox.width()- ($prevBtn.is(':hidden') ? $prevBtn.width() + 2 : 0) - ($nextBtn.is(':hidden') ? $nextBtn.width() + 2 : 0)
- },
- scrollTask: function($task) {
- var $tools = this
-
- if ($task.position().left + this.getLeft() + $task.outerWidth() > this.getBarWidth()) {
- var left = this.getTaskBarW() - $task.position().left - $task.outerWidth(true) - 2
-
- $taskList.animate({left:left}, 200, function() {
- $tools.ctrlScrollBtn()
- })
- } else if ($task.position().left + this.getLeft() < 0) {
- var left = this.getLeft() - ($task.position().left + this.getLeft())
-
- $taskList.animate({left:left}, 200, function() {
- $tools.ctrlScrollBtn()
- })
- }
- },
- ctrlScrollBtn: function() {
- var iW = this.tasksW(this.getTasks())
-
- if (this.getTaskBarW() > iW) {
- $taskBox.removeClass(taskMargin)
- $nextBtn.hide()
- $prevBtn.hide()
- if (this.getTasks().eq(0).length) this.scrollTask(this.getTasks().eq(0))
- } else {
- $taskBox.addClass(taskMargin)
- $nextBtn.show().removeClass(taskDisabled)
- $prevBtn.show().removeClass(taskDisabled)
- if (this.getLeft() >= 0) $prevBtn.addClass(taskDisabled)
- if (this.getLeft() <= this.getTaskBarW() - iW) $nextBtn.addClass(taskDisabled)
- }
- },
- getLeft: function(){
- return $taskList.position().left
- },
- visibleStart: function() {
- var iLeft = this.getLeft()
- var jTasks = this.getTasks()
-
- for (var i = 0; i < jTasks.size(); i++) {
- if (jTasks.eq(i).position().left + jTasks.eq(i).outerWidth(true) + iLeft >= 0) return jTasks.eq(i)
- }
-
- return jTasks.eq(0)
- },
- visibleEnd: function() {
- var iLeft = this.getLeft()
- var jTasks = this.getTasks()
-
- for (var i = 0; i < jTasks.size(); i++) {
- if (jTasks.eq(i).position().left + jTasks.eq(i).outerWidth(true) + iLeft > this.getBarWidth()) return jTasks.eq(i)
- }
-
- return jTasks.eq(jTasks.size() - 1)
- },
- getTasks: function() {
- return $taskList.find('> li')
- },
- tasksW: function(jTasks) {
- var iW = 0
-
- jTasks.each(function() {
- iW += $(this).outerWidth(true)
- })
-
- return iW
- },
- getBarWidth: function() {
- return $taskBar.innerWidth()
- },
- getCurrent: function() {
- return $taskList.find('li.'+ taskSelected)
- }
- }
-
- return tools
- }
-
- Taskbar.prototype.contextmenu = function($obj) {
- var that = this
-
- $obj.contextmenu({
- id: 'dialogCM',
- bindings: {
- reload: function(t) {
- t.dialog('refresh', that.options.id)
- },
- closeCurrent: function(t, m) {
- var $obj = t.isTag('li') ? t : that.tools.getCurrent()
-
- $obj.find('.close').trigger('click')
- },
- closeOther: function(t, m){
- var $tasks = $taskList.find('> li').not(t)
-
- $tasks.each(function(i) {
- $(this).find('.close').trigger('click')
- })
- },
- closeAll: function(t, m) {
- var $tasks = that.tools.getTasks()
-
- $tasks.each(function(i) {
- $(this).find('.close').trigger('click')
- })
- }
- },
- ctrSub: function(t, m) {
- var mCur = m.find('[rel="closeCurrent"]')
- var mOther = m.find('[rel="closeOther"]')
-
- if (!that.tools.getCurrent().length) {
- mCur.addClass(taskDisabled)
- mOther.addClass(taskDisabled)
- } else {
- if (that.tools.getTasks().size() == 1)
- mOther.addClass(taskDisabled)
- }
- }
- })
- }
-
- Taskbar.prototype.closeDialog = function(task) {
- var $task = (typeof task == 'string') ? this.getTask(task) : task
-
- if (!$task || !$task.length) return
-
- $task.remove()
- if (this.tools.getTasks().size() == 0) {
- this.hide()
- }
- this.tools.scrollCurrent()
- this.$element.removeData('bjui.taskbar')
- }
-
- Taskbar.prototype.minimize = function(dialog) {
- var that = this
- var $dialog = (typeof dialog == 'string') ? $('body').data('dialog') : dialog
- var $task = this.getTask($dialog.data('options').id)
-
- $resizable.css({
- top: $dialog.css('top'),
- left: $dialog.css('left'),
- height: $dialog.css('height'),
- width: $dialog.css('width')
- }).show().animate({top:$(window).height() - 60, left:$task.position().left, width:$task.outerWidth(), height:$task.outerHeight()}, 250, function() {
- $(this).hide()
- that.inactive($task)
- })
- }
-
- /**
- * @param {Object} id or dialog
- */
- Taskbar.prototype.restoreDialog = function($dialog) {
- var $task = this.getTask($dialog.data('options').id)
-
- $resizable.css({top:$(window).height() - 60, left:$task.position().left, height:$task.outerHeight(), width:$task.outerWidth()})
- .show()
- .animate({top:$dialog.css('top'), left:$dialog.css('left'), width:$dialog.css('width'), height:$dialog.css('height')}, 250, function() {
- $(this).hide()
- $dialog.show()
- })
-
- this.switchTask($task)
- }
-
- /**
- * @param {Object} id
- */
- Taskbar.prototype.inactive = function(task) {
- var $task = (typeof task == 'string') ? this.getTask(task) : task
-
- $task.removeClass(taskSelected)
- }
-
- Taskbar.prototype.scrollLeft = function() {
- var $task = this.tools.visibleStart()
-
- this.tools.scrollTask($task)
- }
-
- Taskbar.prototype.scrollRight = function() {
- var $task = this.tools.visibleEnd()
-
- this.tools.scrollTask($task)
- }
-
- Taskbar.prototype.scrollCurrent = function($task) {
- this.tools.scrollTask($task)
- }
-
- /**
- * @param {Object} id or $task
- */
- Taskbar.prototype.switchTask = function(task) {
- this.tools.getCurrent().removeClass(taskSelected)
- var $task = (typeof task == 'string') ? this.getTask(task) : task
-
- $task.addClass(taskSelected)
- }
-
- Taskbar.prototype.getTask = function(id) {
- return $taskList.find('#'+ id)
- }
-
- Taskbar.prototype.changeTitle = function(id, title) {
- var $task = this.getTask(id)
-
- if ($task && title) $task.find('.title').html(title)
- }
-
- Taskbar.prototype.show = function() {
- if ($taskBar.is(':hidden')) $taskBar.show().animate({bottom:0}, 500)
- }
-
- Taskbar.prototype.hide = function() {
- if ($taskBar.is(':visible')) $taskBar.animate({bottom:-50}, 500, function() { $taskBar.hide() })
- }
-
- // TASKBAR PLUGIN DEFINITION
- // =======================
-
- function Plugin(option) {
- var args = arguments
- var property = option
-
- return this.each(function () {
- var $this = $(this)
- var options = $.extend({}, Taskbar.DEFAULTS, $this.data(), typeof option == 'object' && option)
- var data = $this.data('bjui.taskbar')
-
- if (!data) $this.data('bjui.taskbar', (data = new Taskbar(this, options)))
- else if (data.options.id != options.id) $this.data('bjui.taskbar', (data = new Taskbar(this, options)))
-
- if (typeof property == 'string' && $.isFunction(data[property])) {
- [].shift.apply(args)
- if (!args) data[property]()
- else data[property].apply(data, args)
- } else {
- data.init()
- }
- })
- }
- var old = $.fn.taskbar
- $.fn.taskbar = Plugin
- $.fn.taskbar.Constructor = Taskbar
-
- // TASKBAR NO CONFLICT
- // =================
-
- $.fn.taskbar.noConflict = function () {
- $.fn.taskbar = old
- return this
- }
-
- }(jQuery);
|