Projekt

Obecné

Profil

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

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

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