Projekt

Obecné

Profil

Stáhnout (3.67 KB) Statistiky
| Větev: | Tag: | Revize:
1

    
2
import io.FileWorker;
3
import javafx.concurrent.Worker;
4
import javafx.scene.effect.BlendMode;
5
import javafx.scene.input.Clipboard;
6
import javafx.scene.input.ClipboardContent;
7
import javafx.scene.input.DataFormat;
8
import javafx.scene.input.KeyCode;
9
import javafx.scene.web.WebEngine;
10
import javafx.scene.web.WebView;
11
import netscape.javascript.JSObject;
12

    
13
public class Editor {
14
	
15
	public static final String DEFAULT_MODE = "javascript"; // Zeek and Javascript are the best modes.
16
	public static final String DEFAULT_THEME = "eclipse";
17
	
18
	private WebView view;
19
	private WebEngine engine;
20
	
21
	private JSObject editor;
22
	private JSObject session;
23
	
24
	private String json;
25
	
26
	public Editor() {
27
		view = new WebView();
28
		view.setPrefHeight(400);
29
		view.setBlendMode(BlendMode.DARKEN);
30
		view.setContextMenuEnabled(false);
31
		view.setOnKeyReleased(event -> {
32
			if (event.isControlDown() && event.getCode() == KeyCode.C) {
33
				String copy = (String) editor.call("getSelectedText");
34
				if (copy != null) {
35
					ClipboardContent content = new ClipboardContent();
36
					content.put(DataFormat.PLAIN_TEXT, copy);
37
		            Clipboard.getSystemClipboard().setContent(content);
38
		        }
39
		    }
40
		});
41
		
42
		engine = view.getEngine();
43
		engine.loadContent(getBasicHTML());
44
		engine.getLoadWorker().stateProperty().addListener((observable, oldValue, newValue) -> {
45
			if (newValue == Worker.State.SUCCEEDED) {
46
	        	JSObject ace = (JSObject) engine.executeScript("ace");
47
	            editor = (JSObject) ace.call("edit", "editor");
48
	            session = (JSObject) editor.call("getSession");
49
	            
50
	            session.call("setUseWorker", false);
51
	            editor.call("setReadOnly", true);
52
	            
53
	            setMode(DEFAULT_MODE);
54
	            setTheme(DEFAULT_THEME);
55
	        }
56
		});
57
	}
58
	
59
	public void setMode(String mode) {
60
		session.call("setMode", "ace/mode/" + mode);
61
	}
62
	
63
	public void setTheme(String theme) {
64
		editor.call("setTheme", "ace/theme/" + theme);
65
	}
66
	
67
	public WebView getView() {
68
		return view;
69
	}
70
	
71
	public String getJson() {
72
		return json;
73
	}
74
	
75
	public void setContent(String html, String json) {
76
		this.json = json;
77
		editor.call("setValue", "");
78
		editor.call("insert", json);
79
	}
80
	
81
    private String getBasicHTML() {
82
    	return "<!DOCTYPE html>" + 
83
    			"<html>" + 
84
    			"<head>" + 
85
    			"  <style type=\"text/css\">" + 
86
    			"    #editor {" + 
87
    			"      margin: 0;" + 
88
    			"      position: absolute;" + 
89
    			"      top: 0;" + 
90
    			"      bottom: 0;" + 
91
    			"      left: 0;" + 
92
    			"      right: 0;" + 
93
    			"    }" + 
94
    			"  </style>" + 
95
    			"</head>" + 
96
    			"<body>" +
97
    			"<div id=\"editor\"></div>" +
98
    			"<script src=\"" + FileWorker.getResource("/ace/ace.js") + "\"></script>" +
99
    			"</body>" + 
100
    			"</html>";
101
    }
102
    
103
    // Convert HTML to string with HTML entities for insertion to JS. IT IS NO LONGER USED - only for "NICE TO HAVE".
104
    private String escape(String str) {
105
		StringBuilder builder = new StringBuilder();
106
		char strArray[] = str.toCharArray();
107
		for (int i = 0; i < strArray.length; i++) {
108
			char c = strArray[i];
109
			switch (c) {
110
				case '\'': builder.append("&#39;"); break;
111
				case '<': builder.append("&lt;"); break;
112
				case '>': builder.append("&gt;"); break;
113
				case '&': builder.append("&amp;"); break;
114
				case '"': builder.append("&quot;"); break;
115
				case '\n': builder.append("<br/>"); break;
116
				case '\t': builder.append("&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;"); break;
117
				case ' ': builder.append("&nbsp;"); break;
118
				case (char) 13: break;
119
				default:
120
					if (c < 128) {
121
						builder.append(c);
122
					} else {
123
						builder.append("&#").append((int) c).append(";");
124
					}
125
			}
126
		}
127
		return builder.toString();
128
	}
129
    
130
}
(4-4/6)