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}