/**
*
*/
package logbook.gui;
import java.util.BitSet;
import java.util.List;
import logbook.config.AppConfig;
import logbook.constants.AppConstants;
import logbook.data.context.GlobalContext;
import logbook.dto.DockDto;
import logbook.dto.ShipDto;
import logbook.gui.logic.WindowListener;
import logbook.gui.widgets.FleetComposite;
import logbook.util.SwtUtils;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CTabFolder;
import org.eclipse.swt.custom.CTabItem;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.wb.swt.SWTResourceManager;
/**
* @author Nekopanda
*
*/
public class FleetWindow extends WindowBase {
private final int fleetid;
private final Shell parent;
/** タブ */
private final CTabFolder tabFolder;
private CTabItem tabItem;
private FleetComposite tabComposite;
private FleetComposite windowComposite;
private Menu tabMenu;
private String titleName;
public FleetWindow(Shell parent, MenuItem menuItem, CTabFolder tabFolder, int fleetid) {
super(menuItem);
this.parent = parent;
this.tabFolder = tabFolder;
this.fleetid = fleetid;
}
/**
* Open the dialog.
*/
@Override
public void open() {
// 初期化済みの場合
if (this.isWindowInitialized()) {
this.setVisible(true);
return;
}
this.createContents();
this.registerEvents();
this.setWindowInitialized(true);
this.setVisible(true);
}
/**
* Create contents of the dialog.
*/
private void createContents() {
// シェルを作成
super.createContents(this.parent, SWT.CLOSE | SWT.TITLE | SWT.RESIZE, false);
this.getShell().setLayout(new FillLayout());
this.windowComposite = new FleetComposite(this.getShell());
DockDto dock = GlobalContext.getDock(String.valueOf(this.fleetid));
if (dock == null) {
this.titleName = "第" + this.fleetid + "艦隊";
}
else {
this.titleName = dock.getName();
}
this.getShell().setText(this.titleName);
this.addWindowListener(new WindowListener() {
@Override
public void windowShown() {
if (FleetWindow.this.tabItem != null) {
FleetWindow.this.tabItem.dispose();
FleetWindow.this.tabItem = null;
}
}
@Override
public void windowHidden() {
}
});
}
/**
* ウィンドウ識別ID(デフォルト実装はクラス名フルパス)
* @return ウィンドウ識別ID
*/
@Override
public String getWindowId() {
return this.getClass().getName() + this.fleetid;
}
/**
* ウィンドウサイズを保存・リストアするべきか?
* @return
*/
@Override
protected boolean shouldSaveWindowSize() {
return true;
}
/**
* ウィンドウがドラックで動かすことができるか?
* trueにすると"disable-drag-move"が設定されていないコントロールを動かすとウィンドウが動くようになる
* @return
*/
@Override
protected boolean moveWithDrag() {
return true;
}
/**
* ウィンドウのデフォルトサイズを取得
* @return
*/
@Override
protected Point getDefaultSize() {
return SwtUtils.DPIAwareSize(new Point(280, 350));
}
public void updateFleet(boolean combinedFleetBadlyDamaed, List<ShipDto> badlyDamaged) {
if ((this.getShell() != null) && this.getShell().isDisposed()) {
return;
}
DockDto dock = GlobalContext.getDock(String.valueOf(this.fleetid));
if (dock != null) {
if ((this.getShell() != null) && this.getVisible()) {
this.windowComposite.updateFleet(dock,
(this.fleetid <= 2) ? combinedFleetBadlyDamaed : false, badlyDamaged);
if (!dock.getName().equals(this.titleName)) {
this.titleName = dock.getName();
this.getShell().setText(this.titleName);
}
}
else {
if (this.tabItem == null) {
// 挿入位置を計算
CTabItem[] tabItems = this.tabFolder.getItems();
int insertPosition = tabItems.length;
for (int i = 0; i < tabItems.length; ++i) {
Object data = tabItems[i].getData();
if (data instanceof FleetWindow) {
FleetWindow fw = (FleetWindow) data;
if (this.fleetid < fw.getFleetid()) {
insertPosition = i;
break;
}
}
}
this.tabItem = new CTabItem(this.tabFolder, SWT.NONE, insertPosition);
this.tabItem.setText(dock.getName());
// メインコンポジット
this.tabComposite = new FleetComposite(this.tabFolder);
this.tabItem.setControl(this.tabComposite);
this.tabItem.setData(this);
// メニュー
this.tabMenu = new Menu(this.tabFolder.getShell(), SWT.POP_UP);
MenuItem floatWin = new MenuItem(this.tabMenu, SWT.PUSH);
floatWin.setText("切り離し");
floatWin.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
FleetWindow.this.open();
}
});
this.tabItem.addListener(SWT.Dispose, new Listener() {
@Override
public void handleEvent(Event event) {
FleetWindow.this.tabMenu.dispose();
}
});
}
this.tabComposite.updateFleet(dock,
(this.fleetid <= 2) ? combinedFleetBadlyDamaed : false, badlyDamaged);
if (!dock.getName().equals(this.titleName)) {
this.titleName = dock.getName();
this.tabItem.setText(dock.getName());
}
this.updateTabIcon();
}
dock.setUpdate(false);
}
}
/**
* 艦隊タブのアイコンを更新します
*/
private void updateTabIcon() {
BitSet state = this.tabComposite.getState();
if (state.get(FleetComposite.FATAL)) {
this.tabItem.setImage(SWTResourceManager.getImage(FleetComposite.class,
AppConfig.get().isMonoIcon()
? AppConstants.R_ICON_EXCLAMATION_MONO
: AppConstants.R_ICON_EXCLAMATION));
} else if (state.get(FleetComposite.WARN)) {
this.tabItem.setImage(SWTResourceManager.getImage(FleetComposite.class,
AppConfig.get().isMonoIcon()
? AppConstants.R_ICON_ERROR_MONO
: AppConstants.R_ICON_ERROR));
} else {
this.tabItem.setImage(null);
}
}
public void showTabMenu() {
if (this.tabMenu != null) {
this.tabMenu.setVisible(true);
}
}
/**
* @return fleetid
*/
public int getFleetid() {
return this.fleetid;
}
}