From 25bf9810eed5923626425d590b781efd7004813a Mon Sep 17 00:00:00 2001
From: Anatoly Mihalchenko <tolik@scand.com>
Date: Tue, 16 Aug 2011 18:30:31 +0300
Subject: [PATCH] JVM in widgets under Windows + Geogebra widget

---
 .../interactive/Geogebra.wgt/config.xml       |  12 +++
 .../library/interactive/Geogebra.wgt/icon.png | Bin 0 -> 2569 bytes
 .../Geogebra.wgt/images/loading.gif           | Bin 0 -> 2038 bytes
 .../interactive/Geogebra.wgt/index.html       |  71 ++++++++++++++++++
 src/domain/UBAbstractWidget.cpp               |  43 ++++++++++-
 src/domain/UBAbstractWidget.h                 |  25 +++---
 src/domain/UBGraphicsScene.cpp                |  13 +---
 src/domain/UBW3CWidget.cpp                    |  50 ++++++++++--
 src/gui/UBToolWidget.cpp                      |   1 +
 9 files changed, 186 insertions(+), 29 deletions(-)
 create mode 100644 resources/library/interactive/Geogebra.wgt/config.xml
 create mode 100644 resources/library/interactive/Geogebra.wgt/icon.png
 create mode 100644 resources/library/interactive/Geogebra.wgt/images/loading.gif
 create mode 100644 resources/library/interactive/Geogebra.wgt/index.html

diff --git a/resources/library/interactive/Geogebra.wgt/config.xml b/resources/library/interactive/Geogebra.wgt/config.xml
new file mode 100644
index 00000000..64bb595c
--- /dev/null
+++ b/resources/library/interactive/Geogebra.wgt/config.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<widget xmlns="http://www.w3.org/ns/widgets"
+	 	xmlns:ub="http://uniboard.mnemis.com/widgets"
+        id="http://uniboard.mnemis.com/widgets/geogebra" 
+        version="1.0"
+        width="800"
+        height="500" 
+		ub:resizable="true"
+		ub:roles="tool cMAC cUNIX">        
+  <name>Geogebra</name>
+  <content src="index.html"/> 
+</widget>
diff --git a/resources/library/interactive/Geogebra.wgt/icon.png b/resources/library/interactive/Geogebra.wgt/icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..2b5397e47df90bbf133171f2967114176bfcde57
GIT binary patch
literal 2569
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

literal 0
HcmV?d00001

diff --git a/resources/library/interactive/Geogebra.wgt/images/loading.gif b/resources/library/interactive/Geogebra.wgt/images/loading.gif
new file mode 100644
index 0000000000000000000000000000000000000000..5ccc287b15248f417ceaa1eca872add966169c4e
GIT binary patch
literal 2038
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
TXQX)8Aw32%-FE8=2&4ZGPzGlo

literal 0
HcmV?d00001

