Clean initial

This commit is contained in:
Imbus 2024-02-06 03:28:24 +01:00
commit a2035a8486
21 changed files with 1193 additions and 0 deletions

28
.gitignore vendored Normal file
View file

@ -0,0 +1,28 @@
# Ignore Gradle project-specific cache directory
.gradle
# Ignore Gradle build output directory
build
*.gradle
**/build/
!src/**/build/
# Ignore Gradle GUI config
gradle-app.setting
# Avoid ignoring Gradle wrapper jar file (.jar files are usually ignored)
!gradle-wrapper.jar
# Avoid ignore Gradle wrappper properties
!gradle-wrapper.properties
# Cache of project
.gradletasknamecache
# Eclipse Gradle plugin generated files
# Eclipse Core
.project
# JDT-specific (Eclipse Java Development Tools)
.classpath.class

BIN
gradle/wrapper/gradle-wrapper.jar vendored Normal file

Binary file not shown.

View file

@ -0,0 +1,5 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-6.1.1-all.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists

188
gradlew vendored Executable file
View file

@ -0,0 +1,188 @@
#!/usr/bin/env sh
#
# Copyright 2015 the original author or 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
#
# http://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 UN*X
##
##############################################################################
# Attempt to set APP_HOME
# Resolve links: $0 may be a link
PRG="$0"
# Need this for relative symlinks.
while [ -h "$PRG" ] ; do
ls=`ls -ld "$PRG"`
link=`expr "$ls" : '.*-> \(.*\)$'`
if expr "$link" : '/.*' > /dev/null; then
PRG="$link"
else
PRG=`dirname "$PRG"`"/$link"
fi
done
SAVED="`pwd`"
cd "`dirname \"$PRG\"`/" >/dev/null
APP_HOME="`pwd -P`"
cd "$SAVED" >/dev/null
APP_NAME="Gradle"
APP_BASE_NAME=`basename "$0"`
# 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"'
# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD="maximum"
warn () {
echo "$*"
}
die () {
echo
echo "$*"
echo
exit 1
}
# 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
;;
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"
which java >/dev/null 2>&1 || 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
# Increase the maximum file descriptors if we can.
if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
MAX_FD_LIMIT=`ulimit -H -n`
if [ $? -eq 0 ] ; then
if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
MAX_FD="$MAX_FD_LIMIT"
fi
ulimit -n $MAX_FD
if [ $? -ne 0 ] ; then
warn "Could not set maximum file descriptor limit: $MAX_FD"
fi
else
warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
fi
fi
# For Darwin, add options to specify how the application appears in the dock
if $darwin; then
GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
fi
# For Cygwin, switch paths to Windows format before running java
if $cygwin ; then
APP_HOME=`cygpath --path --mixed "$APP_HOME"`
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
JAVACMD=`cygpath --unix "$JAVACMD"`
# We build the pattern for arguments to be converted via cygpath
ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
SEP=""
for dir in $ROOTDIRSRAW ; do
ROOTDIRS="$ROOTDIRS$SEP$dir"
SEP="|"
done
OURCYGPATTERN="(^($ROOTDIRS))"
# Add a user-defined pattern to the cygpath arguments
if [ "$GRADLE_CYGPATTERN" != "" ] ; then
OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
fi
# Now convert the arguments - kludge to limit ourselves to /bin/sh
i=0
for arg in "$@" ; do
CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
else
eval `echo args$i`="\"$arg\""
fi
i=$((i+1))
done
case $i in
(0) set -- ;;
(1) set -- "$args0" ;;
(2) set -- "$args0" "$args1" ;;
(3) set -- "$args0" "$args1" "$args2" ;;
(4) set -- "$args0" "$args1" "$args2" "$args3" ;;
(5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
(6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
(7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
(8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
(9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
esac
fi
# Escape application args
save () {
for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
echo " "
}
APP_ARGS=$(save "$@")
# Collect all arguments for the java command, following the shell quoting and substitution rules
eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
cd "$(dirname "$0")"
fi
exec "$JAVACMD" "$@"

100
gradlew.bat vendored Normal file
View file

@ -0,0 +1,100 @@
@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 http://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=.
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%
@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%" == "0" goto init
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 init
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
:init
@rem Get command-line arguments, handling Windows variants
if not "%OS%" == "Windows_NT" goto win9xME_args
:win9xME_args
@rem Slurp the command line arguments.
set CMD_LINE_ARGS=
set _SKIP=2
:win9xME_args_slurp
if "x%~1" == "x" goto execute
set CMD_LINE_ARGS=%*
: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 %CMD_LINE_ARGS%
:end
@rem End local scope for the variables with windows NT shell
if "%ERRORLEVEL%"=="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!
if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
exit /b 1
:mainEnd
if "%OS%"=="Windows_NT" endlocal
:omega

View file

@ -0,0 +1,63 @@
package datamodel;
/**
* CurrentUser represents the current user that has logged on to
* the movie booking system. It is a singleton class.
*/
public class CurrentUser {
/**
* The single instance of this class
*/
private static CurrentUser instance;
/**
* The name of the current user.
*/
private String currentUserId;
/**
* Create a CurrentUser object.
*/
private CurrentUser() {
currentUserId = null;
}
/**
* Returns the single instance of this class.
*
* @return The single instance of the class.
*/
public static CurrentUser instance() {
if (instance == null)
instance = new CurrentUser();
return instance;
}
/**
* Check if a user has logged in.
*
* @return true if a user has logged in, false otherwise.
*/
public boolean isLoggedIn() {
return currentUserId != null;
}
/**
* Get the user id of the current user. Should only be called if
* a user has logged in.
*
* @return The user id of the current user.
*/
public String getCurrentUserId() {
return currentUserId == null ? "<none>" : currentUserId;
}
/**
* A new user logs in.
*
* @param userId The user id of the new user.
*/
public void loginAs(String userId) {
currentUserId = userId;
}
}

View file

@ -0,0 +1,88 @@
package datamodel;
import java.sql.*;
/**
* Database is a class that specifies the interface to the
* movie database. Uses JDBC and the MySQL Connector/J driver.
*/
public class Database {
/**
* The database connection.
*/
private Connection conn;
/**
* Create the database interface object. Connection to the database
* is performed later.
*/
public Database() {
conn = null;
}
/* --- TODO: Change this method to fit your choice of DBMS --- */
/**
* Open a connection to the database, using the specified user name
* and password.
*
* @param userName The user name.
* @param password The user's password.
* @return true if the connection succeeded, false if the supplied
* user name and password were not recognized. Returns false also
* if the JDBC driver isn't found.
*/
public boolean openConnection(String userName, String password) {
try {
// Connection strings for included DBMS clients:
// [MySQL] jdbc:mysql://[host]/[database]
// [PostgreSQL] jdbc:postgresql://[host]/[database]
// [SQLite] jdbc:sqlite://[filepath]
// Use "jdbc:mysql://puccini.cs.lth.se/" + userName if you using our shared server
// If outside, this statement will hang until timeout.
conn = DriverManager.getConnection
("jdbc:sqlite:movieBookings.db3", userName, password);
}
catch (SQLException e) {
System.err.println(e);
e.printStackTrace();
return false;
}
return true;
}
/**
* Close the connection to the database.
*/
public void closeConnection() {
try {
if (conn != null)
conn.close();
}
catch (SQLException e) {
e.printStackTrace();
}
conn = null;
System.err.println("Database connection closed.");
}
/**
* Check if the connection to the database has been established
*
* @return true if the connection has been established
*/
public boolean isConnected() {
return conn != null;
}
public Show getShowData(String mTitle, String mDate) {
Integer mFreeSeats = 42;
String mVenue = "Kino 2";
/* --- TODO: add code for database query --- */
return new Show(mTitle, mDate, mVenue, mFreeSeats);
}
/* --- TODO: insert more own code here --- */
}

View file

@ -0,0 +1,38 @@
package datamodel;
// Container for the booking data
public class Reservation {
private int bookingId;
private String movieTitle;
private String performanceDate;
private String theatreName;
public Reservation() {
this(-1, "N/A", "N/A", "N/A");
}
// constructor
public Reservation(int bookingId, String movieTitle, String performanceDate, String theatreName) {
this.bookingId = bookingId;
this.movieTitle = movieTitle;
this.performanceDate = performanceDate;
this.theatreName = theatreName;
}
// getters
public int getBookingId() {
return bookingId;
}
public String getMovieTitle() {
return movieTitle;
}
public String getPerformanceDate() {
return performanceDate;
}
public String getTheatreName() {
return theatreName;
}
}

View file

@ -0,0 +1,39 @@
package datamodel;
// Container for the database data
/* --- TODO: Modify as needed --- */
public class Show {
// attributes associated with database columns
private String title;
private String date;
private String venue;
private Integer freeSeats;
// constructor for "no show"
public Show() {
init("","","",-1);
}
// constructor defining all content
public Show(String t, String d, String v, Integer fs) {
init(t,d,v,fs);
}
// constructor defining only the title
public Show(String t) {
init(t,"","",-1);
}
// all constructors use this
private void init(String t, String d, String v, Integer fs) {
title = t; date = d; venue = v; freeSeats = fs;
}
// getters
public String getTitle() { return title; }
public String getDate() { return date; }
public String getVenue() { return venue; }
public Integer getSeats() { return freeSeats; }
}

View file

@ -0,0 +1,12 @@
package gui;
import javafx.application.Application;
/**
* The application entry-point, the location of the primary main function.
*/
public class App {
public static void main(String[] args) {
Application.launch(MainApplication.class, args);
}
}

146
src/main/java/gui/BookingTab.java Executable file
View file

@ -0,0 +1,146 @@
package gui;
import javafx.collections.FXCollections;
import javafx.fxml.FXML;
import javafx.scene.control.Label;
import javafx.scene.control.ListView;
import javafx.scene.control.Button;
import javafx.scene.text.Text;
import java.util.List;
import datamodel.CurrentUser;
import datamodel.Database;
import datamodel.Show;
import java.util.ArrayList;
public class BookingTab {
// top context message
@FXML private Text topContext;
// bottom message
@FXML private Text bookMsg;
// table references
@FXML private ListView<String> moviesList;
@FXML private ListView<String> datesList;
// show info references
@FXML private Label showTitle;
@FXML private Label showDate;
@FXML private Label showVenue;
@FXML private Label showFreeSeats;
// booking button
@FXML private Button bookTicket;
private Database db;
private Show crtShow = new Show();
public void initialize() {
System.out.println("Initializing BookingTab");
// set up listeners for the movie list selection
moviesList.getSelectionModel().selectedItemProperty().addListener(
(obs, oldV, newV) -> {
// need to update the date list according to the selected movie
// update also the details on the right panel
String movie = newV;
fillDatesList(newV);
fillShow(movie,null);
});
// set up listeners for the date list selection
datesList.getSelectionModel().selectedItemProperty().addListener(
(obs, oldV, newV) -> {
// need to update the details according to the selected date
String movie = moviesList.getSelectionModel().getSelectedItem();
String date = newV;
fillShow(movie, date);
});
// set up booking button listener
// one can either use this method (setup a handler in initialize)
// or directly give a handler name in the fxml, as in the LoginTab class
bookTicket.setOnAction(
(event) -> {
String movie = moviesList.getSelectionModel().getSelectedItem();
String date = datesList.getSelectionModel().getSelectedItem();
/* --- TODO: should attempt to book a ticket via the database --- */
/* --- do not forget to report booking number! --- */
/* --- update the displayed details (free seats) --- */
report("Booked one ticket to "+movie+" on "+date);
});
report("Ready.");
}
// helpers
// updates user display
private void fillStatus(String usr) {
if(usr.isEmpty()) topContext.setText("You must log in as a known user!");
else topContext.setText("Currently logged in as " + usr);
}
private void report(String msg) {
bookMsg.setText(msg);
}
public void setDatabase(Database db) {
this.db = db;
}
private void fillNamesList() {
List<String> allmovies = new ArrayList<String>();
// query the database via db
/* --- TODO: replace with own code --- */
allmovies.add("Pulp Fiction");
allmovies.add("The Big Lebowski");
allmovies.add("Whiplash");
/* --- END TODO --- */
moviesList.setItems(FXCollections.observableList(allmovies));
// remove any selection
moviesList.getSelectionModel().clearSelection();
}
private void fillDatesList(String m) {
List<String> alldates = new ArrayList<String>();
if(m!=null) {
// query the database via db
/* --- TODO: replace with own code --- */
alldates.add("2016-02-01");
alldates.add("2016-01-15");
/* --- END TODO --- */
}
datesList.setItems(FXCollections.observableList(alldates));
// remove any selection
datesList.getSelectionModel().clearSelection();
}
private void fillShow(String movie, String date) {
if(movie==null) // no movie selected
crtShow = new Show();
else if(date==null) // no date selected yet
crtShow = new Show(movie);
else // query the database via db
crtShow = db.getShowData(movie, date);
showTitle.setText(crtShow.getTitle());
showDate.setText(crtShow.getDate());
showVenue.setText(crtShow.getVenue());
if(crtShow.getSeats() >= 0) showFreeSeats.setText(crtShow.getSeats().toString());
else showFreeSeats.setText("-");
}
// called in case the user logged in changed
public void userChanged() {
fillStatus(CurrentUser.instance().getCurrentUserId());
fillNamesList();
fillDatesList(null);
fillShow(null,null);
}
}

71
src/main/java/gui/LoginTab.java Executable file
View file

@ -0,0 +1,71 @@
package gui;
import datamodel.CurrentUser;
import datamodel.Database;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.text.Text;
import javafx.scene.control.TextField;
import javafx.scene.control.Alert;
import javafx.scene.control.Alert.*;
// controller for both the top tabs and login tab!
public class LoginTab {
@FXML private Text actiontarget;
@FXML private TextField username;
private BookingTab bookingTabCtrl;
private Database db;
@FXML protected void handleSubmitButtonAction(ActionEvent event) {
if(!db.isConnected()) {
// inform the user that there is no check against the database
Alert alert = new Alert(AlertType.ERROR);
alert.setTitle("Login fail");
alert.setHeaderText(null);
alert.setContentText("No database connection! Cannot check user credentials.");
alert.showAndWait();
} else {
String uname = username.getText();
/* --- TODO: add code to query the database credentials --- */
// could be if(!db.login(uname)) alert...
// inform the user that there is no check against the database
Alert alert = new Alert(AlertType.INFORMATION);
alert.setTitle("Login fail");
alert.setHeaderText(null);
alert.setContentText("No user check implemented yet!");
alert.showAndWait();
/* --- END TODO --- */
// setting the user name
CurrentUser.instance().loginAs(uname);
// inform the user about logging in
actiontarget.setText("Sign in user "+uname);
// inform booking tab of user change
bookingTabCtrl.userChanged();
}
}
public void initialize() {
System.out.println("Initializing LoginTab.");
}
// helpers
// use this pattern to send data down to controllers at initialization
public void setBookingTab(BookingTab bookingTabCtrl) {
System.out.println("LoginTab sets bookingTab:"+bookingTabCtrl);
this.bookingTabCtrl = bookingTabCtrl;
}
public void setDatabase(Database db) {
this.db = db;
}
}

View file

@ -0,0 +1,65 @@
package gui;
import datamodel.Database;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Alert;
import javafx.scene.control.Alert.AlertType;
import javafx.stage.Stage;
/**
* The Main JavaFX Application class
*
* Use the main method in App to start it all.
*/
public class MainApplication extends Application {
private Database db = new Database();
@Override
public void start(Stage primaryStage) {
try {
// BorderPane root = new BorderPane();
FXMLLoader loader = new FXMLLoader(getClass().getResource("/TopTab.fxml"));
Parent root = loader.load();
Scene scene = new Scene(root,600,440);
scene.getStylesheets().add(getClass().getResource("/application.css").toExternalForm());
// obtain main controller
TopTabView wc = (TopTabView) loader.getController();
// make the database object visible to the controller
wc.setDatabase(db);
primaryStage.setTitle("Movie Booking System");
primaryStage.setScene(scene);
primaryStage.show();
// opening database connection
/* --- TODO: change xxx to your user name, yyy to your password --- */
if(!db.openConnection("xxx", "yyy")) {
Alert alert = new Alert(AlertType.ERROR);
alert.setTitle("Database error");
alert.setHeaderText(null);
alert.setContentText("Could not connect to the database! Check console for details.");
alert.showAndWait();
}
} catch(Exception e) {
e.printStackTrace();
}
}
public void stop() {
// close the database here
db.closeConnection();
try {
super.stop();
} catch (Exception e) {
e.printStackTrace();
}
}
}

View file

@ -0,0 +1,64 @@
package gui;
import java.util.Arrays;
import java.util.List;
import datamodel.Reservation;
import datamodel.Database;
import javafx.fxml.FXML;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.PropertyValueFactory;
public class ReservationsTab {
@FXML private TableView<Reservation> tableReservations = new TableView<>();
private Database db;
public void setDatabase(Database db) {
this.db = db;
}
@SuppressWarnings("unchecked")
public void initialize() {
System.out.println("Initializing BookingListTab");
// Create Column ID
TableColumn<Reservation, Integer> bookingIdColumn = new TableColumn<>("ID");
bookingIdColumn.setPrefWidth(75);
bookingIdColumn.setCellValueFactory(new PropertyValueFactory<Reservation, Integer>("bookingId"));
// Create Column MovieTitle
TableColumn<Reservation, String> movieTitleColumn = new TableColumn<>("Movie Title");
movieTitleColumn.setPrefWidth(150);
movieTitleColumn.setCellValueFactory(new PropertyValueFactory<Reservation, String>("movieTitle"));
// Create Column Date
TableColumn<Reservation, String> performanceDateColumn = new TableColumn<>("Date");
performanceDateColumn.setPrefWidth(120);
performanceDateColumn.setCellValueFactory(new PropertyValueFactory<Reservation, String>("performanceDate"));
// Create Column Theatre Name
TableColumn<Reservation, String> theatreNameColumn = new TableColumn<>("Theatre Name");
theatreNameColumn.setPrefWidth(150);
theatreNameColumn.setCellValueFactory(new PropertyValueFactory<Reservation, String>("theatreName"));
//Insert all columns
tableReservations.getColumns()
.addAll(bookingIdColumn,
movieTitleColumn,
performanceDateColumn,
theatreNameColumn);
}
/**
* Refresh the table view, by getting and replacing the tables content.
*/
public void updateList() {
/* --- TODO: replace with own code using the database object instead --- */
System.out.println("Update booking list called.");
List<Reservation> bookings = Arrays.asList(new Reservation(1, "Star Wars", "2019-12-30", "Bio Söder"));
tableReservations.getItems().setAll(bookings);
}
}

View file

@ -0,0 +1,40 @@
package gui;
import javafx.scene.Parent;
import javafx.scene.control.Tab;
import datamodel.Database;
import javafx.fxml.FXML;
public class TopTabView {
@FXML private Parent aLoginTab;
@FXML private LoginTab aLoginTabController;
@FXML private Parent aBookingTab;
@FXML private BookingTab aBookingTabController;
@FXML private Tab reservationTab;
@FXML private ReservationsTab aReservationTabController;
public void initialize() {
System.out.println("Initializing TopTabView");
// send the booking controller reference to the login controller
// in order to pass data between the two
aLoginTabController.setBookingTab(aBookingTabController);
// When selection is changed, update the list
reservationTab.setOnSelectionChanged(e -> {
if(reservationTab.isSelected()) {
// Initiate an update
aReservationTabController.updateList();
}
});
}
public void setDatabase(Database db) {
aLoginTabController.setDatabase(db);
aBookingTabController.setDatabase(db);
aReservationTabController.setDatabase(db);
}
}

View file

@ -0,0 +1,77 @@
/*
* Copyright (c) 2012 Oracle and/or its affiliates.
* All rights reserved. Use is subject to license terms.
*
* This file is available and licensed under the following license:
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* - Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the distribution.
* - Neither the name of Oracle nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
root {
display: block;
}
.root {
-fx-background-image: url("background.jpg");
}
.label {
-fx-font-size: 12px;
-fx-font-weight: bold;
-fx-text-fill: #333333;
-fx-effect: dropshadow( gaussian , rgba(255,255,255,0.5) , 0,0,0,1 );
}
#welcome-text {
-fx-font-size: 32px;
-fx-font-family: "Arial Black";
-fx-fill: #818181;
-fx-effect: innershadow( three-pass-box , rgba(0,0,0,0.7) , 6, 0.0 , 0 , 2 );
}
#actiontarget {
-fx-fill: FIREBRICK;
-fx-font-weight: bold;
-fx-effect: dropshadow( gaussian , rgba(255,255,255,0.5) , 0,0,0,1 );
}
#topContext {
-fx-fill: BLUE;
-fx-font-weight: bold;
-fx-effect: dropshadow( gaussian , rgba(255,255,255,0.5) , 0,0,0,1 );
}
.button {
-fx-text-fill: white;
-fx-font-family: "Arial Narrow";
-fx-font-weight: bold;
-fx-background-color: linear-gradient(#61a2b1, #2A5058);
-fx-effect: dropshadow( three-pass-box , rgba(0,0,0,0.6) , 5, 0.0 , 0 , 1 );
}
.button:hover {
-fx-background-color: linear-gradient(#2A5058, #61a2b1);
}

BIN
src/main/resources/background.jpg Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 51 KiB

View file

@ -0,0 +1,95 @@
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.ListView?>
<?import javafx.scene.control.SplitPane?>
<?import javafx.scene.layout.VBox?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.ColumnConstraints?>
<?import javafx.scene.layout.GridPane?>
<?import javafx.scene.layout.RowConstraints?>
<?import javafx.scene.layout.BorderPane ?>
<?import javafx.scene.text.*?>
<VBox xmlns:fx="http://javafx.com/fxml"
fx:controller="gui.BookingTab">
<children>
<SplitPane dividerPositions="0.4" prefHeight="400.0"
prefWidth="600.0" styleClass="root" VBox.vgrow="ALWAYS" >
<items>
<GridPane hgap="10" vgap="10">
<columnConstraints>
<ColumnConstraints hgrow="ALWAYS"
minWidth="10.0" prefWidth="120.0" />
<ColumnConstraints hgrow="ALWAYS"
minWidth="10.0" prefWidth="110.0" />
</columnConstraints>
<rowConstraints>
<RowConstraints minHeight="10.0"
prefHeight="30.0" vgrow="SOMETIMES" />
<RowConstraints minHeight="50" prefHeight="300"
vgrow="ALWAYS" />
</rowConstraints>
<children>
<Label text="Movie" GridPane.rowIndex="0"
GridPane.columnIndex="0" />
<Label text="Date" GridPane.rowIndex="0"
GridPane.columnIndex="1" />
<ListView fx:id="moviesList" GridPane.rowIndex="1"
GridPane.columnIndex="0" />
<ListView fx:id="datesList" GridPane.rowIndex="1"
GridPane.columnIndex="1" />
</children>
</GridPane>
<AnchorPane minHeight="0.0" minWidth="0.0"
prefWidth="360.0">
<children>
<Button fx:id="bookTicket" mnemonicParsing="false"
text="Book Ticket" AnchorPane.bottomAnchor="60.0"
AnchorPane.leftAnchor="50.0" AnchorPane.rightAnchor="50.0" />
<Text fx:id="topContext" text="Not logged in!"
AnchorPane.leftAnchor="5.0" AnchorPane.topAnchor="5.0" />
<GridPane AnchorPane.leftAnchor="5.0"
AnchorPane.rightAnchor="5.0" AnchorPane.topAnchor="30.0">
<columnConstraints>
<ColumnConstraints hgrow="SOMETIMES"
minWidth="10.0" prefWidth="100.0" />
<ColumnConstraints hgrow="SOMETIMES"
minWidth="10.0" prefWidth="100.0" />
</columnConstraints>
<rowConstraints>
<RowConstraints minHeight="10.0"
prefHeight="30.0" vgrow="SOMETIMES" />
<RowConstraints minHeight="10.0"
prefHeight="30.0" vgrow="SOMETIMES" />
<RowConstraints minHeight="10.0"
prefHeight="30.0" vgrow="SOMETIMES" />
<RowConstraints minHeight="10.0"
prefHeight="30.0" vgrow="SOMETIMES" />
</rowConstraints>
<children>
<Label text="Movie" />
<Label text="Date" GridPane.rowIndex="1" />
<Label text="Plays at" GridPane.rowIndex="2" />
<Label text="Free seats" GridPane.rowIndex="3" />
<Label fx:id="showTitle" text="Label"
GridPane.columnIndex="1" />
<Label fx:id="showDate" text="Label"
GridPane.columnIndex="1" GridPane.rowIndex="1" />
<Label fx:id="showVenue" text="Label"
GridPane.columnIndex="1" GridPane.rowIndex="2" />
<Label fx:id="showFreeSeats" text="Label"
GridPane.columnIndex="1" GridPane.rowIndex="3" />
</children>
</GridPane>
<Text fx:id="bookMsg" layoutX="83.0" layoutY="368.0"
text="Label" textAlignment="CENTER"
AnchorPane.bottomAnchor="10.0" AnchorPane.leftAnchor="10.0"
AnchorPane.rightAnchor="10.0" />
</children>
</AnchorPane>
</items>
</SplitPane>
</children>
</VBox>

View file

@ -0,0 +1,34 @@
<?xml version="1.0" encoding="UTF-8"?>
<?import java.net.*?>
<?import javafx.geometry.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.text.*?>
<GridPane fx:controller="gui.LoginTab"
xmlns:fx="http://javafx.com/fxml" alignment="center" hgap="10" vgap="10"
styleClass="root">
<padding><Insets top="25" right="25" bottom="25" left="25"/></padding>
<Text id="welcome-text" text="Welcome"
GridPane.columnIndex="0" GridPane.rowIndex="0"
GridPane.columnSpan="2"/>
<Label text="User Name:"
GridPane.columnIndex="0" GridPane.rowIndex="1"/>
<TextField fx:id="username"
GridPane.columnIndex="1" GridPane.rowIndex="1"/>
<HBox spacing="10" alignment="bottom_right"
GridPane.columnIndex="1" GridPane.rowIndex="4">
<Button text="Sign In"
onAction="#handleSubmitButtonAction"/>
</HBox>
<Text fx:id="actiontarget"
GridPane.columnIndex="1" GridPane.rowIndex="6"/>
</GridPane>

View file

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.TableColumn?>
<?import javafx.scene.control.TableView?>
<?import javafx.scene.layout.BorderPane?>
<BorderPane xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/11.0.1" fx:controller="gui.ReservationsTab">
<center>
</center>
<center>
<TableView fx:id="tableReservations" prefHeight="400.0" prefWidth="600.0" BorderPane.alignment="CENTER">
<columns>
</columns>
</TableView>
</center>
</BorderPane>

23
src/main/resources/topTab.fxml Executable file
View file

@ -0,0 +1,23 @@
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.control.*?>
<BorderPane fx:controller="gui.TopTabView" xmlns:fx="http://javafx.com/fxml/1" styleClass="root">
<center>
<TabPane tabClosingPolicy="UNAVAILABLE">
<tabs>
<Tab text="Login">
<fx:include fx:id="aLoginTab" source="loginTab.fxml"/>
</Tab>
<Tab text="Book">
<fx:include fx:id="aBookingTab" source="bookingTab.fxml"/>
</Tab>
<Tab text="Reservations" fx:id="reservationTab">
<fx:include fx:id="aReservationTab" source="reservationsTab.fxml"/>
</Tab>
</tabs>
</TabPane>
</center>
</BorderPane>