diff options
| author | Fuwn <[email protected]> | 2026-02-12 22:33:32 -0800 |
|---|---|---|
| committer | Fuwn <[email protected]> | 2026-02-12 22:33:32 -0800 |
| commit | c7a9d4a6bd53ed7d61731770f2f10e8b9fd435f9 (patch) | |
| tree | df9f48bf128a6c0186a8e91857d6ff30fe0e9f18 /NET/worlds/console/StyledTextCanvas.java | |
| download | worldsplayer-c7a9d4a6bd53ed7d61731770f2f10e8b9fd435f9.tar.xz worldsplayer-c7a9d4a6bd53ed7d61731770f2f10e8b9fd435f9.zip | |
Initial commit
Diffstat (limited to 'NET/worlds/console/StyledTextCanvas.java')
| -rw-r--r-- | NET/worlds/console/StyledTextCanvas.java | 209 |
1 files changed, 209 insertions, 0 deletions
diff --git a/NET/worlds/console/StyledTextCanvas.java b/NET/worlds/console/StyledTextCanvas.java new file mode 100644 index 0000000..9472734 --- /dev/null +++ b/NET/worlds/console/StyledTextCanvas.java @@ -0,0 +1,209 @@ +package NET.worlds.console; + +import NET.worlds.core.IniFile; +import java.awt.Canvas; +import java.awt.Color; +import java.awt.FontMetrics; +import java.awt.Graphics; +import java.awt.Image; +import java.awt.Rectangle; +import java.awt.Scrollbar; +import java.awt.event.KeyEvent; +import java.awt.event.MouseEvent; + +class StyledTextCanvas extends Canvas { + private static final long serialVersionUID = -2680423246934436331L; + private MouseEvent delayedMouseEvent = null; + protected int mouseX = -1; + protected int mouseY = -1; + protected int startX = -1; + protected int startY = -1; + protected int endX = -1; + protected int endY = -1; + protected long mouseWhen = 0L; + protected boolean mouseActive = false; + protected boolean mouseDoubleClick = false; + protected static long doubleClickSpeed = IniFile.override().getIniInt("DoubleClickSpeed", 300); + + public StyledTextCanvas() { + this.enableEvents(61L); + this.setEnabled(true); + } + + public void sendDelayedMouseEvent(MouseEvent e) { + synchronized (this.getParent()) { + this.delayedMouseEvent = e; + } + } + + @Override + public void setBounds(int x, int y, int w, int h) { + if (this.getParent() != null && w >= 0 && h >= 0) { + synchronized (this.getParent()) { + if (this.getParent() instanceof GammaTextArea) { + GammaTextArea gta = (GammaTextArea)this.getParent(); + gta.setWidth(w); + gta.setHeight(h); + gta.rewrap(); + } + + super.setBounds(x, y, w, h); + } + } + } + + @Override + protected void processMouseMotionEvent(MouseEvent e) { + if (e.getID() == 506 && this.mouseActive) { + this.processMouseEvent(e); + } + + super.processMouseMotionEvent(e); + } + + @Override + protected void processMouseEvent(MouseEvent e) { + synchronized (this.getParent()) { + if (e.getID() == 500) { + if (this.mouseWhen > 0L && e.getWhen() - this.mouseWhen <= doubleClickSpeed) { + this.mouseDoubleClick = true; + this.mouseWhen = 0L; + this.mouseX = this.startX = this.endX = e.getX(); + this.mouseY = this.startY = this.endY = e.getY(); + ((GammaTextArea)this.getParent()).selectionConversion = true; + this.getParent().repaint(); + } else { + this.mouseDoubleClick = false; + this.mouseWhen = e.getWhen(); + if (e.getButton() == 1 && !this.mouseActive && (e.getModifiers() & 1) == 0) { + ((GammaTextArea)this.getParent()).selectionStart = -1; + ((GammaTextArea)this.getParent()).selectionEnd = -1; + } + } + + this.getParent().requestFocus(); + } else if (e.getID() == 501) { + if (e.getButton() == 1) { + if ((e.getModifiers() & 1) == 0) { + if (((GammaTextArea)this.getParent()).selectionStart >= 0 + && ((GammaTextArea)this.getParent()).selectionEnd > ((GammaTextArea)this.getParent()).selectionStart) { + ((GammaTextArea)this.getParent()).selectionStart = -1; + ((GammaTextArea)this.getParent()).selectionEnd = -1; + } else { + this.mouseX = this.startX = this.endX = e.getX(); + this.mouseY = this.startY = this.endY = e.getY(); + this.mouseActive = true; + ((GammaTextArea)this.getParent()).selectionConversion = true; + } + } else { + this.mouseX = this.startX = this.endX = e.getX(); + this.mouseY = this.startY = this.endY = e.getY(); + this.mouseActive = true; + ((GammaTextArea)this.getParent()).selectionConversion = true; + } + + this.getParent().repaint(); + } + + this.getParent().requestFocus(); + } else if (this.mouseActive && (e.getID() == 506 || e.getID() == 507 || e.getID() == 507)) { + if ((e.getModifiers() & 16) != 0) { + this.mouseX = this.endX = e.getX(); + this.mouseY = this.endY = e.getY(); + ((GammaTextArea)this.getParent()).selectionConversion = true; + this.getParent().repaint(); + } + + this.getParent().requestFocus(); + } else if (e.getID() == 502) { + if (e.getButton() == 1 && this.mouseActive) { + this.mouseX = this.endX = e.getX(); + this.mouseY = this.endY = e.getY(); + this.mouseActive = false; + ((GammaTextArea)this.getParent()).selectionConversion = false; + this.getParent().repaint(); + } + + this.getParent().requestFocus(); + } + + ((GammaTextArea)this.getParent()).processMouseEvent(e); + super.processMouseEvent(e); + } + } + + @Override + public void update(Graphics g) { + this.paint(g); + } + + @Override + protected void processKeyEvent(KeyEvent e) { + synchronized (this.getParent()) { + if (e.getID() == 401) { + Scrollbar s = null; + if (this.getParent() instanceof GammaTextArea) { + GammaTextArea gta = (GammaTextArea)this.getParent(); + s = gta.getVertScrollbar(); + } + + if (e.getKeyCode() == 33) { + if (s != null && s.isEnabled()) { + s.dispatchEvent(e); + } + } else if (e.getKeyCode() == 34 && s != null && s.isEnabled()) { + s.dispatchEvent(e); + } + } + + super.processKeyEvent(e); + } + } + + @Override + public void paint(Graphics g) { + synchronized (this.getParent()) { + if (this.getParent().isEnabled()) { + GammaTextArea gta = (GammaTextArea)this.getParent(); + Rectangle r = this.getBounds(); + if (r.width <= 0 || r.height <= 0) { + return; + } + + Image offImage = this.createImage(r.width, r.height); + Graphics offGraphic = offImage.getGraphics(); + offGraphic.setColor(GammaTextArea.getBackgroundColor()); + offGraphic.fillRect(r.x, r.y, r.width, r.height); + offGraphic.setColor(Color.black); + if (gta.getHasFocus()) { + offGraphic.setColor(Color.blue); + offGraphic.drawRect(r.x, r.y, r.width - 1, r.height - 1); + offGraphic.drawRect(r.x + 1, r.y + 1, r.width - 2, r.height - 2); + offGraphic.setColor(Color.black); + } + + offGraphic.setFont(gta.getFont()); + FontMetrics fm = offGraphic.getFontMetrics(gta.getFont()); + gta._curpos = 0; + if (gta.getNumLines() <= gta.getCanvasLines()) { + for (int i = 0; i < gta.getNumLines(); i++) { + gta.drawLine(offGraphic, i, (i + 1) * fm.getHeight() - fm.getDescent()); + } + } else { + int i = gta.getScrollLine(); + + for (int j = 1; i < gta.getNumLines(); j++) { + gta.drawLine(offGraphic, i, j * fm.getHeight() - fm.getDescent()); + i++; + } + } + + g.drawImage(offImage, 0, 0, this); + if (this.delayedMouseEvent != null) { + this.processMouseEvent(this.delayedMouseEvent); + this.delayedMouseEvent = null; + } + } + } + } +} |