Projekt

Obecné

Profil

Stáhnout (3.76 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
	            // Slower scrolling.
51
	            editor.call("setScrollSpeed", ".1");
52
	            
53
	            session.call("setUseWorker", false);
54
	            editor.call("setReadOnly", true);
55
	            
56
	            setMode(DEFAULT_MODE);
57
	            setTheme(DEFAULT_THEME);
58
	        }
59
		});
60
	}
61
	
62
	public void setMode(String mode) {
63
		session.call("setMode", "ace/mode/" + mode);
64
	}
65
	
66
	public void setTheme(String theme) {
67
		editor.call("setTheme", "ace/theme/" + theme);
68
	}
69
	
70
	public WebView getView() {
71
		return view;
72
	}
73
	
74
	public String getJson() {
75
		return json;
76
	}
77
	
78
	public void setContent(String json) {
79
		this.json = json;
80
		editor.call("setValue", "");
81
		editor.call("insert", json);
82
	}
83
	
84
    private String getBasicHTML() {
85
    	return "<!DOCTYPE html>" + 
86
    			"<html>" + 
87
    			"<head>" + 
88
    			"  <style type=\"text/css\">" + 
89
    			"    #editor {" + 
90
    			"      margin: 0;" + 
91
    			"      position: absolute;" + 
92
    			"      top: 0;" + 
93
    			"      bottom: 0;" + 
94
    			"      left: 0;" + 
95
    			"      right: 0;" + 
96
    			"    }" + 
97
    			"  </style>" + 
98
    			"</head>" + 
99
    			"<body>" +
100
    			"<div id=\"editor\"></div>" +
101
    			"<script src=\"" + FileWorker.getResource("/ace/ace.js") + "\"></script>" +
102
    			"</body>" + 
103
    			"</html>";
104
    }
105
    
106
    // Convert HTML to string with HTML entities for insertion to JS. IT IS NO LONGER USED - only for "NICE TO HAVE".
107
    private String escape(String str) {
108
		StringBuilder builder = new StringBuilder();
109
		char strArray[] = str.toCharArray();
110
		for (int i = 0; i < strArray.length; i++) {
111
			char c = strArray[i];
112
			switch (c) {
113
				case '\'': builder.append("&#39;"); break;
114
				case '<': builder.append("&lt;"); break;
115
				case '>': builder.append("&gt;"); break;
116
				case '&': builder.append("&amp;"); break;
117
				case '"': builder.append("&quot;"); break;
118
				case '\n': builder.append("<br/>"); break;
119
				case '\t': builder.append("&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;"); break;
120
				case ' ': builder.append("&nbsp;"); break;
121
				case (char) 13: break;
122
				default:
123
					if (c < 128) {
124
						builder.append(c);
125
					} else {
126
						builder.append("&#").append((int) c).append(";");
127
					}
128
			}
129
		}
130
		return builder.toString();
131
	}
132
    
133
}
(3-3/6)