Merge branch 'master' into make-users-user-conn-invoke

Conflicts:
	bigbluebutton-apps/src/main/java/org/bigbluebutton/conference/service/presentation/PresentationRoom.java
This commit is contained in:
Richard Alam 2013-06-21 17:42:09 +00:00
commit 3051b66072
27 changed files with 723 additions and 69 deletions

View File

@ -234,7 +234,7 @@ public String getJoinURLwithDynamicConfigXML(String username, String meetingID,
String base_url_create = BigBlueButtonURL + "api/create?";
String base_url_join = BigBlueButtonURL + "api/join?";
String base_url_setConfigXML = BigBlueButtonURL + "api/setConfigXML?";
String base_url_setConfigXML = BigBlueButtonURL + "api/setConfigXML.xml?";
Random random = new Random();
String voiceBridge_param = "&voiceBridge=" + (70000 + random.nextInt(9999));

View File

@ -266,6 +266,9 @@ bbb.shortcuthelp.dropdown.general = Global shortcuts
bbb.shortcuthelp.dropdown.presentation = Presentation shortcuts
bbb.shortcuthelp.dropdown.chat = Chat shortcuts
bbb.shortcuthelp.dropdown.users = Users shortcuts
bbb.shortcuthelp.dropdown.users = Users shortcuts
bbb.shortcuthelp.dropdown.polling = Presenter Polling shortcuts
bbb.shortcuthelp.dropdown.polling2 = Viewer Polling shortcuts
bbb.shortcutkey.general.minimize = 189
bbb.shortcutkey.general.minimize.function = Minimize current window
@ -290,7 +293,13 @@ bbb.shortcutkey.focus.video.function = Move focus to the Video dock
bbb.shortcutkey.focus.presentation = 51
bbb.shortcutkey.focus.presentation.function = Move focus to the Presentation window
bbb.shortcutkey.focus.chat = 52
bbb.shortcutkey.focus.chat.function = Move focus to the Chat window
bbb.shortcutkey.focus.chat.function = Move focus to the Chat window
bbb.shortcutkey.focus.pollingCreate = 67
bbb.shortcutkey.focus.pollingCreate.function = Move focus to the Poll Creation window, if it is open.
bbb.shortcutkey.focus.pollingStats = 83
bbb.shortcutkey.focus.pollingStats.function = Move focus to the Poll Statistics window, if it is open.
bbb.shortcutkey.focus.voting = 89
bbb.shortcutkey.focus.voting.function = Move focus to the Voting window, if it is open.
bbb.shortcutkey.share.desktop = 68
bbb.shortcutkey.share.desktop.function = Open desktop sharing window
@ -398,7 +407,9 @@ bbb.polling.stats.didNotVote = Did Not Vote
bbb.polling.stats.refresh = Refresh
bbb.polling.stats.stopPoll = Stop Poll
bbb.polling.stats.webPollURL = This poll is available at:
bbb.polling.stats.votes = votes
bbb.polling.stats.answer = Answers
bbb.polling.stats.votes = Votes
bbb.polling.stats.percentage = % Of Votes
bbb.polling.webPollClosed = Web polling has been closed.
bbb.polling.pollClosed = Polling has been closed! The results are:
@ -411,3 +422,46 @@ bbb.publishVideo.changeCameraBtn.labelText = Change Camera Settings
bbb.accessibility.alerts.madePresenter = You are now the Presenter.
bbb.accessibility.alerts.madeViewer = You are now a Viewer.
bbb.shortcutkey.polling.buttonClick = 80
bbb.shortcutkey.polling.buttonClick.function = Open the Polling Menu.
bbb.shortcutkey.polling.focusTitle = 67
bbb.shortcutkey.polling.focusTitle.function = Focus to Title input box.
bbb.shortcutkey.polling.focusQuestion = 81
bbb.shortcutkey.polling.focusQuestion.function = Focus to Question input box.
bbb.shortcutkey.polling.focusAnswers = 65
bbb.shortcutkey.polling.focusAnswers.function = Focus to Answers input box.
bbb.shortcutkey.polling.focusMultipleCB = 77
bbb.shortcutkey.polling.focusMultipleCB.function = Focus to "Allow multple selections" checkbox.
bbb.shortcutkey.polling.focusWebPollCB = 66
bbb.shortcutkey.polling.focusWebPollCB.function = Focus to "Enable web polling" checkbox.
bbb.shortcutkey.polling.previewClick = 80
bbb.shortcutkey.polling.previewClick.function = Preview your poll and proceed.
bbb.shortcutkey.polling.cancelClick = 88
bbb.shortcutkey.polling.cancelClick.function = Cancel and exit Poll creation.
bbb.shortcutkey.polling.modify = 69
bbb.shortcutkey.polling.modify.function = Go back and modify your poll.
bbb.shortcutkey.polling.publish = 85
bbb.shortcutkey.polling.publish.function = Publish your poll and open voting.
bbb.shortcutkey.polling.save = 83
bbb.shortcutkey.polling.save.function = Save your poll to use later.
bbb.shortcutkey.pollStats.explanation = ----
bbb.shortcutkey.pollStats.explanation.function = Poll results are only available once the poll has been published.
bbb.shortcutkey.polling.focusData = 68
bbb.shortcutkey.polling.focusData.function = Focus to poll results.
bbb.shortcutkey.polling.refresh = 82
bbb.shortcutkey.polling.refresh.function = Refresh poll results.
bbb.shortcutkey.polling.focusWebPoll = 73
bbb.shortcutkey.polling.focusWebPoll.function = Focus to web polling URL box.
bbb.shortcutkey.polling.stopPoll = 79
bbb.shortcutkey.polling.stopPoll.function = Stop the poll and end voting.
bbb.shortcutkey.polling.repostPoll = 80
bbb.shortcutkey.polling.repostPoll.function = Re-publish the poll.
bbb.shortcutkey.polling.closeStatsWindow = 88
bbb.shortcutkey.polling.closeStatsWindow.function = Close Polling Results window.
bbb.shortcutkey.polling.vote = 86
bbb.shortcutkey.polling.vote.function = Cast your vote for the options selected.
bbb.shortcutkey.polling.focusVoteQuestion = 81
bbb.shortcutkey.polling.focusVoteQuestion.function = Focus to question.

View File

@ -47,7 +47,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
import org.bigbluebutton.main.events.ShortcutEvent;
import org.bigbluebutton.main.views.MainApplicationShell;
import org.bigbluebutton.util.i18n.ResourceUtil;
private var langResources:ResourceUtil = null; //ResourceUtil.getInstance();
private var langResources:ResourceUtil = null;
private var globalModifier:String;
/**
@ -115,6 +115,9 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
keyCombos[globalModifier+(ResourceUtil.getInstance().getString('bbb.shortcutkey.flash.exit') as String)] = ShortcutEvent.FOCUS_AWAY_EVENT;
keyCombos[globalModifier+(ResourceUtil.getInstance().getString('bbb.shortcutkey.users.muteme') as String)] = ShortcutEvent.MUTE_ME_EVENT;
keyCombos[globalModifier+(ResourceUtil.getInstance().getString('bbb.shortcutkey.chat.chatinput') as String)] = ShortcutEvent.FOCUS_CHAT_INPUT;
keyCombos[globalModifier+(ResourceUtil.getInstance().getString('bbb.shortcutkey.focus.voting') as String)] = ShortcutEvent.FOCUS_VOTING_WINDOW;
keyCombos[globalModifier+(ResourceUtil.getInstance().getString('bbb.shortcutkey.focus.pollingCreate') as String)] = ShortcutEvent.FOCUS_POLLING_WINDOW_CREATE;
keyCombos[globalModifier+(ResourceUtil.getInstance().getString('bbb.shortcutkey.focus.pollingStats') as String)] = ShortcutEvent.FOCUS_POLLING_WINDOW_STATS;
// General hotKeys (usable from anywhere in the application)
keyCombos[globalModifier+(ResourceUtil.getInstance().getString('bbb.shortcutkey.focus.users') as String)] = ShortcutEvent.FOCUS_USERS_WINDOW;
@ -130,6 +133,8 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
keyCombos[globalModifier+(ResourceUtil.getInstance().getString('bbb.shortcutkey.logout') as String)] = ShortcutEvent.LOGOUT;
keyCombos[globalModifier+(ResourceUtil.getInstance().getString('bbb.shortcutkey.raiseHand') as String)] = ShortcutEvent.RAISE_HAND;
keyCombos[globalModifier+(ResourceUtil.getInstance().getString('bbb.shortcutkey.users.muteAllButPres') as String)] = ShortcutEvent.MUTE_ALL_BUT_PRES;
keyCombos[globalModifier+(ResourceUtil.getInstance().getString('bbb.shortcutkey.polling.buttonClick') as String)] = ShortcutEvent.POLL_BUTTON_CLICK;
}
public function hotkeyCapture():void{
@ -150,6 +155,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
}
if (keyCombos[keyPress]) {
//LogUtil.debug("Caught shortcut: " + keyCombos[keyPress]);
globalDispatcher.dispatchEvent(new ShortcutEvent(keyCombos[keyPress]));
}
}

View File

@ -70,8 +70,32 @@ package org.bigbluebutton.main.events {
public static const FOCUS_CHAT_BOX:String = 'FOCUS_CHAT_BOX';
public static const CHANGE_FONT_COLOUR:String = 'CHANGE_FONT_COLOUR';
public static const SEND_MESSAGE:String = 'SEND_MESSAGE';
public static const FOCUS_SHORTCUT_BUTTON:String = 'FOCUS_SHORTCUT_BUTTON';
public static const MUTE_ALL_BUT_PRES:String = 'MUTE_ALL_BUT_PRES';
public static const MUTE_ALL_BUT_PRES:String = 'MUTE_ALL_BUT_PRES';
public static const CLOSE_POLL_STATS:String = 'CLOSE_POLL_STATS';
public static const FOCUS_MULT_CHECK:String = 'FOCUS_MULT_CHECK';
public static const FOCUS_POLL_ANSWERS:String = 'FOCUS_POLL_ANSWERS';
public static const FOCUS_POLL_DATA:String = 'FOCUS_POLL_DATA';
public static const FOCUS_POLL_TITLE:String = 'FOCUS_POLL_TITLE';
public static const FOCUS_POLL_QUESTION:String = 'FOCUS_POLL_QUESTION';
public static const FOCUS_POLLING_WINDOW_CREATE:String = 'FOCUS_POLLING_WINDOW_CREATE';
public static const FOCUS_POLLING_WINDOW_STATS:String = 'FOCUS_POLLING_WINDOW_STATS';
public static const FOCUS_VOTE_QUESTION:String = 'FOCUS_VOTE_QUESTION';
public static const FOCUS_VOTING_WINDOW:String = 'FOCUS_VOTING_WINDOW';
public static const FOCUS_WEBPOLL_ADDRESS:String = 'FOCUS_WEBPOLL_ADDRESS';
public static const FOCUS_WEBPOLL_CHECK:String = 'FOCUS_WEBPOLL_CHECK';
public static const POLL_BUTTON_CLICK:String = 'POLL_BUTTON_CLICK';
public static const POLL_CANCEL:String = 'POLL_CANCEL';
public static const POLL_MODIFY:String = 'POLL_MODIFY';
public static const POLL_PREVIEW:String = 'POLL_PREVIEW';
public static const POLL_PUBLISH:String = 'POLL_PUBLISH';
public static const POLL_SAVE:String = 'POLL_SAVE';
public static const REMOTE_CAST_VOTE:String = 'REMOTE_CAST_VOTE';
public static const SC_REFRESH_POLL:String = 'SC_REFRESH_POLL';
public static const SC_REPOST_POLL:String = 'SC_REPOST_POLL';
public static const SC_STOP_POLL:String = 'SC_STOP_POLL';
// Temporary string to help fix chat message navigation for screen readers
public static const CHAT_DEBUG:String = 'CHAT_DEBUG';

View File

@ -222,7 +222,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
mdiCanvas.windowManager.add(scWindow);
mdiCanvas.windowManager.absPos(scWindow, mdiCanvas.width/2 - 150, mdiCanvas.height/2 - 150);
scWindow.focusCategories();
scWindow.focusHead();
}
private function toggleFullScreen():void{

View File

@ -33,6 +33,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
<mate:Listener type="{SettingsEvent.SETTINGS_MODULE_LOADED}" method="showSettingsButton" />
<mate:Listener type="{ShortcutEvent.REMOTE_OPEN_SHORTCUT_WIN}" method="remoteShortcutClick" />
<mate:Listener type="{ShortcutEvent.LOGOUT}" method="remoteLogout" />
<mate:Listener type="{ShortcutEvent.FOCUS_SHORTCUT_BUTTON}" method="focusShortcutButton" />
<mx:Script>
@ -252,6 +253,10 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
var d:Dispatcher = new Dispatcher();
d.dispatchEvent(new ShortcutEvent(ShortcutEvent.OPEN_SHORTCUT_WIN));
}
private function focusShortcutButton(e:ShortcutEvent):void{
shortcutKeysBtn.setFocus();
}
]]>
</mx:Script>

View File

@ -119,6 +119,7 @@ $Id: $
private function toggleMuteMeState(event:ShortcutEvent = null):void{
if (UserManager.getInstance().getConference().voiceJoined) {
this.setFocus();
if (UserManager.getInstance().getConference().voiceLocked && !UserManager.getInstance().getConference().amIModerator()) return;
var e:VoiceConfEvent = new VoiceConfEvent(VoiceConfEvent.MUTE_USER);

View File

@ -29,10 +29,13 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
title="{ResourceUtil.getInstance().getString('bbb.shortcuthelp.title')}" >
<mate:Listener type="{LocaleChangeEvent.LOCALE_CHANGED}" method="localeChanged" />
<mate:Listener type="{MDIWindowEvent.CLOSE}" method="focusButton" />
<mx:Script>
<![CDATA[
import flash.events.Event;
import com.asfusion.mate.events.Dispatcher;
import flexlib.mdi.events.MDIWindowEvent;
import flexlib.controls.textClasses.StringBoundaries;
@ -48,13 +51,16 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
private var presKeys:ArrayList;
private var chatKeys:ArrayList;
private var userKeys:ArrayList;
private var pollKeys:ArrayList;
private var pollVoteKeys:ArrayList;
private var genResource:Array = ['bbb.shortcutkey.general.minimize', 'bbb.shortcutkey.general.maximize', 'bbb.shortcutkey.flash.exit',
'bbb.shortcutkey.focus.users', 'bbb.shortcutkey.focus.video', 'bbb.shortcutkey.focus.presentation',
'bbb.shortcutkey.focus.chat', 'bbb.shortcutkey.chat.chatinput', 'bbb.shortcutkey.share.desktop',
'bbb.shortcutkey.share.microphone', 'bbb.shortcutkey.share.webcam', 'bbb.shortcutkey.shortcutWindow',
'bbb.shortcutkey.focus.chat', 'bbb.shortcutkey.focus.pollingCreate', 'bbb.shortcutkey.focus.pollingStats',
'bbb.shortcutkey.focus.voting', 'bbb.shortcutkey.share.microphone', 'bbb.shortcutkey.share.desktop',
'bbb.shortcutkey.share.webcam', 'bbb.shortcutkey.polling.buttonClick', 'bbb.shortcutkey.shortcutWindow',
'bbb.shortcutkey.logout', 'bbb.shortcutkey.raiseHand', 'bbb.shortcutkey.users.muteme',
'bbb.shortcutkey.users.muteAllButPres'];
'bbb.shortcutkey.users.muteAllButPres', 'bbb.shortcutkey.chat.chatinput'];
private var presResource:Array = ['bbb.shortcutkey.present.focusslide', /*'bbb.shortcutkey.whiteboard.undo',*/ 'bbb.shortcutkey.present.upload',
'bbb.shortcutkey.present.previous', 'bbb.shortcutkey.present.select', 'bbb.shortcutkey.present.next',
@ -68,6 +74,15 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
private var userResource:Array = ['bbb.shortcutkey.users.focusUsers', 'bbb.shortcutkey.users.makePresenter', 'bbb.shortcutkey.users.mute',
/*'bbb.shortcutkey.users.kick',*/ 'bbb.shortcutkey.users.muteall'];
private var pollResource:Array = ['bbb.shortcutkey.polling.focusTitle', 'bbb.shortcutkey.polling.focusQuestion', 'bbb.shortcutkey.polling.focusAnswers',
'bbb.shortcutkey.polling.focusMultipleCB', 'bbb.shortcutkey.polling.focusWebPollCB', 'bbb.shortcutkey.polling.previewClick',
'bbb.shortcutkey.polling.cancelClick', 'bbb.shortcutkey.polling.modify', 'bbb.shortcutkey.polling.publish',
'bbb.shortcutkey.polling.save', 'bbb.shortcutkey.pollStats.explanation', 'bbb.shortcutkey.polling.focusWebPoll',
'bbb.shortcutkey.polling.focusData', 'bbb.shortcutkey.polling.refresh', 'bbb.shortcutkey.polling.stopPoll',
'bbb.shortcutkey.polling.repostPoll', 'bbb.shortcutkey.polling.closeStatsWindow'];
private var pollVoteResource:Array = ['bbb.shortcutkey.polling.focusVoteQuestion', 'bbb.shortcutkey.polling.vote'];
[Bindable]
private var shownKeys:ArrayCollection;
@ -97,10 +112,18 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
presKeys = loadKeys(presResource);
chatKeys = loadKeys(chatResource);
userKeys = loadKeys(userResource);
pollKeys = loadKeys(pollResource);
pollVoteKeys = loadKeys(pollVoteResource);
changeArray();
}
public override function close(event:MouseEvent = null):void{
var dispatcher:Dispatcher = new Dispatcher();
dispatcher.dispatchEvent(new ShortcutEvent(ShortcutEvent.FOCUS_SHORTCUT_BUTTON));
super.close(event);
}
private function changeArray():void {
shownKeys = new ArrayCollection();
switch(categories.selectedIndex) {
@ -116,6 +139,12 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
case 3: //Users
shownKeys.addAll(userKeys);
break;
case 4: //Polling, Presenter
shownKeys.addAll(pollKeys);
break;
case 5: //Polling, Viewer
shownKeys.addAll(pollVoteKeys);
break;
}
}
@ -189,6 +218,16 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
focusManager.setFocus(keyList);
keyList.drawFocus(true);
}
public function focusHead():void {
focusManager.setFocus(titleBarOverlay);
}
public function focusButton(e:MDIWindowEvent):void{
LogUtil.debug("Caught close event from window");
var dispatcher:Dispatcher = new Dispatcher();
dispatcher.dispatchEvent(new ShortcutEvent(ShortcutEvent.FOCUS_SHORTCUT_BUTTON));
}
]]>
</mx:Script>
@ -201,6 +240,8 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
<mx:String>{ResourceUtil.getInstance().getString("bbb.shortcuthelp.dropdown.presentation")}</mx:String>
<mx:String>{ResourceUtil.getInstance().getString("bbb.shortcuthelp.dropdown.chat")}</mx:String>
<mx:String>{ResourceUtil.getInstance().getString("bbb.shortcuthelp.dropdown.users")}</mx:String>
<mx:String>{ResourceUtil.getInstance().getString("bbb.shortcuthelp.dropdown.polling")}</mx:String>
<mx:String>{ResourceUtil.getInstance().getString("bbb.shortcuthelp.dropdown.polling2")}</mx:String>
</mx:ArrayCollection>
</mx:ComboBox>
<mx:DataGrid id="keyList" draggableColumns="false" dataProvider="{shownKeys}" width="100%" height="100%" tabIndex="{baseIndex + 15}" >