diff --git a/resources/library/interactive/Geogebra.wgt/index.html b/resources/library/interactive/Geogebra.wgt/index.html
new file mode 100644
index 00000000..9fe49048
--- /dev/null
+++ b/resources/library/interactive/Geogebra.wgt/index.html
@@ -0,0 +1,71 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<HTML><HEAD>
+<META http-equiv=Content-Type content="text/html; charset=windows-1252">
+<BODY>
+<DIV id=applet1></DIV>
+<SCRIPT type=text/javascript> 
+
+function ggbOnInit()
+{
+	alert("Geogebra applet is initialized");
+}
+ 
+var width=0;
+var height=0;
+setWidthHeight();
+ 
+if (height < 500) height=500;
+if (width < 800) width=800;
+ 
+ 
+var applet1=document.getElementById('applet1');
+ 
+applet1.innerHTML=geogebra_applet(0.95*width,height*0.95,"",true,true,true,false,true,true,true,true,true,true,true,true);
+ 
+function geogebra_applet(width,height,filename,framePossible,enableRightClick,enableShiftDragZoom,showResetIcon,showMenuBar,showToolBar,showToolBarHelp,showAlgebraInput,enableLabelDrags,showSpreadsheet,showAlgebraView) {
+
+
+  ret = '<applet name="ggbApplet" code="geogebra.GeoGebraApplet" codebase="./bin/" archive="geogebra.jar" height="'+height+'" width="'+width+'">';
+  ret +='<param name="image" value="./images/loading.gif"/><param name="boxborder" value="false"/><param name="centerimage" value="true">';
+  ret +='<param name="java_arguments" value="-Xmx512m">';
+  if (filename != "") ret+='<param name="filename" value="'+filename+'">';
+  ret+='<param name="framePossible" value="'+framePossible+'">';
+  ret+='<param name="enableRightClick" value="'+enableRightClick+'">';
+  ret+='<param name="enableShiftDragZoom" value="'+enableShiftDragZoom+'">';
+  ret+='<param name="enableLabelDrags" value="'+enableLabelDrags+'">';
+  ret+='<param name="showSpreadsheet" value="'+showSpreadsheet+'">';
+  ret+='<param name="showAlgebraView" value="'+showAlgebraView+'">';
+  ret+='<param name="showResetIcon" value="'+showResetIcon+'">';
+  ret+='<param name="showMenuBar" value="'+showMenuBar+'">';
+  ret+='<param name="showToolBar" value="'+showToolBar+'">';
+  ret+='<param name="showToolBarHelp" value="'+showToolBarHelp+'">';
+  ret+='<param name="showAlgebraInput" value="'+showAlgebraInput+'">';
+  ret+='Sorry, the GeoGebra Applet could not be started. Please make sure that Java 1.4.2 (or later) is installed and activated.';
+  ret+='(<a href="http://java.sun.com/getjava">click here to install Java now</a>)';
+  ret+='</applet>';
+  return ret;
+}
+ 
+function setWidthHeight() {
+  var myWidth = 0, myHeight = 0;
+  if( typeof( window.innerWidth ) == 'number' ) {
+    //Non-IE
+    myWidth = window.innerWidth;
+    myHeight = window.innerHeight;
+  } else if( document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) ) {
+    //IE 6+ in 'standards compliant mode'
+    myWidth = document.documentElement.clientWidth;
+    myHeight = document.documentElement.clientHeight;
+  } else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) ) {
+    //IE 4 compatible
+    myWidth = document.body.clientWidth;
+    myHeight = document.body.clientHeight;
+  }
+  //window.alert( 'Width = ' + myWidth );
+  //window.alert( 'Height = ' + myHeight );
+  width=myWidth;
+  height=myHeight;
+}
+</SCRIPT>
+</BODY></HTML>
+
diff --git a/src/domain/UBAbstractWidget.cpp b/src/domain/UBAbstractWidget.cpp
index 6ff6116b..a5fafc18 100644
--- a/src/domain/UBAbstractWidget.cpp
+++ b/src/domain/UBAbstractWidget.cpp
@@ -44,8 +44,8 @@ UBAbstractWidget::UBAbstractWidget(const QUrl& pWidgetUrl, QWidget *parent)
     , mInitialLoadDone(false)
     , mLoadIsErronous(false)
     , mIsFreezable(true)
-    , mCanBeContent(true)
-    , mCanBeTool(true)
+    , mCanBeContent(0)
+    , mCanBeTool(0)
     , mIsFrozen(false)
     , mIsTakingSnapshot(false)
 {
@@ -74,12 +74,51 @@ UBAbstractWidget::UBAbstractWidget(const QUrl& pWidgetUrl, QWidget *parent)
     setMouseTracking(true);
 }
 
