biskuteri-cafe-JKomasto2/PostWindow.java

445 lines
9.9 KiB
Java
Raw Normal View History

2021-07-16 00:37:03 +02:00
import javax.swing.JFrame;
import javax.swing.JPanel;
2021-07-16 00:37:03 +02:00
import javax.swing.JMenuBar;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.Box;
import javax.swing.BorderFactory;
import java.awt.Graphics;
import java.awt.FontMetrics;
2021-07-16 00:37:03 +02:00
import java.awt.Dimension;
import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.util.List;
import java.util.ArrayList;
2021-07-16 00:37:03 +02:00
class
PostWindow extends JFrame
implements ActionListener {
2021-07-16 00:37:03 +02:00
2021-07-16 11:46:17 +02:00
private Post
post;
// - -%- -
2021-07-16 00:37:03 +02:00
private PostComponent
2021-07-16 11:46:17 +02:00
postDisplay;
2021-07-16 00:37:03 +02:00
private RepliesComponent
2021-07-16 11:46:17 +02:00
repliesDisplay;
2021-07-16 00:37:03 +02:00
// ---%-@-%---
2021-07-17 13:17:14 +02:00
public void
setPost(Post post)
2021-07-17 13:17:14 +02:00
{
if (post == null)
{
post = new Post();
post.text = "This is a sample post.";
post.authorId = "snowyfox@biskuteri.cafe";
post.authorName = "snowyfox";
post.date = "0712hrs, 17 July";
post.visibility = PostVisibility.MENTIONED;
post.postId = "000000000";
post.boosted = false;
post.favourited = true;
}
this.post = post;
2021-07-29 11:26:16 +02:00
List<RepliesComponent.Reply> replies = null;
{
List<Post> posts = null;
// We should make a request to JKomasto here.
}
if (replies == null)
{
RepliesComponent.Reply reply1, reply2, reply3;
reply1 = new RepliesComponent.Reply();
reply1.author = "Black tea";
reply1.text = "Rich..";
reply2 = new RepliesComponent.Reply();
reply2.author = "Green tea";
reply2.text = "Clean!";
reply3 = new RepliesComponent.Reply();
reply3.author = "Coffee";
reply3.text = "sleepy..";
replies = new ArrayList<>();
replies.add(reply1);
replies.add(reply2);
replies.add(reply3);
}
postDisplay.setAuthor(post.authorName);
postDisplay.setTime(post.date);
postDisplay.setText(post.text);
2021-07-29 11:26:16 +02:00
repliesDisplay.setReplies(replies);
2021-07-17 13:17:14 +02:00
}
// - -%- -
2021-07-17 11:46:27 +02:00
public void
actionPerformed(ActionEvent eA)
2021-07-17 11:46:27 +02:00
{
Object src = eA.getSource();
if (!(src instanceof JMenuItem)) return;
String text = ((JMenuItem)src).getText();
if (text.equals("Post"))
{
setContentPane(postDisplay);
revalidate();
/*
* () Setting a content pane in itself doesn't
* do anything to the content pane. Validation
* of the validate root does. Which happens on
* window realisation, or by manual call.
*/
}
else if (text.equals("Replies"))
{
setContentPane(repliesDisplay);
revalidate();
}
2021-07-17 11:46:27 +02:00
}
2021-07-16 00:37:03 +02:00
// ---%-@-%---
PostWindow()
{
2021-07-16 11:46:17 +02:00
getContentPane().setPreferredSize(new Dimension(360, 270));
pack();
setDefaultCloseOperation(DISPOSE_ON_CLOSE);
2021-07-16 00:37:03 +02:00
setLocationByPlatform(true);
2021-07-16 11:46:17 +02:00
postDisplay = new PostComponent();
repliesDisplay = new RepliesComponent();
setPost(null);
2021-07-16 00:37:03 +02:00
JMenu postMenu = new JMenu("Post");
addToMenu(postMenu, "Favourite");
addToMenu(postMenu, "Reply");
2021-07-16 11:46:17 +02:00
JMenu displayMenu = new JMenu("Display");
addToMenu(displayMenu, "Post");
addToMenu(displayMenu, "Replies");
2021-07-16 00:37:03 +02:00
JMenuBar menuBar = new JMenuBar();
menuBar.add(postMenu);
2021-07-16 11:46:17 +02:00
menuBar.add(displayMenu);
2021-07-31 13:28:46 +02:00
//setJMenuBar(menuBar);
2021-07-16 00:37:03 +02:00
2021-07-17 11:46:27 +02:00
setContentPane(postDisplay);
}
private void
addToMenu(JMenu menu, String text)
{
JMenuItem item = new JMenuItem(text);
item.addActionListener(this);
menu.add(item);
2021-07-16 00:37:03 +02:00
}
}
class
PostComponent extends JPanel {
private String
author, time, text;
2021-07-31 13:28:46 +02:00
// - -%- -
private JButton
profile,
favouriteBoost,
replyMisc,
prevNext,
media;
// ---%-@-%---
public void
setAuthor(String author)
{
assert author != null;
this.author = author;
}
public void
setTime(String time)
{
assert time != null;
this.time = time;
}
public void
setText(String text)
{
assert text != null;
this.text = text;
}
// - -%- -
protected void
paintComponent(Graphics g)
{
2021-07-16 11:46:17 +02:00
int lineHeight = 20;
FontMetrics met = g.getFontMetrics();
2021-07-31 13:28:46 +02:00
int x1 = 56;
int x2 = getWidth() - met.stringWidth(time);
int y1 = lineHeight;
g.drawString(author, x1, y1);
g.drawString(time, x2, y1);
2021-07-31 13:28:46 +02:00
int y = y1;
2021-07-16 11:46:17 +02:00
for (String line: split(text, 48)) {
2021-07-31 13:28:46 +02:00
y += lineHeight;
g.drawString(line, x1, y);
2021-07-16 11:46:17 +02:00
}
}
private List<String>
split(String string, int lineLength)
{
List<String> returnee = new ArrayList<>();
int start, max = string.length();
for (start = 0; start < max; start += lineLength) {
returnee.add(string.substring(
start,
Math.min(max, start + lineLength)
));
}
return returnee;
}
// ---%-@-%---
PostComponent()
{
2021-07-16 11:46:17 +02:00
author = time = text = "";
2021-07-31 13:28:46 +02:00
profile = new JButton("P");
profile.setSize(40, 40);
favouriteBoost = new JButton("☆/B");
favouriteBoost.setSize(40, 40);
// We have to overload the buttons to accept RMBs.
// Which perform the secondary functionality.
replyMisc = new JButton("R");
replyMisc.setSize(40, 40);
prevNext = new JButton("↓/↑");
prevNext.setSize(40, 40);
media = new JButton("M");
media.setSize(40, 40);
setLayout(null);
profile.setLocation(8, 8); add(profile);
favouriteBoost.setLocation(8, 8+48); add(favouriteBoost);
replyMisc.setLocation(8, 8+48+48); add(replyMisc);
prevNext.setLocation(8, 8+48+48+48); add(prevNext);
media.setLocation(8, 8+48+48+48+48); add(media);
/*
* Also, since it's a linear buttons now, we can just use
* a Box or FlowLayout. Though we have to have a JPanel
* for the left, and this text component on the right.
* If we are custom rendering the text then we can stay
* this way, with manual positioning.
*/
2021-07-16 11:46:17 +02:00
setFont(getFont().deriveFont(14f));
}
}
class
RepliesComponent extends JPanel {
2021-07-29 11:26:16 +02:00
private List<RepliesComponent.Reply>
replies;
// - -%- -
private JButton
prevPage, nextPage;
private JLabel
pageLabel;
private ReplyPreviewComponent[]
previews;
// ---%-@-%---
public void
2021-07-29 11:26:16 +02:00
setReplies(List<RepliesComponent.Reply> replies)
{
2021-07-29 11:26:16 +02:00
assert replies != null;
this.replies = replies;
displayPage(1);
}
// - -%- -
private void
displayPage(int pageNumber)
{
2021-07-29 11:26:16 +02:00
assert pageNumber > 0;
assert this.replies != null;
List<RepliesComponent.Reply> page;
{
2021-07-29 11:26:16 +02:00
int oS = (pageNumber - 1) * 8;
int oE = Math.min(oS + 8, replies.size());
if (oS > oE) page = new ArrayList<>();
else page = this.replies.subList(oS, oE);
}
for (int o = 0; o < page.size(); ++o)
{
assert o < previews.length;
ReplyPreviewComponent preview = previews[o];
2021-07-29 11:26:16 +02:00
Reply reply = replies.get(o);
preview.setAuthor(reply.author);
preview.setText(reply.text);
preview.setVisible(true);
}
2021-07-29 11:26:16 +02:00
for (int o = page.size(); o < previews.length; ++o)
{
ReplyPreviewComponent preview = previews[o];
preview.setVisible(false);
}
2021-07-29 11:26:16 +02:00
int pages = 1 + ((replies.size() - 1) / 8);
pageLabel.setText(pageNumber + "/" + pages);
prevPage.setEnabled(pageNumber > 1);
nextPage.setEnabled(pageNumber < pages);
2021-07-29 11:26:16 +02:00
}
// ---%-@-%---
public static class
Reply {
public String
author;
public String
text;
}
// ---%-@-%---
RepliesComponent()
{
prevPage = new JButton("<");
nextPage = new JButton(">");
prevPage.setEnabled(false);
nextPage.setEnabled(false);
2021-07-29 11:26:16 +02:00
pageLabel = new JLabel();
Box bottom = Box.createHorizontalBox();
bottom.add(Box.createGlue());
bottom.add(prevPage);
2021-07-17 11:37:00 +02:00
bottom.add(Box.createHorizontalStrut(8));
bottom.add(pageLabel);
2021-07-17 11:37:00 +02:00
bottom.add(Box.createHorizontalStrut(8));
bottom.add(nextPage);
JPanel centre = new JPanel();
2021-07-17 11:37:00 +02:00
centre.setOpaque(false);
centre.setLayout(new GridLayout(0, 1, 0, 2));
previews = new ReplyPreviewComponent[8];
for (int o = 0; o < previews.length; ++o)
{
previews[o] = new ReplyPreviewComponent();
previews[o].setVisible(false);
centre.add(previews[o]);
}
2021-07-17 11:37:00 +02:00
setLayout(new BorderLayout(0, 8));
add(centre, BorderLayout.CENTER);
add(bottom, BorderLayout.SOUTH);
2021-07-17 11:37:00 +02:00
setBorder(BorderFactory.createEmptyBorder(8, 8, 8, 8));
2021-07-29 11:26:16 +02:00
setReplies(new ArrayList<>());
}
}
2021-07-17 11:37:00 +02:00
class
ReplyPreviewComponent extends JButton {
private String
author;
private String
text;
// ---%-@-%---
@Override
public void
setText(String text)
{
assert text != null;
this.text = text;
setText();
}
public void
setAuthor(String author)
{
assert author != null;
this.author = author;
setText();
}
// - -%- -
private void
setText()
{
StringBuilder text = new StringBuilder();
text.append(this.author);
text.append(" @ ");
text.append(this.text);
super.setText(text.toString());
}
protected void
paintComponent(Graphics g)
{
g.drawString(getText(), 8, 2 * getHeight() / 3);
}
}