sparktransfermanager.java.svn-base
来自「开源项目openfire的完整源程序」· SVN-BASE 代码 · 共 706 行 · 第 1/2 页
SVN-BASE
706 行
public Object construct() {
try {
Thread.sleep(1000);
Rectangle area = new Rectangle(Toolkit.getDefaultToolkit().getScreenSize());
return robot.createScreenCapture(area);
}
catch (Throwable e) {
Log.error(e);
if (mainWindowVisible) {
mainWindow.setVisible(true);
}
if (chatFrameVisible) {
chatFrame.setVisible(true);
}
}
return null;
}
public void finished() {
bufferedImage = (BufferedImage)get();
if (bufferedImage == null) {
JOptionPane.showMessageDialog(null, Res.getString("title.error"), "Unable to process screenshot.", JOptionPane.ERROR_MESSAGE);
return;
}
final JFrame frame = new JFrame();
frame.setCursor(new Cursor(Cursor.CROSSHAIR_CURSOR));
selectionPanel.setImage(bufferedImage);
selectionPanel.validate();
selectionPanel.addMouseListener(new MouseAdapter() {
public void mouseReleased(MouseEvent e) {
Rectangle clip = selectionPanel.getClip();
BufferedImage newImage = null;
try {
newImage = bufferedImage.getSubimage((int)clip.getX(), (int)clip.getY(), (int)clip.getWidth(), (int)clip.getHeight());
}
catch (Exception e1) {
}
if (newImage != null) {
sendImage(newImage, room);
newImage = null;
bufferedImage = null;
selectionPanel.clear();
}
frame.dispose();
frame.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
if (mainWindowVisible) {
mainWindow.setVisible(true);
}
if (chatFrameVisible) {
chatFrame.setVisible(true);
}
selectionPanel.removeMouseListener(this);
}
});
frame.addKeyListener(new KeyAdapter() {
public void keyReleased(KeyEvent e) {
if (e.getKeyChar() == KeyEvent.VK_ESCAPE) {
frame.dispose();
frame.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
if (mainWindowVisible) {
mainWindow.setVisible(true);
}
if (chatFrameVisible) {
chatFrame.setVisible(true);
}
}
}
});
frame.setUndecorated(true);
frame.setSize(bufferedImage.getWidth(null), bufferedImage.getHeight());
frame.getContentPane().add(selectionPanel);
// Determine if full-screen mode is supported directly
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice gs = ge.getDefaultScreenDevice();
if (gs.isFullScreenSupported()) {
gs.setFullScreenWindow(frame);
}
else {
// Full-screen mode will be simulated
frame.setVisible(true);
}
button.setEnabled(true);
}
};
worker.start();
}
private void addPresenceListener() {
SparkManager.getConnection().addPacketListener(new PacketListener() {
public void processPacket(Packet packet) {
Presence presence = (Presence)packet;
if (presence.isAvailable()) {
String bareJID = StringUtils.parseBareAddress(presence.getFrom());
// Iterate through map.
List list = (List)waitMap.get(bareJID);
if (list != null) {
// Iterate through list and send.
Iterator iter = list.iterator();
ChatRoom room = null;
while (iter.hasNext()) {
File file = (File)iter.next();
room = sendFile(file, bareJID);
}
if (room != null) {
Message message = new Message();
message.setBody(Res.getString("message.sent.offline.files"));
room.sendMessage(message);
}
}
waitMap.remove(bareJID);
}
}
}, new PacketTypeFilter(Presence.class));
}
/**
* Send a file to a user.
*
* @param file the file to send.
* @param jid the jid of the user to send the file to.
* @return the ChatRoom of the user.
*/
public ChatRoom sendFile(File file, String jid) {
final ContactList contactList = SparkManager.getWorkspace().getContactList();
String bareJID = StringUtils.parseBareAddress(jid);
String fullJID = PresenceManager.getFullyQualifiedJID(jid);
if (!PresenceManager.isOnline(jid)) {
List list = (List)waitMap.get(jid);
if (list == null) {
list = new ArrayList();
}
list.add(file);
waitMap.put(jid, list);
ChatRoom chatRoom;
ContactItem contactItem = contactList.getContactItemByJID(jid);
if (contactItem != null) {
chatRoom = SparkManager.getChatManager().createChatRoom(jid, contactItem.getNickname(), contactItem.getNickname());
}
else {
chatRoom = SparkManager.getChatManager().createChatRoom(jid, jid, jid);
}
chatRoom.getTranscriptWindow().insertNotificationMessage("The user is offline. Will auto-send \"" + file.getName() + "\" when user comes back online.", ChatManager.ERROR_COLOR);
return null;
}
// Create the outgoing file transfer
final OutgoingFileTransfer transfer = transferManager.createOutgoingFileTransfer(fullJID);
ContactItem contactItem = contactList.getContactItemByJID(bareJID);
ChatRoom chatRoom;
if (contactItem != null) {
chatRoom = SparkManager.getChatManager().createChatRoom(bareJID, contactItem.getNickname(), contactItem.getNickname());
}
else {
chatRoom = SparkManager.getChatManager().createChatRoom(bareJID, bareJID, bareJID);
}
TranscriptWindow transcriptWindow = chatRoom.getTranscriptWindow();
StyledDocument doc = (StyledDocument)transcriptWindow.getDocument();
// The image must first be wrapped in a style
Style style = doc.addStyle("StyleName", null);
SendMessage sendingUI = new SendMessage();
try {
transfer.sendFile(file, "Sending file");
}
catch (XMPPException e) {
Log.error(e);
}
// Add listener to cancel transfer is sending file to user who just went offline.
AndFilter presenceFilter = new AndFilter(new PacketTypeFilter(Presence.class), new FromContainsFilter(bareJID));
final PacketListener packetListener = new PacketListener() {
public void processPacket(Packet packet) {
Presence presence = (Presence)packet;
if (!presence.isAvailable()) {
if (transfer != null) {
transfer.cancel();
}
}
}
};
// Add presence listener to check if user is offline and cancel sending.
SparkManager.getConnection().addPacketListener(packetListener, presenceFilter);
chatRoom.addClosingListener(new ChatRoomClosingListener() {
public void closing() {
SparkManager.getConnection().removePacketListener(packetListener);
if (!transfer.isDone()) {
transfer.cancel();
}
}
});
sendingUI.sendFile(transfer, transferManager, fullJID, contactItem.getNickname());
StyleConstants.setComponent(style, sendingUI);
// Insert the image at the end of the text
try {
doc.insertString(doc.getLength(), "ignored text", style);
doc.insertString(doc.getLength(), "\n", null);
}
catch (BadLocationException e) {
Log.error(e);
}
chatRoom.scrollToBottom();
return chatRoom;
}
/**
* Send an image to a user.
*
* @param image the image to send.
* @param room the ChatRoom of the user you wish to send the image to.
*/
public void sendImage(final BufferedImage image, final ChatRoom room) {
File tmpDirectory = new File(Spark.getSparkUserHome(), "/tempImages");
tmpDirectory.mkdirs();
String imageName = "image_" + StringUtils.randomString(2) + ".png";
final File imageFile = new File(tmpDirectory, imageName);
// Write image to system.
room.setCursor(new Cursor(Cursor.WAIT_CURSOR));
SwingWorker writeImageThread = new SwingWorker() {
public Object construct() {
try {
// Write out file in separate thread.
ImageIO.write(image, "png", imageFile);
}
catch (IOException e) {
Log.error(e);
}
return true;
}
public void finished() {
ChatRoomImpl roomImpl = (ChatRoomImpl)room;
sendFile(imageFile, roomImpl.getParticipantJID());
SparkManager.getChatManager().getChatContainer().activateChatRoom(room);
room.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
}
};
writeImageThread.start();
}
/**
* Returns an image if one is found in the clipboard, otherwise null is returned.
*
* @return the image in the clipboard if found, otherwise null.
*/
public static BufferedImage getClipboard() {
Transferable t = Toolkit.getDefaultToolkit().getSystemClipboard().getContents(null);
try {
if (t != null && t.isDataFlavorSupported(DataFlavor.imageFlavor)) {
return (BufferedImage)t.getTransferData(DataFlavor.imageFlavor);
}
}
catch (UnsupportedFlavorException e) {
}
catch (IOException e) {
}
return null;
}
/**
* Adds a new TransferListener to the SparkManager. FileTransferListeners can be used
* to intercept incoming file transfers for own customizations. You may wish to not
* allow certain file transfers, or have your own UI to handle incoming files.
*
* @param listener the listener
*/
public void addTransferListener(FileTransferListener listener) {
listeners.add(listener);
}
/**
* Removes the FileTransferListener.
*
* @param listener the listener
*/
public void removeTransferListener(FileTransferListener listener) {
listeners.remove(listener);
}
private boolean fireTransferListeners(FileTransferRequest request) {
final Iterator iter = new ArrayList(listeners).iterator();
while (iter.hasNext()) {
FileTransferListener listener = (FileTransferListener)iter.next();
boolean accepted = listener.handleTransfer(request);
if (accepted) {
return true;
}
}
return false;
}
/**
* Sets the current default directory to store files.
*
* @param directory the default directory.
*/
public void setDefaultDirectory(File directory) {
defaultDirectory = directory;
}
/**
* Return the File Chooser to user.
* @param parent the parent component.
* @param title the title.
* @return the FileChooser. (Native Widget)
*/
public FileDialog getFileChooser(Frame parent, String title) {
FileDialog dialog = new FileDialog(parent, title, FileDialog.LOAD);
return dialog;
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?