View File

@ -118,7 +118,8 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
private function onCreationComplete():void{
// Start the timer for screen-reader-friendly chat notifications
notificationTimer.addEventListener(TimerEvent.TIMER, checkNotifications);
notificationTimer.start();
// Timer removed. Better method must be found for accessible notifications.
// notificationTimer.start();
openChatBoxFor(PUBLIC_CHAT_USERID, true);
makePublicChatUncloseable();

View File

@ -30,6 +30,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
implements="org.bigbluebutton.common.IBbbToolbarComponent">
<mate:Listener type="{ShortcutEvent.SHARE_DESKTOP}" method="remoteClick" />
<mate:Listener type="{ShareWindowEvent.CLOSE}" method="closeFocus" />
<mx:Script>
<![CDATA[
@ -132,6 +133,11 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
public function theory():String{
return "Deskshare button";
}
// Moves focus back to the toolbar button when the desktop sharing window closes, for accessibility
public function closeFocus(e:ShareWindowEvent):void{
this.setFocus();
}
]]>
</mx:Script>
</mx:Button>

View File

@ -26,6 +26,7 @@ package org.bigbluebutton.modules.polling.events
public static const UPDATE:String = "UPDATE_GET_TITLES";
public static const CHECK:String = "GET_TITLES_CHECK";
public static const RETURN:String = "GET_TITLES_RETURN";
public static const REMOTE_CHECK:String = "REMOTE_CHECK"
public var titleList:Array;
public function PollGetTitlesEvent(type:String, bubbles:Boolean=true, cancelable:Boolean=false)

View File

@ -23,6 +23,7 @@ package org.bigbluebutton.modules.polling.events
public class PollReturnTitlesEvent extends Event
{
public static const UPDATE:String = "UPDATE_RETURN_TITLES";
public static const REMOTE_RETURN:String = "REMOTE_RETURN";
public var titleList:Array;
public function PollReturnTitlesEvent(type:String, bubbles:Boolean=true, cancelable:Boolean=false)

View File

@ -17,10 +17,12 @@ package org.bigbluebutton.modules.polling.managers
import org.bigbluebutton.modules.polling.service.PollingService;
import org.bigbluebutton.core.managers.UserManager;
import org.bigbluebutton.main.model.users.Conference
import org.bigbluebutton.main.model.users.Conference;
import org.bigbluebutton.main.model.users.BBBUser;
import org.bigbluebutton.common.Role;
import org.bigbluebutton.main.events.ShortcutEvent;
import flash.events.TimerEvent;
import flash.utils.Timer;
public class PollingManager
{
@ -36,7 +38,7 @@ package org.bigbluebutton.modules.polling.managers
public var pollKey:String;
public var participants:int;
private var conference:Conference;
private var synchTimer:Timer;
public function PollingManager()
@ -82,7 +84,9 @@ package org.bigbluebutton.modules.polling.managers
public function handleClosePollingInstructionsWindowEvent(e:PollingInstructionsWindowEvent):void {
viewWindowManager.handleClosePollingInstructionsWindow(e);
toolbarButtonManager.enableToolbarButton();
toolbarButtonManager.focusToolbarButton();
}
//Opening Instructions Window
public function handleOpenPollingInstructionsWindowEvent(e:PollingInstructionsWindowEvent):void {
viewWindowManager.appFM = toolbarButtonManager.appFM;
@ -194,8 +198,17 @@ package org.bigbluebutton.modules.polling.managers
// Make a call to the service to update the list of titles and statuses for the Polling Menu
public function handleInitializePollMenuEvent(e:PollGetTitlesEvent):void{
toolbarButtonManager.button.roomID = module.getRoom();
service.initializePollingMenu(module.getRoom());
if (module != null && module.getRoom() != null){
toolbarButtonManager.button.roomID = module.getRoom();
service.initializePollingMenu(module.getRoom());
}
}
public function handleRemoteInitializePollMenuEvent(e:PollGetTitlesEvent):void{
if (module != null && module.getRoom() != null){
toolbarButtonManager.button.roomID = module.getRoom();
service.initializePollingMenuRemotely(module.getRoom());
}
}
public function handleUpdateTitlesEvent(e:PollGetTitlesEvent):void{
@ -206,6 +219,22 @@ package org.bigbluebutton.modules.polling.managers
public function handleReturnTitlesEvent(e:PollReturnTitlesEvent):void{
toolbarButtonManager.button.titleList = e.titleList;
}
public function handleRemoteReturnTitlesEvent(e:PollReturnTitlesEvent):void{
toolbarButtonManager.button.titleList = e.titleList;
// This timer gives the earlier NetConnection.call time to finish and deliver what it was sent out to get.
synchTimer = new Timer((1000*0.01));
synchTimer.addEventListener(TimerEvent.TIMER, remoteOpen);
synchTimer.start();
}
private function remoteOpen(e:TimerEvent):void{
if (synchTimer != null){
synchTimer.removeEventListener(TimerEvent.TIMER, remoteOpen);
synchTimer = null;
toolbarButtonManager.button.remoteOpenPollingMenu();
}
}
public function handleGetPollEvent(e:PollGetPollEvent):void{
service.getPoll(e.pollKey, "menu");
@ -250,5 +279,11 @@ package org.bigbluebutton.modules.polling.managers
viewWindowManager.handleReviewResultsEvent(e);
}
//##################################################################################
public function handleGlobalPollHotkey(e:ShortcutEvent):void{
conference = UserManager.getInstance().getConference();
if (conference.amIPresenter){
toolbarButtonManager.openMenuRemotely();
}
}
}
}

View File

@ -40,7 +40,7 @@ package org.bigbluebutton.modules.polling.managers
public static const LOGNAME:String = "[Polling :: ToolBarButtonManager] ";
public function ToolbarButtonManager() {
LogUtil.debug(LOGNAME + " initialized ***************************************************************** ")
//LogUtil.debug(LOGNAME + " initialized ***************************************************************** ")
globalDispatcher = new Dispatcher();
button = new ToolbarButton();
}
@ -54,6 +54,7 @@ package org.bigbluebutton.modules.polling.managers
globalDispatcher.dispatchEvent(event);
buttonShownOnToolbar = true;
button.enabled = true;
button.id = "pollButton";
appFM = button.focusManager;
}
}
@ -70,11 +71,27 @@ package org.bigbluebutton.modules.polling.managers
public function enableToolbarButton():void {
button.enabled = true;
}
public function focusToolbarButton():void {
appFM.setFocus(button);
button.notifyPosition();
}
public function disableToolbarButton():void {
appFM.setFocus(button.focusManager.getNextFocusManagerComponent());
button.enabled = false;
}
public function openMenuRemotely():Boolean{
var rValue:Boolean = true;
if (button.enabled){
button.updateMenuByShortcut();
}
else{
rValue = false;
}
return rValue;
}
// _Button
}
}

