Merge branch 'master' into sharedNotes0.8

This commit is contained in:
firstuser 2012-03-12 12:26:54 -03:00
commit ff493885c9
122 changed files with 3020 additions and 1803 deletions

View File

@ -221,7 +221,7 @@ public String getJoinURL(String username, String meetingID, String record, Strin
//
//Create a meeting and return a URL to join it as moderator
//
public String getJoinURLXML(String username, String meetingID, String welcome, String xml_param) {
public String getJoinURLXML(String username, String meetingID, String welcome, String xml) {
String base_url_create = BigBlueButtonURL + "api/create?";
String base_url_join = BigBlueButtonURL + "api/join?";
@ -234,6 +234,11 @@ public String getJoinURLXML(String username, String meetingID, String welcome, S
welcome_param = "&welcome=" + urlEncode(welcome);
}
String xml_param = "";
if ((xml != null) && !xml.equals("")) {
xml_param = xml;
}
String create_parameters = "name=" + urlEncode(meetingID)
+ "&meetingID=" + urlEncode(meetingID) + welcome_param
+ "&attendeePW=ap&moderatorPW=mp&voiceBridge=" + voiceBridge;
@ -242,10 +247,10 @@ public String getJoinURLXML(String username, String meetingID, String welcome, S
try {
// Attempt to create a meeting using meetingID
String xml = postURL(base_url_create + create_parameters
String params = postURL(base_url_create + create_parameters
+ "&checksum="
+ checksum("create" + create_parameters + salt), xml_param);
doc = parseXml(xml);
doc = parseXml(params);
} catch (Exception e) {
e.printStackTrace();
}

View File

@ -85,8 +85,8 @@ if (request.getParameterMap().isEmpty()) {
//
String url = BigBlueButtonURL.replace("bigbluebutton/","demo/");
String preUploadPDF = "<?xml version='1.0' encoding='UTF-8'?><modules><module name='presentation'><document url='"+url+"pdfs/sample.pdf'/></module></modules>";
String joinURL = getJoinURL(request.getParameter("username"), "Demo Meeting", "false", null, null, preUploadPDF);
// String preUploadPDF = "<?xml version='1.0' encoding='UTF-8'?><modules><module name='presentation'><document url='"+url+"pdfs/sample.pdf'/></module></modules>";
String joinURL = getJoinURL(request.getParameter("username"), "Demo Meeting", "false", null, null, null);
if (joinURL.startsWith("http://")) {
%>

View File

@ -106,9 +106,9 @@ Author: Fred Dixon <ffdixon@bigbluebutton.org>
// String joinURL = getJoinURL(username, meetingID, "Welcome to " + meetingID );
// Update: added record parameter, default false
String url = BigBlueButtonURL.replace("bigbluebutton/","demo/");
String preUploadPDF = "<?xml version='1.0' encoding='UTF-8'?><modules><module name='presentation'><document url='"+url+"pdfs/sample.pdf'/></module></modules>";
// String preUploadPDF = "<?xml version='1.0' encoding='UTF-8'?><modules><module name='presentation'><document url='"+url+"pdfs/sample.pdf'/></module></modules>";
// String joinURL = getJoinURL(username, meetingID, "false", "<br>Welcome to course: %%CONFNAME%%.<br>", null, preUploadPDF );
String joinURL = getJoinURL(username, meetingID, "false", null, null, preUploadPDF );
String joinURL = getJoinURL(username, meetingID, "false", null, null, null );
if (joinURL.startsWith("http://")) {
%>

View File

@ -70,10 +70,10 @@
while (itr.hasNext()) {
FileItem item = (FileItem) itr.next();
String xml = null;
String url = BigBlueButtonURL.replace("bigbluebutton/","demo/");
String preUploadPDF = "<?xml version='1.0' encoding='UTF-8'?><modules><module name='presentation'><document url='"+url+"pdfs/sample.pdf'/></module></modules>";
// String url = BigBlueButtonURL.replace("bigbluebutton/","demo/");
// String preUploadPDF = "<?xml version='1.0' encoding='UTF-8'?><modules><module name='presentation'><document url='"+url+"pdfs/sample.pdf'/></module></modules>";
xml = preUploadPDF;
// xml = preUploadPDF;
if (item.isFormField())
{
String name = item.getFieldName();

View File

@ -1,4 +1,4 @@
<img src="/bigbluebutton/images/bbb_banner.jpg" /><br>
<img src="images/bbb_banner.jpg" /><br>
<a href="demo1.jsp">Join</a> |
<a href="demo2.jsp">Join Selected</a> |
<a href="demo3.jsp">Join Password</a> &nbsp;&nbsp;&nbsp;

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

View File

@ -27,7 +27,7 @@
</bean>
<bean id="web.handler" class="org.bigbluebutton.app.video.VideoApplication">
<property name="recordVideoStream" value="true"/>
<property name="recordVideoStream" value="false"/>
<property name="eventRecordingService" ref="redisRecorder"/>
</bean>

View File

@ -1,22 +1,3 @@
/*
* Copyright (c) 2008, 2009 by Xuggle Incorporated. All rights reserved.
*
* This file is part of Xuggler.
*
* You can redistribute Xuggler and/or modify it under the terms of the GNU
* Affero General Public License as published by the Free Software
* Foundation, either version 3 of the License, or (at your option) any
* later version.
*
* Xuggler 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 Affero General Public
* License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with Xuggler. If not, see <http://www.gnu.org/licenses/>.
*
*/
package org.red5.app.sip;
import java.io.IOException;
@ -63,29 +44,23 @@ public class AudioStream implements IBroadcastStream, IProvider, IPipeConnection
public AudioStream(String name) {
publishedStreamName = name;
livePipe = null;
log.trace("name: {}", name);
streamCodecInfo = new StreamCodecInfo();
creationTime = null;
}
public IProvider getProvider() {
log.trace("getProvider()");
return this;
}
public Notify getMetaData() {
System.out.println("**** GETTING METADATA ******");
return null;
}
public String getPublishedName() {
log.trace("getPublishedName()");
return publishedStreamName;
}
public String getSaveFilename() {
log.trace("getSaveFilename()");
throw new Error("unimplemented method");
}
@ -95,7 +70,6 @@ public class AudioStream implements IBroadcastStream, IProvider, IPipeConnection
}
public Collection<IStreamListener> getStreamListeners() {
// log.trace("getStreamListeners()");
return streamListeners;
}
@ -104,14 +78,11 @@ public class AudioStream implements IBroadcastStream, IProvider, IPipeConnection
streamListeners.remove(listener);
}
public void saveAs(String filePath, boolean isAppend) throws IOException,
ResourceNotFoundException, ResourceExistException {
log.trace("saveAs(filepath:{}, isAppend:{})", filePath, isAppend);
public void saveAs(String filePath, boolean isAppend) throws IOException, ResourceNotFoundException, ResourceExistException {
throw new Error("unimplemented method");
}
public void setPublishedName(String name) {
log.trace("setPublishedName(name:{})", name);
publishedStreamName = name;
}
@ -120,13 +91,10 @@ public class AudioStream implements IBroadcastStream, IProvider, IPipeConnection
}
public IStreamCodecInfo getCodecInfo() {
// log.trace("getCodecInfo()");
// we don't support this right now.
return streamCodecInfo;
}
public String getName() {
log.trace("getName(): {}", publishedStreamName);
// for now, just return the published name
return publishedStreamName;
}
@ -159,9 +127,7 @@ public class AudioStream implements IBroadcastStream, IProvider, IPipeConnection
case PipeConnectionEvent.PROVIDER_CONNECT_PUSH:
log.trace("PipeConnectionEvent.PROVIDER_CONNECT_PUSH");
System.out.println("PipeConnectionEvent.PROVIDER_CONNECT_PUSH");
if (event.getProvider() == this
&& (event.getParamMap() == null
|| !event.getParamMap().containsKey("record"))) {
if (event.getProvider() == this && (event.getParamMap() == null || !event.getParamMap().containsKey("record"))) {
log.trace("Creating a live pipe");
System.out.println("Creating a live pipe");
this.livePipe = (IPipe) event.getSource();
@ -169,24 +135,19 @@ public class AudioStream implements IBroadcastStream, IProvider, IPipeConnection
break;
case PipeConnectionEvent.PROVIDER_DISCONNECT:
log.trace("PipeConnectionEvent.PROVIDER_DISCONNECT");
System.out.println("PipeConnectionEvent.PROVIDER_DISCONNECT");
if (this.livePipe == event.getSource()) {
log.trace("PipeConnectionEvent.PROVIDER_DISCONNECT - this.mLivePipe = null;");
System.out.println("PipeConnectionEvent.PROVIDER_DISCONNECT - this.mLivePipe = null;");
this.livePipe = null;
}
break;
case PipeConnectionEvent.CONSUMER_CONNECT_PUSH:
log.trace("PipeConnectionEvent.CONSUMER_CONNECT_PUSH");
System.out.println("PipeConnectionEvent.CONSUMER_CONNECT_PUSH");
break;
case PipeConnectionEvent.CONSUMER_DISCONNECT:
log.trace("PipeConnectionEvent.CONSUMER_DISCONNECT");
System.out.println("PipeConnectionEvent.CONSUMER_DISCONNECT");
break;
default:
log.trace("PipeConnectionEvent default");
System.out.println("PipeConnectionEvent default");
break;
}
}

View File

@ -1,5 +1,5 @@
# The address of your FreeSWITCH/asterisk server
sip.server.host=192.168.0.166
sip.server.host=127.0.0.1
sip.server.port=5070
sip.server.username=bbbuser
sip.server.password=secret

View File

@ -77,15 +77,15 @@ public class ConversionUpdatesMessageListener {
conversionUpdatesProcessor.process(message);
}
else if(messageKey.equalsIgnoreCase(PAGE_COUNT_EXCEEDED_KEY)){
String numberOfPages = (String) mapMessage.get("numberOfPages");
String maxNumberPages = (String) mapMessage.get("maxNumberPages");
Integer numberOfPages = new Integer((String) mapMessage.get("numberOfPages"));
Integer maxNumberPages = new Integer((String) mapMessage.get("maxNumberPages"));
message.put("numberOfPages", numberOfPages);
message.put("maxNumberPages", maxNumberPages);
conversionUpdatesProcessor.process(message);
}
else if(messageKey.equalsIgnoreCase(GENERATED_SLIDE_KEY)){
String numberOfPages = (String) mapMessage.get("numberOfPages");
String pagesCompleted = (String) mapMessage.get("pagesCompleted");
Integer numberOfPages = new Integer((String)mapMessage.get("numberOfPages"));
Integer pagesCompleted = new Integer((String)mapMessage.get("pagesCompleted"));
message.put("numberOfPages", numberOfPages);
message.put("pagesCompleted", pagesCompleted);

View File

@ -21,7 +21,6 @@
*/
package org.bigbluebutton.conference.service.whiteboard;
import java.util.ArrayList;
import org.red5.compatibility.flex.messaging.io.ArrayCollection;
@ -30,23 +29,22 @@ public class Shape {
private String type;
private int thickness;
private int color;
private double parentWidth;
private double parentHeight;
private String id;
private String status;
private double[] shape;
public static final String PENCIL = "pencil";
public static final String RECTANGLE = "rectangle";
public static final String ELLIPSE = "ellipse";
public Shape(double[] shape, String type, int color, int thickness, double parentWidth, double parentHeight){
public Shape(double[] shape, String type, int color, int thickness, String id, String status){
this.shape = shape;
this.type = type;
this.color = color;
this.thickness = thickness;
this.parentWidth = parentWidth;
this.parentHeight = parentHeight;
if(this.type.equalsIgnoreCase(PENCIL)) this.shape = optimizeFreeHand();
this.id = id;
this.status = status;
}
public ArrayCollection<Object> toList(){
@ -55,75 +53,22 @@ public class Shape {
sendableList.add(type);
sendableList.add(color);
sendableList.add(thickness);
sendableList.add(parentWidth);
sendableList.add(parentHeight);
sendableList.add(id);
sendableList.add(status);
return sendableList;
}
public Object[] toObjectArray(){
Object[] objects = new Object[6];
Object[] objects = new Object[10];
objects[0] = shape;
objects[1] = type;
objects[2] = color;
objects[3] = thickness;
objects[4] = parentWidth;
objects[5] = parentHeight;
objects[4] = id;
objects[5] = status;
return objects;
}
private double[] optimizeFreeHand(){
if (shape.length < 10) return shape; //Don't do any optimization for very small shapes
ArrayList<Double> newShape = new ArrayList<Double>();
double x1 = shape[0];
double y1 = shape[1];
newShape.add(x1);
newShape.add(y1);
double stableSlope = 0;
double newSlope;
double lastStableX = x1;
double lastStableY = y1;
boolean lineStable = false;
for (int i=2; i<shape.length; i= i+2){
double x2 = shape[i];
double y2 = shape[i+1];
newSlope = (y2 - y1)/(x2 - x1);
if (slopeDifference(stableSlope, newSlope) < 5){
lastStableX = x2;
lastStableY = y2;
lineStable = true;
} else{
stableSlope = newSlope;
if (lineStable){
lineStable = false;
newShape.add(lastStableX);
newShape.add(lastStableY);
}
x1 = x2;
y1 = y2;
newShape.add(x1);
newShape.add(y1);
}
}
newShape.add(shape[shape.length - 2]);
newShape.add(shape[shape.length - 1]);
double[] returnArray = new double[newShape.size()];
for (int j= 0; j<newShape.size(); j++){
returnArray[j] = newShape.get(j);
}
return returnArray;
}
private double slopeDifference(double oldSlope, double newSlope){
double differenceInRad = Math.atan(oldSlope) - Math.atan(newSlope);
return Math.abs(Math.toDegrees(differenceInRad));
}
public String getShape(){
String dataToString = "";
for (int i=0; i<shape.length - 1; i++){

View File

@ -86,8 +86,8 @@ public class WhiteboardApplication extends MultiThreadedApplicationAdapter imple
return roomManager.getRoom(getLocalScope().getName()).isWhiteboardEnabled();
}
public void sendShape(double[] shape, String type, int color, int thickness, double parentWidth, double parentHeight){
Shape newShape = new Shape(shape, type, color, thickness, parentWidth, parentHeight);
public void sendShape(double[] shape, String type, int color, int thickness, String id, String status){
Shape newShape = new Shape(shape, type, color, thickness, id, status);
roomManager.getRoom(getLocalScope().getName()).addShape(newShape);
ISharedObject drawSO = getSharedObject(getLocalScope(), WHITEBOARD_SHARED_OBJECT);
List<Object> arguments = newShape.toList();

View File

@ -38,9 +38,9 @@ public class WhiteboardService {
this.application = a;
}
public void sendShape(double[] shape, String type, int color, int thickness, double parentWidth, double parentHeight){
public void sendShape(double[] shape, String type, int color, int thickness, String id, String status){
log.info("WhiteboardApplication - Sending share");
application.sendShape(shape, type, color, thickness, parentWidth, parentHeight);
application.sendShape(shape, type, color, thickness, id, status);
}
/**

View File

@ -359,7 +359,25 @@
description="Compiling the BBB without copying config.xml">
</target>
<target name="copy-resource-files">
<target name="copy-config-if-needed">
<if>
<available file="${BASE_DIR}/src/conf/config.xml"/>
<else>
<copy file="/var/www/bigbluebutton/client/conf/config.xml" todir="${BASE_DIR}/src/conf" />
</else>
</if>
</target>
<target name="copy-join-mock-if-needed">
<if>
<available file="${BASE_DIR}/src/conf/join-mock.xml"/>
<else>
<copy file="${RESOURCES_DIR}/dev/join-mock.xml" todir="${BASE_DIR}/src/conf" />
</else>
</if>
</target>
<target name="copy-resource-files" >
<copy todir="${OUTPUT_DIR}/swfobject/" >
<fileset dir="${PROD_RESOURCES_DIR}/swfobject" />
</copy>
@ -388,14 +406,6 @@
</if>
</target>
<target name="check-config-xml">
<available file="/var/www/bigbluebutton/client/conf/config.xml" property="config-xml.present"/>
</target>
<target name="copy-config-xml" depends="check-config-xml" if="config-xml.present">
<echo message="Updating config.xml from /var/www/bigbluebutton/client/conf/config.xml" />
<copy file="/var/www/bigbluebutton/client/conf/config.xml" todir="${OUTPUT_DIR}/conf" />
</target>
<target name="generate-html-wrapper">
<html-wrapper

View File

@ -39,29 +39,6 @@ server {
include fastcgi_params;
}
# Handle request to bbb-web running within Tomcat. This is for
# the BBB-API and Presentation.
location /bigbluebutton {
proxy_pass http://127.0.0.1:8080;
proxy_redirect default;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# Allow 30M uploaded presentation document.
client_max_body_size 30m;
client_body_buffer_size 128k;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
include fastcgi_params;
}
# BigBlueButton landing page.
location / {
root /var/www/bigbluebutton-default;
@ -69,20 +46,6 @@ server {
expires 1m;
}
# BigBlueButton.html is here so we can expire it every 1 minute to
# prevent caching.
location /client/BigBlueButton.html {
root /var/www/bigbluebutton;
index index.html index.htm;
expires 1m;
}
# BigBlueButton Flash client.
location /client {
root /var/www/bigbluebutton;
index index.html index.htm;
}
# Include specific rules for record and playback
include /etc/bigbluebutton/nginx/*.nginx;

View File

@ -1,9 +1,9 @@
bbb.pageTitle = BigBlueButton
bbb.mainshell.locale.version = 0.8-beta2
bbb.mainshell.locale.version = 0.8-beta4
bbb.mainshell.statusProgress.connecting = الإتصال بالمخدم
bbb.mainshell.statusProgress.loading = تحميل {0} وحدات
bbb.mainshell.statusProgress.cannotConnectServer = للأسف ، لا يمكن الإتصال بالمخدم حالياً
bbb.mainshell.copyrightLabel2 = (c) 2011, BigBlueButton build {0} - لمزيد من المعلومات يمكنك زيارة الرابط التالي http://www.bigbluebutton.org/.\n<br /> تم التعريب من قبل محمد أشرم
bbb.mainshell.copyrightLabel2 = (c) 2012, BigBlueButton build {0} - لمزيد من المعلومات يمكنك زيارة الرابط التالي http://www.bigbluebutton.org/.\n<br /> تم التعريب من قبل محمد أشرم
bbb.mainshell.logBtn.toolTip = فتح نافذة الدخول
bbb.mainshell.resetLayoutBtn.toolTip = Reset Layout
bbb.oldlocalewindow.reminder1 = قد تكون ملفات الترجمة لـ BigBlueButton قديمة
@ -33,6 +33,8 @@ bbb.viewers.raiseHandBtn.toolTip = إضغط لرفع اليد.
bbb.viewers.presentBtn.label = Switch Presenter
bbb.viewers.kickUserBtn.toolTip = Kick User
bbb.presentation.title = Presentation
bbb.presentation.fitToWidth.toolTip =
bbb.presentation.fitToPage.toolTip =
bbb.presentation.uploadPresBtn = Upload a document for presentation.
bbb.presentation.uploadPresBtn.toolTip = Upload a document for presentation.
bbb.presentation.backBtn.toolTip = الشريحة السابقة

View File

@ -1,9 +1,9 @@
bbb.pageTitle = BigBlueButton
bbb.mainshell.locale.version = 0.8-beta2
bbb.mainshell.locale.version = 0.8-beta4
bbb.mainshell.statusProgress.connecting = Xahis edirik gozləyin {0} modul yuklənir:
bbb.mainshell.statusProgress.loading = {0}(yuklənib)
bbb.mainshell.statusProgress.cannotConnectServer = Xahis edirik biz serverin test muddəti ərzində gozləyəsiz.
bbb.mainshell.copyrightLabel2 = (c) 2010, BigBlueButton build {0} - For more information see http://www.bigbluebutton.org/.
bbb.mainshell.copyrightLabel2 = (c) 2012, BigBlueButton build {0} - For more information see http://www.bigbluebutton.org/.
bbb.mainshell.logBtn.toolTip = Loq pəncərəsini aç
bbb.mainshell.resetLayoutBtn.toolTip = Pəncərəni yenilə
bbb.oldlocalewindow.reminder1 = Ola bilər ki sizdə video konfransın köhnə versiyası var.
@ -33,6 +33,8 @@ bbb.viewers.raiseHandBtn.toolTip = Göstəricini tıklayın.
bbb.viewers.presentBtn.label = Prezentatoru dəyiş
bbb.viewers.kickUserBtn.toolTip = İstifadəçini çıxart.
bbb.presentation.title = Prezentasiya
bbb.presentation.fitToWidth.toolTip =
bbb.presentation.fitToPage.toolTip =
bbb.presentation.uploadPresBtn = Prezentasiya üçün sənədi yükləyin.
bbb.presentation.uploadPresBtn.toolTip = Prezentasiya üçün sənədi yükləyin.
bbb.presentation.backBtn.toolTip = Əvvəlki slayd.

View File

@ -1,9 +1,9 @@
bbb.pageTitle = BigBlueButton
bbb.mainshell.locale.version = 0.8-beta2
bbb.mainshell.locale.version = 0.8-beta4
bbb.mainshell.statusProgress.connecting = Свързване със сървърът
bbb.mainshell.statusProgress.loading = Зареждане на {0} модул/а
bbb.mainshell.statusProgress.cannotConnectServer = Съжалявам, не мога да се свържа със сървърът.
bbb.mainshell.copyrightLabel2 = (c) 2010, BigBlueButton build {0} - За повече информация вижте http://www.bigbluebutton.org/.
bbb.mainshell.copyrightLabel2 = (c) 2012, BigBlueButton build {0} - За повече информация вижте http://www.bigbluebutton.org/.
bbb.mainshell.logBtn.toolTip = Отвори Дневник Прозорецът
bbb.mainshell.resetLayoutBtn.toolTip = Презареди Изгледа
bbb.oldlocalewindow.reminder1 = Вие може да имате стар превод на BigBlueButton.
@ -33,6 +33,8 @@ bbb.viewers.raiseHandBtn.toolTip = Натисни за да вдигнеш ръ
bbb.viewers.presentBtn.label = Смени Презентаторът
bbb.viewers.kickUserBtn.toolTip = Изхвърли потребител
bbb.presentation.title = Презентация
bbb.presentation.fitToWidth.toolTip =
bbb.presentation.fitToPage.toolTip =
bbb.presentation.uploadPresBtn = Зареди документ за презентация.
bbb.presentation.uploadPresBtn.toolTip = Зареди документ за презентация.
bbb.presentation.backBtn.toolTip = Предишна страница.

View File

@ -1,9 +1,9 @@
bbb.pageTitle = BigBlueButton
bbb.mainshell.locale.version = 0.8-beta2
bbb.mainshell.locale.version = 0.8-beta4
bbb.mainshell.statusProgress.connecting = সার্ভারের সাথে সংযোগ করা হচ্চ্ছ
bbb.mainshell.statusProgress.loading = {0} মডিউলগুলো লোড করা হচ্চ্ছে
bbb.mainshell.statusProgress.cannotConnectServer = দুঃখিত, সার্ভারের সাথে সংযোগ করা সম্ভব হচ্চ্ছে না।
bbb.mainshell.copyrightLabel2 = (c) 2011, BigBlueButton build {0} - আরও বেশি তথ্যের জন্য দেখুন http://www.bigbluebutton.org/.
bbb.mainshell.copyrightLabel2 = (c) 2012, BigBlueButton build {0} - আরও বেশি তথ্যের জন্য দেখুন http://www.bigbluebutton.org/.
bbb.mainshell.logBtn.toolTip = লগ উইন্ডোটি খুলুন
bbb.mainshell.resetLayoutBtn.toolTip = লেআউট রিসেট করুন
bbb.oldlocalewindow.reminder1 = আপনার BigBlueButton-এর একটি পুরনো ভাষা অনুবাদ থাকতে পারে।
@ -33,6 +33,8 @@ bbb.viewers.raiseHandBtn.toolTip = হাত উত্তোলন করতে
bbb.viewers.presentBtn.label = উপস্হাপক পরিবর্তন
bbb.viewers.kickUserBtn.toolTip = ব্যবহারকারীকে বহিষ্কার করুন
bbb.presentation.title = উপস্হাপন
bbb.presentation.fitToWidth.toolTip =
bbb.presentation.fitToPage.toolTip =
bbb.presentation.uploadPresBtn = উপস্হাপনের জন্য একটি ডকুমেন্ট আপলোড করুন।
bbb.presentation.uploadPresBtn.toolTip = উপস্হাপনের জন্য একটি ডকুমেন্ট আপলোড করুন।
bbb.presentation.backBtn.toolTip = পূর্ববর্তী স্লাইড।

View File

@ -1,9 +1,9 @@
bbb.pageTitle = BigBlueButton
bbb.mainshell.locale.version = 0.8-beta2
bbb.mainshell.locale.version = 0.8-beta4
bbb.mainshell.statusProgress.connecting = Připojuji se k serveru
bbb.mainshell.statusProgress.loading = Nahrávám {0} modulů
bbb.mainshell.statusProgress.cannotConnectServer = Omlouváme se, k serveru se nelze připojit.
bbb.mainshell.copyrightLabel2 = (c) 2010, BigBlueButton build {0} - Více informací na jdete na stránkách http://www.bigbluebutton.org/.
bbb.mainshell.copyrightLabel2 = (c) 2012, BigBlueButton build {0} - Více informací na jdete na stránkách http://www.bigbluebutton.org/.
bbb.mainshell.logBtn.toolTip = Otevřít okno logu
bbb.mainshell.resetLayoutBtn.toolTip = Původní nastavení vzhledu
bbb.oldlocalewindow.reminder1 = Máte starý jazykový překlad BigBlueButtonu.
@ -33,6 +33,8 @@ bbb.viewers.raiseHandBtn.toolTip = Klikněte pro zvednutí ruky.
bbb.viewers.presentBtn.label = Přepnout prezentujícího
bbb.viewers.kickUserBtn.toolTip = Kliknutím odpojíte uživatele.
bbb.presentation.title = Prezentace
bbb.presentation.fitToWidth.toolTip =
bbb.presentation.fitToPage.toolTip =
bbb.presentation.uploadPresBtn = Nahrát dokument pro prezentaci.
bbb.presentation.uploadPresBtn.toolTip = Nahrát dokument pro prezentaci.
bbb.presentation.backBtn.toolTip = Předchozí snímek.

View File

@ -1,9 +1,9 @@
bbb.pageTitle = BigBlueButton
bbb.mainshell.locale.version = 0.8-beta2
bbb.mainshell.locale.version = 0.8-beta4
bbb.mainshell.statusProgress.connecting = Tilslutter til serveren
bbb.mainshell.statusProgress.loading = Henter {0} moduler
bbb.mainshell.statusProgress.cannotConnectServer = Vi kan desværre ikke oprette forbindelse til serveren.
bbb.mainshell.copyrightLabel2 = (c) 2011, BigBlueButton build {0} - For flere informationer, gå til http://www.bigbluebutton.org/.
bbb.mainshell.copyrightLabel2 = (c) 2012, BigBlueButton build {0} - For flere informationer, gå til http://www.bigbluebutton.org/.
bbb.mainshell.logBtn.toolTip = Åbn log-vinduet
bbb.mainshell.resetLayoutBtn.toolTip = Nulstil layout
bbb.oldlocalewindow.reminder1 = Du har måske en gammel oversættelser af BigBlueButton.
@ -33,6 +33,8 @@ bbb.viewers.raiseHandBtn.toolTip = Klik for at hæve hånden.
bbb.viewers.presentBtn.label = Skift præsentator
bbb.viewers.kickUserBtn.toolTip = Spark bruger ud
bbb.presentation.title = Præsentation
bbb.presentation.fitToWidth.toolTip =
bbb.presentation.fitToPage.toolTip =
bbb.presentation.uploadPresBtn = Upload et dokument til præsentation.
bbb.presentation.uploadPresBtn.toolTip = Upload et dokument til præsentation.
bbb.presentation.backBtn.toolTip = Forrige slide.

View File

@ -1,9 +1,9 @@
bbb.pageTitle = BigBlueButton
bbb.mainshell.locale.version = 0.8-beta2
bbb.mainshell.locale.version = 0.8-beta4
bbb.mainshell.statusProgress.connecting = Baue Verbindung zum Server auf
bbb.mainshell.statusProgress.loading = Lade {0} Module
bbb.mainshell.statusProgress.cannotConnectServer = Verbindung zum Server konnte nicht hergestellt werden.
bbb.mainshell.copyrightLabel2 = (c) 2010, BigBlueButton Version {0} - Weitere Informationen unter http://www.bigbluebutton.org/.
bbb.mainshell.copyrightLabel2 = (c) 2012, BigBlueButton Version {0} - Weitere Informationen unter http://www.bigbluebutton.org/.
bbb.mainshell.logBtn.toolTip = Protokoll Fenster öffnen
bbb.mainshell.resetLayoutBtn.toolTip = Anordnung wiederherstellen
bbb.oldlocalewindow.reminder1 = Die installierte Sprachversion ist möglicherweise veraltet.
@ -33,6 +33,8 @@ bbb.viewers.raiseHandBtn.toolTip = Klicken um die Hand zu heben.
bbb.viewers.presentBtn.label = Presentator wechseln
bbb.viewers.kickUserBtn.toolTip = Benutzer ausschließen
bbb.presentation.title = Präsentation
bbb.presentation.fitToWidth.toolTip =
bbb.presentation.fitToPage.toolTip =
bbb.presentation.uploadPresBtn = Ein Dokument zur Präsentation hinzufügen.
bbb.presentation.uploadPresBtn.toolTip = Ein Dokument zur Präsentation hinzufügen.
bbb.presentation.backBtn.toolTip = Vorherige Folie

View File

@ -1,9 +1,9 @@
bbb.pageTitle = BigBlueButton
bbb.mainshell.locale.version = 0.8-beta2
bbb.mainshell.locale.version = 0.8-beta4
bbb.mainshell.statusProgress.connecting = Σύνδεση στον διακομιστή
bbb.mainshell.statusProgress.loading = Φόρτωση {0} αρθρωμάτων
bbb.mainshell.statusProgress.cannotConnectServer = Λυπούμαστε, αλλά δεν μπορούμε να συνδεθούμε στο διακομιστή
bbb.mainshell.copyrightLabel2 = (c) 2010, BigBlueButton build {0} - Γιά περισσότερες πληροφορίες συνδεθείτε εδώ: http://www.bigbluebutton.org/.
bbb.mainshell.copyrightLabel2 = (c) 2012, BigBlueButton build {0} - Γιά περισσότερες πληροφορίες συνδεθείτε εδώ: http://www.bigbluebutton.org/.
bbb.mainshell.logBtn.toolTip = Άνοιξε Παράθυρο Σύνδεσης
bbb.mainshell.resetLayoutBtn.toolTip = Επαναφορά διάταξης
bbb.oldlocalewindow.reminder1 = Μπορεί να έχετε παλαιότερη μετάφραση του BigBlueButton.
@ -33,6 +33,8 @@ bbb.viewers.raiseHandBtn.toolTip = Πατήστε για να σηκώσετε
bbb.viewers.presentBtn.label = Αλλαγή εισηγητή
bbb.viewers.kickUserBtn.toolTip = Αποπομπή χρήστη
bbb.presentation.title = Παρουσίαση
bbb.presentation.fitToWidth.toolTip =
bbb.presentation.fitToPage.toolTip =
bbb.presentation.uploadPresBtn = Μεταφορτώστε ένα έγγραφο για παρουσίαση
bbb.presentation.uploadPresBtn.toolTip = Μεταφορτώστε ένα έγγραφο για παρουσίαση
bbb.presentation.backBtn.toolTip = Προηγούμενη διαφάνεια

View File

@ -1,9 +1,9 @@
bbb.pageTitle = BigBlueButton
bbb.mainshell.locale.version = 0.8-beta2
bbb.mainshell.locale.version = 0.8-beta4
bbb.mainshell.statusProgress.connecting = Connecting to the server
bbb.mainshell.statusProgress.loading = Loading {0} modules
bbb.mainshell.statusProgress.cannotConnectServer = Sorry, we cannot connect to the server.
bbb.mainshell.copyrightLabel2 = (c) 2011, BigBlueButton build {0} - For more information see http://www.bigbluebutton.org/.
bbb.mainshell.copyrightLabel2 = (c) 2012, BigBlueButton build {0} - For more information see http://www.bigbluebutton.org/.
bbb.mainshell.logBtn.toolTip = Open Log Window
bbb.mainshell.resetLayoutBtn.toolTip = Reset Layout
bbb.oldlocalewindow.reminder1 = You may have an old language translations of BigBlueButton.
@ -33,6 +33,8 @@ bbb.viewers.raiseHandBtn.toolTip = Click to raise hand.
bbb.viewers.presentBtn.label = Switch Presenter
bbb.viewers.kickUserBtn.toolTip = Kick User
bbb.presentation.title = Presentation
bbb.presentation.fitToWidth.toolTip = Fit to width
bbb.presentation.fitToPage.toolTip = Fit to page
bbb.presentation.uploadPresBtn = Upload a document for presentation.
bbb.presentation.uploadPresBtn.toolTip = Upload a document for presentation.
bbb.presentation.backBtn.toolTip = Previous slide.

View File

@ -1,9 +1,9 @@
bbb.pageTitle = BigBlueButton
bbb.mainshell.locale.version = 0.8-beta2
bbb.mainshell.locale.version = 0.8-beta4
bbb.mainshell.statusProgress.connecting = Conectando con el servidor
bbb.mainshell.statusProgress.loading = Cargando {0} módulos
bbb.mainshell.statusProgress.cannotConnectServer = Lo sentimos, no pudimos conectar con el servidor.
bbb.mainshell.copyrightLabel2 = (c) 2011, BigBlueButton versión {0} - Para más información diríjase a: http://www.bigbluebutton.org/
bbb.mainshell.copyrightLabel2 = (c) 2012, BigBlueButton versión {0} - Para más información diríjase a: http://www.bigbluebutton.org/
bbb.mainshell.logBtn.toolTip = Abrir ventana de histórico
bbb.mainshell.resetLayoutBtn.toolTip = Reiniciar posición de ventanas
bbb.oldlocalewindow.reminder1 = Puede que tenga una traducción obsoleta de BigBlueButton.
@ -33,6 +33,8 @@ bbb.viewers.raiseHandBtn.toolTip = Pulse para levantar la mano.
bbb.viewers.presentBtn.label = Cambiar Presentador
bbb.viewers.kickUserBtn.toolTip = Expulsar usuario
bbb.presentation.title = Presentación
bbb.presentation.fitToWidth.toolTip =
bbb.presentation.fitToPage.toolTip =
bbb.presentation.uploadPresBtn = Cargar documento para presentar.
bbb.presentation.uploadPresBtn.toolTip = Cargar documento para presentar.
bbb.presentation.backBtn.toolTip = Diapositiva anterior.

View File

@ -1,9 +1,9 @@
bbb.pageTitle = BigBlueButton
bbb.mainshell.locale.version = 0.8-beta2
bbb.mainshell.locale.version = 0.8-beta4
bbb.mainshell.statusProgress.connecting = Conectando al servidor
bbb.mainshell.statusProgress.loading = Cargando {0} módulos
bbb.mainshell.statusProgress.cannotConnectServer = Lo sentimos, no se puede conectar al servidor.
bbb.mainshell.copyrightLabel2 = (c) 2011, BigBlueButton versión {0} - Para mas información vea http://www.bigbluebutton.org/.
bbb.mainshell.copyrightLabel2 = (c) 2012, BigBlueButton versión {0} - Para mas información vea http://www.bigbluebutton.org/.
bbb.mainshell.logBtn.toolTip = Abrir la ventana de Registro (Log)
bbb.mainshell.resetLayoutBtn.toolTip = Restaurar el diseño
bbb.oldlocalewindow.reminder1 = Usted tiene una traducción antigua de lenguaje para Bigbluebutton
@ -33,6 +33,8 @@ bbb.viewers.raiseHandBtn.toolTip = Click para pedir la palabra.
bbb.viewers.presentBtn.label = Cambiar Expositor
bbb.viewers.kickUserBtn.toolTip = Expulsar Usuario
bbb.presentation.title = Presentación
bbb.presentation.fitToWidth.toolTip =
bbb.presentation.fitToPage.toolTip =
bbb.presentation.uploadPresBtn = Subir un documento para su presentación.
bbb.presentation.uploadPresBtn.toolTip = Subir un documento para su presentación.
bbb.presentation.backBtn.toolTip = Diapositiva anterior.

View File

@ -0,0 +1,171 @@
bbb.pageTitle =
bbb.mainshell.locale.version =
bbb.mainshell.statusProgress.connecting =
bbb.mainshell.statusProgress.loading =
bbb.mainshell.statusProgress.cannotConnectServer =
bbb.mainshell.copyrightLabel2 =
bbb.mainshell.logBtn.toolTip =
bbb.mainshell.resetLayoutBtn.toolTip =
bbb.oldlocalewindow.reminder1 =
bbb.oldlocalewindow.reminder2 =
bbb.oldlocalewindow.windowTitle =
bbb.micSettings.playSound =
bbb.micSettings.hearFromHeadset =
bbb.micSettings.speakIntoMic =
bbb.micSettings.changeMic =
bbb.micSettings.join =
bbb.micSettings.cancel =
bbb.mainToolbar.helpBtn =
bbb.mainToolbar.logoutBtn =
bbb.mainToolbar.logoutBtn.toolTip =
bbb.mainToolbar.settingsBtn =
bbb.mainToolbar.settingsBtn.toolTip =
bbb.viewers.title =
bbb.viewers.viewersGrid.nameItemRenderer =
bbb.viewers.viewersGrid.nameItemRenderer.nameLabel.toolTip =
bbb.viewers.viewersGrid.roleItemRenderer =
bbb.viewers.viewersGrid.statusItemRenderer =
bbb.viewers.viewersGrid.statusItemRenderer.raiseHand.toolTip =
bbb.viewers.viewersGrid.statusItemRenderer.streamIcon.toolTip =
bbb.viewers.viewersGrid.statusItemRenderer.presIcon.toolTip =
bbb.viewers.presentBtn.toolTip =
bbb.viewers.raiseHandBtn.toolTip =
bbb.viewers.presentBtn.label =
bbb.viewers.kickUserBtn.toolTip =
bbb.presentation.title =
bbb.presentation.fitToWidth.toolTip =
bbb.presentation.fitToPage.toolTip =
bbb.presentation.uploadPresBtn =
bbb.presentation.uploadPresBtn.toolTip =
bbb.presentation.backBtn.toolTip =
bbb.presentation.slideNumLbl.toolTip =
bbb.presentation.forwardBtn.toolTip =
bbb.presentation.resetZoomBtn.toolTip =
bbb.presentation.presenterNameLbl =
bbb.presentation.clickToUpload =
bbb.presentation.maxUploadFileExceededAlert =
bbb.presentation.uploadcomplete =
bbb.presentation.uploaded =
bbb.presentation.document.supported =
bbb.presentation.document.converted =
bbb.presentation.error.document.convert.failed =
bbb.presentation.error.io =
bbb.presentation.error.security =
bbb.presentation.error.convert.format =
bbb.presentation.error.convert.notsupported =
bbb.presentation.error.convert.nbpage =
bbb.presentation.error.convert.maxnbpagereach =
bbb.presentation.error.convert.swf =
bbb.presentation.converted =
bbb.presentation.ok =
bbb.presentation.uploadwindow.presentationfile =
bbb.presentation.uploadwindow.pdf =
bbb.presentation.uploadwindow.word =
bbb.presentation.uploadwindow.excel =
bbb.presentation.uploadwindow.powerpoint =
bbb.presentation.uploadwindow.image =
bbb.presentation.uploadwindow.closeLabel =
bbb.fileupload.title =
bbb.fileupload.fileLbl =
bbb.fileupload.selectBtn.toolTip =
bbb.fileupload.uploadBtn =
bbb.fileupload.uploadBtn.toolTip =
bbb.fileupload.presentationNamesLbl =
bbb.fileupload.deleteBtn.toolTip =
bbb.fileupload.showBtn =
bbb.fileupload.showBtn.toolTip =
bbb.fileupload.okCancelBtn =
bbb.fileupload.genThumbText =
bbb.fileupload.progBarLbl =
bbb.chat.title =
bbb.chat.cmpColorPicker.toolTip =
bbb.chat.sendBtn =
bbb.chat.sendBtn.toolTip =
bbb.chat.publicChatUsername =
bbb.chat.publicMsgAwaiting =
bbb.chat.publicMsgAwaiting2 =
bbb.chat.privateMsgAwaiting =
bbb.chat.privateMsgAwaiting2 =
bbb.chat.privateChatSelect =
bbb.chat.chatOptions =
bbb.chat.fontSize =
bbb.listeners.title =
bbb.listeners.pushToTalk.toolTip =
bbb.listeners.pushToMute.toolTip =
bbb.listeners.talk =
bbb.listeners.mute =
bbb.listeners.muteAllBtn.toolTip =
bbb.listeners.unmuteAllBtn.toolTip =
bbb.listeners.ejectTooltip =
bbb.listenerItem.nameLbl.toolTip =
bbb.listenerItem.talkImg.toolTip =
bbb.listenerItem.lockImg.toolTip =
bbb.listenerItem.muteUnmute.toolTip =
bbb.publishVideo.title =
bbb.publishVideo.startPublishBtn.toolTip =
bbb.video.publish.close.tooltip =
bbb.video.publish.close.label =
bbb.video.keepAspectBtn.tooltip =
bbb.video.fitVideoBtn.tooltip =
bbb.video.originalSizeBtn.tooltip =
bbb.video.publish.hint.noCamera =
bbb.video.publish.hint.cantOpenCamera =
bbb.video.publish.hint.waitingApproval =
bbb.video.publish.hint.videoPreview =
bbb.video.publish.hint.openingCamera =
bbb.video.publish.hint.cameraDenied =
bbb.video.publish.hint.cameraIsBeingUsed =
bbb.video.publish.hint.publishing =
bbb.desktopPublish.title =
bbb.desktopPublish.fullscreen.tooltip =
bbb.desktopPublish.fullscreen.label =
bbb.desktopPublish.region.tooltip =
bbb.desktopPublish.region.label =
bbb.desktopPublish.stop.tooltip =
bbb.desktopPublish.stop.label =
bbb.desktopPublish.maximizeRestoreBtn.toolTip =
bbb.desktopPublish.closeBtn.toolTip =
bbb.desktopPublish.minimizeBtn.toolTip =
bbb.desktopView.title =
bbb.desktopView.fitToWindow =
bbb.desktopView.actualSize =
bbb.toolbar.phone.toolTip =
bbb.toolbar.deskshare.toolTip =
bbb.toolbar.video.toolTip =
bbb.highlighter.toolbar.pencil =
bbb.highlighter.toolbar.ellipse =
bbb.highlighter.toolbar.rectangle =
bbb.highlighter.toolbar.clear =
bbb.highlighter.toolbar.undo =
bbb.highlighter.toolbar.color =
bbb.highlighter.toolbar.thickness =
bbb.highlighter.button.toolTipShow =
bbb.highlighter.button.toolTipHide =
bbb.logout.appshutdown =
bbb.logout.asyncerror =
bbb.logout.connectionclosed =
bbb.logout.connectionfailed =
bbb.logout.rejected =
bbb.logout.invalidapp =
bbb.logout.unknown =
bbb.logout.usercommand =
bbb.settings.deskshare.instructions =
bbb.settings.deskshare.start =
bbb.settings.voice.volume =
bbb.settings.voice.adjust =
bbb.settings.java.label =
bbb.settings.java.text =
bbb.settings.java.command =
bbb.settings.flash.label =
bbb.settings.flash.text =
bbb.settings.flash.command =
bbb.settings.isight.label =
bbb.settings.isight.text =
bbb.settings.isight.command =
bbb.settings.warning.label =
bbb.settings.warning.close =
bbb.settings.noissues =
bbb.settings.instructions =
bbb.videodock.title =
bbb.zzzzz.yyyy =
=

View File

@ -1,9 +1,9 @@
bbb.pageTitle = BigBlueButton
bbb.mainshell.locale.version = 0.8-beta2
bbb.mainshell.locale.version = 0.8-beta4
bbb.mainshell.statusProgress.connecting = Zerbitzariarekin konektatzen
bbb.mainshell.statusProgress.loading = {0} modulu kargatzen
bbb.mainshell.statusProgress.cannotConnectServer = Barkatu, ezin dugu zerbitzariarekin konektatu
bbb.mainshell.copyrightLabel2 = (c) 2011, BigBlueButton build {0} - Informazio gehiagorako, begiratu http://www.bigbluebutton.org/.
bbb.mainshell.copyrightLabel2 = (c) 2012, BigBlueButton build {0} - Informazio gehiagorako, begiratu http://www.bigbluebutton.org/.
bbb.mainshell.logBtn.toolTip = Zabaldu agerraldien leihoa
bbb.mainshell.resetLayoutBtn.toolTip = Berrabiarazi diseinua
bbb.oldlocalewindow.reminder1 = Agian BigBlueButton-en hizkuntza-itzulpen zaharra izango duzu
@ -33,6 +33,8 @@ bbb.viewers.raiseHandBtn.toolTip = Sakatu eskua altxatzeko.
bbb.viewers.presentBtn.label = Aldatu aurkezlea
bbb.viewers.kickUserBtn.toolTip = Kanporatu erabiltzailea
bbb.presentation.title = Aurkezpena
bbb.presentation.fitToWidth.toolTip =
bbb.presentation.fitToPage.toolTip =
bbb.presentation.uploadPresBtn = Igo dokumentu bat aurkezteko
bbb.presentation.uploadPresBtn.toolTip = Igo dokumentu bat aurkezteko
bbb.presentation.backBtn.toolTip = Aurreko diapositiba
@ -88,10 +90,10 @@ bbb.chat.privateChatSelect = Aukeratu lagun bat harekin txatean pribatuan aritze
bbb.chat.chatOptions = Txataren aukerak
bbb.chat.fontSize = Letra-tamaina
bbb.listeners.title = Entzuleak {0} {1}
bbb.listeners.pushToTalk.toolTip =
bbb.listeners.pushToTalk.toolTip = Klik egin hitz egiteko
bbb.listeners.pushToMute.toolTip =
bbb.listeners.talk =
bbb.listeners.mute =
bbb.listeners.talk = Hitz egin
bbb.listeners.mute = Mutua
bbb.listeners.muteAllBtn.toolTip = Mututu guztiak
bbb.listeners.unmuteAllBtn.toolTip = Hitza eman guztiei
bbb.listeners.ejectTooltip = Kanporatu erabiltzailea
@ -106,14 +108,14 @@ bbb.video.publish.close.label = Itxi
bbb.video.keepAspectBtn.tooltip = Eutsi leihoaren itxurari
bbb.video.fitVideoBtn.tooltip = Bideo moldean\nDoitu bideoa
bbb.video.originalSizeBtn.tooltip = Jatorrizko tamaina
bbb.video.publish.hint.noCamera =
bbb.video.publish.hint.cantOpenCamera =
bbb.video.publish.hint.waitingApproval =
bbb.video.publish.hint.noCamera = Kamara ez dago eskuragarri
bbb.video.publish.hint.cantOpenCamera = Ezin da zure kamara zabaldu
bbb.video.publish.hint.waitingApproval = Onartzeko zain
bbb.video.publish.hint.videoPreview =
bbb.video.publish.hint.openingCamera =
bbb.video.publish.hint.cameraDenied =
bbb.video.publish.hint.openingCamera = Kamara zabaltzen...
bbb.video.publish.hint.cameraDenied = Kamararako sarbidea ukatuta
bbb.video.publish.hint.cameraIsBeingUsed =
bbb.video.publish.hint.publishing =
bbb.video.publish.hint.publishing = Argitaratzen...
bbb.desktopPublish.title = Mahaigaina partekatzen: aurkezlearen aurrebista
bbb.desktopPublish.fullscreen.tooltip = Partekatu zure pantaila osoa
bbb.desktopPublish.fullscreen.label = Pantaila osoa

View File

@ -1,9 +1,9 @@
bbb.pageTitle = بیگ بُلو باتِن
bbb.mainshell.locale.version = 0.8 - بتا2
bbb.mainshell.locale.version = 0.8-beta4
bbb.mainshell.statusProgress.connecting = در حال اتصال به سرور
bbb.mainshell.statusProgress.loading = در حال بارگزاری {0} ماژول
bbb.mainshell.statusProgress.cannotConnectServer = متاسفانه، امکان اتصال به سرور وجود ندارد.
bbb.mainshell.copyrightLabel2 = (c) 2010, BigBlueButton build {0} - For more information see http://www.bigbluebutton.org/.
bbb.mainshell.copyrightLabel2 = (c) 2012, BigBlueButton build {0} - For more information see http://www.bigbluebutton.org/.
bbb.mainshell.logBtn.toolTip = مشاهده ی پنجره ی ثبت وقایع
bbb.mainshell.resetLayoutBtn.toolTip = بازگشت به طرح بندی پیش فرض
bbb.oldlocalewindow.reminder1 = ممکن است ترجمه ی مربوط به زبان بیگ بلو باتن شما قدیمی باشد.
@ -33,6 +33,8 @@ bbb.viewers.raiseHandBtn.toolTip = جهت اجازه گرفتن کلیک کنی
bbb.viewers.presentBtn.label = تغییر شخص ارائه دهنده
bbb.viewers.kickUserBtn.toolTip = اخراج کاربر
bbb.presentation.title = ارائه
bbb.presentation.fitToWidth.toolTip =
bbb.presentation.fitToPage.toolTip =
bbb.presentation.uploadPresBtn = بارگزاري یک سند جهت ارائه.
bbb.presentation.uploadPresBtn.toolTip = بارگزاري یک سند جهت ارائه.
bbb.presentation.backBtn.toolTip = اسلاید قبلی.

View File

@ -1,9 +1,9 @@
bbb.pageTitle = BigBlueButton
bbb.mainshell.locale.version = 0.8-beta2
bbb.mainshell.locale.version = 0.8-beta4
bbb.mainshell.statusProgress.connecting = Yhdistetään palvelimeen
bbb.mainshell.statusProgress.loading = Ladataan {0} moduuleita
bbb.mainshell.statusProgress.cannotConnectServer = Anteeksi, emme voi yhdistää palvelimeen.
bbb.mainshell.copyrightLabel2 = (c) 2011, BigBlueButton build {0} - Lisätietoja: http://www.bigbluebutton.org/.
bbb.mainshell.copyrightLabel2 = (c) 2012, BigBlueButton build {0} - Lisätietoja: http://www.bigbluebutton.org/.
bbb.mainshell.logBtn.toolTip = Avaa loki-ikkuna
bbb.mainshell.resetLayoutBtn.toolTip = Resetoi asettelu
bbb.oldlocalewindow.reminder1 = Sinulla voi olla vanha kielikäännös BigBlueButtonista.
@ -33,6 +33,8 @@ bbb.viewers.raiseHandBtn.toolTip = Klikkaa nostaaksesi kättä.
bbb.viewers.presentBtn.label = Vaihda esittelijää.
bbb.viewers.kickUserBtn.toolTip = Potkaise käyttäjä
bbb.presentation.title = Esitys
bbb.presentation.fitToWidth.toolTip =
bbb.presentation.fitToPage.toolTip =
bbb.presentation.uploadPresBtn = Lähetä dokumentti esitykseen.
bbb.presentation.uploadPresBtn.toolTip = Lähetä dokumentti esitykseen.
bbb.presentation.backBtn.toolTip = Edellinen sivu.

View File

@ -1,9 +1,9 @@
bbb.pageTitle = Big Blue Button
bbb.mainshell.locale.version = 0.8-beta2
bbb.mainshell.locale.version = 0.8-beta4
bbb.mainshell.statusProgress.connecting =
bbb.mainshell.statusProgress.loading = Chargement:
bbb.mainshell.statusProgress.cannotConnectServer = Désolé, impossible d'établir une connexion au serveur.
bbb.mainshell.copyrightLabel2 = (c) 2009, BigBlueButton version {0} - Pour plus d'information, visitez http://www.bigbluebutton.org/.
bbb.mainshell.copyrightLabel2 = (c) 2012, BigBlueButton version {0} - Pour plus d'information, visitez http://www.bigbluebutton.org/.
bbb.mainshell.logBtn.toolTip = Ouvrir la fenêtre de log
bbb.mainshell.resetLayoutBtn.toolTip = Disposition par défaut
bbb.oldlocalewindow.reminder1 = You may have an old language translations of BigBlueButton.
@ -33,6 +33,8 @@ bbb.viewers.raiseHandBtn.toolTip = Cliquez-ici pour lever la main et demander la
bbb.viewers.presentBtn.label = Changer de présentateur
bbb.viewers.kickUserBtn.toolTip = Cliquer pour éjecter ce participant.
bbb.presentation.title = Présentation
bbb.presentation.fitToWidth.toolTip =
bbb.presentation.fitToPage.toolTip =
bbb.presentation.uploadPresBtn = Envoyez un document à présenter
bbb.presentation.uploadPresBtn.toolTip = Envoyez un document à présenter
bbb.presentation.backBtn.toolTip = Slide précédent.

View File

@ -1,9 +1,9 @@
bbb.pageTitle = BigBlueButton
bbb.mainshell.locale.version = 0.8-beta2
bbb.mainshell.locale.version = 0.8-beta4
bbb.mainshell.statusProgress.connecting = Connexion au serveur
bbb.mainshell.statusProgress.loading = Chargement de {0} modules
bbb.mainshell.statusProgress.cannotConnectServer = Désolé, impossible de se connecter au serveur
bbb.mainshell.copyrightLabel2 = (c) 2011, BigBlueButton version {0} - Pour plus d'information, visitez http://www.bigbluebutton.org/.
bbb.mainshell.copyrightLabel2 = (c) 2012, BigBlueButton version {0} - Pour plus d'information, visitez http://www.bigbluebutton.org/.
bbb.mainshell.logBtn.toolTip = Ouvrir la fenêtre de log
bbb.mainshell.resetLayoutBtn.toolTip = Disposition par défaut
bbb.oldlocalewindow.reminder1 = La traduction française de BigBlueButton utilisée est probablement trop ancienne.
@ -23,16 +23,18 @@ bbb.mainToolbar.settingsBtn.toolTip = Ouvrir les paramètres
bbb.viewers.title = Utilisateurs {0} {1}
bbb.viewers.viewersGrid.nameItemRenderer = Nom
bbb.viewers.viewersGrid.nameItemRenderer.nameLabel.toolTip = Vous êtes identifié(e) avec ce nom.
bbb.viewers.viewersGrid.roleItemRenderer = Accès
bbb.viewers.viewersGrid.roleItemRenderer = Rôle
bbb.viewers.viewersGrid.statusItemRenderer = Statut
bbb.viewers.viewersGrid.statusItemRenderer.raiseHand.toolTip = Main levé pour {0}
bbb.viewers.viewersGrid.statusItemRenderer.streamIcon.toolTip = Double-cliquez pour voir sa Webcam.
bbb.viewers.viewersGrid.statusItemRenderer.streamIcon.toolTip = Cliquez pour voir la caméra.
bbb.viewers.viewersGrid.statusItemRenderer.presIcon.toolTip = Présentateur
bbb.viewers.presentBtn.toolTip = Sélectionnez un participant et cliquez ici pour qu'il devienne présentateur.
bbb.viewers.raiseHandBtn.toolTip = Cliquez ici pour lever la main et demander la parole.
bbb.viewers.presentBtn.label = Nouveau présentateur
bbb.viewers.kickUserBtn.toolTip = Expulser l'utilisateur
bbb.presentation.title = Présentation
bbb.presentation.fitToWidth.toolTip =
bbb.presentation.fitToPage.toolTip =
bbb.presentation.uploadPresBtn = Envoyer un document à présenter
bbb.presentation.uploadPresBtn.toolTip = Envoyer un document à présenter
bbb.presentation.backBtn.toolTip = Page précédente

View File

@ -0,0 +1,171 @@
bbb.pageTitle = BigBlueButton
bbb.mainshell.locale.version = 0.8-beta4
bbb.mainshell.statusProgress.connecting = מתחבר לשרת
bbb.mainshell.statusProgress.loading = טוען {0} מודולים
bbb.mainshell.statusProgress.cannotConnectServer = לצערנו לא הצלחנו להתחבר לשרת
bbb.mainshell.copyrightLabel2 = (c) 2012, BigBlueButton build {0} - למידע נוסף: http://www.bigbluebutton.org/.
bbb.mainshell.logBtn.toolTip = פתח חלון רשם\n
bbb.mainshell.resetLayoutBtn.toolTip = אפס תבנית
bbb.oldlocalewindow.reminder1 =
bbb.oldlocalewindow.reminder2 =
bbb.oldlocalewindow.windowTitle =
bbb.micSettings.playSound =
bbb.micSettings.hearFromHeadset =
bbb.micSettings.speakIntoMic =
bbb.micSettings.changeMic =
bbb.micSettings.join =
bbb.micSettings.cancel =
bbb.mainToolbar.helpBtn =
bbb.mainToolbar.logoutBtn =
bbb.mainToolbar.logoutBtn.toolTip =
bbb.mainToolbar.settingsBtn =
bbb.mainToolbar.settingsBtn.toolTip =
bbb.viewers.title =
bbb.viewers.viewersGrid.nameItemRenderer =
bbb.viewers.viewersGrid.nameItemRenderer.nameLabel.toolTip =
bbb.viewers.viewersGrid.roleItemRenderer =
bbb.viewers.viewersGrid.statusItemRenderer =
bbb.viewers.viewersGrid.statusItemRenderer.raiseHand.toolTip =
bbb.viewers.viewersGrid.statusItemRenderer.streamIcon.toolTip =
bbb.viewers.viewersGrid.statusItemRenderer.presIcon.toolTip =
bbb.viewers.presentBtn.toolTip =
bbb.viewers.raiseHandBtn.toolTip =
bbb.viewers.presentBtn.label =
bbb.viewers.kickUserBtn.toolTip =
bbb.presentation.title =
bbb.presentation.fitToWidth.toolTip =
bbb.presentation.fitToPage.toolTip =
bbb.presentation.uploadPresBtn =
bbb.presentation.uploadPresBtn.toolTip =
bbb.presentation.backBtn.toolTip =
bbb.presentation.slideNumLbl.toolTip =
bbb.presentation.forwardBtn.toolTip =
bbb.presentation.resetZoomBtn.toolTip =
bbb.presentation.presenterNameLbl =
bbb.presentation.clickToUpload =
bbb.presentation.maxUploadFileExceededAlert =
bbb.presentation.uploadcomplete =
bbb.presentation.uploaded =
bbb.presentation.document.supported =
bbb.presentation.document.converted =
bbb.presentation.error.document.convert.failed =
bbb.presentation.error.io =
bbb.presentation.error.security =
bbb.presentation.error.convert.format =
bbb.presentation.error.convert.notsupported =
bbb.presentation.error.convert.nbpage =
bbb.presentation.error.convert.maxnbpagereach =
bbb.presentation.error.convert.swf =
bbb.presentation.converted =
bbb.presentation.ok =
bbb.presentation.uploadwindow.presentationfile =
bbb.presentation.uploadwindow.pdf =
bbb.presentation.uploadwindow.word =
bbb.presentation.uploadwindow.excel =
bbb.presentation.uploadwindow.powerpoint =
bbb.presentation.uploadwindow.image =
bbb.presentation.uploadwindow.closeLabel =
bbb.fileupload.title =
bbb.fileupload.fileLbl =
bbb.fileupload.selectBtn.toolTip =
bbb.fileupload.uploadBtn =
bbb.fileupload.uploadBtn.toolTip =
bbb.fileupload.presentationNamesLbl =
bbb.fileupload.deleteBtn.toolTip =
bbb.fileupload.showBtn =
bbb.fileupload.showBtn.toolTip =
bbb.fileupload.okCancelBtn =
bbb.fileupload.genThumbText =
bbb.fileupload.progBarLbl =
bbb.chat.title =
bbb.chat.cmpColorPicker.toolTip =
bbb.chat.sendBtn =
bbb.chat.sendBtn.toolTip =
bbb.chat.publicChatUsername =
bbb.chat.publicMsgAwaiting =
bbb.chat.publicMsgAwaiting2 =
bbb.chat.privateMsgAwaiting =
bbb.chat.privateMsgAwaiting2 =
bbb.chat.privateChatSelect =
bbb.chat.chatOptions =
bbb.chat.fontSize =
bbb.listeners.title =
bbb.listeners.pushToTalk.toolTip =
bbb.listeners.pushToMute.toolTip =
bbb.listeners.talk =
bbb.listeners.mute =
bbb.listeners.muteAllBtn.toolTip =
bbb.listeners.unmuteAllBtn.toolTip =
bbb.listeners.ejectTooltip =
bbb.listenerItem.nameLbl.toolTip =
bbb.listenerItem.talkImg.toolTip =
bbb.listenerItem.lockImg.toolTip =
bbb.listenerItem.muteUnmute.toolTip =
bbb.publishVideo.title =
bbb.publishVideo.startPublishBtn.toolTip =
bbb.video.publish.close.tooltip =
bbb.video.publish.close.label =
bbb.video.keepAspectBtn.tooltip =
bbb.video.fitVideoBtn.tooltip =
bbb.video.originalSizeBtn.tooltip =
bbb.video.publish.hint.noCamera =
bbb.video.publish.hint.cantOpenCamera =
bbb.video.publish.hint.waitingApproval =
bbb.video.publish.hint.videoPreview =
bbb.video.publish.hint.openingCamera =
bbb.video.publish.hint.cameraDenied =
bbb.video.publish.hint.cameraIsBeingUsed =
bbb.video.publish.hint.publishing =
bbb.desktopPublish.title =
bbb.desktopPublish.fullscreen.tooltip =
bbb.desktopPublish.fullscreen.label =
bbb.desktopPublish.region.tooltip =
bbb.desktopPublish.region.label =
bbb.desktopPublish.stop.tooltip =
bbb.desktopPublish.stop.label =
bbb.desktopPublish.maximizeRestoreBtn.toolTip =
bbb.desktopPublish.closeBtn.toolTip =
bbb.desktopPublish.minimizeBtn.toolTip =
bbb.desktopView.title =
bbb.desktopView.fitToWindow =
bbb.desktopView.actualSize =
bbb.toolbar.phone.toolTip =
bbb.toolbar.deskshare.toolTip =
bbb.toolbar.video.toolTip =
bbb.highlighter.toolbar.pencil =
bbb.highlighter.toolbar.ellipse =
bbb.highlighter.toolbar.rectangle =
bbb.highlighter.toolbar.clear =
bbb.highlighter.toolbar.undo =
bbb.highlighter.toolbar.color =
bbb.highlighter.toolbar.thickness =
bbb.highlighter.button.toolTipShow =
bbb.highlighter.button.toolTipHide =
bbb.logout.appshutdown =
bbb.logout.asyncerror =
bbb.logout.connectionclosed =
bbb.logout.connectionfailed =
bbb.logout.rejected =
bbb.logout.invalidapp =
bbb.logout.unknown =
bbb.logout.usercommand =
bbb.settings.deskshare.instructions =
bbb.settings.deskshare.start =
bbb.settings.voice.volume =
bbb.settings.voice.adjust =
bbb.settings.java.label =
bbb.settings.java.text =
bbb.settings.java.command =
bbb.settings.flash.label =
bbb.settings.flash.text =
bbb.settings.flash.command =
bbb.settings.isight.label =
bbb.settings.isight.text =
bbb.settings.isight.command =
bbb.settings.warning.label =
bbb.settings.warning.close =
bbb.settings.noissues =
bbb.settings.instructions =
bbb.videodock.title =
bbb.zzzzz.yyyy =
=

View File

@ -1,9 +1,9 @@
bbb.pageTitle = BigBlueButton
bbb.mainshell.locale.version = 0.8-beta2
bbb.mainshell.locale.version = 0.8-beta4
bbb.mainshell.statusProgress.connecting = Povezuje se sa serverom
bbb.mainshell.statusProgress.loading = Podiže {0} modula
bbb.mainshell.statusProgress.cannotConnectServer = Nažalost nije moguće uspostaviti vezu sa serverom.
bbb.mainshell.copyrightLabel2 = (c) 2011, CallPal by BigBlueButton - For more information see http://www.bigbluebutton.org/.
bbb.mainshell.copyrightLabel2 = (c) 2012, CallPal by BigBlueButton - For more information see http://www.bigbluebutton.org/.
bbb.mainshell.logBtn.toolTip = Otvori log prozor
bbb.mainshell.resetLayoutBtn.toolTip = Resetuj izgled
bbb.oldlocalewindow.reminder1 = Moguce imate staru verziju prevoda.
@ -33,6 +33,8 @@ bbb.viewers.raiseHandBtn.toolTip = Klikni da dignete ruku.
bbb.viewers.presentBtn.label = Promeni prezentatora
bbb.viewers.kickUserBtn.toolTip = Izbaci korisnika
bbb.presentation.title = Prezentacija
bbb.presentation.fitToWidth.toolTip =
bbb.presentation.fitToPage.toolTip =
bbb.presentation.uploadPresBtn = Prebaci dokument za prezentaciju.
bbb.presentation.uploadPresBtn.toolTip = Prebaci dokument za prezentaciju.
bbb.presentation.backBtn.toolTip = Prethodni slajd.

View File

@ -1,9 +1,9 @@
bbb.pageTitle = BigBlueButton
bbb.mainshell.locale.version = 0.8-beta2
bbb.mainshell.locale.version = 0.8-beta4
bbb.mainshell.statusProgress.connecting = Csatlakozás a szerverhez
bbb.mainshell.statusProgress.loading = {0} module töltése
bbb.mainshell.statusProgress.cannotConnectServer = Sajnos a szerverhez nem sikerült csatlakozni
bbb.mainshell.copyrightLabel2 = (c) 2011, BigBlueButton build {0} - További információk a http://www.bigbluebutton.org/ oldalon.
bbb.mainshell.copyrightLabel2 = (c) 2012, BigBlueButton build {0} - További információk a http://www.bigbluebutton.org/ oldalon.
bbb.mainshell.logBtn.toolTip = Naplózási ablak mengnyitása
bbb.mainshell.resetLayoutBtn.toolTip = Kinézet visszaállítása
bbb.oldlocalewindow.reminder1 = Valószínű régi BigBlueButton fordítsa van.
@ -33,6 +33,8 @@ bbb.viewers.raiseHandBtn.toolTip = Kattints a jelentkezéshez
bbb.viewers.presentBtn.label = Előadó cseréje
bbb.viewers.kickUserBtn.toolTip = Felhasználó eltávolítása
bbb.presentation.title = Előadás
bbb.presentation.fitToWidth.toolTip =
bbb.presentation.fitToPage.toolTip =
bbb.presentation.uploadPresBtn = Fájl feltöltése az előadáshoz
bbb.presentation.uploadPresBtn.toolTip = Fájl feltöltése az előadáshoz
bbb.presentation.backBtn.toolTip = Előző dia

View File

@ -1,19 +1,19 @@
bbb.pageTitle = BigBlueButton
bbb.mainshell.locale.version = 0.8-beta2
bbb.mainshell.locale.version = 0.8-beta4
bbb.mainshell.statusProgress.connecting = Sedang membuat hubungan ke server
bbb.mainshell.statusProgress.loading = Loading {0} modules
bbb.mainshell.statusProgress.loading = Memuat {0} modul
bbb.mainshell.statusProgress.cannotConnectServer = Maaf, tidak dapat terhubung ke server.
bbb.mainshell.copyrightLabel2 = (c) 2011, BigBlueButton build {0} - Untuk informasi lebih lanjut, kunjungi http://www.bigbluebutton.org/.
bbb.mainshell.copyrightLabel2 = (c) 2012, BigBlueButton build {0} - Untuk informasi lebih lanjut, kunjungi http://www.bigbluebutton.org/.
bbb.mainshell.logBtn.toolTip = Buka Jendela Log
bbb.mainshell.resetLayoutBtn.toolTip = Atur Ulang Tampilan
bbb.oldlocalewindow.reminder1 = Penerjamah bahasa dari BigBlueButton anda mungkin sudah lawas
bbb.oldlocalewindow.reminder2 = Harap bersihkan cache peramban anda kemudian coba lagi.
bbb.oldlocalewindow.windowTitle = Peringatan: Penerjemahan bahasa lawas
bbb.micSettings.playSound =
bbb.micSettings.hearFromHeadset =
bbb.micSettings.speakIntoMic =
bbb.micSettings.changeMic =
bbb.micSettings.join =
bbb.micSettings.playSound = Putar suara untuk percobaan
bbb.micSettings.hearFromHeadset = Anda seharusnya mendengar suara dari headset, bukan dari pengeras suara komputer.
bbb.micSettings.speakIntoMic = Anda seharusnya melihat batangan yang bergerak seiring anda berbicara pada headset.
bbb.micSettings.changeMic = Ganti Mikrofon
bbb.micSettings.join = Gabung Suara
bbb.micSettings.cancel = Batal
bbb.mainToolbar.helpBtn = Bantuan
bbb.mainToolbar.logoutBtn = Keluar
@ -31,8 +31,10 @@ bbb.viewers.viewersGrid.statusItemRenderer.presIcon.toolTip = Presenter
bbb.viewers.presentBtn.toolTip = Pilih siapa yang akan jadi presentasi.
bbb.viewers.raiseHandBtn.toolTip = Klik untuk mengangkat tangan.
bbb.viewers.presentBtn.label = Jadikan Presenter
bbb.viewers.kickUserBtn.toolTip = Kick User
bbb.viewers.kickUserBtn.toolTip = Usir Pengguna
bbb.presentation.title = Presentasi
bbb.presentation.fitToWidth.toolTip =
bbb.presentation.fitToPage.toolTip =
bbb.presentation.uploadPresBtn = Unggah sebuah dokumen untuk presentasi.
bbb.presentation.uploadPresBtn.toolTip = Unggah sebuah dokumen untuk presentasi.
bbb.presentation.backBtn.toolTip = Slide Sebelumnya
@ -56,7 +58,7 @@ bbb.presentation.error.convert.maxnbpagereach = Error: Dokumen yang diunggah mem
bbb.presentation.error.convert.swf = Error saat mengkonversi file unggahan. Silahkan hubungi Administrator.
bbb.presentation.converted = Berhasil dikonversi
bbb.presentation.ok = OK
bbb.presentation.uploadwindow.presentationfile = Data Presentasi
bbb.presentation.uploadwindow.presentationfile = Berkas Presentasi
bbb.presentation.uploadwindow.pdf = PDF
bbb.presentation.uploadwindow.word = WORD
bbb.presentation.uploadwindow.excel = EXCEL
@ -64,8 +66,8 @@ bbb.presentation.uploadwindow.powerpoint = POWERPOINT
bbb.presentation.uploadwindow.image = Citra
bbb.presentation.uploadwindow.closeLabel = Klik OK untuk menutup jendela
bbb.fileupload.title = Unggah Presentasi
bbb.fileupload.fileLbl = File:
bbb.fileupload.selectBtn.toolTip = Melihat-lihat file
bbb.fileupload.fileLbl = Berkas:
bbb.fileupload.selectBtn.toolTip = Cari berkas
bbb.fileupload.uploadBtn = Unggah
bbb.fileupload.uploadBtn.toolTip = Unggah file
bbb.fileupload.presentationNamesLbl = Unggah Presentasi:
@ -88,32 +90,32 @@ bbb.chat.privateChatSelect = Pilih seseorang untuk obrolan pribadi
bbb.chat.chatOptions = Opsi Obrolan
bbb.chat.fontSize = Ukuran Huruf
bbb.listeners.title = Pendengar{0} {1}
bbb.listeners.pushToTalk.toolTip =
bbb.listeners.pushToMute.toolTip =
bbb.listeners.talk =
bbb.listeners.mute =
bbb.listeners.muteAllBtn.toolTip = Diam semua
bbb.listeners.unmuteAllBtn.toolTip = Bersuara
bbb.listeners.ejectTooltip = Kick User
bbb.listeners.pushToTalk.toolTip = Klik untuk bicara
bbb.listeners.pushToMute.toolTip = Klik untuk membisukan diri anda sendiri
bbb.listeners.talk = Bicara
bbb.listeners.mute = Bisu
bbb.listeners.muteAllBtn.toolTip = Diamkan semua
bbb.listeners.unmuteAllBtn.toolTip = Suarakan semua
bbb.listeners.ejectTooltip = Usir Pengguna
bbb.listenerItem.nameLbl.toolTip = Pilih pengguna ini dan klik tombol untuk mengaktifkan atau menonaktifkan suara.
bbb.listenerItem.talkImg.toolTip = Berbicara
bbb.listenerItem.talkImg.toolTip = Sedang bicara
bbb.listenerItem.lockImg.toolTip = Klik untuk mengaktifkan atau menonaktifkan suara
bbb.listenerItem.muteUnmute.toolTip = Menonaktifkan atau mengaktifkan suara pendengar ini
bbb.publishVideo.title = Bagikan Video Anda
bbb.publishVideo.title = Bagikan Kamera Anda
bbb.publishVideo.startPublishBtn.toolTip = Mulai Berbagi
bbb.video.publish.close.tooltip = Berhenti membagikan Video Anda
bbb.video.publish.close.tooltip = Berhenti membagikan kamera anda
bbb.video.publish.close.label = Tutup
bbb.video.keepAspectBtn.tooltip =
bbb.video.fitVideoBtn.tooltip =
bbb.video.originalSizeBtn.tooltip =
bbb.video.publish.hint.noCamera =
bbb.video.publish.hint.cantOpenCamera =
bbb.video.publish.hint.waitingApproval =
bbb.video.publish.hint.videoPreview =
bbb.video.publish.hint.openingCamera =
bbb.video.publish.hint.cameraDenied =
bbb.video.publish.hint.cameraIsBeingUsed =
bbb.video.publish.hint.publishing =
bbb.video.keepAspectBtn.tooltip = Jaga aspek jendela
bbb.video.fitVideoBtn.tooltip = Paskan video
bbb.video.originalSizeBtn.tooltip = Ukuran asli
bbb.video.publish.hint.noCamera = Tidak ada kamera tersedia
bbb.video.publish.hint.cantOpenCamera = Tidak dapat membuka kamera anda
bbb.video.publish.hint.waitingApproval = Menunggu persetujuan
bbb.video.publish.hint.videoPreview = Pratinjau video
bbb.video.publish.hint.openingCamera = Sedang membuka kamera...
bbb.video.publish.hint.cameraDenied = Akses kamera ditolak
bbb.video.publish.hint.cameraIsBeingUsed = Kamera anda sedang digunakan oleh aplikasi lain
bbb.video.publish.hint.publishing = Mempublikasikan...
bbb.desktopPublish.title = Berbagi Desktop: Pratinjau Presenter
bbb.desktopPublish.fullscreen.tooltip = Bagikan seluruh layar anda
bbb.desktopPublish.fullscreen.label = Layar Penuh
@ -147,13 +149,13 @@ bbb.logout.rejected = Hubungan ke server ditolak
bbb.logout.invalidapp = Aplikasi red5 belum terpasang
bbb.logout.unknown = Klien anda telah kehilangan hubungan ke server.
bbb.logout.usercommand = Anda telah keluar dari konferensi
bbb.settings.deskshare.instructions =
bbb.settings.deskshare.instructions = Klik Ijinkan pada jendela pop up untuk memeriksa jika berbagi desktop berjalan sebagaimana mestinya.
bbb.settings.deskshare.start = Periksa fitur Berbagi Desktop.
bbb.settings.voice.volume = Aktifitas Mikrofon
bbb.settings.voice.adjust = Atur Suara
bbb.settings.java.label = Versi Java bermasalah
bbb.settings.java.text = Anda memiliki Java {0} yang terpasang, tapi anda membutuhkan paling tidak bersi {1} untuk dapat menggunakan fitur berbagi desktop. Klik pada tombol di bawah untuk memasang versi Java JRE terbaru.
bbb.settings.java.command = Pasang Java yang terbaru
bbb.settings.java.text = Anda memiliki Java {0} yang terpasang, tapi anda membutuhkan paling tidak versi {1} untuk dapat menggunakan fitur berbagi desktop. Klik pada tombol di bawah untuk memasang versi Java JRE terbaru.
bbb.settings.java.command = Pasang Java terbaru
bbb.settings.flash.label = Kesalahan pada versi Flash
bbb.settings.flash.text = Anda sudah memiliki Flash {0} yang terpasang, tapi anda membutuhkan paling tidak versi {1} untuk dapat menjalankan BigBlueButton dengan baik. Klik tombol di bawah untuk memasang versi Adobe Flash terbaru.
bbb.settings.flash.command = Pasang Flash yang terbaru
@ -162,8 +164,8 @@ bbb.settings.isight.text = Jika anda punya masalah dengan iSight kamera, mungkin
bbb.settings.isight.command = Pasang Flash 10.2.RC2
bbb.settings.warning.label = Peringatan
bbb.settings.warning.close = Tutup peringatan ini
bbb.settings.noissues = Tidak ada masalah terkemuka yang terdeteksi.
bbb.settings.instructions = Terima konfirmasi Flash yang meminta izin atas kamera anda. Jika anda bisa melihat dan mendengar diri anda sendiri berarti peramban anda sudah diatur dengan benar. Masalah yang potensial lainnya ditampilkan di bawah. Klik untuk menemukan solusi yang mungkin dari masing-masing masalah.
bbb.videodock.title =
bbb.settings.noissues = Tidak ada masalah mencolok yang terdeteksi.
bbb.settings.instructions = Terima konfirmasi Flash yang meminta izin atas kamera anda. Jika anda bisa melihat dan mendengar diri anda sendiri berarti peramban anda sudah diatur dengan benar. Masalah yang potensial lainnya ditampilkan di bawah. Klik untuk menemukan kemungkinan solusi dari masing-masing masalah.
bbb.videodock.title = Dok video
bbb.zzzzz.yyyy =
=

View File

@ -1,9 +1,9 @@
bbb.pageTitle = BigBlueButton
bbb.mainshell.locale.version = 0.8-beta2
bbb.mainshell.locale.version = 0.8-beta4
bbb.mainshell.statusProgress.connecting = Connessione al server in corso
bbb.mainshell.statusProgress.loading = Caricamento:
bbb.mainshell.statusProgress.cannotConnectServer = Errore di connessione.
bbb.mainshell.copyrightLabel2 = (c) 2011, BigBlueButton versione {0} - Per maggiori informazioni visita http://www.bigbluebutton.org/.
bbb.mainshell.copyrightLabel2 = (c) 2012, BigBlueButton versione {0} - Per maggiori informazioni visita http://www.bigbluebutton.org/.
bbb.mainshell.logBtn.toolTip = Apri finestra Log
bbb.mainshell.resetLayoutBtn.toolTip = Reimposta Layout
bbb.oldlocalewindow.reminder1 = Potresti avere una localizzazione obsoleta.
@ -33,6 +33,8 @@ bbb.viewers.raiseHandBtn.toolTip = Clicca per alzare la mano.
bbb.viewers.presentBtn.label = Scambia presentatore
bbb.viewers.kickUserBtn.toolTip = Clicca per espellere.
bbb.presentation.title = Presentazione
bbb.presentation.fitToWidth.toolTip =
bbb.presentation.fitToPage.toolTip =
bbb.presentation.uploadPresBtn = Carica un documento per la presentazione.
bbb.presentation.uploadPresBtn.toolTip = Carica un documento per la presentazione.
bbb.presentation.backBtn.toolTip = Slide precedente.

View File

@ -1,9 +1,9 @@
bbb.pageTitle = BigBlueButton
bbb.mainshell.locale.version = 0.8-beta2
bbb.mainshell.locale.version = 0.8-beta4
bbb.mainshell.statusProgress.connecting = サーバーへ接続しています。
bbb.mainshell.statusProgress.loading = 読み込み中・・・ {0} モジュール が読み込まれました。
bbb.mainshell.statusProgress.cannotConnectServer = 申し訳ありません。サーバーに接続できません。
bbb.mainshell.copyrightLabel2 = (c) 2010, BigBlueButton build {0} - 詳細につきましては、http://www.bigbluebutton.org/をご覧ください。
bbb.mainshell.copyrightLabel2 = (c) 2012, BigBlueButton build {0} - 詳細につきましては、http://www.bigbluebutton.org/をご覧ください。
bbb.mainshell.logBtn.toolTip = ログウィンドウを開く
bbb.mainshell.resetLayoutBtn.toolTip = レイアウトを元に戻す
bbb.oldlocalewindow.reminder1 = BigBlueButtonの古い言語翻訳を使用しているようです。
@ -33,6 +33,8 @@ bbb.viewers.raiseHandBtn.toolTip = クリックして挙手。
bbb.viewers.presentBtn.label = プレゼンターをスイッチ
bbb.viewers.kickUserBtn.toolTip = このユーザのマイクを停止します
bbb.presentation.title = プレゼンテーション
bbb.presentation.fitToWidth.toolTip =
bbb.presentation.fitToPage.toolTip =
bbb.presentation.uploadPresBtn = 資料をアップロードします。
bbb.presentation.uploadPresBtn.toolTip = 資料をアップロードします。
bbb.presentation.backBtn.toolTip = 前のスライド

View File

@ -1,9 +1,9 @@
bbb.pageTitle = BigBlueButton
bbb.mainshell.locale.version = 0.8-beta2
bbb.mainshell.locale.version = 0.8-beta4
bbb.mainshell.statusProgress.connecting = 서버 접속중 # Connecting to the server
bbb.mainshell.statusProgress.loading = 모듈 {0} 로딩중
bbb.mainshell.statusProgress.cannotConnectServer = 서버에 접속하지 못했습니다. # Sorry, we cannot connect to the server.
bbb.mainshell.copyrightLabel2 = (c) 2011, BigBlueButton build {0} - 자세한 정보는 사이트에서 확인하세요. http://www.bigbluebutton.org/. # (c) 2011, BigBlueButton build {0} - For more information see http://www.bigbluebutton.org/.
bbb.mainshell.copyrightLabel2 = (c) 2012, BigBlueButton build {0} - 자세한 정보는 사이트에서 확인하세요. http://www.bigbluebutton.org/. # (c) 2011, BigBlueButton build {0} - For more information see http://www.bigbluebutton.org/.
bbb.mainshell.logBtn.toolTip = 기록 보기 # Open Log Window
bbb.mainshell.resetLayoutBtn.toolTip = 화면 재설정 # Reset Layout
bbb.oldlocalewindow.reminder1 = 이전 언어팩 설치되어 있습니다.
@ -33,6 +33,8 @@ bbb.viewers.raiseHandBtn.toolTip = 클릭하시면 손들기 모양이 표시됩
bbb.viewers.presentBtn.label = 발표자변경 # Switch Presenter
bbb.viewers.kickUserBtn.toolTip = 강퇴 # Kick User
bbb.presentation.title = 프리젠테이션 # Presentation
bbb.presentation.fitToWidth.toolTip =
bbb.presentation.fitToPage.toolTip =
bbb.presentation.uploadPresBtn = 프리젠테이션 자료 올리기 # Upload a document for presentation.
bbb.presentation.uploadPresBtn.toolTip = 프리젠테이션 자료 올리기 # Upload a document for presentation.
bbb.presentation.backBtn.toolTip = 이전 슬라이드

View File

@ -1,9 +1,9 @@
bbb.pageTitle = BigBlueButton
bbb.mainshell.locale.version = 0.8-beta2
bbb.mainshell.locale.version = 0.8-beta4
bbb.mainshell.statusProgress.connecting =
bbb.mainshell.statusProgress.loading = ?k?limas:
bbb.mainshell.statusProgress.cannotConnectServer = Atsiprašome, n?ra galimyb?s prisijungti prie serverio.
bbb.mainshell.copyrightLabel2 = (c) 2010, BigBlueButton versija {0} - Daugiau informacijos tinklalapyje http://www.bigbluebutton.org/.
bbb.mainshell.copyrightLabel2 = (c) 2012, BigBlueButton versija {0} - Daugiau informacijos tinklalapyje http://www.bigbluebutton.org/.
bbb.mainshell.logBtn.toolTip = Atverti ?vyki? lang?
bbb.mainshell.resetLayoutBtn.toolTip = Atstatyti langus ? pradin? pad?t?
bbb.oldlocalewindow.reminder1 = You may have an old language translations of BigBlueButton.
@ -33,6 +33,8 @@ bbb.viewers.raiseHandBtn.toolTip = Pakelti rank?.
bbb.viewers.presentBtn.label =
bbb.viewers.kickUserBtn.toolTip = Išjungti bals?
bbb.presentation.title = Prezentacija
bbb.presentation.fitToWidth.toolTip =
bbb.presentation.fitToPage.toolTip =
bbb.presentation.uploadPresBtn = ?kelti dokument? prezentacijai.
bbb.presentation.uploadPresBtn.toolTip = ?kelti dokument? prezentacijai.
bbb.presentation.backBtn.toolTip = Buv?s puslapis.

View File

@ -1,9 +1,9 @@
bbb.pageTitle = BigBlueButton
bbb.mainshell.locale.version = 0.8-beta2
bbb.mainshell.locale.version = 0.8-beta4
bbb.mainshell.statusProgress.connecting = Pievienojas serverim
bbb.mainshell.statusProgress.loading = Ielādē {0} moduļus
bbb.mainshell.statusProgress.cannotConnectServer = Atvainojiet, pieslēgties serverim neizdevās.
bbb.mainshell.copyrightLabel2 = (c) 2010, BigBlueButton build {0} - For more information see http://www.bigbluebutton.org/.
bbb.mainshell.copyrightLabel2 = (c) 2012, BigBlueButton build {0} - For more information see http://www.bigbluebutton.org/.
bbb.mainshell.logBtn.toolTip = Atvērt logus
bbb.mainshell.resetLayoutBtn.toolTip = Atiestatīt izkārtojumu
bbb.oldlocalewindow.reminder1 = Iespējams, ka tulkojums ir novecojis.
@ -33,6 +33,8 @@ bbb.viewers.raiseHandBtn.toolTip = Spiest lai paceltu roku.
bbb.viewers.presentBtn.label = rslÄ“gt demonstrÄ“tāju
bbb.viewers.kickUserBtn.toolTip = Izsviest lietotāju
bbb.presentation.title = Prezentācija
bbb.presentation.fitToWidth.toolTip =
bbb.presentation.fitToPage.toolTip =
bbb.presentation.uploadPresBtn = Augšupielādēt prezentāciju.
bbb.presentation.uploadPresBtn.toolTip = Augšupielādēt prezentāciju.
bbb.presentation.backBtn.toolTip = Iepriekšējais slaids.

View File

@ -1,5 +1,5 @@
bbb.pageTitle = ТомЦэнхэрТовчлуур
bbb.mainshell.locale.version = 0.8-beta2
bbb.mainshell.locale.version = 0.8-beta4
bbb.mainshell.statusProgress.connecting = Сервер луу холбогдож байна.
bbb.mainshell.statusProgress.loading = Нийт {0} Модуль байна
bbb.mainshell.statusProgress.cannotConnectServer = Уучилаарай, бид сервер лүү холбогдож чадсангүй
@ -33,6 +33,8 @@ bbb.viewers.raiseHandBtn.toolTip = Энд дараад гараа өргөнө
bbb.viewers.presentBtn.label = Танилцуулагчыг солих
bbb.viewers.kickUserBtn.toolTip = Хэрэглэгчийг хөөх
bbb.presentation.title = Танилцуулга файл
bbb.presentation.fitToWidth.toolTip =
bbb.presentation.fitToPage.toolTip =
bbb.presentation.uploadPresBtn = Танилцуулагчын бичиг баримтыг илгээх
bbb.presentation.uploadPresBtn.toolTip = Танилцуулагчын бичиг баримтыг илгээх
bbb.presentation.backBtn.toolTip = Өмнөх хуудас

View File

@ -33,6 +33,8 @@ bbb.viewers.raiseHandBtn.toolTip =
bbb.viewers.presentBtn.label =
bbb.viewers.kickUserBtn.toolTip =
bbb.presentation.title =
bbb.presentation.fitToWidth.toolTip =
bbb.presentation.fitToPage.toolTip =
bbb.presentation.uploadPresBtn =
bbb.presentation.uploadPresBtn.toolTip =
bbb.presentation.backBtn.toolTip =

View File

@ -1,9 +1,9 @@
bbb.pageTitle = BigBlueButton
bbb.mainshell.locale.version = 0.8-beta2
bbb.mainshell.locale.version = 0.8-beta4
bbb.mainshell.statusProgress.connecting = Verbinding aan het maken met de server
bbb.mainshell.statusProgress.loading = Laden:
bbb.mainshell.statusProgress.cannotConnectServer = We kunnen geen verbinding maken met de server.
bbb.mainshell.copyrightLabel2 = (c) 2011, BigBlueButton versie {0} - Voor meer informatie ga naar http://www.bigbluebutton.org/.
bbb.mainshell.copyrightLabel2 = (c) 2012, BigBlueButton versie {0} - Voor meer informatie ga naar http://www.bigbluebutton.org/.
bbb.mainshell.logBtn.toolTip = Open log scherm
bbb.mainshell.resetLayoutBtn.toolTip = Herstel de scherm-indeling
bbb.oldlocalewindow.reminder1 = U hebt misschien een verouderde vertaling van bigbluebutton.
@ -33,6 +33,8 @@ bbb.viewers.raiseHandBtn.toolTip = Klik om uw hand op te steken.
bbb.viewers.presentBtn.label = Wijzig voorzitter
bbb.viewers.kickUserBtn.toolTip = Klik om deze gebruiker uit de kamer te verwijderen
bbb.presentation.title = Presentatie
bbb.presentation.fitToWidth.toolTip =
bbb.presentation.fitToPage.toolTip =
bbb.presentation.uploadPresBtn = Verzend een document om te presenteren.
bbb.presentation.uploadPresBtn.toolTip = Verzend een document om te presenteren.
bbb.presentation.backBtn.toolTip = Vorige pagina.

View File

@ -1,9 +1,9 @@
bbb.pageTitle = BigBlueButton
bbb.mainshell.locale.version = 0.8-beta2
bbb.mainshell.locale.version = 0.8-beta4
bbb.mainshell.statusProgress.connecting = Kobler opp til serveren
bbb.mainshell.statusProgress.loading = Laster {0} moduler
bbb.mainshell.statusProgress.cannotConnectServer = Beklager, vi kan ikke koble til serveren
bbb.mainshell.copyrightLabel2 = (c) 2010, BigBlueButton build {0} - Mer informasjon finnes hos http://www.bigbluebutton.org/.
bbb.mainshell.copyrightLabel2 = (c) 2012, BigBlueButton build {0} - Mer informasjon finnes hos http://www.bigbluebutton.org/.
bbb.mainshell.logBtn.toolTip = Åpne loggvindu
bbb.mainshell.resetLayoutBtn.toolTip = Nullstill oppsett
bbb.oldlocalewindow.reminder1 = Du har kanskje en gammel språkfil
@ -33,6 +33,8 @@ bbb.viewers.raiseHandBtn.toolTip = Klikk for håndsopprekking
bbb.viewers.presentBtn.label = Velg ny presenterer
bbb.viewers.kickUserBtn.toolTip = Send ut bruker
bbb.presentation.title = Presentasjon
bbb.presentation.fitToWidth.toolTip =
bbb.presentation.fitToPage.toolTip =
bbb.presentation.uploadPresBtn = Last opp dokument til presentasjon.
bbb.presentation.uploadPresBtn.toolTip = Last opp dokument til presentasjon.
bbb.presentation.backBtn.toolTip = Forrige lysark.

View File

@ -1,9 +1,9 @@
bbb.pageTitle = BigBlueButton
bbb.mainshell.locale.version = 0.8-beta2
bbb.mainshell.locale.version = 0.8-beta4
bbb.mainshell.statusProgress.connecting = Łączenie z serwerem
bbb.mainshell.statusProgress.loading = Proszę czekać, ładowanie {0} modułów w toku:
bbb.mainshell.statusProgress.cannotConnectServer = Przepraszamy, brak możliwości podłączenia do serwera.
bbb.mainshell.copyrightLabel2 = (c) 2011, BigBlueButton build {0} - Więcej informacji pod adresem http://www.bigbluebutton.org/.
bbb.mainshell.copyrightLabel2 = (c) 2012, BigBlueButton build {0} - Więcej informacji pod adresem http://www.bigbluebutton.org/.
bbb.mainshell.logBtn.toolTip = Otwórz okno dziennika
bbb.mainshell.resetLayoutBtn.toolTip = Resetuj układ
bbb.oldlocalewindow.reminder1 = Możliwe, iż masz stare tłumaczenie dla BigBlueButton.
@ -33,6 +33,8 @@ bbb.viewers.raiseHandBtn.toolTip = Kliknij, aby podnieść rękę.
bbb.viewers.presentBtn.label = Ustaw prezentera
bbb.viewers.kickUserBtn.toolTip = Usuń użytkownika
bbb.presentation.title = Prezentacja
bbb.presentation.fitToWidth.toolTip =
bbb.presentation.fitToPage.toolTip =
bbb.presentation.uploadPresBtn = Wgraj dokument do prezentacji.
bbb.presentation.uploadPresBtn.toolTip = Wgraj dokument do prezentacji.
bbb.presentation.backBtn.toolTip = Poprzedni slajd.

View File

@ -1,9 +1,9 @@
bbb.pageTitle = BigBlueButton
bbb.mainshell.locale.version = 0.8-beta2
bbb.mainshell.locale.version = 0.8-beta4
bbb.mainshell.statusProgress.connecting = Conectando no servidor
bbb.mainshell.statusProgress.loading = Carregando {0} módulos
bbb.mainshell.statusProgress.cannotConnectServer = Desculpe, não foi possível conectar no servidor.
bbb.mainshell.copyrightLabel2 = (c) 2011, BigBlueButton compilação {0} - Para mais informações, acesse http://www.bigbluebutton.org/.
bbb.mainshell.copyrightLabel2 = (c) 2012, BigBlueButton compilação {0} - Para mais informações, acesse http://www.bigbluebutton.org/.
bbb.mainshell.logBtn.toolTip = Abrir Janela de Registro
bbb.mainshell.resetLayoutBtn.toolTip = Restaurar layout
bbb.oldlocalewindow.reminder1 = Você pode ter uma tradução antiga do idioma do BigBlueButton.
@ -33,6 +33,8 @@ bbb.viewers.raiseHandBtn.toolTip = Clique aqui para levantar a mão e pedir a pa
bbb.viewers.presentBtn.label = Mudar Apresentador
bbb.viewers.kickUserBtn.toolTip = Expulsar usuário.
bbb.presentation.title = Apresentação
bbb.presentation.fitToWidth.toolTip =
bbb.presentation.fitToPage.toolTip =
bbb.presentation.uploadPresBtn = Enviar um documento para apresentação.
bbb.presentation.uploadPresBtn.toolTip = Enviar um documento para apresentação.
bbb.presentation.backBtn.toolTip = Slide anterior.

View File

@ -1,9 +1,9 @@
bbb.pageTitle = BigBlueButton
bbb.mainshell.locale.version = 0.8-beta2
bbb.mainshell.locale.version = 0.8-beta4
bbb.mainshell.statusProgress.connecting = Ligando ao Servidor
bbb.mainshell.statusProgress.loading = Carregando {0} modulos
bbb.mainshell.statusProgress.cannotConnectServer = Desculpe, não foi possí­vel estabelecer ligação ao servidor.
bbb.mainshell.copyrightLabel2 = (c) 2009, BigBlueButton versão {0} - Para mais informações, veja http://www.bigbluebutton.org/.
bbb.mainshell.copyrightLabel2 = (c) 2012, BigBlueButton versão {0} - Para mais informações, veja http://www.bigbluebutton.org/.
bbb.mainshell.logBtn.toolTip = Abrir janela de registo
bbb.mainshell.resetLayoutBtn.toolTip = Restaurar layout
bbb.oldlocalewindow.reminder1 = You may have an old language translations of BigBlueButton.
@ -33,6 +33,8 @@ bbb.viewers.raiseHandBtn.toolTip = Clique aqui para levantar a mão
bbb.viewers.presentBtn.label = Trocar Apresentador
bbb.viewers.kickUserBtn.toolTip = Clique aqui para expulsar utilizador.
bbb.presentation.title = Apresentação
bbb.presentation.fitToWidth.toolTip =
bbb.presentation.fitToPage.toolTip =
bbb.presentation.uploadPresBtn = Enviar um documento para apresentação.
bbb.presentation.uploadPresBtn.toolTip = Enviar um documento para apresentação.
bbb.presentation.backBtn.toolTip = Slide anterior.

View File

@ -1,9 +1,9 @@
bbb.pageTitle = BigBlueButton
bbb.mainshell.locale.version = 0.8-beta2
bbb.mainshell.locale.version = 0.8-beta4
bbb.mainshell.statusProgress.connecting = Se conectează la server
bbb.mainshell.statusProgress.loading = Încărcare:
bbb.mainshell.statusProgress.cannotConnectServer = Nu s-a putut realiza conexiunea cu serverul.
bbb.mainshell.copyrightLabel2 = (c) 2010, BigBlueButton versiunea {0} - Pentru mai multe informaţii, accesaţi http://www.bigbluebutton.org/.
bbb.mainshell.copyrightLabel2 = (c) 2012, BigBlueButton versiunea {0} - Pentru mai multe informaţii, accesaţi http://www.bigbluebutton.org/.
bbb.mainshell.logBtn.toolTip = Afişaţi Jurnalul
bbb.mainshell.resetLayoutBtn.toolTip = Reiniţializare Pagină
bbb.oldlocalewindow.reminder1 = S-ar putea să aveţi traduceri vechi a BigBlueButton
@ -33,6 +33,8 @@ bbb.viewers.raiseHandBtn.toolTip = Cereţi cuvântul.
bbb.viewers.presentBtn.label = Schimbă Prezentatorul
bbb.viewers.kickUserBtn.toolTip = Daţi clic pentru a exclude participantul.
bbb.presentation.title = Prezentare
bbb.presentation.fitToWidth.toolTip =
bbb.presentation.fitToPage.toolTip =
bbb.presentation.uploadPresBtn = Încărcaţi un document în prezentare.
bbb.presentation.uploadPresBtn.toolTip = Încărcaţi un document în prezentare.
bbb.presentation.backBtn.toolTip = Slide-ul anterior.

View File

@ -1,9 +1,9 @@
bbb.pageTitle = Конференции BigBlueButton
bbb.mainshell.locale.version = 0.8-beta2
bbb.mainshell.locale.version = 0.8-beta4
bbb.mainshell.statusProgress.connecting = Идёт подключение к серверу
bbb.mainshell.statusProgress.loading = Идёт загрузка {0} модулей
bbb.mainshell.statusProgress.cannotConnectServer = К сожалению, мы не можем подключиться к серверу.
bbb.mainshell.copyrightLabel2 = © 2011, BigBlueButton, версия {0}, дополнительная информация на сайте: http://www.bigbluebutton.org/.
bbb.mainshell.copyrightLabel2 = © 2012, BigBlueButton, версия {0}, дополнительная информация на сайте: http://www.bigbluebutton.org/.
bbb.mainshell.logBtn.toolTip = Открыть окно журнала
bbb.mainshell.resetLayoutBtn.toolTip = Сбросить расположение окон
bbb.oldlocalewindow.reminder1 = Возможно, у вас устаревшая версия перевода BigBlueButton.
@ -33,6 +33,8 @@ bbb.viewers.raiseHandBtn.toolTip = Попросить слова
bbb.viewers.presentBtn.label = Переключить ведущего
bbb.viewers.kickUserBtn.toolTip = Исключить из конференции
bbb.presentation.title = Презентация
bbb.presentation.fitToWidth.toolTip =
bbb.presentation.fitToPage.toolTip =
bbb.presentation.uploadPresBtn = Загрузить документ для показа.
bbb.presentation.uploadPresBtn.toolTip = Загрузить документ для показа.
bbb.presentation.backBtn.toolTip = Предыдущий слайд.

View File

@ -0,0 +1,171 @@
bbb.pageTitle =
bbb.mainshell.locale.version =
bbb.mainshell.statusProgress.connecting =
bbb.mainshell.statusProgress.loading =
bbb.mainshell.statusProgress.cannotConnectServer =
bbb.mainshell.copyrightLabel2 =
bbb.mainshell.logBtn.toolTip =
bbb.mainshell.resetLayoutBtn.toolTip =
bbb.oldlocalewindow.reminder1 =
bbb.oldlocalewindow.reminder2 =
bbb.oldlocalewindow.windowTitle =
bbb.micSettings.playSound =
bbb.micSettings.hearFromHeadset =
bbb.micSettings.speakIntoMic =
bbb.micSettings.changeMic =
bbb.micSettings.join =
bbb.micSettings.cancel =
bbb.mainToolbar.helpBtn =
bbb.mainToolbar.logoutBtn =
bbb.mainToolbar.logoutBtn.toolTip =
bbb.mainToolbar.settingsBtn =
bbb.mainToolbar.settingsBtn.toolTip =
bbb.viewers.title =
bbb.viewers.viewersGrid.nameItemRenderer =
bbb.viewers.viewersGrid.nameItemRenderer.nameLabel.toolTip =
bbb.viewers.viewersGrid.roleItemRenderer =
bbb.viewers.viewersGrid.statusItemRenderer =
bbb.viewers.viewersGrid.statusItemRenderer.raiseHand.toolTip =
bbb.viewers.viewersGrid.statusItemRenderer.streamIcon.toolTip =
bbb.viewers.viewersGrid.statusItemRenderer.presIcon.toolTip =
bbb.viewers.presentBtn.toolTip =
bbb.viewers.raiseHandBtn.toolTip =
bbb.viewers.presentBtn.label =
bbb.viewers.kickUserBtn.toolTip =
bbb.presentation.title =
bbb.presentation.fitToWidth.toolTip =
bbb.presentation.fitToPage.toolTip =
bbb.presentation.uploadPresBtn =
bbb.presentation.uploadPresBtn.toolTip =
bbb.presentation.backBtn.toolTip =
bbb.presentation.slideNumLbl.toolTip =
bbb.presentation.forwardBtn.toolTip =
bbb.presentation.resetZoomBtn.toolTip =
bbb.presentation.presenterNameLbl =
bbb.presentation.clickToUpload =
bbb.presentation.maxUploadFileExceededAlert =
bbb.presentation.uploadcomplete =
bbb.presentation.uploaded =
bbb.presentation.document.supported =
bbb.presentation.document.converted =
bbb.presentation.error.document.convert.failed =
bbb.presentation.error.io =
bbb.presentation.error.security =
bbb.presentation.error.convert.format =
bbb.presentation.error.convert.notsupported =
bbb.presentation.error.convert.nbpage =
bbb.presentation.error.convert.maxnbpagereach =
bbb.presentation.error.convert.swf =
bbb.presentation.converted =
bbb.presentation.ok =
bbb.presentation.uploadwindow.presentationfile =
bbb.presentation.uploadwindow.pdf =
bbb.presentation.uploadwindow.word =
bbb.presentation.uploadwindow.excel =
bbb.presentation.uploadwindow.powerpoint =
bbb.presentation.uploadwindow.image =
bbb.presentation.uploadwindow.closeLabel =
bbb.fileupload.title =
bbb.fileupload.fileLbl =
bbb.fileupload.selectBtn.toolTip =
bbb.fileupload.uploadBtn =
bbb.fileupload.uploadBtn.toolTip =
bbb.fileupload.presentationNamesLbl =
bbb.fileupload.deleteBtn.toolTip =
bbb.fileupload.showBtn =
bbb.fileupload.showBtn.toolTip =
bbb.fileupload.okCancelBtn =
bbb.fileupload.genThumbText =
bbb.fileupload.progBarLbl =
bbb.chat.title =
bbb.chat.cmpColorPicker.toolTip =
bbb.chat.sendBtn =
bbb.chat.sendBtn.toolTip =
bbb.chat.publicChatUsername =
bbb.chat.publicMsgAwaiting =
bbb.chat.publicMsgAwaiting2 =
bbb.chat.privateMsgAwaiting =
bbb.chat.privateMsgAwaiting2 =
bbb.chat.privateChatSelect =
bbb.chat.chatOptions =
bbb.chat.fontSize =
bbb.listeners.title =
bbb.listeners.pushToTalk.toolTip =
bbb.listeners.pushToMute.toolTip =
bbb.listeners.talk =
bbb.listeners.mute =
bbb.listeners.muteAllBtn.toolTip =
bbb.listeners.unmuteAllBtn.toolTip =
bbb.listeners.ejectTooltip =
bbb.listenerItem.nameLbl.toolTip =
bbb.listenerItem.talkImg.toolTip =
bbb.listenerItem.lockImg.toolTip =
bbb.listenerItem.muteUnmute.toolTip =
bbb.publishVideo.title =
bbb.publishVideo.startPublishBtn.toolTip =
bbb.video.publish.close.tooltip =
bbb.video.publish.close.label =
bbb.video.keepAspectBtn.tooltip =
bbb.video.fitVideoBtn.tooltip =
bbb.video.originalSizeBtn.tooltip =
bbb.video.publish.hint.noCamera =
bbb.video.publish.hint.cantOpenCamera =
bbb.video.publish.hint.waitingApproval =
bbb.video.publish.hint.videoPreview =
bbb.video.publish.hint.openingCamera =
bbb.video.publish.hint.cameraDenied =
bbb.video.publish.hint.cameraIsBeingUsed =
bbb.video.publish.hint.publishing =
bbb.desktopPublish.title =
bbb.desktopPublish.fullscreen.tooltip =
bbb.desktopPublish.fullscreen.label =
bbb.desktopPublish.region.tooltip =
bbb.desktopPublish.region.label =
bbb.desktopPublish.stop.tooltip =
bbb.desktopPublish.stop.label =
bbb.desktopPublish.maximizeRestoreBtn.toolTip =
bbb.desktopPublish.closeBtn.toolTip =
bbb.desktopPublish.minimizeBtn.toolTip =
bbb.desktopView.title =
bbb.desktopView.fitToWindow =
bbb.desktopView.actualSize =
bbb.toolbar.phone.toolTip =
bbb.toolbar.deskshare.toolTip =
bbb.toolbar.video.toolTip =
bbb.highlighter.toolbar.pencil =
bbb.highlighter.toolbar.ellipse =
bbb.highlighter.toolbar.rectangle =
bbb.highlighter.toolbar.clear =
bbb.highlighter.toolbar.undo =
bbb.highlighter.toolbar.color =
bbb.highlighter.toolbar.thickness =
bbb.highlighter.button.toolTipShow =
bbb.highlighter.button.toolTipHide =
bbb.logout.appshutdown =
bbb.logout.asyncerror =
bbb.logout.connectionclosed =
bbb.logout.connectionfailed =
bbb.logout.rejected =
bbb.logout.invalidapp =
bbb.logout.unknown =
bbb.logout.usercommand =
bbb.settings.deskshare.instructions =
bbb.settings.deskshare.start =
bbb.settings.voice.volume =
bbb.settings.voice.adjust =
bbb.settings.java.label =
bbb.settings.java.text =
bbb.settings.java.command =
bbb.settings.flash.label =
bbb.settings.flash.text =
bbb.settings.flash.command =
bbb.settings.isight.label =
bbb.settings.isight.text =
bbb.settings.isight.command =
bbb.settings.warning.label =
bbb.settings.warning.close =
bbb.settings.noissues =
bbb.settings.instructions =
bbb.videodock.title =
bbb.zzzzz.yyyy =
=

View File

@ -1,9 +1,9 @@
bbb.pageTitle = BigBlueButton
bbb.mainshell.locale.version = 0.8-beta2
bbb.mainshell.locale.version = 0.8-beta4
bbb.mainshell.statusProgress.connecting = Pripája sa ku serveru
bbb.mainshell.statusProgress.loading = Nahráva {0} modulov
bbb.mainshell.statusProgress.cannotConnectServer = Ľutujeme, nepodarilo sa pripojiť k serveru.
bbb.mainshell.copyrightLabel2 = (c) 2011, BigBlueButton revízia {0} - Pre viac informácii navštívte http://www.bigbluebutton.org/.
bbb.mainshell.copyrightLabel2 = (c) 2012, BigBlueButton revízia {0} - Pre viac informácii navštívte http://www.bigbluebutton.org/.
bbb.mainshell.logBtn.toolTip = Otvoriť okno záznamov
bbb.mainshell.resetLayoutBtn.toolTip = Resetovať rozmiestnenie
bbb.oldlocalewindow.reminder1 = Je možné že máte starý preklad BigBlueButton-u.
@ -33,6 +33,8 @@ bbb.viewers.raiseHandBtn.toolTip = Kliknite pre Zdvihnutie ruky.
bbb.viewers.presentBtn.label = Vymeniť Moderátora.
bbb.viewers.kickUserBtn.toolTip = Vyhodiť užívateľa
bbb.presentation.title = Prezentácia
bbb.presentation.fitToWidth.toolTip =
bbb.presentation.fitToPage.toolTip =
bbb.presentation.uploadPresBtn = Nahrať dokument pre prezetáciu.
bbb.presentation.uploadPresBtn.toolTip = Tu môžete nahrať dokument, ktorý chcete pripojiť ku prezentácii.
bbb.presentation.backBtn.toolTip = Predchádzajúca roleta.

View File

@ -1,9 +1,9 @@
bbb.pageTitle = BigBlueButton
bbb.mainshell.locale.version = 0.8-beta2
bbb.mainshell.locale.version = 0.8-beta4
bbb.mainshell.statusProgress.connecting = Povezujem se s strežnikom
bbb.mainshell.statusProgress.loading = Nalaganje {0} modulov
bbb.mainshell.statusProgress.cannotConnectServer = Oprostite, ne moremo se povezati s strežnikom.
bbb.mainshell.copyrightLabel2 = (c) 2011, BigBlueButton različica {0} - Za več informacij obiščite http://www.bigbluebutton.org/.
bbb.mainshell.copyrightLabel2 = (c) 2012, BigBlueButton različica {0} - Za več informacij obiščite http://www.bigbluebutton.org/.
bbb.mainshell.logBtn.toolTip = Odpri beležno okno
bbb.mainshell.resetLayoutBtn.toolTip = Ponastavite razporeditev
bbb.oldlocalewindow.reminder1 = Mogoče imate stare prevode BigBlueButton-a.
@ -33,6 +33,8 @@ bbb.viewers.raiseHandBtn.toolTip = Kliknite za dvig roke.
bbb.viewers.presentBtn.label = Zamenjajte moderatorja
bbb.viewers.kickUserBtn.toolTip = Kick User
bbb.presentation.title = Predstavitev
bbb.presentation.fitToWidth.toolTip =
bbb.presentation.fitToPage.toolTip =
bbb.presentation.uploadPresBtn = Naložite dokument za predstavitev.
bbb.presentation.uploadPresBtn.toolTip = Naložite dokument za predstavitev.
bbb.presentation.backBtn.toolTip = Prejšnji diapozitiv.

View File

@ -1,9 +1,9 @@
bbb.pageTitle = BigBlueButton
bbb.mainshell.locale.version = 0.8-beta2
bbb.mainshell.locale.version = 0.8-beta4
bbb.mainshell.statusProgress.connecting = Povezuje se sa serverom
bbb.mainshell.statusProgress.loading = Podiže {0} modula
bbb.mainshell.statusProgress.cannotConnectServer = Nažalost nije moguće uspostaviti vezu sa serverom.
bbb.mainshell.copyrightLabel2 = (c) 2011, CallPal by BigBlueButton - For more information see http://www.bigbluebutton.org/.
bbb.mainshell.copyrightLabel2 = (c) 2012, BigBlueButton - For more information see http://www.bigbluebutton.org/.
bbb.mainshell.logBtn.toolTip = Otvori log prozor
bbb.mainshell.resetLayoutBtn.toolTip = Resetuj izgled
bbb.oldlocalewindow.reminder1 = Moguće imate staru verziju prevoda.
@ -33,6 +33,8 @@ bbb.viewers.raiseHandBtn.toolTip = Klikni da dignete ruku.
bbb.viewers.presentBtn.label = Promeni prezentatora
bbb.viewers.kickUserBtn.toolTip = Izbaci korisnika
bbb.presentation.title = Prezentacija
bbb.presentation.fitToWidth.toolTip =
bbb.presentation.fitToPage.toolTip =
bbb.presentation.uploadPresBtn = Prebaci dokument za prezentaciju.
bbb.presentation.uploadPresBtn.toolTip = Prebaci dokument za prezentaciju.
bbb.presentation.backBtn.toolTip = Prethodni slajd.

View File

@ -1,9 +1,9 @@
bbb.pageTitle = BigBlueButton
bbb.mainshell.locale.version = 0.8-beta2
bbb.mainshell.locale.version = 0.8-beta4
bbb.mainshell.statusProgress.connecting = Успостављање везу са сервером
bbb.mainshell.statusProgress.loading = Покреће {0} компонената
bbb.mainshell.statusProgress.cannotConnectServer = Извините, не можемо да успоставимо везу са сервером
bbb.mainshell.copyrightLabel2 = (c) 2011, BigBlueButton верзија {0} - за више информација погледајте http://www.bigbluebutton.org/.
bbb.mainshell.copyrightLabel2 = (c) 2012, BigBlueButton верзија {0} - за више информација погледајте http://www.bigbluebutton.org/.
bbb.mainshell.logBtn.toolTip = Отвори лог прозор
bbb.mainshell.resetLayoutBtn.toolTip = Ресетуј распоред
bbb.oldlocalewindow.reminder1 = Могуће је да имате стари превод BigBlueButton-а.
@ -33,6 +33,8 @@ bbb.viewers.raiseHandBtn.toolTip = Притисни да подигнеш рук
bbb.viewers.presentBtn.label = Промените предавача
bbb.viewers.kickUserBtn.toolTip = Избаците учесника
bbb.presentation.title = Презентација
bbb.presentation.fitToWidth.toolTip =
bbb.presentation.fitToPage.toolTip =
bbb.presentation.uploadPresBtn = Пребаци документ за презентацију.
bbb.presentation.uploadPresBtn.toolTip = Пребаци документ за презентацију.
bbb.presentation.backBtn.toolTip = Претходни слајд

View File

@ -1,9 +1,9 @@
bbb.pageTitle = BigBlueButton
bbb.mainshell.locale.version = 0.8-beta2
bbb.mainshell.locale.version = 0.8-beta4
bbb.mainshell.statusProgress.connecting =
bbb.mainshell.statusProgress.loading = H
bbb.mainshell.statusProgress.cannotConnectServer = Tyv
bbb.mainshell.copyrightLabel2 = (c) 2010, BigBlueButton build {0} - bes
bbb.mainshell.copyrightLabel2 = (c) 2012, BigBlueButton build {0} - bes
bbb.mainshell.logBtn.toolTip =
bbb.mainshell.resetLayoutBtn.toolTip =
bbb.oldlocalewindow.reminder1 = Du kan ha en
@ -33,6 +33,8 @@ bbb.viewers.raiseHandBtn.toolTip = Klicka f
bbb.viewers.presentBtn.label = Byt presentat
bbb.viewers.kickUserBtn.toolTip = Klicka f
bbb.presentation.title = Presentation
bbb.presentation.fitToWidth.toolTip =
bbb.presentation.fitToPage.toolTip =
bbb.presentation.uploadPresBtn = Ladda upp ett dokument f
bbb.presentation.uploadPresBtn.toolTip = Ladda upp ett dokument f
bbb.presentation.backBtn.toolTip = F

View File

@ -1,9 +1,9 @@
bbb.pageTitle = BigBlueButton
bbb.mainshell.locale.version = 0.8-beta2
bbb.mainshell.locale.version = 0.8-beta4
bbb.mainshell.statusProgress.connecting = กำลังเชื่อมต่อเครื่องแม่ข่าย
bbb.mainshell.statusProgress.loading = กำลังโหลด {0} โมดูล
bbb.mainshell.statusProgress.cannotConnectServer = ขออภัยเราไม่สามารถติดต่อเครื่องแม่ข่ายได้ในขณะนี้
bbb.mainshell.copyrightLabel2 = (c) 2011, BigBlueButton build {0} - ข้อมูลเพิ่มเติมไปที่ http://www.bigbluebutton.org
bbb.mainshell.copyrightLabel2 = (c) 2012, BigBlueButton build {0} - ข้อมูลเพิ่มเติมไปที่ http://www.bigbluebutton.org
bbb.mainshell.logBtn.toolTip = เปิดการทำงาน
bbb.mainshell.resetLayoutBtn.toolTip = จัดตั้งเค้าโครงใหม่
bbb.oldlocalewindow.reminder1 = คุณอาจจะมีการแปลภาษาเก่าของ BigBlueButton
@ -33,6 +33,8 @@ bbb.viewers.raiseHandBtn.toolTip = คลิกเพื่อยกมือ
bbb.viewers.presentBtn.label = เปลื่ยนผู้นำเสนอ
bbb.viewers.kickUserBtn.toolTip = กำจัดผู้ใช้งาน
bbb.presentation.title = การนำเสนอ
bbb.presentation.fitToWidth.toolTip =
bbb.presentation.fitToPage.toolTip =
bbb.presentation.uploadPresBtn = อัปโหลดเอกสารเพื่อการนำเสนอ
bbb.presentation.uploadPresBtn.toolTip = อัปโหลดเอกสารเพื่อการนำเสนอ
bbb.presentation.backBtn.toolTip = ภาพสไลด์ก่อนหน้านี้

View File

@ -1,9 +1,9 @@
bbb.pageTitle = BigBlueButton
bbb.mainshell.locale.version = 0.8-beta2
bbb.mainshell.locale.version = 0.8-beta4
bbb.mainshell.statusProgress.connecting = Sunucuya bağlanıyor
bbb.mainshell.statusProgress.loading = {0} bileşen yükleniyor
bbb.mainshell.statusProgress.cannotConnectServer = Üzgünüz, sunucuya bağlanamıyoruz.
bbb.mainshell.copyrightLabel2 = (c) 2011, BigBlueButton sürüm {0} -- Daha fazla bilgi için http://www.bigbluebutton.org/.
bbb.mainshell.copyrightLabel2 = (c) 2012, BigBlueButton sürüm {0} -- Daha fazla bilgi için http://www.bigbluebutton.org/.
bbb.mainshell.logBtn.toolTip = Sistem Kayıtlarını
bbb.mainshell.resetLayoutBtn.toolTip = Yerleşimi sıfırla
bbb.oldlocalewindow.reminder1 = BigBlueButton dil çeviriniz eski olabilir.
@ -33,6 +33,8 @@ bbb.viewers.raiseHandBtn.toolTip = El kaldırmak için tıklayın.
bbb.viewers.presentBtn.label = Konuşmacıyı Değiştir
bbb.viewers.kickUserBtn.toolTip = Kullanıcıyı At
bbb.presentation.title = Sunum
bbb.presentation.fitToWidth.toolTip =
bbb.presentation.fitToPage.toolTip =
bbb.presentation.uploadPresBtn = Sunum için bir doküman yükleyin.
bbb.presentation.uploadPresBtn.toolTip = Sunum için bir doküman yükleyin.
bbb.presentation.backBtn.toolTip = Önceki slayt.
@ -88,10 +90,10 @@ bbb.chat.privateChatSelect = Özel görüşme yapacağınız kişiyi seçin
bbb.chat.chatOptions = Sohbet Seçenekleri
bbb.chat.fontSize = Font Büyüklüğü
bbb.listeners.title = Dinleyicler{0} {1}
bbb.listeners.pushToTalk.toolTip =
bbb.listeners.pushToMute.toolTip =
bbb.listeners.talk =
bbb.listeners.mute =
bbb.listeners.pushToTalk.toolTip = Konuşmak için tıklayın
bbb.listeners.pushToMute.toolTip = Kendinizi sessiz yapmak için tıklayın
bbb.listeners.talk = Konuşun
bbb.listeners.mute = Sessiz yap
bbb.listeners.muteAllBtn.toolTip = Tümünü sessiz yap.
bbb.listeners.unmuteAllBtn.toolTip = Tümünü sesli yap.
bbb.listeners.ejectTooltip = Kullanıcıyı At
@ -106,14 +108,14 @@ bbb.video.publish.close.label = Kapat
bbb.video.keepAspectBtn.tooltip = Pencere boyutunu koru
bbb.video.fitVideoBtn.tooltip = Video'yu sığdır
bbb.video.originalSizeBtn.tooltip = Orjinal boyut
bbb.video.publish.hint.noCamera =
bbb.video.publish.hint.cantOpenCamera =
bbb.video.publish.hint.waitingApproval =
bbb.video.publish.hint.videoPreview =
bbb.video.publish.hint.openingCamera =
bbb.video.publish.hint.cameraDenied =
bbb.video.publish.hint.cameraIsBeingUsed =
bbb.video.publish.hint.publishing =
bbb.video.publish.hint.noCamera = Kamera bulunamadı
bbb.video.publish.hint.cantOpenCamera = Kameranız başlatılamıyor
bbb.video.publish.hint.waitingApproval = Onay bekleniyor
bbb.video.publish.hint.videoPreview = Video önizleme
bbb.video.publish.hint.openingCamera = Kamera başlatılıyor
bbb.video.publish.hint.cameraDenied = Kamera erişimi reddedildi
bbb.video.publish.hint.cameraIsBeingUsed = Kameranız başka bir uygulama tarafından kullanılıyor
bbb.video.publish.hint.publishing = Yayınlanıyor
bbb.desktopPublish.title = Masaüstü Paylaşımı: Konuşmacı Önizlemesi
bbb.desktopPublish.fullscreen.tooltip = Ekranınızın tamamını paylaşın
bbb.desktopPublish.fullscreen.label = Tam Ekran

View File

@ -1,9 +1,9 @@
bbb.pageTitle = Конференції BigBlueButton
bbb.mainshell.locale.version = 0.8-beta2
bbb.mainshell.locale.version = 0.8-beta4
bbb.mainshell.statusProgress.connecting = Під'єднуюсь до сервера
bbb.mainshell.statusProgress.loading = Завантажується {0} модулів
bbb.mainshell.statusProgress.cannotConnectServer = Співчуваємо, ми не змогли з'єднатися з сервером.
bbb.mainshell.copyrightLabel2 = © 2011, BigBlueButton версія {0}, додаткова інформація на сайті: http://www.bigbluebutton.org/.
bbb.mainshell.copyrightLabel2 = © 2012, BigBlueButton версія {0}, додаткова інформація на сайті: http://www.bigbluebutton.org/.
bbb.mainshell.logBtn.toolTip = Відкрити вікно журналу
bbb.mainshell.resetLayoutBtn.toolTip = Скинути розташування вікон
bbb.oldlocalewindow.reminder1 = Можливо, що у вас застаріла версія перекладу BigBlueButton.
@ -13,7 +13,7 @@ bbb.micSettings.playSound = Відтворити тестовий звук
bbb.micSettings.hearFromHeadset = Ви маєте чути звук з гарнітури, а не з динаміків комп'ютера.
bbb.micSettings.speakIntoMic = Коли ви говорите у мікрофон, то повинні побачити, як рухаються поділки.
bbb.micSettings.changeMic = Змінити мікрофон
bbb.micSettings.join = Реєстрація в аудіо трансляції
bbb.micSettings.join = Приєднатися до аудіо конференції
bbb.micSettings.cancel = Скасувати
bbb.mainToolbar.helpBtn = Допомога
bbb.mainToolbar.logoutBtn = Вийти
@ -25,14 +25,16 @@ bbb.viewers.viewersGrid.nameItemRenderer = Ім'я
bbb.viewers.viewersGrid.nameItemRenderer.nameLabel.toolTip = Ви увійшли під цим іменем.
bbb.viewers.viewersGrid.roleItemRenderer = Роль
bbb.viewers.viewersGrid.statusItemRenderer = Статус
bbb.viewers.viewersGrid.statusItemRenderer.raiseHand.toolTip = {0} просить надати слово.
bbb.viewers.viewersGrid.statusItemRenderer.raiseHand.toolTip = Рука піднята в {0}
bbb.viewers.viewersGrid.statusItemRenderer.streamIcon.toolTip = Клацніть для перегляду
bbb.viewers.viewersGrid.statusItemRenderer.presIcon.toolTip = Ведучий
bbb.viewers.presentBtn.toolTip = Призначити учасника ведучим.
bbb.viewers.raiseHandBtn.toolTip = Просити надати слово
bbb.viewers.raiseHandBtn.toolTip = Просити надати слово.
bbb.viewers.presentBtn.label = Перемкнути ведучого
bbb.viewers.kickUserBtn.toolTip = Видалити з конференції
bbb.presentation.title = Презентація
bbb.presentation.fitToWidth.toolTip =
bbb.presentation.fitToPage.toolTip =
bbb.presentation.uploadPresBtn = Завантажити документ для показу.
bbb.presentation.uploadPresBtn.toolTip = Завантажити документ для показу.
bbb.presentation.backBtn.toolTip = Попередній слайд.
@ -96,7 +98,7 @@ bbb.listeners.muteAllBtn.toolTip = Вимкнути всі мікрофони
bbb.listeners.unmuteAllBtn.toolTip = Увімкнути всі мікрофони
bbb.listeners.ejectTooltip = Видалити учасника
bbb.listenerItem.nameLbl.toolTip = Виберіть цього учасника і клацніть, щоби вимкнути або увімкнути його мікрофон.
bbb.listenerItem.talkImg.toolTip = Розмова
bbb.listenerItem.talkImg.toolTip = Розмовляє
bbb.listenerItem.lockImg.toolTip = Клацніть, щоби залишити вимкненим або увімкненим
bbb.listenerItem.muteUnmute.toolTip = Вимкнути/увімкнути мікрофон
bbb.publishVideo.title = Розпочати відеотрансляцію
@ -164,6 +166,6 @@ bbb.settings.warning.label = Попередження
bbb.settings.warning.close = Закрити це попередження
bbb.settings.noissues = Невирішених питань не виявлено.
bbb.settings.instructions = Прийняти Flash-запит про надання дозволу веб-камері. Якщо ви бачите і чуєте себе, то це означає, що ваш браузер був правильно налаштований. Інші варіанти наведені нижче. Пошукайте там можливі рішення.
bbb.videodock.title = Відео Док
bbb.videodock.title = Відеотрансляції
bbb.zzzzz.yyyy =
=

View File

@ -1,9 +1,9 @@
bbb.pageTitle = Đào tạo từ xa
bbb.mainshell.locale.version = 0.8-beta2
bbb.mainshell.locale.version = 0.8-beta4
bbb.mainshell.statusProgress.connecting = Kết nối tới máy chủ
bbb.mainshell.statusProgress.loading = Đang nạp {0} mô đun
bbb.mainshell.statusProgress.cannotConnectServer = Xin lỗi, không thể kết nối tới máy chủ.
bbb.mainshell.copyrightLabel2 = (c) 2011, BigBlueButton phiên bản {0} - Thông tin chi tiết xem tại http://www.bigbluebutton.org/.
bbb.mainshell.copyrightLabel2 = (c) 2012, BigBlueButton phiên bản {0} - Thông tin chi tiết xem tại http://www.bigbluebutton.org/.
bbb.mainshell.logBtn.toolTip = Mở cửa sổ Nhật ký
bbb.mainshell.resetLayoutBtn.toolTip = Đặt lại Bố cục
bbb.oldlocalewindow.reminder1 = Có thể bạn đang dùng bản dịch cũ của BigBlueButton.
@ -33,6 +33,8 @@ bbb.viewers.raiseHandBtn.toolTip = Nhấn để xin phát biểu.
bbb.viewers.presentBtn.label = Chuyển người Trình bày
bbb.viewers.kickUserBtn.toolTip = Nhấn để mời ra ngoài.
bbb.presentation.title = Trình bày
bbb.presentation.fitToWidth.toolTip =
bbb.presentation.fitToPage.toolTip =
bbb.presentation.uploadPresBtn = Tải lên một tệp tài liệu để trình diễn.
bbb.presentation.uploadPresBtn.toolTip = Tải lên một tệp tài liệu để trình diễn.
bbb.presentation.backBtn.toolTip = Trang trước.

View File

@ -1,9 +1,9 @@
bbb.pageTitle = BigBlueButton
bbb.mainshell.locale.version = 0.8-beta2
bbb.mainshell.locale.version = 0.8-beta4
bbb.mainshell.statusProgress.connecting = 正在连接到服务器
bbb.mainshell.statusProgress.loading = 载入 {0} 模块
bbb.mainshell.statusProgress.cannotConnectServer = 抱歉,无法连接到服务器.
bbb.mainshell.copyrightLabel2 = (c) 2010, BigBlueButton 版本 {0} - 请登陆官方网站查看详情 http://www.bigbluebutton.org/.
bbb.mainshell.copyrightLabel2 = (c) 2012, BigBlueButton 版本 {0} - 请登陆官方网站查看详情 http://www.bigbluebutton.org/.
bbb.mainshell.logBtn.toolTip = 打开日志
bbb.mainshell.resetLayoutBtn.toolTip = 重置布局
bbb.oldlocalewindow.reminder1 = 您可能正在使用旧版的BigBlueButton界面翻译.
@ -33,6 +33,8 @@ bbb.viewers.raiseHandBtn.toolTip = 举手
bbb.viewers.presentBtn.label = 切换演讲人
bbb.viewers.kickUserBtn.toolTip = 踢出用户
bbb.presentation.title = 幻灯片演示
bbb.presentation.fitToWidth.toolTip =
bbb.presentation.fitToPage.toolTip =
bbb.presentation.uploadPresBtn = 上传演示文件
bbb.presentation.uploadPresBtn.toolTip = 上传演示文件
bbb.presentation.backBtn.toolTip = 上一页

View File

@ -1,9 +1,9 @@
bbb.pageTitle = BigBlueButton
bbb.mainshell.locale.version = 0.8-beta2
bbb.mainshell.locale.version = 0.8-beta4
bbb.mainshell.statusProgress.connecting = 正在連接到伺服器
bbb.mainshell.statusProgress.loading = 載入 {0} 模組
bbb.mainshell.statusProgress.cannotConnectServer = 抱歉,無法連接到伺服器.
bbb.mainshell.copyrightLabel2 = (c) 2010, BigBlueButton 版本 {0} - 請登入官方網站查看詳細資料 http://www.bigbluebutton.org/.
bbb.mainshell.copyrightLabel2 = (c) 2012, BigBlueButton 版本 {0} - 請登入官方網站查看詳細資料 http://www.bigbluebutton.org/.
bbb.mainshell.logBtn.toolTip = 打開日誌
bbb.mainshell.resetLayoutBtn.toolTip = 重新設定版面
bbb.oldlocalewindow.reminder1 = 您可能正在使用舊版的BigBlueButton語言翻譯.
@ -33,6 +33,8 @@ bbb.viewers.raiseHandBtn.toolTip = 舉手
bbb.viewers.presentBtn.label = 切换主講者
bbb.viewers.kickUserBtn.toolTip = 踢出用户
bbb.presentation.title = 投影片演示
bbb.presentation.fitToWidth.toolTip =
bbb.presentation.fitToPage.toolTip =
bbb.presentation.uploadPresBtn = 上傳投影片檔案
bbb.presentation.uploadPresBtn.toolTip = 上傳投影片檔案
bbb.presentation.backBtn.toolTip = 上一頁

View File

@ -1,6 +1,6 @@
<?xml version="1.0" ?>
<config>
<localeversion suppressWarning="false">0.8-beta2</localeversion>
<localeversion suppressWarning="false">0.8-beta4</localeversion>
<version>VERSION</version>
<help url="http://HOST/help.html"/>
<porttest host="HOST" application="video"/>
@ -51,23 +51,23 @@
<module name="VideoconfModule" url="VideoconfModule.swf?v=VERSION"
uri="rtmp://HOST/video"
dependsOn="ViewersModule"
videoQuality="70"
presenterShareOnly="false"
resolutions="320x240,640x480,1280x720"
autoStart="false"
showButton="true"
showCloseButton="true"
publishWindowVisible="true"
viewerWindowMaxed="false"
viewerWindowLocation="top"
camKeyFrameInterval="5"
camModeFps="15"
camQualityBandwidth="0"
camQualityPicture="50"
enableH264="false"
h264Level="2.1"
h264Profile="main"
dependson = "ViewersModule"
videoQuality = "100"
presenterShareOnly = "false"
resolutions = "320x240,640x480,1280x720"
autoStart = "false"
showButton = "true"
showCloseButton = "true"
publishWindowVisible = "true"
viewerWindowMaxed = "false"
viewerWindowLocation = "top"
camKeyFrameInterval = "30"
camModeFps = "10"
camQualityBandwidth = "0"
camQualityPicture = "90"
enableH264 = "false"
h264Level = "2.1"
h264Profile = "main"
/>
<module name="WhiteboardModule" url="WhiteboardModule.swf?v=VERSION"

View File

@ -30,8 +30,8 @@ package org.bigbluebutton.common
function removeRawChild(child:DisplayObject):void;
function doesContain(child:DisplayObject):Boolean;
function acceptOverlayCanvas(overlay:IBbbCanvas):void;
function moveCanvas(x:int, y:int):void;
function zoomCanvas(width:int, height:int):void;
function moveCanvas(x:Number, y:Number):void;
function zoomCanvas(width:Number, height:Number):void;
function showCanvas(show:Boolean):void;
}
}

View File

@ -21,6 +21,12 @@ package org.bigbluebutton.common
[Bindable]
public class Images
{
[Embed(source="assets/images/fit-to-page.png")]
public var fitToPage:Class;
[Embed(source="assets/images/fit-to-width.png")]
public var fitToWidth:Class;
[Embed(source="assets/images/green-circle.png")]
public var greenCircle:Class;

Binary file not shown.

After

Width:  |  Height:  |  Size: 440 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 485 B

View File

@ -97,7 +97,7 @@
*/
if (!scrollBarWorkaround) {
scrollBarWorkaround = true;
var blankStr:String = " \n";
var blankStr:String = " ";
var shimMsg:ChatMessage = new ChatMessage();
shimMsg.lastSenderId = blankStr;
shimMsg.senderId = blankStr;
@ -111,15 +111,17 @@
shimMsg.translatedColor = 0xCECECE;
shimMsg.senderTime = blankStr;
shimMsg.time = blankStr;
shimMsg.lastTime = blankStr;
shimMsg.lastTime = blankStr + "\n";
// Add to blank lines to force the last message to be displayed.
messages.addItem(shimMsg);
messages.addItem(shimMsg);
}
/**
* Add the REAL message before the shim message above.
*/
messages.addItemAt(msg, messages.length - 1);
messages.addItemAt(msg, messages.length - 2);
/**
* Trigger to force the scrollbar to show the last message.
@ -136,7 +138,6 @@
chatMessagesList.invalidateSize();
chatMessagesList.invalidateDisplayList();
chatMessagesList.scrollToIndex(messages.length);
chatMessagesList.verticalScrollPosition = chatMessagesList.maxVerticalScrollPosition;
chatMessagesList.validateDisplayList();
chatMessagesList.validateNow();
}

View File

@ -18,15 +18,12 @@
*/
package org.bigbluebutton.modules.present.business {
import com.asfusion.mate.events.Dispatcher;
import flash.events.AsyncErrorEvent;
import flash.events.NetStatusEvent;
import flash.events.SyncEvent;
import flash.net.NetConnection;
import flash.net.Responder;
import flash.net.SharedObject;
import mx.controls.Alert;
import org.bigbluebutton.common.LogUtil;
import org.bigbluebutton.core.managers.UserManager;
import org.bigbluebutton.main.events.BBBEvent;
@ -101,13 +98,13 @@ package org.bigbluebutton.modules.present.business {
private function join() : void {
_presentationSO = SharedObject.getRemote(SHAREDOBJECT, url, false);
_presentationSO.client = this;
_presentationSO.addEventListener(SyncEvent.SYNC, syncHandler);
_presentationSO.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler);
_presentationSO.addEventListener(AsyncErrorEvent.ASYNC_ERROR, asyncErrorHandler);
_presentationSO.client = this;
_presentationSO.connect(nc);
LogUtil.debug(NAME + ": PresentationModule is connected to Shared object");
notifyConnectionStatusListener(true);
getPresentationInfo();
}
private function leave():void {
@ -219,6 +216,11 @@ package org.bigbluebutton.modules.present.business {
widthRatio,
heightRatio
); //_netConnection.call
presenterViewedRegionX = xOffset;
presenterViewedRegionY = yOffset;
presenterViewedRegionW = widthRatio;
presenterViewedRegionH = heightRatio;
}
/**
@ -236,6 +238,42 @@ package org.bigbluebutton.modules.present.business {
dispatcher.dispatchEvent(e);
}
/***
* A hack for the viewer to sync with the presenter. Have the viewer query the presenter for it's x,y,width and height info.
*/
private var presenterViewedRegionX:Number = 0;
private var presenterViewedRegionY:Number = 0;
private var presenterViewedRegionW:Number = 100;
private var presenterViewedRegionH:Number = 100;
private function queryPresenterForSlideInfo():void {
LogUtil.debug("Query for slide info");
_presentationSO.send("whatIsTheSlideInfo", UserManager.getInstance().getConference().getMyUserId());
}
public function whatIsTheSlideInfo(userid:Number):void {
LogUtil.debug("Rx Query for slide info");
if (UserManager.getInstance().getConference().amIPresenter()) {
LogUtil.debug("User Query for slide info");
_presentationSO.send("whatIsTheSlideInfoReply", userid, presenterViewedRegionX, presenterViewedRegionY, presenterViewedRegionW, presenterViewedRegionH);
}
}
public function whatIsTheSlideInfoReply(userId:Number, xOffset:Number, yOffset:Number, widthRatio:Number, heightRatio:Number):void{
LogUtil.debug("Rx whatIsTheSlideInfoReply");
if (UserManager.getInstance().getConference().amIThisUser(userId)) {
LogUtil.debug("Got reply for Query for slide info");
var e:MoveEvent = new MoveEvent(MoveEvent.CUR_SLIDE_SETTING);
e.xOffset = xOffset;
e.yOffset = yOffset;
e.slideToCanvasWidthRatio = widthRatio;
e.slideToCanvasHeightRatio = heightRatio;
dispatcher.dispatchEvent(e);
}
}
/**
* Sends an event out for the clients to maximize the presentation module
*
@ -312,20 +350,14 @@ package org.bigbluebutton.modules.present.business {
dispatcher.dispatchEvent(new MadePresenterEvent(MadePresenterEvent.SWITCH_TO_VIEWER_MODE));
}
if (result.presentation.sharing) {
currentSlide = Number(result.presentation.slide);
LogUtil.debug("The presenter has shared slides and showing slide " + currentSlide);
var shareEvent:UploadEvent = new UploadEvent(UploadEvent.PRESENTATION_READY);
shareEvent.presentationName = String(result.presentation.currentPresentation);
dispatcher.dispatchEvent(shareEvent);
}
if (result.presentation.xOffset) {
LogUtil.debug("Sending presenters slide settings");
var e:MoveEvent = new MoveEvent(MoveEvent.MOVE);
e.xOffset = result.presentation.xOffset;
e.yOffset = result.presentation.yOffset;
e.slideToCanvasWidthRatio = result.presentation.widthRatio;
e.slideToCanvasHeightRatio = result.presentation.heightRatio;
var e:MoveEvent = new MoveEvent(MoveEvent.CUR_SLIDE_SETTING);
e.xOffset = Number(result.presentation.xOffset);
e.yOffset = Number(result.presentation.yOffset);
e.slideToCanvasWidthRatio = Number(result.presentation.widthRatio);
e.slideToCanvasHeightRatio = Number(result.presentation.heightRatio);
LogUtil.debug("****presenter settings [" + e.xOffset + "," + e.yOffset + "," + e.slideToCanvasWidthRatio + "," + e.slideToCanvasHeightRatio + "]");
dispatcher.dispatchEvent(e);
}
if (result.presentations) {
@ -338,6 +370,14 @@ package org.bigbluebutton.modules.present.business {
// Force switching the presenter.
triggerSwitchPresenter();
if (result.presentation.sharing) {
currentSlide = Number(result.presentation.slide);
LogUtil.debug("The presenter has shared slides and showing slide " + currentSlide);
var shareEvent:UploadEvent = new UploadEvent(UploadEvent.PRESENTATION_READY);
shareEvent.presentationName = String(result.presentation.currentPresentation);
dispatcher.dispatchEvent(shareEvent);
}
},
// status - On error occurred
function(status:Object):void {
@ -559,12 +599,22 @@ package org.bigbluebutton.modules.present.business {
}
}
private function syncHandler(event:SyncEvent):void {
// var statusCode:String = event.info.code;
LogUtil.debug("!!!!! Presentation sync handler - " + event.changeList.length );
notifyConnectionStatusListener(true);
getPresentationInfo();
queryPresenterForSlideInfo();
}
private function netStatusHandler (event:NetStatusEvent):void {
var statusCode:String = event.info.code;
LogUtil.debug("!!!!! Presentation status handler - " + event.info.code );
switch (statusCode) {
case "NetConnection.Connect.Success":
LogUtil.debug(NAME + ":Connection Success");
notifyConnectionStatusListener(true);
getPresentationInfo();
break;
case "NetConnection.Connect.Failed":
addError("PresentSO connection failed");

View File

@ -23,8 +23,8 @@ package org.bigbluebutton.modules.present.events
public class DisplaySlideEvent extends Event
{
public static const DISPLAY_SLIDE_EVENT:String = "DISPLAY_SLIDE_EVENT";
public var slideWidth:int = 0;
public var slideHeight:int = 0;
public var slideWidth:Number = 0;
public var slideHeight:Number = 0;
public function DisplaySlideEvent(type:String, bubbles:Boolean=true, cancelable:Boolean=true)
{

View File

@ -22,7 +22,8 @@ package org.bigbluebutton.modules.present.events
public class MoveEvent extends Event
{
public static const MOVE:String = "MOVE";
public static const MOVE:String = "MOVE_SLIDE";
public static const CUR_SLIDE_SETTING:String = "CUR_SLIDE_SETTING";
public var xOffset:Number;
public var yOffset:Number;

View File

@ -18,6 +18,7 @@
*/
package org.bigbluebutton.modules.present.events
{
import org.bigbluebutton.modules.present.managers.Slide;
import flash.events.Event;
import flash.utils.ByteArray;
@ -28,6 +29,7 @@ package org.bigbluebutton.modules.present.events
public var slideNumber:Number;
public var slide:ByteArray;
public var page:Slide;
public function SlideEvent(type:String)
{

View File

@ -23,11 +23,12 @@ package org.bigbluebutton.modules.present.events
public class WindowResizedEvent extends Event
{
public static const PRESENTATION_WINDOW_RESIZED_EVENT:String = "PRESENTATION_WINDOW_RESIZED_EVENT";
public var width:int = 450;
public var height:int = 450;
public var width:Number = 450;
public var height:Number = 450;
public var fitToPage:Boolean = true;
public var old_width:int = 450;
public var old_height:int = 450;
public var old_width:Number = 450;
public var old_height:Number = 450;
public function WindowResizedEvent(type:String, bubbles:Boolean=true, cancelable:Boolean=true)
{

View File

@ -45,8 +45,7 @@ package org.bigbluebutton.modules.present.managers
//format: presentationNames = [{label:"00"}, {label:"11"}, {label:"22"} ];
[Bindable] public var presentationNames:Array = new Array();
public function PresentManager()
{
public function PresentManager() {
globalDispatcher = new Dispatcher();
}

View File

@ -23,6 +23,9 @@ package org.bigbluebutton.modules.present.managers
import flash.net.URLLoaderDataFormat;
import flash.net.URLRequest;
import org.bigbluebutton.common.LogUtil;
[Bindable]
public class Slide
{
private var _loader:URLLoader;
@ -32,6 +35,8 @@ package org.bigbluebutton.modules.present.managers
private var _slideNum:Number;
private var _thumbUri:String;
public function Slide(slideNum:Number, slideUri:String, thumbUri:String)
{
_slideNum = slideNum;
@ -66,5 +71,6 @@ package org.bigbluebutton.modules.present.managers
return _slideNum;
}
}
}

View File

@ -51,6 +51,7 @@ package org.bigbluebutton.modules.present.managers
var e:SlideEvent = new SlideEvent(SlideEvent.SLIDE_LOADED);
e.slide = slide;
e.slideNumber = slideNum;
e.page = slides[slideNum];
dispatcher.dispatchEvent(e);
}
}

View File

@ -52,8 +52,8 @@
</EventHandlers>
<EventHandlers type="{PresentModuleEvent.START_MODULE}" >
<MethodInvoker generator="{PresentProxy}" method="connect" arguments="{event}" />
<MethodInvoker generator="{PresentManager}" method="handleStartModuleEvent" arguments="{event}"/>
<MethodInvoker generator="{PresentProxy}" method="connect" arguments="{event}" />
</EventHandlers>
<EventHandlers type="{PresentModuleEvent.STOP_MODULE}" >

View File

@ -47,15 +47,12 @@
<![CDATA[
import org.bigbluebutton.common.LogUtil;
import com.asfusion.mate.events.Dispatcher;
import mx.collections.*;
import mx.events.FlexEvent;
import mx.events.ValidationResultEvent;
import mx.managers.PopUpManager;
import mx.utils.*;
import mx.validators.*;
import org.bigbluebutton.common.Images;
import org.bigbluebutton.modules.present.events.RemovePresentationEvent;
import org.bigbluebutton.modules.present.events.UploadEvent;
@ -180,7 +177,7 @@
progBarLbl.visible = true;
progressBar.visible = true;
okCancelBtn.visible = false;
okCancelBtn.visible = true;
selectBtn.enabled = false;
uploadBtn.enabled = false;
fileTxtInput.enabled = false;
@ -190,7 +187,6 @@
deleteBtn.visible = false;
showBtn.visible = false;
}
}
private function uploadProgressUpdate(e:UploadEvent):void{
@ -203,8 +199,8 @@
}
private function uploadComplete(e:UploadEvent):void{
progressLbl.text = ResourceUtil.getInstance().getString('bbb.presentation.uploadcomplete')
progressBar.label = ResourceUtil.getInstance().getString('bbb.presentation.uploadwindow.uploadsuccessful');
progressLbl.text = ResourceUtil.getInstance().getString('bbb.presentation.uploadcomplete');
progressBar.label = ResourceUtil.getInstance().getString('bbb.presentation.uploadcomplete');
progressBar.setProgress(0, 100);
progressBar.validateNow();
progressLbl.validateNow();
@ -221,7 +217,7 @@
}
private function handleOfficeDocumentConversionSuccess(e:UploadEvent):void {
progressLbl.text = ResourceUtil.getInstance().getString('bbb.presentation.document.converted')
progressLbl.text = ResourceUtil.getInstance().getString('bbb.presentation.document.converted');
progressBar.label = ResourceUtil.getInstance().getString('bbb.presentation.document.converted');
progressBar.setProgress(0, 100);
progressBar.validateNow();
@ -230,7 +226,7 @@
private function handleSupportedDocument(e:UploadEvent):void {
LogUtil.debug("handleSupportedDocument");
progressLbl.text = ResourceUtil.getInstance().getString('bbb.presentation.document.supported')
progressLbl.text = ResourceUtil.getInstance().getString('bbb.presentation.document.supported');
progressBar.label = ResourceUtil.getInstance().getString('bbb.presentation.document.supported');
progressBar.setProgress(0, 100);
progressBar.validateNow();
@ -323,7 +319,7 @@
enabled="false" icon="{bulletGoIcon}" x="466" y="9"/>
<mx:Label id="progBarLbl" text="{ResourceUtil.getInstance().getString('bbb.fileupload.progBarLbl')}" x="21" y="75" visible="false"/>
<mx:ProgressBar id="progressBar" mode="manual" label="" labelPlacement="center" width="460" y="75" x="87" visible="false"/>
<mx:ProgressBar id="progressBar" mode="manual" label="{ResourceUtil.getInstance().getString('bbb.fileupload.progBarLbl')}" labelPlacement="center" width="460" y="75" x="87" visible="false"/>
<mx:Label id="presentationNamesLb" text="{ResourceUtil.getInstance().getString('bbb.fileupload.presentationNamesLbl')}" x="50" y="40"/>
<mx:ComboBox id="presentationNamesCombobox" width="365" x="50" y="66" dataProvider="{presentationNamesAC}"/>

View File

@ -0,0 +1,18 @@
package org.bigbluebutton.modules.present.ui.views
{
public class PresentOptions
{
[Bindable]
public var showWindowControls:Boolean = true;
public function PresentOptions()
{
var vxml:XML = BBB.getConfigForModule("PresentationModule");
if (vxml != null) {
if (vxml.@showWindowControls != undefined) {
showWindowControls = (vxml.@showWindowControls.toString().toUpperCase() == "TRUE") ? true : false;
}
}
}
}
}

View File

@ -28,16 +28,17 @@
xmlns:containers="flexlib.containers.*"
xmlns:mate="http://mate.asfusion.com/"
paddingBottom="0" paddingTop="0" paddingLeft="0" paddingRight="0"
showCloseButton="false"
showCloseButton="false" layout="absolute"
verticalScrollPolicy="off"
horizontalScrollPolicy="off"
showControls="true"
showControls="true" resize="maximizeHandler()"
backgroundColor="#efefef"
implements="org.bigbluebutton.common.IBbbModuleWindow"
creationComplete="onCreationComplete()"
width="{DEFAULT_WINDOW_WIDTH}" height="{DEFAULT_WINDOW_HEIGHT}"
x="{DEFAULT_X_POSITION}" y="{DEFAULT_Y_POSITION}"
title="{currentPresentation}" keyUp="onKeyUp(event)"
resize="maximizeHandler()" xmlns:views="org.bigbluebutton.modules.present.ui.views.*">
xmlns:views="org.bigbluebutton.modules.present.ui.views.*">
<mate:Dispatcher id="globalDispatcher" />
<mate:Listener type="{MadePresenterEvent.SWITCH_TO_PRESENTER_MODE}" method="becomePresenter" />
@ -54,10 +55,8 @@
<mx:Script>
<![CDATA[
import flash.geom.Point;
import flexlib.containers.DockableToolBar;
import flexlib.mdi.events.MDIWindowEvent;
import mx.binding.utils.BindingUtils;
import mx.collections.ArrayCollection;
import mx.containers.TitleWindow;
@ -68,9 +67,9 @@
import mx.events.ResizeEvent;
import mx.managers.PopUpManager;
import mx.rpc.events.*;
import org.bigbluebutton.common.IBbbCanvas;
import org.bigbluebutton.common.Images;
import org.bigbluebutton.common.LogUtil;
import org.bigbluebutton.common.events.LocaleChangeEvent;
import org.bigbluebutton.main.events.MadePresenterEvent;
import org.bigbluebutton.main.views.MainCanvas;
@ -92,7 +91,6 @@
import org.bigbluebutton.util.i18n.ResourceUtil;
public static const TITLE:String = "Presentation";
// private var presenterName:String = "";
private static const NEXT_BUTTON:String = "Next";
private static const PREVIOUS_BUTTON:String = "Previous";
private static const GOTO_PAGE_BUTTON:String = "Go to Page..."
@ -103,26 +101,29 @@
[Bindable] private var forwardIcon:Class = images.forward;
[Bindable] private var backwardIcon:Class = images.backward;
[Bindable] private var magnifierIcon:Class = images.magnifier;
[Bindable] public var fitToWidthIcon:Class = images.magnifier;
[Bindable] public var fitToWidthIcon:Class = images.fitToWidth;
[Bindable] public var fitToPageIcon:Class = images.fitToPage;
[Bindable] private var thumbY:Number;
public var uploadWindow:FileUploadWindow = null;
private var slideManager:SlideManager = new SlideManager();
private var pageDialog:GotoPageDialog;
[Bindable] private var DEFAULT_X_POSITION:int = 237;
[Bindable] private var DEFAULT_Y_POSITION:int = 0;
[Bindable] private var DEFAULT_X_POSITION:Number = 237;
[Bindable] private var DEFAULT_Y_POSITION:Number = 0;
[Bindable] private var CONTROL_BAR_HEIGHT:int = 45;
private static const TOP_WINDOW_BORDER:int = 30;
private static const WIDTH_PADDING:int = 5;
[Bindable] private var CONTROL_BAR_HEIGHT:Number = 45;
private static const TOP_WINDOW_BORDER:Number = 30;
private static const WIDTH_PADDING:Number = 6;
[Bindable] private var DEFAULT_WINDOW_WIDTH:int = 510;
[Bindable] private var DEFAULT_WINDOW_HEIGHT:int = 451;
[Bindable] private var DEFAULT_WINDOW_WIDTH:Number = 510;
[Bindable] private var DEFAULT_WINDOW_HEIGHT:Number = 451;
[Bindable] private var viewportW:Number = 451;
[Bindable] private var viewportH:Number = 451;
// Init to the size of the window.
private var currentSlideWidth:int = DEFAULT_WINDOW_WIDTH;
private var currentSlideHeight:int = DEFAULT_WINDOW_HEIGHT;
private var currentSlideWidth:Number = DEFAULT_WINDOW_WIDTH;
private var currentSlideHeight:Number = DEFAULT_WINDOW_HEIGHT;
private var mouseDown:Boolean = false;
[Bindable] private var isPresenter:Boolean = false;
@ -132,33 +133,17 @@
private var externalButtons:ArrayCollection = new ArrayCollection();
private function maximizeHandler():void {
// LogUtil.debug("Max handler");
// When the window is maximized, we want to resize the slide maintaining the aspect ratio.
fitSlideToWindowMaintainingAspectRatio();
this.y = 0;
if (this.maximized) {
callLater(restore);
var timer:Timer = new Timer(500, 1);
timer.addEventListener(TimerEvent.TIMER, adjustPosition);
timer.start();
}
stage.focus = this; //Remove focus from the maximize button in case the user presses the space bar, the window doesn't get maximized again.
}
private function adjustPosition(t:TimerEvent):void{
if ((DEFAULT_X_POSITION + this.width) > this.parent.width) {
// Adjust presentation window so that it doesn't go over the side of the browser window
this.x = this.parent.width - this.width;
} else {
// Move window so that it won't overlap with Participant's window.
this.x = ((Capabilities.screenResolutionX / 20) * 3) + 10;
}
//Remove focus from the maximize button in case the user presses the space bar, the window doesn't get maximized again.
stage.focus = this;
}
private function onCreationComplete():void{
thumbY = this.height - 160;
addEventListener(MDIWindowEvent.RESIZE_END, onResizeEndEvent);
this.addEventListener(MDIWindowEvent.RESIZE_END, onResizeEndEvent);
slideView.addEventListener(ListEvent.ITEM_ROLL_OVER, onItemRollOver);
}
@ -167,58 +152,33 @@
}
private function onResizeEndEvent(event:MDIWindowEvent):void {
if (event.window == this) {
// LogUtil.debug("onResizeEndEvent");
fitSlideToWindowMaintainingAspectRatio();
}
}
[Bindable] private var fitToPage:Boolean = true;
private function fitSlideToWindowMaintainingAspectRatio():void {
if (this.minimized) return;
// Initialize to snap to take the width of the window as the size of the slide.
var slideWidth:int = this.width;
var slideHeight:int = this.height;
// If the height is smaller than the width, we use the height as the
// base to determine the size of the slide.
if (this.height < this.width) {
slideHeight = this.height - CONTROL_BAR_HEIGHT - TOP_WINDOW_BORDER;
slideWidth = ((currentSlideWidth * slideHeight)/currentSlideHeight);
} else {
slideWidth = this.width - WIDTH_PADDING;
slideHeight = ((currentSlideHeight * slideWidth)/currentSlideWidth);
}
this.width = slideWidth + WIDTH_PADDING;
this.height = slideHeight + CONTROL_BAR_HEIGHT + TOP_WINDOW_BORDER;
// Test if the height and width are bigger than it's parent. If so, resize
// to make it fit inside so that the controls will still be visible.
if (this.height > this.parent.height) {
this.height = this.parent.height;
slideHeight = this.height - CONTROL_BAR_HEIGHT - TOP_WINDOW_BORDER;
slideWidth = ((currentSlideWidth * slideHeight)/currentSlideHeight);
}
if (this.width > this.parent.width) {
this.width = this.parent.width;
slideWidth = this.width - WIDTH_PADDING;
slideHeight = ((currentSlideHeight * slideWidth)/currentSlideWidth);
}
sendWindowResizedEvent(slideWidth, slideHeight);
// Send the available space to display the slide.
sendWindowResizedEvent((this.width - WIDTH_PADDING), (this.height - CONTROL_BAR_HEIGHT - TOP_WINDOW_BORDER));
}
/*
* Notify the slide container telling it the available dimensions to display the slide.
*/
private function sendWindowResizedEvent(slideWidth:int, slideHeight:int):void {
private function sendWindowResizedEvent(parentWidth:Number, parentHeight:Number):void {
var dispatcher:Dispatcher = new Dispatcher();
var dispEvent:WindowResizedEvent = new WindowResizedEvent(WindowResizedEvent.PRESENTATION_WINDOW_RESIZED_EVENT);
dispEvent.width = slideWidth;
dispEvent.height = slideHeight;
dispEvent.width = parentWidth;
dispEvent.height = parentHeight;
dispEvent.fitToPage = fitToPage;
dispEvent.old_width = this.slideView.width;
dispEvent.old_height = this.slideView.height;
dispatcher.dispatchEvent(dispEvent);
slideView.onParentResized(parentWidth, parentHeight);
}
private function handleDisplaySlideEvent(event:DisplaySlideEvent):void {
@ -256,16 +216,8 @@
displaySlideNumber(slideView.selectedSlide + 1);
}
private function showThumbsXXX():void {
if (isPresenter){
//readjust the position of the thumbnails in case the window was resized
//Note: this is necessary because the MDIWindow does not let you listen to the resize() event!
thumbY = this.height - 150;
}
}
private function onSliderZoom():void {
dispatchResizeEvent(zoomSlider.value);
slideView.onZoomSlide(zoomSlider.value);
}
private function dispatchResizeEvent(newSize:int):void {
@ -276,7 +228,7 @@
private function onResetZoom():void {
zoomSlider.value = 100;
dispatchResizeEvent(zoomSlider.value);
slideView.onZoomSlide(zoomSlider.value);
}
private function handleSlideResizedEvent(e:SlideResizedEvent):void{
@ -304,22 +256,11 @@
if (presentationLoaded) {
displaySlideNumber(slideView.selectedSlide + 1);
displaySlideNavigationControls(isPresenter);
showUploadPresentationLabel(false);
} else {
if (isPresenter)
showUploadPresentationLabel(true);
else
showUploadPresentationLabel(false);
}
setPresentersName(presentersName);
notifyComponentsOfPresenterChange(isPresenter, presentersName);
}
private function setPresentersName(name:String):void {
// if (name != null) presenterName = name;
}
private function handlePresentationLoadedEvent(e:PresentationEvent):void {
if (e.presentationName == currentPresentation) return;
currentPresentation = e.presentationName;
@ -328,8 +269,6 @@
slideView.visible = true;
if (slideManager != null) slideManager.clear();
showUploadPresentationLabel(false);
displaySlideNumber(slideView.selectedSlide + 1);
if (isPresenter) {
displaySlideNavigationControls(true);
@ -338,16 +277,15 @@
dispatchEvent(new SlideEvent(SlideEvent.LOAD_CURRENT_SLIDE));
}
onResetZoom();
reinitWindowToDefaultSize();
//this.setFocus();
}
private function displaySlideNavigationControls(show:Boolean):void {
backButton.visible = show;
forwardButton.visible = show;
zoomSlider.visible = show;
btnResetZoom.visible = show;
btnSlideNum.visible = show;
btnFitToWidth.visible = show;
btnFitToPage.visible = show;
setButtonsVisibility(show);
}
@ -447,28 +385,9 @@
slideView.selectedSlide = 0;
btnSlideNum.label = "";
displaySlideNavigationControls(false);
showUploadPresentationLabel(false);
// Change the title of the window.
currentPresentation = ResourceUtil.getInstance().getString('bbb.presentation.title');
reinitWindowToDefaultSize();
}
private function reinitWindowToDefaultSize():void {
if ((this.width < DEFAULT_WINDOW_WIDTH) || (this.height < DEFAULT_WINDOW_HEIGHT)) {
currentSlideWidth = DEFAULT_WINDOW_WIDTH;
currentSlideHeight = DEFAULT_WINDOW_HEIGHT;
this.width = DEFAULT_WINDOW_WIDTH;
this.height = DEFAULT_WINDOW_HEIGHT;
}
}
private function showUploadPresentationLabel(show:Boolean):void {
if (!show) {
currentState = "";
} else {
currentState = "dispUploadPresLabel";
}
}
private function gotoPreviousSlide():void {
@ -492,8 +411,10 @@
}
private function addOverlayCanvas(e:AddOverlayCanvasEvent):void{
slideView.acceptOverlayCanvas(e.canvas);
LogUtil.debug("OVERLAYING WHITEBOARD CANVAS");
e.canvas.acceptOverlayCanvas(slideView);
slideView.acceptOverlayCanvas(e.canvas);
}
/**
@ -510,7 +431,7 @@
* Sets the visibility of buttons added throught the Presentation API
*/
private function setButtonsVisibility(visible:Boolean):void{
for (var i:int = 0; i<externalButtons.length; i++){
for (var i:int = 0; i < externalButtons.length; i++){
(externalButtons.getItemAt(i) as IPresentationButton).setButtonVisibility(visible);
}
}
@ -538,10 +459,6 @@
}
}
public function getSlideView():SlideView{
return this.slideView;
}
override protected function resourcesChanged():void{
super.resourcesChanged();
if ((slideView != null) && (!slideView.visible)) this.title = ResourceUtil.getInstance().getString('bbb.presentation.title');
@ -551,25 +468,20 @@
resourcesChanged();
}
private function onFitToPage(ftp:Boolean):void {
fitToPage = ftp;
slideView.switchToFitToPage(fitToPage);
fitSlideToWindowMaintainingAspectRatio();
}
]]>
</mx:Script>
<pres:states>
<!--http://stackoverflow.com/questions/369120/why-does-mxstates-have-trouble-being-resolved-to-a-component-implementation-->
<mx:State name="dispUploadPresLabel">
<mx:AddChild relativeTo="{spacer1}" position="before">
<mx:Label id="uploadPresentationLabel" visible="true" width="100%"
text="{ResourceUtil.getInstance().getString('bbb.presentation.clickToUpload')}"/>
</mx:AddChild>
</mx:State>
</pres:states>
<mx:Fade id="thumbFadeIn" alphaFrom="1" alphaTo="0" duration="100" />
<mx:Fade id="thumbFadeOut" alphaFrom="0" alphaTo="1" duration="100" />
<views:SlideView id="slideView" width="100%" height="100%" visible="false" mouseDown="mouseDown = true"
<views:SlideView id="slideView" width="100%" height="100%" visible="false" mouseDown="mouseDown = true" backgroundColor="#efefef"
mouseUp="mouseDown = false" verticalScrollPolicy="off" horizontalScrollPolicy="off" />
<mx:ApplicationControlBar id="presCtrlBar" width="100%" height="{CONTROL_BAR_HEIGHT}">
<mx:Button id="uploadPres" icon="{uploadIcon}" visible="false" width="20" height="20"
toolTip="{ResourceUtil.getInstance().getString('bbb.presentation.uploadPresBtn.toolTip')}"
@ -582,14 +494,17 @@
<mx:Button id="forwardButton" icon="{forwardIcon}" visible="false" width="30" height="20"
toolTip="{ResourceUtil.getInstance().getString('bbb.presentation.forwardBtn.toolTip')}" click="gotoNextSlide()"/>
<mx:Spacer width="10%" id="spacer2"/>
<mx:HSlider id="zoomSlider" visible="false"
minimum="100" maximum="400" value="100" dataTipPlacement="top" labels="['100%','400%']"
<mx:HSlider id="zoomSlider" visible="false" value="{slideView.zoomPercentage}"
minimum="100" maximum="400" dataTipPlacement="top" labels="['100%','400%']"
useHandCursor="true" snapInterval="5" allowTrackClick="true" liveDragging="true"
dataTipFormatFunction="removeDecimalFromDataTip" change="onSliderZoom()" width="100"/>
<mx:Spacer width="50%" id="spacer3"/>
<!--containers:Docker id="toolbarDocker" height="100%" width="250" visible="{isPresenter}" /-->
<mx:Button id="btnResetZoom" icon="{magnifierIcon}" visible="false" width="20" height="20"
toolTip="{ResourceUtil.getInstance().getString('bbb.presentation.resetZoomBtn.toolTip')}" click="onResetZoom()"/>
<mx:Button id="btnFitToWidth" icon="{fitToWidthIcon}" visible="false" width="20" height="20"
toolTip="{ResourceUtil.getInstance().getString('bbb.presentation.fitToWidth.toolTip')}"
click="onFitToPage(false)"/>
<mx:Button id="btnFitToPage" icon="{fitToPageIcon}" visible="false" width="20" height="20"
toolTip="{ResourceUtil.getInstance().getString('bbb.presentation.fitToPage.toolTip')}"
click="onFitToPage(true)"/>
<mx:Spacer width="5" id="spacer4"/>
</mx:ApplicationControlBar>
</pres:MDIWindow>

View File

@ -23,20 +23,21 @@
<mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml"
xmlns:mate="http://mate.asfusion.com/"
xmlns:local="*"
width="100%" height="100%"
creationComplete="onCreationComplete()" verticalScrollPolicy="off" horizontalScrollPolicy="off"
width="{slideModel.viewportW}" height="{slideModel.viewportH}"
x="{slideModel.viewportX}" y="{slideModel.viewportY}"
creationComplete="onCreationComplete()"
verticalScrollPolicy="off"
horizontalScrollPolicy="off"
rollOut="hideCursor()"
xmlns:views="org.bigbluebutton.modules.present.views.*"
implements="org.bigbluebutton.common.IBbbCanvas">
<mate:Listener type="{ZoomEvent.ZOOM}" method="handleZoomEvent" />
<mate:Listener type="{MoveEvent.CUR_SLIDE_SETTING}" method="handleCurSlideSettingEvent" />
<mate:Listener type="{MoveEvent.MOVE}" method="handleMoveEvent" />
<mate:Listener type="{SlideEvent.SLIDE_LOADED}" method="handleSlideLoadedEvent" />
<mate:Listener type="{MadePresenterEvent.SWITCH_TO_PRESENTER_MODE}" method="handleSwitchToPresenterEvent" />
<mate:Listener type="{MadePresenterEvent.SWITCH_TO_VIEWER_MODE}" method="handleSwitchToViewerEvent" />
<mate:Listener type="{CursorEvent.UPDATE_CURSOR}" method="handleUpdateCursorEvent" />
<mate:Listener type="{WindowResizedEvent.PRESENTATION_WINDOW_RESIZED_EVENT}" method="handleWindowResizeEvent"/>
<mate:Listener type="{PresenterCommands.RESIZE}" method="handleSlideResizeEvent"/>
<mx:Script>
<![CDATA[
@ -52,6 +53,8 @@
import mx.events.ListEvent;
import org.bigbluebutton.common.IBbbCanvas;
import org.bigbluebutton.common.LogUtil;
import org.bigbluebutton.core.managers.UserManager;
import org.bigbluebutton.main.events.MadePresenterEvent;
import org.bigbluebutton.modules.present.events.CursorEvent;
import org.bigbluebutton.modules.present.events.DisplaySlideEvent;
@ -62,18 +65,14 @@
import org.bigbluebutton.modules.present.events.UploadEvent;
import org.bigbluebutton.modules.present.events.WindowResizedEvent;
import org.bigbluebutton.modules.present.events.ZoomEvent;
import org.bigbluebutton.modules.present.managers.Slide;
import org.bigbluebutton.modules.present.ui.views.models.SlideCalcUtil;
import org.bigbluebutton.modules.present.ui.views.models.SlideViewModel;
public var zoomPercentage:int = 100;
[Bindable] public var zoomPercentage:Number = 100;
public static const ZOOM_STEP:int = 5;
public static const THUMBNAILS_CLOSED:String = "ThumbnailsClosed";
/**
* Variables that holds the presenter's locations of the
* loader so we can move the participant's slides in the
* same scale to maintain sync on the presenter's cursor.
*/
private var presentersLoaderXOffsetFromCanvas:Number = 0;
private var presentersLoaderYOffsetFromCanvas:Number = 0;
/**
* Variables that stores the presenter's ratio between
@ -81,30 +80,24 @@
* same scale as the presenter so that the cursor syncs
* properly.
*/
private var presentersLoaderCanvasWidthRatio:Number = 1;
private var presentersLoaderCanvasHeightRatio:Number = 1;
private var canvasMouseXOnMouseDown:int;
private var canvasMouseYOnMouseDown:int;
private var loaderXOnMouseDown:int;
private var loaderYOnMouseDown:int;
private var presenterViewedRegionX:Number = 0;
private var presenterViewedRegionY:Number = 0;
private var presenterViewedRegionW:Number = 100;
private var presenterViewedRegionH:Number = 100;
private var cursor:Shape;
private var overlayChildrenHolder:Canvas = new Canvas();
private var overlayCanvas:IBbbCanvas;
//The following few variables concern text selection
private var slideClip:MovieClip;
private var slideText:TextSnapshot;
private var firstChar:Number = -1;
private var lastChar:Number = -1;
private var whiteboardCanvasHolder:Canvas = new Canvas();
private var whiteboardCanvas:IBbbCanvas;
[Bindable] public var slides:ArrayCollection;
[Bindable] public var selectedSlide:int=0;
[Bindable] private var isPresenter:Boolean = false;
[Bindable] private var lateComerSynched:Boolean = false;
private var dispatcher:Dispatcher = new Dispatcher();
[Bindable]
private var slideModel:SlideViewModel = new SlideViewModel();
private function onCreationComplete():void {
slideLoader.width = this.width;
slideLoader.height = this.height;
@ -115,10 +108,10 @@
this.rawChildren.addChild(cursor);
cursor.visible = false;
overlayChildrenHolder = new Canvas();
this.addChild(overlayChildrenHolder);
overlayChildrenHolder.x = 0;
overlayChildrenHolder.y = 0;
whiteboardCanvasHolder = new Canvas();
this.addChild(whiteboardCanvasHolder);
whiteboardCanvasHolder.x = 0;
whiteboardCanvasHolder.y = 0;
this.setChildIndex(thumbnailView, this.numChildren - 1);
}
@ -139,15 +132,15 @@
dispatchEvent(e);
}
private var prevMouseX:Number;
private var prevMouseY:Number;
/**
* Triggered when the presenter clicks on the slides with the intent of moving it.
*/
private function onMouseDown(e:MouseEvent):void {
canvasMouseXOnMouseDown = this.mouseX;
canvasMouseYOnMouseDown = this.mouseY;
loaderXOnMouseDown = slideLoader.x;
loaderYOnMouseDown = slideLoader.y;
prevMouseX = this.mouseX;
prevMouseY = this.mouseY;
addEventListener(MouseEvent.MOUSE_MOVE, onMouseMove);
}
@ -156,28 +149,15 @@
*/
private function onMouseMove(e:MouseEvent):void {
// Compute the change in mouse position from where the mouse was clicked.
var deltaCanvasMouseX:Number = this.mouseX - canvasMouseXOnMouseDown;
var deltaCanvasMouseY:Number = this.mouseY - canvasMouseYOnMouseDown;
// Now we move the slide by the amount of mouse location change.
slideLoader.x = loaderXOnMouseDown + deltaCanvasMouseX;
slideLoader.y = loaderYOnMouseDown + deltaCanvasMouseY;
// Move the slide within the loader.
var deltaCanvasMouseX:Number = this.mouseX - prevMouseX;
var deltaCanvasMouseY:Number = this.mouseY - prevMouseY;
prevMouseX = this.mouseX;
prevMouseY = this.mouseY;
slideModel.onMove(deltaCanvasMouseX, deltaCanvasMouseY);
slideModel.printViewedRegion();
slideModel.displayPresenterView();
fitSlideToLoader();
notifyOtherParticipantsOfSlideMoving();
}
/**
* Send a message to other participants indicating the presenter has moved the slide.
*/
private function notifyOtherParticipantsOfSlideMoving():void {
var presentEvent:PresenterCommands = new PresenterCommands(PresenterCommands.MOVE);
presentEvent.xOffset = slideLoader.x/slideLoader.width;
presentEvent.yOffset = slideLoader.y/slideLoader.height;
presentEvent.slideToCanvasWidthRatio = slideLoader.width/this.width;
presentEvent.slideToCanvasHeightRatio = slideLoader.height/this.height;
dispatchEvent(presentEvent);
notifyOthersOfZoomEvent();
}
/**
@ -194,27 +174,25 @@
removeEventListener(MouseEvent.MOUSE_MOVE, onMouseMove);
}
/**
* Handles the resizing of the presenter's window. This is for the presenter resizing
* his/her window.
*/
private function handleWindowResizeEvent(event:WindowResizedEvent):void {
this.width = event.width;
this.height = event.height;
resizeAndMoveLoaderInRelationToCanvas();
}
public function onParentResized(parentWidth:Number, parentHeight:Number):void {
if (slideModel == null || noSlideContentLoaded()) return;
/**
* Resize and moves the slide loader within the canvas container.
*/
private function resizeAndMoveLoaderInRelationToCanvas():void {
slideLoader.width = this.width * presentersLoaderCanvasWidthRatio;
slideLoader.height = this.height * presentersLoaderCanvasHeightRatio;
slideLoader.x = slideLoader.width * presentersLoaderXOffsetFromCanvas;
slideLoader.y = slideLoader.height * presentersLoaderYOffsetFromCanvas;
slideModel.parentChange(parentWidth, parentHeight);
if (UserManager.getInstance().getConference().amIPresenter()) {
slideModel.adjustSlideAfterParentResized();
slideModel.displayPresenterView();
slideModel.printViewedRegion();
fitSlideToLoader();
notifyOthersOfZoomEvent();
} else {
slideModel.calculateViewportNeededForRegion(slideModel.viewedRegionX, slideModel.viewedRegionY, slideModel.viewedRegionW, slideModel.viewedRegionH);
slideModel.displayViewerRegion(slideModel.viewedRegionX, slideModel.viewedRegionY, slideModel.viewedRegionW, slideModel.viewedRegionH);
slideModel.calculateViewportXY();
slideModel.displayPresenterView();
slideModel.printViewedRegion();
fitSlideToLoader();
}
}
/**
@ -228,92 +206,10 @@
slideLoader.content.width = slideLoader.width;
slideLoader.content.height = slideLoader.height;
moveCanvas(slideLoader.x, slideLoader.y);
zoomCanvas(slideLoader.width, slideLoader.height);
}
private function fitLoaderToCanvas():void{
if (noSlideContentLoaded()) return;
slideLoader.width = this.width;
slideLoader.height = this.height;
slideLoader.x = this.x;
slideLoader.y = this.y;
fitSlideToLoader();
}
/**
*
*/
private function resizeAndMoveLoaderBy(percent:Number):void {
// Save the old loader dimensions. We need these to calculate
// the new position of the loader;
var oldLoaderHeight:int = slideLoader.height;
var oldLoaderWidth:int = slideLoader.width;
slideLoader.width = this.width * percent/100;
slideLoader.height = this.height * percent/100;
slideLoader.x = calculateNewLoaderX(oldLoaderWidth);
slideLoader.y = calculateNewLoaderY(oldLoaderHeight);
fitSlideToLoader();
}
/**
* Determines the new y coordinate of the loader. This determines if the location has
* changed because the slide was resized or moved.
*/
private function calculateNewLoaderY(oldLoaderHeight:int):int {
var deltaPercentHeight:Number = (slideLoader.height - oldLoaderHeight) /oldLoaderHeight;
var newLoaderY:int = (slideLoader.y/slideLoader.height) * deltaPercentHeight;
if (newLoaderY == 0) {
newLoaderY = slideLoader.y - (deltaPercentHeight * 100);
} else {
newLoaderY = slideLoader.y - newLoaderY;
}
return newLoaderY;
}
/**
* Determines the new y coordinate of the loader. This determines if the location has
* changed because the slide was resized or moved.
*/
private function calculateNewLoaderX(oldLoaderWidth:int):int {
var deltaPercentWidth:Number = (slideLoader.width - oldLoaderWidth) / oldLoaderWidth;
var newLoaderX:int = (slideLoader.x/slideLoader.width) * deltaPercentWidth;
if (newLoaderX == 0) {
newLoaderX = slideLoader.x - (deltaPercentWidth * 100);
} else {
newLoaderX = slideLoader.x - newLoaderX;
}
return newLoaderX;
}
private function handleSlideResizeEvent(event:PresenterCommands):void {
zoomLoaderBy(event.newSizeInPercent);
}
public function zoomLoaderBy(percent:Number):void {
if (percent < 100) {
zoomPercentage = 100;
} else if (percent > 400) {
zoomPercentage = 400;
} else {
zoomPercentage = percent;
}
if (zoomPercentage == 100) {
fitLoaderToCanvas();
} else {
resizeAndMoveLoaderBy(zoomPercentage);
}
notifyOthersOfZoomEvent();
}
/**
* Triggered when the presenter uses the mouse wheel to zoom in/out of the slide.
*/
@ -324,22 +220,42 @@
zoomPercentage += ZOOM_STEP;
}
zoomLoaderBy(zoomPercentage);
notifyListenersOfSlideResize(zoomPercentage);
zoomSlide(zoomPercentage, this.mouseX, this.mouseY);
}
public function notifyListenersOfSlideResize(percent:Number):void {
var event:SlideResizedEvent = new SlideResizedEvent();
event.percent = percent;
dispatcher.dispatchEvent(event);
public function switchToFitToPage(ftp:Boolean):void {
slideModel.switchToFitToPage(ftp);
onZoomSlide(100);
}
public function onZoomSlide(zoom:Number):void {
if (slideLoader.content == null) return;
zoomSlide(zoom, slideLoader.content.width/2, slideLoader.content.height/2);
}
private function zoomSlide(zoom:Number, mouseX:Number, mouseY:Number):void {
zoomPercentage = zoom;
if (zoomPercentage <= SlideViewModel.HUNDRED_PERCENT) {
zoomPercentage = SlideViewModel.HUNDRED_PERCENT;
} else if (zoomPercentage >= SlideViewModel.MAX_ZOOM_PERCENT) {
zoomPercentage = SlideViewModel.MAX_ZOOM_PERCENT
}
slideModel.onZoom(zoomPercentage, mouseX, mouseY);
slideModel.printViewedRegion();
slideModel.displayPresenterView();
fitSlideToLoader();
notifyOthersOfZoomEvent();
}
private function notifyOthersOfZoomEvent():void {
var presentEvent:PresenterCommands = new PresenterCommands(PresenterCommands.ZOOM);
presentEvent.xOffset = slideLoader.x/slideLoader.width;
presentEvent.yOffset = slideLoader.y/slideLoader.height;
presentEvent.slideToCanvasWidthRatio = slideLoader.width/this.width;
presentEvent.slideToCanvasHeightRatio = slideLoader.height/this.height;
presentEvent.xOffset = slideModel.viewedRegionX;
presentEvent.yOffset = slideModel.viewedRegionY;
presentEvent.slideToCanvasWidthRatio = slideModel.viewedRegionW;
presentEvent.slideToCanvasHeightRatio = slideModel.viewedRegionH;
dispatchEvent(presentEvent);
}
@ -351,25 +267,37 @@
/**
* Handles notification from presenter that the slide has moved.
*/
private function handleMoveEvent(e:MoveEvent):void{
savePresentersSettings(e.xOffset, e.yOffset, e.slideToCanvasWidthRatio, e.slideToCanvasHeightRatio);
if (!isPresenter) {
resizeAndMoveLoaderInRelationToCanvas();
private function handleCurSlideSettingEvent(e:MoveEvent):void{
if (UserManager.getInstance().getConference().amIPresenter()) {
return;
}
moveCanvas(slideLoader.x, slideLoader.y);
presenterViewedRegionX = e.xOffset;
presenterViewedRegionY = e.yOffset;
presenterViewedRegionW = e.slideToCanvasWidthRatio;
presenterViewedRegionH = e.slideToCanvasHeightRatio;
}
/**
* Handle notification from presenter that the slide has been zoomed.
* Handles notification from presenter that the slide has moved.
*/
private function handleZoomEvent(e:ZoomEvent):void {
savePresentersSettings(e.xOffset, e.yOffset, e.slideToCanvasWidthRatio, e.slideToCanvasHeightRatio);
if (!isPresenter) {
resizeAndMoveLoaderInRelationToCanvas();
private function handleMoveEvent(e:MoveEvent):void{
if (UserManager.getInstance().getConference().amIPresenter()) {
return;
}
zoomCanvas(slideLoader.width, slideLoader.height);
presenterViewedRegionX = e.xOffset;
presenterViewedRegionY = e.yOffset;
presenterViewedRegionW = e.slideToCanvasWidthRatio;
presenterViewedRegionH = e.slideToCanvasHeightRatio;
slideModel.saveViewedRegion(e.xOffset, e.yOffset, e.slideToCanvasWidthRatio, e.slideToCanvasHeightRatio);
slideModel.calculateViewportNeededForRegion(e.xOffset, e.yOffset, e.slideToCanvasWidthRatio, e.slideToCanvasHeightRatio);
slideModel.displayViewerRegion(e.xOffset, e.yOffset, e.slideToCanvasWidthRatio, e.slideToCanvasHeightRatio);
slideModel.calculateViewportXY();
slideModel.displayPresenterView();
slideModel.printViewedRegion();
fitSlideToLoader();
}
/**
@ -383,7 +311,6 @@
* Handle the event where this presenter becomes a viewer because another attendee became presenter.
*/
private function handleSwitchToViewerEvent(e:MadePresenterEvent):void{
participantIsNowPresenter(false);
removeEventListener(MouseEvent.MOUSE_WHEEL, onMouseWheelZoomEvent);
slideLoader.removeEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);
slideLoader.removeEventListener(MouseEvent.MOUSE_UP, onMouseUp);
@ -395,17 +322,14 @@
* Makes the attendee the presenter.
*/
private function handleSwitchToPresenterEvent(e:MadePresenterEvent):void{
participantIsNowPresenter(true);
addEventListener(MouseEvent.MOUSE_WHEEL, onMouseWheelZoomEvent);
slideLoader.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);
slideLoader.addEventListener(MouseEvent.MOUSE_UP, onMouseUp);
slideLoader.addEventListener(MouseEvent.MOUSE_OUT, onMouseOut);
addEventListener(MouseEvent.MOUSE_MOVE, mouseCursorUpdateListener);
notifyOthersOfZoomEvent();
}
private function participantIsNowPresenter(presenter:Boolean):void {
this.isPresenter = presenter;
}
/**
* Listen for mouse events to track the cursor.
@ -445,16 +369,6 @@
return slideLoader.content == null
}
/**
* Keep track of the presenter's x,y coordinates and the size of his/her presentation window.
*/
private function savePresentersSettings(xOffset:Number, yOffset:Number, widthRatio:Number, heightRatio:Number):void {
presentersLoaderXOffsetFromCanvas = xOffset;
presentersLoaderYOffsetFromCanvas = yOffset;
presentersLoaderCanvasWidthRatio = widthRatio;
presentersLoaderCanvasHeightRatio = heightRatio;
}
/*
* Fire an event when a single slide has been loaded.
*/
@ -463,10 +377,15 @@
}
private function handleSlideLoadedCompleteEvent(event:Event):void {
var slideRealWidth:int = slideLoader.content.width;
var slideRealHeight:int = slideLoader.content.height;
fitLoaderToCanvas();
dispatchNewSlideDisplayedEvent(slideRealWidth, slideRealHeight);
if (lateComerSynched) {
slideModel.resetForNewSlide(slideLoader.contentWidth, slideLoader.contentHeight);
} else {
lateComerSynched = true;
slideModel.reset(slideLoader.contentWidth, slideLoader.contentHeight);
slideModel.saveViewedRegion(presenterViewedRegionX, presenterViewedRegionY, presenterViewedRegionW, presenterViewedRegionH);
}
dispatchNewSlideDisplayedEvent(slideModel.pageOrigW, slideModel.pageOrigH);
}
private function dispatchNewSlideDisplayedEvent(slideRealWidth:int, slideRealHeight:int):void {
@ -490,41 +409,48 @@
/** Inherited from IBbbCanvas*/
public function addRawChild(child:DisplayObject):void{
this.overlayChildrenHolder.rawChildren.addChild(child);
this.whiteboardCanvasHolder.rawChildren.addChild(child);
}
public function removeRawChild(child:DisplayObject):void{
this.overlayChildrenHolder.rawChildren.removeChild(child);
this.whiteboardCanvasHolder.rawChildren.removeChild(child);
}
public function doesContain(child:DisplayObject):Boolean{
return this.overlayChildrenHolder.rawChildren.contains(child);
return this.whiteboardCanvasHolder.rawChildren.contains(child);
}
public function acceptOverlayCanvas(overlay:IBbbCanvas):void{
overlayCanvas = overlay;
whiteboardCanvas = overlay;
var c:Canvas = overlay as Canvas;
this.addChild(c);
c.x = 0;
c.y = 0;
c.x = slideLoader.x * SlideCalcUtil.MYSTERY_NUM;
c.y = slideLoader.y * SlideCalcUtil.MYSTERY_NUM;
c.width = slideLoader.width;
c.height = slideLoader.height;
fitSlideToLoader();
}
public function moveCanvas(x:int, y:int):void{
overlayChildrenHolder.x = slideLoader.x * 2;
overlayChildrenHolder.y = slideLoader.y * 2;
public function moveCanvas(x:Number, y:Number):void{
whiteboardCanvasHolder.x = slideLoader.x * SlideCalcUtil.MYSTERY_NUM;
whiteboardCanvasHolder.y = slideLoader.y * SlideCalcUtil.MYSTERY_NUM;
if (overlayCanvas != null) overlayCanvas.moveCanvas(overlayChildrenHolder.x, overlayChildrenHolder.y);
if (whiteboardCanvas != null) {
whiteboardCanvas.moveCanvas(whiteboardCanvasHolder.x, whiteboardCanvasHolder.y);
}
}
public function zoomCanvas(width:int, height:int):void{
overlayChildrenHolder.width = width;
overlayChildrenHolder.height = height;
public function zoomCanvas(width:Number, height:Number):void{
whiteboardCanvasHolder.width = width;
whiteboardCanvasHolder.height = height;
moveCanvas(slideLoader.x, slideLoader.y);
if (overlayCanvas != null) overlayCanvas.zoomCanvas(width, height);
if (whiteboardCanvas != null) {
whiteboardCanvas.zoomCanvas(width, height);
}
}
public function showOverlayCanvas(show:Boolean):void{
overlayCanvas.showCanvas(show);
whiteboardCanvas.showCanvas(show);
}
public function showCanvas(show:Boolean):void{
@ -533,9 +459,9 @@
]]>
</mx:Script>
<mx:SWFLoader id="slideLoader" width="{slideModel.loaderW}" height="{slideModel.loaderH}" x="{slideModel.loaderX}" y="{slideModel.loaderY}"
creationComplete="listenForSlideLoadedCompleteEvent()" scaleContent="false" showBusyCursor="true" completeEffect="Fade"/>
<mx:SWFLoader id="slideLoader" width="100%" height="100%" creationComplete="listenForSlideLoadedCompleteEvent()"
scaleContent="false" maintainAspectRatio="true" showBusyCursor="true" completeEffect="Fade"/>
<mx:HorizontalList id="thumbnailView" itemRenderer="org.bigbluebutton.modules.present.ui.views.Thumbnail" itemRollOver="changeIndex(event)"
visible="false" width="100%" height="100" y="{this.height - 100}" change="changeSlide()" />

View File

@ -0,0 +1,68 @@
package org.bigbluebutton.modules.present.ui.views.models
{
import org.bigbluebutton.common.LogUtil;
public class SlideCalcUtil
{
public static const HUNDRED_PERCENT:Number = 100;
// After lots of trial and error on why synching doesn't work properly, I found I had to
// multiply the coordinates by 2. There's something I don't understand probably on the
// canvas coordinate system. (ralam feb 22, 2012)
public static const MYSTERY_NUM:int = 2;
/**
* Calculate the viewed region width
*/
public static function calcViewedRegionWidth(vpw:Number, cpw:Number):Number {
var width:Number = (vpw/cpw) * HUNDRED_PERCENT;
if (width > HUNDRED_PERCENT) return HUNDRED_PERCENT;
return width;
}
public static function calcViewedRegionHeight(vph:Number, cph:Number):Number {
var height:Number = (vph/cph) * HUNDRED_PERCENT;
if (height > HUNDRED_PERCENT) return HUNDRED_PERCENT;
return height;
}
public static function calcCalcPageSizeWidth(ftp:Boolean, vpw:Number, vrw:Number):Number {
if (ftp) {
return (vpw/vrw) * HUNDRED_PERCENT;
} else {
return vpw;
}
}
public static function calcCalcPageSizeHeight(ftp:Boolean, vph:Number, vrh:Number, cpw:Number, cph:Number, opw:Number, oph:Number):Number {
if (ftp) {
return (vph/vrh) * HUNDRED_PERCENT;
} else {
return (cpw/opw) * oph;
}
}
public static function calcViewedRegionX(cpx:Number, cpw:Number):Number {
return (cpx * HUNDRED_PERCENT) / cpw;
}
public static function calcViewedRegionY(cpy:Number, cph:Number):Number {
return (cpy * HUNDRED_PERCENT) / cph;
}
public static function calculateViewportX(vpw:Number, pw:Number):Number {
if (vpw == pw) {
return 0;
} else {
return (pw - vpw) / MYSTERY_NUM;
}
}
public static function calculateViewportY(vph:Number, ph:Number):Number {
if (vph == ph) {
return 0;
} else {
return (ph - vph) / MYSTERY_NUM;
}
}
}
}

View File

@ -0,0 +1,304 @@
package org.bigbluebutton.modules.present.ui.views.models
{
import org.bigbluebutton.common.LogUtil;
public class SlideViewModel
{
public static const MAX_ZOOM_PERCENT:Number = 400;
public static const HUNDRED_PERCENT:Number = 100;
[Bindable] public var viewportX:Number = 0;
[Bindable] public var viewportY:Number = 0;
[Bindable] public var viewportW:Number = 0;
[Bindable] public var viewportH:Number = 0;
[Bindable] public var loaderW:Number = 0;
[Bindable] public var loaderH:Number = 0;
[Bindable] public var loaderX:Number = 0;
[Bindable] public var loaderY:Number = 0;
private var _viewedRegionX:Number = 0;
private var _viewedRegionY:Number = 0;
private var _viewedRegionW:Number = HUNDRED_PERCENT;
private var _viewedRegionH:Number = HUNDRED_PERCENT;
private var _pageOrigW:Number = 0;
private var _pageOrigH:Number = 0;
private var _calcPageW:Number = 0;
private var _calcPageH:Number = 0;
private var _calcPageX:Number = 0;
private var _calcPageY:Number = 0;
private var _parentW:Number = 0;
private var _parentH:Number = 0;
private var fitToPage:Boolean = true;
// After lots of trial and error on why synching doesn't work properly, I found I had to
// multiply the coordinates by 2. There's something I don't understand probably on the
// canvas coordinate system. (ralam feb 22, 2012)
private const MYSTERY_NUM:int = 2;
public function set parentW(width:Number):void {
_parentW = width;
}
public function set parentH(height:Number):void {
_parentH = height;
}
public function get parentW():Number {
return _parentW;
}
public function get parentH():Number {
return _parentH;
}
public function get pageOrigW():Number {
return _pageOrigW;
}
public function get pageOrigH():Number {
return _pageOrigH;
}
public function get viewedRegionW():Number {
return _viewedRegionW;
}
public function get viewedRegionH():Number {
return _viewedRegionH;
}
public function get viewedRegionX():Number {
return _viewedRegionX;
}
public function get viewedRegionY():Number {
return _viewedRegionY;
}
private function isPortraitDoc():Boolean {
return _pageOrigH > _pageOrigW;
}
public function reset(pageWidth:Number, pageHeight:Number):void {
_pageOrigW = pageWidth;
_pageOrigH = pageHeight;
}
public function resetForNewSlide(pageWidth:Number, pageHeight:Number):void {
_pageOrigW = pageWidth;
_pageOrigH = pageHeight;
}
public function parentChange(parentW:Number, parentH:Number):void {
viewportW = this.parentW = parentW;
viewportH = this.parentH = parentH;
}
public function calculateViewportXY():void {
viewportX = SlideCalcUtil.calculateViewportX(viewportW, parentW);
viewportY = SlideCalcUtil.calculateViewportY(viewportH, parentH);
}
private function calcViewedRegion():void {
_viewedRegionW = SlideCalcUtil.calcViewedRegionWidth(viewportW, _calcPageW);
_viewedRegionH = SlideCalcUtil.calcViewedRegionHeight(viewportH, _calcPageH);
_viewedRegionX = SlideCalcUtil.calcViewedRegionX(_calcPageX, _calcPageW);
_viewedRegionY = SlideCalcUtil.calcViewedRegionY(_calcPageY, _calcPageH);
}
public function displayPresenterView():void {
loaderX = Math.round(_calcPageX);
loaderY = Math.round(_calcPageY);
loaderW = Math.round(_calcPageW);
loaderH = Math.round(_calcPageH);
}
public function adjustSlideAfterParentResized():void {
if (fitToPage) {
calculateViewportNeededForRegion(_viewedRegionX, _viewedRegionY, _viewedRegionW, _viewedRegionH);
displayViewerRegion(_viewedRegionX, _viewedRegionY, _viewedRegionW, _viewedRegionH);
calculateViewportXY();
displayPresenterView();
printViewedRegion();
} else {
calculateViewportSize();
calculateViewportXY();
_calcPageW = (viewportW/_viewedRegionW) * HUNDRED_PERCENT;
_calcPageH = (_pageOrigH/_pageOrigW) * _calcPageW;
calcViewedRegion();
onResizeMove();
}
}
public function switchToFitToPage(ftp:Boolean):void {
LogUtil.debug("switchToFitToPage");
this.fitToPage = ftp;
calculateViewportSize();
calculateViewportXY();
}
private function doWidthBoundsDetection():void {
if (_calcPageX >= 0) {
// Don't let the left edge move inside the view.
_calcPageX = 0;
} else if ((_calcPageW + _calcPageX * MYSTERY_NUM) < viewportW) {
// Don't let the right edge move inside the view.
_calcPageX = (viewportW - _calcPageW) / MYSTERY_NUM;
} else {
// Let the move happen.
}
}
private function doHeightBoundsDetection():void {
if (_calcPageY >= 0) {
// Don't let the top edge move into the view.
_calcPageY = 0;
} else if ((_calcPageH + _calcPageY * MYSTERY_NUM) < viewportH) {
// Don't let the bottome edge move into the view.
_calcPageY = (viewportH - _calcPageH) / MYSTERY_NUM;
} else {
// Let the move happen.
}
}
private function onResizeMove():void {
doWidthBoundsDetection();
doHeightBoundsDetection();
}
public function onMove(deltaX:Number, deltaY:Number):void {
_calcPageX += deltaX;
_calcPageY += deltaY;
onResizeMove();
calcViewedRegion();
}
public function calculateViewportSize():void {
viewportW = parentW;
viewportH = parentH;
if (fitToPage) {
// If the height is smaller than the width, we use the height as the base to determine the size of the slide.
if (parentH < parentW) {
viewportH = parentH;
viewportW = ((pageOrigW * viewportH)/pageOrigH);
if (parentW < viewportW) {
viewportW = parentW;
viewportH = ((pageOrigH * viewportW)/pageOrigW);
}
} else {
viewportW = parentW;
viewportH = (viewportW/pageOrigW) * pageOrigH;
if (parentH < viewportH) {
viewportH = parentH;
viewportW = ((pageOrigW * viewportH)/pageOrigH);
}
}
} else {
if (viewportW < pageOrigW) {
viewportH = (viewportW/pageOrigW)*pageOrigH;
}
}
}
public function printViewedRegion():void {
// LogUtil.debug("Region [" + viewedRegionW + "," + viewedRegionH + "] [" + viewedRegionX + "," + viewedRegionY + "]");
// LogUtil.debug("Region [" + ((viewedRegionW / HUNDRED_PERCENT)*_calcPageW) + "," + ((viewedRegionH/HUNDRED_PERCENT)*_calcPageH) +
// "] [" + ((viewedRegionX/HUNDRED_PERCENT)*_calcPageW) + "," + ((viewedRegionY/HUNDRED_PERCENT)*_calcPageH) + "]");
}
public function onZoom(zoomValue:Number, mouseX:Number, mouseY:Number):void {
var cpw:Number = _calcPageW;
var cph:Number = _calcPageH;
var zpx:Number = Math.abs(_calcPageX) + mouseX;
var zpy:Number = Math.abs(_calcPageY) + mouseY;
var zpxp:Number = zpx/cpw;
var zpyp:Number = zpy/cph;
_calcPageW = pageOrigW * zoomValue / HUNDRED_PERCENT;
_calcPageH = (_calcPageW/cpw) * cph;
var zpx1:Number = _calcPageW * zpxp;
var zpy1:Number = _calcPageH * zpyp;
_calcPageX = -((zpx1 + zpx)/2) + mouseX;
_calcPageY = -((zpy1 + zpy)/2) + mouseY;
doWidthBoundsDetection();
doHeightBoundsDetection();
if ((zoomValue <= HUNDRED_PERCENT) || (_calcPageW < viewportW) || (_calcPageH < viewportH)) {
if (isPortraitDoc()) {
if (fitToPage) {
_calcPageY = 0;
_calcPageH = viewportH;
_calcPageW = (_pageOrigW/_pageOrigH)*_calcPageH;
_calcPageX = 0;
} else {
_calcPageX = 0;
_calcPageY = 0;
_calcPageW = viewportW;
_calcPageH = (_calcPageW/_pageOrigW)*_pageOrigH;
}
} else {
if (fitToPage) {
_calcPageW = viewportW;
_calcPageH = viewportH;
_calcPageY = 0;
_calcPageX = 0;
} else {
_calcPageX = 0;
_calcPageY = 0;
_calcPageW = viewportW;
_calcPageH = (_calcPageW/_pageOrigW)*_pageOrigH;
}
}
}
calcViewedRegion();
}
public function displayViewerRegion(x:Number, y:Number, regionW:Number, regionH:Number):void {
// LogUtil.debug("** disp viewer 1 [" + regionW + "," + regionH + "][" + x + "," + y + "]");
_calcPageW = viewportW/(regionW/HUNDRED_PERCENT);
_calcPageH = viewportH/(regionH/HUNDRED_PERCENT);
_calcPageX = (x/HUNDRED_PERCENT) * _calcPageW;
_calcPageY = (y/HUNDRED_PERCENT) * _calcPageH;
// LogUtil.debug("** disp viewer 2 [" + viewportW + "," + viewportH + "][" +_calcPageW + "," + _calcPageH + "][" + _calcPageX + "," + _calcPageY + "]");
}
public function saveViewedRegion(x:Number, y:Number, regionW:Number, regionH:Number):void {
_viewedRegionX = x;
_viewedRegionY = y;
_viewedRegionW = regionW;
_viewedRegionH = regionH;
}
public function calculateViewportNeededForRegion(x:Number, y:Number, regionW:Number, regionH:Number):void {
var vrwp:Number = pageOrigW * (regionW/HUNDRED_PERCENT);
var vrhp:Number = pageOrigH * (regionH/HUNDRED_PERCENT);
if (parentW < parentH) {
viewportW = parentW;
viewportH = (vrhp/vrwp)*parentW;
if (parentH < viewportH) {
viewportH = parentH;
viewportW = ((vrwp * viewportH)/viewportH);
// LogUtil.debug("calc viewport ***** resizing [" + viewportW + "," + viewportH + "] [" + parentW + "," + parentH + "," + fitToPage + "] [" + pageOrigW + "," + pageOrigH + "]");
}
} else {
viewportH = parentH;
viewportW = (vrwp/vrhp)*parentH;
if (parentW < viewportW) {
viewportW = parentW;
viewportH = ((vrhp * viewportW)/vrwp);
// LogUtil.debug("calc viewport resizing [" + viewportW + "," + viewportH + "] [" + parentW + "," + parentH + "," + fitToPage + "] [" + pageOrigW + "," + pageOrigH + "]");
}
}
}
}
}

View File

@ -60,11 +60,16 @@ package org.bigbluebutton.modules.videoconf.business
[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" );
// streamname: <width>x<height><userId>-<timestamp>
// example: 320x2405-1329334829687
var pattern:RegExp = new RegExp("\\d+x\\d+-\\d+", "");
if (pattern.test(stream)) {
LogUtil.debug("The stream name is well formatted");
return stream.substr(0, stream.split("-")[0].length - String(this.userId).length).split("x");
} else {
LogUtil.error("The stream name doesn't follow the pattern <width>x<height><userId>-<timestamp>. However, the video resolution will be set to the lowest defined resolution in the config.xml: " + resolutions[0]);
return resolutions[0].split("x");
}
return null;
}
protected function get paddingVertical():Number {

View File

@ -0,0 +1,205 @@
package org.bigbluebutton.modules.whiteboard
{
import flash.display.Shape;
import mx.collections.ArrayCollection;
import mx.core.Application;
import mx.managers.CursorManager;
import org.bigbluebutton.common.IBbbCanvas;
import org.bigbluebutton.common.Images;
import org.bigbluebutton.common.LogUtil;
import org.bigbluebutton.modules.present.events.WindowResizedEvent;
import org.bigbluebutton.modules.whiteboard.WhiteboardCanvasModel;
import org.bigbluebutton.modules.whiteboard.business.shapes.DrawObject;
import org.bigbluebutton.modules.whiteboard.business.shapes.DrawObjectFactory;
import org.bigbluebutton.modules.whiteboard.business.shapes.ShapeFactory;
import org.bigbluebutton.modules.whiteboard.events.PageEvent;
import org.bigbluebutton.modules.whiteboard.events.WhiteboardButtonEvent;
import org.bigbluebutton.modules.whiteboard.events.WhiteboardDrawEvent;
import org.bigbluebutton.modules.whiteboard.events.WhiteboardPresenterEvent;
import org.bigbluebutton.modules.whiteboard.events.WhiteboardUpdate;
import org.bigbluebutton.modules.whiteboard.maps.WhiteboardEventMap;
import org.bigbluebutton.modules.whiteboard.views.WhiteboardCanvas;
public class WhiteboardCanvasModel {
public var wbCanvas:WhiteboardCanvas;
private var isDrawing:Boolean;
private var sending:Boolean = false;
private var feedback:Shape = new Shape();
private var latentFeedbacks:Array = new Array();
private var segment:Array = new Array();
private var shapeList:Array = new Array();
private var shapeFactory:ShapeFactory = new ShapeFactory();
private var bbbCanvas:IBbbCanvas;
private var shapeStyle:String = DrawObject.PENCIL;
private var drawColor:uint = 0x000000;
private var thickness:uint = 1;
private var drawStatus:String = DrawObject.DRAW_START;
private var width:Number;
private var height:Number;
public function doMouseUp():void{
if (isDrawing) {
/**
* Check if we are drawing because when resizing the window, it generates
* a mouseUp event at the end of resize. We don't want to dispatch another
* shape to the viewers.
*/
isDrawing = false;
sendShapeToServer(DrawObject.DRAW_END);
}
}
private var objCount:int = 0;
private function sendShapeToServer(status:String):void{
if (segment.length == 0) return;
var dobj:DrawObject = shapeFactory.createDrawObject(this.shapeStyle, segment, this.drawColor, this.thickness);
dobj.id = "" + objCount++;
switch (status) {
case DrawObject.DRAW_START:
dobj.status = DrawObject.DRAW_START;
drawStatus = DrawObject.DRAW_UPDATE;
break;
case DrawObject.DRAW_UPDATE:
dobj.status = DrawObject.DRAW_UPDATE;
break;
case DrawObject.DRAW_END:
dobj.status = DrawObject.DRAW_END;
drawStatus = DrawObject.DRAW_START;
break;
}
LogUtil.error("SEGMENT LENGTH = [" + segment.length + "] STATUS = [" + dobj.status + "]");
if (this.shapeStyle == DrawObject.PENCIL) {
dobj.status = DrawObject.DRAW_END;
drawStatus = DrawObject.DRAW_START;
segment = new Array();
var xy:Array = wbCanvas.getMouseXY();
segment.push(xy[0], xy[1]);
}
wbCanvas.sendShapeToServer(dobj);
}
public function doMouseDown(mouseX:Number, mouseY:Number):void{
isDrawing = true;
drawStatus = DrawObject.DRAW_START;
segment = new Array();
segment.push(mouseX);
segment.push(mouseY);
}
public function doMouseMove(mouseX:Number, mouseY:Number):void{
if (isDrawing){
segment.push(mouseX);
segment.push(mouseY);
if (segment.length > 30) {
sendShapeToServer(drawStatus);
}
}
}
public function drawSegment(event:WhiteboardUpdate):void{
var o:DrawObject = event.data;
draw(o);
}
private function draw(o:DrawObject):void{
LogUtil.debug("Got shape [" + o.getType() + " " + o.status + "]");
switch (o.status) {
case DrawObject.DRAW_START:
addNewShape(o);
break;
case DrawObject.DRAW_UPDATE:
case DrawObject.DRAW_END:
if (shapeList.length == 0 || o.getType() == DrawObject.PENCIL) {
addNewShape(o);
} else {
removeLastShape();
addNewShape(o);
}
break;
}
}
private function addNewShape(o:DrawObject):void {
LogUtil.error("Adding new shape");
var dobj:DrawObject = shapeFactory.makeShape(o);
wbCanvas.addShape(dobj.getShape());
shapeList.push(dobj);
}
public function setShape(s:String):void{
this.shapeStyle = s;
}
public function changeColor(color:uint):void{
drawColor = color;
}
public function changeThickness(thickness:uint):void{
this.thickness = thickness;
}
private function removeLastShape():void {
var dobj:DrawObject = shapeList.pop() as DrawObject;
wbCanvas.removeShape(dobj.getShape());
}
public function clearBoard(event:WhiteboardUpdate = null):void{
var numShapes:int = this.shapeList.length;
for (var i:Number = 0; i < numShapes; i++){
removeLastShape();
}
}
public function undoShape():void{
if (this.shapeList.length > 0) {
removeLastShape();
}
}
public function changePage(e:PageEvent):void{
var page:Number = e.pageNum;
var shapes:ArrayCollection = e.shapes;
clearBoard();
for (var i:int = 0; i < shapes.length; i++){
var o:DrawObject = shapes.getItemAt(i) as DrawObject;
draw(o);
}
}
public function zoomCanvas(width:Number, height:Number):void{
shapeFactory.setParentDim(width, height);
this.width = width;
this.height = height;
for (var i:int = 0; i < this.shapeList.length; i++){
redrawShape(this.shapeList[i] as DrawObject);
}
}
private function redrawShape(dobj:DrawObject):void {
wbCanvas.removeShape(dobj.getShape());
shapeFactory.makeShape(dobj);
wbCanvas.addShape(dobj.getShape());
}
public function isPageEmpty():Boolean {
return shapeList.length == 0;
}
}
}

View File

@ -27,15 +27,15 @@ package org.bigbluebutton.modules.whiteboard.business
import flash.net.Responder;
import flash.net.SharedObject;
import org.bigbluebutton.common.LogUtil;
import org.bigbluebutton.modules.present.events.PresentationEvent;
import org.bigbluebutton.modules.whiteboard.business.shapes.DrawObject;
import org.bigbluebutton.modules.whiteboard.business.shapes.DrawObjectFactory;
import org.bigbluebutton.modules.whiteboard.events.PageEvent;
import org.bigbluebutton.modules.whiteboard.events.StartWhiteboardModuleEvent;
import org.bigbluebutton.modules.whiteboard.events.WhiteboardDrawEvent;
import org.bigbluebutton.modules.whiteboard.events.WhiteboardPresenterEvent;
import org.bigbluebutton.modules.whiteboard.events.WhiteboardUpdate;
import org.bigbluebutton.modules.whiteboard.events.PageEvent;
import org.bigbluebutton.modules.whiteboard.events.StartWhiteboardModuleEvent;
import org.bigbluebutton.modules.present.events.PresentationEvent;
import org.bigbluebutton.common.LogUtil;
/**
* The DrawProxy class is a Delegate class for the Red5 Server. It communicates directly with the Red5
@ -184,7 +184,7 @@ package org.bigbluebutton.modules.whiteboard.business
*/
public function sendShape(e:WhiteboardDrawEvent):void{
var shape:DrawObject = e.message;
LogUtil.debug("*** Sending shape");
var nc:NetConnection = connection;
nc.call(
"whiteboard.sendShape",// Remote function name
@ -201,14 +201,9 @@ package org.bigbluebutton.modules.whiteboard.business
}
}
),//new Responder
shape.getShapeArray(), shape.getType(), shape.getColor(), shape.getThickness(), shape.parentWidth, shape.parentHeight
shape.getShapeArray(), shape.getType(), shape.getColor(), shape.getThickness(),
shape.id, shape.status
); //_netConnection.call
/*try{
drawSO.send("addSegment", shape.getShapeArray(), shape.getType(), shape.getColor(), shape.getThickness(), shape.parentWidth, shape.parentHeight);
} catch(e:Error){
LogUtil.error("DrawProxy::sendShape - sending shape failed");
}*/
}
/**
@ -216,10 +211,12 @@ package org.bigbluebutton.modules.whiteboard.business
* @param array The array representation of a shape
*
*/
public function addSegment(array:Array, type:String, color:uint, thickness:uint, parentWidth:Number, parentHeight:Number):void{
var d:DrawObject = drawFactory.makeDrawObject(type,array,color,thickness);
d.parentWidth = parentWidth;
d.parentHeight = parentHeight;
public function addSegment(array:Array, type:String, color:uint, thickness:uint, id:String, status:String):void{
LogUtil.debug("Rx add segment ****");
var d:DrawObject = drawFactory.makeDrawObject(type, array, color, thickness);
d.id = id;
d.status = status;
var e:WhiteboardUpdate = new WhiteboardUpdate(WhiteboardUpdate.BOARD_UPDATED);
e.data = d;
dispatcher.dispatchEvent(e);
@ -350,17 +347,16 @@ package org.bigbluebutton.modules.whiteboard.business
var shapes:Array = result as Array;
//LogUtil.debug("Whiteboard::recievedShapesHistory() : recieved " + shapes.length);
for (var i:int=0; i<shapes.length; i++){
for (var i:int=0; i < shapes.length; i++){
var shape:Array = shapes[i] as Array;
var shapeArray:Array = shape[0] as Array;
var type:String = shape[1] as String;
var color:uint = shape[2] as uint;
var thickness:uint = shape[3] as uint;
var width:Number = shape[4] as Number;
var height:Number = shape[5] as Number;
addSegment(shapeArray, type, color, thickness, width, height);
var id:String = shape[4] as String;
var status:String = shape[5] as String;
addSegment(shapeArray, type, color, thickness, id, status);
}
}
}
}

View File

@ -18,6 +18,8 @@
*/
package org.bigbluebutton.modules.whiteboard.business.shapes
{
import flash.display.Shape;
/**
* The DrawObject class provides an interface for other geometric representations.
* This is a simple implementation of the Template design pattern. Other classes extend the
@ -28,8 +30,7 @@ package org.bigbluebutton.modules.whiteboard.business.shapes
* @author dzgonjan
*
*/
public class DrawObject
{
public class DrawObject {
public static const PENCIL:String = "pencil";
public static const RECTANGLE:String = "rectangle";
public static const ELLIPSE:String = "ellipse";
@ -38,15 +39,29 @@ package org.bigbluebutton.modules.whiteboard.business.shapes
protected var shape:Array;
protected var color:uint;
protected var thickness:uint;
public var parentWidth:Number;
public var parentHeight:Number;
/**
* Id we can use to match the feedback shape in the presenter's view so we can
* remove it.
*/
public var id:String = null;
/**
* Status = [START, UPDATE, END]
*/
public static const DRAW_UPDATE:String = "DRAW_UPDATE";
public static const DRAW_END:String = "DRAW_END";
public static const DRAW_START:String = "DRAW_START";
public var status:String = DRAW_START;
protected var _shape:Shape = new Shape();
protected var _segment:Array;
/**
* The default constructor for the DrawObject
*
*/
public function DrawObject(type:String, segment:Array, color:uint, thickness:uint)
{
public function DrawObject(type:String, segment:Array, color:uint, thickness:uint) {
this.type = type;
this.shape = segment;
this.color = color;
@ -54,6 +69,10 @@ package org.bigbluebutton.modules.whiteboard.business.shapes
this.optimize();
}
public function getShape():Shape {
return _shape;
}
/**
* Returns the type of DrawObject this class is
* @return a string representing the type
@ -91,8 +110,23 @@ package org.bigbluebutton.modules.whiteboard.business.shapes
}
protected function optimize():void{
// do nothing
}
protected function readyToSend():Boolean {
return false;
}
public function makeShape(width:Number, height:Number):void {
}
protected function denormalize(val:Number, side:Number):Number {
return (val*side)/100.0;
}
protected function normalize(val:Number, side:Number):Number {
return (val*100.0)/side;
}
}
}

View File

@ -18,6 +18,8 @@
*/
package org.bigbluebutton.modules.whiteboard.business.shapes
{
import flash.display.Shape;
/**
* The Ellipse class. Extends the DrawObject
* @author dzgonjan
@ -58,5 +60,20 @@ package org.bigbluebutton.modules.whiteboard.business.shapes
this.shape.push(y2);
}
override public function makeShape(parentWidth:Number, parentHeight:Number):void {
var newShape:Shape = new Shape();
newShape.graphics.lineStyle(getThickness(), getColor());
var arrayEnd:Number = getShapeArray().length;
var x:Number = denormalize(getShapeArray()[0], parentWidth);
var y:Number = denormalize(getShapeArray()[1], parentHeight);
var width:Number = denormalize(getShapeArray()[arrayEnd-2], parentWidth) - x;
var height:Number = denormalize(getShapeArray()[arrayEnd-1], parentHeight) - y;
newShape.graphics.drawEllipse(x, y, width, height);
if (getColor() == 0x000000 || getColor() == 0xFFFFFF) newShape.alpha = 1.0;
else newShape.alpha = 0.6;
_shape = newShape;
}
}
}

View File

@ -18,6 +18,8 @@
*/
package org.bigbluebutton.modules.whiteboard.business.shapes
{
import flash.display.Shape;
/**
* The Pencil class. Extends a DrawObject
* @author dzgonjan
@ -37,5 +39,26 @@ package org.bigbluebutton.modules.whiteboard.business.shapes
super(DrawObject.PENCIL, segment, color, thickness);
}
override public function makeShape(parentWidth:Number, parentHeight:Number):void {
var newShape:Shape = new Shape();
newShape.graphics.lineStyle(getThickness(), getColor());
var graphicsCommands:Vector.<int> = new Vector.<int>();
graphicsCommands.push(1);
var coordinates:Vector.<Number> = new Vector.<Number>();
coordinates.push(denormalize(getShapeArray()[0], parentWidth), denormalize(getShapeArray()[1], parentHeight));
for (var i:int = 2; i < getShapeArray().length; i += 2){
graphicsCommands.push(2);
coordinates.push(denormalize(getShapeArray()[i], parentWidth), denormalize(getShapeArray()[i+1], parentHeight));
}
newShape.graphics.drawPath(graphicsCommands, coordinates);
if (getColor() == 0x000000 || getColor() == 0xFFFFFF) newShape.alpha = 1;
else newShape.alpha = 0.6;
_shape = newShape;
}
}
}

View File

@ -18,6 +18,8 @@
*/
package org.bigbluebutton.modules.whiteboard.business.shapes
{
import flash.display.Shape;
/**
* The Rectangle class. Extends a DrawObject
* @author dzgonjan
@ -55,5 +57,21 @@ package org.bigbluebutton.modules.whiteboard.business.shapes
this.shape.push(y2);
}
override public function makeShape(parentWidth:Number, parentHeight:Number):void {
var newShape:Shape = new Shape();
newShape.graphics.lineStyle(getThickness(), getColor());
var arrayEnd:Number = getShapeArray().length;
var x:Number = denormalize(getShapeArray()[0], parentWidth);
var y:Number = denormalize(getShapeArray()[1], parentHeight);
var width:Number = denormalize(getShapeArray()[arrayEnd-2], parentWidth) - x;
var height:Number = denormalize(getShapeArray()[arrayEnd-1], parentHeight) - y;
newShape.graphics.drawRect(x,y,width,height);
if (getColor() == 0x000000 || getColor() == 0xFFFFFF) newShape.alpha = 1.0;
else newShape.alpha = 0.6;
_shape = newShape;
}
}
}

View File

@ -31,28 +31,50 @@ package org.bigbluebutton.modules.whiteboard.business.shapes
public class ShapeFactory
{
private var drawFactory:DrawObjectFactory;
private var _parentWidth:Number = 0;
private var _parentHeight:Number = 0;
public function ShapeFactory()
{
public function ShapeFactory() {
drawFactory = new DrawObjectFactory();
}
public function setParentDim(width:Number, height:Number):void {
_parentWidth = width;
_parentHeight = height;
}
/**
* Creates a Flash Shape, given a DrawObject representation of it
* @param shape
* @return
*
*/
public function makeShape(shape:DrawObject):Shape{
var s:Shape = null;
public function makeShape(shape:DrawObject):DrawObject{
if (shape.getType() == DrawObject.PENCIL){
s = makePencil(Pencil(shape));
return makePencil(shape as Pencil);
} else if (shape.getType() == DrawObject.RECTANGLE){
s = makeRectangle(Rectangle(shape));
return makeRectangle(shape as Rectangle);
} else if (shape.getType() == DrawObject.ELLIPSE){
s = makeEllipse(Ellipse(shape));
return makeEllipse(shape as Ellipse);
}
return s;
return null;
}
private function denormalize(val:Number, side:Number):Number {
return (val*side)/100.0;
}
private function normalize(val:Number, side:Number):Number {
return (val*100.0)/side;
}
public function createDrawObject(type:String, segment:Array, color:uint, thickness:uint):DrawObject {
var normSegment:Array = new Array();
for (var i:int = 0; i < segment.length; i += 2) {
normSegment[i] = normalize(segment[i] , _parentWidth);
normSegment[i+1] = normalize(segment[i+1], _parentHeight);
}
return makeShape(drawFactory.makeDrawObject(type, normSegment, color, thickness));
}
/**
@ -64,36 +86,21 @@ package org.bigbluebutton.modules.whiteboard.business.shapes
* @return A Flash Shape object
*
*/
public function makeFeedback(segment:Array, type:String, color:uint, thickness:uint):Shape{
return makeShape(drawFactory.makeDrawObject(type,segment, color, thickness));
public function makeFeedback(type:String, segment:Array, color:uint, thickness:uint):DrawObject{
return makeShape(drawFactory.makeDrawObject(type, segment, color, thickness));
}
/**
* Creates a Flash Shape from a Pencil DrawObject
* @param p a Pencil DrawObject
* @return a Shape
*
*/
private function makePencil(p:Pencil):Shape{
var newShape:Shape = new Shape();
newShape.graphics.lineStyle(p.getThickness(), p.getColor());
var graphicsCommands:Vector.<int> = new Vector.<int>();
graphicsCommands.push(1);
var coordinates:Vector.<Number> = new Vector.<Number>();
coordinates.push(p.getShapeArray()[0], p.getShapeArray()[1]);
for (var i:int = 2; i < p.getShapeArray().length; i += 2){
graphicsCommands.push(2);
coordinates.push(p.getShapeArray()[i], p.getShapeArray()[i+1]);
}
newShape.graphics.drawPath(graphicsCommands, coordinates);
if (p.getColor() == 0x000000 || p.getColor() == 0xFFFFFF) newShape.alpha = 1;
else newShape.alpha = 0.6;
return newShape;
private function makePencil(p:Pencil):DrawObject{
p.makeShape(_parentWidth, _parentHeight);
return p;
}
/**
@ -102,20 +109,9 @@ package org.bigbluebutton.modules.whiteboard.business.shapes
* @return a Shape
*
*/
private function makeRectangle(r:Rectangle):Shape{
var newShape:Shape = new Shape();
newShape.graphics.lineStyle(r.getThickness(), r.getColor());
var arrayEnd:Number = r.getShapeArray().length;
var x:Number = r.getShapeArray()[0];
var y:Number = r.getShapeArray()[1];
var width:Number = r.getShapeArray()[arrayEnd-2] - x;
var height:Number = r.getShapeArray()[arrayEnd-1] - y;
newShape.graphics.drawRect(x,y,width,height);
if (r.getColor() == 0x000000 || r.getColor() == 0xFFFFFF) newShape.alpha = 1.0;
else newShape.alpha = 0.6;
return newShape;
private function makeRectangle(r:Rectangle):DrawObject{
r.makeShape(_parentWidth, _parentHeight);
return r;
}
/**
@ -124,20 +120,9 @@ package org.bigbluebutton.modules.whiteboard.business.shapes
* @return a Shape
*
*/
private function makeEllipse(e:Ellipse):Shape{
var newShape:Shape = new Shape();
newShape.graphics.lineStyle(e.getThickness(), e.getColor());
var arrayEnd:Number = e.getShapeArray().length;
var x:Number = e.getShapeArray()[0];
var y:Number = e.getShapeArray()[1];
var width:Number = e.getShapeArray()[arrayEnd-2] - x;
var height:Number = e.getShapeArray()[arrayEnd-1] - y;
newShape.graphics.drawEllipse(x,y,width,height);
if (e.getColor() == 0x000000 || e.getColor() == 0xFFFFFF) newShape.alpha = 1.0;
else newShape.alpha = 0.6;
return newShape;
private function makeEllipse(e:Ellipse):DrawObject{
e.makeShape(_parentWidth, _parentHeight);
return e;
}
}

View File

@ -76,6 +76,8 @@ package org.bigbluebutton.modules.whiteboard.managers
}
private function gotoPage(pageNumber:int):void{
if (pages == null || pages.length < pageNumber) return;
var event:PageEvent = new PageEvent(PageEvent.CHANGE_PAGE);
event.pageNum = pageNumber;
this.pageNum = pageNumber;

View File

@ -19,15 +19,20 @@
package org.bigbluebutton.modules.whiteboard.managers
{
import com.asfusion.mate.events.Dispatcher;
import flash.events.TimerEvent;
import flash.utils.Timer;
import org.bigbluebutton.core.managers.UserManager;
import org.bigbluebutton.common.events.AddUIComponentToMainCanvas;
import org.bigbluebutton.core.managers.UserManager;
import org.bigbluebutton.main.model.users.Conference;
import org.bigbluebutton.modules.present.api.PresentationAPI;
import org.bigbluebutton.modules.present.events.AddButtonToPresentationEvent;
import org.bigbluebutton.modules.present.events.AddOverlayCanvasEvent;
import org.bigbluebutton.modules.whiteboard.WhiteboardCanvasModel;
import org.bigbluebutton.modules.whiteboard.events.PageEvent;
import org.bigbluebutton.modules.whiteboard.events.WhiteboardButtonEvent;
import org.bigbluebutton.modules.whiteboard.events.WhiteboardUpdate;
import org.bigbluebutton.modules.whiteboard.views.WhiteboardButton;
import org.bigbluebutton.modules.whiteboard.views.WhiteboardCanvas;
import org.bigbluebutton.modules.whiteboard.views.WhiteboardToolbar;
@ -38,15 +43,17 @@ package org.bigbluebutton.modules.whiteboard.managers
private var highlighterCanvas:WhiteboardCanvas;
private var highlighterToolbar:WhiteboardToolbar;
private var whiteboardButton:WhiteboardButton;
private var model:WhiteboardCanvasModel = new WhiteboardCanvasModel();
public function WhiteboardManager()
{
public function WhiteboardManager() {
globalDispatcher = new Dispatcher();
}
public function handleStartModuleEvent():void{
if (highlighterCanvas != null) return;
highlighterCanvas = new WhiteboardCanvas();
highlighterCanvas.model = model;
model.wbCanvas = highlighterCanvas;
if (highlighterToolbar != null) return;
highlighterToolbar = new WhiteboardToolbar();
highlighterToolbar.canvas = highlighterCanvas;
@ -54,7 +61,7 @@ package org.bigbluebutton.modules.whiteboard.managers
whiteboardButton = new WhiteboardButton();
//Necessary now because of module loading race conditions
var t:Timer = new Timer(2000, 1);
var t:Timer = new Timer(1000, 1);
t.addEventListener(TimerEvent.TIMER, addHighlighterCanvas);
t.addEventListener(TimerEvent.TIMER, addHighlighterToolbar);
t.start();
@ -78,5 +85,28 @@ package org.bigbluebutton.modules.whiteboard.managers
highlighterToolbar.positionToolbar(e.window);
}
public function drawSegment(event:WhiteboardUpdate):void{
model.drawSegment(event);
}
public function clearBoard(event:WhiteboardUpdate = null):void{
model.clearBoard();
}
public function undoShape(event:WhiteboardUpdate):void{
model.undoShape();
}
public function changePage(e:PageEvent):void{
model.changePage(e);
}
public function enableWhiteboard(e:WhiteboardButtonEvent):void{
highlighterCanvas.enableWhiteboard(e);
}
public function disableWhiteboard(e:WhiteboardButtonEvent):void{
highlighterCanvas.disableWhiteboard(e);
}
}
}

View File

@ -0,0 +1,131 @@
<?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/" xmlns:mate="org.bigbluebutton.common.mate.*">
<mx:Script>
<![CDATA[
import mx.controls.Alert;
import mx.events.FlexEvent;
import org.bigbluebutton.main.events.ModuleStartedEvent;
import org.bigbluebutton.modules.present.events.AddButtonToPresentationEvent;
import org.bigbluebutton.modules.present.events.AddOverlayCanvasEvent;
import org.bigbluebutton.modules.present.events.NavigationEvent;
import org.bigbluebutton.modules.present.events.PresentationEvent;
import org.bigbluebutton.modules.present.events.WindowResizedEvent;
import org.bigbluebutton.modules.whiteboard.business.DrawProxy;
import org.bigbluebutton.modules.whiteboard.events.PageEvent;
import org.bigbluebutton.modules.whiteboard.events.StartWhiteboardModuleEvent;
import org.bigbluebutton.modules.whiteboard.events.WhiteboardButtonEvent;
import org.bigbluebutton.modules.whiteboard.events.WhiteboardDrawEvent;
import org.bigbluebutton.modules.whiteboard.events.WhiteboardPresenterEvent;
import org.bigbluebutton.modules.whiteboard.events.WhiteboardUpdate;
import org.bigbluebutton.modules.whiteboard.managers.PageManager;
import org.bigbluebutton.modules.whiteboard.managers.WhiteboardManager;
import org.bigbluebutton.modules.whiteboard.views.WhiteboardCanvas;
private function dummyMethod():void{
}
]]>
</mx:Script>
<EventHandlers type="{FlexEvent.PREINITIALIZE}">
<ObjectBuilder generator="{WhiteboardManager}" cache="global" />
<ObjectBuilder generator="{DrawProxy}" cache="global" />
<ObjectBuilder generator="{PageManager}" cache="global" />
</EventHandlers>
<EventHandlers type="{WhiteboardPresenterEvent.MODIFY_ENABLED}" >
<MethodInvoker generator="{DrawProxy}" method="modifyEnabled" arguments="{event}" />
</EventHandlers>
<EventHandlers type="{NavigationEvent.GOTO_PAGE}" >
<MethodInvoker generator="{PageManager}" method="changePage" arguments="{event}" />
</EventHandlers>
<EventHandlers type="{PresentationEvent.PRESENTATION_LOADED}" >
<MethodInvoker generator="{PageManager}" method="createPages" arguments="{event}" />
<MethodInvoker generator="{DrawProxy}" method="setActivePresentation" arguments="{event}" />
</EventHandlers>
<EventHandlers type="{StartWhiteboardModuleEvent.START_HIGHLIGHTER_MODULE_EVENT}">
<MethodInvoker generator="{WhiteboardManager}" method="handleStartModuleEvent" />
<MethodInvoker generator="{DrawProxy}" method="connect" arguments="{event}" />
</EventHandlers>
<EventHandlers type="{WhiteboardDrawEvent.CLEAR_BOARD}" >
<MethodInvoker generator="{DrawProxy}" method="clearBoard" />
</EventHandlers>
<EventHandlers type="{WhiteboardDrawEvent.SEND_SHAPE}">
<MethodInvoker generator="{DrawProxy}" method="sendShape" arguments="{event}" />
</EventHandlers>
<EventHandlers type="{WhiteboardDrawEvent.UNDO_SHAPE}" >
<MethodInvoker generator="{DrawProxy}" method="undoShape" />
</EventHandlers>
<EventHandlers type="{WhiteboardUpdate.BOARD_UPDATED}">
<MethodInvoker generator="{PageManager}" method="addShapeToPage" arguments="{event}" />
</EventHandlers>
<EventHandlers type="{WhiteboardUpdate.SHAPE_UNDONE}" >
<MethodInvoker generator="{PageManager}" method="undoShapeFromPage" />
</EventHandlers>
<EventHandlers type="{WhiteboardUpdate.BOARD_CLEARED}" >
<MethodInvoker generator="{PageManager}" method="clearPage" />
</EventHandlers>
<EventHandlers type="{PageEvent.CHANGE_PAGE}" >
<MethodInvoker generator="{DrawProxy}" method="getPageHistory" arguments="{event}" />
</EventHandlers>
<EventHandlers type="{PageEvent.LOAD_PAGE}" >
<MethodInvoker generator="{PageManager}" method="loadPage" arguments="{event}" />
</EventHandlers>
<EventHandlers type="{WhiteboardButtonEvent.WHITEBOARD_ADDED_TO_PRESENTATION}" >
<MethodInvoker generator="{WhiteboardManager}" method="positionToolbar" arguments="{event}" />
</EventHandlers>
<EventHandlers type="{AddOverlayCanvasEvent.ADD_OVERLAY_CANVAS}" >
<InlineInvoker method="dummyMethod" />
</EventHandlers>
<EventHandlers type="{WindowResizedEvent.PRESENTATION_WINDOW_RESIZED_EVENT}">
<InlineInvoker method="dummyMethod" />
</EventHandlers>
<EventHandlers type="{AddButtonToPresentationEvent.ADD_BUTTON}">
<InlineInvoker method="dummyMethod" />
</EventHandlers>
<EventHandlers type="{NavigationEvent.GOTO_PAGE}">
<InlineInvoker method="dummyMethod" />
</EventHandlers>
<EventHandlers type="{PresentationEvent.PRESENTATION_LOADED}">
<InlineInvoker method="dummyMethod" />
</EventHandlers>
</EventMap>

View File

@ -25,7 +25,6 @@
<![CDATA[
import mx.controls.Alert;
import mx.events.FlexEvent;
import org.bigbluebutton.main.events.ModuleStartedEvent;
import org.bigbluebutton.modules.present.events.AddButtonToPresentationEvent;
import org.bigbluebutton.modules.present.events.AddOverlayCanvasEvent;
@ -129,4 +128,23 @@
<InlineInvoker method="dummyMethod" />
</EventHandlers>
<EventHandlers type="{WhiteboardUpdate.BOARD_CLEARED}" >
<MethodInvoker generator="{WhiteboardManager}" method="clearBoard" arguments="{event}"/>
</EventHandlers>
<EventHandlers type="{WhiteboardUpdate.BOARD_UPDATED}" >
<MethodInvoker generator="{WhiteboardManager}" method="drawSegment" arguments="{event}"/>
</EventHandlers>
<EventHandlers type="{WhiteboardUpdate.SHAPE_UNDONE}" >
<MethodInvoker generator="{WhiteboardManager}" method="undoShape" arguments="{event}" />
</EventHandlers>
<EventHandlers type="{PageEvent.CHANGE_PAGE}" >
<MethodInvoker generator="{WhiteboardManager}" method="changePage" arguments="{event}" />
</EventHandlers>
<EventHandlers type="{WhiteboardButtonEvent.ENABLE_WHITEBOARD}" >
<MethodInvoker generator="{WhiteboardManager}" method="enableWhiteboard" arguments="{event}" />
</EventHandlers>
<EventHandlers type="{WhiteboardButtonEvent.DISABLE_WHITEBOARD}" >
<MethodInvoker generator="{WhiteboardManager}" method="disableWhiteboard" arguments="{event}" />
</EventHandlers>
</EventMap>

View File

@ -25,9 +25,7 @@
mouseOver="setCursor()" mouseOut="removeCursor()" implements="org.bigbluebutton.common.IBbbCanvas">
<mx:Script>
<![CDATA[
import mx.collections.ArrayCollection;
import mx.controls.Alert;
import mx.core.Application;
import mx.managers.CursorManager;
@ -35,6 +33,7 @@
import org.bigbluebutton.common.Images;
import org.bigbluebutton.common.LogUtil;
import org.bigbluebutton.modules.present.events.WindowResizedEvent;
import org.bigbluebutton.modules.whiteboard.WhiteboardCanvasModel;
import org.bigbluebutton.modules.whiteboard.business.shapes.DrawObject;
import org.bigbluebutton.modules.whiteboard.business.shapes.DrawObjectFactory;
import org.bigbluebutton.modules.whiteboard.business.shapes.ShapeFactory;
@ -45,205 +44,49 @@
import org.bigbluebutton.modules.whiteboard.events.WhiteboardUpdate;
import org.bigbluebutton.modules.whiteboard.maps.WhiteboardEventMap;
private var x1:int;
private var y1:int;
private var x2:int;
private var y2:int;
public var d:DrawObject;
private var isDrawing:Boolean;
private var sending:Boolean = false;
private var feedback:Shape = new Shape();
private var latentFeedbacks:ArrayCollection = new ArrayCollection();
private var segment:Array = new Array();
private var newShape:Shape = new Shape();
private var shapeList:Array = new Array();
protected var drawFactory:DrawObjectFactory;
protected var shapeFactory:ShapeFactory;
protected var bbbCanvas:IBbbCanvas;
protected var shapeStyle:String = DrawObject.PENCIL;
protected var drawColor:uint = 0x000000;
protected var thickness:uint = 1;
public var model:WhiteboardCanvasModel;
private var bbbCanvas:IBbbCanvas;
private var _xPosition:int;
private var _yPosition:int;
private var images:Images = new Images();
[Bindable] private var pencil_icon:Class = images.pencil_icon;
private var whiteboardEnabled:Boolean = false;
private var showWhiteboard:Boolean = true;
private var drawTimer:Timer;
private function init():void{
drawFactory = new DrawObjectFactory();
shapeFactory = new ShapeFactory();
this.label = "Highlighter";
}
/**
*Method is invoked when the mouse is released
*<p>
*The method finalizes the shape that was being edited. The shape is then sent as
*an event, which updates all client views.
*<p>
*The method also deleted the temporary feedback shape from the screen.
*/
private function doMouseUp():void{
isDrawing = false;
sendShapeToServer();
if (drawTimer != null) drawTimer.stop();
private function doMouseUp():void {
model.doMouseUp();
}
private function onDrawTimer(e:TimerEvent):void{
if (this.shapeStyle != DrawObject.PENCIL) return;
var startX:Number = segment[segment.length - 2] as Number;
var startY:Number = segment[segment.length - 1] as Number;
sendShapeToServer();
startShape(startX,startY);
LogUtil.debug("StartShape from onDrawTimer: "+startX+" "+startY);
}
private function sendShapeToServer():void{
if (segment.length == 0) return;
this.d = drawFactory.makeDrawObject(this.shapeStyle, segment, this.drawColor, this.thickness);
this.d.parentHeight = this.height;
this.d.parentWidth = this.width;
var event:WhiteboardDrawEvent = new WhiteboardDrawEvent(WhiteboardDrawEvent.SEND_SHAPE);
event.message = d;
dispatchEvent(event);
latentFeedbacks.addItem(feedback);
feedback = new Shape();
segment = new Array();
}
/**
*Method is invoked when the mouse is pressed
*<p>
*The method captures the x and y coordinates of the mouse click and uses the point as
*the starting point in a shape
*/
private function doMouseDown():void{
x1 = this.mouseX;
y1 = this.mouseY;
startShape(x1, y1);
drawTimer = new Timer(1000, 0);
drawTimer.addEventListener(TimerEvent.TIMER, onDrawTimer);
drawTimer.start();
model.doMouseDown(this.mouseX, this.mouseY);
}
private function startShape(startX:Number, startY:Number):void{
isDrawing = true;
segment.push(startX);
segment.push(startY);
rawChildren.addChild(feedback);
}
/**
*Method is invoked when the mouse is moved over the canvas
*<p>
*The method captures the x and y coordinates of the mouse, adding the points to the current
*shape being drawn.
*<p>
*Note: The method only works if the mouse is pressed, otherwise does nothing.
*/
private function doMouseMove():void{
if (isDrawing){
x2 = this.mouseX;
y2 = this.mouseY;
segment.push(x2);
segment.push(y2);
rawChildren.removeChild(feedback);
feedback = shapeFactory.makeFeedback(segment,this.shapeStyle, this.drawColor, this.thickness);
rawChildren.addChild(feedback);
x1 = x2;
y1 = y2;
}
model.doMouseMove(this.mouseX, this.mouseY);
}
/**
* Draws the segment stored in the drawVO Value Object
* <p>
* This method is executed by the BoardMediator upon reception of an Update request. The method
* is executed on all clients, even the one which sent the update request.
*/
public function drawSegment(event:WhiteboardUpdate):void{
var o:DrawObject = event.data;
draw(o);
public function sendShapeToServer(dobj:DrawObject):void{
var event:WhiteboardDrawEvent = new WhiteboardDrawEvent(WhiteboardDrawEvent.SEND_SHAPE);
event.message = dobj;
dispatchEvent(event);
}
private function draw(o:DrawObject):void{
for( var i:int = 0; i<latentFeedbacks.length;i++){
var tempshape:Shape = latentFeedbacks.getItemAt(i) as Shape;
if(rawChildren.contains(tempshape))
{
rawChildren.removeChild(tempshape);
latentFeedbacks.removeItemAt(i);
}
}
newShape = shapeFactory.makeShape(o);
newShape.width = newShape.width * (this.width/o.parentWidth);
newShape.height = newShape.height * (this.height/o.parentHeight);
shapeList.push(newShape);
//rawChildren.addChild(shapeList[shapeList.length-1]);
bbbCanvas.addRawChild(shapeList[shapeList.length-1]);
newShape = new Shape();
}
/**
* Sets the type of shape we're drawing (pencil, rectangle, etc...)
* @param s The type
*
*/
public function setShape(s:String):void{
this.shapeStyle = s;
model.setShape(s);
}
/**
* Sets the color
* @param e event containing the color (e.target.selectedColor)
*
*/
public function changeColor(e:Event):void{
drawColor = e.target.selectedColor;
model.changeColor(e.target.selectedColor);
}
/**
* Sets the thickness
* @param e event containing the thickness (e.target.value)
*
*/
public function changeThickness(e:Event):void{
this.thickness = e.target.value;
}
/**
* Clears the entire board
*/
public function clearBoard(event:WhiteboardUpdate = null):void{
for (var i:Number = 0; i<this.shapeList.length; i++){
if (this.bbbCanvas.doesContain(this.shapeList[i])){
this.bbbCanvas.removeRawChild(this.shapeList[i]);
}
}
this.shapeList = new Array();
}
public function undoShape(event:WhiteboardUpdate):void{
if (this.shapeList.length > 0){
this.bbbCanvas.removeRawChild(this.shapeList[this.shapeList.length-1]);
shapeList.pop();
}
model.changeThickness(e.target.value);
}
public function get xPosition():int {
@ -262,20 +105,6 @@
_yPosition = y;
}
private function scaleCanvas(e:WindowResizedEvent):void{
zoomCanvas(e.width, e.height);
}
private function changePage(e:PageEvent):void{
var page:Number = e.pageNum;
var shapes:ArrayCollection = e.shapes;
clearBoard();
for (var i:int = 0; i<shapes.length; i++){
var o:DrawObject = shapes.getItemAt(i) as DrawObject;
draw(o);
}
}
private function setWhiteboardVisibility():void{
if (this.whiteboardEnabled && this.showWhiteboard) this.visible = true;
else this.visible = false;
@ -292,38 +121,48 @@
/** Inherited from org.bigbluebutton.common.IBbbCanvas*/
public function addRawChild(child:DisplayObject):void{
this.rawChildren.addChild(child);
this.bbbCanvas.addRawChild(child);
}
public function removeRawChild(child:DisplayObject):void{
this.rawChildren.removeChild(child);
this.bbbCanvas.removeRawChild(child);
}
public function doesContain(child:DisplayObject):Boolean{
return this.rawChildren.contains(child);
return bbbCanvas.doesContain(child);
}
public function acceptOverlayCanvas(overlay:IBbbCanvas):void{
LogUtil.debug("WhiteboardCanvas::acceptOverlayCanvas()");
LogUtil.debug("OVERLAYING PRESENTATION CANVAS");
this.bbbCanvas = overlay;
//Load existing shapes onto the canvas.
dispatchEvent(new PageEvent(PageEvent.LOAD_PAGE));
}
public function moveCanvas(x:int, y:int):void{
public function moveCanvas(x:Number, y:Number):void {
this.x = x;
this.y = y;
}
public function zoomCanvas(width:int, height:int):void{
for (var i:int = 0; i<this.shapeList.length; i++){
var s:Shape = this.shapeList[i] as Shape;
s.width = s.width * (width /this.width);
s.height = s.height * (height /this.height);
public function getMouseXY():Array {
return [this.mouseX, this.mouseY];
}
public function removeShape(child:DisplayObject):void {
if (bbbCanvas == null) return;
if (doesContain(child)) removeRawChild(child);
}
public function addShape(child:DisplayObject):void {
if (bbbCanvas == null) return;
addRawChild(child);
}
public function zoomCanvas(width:Number, height:Number):void {
this.width = width;
this.height = height;
model.zoomCanvas(width, height);
}
public function showCanvas(show:Boolean):void{
@ -333,29 +172,20 @@
/** End IBBBCanvas*/
public function isPageEmpty():Boolean{
return (this.shapeList.length == 0);
public function isPageEmpty():Boolean {
return model.isPageEmpty();
}
private function enableWhiteboard(e:WhiteboardButtonEvent):void{
public function enableWhiteboard(e:WhiteboardButtonEvent):void{
this.whiteboardEnabled = true;
setWhiteboardVisibility();
}
private function disableWhiteboard(e:WhiteboardButtonEvent):void{
public function disableWhiteboard(e:WhiteboardButtonEvent):void{
this.whiteboardEnabled = false;
setWhiteboardVisibility();
}
]]>
</mx:Script>
<mate:Debugger level="{Debugger.ALL}" />
<mate:Listener type="{WhiteboardUpdate.BOARD_CLEARED}" method="clearBoard" />
<mate:Listener type="{WhiteboardUpdate.BOARD_UPDATED}" method="drawSegment" />
<mate:Listener type="{WhiteboardUpdate.SHAPE_UNDONE}" method="undoShape" />
<mate:Listener type="{WindowResizedEvent.PRESENTATION_WINDOW_RESIZED_EVENT}" method="scaleCanvas" />
<mate:Listener type="{PageEvent.CHANGE_PAGE}" method="changePage" />
<mate:Listener type="{WhiteboardButtonEvent.ENABLE_WHITEBOARD}" method="enableWhiteboard" />
<mate:Listener type="{WhiteboardButtonEvent.DISABLE_WHITEBOARD}" method="disableWhiteboard" />
</mx:Canvas>

View File

@ -41,13 +41,15 @@
# 2010-02-28 FFD Fixed #834
# 2011-06-26 FFD Updates for 0.8
# 2012-01-14 FFD Tsting the development environment for 0.8
# 2012-02-22 FFD Updates to development environment
#set -x
##set -x
#set -e
PATH=$PATH:/sbin
FREESWITCH_INIT_D="/etc/init.d/bbb-freeswitch"
BBB_VERSION="0.8-beta-4"
source /etc/bigbluebutton/bigbluebutton-release
if [ ! -f /usr/share/red5/webapps/bigbluebutton/WEB-INF/red5-web.xml ]; then
echo "#"
@ -132,17 +134,6 @@ check_file() {
fi
}
is_vm() {
#
# Is the the BigBlueButton VM?
#
if [ -f /home/firstuser/.profile ]; then
echo $(cat /home/firstuser/.profile | grep BigBlueButton)
fi
}
print_header() {
if [ ! $HEADER ]; then
echo
@ -171,7 +162,7 @@ need_root() {
usage() {
echo "BigBlueButton Configuration Utility - Version $BBB_VERSION"
echo "BigBlueButton Configuration Utility - Version $BIGBLUEBUTTON_RELEASE"
echo "http://code.google.com/p/bigbluebutton/wiki/BBBConf"
echo
echo " bbb-conf [options]"
@ -179,14 +170,13 @@ usage() {
echo "Configuration:"
echo " --version Display BigBlueButton version (packages)"
echo " --setip <host> Set IP/hostname for BigBlueButton"
echo " --setfreeswtichip <host> Set IP for FreeSWITCH"
echo " --setsalt <salt> Change the security salt in bigbluebutton.properties"
echo
echo "Monitoring:"
echo " --check <verbose> Check configuration files and processes for problems"
echo " --check Check configuration files and processes for problems"
echo " --debug Scan the log files for error messages"
echo " --watch Scan the log files for error messages every 2 seconds"
echo " --salt View the URL and security salt for the server"
echo " --salt View the URL and salt (shared secret) for the server"
echo
echo "Administration:"
echo " --restart Restart BigBueButton"
@ -195,13 +185,11 @@ usage() {
echo " --clean Restart and clean all log files"
echo " --zip Zip up log files for reporting an error"
echo
if [ "$(is_vm)" ]; then
echo "Development:"
echo " --setup-samba Setup samba share for development (VM only)"
echo " --checkout <repo> Checkout from github or passed in repository"
echo " --setup-dev [client|web|apps] Setup development environment "
echo " --setup-samba Setup samba share for current users"
echo " --setup-dev [tools|client|web|apps] Setup development environment "
echo " --reset-dev Reset environment back to using packages"
fi
echo
}
@ -363,6 +351,41 @@ display_bigbluebutton_status () {
/etc/init.d/${SERVLET_CONTAINER} status
}
check_tools() {
if [ ! -d $1 ]; then
echo
echo "# Error: You haven't installed the development tools yet."
echo "# Run:"
echo "# bbb-conf --setup-dev tools "
echo
exit 1
else
echo "# Found dev tools at $1"
fi
}
check_source() {
mkdir -p $HOME/dev
if [ ! -d $1 ]; then
echo
echo "# You need to clone the BigBlueButton source from GitHub into"
echo "#"
echo "# $HOME/dev"
echo "#"
echo "# After cloning you should have the folder"
echo "#"
echo "# $HOME/dev/bigbluebutton"
echo "#"
echo "# For more information, see:"
echo "# http://code.google.com/p/bigbluebutton/wiki/08SettingDevEnvironment"
echo
exit 1
else
echo "# Found source at $1"
fi
}
if [ $# -eq 0 ]; then
usage
exit 1
@ -440,17 +463,6 @@ while [ $# -gt 0 ]; do
continue
fi
if [ "$1" = "--checkout" -o "$1" = "-checkout" ]; then
echo "# Request to checkout BigBlueButton"
if [ $# -lt 2 ]; then
CHECKOUT="git://github.com/bigbluebutton/bigbluebutton.git"
else
CHECKOUT="${2}"
fi
shift; shift
continue
fi
#
# all other parameters requires at least 1 argument
#
@ -463,7 +475,6 @@ while [ $# -gt 0 ]; do
if echo $HOST|grep -q ":"; then
HOST=`echo ${2}|cut -d: -f1`
PORT=`echo ${2}|cut -d: -f2`
fi
shift; shift
continue
@ -511,15 +522,6 @@ while [ $# -gt 0 ]; do
continue
fi
if [ "$1" = "-setfreeswitchip" -o "$1" = "--setfreeswitchip" ]; then
if test -z "${2}"; then
usage;
fi
FREESWITCHIP="${2}"
shift; shift
continue
fi
usage
exit 1
done
@ -547,14 +549,6 @@ if [ $SALT ]; then
echo
fi
if [ $FREESWITCHIP ]; then
need_root
change_var_ip /usr/share/red5/webapps/sip/WEB-INF/bigbluebutton-sip.properties sip.server.host $FREESWITCHIP
echo "Changed the value for sip.server.host to $FREESWITCHIP"
echo
CLEAN=1
fi
#
# Setup samba
#
@ -604,169 +598,262 @@ you can map the above path to a drive letter.
fi
#
# Setup the development environemnt.
#
if [ $CHECKOUT ]; then
if [ $SETUPDEV ]; then
check_root
# This is a step towards setting up a development environment on a non-BigBlueButton VM
#
# Setup the development tools
#
if [ $SETUPDEV == "tools" ]; then
#
# Check for core development tools
#
if ! which git > /dev/null; then
echo "# Installing git and ant"
sudo apt-get install git-core -y --force-yes
fi
if ! which ant > /dev/null; then
echo "# Installing git and ant"
sudo apt-get install ant -y --force-yes
fi
BBBSRCGIT="$HOME/dev/source/bigbluebutton"
if [ -d $BBBSRCGIT ]; then
echo "# "
echo "# Looks like you already have $BBBSRCGIT. Your good to go."
echo "# "
exit
if ! which javac > /dev/null; then
sudo apt-get install openjdk-6-jdk -y --force-yes
fi
mkdir -p $HOME/dev/source
BASE=~/dev/tools
mkdir -p $BASE
#
# Check for BigBlueButton-specific development tools
#
TOOLS="gradle-0.8 grails-1.1.1 groovy-1.6.5"
for tool in $TOOLS; do
if [ ! -d $BASE/$tool ]; then
cd $BASE
if [ ! -f $tool.tar.gz ]; then
wget http://bigbluebutton.googlecode.com/files/$tool.tar.gz
fi
echo "Installing $tool to $BASE/$tool"
tar xvfz $tool.tar.gz
fi
done
echo "# Changing to the dev directory"
cd $HOME/dev/source
if [ ! -f $BASE/flex-4.5.0.20967/flex-sdk-description.xml ]; then
cd $BASE
if [ ! -f flex_sdk_4.5.0.20967_mpl.zip ]; then
wget http://fpdownload.adobe.com/pub/flex/sdk/builds/flex4.5/flex_sdk_4.5.0.20967_mpl.zip
fi
mkdir -p $BASE/flex-4.5.0.20967
cd $BASE/flex-4.5.0.20967
unzip $BASE/flex_sdk_4.5.0.20967_mpl.zip
#
# The permissions are not in good shape, so let's fix them
#
sudo find $BASE/flex-4.5.0.20967 -type d -exec chmod o+rx '{}' \;
chmod 755 $BASE/flex-4.5.0.20967/bin/*
sudo chmod -R +r $BASE/flex-4.5.0.20967
#sudo chmod o+w /usr/share/flex-4.5.0.20967/frameworks/projects/framework/bundles
fi
echo "#"
echo "# Cloning the BigBlueButton GIT source"
echo "#"
git clone $CHECKOUT
cd $HOME/dev/source/bigbluebutton
echo " Checking out version $BBB_VERSION "
#git checkout -b 0.7-release-workspace v0.7
#git checkout -b 0.7-release-workspace v0.7
echo "#"
echo "# Done"
echo "#"
echo "# You can now run 'bbb-conf --setup-dev [client|web|apps]' to setup dev environment "
echo
fi
if [ $SETUPDEV ]; then
check_root
if [ ! -d $HOME/dev/source/bigbluebutton ]; then
echo "# "
echo "*** ERROR: You haven't checked-out BigBlueButton source yet. Please run 'bbb-conf --checkout' first. "
echo "# "
exit 1
if [ ! -L $BASE/flex ]; then
ln -s $BASE/flex-4.5.0.20967 $BASE/flex
fi
if [ ! -f $BASE/flex-4.5.0.20967/frameworks/libs/player/10.3/playerglobal.swc ]; then
mkdir -p $BASE/flex-4.5.0.20967/frameworks/libs/player/10.3
cd $BASE/flex-4.5.0.20967/frameworks/libs/player/10.3
if [ ! -f playerglobal10_3.swc ]; then
wget http://fpdownload.macromedia.com/pub/flashplayer/updaters/10/playerglobal10_3.swc
fi
mv -f playerglobal10_3.swc playerglobal.swc
fi
if ! grep -q GROOVY_HOME ~/.profile; then
echo "
#
# BigBlueButton: Setup development environment
export GROOVY_HOME=$HOME/dev/tools/groovy-1.6.5
export PATH=\$PATH:\$GROOVY_HOME/bin
export GRAILS_HOME=$HOME/dev/tools/grails-1.1.1
export PATH=\$PATH:\$GRAILS_HOME/bin
export FLEX_HOME=$HOME/dev/tools/flex
export PATH=\$PATH:\$FLEX_HOME/bin
export GRADLE_HOME=$HOME/dev/tools/gradle-0.8
export PATH=\$PATH:\$GRADLE_HOME/bin
export JAVA_HOME=/usr/lib/jvm/java-6-openjdk
export ANT_OPTS=\"-Xmx512m -XX:MaxPermSize=512m\"
" >> ~/.profile
fi
if [ ! -n "$GROOVY_HOME" ]; then
echo "
# Finished setting up your development environment variables in
#
# $HOME/.profile
#
# Before you continue, you need to load them into your environment.
# Do the following
#
# source ~/.profile
#
# You then need to checkout the source for BigBlueButton. See
#
# http://code.google.com/p/bigbluebutton/wiki/08SettingDevEnvironment
#
"
exit 0
fi
fi
check_tools ~/dev/tools
check_source ~/dev/bigbluebutton
#
# Now, setup the specific development environment
#
if [ $SETUPDEV == "web" ]; then
BBBWEBHOME=$HOME/dev/source/bigbluebutton/bigbluebutton-web
if [ ! -d $BBBWEBHOME ]; then
echo "# "
echo "*** ERROR: Cannot find ${BBBWEBHOME} "
echo "*** ERROR: You haven't checked-out BigBlueButton source yet. Please run 'bbb-conf --checkout' first. "
echo "# "
exit 1
fi
BBBWEBHOME=$HOME/dev/bigbluebutton/bigbluebutton-web
check_source $BBBWEBHOME
echo "# Copying the bigbluebutton.properites in ${SERVLET_DIR}/bigbluebutton/WEB-INF/classes/bigbluebutton.properties to ~/.grails/bigbluebutton-config.properties"
mkdir -p $HOME/.grails
cp ${SERVLET_DIR}/bigbluebutton/WEB-INF/classes/bigbluebutton.properties $HOME/.grails/bigbluebutton-config.properties
cp ${SERVLET_DIR}/bigbluebutton/WEB-INF/classes/bigbluebutton.properties $BBBWEBHOME/grails-app/conf
echo "# Copying the bbb_api_conf.jsp into ${SERVLET_DIR}/bigbluebutton/WEB-INF/classes/bigbluebutton.properties to ${BBBWEBHOME}/web-app/demo"
cp ${SERVLET_DIR}/demo/bbb_api_conf.jsp ${BBBWEBHOME}/web-app/demo
echo "# Enabling $USER to write to /var/bigbluebutton to upload slides"
# Enabling $USER to write to /var/bigbluebutton to upload slides
sudo chmod -R ugo+rwx /var/bigbluebutton
echo "# Enabling $USER to write to /var/log/bigbluebutton to write log files"
# Enabling $USER to write to /var/log/bigbluebutton to write log files
sudo chmod -R ugo+rwx /var/log/bigbluebutton
echo "# Resolving dependencies"
# Resolving dependencies
cd $BBBWEBHOME
gradle resolveDeps
if [ ! -f /etc/bigbluebutton/nginx/web_dev ]; then
echo "
# Handle request to bbb-web running within Tomcat. This is for
# the BBB-API and Presentation.
location /bigbluebutton {
proxy_pass http://127.0.0.1:8888;
proxy_redirect default;
proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
# Allow 30M uploaded presentation document.
client_max_body_size 30m;
client_body_buffer_size 128k;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
include fastcgi_params;
}
" | sudo tee /etc/bigbluebutton/nginx/web_dev > /dev/null 2>&1
fi
#sudo rm /etc/bigbluebutton/nginx/web.nginx
sudo ln -s -f /etc/bigbluebutton/nginx/web_dev /etc/bigbluebutton/nginx/web.nginx
sudo /etc/init.d/nginx restart
echo "
# Done. To run your local build of bbb-web:
sudo /etc/init.d/${SERVLET_CONTAINER} stop
cd ${BBBWEBHOME}
ant
grails -Dserver.port=8888 run-app
## Note ##
You'll get an error running the above the first time. Just cancel and run again.
"
fi
if [ $SETUPDEV == "client" ]; then
BBBCLIENTHOME=$HOME/dev/source/bigbluebutton/bigbluebutton-client
if [ ! -d $BBBCLIENTHOME ]; then
echo "# "
echo "*** ERROR: Cannot find ${BBBCLIENTHOME} "
echo "*** ERROR: You haven't checked-out BigBlueButton source yet. Please run 'bbb-conf --checkout' first. "
echo "# "
exit 1
fi
BBBCLIENTHOME=$HOME/dev/bigbluebutton/bigbluebutton-client
check_source $BBBCLIENTHOME
#
# Setup the directories so we can point /etc/nginx/sites-available/bigbluebutton to this
# local copy of the client
# Setup initial values from the working environment
#
if [ ! -d $BBBCLIENTHOME/bin ]; then
mkdir -p $BBBCLIENTHOME/bin
fi
cp /var/www/bigbluebutton/client/conf/config.xml $BBBCLIENTHOME/src/conf/config.xml
cp $BBBCLIENTHOME/resources/dev/join-mock.xml $BBBCLIENTHOME/src/conf/join-mock.xml
if [ ! -d $BBBCLIENTHOME/conf ]; then
mkdir -p $BBBCLIENTHOME/bin/conf
fi
#
# We're going to create a symbolic link to the new location for BigBlueButton client
#
if [ ! -f /etc/bigbluebutton/nginx/client_dev ]; then
echo "
location /client/BigBlueButton.html {
root $BBBCLIENTHOME;
index index.html index.htm;
expires 1m;
}
if [ ! -h $BBBCLIENTHOME/client ]; then
# BigBlueButton Flash client.
location /client {
root $BBBCLIENTHOME;
index index.html index.htm;
}
" | sudo tee /etc/bigbluebutton/nginx/client_dev > /dev/null 2>&1
fi
sudo ln -f -s /etc/bigbluebutton/nginx/client_dev /etc/bigbluebutton/nginx/client.nginx
if [ ! -L $BBBCLIENTHOME/client ]; then
ln -s $BBBCLIENTHOME/bin $BBBCLIENTHOME/client
fi
echo "Modifying /etc/nginx/sites-available/bigbluebutton to point to your local copy of bbb-client"
sudo sed -i "s/\/var\/www\/bigbluebutton;/\/home\/firstuser\/dev\/source\/bigbluebutton\/bigbluebutton-client;/g" \
/etc/nginx/sites-available/bigbluebutton
echo
sudo /etc/init.d/nginx restart
echo "# Copying /var/www/bigbluebutton/client/conf/config.xml to ${BBBCLIENTHOME}/src/conf/config.xml"
cp /var/www/bigbluebutton/client/conf/config.xml $BBBCLIENTHOME/src/conf/config.xml
echo "# Copying ${BBBCLIENTHOME}/resources/dev/join-mock.xml to ${BBBCLIENTHOME}/src/conf/join-mock.xml"
cp $BBBCLIENTHOME/resources/dev/join-mock.xml $BBBCLIENTHOME/src/conf/join-mock.xml
if [ ! -d /var/bigbluebutton/conference-mock-default/conference-mock-default/room-mock-default ]; then
echo "# Creating /var/bigbluebutton/conference-mock-default/conference-mock-default/room-mock-default"
sudo mkdir -p /var/bigbluebutton/conference-mock-default/conference-mock-default/room-mock-default
echo "# chown /var/bigbluebutton/conference-mock-default to tomcat6"
sudo chown -R tomcat6:tomcat6 /var/bigbluebutton/conference-mock-default
fi
# xxx
#if [ ! -d /var/bigbluebutton/conference-mock-default/conference-mock-default/room-mock-default ]; then
# echo "# Creating /var/bigbluebutton/conference-mock-default/conference-mock-default/room-mock-default"
# sudo mkdir -p /var/bigbluebutton/conference-mock-default/conference-mock-default/room-mock-default
# echo "# chown /var/bigbluebutton/conference-mock-default to tomcat6"
# sudo chown -R tomcat6:tomcat6 /var/bigbluebutton/conference-mock-default
#fi
cd $BBBCLIENTHOME
echo "
# Done. To build your local build of bbb-client:
# Setup of development for bigbluebutton-client complete.
#
# 1. Build the language files. (You need only do this once unless
# you change the language files in the future.)
#
# cd ${BBBCLIENTHOME}
# ant locales
#
# 2. Modify the source for the client. The source is locatedt at
#
# $BBBCLIENTHOME
#
# 3. Build the client
#
# cd ${BBBCLIENTHOME}
# ant
cd ${BBBCLIENTHOME}
ant
# The nginx server now loads the BigBlueButton Flash client from
# ${BBBCLIENTHOME}.
"
fi
if [ $SETUPDEV == "apps" ]; then
BBBAPPSHOME=~/dev/source/bigbluebutton/bigbluebutton-apps
if [ ! -d $BBBAPPSHOME ]; then
echo "# "
echo "*** ERROR: Cannot find ${BBBAPPSHOME} "
echo "*** ERROR: You haven't checked-out BigBlueButton source yet. Please run 'bbb-conf --checkout' first. "
echo "# "
exit 1
fi
BBBAPPSHOME=~/dev/bigbluebutton/bigbluebutton-apps
check_source $BBBAPPSHOME
#
# We're going to make it easier to deploy by giving write access to others to
@ -781,29 +868,13 @@ if [ $SETUPDEV ]; then
sudo apt-get purge --yes bbb-apps
fi
if [ ! -f ~/.bbb-apps-build.properties ]; then
echo "#
# Override the default properties for bbb-apps
#
red5.home = $RED5_DIR
" > ~/.bbb-apps-build.properties
fi
if [ ! -L /etc/nginx/sites-enabled/bigbluebutton ]; then
echo " No symbolic link in /etc/nginx/sites-enabled/bigbluebutton to /etc/nginx/sites-available/bigbluebutton "
sudo ln -s /etc/nginx/sites-available/bigbluebutton /etc/nginx/sites-enabled/bigbluebutton
fi
#
# Setup the directories so we can point /etc/nginx/sites-available/bigbluebutton to this
# local copy of the client
#
echo "
# Done. To run your local build of bbb-apps:
sudo /etc/init.d/red5 stop
cd ${BBBAPPSHOME}
gradle war deploy
gradle resolveDeps
gradle clean war deploy
cd $RED5_DIR
sudo -u red5 ./red5.sh
@ -821,8 +892,9 @@ if [ $RESET_DEV ]; then
check_root
echo "Reseting /etc/nginx/sites-available/bigbluebutton to point to /var/www/bigbluebutton"
sudo sed -i "s/\/home\/firstuser\/dev\/source\/bigbluebutton\/bigbluebutton-client;/\/var\/www\/bigbluebutton;/g" \
/etc/nginx/sites-available/bigbluebutton
sudo rm /etc/bigbluebutton/nginx/client.nginx
sudo ln -s /etc/bigbluebutton/nginx/client /etc/bigbluebutton/nginx/client.nginx
sudo /etc/init.d/nginx restart
fi
@ -955,16 +1027,19 @@ $RED5_DIR/webapps/sip/WEB-INF/bigbluebutton-sip.properties"
SALT_DEMO=$(cat ${SERVLET_DIR}/demo/bbb_api_conf.jsp | tr -d '\r' | sed -n '/salt[ ]*=/{s/.*=[ ]*"//;s/".*//g;p}')
if [ "$SALT_PROPERTIES" != "$SALT_DEMO" ]; then
echo "# API Salt mismatch: "
echo "# Warning: API Salt mismatch: "
echo "# ${SERVLET_DIR}/bigbluebutton/WEB-INF/classes/bigbluebutton.properties=$SALT_PROPERTIES"
echo "# ${SERVLET_DIR}/demo/bbb_api_conf.jsp=$SALT_DEMO"
echo
fi
API_IP=$(cat ${SERVLET_DIR}/demo/bbb_api_conf.jsp | sed -n '/String BigBlueButtonURL/{s/.*http:\/\///;s/\/.*//;p}' | tr -d '\015')
if [ "$IP" != "$API_IP" ]; then
echo "# API URL IPs do not match host:"
echo "# Warning: API URL IPs do not match host:"
echo "#"
echo "# IP from ifconfig: $IP"
echo "# ${SERVLET_DIR}/demo/bbb_api_conf.jsp: $API_IP"
echo
fi
fi
@ -1072,10 +1147,26 @@ check_state() {
#
# Check if running development environment
#
if grep -v \# /etc/nginx/sites-available/bigbluebutton | grep /home/firstuser/dev/source/bigbluebutton/bigbluebutton-client > /dev/null; then
if ! grep /var/www/bigbluebutton /etc/bigbluebutton/nginx/client.nginx > /dev/null; then
NEW_LOCATION=$(cat /etc/bigbluebutton/nginx/client.nginx | sed -n '/root/{s/[ \t]*root[ \t]*//;s/;//;p}' | head -n 1)
echo "# Warning: nginx is not serving the client from /var/www/bigbluebutton/."
echo "# Instead, it's being served from"
echo "#"
echo "# $NEW_LOCATION"
echo "#"
echo "# (This is OK if you have setup a development environment.) "
echo
fi
#
# Check if running development environment
#
if ! grep 8080 /etc/bigbluebutton/nginx/web.nginx > /dev/null; then
echo "# Warning: nginx is not serving BigBlueButton's web application"
echo "# from port 8080"
echo "#"
echo "# (This is OK if you have setup a development environment.) "
echo
echo "# Nginx: serving client from /home/firstuser/dev/source/bigbluebutton/bigbluebutton-client"
echo "# instead of the usual /var/www/bigbluebutton"
fi
@ -1137,9 +1228,12 @@ check_state() {
# Checking if voice app registered with Asterisk successfully
#
if cat /usr/share/red5/log/sip.log | grep -q "Failed to register with Sip Server"; then
echo "# Error: The voice application failed to register with the sip server."
echo "# Try running: "
echo "#"
echo "# sudo bbb-conf --clean"
echo "#"
echo
echo "# The voice application failed to register with the sip server."
echo "# Try running: sudo bbb-conf --clean"
fi
#
@ -1147,10 +1241,12 @@ check_state() {
#
if cat /usr/share/red5/log/sip.log | tail -n1 | grep -q "Call request for default but not registered"; then
echo "# The voice app is not registered with SIP server. Audio might not be working correctly."
echo "# Error: The voice app is not registered with SIP server. Audio might not be working correctly."
echo
fi
else
echo "# No /usr/share/red5/log/sip.log"
echo "# Error: /usr/share/red5/log/sip.log"
echo
fi
#
@ -1173,6 +1269,16 @@ check_state() {
echo "# No $RED5_DIR/log/bigbluebutton.log"
fi
#
# Check if the user is running their own bbb-web
#
if grep -q 8888 /etc/bigbluebutton/nginx/web.nginx; then
if ! netstat -ant | grep '8888' > /dev/null; then
echo "# Warning: There is no application server listening to port 8888."
echo
fi
fi
#
# Check if the local server can access the API. This is a common problem when setting up BigBlueButton behind
@ -1181,12 +1287,15 @@ check_state() {
BBB_WEB=$(cat ${SERVLET_DIR}/bigbluebutton/WEB-INF/classes/bigbluebutton.properties | sed -n '/^bigbluebutton.web.serverURL/{s/.*\///;p}')
check_no_value server_name /etc/nginx/sites-available/bigbluebutton $BBB_WEB
if ! wget http://$BBB_WEB/bigbluebutton/api -O - --quiet | grep -q SUCCESS; then
echo
echo "# This server could not connect to BigBlueButton through http://$BBB_WEB/"
echo "# Error: Could not connect to the configured hostname/IP address"
echo "#"
echo "# http://$BBB_WEB/"
echo "#"
echo "# If your BigBlueButton server is behind a firewall, see FAQ:"
echo "#"
echo "# If you are setting up BigBlueButton behind a firewall, see the FAQ"
echo "# for steps to setup BigBlueButton behind a firewall."
echo "# http://code.google.com/p/bigbluebutton/wiki/FAQ"
echo "#"
echo "# (See entry for setting up BigBlueButton behind a firewall.)"
echo
fi
@ -1195,20 +1304,19 @@ check_state() {
#
if [ ! -z $NGINX_IP ]; then
if ! nc -z -w 3 $NGINX_IP 1935; then
echo "# Error: Unable to connect to port 1935 (RTMP) on $NGINX_IP"
echo
echo "# Unable to connect to port 1935 (RTMP) on $NGINX_IP"
fi
if ! nc -z -w 3 $NGINX_IP 9123; then
echo "# Error: Unable to connect to port 9123 (desktop sharing) on $NGINX_IP"
echo
echo "# Unable to connect to port 9123 (desktop sharing) on $NGINX_IP"
fi
fi
if dpkg -l | grep -q bbb-freeswitch-config; then
if [ "$VOICE_CONFERENCE" == "bbb-voice-asterisk.xml" ]; then
echo
echo "# You have freeswitch installed, but the current voice conference set"
echo "# Error: You have freeswitch installed, but the current voice conference set"
echo "# to asterisk. To switch to freeswitch, enter"
echo "#"
echo "# sudo bbb-conf --conference freeswitch"
@ -1218,37 +1326,39 @@ check_state() {
SIP_SERVER_HOST=$(cat /usr/share/red5/webapps/sip/WEB-INF/bigbluebutton-sip.properties | sed -n '/sip.server.host=/{s/.*=//;s/;//;p}')
if [ $SIP_SERVER_HOST != "127.0.0.1" ]; then
if [ $SIP_SERVER_HOST != $IP ]; then
echo
echo "# The IP address ($SIP_SERVER_HOST) set for sip.server.host in"
echo "# Error: The setting of ($SIP_SERVER_HOST) for sip.server.host in"
echo "#"
echo "# /usr/share/red5/webapps/sip/WEB-INF/bigbluebutton-sip.properties"
echo "#"
echo "# does not match the local IP address ($IP)."
echo
fi
SIP_IP=$(netstat -ant | grep 5060 | awk -F" " '{print $4}' | cut -d: -f1)
SIP_IP=$(netstat -ant | grep 5060 | head -n1 | awk -F" " '{print $4}' | cut -d: -f1)
if [ $SIP_SERVER_HOST != $SIP_IP ]; then
echo
echo "# FreeSWITCH is listening on IP address $SIP_IP for SIP calls, but "
echo "# Error: FreeSWITCH is listening on IP address $SIP_IP for SIP calls, but "
echo "# The IP address ($SIP_SERVER_HOST) set for sip.server.host."
echo "#"
echo "# If your audio is not working (users click the headset icon "
echo "# and don't appear in the Listeners window, try the command"
echo "#"
echo "# sudo bbb-conf --setfreeswitchip $SIP_IP"
echo "#"
echo
fi
fi
else
echo
echo "# You don't have either bbb-freeswitch-config installed. To install"
echo "# Error: You don't have bbb-freeswitch-config installed. To install FreeSWITCH"
echo "#"
echo "# sudo apt-get install bbb-freeswitch-config"
echo "#"
echo
fi
#
# We've not done extensive testing of asterisk in BigBlueButton 0.8
#
if dpkg -l | grep -q bbb-voice-conference; then
if [ "$VOICE_CONFERENCE" == "bbb-voice-freeswitch.xml" ]; then
echo
echo "# You have asterisk installed, but the current voice conference set"
echo "# to freeswitch. To switch to asterisk, enter"
echo "#"
@ -1258,9 +1368,10 @@ check_state() {
SIP_SERVER_HOST=$(cat /usr/share/red5/webapps/sip/WEB-INF/bigbluebutton-sip.properties | sed -n '/sip.server.host=/{s/.*=//;s/;//;p}')
if [ $SIP_SERVER_HOST != "127.0.0.1" ]; then
echo
echo "# The IP address ($SIP_SERVER_HOST) set for sip.server.host in"
echo "#"
echo "# /usr/share/red5/webapps/sip/WEB-INF/bigbluebutton-sip.properties"
echo "#"
echo "# should be 127.0.0.1 for Asterisk."
echo
fi
@ -1268,17 +1379,17 @@ check_state() {
PLAYBACK_IP=$(cat /usr/local/bigbluebutton/core/scripts/slides.yml | sed -n '/playback_host/{s/.*:[ ]*//;s/;//;p}')
if [ $PLAYBACK_IP != $IP ]; then
echo
echo "# The IP address ($PLAYBACK_IP) set for playback_host in"
echo "# Warning: The value ($PLAYBACK_IP) for playback_host in"
echo "#"
echo "# /usr/local/bigbluebutton/core/scripts/slides.yml"
echo "#"
echo "# does not match the local IP address ($IP)."
echo
fi
if [ -d ${SERVLET_DIR}/demo ]; then
if test ${SERVLET_DIR}/demo.war -nt ${SERVLET_DIR}/demo; then
echo
echo "# Tomcat6 didn't deploy the updated demo.war file. To fix:"
echo "# Error: The updated demo.war did not deploy. To manually deploy:"
echo "#"
echo "# sudo touch ${SERVLET_DIR}/demo.war"
echo "#"
@ -1287,7 +1398,6 @@ check_state() {
fi
if grep -q removeMeetingWhenEnded=false $SERVLET_DIR/bigbluebutton/WEB-INF/classes/bigbluebutton.properties; then
echo
echo "# Warning: In"
echo "#"
echo "# $SERVLET_DIR/bigbluebutton/WEB-INF/classes/bigbluebutton.properties"
@ -1303,10 +1413,22 @@ check_state() {
fi
if (( $MEM < 1990 )); then
echo "#"
echo "# Warning: You are running BigBlueButton on a server with less than 2G of memory. Your"
echo "# performance may suffer."
echo
fi
if [ -f /var/lib/tomcat6/webapps/demo/demo1.jsp ]; then
BBB_WEB=$(cat ${SERVLET_DIR}/bigbluebutton/WEB-INF/classes/bigbluebutton.properties | sed -n '/^bigbluebutton.web.serverURL/{s/.*\///;p}')
echo "# Warning: The API demos are installed and accessible from:"
echo "#"
echo "# http://$BBB_WEB/"
echo "#"
echo "# Use the API demos test your BigBlueButton setup. To remove"
echo "#"
echo "# sudo apt-get purge bbb-demo"
echo
fi
exit 0
@ -1320,7 +1442,7 @@ if [ $CHECK ]; then
need_root
echo
echo "BigBlueButton Server $BBB_VERSION"
echo "BigBlueButton Server $BIGBLUEBUTTON_RELEASE"
echo " Kernel version:" `uname -r`
if [ -e /etc/lsb-release ]; then
@ -1355,7 +1477,7 @@ if [ $CHECK ]; then
PORT=$(cat /etc/nginx/sites-available/bigbluebutton | sed -n '/listen/{s/.*listen[ ]*//;s/;//;p}')
echo " port: $PORT"
BBB_CLIENT_DOC_ROOT=$(cat /etc/nginx/sites-available/bigbluebutton | grep \/client -A 1 | head -n 2 | grep root | sed -n '{s/[ ]*root[ ]*//;s/;//;p}')
BBB_CLIENT_DOC_ROOT=$(cat /etc/bigbluebutton/nginx/client.nginx | grep \/client -A 1 | head -n 2 | grep root | sed -n '{s/[ \t]*root[ ]*//;s/;//;p}')
echo " bbb-client dir: $BBB_CLIENT_DOC_ROOT"
BBB_WEB_IP=$(cat ${SERVLET_DIR}/bigbluebutton/WEB-INF/classes/bigbluebutton.properties | sed -n '/^bigbluebutton.web.serverURL/{s/.*\///;p}')
@ -1367,7 +1489,7 @@ if [ $CHECK ]; then
API_IP=$(cat ${SERVLET_DIR}/demo/bbb_api_conf.jsp | sed -n '/String BigBlueButtonURL/{s/.*http:\/\///;s/\/.*//;p}' | tr -d '\015')
echo
echo "${SERVLET_DIR}/demo/bbb_api_conf.jsp (API demos)"
echo " bbb-web-api host: $API_IP"
echo " api url: $API_IP"
fi
if [ $VOICE_CONFERENCE == "bbb-voice-freeswitch.xml" ]; then
@ -1391,6 +1513,7 @@ if [ $CHECK ]; then
#echo
#echo "/usr/share/red5/webapps/sip/WEB-INF/bigbluebutton-sip.properties"
#echo " SIP server host: $SIP_SERVER_HOST"
check_state
echo ""
@ -1614,13 +1737,6 @@ if [ -n "$HOST" ]; then
echo "Assigning $HOST for servername in /etc/nginx/sites-available/bigbluebutton"
sudo sed -i "s/server_name .*/server_name $HOST;/g" /etc/nginx/sites-available/bigbluebutton
#
# Use port for remaining substitutions
#
if [ $PORT ]; then
HOST="$HOST:$PORT"
fi
#
# Update configuration for BigBlueButton client
#
@ -1642,15 +1758,6 @@ if [ -n "$HOST" ]; then
# cat ${SERVLET_DIR}/bigbluebutton/WEB-INF/classes/bigbluebutton.properties
#
# Update nginx
#
if [ $PORT ]; then
echo "Assigning $PORT for listen in /etc/nginx/sites-available/bigbluebutton"
sudo sed -i "s/listen .*/listen $PORT;/g" /etc/nginx/sites-available/bigbluebutton
fi
if ! grep -q server_names_hash_bucket_size /etc/nginx/nginx.conf; then
sudo sed -i "s/gzip on;/gzip on;\n server_names_hash_bucket_size 64;/g" /etc/nginx/nginx.conf
fi
@ -1671,42 +1778,6 @@ if [ -n "$HOST" ]; then
fi
#
# Update Freeswitch config
#
# Not needed -- we can keep this at 127.0.0.1
#
#HOSTIP=$(ifconfig | grep -v '127.0.0.1' | grep -m 1 'inet addr:' | cut -d: -f2 | awk '{ print $1}');
#if [ -f /opt/freeswitch/conf/autoload_configs/event_socket.conf.xml ]; then
# EVENTIP=$(cat /opt/freeswitch/conf/autoload_configs/event_socket.conf.xml | grep 'name="listen-ip"' | cut -d\" -f4 | awk '{print $1}')
# sed -i "s/$EVENTIP/$HOSTIP/g" \
# /opt/freeswitch/conf/autoload_configs/event_socket.conf.xml
#fi
#
# Update bigbluebutton-sip.properties
#
# Not needed -- we can keep this at 127.0.0.1
#
#SIPIP=$(cat /usr/share/red5/webapps/sip/WEB-INF/bigbluebutton-sip.properties | grep 'sip.server.host' | cut -d= -f2)
#if [ -f /usr/share/red5/webapps/sip/WEB-INF/bigbluebutton-sip.properties ]; then
# sed -i "s/$SIPIP/$HOSTIP/g" \
# /usr/share/red5/webapps/sip/WEB-INF/bigbluebutton-sip.properties
#fi
#
#if [ $VOICE_CONFERENCE == "bbb-voice-freeswitch.xml" ]; then
# if [ -f /usr/share/red5/webapps/sip/WEB-INF/bigbluebutton-sip.properties ]; then
# if echo "$HOST" | grep -q -E "[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*"; then
# IP=$HOST
# fi
#
# echo "Assigning $IP for sip.server.host in /usr/share/red5/webapps/sip/WEB-INF/bigbluebutton-sip.properties"
# sudo sed -i "s/sip.server.host=.*/sip.server.host=$IP/g" \
# /usr/share/red5/webapps/sip/WEB-INF/bigbluebutton-sip.properties
# fi
#fi
echo "Restarting the bigbluebutton server ..."
stop_bigbluebutton
echo
@ -1738,6 +1809,9 @@ if [ $CONFERENCE ]; then
fi
fi
#
# Depreciated
#
if [ $CONFERENCE = "meetme" ]; then
if [ ! -f /etc/asterisk/bbb_extensions.conf ]; then
echo
@ -1785,6 +1859,9 @@ if [ $CONFERENCE ]; then
sudo /etc/init.d/red5 restart
fi
#
# Depreciated
#
if [ $CONFERENCE = "app_konference" ]; then
if [ ! -f /etc/asterisk/bbb_extensions.conf ]; then
echo
@ -1854,13 +1931,7 @@ if [ $CONFERENCE ]; then
/usr/share/red5/webapps/bigbluebutton/WEB-INF/red5-web.xml
fi
#if [ -f /opt/freeswitch/conf/autoload_configs/event_socket.conf.xml ]; then
# EVENTIP=$(sudo cat /opt/freeswitch/conf/autoload_configs/event_socket.conf.xml | grep 'name="listen-ip"' | cut -d\" -f4 | awk '{print $1}')
# sed -i "s/$EVENTIP/$IP/g" \
# /opt/freeswitch/conf/autoload_configs/event_socket.conf.xml
#fi
change_var_ip /usr/share/red5/webapps/sip/WEB-INF/bigbluebutton-sip.properties sip.server.host $IP
change_var_ip /usr/share/red5/webapps/sip/WEB-INF/bigbluebutton-sip.properties sip.server.host 127.0.0.1
echo "Switching to $CONFERENCE ... "
if [ -f /etc/init.d/asterisk ]; then

View File

@ -23,12 +23,14 @@
# 2011-08-18 FFD Inital Version
# 2011-11-20 FFD Added more checks for processing of recording
# 2012-01-04 GUG Add option to check for errors
# 2012-02-27 GUG Add option to delete one meeting and recording
set -e
#set -x
BASE=/var/bigbluebutton/recording
STATUS=$BASE/status
source /etc/bigbluebutton/bigbluebutton-release
RECORDING_DIR=$(cat /usr/local/bigbluebutton/core/scripts/bigbluebutton.yml | sed -n '/\(recording_dir\)/{s/.*recording_dir:[ ]*//;s/;//;p}')
PUBLISHED_DIR=$(cat /usr/local/bigbluebutton/core/scripts/bigbluebutton.yml | sed -n '/\(published_dir\)/{s/.*published_dir:[ ]*//;s/;//;p}')
@ -41,7 +43,7 @@ TYPES=$(cd /usr/local/bigbluebutton/core/scripts/process; ls *.rb | sed s/.rb//g
mark_for_rebuild() {
MEETING_ID=$1
set -x
#set -x
for type in $TYPES; do
if [ -d $BASE/process/$type/$MEETING_ID ]; then
rm -rf $BASE/process/$type/$MEETING_ID
@ -75,7 +77,7 @@ mark_for_rebuild() {
done
}
BBB_VERSION=0.8-beta-3
BIGBLUEBUTTON_RELEASE=0.8-beta-4
need_root() {
if [ $EUID != 0 ]; then
@ -84,8 +86,16 @@ need_root() {
fi
}
print_header() {
if [ ! $HEADER ]; then
echo
echo "** Potential problems described below **"
HEADER=1
fi
}
usage() {
echo "BigBlueButton Recording Diagnostic Utility - Version $BBB_VERSION"
echo "BigBlueButton Recording Diagnostic Utility (BigBlueButton Version $BIGBLUEBUTTON_RELEASE)"
echo
echo " bbb-record [options]"
echo
@ -95,8 +105,10 @@ usage() {
echo "Monitoring:"
echo " --watch Watch processing of recordings"
echo " --rebuild [meetingID] rebuild the output for meetingID"
echo " --delete [meetingID] delete one meeting and recording"
echo " --deletall delete all meetings and recordings"
echo " --check check for errors while archiving, processing or publishing recordings"
echo " --debug check for recording errors"
echo " --check check for configuration errors"
echo
}
@ -133,6 +145,18 @@ while [ $# -gt 0 ]; do
shift
continue
fi
if [ "$1" = "-delete" -o "$1" = "--delete" ]; then
need_root
if [ ! -z "${2}" ]; then
MEETING_ID="${2}"
shift
fi
DELETE=1
shift
continue
fi
if [ "$1" = "-deleteall" -o "$1" = "--deleteall" ]; then
need_root
DELETEALL=1
@ -146,6 +170,13 @@ while [ $# -gt 0 ]; do
continue
fi
if [ "$1" = "-debug" -o "$1" = "--debug" ]; then
need_root
DEBUG=1
shift
continue
fi
usage
exit 1
done
@ -165,6 +196,34 @@ if [ $REBUILD ]; then
fi
fi
if [ $DELETE ]; then
if [ ! -z "$MEETING_ID" ]; then
for type in $TYPES; do
rm -rf /var/bigbluebutton/published/$type/$MEETING_ID*
rm -rf /var/bigbluebutton/unpublished/$type/$MEETING_ID*
rm -rf /var/bigbluebutton/recording/process/$type/$MEETING_ID*
rm -rf /var/bigbluebutton/recording/publish/$type/$MEETING_ID*
rm -rf /var/bigbluebutton/recording/raw/$MEETING_ID*
rm -rf /var/log/bigbluebutton/$type/*$MEETING_ID*
done
rm -f /var/bigbluebutton/recording/status/recorded/$MEETING_ID*
rm -f /var/bigbluebutton/recording/status/archived/$MEETING_ID*
rm -f /var/bigbluebutton/recording/status/processed/$MEETING_ID*
rm -rf /usr/share/red5/webapps/video/streams/$MEETING_ID
rm -f /var/bigbluebutton/deskshare/$MEETING_ID*.flv
rm -f /var/freeswitch/meetings/$MEETING_ID*.wav
echo "deleting: $MEETING_ID"
else
echo "Give a meeting id or use --deleteall"
fi
fi
if [ $DELETEALL ]; then
for type in $TYPES; do
rm -rf /var/bigbluebutton/published/$type/*
@ -194,6 +253,23 @@ fi
if [ $LIST ]; then
# Does the meeting contain:
# A -- Audio
# P -- Presentation
# V -- Video
# D -- Desktop
#
# Does the archive contain
# A -- Audio
# P -- Presentation
# V -- Video
# D -- Desktop
# E -- Events
#
# Is there a done flag (trigger rap-worker.rb to process) for
# R -- Recording
# A -- Archiving
#
echo "MeetingID Time APVD APVDE RA Slides Processed Published Description"
echo "------------------------------------------------------ ---------------------------- ---- ----- -- ------ -------------------- -------------------- -----------------------------"
@ -362,13 +438,32 @@ if [ $WATCH ]; then
fi
if [ $CHECK ]; then
if [ -f /var/bigbluebutton/recording/process/slides ]; then
if [ ! -w /var/bigbluebutton/recording/process/slides ]; then
print_header
echo "# Error: The output director for slides"
echo "#"
echo "# /var/bigbluebutton/recording/process/slides"
echo "#"
echo "# is not writeable."
echo
fi
fi
fi
if [ $DEBUG ]; then
LOG_DIR=/var/log/bigbluebutton
if [ -f /var/log/bigbluebutton/bbb-rap-worker.log ]; then
grep -i error /var/log/bigbluebutton/bbb-rap-worker.*
fi
#
#Failures while archiving files
#
if [ -f /var/log/bigbluebutton/archive.log ]; then
grep "Failed to" "/var/log/bigbluebutton/archive.log" > /tmp/t
if [ -f $LOG_DIR/archive.log ]; then
grep "Failed to" "$LOG_DIR/archive.log" > /tmp/t
if [ -s /tmp/t ]; then
echo " -- ERRORS found while archiving files -- "
cat /tmp/t
@ -380,47 +475,26 @@ if [ $CHECK ]; then
fi
fi
fi
#
#Errors while processing slides
# We're going to look through the output files for each of the processed types
#
grep -B 3 "ERROR -- : Error:" /var/log/bigbluebutton/slides/process-* | egrep -w 'Task:| Error:' > /tmp/t
STAGES="process publish"
for type in $TYPES; do
for stage in $STAGES; do
if ls -A $LOG_DIR/$type/$stage-* &> /dev/null; then
rm -rf /tmp/t
grep -B 3 "ERROR -- : Error:" $LOG_DIR/$type/$stag-* | egrep -w 'Task:| Error:' > /tmp/t
if [ -s /tmp/t ]; then
echo " -- ERRORS found while processing slides /var/log/bigbluebutton/slides/process-* -- "
echo " -- ERRORS found while processing slides $LOG_DIR/$type/$stag-* -- "
cat /tmp/t
echo
fi
#
#Errors while publishing slides
#
grep "ERROR -- : Error:" /var/log/bigbluebutton/slides/publish-* > /tmp/t
if [ -s /tmp/t ]; then
echo " -- ERRORS found while publishing slides /var/log/bigbluebutton/slides/publish-* -- "
cat /tmp/t
echo
fi
done
done
#
#Errors while processing matterhorn
#
grep "ERROR -- : Error:" /var/log/bigbluebutton/matterhorn-process-* > /tmp/t
if [ -s /tmp/t ]; then
echo " -- ERRORS found while processing matterhorn /var/log/bigbluebutton/matterhorn-process-* -- "
cat /tmp/t
echo
fi
#
#Errors while publishing matterhorn
#
grep "ERROR -- : Error:" /var/log/bigbluebutton/matterhorn-publish-* > /tmp/t
if [ -s /tmp/t ]; then
echo " -- ERRORS found while publishing matterhorn /var/log/bigbluebutton/matterhorn-publish-* -- "
cat /tmp/t
echo
fi

View File

@ -21,7 +21,15 @@
test -x /var/bigbluebutton || exit 0
#
# Delete presentation directories in /var/bigbluebutton older than 10 days
# Disable this cron job for now (the administrator can manually enable it).
#
# We disable it for now to ensure if rap-worker.rb didn't archive a recording
# we can try and archive it again without having the source files deleted.
#
exit 0
#
# Delete presentations older than a day
#
find /var/bigbluebutton -maxdepth 1 -type d -name "*-*" -mtime +11 -exec rm -r '{}' \;

BIN
bigbluebutton-config/web/default.pdf Normal file → Executable file

Binary file not shown.

Some files were not shown because too many files have changed in this diff Show More