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

📄 msnmenubar.java

📁 java实现msn的功能
💻 JAVA
字号:
/*
 * @(#)MSNMenuBar.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: MSNMenuBar.java,v 1.14 2002/08/24 16:14:56 pistos Exp $
 */
package rath.jmsn;

import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.InputEvent;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.lang.reflect.Method;
import java.util.Properties;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.Locale;
import javax.swing.*;

import rath.msnm.UserStatus;
import rath.jmsn.ui.WrapMenu;
import rath.jmsn.ui.WrapMenuItem;
import rath.jmsn.ui.WrapPopupMenu;
import rath.jmsn.util.UserStatusBox;
import rath.jmsn.util.Msg;
/**
 *
 * @author Jang-Ho Hwang, rath@linuxkorea.co.kr
 * @version $Id: MSNMenuBar.java,v 1.14 2002/08/24 16:14:56 pistos Exp $
 */
public class MSNMenuBar extends JMenuBar implements ToolBox
{
	private JPopupMenu statusPopup = null;

	private JMenuItem menuLogin, menuLogout;
	private JMenuItem menuAddFriend, menuRenameFriend, menuRemoveFriend;
	private JMenuItem menuAddGroup, menuRenameGroup, menuRemoveGroup;
	private JMenuItem menuBlockFriend, menuUnblockFriend;
	private JMenuItem menuBlockGroup, menuUnblockGroup;
	private WrapMenu menuLocale;
	private JMenu menuStat;

	MainFrame main = null;
	JCheckBoxMenuItem menuOffView;

	public MSNMenuBar( MainFrame main, ActionGroup actions )
	{
		this.main = main;

		init(actions);
		disableLogin();
	}

	private void init( ActionGroup actions )
	{
		collectActions(actions);

		statusPopup = new WrapPopupMenu();

		add( createFileMenu() );
		add( createViewMenu() );
		add( createToolMenu() );
		add( createHelpMenu() );
	}

	public void updateUI()
	{
		if( menuLocale!=null )
		{
			menuLocale.removeAll();
			for(Iterator i=Msg.getAvailableLocales().iterator(); i.hasNext(); )
			{
				final Locale loc = (Locale)i.next();
                System.out.println( loc.getDisplayName() );
				JMenuItem item = menuLocale.add( loc.getDisplayName(), false );
				item.setFont( FONT );
				item.addActionListener( new ActionListener() {
					public void actionPerformed( ActionEvent e )
					{
						Msg.setLocale( loc );
					}
				});
			}
		}
		if( statusPopup!=null )
			statusPopup.updateUI();
		super.updateUI();
	}

	protected JMenu createFileMenu()
	{
		ActionMap action = getActionMap();

		JMenu menu = new WrapMenu("menu.file");
		menu.setMnemonic( Msg.get("menu.file.mnemonic").charAt(0) );
		menu.setFont( MENU_HEADER_FONT );

		menuLogin = menu.add( "menu.item.login" );
		menuLogin.setAccelerator( KeyStroke.getKeyStroke(KeyEvent.VK_C, InputEvent.ALT_MASK) );
		menuLogin.setFont( MENU_FONT );
		menuLogin.addActionListener( action.get("actionLogin") );

		menuLogout = menu.add( "menu.item.logout" );
		menuLogout.setFont( MENU_FONT );
		menuLogout.addActionListener( action.get("actionLogout") );

		menu.addSeparator();

		JMenuItem menuExit = menu.add( "menu.item.exit" );
		menuExit.setFont( MENU_FONT );
		menuExit.setAccelerator( KeyStroke.getKeyStroke(KeyEvent.VK_X, InputEvent.ALT_MASK) );
		menuExit.addActionListener( action.get("actionExit") );

		return menu;
	}

	public JPopupMenu getStatusPopupMenu()
	{
		return this.statusPopup;
	}

