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.collections.FXCollections;
import javafx.fxml.FXML; import javafx.fxml.FXML;
import javafx.scene.control.*; import javafx.scene.control.*;
import javafx.scene.input.KeyCode;
import org.controlsfx.control.CheckComboBox; import org.controlsfx.control.CheckComboBox;
import org.controlsfx.control.MasterDetailPane;
import ru.trader.Main; import ru.trader.Main;
import ru.trader.analysis.PowerPlayAnalyzator; import ru.trader.analysis.PowerPlayAnalyzator;
import ru.trader.core.*; import ru.trader.core.*;
@@ -47,12 +49,17 @@ public class PowerPlayController {
@FXML @FXML
private ListView<SystemModel> controlSystems; private ListView<SystemModel> controlSystems;
@FXML @FXML
private MasterDetailPane resultPane;
@FXML
private TableView<ResultEntry> tblResults; private TableView<ResultEntry> tblResults;
@FXML
private TableView<ResultEntry> tblDetail;
private MarketModel world; private MarketModel world;
private ProfileModel profile; private ProfileModel profile;
private PowerPlayAnalyzator analyzator; private PowerPlayAnalyzator analyzator;
private final List<ResultEntry> result = FXCollections.observableArrayList(); private final List<ResultEntry> result = FXCollections.observableArrayList();
private final List<ResultEntry> detail = FXCollections.observableArrayList();
@FXML @FXML
@@ -68,6 +75,7 @@ public class PowerPlayController {
cbStates.getCheckModel().check(POWER_STATE.HEADQUARTERS); cbStates.getCheckModel().check(POWER_STATE.HEADQUARTERS);
BindingsHelper.setTableViewItems(tblResults, result); BindingsHelper.setTableViewItems(tblResults, result);
BindingsHelper.setTableViewItems(tblDetail, detail);
initListeners(); initListeners();
} }
@@ -92,6 +100,30 @@ public class PowerPlayController {
} }
private void initListeners(){ 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 @FXML
private void search(){ private void search(){
if (controlSystems.getItems().isEmpty()){
addControlSystem();
}
if (rbIntersect.isSelected()){ if (rbIntersect.isSelected()){
getIntersects(); 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 { public class ResultEntry {
private final SystemModel starSystem; 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"?> <?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.*?> <?import javafx.scene.control.*?>
<?import javafx.scene.control.cell.*?>
<?import javafx.scene.layout.*?> <?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.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" <VBox xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1"
fx:controller="ru.trader.controllers.PowerPlayController" fx:controller="ru.trader.controllers.PowerPlayController"
prefHeight="500" > prefHeight="500" >
@@ -54,45 +56,47 @@
</VBox> </VBox>
</HBox> </HBox>
</TitledPane> </TitledPane>
<MasterDetailPane fx:id="resultPane" detailSide="RIGHT" prefWidth="1190" dividerPosition="0.566" showDetailNode="false">
<masterNode>
<TitledPane text="Результаты анализа" collapsible="false"> <TitledPane text="Результаты анализа" collapsible="false">
<TableView fx:id="tblResults"> <TableView fx:id="tblResults">
<columns> <columns>
<TableColumn minWidth="200" text="%market.systems"> <TableColumn minWidth="200" text="%market.system">
<cellValueFactory><PropertyValueFactory property="name"/></cellValueFactory> <cellValueFactory><PropertyValueFactory property="name"/></cellValueFactory>
</TableColumn> </TableColumn>
<TableColumn minWidth="200" text="%market.government"> <TableColumn minWidth="180" text="Пересекается с">
<cellValueFactory><PropertyValueFactory property="government"/></cellValueFactory> <cellValueFactory><PropertyValueFactory property="controlling"/></cellValueFactory>
</TableColumn> </TableColumn>
<TableColumn minWidth="180" text="%market.allegiance"> <TableColumn minWidth="90" text="Пересечений">
<cellValueFactory><PropertyValueFactory property="faction"/></cellValueFactory> <cellValueFactory><PropertyValueFactory property="intersectCount"/></cellValueFactory>
</TableColumn> </TableColumn>
<TableColumn minWidth="110" text="%market.powerState"> <TableColumn minWidth="100" text="%market.powerState">
<cellFactory><TextCell><converter><PowerStateStringConverter /></converter></TextCell></cellFactory>
<cellValueFactory><PropertyValueFactory property="powerState"/></cellValueFactory> <cellValueFactory><PropertyValueFactory property="powerState"/></cellValueFactory>
</TableColumn> </TableColumn>
<TableColumn minWidth="110" text="%market.power"> <TableColumn minWidth="100" text="%market.power">
<cellFactory><TextCell><converter><PowerStringConverter /></converter></TextCell></cellFactory>
<cellValueFactory><PropertyValueFactory property="power"/></cellValueFactory> <cellValueFactory><PropertyValueFactory property="power"/></cellValueFactory>
</TableColumn> </TableColumn>
<TableColumn minWidth="110" text="%market.order.distance" fx:id="sortColumn" sortType="ASCENDING"> <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> <cellFactory><DistanceCell /></cellFactory>
<cellValueFactory><PropertyValueFactory property="distance"/></cellValueFactory> <cellValueFactory><PropertyValueFactory property="distance"/></cellValueFactory>
</TableColumn> </TableColumn>
<TableColumn minWidth="80" text="Тип площадки"> <TableColumn minWidth="100" text="Тип площадки">
<cellValueFactory><PropertyValueFactory property="maxSizePad"/></cellValueFactory> <cellValueFactory><PropertyValueFactory property="maxSizePad"/></cellValueFactory>
</TableColumn> </TableColumn>
<TableColumn minWidth="80" text="Пересечений">
<cellValueFactory><PropertyValueFactory property="intersectCount"/></cellValueFactory>
</TableColumn>
<TableColumn minWidth="200" text="Контролируемые системы">
<cellValueFactory><PropertyValueFactory property="controlling"/></cellValueFactory>
</TableColumn>
</columns> </columns>
<columnResizePolicy> <columnResizePolicy>
<TableView fx:constant="UNCONSTRAINED_RESIZE_POLICY"/> <TableView fx:constant="UNCONSTRAINED_RESIZE_POLICY"/>
</columnResizePolicy> </columnResizePolicy>
<sortOrder>
<fx:reference source="sortColumn"/>
</sortOrder>
<contextMenu> <contextMenu>
<ContextMenu> <ContextMenu>
<items> <items>
@@ -102,4 +106,43 @@
</contextMenu> </contextMenu>
</TableView> </TableView>
</TitledPane> </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> </VBox>