This repo is archived. You can view files and clone it, but cannot push or open issues or pull requests.
RSS-reader/src/main/java/eu/toldi/rss/FeedFrame.java
2020-11-25 21:03:31 +01:00

159 lines
5 KiB
Java

package eu.toldi.rss;
import javax.naming.ldap.SortKey;
import javax.swing.*;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.table.TableRowSorter;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.TreePath;
import java.awt.*;
import java.awt.event.*;
import java.net.MalformedURLException;
import java.net.URL;
public class FeedFrame extends JFrame {
public JTable table;
private JScrollPane scrollPane;
private FeedData data;
private JMenuBar menubar;
private JTree feeds;
private TableRowSorter<FeedData> sorter;
public FeedFrame() {
setTitle("RSS Feed reader");
setDefaultCloseOperation(EXIT_ON_CLOSE);
setMinimumSize(new Dimension(900, 600));
initData();
initComponents();
}
private void initData() {
FeedLoader loader = new FeedLoader();
//data = loader.loadFeedData("feeds.xml");
data = new FeedData();
FeedGroup group = new FeedGroup("Magyar hírek");
try {
group.addFeed(new Feed(new URL("https://24.hu/feed")));
group.addFeed(new Feed(new URL("https://444.hu/feed")));
group.addFeed(new Feed(new URL("https://hvg.hu/rss")));
data.addFeed(new Feed(new URL("https://www.theguardian.com/uk/rss")));
} catch (MalformedURLException e) {
e.printStackTrace();
}
data.addFeed(group);
}
private void initTable(){
table = new JTable();
scrollPane = new JScrollPane(table);
table.setModel(data);
table.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent evt) {
int row = table.getRowSorter().convertRowIndexToModel(table.rowAtPoint(evt.getPoint()));
int col = table.columnAtPoint(evt.getPoint());
if (evt.getClickCount() == 2 && row >= 0) {
data.clicked(row);
}
}
});
sorter = new TableRowSorter<FeedData>(data);
table.setRowSorter(sorter);
add(scrollPane, BorderLayout.CENTER);
}
private void initMenuBar(){
menubar = new JMenuBar();
JMenu menu1 = new JMenu("File");
JMenuItem addFeed = new JMenuItem("Add Feed");
addFeed.addActionListener(new AddFeed());
menu1.add(addFeed);
JMenuItem save = new JMenuItem("Save Feeds");
save.addActionListener(new SaveFeeds());
menu1.add(save);
menubar.add(menu1);
this.setJMenuBar(menubar);
}
private void initTree(){
DefaultMutableTreeNode root = data.getRootNode();
feeds = new JTree(root);
feeds.addMouseListener(new SwitchFeed());
feeds.setEditable(true);
add(feeds,BorderLayout.WEST);
}
private void initComponents() {
this.setLayout(new BorderLayout());
ImageIcon icon = new ImageIcon(this.getClass().getResource("/icon.png"));
this.setIconImage(icon.getImage());
initTable();
initMenuBar();
initTree();
}
private class AddFeed implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
JPanel panel = new JPanel(new GridLayout(0, 1));
JTextField feedURL = new JTextField("");
panel.add(new JLabel("Feed URL:"));
panel.add(feedURL);
int result = JOptionPane.showConfirmDialog(null, panel, "Add feed",
JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE);
if (result == JOptionPane.OK_OPTION) {
Feed f = null;
try {
f = new Feed(new URL(feedURL.getText()));
} catch (MalformedURLException malformedURLException) {
malformedURLException.printStackTrace();
}
data.addFeed(f);
table.updateUI();
} else {
System.out.println("Cancelled");
}
}
}
private class SaveFeeds implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
FeedLoader loader = new FeedLoader();
loader.setData(data);
loader.saveFeedData();
}
}
private class SwitchFeed extends MouseAdapter {
@Override
public void mousePressed(MouseEvent e) {
int selRow = feeds.getRowForLocation(e.getX(), e.getY());
TreePath selPath = feeds.getPathForLocation(e.getX(), e.getY());
if(selRow != -1) {
if(e.getClickCount() == 1) {
if(selRow == 0) data.limitTo(null);
else {
data.limitTo((Feed) ((DefaultMutableTreeNode) selPath.getLastPathComponent()).getUserObject());
}
sorter.setModel(data);
table.setRowSorter(sorter);
table.updateUI();
}
}
}
}
}