	protected JMenu createViewMenu()
	{
		ActionMap action = getActionMap();

		JMenu menu = new WrapMenu("menu.view");
		menu.setMnemonic( Msg.get("menu.view.mnemonic").charAt(0) );
		menu.setFont( MENU_HEADER_FONT );

		JMenu menuBuddy = new WrapMenu("menu.item.friendview");
		menuBuddy.setFont( MENU_FONT );

		JMenuItem menuFRView = menuBuddy.add( "menu.item.friendview.fn" );
		menuFRView.setFont( MENU_FONT );
		menuFRView.addActionListener( action.get("actionBuddyView") );
		JMenuItem menuLGView = menuBuddy.add( "menu.item.friendview.ln" );
		menuLGView.setFont( MENU_FONT );
		menuLGView.addActionListener( action.get("actionBuddyView") );
		JMenuItem menuFRLGView = menuBuddy.add( "menu.item.friendview.fnln" );
		menuFRLGView.setFont( MENU_FONT );
		menuFRLGView.addActionListener( action.get("actionBuddyView") );
		JMenuItem menuMyView = menuBuddy.add( "menu.item.friendview.my" );
		menuMyView.setFont( MENU_FONT );
		menuMyView.addActionListener( action.get("actionBuddyView") );

		menu.add( menuBuddy );
		menu.addSeparator();

		JMenuItem menuRefresh = menu.add( "menu.item.refresh" );
		menuRefresh.setFont( MENU_FONT );
		menuRefresh.setAccelerator( KeyStroke.getKeyStroke(KeyEvent.VK_F5, 0) );
		menuRefresh.addActionListener( action.get("actionRefresh") );

		menuOffView = new JCheckBoxMenuItem( Msg.get("menu.item.off.ignore") )
		{
			public void updateUI()
			{
				setText( Msg.get("menu.item.off.ignore") );
				super.updateUI();
			}
		};
		menuOffView.addActionListener( action.get("actionToggleOffView") );
		menuOffView.setFont( MENU_FONT );
		menu.add( menuOffView );

		menu.addSeparator();

		if( NativeToolkit.getInstance().isWindows )
		{
			JCheckBoxMenuItem menuAlwaysTop = new JCheckBoxMenuItem( Msg.get("menu.item.alwaysontop") )
			{
				public void updateUI()
				{
					setText( Msg.get("menu.item.alwaysontop") );
					super.updateUI();
				}
			};
			menuAlwaysTop.setAccelerator( KeyStroke.getKeyStroke(KeyEvent.VK_A, InputEvent.ALT_MASK) );
			menuAlwaysTop.addActionListener( action.get("actionAlwaysOnTop") );
			menuAlwaysTop.setFont( MENU_FONT );
			menu.add( menuAlwaysTop );
		}

		WrapMenu menuUI = new WrapMenu("menu.item.lnf");
		menuUI.setFont( FONT );
		UIManager.LookAndFeelInfo[] lnfs = UIManager.getInstalledLookAndFeels();
		for(int i=0; i<lnfs.length; i++)
		{
			final UIManager.LookAndFeelInfo info = lnfs[i];
			JMenuItem item = menuUI.add( info.getName(), false );
			item.setFont( FONT );
			item.addActionListener( new ActionListener() {
				public void actionPerformed( ActionEvent e )
				{
					try
					{
						UIManager.setLookAndFeel( info.getClassName() );
					}
					catch( Exception ex ) {}
					main.updateUIAll();
				}
			});
		}
		menu.add( menuUI );

		menuLocale = new WrapMenu("menu.item.locale");
		menuLocale.setFont( FONT );

		for(Iterator i=Msg.getAvailableLocales().iterator(); i.hasNext(); )
		{
			final Locale loc = (Locale)i.next();
			JMenuItem item = menuLocale.add( loc.getDisplayName(Msg.getCurrentLocale()), false );
			item.setFont( FONT );
			item.addActionListener( new ActionListener() {
				public void actionPerformed( ActionEvent e )
				{
		    		Msg.setLocale( loc );
				}
			});
		}

		menu.add( menuLocale );

		return menu;
	}

