/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package automenta.netention.swing.channel; import automenta.netention.NMessage; import automenta.netention.Self; import automenta.netention.app.RunSelfBrowser; import automenta.netention.irc.IRCChannel; import automenta.netention.irc.IRCServerConnection; import automenta.netention.swing.detail.DetailEditPanel; import automenta.netention.swing.util.JScaledTextArea; import automenta.netention.swing.util.SwingWindow; import java.awt.BorderLayout; import java.awt.Component; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.util.Date; import javax.swing.*; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; /** * * @author seh */ public class TabbedChannelPannel extends JPanel { private final JTabbedPane tabs; private final JMenuBar menu; private final JButton newDetail; private Object[] selected; private final Self self; public TabbedChannelPannel(Self self) { super(new BorderLayout()); this.self = self; add( tabs = new JTabbedPane(), BorderLayout.CENTER); add( menu = new JMenuBar(), BorderLayout.NORTH); JMenu connect = new JMenu("Connect"); menu.add(connect); menu.add(newDetail = new JButton("Detail...")); newDetail.setEnabled(false); tabs.addChangeListener(new ChangeListener() { @Override public void stateChanged(ChangeEvent e) { newDetail.setEnabled(false); } }); } public class IRCPanel extends JPanel { private final String channel; private final IRCServerConnection c; private final IRCChannel chan; private final JScaledTextArea inputArea; private final JList output; private final DefaultListModel textModel; public IRCPanel(final IRCServerConnection c, final String channel) { super(new BorderLayout()); this.c = c; this.channel = channel; add(new JScrollPane(output = new JList( textModel = new DefaultListModel() )), BorderLayout.CENTER); add(inputArea = new JScaledTextArea("", 1.3f), BorderLayout.SOUTH); c.join(channel, chan = new IRCChannel() { @Override public void onMessage(String sender, String login, String hostname, String message) { addMessage(sender, message); } }); inputArea.addKeyListener(new KeyAdapter() { @Override public void keyReleased(KeyEvent e) { if (e.getKeyCode() == KeyEvent.VK_ENTER) { final String m = inputArea.getText().trim(); inputArea.setText(""); SwingUtilities.invokeLater(new Runnable() { @Override public void run() { if (m.length() > 0) { send(m); addMessage(c.getNick(), m); } } }); } } }); output.setCellRenderer(new DefaultListCellRenderer() { @Override public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { JLabel l = (JLabel)super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); l.setFont(getFont().deriveFont(getFont().getSize2D() * 1.25f)); return l; } }); //output.setSelectionMode(ListSelectionModel.); output.setFixedCellHeight(-1); output.addListSelectionListener(new ListSelectionListener() { @Override public void valueChanged(ListSelectionEvent e) { Object[] vals = output.getSelectedValues(); if (vals != null) { if (vals.length > 0) { for (ActionListener al : newDetail.getActionListeners()) { newDetail.removeActionListener(al); } newDetail.setEnabled(true); newDetail.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { newDetail(c.getServer() + "/" + channel, "" /* channel topic */); } }); setSelected(vals); return; } } newDetail.setEnabled(false); } }); } public void addMessage(String sender, String message) { textModel.addElement(sender + ": " + message); } public void send(String message) { chan.send(message); } } public void add(IRCServerConnection c, String chan) { IRCPanel p = new IRCPanel(c, chan); tabs.addTab(chan, p); updateUI(); } private void setSelected(Object[] vals) { this.selected = vals; } public void newDetail(String from, String subject) { String message = ""; int x = 0; for (Object o : selected) message += o.toString() + "<br/>"; NMessage m = new NMessage(subject, from, "", new Date(), message ); self.addDetail(m); new SwingWindow(new DetailEditPanel(self, m, true) { @Override protected void deleteThis() { } @Override protected void patternChanged() { } }, 400, 300); } public static void main(String[] args) throws Exception { Self s = RunSelfBrowser.newDefaultSelf(); TabbedChannelPannel tcp = new TabbedChannelPannel(s); final IRCServerConnection c = new IRCServerConnection("xeehh_netz", "irc.freenode.net"); tcp.add(c, "#b350f99700cd057aa9ab284c31b5eb2b"); SwingWindow w = new SwingWindow(tcp, 600, 400, true) { @Override protected void onClosing() { c.disconnect(); } }; } }