dwz.taskBar.js 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305
  1. /**
  2. * @author Roger Wu
  3. * @version 1.0
  4. */
  5. (function($){
  6. $.fn.extend({
  7. jTask:function(options){
  8. return this.each(function(){
  9. var $task = $(this);
  10. var id = $task.attr("id");
  11. $task.click(function(e){
  12. var dialog = $("body").data(id);
  13. if ($task.hasClass("selected")) {
  14. $("a.minimize", dialog).trigger("click");
  15. } else {
  16. if (dialog.is(":hidden")) {
  17. $.taskBar.restoreDialog(dialog);
  18. } else
  19. $(dialog).trigger("click");
  20. }
  21. $.taskBar.scrollCurrent($(this));
  22. return false;
  23. });
  24. $("div.close", $task).click(function(e){
  25. $.pdialog.close(id)
  26. return false;
  27. }).hoverClass("closeHover");
  28. $task.hoverClass("hover");
  29. });
  30. }
  31. });
  32. $.taskBar = {
  33. _taskBar:null,
  34. _taskBox:null,
  35. _prevBut:null,
  36. _nextBut:null,
  37. _op:{id:"taskbar", taskBox:"div.taskbarContent",prevBut:".taskbarLeft",prevDis:"taskbarLeftDisabled", nextBut:".taskbarRight",nextDis:"taskbarRightDisabled", selected:"selected",boxMargin:"taskbarMargin"},
  38. init:function(options) {
  39. var $this = this;
  40. $.extend(this._op, options);
  41. this._taskBar = $("#" + this._op.id);
  42. if (this._taskBar.size() == 0) {
  43. this._taskBar = $(DWZ.frag["taskbar"]).appendTo($("#layout"));
  44. this._taskBar.find(".taskbarLeft").hoverClass("taskbarLeftHover");
  45. this._taskBar.find(".taskbarRight").hoverClass("taskbarRightHover");
  46. }
  47. this._taskBox = this._taskBar.find(this._op.taskBox);
  48. this._taskList = this._taskBox.find(">ul");
  49. this._prevBut = this._taskBar.find(this._op.prevBut);
  50. this._nextBut = this._taskBar.find(this._op.nextBut);
  51. this._prevBut.click(function(e){$this.scrollLeft()});
  52. this._nextBut.click(function(e){$this.scrollRight()});
  53. this._contextmenu(this._taskBox); // taskBar右键菜单
  54. },
  55. _contextmenu:function(obj) {
  56. $(obj).contextMenu('dialogCM', {
  57. bindings:{
  58. closeCurrent:function(t,m){
  59. var obj = t.isTag("li")?t:$.taskBar._getCurrent();
  60. $("div.close", obj).trigger("click");
  61. },
  62. closeOther:function(t,m){
  63. var selector = t.isTag("li")?("#" +t.attr("id")):".selected";
  64. var tasks = $.taskBar._taskList.find(">li:not(:"+selector+")");
  65. tasks.each(function(i){
  66. $("div.close",tasks[i]).trigger("click");
  67. });
  68. },
  69. closeAll:function(t,m){
  70. var tasks = $.taskBar._getTasks();
  71. tasks.each(function(i){
  72. $("div.close",tasks[i]).trigger("click");
  73. });
  74. }
  75. },
  76. ctrSub:function(t,m){
  77. var mCur = m.find("[rel='closeCurrent']");
  78. var mOther = m.find("[rel='closeOther']");
  79. if(!$.taskBar._getCurrent()[0]) {
  80. mCur.addClass("disabled");
  81. mOther.addClass("disabled");
  82. } else {
  83. if($.taskBar._getTasks().size() == 1)
  84. mOther.addClass("disabled");
  85. }
  86. }
  87. });
  88. },
  89. _scrollCurrent:function(){
  90. var iW = this._tasksW(this._getTasks());
  91. if (iW > this._getTaskBarW()) {
  92. var $this = this;
  93. var lTask = $(">li:last-child", this._taskList);
  94. var left = this._getTaskBarW() - lTask.position().left - lTask.outerWidth(true);
  95. this._taskList.animate({
  96. left: left + 'px'
  97. }, 200, function(){
  98. $this._ctrlScrollBut();
  99. });
  100. } else {
  101. this._ctrlScrollBut();
  102. }
  103. },
  104. _getTaskBarW:function(){
  105. return this._taskBox.width()- (this._prevBut.is(":hidden")?this._prevBut.width()+2:0) - (this._nextBut.is(":hidden")?this._nextBut.width()+2:0);
  106. },
  107. _scrollTask:function(task){
  108. var $this = this;
  109. if(task.position().left + this._getLeft()+task.outerWidth() > this._getBarWidth()) {
  110. var left = this._getTaskBarW()- task.position().left - task.outerWidth(true) - 2;
  111. this._taskList.animate({left: left + 'px'}, 200, function(){
  112. $this._ctrlScrollBut();
  113. });
  114. } else if(task.position().left + this._getLeft() < 0) {
  115. var left = this._getLeft()-(task.position().left + this._getLeft());
  116. this._taskList.animate({left: left + 'px'}, 200, function(){
  117. $this._ctrlScrollBut();
  118. });
  119. }
  120. },
  121. /**
  122. * 控制左右移动按钮何时显示与隐藏
  123. */
  124. _ctrlScrollBut:function(){
  125. var iW = this._tasksW(this._getTasks());
  126. if (this._getTaskBarW() > iW) {
  127. this._taskBox.removeClass(this._op.boxMargin);
  128. this._nextBut.hide();
  129. this._prevBut.hide();
  130. if(this._getTasks().eq(0)[0])this._scrollTask(this._getTasks().eq(0));
  131. } else {
  132. this._taskBox.addClass(this._op.boxMargin);
  133. this._nextBut.show().removeClass(this._op.nextDis);
  134. this._prevBut.show().removeClass(this._op.prevDis);
  135. if (this._getLeft() >= 0){
  136. this._prevBut.addClass(this._op.prevDis);
  137. }
  138. if (this._getLeft() <= this._getTaskBarW() - iW) {
  139. this._nextBut.addClass(this._op.nextDis);
  140. }
  141. }
  142. },
  143. _getLeft: function(){
  144. return this._taskList.position().left;
  145. },
  146. /**
  147. * 取得第一个完全显示在taskbar上的任务
  148. */
  149. _visibleStart: function(){
  150. var iLeft = this._getLeft();
  151. var jTasks = this._getTasks();
  152. for (var i=0; i<jTasks.size(); i++){
  153. if (jTasks.eq(i).position().left + jTasks.eq(i).outerWidth(true) + iLeft >= 0) return jTasks.eq(i);
  154. }
  155. return jTasks.eq(0);
  156. },
  157. /**
  158. * 取得最后一个完全显示在taskbar上的任务
  159. */
  160. _visibleEnd: function(){
  161. var iLeft = this._getLeft();
  162. var jTasks = this._getTasks();
  163. for (var i=0; i<jTasks.size(); i++){
  164. if (jTasks.eq(i).position().left + jTasks.eq(i).outerWidth(true) + iLeft > this._getBarWidth()) return jTasks.eq(i);
  165. }
  166. return jTasks.eq(jTasks.size()-1);
  167. },
  168. /**
  169. * 取得所有的任务
  170. */
  171. _getTasks:function(){
  172. return this._taskList.find(">li");
  173. },
  174. /**
  175. * 计算所传入的所有任务的宽度和
  176. * @param {Object} jTasks
  177. */
  178. _tasksW:function(jTasks){
  179. var iW = 0;
  180. jTasks.each(function(){
  181. iW += $(this).outerWidth(true);
  182. });
  183. return iW;
  184. },
  185. _getBarWidth: function() {
  186. return this._taskBar.innerWidth();
  187. },
  188. /**
  189. * 在任务栏上新加一个任务
  190. * @param {Object} id
  191. * @param {Object} title
  192. */
  193. addDialog: function(id, title){
  194. this.show();
  195. var task = $("#"+id,this._taskList);
  196. if (!task[0]) {
  197. var taskFrag = '<li id="#taskid#"><div class="taskbutton"><span>#title#</span></div><div class="close">Close</div></li>';
  198. this._taskList.append(taskFrag.replace("#taskid#", id).replace("#title#", title));
  199. task = $("#"+id,this._taskList);
  200. task.jTask();
  201. } else {
  202. $(">div>span", task).text(title);
  203. }
  204. this._contextmenu(task);
  205. this.switchTask(id);
  206. this._scrollTask(task);
  207. },
  208. /**
  209. * 关闭一个任务
  210. * @param {Object} id
  211. */
  212. closeDialog: function(obj){
  213. var task = (typeof obj == 'string')? $("#"+obj, this._taskList):obj;
  214. task.remove();
  215. if(this._getTasks().size() == 0){
  216. this.hide();
  217. }
  218. this._scrollCurrent();
  219. },
  220. /**
  221. *
  222. * @param {Object} id or dialog
  223. */
  224. restoreDialog:function(obj){
  225. var dialog = (typeof obj == 'string')?$("body").data(obj):obj;
  226. var id = (typeof obj == 'string')?obj:dialog.data("id");
  227. var task = $.taskBar.getTask(id);
  228. $(".resizable").css({top: $(window).height()-60,left:$(task).position().left,height:$(task).outerHeight(),width:$(task).outerWidth()
  229. }).show().animate({top:$(dialog).css("top"),left: $(dialog).css("left"),width:$(dialog).css("width"),height:$(dialog).css("height")},250,function(){
  230. $(this).hide();
  231. $(dialog).show();
  232. $.pdialog.attachShadow(dialog);
  233. });
  234. $.taskBar.switchTask(id);
  235. },
  236. /**
  237. * 把任务变成不是当前的
  238. * @param {Object} id
  239. */
  240. inactive:function(id){
  241. $("#" + id, this._taskList).removeClass("selected");
  242. },
  243. /**
  244. * 向左移一个任务
  245. */
  246. scrollLeft: function(){
  247. var task = this._visibleStart();
  248. this._scrollTask(task);
  249. },
  250. /**
  251. * 向右移一个任务
  252. */
  253. scrollRight: function(){
  254. var task = this._visibleEnd();
  255. this._scrollTask(task);
  256. },
  257. /**
  258. * 移出当前点击的任务
  259. * @param {Object} task
  260. */
  261. scrollCurrent:function(task){
  262. this._scrollTask(task);
  263. },
  264. /**
  265. * 切换任务
  266. * @param {Object} id
  267. */
  268. switchTask:function(id) {
  269. this._getCurrent().removeClass("selected");
  270. this.getTask(id).addClass("selected");
  271. },
  272. _getCurrent:function() {
  273. return this._taskList.find(">.selected");
  274. },
  275. getTask:function(id) {
  276. return $("#" + id, this._taskList);
  277. },
  278. /**
  279. * 显示任务栏
  280. */
  281. show:function(){
  282. if (this._taskBar.is(":hidden")) {
  283. this._taskBar.css("top", $(window).height() - 34 + this._taskBar.outerHeight()).show();
  284. this._taskBar.animate({
  285. top: $(window).height() - this._taskBar.outerHeight()
  286. }, 500);
  287. }
  288. },
  289. /**
  290. * 隐藏任务栏
  291. */
  292. hide:function(){
  293. this._taskBar.animate({
  294. top: $(window).height() - 29 + this._taskBar.outerHeight(true)
  295. }, 500,function(){
  296. $.taskBar._taskBar.hide();
  297. });
  298. }
  299. }
  300. })(jQuery);