Archived
0

add details pane

This commit is contained in:
Mo
2016-11-04 16:56:13 +03:00
parent f0d3e4dc8a
commit 4b01ac9bc1
3 changed files with 179 additions and 51 deletions

View File

@@ -4,7 +4,9 @@ import javafx.beans.property.*;
import javafx.collections.FXCollections;
import javafx.fxml.FXML;
import javafx.scene.control.*;
import javafx.scene.input.KeyCode;
import org.controlsfx.control.CheckComboBox;
import org.controlsfx.control.MasterDetailPane;
import ru.trader.Main;
import ru.trader.analysis.PowerPlayAnalyzator;
import ru.trader.core.*;
@@ -47,12 +49,17 @@ public class PowerPlayController {
@FXML
private ListView<SystemModel> controlSystems;
@FXML
private MasterDetailPane resultPane;
@FXML
private TableView<ResultEntry> tblResults;
@FXML
private TableView<ResultEntry> tblDetail;
private MarketModel world;
private ProfileModel profile;
private PowerPlayAnalyzator analyzator;
private final List<ResultEntry> result = FXCollections.observableArrayList();
private final List<ResultEntry> detail = FXCollections.observableArrayList();
@FXML
@@ -68,6 +75,7 @@ public class PowerPlayController {
cbStates.getCheckModel().check(POWER_STATE.HEADQUARTERS);
BindingsHelper.setTableViewItems(tblResults, result);
BindingsHelper.setTableViewItems(tblDetail, detail);
initListeners();
}
@@ -92,6 +100,30 @@ public class PowerPlayController {
}
private void initListeners(){
tblResults.setOnKeyPressed(e -> {
if (e.getCode() == KeyCode.ESCAPE){
if (!tblResults.getSelectionModel().isEmpty()) {
tblResults.getSelectionModel().clearSelection();
}
}
});
tblResults.getSelectionModel().selectedItemProperty().addListener((ov, o, n) -> {
if (n != null){
fillDetail(n.starSystem);
resultPane.setShowDetailNode(true);
} else {
resultPane.setShowDetailNode(false);
}
});
}
private void fillDetail(SystemModel detailSystem) {
final Place starSystem = ModelFabric.get(detailSystem);
detail.clear();
if (starSystem != null){
Collection<PowerPlayAnalyzator.IntersectData> controllings = analyzator.getControlling(starSystem);
detail.addAll(BindingsHelper.observableList(controllings,d -> new ResultEntry(d, starSystem)));
}
}
@@ -150,6 +182,9 @@ public class PowerPlayController {
@FXML
private void search(){
if (controlSystems.getItems().isEmpty()){
addControlSystem();
}
if (rbIntersect.isSelected()){
getIntersects();
}
@@ -203,6 +238,13 @@ public class PowerPlayController {
}
}
@FXML
private void copyDetailToClipboard(){
ResultEntry entry = tblDetail.getSelectionModel().getSelectedItem();
if (entry != null){
Main.copyToClipboard(entry.starSystem.getName());
}
}
public class ResultEntry {
private final SystemModel starSystem;

View File

@@ -0,0 +1,43 @@
package ru.trader.view.support.cells;
import javafx.scene.control.TableCell;
import javafx.scene.control.TableColumn;
import javafx.util.Callback;
import javafx.util.StringConverter;
public class TextCell<T,V> implements Callback<TableColumn<T, V>, TableCell<T, V>> {
private StringConverter<V> converter;
public TextCell() {
}
public StringConverter<V> getConverter() {
return converter;
}
public void setConverter(StringConverter<V> converter) {
this.converter = converter;
}
@Override
public TableCell<T, V> call(TableColumn<T, V> param) {
return new TableCell<T, V>(){
@Override
protected void updateItem(V item, boolean empty) {
super.updateItem(item, empty);
if (item == null || empty) {
setText(null);
setGraphic(null);
} else {
if (converter != null){
setText(converter.toString(item));
} else {
setText(item.toString());
}
setGraphic(null);
}
}
};
}
}

View File

@@ -1,11 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.*?>
<?import javafx.scene.control.cell.*?>
<?import javafx.scene.layout.*?>
<?import org.controlsfx.glyphfont.*?>
<?import javafx.scene.control.cell.PropertyValueFactory?>
<?import ru.trader.view.support.cells.DistanceCell?>
<?import org.controlsfx.control.CheckComboBox?>
<?import org.controlsfx.control.MasterDetailPane?>
<?import org.controlsfx.glyphfont.*?>
<?import ru.trader.view.support.cells.*?>
<?import ru.trader.view.support.*?>
<VBox xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1"
fx:controller="ru.trader.controllers.PowerPlayController"
prefHeight="500" >
@@ -54,52 +56,93 @@
</VBox>
</HBox>
</TitledPane>
<TitledPane text="Результаты анализа" collapsible="false">
<TableView fx:id="tblResults">
<columns>
<TableColumn minWidth="200" text="%market.systems">
<cellValueFactory><PropertyValueFactory property="name"/></cellValueFactory>
</TableColumn>
<TableColumn minWidth="200" text="%market.government">
<cellValueFactory><PropertyValueFactory property="government"/></cellValueFactory>
</TableColumn>
<TableColumn minWidth="180" text="%market.allegiance">
<cellValueFactory><PropertyValueFactory property="faction"/></cellValueFactory>
</TableColumn>
<TableColumn minWidth="110" text="%market.powerState">
<cellValueFactory><PropertyValueFactory property="powerState"/></cellValueFactory>
</TableColumn>
<TableColumn minWidth="110" text="%market.power">
<cellValueFactory><PropertyValueFactory property="power"/></cellValueFactory>
</TableColumn>
<TableColumn minWidth="110" text="%market.order.distance" fx:id="sortColumn" sortType="ASCENDING">
<cellFactory><DistanceCell /></cellFactory>
<cellValueFactory><PropertyValueFactory property="distance"/></cellValueFactory>
</TableColumn>
<TableColumn minWidth="80" text="Тип площадки">
<cellValueFactory><PropertyValueFactory property="maxSizePad"/></cellValueFactory>
</TableColumn>
<TableColumn minWidth="80" text="Пересечений">
<cellValueFactory><PropertyValueFactory property="intersectCount"/></cellValueFactory>
</TableColumn>
<TableColumn minWidth="200" text="Контролируемые системы">
<cellValueFactory><PropertyValueFactory property="controlling"/></cellValueFactory>
</TableColumn>
</columns>
<columnResizePolicy>
<TableView fx:constant="UNCONSTRAINED_RESIZE_POLICY"/>
</columnResizePolicy>
<sortOrder>
<fx:reference source="sortColumn"/>
</sortOrder>
<contextMenu>
<ContextMenu>
<items>
<MenuItem text="%dialog.button.copy" onAction="#copyToClipboard" />
</items>
</ContextMenu>
</contextMenu>
</TableView>
</TitledPane>
<MasterDetailPane fx:id="resultPane" detailSide="RIGHT" prefWidth="1190" dividerPosition="0.566" showDetailNode="false">
<masterNode>
<TitledPane text="Результаты анализа" collapsible="false">
<TableView fx:id="tblResults">
<columns>
<TableColumn minWidth="200" text="%market.system">
<cellValueFactory><PropertyValueFactory property="name"/></cellValueFactory>
</TableColumn>
<TableColumn minWidth="180" text="Пересекается с">
<cellValueFactory><PropertyValueFactory property="controlling"/></cellValueFactory>
</TableColumn>
<TableColumn minWidth="90" text="Пересечений">
<cellValueFactory><PropertyValueFactory property="intersectCount"/></cellValueFactory>
</TableColumn>
<TableColumn minWidth="100" text="%market.powerState">
<cellFactory><TextCell><converter><PowerStateStringConverter /></converter></TextCell></cellFactory>
<cellValueFactory><PropertyValueFactory property="powerState"/></cellValueFactory>
</TableColumn>
<TableColumn minWidth="100" text="%market.power">
<cellFactory><TextCell><converter><PowerStringConverter /></converter></TextCell></cellFactory>
<cellValueFactory><PropertyValueFactory property="power"/></cellValueFactory>
</TableColumn>
<TableColumn minWidth="120" text="%market.government">
<cellFactory><TextCell><converter><GovernmentStringConverter /></converter></TextCell></cellFactory>
<cellValueFactory><PropertyValueFactory property="government"/></cellValueFactory>
</TableColumn>
<TableColumn minWidth="120" text="%market.allegiance">
<cellFactory><TextCell><converter><FactionStringConverter /></converter></TextCell></cellFactory>
<cellValueFactory><PropertyValueFactory property="faction"/></cellValueFactory>
</TableColumn>
<TableColumn minWidth="80" text="%market.order.distance">
<cellFactory><DistanceCell /></cellFactory>
<cellValueFactory><PropertyValueFactory property="distance"/></cellValueFactory>
</TableColumn>
<TableColumn minWidth="100" text="Тип площадки">
<cellValueFactory><PropertyValueFactory property="maxSizePad"/></cellValueFactory>
</TableColumn>
</columns>
<columnResizePolicy>
<TableView fx:constant="UNCONSTRAINED_RESIZE_POLICY"/>
</columnResizePolicy>
<contextMenu>
<ContextMenu>
<items>
<MenuItem text="%dialog.button.copy" onAction="#copyToClipboard" />
</items>
</ContextMenu>
</contextMenu>
</TableView>
</TitledPane>
</masterNode>
<detailNode>
<TitledPane text="Системы в радиусе 15 LY" collapsible="false">
<TableView fx:id="tblDetail">
<columns>
<TableColumn minWidth="100" text="%market.system">
<cellValueFactory><PropertyValueFactory property="name"/></cellValueFactory>
</TableColumn>
<TableColumn minWidth="100" text="%market.powerState">
<cellFactory><TextCell><converter><PowerStateStringConverter /></converter></TextCell></cellFactory>
<cellValueFactory><PropertyValueFactory property="powerState"/></cellValueFactory>
</TableColumn>
<TableColumn minWidth="100" text="%market.power">
<cellFactory><TextCell><converter><PowerStringConverter /></converter></TextCell></cellFactory>
<cellValueFactory><PropertyValueFactory property="power"/></cellValueFactory>
</TableColumn>
<TableColumn minWidth="120" text="%market.government">
<cellFactory><TextCell><converter><GovernmentStringConverter /></converter></TextCell></cellFactory>
<cellValueFactory><PropertyValueFactory property="government"/></cellValueFactory>
</TableColumn>
<TableColumn minWidth="120" text="%market.allegiance">
<cellFactory><TextCell><converter><FactionStringConverter /></converter></TextCell></cellFactory>
<cellValueFactory><PropertyValueFactory property="faction"/></cellValueFactory>
</TableColumn>
</columns>
<columnResizePolicy>
<TableView fx:constant="UNCONSTRAINED_RESIZE_POLICY"/>
</columnResizePolicy>
<contextMenu>
<ContextMenu>
<items>
<MenuItem text="%dialog.button.copy" onAction="#copyDetailToClipboard" />
</items>
</ContextMenu>
</contextMenu>
</TableView>
</TitledPane>
</detailNode>
</MasterDetailPane>
</VBox>