11package de .doubleslash .keeptime ;
22
33import java .io .IOException ;
4+ import java .io .PrintWriter ;
5+ import java .io .StringWriter ;
46import java .time .LocalDate ;
57import java .util .List ;
68import java .util .Optional ;
2729import javafx .fxml .FXMLLoader ;
2830import javafx .scene .Parent ;
2931import javafx .scene .Scene ;
32+ import javafx .scene .control .Alert ;
33+ import javafx .scene .control .Alert .AlertType ;
34+ import javafx .scene .control .Label ;
35+ import javafx .scene .control .TextArea ;
36+ import javafx .scene .layout .GridPane ;
3037import javafx .scene .layout .Pane ;
38+ import javafx .scene .layout .Priority ;
3139import javafx .scene .paint .Color ;
3240import javafx .stage .Stage ;
3341import javafx .stage .StageStyle ;
@@ -64,37 +72,49 @@ public void init() throws Exception {
6472 }
6573
6674 @ Override
67- public void start (final Stage primaryStage ) throws Exception {
75+ public void start (final Stage primaryStage ) {
76+ LOG .info ("Initialising the UI" );
77+ try {
78+ initUI (primaryStage );
79+ LOG .info ("UI successfully initialised." );
80+ } catch (final Exception e ) {
81+ LOG .error ("There was an error while initialising the UI" , e );
6882
69- LOG .debug ("Reading configuration" );
83+ final Alert alert = new Alert (AlertType .ERROR );
84+ alert .setTitle ("Error" );
85+ alert .setHeaderText ("Could not start application" );
86+ alert .setContentText ("Please send the error with your logs folder to a developer" );
7087
71- final List <Settings > settingsList = model .settingsRepository .findAll ();
72- final Settings settings ;
73- if (settingsList .isEmpty ()) {
74- settings = new Settings ();
75- settings .setTaskBarColor (model .taskBarColor .get ());
88+ final StringWriter sw = new StringWriter ();
89+ final PrintWriter pw = new PrintWriter (sw );
90+ e .printStackTrace (pw );
91+ final String exceptionText = sw .toString ();
7692
77- settings .setDefaultBackgroundColor (model .defaultBackgroundColor .get ());
78- settings .setDefaultFontColor (model .defaultFontColor .get ());
93+ final Label label = new Label ("The exception stacktrace was:" );
7994
80- settings .setHoverBackgroundColor (model .hoverBackgroundColor .get ());
81- settings .setHoverFontColor (model .hoverFontColor .get ());
82- settings .setUseHotkey (false );
83- settings .setDisplayProjectsRight (false );
84- settings .setHideProjectsOnMouseExit (true );
85- model .settingsRepository .save (settings );
86- } else {
87- settings = settingsList .get (0 );
95+ final TextArea textArea = new TextArea (exceptionText );
96+ textArea .setEditable (false );
97+ textArea .setWrapText (true );
98+
99+ textArea .setMaxWidth (Double .MAX_VALUE );
100+ textArea .setMaxHeight (Double .MAX_VALUE );
101+ GridPane .setVgrow (textArea , Priority .ALWAYS );
102+ GridPane .setHgrow (textArea , Priority .ALWAYS );
103+
104+ final GridPane expContent = new GridPane ();
105+ expContent .setMaxWidth (Double .MAX_VALUE );
106+ expContent .add (label , 0 , 0 );
107+ expContent .add (textArea , 0 , 1 );
108+
109+ alert .getDialogPane ().setExpandableContent (expContent );
110+ alert .showAndWait ();
111+ System .exit (1 );
88112 }
113+ }
89114
90- model .defaultBackgroundColor .set (settings .getDefaultBackgroundColor ());
91- model .defaultFontColor .set (settings .getDefaultFontColor ());
92- model .hoverBackgroundColor .set (settings .getHoverBackgroundColor ());
93- model .hoverFontColor .set (settings .getHoverFontColor ());
94- model .taskBarColor .set (settings .getTaskBarColor ());
95- model .useHotkey .set (settings .isUseHotkey ());
96- model .displayProjectsRight .set (settings .isDisplayProjectsRight ());
97- model .hideProjectsOnMouseExit .set (settings .isHideProjectsOnMouseExit ());
115+ private void initUI (final Stage primaryStage ) throws Exception {
116+
117+ readSettings ();
98118
99119 final List <Work > todaysWorkItems = model .workRepository .findByCreationDate (LocalDate .now ());
100120 LOG .info ("Found {} past work items" , todaysWorkItems .size ());
@@ -114,7 +134,7 @@ public void start(final Stage primaryStage) throws Exception {
114134 .addAll (model .allProjects .stream ().filter (Project ::isEnabled ).collect (Collectors .toList ()));
115135
116136 // set default project
117- final Optional <Project > findAny = projects .stream ().filter (p -> p . isDefault () ).findAny ();
137+ final Optional <Project > findAny = projects .stream ().filter (Project :: isDefault ).findAny ();
118138 if (findAny .isPresent ()) {
119139 model .idleProject = findAny .get ();
120140 LOG .debug ("Using project '{}' as default project." , model .idleProject );
@@ -125,29 +145,52 @@ public void start(final Stage primaryStage) throws Exception {
125145 globalScreenListener .shutdown (); // deregister, as this will keep app running
126146 });
127147
128- try {
129- initialiseUI (primaryStage );
130- } catch (final Exception e ) {
131- e .printStackTrace ();
132- }
148+ initialiseUI (primaryStage );
149+ initialisePopupUI (primaryStage );
150+ }
133151
134- try {
135- initialisePopupUI (primaryStage );
136- } catch (final Exception e ) {
137- e .printStackTrace ();
152+ private void readSettings () {
153+ LOG .debug ("Reading configuration" );
154+
155+ final List <Settings > settingsList = model .settingsRepository .findAll ();
156+ final Settings settings ;
157+ if (settingsList .isEmpty ()) {
158+ settings = new Settings ();
159+ settings .setTaskBarColor (model .taskBarColor .get ());
160+
161+ settings .setDefaultBackgroundColor (model .defaultBackgroundColor .get ());
162+ settings .setDefaultFontColor (model .defaultFontColor .get ());
163+
164+ settings .setHoverBackgroundColor (model .hoverBackgroundColor .get ());
165+ settings .setHoverFontColor (model .hoverFontColor .get ());
166+ settings .setUseHotkey (false );
167+ settings .setDisplayProjectsRight (false );
168+ settings .setHideProjectsOnMouseExit (true );
169+ model .settingsRepository .save (settings );
170+ } else {
171+ settings = settingsList .get (0 );
138172 }
173+
174+ model .defaultBackgroundColor .set (settings .getDefaultBackgroundColor ());
175+ model .defaultFontColor .set (settings .getDefaultFontColor ());
176+ model .hoverBackgroundColor .set (settings .getHoverBackgroundColor ());
177+ model .hoverFontColor .set (settings .getHoverFontColor ());
178+ model .taskBarColor .set (settings .getTaskBarColor ());
179+ model .useHotkey .set (settings .isUseHotkey ());
180+ model .displayProjectsRight .set (settings .isDisplayProjectsRight ());
181+ model .hideProjectsOnMouseExit .set (settings .isHideProjectsOnMouseExit ());
139182 }
140183
141184 private void initialisePopupUI (final Stage primaryStage ) throws IOException {
142- // TODO register only if it is enabled
185+ LOG .debug ("Initialising popup UI." );
186+
143187 globalScreenListener = new GlobalScreenListener ();
144- // TODO stop and close stage when main stage is shutdown
188+ // stop and close stage when main stage is shutdown
145189 model .useHotkey .addListener ((a , b , newValue ) -> {
146190 globalScreenListener .register (newValue );
147191 });
148192 globalScreenListener .register (model .useHotkey .get ());
149193
150- // Platform.setImplicitExit(false); // TODO maybe not needed as other view will be available
151194 popupViewStage = new Stage ();
152195 popupViewStage .initOwner (primaryStage );
153196 // Load root layout from fxml file.
@@ -168,44 +211,39 @@ private void initialisePopupUI(final Stage primaryStage) throws IOException {
168211 globalScreenListener .setViewController (viewControllerPopupController );
169212 }
170213
171- private void initialiseUI (final Stage primaryStage ) {
172- try {
173- Pane mainPane ;
174-
175- // Load root layout from fxml file.
176- final FXMLLoader loader = new FXMLLoader ();
177- loader .setLocation (Resources .getResource (RESOURCE .FXML_VIEW_LAYOUT ));
178- loader .setControllerFactory (springContext ::getBean );
179- mainPane = loader .load ();
180- primaryStage .initStyle (StageStyle .TRANSPARENT );
181- // Show the scene containing the root layout.
182- final Scene mainScene = new Scene (mainPane , Color .TRANSPARENT );
183-
184- // Image(Resources.getResource(RESOURCE.ICON_MAIN).toString()));
185-
186- primaryStage .setTitle ("KeepTime" );
187- primaryStage .setScene (mainScene );
188- primaryStage .setAlwaysOnTop (true );
189- primaryStage .setResizable (false );
190-
191- primaryStage .setOnCloseRequest (new EventHandler <WindowEvent >() {
192- @ Override
193- public void handle (final WindowEvent event ) {
194- LOG .info ("On close request" );
195- }
196- });
197-
198- viewController = loader .getController ();
199- // Give the controller access to the main app.
200- viewController .setStage (primaryStage );
201- viewController .setController (controller , model );
202-
203- primaryStage .show ();
214+ private void initialiseUI (final Stage primaryStage ) throws IOException {
215+ LOG .debug ("Initialising main UI." );
216+ Pane mainPane ;
204217
205- } catch (final Exception e ) {
206- LOG .error ("Error: " + e .toString (), e );
207- e .printStackTrace ();
208- }
218+ // Load root layout from fxml file.
219+ final FXMLLoader loader = new FXMLLoader ();
220+ loader .setLocation (Resources .getResource (RESOURCE .FXML_VIEW_LAYOUT ));
221+ loader .setControllerFactory (springContext ::getBean );
222+ mainPane = loader .load ();
223+ primaryStage .initStyle (StageStyle .TRANSPARENT );
224+ // Show the scene containing the root layout.
225+ final Scene mainScene = new Scene (mainPane , Color .TRANSPARENT );
226+
227+ // Image(Resources.getResource(RESOURCE.ICON_MAIN).toString()));
228+
229+ primaryStage .setTitle ("KeepTime" );
230+ primaryStage .setScene (mainScene );
231+ primaryStage .setAlwaysOnTop (true );
232+ primaryStage .setResizable (false );
233+
234+ primaryStage .setOnCloseRequest (new EventHandler <WindowEvent >() {
235+ @ Override
236+ public void handle (final WindowEvent event ) {
237+ LOG .info ("On close request" );
238+ }
239+ });
240+
241+ viewController = loader .getController ();
242+ // Give the controller access to the main app.
243+ viewController .setStage (primaryStage );
244+ viewController .setController (controller , model );
245+
246+ primaryStage .show ();
209247 }
210248
211249 @ Override
0 commit comments