Compare commits

...

21 Commits
0.2.5 ... 0.5.2

Author SHA1 Message Date
b234299e6b Log Rating + Create Table bugfix 2021-04-18 18:04:53 +02:00
d872a39394 Einheiten hinzugefügt + Weitere Übersetzungen + Fileinput .json bugfix + exporter " " hinzugefügt 2021-04-17 23:55:25 +02:00
9d010d452c Settings -> Deutsch/Englisch verbessert/erweitert 2021-04-17 22:40:36 +02:00
58e94e6cbd Setting -> Deutsch / Englisch 2021-04-17 18:43:24 +02:00
63e736152b Map/Report automatisch öffnen einstellung 2021-04-17 18:17:51 +02:00
ad5d7d98c4 Progressbar Icon 2021-04-17 18:00:55 +02:00
d8c4680e16 Progressbar Bugfixes 2021-04-17 17:52:36 +02:00
49b6407ce6 Progress Bar 2021-04-17 15:38:16 +02:00
9472a5537a Suche + getTourData/getTourNamen doppelte Daten bugfix 2021-04-17 14:40:00 +02:00
f4e9b16792 Summary Report + Import Map Bugfixes 2021-04-17 01:41:43 +02:00
c261652ce6 Export/Import in Json 2021-04-17 01:13:47 +02:00
a0224b9870 Exporter begonnen 2021-04-16 23:58:09 +02:00
ae93f365d5 Sprachfile erweitert + Exporter begonnen 2021-04-16 23:57:31 +02:00
93cb83e33e Get Mapquest Directions -> Strecke, Dauer 2021-04-16 17:07:49 +02:00
9fe6f34ba3 Kleine Map für Report 2021-04-15 23:24:31 +02:00
3f60d618ff Static map -> Tour edit, del 2021-04-15 22:59:38 +02:00
39c4244668 Get Static Map -> Img speichern, öffnen, anzeigen, get von mapquest 2021-04-15 22:30:26 +02:00
34aa390f2c Merge branch 'reporter' 2021-04-15 19:28:29 +02:00
0e81b6ca24 Add itext 2021-04-15 19:27:01 +02:00
6cd6798609 Gitignore Log 2021-04-15 19:24:22 +02:00
be2bb0c6fa Report mit iText 4 2021-04-15 19:22:22 +02:00
33 changed files with 1909 additions and 171 deletions

3
.gitignore vendored
View File

@ -1,4 +1,5 @@
out/ out/
conf.ini conf.ini
log/log4j/log.out/ log/
reports/ reports/
.idea/dataSources*

View File

@ -0,0 +1,10 @@
<component name="libraryTable">
<library name="com.google.code.gson:gson:2.8.6" type="repository">
<properties maven-id="com.google.code.gson:gson:2.8.6" />
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/com/google/code/gson/gson/2.8.6/gson-2.8.6.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>

View File

@ -0,0 +1,9 @@
<component name="libraryTable">
<library name="iText-4.2.0-com.itextpdf">
<CLASSES>
<root url="jar://$PROJECT_DIR$/lib/iText-4.2.0-com.itextpdf.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>

View File

@ -0,0 +1,11 @@
<component name="libraryTable">
<library name="org.postgresql:postgresql:42.2.19" type="repository">
<properties maven-id="org.postgresql:postgresql:42.2.19" />
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/org/postgresql/postgresql/42.2.19/postgresql-42.2.19.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/checkerframework/checker-qual/3.5.0/checker-qual-3.5.0.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>

7
.idea/sqldialects.xml generated Normal file
View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="SqlDialectMappings">
<file url="file://$PROJECT_DIR$/src/tourplaner/data/PostgresHelper.java" dialect="GenericSQL" />
<file url="PROJECT" dialect="PostgreSQL" />
</component>
</project>

View File

@ -10,6 +10,9 @@
<orderEntry type="library" name="lib" level="project" /> <orderEntry type="library" name="lib" level="project" />
<orderEntry type="library" name="org.ini4j:ini4j:0.5.4" level="project" /> <orderEntry type="library" name="org.ini4j:ini4j:0.5.4" level="project" />
<orderEntry type="library" name="log4j:log4j:1.2.17" level="project" /> <orderEntry type="library" name="log4j:log4j:1.2.17" level="project" />
<orderEntry type="library" name="org.apache.pdfbox:pdfbox:1.8.9" level="project" /> <orderEntry type="library" name="org.postgresql:postgresql:42.2.19" level="project" />
<orderEntry type="library" name="iText-4.2.0-com.itextpdf" level="project" />
<orderEntry type="library" name="org.json:json:20180130" level="project" />
<orderEntry type="library" name="com.google.code.gson:gson:2.8.6" level="project" />
</component> </component>
</module> </module>

20
TourplanerTabellen.sql Normal file
View File

@ -0,0 +1,20 @@
// Tour Tabelle
create table tour
(
tourname varchar not null,
dauer decimal,
mapjson varchar,
start varchar,
ziel varchar,
strecke decimal
);
create unique index tour_tourname_uindex
on tour (tourname);
alter table tour add constraint tour_pk primary key (tourname);
#// Log Table
create table log(tourname varchar constraint log_tour_tourname_fk references tour,id varchar,bemerkung varchar,datum date,strecke decimal,avg decimal,hightmeter decimal,pause decimal,gegangen decimal,dauer decimal);

View File

@ -6,6 +6,16 @@ logo = logo.png
[lang] [lang]
lang = langde lang = langde
[settings]
openpdf = 1
openmap = 0
[einheiten]
zeit = min
strecke = km
meter = m
speed = km/h
[db] [db]
dbname = tourplaner dbname = tourplaner
url = url =
@ -20,3 +30,10 @@ path = ./reports/
gitrepo = https://git.dergeorg.at/dergeorg/tourplaner gitrepo = https://git.dergeorg.at/dergeorg/tourplaner
doxygendoc = https://git.dergeorg.at/dergeorg/tourplaner doxygendoc = https://git.dergeorg.at/dergeorg/tourplaner
javadoc = https://git.dergeorg.at/dergeorg/tourplaner javadoc = https://git.dergeorg.at/dergeorg/tourplaner
[map]
key =
size = 1500,400
sizePdf = 600,400
path = D:\\TourplanerImages\\
file_pre = file:///

View File

@ -19,7 +19,7 @@ zielpunkttitle = Tour zielpunkt
zielpunktheader = Bitte geben Sie den Zielpunkt der Tour an! zielpunktheader = Bitte geben Sie den Zielpunkt der Tour an!
zielpunktmsg = Zielpunkt: zielpunktmsg = Zielpunkt:
deltournoselect = ViewModel -> DelTour deltournoselect = ViewModel -> DelTour
deltournoselectmsg = Bitte wählen Sie zuerst eine Tour aus, bevor Sie auf löschen klicken! deltournoselectmsg = Bitte wählen Sie zuerst eine Tour aus!
exceptionstackheader = Exception stacktrace: exceptionstackheader = Exception stacktrace:
keinelogsvorhanden = Fügen Sie erst ein Log hinzu um es anzuzeigen! keinelogsvorhanden = Fügen Sie erst ein Log hinzu um es anzuzeigen!
datum = Datum datum = Datum
@ -40,3 +40,70 @@ hightmeter = Höhenmeter
hightmetermsg = Höhenmeter des Abschnitts hightmetermsg = Höhenmeter des Abschnitts
bemerkung = Bemerkung bemerkung = Bemerkung
bemerkungheader = Bitte geben Sie die Bemerkungen zu diesem Log eintrag ein, kann auch leer bleiben. bemerkungheader = Bitte geben Sie die Bemerkungen zu diesem Log eintrag ein, kann auch leer bleiben.
tourreportvon = Tour Report von ->
tourplanervon = Tourplaner by DerGeorg
reportkeywords = Tourplaner, Tour, Report
tourplaner = Tourplaner"
tour = Tour
reportvon = Report erstellt von:
reportstart = Startpunkt der Tour:
reportziel = Zielpunkt der Tour:
reportdauercal = Berechnete Dauer der Tour:
reportstreckecal = Berechnete Strecke der Tour:
logs = Logs
countlog = Anzahl der Logeinträge:
logvom = Log vom:
logdauer = Dauer:
logpause = Davon Pause:
loggegangen = Davon gegangen:
logavg = Berechnete Durchschnittliche Geschwindigkeit:
logstrecke = Entfernung:
loghight = Höhenmeter:
logbemerkung = Bemerkung:
fkarte = Karte
fbeschreibung = Beschreibung
fedit = Bearbeiten
fname = Tourname
fstrecke = Berechnete Strecke
fdauer = Berechnete Dauer
fziel = Ziel
fstart = Start
favg = Durchschnittsgeschwindigkeit
fbemerkung = Bemerkung
fdatum = Datum
fdauer = Dauer
fgegangen = Davon gegangen
fhight = Höhenmeter
fpause = Davon Pause
fstrecke = Strecke
keinlogselected = Kein Logeintrag ausgewählt
keinlogselectedmsg = Bitte zuerst einen Logeintrag auswählen
fsuche = Suchen
fopenmapsetting = Map automatisch öffnen
fopenpdfsetting = Report automatisch öffnen
flangenglisch = Englisch
flangdeutsch = Deutsch
fdatei = Datei
fbearbeiten = Bearbeiten
foptionen = Optionen
fsprache = Sprache auswählen
fhilfe = Hilfe
freposum = Erstelle Report über alle Touren
frepotour = Erstelle Report über aktuelle Tour
fbeenden = Beenden
fpunkte = ...
rzeitallerlogs = Gesammte Zeit aller Logs:
rstreckeallerlogs = gesammte Strecke aller Logs:
rcalzeitallerlogs = Berechnete Zeit aller Logs:
calstreckeallerloggs = Berechnete Strecke aller Touren:
rdaten = Daten
rsummrepo = Zusammengefasster Report
bewertung = Bewertung
bewertungmsg = Bitte die Bewertung zwischen 0 und 5 eingeben
bewertungeror = Bitte nur Bewertungen von 0 und 5 eingeben
bewertungerror2 = Bitte nur Zahlen zum Bewerten

110
langen.ini Normal file
View File

@ -0,0 +1,110 @@
[langen]
achtung = ATTENTION
openbrowsererror = TourplanerController -> Browser:
browserexception = Browser Exception
browserexceptionmsg = Error at opening Browser
suchfeldleer = Search field is empty!
suchtextzuerst = Please enter search term first!
keinetourselected = No Tour selected
tournametitle = Tour name
tournameheader = Please enter a Tourname!
tournamemsg = Name:
namevergebenheader = Name is already occupied!
namevergebenmsg1 = The name '
namevergebenmsg2 = ' is already in use!
startpunkttitle = Tour start
startpunktheader = Please enter the start of the Tour
startpunktmsg = Start:
zielpunkttitle = Tour destination:
zielpunktheader = Please enter the tour destination!
zielpunktmsg = Destination:
deltournoselect = ViewModel -> DelTour
deltournoselectmsg = Please select a tour first!
exceptionstackheader = Exception stacktrace:
keinelogsvorhanden = First add a Log!
datum = Date
dauer = Duration
strecke = Distance
streckemsg = Distance of the log entry
dauermsg = Duration of the log entry
doppelpunkt = :
fktnichtimplementiert = Not implementet jet
vergessenodernochnichtsoweit = Not implementet jet
logtournotselectedmsg = Please select a tour first!
keintextimfeld = Please enter a text!
nurzahlen = Only numbers!
nurpositivezahlen = Only positiv numbers!
pause = Break
pausemsg = Duration of the break
hightmeter = Vertical meters
hightmetermsg = Vertical meters of the etape
bemerkung = Comment
bemerkungheader = Please enter a Comment, can also be empty!
tourreportvon = Tour Report from ->
tourplanervon = Tourplaner by DerGeorg
reportkeywords = Tourplaner, Tour, Report
tourplaner = Tourplaner
tour = Tour
reportvon = Report created by:
reportstart = Start of the tour:
reportziel = Destination of the tour:
reportdauercal = Calculated duration of the tour:
reportstreckecal = Calculated distance of the tour:
logs = Logs
countlog = Number of log entries:
logvom = Log from:
logdauer = Duration:
logpause = Break from that:
loggegangen = Gone away:
logavg = Calculated averrage speed:
logstrecke = Distance:
loghight = Vertical meters:
logbemerkung = Comment:
fkarte = Map
fbeschreibung = Description
fedit = Edit
fname = Tourname
fstrecke = Calculated Distance
fdauer = Calculated Duration
fziel = Destination
fstart = Start
favg = Average speed
fbemerkung = Comment
fdatum = Date
fdauer = Duration
fgegangen = Gone away
fhight = Vertical meters
fpause = Break from that
fstrecke = Distance
keinlogselected = No log selected
keinlogselectedmsg = Please select a log first!
fsuche = Search
fopenmapsetting = Open map automatic
fopenpdfsetting = Open report automatic
flangenglisch = English
flangdeutsch = German
fdatei = File
fbearbeiten = Edit
foptionen = Options
fsprache = Choose Language
fhilfe = Help
freposum = Generate summarize-report
frepotour = Generate tour-report
fbeenden = Quit
fpunkte = ...
rzeitallerlogs = Time of all logs:
rstreckeallerlogs = Distance of all logs:
rcalzeitallerlogs = Calculated time of all logs:
calstreckeallerloggs = Calculated distance of all logs:
rdaten = Data
rsummrepo = Summary Report
bewertung = Rating
bewertungmsg = Please enter a rating from 0 to 5
bewertungeror = Please enter only a rating from 0 to 5
bewertungerror2 = Please only enter numbers for rating

Binary file not shown.

View File

