001package conexp.fx.gui.dialog; 002 003import conexp.fx.core.exporter.TeXExporter.ContextTeXPackage; 004import conexp.fx.core.exporter.TeXExporter.DiagramTeXPackage; 005import conexp.fx.core.exporter.TeXExporter.FitScale; 006import conexp.fx.core.exporter.TeXExporter.ScaleEnum; 007import conexp.fx.core.exporter.TeXExporter.TeXOptions; 008 009/* 010 * #%L 011 * Concept Explorer FX 012 * %% 013 * Copyright (C) 2010 - 2023 Francesco Kriegel 014 * %% 015 * This program is free software: you can redistribute it and/or modify 016 * it under the terms of the GNU General Public License as 017 * published by the Free Software Foundation, either version 3 of the 018 * License, or (at your option) any later version. 019 * 020 * This program is distributed in the hope that it will be useful, 021 * but WITHOUT ANY WARRANTY; without even the implied warranty of 022 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 023 * GNU General Public License for more details. 024 * 025 * You should have received a copy of the GNU General Public 026 * License along with this program. If not, see 027 * <http://www.gnu.org/licenses/gpl-3.0.html>. 028 * #L% 029 */ 030 031import javafx.beans.value.ChangeListener; 032import javafx.beans.value.ObservableValue; 033import javafx.geometry.Insets; 034import javafx.scene.control.CheckBox; 035import javafx.scene.control.CheckBoxBuilder; 036import javafx.scene.control.RadioButton; 037import javafx.scene.control.RadioButtonBuilder; 038import javafx.scene.control.Toggle; 039import javafx.scene.control.ToggleGroup; 040import javafx.scene.control.ToggleGroupBuilder; 041import javafx.scene.layout.HBoxBuilder; 042import javafx.scene.layout.VBox; 043import javafx.scene.layout.VBoxBuilder; 044import javafx.stage.Stage; 045import javafx.util.converter.IntegerStringConverter; 046import jfxtras.scene.control.ListSpinner; 047 048public final class TeXDialog<G, M> extends FXDialog<TeXOptions> { 049 050 public TeXDialog(final Stage stage) { 051 super(stage, FXDialog.Style.WARN, "TeX Export Wizard", "TeX Export Wizard Options", new VBox(), 270); 052 VBox box = (VBox) pane.getCenter(); 053 box.setPadding(new Insets(0, 10, 0, 10)); 054 box.setSpacing(4); 055 value = 056 new TeXOptions(null, false, true, false, ContextTeXPackage.None, DiagramTeXPackage.ConExpFX, new FitScale( 057 80, 058 120)); 059 final CheckBox arrowsCheckBox = CheckBoxBuilder.create().text( 060 "Arrow Relations").build(); 061 final CheckBox labelsCheckBox = CheckBoxBuilder.create().text( 062 "Concept Labels").selected( 063 true).build(); 064 final CheckBox standAloneCheckBox = CheckBoxBuilder.create().disable( 065 true).text( 066 "Stand-Alone Document").build(); 067 final RadioButton noneContextButton = RadioButtonBuilder.create().text( 068 "Context Package: None").selected( 069 true).userData( 070 ContextTeXPackage.None).build(); 071 final RadioButton ganterContextButton = RadioButtonBuilder.create().text( 072 "Context Package: Ganter").userData( 073 ContextTeXPackage.Ganter).build(); 074 final RadioButton tabularContextButton = RadioButtonBuilder.create().text( 075 "Context Package: Tabular").userData( 076 ContextTeXPackage.Tabular).build(); 077 final RadioButton noneDiagramButton = RadioButtonBuilder.create().text( 078 "Diagram Package: None").userData( 079 DiagramTeXPackage.None).build(); 080 final RadioButton ganterDiagramButton = RadioButtonBuilder.create().text( 081 "Diagram Package: Ganter").userData( 082 DiagramTeXPackage.Ganter).build(); 083 final RadioButton conExpFXDiagramButton = RadioButtonBuilder.create().text( 084 "Diagram Package: ConExpFX").selected( 085 true).userData( 086 DiagramTeXPackage.ConExpFX).build(); 087 final RadioButton fitButton = RadioButtonBuilder.create().text( 088 "Diagram Scale: Fit").userData( 089 ScaleEnum.Fit).build(); 090 final RadioButton fitWidthButton = RadioButtonBuilder.create().text( 091 "Diagram Scale: Fit Width").userData( 092 ScaleEnum.FitWidth).build(); 093 final RadioButton fitHeightButton = RadioButtonBuilder.create().text( 094 "Diagram Scale: Fit Height").userData( 095 ScaleEnum.FitHeight).build(); 096 final RadioButton fitRatioButton = RadioButtonBuilder.create().text( 097 "Diagram Scale: Fit Ratio").selected( 098 true).userData( 099 ScaleEnum.FitRatio).build(); 100 final ListSpinner<Integer> widthSpinner = new ListSpinner<Integer>(1, 1000); 101 final ListSpinner<Integer> heightSpinner = new ListSpinner<Integer>(1, 1000); 102 widthSpinner.valueProperty().set( 103 80); 104 heightSpinner.valueProperty().set( 105 120); 106 widthSpinner.withPostfix("mm"); 107 heightSpinner.withPostfix("mm"); 108// widthSpinner.withAlignment(Pos.CENTER); 109// heightSpinner.withAlignment(Pos.CENTER); 110// widthSpinner.withArrowDirection(ArrowDirection.HORIZONTAL); 111// heightSpinner.withArrowDirection(ArrowDirection.VERTICAL); 112// widthSpinner.withArrowPosition(ArrowPosition.SPLIT); 113// heightSpinner.withArrowPosition(ArrowPosition.SPLIT); 114 widthSpinner.withEditable(true); 115 widthSpinner.withStringConverter(new IntegerStringConverter()); 116 heightSpinner.withEditable(true); 117 heightSpinner.withStringConverter(new IntegerStringConverter()); 118 widthSpinner.setMinWidth(100); 119 widthSpinner.setMaxWidth(100); 120 heightSpinner.setMinWidth(100); 121 heightSpinner.setMaxWidth(100); 122 final ToggleGroup contextGroup = ToggleGroupBuilder.create().toggles( 123 noneContextButton, 124 ganterContextButton, 125 tabularContextButton).build(); 126 final ToggleGroup diagramGroup = ToggleGroupBuilder.create().toggles( 127 noneDiagramButton, 128 ganterDiagramButton, 129 conExpFXDiagramButton).build(); 130 final ToggleGroup scaleGroup = ToggleGroupBuilder.create().toggles( 131 fitButton, 132 fitWidthButton, 133 fitHeightButton, 134 fitRatioButton).build(); 135 arrowsCheckBox.selectedProperty().addListener( 136 new ChangeListener<Boolean>() { 137 138 @Override 139 public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) { 140 value.arrows = newValue; 141 } 142 }); 143 labelsCheckBox.selectedProperty().addListener( 144 new ChangeListener<Boolean>() { 145 146 @Override 147 public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) { 148 value.labels = newValue; 149 } 150 }); 151 standAloneCheckBox.selectedProperty().addListener( 152 new ChangeListener<Boolean>() { 153 154 @Override 155 public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) { 156 value.standAlone = newValue; 157 } 158 }); 159 contextGroup.selectedToggleProperty().addListener( 160 new ChangeListener<Toggle>() { 161 162 @Override 163 public void changed(ObservableValue<? extends Toggle> observable, Toggle oldToggle, Toggle newToggle) { 164 value.contextTeXPackage = (ContextTeXPackage) newToggle.getUserData(); 165 } 166 }); 167 diagramGroup.selectedToggleProperty().addListener( 168 new ChangeListener<Toggle>() { 169 170 @Override 171 public void changed(ObservableValue<? extends Toggle> observable, Toggle oldToggle, Toggle newToggle) { 172 value.diagramTeXPackage = (DiagramTeXPackage) newToggle.getUserData(); 173 } 174 }); 175 scaleGroup.selectedToggleProperty().addListener( 176 new ChangeListener<Toggle>() { 177 178 @Override 179 public void changed(ObservableValue<? extends Toggle> observable, Toggle oldToggle, Toggle newToggle) { 180 value.scale = ((ScaleEnum) newToggle.getUserData()).toOption( 181 widthSpinner.valueProperty().get(), 182 heightSpinner.valueProperty().get()); 183 widthSpinner.disableProperty().set( 184 (ScaleEnum) newToggle.getUserData() == ScaleEnum.FitHeight); 185 heightSpinner.disableProperty().set( 186 (ScaleEnum) newToggle.getUserData() == ScaleEnum.FitWidth); 187 } 188 }); 189 widthSpinner.valueProperty().addListener( 190 new ChangeListener<Integer>() { 191 192 @Override 193 public void changed(ObservableValue<? extends Integer> observable, Integer oldValue, Integer newValue) { 194 value.scale = ((ScaleEnum) scaleGroup.selectedToggleProperty().get().getUserData()).toOption( 195 newValue, 196 heightSpinner.valueProperty().get()); 197 } 198 }); 199 heightSpinner.valueProperty().addListener( 200 new ChangeListener<Integer>() { 201 202 @Override 203 public void changed(ObservableValue<? extends Integer> observable, Integer oldValue, Integer newValue) { 204 value.scale = ((ScaleEnum) scaleGroup.selectedToggleProperty().get().getUserData()).toOption( 205 widthSpinner.valueProperty().get(), 206 newValue); 207 } 208 }); 209 box.getChildren().addAll( 210 VBoxBuilder.create().padding( 211 new Insets(2, 0, 2, 0)).spacing( 212 4).children( 213 arrowsCheckBox, 214 labelsCheckBox, 215 standAloneCheckBox).build()); 216 box.getChildren().addAll( 217 VBoxBuilder.create().padding( 218 new Insets(2, 0, 2, 0)).spacing( 219 4).children( 220 noneContextButton, 221 ganterContextButton, 222 tabularContextButton).build()); 223 box.getChildren().addAll( 224 VBoxBuilder.create().padding( 225 new Insets(2, 0, 2, 0)).spacing( 226 4).children( 227 noneDiagramButton, 228 ganterDiagramButton, 229 conExpFXDiagramButton).build()); 230 box.getChildren().addAll( 231 VBoxBuilder.create().padding( 232 new Insets(2, 0, 0, 0)).spacing( 233 4).children( 234 fitButton, 235 fitWidthButton, 236 fitHeightButton, 237 fitRatioButton).build()); 238 box.getChildren().addAll( 239 HBoxBuilder.create().padding( 240 new Insets(0, 0, 2, 0)).spacing( 241 4).children( 242 widthSpinner, 243 heightSpinner).build()); 244 } 245}