1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 package net.curre.prefcount.gui;
16
17 import java.awt.*;
18 import java.awt.event.WindowAdapter;
19 import java.awt.event.WindowEvent;
20 import java.util.ArrayList;
21 import java.util.List;
22 import java.util.ResourceBundle;
23 import javax.swing.*;
24
25 import net.curre.prefcount.App;
26 import net.curre.prefcount.PrefCountRegistry;
27 import net.curre.prefcount.bean.PlayerStatistics;
28 import net.curre.prefcount.bean.Settings;
29 import net.curre.prefcount.event.DialogButtonNavigationListener;
30 import net.curre.prefcount.event.QuitActionListener;
31 import net.curre.prefcount.gui.theme.skin.PrefSkin;
32 import net.curre.prefcount.gui.aa.AAJButton;
33 import net.curre.prefcount.gui.aa.AAJPanel;
34 import net.curre.prefcount.gui.aa.AAJLabel;
35 import net.curre.prefcount.gui.menu.PrefCountMenuBar;
36 import net.curre.prefcount.service.LafThemeService;
37 import net.curre.prefcount.service.SettingsService;
38 import net.curre.prefcount.util.Utilities;
39
40
41
42
43
44
45
46
47
48
49
50
51
52 public class PlayerDialogBasePanel extends JFrame {
53
54
55 protected MainWindow mainWindow;
56
57
58 protected PrefCountMenuBar menuBar;
59
60
61 JButton backButton;
62
63
64 JButton nextButton;
65
66
67 JLabel messageLabel;
68
69
70 JLabel errorLabel;
71
72
73 JPanel questionsPane;
74
75
76 protected int playersNumber;
77
78
79 protected static int currPlayerPanel = 0;
80
81
82
83
84
85 protected List<JButton> navigationButtons;
86
87
88
89
90
91
92
93
94
95
96 public PlayerDialogBasePanel(int playersNumber, MainWindow mainWindow) {
97 super(ResourceBundle.getBundle("default").getString("pref.dialog.title"));
98
99 Image appImg = Toolkit.getDefaultToolkit().createImage(App.class.getResource("images/PrefCount-16x16.png"));
100 super.setIconImage(appImg);
101
102 this.playersNumber = playersNumber;
103 this.mainWindow = mainWindow;
104 navigationButtons = new ArrayList<JButton>();
105
106 messageLabel = new AAJLabel();
107 messageLabel.setOpaque(true);
108 questionsPane = new AAJPanel();
109 questionsPane.setOpaque(true);
110 errorLabel = new AAJLabel();
111 errorLabel.setOpaque(true);
112
113 initComponents();
114 Settings settings = SettingsService.getSettings();
115 super.setSize(settings.getDialogFrameWidth(), settings.getDialogFrameHeight());
116 super.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
117 super.setLocationRelativeTo(getOwner());
118 PrefSkin skin = LafThemeService.getInstance().getCurrentSkin();
119 super.setBackground(skin.getMainBackgroundColor());
120
121
122 super.addWindowListener(new WindowAdapter() {
123 public void windowOpened(WindowEvent e) {
124 getCurrentInnerPanel().focusFirstInputField();
125 }
126 });
127
128
129 menuBar = PrefCountRegistry.getInstance().addPlayerDialogMenuBar(this);
130
131 super.setVisible(mainWindow.isVisible());
132 }
133
134
135
136
137
138
139
140
141 public void transferFocusProperly(int currIndex) {
142 for (int i = currIndex + 1; i < navigationButtons.size(); ++i) {
143 if (navigationButtons.get(i).isEnabled()) {
144 return;
145 }
146 }
147 getCurrentInnerPanel().focusFirstInputField();
148 }
149
150
151
152
153
154
155
156 public void nextQuestionEventHelper(boolean isNextAction) {
157 if ((isNextAction && !nextButton.isEnabled()) ||
158 (!isNextAction && !backButton.isEnabled())) {
159 return;
160 }
161 DialogInnerPanel currPanel = getCurrentInnerPanel();
162
163
164 if (!currPanel.validateFields()) {
165 return;
166 }
167
168
169 currPanel.doOnLeave();
170 currPlayerPanel = currPlayerPanel + (isNextAction ? 1 : -1);
171 currPanel = getCurrentInnerPanel();
172 currPanel.doOnEntry();
173
174
175 final boolean nextButtonEnabled = !currPanel.isLastPanel();
176 final boolean backButtonEnabled = !currPanel.isFirstPanel();
177 final boolean computeButtonEnabled = !nextButtonEnabled;
178 nextButton.setEnabled(nextButtonEnabled);
179 backButton.setEnabled(backButtonEnabled);
180 if (menuBar != null) {
181 menuBar.toggleNextAction(nextButtonEnabled);
182 menuBar.toggleBackAction(backButtonEnabled);
183 menuBar.toggleComputeAction(computeButtonEnabled);
184 }
185
186
187 messageLabel.setText(currPanel.getHeaderMessage());
188
189 CardLayout clay = (CardLayout) questionsPane.getLayout();
190 if (isNextAction) {
191 clay.next(questionsPane);
192 } else {
193 clay.previous(questionsPane);
194 }
195 currPanel.focusFirstInputField();
196 mainWindow.repaint();
197 }
198
199
200 public void repaint() {
201 Settings settings = SettingsService.getSettings();
202 super.setSize(settings.getDialogFrameWidth(), settings.getDialogFrameHeight());
203 }
204
205
206
207
208
209
210 public DialogInnerPanel getCurrentInnerPanel() {
211 return (DialogInnerPanel) questionsPane.getComponents()[currPlayerPanel];
212 }
213
214
215
216
217
218
219
220 void toggleErrorField(String message) {
221 if (message == null) {
222 errorLabel.setText("");
223 errorLabel.setVisible(false);
224 } else {
225 errorLabel.setText(message);
226 errorLabel.setVisible(true);
227 }
228 }
229
230
231
232
233
234
235 void setPlayersNames(List<String> playersNames) {
236 List<PlayerStatistics> stats = mainWindow.playerResults.getPlayerStats();
237 for (int i = 0; i < stats.size(); ++i) {
238 PlayerStatistics stat = stats.get(i);
239 stat.setPlayerName(playersNames.get(i));
240 }
241 }
242
243
244 protected void focusFirstNavigationalButton() {
245 for (JButton button : navigationButtons) {
246 if (button.isEnabled()) {
247 button.requestFocus();
248 return;
249 }
250 }
251 getCurrentInnerPanel().focusFirstInputField();
252 }
253
254
255
256
257 private void initComponents() {
258 JPanel navigationPanel = new JPanel();
259 navigationPanel.setOpaque(true);
260 JPanel mainContentPanel = new JPanel();
261 mainContentPanel.setOpaque(true);
262 JPanel messagePanel = new JPanel();
263 messagePanel.setOpaque(true);
264 JPanel errorPanel = new JPanel();
265 errorPanel.setOpaque(true);
266
267
268
269 if (!Utilities.isMacOs()) {
270 mainContentPanel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW)
271 .put(KeyStroke.getKeyStroke("control Q"), "exitAppAction");
272 mainContentPanel.getActionMap().put("exitAppAction", new QuitActionListener());
273 }
274 ResourceBundle bundle = ResourceBundle.getBundle("default");
275
276
277 Container contentPaneOut = getContentPane();
278 contentPaneOut.setLayout(new BorderLayout(5, 5));
279
280
281 {
282 navigationPanel.setLayout(new FlowLayout(FlowLayout.CENTER, 5, 10));
283
284
285 backButton = createButtonHelper(bundle.getString("pref.dialog.backButton.label"),
286 bundle.getString("pref.dialog.backButton.shortcut").charAt(0),
287 false, false);
288 navigationPanel.add(backButton);
289 navigationPanel.add(new JPanel(null));
290
291
292 nextButton = createButtonHelper(bundle.getString("pref.dialog.nextButton.label"),
293 bundle.getString("pref.dialog.nextButton.shortcut").charAt(0),
294 true, true);
295 navigationPanel.add(nextButton);
296 }
297 contentPaneOut.add(navigationPanel, BorderLayout.NORTH);
298
299
300 {
301 mainContentPanel.setLayout(new BorderLayout());
302
303
304 {
305 messagePanel.setLayout(new FlowLayout(FlowLayout.CENTER, 5, 0));
306
307
308 messageLabel.setText(bundle.getString("pref.dialog.message.default"));
309 messagePanel.add(messageLabel);
310 }
311 mainContentPanel.add(messagePanel, BorderLayout.NORTH);
312
313 JPanel contentPaneWrapper = new JPanel();
314
315 {
316 contentPaneWrapper.setLayout(new FlowLayout());
317 JPanel playerNamesPanel = new PlayersNamesPanel(this, playersNumber);
318 messageLabel.setText(((DialogInnerPanel) playerNamesPanel).getHeaderMessage());
319 messageLabel.setOpaque(true);
320 questionsPane.setLayout(new CardLayout());
321 questionsPane.add(playerNamesPanel, "Player Names");
322 questionsPane.add(new PlayerDataPanel(this, playersNumber, 0), "Player 0");
323 questionsPane.add(new PlayerDataPanel(this, playersNumber, 1), "Player 1");
324 questionsPane.add(new PlayerDataPanel(this, playersNumber, 2), "Player 2");
325 if (playersNumber == 4) {
326 questionsPane.add(new PlayerDataPanel(this, playersNumber, 3), "Player 3");
327 }
328
329 LastInputPanel lastInputPanel = new LastInputPanel(this);
330 PrefCountRegistry.getInstance().setLastInputPanel(lastInputPanel);
331 questionsPane.add(lastInputPanel, "Last Input");
332 contentPaneWrapper.add(questionsPane);
333 }
334 mainContentPanel.add(contentPaneWrapper, BorderLayout.CENTER);
335 }
336 contentPaneOut.add(mainContentPanel, BorderLayout.CENTER);
337
338
339 {
340 errorPanel.setLayout(new FlowLayout(FlowLayout.CENTER, 5, 10));
341
342
343 errorLabel.setText(bundle.getString("pref.dialog.errorLabel.default"));
344 errorLabel.setForeground(Color.RED);
345 errorLabel.setVisible(false);
346 errorPanel.add(errorLabel);
347 }
348 contentPaneOut.add(errorPanel, BorderLayout.SOUTH);
349 setLocationRelativeTo(getOwner());
350 }
351
352
353
354
355
356
357
358
359
360
361
362
363 private JButton createButtonHelper(String label, char mnemonicCode,
364 boolean isNextButton, boolean isEnabled) {
365 JButton button = new AAJButton();
366 navigationButtons.add(button);
367 button.setEnabled(isEnabled);
368 button.setText(Utilities.underlineLetter(label, 0));
369 DialogButtonNavigationListener dialogListener =
370 new DialogButtonNavigationListener(isNextButton, this);
371 button.addFocusListener(dialogListener);
372 button.addActionListener(dialogListener);
373 button.addKeyListener(dialogListener);
374 button.setMnemonic(mnemonicCode);
375
376
377
378 if (!Utilities.isMacOs()) {
379 InputMap map = questionsPane.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
380 String actionName = "button" + mnemonicCode + "Action";
381 map.put(KeyStroke.getKeyStroke("control " + mnemonicCode), actionName);
382 questionsPane.getActionMap().put(actionName, dialogListener);
383 }
384
385 return button;
386 }
387
388 }