View Javadoc
1 /***
2 * Copyright (c) 2003 held jointly by the individual authors.
3 *
4 * This library is free software; you can redistribute it and/or modify it
5 * under the terms of the GNU Lesser General Public License as published
6 * by the Free Software Foundation; either version 2.1 of the License, or
7 * (at your option) any later version.
8 *
9 * This library is distributed in the hope that it will be useful, but
10 * WITHOUT ANY WARRANTY; with out even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU Lesser General Public License for more details.
13 *
14 * You should have received a copy of the GNU Lesser General Public License
15 * along with this library; if not, write to the Free Software Foundation,
16 * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
17 *
18 * > http://www.gnu.org/copyleft/lesser.html
19 * > http://www.opensource.org/licenses/lgpl-license.php
20 */
21 package net.mlw.gfw.ext.card.component;
22
23 import java.awt.Dimension;
24 import java.awt.Graphics;
25 import java.awt.Image;
26 import java.awt.Panel;
27 import java.awt.event.MouseEvent;
28
29 import javax.swing.event.MouseInputAdapter;
30
31 import net.mlw.gfw.client.ClientContext;
32 import net.mlw.gfw.event.Event;
33 import net.mlw.gfw.event.EventHandler;
34 import net.mlw.gfw.event.EventHandlerContainer;
35 import net.mlw.gfw.event.EventHandlerList;
36 import net.mlw.gfw.ext.card.Card;
37 import net.mlw.gfw.ext.card.CardRenderer;
38 import net.mlw.gfw.ext.card.DefaultHandModel;
39 import net.mlw.gfw.ext.card.HandModel;
40
41 /***
42 * @author Matthew L. Wilson
43 * @version $Revision: 1.9 $ $Date: 2004/06/29 20:32:56 $
44 */
45 public class HandPanel extends Panel implements EventHandlerContainer
46 {
47 protected Image buffer;
48 protected Graphics b;
49
50 /*** The model for this component. * */
51 private HandModel handModel;
52
53 private final CardRenderer cardRenderer;
54
55 private int maxNumberOfCards;
56
57 private ClientContext context;
58
59 private int selectedCard = -1;
60
61 /***
62 * Default constructor.
63 */
64 public HandPanel(CardRenderer cardRenderer, int maxNumberOfCards)
65 {
66 this(cardRenderer, maxNumberOfCards, new DefaultHandModel(maxNumberOfCards));
67 }
68
69 /***
70 * Default constructor.
71 */
72 public HandPanel(CardRenderer cardRenderer, int maxNumberOfCards, HandModel handModel)
73 {
74 this.cardRenderer = cardRenderer;
75 this.maxNumberOfCards = maxNumberOfCards;
76 setModel(handModel);
77 }
78
79 /***
80 * @param g
81 */
82 public void update(Graphics g)
83 {
84 paint(g);
85 }
86
87 /***
88 * @param g
89 */
90 public void paint(Graphics g)
91 {
92 if (buffer == null)
93 {
94 Dimension dimension = getPreferredSize();
95 buffer = createImage((int) dimension.getWidth(), (int) dimension.getHeight());
96 b = buffer.getGraphics();
97 }
98
99 g.drawImage(buffer, 0, 0, this);
100 }
101
102 private synchronized void drawCards()
103 {
104
105 if (b != null)
106 {
107 int offset = 0;
108 b.setColor(getBackground());
109 b.fillRect(0, 0, (int) dimension.getWidth(), (int) dimension.getHeight());
110 for (int i = 0; i < handModel.getCards().length; i++)
111 {
112 Card card = handModel.getCards()[i];
113 if (card != null)
114 {
115 cardRenderer.render(
116 card,
117 b,
118 this,
119 handModel.isSelected(card),
120 offset * cardRenderer.getOffset(),
121 handModel.isSelected(card) ? 0 : cardRenderer.getOffset());
122 }
123
124 offset++;
125 }
126 }
127 repaint();
128 }
129
130 private Dimension dimension;
131
132 public Dimension getPreferredSize()
133 {
134 if (dimension == null)
135 {
136 dimension =
137 new Dimension(
138 (int) (2 + maxNumberOfCards * cardRenderer.getOffset() + (cardRenderer.getDimensionOfCard().getWidth() - cardRenderer.getOffset())),
139 (int) (2 + cardRenderer.getDimensionOfCard().getHeight() + cardRenderer.getOffset()));
140 }
141 return dimension;
142 }
143
144 /***
145 * @see net.mlw.gfw.client.ClientEventHandler#init(net.mlw.gfw.client.ClientContext)
146 */
147 public void init(ClientContext context)
148 {
149 this.context = context;
150 this.addMouseListener(new MouseInputAdapter()
151 {
152
153 public void mousePressed(MouseEvent e)
154 {
155 if (handModel.getCardSelectionBehavior() != null)
156 {
157 int tempIndex = getSelectedCardIndex(e.getX(), e.getY());
158 if (selectedCard != tempIndex)
159 {
160 if (tempIndex >= 0 && tempIndex < handModel.getCards().length)
161 {
162 Card card = handModel.getCards()[selectedCard = tempIndex];
163 handModel.getCardSelectionBehavior().setSelected(card, !handModel.getCardSelectionBehavior().isSelected(card));
164 drawCards();
165 }
166 }
167 }
168 }
169
170 public void mouseReleased(MouseEvent e)
171 {
172 if (handModel.getCardSelectionBehavior() != null)
173 {
174 if (selectedCard == getSelectedCardIndex(e.getX(), e.getY()))
175 {
176 if (selectedCard < handModel.getCards().length)
177 {
178 handModel.getCardSelectionBehavior().postProcess(getContext(), eventHandlers);
179 //cardSelection.setSelected(handModel.getCards()[selectedCard], false);
180 }
181
182 }
183 else if (selectedCard >= 0 && selectedCard < handModel.getCards().length)
184 {
185 handModel.getCardSelectionBehavior().setSelected(handModel.getCards()[selectedCard], false);
186 }
187
188 selectedCard = -1;
189 drawCards();
190 }
191 }
192 });
193 }
194
195 /***
196 * Gets the card clicked on.
197 *
198 * @param x
199 * Location of the mouse.
200 * @param y
201 * Location of the mouse.
202 * @return The index of the card selected.
203 */
204 private int getSelectedCardIndex(int x, int y)
205 {
206 int i = 0, index = (x / cardRenderer.getOffset());
207 for (int steps = (int) (cardRenderer.getDimensionOfCard().getWidth() / cardRenderer.getOffset());
208 ((i + 1) < steps) && (index > 0) && ((index - i) >= handModel.getCards().length || handModel.getCards()[index - i] == null);
209 i++);
210 return index - i;
211 }
212
213 /***
214 * @see net.mlw.gfw.event.EventHandler#onEvent(net.mlw.gfw.event.Event)
215 */
216 public void onEvent(Event event)
217 {
218 drawCards();
219 }
220
221 /***
222 * @return Returns the context.
223 */
224 public ClientContext getContext()
225 {
226 return context;
227 }
228
229 /***
230 * @return Returns the handModel.
231 */
232 public HandModel getModel()
233 {
234 return handModel;
235 }
236
237 /***
238 * @param handModel The handModel to set.
239 */
240 public void setModel(HandModel handModel)
241 {
242 if (handModel != null)
243 {
244 handModel.removeEventHandler(eventHandler);
245 }
246 this.handModel = handModel;
247 this.handModel.addEventHandler(eventHandler);
248 }
249
250 private EventHandler eventHandler = new EventHandler()
251 {
252 /***
253 * @see net.mlw.gfw.event.EventHandler#onEvent(net.mlw.gfw.event.Event)
254 */
255 public void onEvent(Event event)
256 {
257 drawCards();
258 }
259 };
260
261 private EventHandlerList eventHandlers = new EventHandlerList();
262 /***
263 * @see net.mlw.gfw.event.EventHandlerContainer#addEventHandler(net.mlw.gfw.event.EventHandler)
264 */
265 public EventHandler addEventHandler(EventHandler eventHandler)
266 {
267 return eventHandlers.addEventHandler(eventHandler);
268 }
269
270 /***
271 * @see net.mlw.gfw.event.EventHandlerContainer#removeEventHandler(net.mlw.gfw.event.EventHandler)
272 */
273 public EventHandler removeEventHandler(EventHandler eventHandler)
274 {
275 return eventHandlers.removeEventHandler(eventHandler);
276 }
277
278 }
This page was automatically generated by Maven