OptionsManager.java 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418
  1. package de.tu_darmstadt.informatik.tk.scopviz.ui;
  2. import java.awt.Color;
  3. import java.io.BufferedReader;
  4. import java.io.BufferedWriter;
  5. import java.io.FileReader;
  6. import java.io.FileWriter;
  7. import java.io.IOException;
  8. import java.util.ArrayList;
  9. import java.util.Arrays;
  10. import de.tu_darmstadt.informatik.tk.scopviz.debug.Debug;
  11. import de.tu_darmstadt.informatik.tk.scopviz.ui.mapView.CustomWaypointRenderer;
  12. import de.tu_darmstadt.informatik.tk.scopviz.ui.mapView.EdgePainter;
  13. import de.tu_darmstadt.informatik.tk.scopviz.ui.mapView.MapViewFunctions;
  14. import de.tu_darmstadt.informatik.tk.scopviz.ui.mapView.WorldView;
  15. import javafx.application.Platform;
  16. import javafx.collections.FXCollections;
  17. import javafx.collections.ObservableList;
  18. import javafx.geometry.Insets;
  19. import javafx.scene.control.Alert;
  20. import javafx.scene.control.Alert.AlertType;
  21. import javafx.scene.control.Button;
  22. import javafx.scene.control.ButtonBar.ButtonData;
  23. import javafx.scene.control.ButtonType;
  24. import javafx.scene.control.ChoiceBox;
  25. import javafx.scene.control.Dialog;
  26. import javafx.scene.control.Label;
  27. import javafx.scene.control.RadioButton;
  28. import javafx.scene.control.TextField;
  29. import javafx.scene.layout.GridPane;
  30. /**
  31. * manages the settings of the program also stores the constants
  32. *
  33. * @author Jascha Bohne
  34. * @version 1.0.0.0
  35. */
  36. public final class OptionsManager {
  37. // SETTINGS
  38. /** The Default Weight for all new Edges. */
  39. private static double defaultWeight = 0;
  40. /** Flag whether to show the weight labels on Edges. */
  41. private static boolean showWeight = true;
  42. /** The default latitude of nodes (defaults to Piloty Building) */
  43. private static double defaultLat = 49.877559;
  44. /** The default longitude of nodes (defaults to Piloty Building) */
  45. private static double defaultLong = 8.654546;
  46. /** If the default coordinates have been changed */
  47. private static boolean coordinatesChanged = false;
  48. /**
  49. * the default device size
  50. */
  51. private static int defaultDeviceSize = 50;
  52. /**
  53. * the default thickness of edges
  54. */
  55. private static int defaultEdgeThickness = 2;
  56. /**
  57. * default Color theme in symbol layer
  58. */
  59. private static String defaultStandardEdgeColor = "Black";
  60. private static String defaultClickedEdgeColor = "Red";
  61. private static String defaultPlacementColor = "Blue";
  62. private static String defaultStandardDeviceColor = "Black";
  63. private static String defaultClickedDeviceColor = "Red";
  64. /**
  65. * Private Constructor to prevent Instantiation.
  66. */
  67. private OptionsManager() {
  68. }
  69. /**
  70. * opens a dialog that can be used to edit options
  71. */
  72. public static void openOptionsDialog() {
  73. // Create new Dialog
  74. Dialog<ArrayList<String>> addPropDialog = new Dialog<>();
  75. addPropDialog.setTitle("Preferences");
  76. ButtonType addButtonType = new ButtonType("save & exit", ButtonData.OK_DONE);
  77. addPropDialog.getDialogPane().getButtonTypes().addAll(addButtonType, ButtonType.CANCEL);
  78. // create grid
  79. GridPane grid = new GridPane();
  80. grid.setHgap(10);
  81. grid.setVgap(10);
  82. grid.setPadding(new Insets(20, 150, 10, 10));
  83. // create dialog elements
  84. TextField defaultWeightField = new TextField(Double.toString(defaultWeight));
  85. RadioButton showWeightButton = new RadioButton();
  86. showWeightButton.setSelected(showWeight);
  87. ChoiceBox<String> nodeGraphicsSelector = new ChoiceBox<String>();
  88. if (StylesheetManager.getAllNodeGraphics() != null) {
  89. ObservableList<String> styles = FXCollections
  90. .observableArrayList(Arrays.asList(StylesheetManager.getAllNodeGraphics()));
  91. nodeGraphicsSelector.setItems(FXCollections.observableArrayList(styles));
  92. nodeGraphicsSelector.getSelectionModel().select(StylesheetManager.getNodeGraphics());
  93. }
  94. ChoiceBox<Integer> loggingLevelSelector = new ChoiceBox<Integer>(FXCollections.observableArrayList(1, 2, 3));
  95. loggingLevelSelector.getSelectionModel().select(new Integer(Debug.getLogLevel()));
  96. TextField defaultLatitudeField = new TextField(Double.toString(defaultLat));
  97. TextField defaultLongitudeField = new TextField(Double.toString(defaultLong));
  98. // Symbol Layer options
  99. ChoiceBox<String> edgeSelectedColorSymbolLayer = new ChoiceBox<String>();
  100. edgeSelectedColorSymbolLayer.setItems(
  101. FXCollections.observableArrayList("Red", "Black", "Blue", "Green", "Yellow", "Orange", "Gray"));
  102. edgeSelectedColorSymbolLayer.getSelectionModel().select(EdgePainter.getClickedColor());
  103. ChoiceBox<String> edgePlacementColorSymbolLayer = new ChoiceBox<String>();
  104. edgePlacementColorSymbolLayer.setItems(
  105. FXCollections.observableArrayList("Blue", "Black", "Red", "Green", "Yellow", "Orange", "Gray"));
  106. edgePlacementColorSymbolLayer.getSelectionModel().select(EdgePainter.getPlacementColor());
  107. ChoiceBox<String> edgeStandardColorSymbolLayer = new ChoiceBox<String>();
  108. edgeStandardColorSymbolLayer.setItems(
  109. FXCollections.observableArrayList("Black", "Red", "Blue", "Green", "Yellow", "Orange", "Gray"));
  110. edgeStandardColorSymbolLayer.getSelectionModel().select(EdgePainter.getStandardColor());
  111. ChoiceBox<String> waypointStandardColorSymbolLayer = new ChoiceBox<String>();
  112. waypointStandardColorSymbolLayer.setItems(
  113. FXCollections.observableArrayList("Black", "Red", "Blue", "Green", "Yellow", "Orange", "Gray"));
  114. waypointStandardColorSymbolLayer.getSelectionModel().select(CustomWaypointRenderer.getStandardColor());
  115. ChoiceBox<String> waypointSelectedColorSymbolLayer = new ChoiceBox<String>();
  116. waypointSelectedColorSymbolLayer.setItems(
  117. FXCollections.observableArrayList("Red", "Black", "Blue", "Green", "Yellow", "Orange", "Gray"));
  118. waypointSelectedColorSymbolLayer.getSelectionModel().select(CustomWaypointRenderer.getClickedColor());
  119. TextField edgeThickness = new TextField(Integer.toString(EdgePainter.getThickness()));
  120. TextField deviceSize = new TextField(Integer.toString(CustomWaypointRenderer.getDeviceSize()));
  121. Button resetButton = new Button("Reset");
  122. resetButton.setOnAction((event) -> {
  123. defaultValues();
  124. defaultWeightField.setText(Double.toString(defaultWeight));
  125. defaultLatitudeField.setText(Double.toString(defaultLat));
  126. defaultLongitudeField.setText(Double.toString(defaultLong));
  127. loggingLevelSelector.getSelectionModel().select(1);
  128. showWeightButton.setSelected(showWeight);
  129. edgeThickness.setText(Integer.toString(defaultEdgeThickness));
  130. deviceSize.setText(Integer.toString(defaultDeviceSize));
  131. edgeStandardColorSymbolLayer.getSelectionModel().select(defaultStandardEdgeColor);
  132. edgePlacementColorSymbolLayer.getSelectionModel().select(defaultPlacementColor);
  133. edgeSelectedColorSymbolLayer.getSelectionModel().select(defaultClickedEdgeColor);
  134. waypointStandardColorSymbolLayer.getSelectionModel().select(defaultStandardDeviceColor);
  135. waypointSelectedColorSymbolLayer.getSelectionModel().select(defaultClickedDeviceColor);
  136. });
  137. // position elements on grid
  138. int row = 0;
  139. grid.add(new Label("Default weight of edges:"), 0, row);
  140. grid.add(defaultWeightField, 1, row);
  141. row++;
  142. grid.add(new Label("Show weight of edges in the graph viewer"), 0, row);
  143. grid.add(showWeightButton, 1, row);
  144. row++;
  145. if (StylesheetManager.getAllNodeGraphics().length > 1) {
  146. grid.add(new Label("Node display:"), 0, row);
  147. grid.add(nodeGraphicsSelector, 1, row);
  148. row++;
  149. }
  150. grid.add(new Label("Default Coordinates of Nodes without Coordinates" + (coordinatesChanged ? ":" : ".")), 0,
  151. row);
  152. grid.add(new Label(coordinatesChanged ? "" : "At the Moment set to Piloty building TU Darmstadt:"), 1, row);
  153. row++;
  154. grid.add(new Label("Latitude:"), 0, row);
  155. grid.add(defaultLatitudeField, 1, row);
  156. row++;
  157. grid.add(new Label("Longitude:"), 0, row);
  158. grid.add(defaultLongitudeField, 1, row);
  159. row++;
  160. // symbol layer stuff
  161. grid.add(new Label(""), 1, row);
  162. row++;
  163. grid.add(new Label("Symbol-Layer Options"), 1, row);
  164. row++;
  165. grid.add(new Label("Device Size (int) {40 < X < 250}:"), 0, row);
  166. grid.add(deviceSize, 1, row);
  167. row++;
  168. grid.add(new Label("Edge thickness (int) {1 < X < 10}:"), 0, row);
  169. grid.add(edgeThickness, 1, row);
  170. row++;
  171. grid.add(new Label(""), 1, row);
  172. row++;
  173. grid.add(new Label("Edge Colors"), 1, row);
  174. row++;
  175. grid.add(new Label("Standard Edge Color"), 0, row);
  176. grid.add(edgeStandardColorSymbolLayer, 1, row);
  177. row++;
  178. grid.add(new Label("Clicked Edge Color"), 0, row);
  179. grid.add(edgeSelectedColorSymbolLayer, 1, row);
  180. row++;
  181. grid.add(new Label("Placement Edge Color"), 0, row);
  182. grid.add(edgePlacementColorSymbolLayer, 1, row);
  183. row++;
  184. grid.add(new Label("Device Colors"), 1, row);
  185. row++;
  186. grid.add(new Label("Standard Device Color"), 0, row);
  187. grid.add(waypointStandardColorSymbolLayer, 1, row);
  188. row++;
  189. grid.add(new Label("Clicked Device Color"), 0, row);
  190. grid.add(waypointSelectedColorSymbolLayer, 1, row);
  191. row++;
  192. grid.add(new Label(""), 1, row);
  193. row++;
  194. grid.add(new Label("Logging level"), 0, row);
  195. grid.add(loggingLevelSelector, 1, row);
  196. row++;
  197. grid.add(new Label(""), 1, row);
  198. row++;
  199. grid.add(resetButton, 1, row);
  200. // Alert window -> when problems with input
  201. Alert alert = new Alert(AlertType.WARNING);
  202. alert.setTitle("Warning");
  203. alert.setHeaderText("Preferences-Type Alert");
  204. alert.setContentText(
  205. "Some Input doesnt fit the Convention (INT for Smybol Layer, Double for Default GeoPosition)");
  206. // set dialog
  207. addPropDialog.getDialogPane().setContent(grid);
  208. Platform.runLater(() -> defaultWeightField.requestFocus());
  209. // get new property values
  210. addPropDialog.setResultConverter(dialogButton -> {
  211. if (dialogButton == addButtonType) {
  212. try {
  213. defaultWeight = Double.parseDouble(defaultWeightField.getText());
  214. if (defaultLat != Double.parseDouble(defaultLatitudeField.getText())
  215. || defaultLong != Double.parseDouble(defaultLongitudeField.getText())) {
  216. coordinatesChanged = true;
  217. defaultLat = Double.parseDouble(defaultLatitudeField.getText());
  218. defaultLong = Double.parseDouble(defaultLongitudeField.getText());
  219. }
  220. // symbol layer edge thickness and device size
  221. int edgeTh = Integer.parseInt(edgeThickness.getText());
  222. int deviceSi = Integer.parseInt(deviceSize.getText());
  223. // if Textfield values are not in pre defined range
  224. if (edgeTh < 1 || edgeTh > 10 || deviceSi < 40 || deviceSi > 250) {
  225. throw new NumberFormatException();
  226. }
  227. if (edgeTh != EdgePainter.getThickness()) {
  228. EdgePainter.setEdgeThickness(edgeTh);
  229. }
  230. // symbol layer waypoint size
  231. if (deviceSi != CustomWaypointRenderer.getDeviceSize()) {
  232. CustomWaypointRenderer.setScaleSize(deviceSi);
  233. MapViewFunctions.resetImageMap();
  234. MapViewFunctions.initializeWaypointImages();
  235. }
  236. } catch (NumberFormatException e) {
  237. // some inputs were wrong -> show Alert message
  238. alert.showAndWait();
  239. openOptionsDialog();
  240. return null;
  241. }
  242. showWeight = showWeightButton.isSelected();
  243. StylesheetManager.adjustNodeGraphics(nodeGraphicsSelector.getValue());
  244. // color types of waypoints and edges
  245. EdgePainter.setColor(edgeStandardColorSymbolLayer.getValue(), edgePlacementColorSymbolLayer.getValue(),
  246. edgeSelectedColorSymbolLayer.getValue());
  247. CustomWaypointRenderer.setColor(waypointStandardColorSymbolLayer.getValue(),
  248. waypointSelectedColorSymbolLayer.getValue());
  249. WorldView.internMapViewer.repaint();
  250. Debug.setLogLevel(loggingLevelSelector.getValue());
  251. return null;
  252. } else
  253. return null;
  254. });
  255. addPropDialog.showAndWait();
  256. }
  257. /**
  258. * @return the defaultLat
  259. */
  260. public static double getDefaultLat() {
  261. return defaultLat;
  262. }
  263. /**
  264. * @return the defaultLong
  265. */
  266. public static double getDefaultLong() {
  267. return defaultLong;
  268. }
  269. /**
  270. * Returns the default weight for new Edges.
  271. *
  272. * @return the default weight
  273. */
  274. public static double getDefaultWeight() {
  275. return defaultWeight;
  276. }
  277. /**
  278. * Sets the default weight for new Edges.
  279. *
  280. * @param defaultWeight
  281. * the defaultWeight to set
  282. */
  283. public static void setDefaultWeight(int defaultWeight) {
  284. OptionsManager.defaultWeight = defaultWeight;
  285. }
  286. /**
  287. * Returns whether Edge weight should be displayed as labels.
  288. *
  289. * @return true if weight should be shown, false otherwise
  290. */
  291. public static boolean isWeightShown() {
  292. return showWeight;
  293. }
  294. /**
  295. * Sets the Flag whether Edge weight should be displayed as labels.
  296. *
  297. * @param showWeight
  298. * the showWeight to set
  299. */
  300. public static void setShowWeight(boolean showWeight) {
  301. OptionsManager.showWeight = showWeight;
  302. }
  303. public static void load() {
  304. try {
  305. BufferedReader read = new BufferedReader(new FileReader("settings.properties"));
  306. defaultWeight = Double.parseDouble(read.readLine());
  307. showWeight = Boolean.parseBoolean(read.readLine());
  308. defaultLat = Double.parseDouble(read.readLine());
  309. defaultLong = Double.parseDouble(read.readLine());
  310. coordinatesChanged = Boolean.parseBoolean(read.readLine());
  311. CustomWaypointRenderer.setScaleSize(Integer.parseInt(read.readLine()));
  312. EdgePainter.setEdgeThickness(Integer.parseInt(read.readLine()));
  313. String standard = read.readLine();
  314. String selected = read.readLine();
  315. String placement = read.readLine();
  316. EdgePainter.setColor(standard, placement, selected);
  317. standard = read.readLine();
  318. selected = read.readLine();
  319. CustomWaypointRenderer.setColor(standard, selected);
  320. Debug.setLogLevel(Integer.parseInt(read.readLine()));
  321. read.close();
  322. } catch (IOException e) {
  323. defaultValues();
  324. }
  325. }
  326. public static void save() {
  327. try {
  328. BufferedWriter write = new BufferedWriter(new FileWriter("settings.properties"));
  329. write.write(defaultWeight + "\n" + showWeight + "\n" + defaultLat + "\n" + defaultLong + "\n"
  330. + coordinatesChanged + "\n" + CustomWaypointRenderer.getDeviceSize() + "\n" + EdgePainter.getThickness() + "\n"
  331. + EdgePainter.getStandardColor() + "\n" + EdgePainter.getClickedColor() + "\n" + EdgePainter.getPlacementColor() + "\n"
  332. + CustomWaypointRenderer.getStandardColor() + "\n" + CustomWaypointRenderer.getClickedColor() + "\n" + Debug.getLogLevel());
  333. write.close();
  334. } catch (IOException e) {
  335. }
  336. }
  337. protected static void defaultValues() {
  338. defaultWeight = 0.0;
  339. showWeight = true;
  340. defaultLat = 49.877559;
  341. defaultLong = 8.654546;
  342. coordinatesChanged = false;
  343. defaultDeviceSize = 50;
  344. defaultEdgeThickness = 2;
  345. defaultStandardEdgeColor = "Black";
  346. defaultClickedEdgeColor = "Red";
  347. defaultPlacementColor = "Blue";
  348. defaultStandardDeviceColor = "Black";
  349. defaultClickedDeviceColor = "Red";
  350. Debug.setLogLevel(2);
  351. }
  352. }