4 * Copyright(c) 2009 olyutorskii
\r
5 * $Id: VillageDigest.java 956 2009-12-13 15:14:07Z olyutorskii $
\r
8 package jp.sourceforge.jindolf;
\r
10 import java.awt.Container;
\r
11 import java.awt.Dimension;
\r
12 import java.awt.EventQueue;
\r
13 import java.awt.Frame;
\r
14 import java.awt.GridBagConstraints;
\r
15 import java.awt.GridBagLayout;
\r
16 import java.awt.Image;
\r
17 import java.awt.Insets;
\r
18 import java.awt.LayoutManager;
\r
19 import java.awt.Rectangle;
\r
20 import java.awt.event.ActionEvent;
\r
21 import java.awt.event.ActionListener;
\r
22 import java.awt.event.ItemEvent;
\r
23 import java.awt.event.ItemListener;
\r
24 import java.awt.event.WindowAdapter;
\r
25 import java.awt.event.WindowEvent;
\r
26 import java.text.DateFormat;
\r
27 import java.util.Date;
\r
28 import java.util.List;
\r
29 import javax.swing.BorderFactory;
\r
30 import javax.swing.DefaultComboBoxModel;
\r
31 import javax.swing.ImageIcon;
\r
32 import javax.swing.JButton;
\r
33 import javax.swing.JComboBox;
\r
34 import javax.swing.JComponent;
\r
35 import javax.swing.JDialog;
\r
36 import javax.swing.JLabel;
\r
37 import javax.swing.JPanel;
\r
38 import javax.swing.JPopupMenu;
\r
39 import javax.swing.JScrollPane;
\r
40 import javax.swing.JTabbedPane;
\r
41 import javax.swing.JTextArea;
\r
42 import javax.swing.JViewport;
\r
43 import javax.swing.border.Border;
\r
44 import jp.sourceforge.jindolf.corelib.GameRole;
\r
45 import jp.sourceforge.jindolf.corelib.Team;
\r
50 @SuppressWarnings("serial")
\r
51 public class VillageDigest
\r
53 implements ActionListener,
\r
56 private static final String FRAMETITLE =
\r
57 "村のダイジェスト - " + Jindolf.TITLE;
\r
58 private static final String ITEMDELIM = " : ";
\r
61 * キャプション付き項目をコンテナに追加。
\r
62 * @param container コンテナ
\r
63 * @param caption 項目キャプション名
\r
64 * @param delimiter デリミタ文字
\r
65 * @param item 項目アイテム
\r
67 private static void addCaptionedItem(Container container,
\r
68 CharSequence caption,
\r
69 CharSequence delimiter,
\r
71 LayoutManager layout = container.getLayout();
\r
72 if( ! (layout instanceof GridBagLayout) ){
\r
73 throw new IllegalArgumentException();
\r
76 JLabel captionLabel = new JLabel(caption.toString());
\r
77 JLabel delimiterLabel = new JLabel(delimiter.toString());
\r
78 JComponent itemComp;
\r
79 if(item instanceof JComponent){
\r
80 itemComp = (JComponent) item;
\r
82 itemComp = new JLabel(item.toString());
\r
85 GridBagConstraints constraints = new GridBagConstraints();
\r
87 constraints.weightx = 0.0;
\r
88 constraints.weighty = 0.0;
\r
89 constraints.fill = GridBagConstraints.NONE;
\r
90 constraints.insets = new Insets(2, 2, 2, 2);
\r
92 constraints.gridwidth = 1;
\r
93 constraints.anchor = GridBagConstraints.NORTHEAST;
\r
94 container.add(captionLabel, constraints);
\r
95 container.add(delimiterLabel, constraints);
\r
97 constraints.weightx = 1.0;
\r
98 constraints.gridwidth = GridBagConstraints.REMAINDER;
\r
99 constraints.anchor = GridBagConstraints.NORTHWEST;
\r
100 container.add(itemComp, constraints);
\r
106 * キャプション付き項目をコンテナに追加。
\r
107 * @param container コンテナ
\r
108 * @param caption 項目キャプション名
\r
109 * @param item 項目アイテム
\r
111 private static void addCaptionedItem(Container container,
\r
112 CharSequence caption,
\r
114 addCaptionedItem(container, caption, ITEMDELIM, item);
\r
120 * @param container コンテナ
\r
122 private static void addFatPad(Container container){
\r
123 LayoutManager layout = container.getLayout();
\r
124 if( ! (layout instanceof GridBagLayout) ){
\r
125 throw new IllegalArgumentException();
\r
128 JComponent pad = new JPanel();
\r
130 GridBagConstraints constraints = new GridBagConstraints();
\r
131 constraints.weightx = 1.0;
\r
132 constraints.weighty = 1.0;
\r
133 constraints.fill = GridBagConstraints.BOTH;
\r
134 constraints.gridwidth = GridBagConstraints.REMAINDER;
\r
135 container.add(pad, constraints);
\r
141 * GridBagLayoutでレイアウトする空コンポーネントを生成する。
\r
144 private static JComponent createGridBagComponent(){
\r
145 JComponent result = new JPanel();
\r
146 LayoutManager layout = new GridBagLayout();
\r
147 result.setLayout(layout);
\r
151 private final JComponent summaryPanel = buildSummaryPanel();
\r
153 private final JLabel faceLabel = new JLabel();
\r
154 private final ImageIcon faceIcon = new ImageIcon();
\r
155 private final JComboBox playerBox = new JComboBox();
\r
156 private final DefaultComboBoxModel playerListModel =
\r
157 new DefaultComboBoxModel();
\r
158 private final JButton prevPlayer = new JButton("↑");
\r
159 private final JButton nextPlayer = new JButton("↓");
\r
160 private final JLabel roleLabel = new JLabel();
\r
161 private final JLabel destinyLabel = new JLabel();
\r
162 private final JLabel specialSkillLabel = new JLabel();
\r
163 private final JLabel entryLabel = new JLabel();
\r
164 private final JLabel idLabel = new JLabel();
\r
165 private final WebButton urlLine = new WebButton();
\r
166 private final JComponent playerPanel = buildPlayerPanel();
\r
168 private final JComboBox iconSetBox = new JComboBox();
\r
169 private final DefaultComboBoxModel iconSetListModel =
\r
170 new DefaultComboBoxModel();
\r
171 private final JLabel authorLabel = new JLabel();
\r
172 private final JLabel authorUrlLabel = new JLabel();
\r
173 private final WebButton iconCatalog = new WebButton();
\r
174 private final JButton genCastTableButton =
\r
175 new JButton("キャスト表Wiki生成");
\r
176 private final JButton copyClipButton =
\r
177 new JButton("クリップボードにコピー");
\r
178 private final JTextArea templateArea = new JTextArea();
\r
179 private final JButton voteButton = new JButton("投票Wiki生成");
\r
180 private final JButton vlgWikiButton = new JButton("村詳細Wiki生成");
\r
181 private final JComponent clipboardPanel = buildClipboardPanel();
\r
183 private final JButton closeButton = new JButton("閉じる");
\r
185 private Village village;
\r
187 private GameSummary gameSummary;
\r
191 * @param owner 親フレーム
\r
193 public VillageDigest(Frame owner){
\r
194 super(owner, FRAMETITLE, true);
\r
196 GUIUtils.modifyWindowAttributes(this, true, false, true);
\r
198 setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
\r
199 addWindowListener(new WindowAdapter(){
\r
201 public void windowClosing(WindowEvent event){
\r
207 this.faceLabel.setIcon(this.faceIcon);
\r
209 this.playerBox.setModel(this.playerListModel);
\r
210 this.playerBox.addItemListener(this);
\r
212 this.prevPlayer.setMargin(new Insets(1, 1, 1, 1));
\r
213 this.prevPlayer.addActionListener(this);
\r
214 this.prevPlayer.setToolTipText("前のプレイヤー");
\r
216 this.nextPlayer.setMargin(new Insets(1, 1, 1, 1));
\r
217 this.nextPlayer.addActionListener(this);
\r
218 this.nextPlayer.setToolTipText("次のプレイヤー");
\r
220 this.iconSetBox.setModel(this.iconSetListModel);
\r
221 this.iconSetBox.addItemListener(this);
\r
222 for(FaceIconSet iconSet : WolfBBS.getFaceIconSetList()){
\r
223 this.iconSetListModel.addElement(iconSet);
\r
226 this.iconCatalog.setURLText(
\r
227 "http://wolfbbs.jp/"
\r
228 +"%A4%DE%A4%C8%A4%E1%A5%B5%A5%A4%A5%C8%A4%C7"
\r
229 +"%CD%F8%CD%D1%B2%C4%C7%BD%A4%CA%A5%A2%A5%A4"
\r
230 +"%A5%B3%A5%F3%B2%E8%C1%FC.html");
\r
231 this.iconCatalog.setCaption("顔アイコン見本ページ");
\r
233 this.templateArea.setEditable(true);
\r
234 this.templateArea.setLineWrap(true);
\r
235 Monodizer.monodize(this.templateArea);
\r
236 JPopupMenu popup = new TextPopup();
\r
237 this.templateArea.setComponentPopupMenu(popup);
\r
239 this.genCastTableButton.addActionListener(this);
\r
240 this.voteButton.addActionListener(this);
\r
241 this.vlgWikiButton.addActionListener(this);
\r
242 this.copyClipButton.addActionListener(this);
\r
244 this.closeButton.addActionListener(this);
\r
246 Monodizer.monodize(this.idLabel);
\r
247 Monodizer.monodize(this.authorUrlLabel);
\r
249 Container content = getContentPane();
\r
259 private JComponent buildSummaryPanel(){
\r
260 JComponent result = createGridBagComponent();
\r
262 Border border = BorderFactory.createEmptyBorder(5, 5, 5, 5);
\r
263 result.setBorder(border);
\r
270 * @return プレイヤーサマリ画面
\r
272 private JComponent buildPlayerPanel(){
\r
273 JComponent result = createGridBagComponent();
\r
274 GridBagConstraints constraints = new GridBagConstraints();
\r
276 constraints.weightx = 0.0;
\r
277 constraints.weighty = 0.0;
\r
278 constraints.fill = GridBagConstraints.NONE;
\r
279 constraints.anchor = GridBagConstraints.NORTHEAST;
\r
280 constraints.insets = new Insets(2, 2, 2, 2);
\r
281 result.add(this.faceLabel, constraints);
\r
283 result.add(new JLabel(ITEMDELIM), constraints);
\r
285 constraints.anchor = GridBagConstraints.NORTHWEST;
\r
286 result.add(this.playerBox, constraints);
\r
287 result.add(this.prevPlayer, constraints);
\r
288 constraints.gridwidth = GridBagConstraints.REMAINDER;
\r
289 result.add(this.nextPlayer, constraints);
\r
291 addCaptionedItem(result, "役職", this.roleLabel);
\r
292 addCaptionedItem(result, "運命", this.destinyLabel);
\r
293 addCaptionedItem(result, "特殊技能", this.specialSkillLabel);
\r
294 addCaptionedItem(result, "エントリ#", this.entryLabel);
\r
295 addCaptionedItem(result, "ID", this.idLabel);
\r
296 addCaptionedItem(result, "URL", this.urlLine);
\r
298 constraints.weightx = 1.0;
\r
299 constraints.weighty = 1.0;
\r
300 constraints.fill = GridBagConstraints.BOTH;
\r
301 constraints.gridwidth = GridBagConstraints.REMAINDER;
\r
302 result.add(new JPanel(), constraints);
\r
304 Border border = BorderFactory.createEmptyBorder(5, 5, 5, 5);
\r
305 result.setBorder(border);
\r
312 * @return キャスト表生成画面
\r
314 private JComponent buildCastPanel(){
\r
315 JComponent result = createGridBagComponent();
\r
316 GridBagConstraints constraints = new GridBagConstraints();
\r
318 constraints.anchor = GridBagConstraints.NORTHEAST;
\r
319 constraints.gridwidth = GridBagConstraints.REMAINDER;
\r
320 constraints.insets = new Insets(2, 2, 2, 2);
\r
321 result.add(this.iconCatalog, constraints);
\r
323 addCaptionedItem(result, "顔アイコンセットを選択", this.iconSetBox);
\r
324 addCaptionedItem(result, "作者", this.authorLabel);
\r
325 addCaptionedItem(result, "URL", this.authorUrlLabel);
\r
327 constraints.weightx = 1.0;
\r
328 constraints.weighty = 0.0;
\r
329 constraints.fill = GridBagConstraints.NONE;
\r
330 constraints.insets = new Insets(2, 2, 2, 2);
\r
331 constraints.anchor = GridBagConstraints.NORTHEAST;
\r
332 constraints.gridwidth = GridBagConstraints.REMAINDER;
\r
333 result.add(this.genCastTableButton, constraints);
\r
335 Border border = BorderFactory.createTitledBorder("キャスト表Wiki生成");
\r
336 result.setBorder(border);
\r
343 * @return 投票Box生成画面
\r
345 private JComponent buildVotePanel(){
\r
346 JComponent result = createGridBagComponent();
\r
347 GridBagConstraints constraints = new GridBagConstraints();
\r
349 constraints.weightx = 1.0;
\r
350 constraints.weighty = 0.0;
\r
351 constraints.fill = GridBagConstraints.NONE;
\r
352 constraints.anchor = GridBagConstraints.NORTHEAST;
\r
353 constraints.gridwidth = GridBagConstraints.REMAINDER;
\r
354 constraints.insets = new Insets(2, 2, 2, 2);
\r
355 result.add(this.voteButton, constraints);
\r
357 Border border = BorderFactory.createTitledBorder("投票Wiki生成");
\r
358 result.setBorder(border);
\r
364 * 村詳細Wiki生成画面を生成する。
\r
365 * @return 村詳細Wiki生成画面
\r
367 private JComponent buildVillageWikiPanel(){
\r
368 JComponent result = createGridBagComponent();
\r
369 GridBagConstraints constraints = new GridBagConstraints();
\r
371 constraints.weightx = 1.0;
\r
372 constraints.weighty = 0.0;
\r
373 constraints.fill = GridBagConstraints.NONE;
\r
374 constraints.anchor = GridBagConstraints.NORTHEAST;
\r
375 constraints.gridwidth = GridBagConstraints.REMAINDER;
\r
376 constraints.insets = new Insets(2, 2, 2, 2);
\r
377 result.add(this.vlgWikiButton, constraints);
\r
379 Border border = BorderFactory.createTitledBorder("村詳細Wiki生成");
\r
380 result.setBorder(border);
\r
386 * Wikiテキスト領域GUIの生成。
\r
387 * @return Wikiテキスト領域GUI
\r
389 private JComponent buildClipText(){
\r
390 JComponent result = createGridBagComponent();
\r
391 GridBagConstraints constraints = new GridBagConstraints();
\r
395 constraints.insets = new Insets(2, 2, 2, 2);
\r
397 constraints.weightx = 0.0;
\r
398 constraints.weighty = 0.0;
\r
399 constraints.fill = GridBagConstraints.NONE;
\r
400 constraints.anchor = GridBagConstraints.NORTHEAST;
\r
401 constraints.gridwidth = GridBagConstraints.REMAINDER;
\r
402 result.add(this.copyClipButton, constraints);
\r
404 border = BorderFactory.createEmptyBorder(2, 2, 2, 2);
\r
405 this.templateArea.setBorder(border);
\r
406 JScrollPane scroller = new JScrollPane();
\r
407 JViewport viewPort = scroller.getViewport();
\r
408 viewPort.setView(this.templateArea);
\r
409 scroller.setHorizontalScrollBarPolicy(
\r
410 JScrollPane.HORIZONTAL_SCROLLBAR_NEVER
\r
412 scroller.setMinimumSize(new Dimension(10, 50));
\r
414 constraints.weightx = 1.0;
\r
415 constraints.weighty = 1.0;
\r
416 constraints.fill = GridBagConstraints.BOTH;
\r
417 constraints.gridwidth = GridBagConstraints.REMAINDER;
\r
418 result.add(scroller, constraints);
\r
420 border = BorderFactory.createTitledBorder("PukiWikiテキスト");
\r
421 result.setBorder(border);
\r
428 * @return テンプレート生成画面
\r
430 private JComponent buildClipboardPanel(){
\r
431 JComponent result = createGridBagComponent();
\r
432 GridBagConstraints constraints = new GridBagConstraints();
\r
434 constraints.insets = new Insets(3, 3, 3, 3);
\r
436 constraints.weightx = 1.0;
\r
437 constraints.weighty = 0.0;
\r
438 constraints.fill = GridBagConstraints.HORIZONTAL;
\r
439 constraints.anchor = GridBagConstraints.NORTHWEST;
\r
440 constraints.gridwidth = GridBagConstraints.REMAINDER;
\r
442 JComponent castPanel = buildCastPanel();
\r
443 result.add(castPanel, constraints);
\r
445 JComponent vlgWikiPanel = buildVillageWikiPanel();
\r
446 result.add(vlgWikiPanel, constraints);
\r
448 JComponent votePanel = buildVotePanel();
\r
449 result.add(votePanel, constraints);
\r
451 constraints.fill = GridBagConstraints.NONE;
\r
452 constraints.anchor = GridBagConstraints.CENTER;
\r
453 result.add(new JLabel("↓↓↓"), constraints);
\r
454 constraints.fill = GridBagConstraints.HORIZONTAL;
\r
455 constraints.anchor = GridBagConstraints.NORTHWEST;
\r
457 constraints.weightx = 1.0;
\r
458 constraints.weighty = 1.0;
\r
459 constraints.fill = GridBagConstraints.BOTH;
\r
460 constraints.gridwidth = GridBagConstraints.REMAINDER;
\r
461 JComponent clipText = buildClipText();
\r
462 result.add(clipText, constraints);
\r
469 * @param container コンテナ
\r
471 private void design(Container container){
\r
472 LayoutManager layout = new GridBagLayout();
\r
473 GridBagConstraints constraints = new GridBagConstraints();
\r
475 container.setLayout(layout);
\r
477 JScrollPane scroller1 = new JScrollPane();
\r
478 scroller1.getVerticalScrollBar().setUnitIncrement(15);
\r
479 scroller1.getHorizontalScrollBar().setUnitIncrement(15);
\r
480 JViewport viewPort1 = scroller1.getViewport();
\r
481 viewPort1.setView(this.summaryPanel);
\r
483 JScrollPane scroller2 = new JScrollPane();
\r
484 scroller2.getVerticalScrollBar().setUnitIncrement(15);
\r
485 scroller2.getHorizontalScrollBar().setUnitIncrement(15);
\r
486 JViewport viewPort2 = scroller2.getViewport();
\r
487 viewPort2.setView(this.playerPanel);
\r
489 JTabbedPane tabComp = new JTabbedPane();
\r
490 tabComp.add("村詳細", scroller1);
\r
491 tabComp.add("プレイヤー詳細", scroller2);
\r
492 tabComp.add("まとめサイト用Wiki生成", this.clipboardPanel);
\r
494 constraints.weightx = 1.0;
\r
495 constraints.weighty = 1.0;
\r
496 constraints.fill = GridBagConstraints.BOTH;
\r
497 constraints.anchor = GridBagConstraints.NORTHWEST;
\r
498 constraints.gridwidth = GridBagConstraints.REMAINDER;
\r
499 container.add(tabComp, constraints);
\r
501 constraints.insets = new Insets(3, 3, 3, 3);
\r
502 constraints.weightx = 0.0;
\r
503 constraints.weighty = 0.0;
\r
504 constraints.fill = GridBagConstraints.NONE;
\r
505 constraints.anchor = GridBagConstraints.SOUTHEAST;
\r
506 container.add(this.closeButton, constraints);
\r
514 private void actionClose(){
\r
524 public void setVillage(Village village){
\r
527 this.village = village;
\r
528 if(village == null) return;
\r
530 this.gameSummary = new GameSummary(this.village);
\r
534 for(Player player : this.gameSummary.getPlayerList()){
\r
535 Avatar avatar = player.getAvatar();
\r
536 this.playerListModel.addElement(avatar);
\r
539 if(this.playerListModel.getSize() >= 2){ // 強制イベント発生
\r
540 Object player2nd = this.playerListModel.getElementAt(1);
\r
541 this.playerListModel.setSelectedItem(player2nd);
\r
542 Object player1st = this.playerListModel.getElementAt(0);
\r
543 this.playerListModel.setSelectedItem(player1st);
\r
552 private void updateSummary(){
\r
553 String villageName = this.village.getVillageFullName();
\r
555 Team winnerTeam = this.gameSummary.getWinnerTeam();
\r
556 String wonTeam = winnerTeam.getTeamName();
\r
558 int avatarNum = this.gameSummary.countAvatarNum();
\r
559 String totalMember = "ゲルト + " + (avatarNum - 1) + "名 = "
\r
562 JComponent roleDetail = createGridBagComponent();
\r
563 for(GameRole role : GameRole.values()){
\r
564 List<Player> players = this.gameSummary.getRoledPlayerList(role);
\r
565 if(players.size() <= 0) continue;
\r
566 String roleName = role.getRoleName();
\r
567 addCaptionedItem(roleDetail, roleName, " × ", players.size());
\r
570 String suddenDeath = this.gameSummary.countSuddenDeath() + "名";
\r
573 DateFormat.getDateTimeInstance(DateFormat.FULL,
\r
576 date = this.gameSummary.get1stTalkDate();
\r
577 String talk1st = dform.format(date);
\r
578 date = this.gameSummary.getLastTalkDate();
\r
579 String talkLast = dform.format(date);
\r
581 int limitHour = this.village.getLimitHour();
\r
582 int limitMinute = this.village.getLimitMinute();
\r
583 StringBuilder limit = new StringBuilder();
\r
584 if(limitHour < 10) limit.append('0');
\r
585 limit.append(limitHour).append(':');
\r
586 if(limitMinute < 10) limit.append('0');
\r
587 limit.append(limitMinute);
\r
589 JComponent transition = createGridBagComponent();
\r
590 for(int day = 1; day < this.village.getPeriodSize(); day++){
\r
591 List<Player> players = this.gameSummary.getSurvivorList(day);
\r
592 CharSequence roleSeq =
\r
593 GameSummary.getRoleBalanceSequence(players);
\r
595 Period period = this.village.getPeriod(day);
\r
596 daySeq = period.getCaption();
\r
597 addCaptionedItem(transition, daySeq, roleSeq);
\r
600 StringBuilder schedule = new StringBuilder();
\r
601 int progressDays = this.village.getProgressDays();
\r
602 schedule.append("プロローグ + ")
\r
603 .append(progressDays)
\r
604 .append("日 + エピローグ");
\r
606 CharSequence exeInfo = this.gameSummary.dumpExecutionInfo();
\r
607 CharSequence eatInfo = this.gameSummary.dumpAssaultInfo();
\r
608 CharSequence scoreSeer = this.gameSummary.dumpSeerActivity();
\r
609 CharSequence scoreHunter = this.gameSummary.dumpHunterActivity();
\r
611 this.summaryPanel.removeAll();
\r
613 addCaptionedItem(this.summaryPanel, "村名", villageName);
\r
614 addCaptionedItem(this.summaryPanel, "勝者", wonTeam);
\r
615 addCaptionedItem(this.summaryPanel, "所要日数", schedule);
\r
616 addCaptionedItem(this.summaryPanel, "更新時刻", limit);
\r
617 addCaptionedItem(this.summaryPanel, "発言開始", talk1st);
\r
618 addCaptionedItem(this.summaryPanel, "最終発言", talkLast);
\r
619 addCaptionedItem(this.summaryPanel, "参加人数", totalMember);
\r
620 addCaptionedItem(this.summaryPanel, "役職内訳", roleDetail);
\r
621 addCaptionedItem(this.summaryPanel, "処刑内訳", exeInfo);
\r
622 addCaptionedItem(this.summaryPanel, "襲撃内訳", eatInfo);
\r
623 addCaptionedItem(this.summaryPanel, "突然死", suddenDeath);
\r
624 addCaptionedItem(this.summaryPanel, "人口推移", transition);
\r
625 addCaptionedItem(this.summaryPanel, "占成績", scoreSeer);
\r
626 addCaptionedItem(this.summaryPanel, "狩成績", scoreHunter);
\r
628 addFatPad(this.summaryPanel);
\r
635 * @param event アクションイベント
\r
637 public void actionPerformed(ActionEvent event){
\r
638 Object source = event.getSource();
\r
640 if(source == this.closeButton){
\r
642 }else if(source == this.copyClipButton){
\r
643 actionCopyToClipboard();
\r
644 }else if(source == this.genCastTableButton){
\r
645 actionGenCastTable();
\r
646 }else if(source == this.voteButton){
\r
647 actionGenVoteBox();
\r
648 }else if(source == this.vlgWikiButton){
\r
649 actionGenVillageWiki();
\r
650 }else if(source == this.prevPlayer){
\r
651 int index = this.playerBox.getSelectedIndex();
\r
652 if(index <= 0) return;
\r
654 this.playerBox.setSelectedIndex(index);
\r
655 }else if(source == this.nextPlayer){
\r
656 int index = this.playerBox.getSelectedIndex();
\r
657 int playerNum = this.playerBox.getItemCount();
\r
658 if(index >= playerNum - 1) return;
\r
660 this.playerBox.setSelectedIndex(index);
\r
667 * キャスト表Wikiデータの生成を行う。
\r
669 private void actionGenCastTable(){
\r
670 Object selected = this.iconSetListModel.getSelectedItem();
\r
671 if( ! (selected instanceof FaceIconSet) ) return;
\r
672 FaceIconSet iconSet = (FaceIconSet) selected;
\r
674 CharSequence wikiText = this.gameSummary.dumpCastingBoard(iconSet);
\r
676 putWikiText(wikiText);
\r
684 private void actionGenVoteBox(){
\r
685 CharSequence wikiText = this.gameSummary.dumpVoteBox();
\r
686 putWikiText(wikiText);
\r
693 private void actionGenVillageWiki(){
\r
694 CharSequence wikiText = this.gameSummary.dumpVillageWiki();
\r
695 putWikiText(wikiText);
\r
700 * Wikiテキストをテキストボックスに出力する。
\r
702 * @param wikiText Wikiテキスト
\r
704 private void putWikiText(CharSequence wikiText){
\r
705 this.templateArea.setText(wikiText.toString());
\r
707 EventQueue.invokeLater(new Runnable(){
\r
709 templateArea.scrollRectToVisible(new Rectangle());
\r
712 // TODO あらかじめテキストを全選択させておきたい
\r
717 * Wiki文字列をクリップボードへコピーする。
\r
719 private void actionCopyToClipboard(){
\r
720 CharSequence text = this.templateArea.getText();
\r
721 ClipboardAction.copyToClipboard(text);
\r
727 * @param avatar 選択されたAvatar
\r
729 private void selectPlayer(Avatar avatar){
\r
730 if(avatar == this.playerBox.getItemAt(0)){
\r
731 this.prevPlayer.setEnabled(false);
\r
733 this.prevPlayer.setEnabled(true);
\r
736 int playerNum = this.playerBox.getItemCount();
\r
737 if(avatar == this.playerBox.getItemAt(playerNum - 1)){
\r
738 this.nextPlayer.setEnabled(false);
\r
740 this.nextPlayer.setEnabled(true);
\r
743 Image image = village.getAvatarFaceImage(avatar);
\r
744 this.faceIcon.setImage(image);
\r
745 this.faceLabel.setIcon(null); // なぜかこれが必要
\r
746 this.faceLabel.setIcon(this.faceIcon);
\r
748 Player player = this.gameSummary.getPlayer(avatar);
\r
750 GameRole role = player.getRole();
\r
751 this.roleLabel.setText(role.getRoleName());
\r
753 String destinyMessage = player.getDestinyMessage();
\r
754 this.destinyLabel.setText(destinyMessage);
\r
756 CharSequence specialSkill = "";
\r
759 specialSkill = this.gameSummary.dumpSeerActivity();
\r
762 specialSkill = this.gameSummary.dumpHunterActivity();
\r
767 this.specialSkillLabel.setText(specialSkill.toString());
\r
769 this.entryLabel.setText(String.valueOf(player.getEntryNo()));
\r
771 String userId = player.getIdName();
\r
772 this.idLabel.setText(userId);
\r
774 String urlText = player.getUrlText();
\r
775 String caption = urlText;
\r
777 if(urlText == null || urlText.length() <= 0){
\r
778 urlText = WolfBBS.encodeURLFromId(userId);
\r
779 caption = "もしかして " + urlText;
\r
782 this.urlLine.setURLText(urlText);
\r
783 this.urlLine.setCaption(caption);
\r
790 * @param iconSet 顔アイコンセット
\r
792 private void selectIconSet(FaceIconSet iconSet){
\r
793 String author = iconSet.getAuthor();
\r
794 String urlText = iconSet.getUrlText();
\r
795 this.authorLabel .setText(author + "氏");
\r
796 this.authorUrlLabel.setText(urlText);
\r
802 * @param event コンボボックス操作イベント
\r
804 public void itemStateChanged(ItemEvent event){
\r
805 int state = event.getStateChange();
\r
806 if(state != ItemEvent.SELECTED) return;
\r
808 Object source = event.getSource();
\r
809 Object item = event.getItem();
\r
810 if(item == null) return;
\r
812 if(source == this.playerBox){
\r
813 if( ! (item instanceof Avatar) ) return;
\r
814 Avatar avatar = (Avatar) item;
\r
815 selectPlayer(avatar);
\r
816 }else if(source == this.iconSetBox){
\r
817 if( ! (item instanceof FaceIconSet) ) return;
\r
818 FaceIconSet iconSet = (FaceIconSet) item;
\r
819 selectIconSet(iconSet);
\r
828 private void clear(){
\r
829 this.templateArea.setText("");
\r
830 this.playerListModel.removeAllElements();
\r