View File

@ -26,6 +26,7 @@
import mx.events.FlexEvent;
import org.bigbluebutton.main.events.MadePresenterEvent;
import org.bigbluebutton.main.events.BBBEvent;
import org.bigbluebutton.main.events.ShortcutEvent;
import org.bigbluebutton.modules.polling.managers.PollingManager;
@ -129,11 +130,16 @@
<EventHandlers type="{PollGetTitlesEvent.UPDATE}">
<MethodInvoker generator="{PollingManager}" method="handleUpdateTitlesEvent" arguments="{event}"/>
</EventHandlers>
<EventHandlers type="{PollGetTitlesEvent.REMOTE_CHECK}">
<MethodInvoker generator="{PollingManager}" method="handleRemoteInitializePollMenuEvent" arguments="{event}"/>
</EventHandlers>
<EventHandlers type="{PollReturnTitlesEvent.UPDATE}">
<MethodInvoker generator="{PollingManager}" method="handleReturnTitlesEvent" arguments="{event}"/>
</EventHandlers>
<EventHandlers type="{PollReturnTitlesEvent.REMOTE_RETURN}">
<MethodInvoker generator="{PollingManager}" method="handleRemoteReturnTitlesEvent" arguments="{event}"/>
</EventHandlers>
<EventHandlers type="{PollGetPollEvent.INIT}">
<MethodInvoker generator="{PollingManager}" method="handlePopulateMenuEvent" arguments="{event}"/>
@ -164,4 +170,8 @@
<EventHandlers type="{GenerateWebKeyEvent.RETURN}">
<MethodInvoker generator="{PollingManager}" method="handleReturnWebKeyEvent" arguments="{event}"/>
</EventHandlers>
<EventHandlers type="{ShortcutEvent.POLL_BUTTON_CLICK}">
<MethodInvoker generator="{PollingManager}" method="handleGlobalPollHotkey" arguments="{event}"/>
</EventHandlers>
</EventMap>

