diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/layout/managers/LayoutManager.as b/bigbluebutton-client/src/org/bigbluebutton/modules/layout/managers/LayoutManager.as index 09d71ce535..8819b872da 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/layout/managers/LayoutManager.as +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/layout/managers/LayoutManager.as @@ -27,6 +27,7 @@ package org.bigbluebutton.modules.layout.managers import flash.net.FileReference; import flash.net.URLLoader; import flash.net.URLRequest; + import flash.utils.Dictionary; import flash.utils.Timer; import flexlib.mdi.containers.MDICanvas; @@ -46,6 +47,7 @@ package org.bigbluebutton.modules.layout.managers import org.bigbluebutton.modules.layout.model.LayoutDefinition; import org.bigbluebutton.modules.layout.model.LayoutDefinitionFile; import org.bigbluebutton.modules.layout.model.LayoutLoader; + import org.bigbluebutton.modules.layout.model.WindowLayout; import org.bigbluebutton.modules.layout.events.RedefineLayoutEvent; import org.bigbluebutton.util.i18n.ResourceUtil; @@ -60,9 +62,6 @@ package org.bigbluebutton.modules.layout.managers private var _sendCurrentLayoutUpdateTimer:Timer = new Timer(500,1); private var _applyCurrentLayoutTimer:Timer = new Timer(150,1); private var _customLayoutsCount:int = 0; - /* - * \TODO investigate why it doesn't work - */ private var _eventsToDelay:Array = new Array(MDIManagerEvent.WINDOW_RESTORE, MDIManagerEvent.WINDOW_MINIMIZE, MDIManagerEvent.WINDOW_MAXIMIZE); @@ -179,8 +178,15 @@ package org.bigbluebutton.modules.layout.managers checkPermissionsOverWindow(e.window); applyLayout(_currentLayout); }); + +// _canvas.windowManager.addEventListener(MDIManagerEvent.WINDOW_FOCUS_START, function(e:MDIManagerEvent):void { +// OrderManager.getInstance().bringToFront(e.window); +// }); +// for each (var window:MDIWindow in _canvas.windowManager.windowList.reverse()) { +// OrderManager.getInstance().bringToFront(window); +// } } - + public function applyDefaultLayout():void { applyLayout(_layouts.getDefault()); sendLayoutUpdate(_currentLayout); @@ -274,9 +280,7 @@ package org.bigbluebutton.modules.layout.managers * some events related to animated actions must be delayed because if it's not the * current layout doesn't get properly updated */ - if (e.type == MDIManagerEvent.WINDOW_RESTORE - || e.type == MDIManagerEvent.WINDOW_MAXIMIZE - || e.type == MDIManagerEvent.WINDOW_MINIMIZE) { + if (_eventsToDelay.indexOf(e.type) != -1) { LogUtil.debug("LayoutManager: waiting the end of the animation to update the current layout"); _sendCurrentLayoutUpdateTimer.reset(); _sendCurrentLayoutUpdateTimer.start(); diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/layout/managers/OrderManager.as b/bigbluebutton-client/src/org/bigbluebutton/modules/layout/managers/OrderManager.as new file mode 100644 index 0000000000..f6470fd687 --- /dev/null +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/layout/managers/OrderManager.as @@ -0,0 +1,110 @@ +/** + * BigBlueButton open source conferencing system - http://www.bigbluebutton.org/ + * + * Copyright (c) 2012 BigBlueButton Inc. and by respective authors (see below). + * + * This program is free software; you can redistribute it and/or modify it under the + * terms of the GNU Lesser General Public License as published by the Free Software + * Foundation; either version 2.1 of the License, or (at your option) any later + * version. + * + * BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A + * PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License along + * with BigBlueButton; if not, see . + * + * Author: Felipe Cecagno + */ +package org.bigbluebutton.modules.layout.managers +{ + + import flash.utils.Dictionary; + + import flexlib.mdi.containers.MDIWindow; + + import org.bigbluebutton.common.LogUtil; + import org.bigbluebutton.modules.layout.model.LayoutDefinition; + import org.bigbluebutton.modules.layout.model.WindowLayout; + + public class OrderManager { + private static var _instance:OrderManager = null; + private var _windowsOrder:Dictionary = new Dictionary(); + + /** + * This class is a singleton. Please initialize it using the getInstance() method. + * + */ + public function OrderManager(enforcer:SingletonEnforcer) { + if (enforcer == null){ + throw new Error("There can only be 1 OrderManager instance"); + } + initialize(); + } + + private function initialize():void{ + } + + /** + * Return the single instance of the UserManager class + */ + public static function getInstance():OrderManager{ + if (_instance == null){ + _instance = new OrderManager(new SingletonEnforcer()); + } + return _instance; + } + + public function bringToFront(window:MDIWindow):void { + if (LayoutDefinition.ignoreWindow(window)) + return; + + var type:String = WindowLayout.getType(window); + var currentOrder:int = int.MAX_VALUE; + if (_windowsOrder.hasOwnProperty(type)) + currentOrder = _windowsOrder[type].order; + + for (var key:Object in _windowsOrder) { + var tmpOrder:int = _windowsOrder[key].order; + if (tmpOrder <= currentOrder) + _windowsOrder[key].order = tmpOrder + 1; +// LogUtil.debug("==========> " + key + " order: " + _windowsOrder[key].order); + } + _windowsOrder[type] = { order: 0 }; + +// if (_windowsOrder.length > window.windowManager.windowList.length) { +// var openWindows:Array = new Array(); +// for each (var tmp:MDIWindow in window.windowManager.windowList) { +// openWindows.push(WindowLayout.getType(tmp)); +// } +// for (key in _windowsOrder) { +// if (openWindows.indexOf(key) == -1) { +// LogUtil.debug("Removing order for " + key); +// delete _windowsOrder[key]; +// } +// } +// } +// LogUtil.debug("Manipulating " + type); +// for (key in _windowsOrder) { +// LogUtil.debug("=====> " + key + " order: " + _windowsOrder[key].order); +// } + +// window.windowManager.bringToFront(window); + } + + public function getOrderByType(type:String):int { + if (_windowsOrder.hasOwnProperty(type)) + return _windowsOrder[type].order; + else + return -1; + } + + public function getOrderByRef(window:MDIWindow):int { + return getOrderByType(WindowLayout.getType(window)); + } + + } +} + +class SingletonEnforcer{} \ No newline at end of file diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/layout/model/LayoutDefinition.as b/bigbluebutton-client/src/org/bigbluebutton/modules/layout/model/LayoutDefinition.as index 7b87a84e0a..a6ad959a74 100644 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/layout/model/LayoutDefinition.as +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/layout/model/LayoutDefinition.as @@ -26,11 +26,12 @@ package org.bigbluebutton.modules.layout.model { import flexlib.mdi.containers.MDIWindow; import org.bigbluebutton.common.LogUtil; + import org.bigbluebutton.modules.layout.managers.OrderManager; [Bindable] public var name:String; // default is a reserved word in actionscript [Bindable] public var defaultLayout:Boolean = false; - [Bindable] private var windows:Dictionary = new Dictionary(); + [Bindable] private var _windows:Dictionary = new Dictionary(); static private var _ignoredWindows:Array = new Array("PublishWindow", "VideoWindow", "DesktopPublishWindow", "DesktopViewWindow", "LogWindow"); @@ -46,13 +47,13 @@ package org.bigbluebutton.modules.layout.model { for each (var n:XML in vxml.window) { var window:WindowLayout = new WindowLayout(); window.load(n); - windows[window.name] = window; + _windows[window.name] = window; } } } public function windowLayout(name:String):WindowLayout { - return windows[name]; + return _windows[name]; } public function toXml():XML { @@ -60,34 +61,59 @@ package org.bigbluebutton.modules.layout.model { xml.@name = name; if (defaultLayout) xml.@default = true; - for each (var value:WindowLayout in windows) { + for each (var value:WindowLayout in _windows) { xml.appendChild(value.toXml()); } return xml; } + private function adjustWindowsOrder(canvas:MDICanvas):void { + var orderList:Array = new Array(); + var type:String; + var order:int; + for each (var window:MDIWindow in canvas.windowManager.windowList) { + type = WindowLayout.getType(window); + + if (ignoreWindowByType(type) || !_windows.hasOwnProperty(type)) + continue; + + order = _windows[type].order; + + // order == -1 means that there's no order defined for this window + if (order != -1) + orderList[order] = { window:window, order:order, type:type }; + } + + // only bring the focused window to front + for each (var obj:Object in orderList) { + if (obj != null) { + obj.window.windowManager.bringToFront(obj.window); + break; + } + } + } + public function applyToCanvas(canvas:MDICanvas):void { if (canvas == null) - return; - + return; + +// adjustWindowsOrder(canvas); + for each (var window:MDIWindow in canvas.windowManager.windowList) { applyToWindow(canvas, window); } } - public function applyToWindow(canvas:MDICanvas, window:MDIWindow):void { - var type:String = WindowLayout.getType(window); + public function applyToWindow(canvas:MDICanvas, window:MDIWindow, type:String=null):void { + if (type == null) + type = WindowLayout.getType(window); + if (!ignoreWindowByType(type)) - WindowLayout.setLayout(canvas, window, windows[type]); + WindowLayout.setLayout(canvas, window, _windows[type]); } static private function ignoreWindowByType(type:String):Boolean { - var ignored:Boolean; -// ignored = _ignoredWindows.some(function(element:*, index:int, array:Array):Boolean { -// return (element == type); -// }); - ignored = (_ignoredWindows.indexOf(type) != -1); - return ignored; + return (_ignoredWindows.indexOf(type) != -1); } static public function ignoreWindow(window:MDIWindow):Boolean { @@ -101,7 +127,7 @@ package org.bigbluebutton.modules.layout.model { for each (var window:MDIWindow in canvas.windowManager.windowList) { var layout:WindowLayout = WindowLayout.getLayout(canvas, window); if (!ignoreWindowByType(layout.name)) - layoutDefinition.windows[layout.name] = layout; + layoutDefinition._windows[layout.name] = layout; } return layoutDefinition; } diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/layout/model/WindowLayout.as b/bigbluebutton-client/src/org/bigbluebutton/modules/layout/model/WindowLayout.as index 31b2259104..64fa59e5bf 100644 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/layout/model/WindowLayout.as +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/layout/model/WindowLayout.as @@ -37,6 +37,7 @@ package org.bigbluebutton.modules.layout.model { import flash.utils.Timer; import flash.events.TimerEvent; import org.bigbluebutton.common.LogUtil; + import org.bigbluebutton.modules.layout.managers.OrderManager; [Bindable] public var name:String; [Bindable] public var width:Number; @@ -45,7 +46,9 @@ package org.bigbluebutton.modules.layout.model { [Bindable] public var y:Number; [Bindable] public var minimized:Boolean = false; [Bindable] public var maximized:Boolean = false; - [Bindabla] public var hidden:Boolean = false; + [Bindable] public var hidden:Boolean = false; + [Bindable] public var order:int = -1; + static private var EVENT_DURATION:int = 500; @@ -75,6 +78,9 @@ package org.bigbluebutton.modules.layout.model { if (vxml.@hidden != undefined) { hidden = (vxml.@hidden.toString().toUpperCase() == "TRUE") ? true : false; } +// if (vxml.@order != undefined) { +// order = int(vxml.@order); +// } } } @@ -88,6 +94,7 @@ package org.bigbluebutton.modules.layout.model { layout.minimized = window.minimized; layout.maximized = window.maximized; layout.hidden = !window.visible; +// layout.order = OrderManager.getInstance().getOrderByRef(window); return layout; } @@ -168,7 +175,7 @@ package org.bigbluebutton.modules.layout.model { effect.addChild(fader); } -// if (effect.children.lenght > 0) + if (effect.children.length > 0) effect.play(); } @@ -197,7 +204,8 @@ package org.bigbluebutton.modules.layout.model { xml.@x = int(x * canvas.width); xml.@y = int(y * canvas.height); } - return xml; +// xml.@order = order; + return xml; } public function toXml():XML { @@ -215,6 +223,7 @@ package org.bigbluebutton.modules.layout.model { xml.@x = x; xml.@y = y; } +// xml.@order = order; return xml; } }