package logbook.gui;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import logbook.constants.AppConstants;
import logbook.data.context.GlobalContext;
import logbook.dto.DeckMissionDto;
import logbook.dto.NdockDto;
import logbook.dto.ShipDto;
import logbook.gui.logic.TableItemCreator;
import logbook.gui.logic.TimeLogic;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.wb.swt.SWTResourceManager;
/**
* お風呂に入りたい艦娘
*
*/
public final class BathwaterTableDialog extends AbstractTableDialog {
/** 遠征中の艦娘を外すフラグ */
private static boolean removeflg;
/** 遠征中の艦娘 */
private Set<Long> deckMissionShips;
/** 入渠中の艦娘 */
private Set<Long> nDockShips;
/**
* Create the dialog.
* @param parent
* @param style
*/
public BathwaterTableDialog(Shell parent) {
super(parent);
}
@Override
protected void createContents() {
final MenuItem removecheck = new MenuItem(this.opemenu, SWT.CHECK);
removecheck.setText("Filter ships on expedition");
removecheck.setSelection(removeflg);
removecheck.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
BathwaterTableDialog.removeflg = removecheck.getSelection();
BathwaterTableDialog.this.reloadTable();
}
});
}
@Override
protected String getTitle() {
return "Repair Queue";
}
@Override
protected Point getSize() {
// TODO 自動生成されたメソッド・スタブ
return new Point(600, 350);
}
@Override
protected String[] getTableHeader() {
return new String[] { "", "ID", "Fleet", "Morale", "Name", "Lv", "HP", "Time", "ETA", "Fuel", "Steel",
"Status", "Per HP" };
}
@Override
protected void updateTableBody() {
this.deckMissionShips = this.getDeckMissionShips();
this.nDockShips = this.getNDockShips();
List<ShipDto> ships = new ArrayList<ShipDto>();
for (ShipDto ship : GlobalContext.getShipMap().values()) {
if (this.nDockShips.contains(ship.getId())) {
// 入渠中は外す
continue;
}
// 入渠時間が1秒以上を取得
if (ship.getDocktime() > 0) {
ships.add(ship);
}
}
// 入渠時間でソート
Collections.sort(ships, new Comparator<ShipDto>() {
@Override
public int compare(ShipDto o1, ShipDto o2) {
return Long.compare(o2.getDocktime(), o1.getDocktime());
}
});
SimpleDateFormat format = new SimpleDateFormat(AppConstants.DATE_SHORT_FORMAT);
List<String[]> body = new ArrayList<String[]>();
for (int i = 0; i < ships.size(); i++) {
ShipDto ship = ships.get(i);
// 状態
String status = "";
if (ship.isBadlyDamage()) {
status = "Heavily Damaged";
} else if (ship.isHalfDamage()) {
status = "Moderately Damaged";
} else if (ship.isSlightDamage()) {
status = "Slightly Damaged";
}
if (this.deckMissionShips.contains(ship.getId())) {
// 遠征中の艦娘を外すフラグが立っていたら遠征中の艦娘を外す
if (removeflg) {
continue;
}
status = "Expedition";
}
// HP1あたりの時間
String time = TimeLogic.toDateRestString((long) (ship.getDocktime()
/ (float) (ship.getMaxhp() - ship.getNowhp()) / 1000));
// 整形
body.add(new String[] {
Integer.toString(i + 1),
Long.toString(ship.getId()),
ship.getFleetid(),
Long.toString(ship.getCond()),
ship.getName(),
Long.toString(ship.getLv()),
Long.toString(ship.getNowhp()) + "/" + Long.toString(ship.getMaxhp()),
TimeLogic.toDateRestString(ship.getDocktime() / 1000),
format.format(new Date(System.currentTimeMillis() + ship.getDocktime())),
Long.toString(ship.getDockfuel()),
Long.toString(ship.getDockmetal()),
status,
time
});
}
this.body = body;
}
@Override
protected TableItemCreator getTableItemCreator() {
return new TableItemCreator() {
@Override
public void init() {
}
@Override
public TableItem create(Table table, String[] text, int count) {
TableItem item = new TableItem(table, SWT.NONE);
// 偶数行に背景色を付ける
if ((count % 2) != 0) {
item.setBackground(SWTResourceManager.getColor(AppConstants.ROW_BACKGROUND));
}
item.setText(text);
if (text[10].equals("Expedition")) {
item.setForeground(SWTResourceManager.getColor(AppConstants.MISSION_COLOR));
}
return item;
}
};
}
@Override
protected SelectionListener getHeaderSelectionListener() {
return new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
if (e.getSource() instanceof TableColumn) {
BathwaterTableDialog.this.sortTableItems((TableColumn) e.getSource());
}
}
};
}
/**
* 遠征中の艦娘を取得します
*
* @return
*/
private Set<Long> getDeckMissionShips() {
// 遠征
Set<Long> deckmissions = new HashSet<Long>();
for (DeckMissionDto deckMission : GlobalContext.getDeckMissions()) {
if ((deckMission.getMission() != null) && (deckMission.getShips() != null)) {
deckmissions.addAll(deckMission.getShips());
}
}
return deckmissions;
}
/**
* 入渠中の艦娘を取得します
*
* @return
*/
private Set<Long> getNDockShips() {
// 入渠
Set<Long> docks = new HashSet<Long>();
for (NdockDto ndock : GlobalContext.getNdocks()) {
if (ndock.getNdockid() != 0) {
docks.add(ndock.getNdockid());
}
}
return docks;
}
}