View File

@ -85,6 +85,30 @@ package org.bigbluebutton.modules.polling.service
public function initializePollingMenu(roomID:String):void{
}
public function initializePollingMenuRemotely(roomID:String):void{
nc.call("poll.titleList", new Responder(titleSuccess, titleFailure));
//--------------------------------------//
// Responder functions
function titleSuccess(obj:Object):void{
LogUtil.debug("REMOTE_POLL_MENU_INIT: Entering NC CALL SUCCESS section");
var event:PollReturnTitlesEvent = new PollReturnTitlesEvent(PollReturnTitlesEvent.REMOTE_RETURN);
event.titleList = obj as Array;
// Append roomID to each item in titleList, call getPoll on that key, add the result to pollList back in ToolBarButton
for (var i:int = 0; i < event.titleList.length; i++){
var pollKey:String = roomID +"-"+ event.titleList[i];
getPoll(pollKey, "initialize");
}
// This dispatch populates the titleList back in the Menu; the pollList is populated one item at a time in the for-loop
LogUtil.debug("PollingService.initializePollingMenuRemotely, dispatching PollReturnTitlesEvent.REMOTE_RETURN");
dispatcher.dispatchEvent(event);
}
function titleFailure(obj:Object):void{
LogUtil.error(LOGNAME+"Responder object failure in INITALIZE POLLING MENU NC.CALL");
LogUtil.error("Failure object tostring is: " + obj.toString());
}
//--------------------------------------//
}
public function updateTitles():void{

View File

@ -27,6 +27,19 @@ Notes.mxml is the main view of the SharedNotes application
creationComplete="onCreationComplete()"
label="Create Poll" layout="absolute"
title="{ResourceUtil.getInstance().getString('bbb.polling.createPoll')}">
<mate:Listener type="{ShortcutEvent.FOCUS_POLL_TITLE}" method="focusTitle" />
<mate:Listener type="{ShortcutEvent.FOCUS_POLL_QUESTION}" method="focusQuestion" />
<mate:Listener type="{ShortcutEvent.FOCUS_POLL_ANSWERS}" method="focusAnswers" />
<mate:Listener type="{ShortcutEvent.FOCUS_MULT_CHECK}" method="focusMultiple" />
<mate:Listener type="{ShortcutEvent.FOCUS_WEBPOLL_CHECK}" method="focusWebpoll" />
<mate:Listener type="{ShortcutEvent.POLL_PREVIEW}" method="previewClick" />
<mate:Listener type="{ShortcutEvent.POLL_CANCEL}" method="cancelClick" />
<mate:Listener type="{ShortcutEvent.POLL_MODIFY}" method="modifyClick" />
<mate:Listener type="{ShortcutEvent.POLL_PUBLISH}" method="publishClick" />
<mate:Listener type="{ShortcutEvent.POLL_SAVE}" method="saveClick" />
<mx:Script>
<![CDATA[
@ -88,6 +101,8 @@ Notes.mxml is the main view of the SharedNotes application
[Bindable] public var editing:Boolean;
[Bindable] public var pollOptions:PollOptions;
[Bindable] private var baseIndex:int;
private var keyCombos:Object;
// LENGTH CONSTRAINTS ( CHANGE IF YOU NEED)
//################################################
@ -110,6 +125,8 @@ Notes.mxml is the main view of the SharedNotes application
private function onCreationComplete():void{
published = false;
hotkeyCapture();
titleBarOverlay.tabIndex = baseIndex;
minimizeBtn.tabIndex = baseIndex+1;
maximizeRestoreBtn.tabIndex = baseIndex+2;
@ -137,6 +154,38 @@ Notes.mxml is the main view of the SharedNotes application
this.module = module;
focusManager.setFocus(titleBarOverlay);
}
private function hotkeyCapture():void{
this.addEventListener(KeyboardEvent.KEY_DOWN, handleKeyDown);
//ResourceUtil.getInstance().addEventListener(Event.CHANGE, localeChanged); // Listen for locale changing
}
private function handleKeyDown(e:KeyboardEvent) :void {
var modifier:String = ExternalInterface.call("determineModifier");
loadKeyCombos(modifier);
var keyPress:String = (e.ctrlKey ? "control+" : "") +
(e.shiftKey ? "shift+" : "") +
(e.altKey ? "alt+" : "") + e.keyCode;
LogUtil.debug("Polling Instructions: modifier is " + modifier);
if (keyCombos[keyPress]) {
LogUtil.debug("Dispatching event " + keyCombos[keyPress]);
dispatchEvent(new ShortcutEvent(keyCombos[keyPress]));
}
}
private function loadKeyCombos(modifier:String):void {
keyCombos = new Object(); // always start with a fresh array
keyCombos[modifier+(ResourceUtil.getInstance().getString('bbb.shortcutkey.polling.focusTitle') as String)] = ShortcutEvent.FOCUS_POLL_TITLE;
keyCombos[modifier+(ResourceUtil.getInstance().getString('bbb.shortcutkey.polling.focusQuestion') as String)] = ShortcutEvent.FOCUS_POLL_QUESTION;
keyCombos[modifier+(ResourceUtil.getInstance().getString('bbb.shortcutkey.polling.focusAnswers') as String)] = ShortcutEvent.FOCUS_POLL_ANSWERS;
keyCombos[modifier+(ResourceUtil.getInstance().getString('bbb.shortcutkey.polling.focusMultipleCB') as String)] = ShortcutEvent.FOCUS_MULT_CHECK;
keyCombos[modifier+(ResourceUtil.getInstance().getString('bbb.shortcutkey.polling.focusWebPollCB') as String)] = ShortcutEvent.FOCUS_WEBPOLL_CHECK;
keyCombos[modifier+(ResourceUtil.getInstance().getString('bbb.shortcutkey.polling.previewClick') as String)] = ShortcutEvent.POLL_PREVIEW;
keyCombos[modifier+(ResourceUtil.getInstance().getString('bbb.shortcutkey.polling.cancelClick') as String)] = ShortcutEvent.POLL_CANCEL;
keyCombos[modifier+(ResourceUtil.getInstance().getString('bbb.shortcutkey.polling.modify') as String)] = ShortcutEvent.POLL_MODIFY;
keyCombos[modifier+(ResourceUtil.getInstance().getString('bbb.shortcutkey.polling.publish') as String)] = ShortcutEvent.POLL_PUBLISH;
keyCombos[modifier+(ResourceUtil.getInstance().getString('bbb.shortcutkey.polling.save') as String)] = ShortcutEvent.POLL_SAVE;
}
// Overwritting close to use custom function
override public function close(event:MouseEvent = null):void {
@ -337,6 +386,52 @@ Notes.mxml is the main view of the SharedNotes application
focusManager.setFocus(pollTitle);
}
}
private function focusQuestion(e:ShortcutEvent):void{
if (pollQuestion.enabled && pollQuestion.visible){
focusManager.setFocus(pollQuestion);
}
}
private function focusAnswers(e:ShortcutEvent):void{
if (pollAnswers.enabled && pollAnswers.visible){
focusManager.setFocus(pollAnswers);
}
}
private function focusMultiple(e:ShortcutEvent):void{
if (multiple_response.enabled && multiple_response.visible){
focusManager.setFocus(multiple_response);
}
}
private function focusWebpoll(e:ShortcutEvent):void{
if (publishToWeb_response.enabled && publishToWeb_response.visible){
focusManager.setFocus(publishToWeb_response);
}
}
private function previewClick(e:ShortcutEvent):void{
if (next.enabled && next.visible){
validateAndSubmit();
}
}
private function cancelClick(e:ShortcutEvent):void{
if (Cancel.enabled && Cancel.visible){
closeInstructionsWindow();
}
}
private function modifyClick(e:ShortcutEvent):void{
if (back.enabled && back.visible){
goBack();
}
}
private function publishClick(e:ShortcutEvent):void{
if (publishButton.enabled && publishButton.visible){
publish();
}
}
private function saveClick(e:ShortcutEvent):void{
if (SavePoll.enabled && SavePoll.visible){
savePoll();
}
}
]]>
</mx:Script>
<mx:VBox width="100%" height="100%">

View File

@ -31,6 +31,14 @@
title="{ResourceUtil.getInstance().getString('bbb.polling.toolbar.toolTip')}"
layout="absolute"
>
<mate:Listener type="{ShortcutEvent.FOCUS_WEBPOLL_ADDRESS}" method="focusWebPollBox" />
<mate:Listener type="{ShortcutEvent.FOCUS_POLL_DATA}" method="focusDataGrid" />
<mate:Listener type="{ShortcutEvent.SC_REFRESH_POLL}" method="remoteRefresh" />
<mate:Listener type="{ShortcutEvent.SC_STOP_POLL}" method="remoteStop" />
<mate:Listener type="{ShortcutEvent.SC_REPOST_POLL}" method="remoteRepost" />
<mate:Listener type="{ShortcutEvent.CLOSE_POLL_STATS}" method="remoteClose" />
<mx:Script>
<![CDATA[
@ -56,6 +64,7 @@
import org.bigbluebutton.main.model.users.BBBUser;
import org.bigbluebutton.main.model.users.Conference;
import org.bigbluebutton.main.views.MainCanvas;
import org.bigbluebutton.main.events.ShortcutEvent;
import org.bigbluebutton.modules.chat.events.SendPublicChatMessageEvent;
import org.bigbluebutton.modules.polling.events.GenerateWebKeyEvent;
import org.bigbluebutton.modules.polling.events.PollRefreshEvent;
@ -92,6 +101,7 @@
private var notified:Boolean;
private var refreshTimer:Timer = new Timer(1000);
[Bindable] private var answerCollection:ArrayCollection = new ArrayCollection();
private var keyCombos:Object;
private function init():void{
pollOptions = new PollOptions();
@ -119,6 +129,8 @@
private function onCreationComplete():void{
hotkeyCapture();
titleBarOverlay.accessibilityName = ResourceUtil.getInstance().getString('bbb.polling.stats.accessTitle', [trackingPoll.title]);
titleBarOverlay.tabIndex = baseIndex;
minimizeBtn.tabIndex = baseIndex+1;
@ -155,8 +167,35 @@
height = height + ((lines+1) * 45);
createResultsTable(answers.length, answers);
focusManager.setFocus(titleBarOverlay);
}
}
private function hotkeyCapture():void{
this.addEventListener(KeyboardEvent.KEY_DOWN, handleKeyDown);
//ResourceUtil.getInstance().addEventListener(Event.CHANGE, localeChanged); // Listen for locale changing
}
private function handleKeyDown(e:KeyboardEvent) :void {
var modifier:String = ExternalInterface.call("determineModifier");
loadKeyCombos(modifier);
var keyPress:String = (e.ctrlKey ? "control+" : "") +
(e.shiftKey ? "shift+" : "") +
(e.altKey ? "alt+" : "") + e.keyCode;
if (keyCombos[keyPress]) {
dispatchEvent(new ShortcutEvent(keyCombos[keyPress]));
}
}
private function loadKeyCombos(modifier:String):void {
keyCombos = new Object(); // always start with a fresh array
keyCombos[modifier+(ResourceUtil.getInstance().getString('bbb.shortcutkey.polling.focusData') as String)] = ShortcutEvent.FOCUS_POLL_DATA;
keyCombos[modifier+(ResourceUtil.getInstance().getString('bbb.shortcutkey.polling.refresh') as String)] = ShortcutEvent.SC_REFRESH_POLL;
keyCombos[modifier+(ResourceUtil.getInstance().getString('bbb.shortcutkey.polling.focusWebPoll') as String)] = ShortcutEvent.FOCUS_WEBPOLL_ADDRESS;
keyCombos[modifier+(ResourceUtil.getInstance().getString('bbb.shortcutkey.polling.stopPoll') as String)] = ShortcutEvent.SC_STOP_POLL;
keyCombos[modifier+(ResourceUtil.getInstance().getString('bbb.shortcutkey.polling.closeStatsWindow') as String)] = ShortcutEvent.CLOSE_POLL_STATS;
keyCombos[modifier+(ResourceUtil.getInstance().getString('bbb.shortcutkey.polling.repostPoll') as String)] = ShortcutEvent.SC_REPOST_POLL;
}
public function setUrlBoxText():void{
webPollURLBox.text = webPollUrl;
webPollURLBox.accessibilityName = ResourceUtil.getInstance().getString('bbb.polling.stats.webPollBoxAccessName', [webPollUrl]);
@ -269,6 +308,48 @@
pso.percentage = "";
return pso;
}
private function focusWebPollBox(e:ShortcutEvent):void{
if (webPollURLBox.visible)
focusManager.setFocus(webPollURLBox);
}
private function focusDataGrid(e:ShortcutEvent):void{
focusManager.setFocus(resultsGrid);
}
// addAlert
private function remoteRefresh(e:ShortcutEvent):void{
if (btnRefreshResults.label == ResourceUtil.getInstance().getString('bbb.polling.stats.refresh')){
var message:String = ResourceUtil.getInstance().getString('bbb.polling.stats.alerts.refresh');
ExternalInterface.call("addAlert", message);
refreshPoll();
}
}
private function remoteStop(e:ShortcutEvent):void{
if (btnClosePoll.label == ResourceUtil.getInstance().getString('bbb.polling.stats.stopPoll')){
var message:String = ResourceUtil.getInstance().getString('bbb.polling.stats.alerts.stopPoll');
ExternalInterface.call("addAlert", message);
stopPoll();
}
}
private function remoteRepost(e:ShortcutEvent):void{
if (btnRefreshResults.label == ResourceUtil.getInstance().getString('bbb.polling.stats.repost')){
var message:String = ResourceUtil.getInstance().getString('bbb.polling.stats.alerts.repost');
ExternalInterface.call("addAlert", message);
publishPollAgain(e);
}
}
private function remoteClose(e:ShortcutEvent):void{
if (btnClosePoll.label == ResourceUtil.getInstance().getString('bbb.polling.stats.close')){
var message:String = ResourceUtil.getInstance().getString('bbb.polling.stats.alerts.close');
ExternalInterface.call("addAlert", message);
closeButtonClick(e);
}
}
]]>
</mx:Script>

