📄 buddyrenderer.java
字号:
/* * @(#)BuddyRenderer.java * * Copyright (c) 2002, Jang-Ho Hwang * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * 3. Neither the name of the Jang-Ho Hwang nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * $Id: BuddyRenderer.java,v 1.16 2002/08/24 16:27:15 pistos Exp $ */package rath.jmsn;import java.awt.*;import java.awt.event.MouseEvent;import java.net.URL;import java.util.Iterator;import java.util.Hashtable;import java.util.Enumeration;import javax.swing.*;import javax.swing.tree.*;import rath.msnm.MSNMessenger;import rath.msnm.BuddyList;import rath.msnm.UserStatus;import rath.msnm.LocalCopy;import rath.msnm.entity.MsnFriend;import rath.msnm.entity.Group;import rath.jmsn.util.UserStatusBox;/** * * @author Jang-Ho Hwang, rath@linuxkorea.co.kr * @version $Id: BuddyRenderer.java,v 1.16 2002/08/24 16:27:15 pistos Exp $ */public class BuddyRenderer extends DefaultTreeCellRenderer implements ToolBox{ public static final int VIEW_FRIENDLY_NAME = 1; public static final int VIEW_LOGIN_NAME = 2; public static final int VIEW_MYFRIENDLY_NAME = 10; private MsnFriend friend = null; private boolean sel = false; private Object obj = null; private Color selectedBack = new Color( 0x80666699 ); private Color backColor = new Color( 0x80FFFFFF ); private Color selectedFore = Color.white; private Color foreColor = Color.black; private Color dragFore = new Color( 0xfaac30 ); private int draggingGroup = -1; /** * Determine buddy's friendly name has shown. or login name. */ private int viewMode = VIEW_FRIENDLY_NAME; private ImageIcon imageOnline, imageOffline, imageBRB, imageBusy, imageLunch, imagePhone, imageAway, imageIdle, imageBlock; BuddyList forward = null; BuddyList block = null; public BuddyRenderer() { setOpaque( false ); setFont( FONT_10 ); imageOnline = new ImageIcon(getIconResource("online.gif")); imageOffline = new ImageIcon(getIconResource("offline.gif")); imageBusy = new ImageIcon(getIconResource("busy.gif")); imageBRB = new ImageIcon(getIconResource("brb.gif")); imageLunch = new ImageIcon(getIconResource("lunch.gif")); imagePhone = new ImageIcon(getIconResource("call.gif")); imageIdle = new ImageIcon(getIconResource("autoleft.gif")); imageAway = new ImageIcon(getIconResource("left.gif")); imageBlock = new ImageIcon(getIconResource("fuck.gif")); } public void setForeColor( Color c ) { this.foreColor = c; } public Color getForeColor() { return this.foreColor; } public void setDraggingGroup( int index ) { this.draggingGroup = index; } public int getDraggingGroup() { return this.draggingGroup; } /** * 模备甸阑 绢栋茄 mode肺 杭巴牢瘤 搬沥窍绰 巴栏肺, * VIEW_FRIENDLY_NAME, VIEW_LOGIN_NAME, VIEW_MYFRIENDLY_NAME阑 汲沥且 荐 乐促. */ public void setBuddyView( int mode ) { this.viewMode = mode; } public int getBuddyView() { return this.viewMode; } private URL getIconResource( String name ) { return this.getClass().getResource( "/resources/icon/" + name ); } protected String getGroupText( DefaultMutableTreeNode groupNode, String str ) { if( forward==null ) return ""; Integer groupIndex = ((Group)groupNode.getUserObject()).getIndex(); int total = 0; for(Iterator i=forward.iterator(); i.hasNext(); ) { MsnFriend friend = (MsnFriend)i.next(); if( groupIndex.equals(friend.getGroupIndex()) ) total++; } int online = 0; for(Enumeration e=groupNode.children(); e.hasMoreElements(); ) { MsnFriend friend = (MsnFriend) (((DefaultMutableTreeNode)e.nextElement()).getUserObject()); if( !friend.getStatus().equals(UserStatus.OFFLINE) ) online++; } return str + " (" + online + "/" + total + ")"; } public Component getTreeCellRendererComponent( JTree tree, Object value, boolean sel, boolean expanded, boolean leaf, int row, boolean hasFocus ) { DefaultMutableTreeNode node = (DefaultMutableTreeNode)value; Object obj = node.getUserObject(); this.obj = obj; int groupIndex = -1; if( obj instanceof MsnFriend ) { this.friend = (MsnFriend)obj; groupIndex = friend.getGroupIndex().intValue(); String status = friend.getStatus(); if( status==null || status.equals(UserStatus.ONLINE) ) { status = ""; setIcon( imageOnline ); } else { setIcon( imageOnline ); if( status.equals(UserStatus.BE_RIGHT_BACK) ) setIcon( imageBRB ); else if( status.equals(UserStatus.IDLE) ) setIcon( imageIdle ); else if( status.equals(UserStatus.AWAY_FROM_COMPUTER) ) setIcon( imageAway ); else if( status.equals(UserStatus.BUSY) ) setIcon( imageBusy ); else if( status.equals(UserStatus.ON_THE_LUNCH) ) setIcon( imageLunch ); else if( status.equals(UserStatus.ON_THE_PHONE) ) setIcon( imagePhone ); else if( status.equals(UserStatus.OFFLINE) || status.equals(UserStatus.INVISIBLE) ) setIcon( imageOffline ); status = " (" + UserStatusBox.getFormattedUserStatus(friend.getStatus()) + ")"; } if( block!=null && block.get(friend.getLoginName())!=null ) setIcon( imageBlock ); switch( viewMode ) { case VIEW_FRIENDLY_NAME: setText( friend.getFormattedFriendlyName().concat(status) ); break; case VIEW_LOGIN_NAME: setText( friend.getLoginName().concat(status) ); break; case VIEW_MYFRIENDLY_NAME: String myName = MainFrame.LOCALCOPY.getProperty( friend.getLoginName() ); if(myName==null) myName = friend.getFormattedFriendlyName(); setText( myName.concat(status) ); break; case VIEW_LOGIN_NAME | VIEW_FRIENDLY_NAME: StringBuffer sb = new StringBuffer(); sb.append( friend.getFormattedFriendlyName() ); sb.append( '(' ); sb.append( friend.getLoginName() ); sb.append( ") " ); sb.append( status ); setText( sb.toString() ); break; } } else if( obj instanceof Group ) { Group group = (Group)obj; groupIndex = group.getIndexInt(); setIcon( null ); setText( getGroupText(node, group.getFormattedName()) ); } this.sel = sel; setBackground( sel ? selectedBack : backColor ); setForeground( sel ? selectedFore : (this.draggingGroup==groupIndex) ? dragFore : foreColor ); return this; } public void paint( Graphics g ) { if( obj instanceof MsnFriend || obj instanceof Group ) { int x = 1; int w = getWidth(); int h = getHeight(); ImageIcon icon = (ImageIcon)getIcon(); String text = getText(); FontMetrics fm = g.getFontMetrics(getFont()); if( icon!=null ) { g.drawImage( icon.getImage(), x, (h-icon.getIconHeight())>>1, this ); x += icon.getIconWidth(); } if( sel ) { g.setColor( getBackground() ); g.fillRect( x, 0, w, h ); } g.setFont( getFont() ); g.setColor( getForeground() ); int y = (h>>1)+(fm.getAscent()>>1)-(fm.getDescent()>>1)-1; g.drawString( text, x+2, y ); } else super.paint( g ); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -