diff --git a/bigbluebutton-client/.gitignore b/bigbluebutton-client/.gitignore index 331d2ccc0d8034039b7e698e32fbb43e90c58d68..5a3aee9615f41b757515f863a2d3fb93b31ad7f5 100755 --- a/bigbluebutton-client/.gitignore +++ b/bigbluebutton-client/.gitignore @@ -2,7 +2,7 @@ .actionScriptProperties .flexProperties linker-report.xml -bin +bundles.txt client bbbResources.properties.* asdoc/ diff --git a/bigbluebutton-client/bin/.gitignore b/bigbluebutton-client/bin/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..f2c4ee513a971d1e1670eea8946649cc2b24fdd5 --- /dev/null +++ b/bigbluebutton-client/bin/.gitignore @@ -0,0 +1 @@ +*.* diff --git a/bigbluebutton-client/build.xml b/bigbluebutton-client/build.xml old mode 100644 new mode 100755 index 3927e5cc82743e06d90b646514c5729de11029cf..22de0c69a68871315fee9c0208b7c37fc598d7a1 --- a/bigbluebutton-client/build.xml +++ b/bigbluebutton-client/build.xml @@ -29,22 +29,129 @@ <property name="BREAKOUT" value="BreakoutModule" /> <property name="CLASSROOM_AUDIO" value="ClassroomAudioModule" /> <property name="SETTINGS" value="SettingsModule" /> + <property name="VIDEO_DOCK" value="VideodockModule" /> + + <xmlproperty file="${SRC_DIR}/conf/locales.xml" collapseAttributes="true"/> + <target name="init-ant-contrib"> <property name="ant-contrib.jar" location="${BASE_DIR}/build/lib/ant-contrib-0.6.jar"/> <taskdef resource="net/sf/antcontrib/antcontrib.properties" classpath="${ant-contrib.jar}"/> </target> - + + <target name="locales" depends="init-ant-contrib"> + <echo message="Checking if locale output dir exists"/> + <available file="${OUTPUT_DIR}/locale" type="file" property="locale.dir.present"/> + <if> + <equals arg1="${locale.dir.present}" arg2="true"/> + <then> + <echo message="Locale output dir exists. Deleting contents of ${OUTPUT_DIR}/locale"/> + <delete> + <fileset dir="${OUTPUT_DIR}/locale"> + <include name="**/*"/> + </fileset> + </delete> + </then> + <else> + <echo message="Locale output dir does not exists. Creating ${OUTPUT_DIR}/locale"/> + <mkdir dir="${OUTPUT_DIR}/locale"/> + </else> + </if> + + <echo message="Determining supported locales."/> + <foreach target="build-locale" param="supportedlocale"> + <path id="locales.path.ref"> + <dirset dir="${BASE_DIR}/locale"/> + </path> + </foreach> + </target> + <target name="branding" depends="init-ant-contrib"> <sequential> - <mxmlc file="${SRC_DIR}/branding/css/${themeFile}" output="${OUTPUT_DIR}/branding/css/${themeFile}.swf" debug="false" mxml.compatibility-version="3.0.0" swf-version="13" optimize="true"> + <mxmlc file="${SRC_DIR}/branding/css/${themeFile}" + output="${OUTPUT_DIR}/branding/css/${themeFile}.swf" + debug="false" + mxml.compatibility-version="3.0.0" + swf-version="13" + optimize="true"> </mxmlc> </sequential> </target> <target name="build-bbb-main-test" description="Compile BigBlueButton Main Test"> - <build-main src="${SRC_DIR}" target="${BBB_MAIN_TEST}" /> + <build-main src="${SRC_DIR}" target="${BBB_MAIN_TEST}" /> </target> + <target name="build-locale"> + <echo message="Locale dir is ${supportedlocale}. Extract locale name." /> + <basename property="locale.name" file="${supportedlocale}"/> + <echo message="Locale name is ${locale.name}"/> + + <sequential> + <echo message="Building ${locale.name}"/> + <available file="${LOCALE_DIR}/${locale.name}" type="dir" property="locale.dir.present"/> + <if> + <equals arg1="${locale.name}" arg2="locale"/> + <then> + <echo message="Somehow, the dirset for locales is passing the parent (${locale.name}) dir."/> + <echo message="We don't want it, so we need to skip it."/> + </then> + <else> + <if> + <equals arg1="${locale.dir.present}" arg2="true"/> + <then> + <echo message="We already have a copy of the framework locale. No need to copy ${LOCALE_DIR}/${locale.name}"/> + </then> + <else> + <echo message="No copy of the framework locale. Copying ${LOCALE_DIR}/${locale.name}"/> + <exec vmlauncher="true" executable="copylocale"> + <arg value="en_US"/> + <arg value="${locale.name}"/> + </exec> + </else> + </if> + <echo message="Compiling locale ${locale.name}"/> + <compileLocale locale="${locale.name}" /> + </else> + </if> + </sequential> + </target> + + <macrodef name="compileLocale" description="Compiles the Resource package for the given locale"> + <attribute name="locale" default="en_US"/> + <sequential> + <echo message="Start building @{locale}"/> + <echo message="**********************************************"/> + <echo message="* Did you check bundles.txt and made *"/> + <echo message="* all resources listed here? *"/> + <echo message="**********************************************"/> + <!-- Invoke MXMLC --> + <mxmlc output="${OUTPUT_DIR}/locale/@{locale}_resources.swf"> + <locale>@{locale}</locale> + <target-player>10.3.0</target-player> + <source-path path-element="locale/{locale}"/> + + <!-- + Look into bundles.txt to find out what resources to include here. + http://forums.adobe.com/thread/758619 + ralam - sept 20, 2011 + --> + <include-resource-bundles>bbbResources</include-resource-bundles> + <include-resource-bundles>collections</include-resource-bundles> + <include-resource-bundles>containers</include-resource-bundles> + <include-resource-bundles>controls</include-resource-bundles> + <include-resource-bundles>core</include-resource-bundles> + <include-resource-bundles>effects</include-resource-bundles> + <include-resource-bundles>logging</include-resource-bundles> + <include-resource-bundles>messaging</include-resource-bundles> + <include-resource-bundles>modules</include-resource-bundles> + <include-resource-bundles>rpc</include-resource-bundles> + <include-resource-bundles>skins</include-resource-bundles> + <include-resource-bundles>styles</include-resource-bundles> + <source-path path-element="${FLEX_HOME}/frameworks"/> + </mxmlc> + </sequential> + </macrodef> + <target name="build-bbb-main" description="Compile BigBlueButton Main"> <build-main src="${SRC_DIR}" target="${BBB_MAIN}" /> @@ -110,7 +217,11 @@ <target name="build-video" description="Compile Video Module"> <build-module src="${SRC_DIR}" target="${VIDEO}" /> </target> - + + <target name="build-videodock" description="Compile Video Dock Module"> + <build-module src="${SRC_DIR}" target="${VIDEO_DOCK}" /> + </target> + <target name="build-whiteboard" description="Compile Whiteboard Module"> <build-module src="${SRC_DIR}" target="${WHITEBOARD}" /> </target> @@ -127,7 +238,7 @@ <!-- just a grouping of modules to compile --> <target name="build-deskshare-phone-video-whiteboard-dyn" - depends="build-deskshare, build-phone, build-video, build-whiteboard, build-dyn, build-classroom-audio, build-settings" + depends="build-deskshare, build-phone, build-video, build-videodock, build-whiteboard, build-dyn, build-classroom-audio, build-settings" description="Compile deskshare, phone, video, whiteboard, dynamic info modules"> </target> @@ -141,6 +252,14 @@ <target-player>10.3.0</target-player> <load-config filename="@{flex}/frameworks/flex-config.xml" /> <source-path path-element="@{flex}/frameworks" /> + + <!-- + Dump out resources to find out what resources to include building the locales. + http://forums.adobe.com/thread/758619 + ralam - sept 20, 2011 + --> + <resource-bundle-list>bundles.txt</resource-bundle-list> + <compiler.library-path dir="@{flex}/frameworks" append="true"> <include name="libs" /> <include name="../bundles/{locale}" /> @@ -153,6 +272,11 @@ <default-size width="500" height="600" /> </mxmlc> + <echo message="**********************************************"/> + <echo message="* Generated bundles.txt *"/> + <echo message="* Make sure you include all resources listed *"/> + <echo message="* in the file when building the locales. *"/> + <echo message="**********************************************"/> </sequential> </macrodef> @@ -220,10 +344,10 @@ <fileset dir="${PROD_RESOURCES_DIR}/assets/" /> </copy> <copy todir="${OUTPUT_DIR}/swfobject/" > - <fileset dir="${BASE_DIR}/src/swfobject/" /> + <fileset dir="${PROD_RESOURCES_DIR}/swfobject" /> </copy> - <copy todir="${OUTPUT_DIR}/locale" > - <fileset dir="${BASE_DIR}/locale/" /> + <copy todir="${OUTPUT_DIR}/lib/" > + <fileset dir="${PROD_RESOURCES_DIR}/lib"/> </copy> <copy file="${PROD_RESOURCES_DIR}/BigBlueButtonTest.html" todir="${OUTPUT_DIR}" overwrite="true"/> <copy file="${PROD_RESOURCES_DIR}/BigBlueButton.html" todir="${OUTPUT_DIR}" overwrite="true"/> @@ -231,12 +355,6 @@ <copy file="${PROD_RESOURCES_DIR}/bbb.gif" todir="${OUTPUT_DIR}" overwrite="true"/> <copy file="${PROD_RESOURCES_DIR}/locales.xml" todir="${OUTPUT_DIR}/conf" overwrite="true"/> <copy file="${PROD_RESOURCES_DIR}/example-info-data.xml" todir="${OUTPUT_DIR}/conf" overwrite="true"/> - <copy file="${PROD_RESOURCES_DIR}/jquery-1.5.1.min.js" todir="${OUTPUT_DIR}" overwrite="true" /> - <copy file="${PROD_RESOURCES_DIR}/bigbluebutton.js" todir="${OUTPUT_DIR}" overwrite="true"/> - <copy file="${PROD_RESOURCES_DIR}/deployJava.js" todir="${OUTPUT_DIR}" overwrite="true"/> - <copy file="${PROD_RESOURCES_DIR}/bbb_blinker.js" todir="${OUTPUT_DIR}" overwrite="true"/> - <copy file="${PROD_RESOURCES_DIR}/bbb_deskshare.js" todir="${OUTPUT_DIR}" overwrite="true"/> - <copy file="${PROD_RESOURCES_DIR}/bbb_localization.js" todir="${OUTPUT_DIR}" overwrite="true"/> <if> <equals arg1="${BUILD_ENV}" arg2="DEV"/> <then> @@ -301,8 +419,16 @@ </target> <target name="clean"> - <delete dir="${OUTPUT_DIR}" /> - <mkdir dir="${OUTPUT_DIR}"/> + <delete> + <fileset dir="${OUTPUT_DIR}" > + <exclude name="locale/*.swf"/> + <exclude name=".gitignore"/> + </fileset> + <dirset dir="${OUTPUT_DIR}"> + <include name="**/*"/> + <exclude name="locale"/> + </dirset> + </delete> </target> <!-- NOTE: compile-deskshare-standalone MUST come first before compile-bbb as we need the deskshare-standalone diff --git a/bigbluebutton-client/config/bigbluebutton.nginx b/bigbluebutton-client/config/bigbluebutton.nginx index f169df0ed181e6e91acb7a8e36fc2f2f03cdefee..21145ace3a62c329bbffdc7a63ced657e260be1a 100644 --- a/bigbluebutton-client/config/bigbluebutton.nginx +++ b/bigbluebutton-client/config/bigbluebutton.nginx @@ -7,7 +7,7 @@ server { # Handle RTMPT (RTMP Tunneling). Forwards requests # to Red5 on port 8088. location ~ (/open/|/close/|/idle/|/send/) { - proxy_pass http://127.0.0.1:8088; + proxy_pass http://127.0.0.1:5080; proxy_redirect off; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; diff --git a/bigbluebutton-client/locale/bg_BG/bbbResources.properties b/bigbluebutton-client/locale/bg_BG/bbbResources.properties index edf99daab426364dbcc2360736e6cbeea33292ef..2cf803939f591727076418442f5079d0abe7cd41 100755 --- a/bigbluebutton-client/locale/bg_BG/bbbResources.properties +++ b/bigbluebutton-client/locale/bg_BG/bbbResources.properties @@ -73,7 +73,6 @@ bbb.presentation.uploaded = заредено. bbb.mainshell.logBtn.toolTip = Отвори Дневник Прозорецът bbb.desktopPublish.stop.tooltip = Затвори екрана за ÑподелÑне bbb.presentation.uploadwindow.excel = EXCEL -bbb.micSettings.micActivity = Микрофон bbb.settings.voice.volume = Микрофон bbb.logout.unknown = ВашиÑÑ‚ клиент е загубил връзка ÑÑŠÑ Ñървъра bbb.presentation.slideNumLbl.toolTip = Кликнете, за да изберете Ñлайда diff --git a/bigbluebutton-client/locale/bn_BN/bbbResources.properties b/bigbluebutton-client/locale/bn_BN/bbbResources.properties index f8193710c0d8a940f620479f509f07a0fb27d9ff..4abc0ff56bc4512fdf630ba636a2fa15841748a6 100755 --- a/bigbluebutton-client/locale/bn_BN/bbbResources.properties +++ b/bigbluebutton-client/locale/bn_BN/bbbResources.properties @@ -73,7 +73,6 @@ bbb.presentation.uploaded = আপলোড হয়েছে। bbb.mainshell.logBtn.toolTip = লগ উইনà§à¦¡à§‹à¦Ÿà¦¿ খà§à¦²à§à¦¨ bbb.desktopPublish.stop.tooltip = সà§à¦•à§à¦°à§€à¦¨ শেয়ার বনà§à¦§ করà§à¦¨ bbb.presentation.uploadwindow.excel = EXCEL -bbb.micSettings.micActivity = মাইকà§à¦°à§‹à¦«à§‹à¦¨ সকà§à¦°à¦¿à¦¯à¦¼à¦¤à¦¾ bbb.settings.voice.volume = মাইকà§à¦°à§‹à¦«à§‹à¦¨ সকà§à¦°à¦¿à¦¯à¦¼à¦¤à¦¾ bbb.logout.unknown = আপনার গà§à¦°à¦¾à¦¹à¦• সারà§à¦à¦¾à¦°à§‡à¦° সঙà§à¦—ে সংযোগ হারিয়েছে bbb.presentation.slideNumLbl.toolTip = সà§à¦²à¦¾à¦‡à¦¡ নিরà§à¦¬à¦¾à¦šà¦¨ করতে কà§à¦²à¦¿à¦• করà§à¦¨ diff --git a/bigbluebutton-client/locale/da_DK/bbbResources.properties b/bigbluebutton-client/locale/da_DK/bbbResources.properties index 98f7d574e363835e55a535c450c5afab025f665a..ed7080619712d465deaa96e1d75fc18c1ae0416e 100755 --- a/bigbluebutton-client/locale/da_DK/bbbResources.properties +++ b/bigbluebutton-client/locale/da_DK/bbbResources.properties @@ -73,7 +73,6 @@ bbb.presentation.uploaded = uploaded. bbb.mainshell.logBtn.toolTip = Ã…bn log-vinduet bbb.desktopPublish.stop.tooltip = Luk skærmdeling bbb.presentation.uploadwindow.excel = EXCEL -bbb.micSettings.micActivity = Mikrofonaktivitet bbb.settings.voice.volume = Mikrofonaktivitet bbb.logout.unknown = Din klient mistede forbindelsen til serveren bbb.presentation.slideNumLbl.toolTip = Klik for at vælge en slide diff --git a/bigbluebutton-client/locale/de_DE/bbbResources.properties b/bigbluebutton-client/locale/de_DE/bbbResources.properties index 79d98c7a6b634c6baad106227abe179623baa443..758654219c85947c34b1f5f5378ea9dccb7a19c2 100755 --- a/bigbluebutton-client/locale/de_DE/bbbResources.properties +++ b/bigbluebutton-client/locale/de_DE/bbbResources.properties @@ -73,7 +73,6 @@ bbb.presentation.uploaded = hochgeladen. bbb.mainshell.logBtn.toolTip = Öffne Protokoll Fenster bbb.desktopPublish.stop.tooltip = Screen share schliessen bbb.presentation.uploadwindow.excel = EXCEL -bbb.micSettings.micActivity = Mikrophon Aktivität bbb.settings.voice.volume = Mikrophon Aktivität bbb.logout.unknown = Die Verbindung zwisch Ihrem Client und dem Server wurde abgebrochen bbb.presentation.slideNumLbl.toolTip = Klicken um eine Folie auszuwählen diff --git a/bigbluebutton-client/locale/en_US/bbbResources.properties b/bigbluebutton-client/locale/en_US/bbbResources.properties index 8eb0d3f841af9335b05129f122bc30c141f37861..4b527d5c5d7c46dc9e2576522fd4cb35379e07a4 100755 --- a/bigbluebutton-client/locale/en_US/bbbResources.properties +++ b/bigbluebutton-client/locale/en_US/bbbResources.properties @@ -122,6 +122,9 @@ bbb.publishVideo.title = Share your webcam bbb.publishVideo.startPublishBtn.toolTip = Start Sharing bbb.video.publish.close.tooltip = Stop sharing your video bbb.video.publish.close.label = Close +bbb.video.keepAspectBtn.tooltip = Keep window aspect +bbb.video.fitVideoBtn.tooltip = Fit video +bbb.video.originalSizeBtn.tooltip = Original size # Desktop Sharing bbb.desktopPublish.title = Desktop Sharing: Presenter's Preview @@ -183,3 +186,5 @@ bbb.settings.warning.label = Warning bbb.settings.warning.close = Close this Warning bbb.settings.noissues = No outstanding issues have been detected. bbb.settings.instructions = Accept the Flash prompt that asks you for camera permissions. If you can see yourself and hear yourself, your browser has been set up correctly. Other potentials issues are shown bellow. Click on each to find a possible solution. + +bbb.videodock.title = Video dock \ No newline at end of file diff --git a/bigbluebutton-client/locale/es_ES/bbbResources.properties b/bigbluebutton-client/locale/es_ES/bbbResources.properties index 0976455e028d6621f616e86eb9a41699b12730a1..072ba2ce162b824b084d776d9f081a9fcd866d0f 100755 --- a/bigbluebutton-client/locale/es_ES/bbbResources.properties +++ b/bigbluebutton-client/locale/es_ES/bbbResources.properties @@ -73,7 +73,6 @@ bbb.presentation.uploaded = cargado. bbb.mainshell.logBtn.toolTip = Abrir ventana de histórico bbb.desktopPublish.stop.tooltip = Detener la compartición de pantalla bbb.presentation.uploadwindow.excel = EXCEL -bbb.micSettings.micActivity = Actividad del micrófono bbb.settings.voice.volume = Actividad del micrófono bbb.logout.unknown = Se ha perdido la conexión con el servidor bbb.presentation.slideNumLbl.toolTip = Pulsa para selecionar una página diff --git a/bigbluebutton-client/locale/es_LA/bbbResources.properties b/bigbluebutton-client/locale/es_LA/bbbResources.properties index 6ddea207a4df0ca5a6554b4cdf0a89560fcff8dc..23ba6b9fac99cce4fe1301408e0dbe67450cd71e 100755 --- a/bigbluebutton-client/locale/es_LA/bbbResources.properties +++ b/bigbluebutton-client/locale/es_LA/bbbResources.properties @@ -73,7 +73,6 @@ bbb.presentation.uploaded = cargado. bbb.mainshell.logBtn.toolTip = Abrir la ventana de Registro (Log) bbb.desktopPublish.stop.tooltip = Cerrar ventana compartida bbb.presentation.uploadwindow.excel = EXCEL -bbb.micSettings.micActivity = Actividad del Micrófono bbb.settings.voice.volume = Actividad del Micrófono bbb.logout.unknown = Su cliente ha perdido conexión con el servidor bbb.presentation.slideNumLbl.toolTip = Clic para seleccionar una diapositiva diff --git a/bigbluebutton-client/locale/eu_EU/bbbResources.properties b/bigbluebutton-client/locale/eu_EU/bbbResources.properties index bac19694c52f5877e2ed3a22ef33f16a92029259..b0ebf731b825c09aa38e7dcc1b380ec2a2519e34 100644 --- a/bigbluebutton-client/locale/eu_EU/bbbResources.properties +++ b/bigbluebutton-client/locale/eu_EU/bbbResources.properties @@ -73,7 +73,6 @@ bbb.presentation.uploaded = igota. bbb.mainshell.logBtn.toolTip = Zabaldu agerraldien leihoa bbb.desktopPublish.stop.tooltip = Itxi pantailaren partekatzea bbb.presentation.uploadwindow.excel = EXCEL -bbb.micSettings.micActivity = Mikrofonoaren jarduera bbb.settings.voice.volume = Mikrofonoaren jarduera bbb.logout.unknown = Zure berezioak galdu du zerbitzari honekiko konexioa bbb.presentation.slideNumLbl.toolTip = Sakatu diapositiba bat aukeratzeko diff --git a/bigbluebutton-client/locale/fa_IR/bbbResources.properties b/bigbluebutton-client/locale/fa_IR/bbbResources.properties index 49c71d8752320839ccdbdd925fd9105d2a0c8039..c79004a9f3346514c5350b828f9c1023ac9a2338 100755 --- a/bigbluebutton-client/locale/fa_IR/bbbResources.properties +++ b/bigbluebutton-client/locale/fa_IR/bbbResources.properties @@ -73,7 +73,6 @@ bbb.presentation.uploaded = بارگزاري شد. bbb.mainshell.logBtn.toolTip = مشاهده ÛŒ پنجره ÛŒ ثبت وقایع bbb.desktopPublish.stop.tooltip = بستن پنجره اشتراک صÙØÙ‡ bbb.presentation.uploadwindow.excel = اکسل -bbb.micSettings.micActivity = Ùعالیت میکروÙÙ† bbb.settings.voice.volume = Ùعالیت میکروÙÙ† bbb.logout.unknown = اتصال کلاینت شما از سرور قطع شده است bbb.presentation.slideNumLbl.toolTip = جهت انتخاب یک اسلاید خاص کليک کنيد diff --git a/bigbluebutton-client/locale/fr_FR/bbbResources.properties b/bigbluebutton-client/locale/fr_FR/bbbResources.properties index 91c1e358b69f2622b5d3b1689860c2bbf5739a40..be1f4de64476546a6e7ab1a226b0e018c4253629 100755 --- a/bigbluebutton-client/locale/fr_FR/bbbResources.properties +++ b/bigbluebutton-client/locale/fr_FR/bbbResources.properties @@ -73,7 +73,6 @@ bbb.presentation.uploaded = envoyé. bbb.mainshell.logBtn.toolTip = Ouvrir la fenêtre de log bbb.desktopPublish.stop.tooltip = Fermer le partage d'écran bbb.presentation.uploadwindow.excel = EXCEL -bbb.micSettings.micActivity = Activité du microphone bbb.settings.voice.volume = Activité du microphone bbb.logout.unknown = Votre client a perdu la connexion avec le serveur bbb.presentation.slideNumLbl.toolTip = Cliquez pour sélectionner une page diff --git a/bigbluebutton-client/locale/id_ID/bbbResources.properties b/bigbluebutton-client/locale/id_ID/bbbResources.properties index f4de9388aeae2279712feecae810054b995c395e..ded2d2eddf4ba20cff8da15a3f16543431a8970f 100644 --- a/bigbluebutton-client/locale/id_ID/bbbResources.properties +++ b/bigbluebutton-client/locale/id_ID/bbbResources.properties @@ -73,7 +73,6 @@ bbb.presentation.uploaded = Telah terunggah bbb.mainshell.logBtn.toolTip = Buka Jendela Log bbb.desktopPublish.stop.tooltip = Tutup layar berbagi bbb.presentation.uploadwindow.excel = EXCEL -bbb.micSettings.micActivity = Aktifitas Mikrofon bbb.settings.voice.volume = Aktifitas Mikrofon bbb.logout.unknown = Klien anda telah kehilangan hubungan ke server. bbb.presentation.slideNumLbl.toolTip = Klik untuk pilih slide diff --git a/bigbluebutton-client/locale/it_IT/bbbResources.properties b/bigbluebutton-client/locale/it_IT/bbbResources.properties index d5f92e265be7ae0cfb996773d95fc68a2e3245df..89391ee7fd386519bc160dbf42ee8c71440e6533 100755 --- a/bigbluebutton-client/locale/it_IT/bbbResources.properties +++ b/bigbluebutton-client/locale/it_IT/bbbResources.properties @@ -73,7 +73,6 @@ bbb.presentation.uploaded = Caricato. bbb.mainshell.logBtn.toolTip = Apri finestra Log bbb.desktopPublish.stop.tooltip = Chiudi la condivisione dello schermo bbb.presentation.uploadwindow.excel = EXCEL -bbb.micSettings.micActivity = Attività del microfono bbb.settings.voice.volume = Attività del microfono bbb.logout.unknown = Hai perso la connessione con il server bbb.presentation.slideNumLbl.toolTip = Clicca per selezionare una diapositiva diff --git a/bigbluebutton-client/locale/mn_MN/bbbResources.properties b/bigbluebutton-client/locale/mn_MN/bbbResources.properties index bc3bafe79e86fe68e23661cb5f9576b09f79c831..5c7621018b1801db95427af5f4e9c74661a16710 100644 --- a/bigbluebutton-client/locale/mn_MN/bbbResources.properties +++ b/bigbluebutton-client/locale/mn_MN/bbbResources.properties @@ -2,16 +2,16 @@ bbb.logout.usercommand = Та конференÑÑÑÑ Ð³Ð°Ñ€Ð»Ð°Ð° bbb.settings.flash.command = Ð¨Ð¸Ð½Ñ Ð¤Ð»Ð°Ñˆ Ñуулгах bbb.oldlocalewindow.reminder2 = хөтөчийнхөө каш - ийг цÑвÑрлÑÐ½Ñ Ò¯Ò¯ bbb.presentation.maxUploadFileExceededAlert = Ðлдаа: Файлын Ñ…ÑмжÑÑ Ñ…ÑÑ‚ÑÑ€ÑÑн байна -bbb.logout.invalidapp = Улаан5 програм байхгүй байна +bbb.logout.invalidapp = Ред5 про байхгүй байна bbb.fileupload.title = Танилцуулга илгÑÑÑ… bbb.chat.publicMsgAwaiting2 = Ðийтийн захидал хүлÑÑж байна bbb.viewers.viewersGrid.roleItemRenderer = ҮүрÑг bbb.oldlocalewindow.windowTitle = Ðнхааруулга: ХуучирÑан толь байна bbb.presentation.converted = {1} -Ñ {0} хуудÑыг хөрвүүллÑÑ bbb.viewers.presentBtn.toolTip = Вебд оролцогчийг танилцуулагч болгох -bbb.viewers.viewersGrid.statusItemRenderer.streamIcon.toolTip = Ðд дараад харах. +bbb.viewers.viewersGrid.statusItemRenderer.streamIcon.toolTip = Харах bbb.highlighter.toolbar.undo = Ð¥ÑлбÑрт буцаах -bbb.desktopPublish.minimizeBtn.toolTip = ÐÐ½Ñ Ñ†Ð¾Ð½Ñ…Ð¸Ð¹Ð³ доош оруулах +bbb.desktopPublish.minimizeBtn.toolTip = Цонхыг нуух bbb.viewers.presentBtn.label = Танилцуулагчыг Ñолих bbb.viewers.kickUserBtn.toolTip = Ð¥ÑÑ€ÑглÑгчийг Ñ…Ó©Ó©Ñ… bbb.listeners.ejectTooltip = Ð¥ÑÑ€ÑглÑгчийг Ñ…Ó©Ó©Ñ… @@ -23,11 +23,11 @@ bbb.desktopPublish.region.tooltip = Өөрийнхөө дÑлгÑцийн тал bbb.presentation.error.convert.swf = ИлгÑÑÑÑн файлыг хөрвүүлÑÑ… Ñвцад алдаа гарлаа. ÐÐ½Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ñ‹Ð³ хариуцÑан ÑиÑтем админтай холбогдоно уу. bbb.fileupload.progBarLbl = Явц bbb.presentation.error.security = Ðууцлалын алдаа: СиÑтемийн админд хандана уу -bbb.desktopPublish.maximizeRestoreBtn.toolTip = Та ÑÐ½Ñ Ñ†Ð¾Ð½Ñ…Ð¸Ð¹Ð³ томруулж чадахгүй -bbb.listenerItem.nameLbl.toolTip = ÐÐ½Ñ Ñ…ÑÑ€ÑглÑгчийг Ñонгоод, дуугуй болгох -bbb.desktopPublish.region.label = Ð‘Ò¯Ñ Ð½ÑƒÑ‚Ð°Ð³ +bbb.desktopPublish.maximizeRestoreBtn.toolTip = Цонх томрох боломжгүй +bbb.listenerItem.nameLbl.toolTip = Ð¥ÑÑ€ÑглÑгчийн дууг хаах, нÑÑÑ… +bbb.desktopPublish.region.label = Ð¥ÑÑÑгчилÑн үзүүлÑÑ… bbb.chat.cmpColorPicker.toolTip = Бичгийн өнгө -bbb.listenerItem.muteUnmute.toolTip = ÐÐ½Ñ Ñ…ÑÑ€ÑглÑгчийг дуугуй болгох, дуутай болгох +bbb.listenerItem.muteUnmute.toolTip = Ð¥ÑÑ€ÑглÑгчийн дууг Хаах, ÐÑÑÑ… bbb.chat.chatOptions = Чат тохиргоо bbb.presentation.uploadwindow.closeLabel = Ок товчлуурыг дараад ÑÐ½Ñ Ñ†Ð¾Ð½Ñ…Ñ‹Ð³ нуух bbb.viewers.title = Ð¥ÑÑ€ÑглÑгчид {0} {1} @@ -38,7 +38,7 @@ bbb.fileupload.showBtn = ДүрÑлÑÑ… bbb.fileupload.fileLbl = Файл: bbb.listenerItem.talkImg.toolTip = Ярьж байна bbb.settings.warning.label = Ðнхаар -bbb.mainshell.copyrightLabel2 = (c), BigBlueButton буйлд {0} - Илүү ихийг http://www.bigbluebutton.org/ ÑÐ°Ð¹Ñ‚Ð°Ð°Ñ Ñ…Ð°Ñ€Ð½Ð° уу. +bbb.mainshell.copyrightLabel2 = ТомЦÑнхÑрТовчлуур Хувилбар {0} - Илүү ихийг Ñургуулийн ÑÐ°Ð¹Ñ‚Ð½Ð°Ð°Ñ Ð¾Ð»Ð¶ авна уу bbb.presentation.uploadwindow.powerpoint = POWERPOINT bbb.toolbar.video.toolTip = Миний камерийг түгÑÑ bbb.chat.publicMsgAwaiting = Ðийтийн захидал хүлÑÑж байна @@ -71,9 +71,8 @@ bbb.mainshell.locale.version = 0.71 bbb.chat.title = Чат bbb.presentation.uploaded = ИлгÑÑгдÑÑн bbb.mainshell.logBtn.toolTip = Лог цонхийг нÑÑÑ… -bbb.desktopPublish.stop.tooltip = ХувааÑан дÑлгÑцÑÑ Ñ…Ð°Ð°Ñ… +bbb.desktopPublish.stop.tooltip = Хаах bbb.presentation.uploadwindow.excel = EXCEL -bbb.micSettings.micActivity = Микрофонийн идÑвхи bbb.settings.voice.volume = Микрофонийн идÑвхи bbb.logout.unknown = Та ÑерверÑÑÑ Ñ…Ð¾Ð»Ð±Ð¾Ð¾ таÑарлаа bbb.presentation.slideNumLbl.toolTip = Ðнд дараад Ñ…ÑƒÑƒÐ´Ð°Ñ Ñолих @@ -81,10 +80,10 @@ bbb.settings.flash.text = Таньд флаш {0} ÑууÑан байна, Ð³Ñ bbb.highlighter.toolbar.rectangle = ТÑгш өнцөгт bbb.settings.voice.adjust = Дууг тохируулах bbb.presentation.uploadwindow.word = WORD -bbb.mainshell.statusProgress.loading = Модулийг {0} уншиж байна +bbb.mainshell.statusProgress.loading = Ðийт {0} Модуль байна bbb.presentation.error.io = Оролт гаралтийн алдаа: ÑиÑтем админд хандана уу. bbb.chat.sendBtn.toolTip = Захидал илгÑÑÑ… -bbb.highlighter.button.toolTipHide = Цагаан Ñамбарыг нуух +bbb.highlighter.button.toolTipHide = Самбарыг нуух bbb.settings.java.command = Ð¨Ð¸Ð½Ñ Ð–Ð°Ð²Ð° Ñуулгах bbb.mainToolbar.logoutBtn = Гарах bbb.chat.privateMsgAwaiting2 = Хувийн захидал хүлÑÑж байна @@ -99,7 +98,7 @@ bbb.publishVideo.startPublishBtn.toolTip = Хуваалтыг ÑхлүүлÑÑ… bbb.logout.connectionfailed = Сервер луу холбогдож чадÑангүй bbb.settings.isight.text = Таны iSight камерт Ñмар нÑгÑн проблем байгаа бол, ÐÐ½Ñ Ð½ÑŒ магадгүй та OS X 10.6.5 үйлдлийн ÑиÑтем дÑÑÑ€ ажиллаж байна. ÐÐ½Ñ Ð°Ð»Ð´Ð°Ð°Ð³ ÑийрүүлÑхийн тулд та Ñнд линкÑн дÑÑÑ€ дараад ÑˆÐ¸Ð½Ñ Ð°Ð´Ð¾Ð±Ðµ флаш плÑур татаж авна уу. bbb.highlighter.toolbar.clear = ХуудаÑыг цÑвÑрлÑÑ… -bbb.toolbar.phone.toolTip = Миний микрофонийг буÑдад тараах +bbb.toolbar.phone.toolTip = Миний микрофоныг түгÑÑ bbb.chat.privateChatSelect = Хувийн талаар чатлах хүнÑÑ Ñонгоно уу bbb.micSettings.cancel = Болих bbb.fileupload.okCancelBtn = Болих @@ -109,7 +108,7 @@ bbb.logout.asyncerror = Дуу дүрÑийг дамжуулах үед алда bbb.presentation.presenterNameLbl = {0} хүн танилцуулга хийж байна bbb.chat.privateMsgAwaiting = Хувийн захидал ирÑÑн байна bbb.desktopView.fitToWindow = Цонхонд тохируулах -bbb.highlighter.toolbar.pencil = Харандаа +bbb.highlighter.toolbar.pencil = Тодруулагч bbb.mainshell.statusProgress.connecting = Сервер луу холбогдож байна. bbb.listenerItem.lockImg.toolTip = Ðнд дараад өөрийгөө дуугуй болгох, дуутай болгох bbb.listeners.unmuteAllBtn.toolTip = Бүгдийг дуутай болгох @@ -143,4 +142,4 @@ bbb.highlighter.toolbar.thickness = Үе давхраа Ñолих bbb.presentation.uploadwindow.presentationfile = Танилцуулга файл bbb.viewers.raiseHandBtn.toolTip = Ðнд дараад гараа өргөнө Ò¯Ò¯ bbb.presentation.error.convert.format = Ðлдаа: Таны илгÑÑÑÑн файл буруу өргөтгөлтÑй байна -bbb.desktopPublish.fullscreen.label = ДÑлгÑцÑнд бүтнÑÑÑ€ гаргах +bbb.desktopPublish.fullscreen.label = БүтнÑÑÑ€ diff --git a/bigbluebutton-client/locale/nb_NO/bbbResources.properties b/bigbluebutton-client/locale/nb_NO/bbbResources.properties index 29dff72b96fc9f4c0291db2be55e28965168250e..d99424cd62e2a2deedc46449492ef38fa8f169a9 100755 --- a/bigbluebutton-client/locale/nb_NO/bbbResources.properties +++ b/bigbluebutton-client/locale/nb_NO/bbbResources.properties @@ -73,7 +73,6 @@ bbb.presentation.uploaded = lastet opp. bbb.mainshell.logBtn.toolTip = Ã…pne loggvindu bbb.desktopPublish.stop.tooltip = Lukk skjermdeling bbb.presentation.uploadwindow.excel = EXCEL -bbb.micSettings.micActivity = Mikrofonaktivitet bbb.settings.voice.volume = Mikrofonaktivitet bbb.logout.unknown = Din klient har mistet forbindelsen til serveren bbb.presentation.slideNumLbl.toolTip = Klikk for Ã¥ velge et lysark diff --git a/bigbluebutton-client/locale/nl_NL/bbbResources.properties b/bigbluebutton-client/locale/nl_NL/bbbResources.properties index e384dc96aa7d87976aded89a34d85875ec21ef38..23bcb494e44cc9567c12adb9a2838577d1455ede 100644 --- a/bigbluebutton-client/locale/nl_NL/bbbResources.properties +++ b/bigbluebutton-client/locale/nl_NL/bbbResources.properties @@ -72,7 +72,6 @@ bbb.presentation.uploaded = verstuurd. bbb.mainshell.logBtn.toolTip = Open log scherm bbb.desktopPublish.stop.tooltip = Sluit het delen van uw scherm bbb.presentation.uploadwindow.excel = EXCEL -bbb.micSettings.micActivity = Microfoon activiteit bbb.settings.voice.volume = Microfoon activiteit bbb.logout.unknown = Uw toepassing heeft de connectie met de server verbroken bbb.presentation.slideNumLbl.toolTip = Klik om een slide te selecteren. diff --git a/bigbluebutton-client/locale/pl_PL/bbbResources.properties b/bigbluebutton-client/locale/pl_PL/bbbResources.properties index 30f669e5e79e1415f70eb506d52f8677eecc7c70..8ad751ed1707e17b310fbc3c09851d58ea8ce85e 100755 --- a/bigbluebutton-client/locale/pl_PL/bbbResources.properties +++ b/bigbluebutton-client/locale/pl_PL/bbbResources.properties @@ -73,7 +73,6 @@ bbb.presentation.uploaded = Wgrane na serwer. bbb.mainshell.logBtn.toolTip = Otwórz okno dziennika bbb.desktopPublish.stop.tooltip = Zamknij współdzielenie bbb.presentation.uploadwindow.excel = EXCEL -bbb.micSettings.micActivity = Uaktywnij mikrofon bbb.settings.voice.volume = Uaktywnij mikrofon bbb.logout.unknown = Klient straciÅ‚ poÅ‚Ä…czenie z serwerem bbb.presentation.slideNumLbl.toolTip = Kliknij podwójnie, aby wyÅ›wietlić slajd diff --git a/bigbluebutton-client/locale/pt_BR/bbbResources.properties b/bigbluebutton-client/locale/pt_BR/bbbResources.properties index c31a7a838f1510dae12b7ca69e6a425faf9e0c36..60620a140ec784210d3647af34e63a0d3851c58a 100644 --- a/bigbluebutton-client/locale/pt_BR/bbbResources.properties +++ b/bigbluebutton-client/locale/pt_BR/bbbResources.properties @@ -73,7 +73,6 @@ bbb.presentation.uploaded = Enviado. bbb.mainshell.logBtn.toolTip = Abrir Janela de Registro bbb.desktopPublish.stop.tooltip = Fechar compartilhamento de tela bbb.presentation.uploadwindow.excel = EXCEL -bbb.micSettings.micActivity = Atividade no microfone bbb.settings.voice.volume = Atividade no microfone bbb.logout.unknown = Seu cliente perdeu conexão com o servidor bbb.presentation.slideNumLbl.toolTip = Cique para selecionar um slide diff --git a/bigbluebutton-client/locale/pt_PT/bbbResources.properties b/bigbluebutton-client/locale/pt_PT/bbbResources.properties index 7505ad438a3d67d2d9362c3b0c4b4ab3c68a8a70..168cfc06ec382b8ebdfd51ad7ed6a95b98d12aaa 100755 --- a/bigbluebutton-client/locale/pt_PT/bbbResources.properties +++ b/bigbluebutton-client/locale/pt_PT/bbbResources.properties @@ -70,7 +70,6 @@ bbb.presentation.uploaded = Enviado. bbb.mainshell.logBtn.toolTip = Abrir janela de registo bbb.desktopPublish.stop.tooltip = Fechar partilha de ecrã bbb.presentation.uploadwindow.excel = EXCEL -bbb.micSettings.micActivity = Actividade de Microfone bbb.settings.voice.volume = Actividade de Microfone bbb.toolbar.video.toolTip = Iniciar a sua webcam bbb.presentation.slideNumLbl.toolTip = Pressione para seleccionar um slide diff --git a/bigbluebutton-client/locale/ro_RO/bbbResources.properties b/bigbluebutton-client/locale/ro_RO/bbbResources.properties index 5411d72a60f31dd4e7245b078143f12d8a075f6d..c5b3c1381bab37945dcc550b80dd120c26e4003d 100755 --- a/bigbluebutton-client/locale/ro_RO/bbbResources.properties +++ b/bigbluebutton-client/locale/ro_RO/bbbResources.properties @@ -68,7 +68,6 @@ bbb.chat.title = Chat bbb.presentation.uploaded = încărcat. bbb.mainshell.logBtn.toolTip = AfiÅŸaÅ£i Jurnalul bbb.presentation.uploadwindow.excel = EXCEL -bbb.micSettings.micActivity = Activitate Microfon bbb.settings.voice.volume = Activitate Microfon bbb.logout.unknown = Clientul dumneavoastră a pierdut conexiunea cu serverul bbb.presentation.slideNumLbl.toolTip = Click pentru a selecta un slide diff --git a/bigbluebutton-client/locale/ru_RU/bbbResources.properties b/bigbluebutton-client/locale/ru_RU/bbbResources.properties index 92461cc414a6169e0af32e8f382ddd769ce07149..1582b590ad93e1ab35659a886b908576a3f9a87e 100755 --- a/bigbluebutton-client/locale/ru_RU/bbbResources.properties +++ b/bigbluebutton-client/locale/ru_RU/bbbResources.properties @@ -73,7 +73,6 @@ bbb.presentation.uploaded = загружено. bbb.mainshell.logBtn.toolTip = Открыть окно журнала bbb.desktopPublish.stop.tooltip = Закрыть транÑлÑцию Ñкрана bbb.presentation.uploadwindow.excel = Таблица Excel -bbb.micSettings.micActivity = ÐктивноÑÑ‚ÑŒ микрофона bbb.settings.voice.volume = ÐктивноÑÑ‚ÑŒ микрофона bbb.logout.unknown = Соединение Ñ Ñервером потерÑно bbb.presentation.slideNumLbl.toolTip = Щёлкните Ð´Ð»Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð° Ñлайда diff --git a/bigbluebutton-client/locale/sr_RS/bbbResources.properties b/bigbluebutton-client/locale/sr_RS/bbbResources.properties index 1840cb0a705f5ba3168bde70b82ec8ac5322552c..4b832ea334f98de5ba3fd1f6ea15db60bc981fb0 100755 --- a/bigbluebutton-client/locale/sr_RS/bbbResources.properties +++ b/bigbluebutton-client/locale/sr_RS/bbbResources.properties @@ -1,11 +1,12 @@ bbb.logout.usercommand = UspeÅ¡no ste izaÅ¡li iz konferencije +bbb.settings.flash.command = Instaliraj najnoviji Flash bbb.oldlocalewindow.reminder2 = Molimo ispraznite keÅ¡ pretraživaÄa i pokuÅ¡ajte ponovo. bbb.presentation.maxUploadFileExceededAlert = GreÅ¡ka: Datoteka je veća od dozvoljene. bbb.logout.invalidapp = red5 aplikacija ne postoji bbb.fileupload.title = Prebaci prezentaciju bbb.chat.publicMsgAwaiting2 = * Javna poruka na Äekanju * bbb.viewers.viewersGrid.roleItemRenderer = Uloga -bbb.oldlocalewindow.windowTitle = Warning: Staru verziju prevoda +bbb.oldlocalewindow.windowTitle = Upozorenje: Stara verzija prevoda bbb.presentation.converted = Konvertiran {0} od {1} slajdova. bbb.viewers.presentBtn.toolTip = Izaberi korisnika da bude prezentator. bbb.viewers.viewersGrid.statusItemRenderer.streamIcon.toolTip = Klikni da vidiÅ¡. @@ -16,6 +17,7 @@ bbb.viewers.kickUserBtn.toolTip = Izbaci korisnika bbb.listeners.ejectTooltip = Izbaci korisnika bbb.presentation.uploadcomplete = Prebacivanje kompletno. Molimo saÄekajte dok se dokument konvertuje. bbb.viewers.viewersGrid.statusItemRenderer.raiseHand.toolTip = Podigli su ruke {0} +bbb.mainToolbar.settingsBtn.toolTip = Otvori podeÅ¡avanja bbb.desktopView.actualSize = Prikaži trenutnu veliÄinu bbb.desktopPublish.region.tooltip = Podeli deo tvog prozora bbb.presentation.error.convert.swf = GreÅ¡ka prilikom konvertovanja prebaÄenog dokumenta. Molimo kontaktirajte administratora. @@ -28,16 +30,19 @@ bbb.chat.cmpColorPicker.toolTip = Boja teksta bbb.listenerItem.muteUnmute.toolTip = Ućutkaj ili dozvoli da priÄa ovaj korisnik. bbb.chat.chatOptions = PodeÅ¡avanja ćaskanja bbb.presentation.uploadwindow.closeLabel = Kliknite OK da zatvorite prozor -bbb.viewers.title = Users{0} {1} +bbb.viewers.title = Korisnika {0} {1} +bbb.settings.flash.label = GreÅ¡ka u Flash verziji bbb.presentation.ok = OK bbb.mainToolbar.helpBtn = Pomoć bbb.fileupload.showBtn = Prikaži bbb.fileupload.fileLbl = Datoteka: -bbb.toolbar.deskshare.toolTip = Podeli radnu ploÄu +bbb.listenerItem.talkImg.toolTip = PriÄaj +bbb.settings.warning.label = Upozorenje bbb.mainshell.copyrightLabel2 = (c) 2011, CallPal by BigBlueButton - For more information see http://www.bigbluebutton.org/. bbb.presentation.uploadwindow.powerpoint = POWERPOINT bbb.toolbar.video.toolTip = Koristi kameru bbb.chat.publicMsgAwaiting = Javna poruka na Äekanju +bbb.settings.instructions = Prihvatite Flash zahtev koji Vas pita za dozvolu korišćenja kamere. Ako možete da vidite i Äujete sebe, VaÅ¡ pretraživaÄ je podeÅ¡en kako treba. Druge potencijalne mogućnosti su prikazane dole. Kliknite na svaku da bi naÅ¡li moguće reÅ¡enje. bbb.chat.sendBtn = PoÅ¡alji bbb.publishVideo.title = Podeli svoju web kameru bbb.logout.appshutdown = Serverska aplikacija je iskljuÄena @@ -45,13 +50,17 @@ bbb.presentation.uploadPresBtn = Prebaci dokument za prezentaciju. bbb.presentation.uploadPresBtn.toolTip = Prebaci dokument za prezentaciju. bbb.highlighter.toolbar.ellipse = Å estar bbb.fileupload.deleteBtn.toolTip = IzbriÅ¡i prezentaciju -bbb.listenerItem.talkImg.toolTip = PriÄaj +bbb.toolbar.deskshare.toolTip = Podeli radnu ploÄu bbb.presentation.document.converted = UspeÅ¡no konvertovan office dokument. bbb.presentation.error.convert.maxnbpagereach = GreÅ¡ka: PrebaÄeni dokument ima previÅ¡e stranica. bbb.desktopView.title = Podela radne ploÄe +bbb.settings.java.label = GreÅ¡ka u Java verziji bbb.presentation.forwardBtn.toolTip = Sledeći slajd +bbb.settings.java.text = Imate instaliranu Java verziju {0}, ali vam je potrebna verzija {1} kako bi mogli da koristite opciju deljenje radne ploÄe. Kliknite na dugme dole, kako bi instalirali najnoviju verziju Jave. bbb.fileupload.genThumbText = GeneriÅ¡i sliÄice. +bbb.viewers.viewersGrid.statusItemRenderer = Status bbb.desktopPublish.title = Podeli radnu ploÄu: Prezentatorov pregled +bbb.mainToolbar.settingsBtn = PodeÅ¡avanja bbb.fileupload.uploadBtn = Prebaci bbb.fileupload.uploadBtn.toolTip = Prebaci datoteku bbb.fileupload.showBtn.toolTip = Prikaži prezentaciju @@ -64,26 +73,30 @@ bbb.presentation.uploaded = prebaÄen. bbb.mainshell.logBtn.toolTip = Otvori log prozor bbb.desktopPublish.stop.tooltip = Zatvori podelu radne ploÄe bbb.presentation.uploadwindow.excel = EXCEL +bbb.settings.voice.volume = Aktivitet mikrofona bbb.logout.unknown = Izgubljena veza sa serverom bbb.presentation.slideNumLbl.toolTip = Kliknite da izaberete slajd +bbb.settings.flash.text = Imate instaliran Flash {0}, a vama je potrebna najmanje verzija {1}, da bi BigBlueButtor radio kako treba. Kliknite na dugme ispod, kako bi instalirali najnoviju verziju Adobe Flash-a. bbb.highlighter.toolbar.rectangle = Lenjir -bbb.viewers.viewersGrid.statusItemRenderer = Status +bbb.settings.voice.adjust = Podesi jaÄinu bbb.presentation.uploadwindow.word = WORD bbb.mainshell.statusProgress.loading = Podiže {0} modula bbb.presentation.error.io = IO greÅ¡ka: Molimo kontaktirajte administratora. bbb.chat.sendBtn.toolTip = PoÅ¡alji poruku bbb.highlighter.button.toolTipHide = Sakri tablu za pisanje +bbb.settings.java.command = Instaliraj najnoviju Javu bbb.mainToolbar.logoutBtn = Odjava -bbb.highlighter.toolbar.color = Izaberi boju bbb.chat.privateMsgAwaiting2 = * Privatna poruka na Äekanju * bbb.presentation.document.supported = PrebaÄeni dokument je podržan. PoÄinje konvertovanje... bbb.listeners.title = SluÅ¡aoca {0} {1} bbb.fileupload.presentationNamesLbl = PrebaÄene prezentacije: bbb.pageTitle = BigBlueButton bbb.mainshell.resetLayoutBtn.toolTip = Resetuj izgled +bbb.highlighter.toolbar.color = Izaberi boju bbb.presentation.uploadwindow.pdf = PDF bbb.publishVideo.startPublishBtn.toolTip = PoÄni da deliÅ¡ bbb.logout.connectionfailed = Veza sa serverom nije uspela +bbb.settings.isight.text = Ukoliko imate problema sa iSight kamerom, to je zbog toka Å¡to koristite OS X 10.6.5, koji je poznat po tome da ima problema sa Flash video prnosom sa iSight kemere.\r\nDa ispravite ovo, kliknite na link dole kako bi instalirali novu verziju Flash-a ili nadogradili Mac na najnoviju verziju. bbb.highlighter.toolbar.clear = IbriÅ¡i sve bbb.toolbar.phone.toolTip = Koristi mikrofon bbb.chat.privateChatSelect = Izaberite osobu sa kojom želite privatno ćaskati @@ -94,23 +107,27 @@ bbb.desktopPublish.stop.label = Zatvori bbb.logout.asyncerror = DoÅ¡lo je do greÅ¡ke u sinhronizaciji bbb.presentation.presenterNameLbl = {0} je trenutno prisutno. bbb.chat.privateMsgAwaiting = Privatna poruka na Äekanju -bbb.desktopView.fitToWindow = Podesi prozoru +bbb.desktopView.fitToWindow = Podesi prozor bbb.highlighter.toolbar.pencil = Marker bbb.mainshell.statusProgress.connecting = Povezuje se sa serverom bbb.listenerItem.lockImg.toolTip = Klikni da ućutkaÅ¡ ili dozvoliÅ¡ da priÄa. bbb.listeners.unmuteAllBtn.toolTip = Da priÄaju svi bbb.logout.rejected = Konekcija sa serverom odbaÄena bbb.presentation.title = Prezentacija +bbb.settings.noissues = Nema pronaÄ‘enih otvorenih stavki. bbb.desktopPublish.closeBtn.toolTip = Prekini podelu radne ploÄe i zatvori prozor. bbb.fileupload.selectBtn.toolTip = PronaÄ‘i datoteku bbb.presentation.uploadwindow.image = IMAGE +bbb.settings.warning.close = Zatvori ovo upozorenje bbb.presentation.clickToUpload = Prebacite prezentaciju bbb.presentation.backBtn.toolTip = Prethodni slajd. bbb.desktopPublish.fullscreen.tooltip = Podeli svoj ceo prozor +bbb.settings.isight.command = Instaliraj Flash 10.2 RC2 bbb.presentation.error.document.convert.failed = GreÅ¡ka: Neuspelo konvertovanje dokumenta. bbb.viewers.viewersGrid.nameItemRenderer = Ime -bbb.oldlocalewindow.reminder1 = Moguce imate staru verziju prevoda. +bbb.oldlocalewindow.reminder1 = Moguće imate staru verziju prevoda. bbb.highlighter.button.toolTipShow = Prikaži tablu za pisanje +bbb.settings.deskshare.start = OznaÄi podelu radne ploÄe bbb.viewers.viewersGrid.nameItemRenderer.nameLabel.toolTip = Prijavljeni ste kao sledeći korisnik. bbb.chat.fontSize = VeliÄina fonta bbb.presentation.resetZoomBtn.toolTip = Resetujte uveliÄavanje @@ -118,7 +135,8 @@ bbb.mainshell.statusProgress.cannotConnectServer = Nažalost nije moguće uspost bbb.logout.connectionclosed = Veza sa serverom je zatvorena bbb.chat.publicChatUsername = Sve bbb.viewers.viewersGrid.statusItemRenderer.presIcon.toolTip = Prezentator -bbb.mainToolbar.logoutBtn.toolTip = odjavi se +bbb.settings.isight.label = GreÅ¡ka sa iSight kamerom +bbb.mainToolbar.logoutBtn.toolTip = Odjavi se bbb.presentation.error.convert.notsupported = GreÅ¡ka: PrebaÄeni dokument nije podržan. Molimo prebacite kompatibilnu datoteku. bbb.highlighter.toolbar.thickness = Promeni debljinu bbb.presentation.uploadwindow.presentationfile = Prezentaciona datoteka diff --git a/bigbluebutton-client/locale/sr_SR/bbbResources.properties b/bigbluebutton-client/locale/sr_SR/bbbResources.properties index f2a1ba4b2ae6b579a11a02f16c35fe5884beafc1..deec50459c2c263dd18367024f63c2fb2c8496fd 100755 --- a/bigbluebutton-client/locale/sr_SR/bbbResources.properties +++ b/bigbluebutton-client/locale/sr_SR/bbbResources.properties @@ -1,8 +1,9 @@ bbb.logout.usercommand = УÑпешно Ñте Ñе иÑклјучили из конференције +bbb.settings.flash.command = ИнÑталирај најновији Flash bbb.oldlocalewindow.reminder2 = Молимо Ð²Ð°Ñ Ð´Ð° избриÑете кеш вашег бровÑера и пробајте поново. -bbb.presentation.maxUploadFileExceededAlert = Грешка: овај фајл је већи него што је дозвољено. -bbb.logout.invalidapp = Ред5 аппликација не поÑтоји на овом Ñерверу -bbb.fileupload.title = Ставите документ за презентацију. +bbb.presentation.maxUploadFileExceededAlert = Грешка: ова датотека је већа него што је дозвољено. +bbb.logout.invalidapp = ред5 аппликација не поÑтоји +bbb.fileupload.title = Пребаци презентацију. bbb.chat.publicMsgAwaiting2 = * Ðова порука * bbb.viewers.viewersGrid.roleItemRenderer = Улога bbb.oldlocalewindow.windowTitle = Упозорење: Стари превод језика @@ -12,115 +13,128 @@ bbb.viewers.viewersGrid.statusItemRenderer.streamIcon.toolTip = ПритиÑни bbb.highlighter.toolbar.undo = Поништи задње bbb.desktopPublish.minimizeBtn.toolTip = Смањи овај прозор bbb.viewers.presentBtn.label = Промените Предавача -bbb.viewers.kickUserBtn.toolTip = Избаци Ñлушаоца -bbb.listeners.ejectTooltip = Избаци Ñлушаоца -bbb.presentation.uploadcomplete = Молимо Ñачекајте док процеÑујемо документ. +bbb.viewers.kickUserBtn.toolTip = Избаците учеÑника +bbb.listeners.ejectTooltip = Избаците учеÑника +bbb.presentation.uploadcomplete = Пребацивање уÑпешно. Молимо Ñачекајте док Ñе документ конвертује. bbb.viewers.viewersGrid.statusItemRenderer.raiseHand.toolTip = Подигнута рука на {0} +bbb.mainToolbar.settingsBtn.toolTip = Отвори подешавања bbb.desktopView.actualSize = Стварна величина bbb.desktopPublish.region.tooltip = Покажите део екрана -bbb.presentation.error.convert.swf = Грешка: ниÑмо могли да процеÑујемо документ. +bbb.presentation.error.convert.swf = Грешка приликом конвертовања документа. Молимо контактирајте админиÑтратора. bbb.fileupload.progBarLbl = СтатуÑ: bbb.presentation.error.security = БезбедноÑна греÑка: Контактујте админиÑтратора. +bbb.desktopPublish.maximizeRestoreBtn.toolTip = Ðе можете увећати прозор. +bbb.listenerItem.nameLbl.toolTip = Изабери овог кориÑникаикликни на дугме да га ућуткаш или му дозволиш да прича bbb.desktopPublish.region.label = ОблаÑÑ‚ bbb.chat.cmpColorPicker.toolTip = Боја текÑта -bbb.listenerItem.muteUnmute.toolTip = Ућути овог учеÑника -bbb.chat.chatOptions = Чет опције +bbb.listenerItem.muteUnmute.toolTip = Ућуткај или дозволи да прича овај учеÑник +bbb.chat.chatOptions = Опције ћаÑкања bbb.presentation.uploadwindow.closeLabel = ПритиÑните ОК да затворите прозор bbb.viewers.title = УчеÑници{0} {1} +bbb.settings.flash.label = Грешка у Flash верзији bbb.presentation.ok = OK bbb.mainToolbar.helpBtn = Помоћ bbb.fileupload.showBtn = Покажи -bbb.fileupload.fileLbl = Фајл: -bbb.toolbar.deskshare.toolTip = Покажите екран -bbb.mainshell.copyrightLabel2 = (c) 2011, BigBlueButton build {0} - For more information see http://www.bigbluebutton.org/. +bbb.fileupload.fileLbl = Датотека: +bbb.listenerItem.talkImg.toolTip = Причај +bbb.settings.warning.label = Упозорење +bbb.mainshell.copyrightLabel2 = (c) 2011, BigBlueButton верзија {0} - за више информација погледајте http://www.bigbluebutton.org/. bbb.presentation.uploadwindow.powerpoint = POWERPOINT bbb.toolbar.video.toolTip = Покажите камеру bbb.chat.publicMsgAwaiting = Ðова порука bbb.chat.sendBtn = Пошаљи bbb.publishVideo.title = Покажите камеру bbb.logout.appshutdown = Изгубили Ñмо конекцију Ñа Ñервером -bbb.presentation.uploadPresBtn = Ставите документ за презентацију. -bbb.presentation.uploadPresBtn.toolTip = Ставите документ за презентацију. +bbb.presentation.uploadPresBtn = Пребаци документ за презентацију. +bbb.presentation.uploadPresBtn.toolTip = Пребаци документ за презентацију. bbb.highlighter.toolbar.ellipse = Круг bbb.fileupload.deleteBtn.toolTip = Избриши презентацију -bbb.listenerItem.talkImg.toolTip = Прича +bbb.toolbar.deskshare.toolTip = Подели радну плочу bbb.presentation.document.converted = Документ уÑпешно процеÑован. bbb.presentation.error.convert.maxnbpagereach = Грешка: Документ има превише Ñтрана. bbb.desktopView.title = ДекÑтоп презентација +bbb.settings.java.label = Грешка у Јава верзији bbb.presentation.forwardBtn.toolTip = Следећи Ñлајд -bbb.fileupload.genThumbText = ПроцеÑујемо Ñлике.. +bbb.fileupload.genThumbText = Генеришу Ñе Ñличице.. +bbb.viewers.viewersGrid.statusItemRenderer = Ð¡Ñ‚Ð°Ñ‚ÑƒÑ bbb.desktopPublish.title = ДекÑтоп: Преглед -bbb.fileupload.uploadBtn = Селектуј фајл -bbb.fileupload.uploadBtn.toolTip = Селектуј фајл +bbb.mainToolbar.settingsBtn = Подешавања +bbb.fileupload.uploadBtn = Пребаци +bbb.fileupload.uploadBtn.toolTip = Пребаци датотеку bbb.fileupload.showBtn.toolTip = Покажи презентацију bbb.listeners.muteAllBtn.toolTip = Ућути Ñве bbb.video.publish.close.tooltip = ПреÑтаните камеру bbb.presentation.error.convert.nbpage = Грешка: ниÑмо могли да уÑтановимо колико Ñлајдова има у документу. bbb.mainshell.locale.version = 0.71 -bbb.chat.title = Чет -bbb.presentation.uploaded = . -bbb.mainshell.logBtn.toolTip = Отвори лог грешки +bbb.chat.title = ЋаÑкање +bbb.presentation.uploaded = пребачен. +bbb.mainshell.logBtn.toolTip = Отвори лог прозор bbb.desktopPublish.stop.tooltip = Затвори деÑктоп bbb.presentation.uploadwindow.excel = EXCEL +bbb.settings.voice.volume = Ðктивитет микрофона bbb.logout.unknown = Изгубили Ñмо конекцију Ñа Ñервером bbb.presentation.slideNumLbl.toolTip = ПритиÑни да изабереш Ñлајд bbb.highlighter.toolbar.rectangle = Правоугаоник -bbb.viewers.viewersGrid.statusItemRenderer = Ð¡Ñ‚Ð°Ñ‚ÑƒÑ +bbb.settings.voice.adjust = ПодеÑи јачину bbb.presentation.uploadwindow.word = WORD -bbb.mainshell.statusProgress.loading = Покрећемо {0} компонената +bbb.mainshell.statusProgress.loading = Покреће {0} компонената bbb.presentation.error.io = I/O Грешка: Контактујте админиÑтратора. bbb.chat.sendBtn.toolTip = Пошаљи поруку bbb.highlighter.button.toolTipHide = Сакри таблу +bbb.settings.java.command = ИнÑталирај најновију Јаву bbb.mainToolbar.logoutBtn = Излаз -bbb.highlighter.toolbar.color = Изабери боју bbb.chat.privateMsgAwaiting2 = * Ðова приватна порука * -bbb.presentation.document.supported = Молимо Ñачекајте док процеÑујемо документ. -bbb.listeners.title = Слушаоци{0} {1} -bbb.fileupload.presentationNamesLbl = Претходне презентације: +bbb.presentation.document.supported = Пребачени документ је подржан. Починје конвертованје... +bbb.listeners.title = Слушаоца {0} {1} +bbb.fileupload.presentationNamesLbl = Пребачене презентације: bbb.pageTitle = BigBlueButton bbb.mainshell.resetLayoutBtn.toolTip = РеÑетуј раÑпоред +bbb.highlighter.toolbar.color = Изабери боју bbb.presentation.uploadwindow.pdf = PDF bbb.publishVideo.startPublishBtn.toolTip = Покажите камеру -bbb.logout.connectionfailed = Изгубили Ñмо конекцију Ñа Ñервером +bbb.logout.connectionfailed = ÐеуÑпело повезивање Ñа Ñервером bbb.highlighter.toolbar.clear = Избриши Ñве -bbb.toolbar.phone.toolTip = Зкључи микрофон +bbb.toolbar.phone.toolTip = КориÑти микрофон bbb.chat.privateChatSelect = Изаберите оÑобу да пришате приватно bbb.micSettings.cancel = Откажи bbb.fileupload.okCancelBtn = Откажи bbb.video.publish.close.label = Затвори bbb.desktopPublish.stop.label = Затвори -bbb.logout.asyncerror = Изгубили Ñмо конекцију Ñа Ñервером +bbb.logout.asyncerror = Изгубљена веза Ñа Ñервером bbb.presentation.presenterNameLbl = {0} тренутно предÑтавља. bbb.chat.privateMsgAwaiting = Ðова приватна порука bbb.desktopView.fitToWindow = Попуни прозор bbb.highlighter.toolbar.pencil = Маркер bbb.mainshell.statusProgress.connecting = УÑпоÑтављамо везу Ñа Ñервером -bbb.listenerItem.lockImg.toolTip = ПритиÑните да закључате ÑÑ‚Ð°Ñ‚ÑƒÑ Ð¾Ð²Ð¾Ð³ учеÑника -bbb.listeners.unmuteAllBtn.toolTip = Ућути Ñве +bbb.listenerItem.lockImg.toolTip = Кликни да ућуткаш или дозволиш да говори +bbb.listeners.unmuteAllBtn.toolTip = Ућуткај Ñве bbb.logout.rejected = Сервер није прохватио конекцију bbb.presentation.title = Презентација bbb.desktopPublish.closeBtn.toolTip = Затвори деÑктоп -bbb.fileupload.selectBtn.toolTip = Изаберите фајл +bbb.fileupload.selectBtn.toolTip = Изабери датотеку bbb.presentation.uploadwindow.image = IMAGE bbb.settings.warning.close = ИÑкључите ово упозорење bbb.presentation.clickToUpload = Ставите документ за презентацију bbb.presentation.backBtn.toolTip = Претходни Ñлајд bbb.desktopPublish.fullscreen.tooltip = Покажите цео екран -bbb.presentation.error.document.convert.failed = Грешка: ниÑмо могли да процеÑујемо документ. +bbb.settings.isight.command = ИнÑталирај Flash 10.2 RC2 +bbb.presentation.error.document.convert.failed = Грешка: конвертовање документа није могуће. bbb.viewers.viewersGrid.nameItemRenderer = Име bbb.oldlocalewindow.reminder1 = Могуће је да имате Ñтари превод BigBlueButton-а. bbb.highlighter.button.toolTipShow = Покажи таблу +bbb.settings.deskshare.start = Обележи поделу радне плоче bbb.viewers.viewersGrid.nameItemRenderer.nameLabel.toolTip = Ви Ñте овај учеÑник. bbb.chat.fontSize = Величина фонта -bbb.presentation.resetZoomBtn.toolTip = РеÑетуј зоом +bbb.presentation.resetZoomBtn.toolTip = РеÑетуј увеличање bbb.mainshell.statusProgress.cannotConnectServer = Извините, не можемо да уÑпоÑтавимо везу Ñа Ñервером -bbb.logout.connectionclosed = Сервер је иÑкључио конекцију +bbb.logout.connectionclosed = Веза Ñа Ñерверпм је затворена bbb.chat.publicChatUsername = Сви bbb.viewers.viewersGrid.statusItemRenderer.presIcon.toolTip = Предавач +bbb.settings.isight.label = Грешка Ñа iSight камером bbb.mainToolbar.logoutBtn.toolTip = Излаз -bbb.presentation.error.convert.notsupported = Грешка: фајл је у непознатом формату. +bbb.presentation.error.convert.notsupported = Грешка: датотека је у непознатом формату. bbb.highlighter.toolbar.thickness = Промени дебљину bbb.presentation.uploadwindow.presentationfile = Презентаџија bbb.viewers.raiseHandBtn.toolTip = ПритиÑни да подигнеш руку. bbb.presentation.error.convert.format = Грешка: фајл је у непознатом формату. -bbb.desktopPublish.fullscreen.label = Цео Екран +bbb.desktopPublish.fullscreen.label = Цео екран diff --git a/bigbluebutton-client/locale/tr_TR/bbbResources.properties b/bigbluebutton-client/locale/tr_TR/bbbResources.properties index 4bb0228101e807bcbae5984f57c0bf015a2190a1..4b4f9c62b9690b00d5fb3cd864e077fbf6d426f2 100755 --- a/bigbluebutton-client/locale/tr_TR/bbbResources.properties +++ b/bigbluebutton-client/locale/tr_TR/bbbResources.properties @@ -73,7 +73,6 @@ bbb.presentation.uploaded = yüklendi. bbb.mainshell.logBtn.toolTip = Sistem Kayıtlarını Aç bbb.desktopPublish.stop.tooltip = Ekran paylaşımını kapat bbb.presentation.uploadwindow.excel = EXCEL -bbb.micSettings.micActivity = Mikrofon Aktivitesi bbb.settings.voice.volume = Mikrofon Aktivitesi bbb.logout.unknown = Katılımcının sunucuyla baÄŸlantısı koptu. bbb.presentation.slideNumLbl.toolTip = Seçmek istediÄŸiniz slaydı tıklayın. diff --git a/bigbluebutton-client/locale/uk_UA/bbbResources.properties b/bigbluebutton-client/locale/uk_UA/bbbResources.properties index eb0bcc7a3e071bc3f6ba0bd151983d3286265c81..5e154472d015b1c84251b52127cd074b1ecd94f6 100755 --- a/bigbluebutton-client/locale/uk_UA/bbbResources.properties +++ b/bigbluebutton-client/locale/uk_UA/bbbResources.properties @@ -73,7 +73,6 @@ bbb.presentation.uploaded = завантажено. bbb.mainshell.logBtn.toolTip = Відкрити вікно журналу bbb.desktopPublish.stop.tooltip = Зупинити транÑлÑцію екрана bbb.presentation.uploadwindow.excel = Ð¢Ð°Ð±Ð»Ð¸Ñ†Ñ Excel -bbb.micSettings.micActivity = Мікрофонна активніÑÑ‚ÑŒ bbb.settings.voice.volume = Мікрофонна активніÑÑ‚ÑŒ bbb.logout.unknown = Ваш клієнт втратив зв'Ñзок з Ñервером bbb.presentation.slideNumLbl.toolTip = Клацніть Ð´Ð»Ñ Ð²Ð¸Ð±Ð¾Ñ€Ñƒ Ñлайда diff --git a/bigbluebutton-client/locale/vi_VN/bbbResources.properties b/bigbluebutton-client/locale/vi_VN/bbbResources.properties index 49f91854d54687343f3101032c4cae3269490182..b949c602f6cb58e10278d2500e181159549ee51b 100755 --- a/bigbluebutton-client/locale/vi_VN/bbbResources.properties +++ b/bigbluebutton-client/locale/vi_VN/bbbResources.properties @@ -73,7 +73,6 @@ bbb.presentation.uploaded = tải lên xong. bbb.mainshell.logBtn.toolTip = Mở cá»a sổ Nháºp ký bbb.desktopPublish.stop.tooltip = Äóng chia sẻ mà n hình bbb.presentation.uploadwindow.excel = EXCEL -bbb.micSettings.micActivity = Tình trạng của Micro bbb.settings.voice.volume = Tình trạng của Micro bbb.logout.unknown = Trình duyệt của bạn đã mất kết nối tá»›i máy chủ bbb.presentation.slideNumLbl.toolTip = Nhấn và o để chá»n má»™t trang trình chiếu diff --git a/bigbluebutton-client/locale/zh_CN/bbbResources.properties b/bigbluebutton-client/locale/zh_CN/bbbResources.properties index 775729233f4ed55e4874a2cef0d546ffd7dcc50b..83ffe945689b1fef6487e57c6fb759b3d6348de0 100755 --- a/bigbluebutton-client/locale/zh_CN/bbbResources.properties +++ b/bigbluebutton-client/locale/zh_CN/bbbResources.properties @@ -73,7 +73,6 @@ bbb.presentation.uploaded = å·²ä¸Šä¼ bbb.mainshell.logBtn.toolTip = 打开日志 bbb.desktopPublish.stop.tooltip = å…³é—æ¡Œé¢å…±äº« bbb.presentation.uploadwindow.excel = EXCEL -bbb.micSettings.micActivity = éº¦å…‹é£ŽçŠ¶æ€ bbb.settings.voice.volume = éº¦å…‹é£ŽçŠ¶æ€ bbb.logout.unknown = 您已掉线 bbb.presentation.slideNumLbl.toolTip = 选择一页 diff --git a/bigbluebutton-client/resources/config.xml.template b/bigbluebutton-client/resources/config.xml.template index 60ab2daf79694c00701f8b48fc251771486757b8..a37bf7aab5a7ad532232dce3cb913db8d3deb9de 100755 --- a/bigbluebutton-client/resources/config.xml.template +++ b/bigbluebutton-client/resources/config.xml.template @@ -94,6 +94,12 @@ dependsOn="ViewersModule" /> + <!--<module name="VideodockModule" url="VideodockModule.swf?v=VERSION" + uri="rtmp://HOST/bigbluebutton" + dependsOn="VideoconfModule" + autoDock="true" + />--> + <!-- new module in development: <module name="DynamicInfoModule" url="DynamicInfoModule.swf?v=VERSION" uri="rtmp://HOST/bigbluebutton" diff --git a/bigbluebutton-client/resources/prod/BigBlueButton.html b/bigbluebutton-client/resources/prod/BigBlueButton.html index decda046881a960f98a7b49be856953533911e45..53f3ece458ce6ce0356dcdf799bd334dde4c67c6 100755 --- a/bigbluebutton-client/resources/prod/BigBlueButton.html +++ b/bigbluebutton-client/resources/prod/BigBlueButton.html @@ -1,115 +1,42 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> -<!-- saved from url=(0014)about:internet --> -<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"> - <!-- - Smart developers always View Source. - - This application was built using Adobe Flex, an open source framework - for building rich Internet applications that get delivered via the - Flash Player or to desktops via Adobe AIR. - - Learn more about Flex at http://flex.org - // --> - <head> - <title>BigBlueButton</title> - <meta name="google" value="notranslate" /> - <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> - <!-- Include CSS to eliminate any default margins/padding and set the height of the html element and - the body element to 100%, because Firefox, or any Gecko based browser, interprets percentage as - the percentage of the height of its parent container, which has to be set explicitly. Fix for - Firefox 3.6 focus border issues. Initially, don't display flashContent div so it won't show - if JavaScript disabled. - --> - <style type="text/css" media="screen"> - html, body { height:100%; } - body { margin:0; padding:0; overflow:auto; text-align:center; - background-color: #ffffff; } - object:focus { outline:none; } - #flashContent { display:none; } - </style> - - <!-- Enable Browser History by replacing useBrowserHistory tokens with two hyphens --> - <!-- BEGIN Browser History required section --> - <link rel="stylesheet" type="text/css" href="history/history.css" /> - <script type="text/javascript" src="history/history.js"></script> - <!-- END Browser History required section --> - - <script src="jquery-1.5.1.min.js" language="javascript"></script> - <script src="bigbluebutton.js" language="javascript"></script> - <script src="bbb_localization.js" language="javascript"></script> - <script src="deployJava.js" language="javascript"></script> - <script src="bbb_blinker.js" language="javascript"></script> - <script src="bbb_deskshare.js" language="javascript"></script> - - <script type="text/javascript" src="swfobject.js"></script> - <script type="text/javascript"> - // For version detection, set to min. required Flash Player version, or 0 (or 0.0.0), for no version detection. - var swfVersionStr = "10.3.0"; - // To use express install, set to playerProductInstall.swf, otherwise the empty string. - var xiSwfUrlStr = "playerProductInstall.swf"; - var flashvars = {}; - var params = {}; - params.quality = "high"; - params.bgcolor = "#ffffff"; - params.allowscriptaccess = "sameDomain"; - params.allowfullscreen = "true"; - var attributes = {}; - attributes.id = "BigBlueButton"; - attributes.name = "BigBlueButton"; - attributes.align = "middle"; - swfobject.embedSWF( - "BigBlueButton.swf", "flashContent", - "100%", "100%", - swfVersionStr, xiSwfUrlStr, - flashvars, params, attributes); - // JavaScript enabled so display the flashContent div in case it is not replaced with a swf object. - swfobject.createCSS("#flashContent", "display:block;text-align:left;"); - </script> - </head> - <body> - <!-- SWFObject's dynamic embed method replaces this alternative HTML content with Flash content when enough - JavaScript and Flash plug-in support is available. The div is initially hidden so that it doesn't show - when JavaScript is disabled. - --> - <div id="flashContent"> - <p> - To view this page ensure that Adobe Flash Player version - 10.3.0 or greater is installed. - </p> - <script type="text/javascript"> - var pageHost = ((document.location.protocol == "https:") ? "https://" : "http://"); - document.write("<a href='http://www.adobe.com/go/getflashplayer'><img src='" - + pageHost + "www.adobe.com/images/shared/download_buttons/get_flash_player.gif' alt='Get Adobe Flash player' /></a>" ); - </script> - </div> - - <noscript> - <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="100%" height="100%" id="BigBlueButton"> - <param name="movie" value="BigBlueButton.swf" /> - <param name="quality" value="high" /> - <param name="bgcolor" value="#ffffff" /> - <param name="allowScriptAccess" value="sameDomain" /> - <param name="allowFullScreen" value="true" /> - <!--[if !IE]>--> - <object type="application/x-shockwave-flash" data="BigBlueButton.swf" width="100%" height="100%"> - <param name="quality" value="high" /> - <param name="bgcolor" value="#ffffff" /> - <param name="allowScriptAccess" value="sameDomain" /> - <param name="allowFullScreen" value="true" /> - <!--<![endif]--> - <!--[if gte IE 6]>--> - <p> - Either scripts and active content are not permitted to run or Adobe Flash Player version - 10.3.0 or greater is not installed. - </p> - <!--<![endif]--> - <a href="http://www.adobe.com/go/getflashplayer"> - <img src="http://www.adobe.com/images/shared/download_buttons/get_flash_player.gif" alt="Get Adobe Flash Player" /> - </a> - <!--[if !IE]>--> - </object> - <!--<![endif]--> - </object> - </noscript> - </body> +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"> + <head> + <title></title> + <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> + <style type="text/css" media="screen"> + html, body, #content { height:100%; } + body { margin:0; padding:0; overflow:auto; } + #altContent { /* style alt content */ } + </style> + <script type="text/javascript" src="swfobject/swfobject.js"></script> + <script type="text/javascript"> + swfobject.registerObject("BigBlueButton", "10.3.0", "expressInstall.swf"); + </script> + <script src="lib/jquery-1.5.1.min.js" language="javascript"></script> + <script src="lib/bigbluebutton.js" language="javascript"></script> + <script src="lib/bbb_localization.js" language="javascript"></script> + <script src="lib/bbb_blinker.js" language="javascript"></script> + <script src="lib/bbb_deskshare.js" language="javascript"></script> + </head> + <body> + <div id="content"> + <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="100%" height="100%" id="BigBlueButton" name="BigBlueButton" align="middle"> + <param name="movie" value="BigBlueButton.swf?v=VERSION" /> + <param name="quality" value="high" /> + <param name="allowfullscreen" value="true" /> + <param name="bgcolor" value="#869ca7" /> + <!--[if !IE]>--> + <object type="application/x-shockwave-flash" data="BigBlueButton.swf?v=VERSION" width="100%" height="100%" align="middle"> + <param name="quality" value="high" /> + <param name="bgcolor" value="#869ca7" /> + <!--<![endif]--> + <a href="http://www.adobe.com/go/getflashplayer"> + <img src="http://www.adobe.com/images/shared/download_buttons/get_flash_player.gif" alt="Get Adobe Flash player" /> + </a> + <!--[if !IE]>--> + </object> + <!--<![endif]--> + </object> + </div> + </body> </html> diff --git a/bigbluebutton-client/resources/prod/expressInstall.swf b/bigbluebutton-client/resources/prod/expressInstall.swf new file mode 100755 index 0000000000000000000000000000000000000000..0fbf8fca961e6319d84442248f6ba314797dccec Binary files /dev/null and b/bigbluebutton-client/resources/prod/expressInstall.swf differ diff --git a/bigbluebutton-client/resources/prod/bbb_blinker.js b/bigbluebutton-client/resources/prod/lib/bbb_blinker.js similarity index 100% rename from bigbluebutton-client/resources/prod/bbb_blinker.js rename to bigbluebutton-client/resources/prod/lib/bbb_blinker.js diff --git a/bigbluebutton-client/resources/prod/bbb_deskshare.js b/bigbluebutton-client/resources/prod/lib/bbb_deskshare.js similarity index 100% rename from bigbluebutton-client/resources/prod/bbb_deskshare.js rename to bigbluebutton-client/resources/prod/lib/bbb_deskshare.js diff --git a/bigbluebutton-client/resources/prod/bbb_localization.js b/bigbluebutton-client/resources/prod/lib/bbb_localization.js similarity index 100% rename from bigbluebutton-client/resources/prod/bbb_localization.js rename to bigbluebutton-client/resources/prod/lib/bbb_localization.js diff --git a/bigbluebutton-client/resources/prod/bigbluebutton.js b/bigbluebutton-client/resources/prod/lib/bigbluebutton.js similarity index 100% rename from bigbluebutton-client/resources/prod/bigbluebutton.js rename to bigbluebutton-client/resources/prod/lib/bigbluebutton.js diff --git a/bigbluebutton-client/resources/prod/deployJava.js b/bigbluebutton-client/resources/prod/lib/deployJava.js similarity index 100% rename from bigbluebutton-client/resources/prod/deployJava.js rename to bigbluebutton-client/resources/prod/lib/deployJava.js diff --git a/bigbluebutton-client/resources/prod/jquery-1.5.1.min.js b/bigbluebutton-client/resources/prod/lib/jquery-1.5.1.min.js similarity index 100% rename from bigbluebutton-client/resources/prod/jquery-1.5.1.min.js rename to bigbluebutton-client/resources/prod/lib/jquery-1.5.1.min.js diff --git a/bigbluebutton-client/resources/prod/swfobject/swfobject.js b/bigbluebutton-client/resources/prod/swfobject/swfobject.js new file mode 100755 index 0000000000000000000000000000000000000000..8eafe9dd83f91b52c2decd532db81527bb98e488 --- /dev/null +++ b/bigbluebutton-client/resources/prod/swfobject/swfobject.js @@ -0,0 +1,4 @@ +/* SWFObject v2.2 <http://code.google.com/p/swfobject/> + is released under the MIT License <http://www.opensource.org/licenses/mit-license.php> +*/ +var swfobject=function(){var D="undefined",r="object",S="Shockwave Flash",W="ShockwaveFlash.ShockwaveFlash",q="application/x-shockwave-flash",R="SWFObjectExprInst",x="onreadystatechange",O=window,j=document,t=navigator,T=false,U=[h],o=[],N=[],I=[],l,Q,E,B,J=false,a=false,n,G,m=true,M=function(){var aa=typeof j.getElementById!=D&&typeof j.getElementsByTagName!=D&&typeof j.createElement!=D,ah=t.userAgent.toLowerCase(),Y=t.platform.toLowerCase(),ae=Y?/win/.test(Y):/win/.test(ah),ac=Y?/mac/.test(Y):/mac/.test(ah),af=/webkit/.test(ah)?parseFloat(ah.replace(/^.*webkit\/(\d+(\.\d+)?).*$/,"$1")):false,X=!+"\v1",ag=[0,0,0],ab=null;if(typeof t.plugins!=D&&typeof t.plugins[S]==r){ab=t.plugins[S].description;if(ab&&!(typeof t.mimeTypes!=D&&t.mimeTypes[q]&&!t.mimeTypes[q].enabledPlugin)){T=true;X=false;ab=ab.replace(/^.*\s+(\S+\s+\S+$)/,"$1");ag[0]=parseInt(ab.replace(/^(.*)\..*$/,"$1"),10);ag[1]=parseInt(ab.replace(/^.*\.(.*)\s.*$/,"$1"),10);ag[2]=/[a-zA-Z]/.test(ab)?parseInt(ab.replace(/^.*[a-zA-Z]+(.*)$/,"$1"),10):0}}else{if(typeof O.ActiveXObject!=D){try{var ad=new ActiveXObject(W);if(ad){ab=ad.GetVariable("$version");if(ab){X=true;ab=ab.split(" ")[1].split(",");ag=[parseInt(ab[0],10),parseInt(ab[1],10),parseInt(ab[2],10)]}}}catch(Z){}}}return{w3:aa,pv:ag,wk:af,ie:X,win:ae,mac:ac}}(),k=function(){if(!M.w3){return}if((typeof j.readyState!=D&&j.readyState=="complete")||(typeof j.readyState==D&&(j.getElementsByTagName("body")[0]||j.body))){f()}if(!J){if(typeof j.addEventListener!=D){j.addEventListener("DOMContentLoaded",f,false)}if(M.ie&&M.win){j.attachEvent(x,function(){if(j.readyState=="complete"){j.detachEvent(x,arguments.callee);f()}});if(O==top){(function(){if(J){return}try{j.documentElement.doScroll("left")}catch(X){setTimeout(arguments.callee,0);return}f()})()}}if(M.wk){(function(){if(J){return}if(!/loaded|complete/.test(j.readyState)){setTimeout(arguments.callee,0);return}f()})()}s(f)}}();function f(){if(J){return}try{var Z=j.getElementsByTagName("body")[0].appendChild(C("span"));Z.parentNode.removeChild(Z)}catch(aa){return}J=true;var X=U.length;for(var Y=0;Y<X;Y++){U[Y]()}}function K(X){if(J){X()}else{U[U.length]=X}}function s(Y){if(typeof O.addEventListener!=D){O.addEventListener("load",Y,false)}else{if(typeof j.addEventListener!=D){j.addEventListener("load",Y,false)}else{if(typeof O.attachEvent!=D){i(O,"onload",Y)}else{if(typeof O.onload=="function"){var X=O.onload;O.onload=function(){X();Y()}}else{O.onload=Y}}}}}function h(){if(T){V()}else{H()}}function V(){var X=j.getElementsByTagName("body")[0];var aa=C(r);aa.setAttribute("type",q);var Z=X.appendChild(aa);if(Z){var Y=0;(function(){if(typeof Z.GetVariable!=D){var ab=Z.GetVariable("$version");if(ab){ab=ab.split(" ")[1].split(",");M.pv=[parseInt(ab[0],10),parseInt(ab[1],10),parseInt(ab[2],10)]}}else{if(Y<10){Y++;setTimeout(arguments.callee,10);return}}X.removeChild(aa);Z=null;H()})()}else{H()}}function H(){var ag=o.length;if(ag>0){for(var af=0;af<ag;af++){var Y=o[af].id;var ab=o[af].callbackFn;var aa={success:false,id:Y};if(M.pv[0]>0){var ae=c(Y);if(ae){if(F(o[af].swfVersion)&&!(M.wk&&M.wk<312)){w(Y,true);if(ab){aa.success=true;aa.ref=z(Y);ab(aa)}}else{if(o[af].expressInstall&&A()){var ai={};ai.data=o[af].expressInstall;ai.width=ae.getAttribute("width")||"0";ai.height=ae.getAttribute("height")||"0";if(ae.getAttribute("class")){ai.styleclass=ae.getAttribute("class")}if(ae.getAttribute("align")){ai.align=ae.getAttribute("align")}var ah={};var X=ae.getElementsByTagName("param");var ac=X.length;for(var ad=0;ad<ac;ad++){if(X[ad].getAttribute("name").toLowerCase()!="movie"){ah[X[ad].getAttribute("name")]=X[ad].getAttribute("value")}}P(ai,ah,Y,ab)}else{p(ae);if(ab){ab(aa)}}}}}else{w(Y,true);if(ab){var Z=z(Y);if(Z&&typeof Z.SetVariable!=D){aa.success=true;aa.ref=Z}ab(aa)}}}}}function z(aa){var X=null;var Y=c(aa);if(Y&&Y.nodeName=="OBJECT"){if(typeof Y.SetVariable!=D){X=Y}else{var Z=Y.getElementsByTagName(r)[0];if(Z){X=Z}}}return X}function A(){return !a&&F("6.0.65")&&(M.win||M.mac)&&!(M.wk&&M.wk<312)}function P(aa,ab,X,Z){a=true;E=Z||null;B={success:false,id:X};var ae=c(X);if(ae){if(ae.nodeName=="OBJECT"){l=g(ae);Q=null}else{l=ae;Q=X}aa.id=R;if(typeof aa.width==D||(!/%$/.test(aa.width)&&parseInt(aa.width,10)<310)){aa.width="310"}if(typeof aa.height==D||(!/%$/.test(aa.height)&&parseInt(aa.height,10)<137)){aa.height="137"}j.title=j.title.slice(0,47)+" - Flash Player Installation";var ad=M.ie&&M.win?"ActiveX":"PlugIn",ac="MMredirectURL="+O.location.toString().replace(/&/g,"%26")+"&MMplayerType="+ad+"&MMdoctitle="+j.title;if(typeof ab.flashvars!=D){ab.flashvars+="&"+ac}else{ab.flashvars=ac}if(M.ie&&M.win&&ae.readyState!=4){var Y=C("div");X+="SWFObjectNew";Y.setAttribute("id",X);ae.parentNode.insertBefore(Y,ae);ae.style.display="none";(function(){if(ae.readyState==4){ae.parentNode.removeChild(ae)}else{setTimeout(arguments.callee,10)}})()}u(aa,ab,X)}}function p(Y){if(M.ie&&M.win&&Y.readyState!=4){var X=C("div");Y.parentNode.insertBefore(X,Y);X.parentNode.replaceChild(g(Y),X);Y.style.display="none";(function(){if(Y.readyState==4){Y.parentNode.removeChild(Y)}else{setTimeout(arguments.callee,10)}})()}else{Y.parentNode.replaceChild(g(Y),Y)}}function g(ab){var aa=C("div");if(M.win&&M.ie){aa.innerHTML=ab.innerHTML}else{var Y=ab.getElementsByTagName(r)[0];if(Y){var ad=Y.childNodes;if(ad){var X=ad.length;for(var Z=0;Z<X;Z++){if(!(ad[Z].nodeType==1&&ad[Z].nodeName=="PARAM")&&!(ad[Z].nodeType==8)){aa.appendChild(ad[Z].cloneNode(true))}}}}}return aa}function u(ai,ag,Y){var X,aa=c(Y);if(M.wk&&M.wk<312){return X}if(aa){if(typeof ai.id==D){ai.id=Y}if(M.ie&&M.win){var ah="";for(var ae in ai){if(ai[ae]!=Object.prototype[ae]){if(ae.toLowerCase()=="data"){ag.movie=ai[ae]}else{if(ae.toLowerCase()=="styleclass"){ah+=' class="'+ai[ae]+'"'}else{if(ae.toLowerCase()!="classid"){ah+=" "+ae+'="'+ai[ae]+'"'}}}}}var af="";for(var ad in ag){if(ag[ad]!=Object.prototype[ad]){af+='<param name="'+ad+'" value="'+ag[ad]+'" />'}}aa.outerHTML='<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"'+ah+">"+af+"</object>";N[N.length]=ai.id;X=c(ai.id)}else{var Z=C(r);Z.setAttribute("type",q);for(var ac in ai){if(ai[ac]!=Object.prototype[ac]){if(ac.toLowerCase()=="styleclass"){Z.setAttribute("class",ai[ac])}else{if(ac.toLowerCase()!="classid"){Z.setAttribute(ac,ai[ac])}}}}for(var ab in ag){if(ag[ab]!=Object.prototype[ab]&&ab.toLowerCase()!="movie"){e(Z,ab,ag[ab])}}aa.parentNode.replaceChild(Z,aa);X=Z}}return X}function e(Z,X,Y){var aa=C("param");aa.setAttribute("name",X);aa.setAttribute("value",Y);Z.appendChild(aa)}function y(Y){var X=c(Y);if(X&&X.nodeName=="OBJECT"){if(M.ie&&M.win){X.style.display="none";(function(){if(X.readyState==4){b(Y)}else{setTimeout(arguments.callee,10)}})()}else{X.parentNode.removeChild(X)}}}function b(Z){var Y=c(Z);if(Y){for(var X in Y){if(typeof Y[X]=="function"){Y[X]=null}}Y.parentNode.removeChild(Y)}}function c(Z){var X=null;try{X=j.getElementById(Z)}catch(Y){}return X}function C(X){return j.createElement(X)}function i(Z,X,Y){Z.attachEvent(X,Y);I[I.length]=[Z,X,Y]}function F(Z){var Y=M.pv,X=Z.split(".");X[0]=parseInt(X[0],10);X[1]=parseInt(X[1],10)||0;X[2]=parseInt(X[2],10)||0;return(Y[0]>X[0]||(Y[0]==X[0]&&Y[1]>X[1])||(Y[0]==X[0]&&Y[1]==X[1]&&Y[2]>=X[2]))?true:false}function v(ac,Y,ad,ab){if(M.ie&&M.mac){return}var aa=j.getElementsByTagName("head")[0];if(!aa){return}var X=(ad&&typeof ad=="string")?ad:"screen";if(ab){n=null;G=null}if(!n||G!=X){var Z=C("style");Z.setAttribute("type","text/css");Z.setAttribute("media",X);n=aa.appendChild(Z);if(M.ie&&M.win&&typeof j.styleSheets!=D&&j.styleSheets.length>0){n=j.styleSheets[j.styleSheets.length-1]}G=X}if(M.ie&&M.win){if(n&&typeof n.addRule==r){n.addRule(ac,Y)}}else{if(n&&typeof j.createTextNode!=D){n.appendChild(j.createTextNode(ac+" {"+Y+"}"))}}}function w(Z,X){if(!m){return}var Y=X?"visible":"hidden";if(J&&c(Z)){c(Z).style.visibility=Y}else{v("#"+Z,"visibility:"+Y)}}function L(Y){var Z=/[\\\"<>\.;]/;var X=Z.exec(Y)!=null;return X&&typeof encodeURIComponent!=D?encodeURIComponent(Y):Y}var d=function(){if(M.ie&&M.win){window.attachEvent("onunload",function(){var ac=I.length;for(var ab=0;ab<ac;ab++){I[ab][0].detachEvent(I[ab][1],I[ab][2])}var Z=N.length;for(var aa=0;aa<Z;aa++){y(N[aa])}for(var Y in M){M[Y]=null}M=null;for(var X in swfobject){swfobject[X]=null}swfobject=null})}}();return{registerObject:function(ab,X,aa,Z){if(M.w3&&ab&&X){var Y={};Y.id=ab;Y.swfVersion=X;Y.expressInstall=aa;Y.callbackFn=Z;o[o.length]=Y;w(ab,false)}else{if(Z){Z({success:false,id:ab})}}},getObjectById:function(X){if(M.w3){return z(X)}},embedSWF:function(ab,ah,ae,ag,Y,aa,Z,ad,af,ac){var X={success:false,id:ah};if(M.w3&&!(M.wk&&M.wk<312)&&ab&&ah&&ae&&ag&&Y){w(ah,false);K(function(){ae+="";ag+="";var aj={};if(af&&typeof af===r){for(var al in af){aj[al]=af[al]}}aj.data=ab;aj.width=ae;aj.height=ag;var am={};if(ad&&typeof ad===r){for(var ak in ad){am[ak]=ad[ak]}}if(Z&&typeof Z===r){for(var ai in Z){if(typeof am.flashvars!=D){am.flashvars+="&"+ai+"="+Z[ai]}else{am.flashvars=ai+"="+Z[ai]}}}if(F(Y)){var an=u(aj,am,ah);if(aj.id==ah){w(ah,true)}X.success=true;X.ref=an}else{if(aa&&A()){aj.data=aa;P(aj,am,ah,ac);return}else{w(ah,true)}}if(ac){ac(X)}})}else{if(ac){ac(X)}}},switchOffAutoHideShow:function(){m=false},ua:M,getFlashPlayerVersion:function(){return{major:M.pv[0],minor:M.pv[1],release:M.pv[2]}},hasFlashPlayerVersion:F,createSWF:function(Z,Y,X){if(M.w3){return u(Z,Y,X)}else{return undefined}},showExpressInstall:function(Z,aa,X,Y){if(M.w3&&A()){P(Z,aa,X,Y)}},removeSWF:function(X){if(M.w3){y(X)}},createCSS:function(aa,Z,Y,X){if(M.w3){v(aa,Z,Y,X)}},addDomLoadEvent:K,addLoadEvent:s,getQueryParamValue:function(aa){var Z=j.location.search||j.location.hash;if(Z){if(/\?/.test(Z)){Z=Z.split("?")[1]}if(aa==null){return L(Z)}var Y=Z.split("&");for(var X=0;X<Y.length;X++){if(Y[X].substring(0,Y[X].indexOf("="))==aa){return L(Y[X].substring((Y[X].indexOf("=")+1)))}}}return""},expressInstallCallback:function(){if(a){var X=c(R);if(X&&l){X.parentNode.replaceChild(l,X);if(Q){w(Q,true);if(M.ie&&M.win){l.style.display="block"}}if(E){E(B)}}a=false}}}}(); \ No newline at end of file diff --git a/bigbluebutton-client/src/DynamicInfoModule.mxml b/bigbluebutton-client/src/DynamicInfoModule.mxml index e01b6a6c791b8078efcd590277615c4c05b9673c..255fa225a7797460507aa1633339fe6fea1c47db 100755 --- a/bigbluebutton-client/src/DynamicInfoModule.mxml +++ b/bigbluebutton-client/src/DynamicInfoModule.mxml @@ -20,7 +20,11 @@ $Id: $ --> -<mx:Module xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="onCreationComplete()" implements="org.bigbluebutton.common.IBigBlueButtonModule" xmlns:maps="org.bigbluebutton.modules.dynamicinfo.maps.*" xmlns:views="org.bigbluebutton.modules.dynamicinfo.views.*"> +<mx:Module xmlns:mx="http://www.adobe.com/2006/mxml" + creationComplete="onCreationComplete()" + implements="org.bigbluebutton.common.IBigBlueButtonModule" + xmlns:maps="org.bigbluebutton.modules.dynamicinfo.maps.*" + xmlns:views="org.bigbluebutton.modules.dynamicinfo.views.*"> <mx:Script> <![CDATA[ import com.asfusion.mate.events.Dispatcher; @@ -142,7 +146,8 @@ cmp.height = 22; var evt:ToolbarButtonEvent = new ToolbarButtonEvent(ToolbarButtonEvent.ADD); evt.button = cmp as IBbbToolbarComponent; - globalDispatcher.dispatchEvent(evt); + var dispatcher:Dispatcher = new Dispatcher(); + dispatcher.dispatchEvent(evt); } } } diff --git a/bigbluebutton-client/src/VideodockModule.mxml b/bigbluebutton-client/src/VideodockModule.mxml new file mode 100755 index 0000000000000000000000000000000000000000..87315b5ba57730ce43a7d317422f429d28feadd5 --- /dev/null +++ b/bigbluebutton-client/src/VideodockModule.mxml @@ -0,0 +1,39 @@ +<?xml version="1.0" encoding="utf-8"?> +<mx:Module xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" width="400" height="300" + xmlns:maps="org.bigbluebutton.modules.videodock.maps.*" implements="org.bigbluebutton.common.IBigBlueButtonModule"> + <mx:Script> + <![CDATA[ + import org.bigbluebutton.common.LogUtil; + + private var _moduleName:String = "Videodock Module"; + private var _attributes:Object; + + private function onCreationComplete():void { + LogUtil.debug("VideodockModule initialized"); + } + + public function get moduleName():String { + return _moduleName; + } + + public function get autoDock():Boolean { + return (_attributes.autoDock == "true"); + } + + public function start(attributes:Object):void { + LogUtil.debug("Videodock attr: " + attributes.username); + _attributes = attributes; + + eventMap.module = this; + eventMap.startModule(); + } + + public function stop():void { + eventMap.stopModule(); + } + + ]]> + </mx:Script> + + <maps:VideoDockEventMap id="eventMap"/> +</mx:Module> \ No newline at end of file diff --git a/bigbluebutton-client/src/org/bigbluebutton/common/Images.as b/bigbluebutton-client/src/org/bigbluebutton/common/Images.as index adaaca2328c8b032abe33532752e89a1c3bcbd18..6b4773ef7f44c44eda52805a77a51d974863394c 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/common/Images.as +++ b/bigbluebutton-client/src/org/bigbluebutton/common/Images.as @@ -141,5 +141,17 @@ package org.bigbluebutton.common [Embed(source="assets/images/presenter.png")] public var presenter:Class; + + [Embed(source="assets/images/lock_open.png")] + public var lock_open:Class; + + [Embed(source="assets/images/lock_close.png")] + public var lock_close:Class; + + [Embed(source="assets/images/arrow_in.png")] + public var arrow_in:Class; + + [Embed(source="assets/images/shape_handles.png")] + public var shape_handles:Class; } } \ No newline at end of file diff --git a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/arrow_in.png b/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/arrow_in.png new file mode 100755 index 0000000000000000000000000000000000000000..745c65134db478a64016d63a7104e585452f2b9f Binary files /dev/null and b/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/arrow_in.png differ diff --git a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/lock_close.png b/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/lock_close.png new file mode 100755 index 0000000000000000000000000000000000000000..2ebc4f6f9663e32cad77d67ef93ab8843dfea3c0 Binary files /dev/null and b/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/lock_close.png differ diff --git a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/lock_open.png b/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/lock_open.png new file mode 100755 index 0000000000000000000000000000000000000000..a471765ff1432092e7113e56b42f2798968b443f Binary files /dev/null and b/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/lock_open.png differ diff --git a/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/shape_handles.png b/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/shape_handles.png new file mode 100755 index 0000000000000000000000000000000000000000..ce27fe3a0345e03e919b54ca3b6a8498743b2ee9 Binary files /dev/null and b/bigbluebutton-client/src/org/bigbluebutton/common/assets/images/shape_handles.png differ diff --git a/bigbluebutton-client/src/org/bigbluebutton/common/events/CloseWindowEvent.as b/bigbluebutton-client/src/org/bigbluebutton/common/events/CloseWindowEvent.as old mode 100644 new mode 100755 index 6885264784127db4520343779dec95db97cc05f6..fa503285ad5c02d9031cb3df9901bb79a0b6256f --- a/bigbluebutton-client/src/org/bigbluebutton/common/events/CloseWindowEvent.as +++ b/bigbluebutton-client/src/org/bigbluebutton/common/events/CloseWindowEvent.as @@ -36,7 +36,7 @@ package org.bigbluebutton.common.events public static const CLOSE_WINDOW_EVENT:String = 'CLOSE_WINDOW_EVENT'; - public function CloseWindowEvent(type:String, bubbles:Boolean=true, cancelable:Boolean=false) + public function CloseWindowEvent(type:String=CLOSE_WINDOW_EVENT, bubbles:Boolean=true, cancelable:Boolean=false) { super(type, bubbles, cancelable); } diff --git a/bigbluebutton-client/src/org/bigbluebutton/common/events/DragWindowEvent.as b/bigbluebutton-client/src/org/bigbluebutton/common/events/DragWindowEvent.as new file mode 100755 index 0000000000000000000000000000000000000000..1951e35ac35bbefe84379fb6ae63e2de824ca3af --- /dev/null +++ b/bigbluebutton-client/src/org/bigbluebutton/common/events/DragWindowEvent.as @@ -0,0 +1,44 @@ +/** + * BigBlueButton open source conferencing system - http://www.bigbluebutton.org/ + * + * Copyright (c) 2010 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 <http://www.gnu.org/licenses/>. + * + */ +package org.bigbluebutton.common.events +{ + import flash.events.Event; + import flash.geom.Point; + import mx.core.UIComponent; + import flexlib.mdi.containers.*; + + public class DragWindowEvent extends Event + { + public static const DRAG_WINDOW_EVENT:String = "DRAG_WINDOW_EVENT"; + public static const DRAG_START:String = "DRAG_START"; + public static const DRAG_END:String = "DRAG_END"; + public static const DRAG:String = "DRAG"; + + public var mouseGlobal:Point; + public var window:MDIWindow; + public var mode:String; + + public function DragWindowEvent(mode:String, type:String = DRAG_WINDOW_EVENT) + { + super(type, true, false); + this.mode = mode; + } + + } +} \ No newline at end of file diff --git a/bigbluebutton-client/src/org/bigbluebutton/main/model/ConferenceParameters.as b/bigbluebutton-client/src/org/bigbluebutton/main/model/ConferenceParameters.as index 86f5963ba230b4d74081de7174400c6b5d6a1252..781373d585d21cc76f261de4ac8b6684a854bc12 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/main/model/ConferenceParameters.as +++ b/bigbluebutton-client/src/org/bigbluebutton/main/model/ConferenceParameters.as @@ -62,6 +62,7 @@ package org.bigbluebutton.main.model */ public var welcome:String; + public var meetingID:String; /** * External unique user id. */ diff --git a/bigbluebutton-client/src/org/bigbluebutton/main/model/modules/ModuleDescriptor.as b/bigbluebutton-client/src/org/bigbluebutton/main/model/modules/ModuleDescriptor.as index 3dd111ab29c8033f7fdf30a48d09a8fe13af020f..af966d0358ec95ae37e6f316b1342c259f532682 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/main/model/modules/ModuleDescriptor.as +++ b/bigbluebutton-client/src/org/bigbluebutton/main/model/modules/ModuleDescriptor.as @@ -180,7 +180,7 @@ package org.bigbluebutton.main.model.modules addAttribute("webvoiceconf", conferenceParameters.webvoiceconf); addAttribute("welcome", conferenceParameters.welcome); addAttribute("externUserID", conferenceParameters.externUserID); - + addAttribute("meetingID", conferenceParameters.meetingID); addAttribute("protocol", protocol); useProtocol(protocol); } diff --git a/bigbluebutton-client/src/org/bigbluebutton/main/model/users/UserService.as b/bigbluebutton-client/src/org/bigbluebutton/main/model/users/UserService.as index 4bf27f9e4e4a38db144b65a43efa3c3f680244f4..de27aa3e84bccded9323ae97334ff7607dd28028 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/main/model/users/UserService.as +++ b/bigbluebutton-client/src/org/bigbluebutton/main/model/users/UserService.as @@ -80,6 +80,7 @@ package org.bigbluebutton.main.model.users _conferenceParameters.webvoiceconf = result.webvoiceconf; _conferenceParameters.voicebridge = result.voicebridge; _conferenceParameters.welcome = result.welcome; + _conferenceParameters.meetingID = result.meetingID; _conferenceParameters.externUserID = result.externUserID; _conferenceParameters.logoutUrl = result.logoutUrl; _conferenceParameters.record = true; diff --git a/bigbluebutton-client/src/org/bigbluebutton/main/views/MainApplicationShell.mxml b/bigbluebutton-client/src/org/bigbluebutton/main/views/MainApplicationShell.mxml index cdc0af45976a963fcfde96daa5ba96a337fd1746..718a5da456e108fcfe5c5f08e8fd36382ae05fa8 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/main/views/MainApplicationShell.mxml +++ b/bigbluebutton-client/src/org/bigbluebutton/main/views/MainApplicationShell.mxml @@ -77,9 +77,7 @@ import org.bigbluebutton.main.model.users.events.ConnectionFailedEvent; import org.bigbluebutton.util.i18n.ResourceUtil; import org.bigbluebutton.util.logging.Logger; - - import spark.components.Application; - + private var globalDispatcher:Dispatcher; private var dispState:String; //full-screen? @@ -213,11 +211,10 @@ var micSettings:MicSettings = MicSettings(PopUpManager.createPopUp(mdiCanvas, MicSettings, true)); var point1:Point = new Point(); // Calculate position of TitleWindow in Application's coordinates. - point1.x = 400; - point1.y = 300; - point1 = mdiCanvas.localToGlobal(point1); - micSettings.x = point1.x + 25; - micSettings.y = point1.y + 25; + point1.x = width/2; + point1.y = height/2; + micSettings.x = point1.x - (micSettings.width/2); + micSettings.y = point1.y - (micSettings.height/2); } private function wrongLocaleVersion():void { @@ -225,11 +222,10 @@ var point1:Point = new Point(); // Calculate position of TitleWindow in Application's coordinates. - point1.x = 400; - point1.y = 300; - point1 = mdiCanvas.localToGlobal(point1); - localeWindow.x = point1.x + 25; - localeWindow.y = point1.y + 25; + point1.x = width/2; + point1.y = height/2; + localeWindow.x = point1.x - (localeWindow.width/2); + localeWindow.y = point1.y - (localeWindow.height/2); } private function handleLogout(e:ConnectionFailedEvent):void { @@ -239,11 +235,11 @@ var point1:Point = new Point(); // Calculate position of TitleWindow in Application's coordinates. - point1.x = 400; - point1.y = 300; - point1 = localToGlobal(point1); - logoutWindow.x = point1.x + 25; - logoutWindow.y = point1.y + 25; + point1.x = width/2; + point1.y = height/2; + logoutWindow.x = point1.x - (logoutWindow.width/2); + logoutWindow.y = point1.y - (logoutWindow.height/2); + if (e is ConnectionFailedEvent) logoutWindow.setReason((e as ConnectionFailedEvent).type); else logoutWindow.setReason("You have logged out of the conference"); @@ -313,6 +309,8 @@ <mx:dataProvider> <mx:Array> <mx:String>Small videos</mx:String> + <mx:String>Presenter + presentation</mx:String> + <mx:String>Meeting</mx:String> </mx:Array> </mx:dataProvider> </mx:ComboBox> diff --git a/bigbluebutton-client/src/org/bigbluebutton/main/views/MainCanvas.mxml b/bigbluebutton-client/src/org/bigbluebutton/main/views/MainCanvas.mxml index 1e5cef3ea656d08866e921884f46b56d74e0b054..c53f398b5f4bc87a69e3061d417afcd36734c18c 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/main/views/MainCanvas.mxml +++ b/bigbluebutton-client/src/org/bigbluebutton/main/views/MainCanvas.mxml @@ -27,7 +27,7 @@ import flexlib.mdi.containers.MDIWindow; import mx.controls.Alert; - + import mx.utils.ArrayUtil; import org.bigbluebutton.common.IBbbModuleWindow; import org.bigbluebutton.common.LogUtil; @@ -35,8 +35,10 @@ public static const BOTTOM_LEFT:String = "BOTTOM_LEFT_WINDOW"; public static const MIDDLE:String = "MIDDLE_WINDOW"; public static const BOTTOM:String = "BOTTOM_WINDOW"; - public static const RIGHT:String = "RIGHT_WINDOW"; + public static const TOP_RIGHT:String = "TOP_RIGHT_WINDOW"; + public static const BOTTOM_RIGHT:String = "BOTTOM_RIGHT_WINDOW"; public static const POPUP:String = "POP_UP_WINDOW"; + public static const UNTOUCHED:String = "UNTOUCHED_WINDOW"; public static const DESKTOP_SHARING_VIEW:String = "POP_UP_DESKSHARE_VIEW"; public static const DESKTOP_SHARING_PUBLISH:String = "POP_UP_DESKSHARE_PUBLISH"; @@ -60,7 +62,13 @@ } public function removeWindow(window:IBbbModuleWindow):void{ - windowManager.remove(window as MDIWindow); + // the flexlib windowManager remove method doesn't test if the given window is on the windows list + // this test avoid some exceptions when run the app on debugger flash player + if (ArrayUtil.getItemIndex(window, windowManager.windowList) != -1) { + windowManager.remove(window as MDIWindow); + } else { + LogUtil.debug("Trying to remove the window [ " + window + " ] but it's not a MainCanvas child"); + } } public function removeAllWindows():void{ @@ -114,12 +122,18 @@ win.width = this.width - 5; win.height = 300; break; - case RIGHT: + case TOP_RIGHT: x = this.width - rightWindowWidth - 10; y = 1; win.width = rightWindowWidth; win.height = rightWindowHeight; break; + case BOTTOM_RIGHT: + x = this.width - rightWindowWidth - 10; + y = rightWindowHeight + 10;; + win.width = rightWindowWidth; + win.height = this.height - rightWindowHeight - 10; + break; case POPUP: x = (Math.random() * this.width) - 640; y = (Math.random() * this.height) - 520; @@ -134,6 +148,10 @@ x = 1; y = 1; break; + case UNTOUCHED: + // don't reposition the window + x = win.x; + y = win.y; } windowManager.absPos(win, x, y); } diff --git a/bigbluebutton-client/src/org/bigbluebutton/main/views/MicSettings.mxml b/bigbluebutton-client/src/org/bigbluebutton/main/views/MicSettings.mxml index dd2fa49d68272b153fd9be2d2a043373b75ed561..f5e9fcfdfa110fe85e7c1b2b48e65614fefbc814 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/main/views/MicSettings.mxml +++ b/bigbluebutton-client/src/org/bigbluebutton/main/views/MicSettings.mxml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="utf-8"?> <mx:TitleWindow xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" - width="100%" height="100%" creationComplete="initDefaultMic()"> + width="600" height="300" creationComplete="initDefaultMic()" showCloseButton="true" close="onCancelClicked()"> <mx:Script> <![CDATA[ import mx.events.ItemClickEvent; @@ -120,11 +120,10 @@ } ]]> </mx:Script> - <mx:VBox width="100%" height="100%"> + <mx:VBox width="100%" height="100%" paddingBottom="5" paddingLeft="5" paddingRight="5" paddingTop="5"> <mx:HBox width="100%"> <mx:Spacer width="50%"/> <mx:Spacer width="50%"/> - <mx:Button id="cancelBtn" icon="{cancelIcon}" width="20" height="20" toolTip="{ResourceUtil.getInstance().getString('bbb.micSettings.cancel')}" click="onCancelClicked()"/> </mx:HBox> <mx:HBox width="100%" height="20"> <mx:Spacer width="50%"/> @@ -132,12 +131,11 @@ </mx:HBox> <mx:HBox width="100%" height="50%"> <mx:VBox width="70%" height="100%"> - <mx:Text text="{ResourceUtil.getInstance().getString('bbb.micSettings.hearFromHeadset')}"/> + <mx:Text width="100%" text="{ResourceUtil.getInstance().getString('bbb.micSettings.hearFromHeadset')}"/> </mx:VBox> <mx:VBox width="50%" height="100%"> <mx:Button id="playButton" label="{ResourceUtil.getInstance().getString('bbb.micSettings.playSound')}" click="playButtonClickHandler()" toggle="true"/> - <mx:Spacer width="100%"/> </mx:VBox> </mx:HBox> <mx:HBox width="100%" height="20"> @@ -146,17 +144,15 @@ </mx:HBox> <mx:HBox width="100%" height="50%"> <mx:VBox width="70%" height="100%"> - <mx:Text text="{ResourceUtil.getInstance().getString('bbb.micSettings.speakIntoMic')}"/> + <mx:Text width="100%" text="{ResourceUtil.getInstance().getString('bbb.micSettings.speakIntoMic')}"/> </mx:VBox> <mx:Spacer width="10%"/> <mx:VBox width="20%" height="100%"> - <mx:Spacer width="10%"/> - <mx:Label id="mic1Label" text="Microphone Name" /> + <mx:Text id="mic1Label" text="Microphone Name" /> <mx:ProgressBar id="micLevel1" minimum="0" maximum="100" labelPlacement="right" label="" direction="right" mode="manual" visible="true" width="120"/> - <mx:Button id="settingBtn" label="{ResourceUtil.getInstance().getString('bbb.micSettings.changeMic')}" click="showMicSettingsPanel()"/> - + <mx:Button id="settingBtn" label="{ResourceUtil.getInstance().getString('bbb.micSettings.changeMic')}" click="showMicSettingsPanel()"/> </mx:VBox> </mx:HBox> <mx:HBox width="100%" height="20"> @@ -167,7 +163,7 @@ <mx:Spacer width="80%"/> <mx:Button id="okBtn" label="{ResourceUtil.getInstance().getString('bbb.micSettings.join')}" click="onJoinClicked()"/> <mx:Spacer width="10%"/> - <mx:LinkButton fontSize="14" label="{ResourceUtil.getInstance().getString('bbb.mainToolbar.helpBtn')}" click="onHelpButtonClicked()"/> + <mx:LinkButton fontSize="10" label="{ResourceUtil.getInstance().getString('bbb.mainToolbar.helpBtn')}" click="onHelpButtonClicked()"/> </mx:HBox> <mx:HBox width="100%"> <mx:Spacer width="50%"/> diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/chat/views/ChatWindow.mxml b/bigbluebutton-client/src/org/bigbluebutton/modules/chat/views/ChatWindow.mxml index 3e4ae7e9c141465c1d45456995f8b4b7b04bb48d..f247bca29aaa1d89bcb3dff753f9ae72737ae674 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/chat/views/ChatWindow.mxml +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/chat/views/ChatWindow.mxml @@ -53,7 +53,7 @@ [Bindable] public var chatOptions:ChatOptions; public function getPrefferedPosition():String{ - return MainCanvas.RIGHT; + return MainCanvas.TOP_RIGHT; } private function onCreationComplete():void { diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/videoconf/business/ButtonsOverlay.as b/bigbluebutton-client/src/org/bigbluebutton/modules/videoconf/business/ButtonsOverlay.as new file mode 100755 index 0000000000000000000000000000000000000000..246e5e7ce97670ed4ba48f868eee9766a839ad6a --- /dev/null +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/videoconf/business/ButtonsOverlay.as @@ -0,0 +1,55 @@ +/** + * BigBlueButton open source conferencing system - http://www.bigbluebutton.org/ + * + * Copyright (c) 2010 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 <http://www.gnu.org/licenses/>. + * + */ + +package org.bigbluebutton.modules.videoconf.business +{ + import mx.containers.HBox; + import mx.controls.Button; + import flash.utils.Dictionary; + import flash.events.MouseEvent; + import org.bigbluebutton.common.LogUtil; + + public class ButtonsOverlay extends HBox + { + private var buttons:Dictionary = new Dictionary; + private var BUTTONS_SIZE:int = 20; + private var BUTTONS_PADDING:int = 10; + + public function add(name:String, icon:Class, tooltip:String, listener:Function):void { + var button:Button = new Button; + button.setStyle("icon", icon); + button.toolTip = tooltip; + button.addEventListener(MouseEvent.CLICK, listener); + button.width = button.height = BUTTONS_SIZE; + this.addChild(button); + buttons[name] = button; + } + + public function get(name:String):Button { + var tmp:Object = buttons[name]; + //return (flash.utils.getQualifiedClassName(tmp) == "mx.controls::Button"? (tmp as Button): null); + return (tmp as Button); + } + + public function get padding():int { + return BUTTONS_PADDING; + } + } + +} \ No newline at end of file diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/videoconf/business/VideoWindowItf.as b/bigbluebutton-client/src/org/bigbluebutton/modules/videoconf/business/VideoWindowItf.as new file mode 100755 index 0000000000000000000000000000000000000000..8549329f47a109601f30f0945de3f64b7518fdbc --- /dev/null +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/videoconf/business/VideoWindowItf.as @@ -0,0 +1,322 @@ +/** + * BigBlueButton open source conferencing system - http://www.bigbluebutton.org/ + * + * Copyright (c) 2010 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 <http://www.gnu.org/licenses/>. + * + */ + +package org.bigbluebutton.modules.videoconf.business +{ + import flexlib.mdi.containers.MDIWindow; + import flexlib.mdi.events.MDIWindowEvent; + + import org.bigbluebutton.common.LogUtil; + import org.bigbluebutton.common.Images; + import org.bigbluebutton.common.IBbbModuleWindow; + import org.bigbluebutton.common.events.DragWindowEvent; + import org.bigbluebutton.common.events.CloseWindowEvent; + import org.bigbluebutton.main.views.MainCanvas; + import org.bigbluebutton.util.i18n.ResourceUtil; + + import mx.core.UIComponent; + import mx.controls.Button; + + import flash.events.MouseEvent; + import flash.media.Video; + import flash.geom.Point; + + public class VideoWindowItf extends MDIWindow implements IBbbModuleWindow + { + protected var _video:Video; + protected var _videoHolder:UIComponent; + // images must be static because it needs to be created *before* the PublishWindow creation + static protected var images:Images = new Images(); + + static public var PADDING_HORIZONTAL:Number = 6; + static public var PADDING_VERTICAL:Number = 29; + protected var _minWidth:int = 160 + PADDING_HORIZONTAL; + protected var _minHeight:int = 120 + PADDING_VERTICAL; + protected var aspectRatio:Number = 1; + protected var keepAspect:Boolean = false; + protected var originalWidth:Number; + protected var originalHeight:Number; + + protected var mousePositionOnDragStart:Point; + + public var streamName:String; + public var userId:int; + [Bindable] public var resolutions:Array; + + protected function getVideoResolution(stream:String):Array { + for each (var resStr:String in resolutions){ + if (resStr == stream.substr(0, resStr.length)) + return resStr.split( "x" ); + } + return null; + } + + protected function get paddingVertical():Number { + return this.borderMetrics.top + this.borderMetrics.bottom; + } + + protected function get paddingHorizontal():Number { + return this.borderMetrics.left + this.borderMetrics.right; + } + + static private var RESIZING_DIRECTION_UNKNOWN:int = 0; + static private var RESIZING_DIRECTION_VERTICAL:int = 1; + static private var RESIZING_DIRECTION_HORIZONTAL:int = 2; + static private var RESIZING_DIRECTION_BOTH:int = 3; + private var resizeDirection:int = RESIZING_DIRECTION_BOTH; + + /** + * when the window is resized by the user, the application doesn't know + * about the resize direction + */ + public function onResizeStart(event:MDIWindowEvent = null):void { + resizeDirection = RESIZING_DIRECTION_UNKNOWN; + } + + /** + * after the resize ends, the direction is set to BOTH because of the + * non-user resize actions - like when the window is docked, and so on + */ + public function onResizeEnd(event:MDIWindowEvent = null):void { + resizeDirection = RESIZING_DIRECTION_BOTH; + } + + protected function onResize():void { + if (_video == null || _videoHolder == null || this.minimized) return; + + // limits the window size to the parent size + this.width = (this.parent != null? Math.min(this.width, this.parent.width): this.width); + this.height = (this.parent != null? Math.min(this.height, this.parent.height): this.height); + + var tmpWidth:Number = this.width - PADDING_HORIZONTAL; + var tmpHeight:Number = this.height - PADDING_VERTICAL; + + // try to discover in which direction the user is resizing the window + if (resizeDirection != RESIZING_DIRECTION_BOTH) { + if (tmpWidth == _video.width && tmpHeight != _video.height) + resizeDirection = (resizeDirection == RESIZING_DIRECTION_VERTICAL || resizeDirection == RESIZING_DIRECTION_UNKNOWN? RESIZING_DIRECTION_VERTICAL: RESIZING_DIRECTION_BOTH); + else if (tmpWidth != _video.width && tmpHeight == _video.height) + resizeDirection = (resizeDirection == RESIZING_DIRECTION_HORIZONTAL || resizeDirection == RESIZING_DIRECTION_UNKNOWN? RESIZING_DIRECTION_HORIZONTAL: RESIZING_DIRECTION_BOTH); + else + resizeDirection = RESIZING_DIRECTION_BOTH; + } + + // depending on the direction, the tmp size is different + switch (resizeDirection) { + case RESIZING_DIRECTION_VERTICAL: + tmpWidth = Math.floor(tmpHeight * aspectRatio); + break; + case RESIZING_DIRECTION_HORIZONTAL: + tmpHeight = Math.floor(tmpWidth / aspectRatio); + break; + case RESIZING_DIRECTION_BOTH: + // this direction is used also for non-user window resize actions + tmpWidth = Math.min (tmpWidth, Math.floor(tmpHeight * aspectRatio)); + tmpHeight = Math.min (tmpHeight, Math.floor(tmpWidth / aspectRatio)); + break; + } + + _video.width = _videoHolder.width = tmpWidth; + _video.height = _videoHolder.height = tmpHeight; + + if (!keepAspect || this.maximized) { + // center the video in the window + _video.x = Math.floor ((this.width - PADDING_HORIZONTAL - tmpWidth) / 2); + _video.y = Math.floor ((this.height - PADDING_VERTICAL - tmpHeight) / 2); + } else { + // fit window dimensions on video + _video.x = 0; + _video.y = 0; + this.width = tmpWidth + PADDING_HORIZONTAL; + this.height = tmpHeight + PADDING_VERTICAL; + } + + // reposition the window to fit inside the parent window + if (this.parent != null) { + if (this.x + this.width > this.parent.width) + this.x = this.parent.width - this.width; + if (this.x < 0) + this.x = 0; + if (this.y + this.height > this.parent.height) + this.y = this.parent.height - this.height; + if (this.y < 0) + this.y = 0; + } + + updateButtonsPosition(); + } + + public function updateWidth():void { + this.width = Math.floor((this.height - paddingVertical) * aspectRatio) + paddingHorizontal; + onResize(); + } + + public function updateHeight():void { + this.height = Math.floor((this.width - paddingHorizontal) / aspectRatio) + paddingVertical; + onResize(); + } + + protected function setAspectRatio(width:int,height:int):void { + aspectRatio = (width/height); + this.minHeight = Math.floor((this.minWidth - PADDING_HORIZONTAL) / aspectRatio) + PADDING_VERTICAL; + } + + public function getPrefferedPosition():String{ + if (_buttonsEnabled) + return MainCanvas.POPUP; + else + // the window is docked, so it should not be moved on reset layout + return MainCanvas.UNTOUCHED; + } + + public function onDrag(event:MDIWindowEvent = null):void { + var e:DragWindowEvent = new DragWindowEvent(DragWindowEvent.DRAG); + e.mouseGlobal = this.localToGlobal(new Point(mouseX, mouseY)); + e.window = this; + dispatchEvent(e); + } + + public function onDragStart(event:MDIWindowEvent = null):void { + var e:DragWindowEvent = new DragWindowEvent(DragWindowEvent.DRAG_START); + e.window = this; + dispatchEvent(e); + } + + public function onDragEnd(event:MDIWindowEvent = null):void { + var e:DragWindowEvent = new DragWindowEvent(DragWindowEvent.DRAG_END); + e.mouseGlobal = this.localToGlobal(new Point(mouseX, mouseY)); + e.window = this; + dispatchEvent(e); + } + + override public function close(event:MouseEvent = null):void{ + var e:CloseWindowEvent = new CloseWindowEvent(); + e.window = this; + dispatchEvent(e); + + super.close(event); + } + + private var _buttons:ButtonsOverlay = null; + private var _buttonsEnabled:Boolean = true; + + private var img_unlock_keep_aspect:Class = images.lock_open; + private var img_lock_keep_aspect:Class = images.lock_close; + private var img_fit_video:Class = images.arrow_in; + private var img_original_size:Class = images.shape_handles; + + protected function get buttons():ButtonsOverlay { + if (_buttons == null) { + _buttons = new ButtonsOverlay; + _buttons.add("originalSizeBtn", img_original_size, ResourceUtil.getInstance().getString('bbb.video.originalSizeBtn.tooltip'), onOriginalSizeClick); + + // hiding the other buttons + //_buttons.add("keepAspectBtn", img_lock_keep_aspect, ResourceUtil.getInstance().getString('bbb.video.keepAspectBtn.tooltip'), onKeepAspectClick); + //_buttons.add("fitVideoBtn", img_fit_video, ResourceUtil.getInstance().getString('bbb.video.fitVideoBtn.tooltip'), onFitVideoClick); + + _buttons.visible = false; + + this.addChild(_buttons); + } + return _buttons; + } + + protected function createButtons():void { + // creates the window keeping the aspect ratio + onKeepAspectClick(); + } + + protected function updateButtonsPosition():void { + if (buttons.visible == false) { + buttons.y = buttons.x = 0; + } else { + buttons.y = _video.y + _video.height - buttons.height - buttons.padding; + buttons.x = _video.x + _video.width - buttons.width - buttons.padding; + } + } + + protected function showButtons(event:MouseEvent = null):void { + if (_buttonsEnabled && buttons.visible == false) { + buttons.visible = true; + updateButtonsPosition(); + } + } + + protected function hideButtons(event:MouseEvent = null):void { + if (_buttonsEnabled && buttons.visible == true) { + buttons.visible = false; + updateButtonsPosition(); + } + } + + protected function onDoubleClick(event:MouseEvent = null):void { + // it occurs when the window is docked, for example + if (!this.maximizeRestoreBtn.visible) return; + + this.maximizeRestore(); + } + + override public function maximizeRestore(event:MouseEvent = null):void { + // if the user is maximizing the window, the control buttons should disappear + buttonsEnabled = this.maximized; + super.maximizeRestore(event); + } + + public function set buttonsEnabled(enabled:Boolean):void { + if (!enabled) + hideButtons(); + _buttonsEnabled = enabled; + } + + protected function onOriginalSizeClick(event:MouseEvent = null):void { + _video.width = _videoHolder.width = originalWidth; + _video.height = _videoHolder.height = originalHeight; + onFitVideoClick(); + } + + protected function onFitVideoClick(event:MouseEvent = null):void { + var newWidth:int = _video.width + paddingHorizontal; + var newHeight:int = _video.height + paddingVertical; + + this.x += (this.width - newWidth)/2; + this.y += (this.height - newHeight)/2; + this.width = newWidth; + this.height = newHeight; + onResize(); + } + + protected function onKeepAspectClick(event:MouseEvent = null):void { + keepAspect = !keepAspect; + + var keepAspectBtn:Button = buttons.get("keepAspectBtn"); + if (keepAspectBtn != null) { + keepAspectBtn.selected = keepAspect; + keepAspectBtn.setStyle("icon", (keepAspect? img_lock_keep_aspect: img_unlock_keep_aspect)); + } + + var fitVideoBtn:Button = buttons.get("fitVideoBtn"); + if (fitVideoBtn != null) { + fitVideoBtn.enabled = !keepAspect; + } + + onFitVideoClick(); + } + + } +} \ No newline at end of file diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/videoconf/events/OpenVideoWindowEvent.as b/bigbluebutton-client/src/org/bigbluebutton/modules/videoconf/events/OpenVideoWindowEvent.as new file mode 100755 index 0000000000000000000000000000000000000000..1fe01c195174918cf3c564d62362ed9ca43bbfec --- /dev/null +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/videoconf/events/OpenVideoWindowEvent.as @@ -0,0 +1,44 @@ +/** + * BigBlueButton open source conferencing system - http://www.bigbluebutton.org/ + * + * Copyright (c) 2010 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 <http://www.gnu.org/licenses/>. + * + */ +package org.bigbluebutton.modules.videoconf.events +{ + import flash.events.Event; + + import org.bigbluebutton.common.IBbbModuleWindow; + + /** + * Dispatch this event with your IBbbModuleWindow instance attached to add the MDIWindow to the main canvas area of bbb-client. + * + */ + public class OpenVideoWindowEvent extends Event + { + /** + * The MDIWindow instance to show on the main canvas + */ + public var window:IBbbModuleWindow; + + public static const OPEN_VIDEO_WINDOW_EVENT:String = 'OPEN_VIDEO_WINDOW_EVENT'; + + public function OpenVideoWindowEvent(type:String=OPEN_VIDEO_WINDOW_EVENT, bubbles:Boolean=true, cancelable:Boolean=false) + { + super(type, bubbles, cancelable); + } + + } +} \ No newline at end of file diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/videoconf/maps/VideoEventMap.mxml b/bigbluebutton-client/src/org/bigbluebutton/modules/videoconf/maps/VideoEventMap.mxml index 3ccb4a2803c0ab95cef36a23b897cdd642da9f56..0d3f0591a3dd1dfd3eaa040c5a00048ea19d9bf2 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/videoconf/maps/VideoEventMap.mxml +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/videoconf/maps/VideoEventMap.mxml @@ -39,6 +39,7 @@ import org.bigbluebutton.modules.videoconf.business.VideoProxy; import org.bigbluebutton.modules.videoconf.events.CloseAllWindowsEvent; import org.bigbluebutton.modules.videoconf.events.OpenPublishWindowEvent; + import org.bigbluebutton.modules.videoconf.events.OpenVideoWindowEvent; import org.bigbluebutton.modules.videoconf.events.StartBroadcastEvent; import org.bigbluebutton.modules.videoconf.events.StopBroadcastEvent; import org.bigbluebutton.modules.videoconf.views.PublishWindow; @@ -70,6 +71,11 @@ var windowEvent:OpenWindowEvent = new OpenWindowEvent(OpenWindowEvent.OPEN_WINDOW_EVENT); windowEvent.window = window; globalDispatcher.dispatchEvent(windowEvent); + + // this event will dock the window, if it's enabled + var openVideoEvent:OpenVideoWindowEvent = new OpenVideoWindowEvent(); + openVideoEvent.window = window; + globalDispatcher.dispatchEvent(openVideoEvent); } private function viewVideoFile(e:BBBEvent):void { @@ -93,7 +99,7 @@ private function openPublishWindow():void{ publishWindow = new PublishWindow(); publishWindow.videoOptions = proxy.videoOptions; - publishWindow.streamName = "-" + module.userid.toString(); + publishWindow.userId = module.userid; publishWindow.userrole = module.role; publishWindow.quality = module.quality; publishWindow.resolutions = module.resolutions.split(","); @@ -110,6 +116,7 @@ broadcastEvent.stream = e.stream; broadcastEvent.userid = module.userid; globalDispatcher.dispatchEvent(broadcastEvent); + publishWindow.title = module.username + " (you)"; } private function stopPublishing(e:StopBroadcastEvent):void{ diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/videoconf/views/PublishWindow.mxml b/bigbluebutton-client/src/org/bigbluebutton/modules/videoconf/views/PublishWindow.mxml index cb1a815582f0fc5525f88aca612d1d2f22ccf93d..c2ce6e8cec2f60cef62f154320616a95da77b7b6 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/videoconf/views/PublishWindow.mxml +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/videoconf/views/PublishWindow.mxml @@ -20,20 +20,23 @@ $Id: $ --> -<pubVid:MDIWindow xmlns="flexlib.mdi.containers.*" +<pubVid:VideoWindowItf xmlns="org.bigbluebutton.modules.videoconf.business.*" xmlns:mx="http://www.adobe.com/2006/mxml" - xmlns:pubVid="flexlib.mdi.containers.*" + xmlns:pubVid="org.bigbluebutton.modules.videoconf.business.*" implements="org.bigbluebutton.common.IBbbModuleWindow" creationComplete="init()" width="{camWidth + 6}" height="{camHeight + 80}" - title="{ResourceUtil.getInstance().getString('bbb.publishVideo.title')}" xmlns:mate="http://mate.asfusion.com/" - resize="onResize()"> + resize="onResize()" + horizontalScrollPolicy="off" + verticalScrollPolicy="off" + layout="absolute"> <mx:Script> <![CDATA[ import org.bigbluebutton.modules.videoconf.model.VideoConfOptions; import org.bigbluebutton.common.LogUtil; + import org.bigbluebutton.common.events.CloseWindowEvent; import flexlib.mdi.events.MDIWindowEvent; import mx.core.UIComponent; @@ -43,34 +46,20 @@ import org.bigbluebutton.common.LogUtil; import org.bigbluebutton.common.events.LocaleChangeEvent; import org.bigbluebutton.main.views.MainCanvas; + import org.bigbluebutton.modules.videoconf.events.OpenVideoWindowEvent; import org.bigbluebutton.modules.videoconf.events.CloseAllWindowsEvent; import org.bigbluebutton.modules.videoconf.events.StartBroadcastEvent; import org.bigbluebutton.modules.videoconf.events.StopBroadcastEvent; import org.bigbluebutton.util.i18n.ResourceUtil; - private var images:Images = new Images(); [Bindable] public var camIcon:Class = images.control_play; [Bindable] public var bbbLogo:Class = images.bbb_logo; - [Bindable] public var resolutions:Array = new Array("320x240", "640x480"); - - private var video:Video; - public var streamName:String; + [Bindable] private var camWidth:Number = 320; [Bindable] private var camHeight:Number = 240; private var _userrole:String; public var quality:Number = 0; - - private var _bResizePossible:Boolean = true; - private var _nAspectRatio:Number = 1; - - static private var _minWidth:int = 86; - static private var _minHeight:int = 174; - - private var _nSavedVideoWidth:Number = 0; - private var _nSavedVideoHeight:Number = 0; - private var _nOldWindowWidth:Number = 0; - private var _nOldWindowHeight:Number = 0; - + // Timer to auto-publish webcam. We need this timer to delay // the auto-publishing until after the Viewers's window has loaded // to receive the publishing events. Otherwise, the user joining next @@ -81,14 +70,16 @@ public var videoOptions:VideoConfOptions; private function init():void{ + _videoHolder = new UIComponent(); + _videoHolder.width = camWidth; + _videoHolder.height = camHeight; + this.addChild(_videoHolder); + this.title = ResourceUtil.getInstance().getString('bbb.publishVideo.title'); + checkIfMacCamera(); if (isPresenter()) showResControls(true); if (Camera.names.length > 1) showVideoControls(true); if (!isPresenter() && Camera.names.length == 1) startPublishing(); - addEventListener(MDIWindowEvent.RESIZE_END, onResizeEvent); - addEventListener(MDIWindowEvent.RESIZE, onResizeEvent); - addEventListener(MDIWindowEvent.MAXIMIZE, onMaximize); - addEventListener(MDIWindowEvent.RESTORE, onRestore); this.minWidth = _minWidth; this.minHeight = _minHeight; @@ -121,11 +112,7 @@ if (Camera.names[i] == webcam) cmbCameraSelector.selectedIndex = i; } } - - public function getPrefferedPosition():String{ - return MainCanvas.POPUP; - } - + private function startPublishing():void{ var camera:Camera = Camera.getCamera(cmbCameraSelector.selectedIndex.toString()); if (camera == null) return; @@ -136,13 +123,13 @@ camera.setMode(camWidth, camHeight, videoOptions.camModeFps); camera.setQuality(videoOptions.camQualityBandwidth, videoOptions.camQualityPicture); - video = new Video(camWidth, camHeight); + _video = new Video(camWidth, camHeight); //Next two lines may seem redundant but they're not. Do not delete. - video.width = camWidth; - video.height = camHeight; - adjustWindowSize(); - video.attachCamera(camera); - videoHolder.addChild(video); + _video.width = camWidth; + _video.height = camHeight; + onResize(); + _video.attachCamera(camera); + _videoHolder.addChild(_video); // addChild(videoHolder); var e:StartBroadcastEvent = new StartBroadcastEvent(); @@ -155,6 +142,22 @@ maximizeRestoreBtn.visible = true; this.resizable = true; + + addEventListener(MDIWindowEvent.RESIZE_START, onResizeStart); + addEventListener(MDIWindowEvent.RESIZE_END, onResizeEnd); + addEventListener(MDIWindowEvent.DRAG_START, onDragStart); + addEventListener(MDIWindowEvent.DRAG, onDrag); + addEventListener(MDIWindowEvent.DRAG_END, onDragEnd); + addEventListener(MouseEvent.MOUSE_OVER, showButtons); + addEventListener(MouseEvent.MOUSE_OUT, hideButtons); + addEventListener(MouseEvent.DOUBLE_CLICK, onDoubleClick); + + createButtons(); + + // this event will dock the window, if it's enabled + var openVideoEvent:OpenVideoWindowEvent = new OpenVideoWindowEvent(); + openVideoEvent.window = this; + dispatchEvent(openVideoEvent); } override public function close(event:MouseEvent=null):void{ @@ -163,28 +166,28 @@ } private function stopPublishing():void{ - if (video != null) { - video.attachCamera(null); - video.clear(); - video = null; + if (_video != null) { + _video.attachCamera(null); + _video.clear(); + _video = null; } var e:StopBroadcastEvent = new StopBroadcastEvent() - e.stream = this.streamName; + e.stream = streamName; dispatchEvent(e); } private function setResolution():void{ var res:Array = cmbResolution.selectedLabel.split( "x" ); - camWidth = Number(res[0]); - camHeight = Number(res[1]); - _nAspectRatio = (camWidth/camHeight); + camWidth = originalWidth = Number(res[0]); + camHeight = originalHeight = Number(res[1]); + setAspectRatio(camWidth, camHeight); /** * Add timestamp to create a unique stream name. This way we can record * stream without overwriting previously recorded streams. */ var curTime:Number = new Date().getTime(); - this.streamName = cmbResolution.selectedLabel.concat(this.streamName) + "-" + curTime; + this.streamName = cmbResolution.selectedLabel.concat(this.userId) + "-" + curTime; } public function set userrole(role:String):void{ @@ -203,9 +206,12 @@ cmbCameraSelector.visible = true; } else{ videoOptionsBar.visible = false; + videoOptionsBar.width = 0; + videoOptionsBar.height = 0; btnStartPublish.visible = false; cmbCameraSelector.visible = false; videoOptionsBar.visible = false; + } } @@ -233,146 +239,19 @@ } } - private function adjustWindowSize():void{ - videoHolder.width = video.width; - videoHolder.height = video.height; - this.width = video.width + 6; - this.height = video.height + 74; - - // prevent to show a video window bigger than the parent window - if (this.width > this.parent.width) { - video.width = this.parent.width - 6; - video.height = Math.floor(video.width / _nAspectRatio); - adjustWindowSize(); - } - if (this.height > this.parent.height) { - video.height = this.parent.height - 74; - video.width = Math.floor(video.height * _nAspectRatio); - adjustWindowSize(); - } - if (this.width < _minWidth) { - video.width = _minWidth - 6; - video.height = Math.floor(video.width / _nAspectRatio); - adjustWindowSize(); - } - if (this.height < _minHeight) { - video.height = _minHeight - 74; - video.width = Math.floor(video.height * _nAspectRatio); - adjustWindowSize(); - } - } - - public function onResizeEvent(event:MDIWindowEvent):void { - if (event.type == MDIWindowEvent.RESIZE) { - // test if we are already resizing - if (_bResizePossible) { - _bResizePossible = false; - resizeWindow(); - _bResizePossible = true; - } - } else if (event.type == MDIWindowEvent.RESIZE_END) { - adjustWindowSize(); - } - } - - private function resizeWindow():void { - // prevent the window for blinking - if (this.width == _nOldWindowWidth && this.height == _nOldWindowHeight) { - adjustWindowSize(); - return; - } - - _nOldWindowWidth = this.width; - _nOldWindowHeight = this.height; - - if (this.width == video.width + 6) { - // if it's a vertical resizing - video.height = this.height - 74; - video.width = video.height * _nAspectRatio; - } else { - // if it's a horizontal resizing - video.width = this.width - 6; - video.height = Math.floor (video.width / _nAspectRatio); - } - adjustWindowSize(); - } - - public function onMaximize(event:MDIWindowEvent):void { - _nSavedVideoWidth = video.width; - _nSavedVideoHeight = video.height; - - - var tmpWidth:Number = this.parent.width - 6; - var tmpHeight:Number = this.parent.height - 74; - - if (tmpWidth > tmpHeight * _nAspectRatio) - tmpWidth = tmpHeight * _nAspectRatio; - if (tmpHeight > Math.floor(tmpWidth / _nAspectRatio)) - tmpHeight = Math.floor(tmpWidth / _nAspectRatio); - - video.width = tmpWidth; - video.height = tmpHeight; - - video.x = Math.floor ((this.parent.width - 6 - video.width) / 2); - video.y = Math.floor ((this.parent.height - 74 - video.height) / 2); - } - - public function onRestore(event:MDIWindowEvent):void { - video.x = 0; - video.y = 0; - video.width = _nSavedVideoWidth; - video.height = _nSavedVideoHeight; - adjustWindowSize(); - } - - public function setWindowWidth(width:int):void { - if (video == null) return; - - video.width = width - 6; - video.height = Math.floor(video.width / _nAspectRatio); - adjustWindowSize(); - } - - static public function getMinWidth():int { - return _minWidth; - } - - static public function getMinHeight():int { - return _minHeight; - } - - static public function getWindowHeightByWidth(width:int, aspect:Number):int { - return Math.floor((width - 6) / aspect) + 74; - } - - static public function getWindowWidthByHeight(height:int, aspect:Number):int { - return Math.floor((height - 74) * aspect) + 6; - } - override protected function resourcesChanged():void{ super.resourcesChanged(); - this.title = ResourceUtil.getInstance().getString('bbb.publishVideo.title'); - } - - private function localeChanged(e:LocaleChangeEvent):void{ - resourcesChanged(); - } - - private function onResize():void{ - setWindowWidth(this.width); - } - + } + ]]> </mx:Script> - - <mx:UIComponent id="videoHolder" width="{camWidth}" height="{camHeight}" /> - + + <mx:UIComponent id="videoHolder" width="{camWidth}" height="{camHeight}" /> <mx:ControlBar id="videoOptionsBar" visible="true"> <mx:Button id="btnStartPublish" toolTip="{ResourceUtil.getInstance().getString('bbb.publishVideo.startPublishBtn.toolTip')}" icon="{camIcon}" click="startPublishing()" /> <mx:ComboBox id="cmbCameraSelector" dataProvider="{Camera.names}" width="150" visible="false" /> <mx:ComboBox id="cmbResolution" dataProvider="{resolutions}" width="20%" visible="false" /> </mx:ControlBar> - + <mate:Listener type="{CloseAllWindowsEvent.CLOSE_ALL_WINDOWS}" method="closeWindow" /> - <mate:Listener type="{LocaleChangeEvent.LOCALE_CHANGED}" method="localeChanged" /> -</pubVid:MDIWindow> +</pubVid:VideoWindowItf> diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/videoconf/views/VideoWindow.mxml b/bigbluebutton-client/src/org/bigbluebutton/modules/videoconf/views/VideoWindow.mxml index e61ca42c3cfceda71d875661f4d25c4998617b21..05308984e06721d884f1e0b36eea3b1a8c762338 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/videoconf/views/VideoWindow.mxml +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/videoconf/views/VideoWindow.mxml @@ -20,66 +20,50 @@ $Id: $ --> -<MDIWindow xmlns="flexlib.mdi.containers.*" +<VideoWindowItf xmlns="org.bigbluebutton.modules.videoconf.business.*" xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="init()" implements="org.bigbluebutton.common.IBbbModuleWindow" xmlns:mate="http://mate.asfusion.com/" - resize="onResize()"> + resize="onResize()" + layout="absolute"> <mx:Script> <![CDATA[ - import com.asfusion.mate.events.Dispatcher; - - import flexlib.mdi.events.MDIWindowEvent; - + import com.asfusion.mate.events.Dispatcher; + import flexlib.mdi.events.MDIWindowEvent; import mx.controls.Alert; - import mx.core.UIComponent; - + import mx.core.UIComponent; import org.bigbluebutton.common.LogUtil; import org.bigbluebutton.main.events.BBBEvent; import org.bigbluebutton.main.views.MainCanvas; import org.bigbluebutton.modules.videoconf.events.CloseAllWindowsEvent; + import org.bigbluebutton.common.events.CloseWindowEvent; import org.bigbluebutton.modules.videoconf.model.VideoConfOptions; - - public var resolutions:Array = new Array("320x240", "640x480"); - - private var video:Video; - private var ns:NetStream; - private var videoHolder:UIComponent; - private var stream:String; - private var videoHeight:Number; - private var videoWidth:Number; - - private var _bResizePossible:Boolean = true; - private var _nAspectRatio:Number = 1; - - static private var _minWidth:int = 166; - static private var _minHeight:int = 149; - - private var _nSavedVideoWidth:Number = 0; - private var _nSavedVideoHeight:Number = 0; - private var _nOldWindowWidth:Number = 0; - private var _nOldWindowHeight:Number = 0; - - private var _xPosition:int; - private var _yPosition:int; - + + private var ns:NetStream; private var globalDispatcher:Dispatcher; [Bindable] public var videoOptions:VideoConfOptions; private function init():void{ - videoHolder = new UIComponent(); - videoHolder.addChild(video); - this.addChild(videoHolder); + _videoHolder = new UIComponent(); + _videoHolder.addChild(_video); + this.addChild(_videoHolder); - addEventListener(MDIWindowEvent.RESIZE_END, onResizeEvent); - addEventListener(MDIWindowEvent.RESIZE, onResizeEvent); - addEventListener(MDIWindowEvent.MAXIMIZE, onMaximize); - addEventListener(MDIWindowEvent.RESTORE, onRestore); + addEventListener(MDIWindowEvent.RESIZE_START, onResizeStart); + addEventListener(MDIWindowEvent.RESIZE_END, onResizeEnd); addEventListener(MDIWindowEvent.CLOSE, onCloseEvent); + + addEventListener(MDIWindowEvent.DRAG_START, onDragStart); + addEventListener(MDIWindowEvent.DRAG, onDrag); + addEventListener(MDIWindowEvent.DRAG_END, onDragEnd); + addEventListener(MouseEvent.MOUSE_OVER, showButtons); + addEventListener(MouseEvent.MOUSE_OUT, hideButtons); + addEventListener(MouseEvent.DOUBLE_CLICK, onDoubleClick); + + createButtons(); globalDispatcher = new Dispatcher(); @@ -87,14 +71,24 @@ this.minHeight = _minHeight; maximizeRestoreBtn.visible = true; this.resizable = true; + + /** + * At this point, the function startVideo has been called, and + * the video has the exactly dimensions of the original stream. + * It's needed to call onResize() to fit the video window in the + * main canvas in case that the video dimensions are larger than + * the parent window. + */ + onResize(); + if (videoOptions.viewerWindowMaxed) this.maximize(); } private function onCloseEvent(event:MDIWindowEvent = null):void { - LogUtil.debug("ViewWindow closing " + stream); + LogUtil.debug("ViewWindow closing " + streamName); var bbbEvt:BBBEvent = new BBBEvent("ViewVideoCloseEvent"); - bbbEvt.message = stream; + bbbEvt.message = streamName; dispatchEvent(bbbEvt); } @@ -107,58 +101,43 @@ ns.receiveVideo(true); ns.receiveAudio(false); - setVideoResolution(stream); - video = new Video(this.width, this.height); - video.width = this.width; - video.height = this.height; - video.attachNetStream(ns); - ns.play(stream); - this.stream = stream; - - this.width = video.width + 6; - this.height = video.height + 29; - } - - private function setVideoResolution(stream:String):void{ - for each (var resStr:String in resolutions){ - LogUtil.debug("VideoWindow::setVideoResolution testing " + resStr); - if (resStr == stream.substr(0, resStr.length)) { - var res:Array = resStr.split( "x" ); - this.width = Number(res[0]); - this.height = Number(res[1]); - LogUtil.debug("VideoWindow::setVideoResolution width=" + this.width + " height=" + this.height); - _nAspectRatio = (this.width/this.height); - break; - } - } + var res:Array = getVideoResolution(stream); + if (res == null) // error + return; + _video = new Video(Number(res[0]), Number(res[1])); + _video.width = originalWidth = Number(res[0]); + _video.height = originalHeight = Number(res[1]); + setAspectRatio(Number(res[0]), Number(res[1])); + _video.attachNetStream(ns); + ns.play(stream); + this.streamName = stream; + + this.width = _video.width + paddingHorizontal; + this.height = _video.height + paddingVertical; } - + private function onAsyncError(e:AsyncErrorEvent):void{ LogUtil.debug("VideoWindow::asyncerror " + e.toString()); } public function onMetaData(info:Object):void{ LogUtil.debug("metadata: width=" + info.width + " height=" + info.height); - video.width = info.width; - video.height = info.height; - adjustWindowSize(); - } - - public function getPrefferedPosition():String { - if (videoOptions.viewerWindowLocation == "MIDDLE") { - return MainCanvas.MIDDLE; - } - return MainCanvas.POPUP; + _video.width = info.width; + _video.height = info.height; + setAspectRatio(info.width, info.height); + onResize(); } - + private function onNetStatus(e:NetStatusEvent):void{ switch(e.info.code){ case "NetStream.Publish.Start": - LogUtil.debug("NetStream.Publish.Start for broadcast stream " + stream); + LogUtil.debug("NetStream.Publish.Start for broadcast stream " + streamName); break; case "NetStream.Play.UnpublishNotify": ns.close(); this.close(); + // shouldn't call onCloseEvent() here because of the viewer cam icon + super.close(); break; case "NetStream.Play.Start": LogUtil.debug("Netstatus: " + e.info.code); @@ -175,131 +154,16 @@ override public function close(event:MouseEvent=null):void{ ns.close(); - //onCloseEvent(); + onCloseEvent(); super.close(event); } private function closeWindow(e:CloseAllWindowsEvent):void{ this.close(); } - - private function adjustWindowSize():void{ - if (videoHolder == null) return; - - videoHolder.width = video.width; - videoHolder.height = video.height; - this.width = video.width + 6; - this.height = video.height + 29; - - // prevent to show a video window bigger than the parent window - if (this.width > this.parent.width) { - video.width = this.parent.width - 6; - video.height = Math.floor(video.width / _nAspectRatio); - adjustWindowSize(); - } - if (this.height > this.parent.height) { - video.height = this.parent.height - 29; - video.width = Math.floor(video.height * _nAspectRatio); - adjustWindowSize(); - } - if (this.width < _minWidth) { - video.width = _minWidth - 6; - video.height = Math.floor(video.width / _nAspectRatio); - adjustWindowSize(); - } - if (this.height < _minHeight) { - video.height = _minHeight - 29; - video.width = Math.floor(video.height * _nAspectRatio); - adjustWindowSize(); - } - } - - public function onResizeEvent(event:MDIWindowEvent):void { - if (event.type == MDIWindowEvent.RESIZE) { - // test if we are already resizing - if (_bResizePossible) { - _bResizePossible = false; - resizeWindow(); - _bResizePossible = true; - } - } else if (event.type == MDIWindowEvent.RESIZE_END) { - adjustWindowSize(); - } - } - - private function resizeWindow():void { - // prevent the window for blinking - if (this.width == _nOldWindowWidth && this.height == _nOldWindowHeight) { - adjustWindowSize(); - return; - } - - _nOldWindowWidth = this.width; - _nOldWindowHeight = this.height; - - if (this.width == video.width + 6) { - // if it's a vertical resizing - video.height = this.height - 29; - video.width = video.height * _nAspectRatio; - } else { - // if it's a horizontal resizing - video.width = this.width - 6; - video.height = Math.floor (video.width / _nAspectRatio); - } - - adjustWindowSize(); - } - - public function onMaximize(event:MDIWindowEvent):void { - _nSavedVideoWidth = video.width; - _nSavedVideoHeight = video.height; - - - var tmpWidth:Number = this.parent.width - 6; - var tmpHeight:Number = this.parent.height - 29; - - if (tmpWidth > tmpHeight * _nAspectRatio) - tmpWidth = tmpHeight * _nAspectRatio; - if (tmpHeight > Math.floor(tmpWidth / _nAspectRatio)) - tmpHeight = Math.floor(tmpWidth / _nAspectRatio); - - video.width = tmpWidth; - video.height = tmpHeight; - - video.x = Math.floor ((this.parent.width - 6 - video.width) / 2); - video.y = Math.floor ((this.parent.height - 29 - video.height) / 2); - } - - public function onRestore(event:MDIWindowEvent):void { - video.x = 0; - video.y = 0; - video.width = _nSavedVideoWidth; - video.height = _nSavedVideoHeight; - adjustWindowSize(); - } - - public function setWindowWidth(width:int):void { - if (video == null) return; - - video.width = width - 6; - video.height = Math.floor(video.width / _nAspectRatio); - adjustWindowSize(); - } - - static public function getMinWidth():int { - return _minWidth; - } - - static public function getMinHeight():int { - return _minHeight; - } - - private function onResize():void{ - setWindowWidth(this.width); - } - + ]]> </mx:Script> <mate:Listener type="{CloseAllWindowsEvent.CLOSE_ALL_WINDOWS}" method="closeWindow" /> -</MDIWindow> +</VideoWindowItf> diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/videodock/maps/VideoDockEventMap.mxml b/bigbluebutton-client/src/org/bigbluebutton/modules/videodock/maps/VideoDockEventMap.mxml new file mode 100755 index 0000000000000000000000000000000000000000..28b17f7750bbf172c9bf31683f62a4c9bfc9179e --- /dev/null +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/videodock/maps/VideoDockEventMap.mxml @@ -0,0 +1,51 @@ +<?xml version="1.0" encoding="utf-8"?> + +<!-- +BigBlueButton open source conferencing system - http://www.bigbluebutton.org + +Copyright (c) 2010 BigBlueButton Inc. and by respective authors (see below). + +BigBlueButton 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 <http://www.gnu.org/licenses/>. + +$Id: $ +--> + +<EventMap xmlns:mx="http://www.adobe.com/2006/mxml" xmlns="http://mate.asfusion.com/"> + <mx:Script> + <![CDATA[ + import org.bigbluebutton.common.LogUtil; + import org.bigbluebutton.common.events.OpenWindowEvent; + import org.bigbluebutton.common.events.CloseWindowEvent; + + import org.bigbluebutton.modules.videodock.views.VideoDock; + + public var module:VideodockModule; + private var videoDock:VideoDock; + + public function startModule():void{ + videoDock = new VideoDock(); + videoDock.autoDock = module.autoDock; + + var windowEvent:OpenWindowEvent = new OpenWindowEvent(OpenWindowEvent.OPEN_WINDOW_EVENT); + windowEvent.window = videoDock; + globalDispatcher.dispatchEvent(windowEvent); + } + + public function stopModule():void { + videoDock.removeAllChildren(); + } + + ]]> + </mx:Script> + +</EventMap> \ No newline at end of file diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/videodock/views/VideoDock.mxml b/bigbluebutton-client/src/org/bigbluebutton/modules/videodock/views/VideoDock.mxml new file mode 100755 index 0000000000000000000000000000000000000000..4b9e09059a1efed71c6f598dba038651a4ec47ff --- /dev/null +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/videodock/views/VideoDock.mxml @@ -0,0 +1,265 @@ +<?xml version="1.0" encoding="utf-8"?> + +<!-- +BigBlueButton open source conferencing system - http://www.bigbluebutton.org + +Copyright (c) 2010 BigBlueButton Inc. and by respective authors (see below). + +BigBlueButton 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 <http://www.gnu.org/licenses/>. + +$Id: $ +--> + +<MDIWindow xmlns="flexlib.mdi.containers.*" + xmlns:mx="http://www.adobe.com/2006/mxml" + creationComplete="init()" + implements="org.bigbluebutton.common.IBbbModuleWindow" + title="{ResourceUtil.getInstance().getString('bbb.videodock.title')}" + xmlns:mate="http://mate.asfusion.com/" + layout="absolute" + horizontalAlign="center" + verticalAlign="middle" + resize="onChildAdd()" + backgroundColor="0xDDDDDD"> + + <mx:Script> + <![CDATA[ + + import org.bigbluebutton.common.LogUtil; + import org.bigbluebutton.common.events.DragWindowEvent; + import org.bigbluebutton.common.events.OpenWindowEvent; + import org.bigbluebutton.common.events.CloseWindowEvent; + import org.bigbluebutton.main.views.MainCanvas; + import org.bigbluebutton.modules.videoconf.business.VideoWindowItf; + import org.bigbluebutton.modules.videoconf.events.OpenVideoWindowEvent; + import org.bigbluebutton.util.i18n.ResourceUtil; + + import mx.events.ChildExistenceChangedEvent; + + public var autoDock:Boolean = false; + private var childrenDimension:Dictionary = new Dictionary(); + private var borderColor:String; + + private function init():void{ + this.showCloseButton = false; + + this.minWidth = 172; + this.minHeight = 179; + this.maxWidth = this.parent.width; + this.maxHeight = this.parent.height; + + this.width = this.minWidth; + this.height = this.minHeight; + + addEventListener(ChildExistenceChangedEvent.CHILD_ADD, onChildAdd); + addEventListener(ChildExistenceChangedEvent.CHILD_REMOVE, onChildRemove); + addEventListener(MouseEvent.DOUBLE_CLICK, onDoubleClick); + } + + private function onChildAdd(e:ChildExistenceChangedEvent = null):void { + updateChildrenDimensions(this.getChildren()); + } + + private function onChildRemove(e:ChildExistenceChangedEvent = null):void { + // copy the children array to "remove" the removing child and update the dimensions correctly + var children:Array = this.getChildren(); + var index:int = children.indexOf(e.relatedObject); + if (index != -1) + children.splice(index, 1); + updateChildrenDimensions(children); + } + + public function getPrefferedPosition():String{ + return MainCanvas.BOTTOM_RIGHT; + } + + private function onDragVideoWindow(e:DragWindowEvent):void{ + switch (e.mode) { + case DragWindowEvent.DRAG: + if (hitTestPoint(e.mouseGlobal.x, e.mouseGlobal.y, true)) { + setStyle("borderColor","0xFF0000"); + e.window.width = e.window.minWidth; + e.window.height = e.window.minHeight; + } else { + setStyle("borderColor",borderColor); + restoreWindowDimensions(e.window); + } + break; + case DragWindowEvent.DRAG_START: + borderColor = getStyle("borderColor"); + removeVideoChild(e.window as VideoWindowItf); + saveWindowDimensions(e.window); + break; + case DragWindowEvent.DRAG_END: + setStyle("borderColor",borderColor); + restoreWindowDimensions(e.window); + if (hitTestPoint(e.mouseGlobal.x, e.mouseGlobal.y, true)) + addVideoChild(e.window as VideoWindowItf); + break; + } + } + + private function saveWindowDimensions(window:MDIWindow):void { + var dimensions:Object = {width:window.width, height:window.height}; + childrenDimension[window] = dimensions; + } + + private function restoreWindowDimensions(window:MDIWindow):void { + window.width = childrenDimension[window].width; + window.height = childrenDimension[window].height; + } + + private function repositionWindow(window:MDIWindow):void { + // \TODO reposition the window correctly between the windows + // setChildIndex(window, ?); + } + + private function isVideoWindow(window:Object):Boolean { + return (getQualifiedSuperclassName(window) == "org.bigbluebutton.modules.videoconf.business::VideoWindowItf") + } + + private function onCloseWindow(e:CloseWindowEvent):void { + // it should not just undock the window, it should close the window forever + if (isVideoWindow(e.window) && this.contains(e.window as VideoWindowItf)) + this.removeChild(e.window as VideoWindowItf); + } + + private function onOpenWindow(e:OpenVideoWindowEvent):void { + if (isVideoWindow(e.window) && autoDock) + addVideoChild(e.window as VideoWindowItf); + } + + private function addVideoChild(window:VideoWindowItf):void { + if (this.contains(window)) + return; + + LogUtil.debug("Docking window"); + + saveWindowDimensions(window); + + window.minimizeBtn.visible = false; + window.maximizeRestoreBtn.visible = false; + window.resizable = false; + window.buttonsEnabled = false; + + var e:CloseWindowEvent = new CloseWindowEvent(); + e.window = window; + dispatchEvent(e); + this.addChild(window); + } + + private function removeVideoChild(window:VideoWindowItf):void { + if (!this.contains(window)) + return; + + window.minimizeBtn.visible = true; + window.maximizeRestoreBtn.visible = true; + window.resizable = true; + window.buttonsEnabled = true; + + this.removeChild(window); + var e:OpenWindowEvent = new OpenWindowEvent(OpenWindowEvent.OPEN_WINDOW_EVENT); + e.window = window; + dispatchEvent(e); + + restoreWindowDimensions(window); + } + + override public function close(event:MouseEvent = null):void { + removeAllChildren(); + super.close(event); + } + + private function updateChildrenDimensions(children:Array):void { + var numChildren:int = children.length; + if (numChildren == 0) return; + + var horizontalGap:Number = getStyle("horizontalGap"); + var verticalGap:Number = getStyle("verticalGap"); + + var availableWidth:Number = this.width + - this.borderMetrics.left - this.borderMetrics.right; + var availableHeight:Number = this.height + - this.borderMetrics.top - this.borderMetrics.bottom; + + var childWidth:Number = 0; + var childHeight:Number = 0; + var nRows:Number = 0; + var nColumns:Number = 0; + + // we would like to maximize the window size + for (var rows:Number = 1; rows <= numChildren; ++rows) { + var columns:Number = Math.ceil(numChildren / rows); + var maxWidth:Number = Math.floor((availableWidth - horizontalGap * (columns - 1)) / columns) - VideoWindowItf.PADDING_HORIZONTAL; + var maxHeight:Number = Math.floor((availableHeight - verticalGap * (rows - 1)) / rows) - VideoWindowItf.PADDING_VERTICAL; + + // the possible dimensions shouldn't be less or equal 0 (it could happen with many videos) + if (maxWidth <= 0 || maxHeight <=0) + continue; + + var desiredAR:Number = 4/3; + var width:Number = maxWidth; + var height:Number = maxHeight; + if (maxWidth / maxHeight > desiredAR) + width = Math.floor(maxHeight * desiredAR); + else + height = Math.floor(maxWidth / desiredAR); + + if (width > childWidth) { + childWidth = width; + childHeight = height; + nRows = rows; + nColumns = columns; + } + } + + childWidth += VideoWindowItf.PADDING_HORIZONTAL; + childHeight += VideoWindowItf.PADDING_VERTICAL; + + for (var childIndex:int = 0; childIndex < numChildren; ++childIndex) { + var window:VideoWindowItf = children[childIndex]; + window.width = childWidth; + window.updateHeight(); + + if (window.height > childHeight) { + window.height = childHeight; + window.updateWidth(); + } + + var row:int = childIndex / nColumns; + var column:int = childIndex % nColumns; + + var borderTop:int = (availableHeight - nRows * childHeight - (nRows - 1) * verticalGap) / 2; + var borderLeft:int = (availableWidth - nColumns * childWidth - (nColumns - 1) * horizontalGap) / 2; + + window.y = row * (childHeight + verticalGap) + borderTop; + window.x = column * (childWidth + horizontalGap) + borderLeft; + } + } + + protected function onDoubleClick(event:MouseEvent = null):void { + this.maximizeRestore(); + } + + override protected function resourcesChanged():void{ + super.resourcesChanged(); + this.title = ResourceUtil.getInstance().getString('bbb.videodock.title'); + } + + ]]> + </mx:Script> + + <mate:Listener type="{DragWindowEvent.DRAG_WINDOW_EVENT}" method="onDragVideoWindow" /> + <mate:Listener type="{OpenVideoWindowEvent.OPEN_VIDEO_WINDOW_EVENT}" method="onOpenWindow" /> + <mate:Listener type="{CloseWindowEvent.CLOSE_WINDOW_EVENT}" method="onCloseWindow" /> +</MDIWindow> \ No newline at end of file diff --git a/bigbluebutton-client/src/org/bigbluebutton/util/i18n/ResourceUtil.as b/bigbluebutton-client/src/org/bigbluebutton/util/i18n/ResourceUtil.as index a927baced0bf5521f95811a4d89ddd2b8a2e5321..6395b428100597fd0adcd8fd3ec743996f641b05 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/util/i18n/ResourceUtil.as +++ b/bigbluebutton-client/src/org/bigbluebutton/util/i18n/ResourceUtil.as @@ -19,8 +19,6 @@ package org.bigbluebutton.util.i18n { import com.adobe.utils.StringUtil; - import com.asfusion.mate.events.Dispatcher; - import flash.events.Event; import flash.events.EventDispatcher; import flash.events.IEventDispatcher; @@ -48,7 +46,7 @@ package org.bigbluebutton.util.i18n private static var BBB_RESOURCE_BUNDLE:String = 'bbbResources'; public static var DEFAULT_LANGUAGE:String = "en_US"; private static var currentLanguage:String = DEFAULT_LANGUAGE; - private var eventDispatcher:Dispatcher = new Dispatcher(); + private var eventDispatcher:IEventDispatcher; private var localeChain:Array = new Array(); private var resourceManager:IResourceManager; @@ -94,11 +92,23 @@ package org.bigbluebutton.util.i18n if (resourceManager.localeChain[0] == localeChain[i]) localeAvailable = true; } - //Locale not found, set default - changeLocale(DEFAULT_LANGUAGE); + /** + * http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/mx/resources/IResourceManager.html#localeChain + * Always load the default language, so if the chosen language + * doesn't provide a resource, the default language resource is used + */ + load(DEFAULT_LANGUAGE); + if (!localeAvailable) + resourceManager.localeChain = [DEFAULT_LANGUAGE]; + changeLocale(resourceManager.localeChain[0]); } + private function load(language:String):IEventDispatcher { + var localeURI:String = 'locale/' + language + '_resources.swf'; + return resourceManager.loadResourceModule(localeURI, false); + } + public static function getInstance():ResourceUtil { if (instance == null) { LogUtil.debug("Setting up supported locales."); @@ -107,62 +117,41 @@ package org.bigbluebutton.util.i18n return instance; } - public function changeLocale(language:String):void{ - var localeURI:String = 'locale/' + language + '/bbbResources.properties'; - - var date:Date = new Date(); - var _urlLoader:URLLoader = new URLLoader(); - _urlLoader.addEventListener(Event.COMPLETE, handleLocaleLoaded); - _urlLoader.addEventListener(IOErrorEvent.IO_ERROR, handleResourceNotLoaded); - _urlLoader.load(new URLRequest(localeURI + "?a=" + date.time)); - - currentLanguage = language; - } - - private function handleLocaleLoaded(e:Event):void{ - var fulltext:String = (e.target.data as String); - fulltext = com.adobe.utils.StringUtil.remove(fulltext, "\r"); - - var allStrings:Array = fulltext.split("\n"); - for (var i:Number=0; i<allStrings.length; i++){ - var str:String = allStrings[i] as String; + public function changeLocale(... chain):void{ + if(chain != null && chain.length > 0) + { + eventDispatcher = load(chain[0]); + localeChain = [chain[0]]; + eventDispatcher.addEventListener(ResourceEvent.COMPLETE, localeChangeComplete); + eventDispatcher.addEventListener(ResourceEvent.ERROR, handleResourceNotLoaded); - if (str.charAt(0) != '#'){ - var keyValue:Array = str.split("="); - var key:String = mx.utils.StringUtil.trim(keyValue[0] as String); - var value:String = mx.utils.StringUtil.trim(keyValue[1] as String); - currentLocalization[key] = value; - trace(key + "=" + value); - } + currentLanguage = chain[0]; } - - trace(currentLocalization['bbb.logout.usercommand']); - + } + + private function localeChangeComplete(event:ResourceEvent):void{ + if (localeChain[0] != DEFAULT_LANGUAGE) + localeChain.push(DEFAULT_LANGUAGE); + resourceManager.localeChain = localeChain; update(); } - - /** - * Defaults to DEFAULT_LANGUAGE when an error is thrown by the ResourceManager - * @param event - */ - private function handleResourceNotLoaded(event:ResourceEvent):void{ - currentLanguage = DEFAULT_LANGUAGE; - update(); - } - - public function update():void{ - eventDispatcher.dispatchEvent(new LocaleChangeEvent(LocaleChangeEvent.LOCALE_CHANGED)); - dispatchEvent(new Event(Event.CHANGE)); - } - - [Bindable("change")] - public function getString(resourceName:String, parameters:Array = null, locale:String = null):String{ - if (!parameters) return currentLocalization[resourceName]; //resourceManager.getString(BBB_RESOURCE_BUNDLE, resourceName, parameters, locale); - else return insertParameters(currentLocalization[resourceName], parameters); + + /** + * Defaults to DEFAULT_LANGUAGE when an error is thrown by the ResourceManager + * @param event + */ + private function handleResourceNotLoaded(event:ResourceEvent):void{ + resourceManager.localeChain = [DEFAULT_LANGUAGE]; + update(); + } + + public function update():void{ + dispatchEvent(new Event(Event.CHANGE)); } - private function insertParameters(text:String, parameters:Array):String{ - return mx.utils.StringUtil.substitute(text, parameters); + [Bindable("change")] + public function getString(resourceName:String, parameters:Array = null, locale:String = null):String{ + return resourceManager.getString(BBB_RESOURCE_BUNDLE, resourceName, parameters, locale); } public function getCurrentLanguageCode():String{ diff --git a/bigbluebutton-client/src/swfobject/swfobject.js b/bigbluebutton-client/src/swfobject/swfobject.js deleted file mode 100644 index 083b9b1a06de3677761affd37fe7f23aed24d0c6..0000000000000000000000000000000000000000 --- a/bigbluebutton-client/src/swfobject/swfobject.js +++ /dev/null @@ -1,145 +0,0 @@ -/** - * SWFObject v1.4.3: Flash Player detection and embed - http://blog.deconcept.com/swfobject/ - * - * SWFObject is (c) 2006 Geoff Stearns and is released under the MIT License: - * http://www.opensource.org/licenses/mit-license.php - * - * **SWFObject is the SWF embed script formerly known as FlashObject. The name was changed for - * legal reasons. - */ -if(typeof deconcept=="undefined"){var deconcept=new Object();} -if(typeof deconcept.util=="undefined"){deconcept.util=new Object();} -if(typeof deconcept.SWFObjectUtil=="undefined"){deconcept.SWFObjectUtil=new Object();} -deconcept.SWFObject=function(_1,id,w,h,_5,c,_7,_8,_9,_a,_b){ -if(!document.getElementById){return;} -this.DETECT_KEY=_b?_b:"detectflash"; -this.skipDetect=deconcept.util.getRequestParameter(this.DETECT_KEY); -this.params=new Object(); -this.variables=new Object(); -this.attributes=new Array(); -if(_1){this.setAttribute("swf",_1);} -if(id){this.setAttribute("id",id);} -if(w){this.setAttribute("width",w);} -if(h){this.setAttribute("height",h);} -if(_5){this.setAttribute("version",new deconcept.PlayerVersion(_5.toString().split(".")));} -this.installedVer=deconcept.SWFObjectUtil.getPlayerVersion(); -if(c){this.addParam("bgcolor",c);} -var q=_8?_8:"high"; -this.addParam("quality",q); -this.setAttribute("useExpressInstall",_7); -this.setAttribute("doExpressInstall",false); -var _d=(_9)?_9:window.location; -this.setAttribute("xiRedirectUrl",_d); -this.setAttribute("redirectUrl",""); -if(_a){this.setAttribute("redirectUrl",_a);}}; -deconcept.SWFObject.prototype={setAttribute:function(_e,_f){ -this.attributes[_e]=_f; -},getAttribute:function(_10){ -return this.attributes[_10]; -},addParam:function(_11,_12){ -this.params[_11]=_12; -},getParams:function(){ -return this.params; -},addVariable:function(_13,_14){ -this.variables[_13]=_14; -},getVariable:function(_15){ -return this.variables[_15]; -},getVariables:function(){ -return this.variables; -},getVariablePairs:function(){ -var _16=new Array(); -var key; -var _18=this.getVariables(); -for(key in _18){_16.push(key+"="+_18[key]);} -return _16; -},getSWFHTML:function(){ -var _19=""; -if(navigator.plugins&&navigator.mimeTypes&&navigator.mimeTypes.length){ -if(this.getAttribute("doExpressInstall")){this.addVariable("MMplayerType","PlugIn");} -_19="<embed type=\"application/x-shockwave-flash\" src=\""+this.getAttribute("swf")+"\" width=\""+this.getAttribute("width")+"\" height=\""+this.getAttribute("height")+"\""; -_19+=" id=\""+this.getAttribute("id")+"\" name=\""+this.getAttribute("id")+"\" "; -var _1a=this.getParams(); -for(var key in _1a){_19+=[key]+"=\""+_1a[key]+"\" ";} -var _1c=this.getVariablePairs().join("&"); -if(_1c.length>0){_19+="flashvars=\""+_1c+"\"";} -_19+="/>"; -}else{ -if(this.getAttribute("doExpressInstall")){this.addVariable("MMplayerType","ActiveX");} -_19="<object id=\""+this.getAttribute("id")+"\" classid=\"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\" width=\""+this.getAttribute("width")+"\" height=\""+this.getAttribute("height")+"\">"; -_19+="<param name=\"movie\" value=\""+this.getAttribute("swf")+"\" />"; -var _1d=this.getParams(); -for(var key in _1d){_19+="<param name=\""+key+"\" value=\""+_1d[key]+"\" />";} -var _1f=this.getVariablePairs().join("&"); -if(_1f.length>0){_19+="<param name=\"flashvars\" value=\""+_1f+"\" />";} -_19+="</object>";} -return _19; -},write:function(_20){ -if(this.getAttribute("useExpressInstall")){ -var _21=new deconcept.PlayerVersion([6,0,65]); -if(this.installedVer.versionIsValid(_21)&&!this.installedVer.versionIsValid(this.getAttribute("version"))){ -this.setAttribute("doExpressInstall",true); -this.addVariable("MMredirectURL",escape(this.getAttribute("xiRedirectUrl"))); -document.title=document.title.slice(0,47)+" - Flash Player Installation"; -this.addVariable("MMdoctitle",document.title);}} -if(this.skipDetect||this.getAttribute("doExpressInstall")||this.installedVer.versionIsValid(this.getAttribute("version"))){ -var n=(typeof _20=="string")?document.getElementById(_20):_20; -n.innerHTML=this.getSWFHTML(); -return true; -}else{ -if(this.getAttribute("redirectUrl")!=""){document.location.replace(this.getAttribute("redirectUrl"));}} -return false;}}; -deconcept.SWFObjectUtil.getPlayerVersion=function(){ -var _23=new deconcept.PlayerVersion([0,0,0]); -if(navigator.plugins&&navigator.mimeTypes.length){ -var x=navigator.plugins["Shockwave Flash"]; -if(x&&x.description){_23=new deconcept.PlayerVersion(x.description.replace(/([a-zA-Z]|\s)+/,"").replace(/(\s+r|\s+b[0-9]+)/,".").split("."));} -}else{try{var axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash.7");} -catch(e){try{var axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash.6"); -_23=new deconcept.PlayerVersion([6,0,21]); -axo.AllowScriptAccess="always"; -}catch(e){ -if(_23.major==6){return _23;}} -try{axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash");} -catch(e){}} -if(axo!=null){_23=new deconcept.PlayerVersion(axo.GetVariable("$version").split(" ")[1].split(","));}} -return _23;}; -deconcept.PlayerVersion=function(_27){ -this.major=_27[0]!=null?parseInt(_27[0]):0; -this.minor=_27[1]!=null?parseInt(_27[1]):0; -this.rev=_27[2]!=null?parseInt(_27[2]):0; -}; -deconcept.PlayerVersion.prototype.versionIsValid=function(fv){ -if(this.major<fv.major){return false;} -if(this.major>fv.major){return true;} -if(this.minor<fv.minor){return false;} -if(this.minor>fv.minor){return true;} -if(this.rev<fv.rev){return false;}return true;}; -deconcept.util={getRequestParameter:function(_29){ -var q=document.location.search||document.location.hash; -if(q){var _2b=q.substring(1).split("&"); -for(var i=0;i<_2b.length;i++){ -if(_2b[i].substring(0,_2b[i].indexOf("="))==_29){ -return _2b[i].substring((_2b[i].indexOf("=")+1));}}} -return "";}}; -deconcept.SWFObjectUtil.cleanupSWFs=function(){ -var _2d=document.getElementsByTagName("OBJECT"); -if(_2d.length>0){__flash_unloadHandler=function(){};__flash_savedUnloadHandler=function(){};} -for(var i=0;i<_2d.length;i++){ -_2d[i].style.display="none"; -for(var x in _2d[i]){ -if(typeof _2d[i][x]=="function"){_2d[i][x]=function(){};}}}}; -if(typeof window.onbeforeunload=="function"){ -var oldBeforeUnload=window.onbeforeunload; -window.onbeforeunload=function(){ -deconcept.SWFObjectUtil.cleanupSWFs(); -oldBeforeUnload();}; -}else{window.onbeforeunload=deconcept.SWFObjectUtil.cleanupSWFs;} -if(Array.prototype.push==null){ -Array.prototype.push=function(_30){ -this[this.length]=_30; -return this.length;};} - -var getQueryParamValue=deconcept.util.getRequestParameter; -var FlashObject=deconcept.SWFObject; -var SWFObject=deconcept.SWFObject; -