From dc980c153c6b39dc28eb6df7e154075b3592836c Mon Sep 17 00:00:00 2001 From: Snowyfox Date: Thu, 19 May 2022 03:24:03 -0400 Subject: [PATCH] Hooked up new text pane.. --- PostWindow.java | 112 ++++++++++----------------------------------- RichTextPane3.java | 12 ++++- WindowUpdater.java | 28 +++++++++--- 3 files changed, 56 insertions(+), 96 deletions(-) diff --git a/PostWindow.java b/PostWindow.java index bc750db..6c5c2f7 100644 --- a/PostWindow.java +++ b/PostWindow.java @@ -61,12 +61,6 @@ PostWindow extends JFrame { private PostComponent display; - private static JFrame - test; - - private static RichTextPane3 - test2; - // - -%- - private static final DateTimeFormatter @@ -123,24 +117,6 @@ PostWindow extends JFrame { display.resetFocus(); repaint(); - - if (test == null) - { - test = new JFrame(); - test.setSize(340, 256); - test2 = new RichTextPane3(); - test2.setFont(new Font("Dialog", Font.PLAIN, 18)); - test.setContentPane(test2); - test.setVisible(true); - } - test2.setText(BasicHTMLParser.parse(post.text)); - Map emojis = new HashMap<>(); - for (String[] entry: post.emojiUrls) - { - emojis.put(entry[0], ImageApi.remote(entry[1])); - } - test2.setEmojis(emojis); - test2.requestFocusInWindow(); } public void @@ -249,8 +225,11 @@ PostWindow extends JFrame { Composition c = Composition.reply(this.post, ownId); ComposeWindow w = primaire.getComposeWindow(); w.setComposition(c); - w.setLocation(getX(), getY() + 100); - w.setVisible(true); + if (!w.isVisible()) + { + w.setLocation(getX(), getY() + 100); + w.setVisible(true); + } } public synchronized void @@ -396,10 +375,13 @@ implements ActionListener { // - -%- - private List - authorNameOr, bodyOr; + authorNameOr; private RichTextPane - authorName, body; + authorName; + + private RichTextPane3 + body; private JScrollPane bodyScrollPane; @@ -450,57 +432,22 @@ implements ActionListener { setTime(String n) { time.setText(n); } public void - setEmojiUrls(String[][] n) { emojiUrls = n; } + setEmojiUrls(String[][] n) + { + emojiUrls = n; + + Map emojis = new HashMap<>(); + for (String[] entry: n) + { + emojis.put(entry[0], ImageApi.remote(entry[1])); + } + body.setEmojis(emojis); + } public void setHtml(String n) { - RichTextPane.Builder b = new RichTextPane.Builder(); - Tree nodes = RudimentaryHTMLParser.depthlessRead(n); - for (Tree node: nodes) - { - if (node.key.equals("tag")) - { - String tagName = node.get(0).key; - if (tagName.equals("br")) - b = b.spacer("\n"); - if (tagName.equals("/p")) - b = b.spacer("\n").spacer("\n"); - if (tagName.equals("a")) - b = b.link(node.get("href").value, null).spacer(" "); - } - if (node.key.equals("text")) - { - BreakIterator it = BreakIterator.getWordInstance(Locale.ROOT); - String text = node.value; - it.setText(text); - int start = it.first(), end = it.next(); - while (end != BreakIterator.DONE) - { - String word = text.substring(start, end); - char c = word.isEmpty() ? ' ' : word.charAt(0); - boolean w = Character.isWhitespace(c); - b = w ? b.spacer(word) : b.text(word); - start = end; - end = it.next(); - } - } - if (node.key.equals("emoji")) - { - String shortcode = node.value; - String url = null; - for (String[] entry: emojiUrls) - if (entry[0].equals(shortcode)) url = entry[1]; - try { - ImageIcon image = new ImageIcon(new URL(url)); - b = b.image(image, node.value); - } - catch (MalformedURLException eMu) { - b = b.text(":" + shortcode + ":"); - } - } - } - bodyOr = b.finish(); + body.setText(BasicHTMLParser.parse(n)); } public void @@ -615,21 +562,10 @@ implements ActionListener { g.clearRect(0, 0, getWidth(), getHeight()); int w1 = authorName.getWidth(); - int w2 = body.getWidth(); FontMetrics fm1 = getFontMetrics(authorName.getFont()); - FontMetrics fm2 = getFontMetrics(body.getFont()); - List lay1, lay2; + List lay1; lay1 = RichTextPane.layout(authorNameOr, fm1, w1); - lay2 = RichTextPane.layout(bodyOr, fm2, w2); - authorName.setText(lay1); - body.setText(lay2); - - int maxY = 0; for (RichTextPane.Segment s: lay2) - { - if (s.y > maxY) maxY = s.y; - } - body.setPreferredSize(new Dimension(1, maxY + 10)); ((java.awt.Graphics2D)g).setRenderingHint( java.awt.RenderingHints.KEY_ANTIALIASING, @@ -720,7 +656,7 @@ implements ActionListener { top.add(Box.createVerticalStrut(2)); top.add(top2); - body = new RichTextPane(); + body = new RichTextPane3(); body.setFont(f3); bodyScrollPane = new JScrollPane( diff --git a/RichTextPane3.java b/RichTextPane3.java index fc5fd7f..8cd2db6 100644 --- a/RichTextPane3.java +++ b/RichTextPane3.java @@ -6,6 +6,7 @@ import java.awt.FontMetrics; import java.awt.Font; import java.awt.Image; import java.awt.Color; +import java.awt.Dimension; import java.awt.event.ComponentListener; import java.awt.event.ComponentEvent; import java.awt.event.MouseListener; @@ -49,6 +50,7 @@ implements if (!isValid()) return; + assert html.key != null; assert html.key.equals("tag"); assert html.get("children") != null; @@ -76,6 +78,8 @@ implements layout(html, fm, cursor); layout.put(layoutEnd, new Point(cursor)); repaint(); + + setPreferredSize(new Dimension(1, cursor.y)); } public void @@ -515,7 +519,13 @@ implements layout = new HashMap<>(); layoutEnd = new Tree<>("text", ""); emojis = new HashMap<>(); - setText(new Tree()); + + Tree blank = new Tree<>(); + blank.key = "tag"; + blank.add(new Tree<>("html", null)); + blank.add(new Tree<>("children", null)); + setText(blank); + this.addComponentListener(this); this.addMouseListener(this); this.addMouseMotionListener(this); diff --git a/WindowUpdater.java b/WindowUpdater.java index 3125e1a..dac7b59 100644 --- a/WindowUpdater.java +++ b/WindowUpdater.java @@ -70,6 +70,15 @@ WindowUpdater { userConn.reevaluate(); } +// - -%- - + + public static void + printStackTrace(Thread thread) + { + for (StackTraceElement e: thread.getStackTrace()) + System.err.println(e); + } + // ---%-@-%--- private class @@ -97,6 +106,7 @@ WindowUpdater { { stopping = false; thread = new Thread(this); + thread.setDaemon(true); try { synchronized (thread) @@ -118,17 +128,18 @@ WindowUpdater { thread.interrupt(); try { - thread.join(); + thread.join(3000); + /* + * That thread should notice it is + * interrupted ppromptly, and close. + */ + if (thread.isAlive()) printStackTrace(thread); } catch (InterruptedException eIt) { assert false; } thread = null; - /* - * That thread should notice it is interrupted - * promptly, and close. - */ } public void @@ -162,6 +173,10 @@ WindowUpdater { // the connection is closed, or this thread // is interrupted. + System.err.println( + "Stopped monitoring." + + thread + " " + Thread.currentThread() + ); if (thread == Thread.currentThread()) thread = null; /* * This isn't thread safe. But I'd like the @@ -279,8 +294,7 @@ WindowUpdater { void loadNotificationSound() { - //URL url = getClass().getResource("KDE_Dialog_Appear.wav"); - URL url = getClass().getResource("LinkinPark.wav"); + URL url = getClass().getResource("KDE_Dialog_Appear.wav"); try { Clip clip = AudioSystem.getClip(); clip.open(AudioSystem.getAudioInputStream(url));