package logbook.gui.listener; import java.util.Calendar; import java.util.Date; import java.util.Map; import java.util.concurrent.TimeUnit; import logbook.config.AppConfig; import logbook.data.context.GlobalContext; import logbook.dto.DeckMissionDto; import logbook.dto.NdockDto; import logbook.dto.ShipDto; import logbook.gui.ApplicationMain; import logbook.gui.ConfigDialog; import logbook.gui.WindowBase; import logbook.gui.logic.TimeLogic; import org.eclipse.swt.SWT; import org.eclipse.swt.events.MenuDetectEvent; import org.eclipse.swt.events.MenuDetectListener; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.widgets.Menu; import org.eclipse.swt.widgets.MenuItem; import org.eclipse.swt.widgets.Shell; /** * トレイアイコンにメニューを表示するリスナー * */ public final class TrayItemMenuListener implements MenuDetectListener { /** メニュー */ private Menu menu; /** * コンストラクター */ public TrayItemMenuListener() { } @Override public void menuDetected(MenuDetectEvent e) { // メニュー if (this.menu != null) { this.menu.dispose(); } final Shell shell = ApplicationMain.main.getShell(); this.menu = new Menu(shell); // 装備数 int itemCount = GlobalContext.getItemMap().size(); // 最大保有可能 装備数 int itemMax = GlobalContext.maxSlotitem(); // 艦娘数 int shipCount = GlobalContext.getShipMap().size(); // 最大保有可能 艦娘数 int shipMax = GlobalContext.maxChara(); String[] shpiTableNames = AppConfig.get().getShipTableNames(); WindowBase[] winList = ApplicationMain.main.getWindowList(); String[] nameList = new String[] { "キャプチャ(&C)", // 0 "ドロップ報告書(&D)", // 1 "建造報告書(&Y)", // 2 "開発報告書(&E)", // 3 "遠征報告書(&T)", // 4 "遠征一覧", // 4' "所有装備一覧(&X) (" + itemCount + "/" + itemMax + ")", // 5 shpiTableNames[0] + "(&S) (" + shipCount + "/" + shipMax + ")", // 6 shpiTableNames[1] + "(&2)", // 7 shpiTableNames[2] + "(&3)", // 8 shpiTableNames[3] + "(&4)", // 9 "お風呂に入りたい艦娘(&N)", // 10 "任務一覧(&Q)", // 11 "戦況(&B)", // 12 "戦況-横(&H)", // 13 "自軍敵軍パラメータ(&P)", // 14 "経験値計算機(&C)", // 15 "演習経験値計算機(&V)", // 16 "グループエディタ(&G)", // 17 "資材チャート(&R)", // 18 "出撃統計(&A)", // 19 "ロー" // 最後は自分 }; boolean[] hasSeparator = new boolean[] { false, true, false, false, false, false, true, true, false, false, false, false, true, false, false, false, true, false, false, false, false, }; for (int i = 0; i < (winList.length - 5); i++) { if (hasSeparator[i]) { new MenuItem(this.menu, SWT.SEPARATOR); } final WindowBase win = winList[i]; final MenuItem menuItem = new MenuItem(this.menu, SWT.CHECK); menuItem.setText(nameList[i]); menuItem.setSelection(win.getMenuItem().getSelection()); menuItem.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { boolean open = menuItem.getSelection(); if (open) { win.open(); win.getShell().setActive(); } else { win.hideWindow(); } } }); } new MenuItem(this.menu, SWT.SEPARATOR); // 遠征 MenuItem infoItem = new MenuItem(this.menu, SWT.CASCADE); infoItem.setText("遠征・入渠(&M)"); Menu infoMenu = new Menu(infoItem); infoItem.setMenu(infoMenu); MenuItem missionItem = new MenuItem(infoMenu, SWT.CASCADE); missionItem.setText("遠征"); missionItem.setEnabled(false); DeckMissionDto[] missions = GlobalContext.getDeckMissions(); for (DeckMissionDto missionDto : missions) { MenuItem item = new MenuItem(infoMenu, SWT.NONE); if ((missionDto != null) && (missionDto.getTime() != null)) { String text = missionDto.getName() + " (" + missionDto.getMission() + ")"; long rest = getRest(Calendar.getInstance().getTime(), missionDto.getTime()); if (rest <= 0) { item.setText(text + "\tまもなく帰投します"); } else { item.setText(text + "\t" + TimeLogic.toDateRestString(rest)); } } else { item.setText("-"); } } // 入渠 MenuItem ndockItem = new MenuItem(infoMenu, SWT.CASCADE); ndockItem.setText("入渠"); ndockItem.setEnabled(false); Map<Integer, ShipDto> shipMap = GlobalContext.getShipMap(); NdockDto[] ndocks = GlobalContext.getNdocks(); for (NdockDto ndockDto : ndocks) { MenuItem item = new MenuItem(infoMenu, SWT.NONE); if ((ndockDto != null) && (shipMap.get(ndockDto.getNdockid()) != null)) { ShipDto ship = shipMap.get(ndockDto.getNdockid()); String text = ship.getName() + " (Lv" + ship.getLv() + ")"; long rest = getRest(Calendar.getInstance().getTime(), ndockDto.getNdocktime()); if (rest <= 0) { item.setText(text + "\tまもなくお風呂から上がります"); } else { item.setText(text + "\t" + TimeLogic.toDateRestString(rest)); } } else { item.setText("-"); } } new MenuItem(this.menu, SWT.SEPARATOR); // 設定 MenuItem config = new MenuItem(this.menu, SWT.NONE); config.setText("設定(&O)"); config.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { new ConfigDialog(ApplicationMain.main).open(); } }); // 終了 final MenuItem dispose = new MenuItem(this.menu, SWT.NONE); dispose.setText("終了"); dispose.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { shell.close(); } }); this.menu.setVisible(true); } /** * 2つの日付から残り時間を計算する * * @param date1 * @param date2 * @return */ private static long getRest(Date date1, Date date2) { return TimeUnit.MILLISECONDS.toSeconds(date2.getTime() - date1.getTime()); } }