@ -1,15 +0,0 @@
2021-03-18 22:41:23 ERROR ViewModel -> DelTour:33 - Keine Tour ausgewählt!
2021-03-18 22:48:51 ERROR ViewModel -> DelTour:33 - Keine Tour ausgewählt!
2021-03-18 22:53:17 ERROR ViewModel -> DelTour:33 - Keine Tour ausgewählt!
2021-03-18 22:57:20 ERROR ViewModel -> DelTour:33 - Keine Tour ausgewählt!
2021-03-18 22:57:28 ERROR ViewModel -> DelTour:33 - Keine Tour ausgewählt!
2021-03-18 22:58:33 ERROR ViewModel -> DelTour:33 - Keine Tour ausgewählt!
2021-03-18 22:58:34 ERROR ViewModel -> DelTour:33 - Keine Tour ausgewählt!
2021-03-18 23:05:00 ERROR ViewModel -> DelTour:33 - Keine Tour ausgewählt!
2021-03-18 23:11:45 ERROR ViewModel -> DelTour:33 - Keine Tour ausgewählt!
2021-03-18 23:14:55 ERROR ViewModel -> DelTour:33 - Keine Tour ausgewählt!
2021-03-19 11:56:22 ERROR ViewModel -> DelTour:33 - Keine Tour ausgewählt!
2021-03-19 22:35:19 ERROR ViewModel -> DelTour:33 - Keine Tour ausgewählt!
2021-03-19 23:23:36 ERROR ViewModel -> DelTour:33 - Keine Tour ausgewählt!
2021-04-13 18:30:39 ERROR FileNotFoundException:33 - \report\test.pdf (Das System kann den angegebenen Pfad nicht finden)
2021-04-13 18:31:11 ERROR FileNotFoundException:33 - \reports\test.pdf (Das System kann den angegebenen Pfad nicht finden)

View File

@ -8,6 +8,7 @@ import javafx.scene.image.Image;
import javafx.stage.Stage; import javafx.stage.Stage;
import tourplaner.business.ConfigHelper; import tourplaner.business.ConfigHelper;
import tourplaner.business.TourPlaner;
import java.io.IOException; import java.io.IOException;
@ -23,6 +24,7 @@ public class Main extends Application {
Parent root = FXMLLoader.load(Main.class.getResource("tourplaner.fxml")); Parent root = FXMLLoader.load(Main.class.getResource("tourplaner.fxml"));
primaryStage.setTitle(ConfigHelper.getIniString(ConfigHelper.getStandartConfig(), "start", "apptitle")); primaryStage.setTitle(ConfigHelper.getIniString(ConfigHelper.getStandartConfig(), "start", "apptitle"));
primaryStage.getIcons().add(new Image("file:"+ ConfigHelper.getIniString(ConfigHelper.getStandartConfig(), "start", "logo"))); primaryStage.getIcons().add(new Image("file:"+ ConfigHelper.getIniString(ConfigHelper.getStandartConfig(), "start", "logo")));
TourPlaner.init();
primaryStage.setScene(new Scene(root, 1500, 1000)); primaryStage.setScene(new Scene(root, 1500, 1000));
primaryStage.show(); primaryStage.show();
} }

View File

