From 6f8bd7e98be91c60386f2e2291a41cfc1004c8b0 Mon Sep 17 00:00:00 2001
From: jsteuer <jan.niklas.steuer@gmail.com>
Date: Sat, 06 Jul 2019 16:33:47 +0200
Subject: [PATCH] add example

---
 examples/example-ide/code_completion.png  |    0 
 examples/README.md                        |    6 ++
 examples/example-ide/MyEditor/editor.js   |   68 ++++++++++++++++++++++
 examples/example-ide/README.md            |   42 ++++++++++++++
 examples/example-ide/MyEditor/editor.html |   29 +++++++++
 5 files changed, 145 insertions(+), 0 deletions(-)

diff --git a/examples/README.md b/examples/README.md
new file mode 100644
index 0000000..1eaaf85
--- /dev/null
+++ b/examples/README.md
@@ -0,0 +1,6 @@
+# Beispiele
+-   `example-ide`: 
+    Entwickeln eines externen Werkzeuges in der MathCoach-IDE
+-   `example-vscode-advanced`: 
+    Entwickeln eines externen Werkzeuges mit VSCode, Typescript und 
+    Parcel als Build-System
\ No newline at end of file
diff --git a/examples/example-ide/MyEditor/editor.html b/examples/example-ide/MyEditor/editor.html
new file mode 100644
index 0000000..e7c7ed7
--- /dev/null
+++ b/examples/example-ide/MyEditor/editor.html
@@ -0,0 +1,29 @@
+<html>
+
+<head>
+	<title></title>
+	<meta content="">
+	<style>
+	</style>
+</head>
+
+<body>
+	<h1>Demo Editor!!!</h1>
+	<p>
+		Der Editor beschreibt die Kontext-Datei (Datei, mit dem der 
+		Editor gestartet wurde) beispielhaft. Er kann eine Aufgabe generieren
+		und die Vorschau zu der generieren Datei navigieren.
+	</p>
+	<ul>
+		<li>
+			<button id="btn_write">Kontext-Datei schreiben</button> 
+		</li>
+		<li>
+			<button id="btn_generateExercise">Aufgabe generieren und anzeigen</button> 
+		</li>
+	</ul>
+
+	<script src="/mathcoach/ui/ide/api/ide-lib.js"></script>
+	<script src="./editor.js"></script>
+</body>
+</html>
\ No newline at end of file
diff --git a/examples/example-ide/MyEditor/editor.js b/examples/example-ide/MyEditor/editor.js
new file mode 100644
index 0000000..fe8c570
--- /dev/null
+++ b/examples/example-ide/MyEditor/editor.js
@@ -0,0 +1,68 @@
+(async function () {  
+    const isReady = typeof MC !== "undefined" ? await MC.isReady() : false;
+    if(!isReady){
+        alert("Die MathCoach-API ist nicht einsatzbereit. Wurde das Werkzeug nicht durch die IDE gestartet?");
+        throw new Error("mc api not ready");
+    }
+    
+    const btnWrite = document.getElementById("btn_write");
+    const btnGenerateExercise = document.getElementById("btn_generateExercise");
+    
+    const user = await MC.ide.getUserName(); // Angemeldeter Benutzer
+    const contextFile = await MC.ide.getContextFile(); // Datei, mit der der Editor gestartet wurde
+    
+    /**
+     * Internes Datenmodell des Werkzeuges. Die grafische Oberfläche soll an 
+     * dieses Datenmodell gebunden sein:
+     * - Änderungen in der grafischen Oberfläche ändern das Modell 
+     * - Änderungen des Modell aktualisieren die grafische Oberfläche
+     */
+    let data = { 
+        user: user,
+        timestamp: new Date().toTimeString()  
+    }
+
+    /**
+     * Schreibt das Datenmodell in die die Kontext-Datei (Datei, mit der das Werkzeug gestartet wurde). 
+     * Diese Datei fungiert somit als reiner Datencontainer.
+     */
+    async function saveDataModel() { 
+        let text = JSON.stringify(data); // convert the data model to string    
+        await MC.ide.fs.writeFile(contextFile,text);  // write the model to the file that starts the tool  
+    }
+    btnWrite.addEventListener("click", saveDataModel);
+    
+    /**
+     * Läd das Datenmodell aus der Kontext-Datei
+     */
+    // async function restoreDataModel(){ /* ... TODO ... */}
+    
+    
+    /**
+     * Generiert aus dem Datenmodell eine MathCoach-Aufgabe
+     */
+    async function generateExercise() { 
+        let text = `
+            startup {
+                print("""
+                    Hallo ${data.user}! Diese Aufgabe wurde 
+                    um <b>${data.timestamp}</b> Uhr erstellt.
+                """)
+            }
+        `;
+        /**
+         * Die generierte Aufgabe soll so heißen, wie die Kontext-Datei.
+         * Der Pfad wird also wie folgt umgeformt: "/path/to/myExercise.xxx.yyy" 
+         * wird zu "path/to/myExercise.groovy"
+         */ 
+        let path = contextFile.path.substring(0,contextFile.path.indexOf(".")) + ".groovy" 
+        let file = { owner: contextFile.owner, part: contextFile.part, path: path }
+        await MC.ide.fs.writeFile(file, text);
+        await MC.ide.navigator.navigateToExercise(file)
+    }
+    btnGenerateExercise.addEventListener("click", generateExercise);
+
+}())
+
+
+
diff --git a/examples/example-ide/README.md b/examples/example-ide/README.md
new file mode 100644
index 0000000..8c3a3de
--- /dev/null
+++ b/examples/example-ide/README.md
@@ -0,0 +1,42 @@
+# Beispiel: Externes Werkzeug in der MathCoach-IDE entwickeln
+Dieses Beispiel zeigt, wie man ein externes Werkzeug innerhalb der MathCoach-IDE
+entwickeln kann. Dabei stellt die IDE Autovervollständigung für JavaScript-Dateien,
+in denen die MathCoach-API verwendet wird, bereit. 
+
+![Entwickeln eines Werkzeugs in der MathCoach-IDE](code_completion.png)
+
+### Vorteile
+-   Einfach (auf die Schnelle etwas ausprobieren)
+-   Die MathCoach-IDE stellt Autovervollständigung bereit
+
+### Nachteile
+-   Keine Typsicherheit, da JavaScript verwendet wird (hier bringt die 
+    Autovervollständigung nicht viel)
+-   Für größere und komplexere Werkzeuge eher ungeeignet
+
+
+## Setup
+-   Lade das Verzeichnis `MyEditor` in dein www-Verzeichnis von MathCoach hoch
+-   Registriere das Werkzeug bei der IDE. Ergänze dazu die `ide-settings.json` in 
+    deinem vfs-Verzeichnis (passe die `entry`-Konfiguration entsprechend an!):
+
+        {
+            ...
+            "editor.external.definitions": [
+                ...
+                {
+                    "displayName": "MyEditor",
+                    "entry": "/mathcoach/www/<YOUR_USER_NAME>/MyEditor/editor.html",
+                    "description": "...",
+                    "developer": "Max Mustermann",
+                    "extension": "demo.json"
+                }
+                ...
+            ],
+            ...
+        }
+
+
+-   Lade die IDE neu (Seite neu laden, z.B. mit F5)
+-   Im Kontextmenü des Explorers können nun MyEditor-Dateien angelegt und anschließend 
+    mit dem MyEditor geöffnet werden.
\ No newline at end of file
diff --git a/examples/example-ide/code_completion.png b/examples/example-ide/code_completion.png
new file mode 100644
index 0000000..818bd78
--- /dev/null
+++ b/examples/example-ide/code_completion.png
Binary files differ

--
Gitblit v1.10.0-SNAPSHOT