package logbook.gui; import java.io.File; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.List; import logbook.constants.AppConstants; import logbook.data.context.GlobalContext; import logbook.dto.BattleDto; import logbook.dto.BattleResultDto; import logbook.dto.DockDto; import logbook.dto.ItemDto; import logbook.dto.ShipDto; import logbook.dto.ShipInfoDto; import org.apache.commons.io.FileUtils; import org.apache.commons.lang3.StringUtils; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.graphics.FontData; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Dialog; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.FileDialog; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.MessageBox; import org.eclipse.swt.widgets.Shell; import org.eclipse.wb.swt.SWTResourceManager; /** * 戦闘詳細 * */ public final class BattleDialog extends Dialog { private Shell shell; private final String id; /** * Create the dialog. * @param parent * @param id */ public BattleDialog(Shell parent, String id) { super(parent, SWT.CLOSE | SWT.TITLE | SWT.MIN | SWT.RESIZE); this.id = id; } /** * Open the dialog. */ public void open() { this.createContents(); this.shell.open(); this.shell.layout(); Display display = this.getParent().getDisplay(); while (!this.shell.isDisposed()) { if (!display.readAndDispatch()) { display.sleep(); } } } /** * Create contents of the dialog. */ private void createContents() { this.shell = new Shell(this.getParent(), this.getStyle()); this.shell.setText("Drop Report"); this.shell.setLayout(new GridLayout(1, false)); //フォント取得 FontData fontData = this.shell.getFont().getFontData()[0]; String fontName = fontData.getName(); int size = fontData.getHeight(); int id = Integer.valueOf(this.id) - 1; BattleResultDto result = GlobalContext.getBattleResultList().get(id); BattleDto battle = result.getBattleDto(); // タイトル Label lblTitle = new Label(this.shell, SWT.NONE); lblTitle.setFont(SWTResourceManager.getFont(fontName, size, SWT.BOLD)); lblTitle.setText("The fleet attacked " + result.getEnemyName() + " in " + result.getQuestName() + " (" + battle.getIntercept() + " Engagement)"); Label lblsp1 = new Label(this.shell, SWT.SEPARATOR | SWT.HORIZONTAL); lblsp1.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1)); Composite fComposite = new Composite(this.shell, SWT.NONE); fComposite.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1)); fComposite.setLayout(new GridLayout(9, false)); // 味方艦隊 List<DockDto> docks = battle.getFriends(); for (int i = 0; i < docks.size(); i++) { DockDto dock = docks.get(i); List<ShipDto> ships = dock.getShips(); Label lblfName = new Label(fComposite, SWT.NONE); lblfName.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 9, 1)); lblfName.setFont(SWTResourceManager.getFont(fontName, size, SWT.BOLD)); if (i == 0) { lblfName.setText(dock.getName() + " (" + battle.getFriendFormation() + ")"); } else { lblfName.setText(dock.getName()); } new Label(fComposite, SWT.NONE); Label lblfHp = new Label(fComposite, SWT.NONE); lblfHp.setFont(SWTResourceManager.getFont(fontName, size, SWT.BOLD)); lblfHp.setText("HP"); Label lblfCond = new Label(fComposite, SWT.NONE); lblfCond.setFont(SWTResourceManager.getFont(fontName, size, SWT.BOLD)); lblfCond.setText("Morale"); Label lblfSeiku = new Label(fComposite, SWT.NONE); lblfSeiku.setFont(SWTResourceManager.getFont(fontName, size, SWT.BOLD)); lblfSeiku.setText("Air Sup."); Label lblfItem1 = new Label(fComposite, SWT.NONE); lblfItem1.setFont(SWTResourceManager.getFont(fontName, size, SWT.BOLD)); lblfItem1.setText("Equipment 1"); GridData gdfItem1 = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1); gdfItem1.widthHint = 100; lblfItem1.setLayoutData(gdfItem1); Label lblfItem2 = new Label(fComposite, SWT.NONE); lblfItem2.setFont(SWTResourceManager.getFont(fontName, size, SWT.BOLD)); lblfItem2.setText("Equipment 2"); GridData gdfItem2 = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1); gdfItem2.widthHint = 100; lblfItem2.setLayoutData(gdfItem2); Label lblfItem3 = new Label(fComposite, SWT.NONE); lblfItem3.setFont(SWTResourceManager.getFont(fontName, size, SWT.BOLD)); lblfItem3.setText("Equipment 3"); GridData gdfItem3 = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1); gdfItem3.widthHint = 100; lblfItem3.setLayoutData(gdfItem3); Label lblfItem4 = new Label(fComposite, SWT.NONE); lblfItem4.setFont(SWTResourceManager.getFont(fontName, size, SWT.BOLD)); lblfItem4.setText("Equipment 4"); GridData gdfItem4 = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1); gdfItem4.widthHint = 100; lblfItem4.setLayoutData(gdfItem4); Label lblfItem5 = new Label(fComposite, SWT.NONE); lblfItem5.setFont(SWTResourceManager.getFont(fontName, size, SWT.BOLD)); lblfItem5.setText("Equipment 5"); GridData gdfItem5 = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1); gdfItem5.widthHint = 100; lblfItem5.setLayoutData(gdfItem5); for (int j = 0; j < ships.size(); j++) { ShipDto ship = ships.get(j); Label lblLv = new Label(fComposite, SWT.NONE); lblLv.setText(ship.getName() + "(Lv" + ship.getLv() + ")"); Label lblHp = new Label(fComposite, SWT.NONE); lblHp.setText(ship.getNowhp() + "/" + ship.getMaxhp()); Label lblCond = new Label(fComposite, SWT.NONE); lblCond.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1)); lblCond.setText(Long.toString(ship.getCond())); Label lblSeiku = new Label(fComposite, SWT.NONE); lblSeiku.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1)); lblSeiku.setText(Long.toString(ship.getSeiku())); List<String> slots = ship.getSlot(); for (String name : slots) { Label lblSlot = new Label(fComposite, SWT.NONE); lblSlot.setText(name); } } } Label lblsp2 = new Label(this.shell, SWT.SEPARATOR | SWT.HORIZONTAL); lblsp2.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1)); Composite eComposite = new Composite(this.shell, SWT.NONE); eComposite.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1)); eComposite.setLayout(new GridLayout(7, false)); Label lbleName = new Label(eComposite, SWT.NONE); lbleName.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 7, 1)); lbleName.setFont(SWTResourceManager.getFont(fontName, size, SWT.BOLD)); lbleName.setText(result.getEnemyName() + " (" + battle.getEnemyFormation() + ")"); new Label(eComposite, SWT.NONE); Label lbleHp = new Label(eComposite, SWT.NONE); lbleHp.setFont(SWTResourceManager.getFont(fontName, size, SWT.BOLD)); lbleHp.setText("HP"); Label lbleItem1 = new Label(eComposite, SWT.NONE); lbleItem1.setFont(SWTResourceManager.getFont(fontName, size, SWT.BOLD)); lbleItem1.setText("Equipment 1"); GridData gdeItem1 = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1); gdeItem1.widthHint = 100; lbleItem1.setLayoutData(gdeItem1); Label lbleItem2 = new Label(eComposite, SWT.NONE); lbleItem2.setFont(SWTResourceManager.getFont(fontName, size, SWT.BOLD)); lbleItem2.setText("Equipment 2"); GridData gdeItem2 = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1); gdeItem2.widthHint = 100; lbleItem2.setLayoutData(gdeItem2); Label lbleItem3 = new Label(eComposite, SWT.NONE); lbleItem3.setFont(SWTResourceManager.getFont(fontName, size, SWT.BOLD)); lbleItem3.setText("Equipment 3"); GridData gdeItem3 = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1); gdeItem3.widthHint = 100; lbleItem3.setLayoutData(gdeItem3); Label lbleItem4 = new Label(eComposite, SWT.NONE); lbleItem4.setFont(SWTResourceManager.getFont(fontName, size, SWT.BOLD)); lbleItem4.setText("Equipment 4"); GridData gdeItem4 = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1); gdeItem4.widthHint = 100; lbleItem4.setLayoutData(gdeItem4); Label lbleItem5 = new Label(eComposite, SWT.NONE); lbleItem5.setFont(SWTResourceManager.getFont(fontName, size, SWT.BOLD)); lbleItem5.setText("Equipment 5"); GridData gdeItem5 = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1); gdeItem5.widthHint = 100; lbleItem5.setLayoutData(gdeItem5); List<ShipInfoDto> enemyships = battle.getEnemy(); List<ItemDto[]> enemySlots = battle.getEnemySlot(); for (int i = 0; i < enemyships.size(); i++) { ShipInfoDto ship = enemyships.get(i); ItemDto[] slot = enemySlots.get(i); String name = ship.getName(); if (!StringUtils.isEmpty(ship.getFlagship())) { name += "(" + ship.getFlagship() + ")"; } Label lblName = new Label(eComposite, SWT.NONE); lblName.setText(name); Label lblHp = new Label(eComposite, SWT.NONE); lblHp.setText(battle.getNowEnemyHp()[i] + "/" + battle.getMaxEnemyHp()[i]); for (int j = 0; j < slot.length; j++) { Label lblSlot = new Label(eComposite, SWT.NONE); if (slot[j] != null) { lblSlot.setText(slot[j].getName()); } else { lblSlot.setText(""); } } } Button save = new Button(this.shell, SWT.NONE); save.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1)); save.setText("Save as HTML"); save.addSelectionListener(new SaveAdapter()); this.shell.pack(); } private String getHtml() { // 文書を用意する // freemarker使いたい int id = Integer.valueOf(this.id) - 1; BattleResultDto result = GlobalContext.getBattleResultList().get(id); BattleDto battle = result.getBattleDto(); String time = new SimpleDateFormat(AppConstants.DATE_FORMAT).format(result.getBattleDate()); StringBuilder sb = new StringBuilder(); sb.append("<!DOCTYPE html>").append("\r\n"); sb.append("<html>").append("\r\n"); sb.append("<head>").append("\r\n"); sb.append("<meta charset=\"UTF-8\">").append("\r\n"); sb.append("<title>Battle Report</title>").append("\r\n"); sb.append("<style type=\"text/css\">").append("\r\n"); sb.append("body,table {").append("\r\n"); sb.append(" font-family: Meiryo, CI, Arial, Helvetica, Clean,").append("\r\n"); sb.append(" \"Hiragino Kaku Gothic Pro\", \"qMmpS Pro W3\", Osaka, \"MS P Gothic\",").append("\r\n"); sb.append(" \"lr oSVbN\", sans-serif;").append("\r\n"); sb.append("}").append("\r\n"); sb.append("</style>").append("\r\n"); sb.append("</head>").append("\r\n"); sb.append("<body>").append("\r\n"); sb.append(" <strong>The fleet attacked " + result.getEnemyName() + " in " + result.getQuestName() + " (" + battle.getIntercept() + " Engagement)(" + time + ")</strong>").append("\r\n"); sb.append(" <hr>").append("\r\n"); List<DockDto> docks = battle.getFriends(); for (int i = 0; i < docks.size(); i++) { DockDto dock = docks.get(i); List<ShipDto> ships = dock.getShips(); sb.append(" <table>").append("\r\n"); if (i == 0) { sb.append( " <caption>" + dock.getName() + " (" + battle.getFriendFormation() + ")" + "</caption>") .append("\r\n"); } else { sb.append(" <caption>" + dock.getName() + "</caption>").append("\r\n"); } sb.append(" <thead>").append("\r\n"); sb.append(" <tr>").append("\r\n"); sb.append(" <th></th>").append("\r\n"); sb.append(" <th>HP</th>").append("\r\n"); sb.append(" <th>Morale</th>").append("\r\n"); sb.append(" <th>Air Sup.</th>").append("\r\n"); sb.append(" <th>Equipment 1</th>").append("\r\n"); sb.append(" <th>Equipment 2</th>").append("\r\n"); sb.append(" <th>Equipment 3</th>").append("\r\n"); sb.append(" <th>Equipment 4</th>").append("\r\n"); sb.append(" <th>Equipment 5</th>").append("\r\n"); sb.append(" </tr>").append("\r\n"); sb.append(" </thead>").append("\r\n"); sb.append(" <tbody>").append("\r\n"); for (int j = 0; j < ships.size(); j++) { ShipDto ship = ships.get(j); sb.append(" <tr>").append("\r\n"); sb.append(" <td>" + ship.getName() + "(Lv" + ship.getLv() + ")" + "</td>").append( "\r\n"); sb.append(" <td>" + ship.getNowhp() + "/" + ship.getMaxhp() + "</td>").append("\r\n"); sb.append(" <td>" + Long.toString(ship.getCond()) + "</td>").append("\r\n"); sb.append(" <td>" + Long.toString(ship.getSeiku()) + "</td>").append("\r\n"); List<String> slots = ship.getSlot(); for (String name : slots) { sb.append(" <td>" + name + "</td>").append("\r\n"); } sb.append(" </tr>").append("\r\n"); } sb.append(" </tbody>").append("\r\n"); sb.append(" </table>").append("\r\n"); } sb.append(" <hr>").append("\r\n"); sb.append(" <table>").append("\r\n"); sb.append(" <caption>" + result.getEnemyName() + " (" + battle.getEnemyFormation() + ")" + "</caption>") .append("\r\n"); sb.append(" <thead>").append("\r\n"); sb.append(" <tr>").append("\r\n"); sb.append(" <th></th>").append("\r\n"); sb.append(" <th>HP</th>").append("\r\n"); sb.append(" <th>Equipment 1</th>").append("\r\n"); sb.append(" <th>Equipment 2</th>").append("\r\n"); sb.append(" <th>Equipment 3</th>").append("\r\n"); sb.append(" <th>Equipment 4</th>").append("\r\n"); sb.append(" <th>Equipment 5</th>").append("\r\n"); sb.append(" </tr>").append("\r\n"); sb.append(" </thead>").append("\r\n"); sb.append(" <tbody>").append("\r\n"); List<ShipInfoDto> enemyships = battle.getEnemy(); List<ItemDto[]> enemySlots = battle.getEnemySlot(); for (int i = 0; i < enemyships.size(); i++) { ShipInfoDto ship = enemyships.get(i); ItemDto[] slot = enemySlots.get(i); String name = ship.getName(); if (!StringUtils.isEmpty(ship.getFlagship())) { name += "(" + ship.getFlagship() + ")"; } sb.append(" <tr>").append("\r\n"); sb.append(" <td>" + name + "</td>").append("\r\n"); sb.append(" <td>" + battle.getNowEnemyHp()[i] + "/" + battle.getMaxEnemyHp()[i] + "</td>") .append("\r\n"); for (int j = 0; j < slot.length; j++) { if (slot[j] != null) { sb.append(" <td>" + slot[j].getName() + "</td>").append("\r\n"); } else { sb.append(" <td></td>").append("\r\n"); } } sb.append(" </tr>").append("\r\n"); } sb.append(" </tbody>").append("\r\n"); sb.append(" </table>").append("\r\n"); sb.append("</body>").append("\r\n"); sb.append("</html>").append("\r\n"); return sb.toString(); } /** * HTMLファイルとして保存のリスナー * */ private class SaveAdapter extends SelectionAdapter { @Override public void widgetSelected(SelectionEvent e) { FileDialog dialog = new FileDialog(BattleDialog.this.shell, SWT.SAVE); dialog.setFileName("Battle Report.html"); dialog.setFilterExtensions(new String[] { "*.html" }); String filename = dialog.open(); if (filename != null) { File file = new File(filename); if (file.exists()) { MessageBox messageBox = new MessageBox(BattleDialog.this.shell, SWT.YES | SWT.NO); messageBox.setText("Confirmation"); messageBox.setMessage(filename + " already exists.\nDo you want to overwrite it?"); if (messageBox.open() == SWT.NO) { return; } } try { FileUtils.writeStringToFile(file, BattleDialog.this.getHtml(), "UTF-8"); } catch (IOException ex) { MessageBox messageBox = new MessageBox(BattleDialog.this.shell, SWT.ICON_ERROR); messageBox.setText("Write error."); messageBox.setMessage(ex.toString()); messageBox.open(); } } } } }