@ -43,7 +43,7 @@ public class ConfigHelper {
try { try {
ini = new Wini(new File(filename)); ini = new Wini(new File(filename));
} catch (IOException e) { } catch (IOException e) {
LogHelper.error(e.getMessage(), e.getClass().getName()); LogHelper.error(e);
} }
assert ini != null; assert ini != null;
return ini.get(sectionName, optionName, String.class); return ini.get(sectionName, optionName, String.class);
@ -56,7 +56,7 @@ public class ConfigHelper {
* @return Den angeforderten String * @return Den angeforderten String
*/ */
public static String getLangIniString(String optionName){ public static String getLangIniString(String optionName){
return ConfigHelper.getIniString(ConfigHelper.getStandartLangde(), ConfigHelper.getIniString(ConfigHelper.getStandartConfig(), "lang", "lang"),optionName); return ConfigHelper.getIniString(getIniString(getStandartConfig(), "lang", "lang") + ".ini", ConfigHelper.getIniString(ConfigHelper.getStandartConfig(), "lang", "lang"),optionName);
} }
/** /**
@ -92,7 +92,7 @@ public class ConfigHelper {
ini.put(sectionName, optionName, value); ini.put(sectionName, optionName, value);
ini.store(); ini.store();
} catch (IOException e) { } catch (IOException e) {
LogHelper.error(e.getMessage(), e.getClass().getName()); LogHelper.error(e);
} }
} }

View File

@ -0,0 +1,94 @@
package tourplaner.business;
import java.awt.*;
import java.io.File;
import java.io.IOException;
/**
* Zuständig für das besorgen der Map für die UI und PDF-Reports und für die Berechneten infos der Tour (Dauer, Strecke)
*/
public class DirectionMap {
private double dauer, strecke;
private String start, end, tourname, file, filepdf;
private Image map, mappdf;
/**
* Holt die Map als image und alle Daten zur berechneten Route
*
* @param start Startpunkt
* @param ende Endpunkt
* @param tourname Name der Aktuellen Tour
* @throws IOException Fehler beim Image der Map
*/
public DirectionMap (String start, String ende, String tourname) throws IOException {
this.map = getMap(start, ende, ConfigHelper.getIniString(ConfigHelper.getStandartConfig(), "map", "size"));
this.mappdf = getMap(start, ende, ConfigHelper.getIniString(ConfigHelper.getStandartConfig(), "map", "sizePdf"));
this.start = start;
this.end = ende;
this.tourname = tourname;
this.file = ConfigHelper.getIniString(ConfigHelper.getStandartConfig(), "map", "path") + this.tourname + ".jpg";
this.filepdf = ConfigHelper.getIniString(ConfigHelper.getStandartConfig(), "map", "path") + this.tourname + "_pdf.jpg";
FileHelper.saveImage(this.map, "jpg", new File(this.file));
FileHelper.saveImage(this.mappdf, "jpg", new File(this.filepdf));
getDirections(start, ende);
if(ConfigHelper.getIniInt(ConfigHelper.getStandartConfig(), "settings", "openmap") == 1) {
FileHelper.openDefault(file);
}
}
/**
* Get berechnete Dauer in Minuten
* @return Berechnete Dauer der Tour
*/
public double getDauer() {
return dauer;
}
/**
* Get berechnete Strecke
* @return Berechnete Strecke der Tour
*/
public double getStrecke() {
return strecke;
}
/**
* Downloadet die Map von Mapquest
* @param start Startpunkt
* @param ende Endpunkt
* @return Image von der Map
* @throws IOException Fehler beim Get der Map
*/
private Image getMap(String start, String ende, String size) throws IOException {
return HttpHelper.httpGetImage("https://www.mapquestapi.com/staticmap/v5/map?start="+start+"&end="+ende+"&size="+size+"&key="+ConfigHelper.getIniString(ConfigHelper.getStandartConfig(), "map", "key"));
}
/**
* Besorgt die Infos der Tour von Mapquest Directions
* @param start Start der Tour
* @param ende Ende der Tour
* @throws IOException Fehler beim besorgen der infos über die Tour
*/
private void getDirections(String start, String ende) throws IOException {
System.out.println("LOCS: " + start + ende);
String json = HttpHelper.httpGetJsonString("https://www.mapquestapi.com/directions/v2/route?key="+ ConfigHelper.getIniString(ConfigHelper.getStandartConfig(), "map", "key")+"&from="+start+"&to="+ende+"&outFormat=json&ambiguities=ignore&routeType=fastest&doReverseGeocode=false&enhancedNarrative=false&avoidTimedConditions=false");
System.out.println("JSON: " + json);
System.out.println("URL https://www.mapquestapi.com/directions/v2/route?key="+ ConfigHelper.getIniString(ConfigHelper.getStandartConfig(), "map", "key")+"&from="+start+"&to="+ende+"&outFormat=json&ambiguities=ignore&routeType=fastest&doReverseGeocode=false&enhancedNarrative=false&avoidTimedConditions=false");
this.strecke = JsonHelper.getDoubleFromJson(json, "distance");
this.dauer = formatetTimeToMinutes(JsonHelper.getStingFromJson(json, "formattedTime"));
}
/**
* Formatet time HH:MM:SS in Minuten umwandeln
* @param formatetTime Formatet time HH:MM:SS
* @return Zeit in Minuten
*/
private double formatetTimeToMinutes(String formatetTime){
double minutes = 0;
String[] result = formatetTime.split(":");
minutes += Double.parseDouble(result[0]) * 60;
minutes += Double.parseDouble(result[1]);
minutes += Double.parseDouble(result[2]) / 60;
return minutes;
}
}

View File

@ -0,0 +1,50 @@
package tourplaner.business;
/**
* Fügt am ende eines Strings die einheiten an
*/
public class EinheitenAdder {
/**
* Fügt meter hinzu
* @param meter Meter als String
* @return Meter mit einheit
*/
public static String addMeter(String meter){
return meter + " " +ConfigHelper.getIniString(ConfigHelper.getStandartConfig(), "einheiten", "meter");
}
public static String addSpeed(String speed){
return speed + " " + ConfigHelper.getIniString(ConfigHelper.getStandartConfig(), "einheiten", "speed");
}
/**
* Fügt km hinzu
* @param km km als String
* @return km mit einheit
*/
public static String addKm(String km){
return km + " " +ConfigHelper.getIniString(ConfigHelper.getStandartConfig(), "einheiten", "strecke");
}
/**
* Fügt minuten hinzu
* @param min minuten als String
* @return minuten mit einheit
*/
public static String addMinuten(String min){
return min + " " +ConfigHelper.getIniString(ConfigHelper.getStandartConfig(), "einheiten", "zeit");
}
/**
* Fügt am ende .json hinzu. Sofern es nicht schon dort ist
* @param filename Filename ohne .json am ende
* @return Der Filename mit .json am ende-
*/
public static String addJson(String filename){
if(!filename.contains(".json")){
filename += ".json";
}
return filename;
}
}

View File

@ -0,0 +1,77 @@
package tourplaner.business;
import tourplaner.data.DbConnect;
import tourplaner.object.Log;
import tourplaner.object.Tour;
import tourplaner.ui.AlertHelper;
import tourplaner.ui.ProgressBar;
import javax.swing.*;
import java.io.*;
import java.util.ArrayList;
/**
* Ist für das importieren und Exportieren der Daten zuständig
*/
public class Exporter {
private ArrayList<Tour> touren;
private String path;
/**
* Erstellt den Exporter mit dem gegebenen Path
* @param path Gegebener Path
*/
public Exporter(String path) {
this.path = path;
}
/**
* Führt den Export aus -> Holt daten, erstellt file
* @throws IOException Fehler beim File erstellen
*/
public void doExport() throws IOException {
ProgressBar progressBar = new ProgressBar("Export...");
int step = progressBar.getProgressSize(4, 100);
ArrayList<Tour> data = new DbConnect().getAllTouren();
progressBar.addProgress(step);
FileWriter fileWriter = new FileWriter(EinheitenAdder.addJson(this.path));
progressBar.addProgress(step);
JsonHelper.getJsonFromObj(data, fileWriter);
progressBar.addProgress(step);
BufferedWriter bufferedWriter = new BufferedWriter(fileWriter);
progressBar.setProgress(100);
bufferedWriter.close();
}
/**
* Führt den Imput aus -> File holen, Daten in db erstellen
* @throws IOException Fehler beim File öffnen
*/
public void doImport() {
ProgressBar progressBar = new ProgressBar("Import...");
try {
this.touren = JsonHelper.getTourenFromJson(new FileReader(EinheitenAdder.addJson(this.path)));
DbConnect dbConnect = new DbConnect();
dbConnect.delAllData();
progressBar.addProgress(5);
int size = progressBar.getProgressSize(this.touren.size() * 3, 100);
for (Tour tour:this.touren) {
new DirectionMap(tour.getStart(), tour.getZiel(), tour.getName());
progressBar.addProgress(size);
dbConnect.addTour(tour);
progressBar.addProgress(size);
ArrayList<Log> logs = tour.getLogs();
for (Log log:logs) {
dbConnect.addLog(tour.getName(), log);
}
progressBar.addProgress(size);
}
} catch (IOException e) {
LogHelper.error(e);
progressBar.setProgress(100);
}
progressBar.setProgress(100);
}
}

View File

@ -0,0 +1,62 @@
package tourplaner.business;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
public class FileHelper {
/**
* Öffnet ein File mit dem Standart Program
* @param f File Path als string
*/
public static void openDefault(String f){
// A reference to a text file
File file = new File(f);
try {
Desktop desktop = Desktop.getDesktop();
// Open a file using the default program for the file type. In the example
// we will launch a default registered program to open a text file. For
// example on Windows operating system this call might launch a notepad.exe
// to open the file.
desktop.open(file);
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* Speichert ein Image
* @param img Das zu speichernde Bild
* @param type Dateityp z.b. jpg
* @param file Wo die datei zu speichern ist
* @throws IOException
*/
public static void saveImage(Image img, String type, File file) throws IOException {
ImageIO.write(ImgHelper.toBufferedImage(img), type, file);
}
/**
* Holt ein image von einem File
* @param file File mit dem image
* @return Das buffered image
* @throws IOException Fehler beim öffnen des bildes
*/
public static BufferedImage getImage(File file) throws IOException {
return ImageIO.read(file);
}
/**
* Löscht ein File
* @param file File das zu löschen ist
* @return false bei error
*/
public static boolean delFile(File file){
return file.delete();
}
}

View File

@ -0,0 +1,53 @@
package tourplaner.business;
import javax.imageio.ImageIO;
import java.awt.*;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
/**
* Http Hilfsfunktionen
*/
public class HttpHelper {
/**
* Holt ein Image von gegebener URL
* @param url Url als Sting
* @return Image von der Url
* @throws IOException Fehler beim Bild holen
*/
public static Image httpGetImage(String url) throws IOException {
URL urls = new URL(url);
return ImageIO.read(urls);
}
/**
* Http GET Json string vom Url string
* @param url Url als String
* @return Json als String
* @throws IOException Fehler beim Json holen
*/
public static String httpGetJsonString(String url) throws IOException {
HttpURLConnection con = null;
try {
var myurl = new URL(url);
con = (HttpURLConnection) myurl.openConnection();
con.setRequestMethod("GET");
StringBuilder content;
try (BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()))) {
String line;
content = new StringBuilder();
while ((line = in.readLine()) != null) {
content.append(line);
content.append(System.lineSeparator());
}
}
return content.toString();
} finally {
assert con != null;
con.disconnect();
}
}
}

View File

@ -0,0 +1,35 @@
package tourplaner.business;
import java.awt.*;
import java.awt.image.BufferedImage;
/**
* Image Hilfsfunktionen
*/
public class ImgHelper {
/**
* Converts a given Image into a BufferedImage
*
* @param img The Image to be converted
* @return The converted BufferedImage
*/
public static BufferedImage toBufferedImage(Image img)
{
if (img instanceof BufferedImage)
{
return (BufferedImage) img;
}
// Create a buffered image with transparency
BufferedImage bimage = new BufferedImage(img.getWidth(null), img.getHeight(null), BufferedImage.TYPE_INT_ARGB);
// Draw the image on to the buffered image
Graphics2D bGr = bimage.createGraphics();
bGr.drawImage(img, 0, 0, null);
bGr.dispose();
// Return the buffered image
return bimage;
}
}

View File

@ -0,0 +1,72 @@
package tourplaner.business;
import com.google.gson.Gson;
import com.google.gson.JsonObject;
import com.google.gson.reflect.TypeToken;
import tourplaner.object.Tour;
import java.io.FileReader;
import java.io.FileWriter;
import java.util.ArrayList;
/**
* Hilfsklasse für Json (Gson)
*/
public class JsonHelper {
/**
* String aus json extrahieren
* @param json Json als String
* @param gets Eintrag im Json unter "route"
* @return Gesammelter String
*/
public static String getStingFromJson(String json, String gets){
return getJObj(json).get("route").getAsJsonObject().get(gets).getAsString();
}
/**
* Double aus json extrahieren
* @param json Json als String
* @param gets Eintrag im Json unter "route"
* @return Gesammelter Double Wert
*/
public static double getDoubleFromJson(String json, String gets){
return getJObj(json).get("route").getAsJsonObject().get(gets).getAsDouble();
}
/**
* Erzeugt ein Json aus einem Object
* @param obj Das Objekt
* @return Json des Objektes
*/
public static String getJsonFromObj(Object obj){
return new Gson().toJson(obj);
}
/**
* Erzeugt ein Json aus einem Object
* @param obj Das Objekt
* @param writer File in das geschrieben werden soll
*/
public static void getJsonFromObj(Object obj , FileWriter writer){
new Gson().toJson(obj, writer);
}
/**
* Wandelt ein Json file in ein Data Objekt um
* @param reader File aus dem gelesen wird
* @return Data objekt das gelesen wurde
*/
public static ArrayList<Tour> getTourenFromJson(FileReader reader){
return new Gson().fromJson(reader, new TypeToken<ArrayList<Tour>>() {}.getType());
}
/**
* Json String to JsonObject
* @param json Json string
* @return Neues JsonObject aus String
*/
private static JsonObject getJObj(String json){
return new Gson().fromJson(json, JsonObject.class);
}
}

View File

@ -33,6 +33,14 @@ public class LogHelper{
getLog(name).error(msg); getLog(name).error(msg);
} }
/**
* Log info in file und Console
* @param e Exception
*/
public static void error(Exception e){
getLog(e.getClass().getName()).error(e.getMessage());
}
/** /**
* Log info in file und Console * Log info in file und Console
* @param msg Nachricht in dem Log * @param msg Nachricht in dem Log

View File

@ -1,2 +1,244 @@
package tourplaner.business;public class Reporter { package tourplaner.business;
import com.itextpdf.text.*;
import com.itextpdf.text.Font;
import com.itextpdf.text.Image;
import tourplaner.object.Log;
import tourplaner.object.Tour;
import com.itextpdf.text.pdf.PdfWriter;
import java.awt.*;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
/**
* PDF Report generierung mit iText
*
* Erstellt Reports über einzelne Touren und fasst alle Touren zusammen
*
* iText 4 ist gratis verfügbar, siehe:
* https://github.com/ymasory/iText-4.2.0
*/
public class Reporter {
private static Font catFont = new Font(Font.TIMES_ROMAN, 18,
Font.BOLD);
private static Font redFont = new Font(Font.TIMES_ROMAN, 12,
Font.NORMAL, Color.RED);
private static Font subFont = new Font(Font.TIMES_ROMAN, 16,
Font.BOLD);
private static Font smallBold = new Font(Font.TIMES_ROMAN, 12,
Font.BOLD);
/**
* Erstellt den Summary Report
*/
public static void sumReport(){
ArrayList<Tour> tours = TourPlaner.getAllTours();
String file = ConfigHelper.getIniString(ConfigHelper.getStandartConfig(), "report", "path") + "summary.pdf";
try {
Document document = new Document();
PdfWriter.getInstance(document, new FileOutputStream(file));
document.open();
addSumRepo(document, tours);
document.close();
} catch (DocumentException | FileNotFoundException e) {
LogHelper.error(e.getMessage(), e.getClass().getName());
}
if(ConfigHelper.getIniInt(ConfigHelper.getStandartConfig(), "settings", "openpdf") == 1) {
FileHelper.openDefault(file);
}
}
/**
* Content des Sumary reports
* @param document Document auf das geschrieben wird
* @param touren Touren die berechnet werden
* @throws DocumentException Fehler beim schreiben auf das Dokument
*/
private static void addSumRepo(Document document, ArrayList<Tour> touren) throws DocumentException {
double dauer = 0;
double strecke = 0;
double calDauer = 0;
double calStecke = 0;
for (Tour tour:touren) {
calStecke += tour.getStrecke();
calDauer += Double.parseDouble(tour.getDauer());
ArrayList<Log> logs = tour.getLogs();
for (Log log:logs) {
dauer += log.getDauer();
strecke += log.getStrecke();
}
}
Anchor anchor = new Anchor(ConfigHelper.getLangIniString("rsummrepo"), catFont);
anchor.setName(ConfigHelper.getLangIniString("rsummrepo"));
// Second parameter is the number of the chapter
Chapter catPart = new Chapter(new Paragraph(anchor), 1);
Paragraph subPara = new Paragraph(ConfigHelper.getLangIniString("rdaten"), subFont);
Section subCatPart = catPart.addSection(subPara);
subCatPart.add(new Paragraph(ConfigHelper.getLangIniString("reportvon") + " " + System.getProperty("user.name") + ", " + new Date()));
subCatPart.add(new Paragraph(EinheitenAdder.addMinuten(ConfigHelper.getLangIniString("rzeitallerlogs") + " " + dauer)));
subCatPart.add(new Paragraph(EinheitenAdder.addKm(ConfigHelper.getLangIniString("rstreckeallerlogs") + " " + strecke)));
subCatPart.add(new Paragraph(EinheitenAdder.addMinuten(ConfigHelper.getLangIniString("rcalzeitallerlogs") + " " + calDauer)));
subCatPart.add(new Paragraph(EinheitenAdder.addKm(ConfigHelper.getLangIniString("calstreckeallerloggs") + " " + calStecke)));
document.add(catPart);
}
/**
* Erstellt einen Tour Report
* @param tourname Name der Tour die Gereportet werden soll
*/
public static void createTourReport(String tourname) {
Tour tour = TourPlaner.getTour(tourname);
tour.setLog(TourPlaner.getLogs(tourname));
String file = ConfigHelper.getIniString(ConfigHelper.getStandartConfig(), "report", "path") + tourname+".pdf";
try {
Document document = new Document();
PdfWriter.getInstance(document, new FileOutputStream(file));
document.open();
addMetaData(document, tour);
// addTitlePage(document, tour);
addContent(document, tour);
document.close();
} catch (DocumentException | FileNotFoundException e) {
LogHelper.error(e.getMessage(), e.getClass().getName());
}
if(ConfigHelper.getIniInt(ConfigHelper.getStandartConfig(), "settings", "openpdf") == 1) {
FileHelper.openDefault(file);
}
}
// iText allows to add metadata to the PDF which can be viewed in your Adobe
// Reader
// under File -> Properties
private static void addMetaData(Document document, Tour tour) {
document.addTitle(ConfigHelper.getLangIniString("tourreportvon") + " " + tour.getName());
document.addSubject(ConfigHelper.getLangIniString("tourplanervon"));
document.addKeywords(ConfigHelper.getLangIniString("reportkeywords"));
document.addAuthor(ConfigHelper.getLangIniString("tourplaner"));
document.addCreator(ConfigHelper.getLangIniString("tourplaner"));
}
/**
* Erstellt den inhalt des Reports
* @param document Aktuelles Dokument
* @param tour Aktuelle Tour
* @throws DocumentException Fehler beim hinzufügen des Inhaltes
*/
private static void addContent(Document document, Tour tour) throws DocumentException {
Anchor anchor = new Anchor(ConfigHelper.getLangIniString("tourreportvon") + tour.getName(), catFont);
anchor.setName(ConfigHelper.getLangIniString("tourreportvon") + tour.getName());
// Second parameter is the number of the chapter
Chapter catPart = new Chapter(new Paragraph(anchor), 1);
Paragraph subPara = new Paragraph(ConfigHelper.getLangIniString("tour"), subFont);
Section subCatPart = catPart.addSection(subPara);
subCatPart.add(new Paragraph(ConfigHelper.getLangIniString("reportvon") + " " + System.getProperty("user.name") + ", " + new Date()));
subCatPart.add(new Paragraph(ConfigHelper.getLangIniString("reportstart") + " " + tour.getStart()));
subCatPart.add(new Paragraph(ConfigHelper.getLangIniString("reportziel") + " " + tour.getZiel()));
subCatPart.add(new Paragraph(EinheitenAdder.addMinuten(ConfigHelper.getLangIniString("reportdauercal") + " " + tour.getDauer())));
subCatPart.add(new Paragraph(EinheitenAdder.addKm(ConfigHelper.getLangIniString("reportstreckecal") + " " + tour.getStrecke())));
Paragraph emptyLine = new Paragraph();
addEmptyLine(emptyLine, 5);
subCatPart.add(emptyLine);
// now add all this to the document
document.add(catPart);
Image image1 = null;
try {
image1 = Image.getInstance(TourPlaner.getImagePdfPath(tour.getName()));
image1.setAlignment(Element.ALIGN_CENTER);
image1.scaleAbsolute(600, 400);
document.add(image1);
} catch (IOException e) {
LogHelper.error(e);
}
ArrayList<Log> logs = tour.getLogs();
// Second parameter is the number of the chapter
anchor = new Anchor(ConfigHelper.getLangIniString("logs"), catFont);
anchor.setName(ConfigHelper.getLangIniString("logs"));
catPart = new Chapter(new Paragraph(anchor), 2);
catPart.add(new Paragraph(ConfigHelper.getLangIniString("countlog") + " " + logs.size()));
for (Log log: logs) {
subPara = new Paragraph(ConfigHelper.getLangIniString("logvom") + " " + log.getDatum() , subFont);
subCatPart = catPart.addSection(subPara);
subCatPart.add(new Paragraph(EinheitenAdder.addMinuten(ConfigHelper.getLangIniString("logdauer") + " " + log.getDauer())));
subCatPart.add(new Paragraph(EinheitenAdder.addMinuten(ConfigHelper.getLangIniString("logpause") + " " + log.getPause())));
subCatPart.add(new Paragraph(EinheitenAdder.addMinuten(ConfigHelper.getLangIniString("loggegangen") + " " + log.getGegangen())));
subCatPart.add(new Paragraph(EinheitenAdder.addSpeed(ConfigHelper.getLangIniString("logavg") + " " + log.getAvgspeed())));
subCatPart.add(new Paragraph(EinheitenAdder.addKm(ConfigHelper.getLangIniString("logstrecke") + " " + log.getStrecke())));
subCatPart.add(new Paragraph(EinheitenAdder.addMeter(ConfigHelper.getLangIniString("loghight") + " " + log.getHightmeter())));
subCatPart.add(new Paragraph(ConfigHelper.getLangIniString("logbemerkung") + " " + log.getBemerkung()));
}
// now add all this to the document
document.add(catPart);
}
/**
* Fügt eine leere zeile an den Paragraph an
* @param paragraph Hier wird hinzugefügt
* @param number Um wie viele Leere Zeilen hinzugefügt werden soll
*/
private static void addEmptyLine(Paragraph paragraph, int number) {
for (int i = 0; i < number; i++) {
paragraph.add(new Paragraph(" "));
}
}
// private static void createTable(Section subCatPart)
// throws BadElementException {
// PdfPTable table = new PdfPTable(5);
//
// // t.setBorderColor(BaseColor.GRAY);
// // t.setPadding(4);
// // t.setSpacing(4);
// // t.setBorderWidth(1);
//
// PdfPCell c1 = new PdfPCell(new Phrase("NR"));
// c1.setHorizontalAlignment(Element.ALIGN_CENTER);
// table.addCell(c1);
//
// c1 = new PdfPCell(new Phrase("Datum"));
// c1.setHorizontalAlignment(Element.ALIGN_CENTER);
// table.addCell(c1);
//
// c1 = new PdfPCell(new Phrase("Entfernung"));
// c1.setHorizontalAlignment(Element.ALIGN_CENTER);
// table.addCell(c1);
//
// c1 = new PdfPCell(new Phrase("Höhenmeter"));
// c1.setHorizontalAlignment(Element.ALIGN_CENTER);
// table.addCell(c1);
//
// c1 = new PdfPCell(new Phrase("AVG Geschwindigkeit"));
// c1.setHorizontalAlignment(Element.ALIGN_CENTER);
// table.addCell(c1);
//
//
// table.setHeaderRows(1);
//
// table.addCell("1.0");
// table.addCell("1.1");
// table.addCell("1.2");
// table.addCell("1.3");
// table.addCell("1.4");
// table.addCell("1.5");
//
// table.addCell("2.0");
// table.addCell("2.1");
// table.addCell("2.2");
// table.addCell("2.3");
// table.addCell("2.4");
// table.addCell("2.5");
//
// subCatPart.add(table);
//
// }
} }

View File

@ -2,6 +2,15 @@ package tourplaner.business;
import org.apache.log4j.Logger; import org.apache.log4j.Logger;
import tourplaner.data.DbConnect; import tourplaner.data.DbConnect;
import tourplaner.object.Log;
import tourplaner.object.Tour;
import tourplaner.ui.ProgressBar;
import java.awt.*;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
/** /**
* Haupt Logik des Tourplaners * Haupt Logik des Tourplaners
@ -9,14 +18,184 @@ import tourplaner.data.DbConnect;
public class TourPlaner{ public class TourPlaner{
private Logger logger; private Logger logger;
public TourPlaner(){ /**
LogHelper.info(ConfigHelper.getIniString(ConfigHelper.getStandartConfig(), "start", "message"), * Erstellt alle DB Tabellen falls nötig
ConfigHelper.getIniString(ConfigHelper.getStandartConfig(), "start", "app")); */
public static void init(){
new DbConnect().init(); new DbConnect().init();
} }
public String getMapJson(String start, String ziel){ /**
return start + " " + ziel; * Holt alle touren aus der DB
* @return Alle touren als ArrayList
*/
public static ArrayList<Tour> getAllTours(){
return new DbConnect().getAllTouren();
} }
/**
* Bearbeitet eine Tour
* @param oldname Alter Tourname
* @param tour Neuer Tourname
* @return false bei error
*/
public static boolean editTour(String oldname, Tour tour) throws IOException {
ProgressBar progressBar = new ProgressBar("Edit...");
int step = progressBar.getProgressSize(3, 100);
FileHelper.delFile(new File(getImagePath(oldname)));
FileHelper.delFile(new File(getImagePdfPath(oldname)));
progressBar.addProgress(step);
DirectionMap directionMap = new DirectionMap(tour.getStart(), tour.getZiel(), tour.getName());
progressBar.addProgress(step);
tour.setDauer(directionMap.getDauer()+"");
tour.setStrecke(directionMap.getStrecke());
boolean ret = new DbConnect().editTour(oldname, tour);
progressBar.setProgress(100);
return ret;
}
/**
* Löscht eine Tour
* @param tourname Tourname
* @return false bei error
*/
public static boolean delTour(String tourname){
ProgressBar progressBar = new ProgressBar("Del...");
int step = progressBar.getProgressSize(3, 100);
FileHelper.delFile(new File(getImagePath(tourname)));
progressBar.addProgress(step);
FileHelper.delFile(new File(getImagePdfPath(tourname)));
progressBar.addProgress(step);
boolean ret = new DbConnect().delTour(tourname);
progressBar.setProgress(100);
return ret;
}
/**
* Fügt eine Tour hinzu
* @param newTour Neue Tour
* @return false bei error
*/
public static boolean addTour(Tour newTour, ProgressBar progressBar) throws IOException {
int step = progressBar.getProgressSize(2, 100);
DirectionMap directionMap = new DirectionMap(newTour.getStart(), newTour.getZiel(), newTour.getName());
progressBar.addProgress(step);
newTour.setDauer(directionMap.getDauer()+"");
newTour.setStrecke(directionMap.getStrecke());
boolean ret = new DbConnect().addTour(newTour);
progressBar.setProgress(100);
return ret;
}
/**
* Holt das Gui Bild
* @param tourname Name der Tour
* @return Das Bild
* @throws IOException Error beim Bild holen
*/
public static Image getImage(String tourname) throws IOException {
return FileHelper.getImage(new File(getImagePath(tourname)));
}
/**
* Path zu dem Bild für die GUI
* @param tourname Name der Tour
* @return Path zu dem Bild für die GUI
*/
public static String getImagePath(String tourname){
return ConfigHelper.getIniString(ConfigHelper.getStandartConfig(), "map", "path") + tourname + ".jpg";
}
/**
* Path zu dem Bild für die PDF
* @param tourname Name der Tour
* @return Path zu dem Bild für die PDF
*/
public static String getImagePdfPath(String tourname){
return ConfigHelper.getIniString(ConfigHelper.getStandartConfig(), "map", "path") + tourname + "_pdf.jpg";
}
/**
* Öffnet ein Bild einer Tour
* @param tourname Tourname
*/
public static void openImage(String tourname){
if(ConfigHelper.getIniInt(ConfigHelper.getStandartConfig(), "settings", "openmap") == 1) {
FileHelper.openDefault(getImagePath(tourname));
}
}
/**
* Holt alle Logs einer Tour
* @param tourname Tourname
* @return Alle Logs der Tour
*/
public static ArrayList<Log> getLogs(String tourname){
return new DbConnect().getLogs(tourname);
}
/**
* Führt einen Rport aus
* @param tourname Name der Tour die gereportet wird
*/
public static void doReport(String tourname){
Reporter.createTourReport(tourname);
}
/**
* Holt eine Tour
* @param tourname Name der zu holenden Tour
* @return Tour die geholt werden soll
*/
public static Tour getTour(String tourname){
return new DbConnect().getTour(tourname);
}
/**
* Fügt ein Log hinzu
* @param tourname Name der Tour
* @param log Neues Log
* @return false bei error
*/
public static boolean addLog(String tourname, Log log){
if(Double.isInfinite(log.getAvgspeed())) log.setAvgspeed(-1.0);
return new DbConnect().addLog(tourname, log);
}
/**
* Löscht ein Log
* @param tourname Name der Tour
* @param id Id des Logs
* @return false bei error
*/
public static boolean delLog(String tourname, String id){
return new DbConnect().delLog(tourname, id);
}
/**
* Editiert ein Log
* @param tourname Name der Tour
* @param log Neues Log
* @return false bei error
*/
public static boolean editLog(String tourname, Log log){
if(Double.isInfinite(log.getAvgspeed())) log.setAvgspeed(-1.0);
return new DbConnect().editLog(tourname, log);
}
/**
* Sucht alle touren die den gegebenen tournamen enthalten
* @param tourname Name der zu suchen ist
* @return Alle touren die auf den Suchterm passen
*/
public static ArrayList<Tour> sucheTour(String tourname){
ArrayList<Tour> touren = new ArrayList<>();
getAllTours().forEach(t ->{
if(t.getName().contains(tourname)){
touren.add(t);
}
});
return touren;
}
} }

View File

@ -1,7 +1,14 @@
package tourplaner.data; package tourplaner.data;
import java.sql.Connection; import javafx.geometry.Pos;
import java.sql.Statement; import tourplaner.business.LogHelper;
import tourplaner.object.Log;
import tourplaner.object.Tour;
import tourplaner.ui.AlertHelper;
import tourplaner.ui.ProgressBar;
import java.sql.*;
import java.time.LocalDate;
import java.util.ArrayList; import java.util.ArrayList;
/** /**
@ -26,10 +33,225 @@ public class DbConnect {
* @return True bei erfolg, sonst error * @return True bei erfolg, sonst error
*/ */
public boolean init() { public boolean init() {
// TODO: 26.02.2021 Alle sql im init sind noch falsch
ArrayList<Boolean> errors = new ArrayList<>(); ArrayList<Boolean> errors = new ArrayList<>();
errors.add(PostgresHelper.executeUpdateMessage("CREATE TABLE IF NOT EXISTS USERS (username TEXT PRIMARY KEY NOT NULL, nachname TEXT NOT NULL, email TEXT NOT NULL, password TEXT NOT NULL, bio TEXT, image TEXT, coins integer default 20 not null)", "User Table created")); errors.add(PostgresHelper.executeUpdateMessage("create table tour ( tourname varchar not null, dauer decimal, mapjson varchar, start varchar, ziel varchar, strecke decimal);", "Tour Table created"));
errors.add(PostgresHelper.executeUpdateMessage("create unique index tour_tourname_uindex on tour (tourname);", "Tour Table unique created"));
errors.add(PostgresHelper.executeUpdateMessage("alter table tour add constraint tour_pk primary key (tourname);", "Tour Table primary created"));
errors.add(PostgresHelper.executeUpdateMessage("create table log(tourname varchar constraint log_tour_tourname_fk references tour,id varchar,bemerkung varchar,datum date,strecke decimal,avg decimal,hightmeter decimal,pause decimal,gegangen decimal,dauer decimal,rating varchar);", "Log Table created"));
return !errors.contains(false); return !errors.contains(false);
} }
/**
* Bearbeitet eine Tour
* @param oldname Alter Tour name
* @param tour Neues Tour Object
* @return false bei error
*/
public boolean editTour(String oldname, Tour tour) {
String tourname = tour.getName();
ArrayList<Boolean> result = new ArrayList<>();
ArrayList<Log> logs = getLogs(oldname);
result.add(delLogs(oldname));
result.add(PostgresHelper.executeUpdate("UPDATE public.tour SET tourname = '"+tour.getName()+"', dauer = 1, mapjson = '"+tour.getMapJson()+"', start = '"+tour.getStart()+"', ziel = '"+tour.getZiel()+"', strecke = "+tour.getStrecke()+" WHERE tourname ='" + oldname + "';"));
logs.forEach(log -> {
result.add(addLog(tourname, log));
});
return !result.contains(false);
}
private boolean delLogs(String tourname){
return PostgresHelper.executeUpdate("DELETE FROM public.log WHERE tourname = '"+tourname+"'");
}
/**
* Fügt eine Tour hinzu
* @param tour Neue Tour
* @return false bei error
*/
public boolean addTour(Tour tour){
return PostgresHelper.executeUpdate("INSERT INTO public.tour (tourname, dauer, mapjson, start, ziel, strecke) VALUES ('"+tour.getName()+"', "+tour.getDauer()+", '"+tour.getMapJson()+"', '"+tour.getStart()+"', '"+tour.getZiel()+"', "+tour.getStrecke()+")");
}
/**
* Löscht eine Tour anhand des Tournamens
* @param tourname Tourname der zu löschen ist
* @return false bei error
*/
public boolean delTour(String tourname){
ArrayList<Boolean> result = new ArrayList<>();
result.add(delLogs(tourname));
result.add(PostgresHelper.executeUpdate("DELETE FROM public.tour WHERE tourname = '"+tourname+"'"));
return !result.contains(false);
}
public boolean delAllData(){
ArrayList<Boolean> result = new ArrayList<>();
result.add(delAllLog());
result.add(delAllTour());
return !result.contains(false);
}
private boolean delAllTour(){
return PostgresHelper.executeUpdate("DELETE FROM public.tour");
}
private boolean delAllLog(){
return PostgresHelper.executeUpdate("DELETE FROM public.log");
}
public ArrayList<Log> getLogs(String tourname){
this.c = PostgresHelper.con();
String id, bemerkung, rating;
double dauer, strecke, pause, gegangen, avg, hightmeter;
Date datum;
ArrayList<Log> logs = new ArrayList<>();
try {
stmt = this.c.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM public.log where tourname = '"+ tourname +"'");
while (rs.next()) {
id = rs.getString("id");
bemerkung = rs.getString("bemerkung");
rating = rs.getString("rating");
datum = rs.getDate("datum");
dauer = rs.getDouble("dauer");
hightmeter = rs.getDouble("hightmeter");
pause = rs.getDouble("pause");
strecke = rs.getDouble("strecke");
if (!tourname.isEmpty()) {
logs.add(new Log(id, dauer, datum.toLocalDate(), strecke, bemerkung,hightmeter, pause, rating));
}else {
return null;
}
}
rs.close();
stmt.close();
this.c.close();
return logs;
} catch (Exception e) {
System.err.println(e.getClass().getName() + ": " + e.getMessage());
return null;
}
}
/**
* Füght einen Logeintrag ein
* @param tourname Zu welcher Tour der Logeintrag gehört
* @param log Der Logeintrag
* @return false bei error
*/
public boolean addLog(String tourname, Log log){
if(Double.isInfinite(log.getAvgspeed())) log.setAvgspeed(-1.0);
System.out.println("INSERT INTO public.log (tourname, id, bemerkung, datum, strecke, avg, hightmeter, pause, gegangen, dauer, rating) VALUES ('"+tourname+"', '"+log.getId()+"', '"+log.getBemerkung()+"', '"+log.getDatum()+"', "
+log.getStrecke()+", "+log.getAvgspeed()+", "+log.getHightmeter()+", "+log.getPause()+", "+log.getGegangen()+", "+log.getDauer()+",'"+log.getRating()+"')");
return PostgresHelper.executeUpdate("INSERT INTO public.log (tourname, id, bemerkung, datum, strecke, avg, hightmeter, pause, gegangen, dauer, rating) VALUES ('"+tourname+"', '"+log.getId()+"', '"+log.getBemerkung()+"', '"+log.getDatum()+"', "
+log.getStrecke()+", "+log.getAvgspeed()+", "+log.getHightmeter()+", "+log.getPause()+", "+log.getGegangen()+", "+log.getDauer()+",'"+log.getRating()+"')");
}
public boolean editLog(String tourname, Log log){
return PostgresHelper.executeUpdate("UPDATE public.log SET bemerkung = '"+log.getBemerkung()+"', datum = '"+log.getDatum()+"', strecke = "+log.getStrecke()+", avg = "+log.getAvgspeed()+", hightmeter = "+
log.getHightmeter()+", pause = "+log.getPause()+", gegangen = "+log.getGegangen()+", dauer = "+log.getDauer()+" WHERE tourname = '"+tourname+"' and id = '"+log.getId()+"', rating = '"+log.getRating()+"'");
}
public boolean delLog(String tourname, String id){
return PostgresHelper.executeUpdate("DELETE FROM public.log WHERE tourname = '"+tourname+"' and id = '"+id+"'");
}
private int getTourSize() throws SQLException {
Connection con = PostgresHelper.con();
Statement s = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
ResultSet rs = s.executeQuery("SELECT COUNT(*) FROM tour;");
int size =0;
if (rs != null)
{
rs.last(); // moves cursor to the last row
size = rs.getInt("count"); // get row id
con.close();
return size;
}
con.close();
return -1;
}
/**
* Holt alle Touren aus der Datenbank
* @return Null bei fehler, sonst eine List aus den IDs
*/
public ArrayList<Tour> getAllTouren() {
this.c = PostgresHelper.con();
String tourname, mapjson, start, ziel;
double dauer, strecke;
ArrayList<Tour> touren = new ArrayList<>();
ProgressBar progressBar = new ProgressBar("Get...");
try {
int tourSize = getTourSize();
int step = progressBar.getProgressSize(tourSize, 100);
stmt = this.c.createStatement();
ResultSet rs = stmt.executeQuery("select * from tour;");
while (rs.next()) {
tourname = rs.getString("tourname");
mapjson = rs.getString("mapjson");
start = rs.getString("start");
ziel = rs.getString("ziel");
dauer = rs.getDouble("dauer");
strecke = rs.getDouble("strecke");
if (!tourname.isEmpty()) {
touren.add(new Tour(tourname, dauer + "", mapjson, strecke, start, ziel, getLogs(tourname)));
progressBar.addProgress(step);
}else {
progressBar.setProgress(100);
return null;
}
}
progressBar.setProgress(100);
rs.close();
stmt.close();
this.c.close();
return touren;
} catch (Exception e) {
LogHelper.error(e);
progressBar.setProgress(100);
return null;
}
}
/**
* Holt eine Tour aus der Datenbank
* @param tn Tourname
* @return Null bei fehler, sonst eine List aus den IDs
*/
public Tour getTour(String tn){
this.c = PostgresHelper.con();
String tourname, mapjson, start, ziel;
double dauer, strecke;
Tour touren = null;
try {
stmt = this.c.createStatement();
ResultSet rs = stmt.executeQuery("select * from tour where tourname = '"+tn+"';");
while (rs.next()) {
tourname = rs.getString("tourname");
mapjson = rs.getString("mapjson");
start = rs.getString("start");
ziel = rs.getString("ziel");
dauer = rs.getDouble("dauer");
strecke = rs.getDouble("strecke");
if (!tourname.isEmpty()) {
touren = new Tour(tourname, dauer + "", mapjson, strecke, start, ziel);
}else {
return null;
}
}
rs.close();
stmt.close();
this.c.close();
return touren;
} catch (Exception e) {
System.err.println(e.getClass().getName() + ": " + e.getMessage());
return null;
}
}
} }

