From 0480c720e7e94ac0fb6111aaeea580bb9ea1b6de Mon Sep 17 00:00:00 2001
From: Jonas Smedegaard <dr@jones.dk>
Date: Wed, 30 Apr 2025 12:27:00 +0200
Subject: tie structural section to visual column in model class GUI

---
 .../com/example/portfolio2/GUI.java                | 37 +++++++++++++++-
 .../com/example/portfolio2/Window.java             | 50 +++++++++++++---------
 2 files changed, 64 insertions(+), 23 deletions(-)

(limited to 'src')

diff --git a/src/com.example.portfolio2/com/example/portfolio2/GUI.java b/src/com.example.portfolio2/com/example/portfolio2/GUI.java
index e1f8fb3..8135ecb 100644
--- a/src/com.example.portfolio2/com/example/portfolio2/GUI.java
+++ b/src/com.example.portfolio2/com/example/portfolio2/GUI.java
@@ -12,6 +12,39 @@ public class GUI extends UI {
 	// (declared explicitly only to silence javadoc)
 	public GUI() { }
 
-	// TODO: extend with sections specific to graphical interface,
-	// e.g. widgets like statusbar or menu.
+	/// structural sections of user interface
+	public enum Section {
+
+		/// main programme
+		PROGRAM("Program", 0),
+
+		/// first subject module
+		SUBJECT1("Subject 1", 1),
+
+		/// second subject module
+		SUBJECT2("Subject 2", 2),
+
+		/// elective courses
+		ELECTIVE("Elective", 3);
+
+		/// text label
+		public final String label;
+
+		/// column position
+		public final int column;
+
+		/// instantiation
+		///
+		/// @param label   text label
+		/// @param column  column position
+		private Section(String label, int column) {
+			this.label = label;
+			this.column = column;
+		}
+	}
+
+/*	public static UI.Section asUISection () {
+		return UI.Section.valueOf(this);
+	}
+*/
 }
diff --git a/src/com.example.portfolio2/com/example/portfolio2/Window.java b/src/com.example.portfolio2/com/example/portfolio2/Window.java
index 36be369..93d522b 100644
--- a/src/com.example.portfolio2/com/example/portfolio2/Window.java
+++ b/src/com.example.portfolio2/com/example/portfolio2/Window.java
@@ -49,7 +49,9 @@ public final class Window extends Application {
 	private Database store = new Database();
 
 	/// UI model
-	private UI ui = new GUI();
+	///
+	/// Must be subclass GUI to cover columns.
+	private GUI ui = new GUI();
 
 	/// Application controller
 	private Controller con = new Controller(store, ui, this);
@@ -61,10 +63,10 @@ public final class Window extends Application {
 
 		// define list of columns based on their names
 		List<ActivityColumn> columns = List.of(
-			new ActivityColumn(UI.Section.PROGRAM),
-			new ActivityColumn(UI.Section.SUBJECT1),
-			new ActivityColumn(UI.Section.SUBJECT2),
-			new ActivityColumn(UI.Section.ELECTIVE)
+			new ActivityColumn(GUI.Section.PROGRAM),
+			new ActivityColumn(GUI.Section.SUBJECT1),
+			new ActivityColumn(GUI.Section.SUBJECT2),
+			new ActivityColumn(GUI.Section.ELECTIVE)
 		);
 
 		// define button functionality for each activity column
@@ -90,7 +92,7 @@ public final class Window extends Application {
 
 			// handle each category box
 			switch (col.section) {
-			  case UI.Section.PROGRAM -> {
+			  case GUI.Section.PROGRAM -> {
 				col.categoryCombo.getItems().addAll(
 					"HumTek", "NatBach");
 				col.categoryCombo.setOnAction(event -> {
@@ -101,23 +103,24 @@ public final class Window extends Application {
 				});
 			}
 			  // TODO: use the list for filling the box
-			  case UI.Section.SUBJECT1 -> {
+			  case GUI.Section.SUBJECT1 -> {
 				col.categoryCombo.getItems().addAll(
 					"Computer Science",
 					"Informatik",
 					"Astrology");
 				col.categoryCombo.setOnAction(event -> {
 					con.onSubjectModuleSelected(
-						col.categoryCombo,
-						columns.get(2)
-							.categoryCombo);
+					  col.categoryCombo,
+					  columns.get(
+					    GUI.Section.SUBJECT2.column)
+					    .categoryCombo);
 					con.onCategorySelected(
 					  col.categoryCombo.getValue(),
 					  col.activitySelect,
 					  col.area);
 				});
 			}
-			  case UI.Section.SUBJECT2 -> {
+			  case GUI.Section.SUBJECT2 -> {
 				col.categoryCombo.getItems().addAll(
 					"Computer Science",
 					"Informatik",
@@ -125,16 +128,17 @@ public final class Window extends Application {
 				// TODO: figure out a better way...
 				col.categoryCombo.setOnAction(event -> {
 					con.onSubjectModuleSelected(
-						col.categoryCombo,
-						columns.get(1)
-							.categoryCombo);
+					  col.categoryCombo,
+					  columns.get(
+					    GUI.Section.SUBJECT1.column)
+					    .categoryCombo);
 					con.onCategorySelected(
 					  col.categoryCombo.getValue(),
 					  col.activitySelect,
 					  col.area);
 				});
 			}
-			  case UI.Section.ELECTIVE -> {
+			  case GUI.Section.ELECTIVE -> {
 
 				// hide useless box
 				col.categoryCombo.setVisible(false);
@@ -146,10 +150,14 @@ public final class Window extends Application {
 
 		// define HBox and scene for columns
 		HBox root = new HBox(
-			columns.get(0).asVBox(),
-			columns.get(1).asVBox(),
-			columns.get(2).asVBox(),
-			columns.get(3).asVBox());
+			columns.get(GUI.Section.PROGRAM.column)
+				.asVBox(),
+			columns.get(GUI.Section.SUBJECT1.column)
+				.asVBox(),
+			columns.get(GUI.Section.SUBJECT2.column)
+				.asVBox(),
+			columns.get(GUI.Section.ELECTIVE.column)
+				.asVBox());
 		Scene scene = new Scene(
 			root, WINDOW_WIDTH, WINDOW_HEIGHT);
 		stage.setTitle(
@@ -174,7 +182,7 @@ public final class Window extends Application {
 	/// @param area            description of chosen activities
 	/// @param ectsLabel       text to display ECTS points
 	private record ActivityColumn(
-		UI.Section section,
+		GUI.Section section,
 		Label nameLabel,
 		ComboBox<String> categoryCombo,
 		ComboBox<String> activitySelect,
@@ -185,7 +193,7 @@ public final class Window extends Application {
 		/// column of activities
 		///
 		/// @param section  structural section for column
-		public ActivityColumn(UI.Section section) {
+		public ActivityColumn(GUI.Section section) {
 			this(
 				section,
 				new Label(section.label),
-- 
cgit v1.2.3