	protected JMenu createToolMenu()
	{
		ActionMap action = getActionMap();

		JMenu menu = new WrapMenu("menu.tool");
		menu.setMnemonic( Msg.get("menu.tool.mnemonic").charAt(0) );
		menu.setFont( MENU_HEADER_FONT );

		menuStat = new WrapMenu( "menu.item.chstatus" );
		menuStat.setFont( MENU_FONT );
		addStatusSet( menuStat, statusPopup, action );
		menu.add( menuStat );
		menu.addSeparator();

		menuAddFriend = menu.add( "menu.item.adduser" );
		menuAddFriend.setAccelerator( KeyStroke.getKeyStroke(KeyEvent.VK_A, InputEvent.ALT_MASK) );
		menuAddFriend.setFont( MENU_FONT );
		menuAddFriend.addActionListener( action.get("actionAddFriend") );

		menuRenameFriend = menu.add( "menu.item.renameuser" );
		menuRenameFriend.setAccelerator( KeyStroke.getKeyStroke(KeyEvent.VK_M, InputEvent.CTRL_MASK) );
		menuRenameFriend.setFont( MENU_FONT );
		menuRenameFriend.addActionListener( action.get("actionRenameFriend") );

		menuBlockFriend = menu.add( "menu.item.blockuser" );
		menuBlockFriend.setAccelerator( KeyStroke.getKeyStroke(KeyEvent.VK_B, InputEvent.CTRL_MASK) );
		menuBlockFriend.setFont( MENU_FONT );
		menuBlockFriend.addActionListener( action.get("actionBlockFriend") );

		menuUnblockFriend = menu.add( "menu.item.unblockuser" );
		menuUnblockFriend.setAccelerator( KeyStroke.getKeyStroke(KeyEvent.VK_U, InputEvent.CTRL_MASK) );
		menuUnblockFriend.setFont( MENU_FONT );
		menuUnblockFriend.addActionListener( action.get("actionUnblockFriend") );

		menuRemoveFriend = menu.add( "menu.item.removeuser" );
		menuRemoveFriend.setAccelerator( KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, 0) );
		menuRemoveFriend.setFont( MENU_FONT );
		menuRemoveFriend.addActionListener( action.get("actionRemoveFriend") );

		menu.addSeparator();
		menuAddGroup = menu.add( "menu.item.addgroup" );
		menuAddGroup.setAccelerator( KeyStroke.getKeyStroke(KeyEvent.VK_A, InputEvent.CTRL_MASK) );
		menuAddGroup.setFont( MENU_FONT );
		menuAddGroup.addActionListener( action.get("actionAddGroup") );

		// added by pistos - for support group name change
		menuRenameGroup = menu.add( "menu.item.renamegroup" );
		menuRenameGroup.setAccelerator( KeyStroke.getKeyStroke(KeyEvent.VK_R, InputEvent.CTRL_MASK) );
		menuRenameGroup.setFont( MENU_FONT );
		menuRenameGroup.addActionListener( action.get("actionRenameGroup") );

		menuBlockGroup = menu.add( "menu.item.blockgroup" );
		menuBlockGroup.setFont( MENU_FONT );
		menuBlockGroup.addActionListener( action.get("actionBlockGroup") );

		menuUnblockGroup = menu.add( "menu.item.unblockgroup" );
		menuUnblockGroup.setFont( MENU_FONT );
		menuUnblockGroup.addActionListener( action.get("actionUnblockGroup") );

