Hooked up new text pane..

This commit is contained in:
Snowyfox 2022-05-19 03:24:03 -04:00
parent bcf852cdc9
commit dc980c153c
3 changed files with 56 additions and 96 deletions

View File

@ -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<String, Image> 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<RichTextPane.Segment>
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<String, Image> 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<String> nodes = RudimentaryHTMLParser.depthlessRead(n);
for (Tree<String> 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<RichTextPane.Segment> lay1, lay2;
List<RichTextPane.Segment> 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(

View File

@ -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<String>());
Tree<String> 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);

View File

@ -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));