From: Kimmo R. <ki...@us...> - 2011-01-23 20:35:08
|
Update of /cvsroot/arianne/stendhal/src/games/stendhal/client/gui/group In directory sfp-cvsdas-4.v30.ch3.sourceforge.com:/tmp/cvs-serv24886/src/games/stendhal/client/gui/group Added Files: GroupPanel.java GroupPanelController.java Member.java MemberListModel.java Log Message: Started implementing group gui --- NEW FILE: GroupPanelController.java --- /*************************************************************************** * (C) Copyright 2003-2010 - Stendhal * *************************************************************************** *************************************************************************** * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * ***************************************************************************/ package games.stendhal.client.gui.group; import java.util.List; import javax.swing.JComponent; import javax.swing.SwingUtilities; /** * Controller for the group information data. */ public class GroupPanelController { static GroupPanelController instance; final GroupPanel panel; /** * Create a new GroupPaneController. */ private GroupPanelController() { panel = new GroupPanel(); } /** * Get the component showing the group information. * * @return group information component */ public JComponent getComponent() { return panel.getComponent(); } /** * Update group information data. * * @param members members of the group the player belongs to, or * <code>null</code> if the player does not belong to any group * @param leader name of the leader of the group * @param lootMode looting mode of the group */ public void update(final List<String> members, final String leader, final String lootMode) { SwingUtilities.invokeLater(new Runnable() { public void run() { if (members == null) { panel.showHeader("<html>You are not a member in a group.<html>"); panel.setMembers(null); } else { panel.showHeader("<html>Looting: " + lootMode + "<p>Members:</html>"); panel.setMembers(members); panel.setLeader(leader); } } }); } /** * Get the GroupPaneController instance. * * @return instance */ public static synchronized GroupPanelController get() { if (instance == null) { instance = new GroupPanelController(); } return instance; } } --- NEW FILE: MemberListModel.java --- /*************************************************************************** * (C) Copyright 2003-2010 - Stendhal * *************************************************************************** *************************************************************************** * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * ***************************************************************************/ package games.stendhal.client.gui.group; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.swing.AbstractListModel; /** * A <code>ListModel</code> for group members. The group leader is always kept * first. */ public class MemberListModel extends AbstractListModel { // Keep FindBugs happy private static final long serialVersionUID = -5983645746012160833L; private List<Member> memberList = new ArrayList<Member>(); private Map<String, Member> memberMap = new HashMap<String, Member>(); public Object getElementAt(int index) { return memberList.get(index); } public int getSize() { return memberList.size(); } /** * Set the current leader. The leader must be a member of the group, thus * this method must not be called before setting the members. * * @param name name of the leader */ public void setLeader(String name) { Member leader = memberMap.get(name); int index1 = memberList.indexOf(leader); boolean changed = leader.setLeader(true); if (changed) { // find the old leader and demote her for (Member member : memberList) { if (member.isLeader() && !member.getName().equals(leader.getName())) { member.setLeader(false); break; } } Collections.sort(memberList); int index2 = memberList.indexOf(leader); fireContentsChanged(this, index1, index2); } } /** * Set the list of current group members. * * @param members */ public void setMembers(List<String> members) { // Very dumb way to update the list. Adding and removing individual // members as they change would be cleaner int size = memberList.size(); memberMap.clear(); memberList.clear(); if (size > 0) { this.fireIntervalRemoved(this, 0, size - 1); } if (members == null) { return; } for (String name : members) { if (memberMap.containsKey(name)) { // Already a member. Skip to next continue; } else { Member member = new Member(name); memberList.add(member); memberMap.put(name, member); } } this.fireIntervalAdded(this, 0, members.size() - 1); } } --- NEW FILE: GroupPanel.java --- /*************************************************************************** * (C) Copyright 2003-2010 - Stendhal * *************************************************************************** *************************************************************************** * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * ***************************************************************************/ package games.stendhal.client.gui.group; import games.stendhal.client.gui.layout.SBoxLayout; import java.awt.Component; import java.awt.Font; import java.util.List; import javax.swing.JComponent; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.ListCellRenderer; class GroupPanel { final JComponent pane; final JLabel header; final MemberListModel memberList; GroupPanel() { pane = SBoxLayout.createContainer(SBoxLayout.VERTICAL, SBoxLayout.COMMON_PADDING); header = new JLabel(); pane.add(header); memberList = new MemberListModel(); JList list = new JList(memberList); list.setFocusable(false); list.setCellRenderer(new MemberCellRenderer()); list.setOpaque(false); /* * Indent the list a bit so that it's clearly separate from the header. * Using alignment will still allow the left side to be used if the list * is really short of space. */ list.setAlignmentX(0.1f); pane.add(list); } /** * Get the group panel component. * * @return group information display component */ JComponent getComponent() { return pane; } /** * Set the header text. * * @param text */ void showHeader(String text) { header.setText(text); header.setVisible(true); } /** * Set the member list. * * @param members */ void setMembers(List<String> members) { memberList.setMembers(members); } /** * Set the current leader of the group. * * @param name leader name */ void setLeader(String name) { memberList.setLeader(name); } /** * A cell renderer for the member list. */ private static class MemberCellRenderer implements ListCellRenderer { private final JLabel label; final Font boldFont; final Font normalFont; MemberCellRenderer() { label = new JLabel(); label.setOpaque(false); Font f = label.getFont(); if ((f.getStyle() & Font.BOLD) != 0) { boldFont = f; normalFont = f.deriveFont(f.getStyle() ^ Font.BOLD); } else { normalFont = f; boldFont = f.deriveFont(f.getStyle() | Font.BOLD); } } public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { Member member = (Member) value; label.setText(member.getName()); if (member.isLeader()) { label.setFont(boldFont); } else { label.setFont(normalFont); } return label; } } } --- NEW FILE: Member.java --- /*************************************************************************** * (C) Copyright 2003-2010 - Stendhal * *************************************************************************** *************************************************************************** * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * ***************************************************************************/ package games.stendhal.client.gui.group; /** * Represents a group member. */ class Member implements Comparable<Member> { private final String name; private boolean leader; /** * Create a new member. * * @param name name of the buddy */ Member(String name) { this.name = name; } /** * Get the name of the member. * * @return name */ String getName() { return name; } /** * Check if the member is the group leader. * * @return <code>true</code> if the member is the group leader, * <code>false</code> otherwise */ boolean isLeader() { return leader; } /** * Set the leader status of the group member. * * @param status the new leader status * @return <code>true</code> if the leader changed, <code>false</code> * otherwise */ boolean setLeader(boolean status) { boolean changed = leader != status; leader = status; return changed; } @Override public boolean equals(Object obj) { if (obj instanceof Member) { return name.equals(((Member) obj).name); } return false; } @Override public int hashCode() { return name.hashCode(); } public int compareTo(Member member) { // There really should be only one member, but check for consistent // ordering if (leader != member.leader) { return (leader) ? -1 : 1; } return name.compareToIgnoreCase(member.name); } } |