📄 chatdialog.java
字号:
boolean isTopMost = false; public void actionPerformed( ActionEvent e ) { NativeToolkit tk = NativeToolkit.getInstance(); tk.makeTopMost( ChatDialog.this, !isTopMost ); isTopMost = !isTopMost; } }); am.put( "HistoryUp", new AbstractAction() { public void actionPerformed( ActionEvent e ) { if( historyIndex==-1 ) return; historyIndex--; if( historyIndex<0 ) historyIndex = 0; inputArea.setText( (String)historyQueue.get(historyIndex) ); } }); am.put( "HistoryDown", new AbstractAction() { public void actionPerformed( ActionEvent e ) { if( historyIndex==-1 ) return; historyIndex++; if( historyIndex >= historyQueue.size() ) historyIndex = historyQueue.size()-1; inputArea.setText( (String)historyQueue.get(historyIndex) ); } }); LocalCopy local = MainFrame.LOCALCOPY; boolean isUse = local.getPropertyBoolean( MainFrame.PHOTO_PROP_USE, false ); if( isUse ) { setMyPhoto( msnm.getMyPhoto() ); } if( you!=null && you.getPhoto()!=null ) { setFriendPhoto(you.getPhoto()); } } public void appendMessage( MimeMessage msg ) { Appender appender = new Appender(); appender.setAlert( true ); appender.setMessage( msg ); if( log!=null ) log.println( msg.getMessage() ); if( !SwingUtilities.isEventDispatchThread() ) SwingUtilities.invokeLater( appender ); else appender.run(); } public void appendMessage( MsnFriend friend, MimeMessage msg ) { Appender appender = new Appender(); appender.setAlert( false ); appender.setFriend( friend ); appender.setMessage( msg ); if( friend!=me ) this.lastMessagingTime = System.currentTimeMillis(); if( log!=null ) log.println( friend, msg.getMessage() ); if( !SwingUtilities.isEventDispatchThread() ) SwingUtilities.invokeLater( appender ); else appender.run(); } protected void showFontDialog() { FontDialog fd = new FontDialog(this); fd.setVisible(true); } protected void prepareSendFile() { if( isSessionClose ) { isSessionClose = false; try { if( msnm.findSwitchboardSession(you.getLoginName())==null ) msnm.doCall( you.getLoginName() ); } catch( IOException e ) {} } String downdir = msnm.getLocalCopy().getProperty(MainFrame.DOWNLOAD_PROP); JFileChooser file = new JFileChooser(downdir); if( System.getProperty("os.name").equals("Mac OS X") ) { FileView fv = new FileView() { public String getName( File f ) { return HangulJamoUtil.getString(f.getName()); } }; file.setFileView(fv); } file.setMultiSelectionEnabled( true ); file.setFileSelectionMode( JFileChooser.FILES_AND_DIRECTORIES ); if( file.showOpenDialog( this )==JFileChooser.APPROVE_OPTION ) { File[] fs = file.getSelectedFiles(); for(int i=0; i<fs.length; i++) { sendFileImpl( fs[i] ); } } } /** * 秦寸 颇老阑 傈价茄促, 窜 夸没茄 颇老捞 叼泛配府扼搁 拘绵阑 且 巴牢瘤 * 茄锅 荤侩磊俊霸 拱篮 第, 叼泛配府疙.zip 栏肺 拘绵窍咯 傈价茄促. * <p> * 秦寸 颇老篮 矫胶袍 temp directory俊 积己登哥, 颇老 傈价捞 辆丰登芭唱, * 坷幅肺 吝窜登搁, 昏力登绢具 茄促. * * @param f */ protected void sendFileImpl( File f ) { if( f.isDirectory() ) { if( JOptionPane.showConfirmDialog( this, Msg.get("chatdlg.query.dirsend.content", f.getName()), Msg.get("chatdlg.query.dirsend.title"), JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE ) ==JOptionPane.NO_OPTION ) return; ZippedDirectoryDialog zd = new ZippedDirectoryDialog(this, f); zd.setVisible(true); f = zd.getZippedFile(); f.deleteOnExit(); } if( System.getProperty("os.name").equals("Mac OS X") ) { final String orgName = f.getName(); f = new File(f.getAbsolutePath()) { public String getName() { return HangulJamoUtil.getString(orgName); }}; } MimeMessage msg = new MimeMessage(); if( session!=null ) { try { msnm.sendFileRequest( you.getLoginName(), f, session ); msg.setMessage( Msg.get("chatdlg.filesend.request.ok", you.getLoginName(), f.getName()) ); } catch( IOException e ) { msg.setMessage( Msg.get("chatdlg.filesend.request.fail") ); } appendMessage( msg ); } else { msg.setMessage( Msg.get("chatdlg.filesend.request.fail") ); appendMessage( msg ); } } /** * 窜鉴洒 皋矫瘤 芒俊 臂阑 眠啊窍绰 开且阑 茄促. */ private class Appender implements Runnable { boolean alert = false; MsnFriend friend; MimeMessage msg; JViewport view; Rectangle rect = new Rectangle(); public Appender() { view = chatPane.getViewport(); rect.x = 0; rect.width = 1; rect.height = 300; } public void setAlert( boolean isAlert ) { this.alert = isAlert; } public void setFriend( MsnFriend friend ) { this.friend = friend; } public void setMessage( MimeMessage msg ) { this.msg = msg; } public void run() { Color co; String ef = ""; String fn = "奔覆眉"; try { Properties p = msg.getProperties(); String fm = p.getProperty("X-MMS-IM-Format"); if( fm!=null ) { int si = fm.indexOf("CO"); int ei = fm.indexOf(";",si); String c = fm.substring(si+3,ei); if(c.length() < 6) { StringBuffer sb = new StringBuffer(6); for(int i=0, len=6-c.length(); i<len; i++) sb.append('0'); c = sb.toString() + c; } int r = Integer.parseInt(c.substring(4,6),16); int g = Integer.parseInt(c.substring(2,4),16); int b = Integer.parseInt(c.substring(0,2),16); co = new Color(r, g, b); si = fm.indexOf("EF"); ei = fm.indexOf(";",si); ef = fm.substring(si+3,ei); si = fm.indexOf("FN"); ei = fm.indexOf(";",si); fn = MimeUtility.getURLDecodedString(fm.substring(si+3,ei), "UTF-8"); } else { co = msg.getFontColor(); ef = msg.getEffectCode(); fn = msg.getFontName(); } } catch(Exception eex) { co = msg.getFontColor(); ef = msg.getEffectCode(); fn = msg.getFontName(); } StringBuffer sb = new StringBuffer(50); if( isViewTimestamp ) { sb.append( ts.format(new Date()) ); sb.append( ' ' ); } if( alert ) { sb.append( msg.getMessage() ); sb.append( '\n' ); chatArea.append( sb.toString() ); if( getFocusOwner()==null ) MusicBox.play( MusicBox.SOUND_MESSAGE_1 ); } else { sb.append( Msg.get("chatdlg.chat", friend.getFormattedFriendlyName()) ); chatArea.append( sb.toString() ); if(useFixedFont){ LocalCopy local = MainFrame.LOCALCOPY; fn = local.getProperty("font.name"); if(fn==null) fn="奔覆眉"; int red = 0; int green = 0; int blue = 0; try { red = Integer.parseInt(local.getProperty("font.red") ); green = Integer.parseInt(local.getProperty("font.green") ); blue = Integer.parseInt(local.getProperty("font.blue") ); } catch( NumberFormatException e ) { red = green = blue = 0; } // Use the getPropertyBoolean method, :) StringBuffer ef2 = new StringBuffer(); boolean b = local.getPropertyBoolean("font.isBold", false); boolean i = local.getPropertyBoolean("font.isItalic", false); boolean s = local.getPropertyBoolean("font.isStrikeThrough", false); boolean u = local.getPropertyBoolean("font.isUnderline", false); boolean ir = local.getPropertyBoolean("font.israndomcolor", true); if(b) ef2.append("B"); if(i) ef2.append("I"); if(s) ef2.append("S"); if(u) ef2.append("U"); chatArea.append( msg.getMessage() + "\n" ,msg.getFontColor() ,ef2.toString() ,fn); } else chatArea.append( msg.getMessage() + "\n" ,co ,ef ,fn); if( getFocusOwner()==null && friend!=me ) MusicBox.play( MusicBox.SOUND_MESSAGE_2 ); } rect.y = chatArea.getSize().height; view.scrollRectToVisible( rect ); statusLabel.setText( "" ); } } protected void sendMessage() { String input = inputArea.getText(); if( input.trim().length()==0 ) return; inputArea.setText( "" ); if( me.getStatus().equals(UserStatus.INVISIBLE) ) { inputArea.setText( Msg.get("chatdlg.msg.notsend.offline") ); filesendButton.setEnabled( false ); inputArea.setEnabled( false ); return; } MimeMessage msg = new MimeMessage(input); msg.setKind( MimeMessage.KIND_MESSAGE ); LocalCopy local = MainFrame.LOCALCOPY; String fn = local.getProperty("font.name"); if(fn==null) fn="奔覆眉"; int red = 0; int green = 0; int blue = 0; try { red = Integer.parseInt(local.getProperty("font.red") ); green = Integer.parseInt(local.getProperty("font.green") ); blue = Integer.parseInt(local.getProperty("font.blue") ); } catch( NumberFormatException e ) { red = green = blue = 0; } // Use the getPropertyBoolean method, :) StringBuffer ef = new StringBuffer(); boolean b = local.getPropertyBoolean("font.isBold", false); boolean i = local.getPropertyBoolean("font.isItalic", false); boolean s = local.getPropertyBoolean("font.isStrikeThrough", false); boolean u = local.getPropertyBoolean("font.isUnderline", false); boolean ir = local.getPropertyBoolean("font.israndomcolor", true); if(b) ef.append("B"); if(i) ef.append("I"); if(s) ef.append("S"); if(u) ef.append("U"); msg.setFontName(fn); if(!ir) msg.setFontColor(new Color(red, green, blue) ); msg.setEffectCode(ef.toString()); appendMessage( this.me, msg ); historyQueue.add( input ); if( historyQueue.size() > 50 ) historyQueue.remove(0); historyIndex = historyQueue.size(); try { if( session!=null ) session.sendInstantMessage( msg ); else { queue.add( msg ); if( isSessionClose ) { isSessionClose = false; msnm.doCall( you.getLoginName() ); } } } catch( java.io.IOException e ) { e.printStackTrace(); } } public void addWindowListener( WindowListener wl ) { super.addWindowListener( wl ); this.wl = wl; } public void dispose() { chatArea.dispose(); chatArea = null; if( topPanel.getComponentCount()>1 ) { JOptionPane.showMessageDialog(this, Msg.get("chatdlg.msg.transfer.4eva"), Msg.get("title.alarm"), JOptionPane.INFORMATION_MESSAGE ); } if( log!=null ) log.close(); wl.windowClosing( new WindowEvent(this, WindowEvent.WINDOW_CLOSING) ); msnm.removeMsnListener( fileAdapter ); super.dispose(); System.gc(); } public void close() { try { if( session!=null ) { session.close(); session = null; } } catch( Exception e ) { System.err.println( e ); } } public void setSession( SwitchboardSession session ) { if( this.session!=null ) { if( !this.session.getSessionId().equals(session.getSessionId()) ) { try { this.session.close(); } catch( IOException e ) {} } } this.session = session; this.you = session.getMsnFriend(); this.lastMessagingTime = System.currentTimeMillis(); if( you.getPhoto()!=null ) { SwingUtilities.invokeLater( new Runnable() { public void run() { setFriendPhoto(you.getPhoto()); } }); } prepareLogWriter( you.getLoginName() ); MimeMessage mm = new MimeMessage(); mm.setMessage( Msg.get("chatdlg.chat.opened") ); appendMessage( mm ); synchronized( queue ) { if( queue.size()!=0 ) { for(Iterator i=queue.iterator(); i.hasNext(); ) { MimeMessage msg = (MimeMessage)i.next(); try { session.sendInstantMessage( msg ); } catch( IOException e ) { msg.setMessage( Msg.get("chatdlg.chat.error", msg.getMessage()) ); appendMessage( msg ); } finally { i.remove(); } } } } } public SwitchboardSession getSession() { return this.session; } /** * 泅犁 措拳 技记捞 矫累等 矫埃阑 馆券茄促. CPU Time捞促. */ public long getLastMessagingTime() { return this.lastMessagingTime; } public void whoTyping( final String userview ) { SwingUtilities.invokeLater( new Runnable() { public void run() { statusLabel.setText( Msg.get("chatdlg.msg.typing", userview, sdf.format(new Date())) ); } }); } public void setVisible( boolean show ) { if( show ) { rath.jmsn.NativeToolkit.getInstance().makeTransparency(this, Integer.getInteger("jmsn.transparency", -1).intValue()); super.setVisible( show ); rath.jmsn.NativeToolkit.getInstance().makeTransparency(this, Integer.getInteger("jmsn.transparency", -1).intValue()); } else super.setVisible( show ); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -