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

📄 chatdialog.java

📁 java实现msn的功能
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
					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 + -