⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bsmessageswindow.java

📁 一款即时通讯软件
💻 JAVA
字号:
package edu.ou.kmi.buddyspace.gui;

/*
 * BSMessagesWindow.java
 *
 * Project: BuddySpace
 * (C) Copyright Knowledge Media Institute 2002
 *
 *
 * Created on 11 November 2002, 16:12
 */

import javax.swing.*;
import javax.swing.table.*;
import javax.swing.event.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;

import org.jabber.jabberbeans.*;
import org.jabber.jabberbeans.util.*;
import org.jabber.jabberbeans.Extension.*;

import edu.ou.kmi.buddyspace.core.*;
import edu.ou.kmi.buddyspace.utils.*;

/**
 * Window for displaying messages received by <code>BSMessengerBean</code>.
 *
 * @author  Jiri Komzak, Knowledge Media Institute, Open University, United Kingdom
 */
public class BSMessagesWindow extends DockableWindow
                              implements ActionListener, KeyListener {
                                  
    public static String[] colNames = {"Read", "Subject", "From", "Time"};
    public static Integer trueInt = new Integer(1);
    public static Integer falseInt = new Integer(0);
    
    protected JTable msgsTable;
    protected JScrollPane tableScrollPane;
    protected BSAutoScrollTextPane msgTextPane;
    protected JScrollPane msgScrollPane;
    protected JSplitPane mainSplitPane;
    protected JPanel mainPanel;
    protected JButton dockButton;
    protected JButton replyButton;
    protected JButton deleteButton;
    protected JButton closeButton;
    
    protected Vector messages;
    protected Vector unreadFlags;
    protected Vector msgTimeStamps;
    
    protected BSMessengerBean msgBean = null;
    
    public BSMessagesWindow(Window parent, BSMsgWinManager winMan, String ID,
                            String title, Image icon, boolean docked) {
                                
        super(ID, title, icon, docked, winMan);
        
        messages = new Vector();
        unreadFlags = new Vector();
        msgTimeStamps = new Vector();
        initComponents();
        msgTextPane.setMainFrame((BSMainFrame)parent);
    }
    
    protected void initComponents() {
        initTable();
        initMsgView();
        
        mainSplitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT,
                                       tableScrollPane, msgScrollPane);
        mainSplitPane.setDividerLocation(100);
        
        mainPanel = new JPanel(new BorderLayout());
        mainPanel.add(mainSplitPane, BorderLayout.CENTER);
        
        JPanel checkBoxesPanel = new JPanel();
        Icon icon = new ImageIcon(ClassLoader.getSystemResource(!docked?
                                "images/dock.gif" : "images/float.gif"));
        dockButton = new JButton(icon);
        dockButton.setToolTipText(docked? "Float" : "Dock");
        dockButton.addActionListener(this);
        checkBoxesPanel.add(dockButton);
        if (!OSVersion.isJava1Point4orHigher())
            dockButton.setEnabled(false);
        
        JPanel buttonsPanel = new JPanel();
        replyButton = new JButton("Reply");
        replyButton.addActionListener(this);
        replyButton.setEnabled(false);
        buttonsPanel.add(replyButton);
        deleteButton = new JButton("Delete");
        deleteButton.addActionListener(this);
        deleteButton.setEnabled(false);
        buttonsPanel.add(deleteButton);
        closeButton = new JButton("Close");
        closeButton.addActionListener(this);
        buttonsPanel.add(closeButton);
        
        setLayout(new BorderLayout());
        add(mainPanel, BorderLayout.CENTER);
        add(checkBoxesPanel, BorderLayout.NORTH);
        add(buttonsPanel, BorderLayout.SOUTH);
        
        msgsTable.addKeyListener(this);
    }
    
    public void setMessengerBean(BSMessengerBean msgBean) {
        this.msgBean = msgBean;
    }
    
    public void addMessage(Message msg) {
        messages.add(msg);
        unreadFlags.add(trueInt);
        ((BSMsgWinManager)winMan).setNewMessage();
        msgTimeStamps.add((msgBean != null)? msgBean.getTimeStamp(msg) : 
                                             new Date());
        msgsTable.revalidate();
        msgsTable.repaint();
    }
    
    protected void initTable() {
        
        BSMessagesTableModel model = new BSMessagesTableModel();
        msgsTable = new JTable(model);
        msgsTable.setPreferredScrollableViewportSize(new Dimension(300, 70));
        msgsTable.setShowGrid(false);
        msgsTable.getTableHeader().setReorderingAllowed(false);
        
        TableColumn column = null;
        column = msgsTable.getColumnModel().getColumn(0);
        column.setPreferredWidth(30);
        column = msgsTable.getColumnModel().getColumn(1);
        column.setPreferredWidth(200);
        column = msgsTable.getColumnModel().getColumn(2);
        column.setPreferredWidth(200);
        column = msgsTable.getColumnModel().getColumn(3);
        column.setPreferredWidth(90);
        
        //setAutoResizeMode(int mode)
        //setRowSelectionAllowed(boolean rowSelectionAllowed)
        
        msgsTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        ListSelectionModel rowSM = msgsTable.getSelectionModel();
        rowSM.addListSelectionListener(new ListSelectionListener() {
            public void valueChanged(ListSelectionEvent e) {
                //Ignore extra messages.
                if (e.getValueIsAdjusting()) return;

                ListSelectionModel lsm = (ListSelectionModel)e.getSource();
                BSMessagesWindow.this.selectionChanged(lsm);
            }
        });

        //model = table.getModel();
        //model.addTableModelListener(this);
        
        tableScrollPane = new JScrollPane(msgsTable);
    }
    
    protected void initMsgView() {
        msgTextPane = new BSAutoScrollTextPane(false);
        msgScrollPane = new JScrollPane(msgTextPane);
    }
    
    public boolean isNewMessage() {
        return unreadFlags.contains(trueInt);
    }
    
    
    protected void selectionChanged(ListSelectionModel lsm) {
        if (lsm.isSelectionEmpty()) {
            //no rows are selected
            replyButton.setEnabled(false);
            deleteButton.setEnabled(false);
        } else {
            //selectedRow is selected
            int selectedRow = lsm.getMinSelectionIndex();
            try {
                Message msg = (Message) messages.elementAt(selectedRow);
                msgTextPane.clear();
                if (msg.getType() != null && msg.getType().equals("error")) {
                    msgTextPane.append("Error " + msg.getErrorCode() + 
                                       ": " + msg.getErrorText() + "\n\n", 
                                       BSAutoScrollTextPane.MY_NICK_STYLE);
                }
                msgTextPane.append(msg.getBody(), BSAutoScrollTextPane.REGULAR_STYLE);
                String oobURL = null;
                String oobDesc = null;
                Enumeration extensions = msg.Extensions();
                while (extensions.hasMoreElements()) {
                    Object o = extensions.nextElement();
                    if (o instanceof OOB) {
                        oobURL = ((OOB)o).getURL();
                        oobDesc = ((OOB)o).getDescription();
                        if (oobDesc != null)
                            /*msgTextPane.append("\n" + oobDesc + ":", 
                                               AutoScrollTextPane.URL_DESC_STYLE);*/
                            msgTextPane.append("\n" + oobDesc + " ", 
                                               BSAutoScrollTextPane.URL_DESC_STYLE);
                        if (oobURL != null)
                            /*msgTextPane.append("\n" + oobURL, 
                                               AutoScrollTextPane.URL_STYLE);*/
                            msgTextPane.append(oobURL, 
                                               BSAutoScrollTextPane.URL_STYLE);
                    }
                }
                unreadFlags.setElementAt(falseInt, selectedRow);
                replyButton.setEnabled(true);
                deleteButton.setEnabled(true);
                ((BSMsgWinManager)winMan).setNewMessage();
                if (msgBean != null)
                    msgBean.deleteMessagePacket(msg);
            } catch (ArrayIndexOutOfBoundsException ev) { }
        }
    }
    
    protected void deleteSelectedMsg() {
        int rowIndex = msgsTable.getSelectedRow();
        if (rowIndex != -1) {
            messages.remove(rowIndex);
            unreadFlags.remove(rowIndex);
            msgTimeStamps.remove(rowIndex);
            msgsTable.revalidate();
        }
        int rowCnt = msgsTable.getRowCount();
        ListSelectionModel lsm = msgsTable.getSelectionModel();
        if (rowCnt == 0) {
            msgsTable.clearSelection();
            msgTextPane.clear();
            replyButton.setEnabled(false);
            deleteButton.setEnabled(false);
        }
        else if (rowCnt-1 >= rowIndex) {
            lsm.setSelectionInterval(rowIndex, rowIndex);
            selectionChanged(lsm);
        }
        else if (rowCnt != 0 && rowCnt-1 < rowIndex)
            lsm.setSelectionInterval(rowIndex-1, rowIndex-1);
    }
    
    public void actionPerformed(ActionEvent evt) {
        if (evt.getSource() == dockButton) {
            if (winMan != null) {
                winMan.setWindowDocked(this, !docked, true);
                Icon icon = new ImageIcon(ClassLoader.getSystemResource(!docked?
                                "images/dock.gif" : "images/float.gif"));
                dockButton.setIcon(icon);
                dockButton.setToolTipText(docked? "Float" : "Dock");
                winMan.selectWindow(this);
            }
        }
        else if (evt.getSource() == replyButton) {
            if (winMan != null) {
                int rowIndex = msgsTable.getSelectedRow();
                if (rowIndex != -1) {
                    Message msg = (Message) messages.elementAt(rowIndex);
                    Vector jidList = new Vector();
                    //jidList.add(BSPresenceBean.getJidWithoutRes(msg.getFromAddress()));
                    jidList.add(msg.getFromAddress().getSimpleJID());
                    String body = msg.getBody();
                    String newBody = null;
                    if (body != null) {
                        int index, oldIndex = 0;
                        newBody = "";
                        index = body.indexOf('\n');
                        while (index != -1) {
                            newBody += "> " + body.substring(oldIndex, index) + "\n";
                            oldIndex = index+1;
                            index = body.indexOf('\n', oldIndex);
                        }
                        newBody += "> " + body.substring(oldIndex);
                    }
                    String subject = msg.getSubject();
                    BSComposeMsgWin win = ((BSMsgWinManager)winMan).composeMessage(jidList.elements(), new Vector().elements());
                    if (win != null) {
                        win.setSubject("Re: " + ((subject != null)? subject : ""));
                        win.setBody(((newBody != null)? newBody : ""));
                    }
                }
            }
        } //reply button
        
        else if (evt.getSource() == deleteButton) {
            deleteSelectedMsg();
        } //delete button
        
        else if (evt.getSource() == closeButton) {
            close();
        } //close button
    }
    
    /** Empty implementation */
    public void keyTyped(KeyEvent evt) { }
    /** Empty implementation */
    public void keyPressed(KeyEvent evt) { }

    /** Handles key strokes - deletes on DELETE */
    public void keyReleased(KeyEvent evt) {
        if (evt.getKeyCode() == KeyEvent.VK_DELETE) {
            deleteSelectedMsg();
        }
    }
    
    public void cancelListening() { }
    
    
    public void close() {
        if (winMan != null)
            ((BSMsgWinManager)winMan).showMessagesWindow(false, false, false);
    }
    
    
    public class BSMessagesTableModel extends AbstractTableModel {
        
        public int getColumnCount() {
            return colNames.length; 
        }
        
        public int getRowCount() {
            return messages.size();
        }
        
        public Object getValueAt(int rowIndex, int colIndex) { 
            Message msg;
            Date timeStamp;
            try {
                msg = (Message) messages.elementAt(rowIndex);
                timeStamp = (Date) msgTimeStamps.elementAt(rowIndex);
            } catch (ArrayIndexOutOfBoundsException e) {
                return null;
            }
                
            if (colIndex == 0) {
                if (unreadFlags.elementAt(rowIndex).equals(trueInt)) {
                    if (msg.getType() == null || msg.getType().equals(""))
                        return new ImageIcon(ClassLoader.getSystemResource("images/message-small.gif"));
                    else if (msg.getType().equals("error"))
                        return new ImageIcon(ClassLoader.getSystemResource("images/sad.gif"));
                    else
                        return new ImageIcon(ClassLoader.getSystemResource("images/smile.gif"));
                }
                else 
                    return new ImageIcon(ClassLoader.getSystemResource("images/empty.gif"));
            }
            else if (colIndex == 1)
                return msg.getSubject();
            else if (colIndex == 2) {
                JID jid = msg.getFromAddress();
                if (jid == null) return new String("");
                String friendlyName = ((BSMsgWinManager)winMan).getFriendlyName(jid);
                return (friendlyName != null)? friendlyName : jid.toString();
            }
            else if (colIndex == 3)
                return History.getTimeStamp(timeStamp);
            else
                return "?";
        }
        
        public void setValueAt(Object value, int rowIndex, int colIndex) {
            //rowData[row][col] = value;
            //fireTableCellUpdated(row, col);
        }
        
        public boolean isCellEditable(int rowIndex, int colIndex) {
            return false;
        }
        
        public String getColumnName(int colIndex) {
            if (colIndex >= 0 && colIndex < colNames.length)
                return colNames[colIndex];
            else
                return "?";
        }
        
        public Class getColumnClass(int colIndex) {
            //return getValueAt(0, colIndex).getClass();
            if (colIndex >= 0 && colIndex < colNames.length) {
                if (colIndex == 0)
                    return ImageIcon.class;
                else
                    return String.class;
            }
            else
                return Object.class;
        }
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -