Skip to content

Commit 3e48b58

Browse files
authored
Replaces Variable Chooser Dialog (#399)
* Replaces Variable Chooser Dialog * Sets default variable assignments for example data tables
1 parent b2e7d79 commit 3e48b58

File tree

9 files changed

+513
-383
lines changed

9 files changed

+513
-383
lines changed

app/src/main/java/org/cirdles/topsoil/app/menu/MainMenuBar.java

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -383,16 +383,9 @@ private Menu getTableMenu(TopsoilTabPane tabs) {
383383
uPbExampleTableItem,
384384
uThExampleTableItem);
385385

386-
uPbExampleTableItem.setOnAction(event -> {
387-
TopsoilDataTable table = MenuItemEventHandler.handleOpenExampleTable(tabs, IsotopeType.UPb);
388-
tabs.add(table);
389-
});
386+
uPbExampleTableItem.setOnAction(event -> MenuItemEventHandler.handleOpenExampleTable(tabs, IsotopeType.UPb) );
390387

391-
uThExampleTableItem.setOnAction(event -> {
392-
TopsoilDataTable table = MenuItemEventHandler.handleOpenExampleTable(tabs, IsotopeType.UTh);
393-
tabs.add(table);
394-
});
395-
388+
uThExampleTableItem.setOnAction(event -> MenuItemEventHandler.handleOpenExampleTable(tabs, IsotopeType.UTh) );
396389

397390
// Import Table from File
398391
tableFromFileItem.setOnAction(event -> {

app/src/main/java/org/cirdles/topsoil/app/menu/MenuItemEventHandler.java

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,9 @@
1212
import org.cirdles.topsoil.app.metadata.TopsoilMetadata;
1313
import org.cirdles.topsoil.app.isotope.IsotopeType;
1414
import org.cirdles.topsoil.app.plot.variable.Variable;
15+
import org.cirdles.topsoil.app.plot.variable.Variables;
1516
import org.cirdles.topsoil.app.table.TopsoilDataColumn;
17+
import org.cirdles.topsoil.app.table.TopsoilTableController;
1618
import org.cirdles.topsoil.app.table.uncertainty.UncertaintyFormat;
1719
import org.cirdles.topsoil.app.tab.TopsoilTabPane;
1820
import org.cirdles.topsoil.app.dataset.entry.TopsoilDataEntry;
@@ -301,16 +303,15 @@ public static TopsoilDataTable handleNewTable() {
301303
*
302304
* @param tabs the TopsoilTabPane to which to add tables
303305
* @param isotopeType the isotope type of the example table to be opened
304-
* @return the resulting TopsoilDataTable
305306
*/
306-
public static TopsoilDataTable handleOpenExampleTable(TopsoilTabPane tabs, IsotopeType isotopeType) {
307-
TopsoilDataTable table = null;
307+
public static void handleOpenExampleTable(TopsoilTabPane tabs, IsotopeType isotopeType) {
308+
TopsoilDataTable table;
308309
UncertaintyFormat format;
309310

310311
if (isotopeType != null) {
311312

312-
List<TopsoilDataEntry> entries = null;
313-
String[] headers = null;
313+
List<TopsoilDataEntry> entries;
314+
String[] headers;
314315
String exampleContent = new ExampleDataTable().getSampleData(isotopeType);
315316
String exampleContentDelimiter = ",";
316317

@@ -335,12 +336,26 @@ public static TopsoilDataTable handleOpenExampleTable(TopsoilTabPane tabs, Isoto
335336
ObservableList<TopsoilDataEntry> data = FXCollections.observableList(entries);
336337

337338
table = new TopsoilDataTable(headers, isotopeType, format, data.toArray(new TopsoilDataEntry[data.size()]));
338-
table.setTitle(isotopeType.getName() + " Example Data");
339+
table.setTitle(isotopeType.getAbbreviation() + " Example Data");
340+
341+
// Set default variable associations.
342+
List<TopsoilDataColumn> columns = table.getDataColumns();
343+
Map<Variable<Number>, TopsoilDataColumn> assignments = new HashMap<>();
344+
345+
assignments.put(Variables.X, columns.get(0));
346+
assignments.put(Variables.SIGMA_X, columns.get(1));
347+
assignments.put(Variables.Y, columns.get(2));
348+
assignments.put(Variables.SIGMA_Y, columns.get(3));
349+
assignments.put(Variables.RHO, columns.get(4));
350+
351+
tabs.add(table);
352+
TopsoilTableController tableController = tabs.getSelectedTab().getTableController();
353+
tableController.setVariableAssignments(assignments);
354+
339355
} catch (TopsoilException e) {
340356
e.printStackTrace();
341357
}
342358
}
343-
return table;
344359
}
345360

346361
/**

app/src/main/java/org/cirdles/topsoil/app/table/TopsoilDataTable.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -236,7 +236,6 @@ public Map<Variable<Number>, TopsoilDataColumn> getVariableAssignments() {
236236

237237
public void setVariableAssignments(Map<Variable<Number>, TopsoilDataColumn> assignments) {
238238
variableColumnMap = assignments;
239-
// TODO Check if TopsoilDataColumns have had their variables set correctly.
240239
}
241240

242241
/**

app/src/main/java/org/cirdles/topsoil/app/table/TopsoilTableController.java

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -250,12 +250,16 @@ public List<Map<String, Object>> getPlotData() {
250250

251251
public void showVariableChooserDialog(@Nullable List<Variable<Number>> required) {
252252
Map<Variable<Number>, TopsoilDataColumn> selections = VariableChooserDialog.showDialog(this, required);
253+
setVariableAssignments(selections);
254+
}
255+
256+
public void setVariableAssignments(Map<Variable<Number>, TopsoilDataColumn> assignments) {
253257
List<TopsoilDataColumn> columns = table.getDataColumns();
254258
Double uncertaintyFormatValue = table.getUncertaintyFormat().getValue();
255-
if (selections != null) {
259+
if (assignments != null) {
256260

257261
// Apply selections to columns
258-
for (Map.Entry<Variable<Number>, TopsoilDataColumn> entry : selections.entrySet()) {
262+
for (Map.Entry<Variable<Number>, TopsoilDataColumn> entry : assignments.entrySet()) {
259263
if (entry.getValue().getVariable() != entry.getKey()) {
260264
if (Variables.UNCERTAINTY_VARIABLES.contains(entry.getKey())) {
261265

@@ -280,7 +284,7 @@ public void showVariableChooserDialog(@Nullable List<Variable<Number>> required)
280284

281285
// Set other columns' variable properties to null
282286
for (TopsoilDataColumn column : columns) {
283-
if (!selections.containsValue(column)) {
287+
if (!assignments.containsValue(column)) {
284288
// If the column was an uncertainty variable, but isn't anymore
285289
if (column.hasVariable()) {
286290
if (Variables.UNCERTAINTY_VARIABLES.contains(column.getVariable())) {
@@ -293,19 +297,19 @@ public void showVariableChooserDialog(@Nullable List<Variable<Number>> required)
293297
}
294298
}
295299

296-
table.setVariableAssignments(selections);
300+
table.setVariableAssignments(assignments);
297301
for (PlotInformation plotInfo : table.getOpenPlots()) {
298302
plotInfo.getPlot().setData(getPlotData());
299303
}
300304

301305
updateColumnListeners();
302306

303307
// Re-name x and y axis titles
304-
if (selections.containsKey(Variables.X)) {
305-
tabContent.getPlotPropertiesPanelController().setxAxisTitle(selections.get(Variables.X).getName());
308+
if (assignments.containsKey(Variables.X)) {
309+
tabContent.getPlotPropertiesPanelController().setxAxisTitle(assignments.get(Variables.X).getName());
306310
}
307-
if (selections.containsKey(Variables.Y)) {
308-
tabContent.getPlotPropertiesPanelController().setyAxisTitle(selections.get(Variables.Y).getName());
311+
if (assignments.containsKey(Variables.Y)) {
312+
tabContent.getPlotPropertiesPanelController().setyAxisTitle(assignments.get(Variables.Y).getName());
309313
}
310314
}
311315
}
Lines changed: 53 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,21 @@
11
package org.cirdles.topsoil.app.util.dialog;
22

3+
import javafx.application.Platform;
34
import javafx.collections.MapChangeListener;
4-
import javafx.fxml.FXMLLoader;
5-
import javafx.scene.Node;
5+
import javafx.geometry.Insets;
6+
import javafx.geometry.Pos;
67
import javafx.scene.control.ButtonType;
78
import javafx.scene.control.Dialog;
9+
import javafx.scene.control.Label;
10+
import javafx.scene.layout.VBox;
811
import javafx.stage.Stage;
9-
import org.cirdles.commons.util.ResourceExtractor;
1012
import org.cirdles.topsoil.app.MainWindow;
1113
import org.cirdles.topsoil.app.plot.variable.Variable;
14+
import org.cirdles.topsoil.app.plot.variable.Variables;
1215
import org.cirdles.topsoil.app.table.TopsoilDataColumn;
1316
import org.cirdles.topsoil.app.table.TopsoilTableController;
14-
import org.cirdles.topsoil.app.util.dialog.controller.VariableChooserController;
17+
import org.cirdles.topsoil.app.util.dialog.controller.VariableColumnChooser;
1518

16-
import java.io.IOException;
1719
import java.util.List;
1820
import java.util.Map;
1921

@@ -22,76 +24,71 @@
2224
*/
2325
public class VariableChooserDialog extends Dialog<Map<Variable<Number>, TopsoilDataColumn>> {
2426

25-
private final ResourceExtractor RESOURCE_EXTRACTOR = new ResourceExtractor(VariableChooserDialog.class);
26-
private final String VARIABLE_CHOOSER_FXML = "controller/variable-chooser.fxml";
27-
28-
private VariableChooserController controller;
29-
3027
private VariableChooserDialog(List<TopsoilDataColumn> columns,
28+
List<Variable<Number>> variables,
3129
Map<Variable<Number>, TopsoilDataColumn> selections,
32-
List<Variable<Number>> requiredVariables) {
30+
List<Variable<Number>> required) {
3331
super();
3432

3533
Stage stage = (Stage) this.getDialogPane().getScene().getWindow();
3634
stage.getIcons().add(MainWindow.getWindowIcon());
3735
stage.initOwner(MainWindow.getPrimaryStage());
3836
stage.setTitle("Variable Chooser");
39-
37+
stage.setResizable(true);
4038
this.getDialogPane().getButtonTypes().addAll(ButtonType.OK, ButtonType.CANCEL);
4139

42-
Node content;
43-
controller = null;
44-
try {
45-
FXMLLoader loader = new FXMLLoader(
46-
RESOURCE_EXTRACTOR.extractResourceAsPath(VARIABLE_CHOOSER_FXML).toUri().toURL());
47-
content = loader.load();
48-
controller = loader.getController();
49-
50-
// Disable OK button if not all required variables are assigned.
51-
this.getDialogPane().lookupButton(ButtonType.OK).setDisable(true);
52-
controller.selectionsProperty().addListener((MapChangeListener<? super Variable<Number>, ? super TopsoilDataColumn>) c -> {
53-
Boolean shouldDisableOK = false;
54-
if (!(requiredVariables == null)) {
55-
for (Variable<Number> v : requiredVariables) {
56-
if (!controller.selectionsProperty().containsKey(v)) {
57-
shouldDisableOK = true;
58-
break;
59-
}
40+
Label messageLabel = new Label("Choose which variables to associate with each column.");
41+
messageLabel.setPadding(new Insets(10.0, 10.0, 10.0, 10.0));
42+
VariableColumnChooser chooser = new VariableColumnChooser(columns, variables, selections, required);
43+
44+
VBox container = new VBox(messageLabel, chooser);
45+
container.setAlignment(Pos.TOP_CENTER);
46+
47+
// Disable OK button if not all required variables are assigned.
48+
this.getDialogPane().lookupButton(ButtonType.OK).setDisable(true);
49+
chooser.selectionsProperty().addListener((MapChangeListener<? super Variable<Number>, ? super TopsoilDataColumn>) c -> {
50+
Boolean shouldDisableOK = false;
51+
if (!(required == null)) {
52+
for (Variable<Number> v : required) {
53+
if (!chooser.selectionsProperty().containsKey(v)) {
54+
shouldDisableOK = true;
55+
break;
6056
}
6157
}
62-
this.getDialogPane().lookupButton(ButtonType.OK).setDisable(shouldDisableOK);
63-
});
64-
65-
controller.setup(columns, selections, requiredVariables);
66-
67-
this.getDialogPane().setContent(content);
68-
69-
this.setResultConverter(result -> {
70-
if (result == ButtonType.OK) {
71-
return controller.getSelections();
72-
} else {
73-
return null;
74-
}
75-
});
76-
77-
} catch (IOException e) {
78-
e.printStackTrace();
79-
}
58+
}
59+
this.getDialogPane().lookupButton(ButtonType.OK).setDisable(shouldDisableOK);
60+
});
61+
this.getDialogPane().setContent(container);
62+
63+
// The Scene doesn't seem to be completely done laying out its Nodes by the time this event is fired. Since
64+
// Platform.runLater() isn't being used extensively elsewhere, this works fine. If that changes, this may
65+
// have to be changed, as well.
66+
this.setOnShown(event -> Platform.runLater(() -> {
67+
chooser.callAfterVisible();
68+
if (stage.getWidth() > 800.0) {
69+
stage.setWidth(800.0);
70+
}
71+
if (stage.getHeight() > 600.0) {
72+
stage.setHeight(600.0);
73+
}
74+
}));
75+
76+
this.setResultConverter(result -> {
77+
if (result == ButtonType.OK) {
78+
return chooser.getSelections();
79+
} else {
80+
return null;
81+
}
82+
});
8083
}
8184

8285
public static Map<Variable<Number>, TopsoilDataColumn> showDialog(TopsoilTableController tableController,
8386
List<Variable<Number>> requiredVariables) {
8487

8588
List<TopsoilDataColumn> columns = tableController.getTable().getDataColumns();
89+
List<Variable<Number>> variables = Variables.VARIABLE_LIST;
8690
Map<Variable<Number>, TopsoilDataColumn> currentSelections = tableController.getTable().getVariableAssignments();
87-
return new VariableChooserDialog(columns, currentSelections, requiredVariables).showAndWait().orElse(null);
88-
}
8991

90-
public static Map<Variable<Number>, TopsoilDataColumn> showDialog(List<TopsoilDataColumn> columns,
91-
Map<Variable<Number>, TopsoilDataColumn>
92-
currentSelections,
93-
List<Variable<Number>> requiredVariables) {
94-
return new VariableChooserDialog(columns, currentSelections, requiredVariables).showAndWait().orElse(null);
92+
return new VariableChooserDialog(columns, variables, currentSelections, requiredVariables).showAndWait().orElse(null);
9593
}
96-
9794
}

0 commit comments

Comments
 (0)