View File

@ -3,16 +3,20 @@ package tourplaner.data;
import tourplaner.business.ConfigHelper; import tourplaner.business.ConfigHelper;
import tourplaner.business.LogHelper; import tourplaner.business.LogHelper;
import tourplaner.object.Tour;
import java.sql.Connection; import java.sql.Connection;
import java.sql.DriverManager; import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement; import java.sql.Statement;
import java.util.ArrayList;
/** /**
* Hilfsfunktionen für die verwendung der Postgres DB * Hilfsfunktionen für die verwendung der Postgres DB
*/ */
public class PostgresHelper { public class PostgresHelper {
private Connection c;
private Statement stmt;
/** /**
* Verbindet mit der Datenbank * Verbindet mit der Datenbank
* @return Das Connection Objekt * @return Das Connection Objekt
@ -21,6 +25,8 @@ public class PostgresHelper {
Connection c = null; Connection c = null;
try { try {
Class.forName("org.postgresql.Driver"); Class.forName("org.postgresql.Driver");
System.out.println("jdbc:postgresql://" + ConfigHelper.getIniString(ConfigHelper.getStandartConfig(), "db", "url") + ":" + ConfigHelper.getIniString(ConfigHelper.getStandartConfig(), "db", "port") + "/" + ConfigHelper.getIniString(ConfigHelper.getStandartConfig(), "db", "dbname")+
ConfigHelper.getIniString(ConfigHelper.getStandartConfig(), "db", "user")+ ConfigHelper.getIniString(ConfigHelper.getStandartConfig(), "db", "pw"));
c = DriverManager c = DriverManager
.getConnection("jdbc:postgresql://" + ConfigHelper.getIniString(ConfigHelper.getStandartConfig(), "db", "url") + ":" + ConfigHelper.getIniString(ConfigHelper.getStandartConfig(), "db", "port") + "/" + ConfigHelper.getIniString(ConfigHelper.getStandartConfig(), "db", "dbname"), .getConnection("jdbc:postgresql://" + ConfigHelper.getIniString(ConfigHelper.getStandartConfig(), "db", "url") + ":" + ConfigHelper.getIniString(ConfigHelper.getStandartConfig(), "db", "port") + "/" + ConfigHelper.getIniString(ConfigHelper.getStandartConfig(), "db", "dbname"),
ConfigHelper.getIniString(ConfigHelper.getStandartConfig(), "db", "user"), ConfigHelper.getIniString(ConfigHelper.getStandartConfig(), "db", "pw")); ConfigHelper.getIniString(ConfigHelper.getStandartConfig(), "db", "user"), ConfigHelper.getIniString(ConfigHelper.getStandartConfig(), "db", "pw"));

View File

@ -6,11 +6,11 @@ import java.time.LocalDate;
import java.util.Date; import java.util.Date;
public class Log { public class Log {
private String id, bemerkung; private String id, bemerkung, rating;
private LocalDate datum; private LocalDate datum;
private double strecke, avgspeed, hightmeter, pause, dauer, gegangen; private double strecke, avgspeed, hightmeter, pause, dauer, gegangen;
public Log(String id, double dauer, LocalDate datum, double strecke, String bemerkung, double hightmeter, double pause) { public Log(String id, double dauer, LocalDate datum, double strecke, String bemerkung, double hightmeter, double pause, String rating) {
this.id = id; this.id = id;
this.dauer = dauer; this.dauer = dauer;
this.datum = datum; this.datum = datum;
@ -18,8 +18,20 @@ public class Log {
this.bemerkung = bemerkung; this.bemerkung = bemerkung;
this.hightmeter = hightmeter; this.hightmeter = hightmeter;
this.pause = pause; this.pause = pause;
this.rating = rating;
this.gegangen = this.dauer - this.pause; this.gegangen = this.dauer - this.pause;
this.avgspeed = this.strecke / (this.gegangen); this.avgspeed = this.strecke / (this.gegangen/60);
if(Double.isInfinite(this.avgspeed)){
this.avgspeed = -1;
}
}
public String getRating() {
return rating;
}
public void setRating(String rating) {
this.rating = rating;
} }
public String getBemerkung() { public String getBemerkung() {

View File

@ -7,7 +7,7 @@ import java.util.concurrent.atomic.AtomicReference;
* Model einer Tour * Model einer Tour
*/ */
public class Tour { public class Tour {
private String dauer, mapJson, name, start, ziel; private String dauer, mapJson, name, start, ziel, rating;
private double strecke; private double strecke;
private ArrayList<Log> log; private ArrayList<Log> log;
@ -21,6 +21,30 @@ public class Tour {
this.log = new ArrayList<>(); this.log = new ArrayList<>();
} }
public Tour(String name, String dauer, String mapJson, double strecke, String start, String ziel, ArrayList<Log> logs) {
this.dauer = dauer;
this.mapJson = mapJson;
this.strecke = strecke;
this.name = name;
this.start = start;
this.ziel = ziel;
this.log = logs;
}
public void setTour(Tour tour){
this.dauer = tour.getDauer();
this.mapJson = tour.getMapJson();
this.strecke = tour.getStrecke();
this.name = tour.getName();
this.start = tour.getStart();
this.ziel = tour.getZiel();
this.log = tour.getLogs();
}
public void setLog(ArrayList<Log> log) {
this.log = log;
}
/** /**
* Holt einen einzigen Log Eintrag anhand der Id * Holt einen einzigen Log Eintrag anhand der Id
* @param id Id des Eintrags der zu besorgen ist * @param id Id des Eintrags der zu besorgen ist

View File

@ -34,6 +34,7 @@
<?import javafx.geometry.*?> <?import javafx.geometry.*?>
<?import javafx.scene.control.*?> <?import javafx.scene.control.*?>
<?import javafx.scene.image.*?>
<?import javafx.scene.layout.*?> <?import javafx.scene.layout.*?>
<?import javafx.scene.paint.*?> <?import javafx.scene.paint.*?>
<?import javafx.scene.text.*?> <?import javafx.scene.text.*?>
@ -44,21 +45,30 @@
<menus> <menus>
<Menu fx:id="menueFile" mnemonicParsing="false" text="Datei"> <Menu fx:id="menueFile" mnemonicParsing="false" text="Datei">
<items> <items>
<MenuItem fx:id="reportsummary" mnemonicParsing="false" onAction="#reportSum" text="Report Summary" />
<MenuItem fx:id="tourreport" mnemonicParsing="false" onAction="#tourReport" text="Tour Report" />
<MenuItem fx:id="beendenButton" mnemonicParsing="false" onAction="#quitApp" text="Beenden" /> <MenuItem fx:id="beendenButton" mnemonicParsing="false" onAction="#quitApp" text="Beenden" />
</items> </items>
</Menu> </Menu>
<Menu mnemonicParsing="false" text="Bearbeiten"> <Menu fx:id="menuebearbeiten" mnemonicParsing="false" text="Bearbeiten">
<items> <items>
<MenuItem mnemonicParsing="false" onAction="#nimpButton" text="Keine Funktion" /> <MenuItem fx:id="menueimport" mnemonicParsing="false" onAction="#importBtn" text="Import" />
<MenuItem fx:id="menueexport" mnemonicParsing="false" onAction="#exportBtn" text="Export" />
</items> </items>
</Menu> </Menu>
<Menu mnemonicParsing="false" text="Optionen"> <Menu fx:id="menueoptionen" mnemonicParsing="false" text="Optionen">
<items> <items>
<MenuItem mnemonicParsing="false" onAction="#tourReport" text="Tour Report erstellen" /> <CheckMenuItem fx:id="openmap" mnemonicParsing="false" onAction="#openmapaction" text="Map automatisch öffnen" />
<MenuItem mnemonicParsing="false" onAction="#nimpButton" text="Keine Funktion" /> <CheckMenuItem fx:id="openpdf" mnemonicParsing="false" onAction="#openpdfaction" text="Report automatisch öffnen" />
<Menu fx:id="menuesprachen" mnemonicParsing="false" text="Sprache">
<items>
<RadioMenuItem fx:id="langdeutsch" mnemonicParsing="false" onAction="#onlangdeutsch" text="Deutsch" />
<RadioMenuItem fx:id="langenglisch" mnemonicParsing="false" onAction="#onlangenglisch" text="Englisch" />
</items> </items>
</Menu> </Menu>
<Menu mnemonicParsing="false" text="Hilfe"> </items>
</Menu>
<Menu fx:id="menuehilfe" mnemonicParsing="false" text="Hilfe">
<items> <items>
<MenuItem mnemonicParsing="false" onAction="#gitWebBrowser" text="Git Repo" /> <MenuItem mnemonicParsing="false" onAction="#gitWebBrowser" text="Git Repo" />
<MenuItem mnemonicParsing="false" onAction="#javaDocBrowser" text="JavaDoc" /> <MenuItem mnemonicParsing="false" onAction="#javaDocBrowser" text="JavaDoc" />
@ -74,7 +84,7 @@
<Button fx:id="tourAdd" layoutX="58.0" mnemonicParsing="false" onAction="#addTour" text="+" /> <Button fx:id="tourAdd" layoutX="58.0" mnemonicParsing="false" onAction="#addTour" text="+" />
<Label layoutX="14.0" layoutY="4.0" text="Tours" /> <Label layoutX="14.0" layoutY="4.0" text="Tours" />
<Button fx:id="tourDel" layoutX="89.0" mnemonicParsing="false" onAction="#delTour" text="-" /> <Button fx:id="tourDel" layoutX="89.0" mnemonicParsing="false" onAction="#delTour" text="-" />
<Button layoutX="117.0" mnemonicParsing="false" onAction="#editTourBtn" text="Edit" /> <Button fx:id="editTourBtn" layoutX="117.0" mnemonicParsing="false" onAction="#editTourBtn" text="Edit" />
</children></AnchorPane> </children></AnchorPane>
<TextField fx:id="sucheInput" promptText="Suche..." /> <TextField fx:id="sucheInput" promptText="Suche..." />
<Button fx:id="sucheButton" mnemonicParsing="false" onAction="#suche" text="Suchen" /> <Button fx:id="sucheButton" mnemonicParsing="false" onAction="#suche" text="Suchen" />
@ -113,18 +123,19 @@
<TabPane fx:id="viewTabPane" layoutX="1.0" layoutY="69.0" prefWidth="702.0" tabClosingPolicy="UNAVAILABLE" AnchorPane.bottomAnchor="-67.0" AnchorPane.leftAnchor="1.0" AnchorPane.rightAnchor="1.0" AnchorPane.topAnchor="0.0"> <TabPane fx:id="viewTabPane" layoutX="1.0" layoutY="69.0" prefWidth="702.0" tabClosingPolicy="UNAVAILABLE" AnchorPane.bottomAnchor="-67.0" AnchorPane.leftAnchor="1.0" AnchorPane.rightAnchor="1.0" AnchorPane.topAnchor="0.0">
<tabs> <tabs>
<Tab fx:id="kartenTab" text="Karte"> <Tab fx:id="kartenTab" text="Karte">
<content> <AnchorPane>
<AnchorPane /> <ImageView fx:id="mapImageView" pickOnBounds="true" preserveRatio="true" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0" />
</content></Tab> </AnchorPane>
</Tab>
<Tab fx:id="beschreibungTab" text="Beschreibung"> <Tab fx:id="beschreibungTab" text="Beschreibung">
<content> <content>
<AnchorPane> <AnchorPane>
<children> <children>
<TableView fx:id="beschreibungTableView" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0"> <TableView fx:id="beschreibungTableView" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
<columns> <columns>
<TableColumn fx:id="nameCol" maxWidth="1.7976931348623157E308" minWidth="70.0" prefWidth="-1.0" text="Tourname" /> <TableColumn fx:id="nameCol" minWidth="100.0" prefWidth="-1.0" text="Tourname" />
<TableColumn fx:id="dauerCol" maxWidth="1.7976931348623157E308" minWidth="40.0" prefWidth="-1.0" text="Dauer" /> <TableColumn fx:id="dauerCol" maxWidth="1.7976931348623157E308" minWidth="100.0" prefWidth="-1.0" text="Dauer" />
<TableColumn fx:id="streckeCol" maxWidth="1.7976931348623157E308" minWidth="50.0" prefWidth="-1.0" text="Strecke" /> <TableColumn fx:id="streckeCol" maxWidth="1.7976931348623157E308" minWidth="100.0" prefWidth="-1.0" text="Strecke" />
<TableColumn fx:id="startCol" maxWidth="1.7976931348623157E308" minWidth="100.0" prefWidth="-1.0" text="Startpunk" /> <TableColumn fx:id="startCol" maxWidth="1.7976931348623157E308" minWidth="100.0" prefWidth="-1.0" text="Startpunk" />
<TableColumn fx:id="zielCol" maxWidth="1.7976931348623157E308" minWidth="100.0" prefWidth="-1.0" text="Zielpunkt" /> <TableColumn fx:id="zielCol" maxWidth="1.7976931348623157E308" minWidth="100.0" prefWidth="-1.0" text="Zielpunkt" />
</columns> </columns>
@ -162,7 +173,7 @@
<Insets /> <Insets />
</HBox.margin> </HBox.margin>
</Button> </Button>
<Button mnemonicParsing="false" onAction="#editLogBtn" text="Edit" /> <Button fx:id="editBtn" mnemonicParsing="false" onAction="#editLogBtn" text="Edit" />
</children> </children>
<padding> <padding>
<Insets bottom="3.0" left="3.0" right="3.0" top="3.0" /> <Insets bottom="3.0" left="3.0" right="3.0" top="3.0" />
@ -174,14 +185,15 @@
<children> <children>
<TableView fx:id="logTableView" onMouseClicked="#logItemSelected" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0"> <TableView fx:id="logTableView" onMouseClicked="#logItemSelected" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
<columns> <columns>
<TableColumn fx:id="logDatumCol" prefWidth="49.0" text="Datum" /> <TableColumn fx:id="logDatumCol" minWidth="-1.0" prefWidth="-1.0" text="Datum" />
<TableColumn fx:id="logDauerCol" prefWidth="126.0" text="Dauer" /> <TableColumn fx:id="logDauerCol" minWidth="-1.0" prefWidth="-1.0" text="Dauer" />
<TableColumn fx:id="logStreckeCol" prefWidth="240.0" text="Entfernung" /> <TableColumn fx:id="logStreckeCol" minWidth="-1.0" prefWidth="-1.0" text="Entfernung" />
<TableColumn fx:id="logAvgCol" prefWidth="75.0" text="AVG Geschwindigkeit" /> <TableColumn fx:id="logAvgCol" minWidth="-1.0" prefWidth="-1.0" text="AVG Geschwindigkeit" />
<TableColumn fx:id="logHightCol" prefWidth="75.0" text="Höhenmeter" /> <TableColumn fx:id="logHightCol" minWidth="-1.0" prefWidth="75.0" text="Höhenmeter" />
<TableColumn fx:id="logPauseCol" prefWidth="75.0" text="Davon Pause" /> <TableColumn fx:id="logPauseCol" minWidth="-1.0" prefWidth="-1.0" text="Davon Pause" />
<TableColumn fx:id="logGegangenCol" prefWidth="75.0" text="Davon Unterwegs" /> <TableColumn fx:id="logGegangenCol" minWidth="-1.0" prefWidth="-1.0" text="Davon Unterwegs" />
<TableColumn fx:id="logBemerkungCol" prefWidth="75.0" text="Bemerkung" /> <TableColumn fx:id="logBemerkungCol" minWidth="-1.0" prefWidth="-1.0" text="Bemerkung" />
<TableColumn fx:id="logRatingCol1" minWidth="-1.0" prefWidth="-1.0" text="Rating" />
</columns> </columns>
<columnResizePolicy> <columnResizePolicy>
<TableView fx:constant="CONSTRAINED_RESIZE_POLICY" /> <TableView fx:constant="CONSTRAINED_RESIZE_POLICY" />
@ -199,7 +211,7 @@
</SplitPane> </SplitPane>
<HBox id="HBox" alignment="CENTER_LEFT" spacing="5.0" VBox.vgrow="NEVER"> <HBox id="HBox" alignment="CENTER_LEFT" spacing="5.0" VBox.vgrow="NEVER">
<children> <children>
<Label maxHeight="1.7976931348623157E308" maxWidth="-1.0" text="Left status" HBox.hgrow="ALWAYS"> <Label maxHeight="1.7976931348623157E308" maxWidth="-1.0" text="Tourplaner" HBox.hgrow="ALWAYS">
<font> <font>
<Font size="11.0" fx:id="x3" /> <Font size="11.0" fx:id="x3" />
</font> </font>
@ -208,7 +220,7 @@
</textFill> </textFill>
</Label> </Label>
<AnchorPane prefHeight="-1.0" prefWidth="-1.0" HBox.hgrow="ALWAYS" /> <AnchorPane prefHeight="-1.0" prefWidth="-1.0" HBox.hgrow="ALWAYS" />
<Label font="$x3" maxWidth="-1.0" text="Right status" textFill="$x4" HBox.hgrow="NEVER" /> <Label font="$x3" maxWidth="-1.0" text="Georg Reisinger" textFill="$x4" HBox.hgrow="NEVER" />
</children> </children>
<padding> <padding>
<Insets bottom="3.0" left="3.0" right="3.0" top="3.0" /> <Insets bottom="3.0" left="3.0" right="3.0" top="3.0" />

View File

@ -10,7 +10,13 @@ import javafx.scene.layout.*;
import javafx.stage.Stage; import javafx.stage.Stage;
import javafx.stage.WindowEvent; import javafx.stage.WindowEvent;
import tourplaner.business.ConfigHelper; import tourplaner.business.ConfigHelper;
import tourplaner.business.EinheitenAdder;
import javax.swing.*;
import javax.swing.border.TitledBorder;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import java.awt.*;
import java.io.PrintWriter; import java.io.PrintWriter;
import java.io.StringWriter; import java.io.StringWriter;
import java.time.LocalDate; import java.time.LocalDate;
@ -229,4 +235,24 @@ public class AlertHelper {
stage.showAndWait(); stage.showAndWait();
return selectedDate.get(); return selectedDate.get();
} }
/**
* File Auswahl
* @param btn Text des Speichern/Öffnen Btn
* @return String des Files, bei error null
*/
public static String fileChooser(String btn){
// JFileChooser-Objekt erstellen
JFileChooser chooser = new JFileChooser();
// Dialog zum Oeffnen von Dateien anzeigen
int rueckgabeWert = chooser.showDialog(null, btn);
/* Abfrage, ob auf "Öffnen" geklickt wurde */
if(rueckgabeWert == JFileChooser.APPROVE_OPTION)
{
return chooser.getSelectedFile().getAbsolutePath();
}
return null;
}
} }

View File

@ -0,0 +1,66 @@
package tourplaner.ui;
import javafx.scene.image.Image;
import tourplaner.business.ConfigHelper;
import javax.imageio.ImageIO;
import javax.swing.*;
import javax.swing.border.TitledBorder;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
public class ProgressBar {
private int status;
private JFrame frame;
private JProgressBar progressBar;
public ProgressBar(String title){
this.frame = new JFrame(title);
File pathToFile = new File(ConfigHelper.getIniString(ConfigHelper.getStandartConfig(), "start", "logo"));
try {
BufferedImage image = ImageIO.read(pathToFile);
this.frame.setIconImage(image);
} catch (IOException e) {
e.printStackTrace();
}
this.frame.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
Container content = this.frame.getContentPane();
this.progressBar = new JProgressBar();
this.progressBar.setValue(0);
this.progressBar.setStringPainted(true);
TitledBorder border = BorderFactory.createTitledBorder("Laden....");
this.progressBar.setBorder(border);
content.add(this.progressBar, BorderLayout.NORTH);
this.frame.setSize(300, 100);
this.frame.setVisible(true);
}
public void addProgress(int add){
this.status += add;
this.progressBar.setValue(this.status);
closeOnFinish();
}
private void closeOnFinish(){
if(this.status >= 100){
closeProgress();
}
}
public void setProgress(int set){
this.status = set;
closeOnFinish();
}
public void closeProgress(){
this.frame.setVisible(false);
}
public int getProgressSize(int todo, int maxLevel){
int steps = (progressBar.getValue() - maxLevel) / todo;
if(steps < 0) steps = steps*-1;
return steps;
}
}

View File

@ -1,13 +1,14 @@
package tourplaner.ui; package tourplaner.ui;
import javafx.collections.ObservableList;
import javafx.fxml.FXML; import javafx.fxml.FXML;
import javafx.fxml.Initializable; import javafx.fxml.Initializable;
import javafx.geometry.Orientation; import javafx.geometry.Orientation;
import javafx.scene.control.*; import javafx.scene.control.*;
import javafx.scene.control.Button;
import javafx.scene.control.Label; import javafx.scene.control.Label;
import javafx.scene.control.TextField; import javafx.scene.control.TextField;
import javafx.scene.control.cell.PropertyValueFactory; import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.image.ImageView;
import javafx.scene.input.MouseEvent; import javafx.scene.input.MouseEvent;
import tourplaner.business.ConfigHelper; import tourplaner.business.ConfigHelper;
import tourplaner.business.LogHelper; import tourplaner.business.LogHelper;
@ -15,15 +16,9 @@ import tourplaner.object.Log;
import tourplaner.object.Tour; import tourplaner.object.Tour;
import tourplaner.viewmodels.ViewModel; import tourplaner.viewmodels.ViewModel;
import java.awt.*;
import java.io.IOException; import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL; import java.net.URL;
import java.time.LocalDate;
import java.util.ResourceBundle; import java.util.ResourceBundle;
import java.util.UUID;
import java.util.concurrent.atomic.AtomicReference;
public class TourplanerController implements Initializable { public class TourplanerController implements Initializable {
//VM //VM
@ -36,9 +31,30 @@ public class TourplanerController implements Initializable {
public TableView<Tour> beschreibungTableView; public TableView<Tour> beschreibungTableView;
public TableColumn<Tour, String> startCol, zielCol, dauerCol, streckeCol, nameCol; public TableColumn<Tour, String> startCol, zielCol, dauerCol, streckeCol, nameCol;
public TextField titleTextView, sucheInput; public TextField titleTextView, sucheInput;
public ImageView mapImageView;
//Log -> rechts unten //Log -> rechts unten
public TableView<Log> logTableView; public TableView<Log> logTableView;
public TableColumn<Log, String> logDauerCol, logStreckeCol, logDatumCol, logAvgCol, logHightCol, logPauseCol, logGegangenCol, logBemerkungCol; public TableColumn<Log, String> logDauerCol, logStreckeCol, logDatumCol, logAvgCol, logHightCol, logPauseCol, logGegangenCol, logBemerkungCol, logRatingCol1;
//Menue
public CheckMenuItem openmap, openpdf;
public RadioMenuItem langenglisch, langdeutsch;
private ToggleGroup langgroup;
public Menu menueFile, menuebearbeiten, menueoptionen, menuesprachen, menuehilfe;
public MenuItem reportsummary, tourreport, beendenButton;
//Elemente
public Button sucheButton, editBtn, editTourBtn;
@FXML
private void onlangenglisch(){
ConfigHelper.setIniString(ConfigHelper.getStandartConfig(), "lang", "lang", "langen");
langToFxml();
}
@FXML
private void onlangdeutsch(){
ConfigHelper.setIniString(ConfigHelper.getStandartConfig(), "lang", "lang", "langde");
langToFxml();
}
@FXML @FXML
private void tourReport(){ private void tourReport(){
@ -48,12 +64,18 @@ public class TourplanerController implements Initializable {
@FXML @FXML
private void editTourBtn(){ private void editTourBtn(){
try {
this.viewModel.editTour(); this.viewModel.editTour();
} catch (IOException e) {
LogHelper.error(e);
}
syncTour(this.viewModel.getSelectedTour().getName());
} }
@FXML @FXML
private void editLogBtn(){ private void editLogBtn(){
this.viewModel.editLog(); this.viewModel.editLog();
syncLogs();
} }
/** /**
* Öffnet github im standart browser * Öffnet github im standart browser
@ -82,6 +104,21 @@ public class TourplanerController implements Initializable {
this.viewModel.doxygenDocBrowser(); this.viewModel.doxygenDocBrowser();
} }
private void syncTour(String selectedItem){
beschreibungTableView.getItems().clear(); //Leert die Table View komplett
beschreibungTableView.getItems().add(this.viewModel.getTour(selectedItem));
mapImageView.setImage(this.viewModel.getImage(selectedItem));
}
private void syncTourNamen(){
TourListView.getItems().clear();
TourListView.setItems(this.viewModel.getTourNamen());
}
private void syncLogs(){
logTableView.getItems().clear();
logTableView.setItems(this.viewModel.getLogData());
}
/** /**
@ -90,11 +127,13 @@ public class TourplanerController implements Initializable {
*/ */
@FXML @FXML
private void tourListSelectedItem(MouseEvent mouseEvent){ private void tourListSelectedItem(MouseEvent mouseEvent){
ProgressBar progressBar = new ProgressBar("Tour auswählen...");
String selectedItem = TourListView.getSelectionModel().getSelectedItem(); String selectedItem = TourListView.getSelectionModel().getSelectedItem();
this.viewModel.selectTour(selectedItem); this.viewModel.selectTour(selectedItem);
titleTextView.setText(selectedItem); titleTextView.setText(selectedItem);
beschreibungTableView.getItems().removeIf(s -> true); //Leert die Table View komplett progressBar.addProgress(10);
beschreibungTableView.getItems().add(this.viewModel.getTour(selectedItem)); syncTour(selectedItem);
progressBar.addProgress(10);
startCol.setCellValueFactory(new PropertyValueFactory<Tour, String>("start")); startCol.setCellValueFactory(new PropertyValueFactory<Tour, String>("start"));
zielCol.setCellValueFactory(new PropertyValueFactory<Tour, String>("ziel")); zielCol.setCellValueFactory(new PropertyValueFactory<Tour, String>("ziel"));
dauerCol.setCellValueFactory(new PropertyValueFactory<Tour, String>("dauer")); dauerCol.setCellValueFactory(new PropertyValueFactory<Tour, String>("dauer"));
@ -103,7 +142,10 @@ public class TourplanerController implements Initializable {
//Log anzeigen //Log anzeigen
logTableView.setPlaceholder(new Label( ConfigHelper.getLangIniString("keinelogsvorhanden"))); logTableView.setPlaceholder(new Label( ConfigHelper.getLangIniString("keinelogsvorhanden")));
logTableView.getItems().clear();
progressBar.addProgress(10);
logTableView.setItems(this.viewModel.getLogData()); logTableView.setItems(this.viewModel.getLogData());
progressBar.addProgress(10);
logDauerCol.setCellValueFactory(new PropertyValueFactory<Log, String>("dauer")); logDauerCol.setCellValueFactory(new PropertyValueFactory<Log, String>("dauer"));
logStreckeCol.setCellValueFactory(new PropertyValueFactory<Log, String>("strecke")); logStreckeCol.setCellValueFactory(new PropertyValueFactory<Log, String>("strecke"));
logDatumCol.setCellValueFactory(new PropertyValueFactory<Log, String>("datum")); logDatumCol.setCellValueFactory(new PropertyValueFactory<Log, String>("datum"));
@ -112,7 +154,17 @@ public class TourplanerController implements Initializable {
logPauseCol.setCellValueFactory(new PropertyValueFactory<Log, String>("pause")); logPauseCol.setCellValueFactory(new PropertyValueFactory<Log, String>("pause"));
logGegangenCol.setCellValueFactory(new PropertyValueFactory<Log, String>("gegangen")); logGegangenCol.setCellValueFactory(new PropertyValueFactory<Log, String>("gegangen"));
logBemerkungCol.setCellValueFactory(new PropertyValueFactory<Log, String>("bemerkung")); logBemerkungCol.setCellValueFactory(new PropertyValueFactory<Log, String>("bemerkung"));
logRatingCol1.setCellValueFactory(new PropertyValueFactory<Log, String>("rating"));
progressBar.addProgress(10);
mapImageView.setImage(this.viewModel.getImage(this.viewModel.getSelectedTour().getName()));
if(this.viewModel.isSucheAktiv()){
this.viewModel.setSucheAktiv(false);
progressBar.addProgress(10);
syncTourNamen();
progressBar.setProgress(100);
this.sucheInput.setText("");
}
progressBar.setProgress(100);
} }
/** /**
@ -130,7 +182,7 @@ public class TourplanerController implements Initializable {
*/ */
@FXML @FXML
private void addTour(){ private void addTour(){
this.viewModel.addTour(); if(this.viewModel.addTour()) this.mapImageView.setImage(this.viewModel.getImage(this.viewModel.getSelectedTour().getName()));
} }
/** /**
@ -139,10 +191,11 @@ public class TourplanerController implements Initializable {
*/ */
@FXML @FXML
private void delTour(){ private void delTour(){
this.beschreibungTableView.getItems().removeIf(s -> true); //löscht alles aus der tabelle this.beschreibungTableView.getItems().clear(); //löscht alles aus der tabelle
this.titleTextView.setText(ConfigHelper.getLangIniString("keinetourselected")); this.titleTextView.setText(ConfigHelper.getLangIniString("keinetourselected"));
this.viewModel.delTour(); this.viewModel.delTour();
logTableView.setPlaceholder(new Label( ConfigHelper.getLangIniString("keinetourselected"))); logTableView.setPlaceholder(new Label( ConfigHelper.getLangIniString("keinetourselected")));
mapImageView.setImage(null);
} }
/** /**
@ -151,7 +204,10 @@ public class TourplanerController implements Initializable {
*/ */
@FXML @FXML
private void suche(){ private void suche(){
ProgressBar progressBar = new ProgressBar("Suche");
this.viewModel.suche(this.sucheInput.getText()); this.viewModel.suche(this.sucheInput.getText());
progressBar.addProgress(100);
progressBar.closeProgress();
} }
/** /**
@ -161,12 +217,13 @@ public class TourplanerController implements Initializable {
@FXML @FXML
private void addLog(){ private void addLog(){
this.viewModel.addLog(); this.viewModel.addLog();
syncLogs();
} }
@FXML @FXML
private void delLog(){ private void delLog(){
this.viewModel.delLog(); this.viewModel.delLog();
syncLogs();
} }
/** /**
@ -188,13 +245,106 @@ public class TourplanerController implements Initializable {
//Tour list -> links //Tour list -> links
TourListView.getSelectionModel().setSelectionMode(SelectionMode.SINGLE); TourListView.getSelectionModel().setSelectionMode(SelectionMode.SINGLE);
TourListView.setOrientation(Orientation.VERTICAL); TourListView.setOrientation(Orientation.VERTICAL);
TourListView.setItems(this.viewModel.getTourNamen()); syncTourNamen();
deselectAll();
if(ConfigHelper.getIniInt(ConfigHelper.getStandartConfig(), "settings", "openpdf") == 1){
this.openpdf.setSelected(true);
}else {
this.openpdf.setSelected(false);
}
if(ConfigHelper.getIniInt(ConfigHelper.getStandartConfig(), "settings", "openmap") == 1){
this.openmap.setSelected(true);
}else {
this.openmap.setSelected(false);
}
this.langgroup = new ToggleGroup();
this.langdeutsch.setToggleGroup(this.langgroup);
this.langenglisch.setToggleGroup(this.langgroup);
if(ConfigHelper.getIniString(ConfigHelper.getStandartConfig(), "lang", "lang").equals("langde")){
this.langdeutsch.setSelected(true);
this.langenglisch.setSelected(false);
}else if(ConfigHelper.getIniString(ConfigHelper.getStandartConfig(), "lang", "lang").equals("langen")){
this.langdeutsch.setSelected(false);
this.langenglisch.setSelected(true);
}
langToFxml();
}
private void langToFxml(){
this.kartenTab.setText(ConfigHelper.getLangIniString("fkarte"));
this.beschreibungTab.setText(ConfigHelper.getLangIniString("fbeschreibung"));
this.editBtn.setText(ConfigHelper.getLangIniString("fedit"));
this.editTourBtn.setText(ConfigHelper.getLangIniString("fedit"));
this.nameCol.setText(ConfigHelper.getLangIniString("fname"));
this.streckeCol.setText(ConfigHelper.getLangIniString("fstrecke"));
this.dauerCol.setText(ConfigHelper.getLangIniString("fdauer"));
this.zielCol.setText(ConfigHelper.getLangIniString("fziel"));
this.startCol .setText(ConfigHelper.getLangIniString("fstart"));
this.logAvgCol.setText(ConfigHelper.getLangIniString("favg"));
this.logBemerkungCol.setText(ConfigHelper.getLangIniString("fbemerkung"));
this.logDatumCol.setText(ConfigHelper.getLangIniString("fdatum"));
this.logDauerCol.setText(ConfigHelper.getLangIniString("fdauer"));
this.logGegangenCol.setText(ConfigHelper.getLangIniString("fgegangen"));
this.logHightCol.setText(ConfigHelper.getLangIniString("fhight"));
this.logPauseCol.setText(ConfigHelper.getLangIniString("fpause"));
this.logStreckeCol.setText(ConfigHelper.getLangIniString("fstrecke"));
this.sucheButton.setText(ConfigHelper.getLangIniString("fsuche"));
this.openmap.setText(ConfigHelper.getLangIniString("fopenmapsetting"));
this.openpdf.setText(ConfigHelper.getLangIniString("fopenpdfsetting"));
this.langenglisch.setText(ConfigHelper.getLangIniString("flangenglisch"));
this.langdeutsch.setText(ConfigHelper.getLangIniString("flangdeutsch"));
this.menueFile.setText(ConfigHelper.getLangIniString("fdatei"));
this.menuebearbeiten.setText(ConfigHelper.getLangIniString("fbearbeiten"));
this.menueoptionen.setText(ConfigHelper.getLangIniString("foptionen"));
this.menuesprachen.setText(ConfigHelper.getLangIniString("fsprache"));
this.menuehilfe.setText(ConfigHelper.getLangIniString("fhilfe"));
this.reportsummary.setText(ConfigHelper.getLangIniString("freposum"));
this.tourreport.setText(ConfigHelper.getLangIniString("frepotour"));
this.beendenButton.setText(ConfigHelper.getLangIniString("fbeenden"));
this.sucheInput.setPromptText(ConfigHelper.getLangIniString("fsuche")+ConfigHelper.getLangIniString("fpunkte"));
this.logRatingCol1.setText("Rating");
}
@FXML
private void openpdfaction(){
int selected = 0;
if(this.openpdf.isSelected()) selected = 1;
ConfigHelper.setIniInt(ConfigHelper.getStandartConfig(), "settings", "openpdf", selected);
}
@FXML
private void openmapaction(){
int selected = 0;
if(this.openmap.isSelected()) selected = 1;
ConfigHelper.setIniInt(ConfigHelper.getStandartConfig(), "settings", "openmap", selected);
}
private void deselectAll(){
//Tabs zu Tour -> rechts oben //Tabs zu Tour -> rechts oben
beschreibungTableView.setPlaceholder(new Label( ConfigHelper.getLangIniString("keinetourselected"))); beschreibungTableView.setPlaceholder(new Label( ConfigHelper.getLangIniString("keinetourselected")));
titleTextView.setText( ConfigHelper.getLangIniString("keinetourselected")); titleTextView.setText( ConfigHelper.getLangIniString("keinetourselected"));
//Log -> rechts unten //Log -> rechts unten
logTableView.setPlaceholder(new Label( ConfigHelper.getLangIniString("keinetourselected"))); logTableView.setPlaceholder(new Label( ConfigHelper.getLangIniString("keinetourselected")));
}
@FXML
private void exportBtn(){
this.viewModel.exportData();
}
@FXML
private void importBtn(){
deselectAll();
this.viewModel.importData();
syncTourNamen();
}
@FXML
private void reportSum(){
this.viewModel.sumReport();
} }
/** /**

View File

@ -2,40 +2,45 @@ package tourplaner.viewmodels;
import javafx.collections.FXCollections; import javafx.collections.FXCollections;
import javafx.collections.ObservableList; import javafx.collections.ObservableList;
import org.apache.pdfbox.exceptions.COSVisitorException; import javafx.scene.image.Image;
import tourplaner.business.Reporter; import tourplaner.business.*;
import tourplaner.ui.AlertHelper; import tourplaner.ui.AlertHelper;
import tourplaner.business.ConfigHelper;
import tourplaner.business.LogHelper;
import tourplaner.object.Log; import tourplaner.object.Log;
import tourplaner.object.Tour; import tourplaner.object.Tour;
import tourplaner.ui.ProgressBar;
import java.awt.*; import java.awt.*;
import java.io.IOException; import java.io.IOException;
import java.net.URI; import java.net.URI;
import java.net.URISyntaxException; import java.net.URISyntaxException;
import java.time.LocalDate; import java.time.LocalDate;
import java.util.ArrayList;
import java.util.UUID; import java.util.UUID;
import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicReference; import java.util.concurrent.atomic.AtomicReference;
public class ViewModel { public class ViewModel {
//Tour //Tour
private final ObservableList<Tour> tourData = FXCollections.observableArrayList(new Tour("Test 1", "120", "json dings", 22.3, "Wien", "Graz"),new Tour("Test 2", "210", "json dings", 42.3, "Da", "Dort")); private final ObservableList<Tour> tourData = FXCollections.observableArrayList();
private final ObservableList<String> tourNamen = FXCollections.observableArrayList("Test 1", "Test 2"); private ObservableList<String> tourNamen = FXCollections.observableArrayList();
private Tour selectedTour; private Tour selectedTour;
private String neueTourName, neueTourStart, neueTourZiel, neueBemerkung; private String neueTourName, neueTourStart, neueTourZiel, neueBemerkung;
//Log //Log
private final ObservableList<Log> logData = FXCollections.observableArrayList(); private final ObservableList<Log> logData = FXCollections.observableArrayList();
private Log selectedLog; private Log selectedLog;
// Suche
private boolean sucheAktiv;
public Image getImage(String tourname){
return new Image( ConfigHelper.getIniString(ConfigHelper.getStandartConfig(), "map", "file_pre") + TourPlaner.getImagePath(tourname));
}
/** /**
* Bearbeitet eine bereits bestehende Tour * Bearbeitet eine bereits bestehende Tour
* prüft ob eine tour ausgewählt ist * prüft ob eine tour ausgewählt ist
*/ */
public void editTour(){ public void editTour() throws IOException {
if (this.selectedTour == null){ if (this.selectedTour == null){
AlertHelper.warn(ConfigHelper.getLangIniString("achtung"), AlertHelper.warn(ConfigHelper.getLangIniString("achtung"),
ConfigHelper.getLangIniString("keinetourselected"), ConfigHelper.getLangIniString("keinetourselected"),
@ -57,8 +62,11 @@ public class ViewModel {
this.tourData.removeIf(tour -> tour.getName().equals(this.selectedTour.getName())); this.tourData.removeIf(tour -> tour.getName().equals(this.selectedTour.getName()));
this.tourNamen.removeIf(tour -> tour.equals(this.selectedTour.getName())); this.tourNamen.removeIf(tour -> tour.equals(this.selectedTour.getName()));
this.tourData.add(new Tour(this.neueTourName, "TBD", "TBD", 0, this.neueTourStart, this.neueTourZiel)); Tour newTour = new Tour(this.neueTourName, "TBD", "TBD", 0, this.neueTourStart, this.neueTourZiel);
this.tourData.add(newTour);
this.tourNamen.add(this.neueTourName); this.tourNamen.add(this.neueTourName);
LogHelper.info("Edit Tour: " + this.neueTourName + " upload zu Postgres war: " + TourPlaner.editTour(this.selectedTour.getName(), newTour), "ViewModel - EditTour");
selectTour(this.neueTourName);
} }
} }
} }
@ -71,9 +79,10 @@ public class ViewModel {
/** /**
* Input mit duplications check des Namens und ohne content im input feld * Input mit duplications check des Namens und ohne content im input feld
* @return false beim schließen
*/ */
private void tourNameInput(){ private boolean tourNameInput(){
tourNameInputDuplicatCheck("", true); return tourNameInputDuplicatCheck("", true);
} }
/** /**
@ -137,24 +146,38 @@ public class ViewModel {
return false; return false;
} }
} }
return false; return true;
} }
/** /**
* Fügt eine neue Tour hinzu * Fügt eine neue Tour hinzu
*/ */
public void addTour(){ public boolean addTour(){
tourNameInput(); if(tourNameInput()) {
tourStartInput(""); if(tourStartInput("")) {
tourZielInput(""); if (tourZielInput("")) {
if (getTour(this.neueTourName) == null) { if (getTour(this.neueTourName) == null) {
tourData.add(new Tour(this.neueTourName, "TBD", "TBD", 0, this.neueTourStart, this.neueTourZiel)); ProgressBar progressBar = new ProgressBar("Add Tour...");
Tour newTour = new Tour(this.neueTourName, "1", "1", 0, this.neueTourStart, this.neueTourZiel);
tourData.add(newTour);
tourNamen.add(this.neueTourName); tourNamen.add(this.neueTourName);
this.selectedTour = newTour;
progressBar.addProgress(10);
try {
TourPlaner.addTour(newTour, progressBar);
} catch (IOException e) {
LogHelper.error(e);
return false;
} }
}
}else return false;
}else return false;
}else return false;
this.neueTourStart = null; this.neueTourStart = null;
this.neueTourZiel = null; this.neueTourZiel = null;
this.neueTourName = null; this.neueTourName = null;
return true;
} }
private boolean keineTourSelected(){ private boolean keineTourSelected(){
@ -172,12 +195,15 @@ public class ViewModel {
* Bearbeitet einen gewählten Log eintrag * Bearbeitet einen gewählten Log eintrag
*/ */
public void editLog(){ public void editLog(){
System.out.println(this.selectedLog);
if(this.selectedTour != null) {
if(this.selectedLog != null) {
AtomicReference<Tour> tourAkt = new AtomicReference<>(); AtomicReference<Tour> tourAkt = new AtomicReference<>();
AtomicReference<Log> logAkt = new AtomicReference<>(); AtomicReference<Log> logAkt = new AtomicReference<>();
this.tourData.forEach(tourd -> { this.tourData.forEach(tourd -> {
if(tourd.getName().equals(this.selectedTour.getName())) { if (tourd.getName().equals(this.selectedTour.getName())) {
tourd.getLogs().forEach(log -> { tourd.getLogs().forEach(log -> {
if(this.selectedLog.getId().equals(log.getId())){ if (this.selectedLog.getId().equals(log.getId())) {
logAkt.set(log); logAkt.set(log);
tourAkt.set(tourd); tourAkt.set(tourd);
} }
@ -187,33 +213,46 @@ public class ViewModel {
double dauer = dauerInput(this.selectedLog.getDauer()); double dauer = dauerInput(this.selectedLog.getDauer());
double strecke = -1; double strecke = -1;
double pause = -1.0; double pause = -1.0;
double rating = -1.0;
double hightmeter = -1.0; double hightmeter = -1.0;
boolean bemerkung = false; boolean bemerkung = false;
LocalDate datum = null; LocalDate datum = null;
if (dauer >= 0) { if (dauer >= 0) {
strecke = streckeInput(this.selectedLog.getStrecke() + ""); strecke = streckeInput(this.selectedLog.getStrecke() + "");
if (strecke >= 0) { if (strecke >= 0) {
pause = pauseInput(""); pause = pauseInput(this.selectedLog.getPause() + "");
if(pause >= 0.0) { if (pause >= 0.0) {
hightmeter = hightmeterInput(""); hightmeter = hightmeterInput(this.selectedLog.getHightmeter() + "");
if (hightmeter >= 0.0) { if (hightmeter >= 0.0) {
bemerkung = bemerkungInput(""); bemerkung = bemerkungInput(this.selectedLog.getBemerkung());
if (bemerkung) { if (bemerkung) {
datum = dateInput(this.selectedLog.getDatum()); datum = dateInput(this.selectedLog.getDatum());
if (datum != null) { if (datum != null) {
Log newLog = new Log(this.selectedLog.getId(), dauer, datum, strecke, this.neueBemerkung, hightmeter, pause); rating = ratingInput(this.selectedLog.getRating());
if(rating >= 0.0) {
Log newLog = new Log(this.selectedLog.getId(), dauer, datum, strecke, this.neueBemerkung, hightmeter, pause, rating + "");
this.logData.removeIf(ld -> ld.getId().equals(this.selectedLog.getId())); this.logData.removeIf(ld -> ld.getId().equals(this.selectedLog.getId()));
this.logData.add(newLog); this.logData.add(newLog);
tourAkt.get().delLog(this.selectedLog.getId()); // tourAkt.get().delLog(this.selectedLog.getId());
tourAkt.get().addLog(newLog); // tourAkt.get().addLog(newLog);
this.tourData.removeIf(td -> td.getName().equals(this.selectedTour.getName())); this.tourData.removeIf(td -> td.getName().equals(this.selectedTour.getName()));
this.tourData.add(tourAkt.get()); this.tourData.add(tourAkt.get());
TourPlaner.editLog(this.selectedTour.getName(), newLog);
} }
} }
} }
} }
} }
} }
}
}else{
//Kein log
AlertHelper.warn(ConfigHelper.getLangIniString("achtung"), ConfigHelper.getLangIniString("keinlogselected"), ConfigHelper.getLangIniString("keinlogselectedmsg"));
}
}else {
//Keine Tour
AlertHelper.warn(ConfigHelper.getLangIniString("achtung"), ConfigHelper.getLangIniString("keinetourselected"), ConfigHelper.getLangIniString("deltournoselectmsg"));
}
this.neueBemerkung = null; this.neueBemerkung = null;
} }
@ -244,6 +283,30 @@ public class ViewModel {
ConfigHelper.getLangIniString("doppelpunkt"), realcontent); ConfigHelper.getLangIniString("doppelpunkt"), realcontent);
} }
/**
* Eingabe des Ratings bis sie korrekt ist
* @param content Wenn der Content -1.0 ist, wird er nicht in das input feld eingeschleust, sonst schon
* @return Die eingegebene des Ratings
*/
private double ratingInput(String content){
String realcontent = "";
if (!content.isEmpty()){
realcontent = content + "";
}
double input = -1;
while(input <= 0) {
input = AlertHelper.inputNumber(ConfigHelper.getLangIniString("bewertung"),
ConfigHelper.getLangIniString("bewertungmsg"),
ConfigHelper.getLangIniString("bewertung") +
ConfigHelper.getLangIniString("doppelpunkt"), realcontent);
if(input < 0 && input > 5){
input = -1;
AlertHelper.warn(ConfigHelper.getLangIniString("achtung"), ConfigHelper.getLangIniString("bewertungeror"), ConfigHelper.getLangIniString("bewertungeror2"));
}
}
return input;
}
/** /**
* Datum eingabe bis diese Korrekt ist * Datum eingabe bis diese Korrekt ist
* @return Das eingegebene korekte Datum * @return Das eingegebene korekte Datum
@ -305,6 +368,7 @@ public class ViewModel {
double dauer = dauerInput(-1.0); double dauer = dauerInput(-1.0);
double strecke, pause, hightmeter; double strecke, pause, hightmeter;
boolean bemerkung = false; boolean bemerkung = false;
double rating = -1.0;
LocalDate date = null; LocalDate date = null;
if(dauer >= 0) { if(dauer >= 0) {
strecke = streckeInput(""); strecke = streckeInput("");
@ -317,8 +381,11 @@ public class ViewModel {
if (bemerkung){ if (bemerkung){
date = dateInput(LocalDate.now()); date = dateInput(LocalDate.now());
if (date != null) { if (date != null) {
Log newLog = new Log(newId.get(), dauer, date, strecke, this.neueBemerkung, hightmeter, pause); rating = ratingInput("");
if(rating >= 0.0) {
Log newLog = new Log(newId.get(), dauer, date, strecke, this.neueBemerkung, hightmeter, pause, rating + "");
this.logData.add(newLog); this.logData.add(newLog);
TourPlaner.addLog(this.selectedTour.getName(), newLog);
s.addLog(newLog); s.addLog(newLog);
} }
} }
@ -327,6 +394,7 @@ public class ViewModel {
} }
} }
} }
}
}); });
this.neueBemerkung = null; this.neueBemerkung = null;
} }
@ -340,25 +408,8 @@ public class ViewModel {
*/ */
public void delLog(){ public void delLog(){
if(this.selectedLog != null) { if(this.selectedLog != null) {
this.logData.removeIf(s -> s.getId().equals(this.selectedLog.getId())); TourPlaner.delLog(this.selectedTour.getName(), this.selectedLog.getId());
AtomicReference<Tour> tourToEdit = new AtomicReference<>();
this.tourData.forEach(s -> {
if (s.getLogs() != null) {
s.getLogs().forEach(ss -> {
if (ss.getId().equals(this.selectedLog.getId())) {
tourToEdit.set(s);
}
});
}
});
if (tourToEdit.get() != null){
Tour toEdit = tourToEdit.get();
toEdit.delLog(this.selectedLog.getId());
this.tourData.removeIf(s -> s.getName().equals(toEdit.getName()));
this.tourData.add(toEdit);
this.selectedLog = null; this.selectedLog = null;
}
}else{ }else{
AlertHelper.warn(ConfigHelper.getLangIniString("achtung"), AlertHelper.warn(ConfigHelper.getLangIniString("achtung"),
ConfigHelper.getLangIniString("keinetourselected"), ConfigHelper.getLangIniString("keinetourselected"),
@ -398,6 +449,8 @@ public class ViewModel {
} }
public ObservableList<Log> getLogData() { public ObservableList<Log> getLogData() {
logData.removeIf(s -> true);
if(this.selectedTour != null) logData.addAll(TourPlaner.getLogs(this.selectedTour.getName()));
return logData; return logData;
} }
@ -452,6 +505,12 @@ public class ViewModel {
} }
public ObservableList<String> getTourNamen() { public ObservableList<String> getTourNamen() {
ArrayList<String> namen = new ArrayList<>();
getTourData().forEach(s -> {
namen.add(s.getName());
});
tourNamen.clear();
tourNamen.addAll(namen);
return tourNamen; return tourNamen;
} }
@ -472,6 +531,11 @@ public class ViewModel {
} }
public ObservableList<Tour> getTourData() { public ObservableList<Tour> getTourData() {
tourData.clear();
ArrayList<Tour> touren = TourPlaner.getAllTours();
if(touren != null) {
tourData.addAll(touren);
}
return tourData; return tourData;
} }
@ -479,15 +543,18 @@ public class ViewModel {
* Entfernt eine Tour anhand der ausgewählten Tour * Entfernt eine Tour anhand der ausgewählten Tour
*/ */
public void delTour(){ public void delTour(){
try { if (this.selectedTour != null) {
String tourname = this.selectedTour.getName(); String tourname = this.selectedTour.getName();
try {
tourData.removeIf(s -> s.getName().equals(tourname)); tourData.removeIf(s -> s.getName().equals(tourname));
tourNamen.removeIf(s -> s.equals(tourname)); tourNamen.removeIf(s -> s.equals(tourname));
logData.removeIf(s -> true); logData.removeIf(s -> true);
TourPlaner.delTour(tourname);
setSelectedTour(null); setSelectedTour(null);
}catch (NullPointerException e){ } catch (NullPointerException e) {
LogHelper.error(ConfigHelper.getLangIniString("keinetourselected"), LogHelper.error(e);
ConfigHelper.getLangIniString("deltournoselect")); }
}else {
AlertHelper.warn(ConfigHelper.getLangIniString("achtung"), AlertHelper.warn(ConfigHelper.getLangIniString("achtung"),
ConfigHelper.getLangIniString("keinetourselected"), ConfigHelper.getLangIniString("keinetourselected"),
ConfigHelper.getLangIniString("deltournoselectmsg")); ConfigHelper.getLangIniString("deltournoselectmsg"));
@ -504,7 +571,20 @@ public class ViewModel {
ConfigHelper.getLangIniString("suchfeldleer"), ConfigHelper.getLangIniString("suchfeldleer"),
ConfigHelper.getLangIniString("suchtextzuerst")); ConfigHelper.getLangIniString("suchtextzuerst"));
} }
// TODO: 19.03.2021 Suchlogik ArrayList<Tour> result = TourPlaner.sucheTour(sucheInput);
tourNamen.clear();
for (Tour tour:result) {
tourNamen.add(tour.getName());
}
this.sucheAktiv = true;
}
public boolean isSucheAktiv() {
return sucheAktiv;
}
public void setSucheAktiv(boolean sucheAktiv) {
this.sucheAktiv = sucheAktiv;
} }
/** /**
@ -568,14 +648,40 @@ public class ViewModel {
ConfigHelper.getLangIniString("keinetourselected"), ConfigHelper.getLangIniString("keinetourselected"),
ConfigHelper.getLangIniString("logtournotselectedmsg")); ConfigHelper.getLangIniString("logtournotselectedmsg"));
}else { }else {
try { TourPlaner.doReport(this.selectedTour.getName());
Reporter.createTourReport(this.selectedTour.getName()); }
} catch (IOException e) {
LogHelper.error(e.getMessage(), e.getClass().getName());
} catch (COSVisitorException e) {
LogHelper.error(e.getMessage(), e.getClass().getName());
} }
/**
* Exportiert alle daten in ein File das hier gewählt wird
*/
public void exportData(){
String file = AlertHelper.fileChooser("Exportiere");
if(file != null){
try {
new Exporter(file).doExport();
} catch (IOException e) {
AlertHelper.error("Error", "Export Error", "Fehler beim Exportieren");
LogHelper.error(e);
} }
} }
}
/**
* Importiert alle daten von einem File das hier gewählt wird
*/
public void importData() {
String file = AlertHelper.fileChooser("Importiere");
if (file != null){
this.tourNamen = FXCollections.observableArrayList();
new Exporter(file).doImport();
}
}
/**
* Erstellt einen Summary Report
*/
public void sumReport(){
Reporter.sumReport();
}
} }