View File

@ -30,6 +30,10 @@
title="{ResourceUtil.getInstance().getString('bbb.polling.toolbar.toolTip')}"
layout="absolute">
<mate:Listener type="{ShortcutEvent.FOCUS_VOTING_WINDOW}" method="focusWindow" />
<mate:Listener type="{ShortcutEvent.REMOTE_CAST_VOTE}" method="remoteVote" />
<mate:Listener type="{ShortcutEvent.FOCUS_VOTE_QUESTION}" method="focusQuestion" />
<mx:Script>
<![CDATA[
import flexlib.mdi.events.MDIWindowEvent;
@ -42,6 +46,7 @@
import org.bigbluebutton.modules.polling.managers.PollingManager;
import org.bigbluebutton.modules.polling.events.VoteEvent;
import org.bigbluebutton.modules.polling.model.PollOptions;
import org.bigbluebutton.main.events.ShortcutEvent;
import org.bigbluebutton.main.model.users.Conference;
@ -70,6 +75,7 @@
public var cbSelected:Array = new Array(); // variable that receives either CheckBox or RadioButton info and sends it to VoteEvent
[Bindable] public var pollOptions:PollOptions;
[Bindable] private var baseIndex:int;
private var keyCombos:Object;
public function getPrefferedPosition():String{
return MainCanvas.POPUP;
@ -85,6 +91,7 @@
}
private function onCreationComplete():void{
hotkeyCapture();
titleBarOverlay.tabIndex = baseIndex;
minimizeBtn.tabIndex = baseIndex+1;
maximizeRestoreBtn.tabIndex = baseIndex+2;
@ -114,6 +121,27 @@
height = height + ((lines+1) * 45);
// We won't automatically focus to the Vote window when it is created, for a couple of reasons.
}
private function hotkeyCapture():void{
this.addEventListener(KeyboardEvent.KEY_DOWN, handleKeyDown);
}
private function handleKeyDown(e:KeyboardEvent) :void {
var modifier:String = ExternalInterface.call("determineModifier");
loadKeyCombos(modifier);
var keyPress:String = (e.ctrlKey ? "control+" : "") +
(e.shiftKey ? "shift+" : "") +
(e.altKey ? "alt+" : "") + e.keyCode;
if (keyCombos[keyPress]) {
dispatchEvent(new ShortcutEvent(keyCombos[keyPress]));
}
}
private function loadKeyCombos(modifier:String):void {
keyCombos = new Object(); // always start with a fresh array
keyCombos[modifier+(ResourceUtil.getInstance().getString('bbb.shortcutkey.polling.vote') as String)] = ShortcutEvent.REMOTE_CAST_VOTE;
keyCombos[modifier+(ResourceUtil.getInstance().getString('bbb.shortcutkey.polling.focusVoteQuestion') as String)] = ShortcutEvent.FOCUS_VOTE_QUESTION;
}
// This function will receive information and generate radiobuttons on fly
// function receives Array.length and ArrayCollection
@ -208,6 +236,21 @@
public function radioClick(e:Event):void{
submissionAllowed = true;
}
private function focusWindow(e:Event):void{
LogUtil.debug("Received Vote Window Focus");
focusManager.setFocus(titleBarOverlay);
}
private function focusQuestion(e:ShortcutEvent):void{
LogUtil.debug("Received Vote Question Focus");
focusManager.setFocus(questionText);
}
private function remoteVote(e:ShortcutEvent):void{
LogUtil.debug("Received Vote Command");
Vote();
}
]]>
</mx:Script>

View File