+bool UBAbstractWidget::canBeContent()
+{
+    // if we under MAC OS
+    #if defined(Q_OS_MAC)
+        return mCanBeContent & OSType::type_MAC;
+    #endif
+
+    // if we under UNIX OS
+    #if defined(Q_OS_UNIX)
+        return mCanBeContent & OSType::type_UNIX;
+    #endif
+
+    // if we under WINDOWS OS
+    #if defined(Q_OS_WIN)
+        return mCanBeContent & OSType::type_WIN;
+    #endif
+}
+
+bool UBAbstractWidget::canBeTool()
+{
+    // if we under MAC OS
+    #if defined(Q_OS_MAC)
+        return mCanBeTool & OSType::type_MAC;
+    #endif
+
+        // if we under UNIX OS
+    #if defined(Q_OS_UNIX)
+        return mCanBeTool & OSType::type_UNIX;
+    #endif
+
+        // if we under WINDOWS OS
+    #if defined(Q_OS_WIN)
+        return mCanBeTool & OSType::type_WIN;
+    #endif
+}
 
 UBAbstractWidget::~UBAbstractWidget()
 {
     // NOOP
 }
 
+void UBAbstractWidget::loadMainHtml()
+{
+    QWebView::load(mMainHtmlUrl);
+}
 
 bool UBAbstractWidget::event(QEvent *event)
 {
diff --git a/src/domain/UBAbstractWidget.h b/src/domain/UBAbstractWidget.h
index e96706e9..5c077d04 100644
--- a/src/domain/UBAbstractWidget.h
+++ b/src/domain/UBAbstractWidget.h
@@ -39,6 +39,8 @@ class UBAbstractWidget : public UBRoutedMouseEventWebView
         UBAbstractWidget(const QUrl& pWidgetUrl, QWidget *parent = 0);
         virtual ~UBAbstractWidget();
 
+        void loadMainHtml();
+
         QUrl mainHtml()
         {
             return mMainHtmlUrl;
@@ -64,15 +66,8 @@ class UBAbstractWidget : public UBRoutedMouseEventWebView
             return mNominalSize;
         }
 
-        bool canBeContent() const
-        {
-            return mCanBeContent;
-        }
-
-        bool canBeTool() const
-        {
-            return mCanBeTool;
-        }
+        bool canBeContent();
+        bool canBeTool();
 
         bool hasLoadedSuccessfully() const
         {
@@ -123,8 +118,16 @@ class UBAbstractWidget : public UBRoutedMouseEventWebView
         bool mLoadIsErronous;
 
         bool mIsFreezable;
-        bool mCanBeContent;
-        bool mCanBeTool;
+        int mCanBeContent;
+        int mCanBeTool;
+        enum OSType
+        {
+            type_NONE = 0, // 0000
+            type_WIN  = 1, // 0001
+            type_MAC  = 2, // 0010
+            type_UNIX = 4, // 0100
+            type_ALL  = 7, // 0111
+        };
 
         virtual void injectInlineJavaScript();
         virtual void paintEvent(QPaintEvent * event);
diff --git a/src/domain/UBGraphicsScene.cpp b/src/domain/UBGraphicsScene.cpp
index 0c36530b..0974105f 100644
--- a/src/domain/UBGraphicsScene.cpp
+++ b/src/domain/UBGraphicsScene.cpp
@@ -1091,7 +1091,6 @@ void UBGraphicsScene::addGraphicsWidget(UBGraphicsWidgetItem* graphicsWidget, co
     graphicsWidget->setFlag(QGraphicsItem::ItemIsSelectable, true);
     graphicsWidget->setZValue(getNextObjectZIndex());
 
-//    QGraphicsScene::addWidget(graphicsWidget->widgetWebView());
     addItem(graphicsWidget);
 
     qreal ssf = 1 / UBApplication::boardController->systemScaleFactor();
@@ -1103,21 +1102,13 @@ void UBGraphicsScene::addGraphicsWidget(UBGraphicsWidgetItem* graphicsWidget, co
 
     if (graphicsWidget->widgetWebView()->canBeContent())
     {
+        graphicsWidget->widgetWebView()->loadMainHtml();
+
         graphicsWidget->setSelected(true);
         UBGraphicsItemUndoCommand* uc = new UBGraphicsItemUndoCommand(this, 0, graphicsWidget);
         UBApplication::undoStack->push(uc);
 
         setDocumentUpdated();
-
-//        graphicsWidget->widgetWebView()->setParent(graphicsWidget->v));
-//         QObject *zz1= graphicsWidget->widgetWebView()->parent();
-//         QWidget *zz2= graphicsWidget->widgetWebView()->parentWidget();
-// 
-//         QObject *zz3= graphicsWidget->parent();
-//         QGraphicsWidget *zz4= graphicsWidget->parentWidget();
-
-//        graphicsWidget->widgetWebView()->loadUrl();
-
     }
     else
     {
diff --git a/src/domain/UBW3CWidget.cpp b/src/domain/UBW3CWidget.cpp
index b3fbf575..7a1af1e2 100644
--- a/src/domain/UBW3CWidget.cpp
+++ b/src/domain/UBW3CWidget.cpp
@@ -86,8 +86,51 @@ UBW3CWidget::UBW3CWidget(const QUrl& pWidgetUrl, QWidget *parent)
 
         QString roles = widgetElement.attribute("ub:roles", "content tool").trimmed().toLower();
 
-        mCanBeTool = roles == "" || roles.contains("tool");
-        mCanBeContent =  roles == "" || roles.contains("content");
+        //------------------------------//
+
+        if( roles == "" || roles.contains("tool") )
+        {
+            mCanBeTool = UBAbstractWidget::OSType::type_ALL;
+        }
+
+        if( roles.contains("twin") )
+        {
+            mCanBeTool |= UBAbstractWidget::OSType::type_WIN;
+        }
+
+        if( roles.contains("tmac") )
+        {
+            mCanBeTool |= UBAbstractWidget::OSType::type_MAC;
+        }
+        
+        if( roles.contains("tunix") )
+        {
+            mCanBeTool |= UBAbstractWidget::OSType::type_UNIX;
+        }
+
+        //---------//
+
+        if( roles == "" || roles.contains("content") )
+        {
+            mCanBeContent = UBAbstractWidget::OSType::type_ALL;
+        }
+
+        if( roles.contains("cwin") )
+        {
+            mCanBeContent |= UBAbstractWidget::OSType::type_WIN;
+        }
+
+        if( roles.contains("cmac") )
+        {
+            mCanBeContent |= UBAbstractWidget::OSType::type_MAC;
+        }
+
+        if( roles.contains("cunix") )
+        {
+            mCanBeContent |= UBAbstractWidget::OSType::type_UNIX;
+        }
+
+        //------------------------------//
 
         QDomNodeList contentDomList = widgetElement.elementsByTagName("content");
 
@@ -159,8 +202,6 @@ UBW3CWidget::UBW3CWidget(const QUrl& pWidgetUrl, QWidget *parent)
     connect(page()->mainFrame(), SIGNAL(javaScriptWindowObjectCleared()), this, SLOT(javaScriptWindowObjectCleared()));
     connect(UBApplication::boardController, SIGNAL(activeSceneChanged()), this, SLOT(javaScriptWindowObjectCleared()));
 
-    QWebView::load(mMainHtmlUrl);
-
     setFixedSize(QSize(width, height));
 
     mNominalSize = QSize(width, height);
@@ -171,7 +212,6 @@ UBW3CWidget::~UBW3CWidget()
     // NOOP
 }
 
-
 void UBW3CWidget::javaScriptWindowObjectCleared()
 {
     UBWidgetUniboardAPI *uniboardAPI = new UBWidgetUniboardAPI(UBApplication::boardController->activeScene(), 0);
diff --git a/src/gui/UBToolWidget.cpp b/src/gui/UBToolWidget.cpp
index 59ff2af4..ea1bdee1 100644
--- a/src/gui/UBToolWidget.cpp
+++ b/src/gui/UBToolWidget.cpp
@@ -72,6 +72,7 @@ UBToolWidget::UBToolWidget(UBAbstractWidget* pWidget, QWidget* pParent)
     , mShouldMoveWidget(false)
 {
     mToolWidget->setParent(this);
+    mToolWidget->loadMainHtml();
 
     initialize();