📄 chatdialog.java
字号:
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) );
}
});
}
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.show();
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());
try
{
msg.parse(new String(msg.getBytes(),"UTF-8"));
}
catch(Exception e){}
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();
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 show()
{
rath.jmsn.NativeToolkit.getInstance().makeTransparency(this,
Integer.getInteger("jmsn.transparency", -1).intValue());
super.show();
rath.jmsn.NativeToolkit.getInstance().makeTransparency(this,
Integer.getInteger("jmsn.transparency", -1).intValue());
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -