-
Notifications
You must be signed in to change notification settings - Fork 1
/
EasyEditorPane.java
89 lines (77 loc) · 2.98 KB
/
EasyEditorPane.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
/*
* To change this template, choose Tools | Templates
* and open the template in the this.
*/
package com.wedusc.ui;
import java.awt.event.KeyEvent;
import javax.swing.text.html.HTMLDocument;
/**
*
* @author Sean McBeth
*/
public class EasyEditorPane extends javax.swing.JEditorPane {
public boolean embolden() {
return simpleEdit("b", "");
}
public boolean italicize() {
return simpleEdit("i", "");
}
public boolean underline() {
return simpleEdit("u", "");
}
public boolean centerText() {
return simpleEdit("center", "");
}
public boolean setFontAttributes(String color, String face, int size) {
return simpleEdit("font", String.format(" color=\"%s\" face=\"%s\" size=\"%d\"", color, face, size));
}
private boolean simpleEdit(String tag, String attr) {
HTMLDocument doc = (HTMLDocument) this.getDocument();
String startTag = "<" + tag + attr + ">";
String endTag = "</" + tag + ">";
String startMarker = "[START_" + tag + "]";
String endMarker = "[END_" + tag + "]";
int selStart = this.getSelectionStart();
int selEnd = this.getSelectionEnd();
// stick some predictable text into the document to be able to
// find it.
try {
doc.insertString(selStart, startMarker, null);
// the selection end changes when you insert text before it
doc.insertString(this.getSelectionEnd(), endMarker, null);
} catch (Exception exp) {
}
// look to see if the desired tag is already in effect in the
// range of the selection.
String text = this.getText();
int startX = text.indexOf(startMarker);
int start1 = text.indexOf(startTag, startX);
int endX = text.indexOf(endMarker);
int end2 = text.lastIndexOf(endTag, endX);
boolean result = true;
// if so, remove it
if (start1 >= startX + startMarker.length() && start1 <= endX
&& end2 > startX && end2 + endTag.length() <= endX) {
// don't change the stuff before the selection
String left = text.substring(0, startX);
// targeting the middle
String mid = text.substring(startX, endX + endMarker.length());
// don't change the stuff after the selection
String right = text.substring(endX + endMarker.length(), text.length());
//remove both the tag and the markers
text = left + mid.replace(startTag, "")
.replace(endTag, "")
.replace(startMarker, "")
.replace(endMarker, "")
+ right;
result = false;
} else { // otherwise, add it
text = text.replace(startMarker, startTag)
.replace(endMarker, endTag);
}
this.setText(text);
this.setSelectionStart(selStart);
this.setSelectionEnd(selEnd);
return result;
}
}