📄 bsmessageswindow.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 + -