@ -30,6 +30,7 @@
initialize="init();"
click="createAndShow();"
icon="{pollIcon}"
accessibilityName="{ResourceUtil.getInstance().getString('bbb.polling.buttonName')}"
>
<mx:Script>
<![CDATA[
@ -37,8 +38,9 @@
import org.bigbluebutton.common.Images;
import org.bigbluebutton.common.LogUtil;
import org.bigbluebutton.main.views.MainToolbar;
import org.bigbluebutton.main.events.ShortcutEvent ;
import org.bigbluebutton.util.i18n.ResourceUtil;
import org.bigbluebutton.modules.polling.events.PollingInstructionsWindowEvent;
import org.bigbluebutton.modules.polling.events.PollingInstructionsWindowEvent;
import org.bigbluebutton.modules.polling.events.PollGetTitlesEvent;
import org.bigbluebutton.modules.polling.events.PollGetPollEvent;
import org.bigbluebutton.modules.polling.events.OpenSavedPollEvent;
@ -46,6 +48,8 @@
import org.bigbluebutton.modules.polling.model.ValueObject;
import org.bigbluebutton.modules.polling.model.PollObject;
import org.bigbluebutton.core.managers.UserManager;
import org.bigbluebutton.main.model.users.Conference;
import mx.collections.ArrayCollection;
import mx.controls.Menu;
@ -63,6 +67,10 @@
public var pollIcon:Class;
public static const LOGNAME:String = "[Polling (views) : ToolbarButton] ";
private var conference:Conference;
private var myMenu:Menu = new Menu();
private const REAL_BUTTON_ID:String = "BigBlueButton.mainShell.toolbar.addedBtns.pollButton";
[Bindable] public var roomID:String;
[Bindable] public var titleList:Array;
@ -75,30 +83,52 @@
pollList = new ArrayCollection();
listInitialize();
renderMenu();
conference = UserManager.getInstance().getConference();
this.addEventListener(FocusEvent.FOCUS_IN, updateMenuByEvent);
}
public function remoteOpenPollingMenu(e:ShortcutEvent = null):void{
//LogUtil.debug("Opening poll menu by --SHORTCUT-- [remoteOpenPollingMenu()]");
createAndShow();
//LogUtil.debug("Finished opening menu by shortcut. [/remoteOpenPollingMenu()]");
}
private function createAndShow():void{
renderMenu();
var myMenu:Menu = Menu.createMenu(null, myMenuData, false);
myMenu.hide();
myMenu = Menu.createMenu(null, myMenuData, false);
myMenu.iconField="icon";
myMenu.show(this.x + 10, this.y + this.height + 10);
var xPos:int = this.x;
var yPos:int = this.y;
var heightVal:int = this.height;
myMenu.show(xPos + 10, yPos + heightVal + 10);
myMenu.addEventListener(MenuEvent.ITEM_CLICK, menuClick);
}
// #################################################################
public function listInitialize():void{
public function listInitialize(calledFromShortcut:Boolean = false):void{
LogUtil.debug("Entering listInitialize [listInitialize()]");
titleList = new Array();
myMenuData.removeAll();
pollList.removeAll();
var pevent:PollGetTitlesEvent = new PollGetTitlesEvent(PollGetTitlesEvent.INIT);
if (myMenuData != null)
myMenuData.removeAll();
if (pollList != null)
pollList.removeAll();
var pevent:PollGetTitlesEvent;
if (calledFromShortcut){
pevent = new PollGetTitlesEvent(PollGetTitlesEvent.REMOTE_CHECK);
}
else{
pevent = new PollGetTitlesEvent(PollGetTitlesEvent.INIT);
}
try{
dispatchEvent(pevent);
LogUtil.debug("GetTitlesEvent dispatched");
}
catch (e:*){
LogUtil.debug("Bleh.");
}
catch (e:*){LogUtil.debug("GetTitlesEvent failed");}
LogUtil.debug("Leaving listInitialize [/listInitialize()]");
}
private function renderMenu():void{
@ -123,8 +153,23 @@
updateMenu();
}
private function updateMenu():void{
listInitialize();
public function updateMenuByShortcut(e:ShortcutEvent = null):void{
conference = UserManager.getInstance().getConference();
if (conference.amIPresenter){
var message:String = ResourceUtil.getInstance().getString('bbb.polling.buttonNameShortcut');
ExternalInterface.call("addAlert", message);
updateMenu(true);
}
}
public function notifyPosition():void{
var message:String = ResourceUtil.getInstance().getString('bbb.polling.buttonName');
ExternalInterface.call("addAlert", message);
}
private function updateMenu(calledFromShortcut:Boolean = false):void{
LogUtil.debug("Caught poll click in button, heading towards listInitialize()");
listInitialize(calledFromShortcut);
}
private function menuClick(event:MenuEvent):void {
@ -144,6 +189,7 @@
dispatchEvent(reviewEvent);
}
}
stage.dispatchEvent(new MenuEvent(MenuEvent.MENU_HIDE));
}
@ -156,6 +202,15 @@
dispatchEvent(new PollingInstructionsWindowEvent(PollingInstructionsWindowEvent.OPEN));
this.enabled=false;
}
private function remoteSwitch(e:ShortcutEvent):void{
if (this.toString() != REAL_BUTTON_ID){
updateMenuByShortcut(e);
}
else{
remoteOpenPollingMenu(e);
}
}
]]>
</mx:Script>
</mx:Button>

View File

@ -111,6 +111,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
}
private function handleCamSettingsClosedEvent(e:BBBEvent):void {
this.setFocus();
if(e.payload['clicked'] == "cancel"){
this.enabled = true;
this.selected = false;

View File

@ -500,6 +500,18 @@ module BigBlueButton
stop_evt << new_event
end
end
# fix the start events list so the matched events will be consistent
stop_evt.each do |evt|
if start_evt.select{ |s| s[:stream] == evt[:stream] }.empty?
new_event = {
:stream => evt[:stream],
:start_timestamp => evt[:stop_timestamp] - (BigBlueButton.get_video_duration("#{video_dir}/#{evt[:stream]}.flv") * 1000).to_i
}
BigBlueButton.logger.debug("Adding stop event: #{new_event}")
start_evt << new_event
end
end
matched_evts = BigBlueButton::Events.match_start_and_stop_video_events(start_evt, stop_evt)
BigBlueButton.logger.debug("First timestamp: #{first_timestamp}")

View File

@ -17,17 +17,49 @@
# You should have received a copy of the GNU Lesser General Public License along
# with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
#
sudo cp -r core/lib/* /usr/local/bigbluebutton/core/lib/
sudo cp -r core/scripts/* /usr/local/bigbluebutton/core/scripts/
PLAYBACK_LIST="slides presentation"
set -e
sudo cp core/Gemfile /usr/local/bigbluebutton/core/Gemfile
sudo rm -rf /usr/local/bigbluebutton/core/lib
sudo cp -r core/lib /usr/local/bigbluebutton/core/
sudo rm -rf /usr/local/bigbluebutton/core/scripts
sudo cp -r core/scripts /usr/local/bigbluebutton/core/
sudo rm -rf /etc/bigbluebutton/god
sudo cp -r core/god/god /etc/bigbluebutton/
sudo rm -f /etc/init.d/bbb-record-core
sudo cp core/god/initd.god /etc/init.d/bbb-record-core
sudo chmod 0755 /etc/init.d/bbb-record-core
sudo rm -rf /var/bigbluebutton/playback/*
function deploy_format() {
local formats=$1
for format in $formats
do
playback_dir="$format/playback/$format"
scripts_dir="$format/scripts"
if [ -d $playback_dir ]; then sudo cp -r $playback_dir /var/bigbluebutton/playback/; fi
if [ -d $scripts_dir ]; then sudo cp -r $scripts_dir/* /usr/local/bigbluebutton/core/scripts/; fi
sudo mkdir -p /var/log/bigbluebutton/$format
done
}
# deploy_format "slides"
deploy_format "presentation"
sudo mkdir -p /var/bigbluebutton/playback/
for PLAYBACK in $PLAYBACK_LIST
do
sudo cp -r $PLAYBACK/playback/* /var/bigbluebutton/playback/
sudo cp -r $PLAYBACK/scripts/* /usr/local/bigbluebutton/core/scripts/
done
sudo mkdir -p /var/bigbluebutton/recording/raw/
sudo mkdir -p /var/bigbluebutton/recording/process/
sudo mkdir -p /var/bigbluebutton/recording/publish/
sudo mkdir -p /var/bigbluebutton/recording/status/recorded/
sudo mkdir -p /var/bigbluebutton/recording/status/archived/
sudo mkdir -p /var/bigbluebutton/recording/status/processed/
sudo mkdir -p /var/bigbluebutton/recording/status/sanity/
sudo chown -R tomcat6:tomcat6 /var/bigbluebutton/playback/
sudo cp /usr/local/bigbluebutton/core/scripts/*.nginx /etc/bigbluebutton/nginx/
sudo mv /usr/local/bigbluebutton/core/scripts/*.nginx /etc/bigbluebutton/nginx/
sudo chown -R tomcat6:tomcat6 /var/bigbluebutton/ /var/log/bigbluebutton/
sudo chown -R red5:red5 /var/bigbluebutton/deskshare/
sudo chown -R freeswitch:daemon /var/bigbluebutton/meetings/
cd /usr/local/bigbluebutton/core/
sudo bundle install

View File

@ -684,19 +684,24 @@
"collision": "none none",
"offset": "10 0"
});
$('#videoRecordingWrapper').width("800px");
$('#videoRecordingWrapper').height("600px");
$('#presentation').position({
"my": "center top",
"at": "center bottom",
"my": "left top",
"at": "left bottom",
"of": '#chat',
"collision": "none none"
});
$('#presentation').width("400px");
$('#presentation').height("300px");
$('.acorn-controls').position({
"my": "center top",
"at": "center bottom",
"of": '#playbackArea',
"collision": "none none"
"my": "left top",
"at": "left bottom",
"of": '#videoRecordingWrapper',
"collision": "none none",
"offset": "10 7"
});
draw(0,0);
@ -723,19 +728,24 @@
"collision": "none none",
"offset": "10 0"
});
$('#presentation').width("800px");
$('#presentation').height("600px");
$('#videoRecordingWrapper').position({
"my": "center top",
"at": "center bottom",
"my": "left top",
"at": "left bottom",
"of": '#chat',
"collision": "none none"
});
$('#videoRecordingWrapper').width("400px");
$('#videoRecordingWrapper').height("300px");
$('.acorn-controls').position({
"my": "center top",
"at": "center bottom",
"of": '#playbackArea',
"collision": "none none"
"my": "left top",
"at": "left bottom",
"of": '#presentation',
"collision": "none none",
"offset": "10 7"
});
swapped = false;

View File

@ -49,7 +49,14 @@ br{
#playbackArea {
width: 1360px; /* #slide.width + #chat.width + #audioRecording.width */
height: 650px;
margin: 0 auto;
overflow: hidden;
}
#audioRecordingWrapper{
float: left;
width: 800px;
}
#audioRecording{
@ -59,6 +66,26 @@ br{
width: 100%;
}
#audioRecordingWrapper .acorn-controls, #videoRecordingWrapper .acorn-controls{
position: relative;
top: 0;
left: -810px;
width: 730px;
}
#playbackControls{
width: 1360px;
margin: 0 auto;
margin-top: -50px;
}
#autoscrollWrapper{
float: left;
margin-left: 10px;
margin-top: 8px;
font-size: 14px;
}
.webcam{
width: 402px;
height: 300px;
@ -85,6 +112,7 @@ br{
#presentation {
float: left;
position: relative;
height: 600px;
}
#slide {
@ -111,10 +139,16 @@ br{
overflow: hidden;
}
.chatcontainer{
#mediaArea {
float: right;
background: white;
height: 300px;
width: 402px;
}
#chatAndMediaArea{
float: right;
background: white;
height: 600px;
width: 402px;
}
#chat{

View File

@ -53,7 +53,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
<div id="slide" role="region" aria-label="Slide"></div>
<div id="slideText" class="visually-hidden" role="region" aria-live="polite" aria-label="Slide Text"></div>
</div>
<div class="chatcontainer">
<div id="chatAndMediaArea">
<div id="chat" aria-live="polite" role="region" aria-label="Chat messages"></div>
<div id="videoRecordingWrapper" role="region" aria-label="Video">
<!--
@ -61,12 +61,18 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
This playback requires modern browser, please use FF, Safari, Chrome</video>
-->
</div>
<div id="audioRecordingWrapper" role="region" aria-label="Audio">
<div id="audioRecordingWrapper" role="region" aria-label="Audio">
<!--
<audio id="video">You must use an HTML5 capable browser to view this page.
This playback requires modern browser, please use FF, Safari, Chrome</audio>
-->
</div>
</div>
</div>
</div>
<div id="playbackControls">
<div id="autoscrollWrapper">
<input id="autoscrollEnabled" type="checkbox" name="autoscrollEnabled" checked="true" aria-label="Toggle autoscroll"/>
<label for="autoscrollEnabled">Auto scroll</label>
</div>
</div>
@ -81,5 +87,3 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
<!-- <script src='lib/writing.js'></script> -->
</body>
</html>

View File

@ -31,6 +31,28 @@ getUrlParameters = function() {
return map;
}
/*
* From: http://stackoverflow.com/questions/1634748/how-can-i-delete-a-query-string-parameter-in-javascript/4827730#4827730
*/
removeUrlParameter = function(url, param) {
var urlparts= url.split('?');
if (urlparts.length>=2) {
var prefix= encodeURIComponent(param)+'=';
var pars= urlparts[1].split(/[&;]/g);
for (var i=pars.length; i-- > 0;) {
if (pars[i].indexOf(prefix, 0)==0)
pars.splice(i, 1);
}
if (pars.length > 0) {
return urlparts[0]+'?'+pars.join('&');
} else {
return urlparts[0];
}
} else {
return url;
}
}
/*
* Converts seconds to HH:MM:SS
* From: http://stackoverflow.com/questions/6312993/javascript-seconds-to-time-with-format-hhmmss#6313008
@ -47,6 +69,19 @@ secondsToHHMMSS = function(secs) {
return time;
}
secondsToYouTubeFormat = function(secs) {
var hours = Math.floor(secs / 3600);
var minutes = Math.floor((secs - (hours * 3600)) / 60);
var seconds = secs - (hours * 3600) - (minutes * 60);
var time = "";
if (hours > 0) {time += hours+"h";}
if (minutes > 0) {time += minutes+"m";}
if (seconds > 0) {time += seconds+"s";}
return time;
}
/*
* Full word version of the above function for screen readers
*/
@ -66,6 +101,11 @@ secondsToHHMMSSText = function(secs) {
return time;
}
replaceTimeOnUrl = function(secs) {
var newUrl = removeUrlParameter(document.URL, "t") + "&t=" + secondsToYouTubeFormat(secs);
window.history.replaceState({}, "", newUrl);
}
var params = getUrlParameters();
var MEETINGID = params['meetingId'];
var RECORDINGS = "/presentation/" + MEETINGID;
@ -104,6 +144,8 @@ setEventsOnThumbnail = function($thumb) {
$parent = $("#thumbnail-" + options.start).parent();
$parent.addClass("active");
$(".thumbnail-label", $parent).show();
animateToCurrentSlide();
},
onEnd: function( options ) {
$parent = $("#thumbnail-" + options.start).parent();
@ -115,9 +157,9 @@ setEventsOnThumbnail = function($thumb) {
// Click on thumbnail changes the slide in popcorn
$thumb.parent().on("click", function() {
goToSlide($thumb.attr("data-in"));
replaceTimeOnUrl($thumb.attr("data-in"));
});
// Mouse over/out to show/hide the label over the thumbnail
$wrapper = $thumb.parent();
$wrapper.on("mouseover", function() {
@ -130,6 +172,33 @@ setEventsOnThumbnail = function($thumb) {
});
}
$("input[name='autoscrollEnabled']").live('change', function() {
animateToCurrentSlide();
});
animateToCurrentSlide = function(force) {
force = typeof force !== 'undefined' ? force : false;
if (force || isAutoscrollEnabled()) {
var currentSlide = getCurrentSlide();
// animate the scroll of thumbnails to center the current slide
var thumbnailOffset = currentSlide.prop('offsetTop') - $("#thumbnails").prop('offsetTop') + (currentSlide.prop('offsetHeight') - $("#thumbnails").prop('offsetHeight')) / 2;
$("#thumbnails").animate({ scrollTop: thumbnailOffset }, 'slow');
}
}
isAutoscrollEnabled = function() {
return $("input[name='autoscrollEnabled']").is(':checked');
}
setAutoscrollEnabled = function(value) {
$('input[name=autoscrollEnabled]').attr('checked', value);
}
getCurrentSlide = function() {
return $(".thumbnail-wrapper.active");
}
/*
* Generates the list of thumbnails using shapes.svg
*/
@ -200,7 +269,6 @@ generateThumbnails = function() {
div.append(label);
div.append(hiddenDesc);
// $("#thumbnails").append(div);
imagesList.push(timeIn);
elementsMap[timeIn] = div;
@ -312,13 +380,6 @@ document.addEventListener( "DOMContentLoaded", function() {
theme: 'darkglass',
volumeSlider: 'vertical'
});
$('.acorn-controls').width('500');
$('.acorn-controls').position({
"my": "center top",
"at": "center bottom",
"of": '#playbackArea',
"collision": "none none"
});
}, false);
var secondsToWait = 0;