		menuRemoveGroup = menu.add( "menu.item.removegroup");
		menuRemoveGroup.setAccelerator( KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, InputEvent.CTRL_MASK) );
		menuRemoveGroup.setFont( MENU_FONT );
		menuRemoveGroup.addActionListener( action.get("actionRemoveGroup") );
		menu.addSeparator();

		JMenuItem menuOption = menu.add( "menu.item.option" );
		menuOption.setMnemonic( Msg.get("menu.item.option.mnemonic").charAt(0) );
		menuOption.setAccelerator( KeyStroke.getKeyStroke(KeyEvent.VK_O, InputEvent.ALT_MASK) );
		menuOption.setFont( MENU_FONT );
		menuOption.addActionListener( action.get("actionOption") );

		return menu;
	}

	private void addStatusSet( JMenu menu, JPopupMenu pop, ActionMap action )
	{
		String[] codes = new String[] {
		    "status.online", "status.away", "status.brb", "status.busy",
			"status.idle", "status.eat", "status.phone", "status.hidden" };
		for(int i=0; i<codes.length; i++)
		{
		    JMenuItem item = menu.add( codes[i] );
			item.setFont( FONT );
			item.addActionListener( action.get("actionStatusChange") );
			JMenuItem popItem = pop.add( codes[i] );
			popItem.setFont( FONT );
			popItem.addActionListener( action.get("actionStatusChange") );
		}
	}

	protected JMenu createHelpMenu()
	{
		ActionMap action = getActionMap();

		JMenu menu = new WrapMenu("menu.help");
		menu.setMnemonic( Msg.get("menu.help.mnemonic").charAt(0) );
		menu.setFont( MENU_HEADER_FONT );

		JMenuItem bugMenu = menu.add( "menu.item.bugreport" );
		bugMenu.setFont( MENU_FONT );
		bugMenu.addActionListener( action.get("actionBugReport") );
		bugMenu.setAccelerator( KeyStroke.getKeyStroke(KeyEvent.VK_F8,0) );

		JMenuItem featureMenu = menu.add( "menu.item.reqfeature" );
		featureMenu.setFont( MENU_FONT );
		featureMenu.addActionListener( action.get("actionFeatureRequest") );
		featureMenu.setAccelerator( KeyStroke.getKeyStroke(KeyEvent.VK_F9,0) );

		menu.addSeparator();

		JMenuItem aboutMenu = menu.add( "menu.item.about" );
		aboutMenu.setFont( MENU_FONT );
		aboutMenu.addActionListener( action.get("actionAbout") );

		return menu;
	}

	public void setLoginEnabled( boolean enable )
	{
		menuLogin.setEnabled( enable );
	}

	public boolean isLoginEnabled()
	{
		return menuLogin.isEnabled();
	}

	public void enableLogin()
	{
		SwingUtilities.invokeLater( new Runnable() {
			public void run()
			{
				menuLogin.setEnabled( false );
				menuLogout.setEnabled( true );

				menuAddFriend.setEnabled( true );
				menuRemoveFriend.setEnabled( true );
				menuAddGroup.setEnabled( true );
				menuRenameGroup.setEnabled( true );
				menuRemoveGroup.setEnabled( true );
				menuStat.setEnabled( true );

				menuBlockFriend.setEnabled( true );
				menuUnblockFriend.setEnabled( true );
				menuBlockGroup.setEnabled( true );
				menuUnblockGroup.setEnabled( true );
				menuRenameFriend.setEnabled( true );
			}
		});
	}

	public void disableLogin()
	{
		SwingUtilities.invokeLater( new Runnable() {
			public void run()
			{
				menuLogin.setEnabled( true );
				menuLogout.setEnabled( false );

				menuAddFriend.setEnabled( false );
				menuRemoveFriend.setEnabled( false );
				menuAddGroup.setEnabled( false );
				menuRenameGroup.setEnabled( false );
				menuRemoveGroup.setEnabled( false );
				menuStat.setEnabled( false );

				menuBlockFriend.setEnabled( false );
				menuUnblockFriend.setEnabled( false );
				menuBlockGroup.setEnabled( false );
				menuUnblockGroup.setEnabled( false );
				menuRenameFriend.setEnabled( false );
			}
		});
	}

	protected void collectActions( final ActionGroup actions )
	{
		ActionMap action = getActionMap();

		Method[] ms = actions.getClass().getMethods();
		for(int i=0; i<ms.length; i++)
		{
			final Method m = ms[i];
			String name = m.getName();
			if( name.startsWith("action") )
			{
				action.put( name, new AbstractAction() {
					public void actionPerformed( ActionEvent e )
					{
						try
						{
							if( m.getParameterTypes().length==0 )
								m.invoke( actions, null );
							else
								m.invoke( actions, new Object[] {e} );
						}
						catch( Exception ex ) {
							ex.printStackTrace();
						}
					}
				});
			}
		}
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -