1 /***************************************************************************
2  *                   (C) Copyright 2003-2010 - Stendhal                    *
3  ***************************************************************************
4  ***************************************************************************
5  *                                                                         *
6  *   This program is free software; you can redistribute it and/or modify  *
7  *   it under the terms of the GNU General Public License as published by  *
8  *   the Free Software Foundation; either version 2 of the License, or     *
9  *   (at your option) any later version.                                   *
10  *                                                                         *
11  ***************************************************************************/
12 package games.stendhal.client.gui.group;
13 
14 import javax.swing.event.ChangeEvent;
15 import javax.swing.event.ChangeListener;
16 
17 import games.stendhal.client.gui.LinearScalingModel;
18 
19 /**
20  * Represents a group member. Present members are those that the client has
21  * direct information about, ie. the players on the same zone.
22  */
23 class Member implements Comparable<Member> {
24 	private final String name;
25 	private boolean leader;
26 	private boolean present;
27 	/** Model for detecting which HP changes are significant */
28 	private final LinearScalingModel hpModel = new LinearScalingModel();
29 	/** Listener that needs to be notified about significant HP changes. */
30 	private ChangeListener listener;
31 
32 	/**
33 	 * Create a new member.
34 	 *
35 	 * @param name name of the buddy
36 	 */
Member(String name)37 	Member(String name) {
38 		this.name = name;
39 		hpModel.addChangeListener(new ChangeListener() {
40 			@Override
41 			public void stateChanged(ChangeEvent e) {
42 				if (listener != null) {
43 					// redispatch as a change coming from this member
44 					listener.stateChanged(new ChangeEvent(Member.this));
45 				}
46 			}
47 		});
48 	}
49 
50 	/**
51 	 * Get the name of the member.
52 	 *
53 	 * @return name
54 	 */
getName()55 	String getName() {
56 		return name;
57 	}
58 
59 	/**
60 	 * Check if the member is the group leader.
61 	 *
62 	 * @return <code>true</code> if the member is the group leader,
63 	 *	<code>false</code> otherwise
64 	 */
isLeader()65 	boolean isLeader() {
66 		return leader;
67 	}
68 
69 	/**
70 	 * Set the leader status of the group member.
71 	 *
72 	 * @param status the new leader status
73 	 * @return <code>true</code> if the leader changed, <code>false</code>
74 	 * 	otherwise
75 	 */
setLeader(boolean status)76 	boolean setLeader(boolean status) {
77 		boolean changed = leader != status;
78 		leader = status;
79 		return changed;
80 	}
81 
82 	/**
83 	 * Check if the member is present.
84 	 *
85 	 * @return <code>true</code> if the member is present, <code>false</code>
86 	 * 	otherwise
87 	 */
isPresent()88 	boolean isPresent() {
89 		return present;
90 	}
91 
92 	/**
93 	 * Set the member present or absent.
94 	 *
95 	 * @param present
96 	 */
setPresent(boolean present)97 	void setPresent(boolean present) {
98 		this.present = present;
99 	}
100 
101 	/**
102 	 * Get the ratio of the member's current HP vs her maximum HP. The value
103 	 * is reliable only if the member is present.
104 	 *
105 	 * @return HP ratio
106 	 */
getHpRatio()107 	float getHpRatio() {
108 		return (float) hpModel.getValue();
109 	}
110 
111 	/**
112 	 * Set the ratio of the member's current HP vs her maximum HP.
113 	 *
114 	 * @param ratio new HP ratio
115 	 */
setHpRatio(float ratio)116 	void setHpRatio(float ratio) {
117 		hpModel.setValue(ratio);
118 	}
119 
120 	/**
121 	 * Set the listener that should be notified about changes in the member.
122 	 *
123 	 * @param listener
124 	 */
setChangeListener(ChangeListener listener)125 	void setChangeListener(ChangeListener listener) {
126 		this.listener = listener;
127 	}
128 
129 	/**
130 	 * Set the maximum HP representation. Used to detect which HP ratio changes
131 	 * are significant.
132 	 *
133 	 * @param maxRepresentation
134 	 */
setMaxHPRepresentation(int maxRepresentation)135 	void setMaxHPRepresentation(int maxRepresentation) {
136 		hpModel.setMaxRepresentation(maxRepresentation);
137 	}
138 
139 	@Override
equals(Object obj)140 	public boolean equals(Object obj) {
141 		if (obj instanceof Member) {
142 			return name.equals(((Member) obj).name);
143 		}
144 		return false;
145 	}
146 
147 	@Override
hashCode()148 	public int hashCode() {
149 		return name.hashCode();
150 	}
151 
152 	@Override
compareTo(Member member)153 	public int compareTo(Member member) {
154 		// There really should be only one leader, but check for consistent
155 		// ordering
156 		if (leader != member.leader) {
157 			return (leader) ? -1 : 1;
158 		}
159 
160 		return name.compareToIgnoreCase(member.name);
161 	}
162 }
163