Merge branch 'merge' into CSS-Refactor

# Conflicts:
#	client/app/src/main/resources/main/main-view.css
#	client/app/src/main/resources/main/main-view.fxml
This commit is contained in:
Alex Aleksej Rechtin 2022-02-07 11:22:31 +01:00
commit a29f6d204f
38 changed files with 2168 additions and 491 deletions

2
.gitignore vendored
View File

@ -72,3 +72,5 @@ crashlytics-build.properties
.gradle/ .gradle/
build/ build/
/client/config.json

View File

@ -5,24 +5,33 @@ plugins {
} }
javafx { javafx {
version = "11" version = "11.0.2"
modules( modules(
"javafx.controls", "javafx.controls",
"javafx.fxml" "javafx.fxml"
) )
} }
tasks.withType<JavaCompile> {
options.encoding = "UTF-8"
}
application { application {
mainClassName = "client.MainApplication" mainClassName = "main.MainApplication"
}
repositories {
mavenCentral()
} }
dependencies { dependencies {
implementation("com.jfoenix:jfoenix:9.0.10")
implementation(project(":data")) implementation(project(":data"))
} }
val jar by tasks.getting(Jar::class) { val jar by tasks.getting(Jar::class) {
manifest { manifest {
attributes["Main-Class"] = "client.Launcher" attributes["Main-Class"] = "main.Launcher"
} }
from({ from({
configurations.runtimeClasspath.get().map { if (it.isDirectory) it else zipTree(it) } configurations.runtimeClasspath.get().map { if (it.isDirectory) it else zipTree(it) }

View File

@ -0,0 +1,100 @@
package events;
import com.jfoenix.controls.*;
import helper.HttpRequestException;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.Node;
import javafx.scene.control.*;
import javafx.scene.layout.GridPane;
import javafx.stage.Stage;
import javafx.util.StringConverter;
import javafx.util.converter.LocalTimeStringConverter;
import container.DataController;
import container.Event;
import java.time.LocalTime;
import java.time.format.FormatStyle;
import java.util.Locale;
public class CreateEventController {
@FXML
private GridPane mainGrid;
@FXML
protected JFXDatePicker datePickerDate;
@FXML
protected JFXTextField textName;
@FXML
protected JFXComboBox<String> comboBoxPriority;
@FXML
private JFXToggleButton toggleBtnIsFullDay;
@FXML
private JFXToggleButton toggleBtnIsPrivate;
@FXML
private Label labelError;
@FXML
private JFXTimePicker timeStart;
@FXML
private JFXTimePicker timeEnd;
public CreateEventController() {
}
//Marco Kühn//
@FXML
public void initialize() {
StringConverter<LocalTime> defaultConverter = new LocalTimeStringConverter(FormatStyle.SHORT, Locale.GERMANY);
timeStart.set24HourView(true);
timeStart.setConverter(defaultConverter);
timeEnd.set24HourView(true);
timeEnd.setConverter(defaultConverter);
}
//Marc Beyer//
@FXML
protected void createBtnClick(ActionEvent actionEvent) {
try {
if (datePickerDate.getValue() == null) {
throw new IllegalArgumentException("Bitte w\u00e4hle ein Datum aus");
}
System.out.println(datePickerDate.getValue());
Event event = new Event(
textName.getText(),
comboBoxPriority.getSelectionModel().getSelectedIndex(),
toggleBtnIsFullDay.isSelected(),
toggleBtnIsPrivate.isSelected(),
timeStart.getValue(),
timeEnd.getValue(),
datePickerDate.getValue().atStartOfDay(),
(int) DataController.USER_ID
);
System.out.println(event.getAsUrlParam());
sendHttpRequest(event);
Stage stage = (Stage) ((Node) actionEvent.getSource()).getScene().getWindow();
stage.close();
} catch (Exception e) {
labelError.setText(e.getMessage());
}
}
//Marc Beyer//
protected void sendHttpRequest(Event event) throws HttpRequestException {
DataController dataController = new DataController();
dataController.createEvent(event);
}
//Marc Beyer//
@FXML
protected void abortBtnClick(ActionEvent event) {
Stage stage = (Stage) ((Node) event.getSource()).getScene().getWindow();
stage.close();
}
}

View File

@ -0,0 +1,30 @@
package events;
import helper.HttpRequestException;
import container.DataController;
import container.Event;
public class EditEventController extends CreateEventController{
private Event currentEvent;
public Event getCurrentEvent() {
return currentEvent;
}
public void setCurrentEvent(Event currentEvent) {
this.currentEvent = currentEvent;
textName.setText(currentEvent.getName());
datePickerDate.setValue(currentEvent.getDate().toLocalDate());
comboBoxPriority.getSelectionModel().select(currentEvent.getPriority());
//timeEnd.setValue(currentEvent.getEnd());
}
@Override
protected void sendHttpRequest(Event event) throws HttpRequestException {
DataController dataController = new DataController();
dataController.editEvent(currentEvent, event);
}
}

View File

@ -1,68 +0,0 @@
package main;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.Node;
import javafx.scene.control.CheckBox;
import javafx.scene.control.ComboBox;
import javafx.scene.control.DatePicker;
import javafx.scene.control.TextField;
import javafx.stage.Stage;
import res.DataController;
import res.Event;
public class CreateEventController {
@FXML
public DatePicker datePickerDate;
@FXML
public TextField textName;
@FXML
public TextField textStart;
@FXML
public TextField textEnd;
@FXML
public ComboBox<String> ComboBoxTyp;
@FXML
public ComboBox<String> ComboBoxPriotity;
@FXML
public CheckBox checkBoxIsFullDay;
@FXML
public CheckBox checkBoxIsPrivate;
public CreateEventController(){}
@FXML
public void initialize(){}
@FXML
protected void createBtnClick(ActionEvent actionEvent){
Event event = new Event(
textName.getText(),
ComboBoxPriotity.getSelectionModel().getSelectedIndex(),
checkBoxIsFullDay.isSelected(),
checkBoxIsPrivate.isSelected(),
textStart.getText(),
textEnd.getText(),
datePickerDate.getValue().atStartOfDay(),
1
);
System.out.println(event.getAsUrlParam());
DataController dataController = new DataController();
dataController.createEvent(event);
Stage stage = (Stage) ((Node) actionEvent.getSource()).getScene().getWindow();
stage.close();
}
@FXML
protected void abortBtnClick(ActionEvent event){
Stage stage = (Stage) ((Node) event.getSource()).getScene().getWindow();
stage.close();
}
}

View File

@ -1,7 +1,7 @@
package main; package main;
public class Launcher { public class Launcher {
public static void main(String[] args) { public static void main(String[] args) {
MainApplication.main(args); MainApplication.main(args);
} }

View File

@ -1,27 +1,116 @@
//Marc Beyer//
package main; package main;
import config.Config;
import config.ConfigLoader;
import container.DataController;
import container.HttpRequest;
import javafx.application.Application; import javafx.application.Application;
import javafx.fxml.FXMLLoader; import javafx.fxml.FXMLLoader;
import javafx.scene.Scene; import javafx.scene.Scene;
import javafx.stage.Modality;
import javafx.stage.Stage; import javafx.stage.Stage;
import java.io.IOException; import java.io.IOException;
import java.util.Objects; import java.util.Objects;
import java.util.function.Consumer;
public class MainApplication extends Application { public class MainApplication extends Application {
@Override @Override
public void start(Stage stage) throws IOException { public void start(Stage stage) throws IOException {
Config config = ConfigLoader.load();
if(config == null){
config = new Config(false, -1, "");
}
DataController.SERVER_URL = config.toServerUrl();
System.out.println("Ignore 'Illegal reflective access operation'-Warning. See https://github.com/sshahine/JFoenix/issues/1170");
if(
!config.isSaveLogin()
|| !new DataController().loginWithToken(config.getId(), config.getToken())
){
// Load login-scene
loadLoginScene();
}
if (DataController.USER_ID >= 0) {
if(config.isSaveLogin()){
config.setId(DataController.USER_ID);
config.setToken(HttpRequest.TOKEN);
ConfigLoader.save(config);
}
// Load main-scene
loadMainScene(stage);
System.out.println("Logged in...");
}
}
private void loadMainScene(Stage stage) throws IOException {
FXMLLoader fxmlLoader = new FXMLLoader(MainApplication.class.getResource("main-view.fxml")); FXMLLoader fxmlLoader = new FXMLLoader(MainApplication.class.getResource("main-view.fxml"));
Scene scene = new Scene(fxmlLoader.load(), 1200, 700); Scene scene = new Scene(fxmlLoader.load(), 1200, 700);
scene.getStylesheets().add(Objects.requireNonNull(MainApplication.class.getResource("main-view.css")).toExternalForm()); scene.getStylesheets().add(Objects.requireNonNull(
stage.setTitle("Hello!"); MainApplication.class.getResource("main-view.css")).toExternalForm()
);
stage.setTitle("SharePlaner");
stage.setScene(scene); stage.setScene(scene);
stage.show(); stage.show();
}
private void loadLoginScene() {
loadScene(
"Anmelden",
"../users/login.fxml",
"../users/login.css",
650,
500
);
} }
public static void main(String[] args) { public static void main(String[] args) {
launch(); launch();
} }
public static void loadScene(
String title,
String fxml,
String css,
int width,
int height
) {
loadScene(title, fxml, css, width, height, null);
}
public static void loadScene(
String title,
String fxml,
String css,
int width,
int height,
Consumer<FXMLLoader> method
) {
FXMLLoader fxmlLoader = new FXMLLoader(
MainApplication.class.getResource(fxml));
try {
Scene scene = new Scene(fxmlLoader.load(), width, height);
scene.getStylesheets().add(Objects.requireNonNull(
MainApplication.class.getResource(css)).toExternalForm());
Stage stage = new Stage();
stage.setTitle(title);
stage.setScene(scene);
stage.initModality(Modality.APPLICATION_MODAL);
stage.setResizable(false);
if(method != null)method.accept(fxmlLoader);
stage.showAndWait();
} catch (IOException e) {
e.printStackTrace();
}
}
} }

View File

@ -1,36 +1,44 @@
/* Marco Kühn, Marc Beyer */
package main; package main;
import config.Config;
import config.ConfigLoader;
import container.DataController;
import container.Event;
import container.HttpRequest;
import events.EditEventController;
import helper.HttpRequestException;
import javafx.event.ActionEvent; import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.fxml.FXML; import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader; import javafx.scene.Node;
import javafx.geometry.Pos; import javafx.scene.control.Alert;
import javafx.scene.Scene;
import javafx.scene.control.Button; import javafx.scene.control.Button;
import javafx.scene.control.Label; import javafx.scene.control.Label;
import javafx.scene.control.ScrollPane;
import javafx.scene.layout.GridPane; import javafx.scene.layout.GridPane;
import javafx.scene.layout.HBox; import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox; import javafx.scene.layout.VBox;
import javafx.stage.Modality;
import javafx.stage.Stage; import javafx.stage.Stage;
import res.DataController; import ui.DayPane;
import res.Event; import ui.EventPane;
import ui.SvgBtnCreator;
import java.io.IOException;
import java.time.Duration; import java.time.Duration;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatter;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Objects;
public class MainController { public class MainController {
@FXML @FXML
private GridPane calendarGrid; private VBox leftNav;
@FXML @FXML
private Label LabelMonth; private GridPane mainGridPane;
@FXML
private HBox buttonBox;
@FXML
private GridPane calendarGrid;
@FXML
private javafx.scene.control.Label LabelMonth;
private final String[] dayNames = {"Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag", "Sonntag"}; private final String[] dayNames = {"Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag", "Sonntag"};
private final Label[] dayLabel = new Label[7]; private final Label[] dayLabel = new Label[7];
@ -48,8 +56,9 @@ public class MainController {
public void initialize() { public void initialize() {
createWeek(); createWeek();
setDates(); setDates();
updateEvents(); updateEvents();
createBtns();
leftNav.setSpacing(40);
} }
private void updateEvents() { private void updateEvents() {
@ -58,124 +67,114 @@ public class MainController {
} }
DataController dataController = new DataController(); DataController dataController = new DataController();
ArrayList<Event> eventList = dataController.getAllVisibleEvents(); try {
ArrayList<Event> eventList = dataController.getAllVisibleEvents(weekStartDateTime, weekStartDateTime.plusDays(7));
for (Event event : eventList) { for (Event event : eventList) {
addEvent(event); addEvent(event);
}
} catch (HttpRequestException e) {
e.printStackTrace();
} }
} }
@FXML @FXML
protected void onAddBtnClick() { protected void onBackClick() {
try { weekOffset--;
FXMLLoader fxmlLoader = new FXMLLoader(MainApplication.class.getResource("create-event.fxml")); setDates();
Scene scene = new Scene(fxmlLoader.load(), 650, 500);
scene.getStylesheets().add(Objects.requireNonNull(MainApplication.class.getResource("create-event.css")).toExternalForm());
Stage stage = new Stage();
stage.setTitle("Termin erstellen");
stage.setScene(scene);
stage.initModality(Modality.APPLICATION_MODAL);
stage.setResizable(false);
//stage.initStyle(StageStyle.UNDECORATED);
stage.showAndWait();
} catch (IOException e) {
e.printStackTrace();
}
updateEvents(); updateEvents();
} }
@FXML
protected void onTodayClick() {
weekOffset = 0;
setDates();
updateEvents();
}
@FXML
protected void onNextClick() {
weekOffset++;
setDates();
updateEvents();
}
@FXML
protected void onAddBtnClick() {
MainApplication.loadScene(
"Termin erstellen",
"create-event.fxml",
"create-event.css",
650,
650
);
updateEvents();
}
protected void onSettingBtnClick(){
MainApplication.loadScene(
"Einstellungen",
"option-view.fxml",
"option-view.css",
650,
600
);
}
protected void onLogoutBtnClick(ActionEvent event){
ConfigLoader.save(new Config());
DataController.USER_ID = -1;
HttpRequest.TOKEN = "";
Stage stage = (Stage) ((Node) event.getSource()).getScene().getWindow();
stage.close();
}
private void createWeek() { private void createWeek() {
for (int i = 0; i < 7; i++) { for (int i = 0; i < 7; i++) {
Label label = new Label(); DayPane dayPane = new DayPane();
label.setText(dayNames[i]); this.dayLabel[i] = dayPane.getDayLabel();
label.setMaxHeight(Double.MAX_VALUE); calendarGrid.add(dayPane.getDayLabel(), i, 0);
label.setMaxWidth(Double.MAX_VALUE); dayVBoxes[i] = dayPane.getDayVBox();
label.getStyleClass().add("labelDays"); calendarGrid.add(dayPane, i, 1);
dayLabel[i] = label;
calendarGrid.add(label, i, 0);
ScrollPane scrollPane = new ScrollPane();
VBox vBox = new VBox();
vBox.getStyleClass().add("vBoxDays");
vBox.setSpacing(10);
dayVBoxes[i] = vBox;
scrollPane.setContent(vBox);
scrollPane.setFitToWidth(true);
scrollPane.setFitToHeight(true);
scrollPane.setHbarPolicy(ScrollPane.ScrollBarPolicy.AS_NEEDED);
scrollPane.getStyleClass().add("scrollDays");
calendarGrid.add(scrollPane, i, 1);
} }
} }
private void addEvent(Event event) { private void addEvent(Event event) {
VBox vBox = new VBox(); EventPane eventPane = new EventPane(event);
vBox.getStyleClass().add("event"); eventPane.getEditBtn().setOnAction(event1 -> {
vBox.setSpacing(5); MainApplication.loadScene(
"Termin bearbeiten",
HBox btnHBox = new HBox(); "edit-event.fxml",
btnHBox.setAlignment(Pos.BOTTOM_RIGHT); "create-event.css",
Button deleteBtn = new Button(); 650,
deleteBtn.setText(" X "); 650,
deleteBtn.setOnAction(e -> { fxmlLoader -> {
DataController dataController = new DataController(); EditEventController editEventController = fxmlLoader.getController();
dataController.deleteEvent(event.getId()); editEventController.setCurrentEvent(event);
}
);
updateEvents(); updateEvents();
}); });
Button editBtn = new Button();
editBtn.setText("edit");
btnHBox.getChildren().add(editBtn);
btnHBox.getChildren().add(deleteBtn);
vBox.getChildren().add(btnHBox);
Label nameLabel = new Label(event.getName());
vBox.getChildren().add(nameLabel);
if (event.getStart() != null || event.getEnd() != null) {
String timeStr = (event.getStart() != null ? formatTime(event.getStart()) : "")
+ (event.getEnd() != null ? " - " + formatTime(event.getEnd()) : "");
Label timeLabel = new Label(timeStr);
vBox.getChildren().add(timeLabel);
}
Label typeLabel = new Label("Wer: " + event.getOwnerName());
vBox.getChildren().add(typeLabel);
/*
Ä, ä \u00c4, \u00e4
Ö, ö \u00d6, \u00f6
Ü, ü \u00dc, \u00fc
ß \u00df
*/
Label prioLabel = new Label("Priorit\u00e4t: " + event.getPriority());
vBox.getChildren().add(prioLabel);
if (event.isFullDay()) {
Label fullDayLabel = new Label("Dieser Termin bockiert den ganzen Tag!");
vBox.getChildren().add(fullDayLabel);
}
eventPane.getDeleteBtn().setOnAction(e -> {
DataController dataController = new DataController();
try {
dataController.deleteEvent(event.getOwnerId(), event.getId(), event.getDate());
} catch (HttpRequestException ex) {
new Alert(Alert.AlertType.ERROR, ex.getMessage()).showAndWait();
}
updateEvents();
});
LocalDateTime eventDate = event.getDate(); LocalDateTime eventDate = event.getDate();
int day = (int) Duration.between(
int day = (int) Duration.between(weekStartDateTime.toLocalDate().atStartOfDay(), eventDate.toLocalDate().atStartOfDay()).toDays(); weekStartDateTime.toLocalDate().atStartOfDay(), eventDate.toLocalDate().atStartOfDay()).toDays();
if (day >= 0 && day < 7) { if (day >= 0 && day < 7) {
dayVBoxes[day].getChildren().add(vBox); dayVBoxes[day].getChildren().add(eventPane);
} }
} }
private String formatTime(String time) {
String[] timeArr = time.split(":");
if (timeArr.length > 2) {
return timeArr[0] + ":" + timeArr[1];
}
return time;
}
private void setDates() { private void setDates() {
DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("LLLL yyyy"); DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("LLLL yyyy");
DateTimeFormatter dayFormatter = DateTimeFormatter.ofPattern("E dd.MM"); DateTimeFormatter dayFormatter = DateTimeFormatter.ofPattern("E dd.MM");
@ -193,4 +192,39 @@ public class MainController {
LabelMonth.setText(dateFormatter.format(weekStartDateTime)); LabelMonth.setText(dateFormatter.format(weekStartDateTime));
} }
private void createBtns(){
Button addBtn = SvgBtnCreator.createAddBtn();
addBtn.setOnAction(e -> onAddBtnClick());
addBtn.getStyleClass().add("main-btn");
leftNav.getChildren().add(addBtn);
Button settingsBtn = SvgBtnCreator.createSettingBtn();
settingsBtn.setOnAction(e -> onSettingBtnClick());
settingsBtn.getStyleClass().add("main-btn");
leftNav.getChildren().add(settingsBtn);
Button logoutBtn = SvgBtnCreator.createLogoutBtn();
logoutBtn.setOnAction(this::onLogoutBtnClick);
logoutBtn.getStyleClass().add("main-btn");
leftNav.getChildren().add(logoutBtn);
Button backBtn = SvgBtnCreator.createBackBtn();
backBtn.setOnAction(e -> onBackClick());
backBtn.getStyleClass().add("navBtn");
GridPane.setColumnIndex(backBtn, 1);
buttonBox.getChildren().add(backBtn);
Button todayBtn = SvgBtnCreator.createTodayBtn();
todayBtn.setOnAction(e -> onTodayClick());
todayBtn.getStyleClass().add("navBtn");
GridPane.setColumnIndex(todayBtn, 2);
buttonBox.getChildren().add(todayBtn);
Button nextBtn = SvgBtnCreator.createNextBtn();
nextBtn.setOnAction(e -> onNextClick());
nextBtn.getStyleClass().add("navBtn");
GridPane.setColumnIndex(nextBtn, 3);
buttonBox.getChildren().add(nextBtn);
}
} }

View File

@ -0,0 +1,139 @@
/* Marco Kühn */
package main;
import com.jfoenix.controls.*;
import config.Config;
import config.ConfigLoader;
import container.HttpRequest;
import helper.HttpRequestException;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.Node;
import javafx.scene.control.Alert;
import javafx.scene.control.ButtonType;
import javafx.scene.control.Label;
import javafx.scene.layout.GridPane;
import javafx.stage.Stage;
import container.DataController;
import container.User;
import users.EditUserController;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
public class OptionController {
@FXML
private JFXButton updateUserBtn;
@FXML
private JFXButton deleteUserBtn;
@FXML
private JFXButton createUserBtn;
@FXML
private JFXToggleButton saveLoginTBtn;
@FXML
private Label labelError;
@FXML
private GridPane mainGrid;
private JFXComboBox<String> comboBox;
private DataController dataController;
private List<User> users;
private Config config;
@FXML
public void initialize(){
dataController = new DataController();
try{
users = dataController.getAllUser();
} catch (HttpRequestException e){
users = new ArrayList<>();
}
ObservableList<String> observableUserList = FXCollections.observableArrayList();
for (User user: users) {
observableUserList.add(user.getLogin());
}
comboBox = new JFXComboBox<>(observableUserList);
comboBox.getStyleClass().add("comboBox");
mainGrid.add(comboBox, 2,2);
config = ConfigLoader.load();
if(config == null){
config = new Config(false, -1, "");
}
saveLoginTBtn.setSelected(config.isSaveLogin());
}
public void onBackBtnClick(ActionEvent actionEvent) {
Stage stage = (Stage) ((Node) actionEvent.getSource()).getScene().getWindow();
stage.close();
}
public void onCreateBtnClick(ActionEvent actionEvent) {
MainApplication.loadScene(
"User erstellen",
"../users/create-user.fxml",
"../users/create-user.css",
800,
650
);
}
public void onUpdateBtnClick(ActionEvent actionEvent) {
int editIndex = comboBox.getSelectionModel().getSelectedIndex();
if(editIndex < 0 || editIndex >= users.size()) return;
MainApplication.loadScene(
"User bearbeiten",
"../users/edit-user.fxml",
"../users/create-user.css",
800,
650,
fxmlLoader -> {
EditUserController editUserController = fxmlLoader.getController();
editUserController.setCurrentUser(users.get(editIndex));
}
);
}
public void onDeleteBtnClick(ActionEvent actionEvent) {
Alert alert = new Alert(Alert.AlertType.CONFIRMATION, "Wirklich löschen?");
Optional<ButtonType> result = alert.showAndWait();
if(result.isPresent() && result.get() == ButtonType.OK){
int removeIndex = comboBox.getSelectionModel().getSelectedIndex();
try {
dataController.deleteUser(users.get(removeIndex));
} catch (HttpRequestException e) {
Alert alert1 = new Alert(Alert.AlertType.ERROR, e.getMessage());
alert1.showAndWait();
return;
}
comboBox.getItems().remove(removeIndex);
users.remove(removeIndex);
}
}
private void setUserAtController(FXMLLoader fxmlLoader){
int editIndex = comboBox.getSelectionModel().getSelectedIndex();
EditUserController editUserController = fxmlLoader.getController();
editUserController.setCurrentUser(users.get(editIndex));
}
public void toggledBtn(ActionEvent actionEvent) {
config.setSaveLogin(saveLoginTBtn.isSelected());
if(config.isSaveLogin()){
config.setId(DataController.USER_ID);
config.setToken(HttpRequest.TOKEN);
} else {
config.setId(-1);
config.setToken("");
}
ConfigLoader.save(config);
}
}

View File

@ -0,0 +1,38 @@
package ui;
import javafx.scene.control.Label;
import javafx.scene.control.ScrollPane;
import javafx.scene.layout.VBox;
public class DayPane extends ScrollPane {
private final Label dayLabel;
private final VBox dayVBox;
public DayPane() {
dayLabel = new Label();
dayLabel.setMaxHeight(Double.MAX_VALUE);
dayLabel.setMaxWidth(Double.MAX_VALUE);
dayLabel.getStyleClass().add("labelDays");
dayVBox = new VBox();
dayVBox.getStyleClass().add("vBoxDays");
dayVBox.setSpacing(10);
setContent(dayVBox);
setFitToWidth(true);
setFitToHeight(true);
setHbarPolicy(ScrollPane.ScrollBarPolicy.AS_NEEDED);
getStyleClass().add("scrollDays");
getStyleClass().add("scrollDays");
}
public Label getDayLabel() {
return dayLabel;
}
public VBox getDayVBox() {
return dayVBox;
}
}

View File

@ -0,0 +1,83 @@
package ui;
import container.Event;
import javafx.geometry.Pos;
import javafx.scene.Group;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
public class EventPane extends VBox {
private Button deleteBtn;
private Button editBtn;
public EventPane(Event event) {
this.getStyleClass().add("event");
this.setSpacing(5);
HBox btnHBox = new HBox();
btnHBox.setAlignment(Pos.BOTTOM_RIGHT);
Group svgDel = new Group(
SvgBtnCreator.createPath("M0 0h24v24H0z", "transparent", "transparent"),
SvgBtnCreator.createPath("M6 19c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V7H6v12zM19 4h-3.5l-1-1h-5l-1 1H5v2h14V4z",
"white", "gray")
);
deleteBtn = SvgBtnCreator.createBtn(svgDel, 24, "", "Löschen des Termins");
deleteBtn.getStyleClass().add("deleteEventBtn");
Group svgEdit = new Group(
SvgBtnCreator.createPath("M0 0h24v24H0z", "transparent", "transparent"),
SvgBtnCreator.createPath("M3 17.25V21h3.75L17.81 9.94l-3.75-3.75L3 17.25zM20.71 7.04c.39-.39.39-1.02 0-1.41l-2.34-2.34c-.39-.39-1.02-.39-1.41 0l-1.83 1.83 3.75 3.75 1.83-1.83z",
"white", "gray")
);
editBtn = SvgBtnCreator.createBtn(svgEdit, 24, "", "Bearbeiten des Termins");
editBtn.getStyleClass().add("editEventBtn");
btnHBox.getChildren().add(editBtn);
btnHBox.getChildren().add(deleteBtn);
this.getChildren().add(btnHBox);
Label nameLabel = new Label(event.getName());
nameLabel.setWrapText(true);
this.getChildren().add(nameLabel);
if (event.getStart() != null || event.getEnd() != null) {
String timeStr = (event.getStart() != null ? formatTime(event.getStart()) : "")
+ (event.getEnd() != null ? " - " + formatTime(event.getEnd()) : "");
Label timeLabel = new Label(timeStr);
this.getChildren().add(timeLabel);
}
Label typeLabel = new Label("Wer: " + event.getOwnerName());
this.getChildren().add(typeLabel);
Label prioLabel = new Label("Priorität: " + event.getPriority());
this.getChildren().add(prioLabel);
if (event.isFullDay()) {
Label fullDayLabel = new Label("Dieser Termin bockiert den ganzen Tag!");
fullDayLabel.setWrapText(true);
this.getChildren().add(fullDayLabel);
}
}
public Button getDeleteBtn() {
return deleteBtn;
}
public Button getEditBtn() {
return editBtn;
}
private String formatTime(String time) {
String[] timeArr = time.split(":");
if (timeArr.length > 2) {
return timeArr[0] + ":" + timeArr[1];
}
return time;
}
}

View File

@ -0,0 +1,91 @@
package ui;
import javafx.geometry.Bounds;
import javafx.scene.Group;
import javafx.scene.control.*;
import javafx.scene.shape.SVGPath;
public class SvgBtnCreator {
public static Button createBtn(Group group, int svgSize, String styleClass, String toolTip) {
Button btn = new Button();
Bounds boundsDel = group.getBoundsInParent();
double scaleDel = Math.min(svgSize / boundsDel.getWidth(), svgSize / boundsDel.getHeight());
group.setScaleX(scaleDel);
group.setScaleY(scaleDel);
btn.setGraphic(group);
btn.setMaxSize(svgSize, svgSize);
btn.setMinSize(svgSize, svgSize);
btn.setContentDisplay(ContentDisplay.GRAPHIC_ONLY);
btn.getStyleClass().add(styleClass);
Tooltip tooltip = new Tooltip(toolTip);
btn.setTooltip(tooltip);
return btn;
}
public static SVGPath createPath(String d, String fill, String hoverFill) {
SVGPath path = new SVGPath();
path.getStyleClass().add("svg");
path.setContent(d);
path.setStyle("-fill:" + fill + ";-hover-fill:"+hoverFill+';');
return path;
}
public static Button createAddBtn(){
Group svgAdd = new Group(
createPath("M0 0h24v24H0z", "transparent", "transparent"),
createPath("M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z",
"white", "gray")
);
return createBtn(svgAdd, 40, "main-btn", "Erstellt einen neuen Termin");
}
public static Button createSettingBtn(){
Group svgSettings = new Group(
createPath("M0 0h24v24H0V0z", "transparent", "transparent"),
createPath("M19.14,12.94c0.04-0.3,0.06-0.61,0.06-0.94c0-0.32-0.02-0.64-0.07-0.94l2.03-1.58c0.18-0.14,0.23-0.41,0.12-0.61 l-1.92-3.32c-0.12-0.22-0.37-0.29-0.59-0.22l-2.39,0.96c-0.5-0.38-1.03-0.7-1.62-0.94L14.4,2.81c-0.04-0.24-0.24-0.41-0.48-0.41 h-3.84c-0.24,0-0.43,0.17-0.47,0.41L9.25,5.35C8.66,5.59,8.12,5.92,7.63,6.29L5.24,5.33c-0.22-0.08-0.47,0-0.59,0.22L2.74,8.87 C2.62,9.08,2.66,9.34,2.86,9.48l2.03,1.58C4.84,11.36,4.8,11.69,4.8,12s0.02,0.64,0.07,0.94l-2.03,1.58 c-0.18,0.14-0.23,0.41-0.12,0.61l1.92,3.32c0.12,0.22,0.37,0.29,0.59,0.22l2.39-0.96c0.5,0.38,1.03,0.7,1.62,0.94l0.36,2.54 c0.05,0.24,0.24,0.41,0.48,0.41h3.84c0.24,0,0.44-0.17,0.47-0.41l0.36-2.54c0.59-0.24,1.13-0.56,1.62-0.94l2.39,0.96 c0.22,0.08,0.47,0,0.59-0.22l1.92-3.32c0.12-0.22,0.07-0.47-0.12-0.61L19.14,12.94z M12,15.6c-1.98,0-3.6-1.62-3.6-3.6 s1.62-3.6,3.6-3.6s3.6,1.62,3.6,3.6S13.98,15.6,12,15.6z",
"white", "gray")
);
return createBtn(svgSettings, 40, "main-btn", "Öffnet die Einstellungen");
}
public static Button createLogoutBtn(){
Group svgLogout = new Group(
createPath("M0 0h24v24H0z", "transparent", "transparent"),
createPath("M17 7l-1.41 1.41L18.17 11H8v2h10.17l-2.58 2.58L17 17l5-5zM4 5h8V3H4c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h8v-2H4V5z",
"white", "gray")
);
return createBtn(svgLogout, 40, "main-btn", "Abmelden");
}
public static Button createBackBtn(){
Group svgBack = new Group(
createPath("M0 0h24v24H0z", "transparent", "transparent"),
createPath("M20 11H7.83l5.59-5.59L12 4l-8 8 8 8 1.41-1.41L7.83 13H20v-2z",
"white", "lightgray")
);
return createBtn(svgBack, 40, "navBtn", "Zeigt die vorherige Woche");
}
public static Button createTodayBtn(){
Group svgToday = new Group(
createPath("M0 0h24v24H0z", "transparent", "transparent"),
createPath("M20 3h-1V1h-2v2H7V1H5v2H4c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm0 18H4V8h16v13z",
"white", "lightgray")
);
return createBtn(svgToday, 40, "navBtn", "Zeigt die aktuelle Woche");
}
public static Button createNextBtn(){
Group svgNext = new Group(
createPath("M0 0h24v24H0z", "transparent", "transparent"),
createPath("M12 4l-1.41 1.41L16.17 11H4v2h12.17l-5.58 5.59L12 20l8-8z",
"white", "lightgray")
);
return createBtn(svgNext, 40, "navBtn", "Zeigt die nächste Woche");
}
}

View File

@ -0,0 +1,99 @@
//Alex Rechtin//
package users;
import helper.HttpRequestException;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.Node;
import javafx.scene.control.Label;
import javafx.scene.control.PasswordField;
import javafx.scene.control.TextField;
import javafx.scene.control.ToggleButton;
import javafx.stage.Stage;
import container.DataController;
import container.User;
import java.util.Objects;
public class CreateUserController {
@FXML
protected TextField textName;
@FXML
protected PasswordField textPassword;
@FXML
protected PasswordField textPasswordSecond;
@FXML
protected ToggleButton checkButtonIsAdmin;
@FXML
protected TextField textLogin;
@FXML
protected TextField textForename;
@FXML
protected Label labelError;
@FXML
protected void createUser(ActionEvent event) {
if (validateNameAndLogin() || validatePassword()) return;
User user = new User();
user.setLogin(textLogin.getText().trim());
user.setForename(textForename.getText().trim());
user.setName(textName.getText().trim());
user.setPassword(textPassword.getText().trim());
user.setAdmin(checkButtonIsAdmin.isSelected());
try {
sendHttpRequest(user);
} catch (HttpRequestException e) {
labelError.setText(e.getMessage());
return;
}
Stage stage = (Stage) ((Node) event.getSource()).getScene().getWindow();
stage.close();
}
protected boolean validatePassword() {
if (textPassword.getText().trim().isEmpty()) {
labelError.setText("Bitte Passwort eingeben!");
return true;
}
if (textPassword.getText().trim().length() < 8) {
labelError.setText("Das Passwort muss mindestens 8 Zeichen lang sein!");
return true;
}
if (!Objects.equals(textPassword.getText(), textPasswordSecond.getText())){
labelError.setText("Passwörter stimmen nicht überein!");
return true;
}
return false;
}
protected boolean validateNameAndLogin() {
if (textLogin.getText().trim().isEmpty()){
labelError.setText("Bitte Login Namen angeben");
return true;
}
if (textForename.getText().trim().isEmpty()) {
labelError.setText("Bitte Vornamen eingeben!");
return true;
}
if (textName.getText().trim().isEmpty()) {
labelError.setText("Bitte Nachnamen eingeben!");
return true;
}
return false;
}
protected void sendHttpRequest(User user) throws HttpRequestException {
DataController dataController = new DataController();
dataController.createUser(user);
}
@FXML
protected void abortBtnClick(ActionEvent event) {
Stage stage = (Stage) ((Node) event.getSource()).getScene().getWindow();
stage.close();
}
}

View File

@ -0,0 +1,69 @@
/* Marc Beyer */
package users;
import container.DataController;
import container.User;
import helper.HttpRequestException;
import javafx.event.ActionEvent;
import javafx.scene.Node;
import javafx.scene.control.Alert;
import javafx.stage.Stage;
public class EditUserController extends CreateUserController{
private User currentUser;
public User getCurrentUser() {
return currentUser;
}
public void setCurrentUser(User currentUser) {
this.currentUser = currentUser;
textForename.setText(currentUser.getForename());
textName.setText(currentUser.getName());
textLogin.setText(currentUser.getLogin());
checkButtonIsAdmin.setSelected(currentUser.isAdmin());
}
@Override
protected void createUser(ActionEvent event){
if (validateNameAndLogin()) return;
User user = new User();
if(!textPassword.getText().trim().isEmpty() || !textPasswordSecond.getText().trim().isEmpty()){
if (validatePassword()) return;
user.setPassword(textPassword.getText().trim());
}
user.setUserId(currentUser.getUserId());
user.setLogin(textLogin.getText().trim());
user.setForename(textForename.getText().trim());
user.setName(textName.getText().trim());
user.setAdmin(checkButtonIsAdmin.isSelected());
try {
sendHttpRequest(user);
} catch (HttpRequestException e) {
labelError.setText(e.getMessage());
return;
}
if(currentUser.getUserId() == DataController.USER_ID){
Alert alert = new Alert(
Alert.AlertType.WARNING,
"Bitte starte das Programm neu um die Änderungen anzuwenden."
);
alert.showAndWait();
}
Stage stage = (Stage) ((Node) event.getSource()).getScene().getWindow();
stage.close();
}
@Override
protected void sendHttpRequest(User user) throws HttpRequestException {
DataController dataController = new DataController();
dataController.editUser(user);
}
}

View File

@ -0,0 +1,51 @@
//Alex Rechtin//
package users;
import com.jfoenix.controls.*;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.Node;
import javafx.scene.control.Label;
import javafx.stage.Stage;
import container.DataController;
public class LoginController {
@FXML
private JFXTextField userField;
@FXML
private JFXPasswordField passField;
@FXML
private Label userErrLabel;
@FXML
private Label passErrLabel;
@FXML
protected void login(ActionEvent event) {
if (userField.getText().trim().isEmpty()) {
userErrLabel.setText("Bitte Usernamen eingeben!");
passErrLabel.setText("");
return;
}
if (passField.getText().trim().isEmpty()) {
userErrLabel.setText("");
passErrLabel.setText("Bitte Passwort eingeben!");
return;
}
DataController dataController = new DataController();
if (!dataController.login(userField.getText(), passField.getText())) {
userErrLabel.setText("Name und Passwort passen nicht zueinander!");
passErrLabel.setText("Name und Passwort passen nicht zueinander!");
return;
}
Stage stage = (Stage) ((Node) event.getSource()).getScene().getWindow();
stage.close();
}
@FXML
protected void abortBtnClick(ActionEvent event) {
Stage stage = (Stage) ((Node) event.getSource()).getScene().getWindow();
stage.close();
}
}

View File

@ -1,3 +1,4 @@
/*Marco Kühn*/
GridPane{ GridPane{
-fx-background-color: #3E415F; -fx-background-color: #3E415F;
-fx-padding: 20px; -fx-padding: 20px;
@ -28,8 +29,52 @@ Label{
.inputField{ .inputField{
-fx-padding: 10px; -fx-padding: 10px;
-fx-background-color: white;
} }
.mainButton{ .mainButton{
-fx-font-weight: bold; -fx-font-weight: bold;
} -fx-background-color: white;
}
JFXButton{
-fx-background-color: white;
}
#labelError{
-fx-font-weight: bold;
-fx-max-width: 1000px;
-fx-text-fill: #ff5555;
-fx-padding: 16px;
-fx-min-height: 140px;
-fx-max-height: 400px;
-fx-wrap-text: true;
-fx-font-size: 16px;
}
.inputDate{
-fx-background-color: white;
}
.comboBox{
-fx-background-color: white;
}
.timePicker{
-fx-background-color: white;
}
.jfx-time-picker .date-picker-popup{
-fx-max-width: 230px;
-fx-min-width: 230px;
}
.jfx-time-picker .date-picker-popup > * > .spinner > .label {
-fx-max-width: 55px;
-fx-min-width: 55px;
}
.jfx-date-picker .date-picker-popup > * > .spinner > .label {
-fx-max-width: 300px;
-fx-min-width: 300px;
}

View File

@ -1,11 +1,16 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!-- Marco Kühn -->
<?import javafx.scene.control.*?> <?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?> <?import javafx.scene.layout.*?>
<?import javafx.collections.FXCollections?> <?import javafx.collections.FXCollections?>
<?import java.lang.String?> <?import java.lang.String?>
<GridPane xmlns="http://javafx.com/javafx" xmlns:fx="http://javafx.com/fxml/1" fx:controller="main.CreateEventController"> <?import com.jfoenix.controls.*?>
<GridPane fx:id="mainGrid" xmlns="http://javafx.com/javafx" xmlns:fx="http://javafx.com/fxml/1"
fx:controller="events.CreateEventController">
<columnConstraints> <columnConstraints>
<ColumnConstraints/> <ColumnConstraints/>
@ -13,48 +18,49 @@
<ColumnConstraints/> <ColumnConstraints/>
</columnConstraints> </columnConstraints>
<rowConstraints> <rowConstraints>
<RowConstraints vgrow="ALWAYS" /> <RowConstraints vgrow="ALWAYS"/>
<RowConstraints vgrow="ALWAYS" /> <RowConstraints vgrow="ALWAYS"/>
<RowConstraints vgrow="ALWAYS" /> <RowConstraints vgrow="ALWAYS"/>
<RowConstraints vgrow="ALWAYS" /> <RowConstraints vgrow="ALWAYS"/>
<RowConstraints vgrow="ALWAYS" /> <RowConstraints vgrow="ALWAYS"/>
<RowConstraints vgrow="ALWAYS" /> <RowConstraints vgrow="ALWAYS"/>
<RowConstraints vgrow="ALWAYS" /> <RowConstraints vgrow="ALWAYS"/>
<RowConstraints vgrow="ALWAYS" /> <RowConstraints vgrow="ALWAYS"/>
<RowConstraints vgrow="ALWAYS" /> <RowConstraints vgrow="ALWAYS"/>
</rowConstraints> </rowConstraints>
<Label styleClass="mainLabel">Termin anlegen</Label> <Label styleClass="mainLabel">Termin anlegen</Label>
<Label styleClass="inputLabel" GridPane.rowIndex="1">Datum:</Label> <Label styleClass="inputLabel" GridPane.rowIndex="1">Titel:</Label>
<Label styleClass="inputLabel" GridPane.rowIndex="2">Titel:</Label> <Label styleClass="inputLabel" GridPane.rowIndex="2">Datum:</Label>
<Label styleClass="inputLabel" GridPane.rowIndex="3">Von:</Label> <Label styleClass="inputLabel" GridPane.rowIndex="3">Von:</Label>
<Label styleClass="inputLabel" GridPane.rowIndex="4">Bis:</Label> <Label styleClass="inputLabel" GridPane.rowIndex="4">Bis:</Label>
<Label styleClass="inputLabel" GridPane.rowIndex="5">Typ:</Label>
<Label styleClass="inputLabel" GridPane.rowIndex="6">Priorität:</Label>
<Label styleClass="inputLabel" GridPane.rowIndex="7">Ganztägig:</Label>
<Label styleClass="inputLabel" GridPane.rowIndex="8">Privat:</Label>
<DatePicker fx:id="datePickerDate" GridPane.columnIndex="1" GridPane.rowIndex="1" maxWidth="400" minWidth="400"/> <Label styleClass="inputLabel" GridPane.rowIndex="5">Priorität:</Label>
<TextField fx:id="textName" GridPane.columnIndex="1" GridPane.rowIndex="2" maxWidth="400" minWidth="400"/> <Label styleClass="inputLabel" GridPane.rowIndex="6">Ganztägig:</Label>
<TextField fx:id="textStart" GridPane.columnIndex="1" GridPane.rowIndex="3" maxWidth="400" minWidth="400"/> <Label styleClass="inputLabel" GridPane.rowIndex="7">Privat:</Label>
<TextField fx:id="textEnd" GridPane.columnIndex="1" GridPane.rowIndex="4" maxWidth="400" minWidth="400"/>
<ComboBox fx:id="ComboBoxTyp" GridPane.columnIndex="1" GridPane.rowIndex="5" maxWidth="400" minWidth="400"/> <JFXTextField styleClass="inputField" fx:id="textName" GridPane.columnIndex="1" GridPane.rowIndex="1" maxWidth="400" minWidth="400"/>
<ComboBox fx:id="ComboBoxPriotity" GridPane.columnIndex="1" GridPane.rowIndex="6" maxWidth="200" minWidth="200"> <JFXDatePicker styleClass="inputDate" fx:id="datePickerDate" GridPane.columnIndex="1" GridPane.rowIndex="2" maxWidth="200" minWidth="200"/>
<JFXTimePicker styleClass="timePicker" fx:id="timeStart" GridPane.columnIndex="1" GridPane.rowIndex="3" maxWidth="200" minWidth="200"/>
<JFXTimePicker styleClass="timePicker" fx:id="timeEnd" GridPane.columnIndex="1" GridPane.rowIndex="4" maxWidth="200" minWidth="200"/>
<JFXComboBox fx:id="comboBoxPriority" styleClass="comboBox" GridPane.columnIndex="1" GridPane.rowIndex="5" maxWidth="200" minWidth="200">
<items> <items>
<FXCollections fx:factory="observableArrayList"> <FXCollections fx:factory="observableArrayList">
<String fx:value="gering" /> <String fx:value="gering"/>
<String fx:value="mittel" /> <String fx:value="mittel"/>
<String fx:value="hoch" /> <String fx:value="hoch"/>
</FXCollections> </FXCollections>
</items> </items>
</ComboBox> </JFXComboBox>
<CheckBox fx:id="checkBoxIsFullDay" GridPane.columnIndex="1" GridPane.rowIndex="7"/> <JFXToggleButton styleClass="checkbox" fx:id="toggleBtnIsFullDay" GridPane.columnIndex="1" GridPane.rowIndex="6"/>
<CheckBox fx:id="checkBoxIsPrivate" GridPane.columnIndex="1" GridPane.rowIndex="8"/> <JFXToggleButton styleClass="checkbox" fx:id="toggleBtnIsPrivate" GridPane.columnIndex="1" GridPane.rowIndex="7"/>
<Label fx:id="labelError" GridPane.columnIndex="1" GridPane.rowIndex="8"/>
<HBox GridPane.columnIndex="1" GridPane.rowIndex="9" GridPane.columnSpan="2" alignment="CENTER_RIGHT"> <HBox GridPane.columnIndex="1" GridPane.rowIndex="9" GridPane.columnSpan="2" alignment="CENTER_RIGHT">
<Button onAction="#abortBtnClick" maxWidth="150" minWidth="150" >Abbrechen</Button> <JFXButton onAction="#abortBtnClick" maxWidth="150" minWidth="150">Abbrechen</JFXButton>
<Button styleClass="mainButton" onAction="#createBtnClick" maxWidth="150" minWidth="150">Anlegen</Button> <JFXButton styleClass="mainButton" onAction="#createBtnClick" maxWidth="150" minWidth="150">Anlegen</JFXButton>
</HBox> </HBox>
</GridPane> </GridPane>

View File

@ -0,0 +1,66 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Marco Kühn -->
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import javafx.collections.FXCollections?>
<?import java.lang.String?>
<?import com.jfoenix.controls.*?>
<GridPane fx:id="mainGrid" xmlns="http://javafx.com/javafx" xmlns:fx="http://javafx.com/fxml/1"
fx:controller="events.EditEventController">
<columnConstraints>
<ColumnConstraints/>
<ColumnConstraints/>
<ColumnConstraints/>
</columnConstraints>
<rowConstraints>
<RowConstraints vgrow="ALWAYS"/>
<RowConstraints vgrow="ALWAYS"/>
<RowConstraints vgrow="ALWAYS"/>
<RowConstraints vgrow="ALWAYS"/>
<RowConstraints vgrow="ALWAYS"/>
<RowConstraints vgrow="ALWAYS"/>
<RowConstraints vgrow="ALWAYS"/>
<RowConstraints vgrow="ALWAYS"/>
<RowConstraints vgrow="ALWAYS"/>
</rowConstraints>
<Label styleClass="mainLabel">Termin bearbeiten</Label>
<Label styleClass="inputLabel" GridPane.rowIndex="1">Titel:</Label>
<Label styleClass="inputLabel" GridPane.rowIndex="2">Datum:</Label>
<Label styleClass="inputLabel" GridPane.rowIndex="3">Von:</Label>
<Label styleClass="inputLabel" GridPane.rowIndex="4">Bis:</Label>
<Label styleClass="inputLabel" GridPane.rowIndex="5">Priorität:</Label>
<Label styleClass="inputLabel" GridPane.rowIndex="6">Ganztägig:</Label>
<Label styleClass="inputLabel" GridPane.rowIndex="7">Privat:</Label>
<JFXTextField styleClass="inputField" fx:id="textName" GridPane.columnIndex="1" GridPane.rowIndex="1" maxWidth="400" minWidth="400"/>
<JFXDatePicker styleClass="inputDate" fx:id="datePickerDate" GridPane.columnIndex="1" GridPane.rowIndex="2" maxWidth="200" minWidth="200"/>
<JFXTimePicker styleClass="timePicker" fx:id="timeStart" GridPane.columnIndex="1" GridPane.rowIndex="3" maxWidth="200" minWidth="200"/>
<JFXTimePicker styleClass="timePicker" fx:id="timeEnd" GridPane.columnIndex="1" GridPane.rowIndex="4" maxWidth="200" minWidth="200"/>
<JFXComboBox fx:id="comboBoxPriority" styleClass="comboBox" GridPane.columnIndex="1" GridPane.rowIndex="5" maxWidth="200" minWidth="200">
<items>
<FXCollections fx:factory="observableArrayList">
<String fx:value="gering"/>
<String fx:value="mittel"/>
<String fx:value="hoch"/>
</FXCollections>
</items>
</JFXComboBox>
<JFXToggleButton styleClass="checkbox" fx:id="toggleBtnIsFullDay" GridPane.columnIndex="1" GridPane.rowIndex="6"/>
<JFXToggleButton styleClass="checkbox" fx:id="toggleBtnIsPrivate" GridPane.columnIndex="1" GridPane.rowIndex="7"/>
<Label fx:id="labelError" GridPane.columnIndex="1" GridPane.rowIndex="8"/>
<HBox GridPane.columnIndex="1" GridPane.rowIndex="9" GridPane.columnSpan="2" alignment="CENTER_RIGHT">
<JFXButton onAction="#abortBtnClick" maxWidth="150" minWidth="150">Abbrechen</JFXButton>
<JFXButton styleClass="mainButton" onAction="#createBtnClick" maxWidth="150" minWidth="150">Speichern</JFXButton>
</HBox>
</GridPane>

View File

@ -1,72 +1,121 @@
/*Alex Rechtin, Marco Kühn*/
* { * {
-fx-dark-background-color: #525E74; -fx-base-background-color: #2B2D42;
-fx-darkest-background-color: #2B2D42; -fx-base1-background-color: #525E74;
-fx-bright-background-color: #77859E;
-fx-brighter-background-color: #52567E;
-fx-brightest-background-color: #ffffff;
-fx-bright-border-color: #B0B0B0;
-fx-brighter-text-color: #ffffff;
-fx-main-border-color: #B0B0B0;
-fx-main-text-color: #ffffff;
} }
.mainGrid{
-fx-background-color: -fx-darkest-background-color; GridPane{
-fx-background-color: -fx-base-background-color;
} }
.mainVbox{ .main-panel{
-fx-background-color: -fx-dark-background-color; -fx-background-color: #282C34;
}
.vbox-main{
-fx-background-color: #333333;
-fx-alignment: top-center;
} }
.gridCalendar Line{ .gridCalendar Line{
-fx-stroke: -fx-bright-border-color; -fx-stroke: -fx-main-border-color;
} }
.gridCalender{ .gridCalender{
-fx-background-color: -fx-darkest-background-color; -fx-background-color: -fx-base-background-color;
-fx-min-height: 80px; -fx-min-height: 80px;
-fx-max-height: 80px; -fx-max-height: 80px;
} }
.labelMonth{ .labelMonth{
-fx-padding: 0 0 0 20; -fx-padding: 0 0 0 20;
-fx-background-color: -fx-bright-background-color; -fx-background-color: #77859E;
-fx-font-size: 35px; -fx-font-size: 35px;
-fx-font-weight: bold; -fx-font-weight: bold;
} }
.scrollDays{ .scrollDays{
-fx-background-color: -fx-darkest-background-color; -fx-background-color: -fx-base-background-color;
-fx-border-color: -fx-bright-border-color; -fx-border-color: -fx-main-border-color;
} }
.vBoxDays{ .vBoxDays{
-fx-background-color: -fx-darkest-background-color; -fx-background-color: -fx-base-background-color;
} }
.labelDays{ .labelDays{
-fx-alignment: center; -fx-alignment: center;
-fx-background-color: -fx-dark-background-color; -fx-background-color: -fx-base1-background-color;
-fx-font-size: 25px; -fx-font-size: 25px;
-fx-border-color: -fx-bright-border-color; -fx-border-color: -fx-main-border-color;
} }
Label{ Label{
-fx-text-fill: -fx-brighter-text-color; -fx-text-fill: -fx-main-text-color;
} }
.event{ .event{
-fx-background-color: -fx-dark-background-color; -fx-background-color: -fx-base1-background-color;
} }
.mainBtn{ .main-btn{
-fx-background-color: -fx-brightest-background-color; -fx-background-color: transparent;
-fx-text-fill: -fx-brighter-text-color; -fx-border-color: transparent;
-fx-background-radius: 5em; }
-fx-min-width: 40px;
-fx-min-height: 40px; .main-btn .svg {
-fx-max-width: 40px; -fx-fill: -fill;
-fx-max-height: 40px; }
.main-btn:hover .svg {
-fx-fill: -hover-fill;
}
.buttonBox{
-fx-background-color: #77859E;
}
.navBtn{
-fx-background-color: transparent;
-fx-border-color: transparent;
}
.navBtn .svg {
-fx-fill: -fill;
}
.navBtn:hover .svg {
-fx-fill: -hover-fill;
}
.editEventBtn{
-fx-background-color: transparent;
-fx-border-color: transparent;
}
.editEventBtn .svg {
-fx-fill: -fill;
}
.editEventBtn:hover .svg {
-fx-fill: -hover-fill;
}
.deleteEventBtn{
-fx-background-color: transparent;
-fx-border-color: transparent;
}
.deleteEventBtn .svg {
-fx-fill: -fill;
}
.deleteEventBtn:hover .svg {
-fx-fill: -hover-fill;
} }

View File

@ -1,66 +1,66 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!-- Alex Rechtin, Marco Kühn -->
<?import javafx.geometry.*?> <?import javafx.geometry.*?>
<?import javafx.scene.control.*?> <?import javafx.scene.control.*?>
<?import javafx.scene.image.*?> <?import javafx.scene.image.*?>
<?import javafx.scene.layout.*?> <?import javafx.scene.layout.*?>
<GridPane styleClass="mainGrid" xmlns="http://javafx.com/javafx" xmlns:fx="http://javafx.com/fxml/1" <GridPane style="-fx-background-color: #424242;" xmlns="http://javafx.com/javafx" xmlns:fx="http://javafx.com/fxml/1"
fx:controller="main.MainController"> fx:controller="main.MainController">
<columnConstraints> <columnConstraints>
<ColumnConstraints hgrow="NEVER" maxWidth="60.0" minWidth="60.0" /> <ColumnConstraints hgrow="NEVER" maxWidth="60.0" minWidth="60.0"/>
<ColumnConstraints hgrow="ALWAYS" /> <ColumnConstraints hgrow="ALWAYS"/>
</columnConstraints> </columnConstraints>
<rowConstraints> <rowConstraints>
<RowConstraints vgrow="SOMETIMES" /> <RowConstraints vgrow="SOMETIMES"/>
</rowConstraints> </rowConstraints>
<VBox styleClass="mainVbox" alignment="TOP_CENTER" prefHeight="200.0" prefWidth="100.0" spacing="5.0"> <VBox fx:id="leftNav" alignment="TOP_CENTER" prefHeight="200.0" prefWidth="100.0" spacing="5.0"
style="-fx-background-color: #525E74;">
<ImageView fitHeight="50.0" fitWidth="50.0" pickOnBounds="true" preserveRatio="true"> <ImageView fitHeight="50.0" fitWidth="50.0" pickOnBounds="true" preserveRatio="true">
</ImageView> </ImageView>
<Button onAction="#onAddBtnClick" styleClass="mainBtn">
ADD
</Button>
<Button onAction="#onAddBtnClick" styleClass="mainBtn">
ADD
</Button>
<Button onAction="#onAddBtnClick" styleClass="mainBtn">
ADD
</Button>
</VBox> </VBox>
<GridPane prefHeight="200.0" prefWidth="222.0" GridPane.columnIndex="1" GridPane.rowIndex="0"> <GridPane fx:id="mainGridPane" prefHeight="200.0" prefWidth="222.0" GridPane.columnIndex="1" GridPane.rowIndex="0">
<columnConstraints> <columnConstraints>
<ColumnConstraints hgrow="ALWAYS" /> <ColumnConstraints hgrow="ALWAYS"/>
<ColumnConstraints /> <ColumnConstraints/>
<ColumnConstraints/>
<ColumnConstraints/>
<ColumnConstraints/>
</columnConstraints> </columnConstraints>
<rowConstraints> <rowConstraints>
<RowConstraints /> <RowConstraints/>
<RowConstraints vgrow="ALWAYS" /> <RowConstraints vgrow="ALWAYS"/>
</rowConstraints> </rowConstraints>
<Label fx:id="LabelMonth" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" <Label fx:id="LabelMonth" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308"
styleClass="labelMonth" GridPane.columnIndex="0" GridPane.rowIndex="0"> styleClass="labelMonth" textFill="WHITE" GridPane.columnIndex="0" GridPane.rowIndex="0">
Monat Monat
<padding> <padding>
<Insets left="5" /> <Insets left="5"/>
</padding> </padding>
</Label> </Label>
<GridPane fx:id="calendarGrid" gridLinesVisible="true" styleClass="gridCalendar" <HBox fx:id="buttonBox" styleClass="buttonBox" GridPane.columnIndex="1" alignment="CENTER"/>
<GridPane fx:id="calendarGrid" gridLinesVisible="true" styleClass="gridCalendar" GridPane.columnSpan="4"
GridPane.columnIndex="0" GridPane.rowIndex="1"> GridPane.columnIndex="0" GridPane.rowIndex="1">
<columnConstraints> <columnConstraints>
<ColumnConstraints hgrow="ALWAYS" maxWidth="14.2857142857" minWidth="14.2857142857" <ColumnConstraints hgrow="ALWAYS" maxWidth="14.2857142857" minWidth="14.2857142857"
percentWidth="14.2857142857" /> percentWidth="14.2857142857"/>
<ColumnConstraints hgrow="ALWAYS" percentWidth="14.2857142857" /> <ColumnConstraints hgrow="ALWAYS" percentWidth="14.2857142857"/>
<ColumnConstraints hgrow="ALWAYS" percentWidth="14.2857142857" /> <ColumnConstraints hgrow="ALWAYS" percentWidth="14.2857142857"/>
<ColumnConstraints hgrow="ALWAYS" percentWidth="14.2857142857" /> <ColumnConstraints hgrow="ALWAYS" percentWidth="14.2857142857"/>
<ColumnConstraints hgrow="ALWAYS" percentWidth="14.2857142857" /> <ColumnConstraints hgrow="ALWAYS" percentWidth="14.2857142857"/>
<ColumnConstraints hgrow="ALWAYS" percentWidth="14.2857142857" /> <ColumnConstraints hgrow="ALWAYS" percentWidth="14.2857142857"/>
<ColumnConstraints hgrow="ALWAYS" percentWidth="14.2857142857" /> <ColumnConstraints hgrow="ALWAYS" percentWidth="14.2857142857"/>
</columnConstraints> </columnConstraints>
<rowConstraints> <rowConstraints>
<RowConstraints maxHeight="55.0" minHeight="25.0" vgrow="NEVER" /> <RowConstraints maxHeight="55.0" minHeight="25.0" vgrow="NEVER"/>
<RowConstraints percentHeight="-Infinity" vgrow="ALWAYS" /> <RowConstraints percentHeight="-Infinity" vgrow="ALWAYS"/>
</rowConstraints> </rowConstraints>
</GridPane> </GridPane>
</GridPane> </GridPane>
</GridPane> </GridPane>

View File

@ -0,0 +1,59 @@
/* Marco Kühn */
GridPane{
-fx-background-color: #3E415F;
-fx-padding: 20px;
-fx-font-size: 20px;
-fx-font-family: Segoe UI;
-fx-border-insets: 1;
-fx-border-color: #B0B0B0;
-fx-border-style: solid;
-fx-border-width: 2;
-fx-effect: dropshadow(three-pass-box, rgba(100, 100, 100, 1), 24, 0.5, 0, 0);
}
Label{
-fx-text-fill: white;
-fx-max-width: 200px;
-fx-min-width: 200px;
}
.mainLabel{
-fx-background-color: #8D99AE;
-fx-padding: 10px;
-fx-max-width: 200px;
-fx-min-width: 200px;
-fx-font-weight: bold;
-fx-alignment: center;
}
.mainButton{
-fx-font-weight: bold;
-fx-background-color: white;
}
JFXButton{
-fx-background-color: white;
}
#labelError{
-fx-font-weight: bold;
-fx-max-width: 1000px;
-fx-text-fill: #ff5555;
-fx-padding: 16px;
-fx-min-height: 140px;
-fx-max-height: 400px;
-fx-wrap-text: true;
-fx-font-size: 16px;
}
.comboBox{
-fx-background-color: white;
-fx-max-width: 200px;
-fx-min-width: 200px;
}
.userBtn{
-fx-max-width: 200px;
-fx-min-width: 200px;
}

View File

@ -0,0 +1,52 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Marco Kühn -->
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import com.jfoenix.controls.*?>
<GridPane xmlns="http://javafx.com/javafx"
xmlns:fx="http://javafx.com/fxml"
fx:controller="main.OptionController"
prefHeight="400.0" prefWidth="600.0"
fx:id="mainGrid">
<columnConstraints>
<ColumnConstraints minWidth="100"/>
<ColumnConstraints minWidth="100"/>
<ColumnConstraints minWidth="200"/>
<ColumnConstraints minWidth="100"/>
<ColumnConstraints minWidth="100"/>
</columnConstraints>
<rowConstraints>
<RowConstraints vgrow="ALWAYS" />
<RowConstraints vgrow="ALWAYS" />
<RowConstraints vgrow="ALWAYS" />
<RowConstraints vgrow="ALWAYS" />
<RowConstraints vgrow="ALWAYS" />
<RowConstraints vgrow="ALWAYS" />
<RowConstraints vgrow="ALWAYS" />
<RowConstraints vgrow="ALWAYS" />
<RowConstraints vgrow="ALWAYS" />
<RowConstraints vgrow="ALWAYS" />
</rowConstraints>
<Label styleClass="mainLabel" GridPane.columnIndex="2" GridPane.halignment="CENTER" >Einstellungen</Label>
<Label GridPane.columnIndex="1" GridPane.rowIndex="2" GridPane.halignment="CENTER">User:</Label>
<JFXButton styleClass="userBtn" fx:id="updateUserBtn" GridPane.columnIndex="1" GridPane.columnSpan="3"
GridPane.rowIndex="4" GridPane.halignment="CENTER" onAction="#onUpdateBtnClick">User bearbeiten</JFXButton>
<JFXButton styleClass="userBtn" fx:id="deleteUserBtn" GridPane.columnIndex="1" GridPane.columnSpan="3"
GridPane.rowIndex="5" GridPane.halignment="CENTER" onAction="#onDeleteBtnClick">User löschen</JFXButton>
<JFXButton styleClass="userBtn" fx:id="createUserBtn" GridPane.columnIndex="1" GridPane.columnSpan="3"
GridPane.rowIndex="7" GridPane.halignment="CENTER" onAction="#onCreateBtnClick">User anlegen</JFXButton>
<Label styleClass="loginLbl" GridPane.columnIndex="1" GridPane.rowIndex="8"
GridPane.halignment="CENTER">Angemeldet bleiben:</Label>
<JFXToggleButton fx:id="saveLoginTBtn" GridPane.columnIndex="3" GridPane.rowIndex="8" onAction="#toggledBtn"/>
<Label fx:id="labelError" styleClass="errorMessage" GridPane.columnIndex="1" GridPane.rowIndex="9"/>
<JFXButton GridPane.columnIndex="4" GridPane.rowIndex="9" onAction="#onBackBtnClick">Zurück</JFXButton>
</GridPane>

View File

@ -0,0 +1,57 @@
/*Alex Rechtin*/
* {
-fx-base-background-color: #2B2D42;
-fx-base1-background-color: #525E74;
-fx-main-border-color: #B0B0B0;
-fx-main-text-color: #ffffff;
}
GridPane{
-fx-background-color: #3E415F;
-fx-padding: 20px;
-fx-font-size: 20px;
-fx-font-family: Segoe UI;
-fx-border-insets: 1;
-fx-border-color: #B0B0B0;
-fx-border-style: solid;
-fx-border-width: 2;
-fx-effect: dropshadow(three-pass-box, rgba(100, 100, 100, 1), 24, 0.5, 0, 0);
}
.mainLabel{
-fx-padding: 10px;
-fx-max-width: 400px;
-fx-min-width: 400px;
-fx-font-weight: bold;
-fx-alignment: top-center;
}
Label{
-fx-text-fill: white;
-fx-max-width: 150px;
-fx-min-width: 150px;
}
.textField{
-fx-max-width: 400px;
-fx-min-width: 400px;
}
.errorMessage{
-fx-max-width: 400px;
-fx-min-width: 400px;
}
Button{
-fx-max-width: 150px;
-fx-min-width: 150px;
}
.btnLogin{
-fx-font-weight: bold;
}

View File

@ -0,0 +1,59 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Alex Rechtin -->
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import javafx.geometry.Insets?>
<?import com.jfoenix.controls.JFXToggleButton?>
<GridPane xmlns="http://javafx.com/javafx"
xmlns:fx="http://javafx.com/fxml"
fx:controller="users.CreateUserController">
<columnConstraints>
<ColumnConstraints minWidth="100"/>
<ColumnConstraints minWidth="100"/>
<ColumnConstraints minWidth="100"/>
</columnConstraints>
<rowConstraints>
<RowConstraints vgrow="ALWAYS" />
<RowConstraints vgrow="ALWAYS" />
<RowConstraints vgrow="ALWAYS" />
<RowConstraints vgrow="ALWAYS" />
<RowConstraints vgrow="ALWAYS" />
<RowConstraints vgrow="ALWAYS" />
<RowConstraints vgrow="ALWAYS" />
<RowConstraints vgrow="ALWAYS" />
<RowConstraints vgrow="ALWAYS" />
<RowConstraints vgrow="ALWAYS" />
</rowConstraints>
<Label styleClass="mainLabel" GridPane.columnIndex="2" >User anlegen</Label>
<Label styleClass="inputLabel" GridPane.rowIndex="1" GridPane.columnIndex="1">Login:</Label>
<Label styleClass="inputLabel" GridPane.rowIndex="2" GridPane.columnIndex="1">Vorname:</Label>
<Label styleClass="inputLabel" GridPane.rowIndex="3" GridPane.columnIndex="1">Nachname:</Label>
<Label styleClass="inputLabel" GridPane.rowIndex="4" GridPane.columnIndex="1">Passwort:</Label>
<Label styleClass="inputLabel" GridPane.rowIndex="5" GridPane.columnIndex="1">Passwort wiederholen:</Label>
<Label styleClass="inputLabelAdmin" GridPane.rowIndex="6" GridPane.columnIndex="1">Admin:</Label>
<TextField fx:id="textLogin" styleClass="textField" GridPane.columnIndex="2" GridPane.rowIndex="1" />
<TextField fx:id="textForename" styleClass="textField" GridPane.columnIndex="2" GridPane.rowIndex="2" />
<TextField fx:id="textName" styleClass="textField" GridPane.columnIndex="2" GridPane.rowIndex="3" />
<PasswordField fx:id="textPassword" styleClass="textField" GridPane.columnIndex="2" GridPane.rowIndex="4" />
<PasswordField fx:id="textPasswordSecond" styleClass="textField" GridPane.columnIndex="2" GridPane.rowIndex="5" />
<JFXToggleButton fx:id="checkButtonIsAdmin" GridPane.columnIndex="2" GridPane.rowIndex="6"/>
<Label fx:id="labelError" wrapText="true" styleClass="errorMessage" GridPane.columnIndex="2" GridPane.rowIndex="7"/>
<HBox GridPane.columnIndex="2" GridPane.rowIndex="8" alignment="CENTER_RIGHT">
<HBox.margin>
<Insets right="100" left="100"/>
</HBox.margin>
<Button onAction="#abortBtnClick">Abbrechen</Button>
<Button onAction="#createUser" styleClass="btnLogin" >Anlegen</Button>
</HBox>
</GridPane>

View File

@ -0,0 +1,57 @@
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import javafx.geometry.Insets?>
<?import com.jfoenix.controls.JFXToggleButton?>
<GridPane xmlns="http://javafx.com/javafx"
xmlns:fx="http://javafx.com/fxml"
fx:controller="users.EditUserController">
<columnConstraints>
<ColumnConstraints minWidth="100"/>
<ColumnConstraints minWidth="100"/>
<ColumnConstraints minWidth="100"/>
</columnConstraints>
<rowConstraints>
<RowConstraints vgrow="ALWAYS" />
<RowConstraints vgrow="ALWAYS" />
<RowConstraints vgrow="ALWAYS" />
<RowConstraints vgrow="ALWAYS" />
<RowConstraints vgrow="ALWAYS" />
<RowConstraints vgrow="ALWAYS" />
<RowConstraints vgrow="ALWAYS" />
<RowConstraints vgrow="ALWAYS" />
<RowConstraints vgrow="ALWAYS" />
<RowConstraints vgrow="ALWAYS" />
</rowConstraints>
<Label styleClass="mainLabel" GridPane.columnIndex="2" >User bearbeiten</Label>
<Label styleClass="inputLabel" GridPane.rowIndex="1" GridPane.columnIndex="1">Login:</Label>
<Label styleClass="inputLabel" GridPane.rowIndex="2" GridPane.columnIndex="1">Vorname:</Label>
<Label styleClass="inputLabel" GridPane.rowIndex="3" GridPane.columnIndex="1">Nachname:</Label>
<Label styleClass="inputLabel" GridPane.rowIndex="4" GridPane.columnIndex="1">Passwort:</Label>
<Label styleClass="inputLabel" GridPane.rowIndex="5" GridPane.columnIndex="1">Passwort wiederholen:</Label>
<Label styleClass="inputLabelAdmin" GridPane.rowIndex="6" GridPane.columnIndex="1">Admin:</Label>
<TextField fx:id="textLogin" styleClass="textField" GridPane.columnIndex="2" GridPane.rowIndex="1" />
<TextField fx:id="textForename" styleClass="textField" GridPane.columnIndex="2" GridPane.rowIndex="2" />
<TextField fx:id="textName" styleClass="textField" GridPane.columnIndex="2" GridPane.rowIndex="3" />
<PasswordField fx:id="textPassword" styleClass="textField" GridPane.columnIndex="2" GridPane.rowIndex="4" />
<PasswordField fx:id="textPasswordSecond" styleClass="textField" GridPane.columnIndex="2" GridPane.rowIndex="5" />
<JFXToggleButton fx:id="checkButtonIsAdmin" GridPane.columnIndex="2" GridPane.rowIndex="6"/>
<Label fx:id="labelError" wrapText="true" styleClass="errorMessage" GridPane.columnIndex="2" GridPane.rowIndex="7"/>
<HBox GridPane.columnIndex="2" GridPane.rowIndex="8" alignment="CENTER_RIGHT">
<HBox.margin>
<Insets right="100" left="100"/>
</HBox.margin>
<Button onAction="#abortBtnClick">Abbrechen</Button>
<Button onAction="#createUser" styleClass="btnLogin" >Bearbeiten</Button>
</HBox>
</GridPane>

View File

@ -0,0 +1,54 @@
/* Marco Kühn*/
* {
-fx-base-background-color: #2B2D42;
-fx-base1-background-color: #525E74;
-fx-main-border-color: #B0B0B0;
-fx-main-text-color: #ffffff;
}
GridPane{
-fx-background-color: #3E415F;
-fx-padding: 20px;
-fx-font-size: 20px;
-fx-font-family: Segoe UI;
-fx-border-insets: 1;
-fx-border-color: #B0B0B0;
-fx-border-style: solid;
-fx-border-width: 2;
-fx-effect: dropshadow(three-pass-box, rgba(100, 100, 100, 1), 24, 0.5, 0, 0);
}
Label{
-fx-text-fill: white;
-fx-max-width: 150px;
-fx-min-width: 150px;
}
.errorLbl{
-fx-font-weight: bold;
-fx-max-width: 200px;
-fx-text-fill: #ff5555;
-fx-padding: 16px;
-fx-min-height: 140px;
-fx-max-height: 400px;
-fx-wrap-text: true;
-fx-font-size: 16px;
}
.userField{
-fx-background-color: white;
}
.passField{
-fx-background-color: white;
}
.quitBtn{
-fx-background-color: white;
}
.loginBtn{
-fx-background-color: white;
}

View File

@ -0,0 +1,36 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Marco Kühn -->
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import com.jfoenix.controls.*?>
<GridPane xmlns="http://javafx.com/javafx" xmlns:fx="http://javafx.com/fxml" fx:controller="users.LoginController">
<columnConstraints>
<ColumnConstraints/>
<ColumnConstraints/>
<ColumnConstraints/>
</columnConstraints>
<rowConstraints>
<RowConstraints vgrow="ALWAYS"/>
<RowConstraints vgrow="ALWAYS"/>
<RowConstraints vgrow="ALWAYS"/>
<RowConstraints vgrow="ALWAYS"/>
</rowConstraints>
<Label GridPane.columnIndex="1">Anmelden</Label>
<Label GridPane.rowIndex="1">Username</Label>
<JFXTextField styleClass="userField" GridPane.columnIndex="1" GridPane.rowIndex="1" fx:id="userField"/>
<Label styleClass="errorLbl" GridPane.columnIndex="2" GridPane.rowIndex="1" fx:id="userErrLabel"/>
<Label GridPane.rowIndex="2">Paswort</Label>
<JFXPasswordField styleClass="passField" GridPane.columnIndex="1" GridPane.rowIndex="2" fx:id="passField"/>
<Label styleClass="errorLbl" GridPane.columnIndex="2" GridPane.rowIndex="2" fx:id="passErrLabel"/>
<JFXButton styleClass="quitBtn" onAction="#abortBtnClick" GridPane.columnIndex="1" GridPane.rowIndex="3">Beenden</JFXButton>
<JFXButton styleClass="loginBtn" onAction="#login" GridPane.columnIndex="2" GridPane.rowIndex="3">Anmelden</JFXButton>
</GridPane>

View File

@ -2,9 +2,14 @@ plugins {
java java
} }
tasks.withType<JavaCompile> {
options.encoding = "UTF-8"
}
dependencies { dependencies {
val jacksonVersion = "2.13.0" val jacksonVersion = "2.13.0"
implementation("com.fasterxml.jackson.core:jackson-databind:$jacksonVersion") implementation("com.fasterxml.jackson.core:jackson-databind:$jacksonVersion")
implementation("com.fasterxml.jackson.core:jackson-core:$jacksonVersion") implementation("com.fasterxml.jackson.core:jackson-core:$jacksonVersion")
implementation("com.fasterxml.jackson.core:jackson-annotations:$jacksonVersion") implementation("com.fasterxml.jackson.core:jackson-annotations:$jacksonVersion")
implementation("com.fasterxml.jackson.datatype:jackson-datatype-jsr310:$jacksonVersion")
} }

View File

@ -0,0 +1,81 @@
//Marc Beyer//
package config;
public class Config {
private boolean saveLogin;
private long id;
private String token;
private String connectionMethod;
private String hostAddress;
private int port;
public Config(){
saveLogin = false;
id = -1;
token = "";
connectionMethod = "http";
hostAddress = "localhost";
port = 8080;
}
public Config(boolean saveLogin, long id, String token) {
this.saveLogin = saveLogin;
this.id = id;
this.token = token;
connectionMethod = "http";
hostAddress = "localhost";
port = 8080;
}
public boolean isSaveLogin() {
return saveLogin;
}
public void setSaveLogin(boolean saveLogin) {
this.saveLogin = saveLogin;
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getToken() {
return token;
}
public void setToken(String token) {
this.token = token;
}
public String getConnectionMethod() {
return connectionMethod;
}
public void setConnectionMethod(String connectionMethod) {
this.connectionMethod = connectionMethod;
}
public String getHostAddress() {
return hostAddress;
}
public void setHostAddress(String hostAddress) {
this.hostAddress = hostAddress;
}
public int getPort() {
return port;
}
public void setPort(int port) {
this.port = port;
}
public String toServerUrl(){
return getConnectionMethod() + "://" + getHostAddress() + ":" + getPort();
}
}

View File

@ -0,0 +1,43 @@
//Marc Beyer//
package config;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
public class ConfigLoader {
public static Config load(){
try {
String jsonString = Files.readString(Paths.get("config.json"));
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.findAndRegisterModules();
return objectMapper.readValue(jsonString, Config.class);
} catch (IOException e) {
System.out.println("config.json missing");
Config config = new Config(false, -1, "");
save(config);
return config;
}
}
public static void save(Config config){
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.findAndRegisterModules();
try {
Files.writeString(
Paths.get("config.json"),
objectMapper.writeValueAsString(config)
.replace(",", ",\n\t")
.replace("{", "{\n\t")
.replace("}", "\n}")
);
} catch (IOException e) {
e.printStackTrace();
}
}
}

View File

@ -0,0 +1,220 @@
package container;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import helper.HttpRequestException;
import helper.Tuple;
import java.time.LocalDateTime;
import java.util.*;
public class DataController {
public static long USER_ID = -1;
public static String SERVER_URL = "http://localhost:8080";
private static final String ALL_EVENTS_ENDPOINT = "/event/all";
private static final String ADD_EVENT_ENDPOINT = "/event/add";
private static final String DELETE_EVENT_ENDPOINT = "/event/del";
private static final String EDIT_EVENT_ENDPOINT = "/event/edit";
private static final String ALL_USER_ENDPOINT = "/user/all";
private static final String ADD_USER_ENDPOINT = "/user/add";
private static final String DELETE_USER_ENDPOINT = "/user/del";
private static final String EDIT_USER_ENDPOINT = "/user/edit";
private static final String LOGIN_ENDPOINT = "/user/login";
private static final String LOGIN_WITH_TOKEN_ENDPOINT = "/user/login-with-token";
private static final String HEADER_TEST_ENDPOINT = "/vpr/header-test";
private final HttpRequest httpRequest;
public DataController() {
httpRequest = new HttpRequest();
}
public boolean login(String username, String password) {
try {
Tuple<Integer, String> response = httpRequest.sendPostRequest(
SERVER_URL + LOGIN_ENDPOINT,
"login=" + username
+ "&password=" + password,
false
);
String[] data = response.getValue().split("\\s+");
USER_ID = Long.parseLong(data[1]);
HttpRequest.TOKEN = data[0];
} catch (Exception e) {
e.printStackTrace();
return false;
}
return USER_ID >= 0;
}
public boolean loginWithToken(long userId, String token) {
try {
HttpRequest.TOKEN = token;
Tuple<Integer, String> response = httpRequest.sendPostRequest(
SERVER_URL + LOGIN_WITH_TOKEN_ENDPOINT,
"userId=" + userId,
true
);
System.out.println(response.getKey() + " " + response.getValue());
if (response.getKey() != 200) return false;
} catch (Exception e) {
e.printStackTrace();
return false;
}
USER_ID = userId;
HttpRequest.TOKEN = token;
return USER_ID >= 0;
}
/*********
* Event *
*********/
public void createEvent(Event event) throws HttpRequestException {
sendBasicHttpRequest(
SERVER_URL + ADD_EVENT_ENDPOINT,
event.getAsUrlParam(),
true
);
}
public void deleteEvent(int userId, int eventId, LocalDateTime date) throws HttpRequestException {
sendBasicHttpRequest(
SERVER_URL + DELETE_EVENT_ENDPOINT,
"userId=" + userId + "&eventId=" + eventId + "&date=" + date.toLocalDate(),
true
);
}
public void editEvent(Event oldEvent, Event event) throws HttpRequestException {
sendBasicHttpRequest(
SERVER_URL + EDIT_EVENT_ENDPOINT,
"eventId=" + oldEvent.getId() +
"&userId=" + oldEvent.getOwnerId() +
"&date=" + oldEvent.getDate().toLocalDate() +
"&newDate=" + event.getDate().toLocalDate() +
"&newName=" + event.getName() +
"&newStart=" + event.getStart() +
"&newEnd=" + event.getEnd() +
"&newPriority=" + event.getPriority() +
"&newIsFullDay=" + event.isFullDay() +
"&newIsPrivate=" + event.isPrivate(),
true
);
}
public ArrayList<Event> getAllVisibleEvents(LocalDateTime startDate, LocalDateTime endDate) throws HttpRequestException {
try {
Tuple<Integer, String> response = httpRequest.sendPostRequest(
SERVER_URL + ALL_EVENTS_ENDPOINT,
"userId=" + USER_ID + "&startDate=" + startDate.toLocalDate() + "&endDate=" + endDate.toLocalDate(),
true
);
if (response.getKey() != 200) {
throw new HttpRequestException(response);
}
String jsonResponse = response.getValue();
System.out.println(jsonResponse);
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.findAndRegisterModules();
return (ArrayList<Event>) objectMapper.readValue(jsonResponse, new TypeReference<List<Event>>() {
});
} catch (HttpRequestException e) {
throw e;
} catch (Exception e) {
throw new HttpRequestException("Es konnte keine Verbindung mit dem Server hergestellt werden.", 600);
}
}
/********
* User *
********/
public List<User> getAllUser() throws HttpRequestException {
String userJSON = sendBasicHttpRequest(
SERVER_URL + ALL_USER_ENDPOINT,
"",
true
);
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.findAndRegisterModules();
try {
List<User> list = objectMapper.readValue(userJSON, new TypeReference<>() {
});
for(User u : list){
System.out.println(u);
}
return list;
} catch (JsonProcessingException e) {
e.printStackTrace();
}
return new ArrayList<>();
}
public void createUser(User user) throws HttpRequestException {
sendBasicHttpRequest(
SERVER_URL + ADD_USER_ENDPOINT,
"name=" + user.getName() +
"&forename=" + user.getForename() +
"&login=" + user.getLogin() +
"&password=" + user.getPassword() +
"&isAdmin=" + user.isAdmin(),
true
);
}
public void deleteUser(User user) throws HttpRequestException {
sendBasicHttpRequest(
SERVER_URL + DELETE_USER_ENDPOINT,
"userId=" + user.getUserId(),
true
);
}
public void editUser(User user) throws HttpRequestException {
String urlParam = "userId=" + user.getUserId() +
"&name=" + user.getName() +
"&forename=" + user.getForename() +
"&login=" + user.getLogin() +
"&isAdmin=" + user.isAdmin() +
(user.getPassword() == null ? "" : "&password=" + user.getPassword());
System.out.println(urlParam);
sendBasicHttpRequest(
SERVER_URL + EDIT_USER_ENDPOINT,
urlParam,
true
);
}
private String sendBasicHttpRequest(String urlString, String urlParameters, boolean sendAuth) throws HttpRequestException {
try {
Tuple<Integer, String> response = httpRequest.sendPostRequest(
urlString,
urlParameters,
sendAuth
);
if (response.getKey() != 200) {
throw new HttpRequestException(response);
}
return response.getValue();
} catch (HttpRequestException e) {
throw e;
} catch (Exception e) {
throw new HttpRequestException("Es konnte keine Verbindung mit dem Server hergestellt werden.", 600);
}
}
}

View File

@ -1,10 +1,11 @@
package res; package container;
import com.sun.jdi.event.StepEvent;
import java.time.Duration;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatter;
import java.util.ArrayList; import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Event { public class Event {
@ -21,53 +22,41 @@ public class Event {
private int ownerId; private int ownerId;
private String ownerName; private String ownerName;
/* public Event() {}
Constructor for SELECT:
e.id AS eid,
e.name AS ename,
e.start,
e.end,
e.priority,
e.is_full_day,
ue.date,
u.id AS uid,
u.forename,
u.name AS uname
*/
public Event(ArrayList<Object> arr) {
id = (int) arr.get(0);
name = (String) arr.get(1);
start = (String) arr.get(2);
end = (String) arr.get(3);
priority = (int) arr.get(4);
isFullDay = (Boolean) arr.get(5); //((String)arr.get(5)).equals("true");
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
date = LocalDateTime.parse(arr.get(6) + " 00:00", formatter);
ownerId = (int) arr.get(7);
ownerName = arr.get(8) + " " + arr.get(9);
}
public Event(String name, public Event(String name,
int priority, int priority,
boolean isFullDay, boolean isFullDay,
boolean isPrivate, boolean isPrivate,
String start, LocalTime start,
String end, LocalTime end,
LocalDateTime date, LocalDateTime date,
int ownerId int ownerId
) { ) throws IllegalArgumentException {
System.out.println("Create Event");
if (name.length() < 3) {
throw new IllegalArgumentException("Der Name muss eine Länge von 3 haben.");
}
Pattern pattern = Pattern.compile("[A-Za-zäöüÄÖÜß0-9 =!?+*/$.:,;_<>()-]*");
Matcher matcher = pattern.matcher(name);
if (!matcher.matches()) {
throw new IllegalArgumentException("Der Name darf nur aus Zahlen, Buchstaben und folgenden Sonderzeichen bestehen: äöü ÄÖÜ ß =!?+*/$.:,;_ <>()-");
}
if (priority < 0) {
throw new IllegalArgumentException("Bitte eine Priorität wählen.");
}
LocalDateTime today = LocalDateTime.now().toLocalDate().atStartOfDay();
if (Duration.between(today, date).isNegative()) {
throw new IllegalArgumentException("Das Datum muss in der Zukunft liegen.");
}
this.name = name; this.name = name;
this.priority = priority; this.priority = priority;
this.isFullDay = isFullDay; this.isFullDay = isFullDay;
this.isPrivate = isPrivate; this.isPrivate = isPrivate;
this.start = start; if (start != null) this.start = start.toString();
this.end = end; if (end != null) this.end = end.toString();
this.date = date; this.date = date;
this.ownerId = ownerId; this.ownerId = ownerId;
} }
@ -132,8 +121,9 @@ public class Event {
return date; return date;
} }
public void setDate(LocalDateTime date) { public void setDate(String date) {
this.date = date; DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
this.date = LocalDateTime.parse(date + " 00:00", formatter);
} }
public int getOwnerId() { public int getOwnerId() {
@ -167,7 +157,7 @@ public class Event {
"&name=" + getName() + "&name=" + getName() +
"&start=" + getStart() + "&start=" + getStart() +
"&end=" + getEnd() + "&end=" + getEnd() +
"&prority=" + getPriority() + "&priority=" + getPriority() +
"&isFullDay=" + isFullDay() + "&isFullDay=" + isFullDay() +
"&isPrivate=" + isPrivate(); "&isPrivate=" + isPrivate();
} }

View File

@ -0,0 +1,77 @@
package container;
import helper.Tuple;
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.StandardCharsets;
public class HttpRequest {
public static String TOKEN = "";
public Tuple<Integer, String> sendPostRequest(String urlString, String urlParameters, boolean sendAuth) throws Exception {
byte[] postData = urlParameters.getBytes(StandardCharsets.UTF_8);
int postDataLength = postData.length;
URL url = new URL(urlString);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setDoOutput(true);
connection.setInstanceFollowRedirects(false);
connection.setRequestMethod("POST");
connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
connection.setRequestProperty("charset", "utf-8");
connection.setRequestProperty("Content-Length", Integer.toString(postDataLength));
connection.setUseCaches(false);
if(sendAuth){
connection.setRequestProperty("Accept", "application/json");
connection.setRequestProperty("Authorization", "Bearer " + TOKEN);
}
try (DataOutputStream writer = new DataOutputStream(connection.getOutputStream())) {
writer.write(postData);
}
return getHttpTuple(connection);
}
public Tuple<Integer, String> sendGetRequest(String urlString) throws Exception {
URL url = new URL(urlString);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
connection.setConnectTimeout(5000);
connection.setReadTimeout(5000);
int status = connection.getResponseCode();
return getHttpTuple(connection);
}
private Tuple<Integer, String> getHttpTuple(HttpURLConnection connection) throws IOException {
int status = connection.getResponseCode();
String inputLine;
StringBuilder content = new StringBuilder();
BufferedReader in;
if (status == 200) {
in = new BufferedReader(new InputStreamReader(connection.getInputStream(), StandardCharsets.UTF_8));
} else {
in = new BufferedReader(new InputStreamReader(connection.getErrorStream(), StandardCharsets.UTF_8));
}
while ((inputLine = in.readLine()) != null) {
content.append(inputLine);
}
in.close();
connection.disconnect();
return new Tuple<>(status, content.toString());
}
}

View File

@ -0,0 +1,75 @@
package container;
public class User {
private int userId;
private String login;
private String forename;
private String name;
private String password;
private boolean isAdmin;
public User(){}
public int getUserId() {
return userId;
}
public void setUserId(int userId) {
this.userId = userId;
}
public String getLogin() {
return login;
}
public void setLogin(String login) {
this.login = login;
}
public String getForename() {
return forename;
}
public void setForename(String forename) {
this.forename = forename;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public boolean isAdmin() {
return isAdmin;
}
public void setAdmin(boolean admin) {
isAdmin = admin;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "User{" +
"userId=" + userId +
", login='" + login + '\'' +
", forename='" + forename + '\'' +
", name='" + name + '\'' +
", password='" + password + '\'' +
", isAdmin=" + isAdmin +
'}';
}
}

View File

@ -0,0 +1,24 @@
//Marc Beyer//
package helper;
public class HttpRequestException extends Exception{
private int status;
public HttpRequestException(String message, int status) {
super(message);
this.status = status;
}
public HttpRequestException(Tuple<Integer, String> response) {
super(response.getValue());
this.status = response.getKey();
}
public int getStatus() {
return status;
}
public void setStatus(int status) {
this.status = status;
}
}

View File

@ -0,0 +1,28 @@
//Marc Beyer//
package helper;
public class Tuple<X, Y> {
public final X key;
public final Y value;
public Tuple(X key, Y value) {
this.key = key;
this.value = value;
}
public X getKey() {
return key;
}
public Y getValue() {
return value;
}
@Override
public String toString() {
return "Tuple{" +
"key=" + key +
", value=" + value +
'}';
}
}

View File

@ -1,96 +0,0 @@
package res;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.util.*;
public class DataController {
private static final String ALL_EVENTS_ENDPOINT = "http://localhost:8080/vpr/all-events";
private static final String ALL_USERS_ENDPOINT = "http://localhost:8080/vpr/all-users";
private static final String ADD_EVENT_ENDPOINT = "http://localhost:8080/vpr/add-event";
private static final String DELETE_EVENT_ENDPOINT = "http://localhost:8080/vpr/del-event";
private final HttpRequest httpRequest;
public DataController(){
httpRequest = new HttpRequest();
}
public void createEvent(Event event){
try {
System.out.println(httpRequest.sendPostRequest(ADD_EVENT_ENDPOINT, event.getAsUrlParam()));
} catch (Exception e) {
e.printStackTrace();
}
}
public void deleteEvent(int eventId){
try {
System.out.println(httpRequest.sendPostRequest(DELETE_EVENT_ENDPOINT, "eventId=" + eventId));
} catch (Exception e) {
e.printStackTrace();
}
}
public ArrayList<Event> getAllVisibleEvents() {
ArrayList<Event> eventList = new ArrayList<>();
try {
String jsonResponse = httpRequest.sendPostRequest(ALL_EVENTS_ENDPOINT, "userId=1");
System.out.println(jsonResponse);
ObjectMapper objectMapper = new ObjectMapper();
//String json = "{ \"color\" : \"Black\", \"type\" : \"BMW\" }";
for (Object obj : objectMapper.readValue(jsonResponse, Object[].class)){
ArrayList<Object> list = new ArrayList<>();
if (obj.getClass().isArray()) {
list = (ArrayList<Object>) Arrays.asList((Object[])obj);
} else if (obj instanceof Collection) {
list = new ArrayList<>((Collection<?>) obj);
}
eventList.add(new Event(list));
}
} catch (Exception e) {
e.printStackTrace();
}
return eventList;
}
public Event[] getAllEvents() {
Event[] eventList = null;
try {
String jsonResponse = httpRequest.sendGetRequest("http://localhost:8080/vpr/all-events-test");
eventList = parseJsonToEventList(jsonResponse);
for (Event e : eventList) {
System.out.println(e);
}
} catch (Exception e) {
e.printStackTrace();
}
return eventList;
}
private Event[] parseJsonToEventList(String jsonString) throws JsonProcessingException {
ArrayList<Event> eventList;
// Parse JSON
ObjectMapper objectMapper = new ObjectMapper();
//String json = "{ \"color\" : \"Black\", \"type\" : \"BMW\" }";
return objectMapper.readValue(jsonString, Event[].class);
}
}

View File

@ -1,76 +0,0 @@
package res;
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.util.Arrays;
public class HttpRequest {
public String sendPostRequest(String urlString, String urlParameters) throws Exception{
byte[] postData = urlParameters.getBytes(StandardCharsets.UTF_8);
int postDataLength = postData.length;
URL url = new URL(urlString);
HttpURLConnection con = (HttpURLConnection) url.openConnection();
con.setDoOutput(true);
con.setInstanceFollowRedirects(false);
con.setRequestMethod("POST");
con.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
con.setRequestProperty("charset", "utf-8");
con.setRequestProperty("Content-Length", Integer.toString(postDataLength));
con.setUseCaches(false);
try (DataOutputStream wr = new DataOutputStream(con.getOutputStream())) {
wr.write(postData);
}
int status = con.getResponseCode();
if (status == 200) {
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuilder content = new StringBuilder();
while ((inputLine = in.readLine()) != null) {
content.append(inputLine);
}
in.close();
con.disconnect();
return content.toString();
} else {
con.disconnect();
throw new Exception("Status: " + status);
}
}
public String sendGetRequest(String urlString) throws Exception{
URL url = new URL(urlString);
HttpURLConnection con = (HttpURLConnection) url.openConnection();
con.setRequestMethod("GET");
con.setConnectTimeout(5000);
con.setReadTimeout(5000);
int status = con.getResponseCode();
if (status == 200) {
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuilder content = new StringBuilder();
while ((inputLine = in.readLine()) != null) {
content.append(inputLine);
}
in.close();
con.disconnect();
return content.toString();
} else {
con.disconnect();
throw new Exception("Status: " + status);
}
}
}