package logbook.gui;
import java.util.ArrayList;
import java.util.List;
import logbook.config.ShipGroupConfig;
import logbook.config.bean.ShipGroupBean;
import logbook.data.context.GlobalContext;
import logbook.dto.ShipDto;
import logbook.dto.ShipFilterDto;
import logbook.gui.logic.CreateReportLogic;
import logbook.gui.logic.TableItemCreator;
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.events.SelectionListener;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.swt.widgets.MessageBox;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.TableItem;
/**
* 所有艦娘一覧テーブル
*
*/
public final class ShipTable extends AbstractTableDialog {
/** 成長余地 */
private boolean specdiff = false;
/** フィルター */
private ShipFilterDto filter = new ShipFilterDto();
/**
* @param parent
*/
public ShipTable(Shell parent) {
super(parent);
}
/**
* フィルターを設定する
* @param filter フィルター
*/
public void updateFilter(ShipFilterDto filter) {
this.filter = filter;
this.reloadTable();
this.shell.setText(this.getTitle());
}
@Override
protected void createContents() {
// メニューバーに追加する
// フィルターメニュー
final MenuItem filter = new MenuItem(this.opemenu, SWT.PUSH);
filter.setText("&Filter...\tCtrl+F");
filter.setAccelerator(SWT.CTRL + 'F');
filter.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
new ShipFilterDialog(ShipTable.this.shell, ShipTable.this, ShipTable.this.filter).open();
}
});
// セパレータ
new MenuItem(this.opemenu, SWT.SEPARATOR);
// 成長の余地を表示メニュー
final MenuItem switchdiff = new MenuItem(this.opemenu, SWT.CHECK);
switchdiff.setText("Show stats potential");
switchdiff.setSelection(this.specdiff);
switchdiff.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
ShipTable.this.specdiff = switchdiff.getSelection();
ShipTable.this.reloadTable();
}
});
// セパレータ
new MenuItem(this.tablemenu, SWT.SEPARATOR);
// 右クリックメニューに追加する
final MenuItem filtertable = new MenuItem(this.tablemenu, SWT.NONE);
filtertable.setText("&Filter");
filtertable.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
new ShipFilterDialog(ShipTable.this.shell, ShipTable.this, ShipTable.this.filter).open();
}
});
List<ShipGroupBean> groups = ShipGroupConfig.get().getGroup();
MenuItem groupFilterCascade = new MenuItem(this.tablemenu, SWT.CASCADE);
groupFilterCascade.setText("&Group Filter");
Menu groupFilterMenu = new Menu(groupFilterCascade);
groupFilterCascade.setMenu(groupFilterMenu);
for (ShipGroupBean groupBean : groups) {
final MenuItem groupItem = new MenuItem(groupFilterMenu, SWT.NONE);
groupItem.setText(groupBean.getName());
groupItem.setData(groupBean);
groupItem.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
ShipGroupBean bean = (ShipGroupBean) e.widget.getData();
ShipFilterDto filter = ShipTable.this.getFilter();
filter.group = bean;
ShipTable.this.updateFilter(filter);
}
});
}
MenuItem addGroupCascade = new MenuItem(this.tablemenu, SWT.CASCADE);
addGroupCascade.setText("&Add to the group");
Menu addGroupMenu = new Menu(addGroupCascade);
addGroupCascade.setMenu(addGroupMenu);
for (ShipGroupBean groupBean : groups) {
final MenuItem groupItem = new MenuItem(addGroupMenu, SWT.NONE);
groupItem.setText(groupBean.getName());
groupItem.setData(groupBean);
groupItem.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
TableItem[] tableItems = ShipTable.this.table.getSelection();
if (tableItems.length > 0) {
List<ShipDto> ships = new ArrayList<>();
List<String> name = new ArrayList<>();
for (int i = 0; i < tableItems.length; i++) {
long id = Long.parseLong(tableItems[i].getText(1));
ShipDto ship = GlobalContext.getShipMap().get(id);
if (ship != null) {
ships.add(ship);
name.add(ship.getName());
}
}
MessageBox box = new MessageBox(ShipTable.this.shell, SWT.YES | SWT.NO
| SWT.ICON_QUESTION);
box.setText("Add to the group");
box.setMessage("Do you want to add " + StringUtils.join(name, ", ") + " to the group?");
if (box.open() == SWT.YES) {
ShipGroupBean bean = (ShipGroupBean) e.widget.getData();
for (ShipDto ship : ships) {
bean.getShips().add(ship.getId());
}
}
}
}
});
}
MenuItem removeGroupCascade = new MenuItem(this.tablemenu, SWT.CASCADE);
removeGroupCascade.setText("Remove from the group (&D)");
Menu removeGroupMenu = new Menu(removeGroupCascade);
removeGroupCascade.setMenu(removeGroupMenu);
for (ShipGroupBean groupBean : groups) {
final MenuItem groupItem = new MenuItem(removeGroupMenu, SWT.NONE);
groupItem.setText(groupBean.getName());
groupItem.setData(groupBean);
groupItem.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
TableItem[] tableItems = ShipTable.this.table.getSelection();
if (tableItems.length > 0) {
List<ShipDto> ships = new ArrayList<>();
List<String> name = new ArrayList<>();
for (int i = 0; i < tableItems.length; i++) {
long id = Long.parseLong(tableItems[i].getText(1));
ShipDto ship = GlobalContext.getShipMap().get(id);
if (ship != null) {
ships.add(ship);
name.add(ship.getName());
}
}
MessageBox box = new MessageBox(ShipTable.this.shell, SWT.YES | SWT.NO
| SWT.ICON_QUESTION);
box.setText("Remove from the group");
box.setMessage("Do you want to remove " + StringUtils.join(name, ", ") + " from the group?");
if (box.open() == SWT.YES) {
ShipGroupBean bean = (ShipGroupBean) e.widget.getData();
for (ShipDto ship : ships) {
bean.getShips().remove(ship.getId());
}
}
}
}
});
}
}
@Override
protected String getTitle() {
if ((this.filter != null) && (this.filter.group != null)) {
return "Ship List (" + this.filter.group.getName() + ")";
}
return "Ship List";
}
@Override
protected Point getSize() {
return new Point(600, 350);
}
@Override
protected String[] getTableHeader() {
return CreateReportLogic.getShipListHeader();
}
@Override
protected void updateTableBody() {
this.body = CreateReportLogic.getShipListBody(this.specdiff, this.filter);
}
@Override
protected TableItemCreator getTableItemCreator() {
return CreateReportLogic.SHIP_LIST_TABLE_ITEM_CREATOR;
}
@Override
protected SelectionListener getHeaderSelectionListener() {
return new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
if (e.getSource() instanceof TableColumn) {
ShipTable.this.sortTableItems((TableColumn) e.getSource());
}
}
};
}
/**
* フィルターを取得します。
* @return フィルター
*/
public ShipFilterDto getFilter() {
return this.filter;
}
}