Dateiverwaltung für die WebBox
ulrich
2018-03-03 968b07dace8f64519eaf2455729d87b66678d958
commit | author | age
723bf7 1 /*
U 2     Dateiverwaltung - File management in your browser
3     Copyright (C) 2017 Ulrich Hilger, http://uhilger.de
4
5     This program is free software: you can redistribute it and/or modify
6     it under the terms of the GNU Affero General Public License as
7     published by the Free Software Foundation, either version 3 of the
8     License, or (at your option) any later version.
9
10     This program is distributed in the hope that it will be useful,
11     but WITHOUT ANY WARRANTY; without even the implied warranty of
12     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13     GNU Affero General Public License for more details.
14
15     You should have received a copy of the GNU Affero General Public License
16     along with this program.  If not, see <http://www.gnu.org/licenses/>.
17 */
18
a4d3b5 19 var cm;
5dfab6 20 var pfad = '';
10d3d3 21 var modus = 'kacheln';
5ebb8e 22 var openFileName = '';
305573 23 var ed;
7d8ef6 24 var openEditor;
0c1d5b 25 var userid;
U 26 var tmo;
be9b6d 27 var tmo2;
7165a1 28 var cutCopySrcDir;
U 29 var cutCopyFiles;
30 var cutCopyOperation;
fa012b 31 var loc;
cccd2b 32 var PERS_DIR = "Persoenlich";
U 33 var PUB_DIR = "Oeffentlich";
1f550a 34 var BASE_DIR = "$basis";
U 35 var DATA_DIR = "$daten";
11536c 36 var WWW_DIR = "www";
e3043f 37 var compilerIssues;
76660f 38 var fm_slideshow = false;
c7c502 39
U 40 function fm_init() {
305573 41   $("#mce-editor").hide();
a4d3b5 42   $('.codeeditor-space').hide();
U 43   $('.code-editor-container').hide();
a450f2 44   $('.sued').hide();
bef5c6 45   //$('.ost').attr('flex-basis', 0);
a4d3b5 46   $('#newTextFile').on('click', fm_menu_neue_textdatei);
305573 47   $('#newDoc').on('click', fm_menu_neues_dokument);
adf812 48   $('#newFolder').on('click', fm_get_new_folder);
fc8db1 49   $('#viewFile').on('click', fm_view_file);
7d8ef6 50   $('#editTextFile').on('click', function() {
U 51     fm_get_file_content('text');
52   });
53   $('#editDocFile').on('click', function() {
54     fm_get_file_content('dok');
55   });
e5ff42 56   $('#saveFile').on('click', fm_menu_datei_speichern);
5ebb8e 57   $('#saveFileAs').on('click', fm_menu_datei_speichern_unter);
a4d3b5 58   $('#closeFile').on('click', fm_menu_datei_schliessen);
8446c2 59   $('#renameFile').on('click', fm_menu_datei_umbenennen);
6bd2c1 60   $('#m-unzip').on('click', fm_menu_datei_entpacken);
fad719 61   $('#m-html-export').on('click', fm_menu_html_export);
fc1897 62   $('#m-del').on('click', fm_menu_delete);
7165a1 63   $('#m-cut').on('click', fm_menu_cut);
U 64   $('#m-copy').on('click', fm_menu_copy);
65   $('#m-paste').on('click', fm_menu_paste);
438b16 66   $('#m-shrink').on('click', fm_menu_shrink);
76660f 67   $('#m-toggle-slideshow').on('click', fm_toggle_show_slideshow);
bef5c6 68   $('#m-test').on('click', fm_menu_test);
72e43d 69   $('#m-test-2').on('click', fm_menu_compile);
U 70   $('#m-test-3').on('click', fm_menu_compile_all);
a450f2 71   $('#m-compile-results').on('click', fm_fusszeile_zeigen);
7b3372 72   $('#m-build-app').on('click', fm_menu_build_app);
c509a0 73   $('#saveModal').on('hidden.bs.modal', function (e) {
915927 74     $('#modal_ok').attr('onclick','').unbind('click');
b7475d 75   });
U 76   $('#logout').click(fm_logout);  
a450f2 77   $('#fusszeile-schliessen').on('click', fm_fusszeile_schliessen);
05cfa7 78   fm_get_login();
7342b1 79   fm_get_list('');
7aa566 80   fm_init_uploader();
fa012b 81   /*
U 82   console.log('href: ' + window.location.href);
83   console.log('host: ' + window.location.host);
84   console.log('hostname: ' + window.location.hostname);
85   console.log('port: ' + window.location.port);
86   console.log('protocol: ' + window.location.protocol);
87   */
88   loc = window.location.protocol + '//' + window.location.host;
fc8db1 89 }
U 90
76660f 91 function fm_toggle_show_slideshow() {
U 92   if(fm_slideshow) {
968b07 93     $('#m-toggle-slideshow').text('Diashow einschalten');
76660f 94     fm_slideshow = false;
U 95   } else {
968b07 96     $('#m-toggle-slideshow').text('Diashow ausschalten');
76660f 97     fm_slideshow = true;
U 98   }
99 }
100
0c1d5b 101 function fm_resize_editor() {
U 102   window.clearTimeout(tmo);
103   tmo = window.setTimeout(function () {
104     try {
105       var myHeight = $('.zentrum').height() - $('.nord').height() - 4;
106       ed.theme.resizeTo('100%', myHeight);  // sets the dimensions of the editable area
107     } catch (err) {
108     }
109   }, 200);
a450f2 110 }
U 111
112 function fm_fusszeile_schliessen() {
113   $('.sued').hide();
114 }
115
116 function fm_fusszeile_zeigen() {
117   $('.sued').show();
fc8db1 118 }
U 119
0c1d5b 120 function fm_get_path(uid) {
U 121   //console.log('pfad: ' + pfad);
122   var restdir;
cccd2b 123   if(pfad.indexOf(PUB_DIR) > -1) {
U 124     restdir = pfad.substr(PUB_DIR.length);
125   } else if(pfad.indexOf(PERS_DIR) > -1) {
126     restdir = pfad.substr(PERS_DIR.length);
1f550a 127   } else if(pfad.indexOf(BASE_DIR) > -1) {
U 128     restdir = pfad.substr(BASE_DIR.length);
129   } else if(pfad.indexOf(DATA_DIR) > -1) {
130     restdir = pfad.substr(DATA_DIR.length);
0c1d5b 131   }
U 132   if(restdir !== undefined && restdir.startsWith('/')) {
133     restdir = restdir.substr(1);
11536c 134     if(restdir.indexOf(WWW_DIR) > -1) {
U 135       restdir = restdir.replace(WWW_DIR, 'data');
136     }
0c1d5b 137   }
U 138   var pdir = fm_get_base(uid);
11536c 139   // console.log('fm_get_path path: ' + pdir + "/" + restdir);
0c1d5b 140   if(restdir.length > 1) {
U 141     return pdir + "/" + restdir;
142   } else {
143     return pdir;
144   }
145 }
146
147 function fm_get_base(uid) {
148   //console.log('pfad: ' + pfad);
149   var pdir;
cccd2b 150   if(pfad.indexOf(PUB_DIR) > -1) {
11536c 151     pdir = '/data/' + uid;
cccd2b 152   } else if(pfad.indexOf(PERS_DIR) > -1) {
11536c 153     pdir = '/home/' + uid;
U 154   } else if(pfad.indexOf(BASE_DIR) > -1) {
155     pdir = '';
156   } else if(pfad.indexOf(DATA_DIR) > -1) {
157     pdir = '';
0c1d5b 158   }
11536c 159   //console.log('fm_get_base base: ' + pdir + uid);
U 160   return pdir;
0c1d5b 161 }
05cfa7 162
0c1d5b 163 function fm_dok_editor_init(uid) {
U 164   var base = fm_get_path(uid);
a75859 165   edCount = 0;
11536c 166   //console.log("fm_dok_editor_init calling tinymce.init with base: " + base + "/");
fc8db1 167   
0c1d5b 168   /*
U 169    * vgl.
170    * http://stackoverflow.com/questions/4651676/how-do-i-remove-tinymce-and-then-re-add-it
171    */
172   //tinymce.EditorManager.execCommand('mceRemoveControl',true, 'textarea.text-editor');
173   //tinymce.EditorManager.execCommand('mceAddControl',true, editor_id);
174   if(ed !== undefined) {
175     ed.destroy();
176   }
177   tinymce.remove('textarea.text-editor');
178   tinymce.EditorManager.editors = []; 
305573 179   
U 180   /*
181    * Konfiguration TinyMCE
182    */
183   tinymce.init({
547755 184     content_css : "/file-cms/ui/mce.css",
7b7627 185     //content_css: "/jslib/bootstrap/css/bootstrap.min.css",
7d8ef6 186     selector: "textarea.text-editor",
305573 187     statusbar: false,
U 188     menubar: false,
bbb632 189     plugins: 'advlist charmap code image link lists media table print preview save table textcolor importcss',
U 190     toolbar: 'undo redo | styleselect | image table | link unlink | bullist numlist | outdent indent | code',
305573 191     /*
U 192     menu: {
193       file: {title: 'File', items: 'savevers | exit'},
194       edit: {title: 'Edit', items: 'undo redo | cut copy paste pastetext | selectall'},
195       view: {title: 'View', items: 'visualaid | code | link image media | template hr'},
196     },
197     */
0c1d5b 198     resize: 'both',
ea1ae0 199     importcss_append: true,
305573 200     width: "100%",
U 201     height: '100%',
11536c 202     relative_urls : true, 
U 203     convert_urls : false, 
0c1d5b 204     document_base_url : base + "/",
305573 205     setup: function (editor) {
U 206       ed = editor;
207     }
208   });
0c1d5b 209   
U 210   $(window).on('resize', fm_resize_editor);
211   fm_resize_editor();
10d3d3 212 }
7aa566 213
U 214 /* ----- Uploader Anfang ----------*/
215
216 var dateien = new Array();
217
218 function fm_init_uploader() {
219   var dropzone = document.getElementById("dateien");  
220   dropzone.ondragover = dropzone.ondragenter = function(event) {  
221     event.stopPropagation();  
222     event.preventDefault();  
223   };
224
225   dropzone.ondrop = function(event) {  
226     event.stopPropagation();  
227     event.preventDefault();  
7ebde1 228     var fileList = event.dataTransfer.files;  
U 229     for (var i=0; i<fileList.length; i++) {  
230       dateien.push(fileList[i]);
231     }
232     sendFile(dateien.pop());
7aa566 233   };
U 234 }
235
236 /* ----- Uploader Ende --------------- */
10d3d3 237
7165a1 238 /* ------- Dateifunktionen Start ----------- */
U 239
240 function fm_menu_cut() {
98f088 241   //alert('fm_menu_cut');
U 242   fm_cut_files();
7165a1 243 }
U 244 function fm_menu_copy() {
98f088 245   //alert('fm_menu_copy');
U 246   fm_copy_files();
7165a1 247 }
U 248 function fm_menu_paste() {
98f088 249   //alert('fm_menu_paste');
U 250   fm_paste_files();
7165a1 251 }
fc1897 252 function fm_menu_delete() {
U 253   $('#confirmOk').click(function() {
a75859 254     $('#confirmOk').attr('onclick','').unbind('click');
fc1897 255     fm_del_files();
U 256   });
a75859 257   $('#confirmOk').text("Loeschen");
U 258   $('#confirmOk').removeClass('btn-primary');
259   $('#confirmOk').addClass('btn-danger');
260   $('#confirmClose').hide();
957b51 261   $('#confirmModalTitle').text("Löschen");
U 262   $('#confirmModalBody').text("Wirklich löschen?");
fc1897 263   $('#confirmModal').modal({
U 264     keyboard: false,
265     show: true
266   });
267 }
7165a1 268
U 269 /*
270  * Gewaehlte Dateien feststellen
271  * 
272  * @returns {String} eine per JSON.stringify schon vorbereitete List zum 
273  * Absenden als Parameter an den Server
274  */
275 function fm_gewaehlte_dateien() {
276   var gewaehlte = $('.datei-gewaehlt');
a450f2 277   /*
7165a1 278   //console.log('anzahl: ' + gewaehlte.length);
U 279   var fnames = new Array();
280   var i = 0;
281   while(i < gewaehlte.length) {
282     var str = { "java.lang.String": $(gewaehlte[i]).text()};
283     fnames.push(str);
284     //console.log('loeschen ' + pfad + ' ' + $(gewaehlte[i]).text());
285     //i += 2;
286     i++;
287   }
288   var liste = '{"List":' + JSON.stringify(fnames) + '}';
289   // 'liste' enthaelt:
290   // {"List":[{"java.lang.String":"test3.txt"},{"java.lang.String":"Test1.txt"},{"java.lang.String":"Test2.txt"}]}
291   // und wird auf dem Server zu einer List[ArrayList<String>] bei der jede ArrayList<String> nur ein Element hat 
292   return liste;
a450f2 293   */
U 294   return fm_dateiliste_bilden(gewaehlte);
7165a1 295 }
a450f2 296
U 297 function fm_dateiliste_bilden(gewaehlte) {
298   var fnames = new Array();
299   var i = 0;
300   while(i < gewaehlte.length) {
301     var str = { "java.lang.String": $(gewaehlte[i]).text()};
302     fnames.push(str);
303     //console.log('loeschen ' + pfad + ' ' + $(gewaehlte[i]).text());
304     //i += 2;
305     i++;
306   }
307   var liste = '{"List":' + JSON.stringify(fnames) + '}';
308   // 'liste' enthaelt:
309   // {"List":[{"java.lang.String":"test3.txt"},{"java.lang.String":"Test1.txt"},{"java.lang.String":"Test2.txt"}]}
310   // und wird auf dem Server zu einer List[ArrayList<String>] bei der jede ArrayList<String> nur ein Element hat 
311   return liste;
312 }
313
fad719 314 function fm_menu_html_export() {
U 315   fm_export_html();
316 }
317
7165a1 318 /* --------- Dateifunktionen Ende ---------- */
fc1897 319
bef5c6 320 function fm_menu_test() {
U 321   var w = $('.ost').width();
322   if(w == 0) {
323     $('.ost').width('20%');
324     $('.ost').text('Hallo Welt!');
325   } else {
326     $('.ost').empty();
327     $('.ost').width(0);
328   }
329 }
330
72e43d 331 function fm_menu_compile() {
fd0b4c 332   fm_compile('0', fm_mark_compile_results_in_editor);
72e43d 333 }
U 334 function fm_menu_compile_all() {
335   fm_compile_all();
fd0b4c 336 }
U 337
7b3372 338 function fm_menu_build_app() {
U 339   fm_build_app();
340 }
341
fd0b4c 342 function fm_mark_compile_results_in_editor(resp) {
U 343   cm.clearGutter("breakpoints");
344
345   if(resp.List[0].CompilerIssue !== undefined) {
d9d37b 346     cm.setGutterMarker(0, "breakpoints", makeMarker("Code hat Fehler"));
fd0b4c 347     var lno;
U 348     var eMsg;
349     if(resp.List[0].CompilerIssue instanceof Array) {
350       var issueNo = 0;
351       while(issueNo < resp.List[0].CompilerIssue.length) {
352         // console.log(resp.List[0].CompilerIssue[issueNo].kind);
353         // console.log(resp.List[0].CompilerIssue[issueNo].lineNumber);
354         // console.log(resp.List[0].CompilerIssue[issueNo].sourceName);
355         // console.log(resp.List[0].CompilerIssue[issueNo].message);
356         lno = resp.List[0].CompilerIssue[issueNo].lineNumber;
357         eMsg = resp.List[0].CompilerIssue[issueNo].kind + ' ' + resp.List[0].CompilerIssue[issueNo].message;
358         cm.setGutterMarker(lno-1, "breakpoints", makeMarker(eMsg));
359         issueNo++;
360       }
361     } else {
362       lno = resp.List[0].CompilerIssue.lineNumber;
363       eMsg = resp.List[0].CompilerIssue.kind + ' ' + resp.List[0].CompilerIssue.message;
364       cm.setGutterMarker(lno-1, "breakpoints", makeMarker(eMsg));
365     }
366   }
0ac262 367 }
U 368
10d3d3 369 function fm_ansicht_umschalten() {
U 370   if($('#ansicht').children(0).hasClass('fa-th-list')) {
371     $('#ansicht').children(0).addClass('fa-th-large');
372     $('#ansicht').children(0).removeClass('fa-th-list');
373     modus = 'liste';
374   } else {
375     $('#ansicht').children(0).addClass('fa-th-list');    
376     $('#ansicht').children(0).removeClass('fa-th-large');
377     modus = 'kacheln';
378   }
379   fm_get_list(pfad);
380 }
381
382 function fm_set_modus() {
383   if(modus == 'kacheln') {
384     $('#ansicht').children(0).addClass('fa-th-list');    
385     $('#ansicht').children(0).removeClass('fa-th-large');  
386   } else {
387     $('#ansicht').children(0).addClass('fa-th-large');
388     $('#ansicht').children(0).removeClass('fa-th-list');    
389   }
a4d3b5 390 }
U 391
392 function fm_menu_neue_textdatei() {
adf812 393   fm_text_edit('Neue Datei');
a4d3b5 394 }
U 395
305573 396 function fm_menu_neues_dokument() {
7d8ef6 397   fm_dok_edit('');
305573 398 }
U 399
a4d3b5 400 function fm_menu_datei_schliessen() {
3003b2 401   if(openEditor === 'text') {
U 402     if(!cm.getDoc().isClean()) {
403       fm_ask_for_save();
404     } else {
405       fm_do_close();
406     }
407   } else {
408     if(tinymce.activeEditor.undoManager.hasUndo()) {
409       fm_ask_for_save();
410     } else {
411       fm_do_close();
412     }
413   }
414 }
415
416 function fm_ask_for_save() {
417   // hier Abfrage ob gespeichert werden soll    
418   $('#confirmOk').click(function() {
419     $('#confirmOk').attr('onclick','').unbind('click');
420     fm_menu_datei_speichern(function() {
a75859 421       fm_do_close();
U 422     });
3003b2 423   });
U 424   $('#confirmCancel').click(function() {
425     $('#confirmCancel').attr('onclick','').unbind('click');
426   });
427   $('#confirmClose').show();
428   $('#confirmClose').click(function() {
429     $('#confirmClose').attr('onclick','').unbind('click');
a75859 430     fm_do_close();
3003b2 431   });
U 432   $('#confirmOk').text("Speichern");
433   $('#confirmOk').addClass('btn-primary');
434   $('#confirmOk').removeClass('btn-danger');
435   $('#confirmModalTitle').text("Schliessen");
436   $('#confirmModalBody').text("Speichern vor dem Schliessen?");
437   $('#confirmModal').modal({
438     keyboard: false,
439     show: true
440   });
a75859 441 }
U 442
443 function fm_do_close() {
a4d3b5 444   $('.codeeditor-space').hide();
U 445   $('.code-editor-container').hide();
305573 446   $("#mce-editor").hide();
U 447   if(cm !== undefined) {
448     cm.toTextArea();
449   }
5ebb8e 450   openFileName = '';
7d8ef6 451   openEditor = '';
adf812 452   fm_get_list(pfad);
305573 453   fm_filectls_show();
e5ff42 454 }
U 455
17919c 456 function fm_dateiwahl(ev) {
5dfab6 457   var elem = this;
17919c 458   //console.log('dateiwahl nach click, event shift: ' + ev.shiftKey + ", event ctrl: " + ev.ctrlKey);
10d3d3 459   if(modus == 'kacheln') {
957b51 460     // Kacheln
10d3d3 461     if($(elem).children(0).hasClass('fa-folder')) {
957b51 462       if(/*ev.shiftKey || */ ev.ctrlKey) {
U 463         $(elem).find('.dateiname').addClass('datei-gewaehlt');
10d3d3 464       } else {
957b51 465         var ordner = $(elem).text().trim();
U 466         if(pfad.length > 0) {
467           pfad = pfad + '/' + ordner;
468         } else {
469           pfad = ordner;
470         }
471         fm_get_list(pfad);
10d3d3 472       }
7f2a41 473     } else if($(elem).children(0).hasClass('datei')) {
17919c 474       if(/*ev.shiftKey || */ ev.ctrlKey) {
U 475         // mehrere Dateien sollen gewaehlt werden
476       } else {
477         $('.datei-gewaehlt').removeClass('datei-gewaehlt');        
478       }
957b51 479       $(elem).find('.dateiname').addClass('datei-gewaehlt');
5dfab6 480     } else {
10d3d3 481       //console.log('kein folder oder file...');
5dfab6 482     }
U 483   } else {
957b51 484     // Liste
10d3d3 485     if($(elem).find('.datei-elem').children(0).hasClass('fa-file-o')) {
957b51 486       // Datei
17919c 487       if(/*ev.shiftKey || */ ev.ctrlKey) {
U 488         // mehrere Dateien sollen gewaehlt werden
489       } else {
490         $('.table-info').removeClass('table-info');
957b51 491         $('.datei-gewaehlt').removeClass('datei-gewaehlt');
17919c 492       }
10d3d3 493       $(elem).addClass('table-info');
U 494       $(elem).find('.dateiname').addClass('datei-gewaehlt');
495     } else {
957b51 496       // Ordner
U 497       if(/*ev.shiftKey || */ ev.ctrlKey) {
498         $(elem).children(0).addClass('datei-gewaehlt');
10d3d3 499       } else {
957b51 500         var ordner = $(elem).find('.dateiname').text();
U 501         if(pfad.length > 0) {
502           pfad = pfad + '/' + ordner;
503         } else {
504           pfad = ordner;
505         }
506         fm_get_list(pfad);
10d3d3 507       }
U 508     }   
5dfab6 509   }
c509a0 510 }
U 511
a94216 512 function fm_bc_click() {
U 513   var elem = this;
514   var bcPfad = $(elem).attr('rpath');
515   if(bcPfad !== undefined) {
c509a0 516     pfad = bcPfad;
a94216 517     fm_get_list(bcPfad);
U 518   } else {
519     pfad = '';
520     fm_get_list('');
521   }
522 }
523
42fece 524 function fm_text_edit(content, mode) {
305573 525   fm_filectls_hide();
3ad4db 526   $('.codeeditor-space').show();
U 527   $('.code-editor-container').show();
42fece 528   fm_code_edit(content, mode);  
7d8ef6 529   openEditor = 'text';
U 530 }
531
532 function fm_dok_edit(content) {
533   fm_filectls_hide();
0c1d5b 534   fm_dok_editor_init(userid);
7d8ef6 535   $("#mce-editor").show();
be9b6d 536   
U 537   window.clearTimeout(tmo2);
538   tmo2 = window.setTimeout(function () {
539     try {
540       ed.setContent(content);
541       openEditor = 'dok';  
542     } catch (err) {
543     }
544   }, 200);
3ad4db 545 }
U 546
305573 547 function fm_filectls_hide() {
U 548   $('#zentrum_bc').hide();
549   $('#dateien').hide();
547755 550   $('#editMenu').addClass('disabled');
305573 551 }
U 552
553 function fm_filectls_show() {
554   $('#zentrum_bc').show();
555   $('#dateien').show();  
547755 556   $('#editMenu').removeClass('disabled');
305573 557 }
b7475d 558 /* ----- API Calls ------------- */
U 559
c509a0 560
2121cc 561
fc8db1 562 function fm_view_file() {
U 563   // http://localhost:8080/file-cms/ui/#  
564   // http://localhost:8080/file-cms/data/admin/usw.
565   
566   var userid = $('#userMenu').text();
567   var gewaehlte = $('.datei-gewaehlt');
568   var fname = $(gewaehlte[0]).text();
0c1d5b 569   
U 570   var path = fm_get_path(userid);
571   
572   window.open(path + '/' + fname, '_blank');
fc8db1 573 }
U 574
8446c2 575 function fm_menu_datei_umbenennen() {
U 576   var gewaehlte = $('.datei-gewaehlt');
577   var fname = $(gewaehlte[0]).text();
663ee9 578
U 579   $('#modal_ok').click(function() {
580     // hier umbenennen
50bb41 581     fm_rename_file(fname, pfad, $('#dateiname').val());
663ee9 582   });
U 583   $('#saveModalTitle').text('Datei umbenennen');
584   $('#dialogfrage').text("Neuer Dateiname?");  
585
586   if(fname !== undefined) {
587     $('#dateiname').val(fname);
588     $('#dateiname').attr('placeholder', 'Dateiname');
589     $('#saveModal').modal({
590       keyboard: false,
591       show: true
592     });
593   }
594 }
595
6bd2c1 596 function fm_menu_datei_entpacken() {
U 597   var gewaehlte = $('.datei-gewaehlt');
598   var fname = $(gewaehlte[0]).text();
599   fm_unzip_file(fname);
600 }
601
7165a1 602 /*
U 603  * Hier merkt sich die Dateiverwalting die markierten Dateien fuer 
604  * eine Dateioperation. Bei cut wird in der 'paste' Operation auf dem Server 
605  * fuer die 'gemerkten' Dateien ein Move gemacht. Die Dateien werden 
606  * vom gewaehlten Ort zum Zielort verschoben.
607  * 
608  * @returns {undefined}
609  */
610 function fm_cut_files() {
611   cutCopySrcDir = pfad;
612   cutCopyFiles = fm_gewaehlte_dateien();
613   cutCopyOperation = 'cut';
614 }
615
616 /*
617  * Hier merkt sich die Dateiverwalting die markierten Dateien fuer 
618  * eine Dateioperation. Bei copy wird in der 'paste' Operation auf dem Server 
619  * fuer die 'gemerkten' Dateien eine Kopie gemacht. Die Dateien werden 
620  * am gewaehlten Ort behalten und am Zielort wird eine Kopier der 
621  * gewaehlten DAteien erstellt
622  * 
623  * @returns {undefined}
624  */
625 function fm_copy_files() {
626   cutCopySrcDir = pfad;
627   cutCopyFiles = fm_gewaehlte_dateien();
9e2964 628   cutCopyOperation = 'copy';
7165a1 629 }
U 630
fc1897 631
10d3d3 632 function fm_render_list(fl) {
U 633   if(modus == 'kacheln') {
634     // Kachelansicht
7d8ef6 635     var template = $('#tpl-kacheln').html();
U 636     Mustache.parse(template);   // optional, speeds up future uses
637     $('.datei-zeile').attr('onclick','').unbind('click');
638     $('#dateien').empty();
639     $('#dateien').html(Mustache.render(template, fl));
640     $('.figure').click(fm_dateiwahl);
641   } else {
642     // Listenansicht
643     var template = $('#tpl-liste').html();
644     Mustache.parse(template);   // optional, speeds up future uses
645     $('.figure').attr('onclick','').unbind('click');
646     $('#dateien').empty();
647     $('#dateien').html(Mustache.render(template, fl));
648     $('.datei-zeile').click(fm_dateiwahl);
649   }
650   /*
651   if(modus == 'kacheln') {
652     // Kachelansicht
a3d410 653     $.get('tpl-kacheln.txt', function(template) {
U 654       $('#dateien').empty();
655       $('#dateien').html(Mustache.render(template, fl));
656       $('.figure').click(fm_dateiwahl);
657     });
10d3d3 658     $('.datei-zeile').attr('onclick','').unbind('click');
U 659   } else {
660     // Listenansicht
a3d410 661     $.get('tpl-liste.txt', function(template) {
U 662       $('#dateien').empty();
663       $('#dateien').html(Mustache.render(template, fl));
664       $('.datei-zeile').click(fm_dateiwahl);
665     });
10d3d3 666     $('.figure').attr('onclick','').unbind('click');
U 667   }
7d8ef6 668   */
10d3d3 669 }
U 670
a75859 671 function fm_menu_datei_speichern(callback) {
5ebb8e 672   //var fname = $('.datei-gewaehlt').text();
U 673   var fname = openFileName;
674   if(fname !== undefined && fname !== '') {
a75859 675     fm_save_file(fname, 'saveTextFile', callback);
5ebb8e 676   } else {
a75859 677     fm_menu_datei_speichern_unter(callback);
5ebb8e 678   }
U 679 }
680
681
a75859 682 function fm_menu_datei_speichern_unter(callback) {  
915927 683   $('#modal_ok').click(function() {
a75859 684     $('#modal_ok').attr('onclick','').unbind('click');
915927 685     // hier speichern
a75859 686     fm_save_file($('#dateiname').val(), 'saveTextFileAs', callback);
915927 687   });
957b51 688   $('#saveModalTitle').text('Datei speichern');
c509a0 689   $('#dialogfrage').text("Dateiname?");
3ad4db 690   
U 691   var fname = $('.datei-gewaehlt').text();
692   if(fname !== undefined) {
693     $('#dateiname').val(fname);
694   } else {
695     $('#dateiname').val('');
696   }
c509a0 697   $('#dateiname').attr('placeholder', 'Dateiname');
915927 698   $('#saveModal').modal({
U 699     keyboard: false,
700     show: true
701   });
a4d3b5 702 }
U 703
b7475d 704
U 705
a4d3b5 706 /* ---- codemirror editor handling -------- */
U 707
64d8b9 708 /*
942d63 709 function htmlDecode(value){ 
U 710   return $('<div/>').html(value).text(); 
711 }
64d8b9 712 */
942d63 713
42fece 714 function fm_code_edit(content, m) {
a4d3b5 715   cm = CodeMirror.fromTextArea(document.getElementById("editspace"), {
U 716     lineNumbers: true,
e3043f 717     gutters: ["CodeMirror-linenumbers", "breakpoints"],
42fece 718     mode: m,
a4d3b5 719     viewportMargin : Infinity,
d920b7 720     tabSize: 2,
a4d3b5 721     extraKeys: {
915927 722         "F9": function(cm) {
U 723         cm.setOption("fullScreen", !cm.getOption("fullScreen"));
724       },
725         "Esc": function(cm) {
726         if (cm.getOption("fullScreen")) cm.setOption("fullScreen", false);
7ad1b7 727       },
U 728         ".": function(cm) {
729         console.log('dot pressed: perhaps look up class or method name');
3b7c5b 730         /*
U 731          * Hier kann man eine Funktion ausloesen, die fuer das 
732          * Wort vor dem Punkt (Name der Klasse) eine Liste mit 
733          * Vorschlaegen fuer Methodennamen einblendet.
734          */
735         
736         /*
737          * CodeMirror.Pass laesst das Zeichen zum Editorinhalt durch, 
738          * verhindert aber das Ausloesen von 'keyHandled'
739          */
740         return CodeMirror.Pass; 
915927 741       }
a4d3b5 742     }
U 743   });
fab80c 744   //cm.setValue(htmlDecode(content));
U 745   //cm.setValue(content);
746   cm.setValue(unescapeHtml(content));
3003b2 747   cm.getDoc().markClean();
e3043f 748   cm.on("gutterClick", function(theEditor, lineNumber) {
U 749     var info = theEditor.lineInfo(lineNumber);
750     //--lineNumber;
751     //console.log(info.gutterMarkers.breakpoints.message);
752     //var marker = info.gutterMarkers.breakpoints;
753     //$(marker).tooltip('toggle');
754   });
3b7c5b 755   /*
7ad1b7 756   cm.on("keyHandled", function(theEditor, keyName, event){
3b7c5b 757     console.log('cm.keyHandled keyName: ' + keyName + ', event.type: ' + event.type);    
7ad1b7 758   });
3b7c5b 759   */
e3043f 760 }
U 761
762 function makeMarker(msg) {
763   var marker = document.createElement("div");
764   marker.style.color = "#822";
765   marker.innerHTML = "●";
766   //marker.message = msg;
767   $(marker).tooltip({
768     placement: 'right',
769     title: msg,
ed12de 770     offset: '0 -30'
e3043f 771   });
U 772   return marker;
915927 773 }
a4d3b5 774
U 775 /* -------- helper functions ----------- */
776
e5ff42 777 function fm_serialise(obj) {
U 778   return '{"' + obj.constructor.name + '":' + JSON.stringify(obj) + '}';
915927 779 }
e5ff42 780
fab80c 781 function escapeHtml(text) {
U 782   text = text.replace(/\u228/g,'&auml;');
783   text = text.replace(/\u246/g,'&ouml;');
784   text = text.replace(/\u252/g,'&uuml;');
785   text = text.replace(/\u196/g,'&Auml;');
786   text = text.replace(/\u214/g,'&Ouml;');
787   text = text.replace(/\u220/g,'&Uuml;');
788   text = text.replace(/\u223/g,'&szlig;');
789   text = text.replace(/\u26/g,'&amp;');
790   return text;
791 }
792
793 function unescapeHtml(text) {
794   text = text.replace(/&auml;/g, String.fromCharCode(228));
795   text = text.replace(/&ouml;/g, String.fromCharCode(246));
796   text = text.replace(/&uuml;/g, String.fromCharCode(252));
797   text = text.replace(/&Auml;/g, String.fromCharCode(196));
798   text = text.replace(/&Ouml;/g, String.fromCharCode(214));
799   text = text.replace(/&Uuml;/g, String.fromCharCode(220));
800   text = text.replace(/&szlig;/g, String.fromCharCode(223));
801   text = text.replace(/&amp;/g, String.fromCharCode(26));
802   return text;
803 }
804
7aa566 805