Skip to content

Commit f356a92

Browse files
mvysnyjavier-godoy
authored andcommitted
feat: implement PreserveStateAddon
Part of #14
1 parent f9d9623 commit f356a92

File tree

1 file changed

+146
-0
lines changed

1 file changed

+146
-0
lines changed
Lines changed: 146 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,146 @@
1+
package com.flowingcode.vaadin.addons.xterm;
2+
3+
import java.util.Objects;
4+
import java.util.concurrent.CompletableFuture;
5+
6+
/**
7+
* Add-on which preserves the client-side state when the component is removed
8+
* from the UI then reattached later on.
9+
* <p></p>
10+
* To use this addon, simply create the addon then make sure to call all {@link ITerminal}
11+
* and {@link ITerminalOptions} methods via this addon:
12+
* <pre>
13+
* final XTerm xterm = new XTerm();
14+
* final PreserveStateAddon addon = new PreserveStateAddon(xterm);
15+
* addon.writeln("Hello!");
16+
* addon.write("$ ");
17+
* </pre>
18+
*/
19+
public class PreserveStateAddon implements ITerminal {
20+
private final XTermBase xterm;
21+
private final StringBuilder scrollbackBuffer = new StringBuilder();
22+
/**
23+
* All commands are properly applied before the first attach; they're just
24+
* not preserved after subsequent detach/attach.
25+
*/
26+
private boolean wasDetachedOnce = false;
27+
28+
public PreserveStateAddon(XTerm xterm) {
29+
this.xterm = Objects.requireNonNull(xterm);
30+
xterm.addAttachListener(e -> {
31+
if (wasDetachedOnce) {
32+
xterm.write(scrollbackBuffer.toString());
33+
}
34+
});
35+
xterm.addDetachListener(e -> wasDetachedOnce = true);
36+
xterm.addLineListener(e -> {
37+
// also make sure that any user input ends up in the scrollback buffer.
38+
scrollbackBuffer.append(e.getLine());
39+
scrollbackBuffer.append('\n');
40+
});
41+
}
42+
43+
@Override
44+
public void blur() {
45+
xterm.blur();
46+
}
47+
48+
@Override
49+
public void focus() {
50+
xterm.focus();
51+
}
52+
53+
@Override
54+
public CompletableFuture<Boolean> hasSelection() {
55+
return xterm.hasSelection();
56+
}
57+
58+
@Override
59+
public CompletableFuture<String> getSelection() {
60+
return xterm.getSelection();
61+
}
62+
63+
@Override
64+
public void clearSelection() {
65+
xterm.clearSelection();
66+
}
67+
68+
@Override
69+
public void select(int column, int row, int length) {
70+
xterm.select(column, row, length);
71+
}
72+
73+
@Override
74+
public void selectAll() {
75+
xterm.selectAll();
76+
}
77+
78+
@Override
79+
public void selectLines(int start, int end) {
80+
xterm.selectLines(start, end);
81+
}
82+
83+
@Override
84+
public void scrollLines(int amount) {
85+
xterm.scrollLines(amount);
86+
}
87+
88+
@Override
89+
public void scrollPages(int pageCount) {
90+
xterm.scrollPages(pageCount);
91+
}
92+
93+
@Override
94+
public void scrollToTop() {
95+
xterm.scrollToTop();
96+
}
97+
98+
@Override
99+
public void scrollToBottom() {
100+
xterm.scrollToBottom();
101+
}
102+
103+
@Override
104+
public void scrollToLine(int line) {
105+
xterm.scrollToLine(line);
106+
}
107+
108+
@Override
109+
public void clear() {
110+
xterm.clear();
111+
scrollbackBuffer.delete(0, scrollbackBuffer.length());
112+
}
113+
114+
@Override
115+
public void write(String data) {
116+
xterm.write(data);
117+
scrollbackBuffer.append(data);
118+
}
119+
120+
@Override
121+
public void writeln(String data) {
122+
xterm.writeln(data);
123+
scrollbackBuffer.append(data);
124+
scrollbackBuffer.append('\n');
125+
}
126+
127+
@Override
128+
public void paste(String data) {
129+
xterm.paste(data);
130+
}
131+
132+
@Override
133+
public void refresh(int start, int end) {
134+
xterm.refresh(start, end);
135+
}
136+
137+
@Override
138+
public void reset() {
139+
xterm.reset();
140+
}
141+
142+
@Override
143+
public void resize(int columns, int rows) {
144+
xterm.resize(columns, rows);
145+
}
146+
}

0 commit comments

Comments
 (0)