commit 0550a1465b68f74198829c56804dbe78293eb0c9 Author: Daniel Date: Sun Oct 8 16:37:48 2023 +0300 Initial commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..8a0a60d --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +# Project exclude paths +/.gradle/ +/build/ +/build/classes/java/main/ \ No newline at end of file diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..13566b8 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..b589d56 --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml new file mode 100644 index 0000000..39ec4f5 --- /dev/null +++ b/.idea/gradle.xml @@ -0,0 +1,16 @@ + + + + + + \ No newline at end of file diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml new file mode 100644 index 0000000..fdc392f --- /dev/null +++ b/.idea/jarRepositories.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..e955f68 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/build.gradle.kts b/build.gradle.kts new file mode 100644 index 0000000..013870b --- /dev/null +++ b/build.gradle.kts @@ -0,0 +1,19 @@ +plugins { + id("java") +} + +group = "org.lumijiez" +version = "1.0-SNAPSHOT" + +repositories { + mavenCentral() +} + +dependencies { + testImplementation(platform("org.junit:junit-bom:5.9.1")) + testImplementation("org.junit.jupiter:junit-jupiter") +} + +tasks.test { + useJUnitPlatform() +} \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000..033e24c Binary files /dev/null and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..62f495d --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,7 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.2-bin.zip +networkTimeout=10000 +validateDistributionUrl=true +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew new file mode 100644 index 0000000..fcb6fca --- /dev/null +++ b/gradlew @@ -0,0 +1,248 @@ +#!/bin/sh + +# +# Copyright © 2015-2021 the original authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# +############################################################################## + +# Attempt to set APP_HOME + +# Resolve links: $0 may be a link +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +# This is normally unused +# shellcheck disable=SC2034 +APP_BASE_NAME=${0##*/} +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD=maximum + +warn () { + echo "$*" +} >&2 + +die () { + echo + echo "$*" + echo + exit 1 +} >&2 + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD=$JAVA_HOME/jre/sh/java + else + JAVACMD=$JAVA_HOME/bin/java + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD=java + if ! command -v java >/dev/null 2>&1 + then + die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC3045 + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC3045 + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Collect all arguments for the java command; +# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of +# shell script including quotes and variable substitutions, so put them in +# double quotes to make sure that they get re-expanded; and +# * put everything else in single quotes, so that it's not re-expanded. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" +fi + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 0000000..93e3f59 --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,92 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%"=="" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if %ERRORLEVEL% equ 0 goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if %ERRORLEVEL% equ 0 goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/manager.ser b/manager.ser new file mode 100644 index 0000000..6c99585 Binary files /dev/null and b/manager.ser differ diff --git a/src/main/java/org/lumijiez/Main.java b/src/main/java/org/lumijiez/Main.java new file mode 100644 index 0000000..7f03aa2 --- /dev/null +++ b/src/main/java/org/lumijiez/Main.java @@ -0,0 +1,22 @@ +package org.lumijiez; + +import org.lumijiez.gui.StudentManagementGUI; + +import javax.swing.*; +import java.awt.*; + +public class Main { + public static void main(String[] args) { + + // Sets a Windows "Look and Feel", or at least tries to + try { + UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel"); + } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { + System.err.println("Windows LAF not found!"); + } + + // Application entry point + EventQueue.invokeLater(() -> new StudentManagementGUI().setVisible(true)); + } +} + diff --git a/src/main/java/org/lumijiez/base/Faculty.java b/src/main/java/org/lumijiez/base/Faculty.java new file mode 100644 index 0000000..7b311b3 --- /dev/null +++ b/src/main/java/org/lumijiez/base/Faculty.java @@ -0,0 +1,57 @@ +package org.lumijiez.base; + +import org.lumijiez.enums.StudyField; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; + +public class Faculty implements Serializable { + private String name; + private String abbreviation; + private StudyField field; + private final List groups = new ArrayList<>(); + public Faculty(String name, String abbreviation, StudyField field) { + this.name = name; + this.abbreviation = abbreviation; + this.field = field; + } + + public void addGroup(Group group) { + groups.add(group); + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getAbbreviation() { + return abbreviation; + } + + public void setAbbreviation(String abbreviation) { + this.abbreviation = abbreviation; + } + + public List getGroups() { + return groups; + } + + public StudyField getField() { + return field; + } + + public void setField(StudyField field) { + this.field = field; + } + + @Override + public String toString() { + return getName(); + } + +} diff --git a/src/main/java/org/lumijiez/base/Grade.java b/src/main/java/org/lumijiez/base/Grade.java new file mode 100644 index 0000000..3ffa4fc --- /dev/null +++ b/src/main/java/org/lumijiez/base/Grade.java @@ -0,0 +1,24 @@ +package org.lumijiez.base; + +import org.lumijiez.enums.Subjects; + +import java.io.Serializable; + +public class Grade implements Serializable { + private final Subjects subject; + private final int grade; + + public Grade(Subjects subject, int grade) { + this.subject = subject; + this.grade = grade; + } + + public Subjects getSubject() { + return subject; + } + + public int getGrade() { + return grade; + } + +} diff --git a/src/main/java/org/lumijiez/base/Group.java b/src/main/java/org/lumijiez/base/Group.java new file mode 100644 index 0000000..53cb51e --- /dev/null +++ b/src/main/java/org/lumijiez/base/Group.java @@ -0,0 +1,50 @@ +package org.lumijiez.base; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; + +public class Group implements Serializable { + + private String name; + private Faculty faculty; + private final List students = new ArrayList<>(); + + public Group(String name) { + this.name = name; + } + + public Faculty getFaculty() { + return faculty; + } + + public void setFaculty(Faculty faculty) { + this.faculty = faculty; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public void addStudent(Student st) { + students.add(st); + } + + public void deleteStudent(Student st) { + students.remove(st); + } + + public List getStudents() { + return students; + } + + @Override + public String toString() { + return name; + } + +} diff --git a/src/main/java/org/lumijiez/base/Student.java b/src/main/java/org/lumijiez/base/Student.java new file mode 100644 index 0000000..327ac0b --- /dev/null +++ b/src/main/java/org/lumijiez/base/Student.java @@ -0,0 +1,119 @@ +package org.lumijiez.base; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +public class Student implements Serializable { + + private String name; + private String surname; + private String fullname; + private String email; + private Date enrollmentDate; + private Date dateOfBirth; + private Faculty faculty; + private Group group; + private boolean graduated = false; + private final List grades = new ArrayList<>(); + + public Student(String name, String surname, String email, Group group, Faculty faculty, Date birth, Date enrol) { + this.name = name; + this.surname = surname; + this.fullname = name + " " + surname; + this.email = email; + this.group = group; + this.faculty = faculty; + this.dateOfBirth = birth; + this.enrollmentDate = enrol; + } + + public Faculty getFaculty() { + return faculty; + } + + public void setFaculty(Faculty faculty) { + this.faculty = faculty; + } + + public List getGrades() { + return grades; + } + + public void addGrade(Grade grade) { + grades.add(grade); + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getSurname() { + return surname; + } + + public void setSurname(String surname) { + this.surname = surname; + } + + public String getFullname() { + return fullname; + } + + public void setFullname(String fullname) { + this.fullname = fullname; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public Date getEnrollmentDate() { + return enrollmentDate; + } + + public void setEnrollmentDate(Date enrollmentDate) { + this.enrollmentDate = enrollmentDate; + } + + public Date getDateOfBirth() { + return dateOfBirth; + } + + public void setDateOfBirth(Date dateOfBirth) { + this.dateOfBirth = dateOfBirth; + } + + public Group getGroup() { + return group; + } + + public void setGroup(Group gr) { + this.group.deleteStudent(this); + this.group = gr; + gr.addStudent(this); + } + + public boolean isGraduated() { + return this.graduated; + } + + public void setGraduated(boolean graduated) { + this.graduated = graduated; + } + + @Override + public String toString() { + return fullname + " | " + group.getName() + " | " + faculty.getName(); + } + +} diff --git a/src/main/java/org/lumijiez/data/DataDeserializer.java b/src/main/java/org/lumijiez/data/DataDeserializer.java new file mode 100644 index 0000000..8bb8afc --- /dev/null +++ b/src/main/java/org/lumijiez/data/DataDeserializer.java @@ -0,0 +1,26 @@ +package org.lumijiez.data; + +import org.lumijiez.managers.Supervisor; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.ObjectInputStream; + +public class DataDeserializer { + public static Supervisor deserialize() { + File serializedFile = new File("manager.ser"); + Supervisor manager = new Supervisor(); + if (serializedFile.exists()) { + try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(serializedFile))) { + manager = (Supervisor) ois.readObject(); + System.out.println("Supervisor object deserialized successfully."); + } catch (ClassNotFoundException | IOException e) { + System.err.println(e.getMessage()); + } + } else { + System.out.println("Serialized file 'manager.ser' does not exist."); + } + return manager; + } +} diff --git a/src/main/java/org/lumijiez/data/DataSerializer.java b/src/main/java/org/lumijiez/data/DataSerializer.java new file mode 100644 index 0000000..16e9de6 --- /dev/null +++ b/src/main/java/org/lumijiez/data/DataSerializer.java @@ -0,0 +1,18 @@ +package org.lumijiez.data; + +import org.lumijiez.managers.Supervisor; + +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.ObjectOutputStream; + +public class DataSerializer { + public static void serialize(Supervisor manager) { + try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("manager.ser"))) { + oos.writeObject(manager); + System.out.println("Supervisor object serialized successfully."); + } catch (IOException e) { + System.err.println(e.getMessage()); + } + } +} diff --git a/src/main/java/org/lumijiez/data/graduate.txt b/src/main/java/org/lumijiez/data/graduate.txt new file mode 100644 index 0000000..024952f --- /dev/null +++ b/src/main/java/org/lumijiez/data/graduate.txt @@ -0,0 +1,69 @@ +name: Alice +surname: Johnson +email: alice.johnson@example.com +group: FAF-224 +faculty: FCEX +specialty: Mechanical Engineering + +name: David +surname: Smith +email: david.smith@example.com +group: FAF-221 +faculty: FCBT +specialty: Software Engineering + +name: Sarah +surname: Anderson +email: sarah.anderson@example.com +group: FAF-225 +faculty: FCNS +specialty: Food Technology + +name: Michael +surname: Williams +email: michael.williams@example.com +group: FAF-223 +faculty: FCGT +specialty: Urbanism and Architecture + +name: Emily +surname: Davis +email: emily.davis@example.com +group: FAF-222 +faculty: FCMP +specialty: Veterinary Medicine + +name: James +surname: Martinez +email: james.martinez@example.com +group: FAF-226 +faculty: FCOE +specialty: Mechanical Engineering + +name: Olivia +surname: Brown +email: olivia.brown@example.com +group: FAF-224 +faculty: FCTI +specialty: Software Engineering + +name: Ethan +surname: Taylor +email: ethan.taylor@example.com +group: FAF-222 +faculty: FCES +specialty: Food Technology + +name: Sophia +surname: Clark +email: sophia.clark@example.com +group: FAF-226 +faculty: FCPH +specialty: Urbanism and Architecture + +name: Daniel +surname: White +email: daniel.white@example.com +group: FAF-225 +faculty: FCAR +specialty: Veterinary Medicine \ No newline at end of file diff --git a/src/main/java/org/lumijiez/data/student.txt b/src/main/java/org/lumijiez/data/student.txt new file mode 100644 index 0000000..d0463fc --- /dev/null +++ b/src/main/java/org/lumijiez/data/student.txt @@ -0,0 +1,89 @@ +name: Alice +surname: Johnson +email: alice.johnson@example.com +group: FAF-224 +faculty: FCEX +birthdate: 1997-08-20 +enroldate: 2016-09-01 +specialty: Mechanical Engineering + +name: David +surname: Smith +email: david.smith@example.com +group: FAF-221 +faculty: FCBT +birthdate: 1999-04-10 +enroldate: 2018-09-01 +specialty: Software Engineering + +name: Sarah +surname: Anderson +email: sarah.anderson@example.com +group: FAF-225 +faculty: FCNS +birthdate: 1995-11-28 +enroldate: 2017-09-01 +specialty: Food Technology + +name: Michael +surname: Williams +email: michael.williams@example.com +group: FAF-223 +faculty: FCGT +birthdate: 1996-07-15 +enroldate: 2016-09-01 +specialty: Urbanism and Architecture + +name: Emily +surname: Davis +email: emily.davis@example.com +group: FAF-222 +faculty: FCMP +birthdate: 1998-02-03 +enroldate: 2019-09-01 +specialty: Veterinary Medicine + +name: James +surname: Martinez +email: james.martinez@example.com +group: FAF-226 +faculty: FCOE +birthdate: 1994-10-12 +enroldate: 2015-09-01 +specialty: Mechanical Engineering + +name: Olivia +surname: Brown +email: olivia.brown@example.com +group: FAF-224 +faculty: FCTI +birthdate: 1997-03-25 +enroldate: 2016-09-01 +specialty: Software Engineering + +name: Ethan +surname: Taylor +email: ethan.taylor@example.com +group: FAF-222 +faculty: FCES +birthdate: 1999-01-17 +enroldate: 2018-09-01 +specialty: Food Technology + +name: Sophia +surname: Clark +email: sophia.clark@example.com +group: FAF-226 +faculty: FCPH +birthdate: 1996-12-05 +enroldate: 2017-09-01 +specialty: Urbanism and Architecture + +name: Daniel +surname: White +email: daniel.white@example.com +group: FAF-225 +faculty: FCAR +birthdate: 1993-09-08 +enroldate: 2015-09-01 +specialty: Veterinary Medicine \ No newline at end of file diff --git a/src/main/java/org/lumijiez/enums/StudyField.java b/src/main/java/org/lumijiez/enums/StudyField.java new file mode 100644 index 0000000..3b0260c --- /dev/null +++ b/src/main/java/org/lumijiez/enums/StudyField.java @@ -0,0 +1,53 @@ +package org.lumijiez.enums; + +import java.io.Serializable; +import java.util.Arrays; +import java.util.List; + +public enum StudyField implements Serializable { + DEFAULT_UNASSIGNED("Unassigned", "None"), + MECHANICAL_ENGINEERING("Mechanical Engineering", "ME"), + SOFTWARE_ENGINEERING("Software Engineering", "FAF"), + FOOD_TECHNOLOGY("Food Technology", "FT"), + URBANISM_ARCHITECTURE("Urbanism and Architecture", "UA"), + VETERINARY_MEDICINE("Veterinary Medicine", "VE"); + + private final String name; + private final String abbreviation; + + StudyField(String name, String abbreviation) { + this.name = name; + this.abbreviation = abbreviation; + } + + public static String getAbbrevFromString(String str) { + for (StudyField st : values()) { + if (st.name.equals(str)) return st.abbreviation; + } + return str; + } + + public static StudyField getEnum(String str) { + for (StudyField st : values()) { + if (st.name.equals(str)) return st; + } + return null; + } + + public static List getAllEnums() { + return Arrays.asList(values()); + } + + public String getName() { + return name; + } + + public String getAbbreviation() { + return abbreviation; + } + + @Override + public String toString() { + return getName(); + } +} diff --git a/src/main/java/org/lumijiez/enums/Subjects.java b/src/main/java/org/lumijiez/enums/Subjects.java new file mode 100644 index 0000000..1e8f1dc --- /dev/null +++ b/src/main/java/org/lumijiez/enums/Subjects.java @@ -0,0 +1,36 @@ +package org.lumijiez.enums; + +import java.io.Serializable; + +public enum Subjects implements Serializable { + ENGLISH("English Language"), + LINEAR_ALGEBRA("Linear Algebra"), + OBJECT_ORIENTED_PROGRAMMING("Object Oriented Programming"), + DATABASES("Databases"), + MATHEMATICAL_ANALYSIS("Mathematical Analysis"), + DISCRETE_MATH("Discrete Math"), + PROBABILITY_AND_STATISTICS("Probability and Statistics"), + PHYSICS("Physics"); + + private final String name; + + Subjects(String name) { + this.name = name; + } + + public static Subjects getEnum(String str) { + for (Subjects st : values()) { + if (st.name.equals(str)) return st; + } + return null; + } + + public String getName() { + return name; + } + + @Override + public String toString() { + return getName(); + } +} diff --git a/src/main/java/org/lumijiez/gui/StudentManagementGUI.java b/src/main/java/org/lumijiez/gui/StudentManagementGUI.java new file mode 100644 index 0000000..c4f3508 --- /dev/null +++ b/src/main/java/org/lumijiez/gui/StudentManagementGUI.java @@ -0,0 +1,387 @@ +package org.lumijiez.gui; + +import org.lumijiez.data.DataDeserializer; +import org.lumijiez.data.DataSerializer; +import org.lumijiez.gui.forms.faculty.*; +import org.lumijiez.gui.forms.group.AddGroupForm; +import org.lumijiez.gui.forms.group.DeleteGroupForm; +import org.lumijiez.gui.forms.group.EditGroupForm; +import org.lumijiez.gui.forms.group.ShowGroupForm; +import org.lumijiez.gui.forms.student.*; +import org.lumijiez.gui.loader.BatchGraduater; +import org.lumijiez.gui.loader.BatchLoader; +import org.lumijiez.gui.util.DisplayHandler; +import org.lumijiez.managers.Supervisor; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; + +public class StudentManagementGUI extends JFrame { + private final JMenu fileMenu = new JMenu(); + private final JMenu studentMenu = new JMenu(); + private final JMenu groupMenu = new JMenu(); + private final JMenu facultyMenu = new JMenu(); + private final JMenuBar menuBar = new JMenuBar(); + private static final JTextPane mainTextPane = new JTextPane(); + private static Supervisor sv; + private final JScrollPane mainScrollPane = new JScrollPane(); + + public StudentManagementGUI() { + sv = (DataDeserializer.deserialize()); + this.setSize(650, 720); + this.setTitle("Student Management System"); + initComponents(); + } + + private void initComponents() { + + JMenuItem loadBatchOption = new JMenuItem("Load as Batch", UIManager.getIcon("FileView.directoryIcon")); + JMenuItem graduateBatchOption = new JMenuItem("Graduate as Batch", UIManager.getIcon("FileView.directoryIcon")); + JMenuItem saveAsOption = new JMenuItem("Save As (WIP)", UIManager.getIcon("FileView.directoryIcon")); + JMenuItem saveAndExitOption = new JMenuItem("Save and Exit", UIManager.getIcon("FileView.directoryIcon")); + JMenuItem settingsOption = new JMenuItem("Settings (WIP)", UIManager.getIcon("FileView.directoryIcon")); + JMenuItem showAllStudentsOption = new JMenuItem("Show all Students", UIManager.getIcon("FileView.directoryIcon")); + JMenuItem showParticularStudentOption = new JMenuItem("Show a Student", UIManager.getIcon("FileView.directoryIcon")); + JMenuItem showStudentGrade = new JMenuItem("Show Student Grades", UIManager.getIcon("FileView.directoryIcon")); + JMenuItem graduateStudent = new JMenuItem("Graduate Student", UIManager.getIcon("FileView.directoryIcon")); + JMenuItem showGraduates = new JMenuItem("Show Graduates", UIManager.getIcon("FileView.directoryIcon")); + JMenuItem showEnrolled = new JMenuItem("Show Enrolled", UIManager.getIcon("FileView.directoryIcon")); + JMenuItem gradeStudentOption = new JMenuItem("Grade a Student", UIManager.getIcon("FileView.directoryIcon")); + JMenuItem addStudentOption = new JMenuItem("Add a Student", UIManager.getIcon("FileView.directoryIcon")); + JMenuItem editStudentOption = new JMenuItem("Edit a Student", UIManager.getIcon("FileView.directoryIcon")); + JMenuItem deleteStudentOption = new JMenuItem("Delete a Student", UIManager.getIcon("FileView.directoryIcon")); + JMenuItem showAllGroupsOption = new JMenuItem("Show all Groups", UIManager.getIcon("FileView.directoryIcon")); + JMenuItem showParticularGroupOption = new JMenuItem("Show a Group", UIManager.getIcon("FileView.directoryIcon")); + JMenuItem addGroupOption = new JMenuItem("Add a Group", UIManager.getIcon("FileView.directoryIcon")); + JMenuItem editGroupOption = new JMenuItem("Edit a Group", UIManager.getIcon("FileView.directoryIcon")); + JMenuItem deleteGroupOption = new JMenuItem("Delete a Group", UIManager.getIcon("FileView.directoryIcon")); + JMenuItem showAllFacultiesOption = new JMenuItem("Show all Faculties", UIManager.getIcon("FileView.directoryIcon")); + JMenuItem showFacultyBySpecialtyOption = new JMenuItem("Show Faculty by Specialty", UIManager.getIcon("FileView.directoryIcon")); + JMenuItem showParticularFacultyOption = new JMenuItem("Show a Faculty", UIManager.getIcon("FileView.directoryIcon")); + JMenuItem addFacultyOption = new JMenuItem("Add a Faculty", UIManager.getIcon("FileView.directoryIcon")); + JMenuItem editFacultyOption = new JMenuItem("Edit a Faculty", UIManager.getIcon("FileView.directoryIcon")); + JMenuItem removeFacultyOption = new JMenuItem("Remove Faculty", UIManager.getIcon("FileView.directoryIcon")); + + JPopupMenu.Separator studentSeparator = new JPopupMenu.Separator(); + JPopupMenu.Separator groupSeparator = new JPopupMenu.Separator(); + JPopupMenu.Separator facultySeparator = new JPopupMenu.Separator(); + + fileMenu.setText("File"); + studentMenu.setText("Student Options"); + groupMenu.setText("Group Options"); + facultyMenu.setText("Faculty Options"); + + mainTextPane.setEditable(false); + mainTextPane.setContentType("text/html"); + mainTextPane.setFont(new Font("Segoe UI", Font.PLAIN, 14)); + mainScrollPane.setViewportView(mainTextPane); + + setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); + + this.addWindowListener(new WindowAdapter() { + @Override + public void windowClosing(WindowEvent e) { + int result = JOptionPane.showConfirmDialog( + StudentManagementGUI.this, + "Are you sure you want to exit?", + "Confirmation", + JOptionPane.YES_NO_OPTION); + + if (result == JOptionPane.YES_OPTION) { + DataSerializer.serialize(sv); + dispose(); + } + } + }); + + loadBatchOption.addActionListener(this::loadBatchEvent); + graduateBatchOption.addActionListener(this::graduateBatchEvent); + saveAsOption.addActionListener(this::saveAsEvent); + saveAndExitOption.addActionListener(this::saveExitEvent); + + fileMenu.add(loadBatchOption); + fileMenu.add(graduateBatchOption); + fileMenu.add(saveAsOption); + fileMenu.add(saveAndExitOption); + fileMenu.add(settingsOption); + + menuBar.add(fileMenu); + + showAllStudentsOption.addActionListener(this::showAllStudentsEvent); + showParticularStudentOption.addActionListener(this::showStudentEvent); + showStudentGrade.addActionListener(this::showGradeEvent); + gradeStudentOption.addActionListener(this::gradeStudentEvent); + addStudentOption.addActionListener(this::addStudentEvent); + editStudentOption.addActionListener(this::editStudentEvent); + deleteStudentOption.addActionListener(this::deleteStudentEvent); + graduateStudent.addActionListener(this::graduateStudentEvent); + showEnrolled.addActionListener(this::showEnrolledEvent); + showGraduates.addActionListener(this::showGraduatesEvent); + + studentMenu.add(showAllStudentsOption); + studentMenu.add(showParticularStudentOption); + studentMenu.add(showStudentGrade); + studentMenu.add(showEnrolled); + studentMenu.add(showGraduates); + studentMenu.add(studentSeparator); + studentMenu.add(graduateStudent); + studentMenu.add(gradeStudentOption); + studentMenu.add(addStudentOption); + studentMenu.add(editStudentOption); + studentMenu.add(deleteStudentOption); + + menuBar.add(studentMenu); + + showAllGroupsOption.addActionListener(this::showAllGroupsEvent); + showParticularGroupOption.addActionListener(this::showGroupEvent); + addGroupOption.addActionListener(this::addGroupEvent); + editGroupOption.addActionListener(this::editGroupEvent); + deleteGroupOption.addActionListener(this::deleteGroupEvent); + + groupMenu.add(showAllGroupsOption); + groupMenu.add(showParticularGroupOption); + groupMenu.add(groupSeparator); + groupMenu.add(addGroupOption); + groupMenu.add(editGroupOption); + groupMenu.add(deleteGroupOption); + + menuBar.add(groupMenu); + + showAllFacultiesOption.addActionListener(this::showAllFacultiesEvent); + showParticularFacultyOption.addActionListener(this::showFacultyEvent); + showFacultyBySpecialtyOption.addActionListener(this::showFacultySpecEvent); + addFacultyOption.addActionListener(this::addFacultyEvent); + editFacultyOption.addActionListener(this::editFacultyEvent); + removeFacultyOption.addActionListener(this::deleteFacultyEvent); + + facultyMenu.add(showAllFacultiesOption); + facultyMenu.add(showParticularFacultyOption); + facultyMenu.add(showFacultyBySpecialtyOption); + facultyMenu.add(facultySeparator); + facultyMenu.add(addFacultyOption); + facultyMenu.add(editFacultyOption); + facultyMenu.add(removeFacultyOption); + + menuBar.add(facultyMenu); + + setJMenuBar(menuBar); + + DisplayHandler.displayStudents(); + + GroupLayout layout = new GroupLayout(getContentPane()); + getContentPane().setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(GroupLayout.Alignment.LEADING) + .addComponent(mainScrollPane, GroupLayout.DEFAULT_SIZE, 650, Short.MAX_VALUE)); + layout.setVerticalGroup( + layout.createParallelGroup(GroupLayout.Alignment.LEADING) + .addComponent(mainScrollPane, GroupLayout.DEFAULT_SIZE, 697, Short.MAX_VALUE)); + pack(); + Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); + int x = (screenSize.width - this.getWidth()) / 2; + int y = (screenSize.height - this.getHeight()) / 2; + this.setLocation(x, y); + } + + private void showFacultySpecEvent(ActionEvent actionEvent) { + ShowSpecialtyFacultyForm form = new ShowSpecialtyFacultyForm(sv, mainTextPane); + form.setVisible(true); + } + + private void graduateBatchEvent(ActionEvent actionEvent) { + BatchGraduater picker = new BatchGraduater(sv); + picker.setVisible(true); + } + + private void showGraduatesEvent(ActionEvent actionEvent) { + if (checkStudent() && checkGroup() && checkFaculty()) { + DisplayHandler.displayGraduates(); + } + } + + private void showEnrolledEvent(ActionEvent actionEvent) { + if (checkStudent() && checkGroup() && checkFaculty()) { + DisplayHandler.displayEnrolled(); + } + } + + private void graduateStudentEvent(ActionEvent actionEvent) { + if (checkStudent() && checkGroup() && checkFaculty()) { + GraduateStudentForm form = new GraduateStudentForm(sv); + form.setVisible(true); + } + } + + private void showAllStudentsEvent(ActionEvent actionEvent) { + if (checkStudent() && checkGroup() && checkFaculty()) { + DisplayHandler.displayStudents(); + } + } + + private void showAllGroupsEvent(ActionEvent actionEvent) { + if (checkGroup() && checkFaculty()) { + DisplayHandler.displayGroups(); + } + } + + private void deleteGroupEvent(ActionEvent actionEvent) { + if (checkGroup() && checkFaculty()) { + DeleteGroupForm form = new DeleteGroupForm(sv); + form.setVisible(true); + } + } + + private void loadBatchEvent(ActionEvent evt) { + BatchLoader picker = new BatchLoader(sv); + picker.setVisible(true); + } + + private void saveExitEvent(ActionEvent evt) { + int result = JOptionPane.showConfirmDialog( + StudentManagementGUI.this, + "Are you sure you want to exit?", + "Confirmation", + JOptionPane.YES_NO_OPTION); + + if (result == JOptionPane.YES_OPTION) { + DataSerializer.serialize(sv); + sv.getLogger().logOperation("Died!"); + sv.getLogger().close(); + dispose(); + } + } + + private void showAllFacultiesEvent(ActionEvent evt) { + if (checkFaculty()) { + DisplayHandler.displayFaculties(); + } + } + + private void saveAsEvent(ActionEvent evt) { + + } + + private void showGroupEvent(ActionEvent evt) { + if (checkGroup() && checkFaculty()) { + ShowGroupForm form = new ShowGroupForm(sv, mainTextPane); + form.setVisible(true); + } + } + + private void addFacultyEvent(ActionEvent evt) { + AddFacultyForm form = new AddFacultyForm(sv); + form.setVisible(true); + } + + private void addStudentEvent(ActionEvent evt) { + if (checkGroup() && checkFaculty()) { + AddStudentForm form = new AddStudentForm(sv); + form.setVisible(true); + } + } + + private void gradeStudentEvent(ActionEvent evt) { + if (checkStudent() && checkGroup() && checkFaculty()) { + GradeStudentForm form = new GradeStudentForm(sv, mainTextPane); + form.setVisible(true); + } + } + + private void editStudentEvent(ActionEvent evt) { + if (checkStudent() && checkGroup() && checkFaculty()) { + EditStudentForm form = new EditStudentForm(sv); + form.setVisible(true); + } + } + + private void deleteStudentEvent(ActionEvent evt) { + if (checkStudent() && checkGroup() && checkFaculty()) { + DeleteStudentForm form = new DeleteStudentForm(sv); + form.setVisible(true); + } + } + + private void showGradeEvent(ActionEvent evt) { + if (checkStudent() && checkGroup() && checkFaculty()) { + ShowStudentGradesForm form = new ShowStudentGradesForm(sv, mainTextPane); + form.setVisible(true); + } + } + + private void showStudentEvent(ActionEvent evt) { + if (checkStudent() && checkGroup() && checkFaculty()) { + ShowStudentForm form = new ShowStudentForm(sv, mainTextPane); + form.setVisible(true); + } + } + + private void addGroupEvent(ActionEvent evt) { + if (checkFaculty()) { + AddGroupForm form = new AddGroupForm(sv); + form.setVisible(true); + } + } + + private void editGroupEvent(ActionEvent evt) { + if (checkGroup() && checkFaculty()) { + EditGroupForm form = new EditGroupForm(sv); + form.setVisible(true); + } + } + + private void showFacultyEvent(ActionEvent evt) { + if (checkFaculty()) { + ShowFacultyForm form = new ShowFacultyForm(sv, mainTextPane); + form.setVisible(true); + } + } + + private void editFacultyEvent(ActionEvent evt) { + if (checkFaculty()) { + EditFacultyForm form = new EditFacultyForm(sv); + form.setVisible(true); + } + } + + private void deleteFacultyEvent(ActionEvent evt) { + if (checkFaculty()) { + RemoveFacultyForm form = new RemoveFacultyForm(sv); + form.setVisible(true); + } + } + + private boolean checkFaculty() { + if (sv.facultyManager().getFaculties().isEmpty()) { + JOptionPane.showMessageDialog(null, "Configure a faculty!", "Warning!", JOptionPane.INFORMATION_MESSAGE, null); + return false; + } + return true; + } + + private boolean checkGroup() { + if (sv.groupManager().getGroups().isEmpty()) { + JOptionPane.showMessageDialog(null, "Configure a group!", "Warning!", JOptionPane.INFORMATION_MESSAGE, null); + return false; + } + return true; + } + + private boolean checkStudent() { + if (sv.studentManager().getStudents().isEmpty()) { + JOptionPane.showMessageDialog(null, "No students in database!", "Warning!", JOptionPane.INFORMATION_MESSAGE, null); + return false; + } + return true; + } + + public static JTextPane getMainPane() { + return mainTextPane; + } + + public static Supervisor getSv() { + return sv; + } +} diff --git a/src/main/java/org/lumijiez/gui/forms/faculty/AddFacultyForm.java b/src/main/java/org/lumijiez/gui/forms/faculty/AddFacultyForm.java new file mode 100644 index 0000000..47c5fe5 --- /dev/null +++ b/src/main/java/org/lumijiez/gui/forms/faculty/AddFacultyForm.java @@ -0,0 +1,129 @@ +package org.lumijiez.gui.forms.faculty; + +import org.lumijiez.base.Faculty; +import org.lumijiez.enums.StudyField; +import org.lumijiez.gui.util.ComboRenderer; +import org.lumijiez.gui.util.ComponentDecorator; +import org.lumijiez.gui.util.DisplayHandler; +import org.lumijiez.gui.util.WindowConfig; +import org.lumijiez.managers.Supervisor; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.util.Objects; + +public class AddFacultyForm extends JFrame { + private final JLabel titleLabel = new JLabel(); + private final JLabel nameLabel = new JLabel(); + private final JLabel abbreviationLabel = new JLabel(); + private final JLabel specialtyLabel = new JLabel(); + private final JButton submitButton = new JButton(); + private final JButton cancelButton = new JButton(); + private final JTextField nameField = new JTextField(); + private final JTextField abbreviationField = new JTextField(); + private final JComboBox specialtyCombo = new JComboBox<>(); + private final Supervisor sv; + + public AddFacultyForm(Supervisor sv) { + this.sv = sv; + initComponents(); + } + + private void initComponents() { + + setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); + + titleLabel.setFont(new Font("sansserif", Font.PLAIN, 18)); + setTitle("Add a Faculty"); + + titleLabel.setText("Add a new faculty"); + submitButton.setText("Submit"); + cancelButton.setText("Cancel"); + nameLabel.setText("Name:"); + abbreviationLabel.setText("Abbreviation:"); + specialtyLabel.setText("Specialty Field:"); + + ComponentDecorator.submitAndCancel(submitButton, cancelButton); + + ComboRenderer.setRenderer(specialtyCombo, StudyField.getAllEnums().toArray(new StudyField[0])); + + abbreviationField.setText(StudyField.getAbbrevFromString(Objects.requireNonNull(specialtyCombo.getSelectedItem()).toString())); + + specialtyCombo.addActionListener(this::specialtyComboEvent); + submitButton.addActionListener(this::submitEvent); + cancelButton.addActionListener(this::cancelEvent); + + GroupLayout layout = new GroupLayout(getContentPane()); + getContentPane().setLayout(layout); + layout.setHorizontalGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addGap(25, 25, 25) + .addComponent(abbreviationLabel)) + .addGroup(layout.createSequentialGroup() + .addGap(21, 21, 21) + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING, false) + .addComponent(abbreviationField, GroupLayout.DEFAULT_SIZE, 178, Short.MAX_VALUE) + .addComponent(nameField) + .addGroup(layout.createSequentialGroup() + .addGap(5, 5, 5) + .addComponent(nameLabel))) + .addGap(40, 40, 40) + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING) + .addComponent(specialtyLabel) + .addGroup(layout.createSequentialGroup() + .addComponent(cancelButton) + .addGap(29, 29, 29) + .addComponent(submitButton)) + .addComponent(specialtyCombo, GroupLayout.PREFERRED_SIZE, 173, GroupLayout.PREFERRED_SIZE)))) + .addContainerGap(30, Short.MAX_VALUE)) + .addGroup(GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() + .addGap(0, 0, Short.MAX_VALUE) + .addComponent(titleLabel) + .addGap(149, 149, 149))); + layout.setVerticalGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addGap(7, 7, 7) + .addComponent(titleLabel) + .addPreferredGap(LayoutStyle.ComponentPlacement.UNRELATED) + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) + .addComponent(nameLabel).addComponent(specialtyLabel)) + .addGap(3, 3, 3) + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) + .addComponent(nameField, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) + .addComponent(specialtyCombo, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)) + .addGap(11, 11, 11) + .addComponent(abbreviationLabel) + .addGap(5, 5, 5) + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) + .addComponent(abbreviationField, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) + .addComponent(cancelButton) + .addComponent(submitButton)) + .addContainerGap(24, Short.MAX_VALUE))); + pack(); + WindowConfig.center(this); + } + + private void submitEvent(ActionEvent evt) { + String name = nameField.getText(); + String abbreviation = abbreviationField.getText(); + StudyField specialty = StudyField.getEnum(Objects.requireNonNull(specialtyCombo.getSelectedItem()).toString()); + if (!name.isEmpty()) { + Faculty newFaculty = new Faculty(name, abbreviation, specialty); + sv.addFaculty(newFaculty); + DisplayHandler.displayFaculties(); + this.dispose(); + } else JOptionPane.showMessageDialog(null, "Fill in all the fields!", "Warning!", JOptionPane.INFORMATION_MESSAGE, null); + } + + private void specialtyComboEvent(ActionEvent evt) { + abbreviationField.setText(StudyField.getAbbrevFromString(Objects.requireNonNull(specialtyCombo.getSelectedItem()).toString())); + } + + private void cancelEvent(ActionEvent evt) { + this.dispose(); + } + +} diff --git a/src/main/java/org/lumijiez/gui/forms/faculty/EditFacultyForm.java b/src/main/java/org/lumijiez/gui/forms/faculty/EditFacultyForm.java new file mode 100644 index 0000000..65cc130 --- /dev/null +++ b/src/main/java/org/lumijiez/gui/forms/faculty/EditFacultyForm.java @@ -0,0 +1,144 @@ +package org.lumijiez.gui.forms.faculty; + +import org.lumijiez.base.Faculty; +import org.lumijiez.enums.StudyField; +import org.lumijiez.gui.util.ComboRenderer; +import org.lumijiez.gui.util.ComponentDecorator; +import org.lumijiez.gui.util.DisplayHandler; +import org.lumijiez.gui.util.WindowConfig; +import org.lumijiez.managers.Supervisor; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.util.Objects; + +public class EditFacultyForm extends JFrame { + private final JLabel abbreviationLabel = new JLabel(); + private final JLabel facultyLabel = new JLabel(); + private final JLabel nameLabel = new JLabel(); + private final JLabel specialtyLabel = new JLabel(); + private final JLabel titleLabel = new JLabel(); + private final JButton cancelButton = new JButton(); + private final JButton submitButton = new JButton(); + private final JTextField abbreviationField = new JTextField(); + private final JTextField nameField = new JTextField(); + private final JComboBox facultyCombo = new JComboBox<>(); + private final JComboBox specialtyCombo = new JComboBox<>(); + private final Supervisor sv; + + public EditFacultyForm(Supervisor sv) { + this.sv = sv; + initComponents(); + } + + private void initComponents() { + + setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); + + titleLabel.setFont(new Font("sansserif", Font.PLAIN, 18)); + setTitle("Edit a Faculty"); + + titleLabel.setText("Edit a faculty"); + submitButton.setText("Submit"); + cancelButton.setText("Cancel"); + nameLabel.setText("New name:"); + facultyLabel.setText("Faculty:"); + specialtyLabel.setText("New specialty:"); + + ComponentDecorator.submitAndCancel(submitButton, cancelButton); + + cancelButton.addActionListener(this::cancelEvent); + submitButton.addActionListener(this::submitEvent); + specialtyCombo.addActionListener(this::specialtyComboEvent); + facultyCombo.addActionListener(this::facultyComboEvent); + + ComboRenderer.setRenderer(facultyCombo, sv.facultyManager().getFaculties().toArray(new Faculty[0])); + ComboRenderer.setRenderer(specialtyCombo, StudyField.getAllEnums().toArray(new StudyField[0])); + + specialtyCombo.setSelectedItem(((Faculty) Objects.requireNonNull(facultyCombo.getSelectedItem())).getField()); + + GroupLayout layout = new GroupLayout(getContentPane()); + getContentPane().setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING, false) + .addGroup(layout.createSequentialGroup() + .addGap(120, 120, 120) + .addComponent(titleLabel)) + .addGroup(layout.createSequentialGroup() + .addGap(25, 25, 25) + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING) + .addComponent(facultyLabel) + .addGroup(layout.createSequentialGroup() + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING, false) + .addComponent(specialtyLabel) + .addComponent(facultyCombo, 0, 115, Short.MAX_VALUE) + .addComponent(specialtyCombo, 0, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addGap(18, 18, 18) + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING) + .addComponent(abbreviationLabel) + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.TRAILING) + .addComponent(abbreviationField, GroupLayout.PREFERRED_SIZE, 178, GroupLayout.PREFERRED_SIZE) + .addComponent(nameField, GroupLayout.PREFERRED_SIZE, 178, GroupLayout.PREFERRED_SIZE) + .addGroup(layout.createSequentialGroup() + .addComponent(cancelButton) + .addGap(18, 18, 18) + .addComponent(submitButton))) + .addComponent(nameLabel)))))) + .addContainerGap(24, Short.MAX_VALUE))); + layout.setVerticalGroup( + layout.createParallelGroup(GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addContainerGap() + .addComponent(titleLabel) + .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) + .addComponent(nameLabel) + .addComponent(facultyLabel)) + .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING) + .addComponent(nameField, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) + .addComponent(facultyCombo, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)) + .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) + .addComponent(abbreviationLabel) + .addComponent(specialtyLabel)) + .addGap(5, 5, 5) + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) + .addComponent(abbreviationField, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) + .addComponent(specialtyCombo, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)) + .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED, 28, Short.MAX_VALUE) + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) + .addComponent(cancelButton) + .addComponent(submitButton)) + .addGap(14, 14, 14))); + pack(); + WindowConfig.center(this); + } + + private void facultyComboEvent(ActionEvent actionEvent) { + Faculty fac = ((Faculty) Objects.requireNonNull(facultyCombo.getSelectedItem())); + specialtyCombo.setSelectedItem(fac.getField()); + nameField.setText(fac.getName()); + } + + private void specialtyComboEvent(ActionEvent actionEvent) { + abbreviationField.setText(((StudyField) Objects.requireNonNull(specialtyCombo.getSelectedItem())).getAbbreviation()); + } + + private void submitEvent(ActionEvent evt) { + ((Faculty) Objects.requireNonNull(facultyCombo.getSelectedItem())).setName(nameField.getText()); + ((Faculty) Objects.requireNonNull(facultyCombo.getSelectedItem())).setAbbreviation(abbreviationField.getText()); + ((Faculty) Objects.requireNonNull(facultyCombo.getSelectedItem())).setField(((StudyField) Objects.requireNonNull(specialtyCombo.getSelectedItem()))); + DisplayHandler.displayFaculties(); + sv.getLogger().logOperation("Faculty edited : " + ((Faculty) Objects.requireNonNull(facultyCombo.getSelectedItem())).getName()); + this.dispose(); + } + + private void cancelEvent(ActionEvent evt) { + this.dispose(); + } + +} diff --git a/src/main/java/org/lumijiez/gui/forms/faculty/RemoveFacultyForm.java b/src/main/java/org/lumijiez/gui/forms/faculty/RemoveFacultyForm.java new file mode 100644 index 0000000..b700e2f --- /dev/null +++ b/src/main/java/org/lumijiez/gui/forms/faculty/RemoveFacultyForm.java @@ -0,0 +1,93 @@ +package org.lumijiez.gui.forms.faculty; + +import org.lumijiez.base.Faculty; +import org.lumijiez.gui.util.ComboRenderer; +import org.lumijiez.gui.util.ComponentDecorator; +import org.lumijiez.gui.util.DisplayHandler; +import org.lumijiez.gui.util.WindowConfig; +import org.lumijiez.managers.Supervisor; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.ActionEvent; + +public class RemoveFacultyForm extends JFrame { + private final JLabel facultyLabel = new JLabel(); + private final JLabel titleLabel = new JLabel(); + private final JButton cancelButton = new JButton(); + private final JButton submitButton = new JButton(); + private final JComboBox facultyCombo = new JComboBox<>(); + private final Supervisor sv; + + public RemoveFacultyForm(Supervisor sv) { + this.sv = sv; + initComponents(); + } + + private void initComponents() { + + setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); + + titleLabel.setFont(new Font("sansserif", Font.PLAIN, 18)); + setTitle("Remove a Faculty"); + + titleLabel.setText("Remove a faculty"); + submitButton.setText("Submit"); + cancelButton.setText("Cancel"); + facultyLabel.setText("Faculty:"); + + ComponentDecorator.submitAndCancel(submitButton, cancelButton); + + submitButton.addActionListener(this::submitEvent); + cancelButton.addActionListener(this::cancelEvent); + + ComboRenderer.setRenderer(facultyCombo, sv.facultyManager().getFaculties().toArray(new Faculty[0])); + + GroupLayout layout = new GroupLayout(getContentPane()); + getContentPane().setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addGap(22, 22, 22) + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.TRAILING) + .addGroup(layout.createSequentialGroup() + .addComponent(cancelButton) + .addGap(38, 38, 38) + .addComponent(submitButton)) + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING) + .addComponent(facultyLabel) + .addComponent(facultyCombo, GroupLayout.PREFERRED_SIZE, 250, GroupLayout.PREFERRED_SIZE))) + .addContainerGap(32, Short.MAX_VALUE)) + .addGroup(GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() + .addContainerGap(GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(titleLabel) + .addGap(48, 48, 48))); + layout.setVerticalGroup( + layout.createParallelGroup(GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addContainerGap() + .addComponent(titleLabel) + .addGap(18, 18, 18) + .addComponent(facultyLabel) + .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) + .addComponent(facultyCombo, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) + .addGap(18, 18, 18) + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) + .addComponent(cancelButton) + .addComponent(submitButton)) + .addContainerGap(21, Short.MAX_VALUE))); + pack(); + WindowConfig.center(this); + } + + private void submitEvent(ActionEvent evt) { + sv.deleteFaculty(((Faculty) facultyCombo.getSelectedItem())); + DisplayHandler.displayFaculties(); + this.dispose(); + } + + private void cancelEvent(ActionEvent evt) { + this.dispose(); + } + +} diff --git a/src/main/java/org/lumijiez/gui/forms/faculty/ShowFacultyForm.java b/src/main/java/org/lumijiez/gui/forms/faculty/ShowFacultyForm.java new file mode 100644 index 0000000..6cb1b61 --- /dev/null +++ b/src/main/java/org/lumijiez/gui/forms/faculty/ShowFacultyForm.java @@ -0,0 +1,107 @@ +package org.lumijiez.gui.forms.faculty; + +import org.lumijiez.base.Faculty; +import org.lumijiez.base.Group; +import org.lumijiez.gui.util.ComboRenderer; +import org.lumijiez.gui.util.ComponentDecorator; +import org.lumijiez.gui.util.Settings; +import org.lumijiez.gui.util.WindowConfig; +import org.lumijiez.managers.Supervisor; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.ActionEvent; + +public class ShowFacultyForm extends JFrame { + private final JLabel titleLabel = new JLabel(); + private final JLabel facultyLabel = new JLabel(); + private final JButton cancelButton = new JButton(); + private final JButton submitButton = new JButton(); + private final JComboBox facultyCombo = new JComboBox<>(); + private final Supervisor sv; + private final JTextPane mainTextLabel; + + public ShowFacultyForm(Supervisor sv, JTextPane mainTextLabel) { + this.sv = sv; + this.mainTextLabel = mainTextLabel; + initComponents(); + } + + private void initComponents() { + + setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); + + titleLabel.setFont(new Font("sansserif", Font.PLAIN, 18)); + setTitle("Show a Faculty"); + + titleLabel.setText("Show a faculty"); + submitButton.setText("Submit"); + cancelButton.setText("Cancel"); + facultyLabel.setText("Faculty:"); + + ComponentDecorator.submitAndCancel(submitButton, cancelButton); + + submitButton.addActionListener(this::submitEvent); + cancelButton.addActionListener(this::cancelEvent); + + ComboRenderer.setRenderer(facultyCombo, sv.facultyManager().getFaculties().toArray(new Faculty[0])); + + GroupLayout layout = new GroupLayout(getContentPane()); + getContentPane().setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addGap(46, 46, 46) + .addComponent(titleLabel)) + .addGroup(layout.createSequentialGroup() + .addGap(26, 26, 26) + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING) + .addComponent(facultyLabel) + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.TRAILING, false) + .addGroup(GroupLayout.Alignment.LEADING, layout.createSequentialGroup() + .addComponent(cancelButton) + .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(submitButton)) + .addComponent(facultyCombo, GroupLayout.Alignment.LEADING, GroupLayout.PREFERRED_SIZE, 250, GroupLayout.PREFERRED_SIZE))))) + .addContainerGap(27, Short.MAX_VALUE))); + layout.setVerticalGroup( + layout.createParallelGroup(GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addGap(13, 13, 13) + .addComponent(titleLabel) + .addPreferredGap(LayoutStyle.ComponentPlacement.UNRELATED) + .addComponent(facultyLabel) + .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) + .addComponent(facultyCombo, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) + .addGap(18, 18, 18) + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) + .addComponent(cancelButton) + .addComponent(submitButton)) + .addContainerGap(24, Short.MAX_VALUE))); + pack(); + WindowConfig.center(this); + } + + private void submitEvent(ActionEvent evt) { + StringBuilder builder = new StringBuilder(); + Faculty fac = (Faculty) facultyCombo.getSelectedItem(); + assert fac != null; + builder.append("===================== Faculty Info ========================
"); + builder.append("Name: ").append(fac.getName()).append("
"); + builder.append("Specialty: ").append(fac.getField()).append("
"); + builder.append("Groups: ").append("
"); + builder.append("==========
"); + for (Group gr : fac.getGroups()) + builder.append(gr.getName()).append("
").append("==========
"); + builder.append("============================================================"); + mainTextLabel.setText(builder.toString()); + this.dispose(); + } + + private void cancelEvent(ActionEvent evt) { + this.dispose(); + } + +} diff --git a/src/main/java/org/lumijiez/gui/forms/faculty/ShowSpecialtyFacultyForm.java b/src/main/java/org/lumijiez/gui/forms/faculty/ShowSpecialtyFacultyForm.java new file mode 100644 index 0000000..8fc8873 --- /dev/null +++ b/src/main/java/org/lumijiez/gui/forms/faculty/ShowSpecialtyFacultyForm.java @@ -0,0 +1,107 @@ +package org.lumijiez.gui.forms.faculty; + +import org.lumijiez.base.Faculty; +import org.lumijiez.enums.StudyField; +import org.lumijiez.gui.util.ComboRenderer; +import org.lumijiez.gui.util.ComponentDecorator; +import org.lumijiez.gui.util.Settings; +import org.lumijiez.gui.util.WindowConfig; +import org.lumijiez.managers.Supervisor; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.ActionEvent; + +public class ShowSpecialtyFacultyForm extends JFrame { + private final JLabel titleLabel = new JLabel(); + private final JLabel facultyLabel = new JLabel(); + private final JButton cancelButton = new JButton(); + private final JButton submitButton = new JButton(); + private final JComboBox specialtyCombo = new JComboBox<>(); + private final Supervisor sv; + private final JTextPane mainTextLabel; + + public ShowSpecialtyFacultyForm(Supervisor sv, JTextPane mainTextLabel) { + this.sv = sv; + this.mainTextLabel = mainTextLabel; + initComponents(); + } + + private void initComponents() { + + setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); + + titleLabel.setFont(new Font("sansserif", Font.PLAIN, 18)); + setTitle("Show a Faculty by Specialty"); + + titleLabel.setText("Show a faculty"); + submitButton.setText("Submit"); + cancelButton.setText("Cancel"); + facultyLabel.setText("Faculty:"); + + ComponentDecorator.submitAndCancel(submitButton, cancelButton); + + submitButton.addActionListener(this::submitEvent); + cancelButton.addActionListener(this::cancelEvent); + + ComboRenderer.setRenderer(specialtyCombo, StudyField.getAllEnums().toArray(new StudyField[0])); + + GroupLayout layout = new GroupLayout(getContentPane()); + getContentPane().setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addGap(46, 46, 46) + .addComponent(titleLabel)) + .addGroup(layout.createSequentialGroup() + .addGap(26, 26, 26) + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING) + .addComponent(facultyLabel) + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.TRAILING, false) + .addGroup(GroupLayout.Alignment.LEADING, layout.createSequentialGroup() + .addComponent(cancelButton) + .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(submitButton)) + .addComponent(specialtyCombo, GroupLayout.Alignment.LEADING, GroupLayout.PREFERRED_SIZE, 250, GroupLayout.PREFERRED_SIZE))))) + .addContainerGap(27, Short.MAX_VALUE))); + layout.setVerticalGroup( + layout.createParallelGroup(GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addGap(13, 13, 13) + .addComponent(titleLabel) + .addPreferredGap(LayoutStyle.ComponentPlacement.UNRELATED) + .addComponent(facultyLabel) + .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) + .addComponent(specialtyCombo, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) + .addGap(18, 18, 18) + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) + .addComponent(cancelButton) + .addComponent(submitButton)) + .addContainerGap(24, Short.MAX_VALUE))); + pack(); + WindowConfig.center(this); + } + + private void submitEvent(ActionEvent evt) { + StringBuilder builder = new StringBuilder(); + StudyField fac = (StudyField) specialtyCombo.getSelectedItem(); + assert fac != null; + builder.append("==================== Specialty Info =======================
"); + builder.append("Specialty: ").append(fac.getName()).append("
"); + builder.append("==========
"); + builder.append("Faculties: ").append("
"); + for (Faculty fc : sv.facultyManager().getFaculties()) + if (fc.getField().equals(fac)) + builder.append(fc.getName()).append("
").append("==========
"); + builder.append("============================================================"); + mainTextLabel.setText(builder.toString()); + this.dispose(); + } + + private void cancelEvent(ActionEvent evt) { + this.dispose(); + } + +} diff --git a/src/main/java/org/lumijiez/gui/forms/group/AddGroupForm.java b/src/main/java/org/lumijiez/gui/forms/group/AddGroupForm.java new file mode 100644 index 0000000..6209863 --- /dev/null +++ b/src/main/java/org/lumijiez/gui/forms/group/AddGroupForm.java @@ -0,0 +1,110 @@ +package org.lumijiez.gui.forms.group; + +import org.lumijiez.base.Faculty; +import org.lumijiez.base.Group; +import org.lumijiez.gui.util.ComboRenderer; +import org.lumijiez.gui.util.ComponentDecorator; +import org.lumijiez.gui.util.DisplayHandler; +import org.lumijiez.gui.util.WindowConfig; +import org.lumijiez.managers.Supervisor; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.util.Objects; + +public class AddGroupForm extends JFrame { + private final JLabel titleLabel = new JLabel(); + private final JLabel nameLabel = new JLabel(); + private final JLabel facultyLabel = new JLabel(); + private final JButton submitButton = new JButton(); + private final JButton cancelButton = new JButton(); + private final JTextField nameField = new JTextField(); + private final JComboBox facultyCombo = new JComboBox<>(); + private final Supervisor sv; + + public AddGroupForm(Supervisor sv) { + this.sv = sv; + initComponents(); + } + + private void initComponents() { + + setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); + + titleLabel.setFont(new Font("sansserif", Font.PLAIN, 18)); + setTitle("Add a Group"); + + titleLabel.setText("Add a new group"); + submitButton.setText("Submit"); + cancelButton.setText("Cancel"); + nameLabel.setText("Name:"); + facultyLabel.setText("Faculty:"); + + ComponentDecorator.submitAndCancel(submitButton, cancelButton); + + submitButton.addActionListener(this::submitEvent); + cancelButton.addActionListener(this::cancelEvent); + + ComboRenderer.setRenderer(facultyCombo, sv.facultyManager().getFaculties().toArray(new Faculty[0])); + + GroupLayout layout = new GroupLayout(getContentPane()); + getContentPane().setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addGap(21, 21, 21) + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING, false) + .addComponent(nameField, GroupLayout.DEFAULT_SIZE, 178, Short.MAX_VALUE) + .addGroup(layout.createSequentialGroup() + .addGap(5, 5, 5) + .addComponent(nameLabel)) + .addComponent(facultyLabel) + .addGroup(layout.createSequentialGroup() + .addComponent(cancelButton) + .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(submitButton)) + .addComponent(facultyCombo, 0, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))) + .addGroup(layout.createSequentialGroup() + .addGap(38, 38, 38) + .addComponent(titleLabel))) + .addContainerGap(29, Short.MAX_VALUE))); + layout.setVerticalGroup( + layout.createParallelGroup(GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addContainerGap() + .addComponent(titleLabel) + .addGap(13, 13, 13) + .addComponent(nameLabel) + .addGap(3, 3, 3) + .addComponent(nameField, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) + .addPreferredGap(LayoutStyle.ComponentPlacement.UNRELATED) + .addComponent(facultyLabel) + .addGap(5, 5, 5) + .addComponent(facultyCombo, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) + .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED, 34, Short.MAX_VALUE) + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) + .addComponent(cancelButton) + .addComponent(submitButton)) + .addGap(15, 15, 15))); + pack(); + WindowConfig.center(this); + } + + private void submitEvent(ActionEvent evt) { + if (!nameField.getText().isEmpty()) { + Group gr = new Group(nameField.getText()); + Faculty fac = ((Faculty) Objects.requireNonNull(facultyCombo.getSelectedItem())); + sv.addGroup(gr, fac); + DisplayHandler.displayGroups(); + this.dispose(); + } else JOptionPane.showMessageDialog(null, "Fill in all the fields!", "Warning!", JOptionPane.INFORMATION_MESSAGE, null); + } + + private void cancelEvent(ActionEvent evt) { + this.dispose(); + } + +} diff --git a/src/main/java/org/lumijiez/gui/forms/group/DeleteGroupForm.java b/src/main/java/org/lumijiez/gui/forms/group/DeleteGroupForm.java new file mode 100644 index 0000000..f6b4ad0 --- /dev/null +++ b/src/main/java/org/lumijiez/gui/forms/group/DeleteGroupForm.java @@ -0,0 +1,93 @@ +package org.lumijiez.gui.forms.group; + +import org.lumijiez.base.Group; +import org.lumijiez.gui.util.ComboRenderer; +import org.lumijiez.gui.util.ComponentDecorator; +import org.lumijiez.gui.util.DisplayHandler; +import org.lumijiez.gui.util.WindowConfig; +import org.lumijiez.managers.Supervisor; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.ActionEvent; + +public class DeleteGroupForm extends JFrame { + private final JLabel groupLabel = new JLabel(); + private final JLabel titleLabel = new JLabel(); + private final JButton cancelButton = new JButton(); + private final JButton submitButton = new JButton(); + private final JComboBox groupCombo = new JComboBox<>(); + private final Supervisor sv; + + public DeleteGroupForm(Supervisor sv) { + this.sv = sv; + initComponents(); + } + + private void initComponents() { + + setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); + + titleLabel.setFont(new Font("sansserif", Font.PLAIN, 18)); + setTitle("Delete a Group"); + + titleLabel.setText("Delete a group"); + submitButton.setText("Submit"); + cancelButton.setText("Cancel"); + groupLabel.setText("Group:"); + + ComponentDecorator.submitAndCancel(submitButton, cancelButton); + + submitButton.addActionListener(this::submitEvent); + cancelButton.addActionListener(this::cancelEvent); + + ComboRenderer.setRenderer(groupCombo, sv.groupManager().getGroups().toArray(new Group[0])); + + GroupLayout layout = new GroupLayout(getContentPane()); + getContentPane().setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addGap(23, 23, 23) + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING) + .addComponent(groupLabel) + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.TRAILING, false) + .addGroup(GroupLayout.Alignment.LEADING, layout.createSequentialGroup() + .addComponent(cancelButton) + .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(submitButton)) + .addComponent(groupCombo, GroupLayout.Alignment.LEADING, GroupLayout.PREFERRED_SIZE, 250, GroupLayout.PREFERRED_SIZE)))) + .addGroup(layout.createSequentialGroup() + .addGap(54, 54, 54) + .addComponent(titleLabel))) + .addContainerGap(29, Short.MAX_VALUE))); + layout.setVerticalGroup( + layout.createParallelGroup(GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addContainerGap() + .addComponent(titleLabel) + .addPreferredGap(LayoutStyle.ComponentPlacement.UNRELATED) + .addComponent(groupLabel) + .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) + .addComponent(groupCombo, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) + .addGap(18, 18, 18) + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) + .addComponent(cancelButton) + .addComponent(submitButton)) + .addContainerGap(18, Short.MAX_VALUE))); + pack(); + WindowConfig.center(this); + } + + private void submitEvent(ActionEvent evt) { + sv.deleteGroup(((Group) groupCombo.getSelectedItem())); + DisplayHandler.displayGroups(); + this.dispose(); + } + + private void cancelEvent(ActionEvent evt) { + this.dispose(); + } +} diff --git a/src/main/java/org/lumijiez/gui/forms/group/EditGroupForm.java b/src/main/java/org/lumijiez/gui/forms/group/EditGroupForm.java new file mode 100644 index 0000000..3631c1e --- /dev/null +++ b/src/main/java/org/lumijiez/gui/forms/group/EditGroupForm.java @@ -0,0 +1,124 @@ +package org.lumijiez.gui.forms.group; + +import org.lumijiez.base.Faculty; +import org.lumijiez.base.Group; +import org.lumijiez.gui.util.ComboRenderer; +import org.lumijiez.gui.util.ComponentDecorator; +import org.lumijiez.gui.util.DisplayHandler; +import org.lumijiez.gui.util.WindowConfig; +import org.lumijiez.managers.Supervisor; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.util.Objects; + +public class EditGroupForm extends JFrame { + private final JLabel titleLabel = new JLabel(); + private final JLabel facultyLabel = new JLabel(); + private final JLabel groupLabel = new JLabel(); + private final JLabel nameLabel = new JLabel(); + private final JButton cancelButton = new JButton(); + private final JButton submitButton = new JButton(); + private final JTextField nameField = new JTextField(); + private final JComboBox facultyCombo = new JComboBox<>(); + private final JComboBox groupCombo = new JComboBox<>(); + private final Supervisor sv; + + public EditGroupForm(Supervisor sv) { + this.sv = sv; + initComponents(); + } + + private void initComponents() { + + setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); + + titleLabel.setFont(new Font("sansserif", Font.PLAIN, 18)); + setTitle("Edit a Group"); + + titleLabel.setText("Edit a group"); + submitButton.setText("Submit"); + cancelButton.setText("Cancel"); + nameLabel.setText("New name:"); + groupLabel.setText("Group:"); + facultyLabel.setText("Faculty:"); + + ComponentDecorator.submitAndCancel(submitButton, cancelButton); + + submitButton.addActionListener(this::submitEvent); + cancelButton.addActionListener(this::cancelEvent); + + ComboRenderer.setRenderer(facultyCombo, sv.facultyManager().getFaculties().toArray(new Faculty[0])); + ComboRenderer.setRenderer(groupCombo, sv.groupManager().getGroups().toArray(new Group[0])); + + GroupLayout layout = new GroupLayout(getContentPane()); + getContentPane().setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addGap(25, 25, 25) + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addGap(129, 129, 129) + .addComponent(titleLabel)) + .addGroup(layout.createSequentialGroup() + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.TRAILING) + .addComponent(cancelButton) + .addGroup(layout.createSequentialGroup() + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING) + .addComponent(groupCombo, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) + .addComponent(groupLabel)) + .addGap(34, 34, 34) + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING) + .addComponent(nameField, GroupLayout.PREFERRED_SIZE, 178, GroupLayout.PREFERRED_SIZE) + .addComponent(nameLabel)))) + .addGap(27, 27, 27) + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING) + .addComponent(facultyLabel) + .addComponent(facultyCombo, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) + .addComponent(submitButton)))) + .addContainerGap(34, Short.MAX_VALUE))); + layout.setVerticalGroup( + layout.createParallelGroup(GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addGap(7, 7, 7) + .addComponent(titleLabel) + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addGap(35, 35, 35) + .addComponent(facultyCombo, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)) + .addGroup(layout.createSequentialGroup() + .addGap(15, 15, 15) + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) + .addComponent(nameLabel) + .addComponent(groupLabel) + .addComponent(facultyLabel)) + .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) + .addComponent(nameField, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) + .addComponent(groupCombo, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)))) + .addGap(31, 31, 31) + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) + .addComponent(cancelButton) + .addComponent(submitButton)) + .addContainerGap(36, Short.MAX_VALUE))); + pack(); + WindowConfig.center(this); + } + + private void submitEvent(ActionEvent evt) { + Faculty fac = ((Faculty) Objects.requireNonNull(facultyCombo.getSelectedItem())); + Group gr = (Group) Objects.requireNonNull(groupCombo.getSelectedItem()); + if (!nameField.getText().isEmpty()) { + sv.editGroup(gr, nameField.getText(), fac); + DisplayHandler.displayGroups(); + this.dispose(); + } else JOptionPane.showMessageDialog(null, "Fill in all the fields!", "Warning!", JOptionPane.INFORMATION_MESSAGE, null); + } + + private void cancelEvent(ActionEvent evt) { + this.dispose(); + } + +} diff --git a/src/main/java/org/lumijiez/gui/forms/group/ShowGroupForm.java b/src/main/java/org/lumijiez/gui/forms/group/ShowGroupForm.java new file mode 100644 index 0000000..1d5eb05 --- /dev/null +++ b/src/main/java/org/lumijiez/gui/forms/group/ShowGroupForm.java @@ -0,0 +1,105 @@ +package org.lumijiez.gui.forms.group; + +import org.lumijiez.base.Group; +import org.lumijiez.base.Student; +import org.lumijiez.gui.util.ComboRenderer; +import org.lumijiez.gui.util.ComponentDecorator; +import org.lumijiez.gui.util.Settings; +import org.lumijiez.gui.util.WindowConfig; +import org.lumijiez.managers.Supervisor; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.util.Objects; + + +public class ShowGroupForm extends JFrame { + private final JLabel titleLabel = new JLabel(); + private final JLabel groupLabel = new JLabel(); + private final JButton cancelButton = new JButton(); + private final JButton submitButton = new JButton(); + private final JComboBox groupCombo = new JComboBox<>(); + private final Supervisor sv; + private final JTextPane mainTextLabel; + + public ShowGroupForm(Supervisor sv, JTextPane mainTextLabel) { + this.sv = sv; + this.mainTextLabel = mainTextLabel; + initComponents(); + } + + private void initComponents() { + + setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); + + titleLabel.setFont(new Font("sansserif", Font.PLAIN, 18)); + setTitle("Show a Group"); + + titleLabel.setText("Show a group"); + groupLabel.setText("Group:"); + cancelButton.setText("Cancel"); + submitButton.setText("Submit"); + + ComponentDecorator.submitAndCancel(submitButton, cancelButton); + + submitButton.addActionListener(this::submitEvent); + cancelButton.addActionListener(this::cancelEvent); + + ComboRenderer.setRenderer(groupCombo, sv.groupManager().getGroups().toArray(new Group[0])); + + GroupLayout layout = new GroupLayout(getContentPane()); + getContentPane().setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addGap(25, 25, 25) + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING) + .addComponent(groupLabel) + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.TRAILING, false) + .addGroup(layout.createSequentialGroup() + .addComponent(cancelButton) + .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(submitButton)) + .addComponent(groupCombo, GroupLayout.PREFERRED_SIZE, 250, GroupLayout.PREFERRED_SIZE)))) + .addGroup(layout.createSequentialGroup() + .addGap(47, 47, 47) + .addComponent(titleLabel))) + .addContainerGap(24, Short.MAX_VALUE))); + layout.setVerticalGroup( + layout.createParallelGroup(GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addContainerGap() + .addComponent(titleLabel) + .addGap(15, 15, 15) + .addComponent(groupLabel) + .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) + .addComponent(groupCombo, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) + .addGap(18, 18, 18) + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) + .addComponent(cancelButton) + .addComponent(submitButton)) + .addContainerGap(25, Short.MAX_VALUE))); + pack(); + WindowConfig.center(this); + } + + private void submitEvent(ActionEvent evt) { + StringBuilder text = new StringBuilder(); + Group gr = (Group) Objects.requireNonNull(groupCombo.getSelectedItem()); + text.append("=================== Group: ").append(gr.getName()).append("=====================
"); + for (Student student : gr.getStudents()) + text.append("Name: ").append(student.getName()) + .append("
Email: ").append(student.getEmail()) + .append("
Enrol date: ").append(student.getEnrollmentDate()) + .append("
===============================================
"); + mainTextLabel.setText(text.toString()); + this.dispose(); + } + + private void cancelEvent(ActionEvent evt) { + this.dispose(); + } +} diff --git a/src/main/java/org/lumijiez/gui/forms/student/AddStudentForm.java b/src/main/java/org/lumijiez/gui/forms/student/AddStudentForm.java new file mode 100644 index 0000000..68996e6 --- /dev/null +++ b/src/main/java/org/lumijiez/gui/forms/student/AddStudentForm.java @@ -0,0 +1,283 @@ +package org.lumijiez.gui.forms.student; + +import org.lumijiez.base.Faculty; +import org.lumijiez.base.Group; +import org.lumijiez.gui.util.ComboRenderer; +import org.lumijiez.gui.util.ComponentDecorator; +import org.lumijiez.gui.util.DisplayHandler; +import org.lumijiez.gui.util.WindowConfig; +import org.lumijiez.managers.Supervisor; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.util.Calendar; +import java.util.Date; +import java.util.Objects; + +public class AddStudentForm extends JFrame { + private final JLabel titleLabel = new JLabel(); + private final JLabel nameLabel = new JLabel(); + private final JLabel surnameLabel = new JLabel(); + private final JLabel emailLabel = new JLabel(); + private final JLabel groupLabel = new JLabel(); + private final JLabel facultyLabel = new JLabel(); + private final JLabel birthYearLabel = new JLabel(); + private final JLabel birthDayLabel = new JLabel(); + private final JLabel birthMonthLabel = new JLabel(); + private final JLabel enrolDayLabel = new JLabel(); + private final JLabel enrolMonthLabel = new JLabel(); + private final JLabel enrolYearLabel = new JLabel(); + private final JButton submitButton = new JButton(); + private final JButton cancelButton = new JButton(); + private final JTextField nameField = new JTextField(); + private final JTextField surnameField = new JTextField(); + private final JTextField emailField = new JTextField(); + private final JComboBox groupCombo = new JComboBox<>(); + private final JComboBox facultyCombo = new JComboBox<>(); + private final JComboBox birthYearField = new JComboBox<>(); + private final JComboBox birthDayField = new JComboBox<>(); + private final JComboBox birthMonthField = new JComboBox<>(); + private final JComboBox enrolDayField = new JComboBox<>(); + private final JComboBox enrolMonthField = new JComboBox<>(); + private final JComboBox enrolYearField = new JComboBox<>(); + private final Supervisor sv; + + public AddStudentForm(Supervisor sv) { + this.sv = sv; + + Integer[] days = new Integer[31]; + for (int i = 0; i < 31; i++) { + days[i] = i + 1; + } + + Integer[] months = new Integer[12]; + for (int i = 0; i < 12; i++) { + months[i] = i + 1; + } + + Integer[] years = new Integer[100]; + for (int i = 0; i < 100; i++) { + years[i] = 1970 + i; + } + + birthDayField.setModel(new DefaultComboBoxModel<>(days)); + birthMonthField.setModel(new DefaultComboBoxModel<>(months)); + birthYearField.setModel(new DefaultComboBoxModel<>(years)); + + enrolDayField.setModel(new DefaultComboBoxModel<>(days)); + enrolMonthField.setModel(new DefaultComboBoxModel<>(months)); + enrolYearField.setModel(new DefaultComboBoxModel<>(years)); + + initComponents(); + } + + + private void initComponents() { + + setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); + + titleLabel.setFont(new Font("sansserif", Font.PLAIN, 18)); + setTitle("Add a Student"); + + titleLabel.setText("Add a new student"); + submitButton.setText("Submit"); + cancelButton.setText("Cancel"); + nameLabel.setText("Name:"); + surnameLabel.setText("Surname:"); + emailLabel.setText("Email:"); + groupLabel.setText("Group:"); + facultyLabel.setText("Faculty:"); + birthYearLabel.setText("Year of Birth:"); + birthDayLabel.setText("Day of Birth:"); + birthMonthLabel.setText("Month of Birth:"); + enrolDayLabel.setText("Day of Enrollment:"); + enrolMonthLabel.setText("Month of Enrollment:"); + enrolYearLabel.setText("Year of Enrollment:"); + + ComponentDecorator.submitAndCancel(submitButton, cancelButton); + + submitButton.addActionListener(this::submitEvent); + cancelButton.addActionListener(this::cancelEvent); + + ComboRenderer.setRenderer(facultyCombo, sv.facultyManager().getFaculties().toArray(new Faculty[0])); + ComboRenderer.setRenderer(groupCombo, sv.groupManager().getGroups().toArray(new Group[0])); + + GroupLayout layout = new GroupLayout(getContentPane()); + getContentPane().setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(GroupLayout.Alignment.LEADING) + .addGroup(GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addGap(132, 132, 132) + .addComponent(titleLabel)) + .addGroup(layout.createSequentialGroup() + .addGap(25, 25, 25) + .addComponent(surnameLabel) + .addGap(142, 142, 142) + .addComponent(emailLabel))) + .addContainerGap(GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addGroup(layout.createSequentialGroup() + .addGap(21, 21, 21) + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING, false) + .addComponent(surnameField, GroupLayout.DEFAULT_SIZE, 184, Short.MAX_VALUE) + .addComponent(nameField) + .addGroup(layout.createSequentialGroup() + .addGap(5, 5, 5) + .addComponent(nameLabel)) + .addGroup(GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING) + .addComponent(birthDayField, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) + .addComponent(birthDayLabel)) + .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING, false) + .addComponent(birthMonthLabel, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(birthMonthField)))) + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING) + .addGroup(GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() + .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(groupLabel) + .addGap(67, 67, 67) + .addComponent(facultyLabel) + .addGap(51, 51, 51)) + .addGroup(layout.createSequentialGroup() + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addGap(18, 18, 18) + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING, false) + .addGroup(layout.createSequentialGroup() + .addComponent(groupCombo, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) + .addGap(34, 34, 34) + .addComponent(facultyCombo, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)) + .addComponent(emailField, GroupLayout.PREFERRED_SIZE, 178, GroupLayout.PREFERRED_SIZE) + .addGroup(layout.createSequentialGroup() + .addComponent(cancelButton) + .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(submitButton)))) + .addGroup(layout.createSequentialGroup() + .addGap(32, 32, 32) + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING) + .addComponent(birthYearLabel) + .addComponent(birthYearField, GroupLayout.PREFERRED_SIZE, 94, GroupLayout.PREFERRED_SIZE)))) + .addContainerGap(GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))) + .addGroup(layout.createSequentialGroup() + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING, false) + .addComponent(enrolDayLabel, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(enrolDayField)) + .addGap(29, 29, 29) + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addComponent(enrolMonthLabel, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED)) + .addGroup(layout.createSequentialGroup() + .addComponent(enrolMonthField, GroupLayout.DEFAULT_SIZE, 91, Short.MAX_VALUE) + .addGap(55, 55, 55))) + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addComponent(enrolYearField, GroupLayout.DEFAULT_SIZE, 91, Short.MAX_VALUE) + .addGap(43, 43, 43)) + .addGroup(layout.createSequentialGroup() + .addComponent(enrolYearLabel, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addContainerGap())))))); + layout.setVerticalGroup( + layout.createParallelGroup(GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addContainerGap() + .addComponent(titleLabel) + .addGap(13, 13, 13) + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) + .addComponent(nameLabel) + .addComponent(groupLabel) + .addComponent(facultyLabel)) + .addGap(3, 3, 3) + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) + .addComponent(nameField, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) + .addComponent(groupCombo, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) + .addComponent(facultyCombo, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)) + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addGap(11, 11, 11) + .addComponent(surnameLabel) + .addGap(5, 5, 5)) + .addGroup(GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() + .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) + .addComponent(emailLabel) + .addGap(4, 4, 4))) + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) + .addComponent(surnameField, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) + .addComponent(emailField, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)) + .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED, 11, Short.MAX_VALUE) + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) + .addComponent(birthDayLabel) + .addComponent(birthMonthLabel) + .addComponent(birthYearLabel)) + .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) + .addComponent(birthDayField, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) + .addComponent(birthMonthField, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) + .addComponent(birthYearField, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)) + .addGap(18, 18, 18) + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) + .addComponent(enrolDayLabel) + .addComponent(enrolMonthLabel) + .addComponent(enrolYearLabel)) + .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) + .addComponent(enrolDayField, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) + .addComponent(enrolMonthField, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) + .addComponent(enrolYearField, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)) + .addGap(36, 36, 36) + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) + .addComponent(cancelButton) + .addComponent(submitButton)) + .addGap(21, 21, 21))); + pack(); + WindowConfig.center(this); + } + + private void cancelEvent(ActionEvent actionEvent) { + this.dispose(); + } + + private void submitEvent(ActionEvent evt) { + String name = nameField.getText(); + String surname = surnameField.getText(); + String email = emailField.getText(); + Group group = getSelectedGroup(); + Faculty faculty = getSelectedFaculty(); + Date birthDate = getDateFromFields(birthYearField, birthMonthField, birthDayField); + Date enrolDate = getDateFromFields(enrolYearField, enrolMonthField, enrolDayField); + + if (!name.isEmpty() && !surname.isEmpty() && !email.isEmpty()) { + sv.addStudent(name, surname, email, group, faculty, birthDate, enrolDate); + DisplayHandler.displayStudents(); + this.dispose(); + } else JOptionPane.showMessageDialog(null, "Fill in all the fields!", "Warning!", JOptionPane.INFORMATION_MESSAGE, null); + } + + private Group getSelectedGroup() { + return (Group) Objects.requireNonNull(groupCombo.getSelectedItem()); + } + + private Faculty getSelectedFaculty() { + return (Faculty) Objects.requireNonNull(facultyCombo.getSelectedItem()); + } + + private Date getDateFromFields(JComboBox yearField, JComboBox monthField, JComboBox dayField) { + int year = (Integer) Objects.requireNonNull(yearField.getSelectedItem()); + int month = (Integer) Objects.requireNonNull(monthField.getSelectedItem()) - 1; + int day = (Integer) Objects.requireNonNull(dayField.getSelectedItem()); + + Calendar calendar = Calendar.getInstance(); + calendar.set(Calendar.YEAR, year); + calendar.set(Calendar.MONTH, month); + calendar.set(Calendar.DAY_OF_MONTH, day); + + return calendar.getTime(); + } + + +} diff --git a/src/main/java/org/lumijiez/gui/forms/student/DeleteStudentForm.java b/src/main/java/org/lumijiez/gui/forms/student/DeleteStudentForm.java new file mode 100644 index 0000000..d6be12c --- /dev/null +++ b/src/main/java/org/lumijiez/gui/forms/student/DeleteStudentForm.java @@ -0,0 +1,95 @@ +package org.lumijiez.gui.forms.student; + +import org.lumijiez.base.Student; +import org.lumijiez.gui.util.ComboRenderer; +import org.lumijiez.gui.util.ComponentDecorator; +import org.lumijiez.gui.util.DisplayHandler; +import org.lumijiez.gui.util.WindowConfig; +import org.lumijiez.managers.Supervisor; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.util.Objects; + +public class DeleteStudentForm extends JFrame { + private final JLabel titleLabel = new JLabel(); + private final JLabel studentLabel = new JLabel(); + private final JButton cancelButton = new JButton(); + private final JButton submitButton = new JButton(); + private final JComboBox studentCombo = new JComboBox<>(); + private final Supervisor sv; + + public DeleteStudentForm(Supervisor sv) { + this.sv = sv; + initComponents(); + } + + private void initComponents() { + + setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); + + titleLabel.setFont(new Font("sansserif", Font.PLAIN, 18)); + setTitle("Delete a Student"); + + ComboRenderer.setRenderer(studentCombo, sv.studentManager().getStudents().toArray(new Student[0])); + + ComponentDecorator.submitAndCancel(submitButton, cancelButton); + + cancelButton.setText("Cancel"); + titleLabel.setText("Delete Student"); + submitButton.setText("Submit"); + studentLabel.setText("Student:"); + + submitButton.addActionListener(this::submitEvent); + cancelButton.addActionListener(this::cancelEvent); + + GroupLayout layout = new GroupLayout(getContentPane()); + getContentPane().setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addGap(21, 21, 21) + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING, false) + .addGroup(layout.createSequentialGroup() + .addComponent(cancelButton) + .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(submitButton)) + .addGroup(layout.createSequentialGroup() + .addGap(5, 5, 5) + .addComponent(studentLabel)) + .addComponent(studentCombo, GroupLayout.PREFERRED_SIZE, 250, GroupLayout.PREFERRED_SIZE)) + .addContainerGap(26, Short.MAX_VALUE)) + .addGroup(GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() + .addContainerGap(GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(titleLabel) + .addGap(51, 51, 51))); + layout.setVerticalGroup( + layout.createParallelGroup(GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addGap(7, 7, 7) + .addComponent(titleLabel) + .addPreferredGap(LayoutStyle.ComponentPlacement.UNRELATED) + .addComponent(studentLabel) + .addGap(3, 3, 3) + .addComponent(studentCombo, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) + .addGap(18, 18, 18) + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) + .addComponent(submitButton) + .addComponent(cancelButton)) + .addContainerGap(26, Short.MAX_VALUE))); + pack(); + WindowConfig.center(this); + } + + private void submitEvent(ActionEvent evt) { + Student student = ((Student) Objects.requireNonNull(studentCombo.getSelectedItem())); + sv.deleteStudent(student); + DisplayHandler.displayStudents(); + this.dispose(); + } + + private void cancelEvent(ActionEvent evt) { + this.dispose(); + } +} diff --git a/src/main/java/org/lumijiez/gui/forms/student/EditStudentForm.java b/src/main/java/org/lumijiez/gui/forms/student/EditStudentForm.java new file mode 100644 index 0000000..ad986f3 --- /dev/null +++ b/src/main/java/org/lumijiez/gui/forms/student/EditStudentForm.java @@ -0,0 +1,312 @@ +package org.lumijiez.gui.forms.student; + +import org.lumijiez.base.Faculty; +import org.lumijiez.base.Group; +import org.lumijiez.base.Student; +import org.lumijiez.gui.util.ComboRenderer; +import org.lumijiez.gui.util.ComponentDecorator; +import org.lumijiez.gui.util.DisplayHandler; +import org.lumijiez.gui.util.WindowConfig; +import org.lumijiez.managers.Supervisor; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.util.Calendar; +import java.util.Date; +import java.util.Objects; + +public class EditStudentForm extends JFrame { + private final JLabel bdayLabel = new JLabel(); + private final JLabel bmonthLabel = new JLabel(); + private final JLabel byearLabel = new JLabel(); + private final JLabel edayLabel = new JLabel(); + private final JLabel emailLabel = new JLabel(); + private final JLabel emonthLabel = new JLabel(); + private final JLabel eyearLabel = new JLabel(); + private final JLabel facultyLabel = new JLabel(); + private final JLabel groupLabel = new JLabel(); + private final JLabel nameLabel = new JLabel(); + private final JLabel studentLabel = new JLabel(); + private final JLabel surnameLabel = new JLabel(); + private final JLabel titleLabel = new JLabel(); + private final JButton cancelButton = new JButton(); + private final JButton submitButton = new JButton(); + private final JTextField nameField = new JTextField(); + private final JTextField emailField = new JTextField(); + private final JTextField surnameField = new JTextField(); + private final JComboBox facultyCombo = new JComboBox<>(); + private final JComboBox groupCombo = new JComboBox<>(); + private final JComboBox studentCombo = new JComboBox<>(); + private final JComboBox birthdayCombo; + private final JComboBox birthmonthCombo; + private final JComboBox birthyearCombo; + private final JComboBox enroldayCombo; + private final JComboBox enrolmonthCombo; + private final JComboBox enrolyearCombo; + private final Supervisor sv; + + public EditStudentForm(Supervisor sv) { + this.sv = sv; + + Integer[] days = new Integer[31]; + for (int i = 0; i < 31; i++) { + days[i] = i + 1; + } + + Integer[] months = new Integer[12]; + for (int i = 0; i < 12; i++) { + months[i] = i + 1; + } + + Integer[] years = new Integer[100]; + for (int i = 0; i < 100; i++) { + years[i] = 1970 + i; + } + + birthdayCombo = new JComboBox<>(days); + birthmonthCombo = new JComboBox<>(months); + birthyearCombo = new JComboBox<>(years); + enroldayCombo = new JComboBox<>(days); + enrolmonthCombo = new JComboBox<>(months); + enrolyearCombo = new JComboBox<>(years); + initComponents(); + } + + private void initComponents() { + + setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); + + titleLabel.setFont(new Font("sansserif", Font.PLAIN, 18)); + setTitle("Edit a Student"); + + titleLabel.setText("Edit a student"); + submitButton.setText("Submit"); + surnameLabel.setText("New Surname:"); + studentLabel.setText("Student:"); + facultyLabel.setText("New faculty:"); + groupLabel.setText("New Group:"); + nameLabel.setText("New name:"); + emailLabel.setText("New email:"); + bdayLabel.setText("New birthday:"); + bmonthLabel.setText("New birthmonth:"); + byearLabel.setText("New birthyear:"); + emonthLabel.setText("New enrol month:"); + eyearLabel.setText("New enrol year:"); + edayLabel.setText("New enrol day:"); + cancelButton.setText("Cancel"); + + studentCombo.addActionListener(this::studentComboEvent); + submitButton.addActionListener(this::submitEvent); + cancelButton.addActionListener(this::cancelEvent); + + ComponentDecorator.submitAndCancel(submitButton, cancelButton); + + ComboRenderer.setRenderer(facultyCombo, sv.facultyManager().getFaculties().toArray(new Faculty[0])); + ComboRenderer.setRenderer(groupCombo, sv.groupManager().getGroups().toArray(new Group[0])); + ComboRenderer.setRenderer(studentCombo, sv.studentManager().getStudents().toArray(new Student[0])); + + Student student = ((Student) Objects.requireNonNull(studentCombo.getSelectedItem())); + facultyCombo.setSelectedItem(student.getFaculty()); + groupCombo.setSelectedItem(student.getGroup()); + emailField.setText(student.getEmail()); + nameField.setText(student.getName()); + surnameField.setText(student.getSurname()); + + Calendar birthCalendar = Calendar.getInstance(); + Calendar enrolCalendar = Calendar.getInstance(); + + birthCalendar.setTime(student.getDateOfBirth()); + enrolCalendar.setTime(student.getEnrollmentDate()); + + birthdayCombo.setSelectedItem(birthCalendar.get(Calendar.DAY_OF_MONTH)); + birthmonthCombo.setSelectedItem(birthCalendar.get(Calendar.MONTH) + 1); + birthyearCombo.setSelectedItem(birthCalendar.get(Calendar.YEAR)); + + enroldayCombo.setSelectedItem(enrolCalendar.get(Calendar.DAY_OF_MONTH)); + enrolmonthCombo.setSelectedItem(enrolCalendar.get(Calendar.MONTH) + 1); + enrolyearCombo.setSelectedItem(enrolCalendar.get(Calendar.YEAR)); + + GroupLayout layout = new GroupLayout(getContentPane()); + getContentPane().setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addGap(25, 25, 25) + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING) + .addComponent(enroldayCombo, GroupLayout.PREFERRED_SIZE, 115, GroupLayout.PREFERRED_SIZE) + .addComponent(edayLabel)) + .addGap(33, 33, 33) + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING) + .addComponent(emonthLabel) + .addComponent(enrolmonthCombo, GroupLayout.PREFERRED_SIZE, 115, GroupLayout.PREFERRED_SIZE)) + .addGap(40, 40, 40) + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING) + .addComponent(enrolyearCombo, GroupLayout.PREFERRED_SIZE, 115, GroupLayout.PREFERRED_SIZE) + .addComponent(eyearLabel))) + .addGroup(layout.createSequentialGroup() + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING) + .addComponent(nameField, GroupLayout.PREFERRED_SIZE, 115, GroupLayout.PREFERRED_SIZE) + .addComponent(nameLabel) + .addComponent(groupLabel) + .addComponent(groupCombo, GroupLayout.PREFERRED_SIZE, 115, GroupLayout.PREFERRED_SIZE) + .addComponent(birthdayCombo, GroupLayout.PREFERRED_SIZE, 115, GroupLayout.PREFERRED_SIZE) + .addComponent(bdayLabel) + .addComponent(studentLabel)) + .addGap(33, 33, 33) + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING) + .addComponent(titleLabel) + .addComponent(surnameLabel) + .addComponent(surnameField, GroupLayout.PREFERRED_SIZE, 115, GroupLayout.PREFERRED_SIZE) + .addComponent(facultyLabel) + .addComponent(facultyCombo, GroupLayout.PREFERRED_SIZE, 115, GroupLayout.PREFERRED_SIZE) + .addComponent(bmonthLabel) + .addComponent(birthmonthCombo, GroupLayout.PREFERRED_SIZE, 115, GroupLayout.PREFERRED_SIZE)) + .addGap(40, 40, 40)) + .addGroup(layout.createSequentialGroup() + .addComponent(studentCombo, GroupLayout.PREFERRED_SIZE, 151, GroupLayout.PREFERRED_SIZE) + .addGap(16, 16, 16))) + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING) + .addComponent(birthyearCombo, GroupLayout.PREFERRED_SIZE, 115, GroupLayout.PREFERRED_SIZE) + .addComponent(byearLabel) + .addComponent(emailField, GroupLayout.PREFERRED_SIZE, 115, GroupLayout.PREFERRED_SIZE) + .addComponent(emailLabel))) + .addGroup(GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() + .addComponent(cancelButton) + .addGap(34, 34, 34) + .addComponent(submitButton))) + .addContainerGap(27, Short.MAX_VALUE))); + layout.setVerticalGroup( + layout.createParallelGroup(GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addGap(36, 36, 36) + .addComponent(studentLabel)) + .addGroup(layout.createSequentialGroup() + .addGap(14, 14, 14) + .addComponent(titleLabel))) + .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) + .addComponent(studentCombo, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) + .addGap(18, 18, 18) + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) + .addComponent(surnameLabel) + .addComponent(nameLabel) + .addComponent(emailLabel)) + .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) + .addComponent(nameField, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) + .addComponent(surnameField, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) + .addComponent(emailField, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)) + .addPreferredGap(LayoutStyle.ComponentPlacement.UNRELATED) + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) + .addComponent(groupLabel) + .addComponent(facultyLabel)) + .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) + .addComponent(groupCombo, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) + .addComponent(facultyCombo, GroupLayout.PREFERRED_SIZE, 22, GroupLayout.PREFERRED_SIZE)) + .addGap(7, 7, 7) + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.TRAILING) + .addGroup(layout.createSequentialGroup() + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.TRAILING) + .addComponent(bdayLabel) + .addComponent(bmonthLabel)) + .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) + .addComponent(birthdayCombo, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) + .addComponent(birthmonthCombo, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE))) + .addGroup(layout.createSequentialGroup() + .addComponent(byearLabel) + .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) + .addComponent(birthyearCombo, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE))) + .addPreferredGap(LayoutStyle.ComponentPlacement.UNRELATED) + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.TRAILING) + .addGroup(layout.createSequentialGroup() + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.TRAILING) + .addComponent(edayLabel) + .addComponent(emonthLabel)) + .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) + .addComponent(enroldayCombo, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) + .addComponent(enrolmonthCombo, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE))) + .addGroup(layout.createSequentialGroup() + .addComponent(eyearLabel) + .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) + .addComponent(enrolyearCombo, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE))) + .addGap(35, 35, 35) + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) + .addComponent(submitButton) + .addComponent(cancelButton)) + .addContainerGap(25, Short.MAX_VALUE))); + pack(); + WindowConfig.center(this); + } + + private void cancelEvent(ActionEvent actionEvent) { + this.dispose(); + } + + private void submitEvent(ActionEvent evt) { + String name = nameField.getText(); + String surname = surnameField.getText(); + String email = emailField.getText(); + Group group = (Group) Objects.requireNonNull(groupCombo.getSelectedItem()); + Faculty faculty = ((Faculty) Objects.requireNonNull(facultyCombo.getSelectedItem())); + Student student = ((Student) Objects.requireNonNull(studentCombo.getSelectedItem())); + int birthYear = (Integer) Objects.requireNonNull(birthyearCombo.getSelectedItem()); + int birthMonth = (Integer) Objects.requireNonNull(birthmonthCombo.getSelectedItem()); + int birthDay = (Integer) Objects.requireNonNull(birthdayCombo.getSelectedItem()); + int enrolYear = (Integer) Objects.requireNonNull(enrolyearCombo.getSelectedItem()); + int enrolMonth = (Integer) Objects.requireNonNull(enrolmonthCombo.getSelectedItem()); + int enrolDay = (Integer) Objects.requireNonNull(enroldayCombo.getSelectedItem()); + + Calendar birthCalendar = Calendar.getInstance(); + Calendar enrolCalendar = Calendar.getInstance(); + + birthCalendar.set(Calendar.YEAR, birthYear); + birthCalendar.set(Calendar.MONTH, birthMonth - 1); + birthCalendar.set(Calendar.DAY_OF_MONTH, birthDay); + + enrolCalendar.set(Calendar.YEAR, enrolYear); + enrolCalendar.set(Calendar.MONTH, enrolMonth - 1); + enrolCalendar.set(Calendar.DAY_OF_MONTH, enrolDay); + + Date birthDate = birthCalendar.getTime(); + Date enrolDate = enrolCalendar.getTime(); + + if (!name.isEmpty() && !surname.isEmpty() && !email.isEmpty()) + sv.editStudent(student, name, surname, email, group, faculty, birthDate, enrolDate); + + DisplayHandler.displayStudents(); + this.dispose(); + } + + private void studentComboEvent(ActionEvent evt) { + Student student = ((Student) Objects.requireNonNull(studentCombo.getSelectedItem())); + facultyCombo.setSelectedItem(student.getFaculty()); + groupCombo.setSelectedItem(student.getGroup()); + emailField.setText(student.getEmail()); + nameField.setText(student.getName()); + surnameField.setText(student.getSurname()); + + Calendar birthCalendar = Calendar.getInstance(); + Calendar enrolCalendar = Calendar.getInstance(); + + birthCalendar.setTime(student.getDateOfBirth()); + enrolCalendar.setTime(student.getEnrollmentDate()); + + birthdayCombo.setSelectedItem(birthCalendar.get(Calendar.DAY_OF_MONTH)); + birthmonthCombo.setSelectedItem(birthCalendar.get(Calendar.MONTH) + 1); + birthyearCombo.setSelectedItem(birthCalendar.get(Calendar.YEAR)); + + enroldayCombo.setSelectedItem(enrolCalendar.get(Calendar.DAY_OF_MONTH)); + enrolmonthCombo.setSelectedItem(enrolCalendar.get(Calendar.MONTH) + 1); + enrolyearCombo.setSelectedItem(enrolCalendar.get(Calendar.YEAR)); + } + +} diff --git a/src/main/java/org/lumijiez/gui/forms/student/GradeStudentForm.java b/src/main/java/org/lumijiez/gui/forms/student/GradeStudentForm.java new file mode 100644 index 0000000..67c52f7 --- /dev/null +++ b/src/main/java/org/lumijiez/gui/forms/student/GradeStudentForm.java @@ -0,0 +1,137 @@ +package org.lumijiez.gui.forms.student; + +import org.lumijiez.base.Grade; +import org.lumijiez.base.Student; +import org.lumijiez.enums.Subjects; +import org.lumijiez.gui.util.ComboRenderer; +import org.lumijiez.gui.util.ComponentDecorator; +import org.lumijiez.gui.util.Settings; +import org.lumijiez.gui.util.WindowConfig; +import org.lumijiez.managers.Supervisor; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.util.Objects; + +public class GradeStudentForm extends JFrame { + Integer[] grades = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; + private final JLabel gradeLabel = new JLabel(); + private final JLabel studentLabel = new JLabel(); + private final JLabel subjectLabel = new JLabel(); + private final JLabel titleLabel = new JLabel(); + private final JButton cancelButton = new JButton(); + private final JButton submitButton = new JButton(); + private final JComboBox subjectCombo = new JComboBox<>(); + private final JComboBox studentCombo = new JComboBox<>(); + private final JComboBox gradeCombo = new JComboBox<>(grades); + private final Supervisor sv; + private final JTextPane mainTextLabel; + + public GradeStudentForm(Supervisor sv, JTextPane mainTextLabel) { + this.sv = sv; + this.mainTextLabel = mainTextLabel; + initComponents(); + } + + private void initComponents() { + + setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); + + titleLabel.setFont(new Font("sansserif", Font.PLAIN, 18)); + setTitle("Grade A Student"); + + titleLabel.setText("Grade a student"); + studentLabel.setText("Student:"); + subjectLabel.setText("Subject:"); + submitButton.setText("Submit"); + gradeLabel.setText("Grade:"); + cancelButton.setText("Cancel"); + + ComponentDecorator.submitAndCancel(submitButton, cancelButton); + + submitButton.addActionListener(this::submitEvent); + cancelButton.addActionListener(this::cancelEvent); + + ComboRenderer.setRenderer(subjectCombo, Subjects.values()); + ComboRenderer.setRenderer(studentCombo, sv.studentManager().getStudents().toArray(new Student[0])); + + GroupLayout layout = new GroupLayout(getContentPane()); + getContentPane().setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addGap(25, 25, 25) + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addComponent(gradeLabel) + .addContainerGap()) + .addGroup(layout.createSequentialGroup() + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING) + .addComponent(studentCombo, GroupLayout.PREFERRED_SIZE, 147, GroupLayout.PREFERRED_SIZE) + .addComponent(studentLabel) + .addComponent(gradeCombo, GroupLayout.PREFERRED_SIZE, 147, GroupLayout.PREFERRED_SIZE)) + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED, 37, Short.MAX_VALUE) + .addComponent(subjectLabel) + .addGap(148, 148, 148)) + .addGroup(layout.createSequentialGroup() + .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addComponent(cancelButton) + .addGap(18, 18, 18) + .addComponent(submitButton)) + .addComponent(subjectCombo, GroupLayout.PREFERRED_SIZE, 160, GroupLayout.PREFERRED_SIZE)) + .addContainerGap(GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))))) + .addGroup(layout.createSequentialGroup() + .addGap(129, 129, 129) + .addComponent(titleLabel) + .addGap(0, 0, Short.MAX_VALUE))); + layout.setVerticalGroup( + layout.createParallelGroup(GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addGap(7, 7, 7) + .addComponent(titleLabel) + .addPreferredGap(LayoutStyle.ComponentPlacement.UNRELATED) + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) + .addComponent(subjectLabel) + .addComponent(studentLabel)) + .addGap(3, 3, 3) + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) + .addComponent(studentCombo, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) + .addComponent(subjectCombo, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)) + .addGap(18, 18, 18) + .addComponent(gradeLabel) + .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) + .addComponent(gradeCombo, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) + .addComponent(cancelButton) + .addComponent(submitButton)) + .addContainerGap(30, Short.MAX_VALUE))); + pack(); + WindowConfig.center(this); + } + + private void submitEvent(ActionEvent evt) { + Student student = ((Student) Objects.requireNonNull(studentCombo.getSelectedItem())); + Subjects subject = Subjects.getEnum(Objects.requireNonNull(subjectCombo.getSelectedItem()).toString()); + int intGrade = (Integer) Objects.requireNonNull(gradeCombo.getSelectedItem()); + Grade grade = new Grade(subject, intGrade); + sv.addGrade(student, grade); + + StringBuilder builder = new StringBuilder(); + builder.append("============================================================
"); + builder.append("Grades for ").append(student.getFullname()).append(" from ").append(student.getGroup().getName()).append(":
"); + for (Grade gr : student.getGrades()) builder.append(gr.getSubject()).append(": ").append(gr.getGrade()).append("
"); + builder.append("============================================================
"); + mainTextLabel.setText(builder.toString()); + this.dispose(); + } + + private void cancelEvent(ActionEvent evt) { + this.dispose(); + } + +} diff --git a/src/main/java/org/lumijiez/gui/forms/student/GraduateStudentForm.java b/src/main/java/org/lumijiez/gui/forms/student/GraduateStudentForm.java new file mode 100644 index 0000000..4f88c8a --- /dev/null +++ b/src/main/java/org/lumijiez/gui/forms/student/GraduateStudentForm.java @@ -0,0 +1,95 @@ +package org.lumijiez.gui.forms.student; + +import org.lumijiez.base.Student; +import org.lumijiez.gui.util.ComboRenderer; +import org.lumijiez.gui.util.ComponentDecorator; +import org.lumijiez.gui.util.DisplayHandler; +import org.lumijiez.gui.util.WindowConfig; +import org.lumijiez.managers.Supervisor; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.util.Objects; + +public class GraduateStudentForm extends JFrame { + private final JLabel studentLabel = new JLabel(); + private final JLabel titleLabel = new JLabel(); + private final JButton cancelButton = new JButton(); + private final JButton submitButton = new JButton(); + private final JComboBox studentCombo = new JComboBox<>(); + private final Supervisor sv; + + public GraduateStudentForm(Supervisor sv) { + this.sv = sv; + initComponents(); + } + + private void initComponents() { + + setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); + + titleLabel.setFont(new Font("sansserif", Font.PLAIN, 18)); + setTitle("Graduate a Student"); + + ComboRenderer.setRenderer(studentCombo, sv.studentManager().getEnrolled().toArray(new Student[0])); + + ComponentDecorator.submitAndCancel(submitButton, cancelButton); + + submitButton.setText("Submit"); + cancelButton.setText("Cancel"); + titleLabel.setText("Graduate a Student"); + studentLabel.setText("Student:"); + + submitButton.addActionListener(this::cancelEvent); + cancelButton.addActionListener(this::submitEvent); + + GroupLayout layout = new GroupLayout(getContentPane()); + getContentPane().setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addGap(21, 21, 21) + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING, false) + .addGroup(layout.createSequentialGroup() + .addComponent(cancelButton) + .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(submitButton)) + .addGroup(layout.createSequentialGroup() + .addGap(5, 5, 5) + .addComponent(studentLabel)) + .addComponent(studentCombo, GroupLayout.PREFERRED_SIZE, 250, GroupLayout.PREFERRED_SIZE)) + .addContainerGap(26, Short.MAX_VALUE)) + .addGroup(GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() + .addContainerGap(GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(titleLabel) + .addGap(51, 51, 51))); + layout.setVerticalGroup( + layout.createParallelGroup(GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addGap(7, 7, 7) + .addComponent(titleLabel) + .addPreferredGap(LayoutStyle.ComponentPlacement.UNRELATED) + .addComponent(studentLabel) + .addGap(3, 3, 3) + .addComponent(studentCombo, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) + .addGap(18, 18, 18) + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) + .addComponent(submitButton) + .addComponent(cancelButton)) + .addContainerGap(26, Short.MAX_VALUE))); + pack(); + WindowConfig.center(this); + } + + private void cancelEvent(ActionEvent evt) { + Student student = ((Student) Objects.requireNonNull(studentCombo.getSelectedItem())); + student.setGraduated(true); + DisplayHandler.displayStudents(); + this.dispose(); + } + + private void submitEvent(ActionEvent evt) { + this.dispose(); + } +} diff --git a/src/main/java/org/lumijiez/gui/forms/student/ShowStudentForm.java b/src/main/java/org/lumijiez/gui/forms/student/ShowStudentForm.java new file mode 100644 index 0000000..55b234c --- /dev/null +++ b/src/main/java/org/lumijiez/gui/forms/student/ShowStudentForm.java @@ -0,0 +1,111 @@ +package org.lumijiez.gui.forms.student; + +import org.lumijiez.base.Student; +import org.lumijiez.gui.util.ComboRenderer; +import org.lumijiez.gui.util.ComponentDecorator; +import org.lumijiez.gui.util.Settings; +import org.lumijiez.gui.util.WindowConfig; +import org.lumijiez.managers.Supervisor; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.util.Objects; + +public class ShowStudentForm extends JFrame { + private final JLabel studentLabel = new JLabel(); + private final JLabel titleLabel = new JLabel(); + private final JButton cancelButton = new JButton(); + private final JButton submitButton = new JButton(); + private final JComboBox studentCombo = new JComboBox<>(); + private final Supervisor sv; + private final JTextPane mainTextLabel; + + public ShowStudentForm(Supervisor sv, JTextPane mainTextLabel) { + this.sv = sv; + this.mainTextLabel = mainTextLabel; + initComponents(); + } + + private void initComponents() { + + setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); + + titleLabel.setFont(new Font("sansserif", Font.PLAIN, 18)); + setTitle("Show A Student"); + + titleLabel.setText("Show Student"); + submitButton.setText("Submit"); + studentLabel.setText("Student:"); + cancelButton.setText("Cancel"); + + ComponentDecorator.submitAndCancel(submitButton, cancelButton); + + ComboRenderer.setRenderer(studentCombo, sv.studentManager().getStudents().toArray(new Student[0])); + + cancelButton.addActionListener(this::cancelEvent); + submitButton.addActionListener(this::submitEvent); + + GroupLayout layout = new GroupLayout(getContentPane()); + getContentPane().setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addGap(21, 21, 21) + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addGap(5, 5, 5) + .addComponent(studentLabel)) + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.TRAILING) + .addGroup(layout.createSequentialGroup() + .addComponent(cancelButton) + .addGap(34, 34, 34) + .addComponent(submitButton)) + .addComponent(studentCombo, GroupLayout.PREFERRED_SIZE, 250, GroupLayout.PREFERRED_SIZE)))) + .addGroup(layout.createSequentialGroup() + .addGap(52, 52, 52) + .addComponent(titleLabel))) + .addContainerGap(23, Short.MAX_VALUE))); + layout.setVerticalGroup( + layout.createParallelGroup(GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addContainerGap() + .addComponent(titleLabel) + .addGap(13, 13, 13) + .addComponent(studentLabel) + .addGap(3, 3, 3) + .addComponent(studentCombo, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) + .addGap(18, 18, 18) + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) + .addComponent(cancelButton) + .addComponent(submitButton)) + .addContainerGap(22, Short.MAX_VALUE))); + pack(); + WindowConfig.center(this); + } + + private void submitEvent(ActionEvent evt) { + Student student = ((Student) Objects.requireNonNull(studentCombo.getSelectedItem())); + StringBuilder text = new StringBuilder(); + + text.append("====================== Student Info ======================
"); + mainTextLabel.setText(text.toString()); + text.append("Name: ").append(student.getFullname()).append("
") + .append("Group: ").append(student.getGroup().getName()) + .append("
Faculty: ").append(student.getFaculty().getName()) + .append("
Email: ").append(student.getEmail()) + .append("
Bday: ").append(student.getDateOfBirth()) + .append("
Enrol date: ").append(student.getEnrollmentDate()) + .append("
Graduated: ").append(student.isGraduated() ? "Yes" : "No"); + text.append("
======================================================="); + mainTextLabel.setText(text.toString()); + this.dispose(); + } + + private void cancelEvent(ActionEvent evt) { + this.dispose(); + } + +} diff --git a/src/main/java/org/lumijiez/gui/forms/student/ShowStudentGradesForm.java b/src/main/java/org/lumijiez/gui/forms/student/ShowStudentGradesForm.java new file mode 100644 index 0000000..9f09fab --- /dev/null +++ b/src/main/java/org/lumijiez/gui/forms/student/ShowStudentGradesForm.java @@ -0,0 +1,106 @@ +package org.lumijiez.gui.forms.student; + +import org.lumijiez.base.Grade; +import org.lumijiez.base.Student; +import org.lumijiez.gui.util.ComboRenderer; +import org.lumijiez.gui.util.ComponentDecorator; +import org.lumijiez.gui.util.Settings; +import org.lumijiez.gui.util.WindowConfig; +import org.lumijiez.managers.Supervisor; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.util.Objects; + +public class ShowStudentGradesForm extends JFrame { + private final JLabel studentLabel = new JLabel(); + private final JLabel titleLabel = new JLabel(); + private final JButton cancelButton = new JButton(); + private final JButton submitButton = new JButton(); + private final JComboBox studentCombo = new JComboBox<>(); + private final Supervisor sv; + private final JTextPane mainTextLabel; + + public ShowStudentGradesForm(Supervisor sv, JTextPane mainTextLabel) { + this.sv = sv; + this.mainTextLabel = mainTextLabel; + initComponents(); + } + + private void initComponents() { + + setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); + + titleLabel.setFont(new Font("sansserif", Font.PLAIN, 18)); + setTitle("Show Student Grades"); + + titleLabel.setText("Show Grades"); + studentLabel.setText("Student:"); + submitButton.setText("Submit"); + cancelButton.setText("Cancel"); + + ComponentDecorator.submitAndCancel(submitButton, cancelButton); + + ComboRenderer.setRenderer(studentCombo, sv.studentManager().getStudents().toArray(new Student[0])); + + cancelButton.addActionListener(this::cancelEvent); + submitButton.addActionListener(this::submitEvent); + + GroupLayout layout = new GroupLayout(getContentPane()); + getContentPane().setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addGap(21, 21, 21) + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addGap(5, 5, 5) + .addComponent(studentLabel)) + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.TRAILING) + .addGroup(layout.createSequentialGroup() + .addComponent(cancelButton) + .addGap(34, 34, 34) + .addComponent(submitButton)) + .addComponent(studentCombo, GroupLayout.PREFERRED_SIZE, 250, GroupLayout.PREFERRED_SIZE)))) + .addGroup(layout.createSequentialGroup() + .addGap(50, 50, 50) + .addComponent(titleLabel))) + .addContainerGap(30, Short.MAX_VALUE))); + layout.setVerticalGroup( + layout.createParallelGroup(GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addGap(7, 7, 7) + .addComponent(titleLabel) + .addPreferredGap(LayoutStyle.ComponentPlacement.UNRELATED) + .addComponent(studentLabel) + .addGap(3, 3, 3) + .addComponent(studentCombo, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) + .addGap(18, 18, 18) + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) + .addComponent(cancelButton) + .addComponent(submitButton)) + .addContainerGap(22, Short.MAX_VALUE))); + pack(); + WindowConfig.center(this); + } + + private void submitEvent(ActionEvent evt) { + Student student = ((Student) Objects.requireNonNull(studentCombo.getSelectedItem())); + StringBuilder builder = new StringBuilder(); + builder.append("============================================================
"); + builder.append("Grades for ").append(student.getFullname()).append(" from ").append(student.getGroup().getName()).append(":
"); + for (Grade grade : student.getGrades()) + builder.append(grade.getSubject()).append(": ").append(grade.getGrade()).append("
"); + builder.append("============================================================
"); + mainTextLabel.setText(builder.toString()); + this.dispose(); + } + + private void cancelEvent(ActionEvent evt) { + this.dispose(); + } + +} diff --git a/src/main/java/org/lumijiez/gui/loader/BatchGraduater.java b/src/main/java/org/lumijiez/gui/loader/BatchGraduater.java new file mode 100644 index 0000000..31e88f3 --- /dev/null +++ b/src/main/java/org/lumijiez/gui/loader/BatchGraduater.java @@ -0,0 +1,171 @@ +package org.lumijiez.gui.loader; + +import org.lumijiez.base.Faculty; +import org.lumijiez.base.Group; +import org.lumijiez.base.Student; +import org.lumijiez.enums.StudyField; +import org.lumijiez.gui.util.ComponentDecorator; +import org.lumijiez.gui.util.DisplayHandler; +import org.lumijiez.gui.util.WindowConfig; +import org.lumijiez.managers.Supervisor; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.IOException; + +public class BatchGraduater extends JFrame { + private final Supervisor sv; + private final JButton submitButton = new JButton(); + private final JLabel titleLabel = new JLabel(); + private final JButton browseButton = new JButton(); + private final JLabel formatLabel = new JLabel(); + private final JScrollPane exampleLabel = new JScrollPane(); + private final JTextArea exampleText = new JTextArea(); + private final JButton cancelButton = new JButton(); + private final JTextPane filePane = new JTextPane(); + + public BatchGraduater(Supervisor sv) { + this.sv = sv; + initComponents(); + } + + private void initComponents() { + + titleLabel.setFont(new Font("Segoe UI", Font.PLAIN, 24)); + setTitle("Graduate a Batch of Students"); + + submitButton.addActionListener(this::submitEvent); + cancelButton.addActionListener(this::cancelEvent); + browseButton.addActionListener(this::browseEvent); + + ComponentDecorator.submitAndCancel(submitButton, cancelButton); + + setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); + + titleLabel.setText("Pick a file to graduate a batch"); + submitButton.setText("Submit"); + browseButton.setText("Browse"); + formatLabel.setText("File format example:"); + cancelButton.setText("Cancel"); + + exampleText.setColumns(15); + exampleText.setRows(5); + exampleText.setEditable(false); + exampleText.setText("name: John\nsurname: Doe\nemail: john.doe@example.com\ngroup: FAF-223\nfaculty: FCIM\nspecialty: Mechanical Engineering"); + exampleLabel.setViewportView(exampleText); + + GroupLayout layout = new GroupLayout(getContentPane()); + getContentPane().setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addGap(25, 25, 25) + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addComponent(filePane, GroupLayout.PREFERRED_SIZE, 215, GroupLayout.PREFERRED_SIZE) + .addGap(18, 18, 18) + .addComponent(browseButton)) + .addGroup(layout.createSequentialGroup() + .addGap(104, 104, 104) + .addComponent(cancelButton) + .addGap(18, 18, 18) + .addComponent(submitButton)) + .addComponent(formatLabel) + .addComponent(exampleLabel, GroupLayout.PREFERRED_SIZE, 307, GroupLayout.PREFERRED_SIZE)) + .addContainerGap(33, Short.MAX_VALUE)) + .addGroup(layout.createSequentialGroup() + .addGap(41, 41, 41) + .addComponent(titleLabel) + .addGap(0, 0, Short.MAX_VALUE))); + layout.setVerticalGroup( + layout.createParallelGroup(GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addGap(15, 15, 15) + .addComponent(titleLabel) + .addGap(7, 7, 7) + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING) + .addComponent(filePane, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) + .addComponent(browseButton)) + .addGap(18, 18, 18) + .addComponent(formatLabel) + .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) + .addComponent(exampleLabel, GroupLayout.PREFERRED_SIZE, 208, GroupLayout.PREFERRED_SIZE) + .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED, 23, Short.MAX_VALUE) + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) + .addComponent(cancelButton) + .addComponent(submitButton)) + .addGap(23, 23, 23))); + pack(); + WindowConfig.center(this); + } + + private void cancelEvent(ActionEvent evt) { + this.dispose(); + } + + private void browseEvent(ActionEvent evt) { + JFileChooser fileChooser = new JFileChooser(); + int returnVal = fileChooser.showOpenDialog(this); + if (returnVal == JFileChooser.APPROVE_OPTION) { + java.io.File file = fileChooser.getSelectedFile(); + filePane.setText(file.getAbsolutePath()); + } + } + + private void submitEvent(ActionEvent evt) { + try (BufferedReader reader = new BufferedReader(new FileReader(filePane.getText()))) { + String line, name = "", surname = "", email = "", groupName = "", facultyName = ""; + + while ((line = reader.readLine()) != null) { + if (line.isEmpty()) continue; + + String[] parts = line.split(": ", 2); + if (parts.length != 2) continue; + + String field = parts[0], value = parts[1]; + + switch (field) { + case "name" -> name = value; + case "surname" -> surname = value; + case "email" -> email = value; + case "group" -> groupName = value; + case "faculty" -> facultyName = value; + case "specialty" -> handleStudentGraduation(name, surname, email, groupName, facultyName, value); + default -> System.err.println("Error reading file!"); + } + } + } catch (IOException ex) { + throw new RuntimeException(ex); + } + DisplayHandler.displayStudents(); + + this.dispose(); + } + + private void handleStudentGraduation(String name, String surname, String email, String groupName, String facultyName, String fieldName) { + StudyField specialty = (StudyField.getEnum(fieldName) == null) ? StudyField.DEFAULT_UNASSIGNED : StudyField.getEnum(fieldName); + + Faculty faculty = sv.getFacultyByName(facultyName); + if (faculty == null) { + assert specialty != null; + faculty = new Faculty(facultyName, specialty.getAbbreviation(), specialty); + sv.addFaculty(faculty); + } + + Group group = sv.getGroupByName(groupName, faculty); + if (group == null) { + group = new Group(groupName); + sv.addGroup(group, faculty); + } + + for (Student st : group.getStudents()) { + if (st.getName().equals(name) && st.getSurname().equals(surname) && st.getEmail().equals(email)) { + st.setGraduated(true); + sv.getLogger().logOperation("Graduated student: " + st.getFullname() + " " + st.getGroup().getName()); + } + } + } +} diff --git a/src/main/java/org/lumijiez/gui/loader/BatchLoader.java b/src/main/java/org/lumijiez/gui/loader/BatchLoader.java new file mode 100644 index 0000000..5415f44 --- /dev/null +++ b/src/main/java/org/lumijiez/gui/loader/BatchLoader.java @@ -0,0 +1,172 @@ +package org.lumijiez.gui.loader; + +import org.lumijiez.base.Faculty; +import org.lumijiez.base.Group; +import org.lumijiez.enums.StudyField; +import org.lumijiez.gui.util.ComponentDecorator; +import org.lumijiez.gui.util.DisplayHandler; +import org.lumijiez.gui.util.WindowConfig; +import org.lumijiez.managers.Supervisor; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.IOException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; + +public class BatchLoader extends JFrame { + private final Supervisor sv; + private final JButton submitButton = new JButton(); + private final JLabel titleLabel = new JLabel(); + private final JButton browseButton = new JButton(); + private final JLabel formatLabel = new JLabel(); + private final JScrollPane exampleLabel = new JScrollPane(); + private final JTextArea exampleText = new JTextArea(); + private final JButton cancelButton = new JButton(); + private final JTextPane filePane = new JTextPane(); + + public BatchLoader(Supervisor sv) { + this.sv = sv; + initComponents(); + } + + private void initComponents() { + + titleLabel.setFont(new java.awt.Font("Segoe UI", Font.PLAIN, 24)); + setTitle("Load a Batch of Students"); + + submitButton.addActionListener(this::submitEvent); + cancelButton.addActionListener(this::cancelEvent); + browseButton.addActionListener(this::browseEvent); + + ComponentDecorator.submitAndCancel(submitButton, cancelButton); + + setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); + + titleLabel.setText("Pick a file to load a batch"); + submitButton.setText("Submit"); + browseButton.setText("Browse"); + formatLabel.setText("File format example:"); + cancelButton.setText("Cancel"); + + exampleText.setColumns(15); + exampleText.setRows(5); + exampleText.setEditable(false); + exampleText.setText("name: John\nsurname: Doe\nemail: john.doe@example.com\ngroup: FAF-223\nfaculty: FCIM\nbirthdate: 1998-05-15\nenroldate: 2017-09-01\nspecialty: Mechanical Engineering"); + exampleLabel.setViewportView(exampleText); + + GroupLayout layout = new GroupLayout(getContentPane()); + getContentPane().setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addGap(25, 25, 25) + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addComponent(filePane, GroupLayout.PREFERRED_SIZE, 215, GroupLayout.PREFERRED_SIZE) + .addGap(18, 18, 18) + .addComponent(browseButton)) + .addGroup(layout.createSequentialGroup() + .addGap(104, 104, 104) + .addComponent(cancelButton) + .addGap(18, 18, 18) + .addComponent(submitButton)) + .addComponent(formatLabel) + .addComponent(exampleLabel, GroupLayout.PREFERRED_SIZE, 307, GroupLayout.PREFERRED_SIZE)) + .addContainerGap(33, Short.MAX_VALUE)) + .addGroup(layout.createSequentialGroup() + .addGap(41, 41, 41) + .addComponent(titleLabel) + .addGap(0, 0, Short.MAX_VALUE))); + layout.setVerticalGroup( + layout.createParallelGroup(GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addGap(15, 15, 15) + .addComponent(titleLabel) + .addGap(7, 7, 7) + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING) + .addComponent(filePane, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) + .addComponent(browseButton)) + .addGap(18, 18, 18) + .addComponent(formatLabel) + .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) + .addComponent(exampleLabel, GroupLayout.PREFERRED_SIZE, 208, GroupLayout.PREFERRED_SIZE) + .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED, 23, Short.MAX_VALUE) + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) + .addComponent(cancelButton) + .addComponent(submitButton)) + .addGap(23, 23, 23))); + pack(); + WindowConfig.center(this); + } + + private void cancelEvent(ActionEvent evt) { + this.dispose(); + } + + private void browseEvent(ActionEvent evt) { + JFileChooser fileChooser = new JFileChooser(); + int returnVal = fileChooser.showOpenDialog(this); + if (returnVal == JFileChooser.APPROVE_OPTION) { + java.io.File file = fileChooser.getSelectedFile(); + filePane.setText(file.getAbsolutePath()); + } + } + + private void submitEvent(ActionEvent evt) { + try (BufferedReader reader = new BufferedReader(new FileReader(filePane.getText()))) { + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); + String line, name = "", surname = "", email = "", groupName = "", facultyName = ""; + Date birth = new Date(), enrol = new Date(); + + while ((line = reader.readLine()) != null) { + if (line.isEmpty()) continue; + + String[] parts = line.split(": ", 2); + if (parts.length != 2) continue; + + String field = parts[0], value = parts[1]; + + switch (field) { + case "name" -> name = value; + case "surname" -> surname = value; + case "email" -> email = value; + case "group" -> groupName = value; + case "faculty" -> facultyName = value; + case "birthdate" -> birth = dateFormat.parse(value); + case "enroldate" -> enrol = dateFormat.parse(value); + case "specialty" -> handleStudentAddition(name, surname, email, groupName, facultyName, birth, enrol, value); + default -> System.err.println("Error reading file!"); + } + } + } catch (IOException | ParseException ex) { + throw new RuntimeException(ex); + } + DisplayHandler.displayStudents(); + + this.dispose(); + } + + private void handleStudentAddition(String name, String surname, String email, String groupName, String facultyName, Date birth, Date enrol, String fieldName) { + StudyField specialty = (StudyField.getEnum(fieldName) == null) ? StudyField.DEFAULT_UNASSIGNED : StudyField.getEnum(fieldName); + + Faculty faculty = sv.getFacultyByName(facultyName); + if (faculty == null) { + assert specialty != null; + faculty = new Faculty(facultyName, specialty.getAbbreviation(), specialty); + sv.addFaculty(faculty); + } + + Group group = sv.getGroupByName(groupName, faculty); + if (group == null) { + group = new Group(groupName); + sv.addGroup(group, faculty); + } + + sv.addStudent(name, surname, email, group, faculty, birth, enrol); + } +} diff --git a/src/main/java/org/lumijiez/gui/util/ComboRenderer.java b/src/main/java/org/lumijiez/gui/util/ComboRenderer.java new file mode 100644 index 0000000..4f708d9 --- /dev/null +++ b/src/main/java/org/lumijiez/gui/util/ComboRenderer.java @@ -0,0 +1,21 @@ +package org.lumijiez.gui.util; + +import javax.swing.*; +import java.awt.*; + +// Generic function that takes a ComboBox with a object and sets the DefaultListCellRenderer according to the object +public class ComboRenderer { + public static void setRenderer(JComboBox comboBox, T[] items) { + comboBox.setModel(new DefaultComboBoxModel<>(items)); + comboBox.setRenderer(new DefaultListCellRenderer() { + @Override + public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { + if (value != null) { + setText(value.toString()); + } + return super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); + } + }); + } +} + diff --git a/src/main/java/org/lumijiez/gui/util/ComponentDecorator.java b/src/main/java/org/lumijiez/gui/util/ComponentDecorator.java new file mode 100644 index 0000000..77c08de --- /dev/null +++ b/src/main/java/org/lumijiez/gui/util/ComponentDecorator.java @@ -0,0 +1,10 @@ +package org.lumijiez.gui.util; + +import javax.swing.*; + +public class ComponentDecorator { + public static void submitAndCancel(JButton buttonSubmit, JButton buttonCancel) { + buttonSubmit.setBackground(new java.awt.Color(204, 255, 204)); + buttonCancel.setBackground(new java.awt.Color(255, 204, 204)); + } +} diff --git a/src/main/java/org/lumijiez/gui/util/DisplayHandler.java b/src/main/java/org/lumijiez/gui/util/DisplayHandler.java new file mode 100644 index 0000000..9ad016e --- /dev/null +++ b/src/main/java/org/lumijiez/gui/util/DisplayHandler.java @@ -0,0 +1,66 @@ +package org.lumijiez.gui.util; + +import org.lumijiez.base.Faculty; +import org.lumijiez.base.Group; +import org.lumijiez.base.Student; +import org.lumijiez.gui.StudentManagementGUI; + +public class DisplayHandler { + public static void displayStudents() { + StringBuilder text = new StringBuilder(); + text.append("======================== Students ==========================
"); + for (Student student : StudentManagementGUI.getSv().studentManager().getStudents()) + text.append("Name: ").append(student.getFullname()) + .append("
Group: ").append(student.getGroup().getName()) + .append("
Email: ").append(student.getEmail()) + .append("
Graduated: ").append((student.isGraduated() ? "Yes" : "No")) + .append("
===============================================
"); + StudentManagementGUI.getMainPane().setText(text.toString()); + } + + public static void displayGroups() { + StringBuilder text = new StringBuilder(); + text.append("========================= Groups ===========================
"); + for (Group group : StudentManagementGUI.getSv().groupManager().getGroups()) + text.append("Name: ").append(group.getName()) + .append("
Faculty: ").append(group.getFaculty().getName()) + .append("
Number of students: ").append(group.getStudents().size()) + .append("
===============================================
"); + StudentManagementGUI.getMainPane().setText(text.toString()); + } + + public static void displayFaculties() { + StringBuilder text = new StringBuilder(); + text.append("======================= Faculties =========================
"); + for (Faculty fac : StudentManagementGUI.getSv().facultyManager().getFaculties()) + text.append("Name: ").append(fac.getName()).append("
Specialty: ").append(fac.getField().getName()) + .append("
Abbreviation: ").append(fac.getAbbreviation()) + .append("
Number of groups: ").append(fac.getGroups().size()) + .append("
===============================================
"); + StudentManagementGUI.getMainPane().setText(text.toString()); + } + + public static void displayGraduates() { + StringBuilder text = new StringBuilder(); + text.append("======================== Students =========================="); + for (Student st : StudentManagementGUI.getSv().studentManager().getStudents()) + if (st.isGraduated()) + text.append("Name: ").append(st.getFullname()) + .append("
Group: ").append(st.getGroup().getName()) + .append("
Graduated: ").append("Yes") + .append("
===============================================
"); + StudentManagementGUI.getMainPane().setText(text.toString()); + } + + public static void displayEnrolled() { + StringBuilder text = new StringBuilder(); + text.append("======================== Students ==========================
"); + for (Student st : StudentManagementGUI.getSv().studentManager().getStudents()) + if (!st.isGraduated()) + text.append("Name: ").append(st.getFullname()) + .append("
Group: ").append(st.getGroup().getName()) + .append("
Graduated: ").append("No") + .append("
===============================================
"); + StudentManagementGUI.getMainPane().setText(text.toString()); + } +} diff --git a/src/main/java/org/lumijiez/gui/util/Settings.java b/src/main/java/org/lumijiez/gui/util/Settings.java new file mode 100644 index 0000000..8ab2853 --- /dev/null +++ b/src/main/java/org/lumijiez/gui/util/Settings.java @@ -0,0 +1,5 @@ +package org.lumijiez.gui.util; + +public class Settings { + public static int FontSize = 5; +} diff --git a/src/main/java/org/lumijiez/gui/util/WindowConfig.java b/src/main/java/org/lumijiez/gui/util/WindowConfig.java new file mode 100644 index 0000000..7633812 --- /dev/null +++ b/src/main/java/org/lumijiez/gui/util/WindowConfig.java @@ -0,0 +1,13 @@ +package org.lumijiez.gui.util; + +import javax.swing.*; +import java.awt.*; + +public class WindowConfig { + public static void center(T frame) { + Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); + int x = (screenSize.width - frame.getWidth()) / 2; + int y = (screenSize.height - frame.getHeight()) / 2; + frame.setLocation(x, y); + } +} diff --git a/src/main/java/org/lumijiez/managers/FacultyManager.java b/src/main/java/org/lumijiez/managers/FacultyManager.java new file mode 100644 index 0000000..29571cf --- /dev/null +++ b/src/main/java/org/lumijiez/managers/FacultyManager.java @@ -0,0 +1,32 @@ +package org.lumijiez.managers; + +import org.lumijiez.base.Faculty; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; + +public class FacultyManager implements Serializable { + + private final StudentManager sm = new StudentManager(); + + private final GroupManager gm = new GroupManager(sm); + + private final List faculties = new ArrayList<>(); + + public GroupManager getGm() { + return gm; + } + + public void addFaculty(Faculty faculty) { + faculties.add(faculty); + } + + public void deleteFaculty(Faculty faculty) { + faculties.remove(faculty); + } + + public List getFaculties() { + return faculties; + } +} diff --git a/src/main/java/org/lumijiez/managers/GroupManager.java b/src/main/java/org/lumijiez/managers/GroupManager.java new file mode 100644 index 0000000..28a3971 --- /dev/null +++ b/src/main/java/org/lumijiez/managers/GroupManager.java @@ -0,0 +1,34 @@ +package org.lumijiez.managers; + +import org.lumijiez.base.Group; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; + +public class GroupManager implements Serializable { + + public GroupManager(StudentManager sm) { + this.sm = sm; + } + + private final StudentManager sm; + + private final List groups = new ArrayList<>(); + + public void addGroup(Group group) { + groups.add(group); + } + + public void deleteGroup(Group group) { + groups.remove(group); + } + + public List getGroups() { + return groups; + } + + public StudentManager getSm() { + return sm; + } +} diff --git a/src/main/java/org/lumijiez/managers/LogManager.java b/src/main/java/org/lumijiez/managers/LogManager.java new file mode 100644 index 0000000..b8fb285 --- /dev/null +++ b/src/main/java/org/lumijiez/managers/LogManager.java @@ -0,0 +1,56 @@ +package org.lumijiez.managers; + +import java.io.BufferedWriter; +import java.io.FileWriter; +import java.io.IOException; +import java.io.Serializable; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.Arrays; + +public class LogManager implements Serializable { + + // Has to be transient since it is not serializable + private transient BufferedWriter writer; + + // Initializes the writer object with a file that matches the exact date of application launch time. + // Doing it to keep easier track of logging files. + private void init() { + BufferedWriter writerTemp; + LocalDateTime currentDateTime = LocalDateTime.now(); + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd-HH-mm-ss"); + String fileHandle = "log-" + currentDateTime.format(formatter) + ".txt"; + try { + FileWriter fwriter = new FileWriter(fileHandle); + writerTemp = new BufferedWriter(fwriter); + } catch (IOException e) { + System.out.println(Arrays.toString(e.getStackTrace())); + writerTemp = null; + } + this.writer = writerTemp; + } + + // Logs an operation, also adds the current time to it. + // Inits the writer if it's not initialized already. + public void logOperation(String msg) { + if (writer == null) init(); + LocalDateTime currentDateTime = LocalDateTime.now(); + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss | "); + try { + writer.write(currentDateTime.format(formatter) + msg); + writer.flush(); + writer.newLine(); + } catch (IOException e) { + System.out.println(Arrays.toString(e.getStackTrace())); + } + } + + // Closes the file. + public void close() { + try { + this.writer.close(); + } catch (IOException e) { + throw new RuntimeException(e); + } + } +} diff --git a/src/main/java/org/lumijiez/managers/StudentManager.java b/src/main/java/org/lumijiez/managers/StudentManager.java new file mode 100644 index 0000000..647fe66 --- /dev/null +++ b/src/main/java/org/lumijiez/managers/StudentManager.java @@ -0,0 +1,44 @@ +package org.lumijiez.managers; + +import org.lumijiez.base.Student; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; + +public class StudentManager implements Serializable { + private final List students = new ArrayList<>(); + + public void addStudent(Student student) { + student.getGroup().addStudent(student); + students.add(student); + } + public List getStudents() { + return students; + } + + public void deleteStudent(Student student) { + students.remove(student); + } + +// public List getGraduates() { +// List stList = new ArrayList<>(); +// for (Student st : students) { +// if (st.isGraduated()) { +// stList.add(st); +// } +// } +// return stList; +// } + + public List getEnrolled() { + List stList = new ArrayList<>(); + for (Student st : students) { + if (!st.isGraduated()) { + stList.add(st); + } + } + return stList; + } + +} diff --git a/src/main/java/org/lumijiez/managers/Supervisor.java b/src/main/java/org/lumijiez/managers/Supervisor.java new file mode 100644 index 0000000..6c8181e --- /dev/null +++ b/src/main/java/org/lumijiez/managers/Supervisor.java @@ -0,0 +1,141 @@ +package org.lumijiez.managers; + +import org.lumijiez.base.Faculty; +import org.lumijiez.base.Grade; +import org.lumijiez.base.Group; +import org.lumijiez.base.Student; + +import java.io.Serializable; +import java.util.Date; + +// Supervisor class handles all managers, and all operations regarding any data +public class Supervisor implements Serializable { + + private final FacultyManager fm; + + private final LogManager logger; + + public Supervisor() { + this.fm = new FacultyManager(); + this.logger = new LogManager(); + } + + // Adds a faculty using the FacultyManager + public void addFaculty(Faculty faculty) { + facultyManager().addFaculty(faculty); + logger.logOperation("Faculty added: " + faculty.getName()); + } + + // Deletes a faculty, then deletes all students and groups from the faculty + public void deleteFaculty(Faculty faculty) { + fm.deleteFaculty(faculty); + for (Group gr : faculty.getGroups()) { + groupManager().deleteGroup(gr); + for (Student st : gr.getStudents()) { + studentManager().deleteStudent(st); + } + } + logger.logOperation("Faculty deleted : " + faculty.getName()); + } + + // Adds a grade, self-explanatory + public void addGrade(Student student, Grade grade) { + student.addGrade(grade); + logger.logOperation("Student graded: " + student.getName() + " " + grade.getSubject().getName() + " " + grade.getGrade()); + } + + // Edits a group, also normalizes data to keep track of all bi-directional references + // due to all my base classes containing two-way references to each other. + // For example every Student class holds a reference to the Group and Faculty he is in. + // I did that to keep easier track of objects. + public void editGroup(Group group, String name, Faculty faculty) { + group.setName(name); + Faculty oldFac = group.getFaculty(); + group.setFaculty(faculty); + faculty.addGroup(group); + oldFac.getGroups().remove(group); + logger.logOperation("Group edited: " + group.getName()); + } + + // Deletes a group, then deletes the students. + public void deleteGroup(Group group) { + groupManager().deleteGroup(group); + for (Student st : group.getStudents()) { + studentManager().deleteStudent(st); + } + logger.logOperation("Group deleted: " + group.getName()); + } + + // Adds a student, using the StudentManager + public void addStudent(String name, String surname, String email, Group group, Faculty faculty, Date birth, Date enrol) { + Student newStudent = new Student(name, surname, email, group, faculty, birth, enrol); + studentManager().addStudent(newStudent); + logger.logOperation("Student added: " + newStudent.getFullname()); + } + + // Edits the student, deletes the reference from the old group, and adds everything to the new one + public void editStudent(Student student, String name, String surname, String email, Group group, Faculty faculty, Date birth, Date enrol) { + student.getGroup().deleteStudent(student); + student.setName(name); + student.setSurname(surname); + student.setFullname(name + " " + surname); + student.setEmail(email); + student.setGroup(group); + group.addStudent(student); + student.setFaculty(faculty); + student.setDateOfBirth(birth); + student.setEnrollmentDate(enrol); + logger.logOperation("Student edited: " + student.getFullname()); + } + + // Adds a group, and adds it to the faculty + public void addGroup(Group group, Faculty faculty) { + group.setFaculty(faculty); + faculty.addGroup(group); + groupManager().addGroup(group); + logger.logOperation("Group added: " + group.getName()); + } + + // Deletes a student, simple as that + public void deleteStudent(Student st) { + st.getGroup().deleteStudent(st); + studentManager().deleteStudent(st); + logger.logOperation("Student deleted: " + st.getFullname()); + } + + // Iterates through all faculties to get a faculty that matches the name + // In the future would be great to replace it using an UUID instead of a String name. + public Faculty getFacultyByName(String facultyName) { + for (Faculty faculty : facultyManager().getFaculties()) { + if (faculty.getName().equals(facultyName)) + return faculty; + } + return null; + } + + // Same thing as getFacultyByName() except for Groups + public Group getGroupByName(String groupName, Faculty faculty) { + for (Group group : groupManager().getGroups()) { + if (group.getName().equals(groupName) && group.getFaculty().equals(faculty)) + return group; + } + return null; + } + + public FacultyManager facultyManager() { + return fm; + } + + public GroupManager groupManager() { + return fm.getGm(); + } + + public StudentManager studentManager() { + return fm.getGm().getSm(); + } + + public LogManager getLogger() { + return this.logger; + } + +}