65 Commits

Author SHA1 Message Date
ed648a2740 add clear all positions in order draft 2026-03-07 20:33:13 +01:00
6330d7fd51 fix missing xml config 2026-03-01 19:10:07 +01:00
c241964a8b Configure auto Print or manual Print 2026-03-01 18:52:19 +01:00
f3e0da2689 fix ArrayIndexOutOfBoundsException 2026-02-25 22:02:46 +01:00
4421075bec update version 2026-02-25 21:43:52 +01:00
71c79575c8 update dependencies 2026-02-25 21:41:14 +01:00
1866782111 update java.math.RoundingMode 2026-02-25 21:18:04 +01:00
a7e76e00d3 remove dead code 2026-02-25 21:13:21 +01:00
1cadfe5bfc code formatter 2026-02-21 18:32:20 +01:00
c40be1c203 fix first start 2026-02-21 18:22:25 +01:00
02026633ed update to new versions and build system 2026-02-17 19:04:16 +01:00
c4297a4be2 fixed spelling mistakes 2019-01-10 21:54:46 +01:00
fd52d3df6d added yt link for Kurzanleitung 2019-01-09 22:53:07 +01:00
c320ef615d added yt link and fixed some spelling errors 2019-01-09 18:39:47 +01:00
2a20ea7bdb spelling errors fixed 2019-01-06 17:44:25 +01:00
a56ad43852 Merge branch 'master' of https://git.mosad.xyz/localhorst/jFxKasse 2018-12-08 13:21:35 +01:00
188214dfbe bug fix 2018-12-08 13:21:14 +01:00
cdbe2cccc0 „README.md“ ändern 2018-12-07 23:45:41 +01:00
5152846478 added screenshots 2018-12-07 23:31:12 +01:00
f5c5d546c5 added kiy input 2018-12-07 23:23:48 +01:00
5c9d54dabf ui fixes and bill layout improvements 2018-12-07 11:25:45 +01:00
96d5968fef code cleanup and ui fixes 2018-12-06 23:59:01 +01:00
88b39820ca bill splitted 2018-12-06 23:15:06 +01:00
25bedae873 scroll bar is now on right side 2018-12-06 20:44:54 +01:00
1ec02d74a3 fixed issue with jobtime 2018-12-06 20:34:44 +01:00
783d9f9bc0 fixed issue #1 2018-12-06 20:29:38 +01:00
a7b2753aa3 code cleanup and cross platform 2018-12-06 15:10:28 +01:00
dd9ff0d410 reprint job 2018-12-06 14:11:26 +01:00
4e902415d7 xml saving and loading is complete 2018-12-06 13:11:35 +01:00
87f9b8786c xml is now in XMLController 2018-12-05 22:44:15 +01:00
37cfe02c5b added basic printer support 2018-12-05 18:47:26 +01:00
76020e371b added new pom.xml 2018-12-03 21:56:27 +01:00
b9b6748ac7 „bin/src/main/java/com/jFxKasse/application/JavaFX11Main.class“ löschen 2018-12-03 21:53:28 +01:00
078b3dfdea „bin/src/main/java/com/jFxKasse/application/Main.class“ löschen 2018-12-03 21:53:26 +01:00
0db448019c „bin/src/main/java/com/jFxKasse/controller/DBController.class“ löschen 2018-12-03 21:53:24 +01:00
fbd128e5b9 „bin/src/main/java/com/jFxKasse/controller/MainWindowController.class“ löschen 2018-12-03 21:53:21 +01:00
290a5d8e5c „bin/src/main/java/com/jFxKasse/datatypes/Job.class“ löschen 2018-12-03 21:53:18 +01:00
dfe1008786 „bin/src/main/java/com/jFxKasse/datatypes/tableDataCurrentOrder.class“ löschen 2018-12-03 21:53:16 +01:00
e691d4e1dc „bin/src/main/java/com/jFxKasse/datatypes/tableDataJob.class“ löschen 2018-12-03 21:53:13 +01:00
8ff4d88202 „bin/src/main/java/com/jFxKasse/datatypes/tableDataPositionen.class“ löschen 2018-12-03 21:53:00 +01:00
86c0ad144a „bin/src/main/resources/css/application.css“ löschen 2018-12-03 21:52:52 +01:00
38d42db6cd „bin/src/main/resources/fxml/MainWindow.fxml“ löschen 2018-12-03 21:52:45 +01:00
c85f239651 „bin/.gitignore“ löschen 2018-12-03 21:52:33 +01:00
4291038d4e „bin/.project“ löschen 2018-12-03 21:52:28 +01:00
ccaf68d60f „bin/LICENSE“ löschen 2018-12-03 21:52:21 +01:00
ac85cb82ff „bin/README.md“ löschen 2018-12-03 21:52:14 +01:00
ea7f84c2c1 „build.fxbuild“ löschen 2018-12-03 21:51:56 +01:00
9d506475cb „pom.xml“ löschen 2018-12-03 21:51:53 +01:00
aca967e88d „bin/build.fxbuild“ löschen 2018-12-03 21:51:50 +01:00
ebda172415 „bin/pom.xml“ löschen 2018-12-03 21:51:20 +01:00
279f358392 avgJobValue is now correct 2018-12-03 21:50:41 +01:00
244243f07a final maven setup 2018-12-03 21:33:16 +01:00
50b623dd39 seil0 edit 2018-12-03 21:12:00 +01:00
3f4edc85f0 added dir com 2018-12-03 20:39:51 +01:00
121a86a6b5 directory structure 2018-12-03 20:27:55 +01:00
0185053b8d added shade 2018-12-03 15:28:11 +01:00
06495ebd5b „bin/application/application.css“ löschen 2018-12-03 15:07:26 +01:00
fc03ba40e3 „bin/application/MainWindowController.class“ löschen 2018-12-03 15:07:21 +01:00
640a9e4de4 „bin/application/MainWindowController$1.class“ löschen 2018-12-03 15:07:15 +01:00
0cad411304 „bin/application/MainWindow.fxml“ löschen 2018-12-03 15:07:11 +01:00
514f1b0605 „bin/application/Main.class“ löschen 2018-12-03 15:07:05 +01:00
0944f210dd „bin/application/DBController.class“ löschen 2018-12-03 15:06:59 +01:00
ef23a0d631 „bin/application/DBController$1.class“ löschen 2018-12-03 15:06:52 +01:00
ae3e02278d converted to Maven 2018-12-03 15:04:07 +01:00
259988195f fixed number input 2018-10-08 11:13:22 +02:00
45 changed files with 3864 additions and 2742 deletions

2
.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
target/
dependency-reduced-pom.xml

26
.vscode/eclipse-formatter.xml vendored Normal file
View File

@ -0,0 +1,26 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<profiles version="21">
<profile kind="CodeFormatterProfile" name="jFxKasse" version="21">
<setting id="org.eclipse.jdt.core.formatter.indentation.size" value="4"/>
<setting id="org.eclipse.jdt.core.formatter.tabulation.char" value="tab"/>
<setting id="org.eclipse.jdt.core.formatter.tabulation.size" value="4"/>
<setting id="org.eclipse.jdt.core.formatter.lineSplit" value="120"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_field" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_method_declaration" value="end_of_line"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_type_declaration" value="end_of_line"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_block" value="end_of_line"/>
<setting id="org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.join_wrapped_lines" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.use_on_off_tags" value="false"/>
</profile>
</profiles>

7
.vscode/extensions.json vendored Normal file
View File

@ -0,0 +1,7 @@
{
"recommendations": [
"vscjava.vscode-java-pack",
"vscjava.vscode-maven",
"redhat.java"
]
}

20
.vscode/launch.json vendored Normal file
View File

@ -0,0 +1,20 @@
{
"version": "0.2.0",
"configurations": [
{
"type": "java",
"name": "Run jFxKasse",
"request": "launch",
"mainClass": "com.jFxKasse.application.JavaFX11Main",
"projectName": "jFxKasse",
"vmArgs": "--module-path ${env:PATH_TO_FX} --add-modules javafx.controls,javafx.fxml --add-opens javafx.graphics/com.sun.javafx.scene=ALL-UNNAMED"
},
{
"type": "java",
"name": "Run jFxKasse (Maven)",
"request": "launch",
"mainClass": "com.jFxKasse.application.JavaFX11Main",
"projectName": "jFxKasse"
}
]
}

18
.vscode/settings.json vendored Normal file
View File

@ -0,0 +1,18 @@
{
"java.project.sourcePaths": [
"src/main/java"
],
"java.project.outputPath": "target/classes",
"java.project.referencedLibraries": [],
"java.configuration.updateBuildConfiguration": "automatic",
"java.compile.nullAnalysis.mode": "automatic",
"editor.formatOnSave": true,
"files.encoding": "utf8",
// Java formatter: point to workspace-local Eclipse formatter profile
"java.format.settings.url": ".vscode/eclipse-formatter.xml",
"java.format.settings.profile": "jFxKasse",
"[java]": {
"editor.defaultFormatter": "redhat.java"
}
}

51
.vscode/tasks.json vendored Normal file
View File

@ -0,0 +1,51 @@
{
"version": "2.0.0",
"tasks": [
{
"label": "mvn compile",
"type": "shell",
"command": "mvn compile",
"group": "build",
"problemMatcher": [
"$javac"
]
},
{
"label": "mvn package",
"type": "shell",
"command": "mvn package -DskipTests",
"group": {
"kind": "build",
"isDefault": true
},
"problemMatcher": [
"$javac"
]
},
{
"label": "mvn clean",
"type": "shell",
"command": "mvn clean",
"group": "build",
"problemMatcher": []
},
{
"label": "mvn javafx:run",
"type": "shell",
"command": "mvn javafx:run",
"group": "build",
"problemMatcher": [
"$javac"
]
},
{
"label": "mvn test",
"type": "shell",
"command": "mvn test",
"group": "test",
"problemMatcher": [
"$javac"
]
}
]
}

View File

@ -1,2 +1,60 @@
# jFxKasse # jFxKasse
easy payment system for small to middel sized events with a sales slip printer
Simple POS (Point of Sale) system for small to medium-sized events with receipt printer support.
## Requirements
- Java JDK 21+
- Maven 3.9+
- Display >= 1366x768
## Video Tutorials (German | Deutsch)
[YouTube Video: jFxKasse - Kassensystem - Kurzanleitung](https://www.youtube.com/watch?v=DV9DDESw40I)
[YouTube Video: jFxKasse - Kassensystem - Installieren](https://www.youtube.com/watch?v=IY1bqRjwh0Q)
## Setup (VSCode on openSUSE Tumbleweed)
### 1. Install dependencies
```bash
sudo zypper install java-21-openjdk java-21-openjdk-devel maven
```
### 2. Install VSCode extensions
Open the project in VSCode. You will be prompted to install the recommended extensions:
- **Extension Pack for Java** (`vscjava.vscode-java-pack`)
- **Maven for Java** (`vscjava.vscode-maven`)
- **Language Support for Java** (`redhat.java`)
### 3. Build & Run
```bash
# Compile
mvn compile
# Run via Maven
mvn javafx:run
# Package as fat JAR
mvn package
java -jar target/jFxKasse-shaded.jar
```
Or use the preconfigured VSCode tasks (`Ctrl+Shift+B`) and launch configurations (`F5`).
## Screenshots
| Main View | Jobs | Positions | Settings |
|-----------|------|-----------|----------|
| ![](screenshots/newjob) | ![](screenshots/jobs) | ![](screenshots/positions) | ![](screenshots/settings) |
## Hardware
Tested with: [Epson TM T20II](https://www.epson.de/products/sd/pos-printer/epson-tm-t20ii). Other receipt printers should work as well.
## License
GPL-3.0

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -1,374 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<?import com.jfoenix.controls.JFXButton?>
<?import com.jfoenix.controls.JFXTextField?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.ChoiceBox?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.Tab?>
<?import javafx.scene.control.TabPane?>
<?import javafx.scene.control.TitledPane?>
<?import javafx.scene.control.TreeTableColumn?>
<?import javafx.scene.control.TreeTableView?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.ColumnConstraints?>
<?import javafx.scene.layout.GridPane?>
<?import javafx.scene.layout.RowConstraints?>
<?import javafx.scene.shape.Line?>
<?import javafx.scene.text.Font?>
<AnchorPane fx:id="mainAnchorpane" maxHeight="732.0" maxWidth="1366.0" minHeight="732.0" minWidth="1366.0" prefHeight="732.0" prefWidth="1366.0" xmlns="http://javafx.com/javafx/9" xmlns:fx="http://javafx.com/fxml/1" fx:controller="application.MainWindowController">
<children>
<TabPane layoutX="4.0" layoutY="5.0" nodeOrientation="RIGHT_TO_LEFT" prefHeight="924.0" prefWidth="1536.0" tabClosingPolicy="UNAVAILABLE" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
<tabs>
<Tab text="Einstellungen">
<content>
<AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="180.0" prefWidth="200.0">
<children>
<Button fx:id="ueberbtn" layoutX="664.0" layoutY="325.0" mnemonicParsing="false" onAction="#ueberbtnAction" text="Über" />
<TitledPane alignment="CENTER" animated="false" collapsible="false" contentDisplay="CENTER" layoutX="790.0" layoutY="10.0" prefHeight="163.0" prefWidth="566.0" text="Datenbank">
<content>
<AnchorPane fx:id="paneDB" minHeight="0.0" minWidth="0.0" prefHeight="135.0" prefWidth="547.0">
<children>
<Label fx:id="labelDBName" alignment="TOP_RIGHT" contentDisplay="RIGHT" layoutX="329.0" layoutY="10.0" prefHeight="34.0" prefWidth="229.0" text="Datenbankname:">
<font>
<Font name="Cantarell Regular" size="18.0" />
</font>
</Label>
<JFXTextField fx:id="tftNewDBName" alignment="CENTER" layoutX="25.0" layoutY="10.0" prefHeight="25.0" prefWidth="376.0" />
<Label fx:id="labelDBStatus" alignment="TOP_RIGHT" contentDisplay="RIGHT" layoutX="7.0" layoutY="50.0" prefHeight="34.0" prefWidth="551.0" text="Keine Datenbank gefunden!">
<font>
<Font name="Cantarell Regular" size="18.0" />
</font>
</Label>
<Button fx:id="btnCreateNewDatabase" layoutX="297.0" layoutY="90.0" mnemonicParsing="false" onAction="#btnCreateNewDatabaseAction" text="Neue Datenbank anlegen">
<font>
<Font name="Cantarell Regular" size="13.0" />
</font>
</Button>
<Button fx:id="btnOpenFolder" layoutX="39.0" layoutY="90.0" mnemonicParsing="false" onAction="#btnOpenFolderAction" text="Speicherort öffnen">
<font>
<Font name="Cantarell Regular" size="13.0" />
</font>
</Button>
</children>
</AnchorPane>
</content>
<font>
<Font name="Cantarell Regular" size="13.0" />
</font>
</TitledPane>
</children>
</AnchorPane>
</content>
</Tab>
<Tab text="Positionen bearbeiten">
<content>
<AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="180.0" prefWidth="200.0">
<children>
<TreeTableView fx:id="entryTreeTable" layoutX="11.0" layoutY="10.0" prefHeight="502.0" prefWidth="1346.0">
<columns>
<TreeTableColumn fx:id="columnColor" editable="false" maxWidth="200.0" minWidth="200.0" prefWidth="200.0" resizable="false" sortable="false" text="Farbe" />
<TreeTableColumn fx:id="columnPrize" editable="false" maxWidth="200.0" minWidth="200.0" prefWidth="200.0" resizable="false" sortable="false" text="Preis" />
<TreeTableColumn fx:id="columnPositionsEdit" editable="false" maxWidth="800.0" minWidth="800.0" prefWidth="800.0" resizable="false" sortable="false" text="Positionen" />
<TreeTableColumn fx:id="columnPosnumber" editable="false" maxWidth="120.0" minWidth="120.0" prefWidth="120.0" resizable="false" sortable="false" text="Nummer" />
</columns>
<columnResizePolicy>
<TreeTableView fx:constant="CONSTRAINED_RESIZE_POLICY" />
</columnResizePolicy>
</TreeTableView>
<Button fx:id="btnSaveEntry" layoutX="494.0" layoutY="631.0" mnemonicParsing="false" onAction="#btnSaveEntryAction" text="Ausgewählten Eintrag speichern">
<font>
<Font name="Cantarell Regular" size="17.0" />
</font>
</Button>
<Button fx:id="btnClearEntry" layoutX="462.0" layoutY="525.0" mnemonicParsing="false" onAction="#btnClearEntryAction" text="Ausgewählten Eintrag zurücksetzten">
<font>
<Font name="Cantarell Regular" size="17.0" />
</font>
</Button>
<TitledPane alignment="CENTER" animated="false" collapsible="false" contentDisplay="CENTER" layoutX="792.0" layoutY="525.0" prefHeight="163.0" prefWidth="565.0" text="Eintrag editieren">
<content>
<AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="180.0" prefWidth="200.0">
<children>
<Label fx:id="lableNewPosition" alignment="TOP_RIGHT" contentDisplay="RIGHT" layoutX="455.0" layoutY="10.0" prefHeight="34.0" prefWidth="105.0" text="Position:">
<font>
<Font name="Cantarell Regular" size="18.0" />
</font>
</Label>
<JFXTextField fx:id="tftNewPosition" alignment="CENTER" layoutX="160.0" layoutY="10.0" prefHeight="25.0" prefWidth="279.0">
<font>
<Font name="Cantarell Regular" size="13.0" />
</font></JFXTextField>
<Label fx:id="labelNewValue" alignment="TOP_RIGHT" contentDisplay="RIGHT" layoutX="442.0" layoutY="50.0" prefHeight="34.0" prefWidth="118.0" text="Preis in Euro:">
<font>
<Font name="Cantarell Regular" size="18.0" />
</font>
</Label>
<JFXTextField fx:id="tftNewValue" alignment="CENTER" layoutX="380.0" layoutY="50.0" prefHeight="25.0" prefWidth="58.0">
<font>
<Font name="Cantarell Regular" size="13.0" />
</font></JFXTextField>
<Label fx:id="lableNewColor" alignment="TOP_RIGHT" contentDisplay="RIGHT" layoutX="455.0" layoutY="90.0" prefHeight="34.0" prefWidth="105.0" text="Farbe:">
<font>
<Font name="Cantarell Regular" size="18.0" />
</font>
</Label>
<ChoiceBox fx:id="colorChoise" layoutX="292.0" layoutY="95.0" prefWidth="150.0" />
</children>
</AnchorPane>
</content>
<font>
<Font name="Cantarell Regular" size="13.0" />
</font>
</TitledPane>
</children></AnchorPane>
</content>
</Tab>
<Tab text="Aufträge">
<content>
<AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="850.0" prefWidth="1536.0">
<children>
<TreeTableView fx:id="jobsTreeTable" layoutX="11.0" layoutY="10.0" prefHeight="541.0" prefWidth="1346.0">
<columns>
<TreeTableColumn fx:id="columnJobValue" editable="false" prefWidth="90.6666259765625" resizable="false" text="Betrag" />
<TreeTableColumn fx:id="columnState" editable="false" prefWidth="91.0" resizable="false" text="Zustand" />
<TreeTableColumn fx:id="columnPositions" editable="false" prefWidth="981.333251953125" resizable="false" sortable="false" text="Positionen" />
<TreeTableColumn fx:id="columnTime" editable="false" prefWidth="99.666748046875" resizable="false" text="Zeit" />
<TreeTableColumn fx:id="columnJobNumber" editable="false" maxWidth="3000.0" prefWidth="83.6666259765625" resizable="false" text="Nummer" />
</columns>
</TreeTableView>
<Button fx:id="btnReprintJob" layoutX="378.0" layoutY="603.0" mnemonicParsing="false" onAction="#btnReprintJobAction" text="Ausgewählter Auftrag drucken">
<font>
<Font name="Cantarell Regular" size="17.0" />
</font>
</Button>
<TitledPane fx:id="titlePaneStats" alignment="CENTER" collapsible="false" contentDisplay="CENTER" layoutX="992.0" layoutY="561.0" prefHeight="118.0" prefWidth="365.0" text="Statistik - 30.03.2018 15:15 Uhr">
<content>
<AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="59.0" prefWidth="483.0">
<children>
<Label fx:id="lableJobCount" alignment="TOP_RIGHT" contentDisplay="RIGHT" layoutX="17.0" layoutY="2.0" prefHeight="34.0" prefWidth="340.0" text="Anzahl Aufträge: 2781">
<font>
<Font name="Cantarell Regular" size="18.0" />
</font>
</Label>
<Label fx:id="labelAvgJob" alignment="TOP_RIGHT" contentDisplay="RIGHT" layoutX="17.0" layoutY="30.0" prefHeight="34.0" prefWidth="340.0" text="Durchschnittlicher Auftragswert: 12,90€">
<font>
<Font name="Cantarell Regular" size="18.0" />
</font>
</Label>
<Label fx:id="lableAllValue" alignment="TOP_RIGHT" contentDisplay="RIGHT" layoutX="17.0" layoutY="60.0" prefHeight="34.0" prefWidth="340.0" text="Gesamt: 1088,48€">
<font>
<Font name="Cantarell Regular" size="18.0" />
</font>
</Label>
</children>
</AnchorPane>
</content>
</TitledPane>
<Button fx:id="btnCancelJob" layoutX="44.0" layoutY="603.0" mnemonicParsing="false" onAction="#btnCancelJobAction" text="Ausgewählter Auftrag stornieren">
<font>
<Font name="Cantarell Regular" size="17.0" />
</font>
</Button>
<Button fx:id="btnCalcStats" layoutX="712.0" layoutY="603.0" mnemonicParsing="false" onAction="#btnCalcStatsAction" text="Statistiken berrechnen">
<font>
<Font name="Cantarell Regular" size="17.0" />
</font>
</Button>
</children>
</AnchorPane>
</content>
</Tab>
<Tab text="Neuer Auftrag">
<content>
<AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="850.0" prefWidth="1536.0">
<children>
<TreeTableView fx:id="tableCurrentOrder" layoutX="15.0" layoutY="85.0" prefHeight="379.0" prefWidth="382.0">
<columns>
<TreeTableColumn fx:id="columnPosition" editable="false" prefWidth="304.3333740234375" resizable="false" sortable="false" text="Position" />
<TreeTableColumn fx:id="columnQuantity" editable="false" prefWidth="80.6666259765625" resizable="false" sortable="false" text="Anzahl" />
</columns>
</TreeTableView>
<GridPane gridLinesVisible="true" layoutX="430.0" layoutY="15.0" prefHeight="670.0" prefWidth="920.0">
<columnConstraints>
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
</columnConstraints>
<rowConstraints>
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
</rowConstraints>
<children>
<JFXButton fx:id="gridButton04" buttonType="RAISED" maxWidth="235.0" minWidth="179.0" onAction="#gridButton04Action" prefHeight="169.0" prefWidth="235.0" ripplerFill="#655252" text="leer 0,00€" textAlignment="CENTER" wrapText="true" GridPane.columnIndex="1">
<font>
<Font name="Cantarell Regular" size="24.0" />
</font>
</JFXButton>
<JFXButton fx:id="gridButton05" buttonType="RAISED" maxWidth="235.0" minWidth="179.0" onAction="#gridButton05Action" prefHeight="169.0" prefWidth="235.0" ripplerFill="#655252" text="leer 0,00€" textAlignment="CENTER" wrapText="true">
<font>
<Font name="Cantarell Regular" size="24.0" />
</font>
</JFXButton>
<JFXButton fx:id="gridButton03" buttonType="RAISED" maxWidth="235.0" minWidth="179.0" onAction="#gridButton03Action" prefHeight="169.0" prefWidth="235.0" ripplerFill="#655252" text="leer 0,00€" textAlignment="CENTER" wrapText="true" GridPane.columnIndex="2">
<font>
<Font name="Cantarell Regular" size="24.0" />
</font>
</JFXButton>
<JFXButton fx:id="gridButton02" buttonType="RAISED" maxWidth="235.0" minWidth="179.0" onAction="#gridButton02Action" prefHeight="169.0" prefWidth="235.0" ripplerFill="#655252" text="leer 0,00€" textAlignment="CENTER" wrapText="true" GridPane.columnIndex="3">
<font>
<Font name="Cantarell Regular" size="24.0" />
</font>
</JFXButton>
<JFXButton fx:id="gridButton01" buttonType="RAISED" maxWidth="235.0" minWidth="179.0" onAction="#gridButton01Action" prefHeight="134.0" prefWidth="179.0" ripplerFill="#655252" text="leer 0,00€" textAlignment="CENTER" wrapText="true" GridPane.columnIndex="4">
<font>
<Font name="Cantarell Regular" size="24.0" />
</font>
</JFXButton>
<JFXButton fx:id="gridButton10" buttonType="RAISED" maxWidth="235.0" minWidth="179.0" onAction="#gridButton10Action" prefHeight="169.0" prefWidth="235.0" ripplerFill="#655252" text="leer 0,00€" textAlignment="CENTER" wrapText="true" GridPane.rowIndex="1">
<font>
<Font name="Cantarell Regular" size="24.0" />
</font>
</JFXButton>
<JFXButton fx:id="gridButton09" buttonType="RAISED" maxWidth="235.0" minWidth="179.0" onAction="#gridButton09Action" prefHeight="169.0" prefWidth="235.0" ripplerFill="#655252" text="leer 0,00€" textAlignment="CENTER" wrapText="true" GridPane.columnIndex="1" GridPane.rowIndex="1">
<font>
<Font name="Cantarell Regular" size="24.0" />
</font>
</JFXButton>
<JFXButton fx:id="gridButton08" buttonType="RAISED" maxWidth="235.0" minWidth="179.0" onAction="#gridButton08Action" prefHeight="169.0" prefWidth="235.0" ripplerFill="#655252" text="leer 0,00€" textAlignment="CENTER" wrapText="true" GridPane.columnIndex="2" GridPane.rowIndex="1">
<font>
<Font name="Cantarell Regular" size="24.0" />
</font>
</JFXButton>
<JFXButton fx:id="gridButton07" buttonType="RAISED" maxWidth="235.0" minWidth="179.0" onAction="#gridButton07Action" prefHeight="169.0" prefWidth="235.0" ripplerFill="#655252" text="leer 0,00€" textAlignment="CENTER" wrapText="true" GridPane.columnIndex="3" GridPane.rowIndex="1">
<font>
<Font name="Cantarell Regular" size="24.0" />
</font>
</JFXButton>
<JFXButton fx:id="gridButton06" buttonType="RAISED" maxWidth="235.0" minWidth="179.0" onAction="#gridButton06Action" prefHeight="169.0" prefWidth="235.0" ripplerFill="#655252" text="leer 0,00€" textAlignment="CENTER" wrapText="true" GridPane.columnIndex="4" GridPane.rowIndex="1">
<font>
<Font name="Cantarell Regular" size="24.0" />
</font>
</JFXButton>
<JFXButton fx:id="gridButton15" buttonType="RAISED" maxWidth="235.0" minWidth="179.0" onAction="#gridButton15Action" prefHeight="169.0" prefWidth="235.0" ripplerFill="#655252" text="leer 0,00€" textAlignment="CENTER" wrapText="true" GridPane.rowIndex="2">
<font>
<Font name="Cantarell Regular" size="24.0" />
</font>
</JFXButton>
<JFXButton fx:id="gridButton14" buttonType="RAISED" maxWidth="235.0" minWidth="179.0" onAction="#gridButton14Action" prefHeight="169.0" prefWidth="235.0" ripplerFill="#655252" text="leer 0,00€" textAlignment="CENTER" wrapText="true" GridPane.columnIndex="1" GridPane.rowIndex="2">
<font>
<Font name="Cantarell Regular" size="24.0" />
</font>
</JFXButton>
<JFXButton fx:id="gridButton13" buttonType="RAISED" maxWidth="235.0" minWidth="179.0" onAction="#gridButton13Action" prefHeight="169.0" prefWidth="235.0" ripplerFill="#655252" text="leer 0,00€" textAlignment="CENTER" wrapText="true" GridPane.columnIndex="2" GridPane.rowIndex="2">
<font>
<Font name="Cantarell Regular" size="24.0" />
</font>
</JFXButton>
<JFXButton fx:id="gridButton12" buttonType="RAISED" maxWidth="235.0" minWidth="179.0" onAction="#gridButton12Action" prefHeight="169.0" prefWidth="235.0" ripplerFill="#655252" text="leer 0,00€" textAlignment="CENTER" wrapText="true" GridPane.columnIndex="3" GridPane.rowIndex="2">
<font>
<Font name="Cantarell Regular" size="24.0" />
</font>
</JFXButton>
<JFXButton fx:id="gridButton11" buttonType="RAISED" maxWidth="235.0" minWidth="179.0" onAction="#gridButton11Action" prefHeight="169.0" prefWidth="235.0" ripplerFill="#655252" text="leer 0,00€" textAlignment="CENTER" wrapText="true" GridPane.columnIndex="4" GridPane.rowIndex="2">
<font>
<Font name="Cantarell Regular" size="24.0" />
</font>
</JFXButton>
<JFXButton fx:id="gridButton20" buttonType="RAISED" maxWidth="235.0" minWidth="179.0" onAction="#gridButton20Action" prefHeight="169.0" prefWidth="235.0" ripplerFill="#655252" text="leer 0,00€" textAlignment="CENTER" wrapText="true" GridPane.rowIndex="3">
<font>
<Font name="Cantarell Regular" size="24.0" />
</font>
</JFXButton>
<JFXButton fx:id="gridButton19" buttonType="RAISED" maxWidth="235.0" minWidth="179.0" onAction="#gridButton19Action" prefHeight="169.0" prefWidth="235.0" ripplerFill="#655252" text="leer 0,00€" textAlignment="CENTER" wrapText="true" GridPane.columnIndex="1" GridPane.rowIndex="3">
<font>
<Font name="Cantarell Regular" size="24.0" />
</font>
</JFXButton>
<JFXButton fx:id="gridButton18" buttonType="RAISED" maxWidth="235.0" minWidth="179.0" onAction="#gridButton18Action" prefHeight="169.0" prefWidth="235.0" ripplerFill="#655252" text="leer 0,00€" textAlignment="CENTER" wrapText="true" GridPane.columnIndex="2" GridPane.rowIndex="3">
<font>
<Font name="Cantarell Regular" size="24.0" />
</font>
</JFXButton>
<JFXButton fx:id="gridButton17" buttonType="RAISED" maxWidth="235.0" minWidth="179.0" onAction="#gridButton17Action" prefHeight="169.0" prefWidth="235.0" ripplerFill="#655252" text="leer 0,00€" textAlignment="CENTER" wrapText="true" GridPane.columnIndex="3" GridPane.rowIndex="3">
<font>
<Font name="Cantarell Regular" size="24.0" />
</font>
</JFXButton>
<JFXButton fx:id="gridButton16" buttonType="RAISED" maxWidth="235.0" minWidth="179.0" onAction="#gridButton16Action" prefHeight="169.0" prefWidth="235.0" ripplerFill="#655252" text="leer 0,00€" textAlignment="CENTER" wrapText="true" GridPane.columnIndex="4" GridPane.rowIndex="3">
<font>
<Font name="Cantarell Regular" size="24.0" />
</font>
</JFXButton>
<JFXButton fx:id="gridButton25" buttonType="RAISED" maxWidth="235.0" minWidth="179.0" onAction="#gridButton25Action" prefHeight="169.0" prefWidth="235.0" ripplerFill="#655252" text="leer 0,00€" textAlignment="CENTER" wrapText="true" GridPane.rowIndex="4">
<font>
<Font name="Cantarell Regular" size="24.0" />
</font>
</JFXButton>
<JFXButton fx:id="gridButton23" buttonType="RAISED" maxWidth="235.0" minWidth="179.0" onAction="#gridButton23Action" prefHeight="169.0" prefWidth="235.0" ripplerFill="#655252" text="leer 0,00€" textAlignment="CENTER" wrapText="true" GridPane.columnIndex="2" GridPane.rowIndex="4">
<font>
<Font name="Cantarell Regular" size="24.0" />
</font>
</JFXButton>
<JFXButton fx:id="gridButton22" buttonType="RAISED" maxWidth="235.0" minWidth="179.0" onAction="#gridButton22Action" prefHeight="169.0" prefWidth="235.0" ripplerFill="#655252" text="leer 0,00€" textAlignment="CENTER" wrapText="true" GridPane.columnIndex="3" GridPane.rowIndex="4">
<font>
<Font name="Cantarell Regular" size="24.0" />
</font>
</JFXButton>
<JFXButton fx:id="gridButton21" buttonType="RAISED" maxWidth="235.0" minWidth="179.0" onAction="#gridButton21Action" prefHeight="169.0" prefWidth="235.0" ripplerFill="#655252" text="leer 0,00€" textAlignment="CENTER" wrapText="true" GridPane.columnIndex="4" GridPane.rowIndex="4">
<font>
<Font name="Cantarell Regular" size="24.0" />
</font>
</JFXButton>
<JFXButton fx:id="gridButton24" buttonType="RAISED" maxWidth="235.0" minWidth="179.0" onAction="#gridButton24Action" prefHeight="169.0" prefWidth="235.0" ripplerFill="#655252" text="leer 0,00€" textAlignment="CENTER" wrapText="true" GridPane.columnIndex="1" GridPane.rowIndex="4">
<font>
<Font name="Cantarell Regular" size="24.0" />
</font>
</JFXButton>
</children>
</GridPane>
<Button fx:id="btnPrintBill" contentDisplay="CENTER" defaultButton="true" graphicTextGap="1.0" layoutX="75.0" layoutY="599.0" maxHeight="88.0" minHeight="75.0" mnemonicParsing="false" onAction="#btnPrintBillAction" prefHeight="88.0" prefWidth="258.0" text="Drucken" wrapText="true">
<font>
<Font name="Cantarell Bold" size="48.0" />
</font>
</Button>
<Button fx:id="btnDeleteSelectedPosition" layoutX="43.0" layoutY="475.0" mnemonicParsing="false" onAction="#btnDeleteSelectedPositionAction" prefHeight="17.0" prefWidth="332.0" text="Ausgewählte Position löschen" textAlignment="CENTER">
<font>
<Font name="Cantarell Regular" size="20.0" />
</font>
</Button>
<Label fx:id="labelAllPrize" alignment="CENTER" contentDisplay="CENTER" layoutX="10.0" layoutY="505.0" prefHeight="15.0" prefWidth="386.0" text="0,00 €" textAlignment="CENTER">
<font>
<Font name="Open Sans" size="70.0" />
</font>
</Label>
<Label fx:id="labelJobCounter" alignment="TOP_RIGHT" contentDisplay="CENTER" layoutX="5.0" layoutY="45.0" prefHeight="34.0" prefWidth="392.0" text="Auftragsnummer: 0" textAlignment="CENTER">
<font>
<Font name="Cantarell Regular" size="26.0" />
</font>
</Label>
<Label fx:id="labelTime" alignment="TOP_RIGHT" layoutX="7.0" layoutY="11.0" maxHeight="33.0" maxWidth="392.0" minHeight="33.0" minWidth="392.0" prefHeight="33.0" prefWidth="392.0" text="Uhrzeit: 12:15">
<font>
<Font name="Cantarell Regular" size="26.0" />
</font>
</Label>
<JFXButton fx:id="btnLock" buttonType="RAISED" cancelButton="true" layoutX="1.0" layoutY="6.0" lineSpacing="2.0" onAction="#btnLockAction" prefHeight="42.0" prefWidth="180.0" ripplerFill="BLACK" text="Kasse sperren" textAlignment="CENTER" textFill="#c91c1c" textOverrun="LEADING_WORD_ELLIPSIS">
<font>
<Font name="Cantarell Regular" size="19.0" />
</font>
</JFXButton>
<Line endX="800.0" layoutX="62.0" layoutY="465.0" rotate="90.0" startX="-100.0" strokeWidth="4.0" />
</children>
</AnchorPane>
</content>
</Tab>
</tabs>
</TabPane>
</children>
</AnchorPane>

View File

@ -1 +0,0 @@
/* JavaFX CSS - Leave this comment until you have at least create one rule which uses -fx-Property */

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 577 B

View File

@ -1,8 +0,0 @@
<?xml version="1.0" encoding="ASCII"?>
<anttasks:AntTask xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:anttasks="http://org.eclipse.fx.ide.jdt/1.0" buildDirectory="${project}/build">
<deploy>
<application name="FxPWMaster01"/>
<info/>
</deploy>
<signjar/>
</anttasks:AntTask>

116
pom.xml Normal file
View File

@ -0,0 +1,116 @@
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com</groupId>
<artifactId>jFxKasse</artifactId>
<version>0.4.0</version>
<name>jFxKasse</name>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>21</maven.compiler.source>
<maven.compiler.target>21</maven.compiler.target>
<maven.compiler.release>21</maven.compiler.release>
<javafx.version>23.0.1</javafx.version>
</properties>
<dependencies>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>6.0.3</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-controls</artifactId>
<version>${javafx.version}</version>
</dependency>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-fxml</artifactId>
<version>${javafx.version}</version>
</dependency>
<dependency>
<groupId>com.jfoenix</groupId>
<artifactId>jfoenix</artifactId>
<version>9.0.10</version>
</dependency>
<dependency>
<groupId>org.xerial</groupId>
<artifactId>sqlite-jdbc</artifactId>
<version>3.51.2.0</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.15.0</version>
<configuration>
<source>21</source>
<target>21</target>
<release>21</release>
<showWarnings>true</showWarnings>
<showDeprecation>true</showDeprecation>
</configuration>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>3.6.3</version>
<executions>
<execution>
<goals>
<goal>java</goal>
</goals>
</execution>
</executions>
<configuration>
<mainClass>com.jFxKasse.application.Main</mainClass>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.6.1</version>
<configuration>
<finalName>jFxKasse</finalName>
<shadedArtifactAttached>true</shadedArtifactAttached>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>com.jFxKasse.application.JavaFX11Main</mainClass>
</transformer>
</transformers>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.openjfx</groupId>
<artifactId>javafx-maven-plugin</artifactId>
<version>0.0.8</version>
<configuration>
<mainClass>com.jFxKasse.application.JavaFX11Main</mainClass>
</configuration>
</plugin>
</plugins>
</build>
</project>

BIN
screenshots/jobs Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 123 KiB

BIN
screenshots/newjob Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 128 KiB

BIN
screenshots/positions Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 107 KiB

BIN
screenshots/settings Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 83 KiB

View File

@ -1,93 +0,0 @@
package application;
import java.io.File;
import javafx.animation.Animation;
import javafx.animation.KeyFrame;
import javafx.animation.Timeline;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.stage.Stage;
import javafx.util.Duration;
import javafx.scene.Scene;
import javafx.scene.layout.AnchorPane;
public class Main extends Application
{
private MainWindowController mwc;
private DBController dbc = new DBController(this);
private Stage primaryStage;
@Override
public void start(Stage primaryStage)
{
this.primaryStage = primaryStage;
mainWindow();
}
private void mainWindow()
{
try {
FXMLLoader loader = new FXMLLoader(
getClass().getResource("MainWindow.fxml"));
AnchorPane pane = loader.load();
primaryStage.setTitle("jFxKasse"); // Title of window
mwc = loader.getController();
mwc.setMain(this, dbc);
firstStart();
Scene scene = new Scene(pane);
scene.getStylesheets()
.add(Main.class.getResource("application.css").toExternalForm());
primaryStage.setScene(scene);
primaryStage.show(); // shows the stage
Timeline timeline = new Timeline(
new KeyFrame(Duration.seconds(1), ev -> {
mwc.updateTimeLabel(); // update time
}));
timeline.setCycleCount(Animation.INDEFINITE);
timeline.play();
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args)
{
launch(args);
}
/**
* Checks if the config.xml is preset.
* @author hendrik
*/
private void firstStart() throws Exception
{
if (mwc.loadSettings()) {
// config.xml found, app starting normal
System.out.println("XML gefunden!");
mwc.initUI(); // Starting the UI elements
mwc.setDBLabel(); // Set databese labels
dbc.dbname = mwc.getDatabaseName(); // handover database name
dbc.connectDatabase(); // estabishing DB conection
mwc.fillTablePositionen(); // fill TreeTable 'Positionen'
mwc.fillCategory();
mwc.fillTableJobs();
mwc.loadGridButtons();
mwc.getSelectedCat(); //Load DB entries in Chois Box
mwc.createNewJob();
} else {
// config.xml NOT found, first start of app
System.out.println("keine XML gefunden!");
mwc.blockUI(true); // disable UI elements that need DB
mwc.blockUnlock();
File dir = new File(System.getProperty("user.home") + "/bin/jFxKasse");
dir.mkdir(); // Create new Subfolder
}
}
}

View File

@ -1,442 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<?import com.jfoenix.controls.JFXButton?>
<?import com.jfoenix.controls.JFXTextField?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.ChoiceBox?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.Tab?>
<?import javafx.scene.control.TabPane?>
<?import javafx.scene.control.TitledPane?>
<?import javafx.scene.control.TreeTableColumn?>
<?import javafx.scene.control.TreeTableView?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.ColumnConstraints?>
<?import javafx.scene.layout.GridPane?>
<?import javafx.scene.layout.RowConstraints?>
<?import javafx.scene.shape.Line?>
<?import javafx.scene.text.Font?>
<AnchorPane fx:id="mainAnchorpane" maxHeight="732.0" maxWidth="1366.0" minHeight="732.0" minWidth="1366.0" prefHeight="732.0" prefWidth="1366.0" xmlns="http://javafx.com/javafx/9" xmlns:fx="http://javafx.com/fxml/1" fx:controller="application.MainWindowController">
<children>
<TabPane layoutX="4.0" layoutY="5.0" nodeOrientation="RIGHT_TO_LEFT" prefHeight="924.0" prefWidth="1536.0" tabClosingPolicy="UNAVAILABLE" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
<tabs>
<Tab text="Einstellungen">
<content>
<AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="180.0" prefWidth="200.0">
<children>
<Button fx:id="ueberbtn" layoutX="84.0" layoutY="79.0" mnemonicParsing="false" onAction="#ueberbtnAction" prefHeight="0.0" prefWidth="46.0" text="Über" />
<TitledPane alignment="CENTER" animated="false" collapsible="false" contentDisplay="CENTER" layoutX="790.0" layoutY="10.0" prefHeight="270.0" prefWidth="566.0" text="Datenbank Einstellungen">
<content>
<AnchorPane fx:id="paneDB" minHeight="0.0" minWidth="0.0" prefHeight="238.0" prefWidth="564.0">
<children>
<Label fx:id="labelDBName" alignment="TOP_RIGHT" contentDisplay="RIGHT" layoutX="329.0" layoutY="10.0" prefHeight="34.0" prefWidth="229.0" text="Datenbankname:">
<font>
<Font name="Cantarell Regular" size="18.0" />
</font>
</Label>
<JFXTextField fx:id="tftNewDBName" alignment="CENTER" layoutX="25.0" layoutY="10.0" prefHeight="25.0" prefWidth="376.0" />
<Label fx:id="labelDBStatus" alignment="TOP_RIGHT" contentDisplay="RIGHT" layoutX="1.0" layoutY="75.0" prefHeight="34.0" prefWidth="551.0" text="Keine Datenbank gefunden!">
<font>
<Font name="Cantarell Regular" size="18.0" />
</font>
</Label>
<Button fx:id="btnCreateNewDatabase" layoutX="317.0" layoutY="126.0" mnemonicParsing="false" onAction="#btnCreateNewDatabaseAction" text="Neue Datenbank anlegen">
<font>
<Font name="Cantarell Regular" size="13.0" />
</font>
</Button>
<Button fx:id="btnOpenFolder" layoutX="99.0" layoutY="126.0" mnemonicParsing="false" onAction="#btnOpenFolderAction" text="Speicherort öffnen">
<font>
<Font name="Cantarell Regular" size="13.0" />
</font>
</Button>
</children>
</AnchorPane>
</content>
<font>
<Font name="Cantarell Regular" size="13.0" />
</font>
</TitledPane>
<TitledPane fx:id="titlePaneCat" alignment="CENTER" animated="false" collapsible="false" contentDisplay="CENTER" layoutX="170.0" layoutY="10.0" prefHeight="270.0" prefWidth="566.0" text="Kategorien (z.B. Getränke, Essen oder Kuchen)" textAlignment="CENTER">
<content>
<AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="260.0" prefWidth="564.0">
<children>
<Label fx:id="labelCat01" alignment="TOP_RIGHT" contentDisplay="RIGHT" layoutX="434.0" layoutY="10.0" prefHeight="34.0" prefWidth="124.0" text="Kategorie 1:">
<font>
<Font name="Cantarell Regular" size="18.0" />
</font>
</Label>
<Label fx:id="labelCat02" alignment="TOP_RIGHT" contentDisplay="RIGHT" layoutX="442.0" layoutY="50.0" prefHeight="34.0" prefWidth="116.0" text="Kategorie 2:">
<font>
<Font name="Cantarell Regular" size="18.0" />
</font>
</Label>
<Label fx:id="labelCat05" alignment="TOP_RIGHT" contentDisplay="RIGHT" layoutX="448.0" layoutY="170.0" prefHeight="34.0" prefWidth="110.0" text="Kategorie 5:">
<font>
<Font name="Cantarell Regular" size="18.0" />
</font>
</Label>
<Label fx:id="labelCat04" alignment="TOP_RIGHT" contentDisplay="RIGHT" layoutX="454.0" layoutY="130.0" prefHeight="34.0" prefWidth="104.0" text="Kategorie 4:">
<font>
<Font name="Cantarell Regular" size="18.0" />
</font>
</Label>
<Label fx:id="labelCat03" alignment="TOP_RIGHT" contentDisplay="RIGHT" layoutX="451.0" layoutY="90.0" prefHeight="34.0" prefWidth="107.0" text="Kategorie 3:">
<font>
<Font name="Cantarell Regular" size="18.0" />
</font>
</Label>
<JFXTextField fx:id="tftKat01" alignment="CENTER" layoutX="50.0" layoutY="5.0" prefHeight="25.0" prefWidth="376.0" />
<JFXTextField fx:id="tftKat02" alignment="CENTER" layoutX="50.0" layoutY="45.0" prefHeight="25.0" prefWidth="376.0" />
<JFXTextField fx:id="tftKat03" alignment="CENTER" layoutX="50.0" layoutY="85.0" prefHeight="25.0" prefWidth="376.0" />
<JFXTextField fx:id="tftKat04" alignment="CENTER" layoutX="50.0" layoutY="125.0" prefHeight="25.0" prefWidth="376.0" />
<JFXTextField fx:id="tftKat05" alignment="CENTER" layoutX="50.0" layoutY="165.0" prefHeight="25.0" prefWidth="376.0" />
<Button fx:id="btnSaveCat" layoutX="200.0" layoutY="204.0" mnemonicParsing="false" onAction="#btnSaveCatAction" text="Kategorien speichern">
<font>
<Font name="Cantarell Regular" size="13.0" />
</font>
</Button>
</children>
</AnchorPane>
</content>
<font>
<Font name="Cantarell Regular" size="13.0" />
</font>
</TitledPane>
</children>
</AnchorPane>
</content>
</Tab>
<Tab fx:id="tapPosEdit" text="Positionen bearbeiten">
<content>
<AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="180.0" prefWidth="200.0">
<children>
<TreeTableView fx:id="entryTreeTable" layoutX="11.0" layoutY="10.0" prefHeight="502.0" prefWidth="1346.0">
<placeholder>
<Label text="" />
</placeholder>
<columns>
<TreeTableColumn fx:id="columnColor" editable="false" maxWidth="428.0" minWidth="119.333251953125" prefWidth="119.333251953125" resizable="false" sortable="false" text="Farbe" />
<TreeTableColumn fx:id="columnCat" editable="false" maxWidth="800.0" minWidth="94.0" prefWidth="300.0" resizable="false" sortable="false" text="Kategorie" />
<TreeTableColumn fx:id="columnPrize" editable="false" maxWidth="693.3333129882812" minWidth="44.33331298828125" prefWidth="140.33331298828125" resizable="false" sortable="false" text="Preis" />
<TreeTableColumn fx:id="columnPositionsEdit" editable="false" maxWidth="1581.6666870117188" minWidth="38.0" prefWidth="596.333251953125" resizable="false" sortable="false" text="Positionen" />
<TreeTableColumn fx:id="columnPosnumber" editable="false" maxWidth="1218.0" minWidth="59.0" prefWidth="181.6666259765625" resizable="false" sortable="false" text="Nummer" />
</columns>
<columnResizePolicy>
<TreeTableView fx:constant="CONSTRAINED_RESIZE_POLICY" />
</columnResizePolicy>
</TreeTableView>
<Button fx:id="btnSaveEntry" layoutX="494.0" layoutY="631.0" mnemonicParsing="false" onAction="#btnSaveEntryAction" text="Ausgewählten Eintrag speichern">
<font>
<Font name="Cantarell Regular" size="17.0" />
</font>
</Button>
<Button fx:id="btnClearEntry" layoutX="462.0" layoutY="525.0" mnemonicParsing="false" onAction="#btnClearEntryAction" text="Ausgewählten Eintrag zurücksetzten">
<font>
<Font name="Cantarell Regular" size="17.0" />
</font>
</Button>
<TitledPane fx:id="titledPaneEntry" alignment="CENTER" animated="false" collapsible="false" contentDisplay="CENTER" layoutX="792.0" layoutY="525.0" prefHeight="163.0" prefWidth="565.0" text="Eintrag editieren">
<content>
<AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="180.0" prefWidth="200.0">
<children>
<Label fx:id="labelNewPosition" alignment="TOP_RIGHT" contentDisplay="RIGHT" layoutX="455.0" layoutY="10.0" prefHeight="34.0" prefWidth="105.0" text="Position:">
<font>
<Font name="Cantarell Regular" size="18.0" />
</font>
</Label>
<JFXTextField fx:id="tftNewPosition" alignment="CENTER" layoutX="160.0" layoutY="10.0" prefHeight="25.0" prefWidth="279.0">
<font>
<Font name="Cantarell Regular" size="13.0" />
</font>
</JFXTextField>
<Label fx:id="labelNewValue" alignment="TOP_RIGHT" contentDisplay="RIGHT" layoutX="442.0" layoutY="50.0" prefHeight="34.0" prefWidth="118.0" text="Preis in Euro:">
<font>
<Font name="Cantarell Regular" size="18.0" />
</font>
</Label>
<JFXTextField fx:id="tftNewValue" alignment="CENTER" labelFloat="true" layoutX="380.0" layoutY="50.0" prefHeight="25.0" prefWidth="58.0">
<font>
<Font name="Cantarell Regular" size="13.0" />
</font>
</JFXTextField>
<Label fx:id="labelNewColor" alignment="TOP_RIGHT" contentDisplay="RIGHT" layoutX="455.0" layoutY="90.0" prefHeight="34.0" prefWidth="105.0" text="Farbe:">
<font>
<Font name="Cantarell Regular" size="18.0" />
</font>
</Label>
<ChoiceBox fx:id="colorChoise" layoutX="346.0" layoutY="90.0" prefHeight="25.0" prefWidth="96.0" />
<Label fx:id="labelSelectCat" alignment="TOP_RIGHT" contentDisplay="RIGHT" layoutX="204.0" layoutY="90.0" prefHeight="34.0" prefWidth="105.0" text="Kategorie:">
<font>
<Font name="Cantarell Regular" size="18.0" />
</font>
</Label>
<ChoiceBox fx:id="catChoise" layoutX="25.0" layoutY="90.0" prefHeight="25.0" prefWidth="180.0" />
</children>
</AnchorPane>
</content>
<font>
<Font name="Cantarell Regular" size="13.0" />
</font>
</TitledPane>
</children>
</AnchorPane>
</content>
</Tab>
<Tab text="Aufträge">
<content>
<AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="850.0" prefWidth="1536.0">
<children>
<TreeTableView fx:id="jobsTreeTable" layoutX="11.0" layoutY="10.0" prefHeight="541.0" prefWidth="1346.0">
<placeholder>
<Label text="" />
</placeholder>
<columns>
<TreeTableColumn fx:id="columnJobValue" editable="false" prefWidth="111.0" resizable="false" text="Betrag" />
<TreeTableColumn fx:id="columnState" editable="false" prefWidth="101.0" resizable="false" text="Zustand" />
<TreeTableColumn fx:id="columnPositions" editable="false" prefWidth="861.0" resizable="false" sortable="false" text="Positionen" />
<TreeTableColumn fx:id="columnTime" editable="false" prefWidth="159.0" resizable="false" text="Zeit" />
<TreeTableColumn fx:id="columnJobNumber" editable="false" maxWidth="3000.0" prefWidth="110.666748046875" resizable="false" text="Nummer" />
</columns>
</TreeTableView>
<Button fx:id="btnReprintJob" layoutX="378.0" layoutY="603.0" mnemonicParsing="false" onAction="#btnReprintJobAction" text="Ausgewählter Auftrag drucken">
<font>
<Font name="Cantarell Regular" size="17.0" />
</font>
</Button>
<TitledPane fx:id="titlePaneStats" alignment="CENTER" collapsible="false" contentDisplay="CENTER" layoutX="957.0" layoutY="561.0" prefHeight="118.0" prefWidth="400.0" text="Statistik - 30.03.2018 15:15 Uhr">
<content>
<AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="92.0" prefWidth="414.0">
<children>
<Label fx:id="labelJobCount" alignment="TOP_RIGHT" contentDisplay="RIGHT" layoutX="41.0" layoutY="2.0" prefHeight="34.0" prefWidth="340.0" text="Anzahl Aufträge: 2781">
<font>
<Font name="Cantarell Regular" size="18.0" />
</font>
</Label>
<Label fx:id="labelAvgJob" alignment="TOP_RIGHT" contentDisplay="RIGHT" layoutX="41.0" layoutY="30.0" prefHeight="34.0" prefWidth="340.0" text="Durchschnittlicher Auftragswert: 12,90€">
<font>
<Font name="Cantarell Regular" size="18.0" />
</font>
</Label>
<Label fx:id="labelAllValue" alignment="TOP_RIGHT" contentDisplay="RIGHT" layoutX="41.0" layoutY="60.0" prefHeight="34.0" prefWidth="340.0" text="Gesamt: 1088,48€">
<font>
<Font name="Cantarell Regular" size="18.0" />
</font>
</Label>
</children>
</AnchorPane>
</content>
</TitledPane>
<Button fx:id="btnCancelJob" layoutX="44.0" layoutY="603.0" mnemonicParsing="false" onAction="#btnCancelJobAction" text="Ausgewählter Auftrag stornieren">
<font>
<Font name="Cantarell Regular" size="17.0" />
</font>
</Button>
<Button fx:id="btnCalcStats" layoutX="712.0" layoutY="603.0" mnemonicParsing="false" onAction="#btnCalcStatsAction" text="Statistiken berrechnen">
<font>
<Font name="Cantarell Regular" size="17.0" />
</font>
</Button>
</children>
</AnchorPane>
</content>
</Tab>
<Tab text="Neuer Auftrag">
<content>
<AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="850.0" prefWidth="1536.0">
<children>
<TreeTableView fx:id="tableCurrentOrder" layoutX="15.0" layoutY="85.0" prefHeight="379.0" prefWidth="382.0">
<placeholder>
<Label text="" />
</placeholder>
<columns>
<TreeTableColumn fx:id="columnPosition" editable="false" prefWidth="320.0" resizable="false" sortable="false" text="Position" />
<TreeTableColumn fx:id="columnQuantity" editable="false" prefWidth="60.0" resizable="false" sortable="false" text="Anzahl" />
</columns>
<columnResizePolicy>
<TreeTableView fx:constant="CONSTRAINED_RESIZE_POLICY" />
</columnResizePolicy>
</TreeTableView>
<GridPane gridLinesVisible="true" layoutX="430.0" layoutY="15.0" prefHeight="670.0" prefWidth="920.0">
<columnConstraints>
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
</columnConstraints>
<rowConstraints>
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
</rowConstraints>
<children>
<JFXButton fx:id="gridButton04" buttonType="RAISED" maxWidth="235.0" minWidth="179.0" onAction="#gridButton04Action" prefHeight="169.0" prefWidth="235.0" ripplerFill="#655252" text="leer 0,00€" textAlignment="CENTER" wrapText="true" GridPane.columnIndex="1">
<font>
<Font name="Cantarell Regular" size="24.0" />
</font>
</JFXButton>
<JFXButton fx:id="gridButton05" buttonType="RAISED" maxWidth="235.0" minWidth="179.0" onAction="#gridButton05Action" prefHeight="169.0" prefWidth="235.0" ripplerFill="#655252" text="leer 0,00€" textAlignment="CENTER" wrapText="true">
<font>
<Font name="Cantarell Regular" size="24.0" />
</font>
</JFXButton>
<JFXButton fx:id="gridButton03" buttonType="RAISED" maxWidth="235.0" minWidth="179.0" onAction="#gridButton03Action" prefHeight="169.0" prefWidth="235.0" ripplerFill="#655252" text="leer 0,00€" textAlignment="CENTER" wrapText="true" GridPane.columnIndex="2">
<font>
<Font name="Cantarell Regular" size="24.0" />
</font>
</JFXButton>
<JFXButton fx:id="gridButton02" buttonType="RAISED" maxWidth="235.0" minWidth="179.0" onAction="#gridButton02Action" prefHeight="169.0" prefWidth="235.0" ripplerFill="#655252" text="leer 0,00€" textAlignment="CENTER" wrapText="true" GridPane.columnIndex="3">
<font>
<Font name="Cantarell Regular" size="24.0" />
</font>
</JFXButton>
<JFXButton fx:id="gridButton01" buttonType="RAISED" maxWidth="235.0" minWidth="179.0" onAction="#gridButton01Action" prefHeight="134.0" prefWidth="179.0" ripplerFill="#655252" text="leer 0,00€" textAlignment="CENTER" wrapText="true" GridPane.columnIndex="4">
<font>
<Font name="Cantarell Regular" size="24.0" />
</font>
</JFXButton>
<JFXButton fx:id="gridButton10" buttonType="RAISED" maxWidth="235.0" minWidth="179.0" onAction="#gridButton10Action" prefHeight="169.0" prefWidth="235.0" ripplerFill="#655252" text="leer 0,00€" textAlignment="CENTER" wrapText="true" GridPane.rowIndex="1">
<font>
<Font name="Cantarell Regular" size="24.0" />
</font>
</JFXButton>
<JFXButton fx:id="gridButton09" buttonType="RAISED" maxWidth="235.0" minWidth="179.0" onAction="#gridButton09Action" prefHeight="169.0" prefWidth="235.0" ripplerFill="#655252" text="leer 0,00€" textAlignment="CENTER" wrapText="true" GridPane.columnIndex="1" GridPane.rowIndex="1">
<font>
<Font name="Cantarell Regular" size="24.0" />
</font>
</JFXButton>
<JFXButton fx:id="gridButton08" buttonType="RAISED" maxWidth="235.0" minWidth="179.0" onAction="#gridButton08Action" prefHeight="169.0" prefWidth="235.0" ripplerFill="#655252" text="leer 0,00€" textAlignment="CENTER" wrapText="true" GridPane.columnIndex="2" GridPane.rowIndex="1">
<font>
<Font name="Cantarell Regular" size="24.0" />
</font>
</JFXButton>
<JFXButton fx:id="gridButton07" buttonType="RAISED" maxWidth="235.0" minWidth="179.0" onAction="#gridButton07Action" prefHeight="169.0" prefWidth="235.0" ripplerFill="#655252" text="leer 0,00€" textAlignment="CENTER" wrapText="true" GridPane.columnIndex="3" GridPane.rowIndex="1">
<font>
<Font name="Cantarell Regular" size="24.0" />
</font>
</JFXButton>
<JFXButton fx:id="gridButton06" buttonType="RAISED" maxWidth="235.0" minWidth="179.0" onAction="#gridButton06Action" prefHeight="169.0" prefWidth="235.0" ripplerFill="#655252" text="leer 0,00€" textAlignment="CENTER" wrapText="true" GridPane.columnIndex="4" GridPane.rowIndex="1">
<font>
<Font name="Cantarell Regular" size="24.0" />
</font>
</JFXButton>
<JFXButton fx:id="gridButton15" buttonType="RAISED" maxWidth="235.0" minWidth="179.0" onAction="#gridButton15Action" prefHeight="169.0" prefWidth="235.0" ripplerFill="#655252" text="leer 0,00€" textAlignment="CENTER" wrapText="true" GridPane.rowIndex="2">
<font>
<Font name="Cantarell Regular" size="24.0" />
</font>
</JFXButton>
<JFXButton fx:id="gridButton14" buttonType="RAISED" maxWidth="235.0" minWidth="179.0" onAction="#gridButton14Action" prefHeight="169.0" prefWidth="235.0" ripplerFill="#655252" text="leer 0,00€" textAlignment="CENTER" wrapText="true" GridPane.columnIndex="1" GridPane.rowIndex="2">
<font>
<Font name="Cantarell Regular" size="24.0" />
</font>
</JFXButton>
<JFXButton fx:id="gridButton13" buttonType="RAISED" maxWidth="235.0" minWidth="179.0" onAction="#gridButton13Action" prefHeight="169.0" prefWidth="235.0" ripplerFill="#655252" text="leer 0,00€" textAlignment="CENTER" wrapText="true" GridPane.columnIndex="2" GridPane.rowIndex="2">
<font>
<Font name="Cantarell Regular" size="24.0" />
</font>
</JFXButton>
<JFXButton fx:id="gridButton12" buttonType="RAISED" maxWidth="235.0" minWidth="179.0" onAction="#gridButton12Action" prefHeight="169.0" prefWidth="235.0" ripplerFill="#655252" text="leer 0,00€" textAlignment="CENTER" wrapText="true" GridPane.columnIndex="3" GridPane.rowIndex="2">
<font>
<Font name="Cantarell Regular" size="24.0" />
</font>
</JFXButton>
<JFXButton fx:id="gridButton11" buttonType="RAISED" maxWidth="235.0" minWidth="179.0" onAction="#gridButton11Action" prefHeight="169.0" prefWidth="235.0" ripplerFill="#655252" text="leer 0,00€" textAlignment="CENTER" wrapText="true" GridPane.columnIndex="4" GridPane.rowIndex="2">
<font>
<Font name="Cantarell Regular" size="24.0" />
</font>
</JFXButton>
<JFXButton fx:id="gridButton20" buttonType="RAISED" maxWidth="235.0" minWidth="179.0" onAction="#gridButton20Action" prefHeight="169.0" prefWidth="235.0" ripplerFill="#655252" text="leer 0,00€" textAlignment="CENTER" wrapText="true" GridPane.rowIndex="3">
<font>
<Font name="Cantarell Regular" size="24.0" />
</font>
</JFXButton>
<JFXButton fx:id="gridButton19" buttonType="RAISED" maxWidth="235.0" minWidth="179.0" onAction="#gridButton19Action" prefHeight="169.0" prefWidth="235.0" ripplerFill="#655252" text="leer 0,00€" textAlignment="CENTER" wrapText="true" GridPane.columnIndex="1" GridPane.rowIndex="3">
<font>
<Font name="Cantarell Regular" size="24.0" />
</font>
</JFXButton>
<JFXButton fx:id="gridButton18" buttonType="RAISED" maxWidth="235.0" minWidth="179.0" onAction="#gridButton18Action" prefHeight="169.0" prefWidth="235.0" ripplerFill="#655252" text="leer 0,00€" textAlignment="CENTER" wrapText="true" GridPane.columnIndex="2" GridPane.rowIndex="3">
<font>
<Font name="Cantarell Regular" size="24.0" />
</font>
</JFXButton>
<JFXButton fx:id="gridButton17" buttonType="RAISED" maxWidth="235.0" minWidth="179.0" onAction="#gridButton17Action" prefHeight="169.0" prefWidth="235.0" ripplerFill="#655252" text="leer 0,00€" textAlignment="CENTER" wrapText="true" GridPane.columnIndex="3" GridPane.rowIndex="3">
<font>
<Font name="Cantarell Regular" size="24.0" />
</font>
</JFXButton>
<JFXButton fx:id="gridButton16" buttonType="RAISED" maxWidth="235.0" minWidth="179.0" onAction="#gridButton16Action" prefHeight="169.0" prefWidth="235.0" ripplerFill="#655252" text="leer 0,00€" textAlignment="CENTER" wrapText="true" GridPane.columnIndex="4" GridPane.rowIndex="3">
<font>
<Font name="Cantarell Regular" size="24.0" />
</font>
</JFXButton>
<JFXButton fx:id="gridButton25" buttonType="RAISED" maxWidth="235.0" minWidth="179.0" onAction="#gridButton25Action" prefHeight="169.0" prefWidth="235.0" ripplerFill="#655252" text="leer 0,00€" textAlignment="CENTER" wrapText="true" GridPane.rowIndex="4">
<font>
<Font name="Cantarell Regular" size="24.0" />
</font>
</JFXButton>
<JFXButton fx:id="gridButton23" buttonType="RAISED" maxWidth="235.0" minWidth="179.0" onAction="#gridButton23Action" prefHeight="169.0" prefWidth="235.0" ripplerFill="#655252" text="leer 0,00€" textAlignment="CENTER" wrapText="true" GridPane.columnIndex="2" GridPane.rowIndex="4">
<font>
<Font name="Cantarell Regular" size="24.0" />
</font>
</JFXButton>
<JFXButton fx:id="gridButton22" buttonType="RAISED" maxWidth="235.0" minWidth="179.0" onAction="#gridButton22Action" prefHeight="169.0" prefWidth="235.0" ripplerFill="#655252" text="leer 0,00€" textAlignment="CENTER" wrapText="true" GridPane.columnIndex="3" GridPane.rowIndex="4">
<font>
<Font name="Cantarell Regular" size="24.0" />
</font>
</JFXButton>
<JFXButton fx:id="gridButton21" buttonType="RAISED" maxWidth="235.0" minWidth="179.0" onAction="#gridButton21Action" prefHeight="169.0" prefWidth="235.0" ripplerFill="#655252" text="leer 0,00€" textAlignment="CENTER" wrapText="true" GridPane.columnIndex="4" GridPane.rowIndex="4">
<font>
<Font name="Cantarell Regular" size="24.0" />
</font>
</JFXButton>
<JFXButton fx:id="gridButton24" buttonType="RAISED" maxWidth="235.0" minWidth="179.0" onAction="#gridButton24Action" prefHeight="169.0" prefWidth="235.0" ripplerFill="#655252" text="leer 0,00€" textAlignment="CENTER" wrapText="true" GridPane.columnIndex="1" GridPane.rowIndex="4">
<font>
<Font name="Cantarell Regular" size="24.0" />
</font>
</JFXButton>
</children>
</GridPane>
<Button fx:id="btnPrintBill" contentDisplay="CENTER" defaultButton="true" graphicTextGap="1.0" layoutX="75.0" layoutY="599.0" maxHeight="88.0" minHeight="75.0" mnemonicParsing="false" onAction="#btnPrintBillAction" prefHeight="88.0" prefWidth="258.0" text="Drucken" textAlignment="CENTER" wrapText="true">
<font>
<Font name="Cantarell Bold" size="48.0" />
</font>
</Button>
<Button fx:id="btnDeleteSelectedPosition" layoutX="43.0" layoutY="475.0" mnemonicParsing="false" onAction="#btnDeleteSelectedPositionAction" prefHeight="17.0" prefWidth="332.0" text="Ausgewählte Position löschen" textAlignment="CENTER">
<font>
<Font name="Cantarell Regular" size="20.0" />
</font>
</Button>
<Label fx:id="labelAllPrize" alignment="CENTER" contentDisplay="CENTER" layoutX="10.0" layoutY="511.0" prefHeight="15.0" prefWidth="386.0" text="0,00 €" textAlignment="CENTER">
<font>
<Font name="Cantarell Regular" size="70.0" />
</font>
</Label>
<Label fx:id="labelJobCounter" alignment="TOP_RIGHT" contentDisplay="CENTER" layoutX="5.0" layoutY="45.0" prefHeight="34.0" prefWidth="392.0" text="Auftragsnummer: 0" textAlignment="CENTER">
<font>
<Font name="Cantarell Regular" size="26.0" />
</font>
</Label>
<Label fx:id="labelTime" alignment="TOP_RIGHT" layoutX="7.0" layoutY="11.0" maxHeight="33.0" maxWidth="392.0" minHeight="33.0" minWidth="392.0" prefHeight="33.0" prefWidth="392.0" text="Uhrzeit: 12:15">
<font>
<Font name="Cantarell Regular" size="26.0" />
</font>
</Label>
<JFXButton fx:id="btnLock" buttonType="RAISED" cancelButton="true" layoutX="1.0" layoutY="6.0" lineSpacing="2.0" onAction="#btnLockAction" prefHeight="42.0" prefWidth="180.0" ripplerFill="BLACK" text="Kasse sperren" textAlignment="CENTER" textFill="#c91c1c" textOverrun="LEADING_WORD_ELLIPSIS">
<font>
<Font name="Cantarell Regular" size="19.0" />
</font>
</JFXButton>
<Line endX="800.0" layoutX="62.0" layoutY="465.0" rotate="90.0" startX="-100.0" strokeWidth="4.0" />
</children>
</AnchorPane>
</content>
</Tab>
</tabs>
</TabPane>
</children>
</AnchorPane>

File diff suppressed because it is too large Load Diff

View File

@ -1 +0,0 @@
/* JavaFX CSS - Leave this comment until you have at least create one rule which uses -fx-Property */

View File

@ -0,0 +1,8 @@
package com.jFxKasse.application;
public class JavaFX11Main {
public static void main(String[] args) {
Main.main(args);
}
}

View File

@ -0,0 +1,153 @@
package com.jFxKasse.application;
import com.jFxKasse.controller.MainWindowController;
import com.jFxKasse.controller.PrinterController;
import com.jFxKasse.controller.XMLController;
import com.jFxKasse.controller.DBController;
import com.jFxKasse.controller.KeyController;
import javafx.application.Application;
import java.io.File;
import javafx.animation.Animation;
import javafx.animation.KeyFrame;
import javafx.animation.Timeline;
import javafx.fxml.FXMLLoader;
import javafx.stage.Stage;
import javafx.util.Duration;
import javafx.scene.Scene;
import javafx.scene.layout.AnchorPane;
public class Main extends Application {
// Path to config.xml and the database
public static String filepath;
private static String osName = System.getProperty("os.name");
private static String userHome = System.getProperty("user.home");
private MainWindowController mwc;
// Initialized in start() after filepath is set by main()
private XMLController xmlc;
private DBController dbc;
private PrinterController pc = new PrinterController();
private KeyController kc;
private Stage primaryStage;
@Override
public void start(Stage primaryStage) {
this.primaryStage = primaryStage;
// filepath is set by main() before launch(); initialize controllers here
xmlc = new XMLController(filepath);
dbc = new DBController(filepath);
System.out.println("\nstarting jFxKasse\n");
mainWindow();
}
private void mainWindow() {
try {
FXMLLoader loader = new FXMLLoader(getClass().getResource("/fxml/MainWindow.fxml"));
AnchorPane pane = loader.load();
primaryStage.setTitle("jFxKasse"); // Window title
mwc = loader.getController(); // Set the MainWindowController
pc.searchPrinters(); // Search for available printers
mwc.setMain(this, dbc, xmlc, pc); // Pass instances to the controller
firstStart(); // Check if this is the first run
Scene scene = new Scene(pane);
scene.getStylesheets().add(Main.class.getResource("/css/application.css").toExternalForm());
primaryStage.setScene(scene);
primaryStage.show(); // Show the stage
// Attach the KeyController
kc = new KeyController(scene, mwc);
Timeline timeline = new Timeline(new KeyFrame(Duration.seconds(1), ev -> {
mwc.updateTimeLabel(); // Update time label on UI
}));
timeline.setCycleCount(Animation.INDEFINITE);
timeline.play();
}
catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
if (osName.contains("Windows")) {
System.out.println("FCK Windows");
filepath = userHome + "/Documents/jFxKasse/";
}
else {
filepath = userHome + "/jFxKasse/";
}
launch(args);
}
/**
* Checks if the config.xml is present and initializes accordingly.
*/
private void firstStart() throws Exception {
if (xmlc.loadSettings()) {
// config.xml found, app starting normally
System.out.println("XML found!");
mwc.initUI(); // Initialize the UI elements
mwc.setDBLabel(); // Set database labels
dbc.setDbname(xmlc.getDatabaseName()); // Pass database name
try {
dbc.connectDatabase(); // Establish DB connection
}
catch (Exception e) {
e.printStackTrace();
showErrorDialog("Datenbankfehler", "Die Datenbank konnte nicht geöffnet werden.",
"Datei: " + xmlc.getDatabaseName() + ".db\n\n"
+ "Bitte prüfen Sie, ob die Datei vorhanden und nicht beschädigt ist.\n"
+ "Fehlermeldung: " + e.getMessage());
return;
}
mwc.fillTablePositionen(); // Fill TreeTable 'Positions'
mwc.fillCategory();
mwc.fillPrinterSettings();
mwc.fillTableJobs();
mwc.loadGridButtons();
mwc.getSelectedCat(); // Load DB entries in ChoiceBox
mwc.createNewJob();
}
else {
// config.xml NOT found — first start of app
System.out.println("no XML found!");
xmlc.initXML(); // Set default values in memory
File dir = new File(filepath);
dir.mkdir(); // Create config directory
try {
xmlc.saveSettings(); // Persist defaults immediately so next start is normal
System.out.println("Default config.xml written.");
}
catch (Exception e) {
e.printStackTrace();
showErrorDialog("Konfigurationsfehler", "Die Konfigurationsdatei konnte nicht geschrieben werden.",
"Pfad: " + filepath + "config.xml\n\n" + "Bitte prüfen Sie die Schreibrechte.\n"
+ "Fehlermeldung: " + e.getMessage());
}
mwc.blockUI(true); // Disable UI elements that need a DB
mwc.blockUnlock(); // Show first-start hint, disable lock button
}
}
/** Shows a modal error alert dialog on the JavaFX thread. */
private void showErrorDialog(String title, String header, String content) {
javafx.scene.control.Alert alert = new javafx.scene.control.Alert(javafx.scene.control.Alert.AlertType.ERROR);
alert.setTitle(title);
alert.setHeaderText(header);
alert.setContentText(content);
alert.setResizable(true);
alert.showAndWait();
}
}

View File

@ -0,0 +1,91 @@
package com.jFxKasse.application;
import java.util.ArrayList;
import com.jFxKasse.controller.DBController;
import com.jFxKasse.controller.PrinterController;
import com.jFxKasse.controller.XMLController;
import com.jFxKasse.datatypes.PrintDataSimple;
import com.jFxKasse.datatypes.PrintDataSplitted;
import javafx.geometry.Insets;
import javafx.scene.control.ButtonType;
import javafx.scene.control.Dialog;
import javafx.scene.control.Label;
import javafx.scene.layout.GridPane;
import javafx.util.Pair;
public class PrintJob {
private TimeDate timedate = new TimeDate();
public void printJob(int jobID, XMLController xmlc, DBController dbc, PrinterController pc) {
if ((xmlc.getPrintername().equals("Drucker auswählen") || xmlc.getPrintername() == null)) {
// No printer selected
System.out.println("No printer configured!");
// creates a dialog
Dialog<Pair<String, String>> dialog = new Dialog<>();
dialog.setTitle("Kein Drucker");
dialog.setHeaderText("Es ist kein Drucker einestellt.\n" + "In den Einstellungen einen Drucker auswählen.");
dialog.getDialogPane().getButtonTypes().addAll(ButtonType.OK);
GridPane grid = new GridPane();
grid.setHgap(10);
grid.setVgap(10);
grid.setPadding(new Insets(20, 150, 10, 10));
grid.add(
new Label(
"Tipp:\n" + "Es kann ein virtueller Drucker installiert werden: \n\n" + "www.cups-pdf.de"),
0, 0);
dialog.getDialogPane().setContent(grid);
dialog.setResizable(true);
dialog.showAndWait();
}
else {
// Printer selected
pc.selectPrinter(xmlc.getPrintername());
/* Single bill or split by category */
if (xmlc.getCategorySplitted()) {
// Split the bills
PrintDataSplitted pdsplitted = new PrintDataSplitted(xmlc.getLinebreak(), xmlc.getOffsetHeader(),
xmlc.getOffsetFooter(), timedate.getSystemTime() + " " + timedate.getSystemDate(),
xmlc.getHeader(), xmlc.getFooter());
pdsplitted.setData(Integer.toString(jobID), dbc.getTime_Job(jobID), dbc.getQuantity_Job(jobID),
dbc.getName_Job(jobID), dbc.getValue_Job(jobID), dbc.getCategory_Job(jobID),
dbc.getJobValue_Job(jobID));
System.out.println("Printing job ...");
ArrayList<String> printString = pdsplitted.getPrintStrings();
for (int i = 0; i < printString.size(); i++) {
pc.printString(printString.get(i));
}
}
else {
// Single bill
PrintDataSimple pds = new PrintDataSimple(xmlc.getLinebreak(), xmlc.getOffsetHeader(),
xmlc.getOffsetFooter(), timedate.getSystemTime() + " " + timedate.getSystemDate(),
xmlc.getHeader(), xmlc.getFooter());
pds.setData(Integer.toString(jobID), dbc.getTime_Job(jobID), dbc.getQuantity_Job(jobID),
dbc.getName_Job(jobID), dbc.getValue_Job(jobID), dbc.getCategory_Job(jobID),
dbc.getJobValue_Job(jobID));
System.out.println("Printing job ...");
pc.printString(pds.getPrintString());
}
}
}
}

View File

@ -0,0 +1,21 @@
package com.jFxKasse.application;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
public class TimeDate {
public String getSystemTime() {
DateFormat dateFormat = new SimpleDateFormat("HH:mm");
Date date = new Date();
String time = dateFormat.format(date);
return time;
}
public String getSystemDate() {
DateFormat dateFormat = new SimpleDateFormat("dd.MM.yyyy");
Date date = new Date();
String dateStr = dateFormat.format(date);
return dateStr;
}
}

View File

@ -1,4 +1,4 @@
package application; package com.jFxKasse.controller;
import java.sql.Connection; import java.sql.Connection;
import java.sql.DriverManager; import java.sql.DriverManager;
@ -7,102 +7,95 @@ import java.sql.ResultSet;
import java.sql.SQLException; import java.sql.SQLException;
import java.sql.Statement; import java.sql.Statement;
import java.util.ArrayList; import java.util.ArrayList;
import com.jFxKasse.datatypes.tableDataJob;
import com.jFxKasse.datatypes.tableDataPositionen;
import java.io.File; import java.io.File;
class DBController public class DBController {
{
private Connection connection; private Connection connection;
private String DB_PATH_Linux = System.getProperty("user.home") private String DB_PATH;
+ "/bin/jFxKasse/";
public String dbname; private String dbname;
@SuppressWarnings("unused") public void main() {
private Main main;
public void main()
{
try { try {
connection = DriverManager connection = DriverManager.getConnection("jdbc:sqlite:" + DB_PATH + dbname + ".db");
.getConnection("jdbc:sqlite:" + DB_PATH_Linux + dbname + ".db"); }
} catch (SQLException e) { catch (SQLException e) {
// TODO Auto-generated catch block // TODO Auto-generated catch block
e.printStackTrace(); e.printStackTrace();
} }
} }
DBController(Main main) public DBController(String path) {
{ this.DB_PATH = path;
this.main = main;
} }
public void connectDatabase() public void setDbname(String dbname) {
{ // connect to database this.dbname = dbname;
System.out.println("Verbinde ... DB name: " + dbname); }
public void connectDatabase() { // Connect to database
System.out.println("Connecting... DB name: " + dbname);
try { try {
if (connection != null) if (connection != null)
return; return;
connection = DriverManager connection = DriverManager.getConnection("jdbc:sqlite:" + DB_PATH + dbname + ".db");
.getConnection("jdbc:sqlite:" + DB_PATH_Linux + dbname + ".db");
if (!connection.isClosed()) if (!connection.isClosed())
System.out.println("DB Datei-Verbindung erstellt"); System.out.println("DB connection established");
} catch (SQLException e) { }
catch (SQLException e) {
throw new RuntimeException(e); throw new RuntimeException(e);
} }
Runtime.getRuntime().addShutdownHook(new Thread() { Runtime.getRuntime().addShutdownHook(new Thread() {
public void run() public void run() {
{
try { try {
if (!connection.isClosed() && connection != null) { if (!connection.isClosed() && connection != null) {
connection.close(); connection.close();
if (connection.isClosed()) if (connection.isClosed())
System.out.println(); System.out.println();
} }
} catch (SQLException e) { }
catch (SQLException e) {
e.printStackTrace(); e.printStackTrace();
} }
} }
}); });
} }
public boolean existiertDatenbank(String pPfad) public boolean existDB(String pPfad) { // Check if the DB exists
{ // Prüft ob die Datenbank existiert
File varTmpDir = new File(pPfad); File varTmpDir = new File(pPfad);
if (!varTmpDir.exists()) { if (!varTmpDir.exists()) {
return false; return false;
} else { }
else {
return true; return true;
} }
} }
public String getCategoryNameFromPositionen(int pID) public String getCategoryNameFromPositionen(int pID) {
{
// System.out.println("getCategoryName: " + pID);
int catInPos = 0; int catInPos = 0;
try { try {
Statement stmt = connection.createStatement(); Statement stmt = connection.createStatement();
ResultSet rs = stmt.executeQuery("SELECT posid, cat FROM positionen " ResultSet rs = stmt.executeQuery("SELECT posid, cat FROM positionen " + "WHERE posid = " + pID + ";");
+ "WHERE posid = " + pID + ";");
catInPos = rs.getInt("cat"); catInPos = rs.getInt("cat");
} catch (SQLException e) { }
catch (SQLException e) {
System.err.println("Couldn't handle DB-Query"); System.err.println("Couldn't handle DB-Query");
e.printStackTrace(); e.printStackTrace();
} }
if (catInPos == 6) { if (catInPos == 6) {
return "Standard"; return "Standard";
} }
try { try {
Statement stmt = connection.createStatement(); Statement stmt = connection.createStatement();
ResultSet rs = stmt.executeQuery("SELECT catid, catname FROM category " ResultSet rs = stmt
+ "WHERE catid = " + catInPos + ";"); .executeQuery("SELECT catid, catname FROM category " + "WHERE catid = " + catInPos + ";");
return rs.getString("catname"); return rs.getString("catname");
} catch (SQLException e) { }
catch (SQLException e) {
System.err.println("Couldn't handle DB-Query"); System.err.println("Couldn't handle DB-Query");
e.printStackTrace(); e.printStackTrace();
return "keine Kategorie"; return "keine Kategorie";
@ -110,34 +103,31 @@ class DBController
} }
// table Position section // // Table 'Positionen' section //
public void createTablePositionen() public void createTablePositionen() { // Create table 'positionen'
{ // create table position System.out.println("Creating table Positionen");
System.out.println("Erstelle Tabelle Positionen");
try { try {
Statement stmt = connection.createStatement(); Statement stmt = connection.createStatement();
stmt.executeUpdate("DROP TABLE IF EXISTS positionen;"); stmt.executeUpdate("DROP TABLE IF EXISTS positionen;");
stmt.executeUpdate( stmt.executeUpdate("CREATE TABLE positionen (posid, name, value, cat, color);");
"CREATE TABLE positionen (posid, name, value, cat, color);"); }
} catch (SQLException e) { catch (SQLException e) {
System.err.println("Couldn't handle DB-Query"); System.err.println("Couldn't handle DB-Query");
e.printStackTrace(); e.printStackTrace();
} }
// create 25 demo/default data entries // Create 25 demo/default data entries
for (int i = 0; i < 25; i++) { for (int i = 0; i < 25; i++) {
fillPositionen_Positionen(i + 1, "Noch frei", (float) 0.00, 6, fillPositionen_Positionen(i + 1, "Noch frei", (float) 0.00, 6, "#ad0000");
"#ad0000");
} }
} }
public void fillPositionen_Positionen(int pID, String pName, float pValue, public void fillPositionen_Positionen(int pID, String pName, float pValue, int pCat, String pColor) { // Create new
int pCat, String pColor) // entry in
{ // create new data in table // table
System.out.println("Erstelle neuen positionen eintrag"); System.out.println("Creating new positionen entry");
try { try {
PreparedStatement ps = connection.prepareStatement( PreparedStatement ps = connection.prepareStatement("INSERT INTO positionen VALUES (?, ?, ?, ?, ?);");
"INSERT INTO positionen VALUES (?, ?, ?, ?, ?);");
ps.setInt(1, pID); // primary ps.setInt(1, pID); // primary
ps.setString(2, pName); ps.setString(2, pName);
ps.setFloat(3, pValue); ps.setFloat(3, pValue);
@ -148,145 +138,134 @@ class DBController
connection.setAutoCommit(false); connection.setAutoCommit(false);
ps.executeBatch(); // SQL execution ps.executeBatch(); // SQL execution
connection.setAutoCommit(true); connection.setAutoCommit(true);
} catch (SQLException e) { }
catch (SQLException e) {
System.err.println("Couldn't handle DB-Query"); System.err.println("Couldn't handle DB-Query");
e.printStackTrace(); e.printStackTrace();
} }
} }
public String getName_Positionen(int pID) public String getName_Positionen(int pID) {
{ // Gibt das Datum zurück
try { try {
Statement stmt = connection.createStatement(); Statement stmt = connection.createStatement();
ResultSet rs = stmt.executeQuery( ResultSet rs = stmt.executeQuery("SELECT posid, name FROM positionen WHERE posid = " + pID + ";");
"SELECT posid, name FROM positionen WHERE posid = " + pID + ";");
return rs.getString("name"); return rs.getString("name");
} catch (SQLException e) { }
catch (SQLException e) {
System.err.println("Couldn't handle DB-Query"); System.err.println("Couldn't handle DB-Query");
e.printStackTrace(); e.printStackTrace();
return "Error 404"; return "Error 404";
} }
} }
public String getValue_Positionen(int pID) public String getValue_Positionen(int pID) {
{ // Gibt das Konto zurück
try { try {
Statement stmt = connection.createStatement(); Statement stmt = connection.createStatement();
ResultSet rs = stmt.executeQuery( ResultSet rs = stmt.executeQuery("SELECT posid, value FROM positionen WHERE posid = " + pID + ";");
"SELECT posid, value FROM positionen WHERE posid = " + pID
+ ";");
return rs.getString("value"); return rs.getString("value");
} catch (SQLException e) { }
catch (SQLException e) {
System.err.println("Couldn't handle DB-Query"); System.err.println("Couldn't handle DB-Query");
e.printStackTrace(); e.printStackTrace();
return "Error 404"; return "Error 404";
} }
} }
public int getCat_Positionen(int pID) public int getCat_Positionen(int pID) {
{ // Gibt den Nutzernamen zurück
try { try {
Statement stmt = connection.createStatement(); Statement stmt = connection.createStatement();
ResultSet rs = stmt.executeQuery( ResultSet rs = stmt.executeQuery("SELECT catid, cat FROM positionen WHERE catid = " + pID + ";");
"SELECT catid, cat FROM positionen WHERE catid = " + pID + ";");
System.out.println("getCarTet: " + rs.getInt("cat")); System.out.println("getCarTet: " + rs.getInt("cat"));
return rs.getInt("cat"); return rs.getInt("cat");
} catch (SQLException e) { }
catch (SQLException e) {
System.err.println("Couldn't handle DB-Query"); System.err.println("Couldn't handle DB-Query");
e.printStackTrace(); e.printStackTrace();
return 0; return 0;
} }
} }
public String getColor_Positionen(int pID) public String getColor_Positionen(int pID) {
{ // Gibt den Nutzernamen zurück
try { try {
Statement stmt = connection.createStatement(); Statement stmt = connection.createStatement();
ResultSet rs = stmt.executeQuery( ResultSet rs = stmt.executeQuery("SELECT posid, color FROM positionen WHERE posid = " + pID + ";");
"SELECT posid, color FROM positionen WHERE posid = " + pID
+ ";");
return rs.getString("color"); return rs.getString("color");
} catch (SQLException e) { }
catch (SQLException e) {
System.err.println("Couldn't handle DB-Query"); System.err.println("Couldn't handle DB-Query");
e.printStackTrace(); e.printStackTrace();
return "Error 404"; return "Error 404";
} }
} }
public void setName_Positionen(int pID, String pName) public void setName_Positionen(int pID, String pName) {
{ // Setzt das Datum
try { try {
Statement stmt = connection.createStatement(); Statement stmt = connection.createStatement();
stmt.executeUpdate("UPDATE positionen SET name = '" + pName stmt.executeUpdate("UPDATE positionen SET name = '" + pName + "'WHERE posid =" + pID + ";");
+ "'WHERE posid =" + pID + ";"); }
} catch (SQLException e) { catch (SQLException e) {
System.err.println("Couldn't handle DB-Query"); System.err.println("Couldn't handle DB-Query");
e.printStackTrace(); e.printStackTrace();
} }
} }
public void setValue_Positionen(int pID, String pValue) public void setValue_Positionen(int pID, String pValue) {
{ // Setzt das Konto
try { try {
Statement stmt = connection.createStatement(); Statement stmt = connection.createStatement();
stmt.executeUpdate("UPDATE positionen SET value = '" + pValue stmt.executeUpdate("UPDATE positionen SET value = '" + pValue + "'WHERE posid =" + pID + ";");
+ "'WHERE posid =" + pID + ";"); }
} catch (SQLException e) { catch (SQLException e) {
System.err.println("Couldn't handle DB-Query"); System.err.println("Couldn't handle DB-Query");
e.printStackTrace(); e.printStackTrace();
} }
} }
public void setCat_Positionen(int pID, int pCat) public void setCat_Positionen(int pID, int pCat) {
{ // Setzt den Nutzername
try { try {
Statement stmt = connection.createStatement(); Statement stmt = connection.createStatement();
stmt.executeUpdate("UPDATE positionen SET cat = '" + pCat stmt.executeUpdate("UPDATE positionen SET cat = '" + pCat + "'WHERE posid =" + pID + ";");
+ "'WHERE posid =" + pID + ";"); }
} catch (SQLException e) { catch (SQLException e) {
System.err.println("Couldn't handle DB-Query"); System.err.println("Couldn't handle DB-Query");
e.printStackTrace(); e.printStackTrace();
} }
} }
public void setColor_Positionen(int pID, String pColor) public void setColor_Positionen(int pID, String pColor) {
{ // Setzt den Nutzername
try { try {
Statement stmt = connection.createStatement(); Statement stmt = connection.createStatement();
stmt.executeUpdate("UPDATE positionen SET color = '" + pColor stmt.executeUpdate("UPDATE positionen SET color = '" + pColor + "'WHERE posid =" + pID + ";");
+ "'WHERE posid =" + pID + ";"); }
} catch (SQLException e) { catch (SQLException e) {
System.err.println("Couldn't handle DB-Query"); System.err.println("Couldn't handle DB-Query");
e.printStackTrace(); e.printStackTrace();
} }
} }
public ArrayList<tableDataPositionen> ladeTabellePositionen() public ArrayList<tableDataPositionen> ladeTabellePositionen() {
{ // Gibt ein Objekt daten mit allen Einträgen der DB zurück
ArrayList<tableDataPositionen> daten = new ArrayList<>(); ArrayList<tableDataPositionen> daten = new ArrayList<>();
try { try {
Statement stmt = connection.createStatement(); Statement stmt = connection.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM positionen;"); ResultSet rs = stmt.executeQuery("SELECT * FROM positionen;");
while (rs.next()) { while (rs.next()) {
try { try {
// Entschlüsselte Daten werden als Datenobjekt gespeichert daten.add(new tableDataPositionen(rs.getInt("posid"), rs.getString("name"), rs.getString("value"),
daten.add(new tableDataPositionen(rs.getInt("posid"),
rs.getString("name"), rs.getString("value"),
rs.getString("cat"), rs.getString("color"))); rs.getString("cat"), rs.getString("color")));
} catch (Exception e) { }
catch (Exception e) {
// TODO Auto-generated catch block // TODO Auto-generated catch block
e.printStackTrace(); e.printStackTrace();
} }
} }
} catch (SQLException e) { }
catch (SQLException e) {
System.err.println("Couldn't handle DB-Query"); System.err.println("Couldn't handle DB-Query");
e.printStackTrace(); e.printStackTrace();
} }
return daten; return daten;
} }
public void ausgebenSysoPositionen() public void ausgebenSysoPositionen() {
{ // Debugging Ausgabe der kompletten Tabelle
System.out.println("Print positionen"); System.out.println("Print positionen");
try { try {
Statement stmt = connection.createStatement(); Statement stmt = connection.createStatement();
@ -299,21 +278,22 @@ class DBController
System.out.println(" "); System.out.println(" ");
} }
} catch (SQLException e) { }
catch (SQLException e) {
System.err.println("Couldn't handle DB-Query"); System.err.println("Couldn't handle DB-Query");
e.printStackTrace(); e.printStackTrace();
} }
} }
// table Category section // // Table 'Category' section //
public void createTableCategory() public void createTableCategory() { // Create table 'category'
{ // create table position System.out.println("Creating table Category");
System.out.println("Erstelle Tabelle Kategorie");
try { try {
Statement stmt = connection.createStatement(); Statement stmt = connection.createStatement();
stmt.executeUpdate("DROP TABLE IF EXISTS category;"); stmt.executeUpdate("DROP TABLE IF EXISTS category;");
stmt.executeUpdate("CREATE TABLE category (catid, catname);"); stmt.executeUpdate("CREATE TABLE category (catid, catname);");
} catch (SQLException e) { }
catch (SQLException e) {
System.err.println("Couldn't handle DB-Query"); System.err.println("Couldn't handle DB-Query");
e.printStackTrace(); e.printStackTrace();
} }
@ -326,216 +306,210 @@ class DBController
} }
public void setName_Category(int pID, String pName) public void setName_Category(int pID, String pName) {
{ // Setzte den Namen
try { try {
Statement stmt = connection.createStatement(); Statement stmt = connection.createStatement();
stmt.executeUpdate("UPDATE category SET catname = '" + pName stmt.executeUpdate("UPDATE category SET catname = '" + pName + "'WHERE catid =" + pID + ";");
+ "'WHERE catid =" + pID + ";"); }
} catch (SQLException e) { catch (SQLException e) {
System.err.println("Couldn't handle DB-Query"); System.err.println("Couldn't handle DB-Query");
e.printStackTrace(); e.printStackTrace();
} }
} }
public void fillCategory_Category(int pID, String pName) public void fillCategory_Category(int pID, String pName) {
{
System.out.println("Erstelle neuen Kategorie Eintrag"); System.out.println("Creating new category entry");
try { try {
PreparedStatement ps = connection PreparedStatement ps = connection.prepareStatement("INSERT INTO category VALUES (?, ?);");
.prepareStatement("INSERT INTO category VALUES (?, ?);");
ps.setInt(1, pID); // primary ps.setInt(1, pID); // primary
ps.setString(2, pName); ps.setString(2, pName);
ps.addBatch(); ps.addBatch();
connection.setAutoCommit(false); connection.setAutoCommit(false);
ps.executeBatch(); // SQL execution ps.executeBatch(); // SQL execution
connection.setAutoCommit(true); connection.setAutoCommit(true);
} catch (SQLException e) { }
catch (SQLException e) {
System.err.println("Couldn't handle DB-Query"); System.err.println("Couldn't handle DB-Query");
e.printStackTrace(); e.printStackTrace();
} }
} }
public String getName_Category(int pID) public String getName_Category(int pID) {
{ // Gibt das Datum zurück
try { try {
Statement stmt = connection.createStatement(); Statement stmt = connection.createStatement();
ResultSet rs = stmt.executeQuery( ResultSet rs = stmt.executeQuery("SELECT catid, catname FROM category WHERE catid = " + pID + ";");
"SELECT catid, catname FROM category WHERE catid = " + pID
+ ";");
return rs.getString("catname"); return rs.getString("catname");
} catch (SQLException e) { }
catch (SQLException e) {
System.err.println("Couldn't handle DB-Query"); System.err.println("Couldn't handle DB-Query");
e.printStackTrace(); e.printStackTrace();
return "Error 404"; return "Error 404";
} }
} }
// table Jobs section // // Table 'Jobs' section //
public void erstelleTabelleJobs() public void erstelleTabelleJobs() { // Create table 'jobs'
{ // Erstelle Tabelle mit Reihen System.out.println("Creating table Jobs");
System.out.println("Erstelle Tabelle Jobs");
try { try {
Statement stmt = connection.createStatement(); Statement stmt = connection.createStatement();
stmt.executeUpdate("DROP TABLE IF EXISTS jobs;"); stmt.executeUpdate("DROP TABLE IF EXISTS jobs;");
stmt.executeUpdate( stmt.executeUpdate(
"CREATE TABLE jobs (jobid, time, positionen_quantity, positionen_name, positionen_value, positionen_cat, state, jobvalue);"); "CREATE TABLE jobs (jobid, time, positionen_quantity, positionen_name, positionen_value, positionen_cat, state, jobvalue);");
} catch (SQLException e) { }
catch (SQLException e) {
System.err.println("Couldn't handle DB-Query"); System.err.println("Couldn't handle DB-Query");
e.printStackTrace(); e.printStackTrace();
} }
} }
public int getLatestJobNumber_Job() public int getLatestJobNumber_Job() {
{
try { try {
Statement stmt = connection.createStatement(); Statement stmt = connection.createStatement();
ResultSet rs = stmt.executeQuery( ResultSet rs = stmt.executeQuery("SELECT jobid from jobs ORDER BY jobid DESC LIMIT 1;");
"SELECT jobid from jobs ORDER BY jobid DESC LIMIT 1;");
return rs.getInt("jobid"); return rs.getInt("jobid");
} catch (SQLException e) { }
catch (SQLException e) {
// System.err.println("Couldn't handle DB-Query"); // System.err.println("Couldn't handle DB-Query");
// e.printStackTrace(); // e.printStackTrace();
} }
return 0; return 0;
} }
public String getTime_Job(int pID) public String getTime_Job(int pID) {
{ // Gibt den Nutzernamen zurück
try { try {
Statement stmt = connection.createStatement(); Statement stmt = connection.createStatement();
ResultSet rs = stmt.executeQuery( ResultSet rs = stmt.executeQuery("SELECT jobid, time FROM jobs WHERE jobid = " + pID + ";");
"SELECT jobid, time FROM jobs WHERE jobid = " + pID + ";");
return rs.getString("time"); return rs.getString("time");
} catch (SQLException e) { }
catch (SQLException e) {
System.err.println("Couldn't handle DB-Query"); System.err.println("Couldn't handle DB-Query");
e.printStackTrace(); e.printStackTrace();
return "404"; return "404";
} }
} }
public String getQuantity_Job(int pID) public String getQuantity_Job(int pID) {
{ // Gibt den Nutzernamen zurück
try { try {
Statement stmt = connection.createStatement(); Statement stmt = connection.createStatement();
ResultSet rs = stmt.executeQuery( ResultSet rs = stmt.executeQuery("SELECT jobid, positionen_quantity FROM jobs WHERE jobid = " + pID + ";");
"SELECT jobid, positionen_quantity FROM jobs WHERE jobid = "
+ pID + ";");
return rs.getString("positionen_quantity"); return rs.getString("positionen_quantity");
} catch (SQLException e) { }
catch (SQLException e) {
System.err.println("Couldn't handle DB-Query"); System.err.println("Couldn't handle DB-Query");
e.printStackTrace(); e.printStackTrace();
return "404"; return "404";
} }
} }
public String getName_Job(int pID) public String getName_Job(int pID) {
{ // Gibt den Nutzernamen zurück
try { try {
Statement stmt = connection.createStatement(); Statement stmt = connection.createStatement();
ResultSet rs = stmt.executeQuery( ResultSet rs = stmt.executeQuery("SELECT jobid, positionen_name FROM jobs WHERE jobid = " + pID + ";");
"SELECT jobid, positionen_name FROM jobs WHERE jobid = " + pID
+ ";");
return rs.getString("positionen_name"); return rs.getString("positionen_name");
} catch (SQLException e) { }
catch (SQLException e) {
System.err.println("Couldn't handle DB-Query"); System.err.println("Couldn't handle DB-Query");
e.printStackTrace(); e.printStackTrace();
return "404"; return "404";
} }
} }
public String getValue_Job(int pID) public String getValue_Job(int pID) {
{ // Gibt den Nutzernamen zurück
try { try {
Statement stmt = connection.createStatement(); Statement stmt = connection.createStatement();
ResultSet rs = stmt.executeQuery( ResultSet rs = stmt.executeQuery("SELECT jobid, positionen_value FROM jobs WHERE jobid = " + pID + ";");
"SELECT jobid, positionen_value FROM jobs WHERE jobid = " + pID
+ ";");
return rs.getString("positionen_value"); return rs.getString("positionen_value");
} catch (SQLException e) { }
catch (SQLException e) {
System.err.println("Couldn't handle DB-Query"); System.err.println("Couldn't handle DB-Query");
e.printStackTrace(); e.printStackTrace();
return "404"; return "404";
} }
} }
public String getCategory_Job(int pID) public String getCategory_Job(int pID) {
{ // Gibt den Nutzernamen zurück
try { try {
Statement stmt = connection.createStatement(); Statement stmt = connection.createStatement();
ResultSet rs = stmt.executeQuery( ResultSet rs = stmt.executeQuery("SELECT jobid, positionen_cat FROM jobs WHERE jobid = " + pID + ";");
"SELECT jobid, positionen_cat FROM jobs WHERE jobid = " + pID
+ ";");
return rs.getString("positionen_cat"); return rs.getString("positionen_cat");
} catch (SQLException e) { }
catch (SQLException e) {
System.err.println("Couldn't handle DB-Query"); System.err.println("Couldn't handle DB-Query");
e.printStackTrace(); e.printStackTrace();
return "404"; return "404";
} }
} }
public String getState_Job(int pID) public String getState_Job(int pID) {
{ // Gibt den Nutzernamen zurück
try { try {
Statement stmt = connection.createStatement(); Statement stmt = connection.createStatement();
ResultSet rs = stmt.executeQuery( ResultSet rs = stmt.executeQuery("SELECT jobid, state FROM jobs WHERE jobid = " + pID + ";");
"SELECT jobid, state FROM jobs WHERE jobid = " + pID + ";");
return rs.getString("state"); return rs.getString("state");
} catch (SQLException e) { }
catch (SQLException e) {
System.err.println("Couldn't handle DB-Query"); System.err.println("Couldn't handle DB-Query");
e.printStackTrace(); e.printStackTrace();
return "404"; return "404";
} }
} }
public String getJobValue_Job(int pID) public String getJobValue_Job(int pID) {
{ // Gibt den Nutzernamen zurück
try { try {
Statement stmt = connection.createStatement(); Statement stmt = connection.createStatement();
ResultSet rs = stmt.executeQuery( ResultSet rs = stmt.executeQuery("SELECT jobid, jobvalue FROM jobs WHERE jobid = " + pID + ";");
"SELECT jobid, jobvalue FROM jobs WHERE jobid = " + pID + ";");
return rs.getString("jobvalue"); return rs.getString("jobvalue");
} catch (SQLException e) { }
catch (SQLException e) {
System.err.println("Couldn't handle DB-Query"); System.err.println("Couldn't handle DB-Query");
e.printStackTrace(); e.printStackTrace();
return "404"; return "404";
} }
} }
public String getAllJobValue_Job() public String getAllJobValue_Job() {
{ // Gibt den Nutzernamen zurück
try { try {
Statement stmt = connection.createStatement(); Statement stmt = connection.createStatement();
ResultSet rs = stmt.executeQuery( ResultSet rs = stmt
"SELECT state, jobvalue, SUM(jobvalue) AS ALLVALUE FROM jobs WHERE state = " .executeQuery("SELECT state, jobvalue, SUM(jobvalue) AS ALLVALUE FROM jobs WHERE state = " + '"'
+ '"' + "verbucht" + '"' + ";"); + "verbucht" + '"' + ";");
return rs.getString("ALLVALUE"); return rs.getString("ALLVALUE");
} catch (SQLException e) { }
catch (SQLException e) {
System.err.println("Couldn't handle DB-Query"); System.err.println("Couldn't handle DB-Query");
e.printStackTrace(); e.printStackTrace();
return "0"; return "0";
} }
} }
public void setStatus_Jobs(int pID, String pStatus) public String getJobCount() {
{ // Setzt das Konto
try { try {
Statement stmt = connection.createStatement(); Statement stmt = connection.createStatement();
stmt.executeUpdate("UPDATE jobs SET state = '" + pStatus ResultSet rs = stmt.executeQuery(
+ "'WHERE jobid =" + pID + ";"); "SELECT count(*) AS JOBCOUNT FROM jobs WHERE state = " + '"' + "verbucht" + '"' + ";");
} catch (SQLException e) { return rs.getString("JOBCOUNT");
}
catch (SQLException e) {
System.err.println("Couldn't handle DB-Query");
e.printStackTrace();
return "0";
}
}
public void setStatus_Jobs(int pID, String pStatus) {
try {
Statement stmt = connection.createStatement();
stmt.executeUpdate("UPDATE jobs SET state = '" + pStatus + "'WHERE jobid =" + pID + ";");
}
catch (SQLException e) {
System.err.println("Couldn't handle DB-Query"); System.err.println("Couldn't handle DB-Query");
e.printStackTrace(); e.printStackTrace();
} }
} }
public ArrayList<tableDataJob> loadTableJobs_Job() public ArrayList<tableDataJob> loadTableJobs_Job() {
{ // Gibt den Nutzernamen zurück
ArrayList<tableDataJob> tmp = new ArrayList<tableDataJob>(); ArrayList<tableDataJob> tmp = new ArrayList<tableDataJob>();
try { try {
@ -545,36 +519,31 @@ class DBController
while (rs.next()) { while (rs.next()) {
try { try {
// return rs.getString("jobvalue");
String tablePosition = rs.getString("positionen_name"); String tablePosition = rs.getString("positionen_name");
tableDataJob data = new tableDataJob(rs.getInt("jobid"), tableDataJob data = new tableDataJob(rs.getInt("jobid"), rs.getString("time"), tablePosition,
rs.getString("time"), tablePosition, rs.getString("state"), rs.getString("state"), rs.getString("jobvalue"));
rs.getString("jobvalue"));
tmp.add(data); tmp.add(data);
} catch (SQLException e) { }
catch (SQLException e) {
System.err.println("Couldn't handle DB-Query"); System.err.println("Couldn't handle DB-Query");
e.printStackTrace(); e.printStackTrace();
} }
} }
} catch (SQLException e) { }
catch (SQLException e) {
System.err.println("Couldn't handle DB-Query"); System.err.println("Couldn't handle DB-Query");
e.printStackTrace(); e.printStackTrace();
} }
return tmp; return tmp;
} }
public void fillJobs_Jobs(int pID, String pTime, String pPositionen_quantity, public void fillJobs_Jobs(int pID, String pTime, String pPositionen_quantity, String pPositionen_name,
String pPositionen_name, String pPositionen_value, String pPositionen_value, String pPositionen_cat, String pState, String pJobvalue) {
String pPositionen_cat, String pState, String pJobvalue) System.out.println("Creating new job entry");
{
System.out.println("Create new Job Entry");
try { try {
PreparedStatement ps = connection.prepareStatement( PreparedStatement ps = connection.prepareStatement("INSERT INTO jobs VALUES (?, ?, ?, ?, ?, ?, ?, ?);");
"INSERT INTO jobs VALUES (?, ?, ?, ?, ?, ?, ?, ?);");
ps.setInt(1, pID); // primary ps.setInt(1, pID); // primary
ps.setString(2, pTime); ps.setString(2, pTime);
ps.setString(3, pPositionen_quantity); ps.setString(3, pPositionen_quantity);
@ -587,11 +556,10 @@ class DBController
connection.setAutoCommit(false); connection.setAutoCommit(false);
ps.executeBatch(); // SQL execution ps.executeBatch(); // SQL execution
connection.setAutoCommit(true); connection.setAutoCommit(true);
} catch (SQLException e) { }
catch (SQLException e) {
System.err.println("Couldn't handle DB-Query"); System.err.println("Couldn't handle DB-Query");
e.printStackTrace(); e.printStackTrace();
} }
} }
} }

View File

@ -0,0 +1,212 @@
package com.jFxKasse.controller;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.input.KeyCode;
import javafx.scene.input.KeyEvent;
public class KeyController {
private MainWindowController mwc;
public KeyController(Scene scene, MainWindowController mwc) {
this.mwc = mwc;
scene.setOnKeyPressed(new EventHandler<KeyEvent>() {
@Override
public void handle(KeyEvent keyEvent) {
switch (mwc.getActiveTab()) {
case 0:
handleTabNewJob(keyEvent);
break;
case 1:
handleTabJobs(keyEvent);
break;
case 2:
handleTabPosEdit(keyEvent);
break;
case 3:
handleTabSettings(keyEvent);
break;
default:
}
}
});
}
private void handleTabNewJob(KeyEvent key) {
if ((key.getCode() == KeyCode.ENTER) && (!mwc.btnPrintBill.isDisabled())) {
mwc.btnPrintBillAction(null);
}
if ((key.getCode() == KeyCode.ESCAPE) && (!mwc.btnLock.isDisabled())) {
mwc.btnLockAction(null);
}
if ((key.getCode() == KeyCode.DELETE) && (!mwc.btnDeleteSelectedPosition.isDisabled())) {
mwc.btnDeleteSelectedPositionAction(null);
}
handelGridButtons(key);
}
private void handleTabJobs(KeyEvent key) {
if ((key.getCode() == KeyCode.ENTER) && (!mwc.btnReprintJob.isDisabled())) {
mwc.btnReprintJobAction(null);
}
if ((key.getCode() == KeyCode.DELETE) && (!mwc.btnCancelJob.isDisabled())) {
mwc.btnCancelJobAction(null);
}
if ((key.getCode() == KeyCode.S) && (!mwc.btnCalcStats.isDisabled())) {
mwc.btnCalcStatsAction(null);
}
}
private void handleTabPosEdit(KeyEvent key) {
if ((key.getCode() == KeyCode.ENTER) && (!mwc.btnSaveEntry.isDisabled())) {
mwc.btnSaveEntryAction(null);
}
if ((key.getCode() == KeyCode.DELETE) && (!mwc.btnClearEntry.isDisabled())) {
mwc.btnClearEntryAction(null);
}
}
private void handleTabSettings(KeyEvent key) {
if ((key.getCode() == KeyCode.ENTER) && (!mwc.btnSavePrinter.isDisabled())) {
mwc.btnSavePrinterAction(null);
}
if ((key.getCode() == KeyCode.ENTER) && (!mwc.btnSaveCat.isDisabled())) {
mwc.btnSaveCatAction(null);
}
if ((key.getCode() == KeyCode.ENTER) && (!mwc.btnCreateNewDatabase.isDisabled())) {
try {
mwc.btnCreateNewDatabaseAction(null);
}
catch (Exception e) {
e.printStackTrace();
}
}
}
void handelGridButtons(KeyEvent key) {
switch (key.getCode()) {
case Q:
mwc.gridButton01Action(null);
break;
case W:
mwc.gridButton02Action(null);
break;
case E:
mwc.gridButton03Action(null);
break;
case R:
mwc.gridButton04Action(null);
break;
case T:
mwc.gridButton05Action(null);
break;
case Z:
mwc.gridButton06Action(null);
break;
case U:
mwc.gridButton07Action(null);
break;
case I:
mwc.gridButton08Action(null);
break;
case O:
mwc.gridButton09Action(null);
break;
case P:
mwc.gridButton10Action(null);
break;
case A:
mwc.gridButton11Action(null);
break;
case S:
mwc.gridButton12Action(null);
break;
case D:
mwc.gridButton13Action(null);
break;
case F:
mwc.gridButton14Action(null);
break;
case G:
mwc.gridButton15Action(null);
break;
case H:
mwc.gridButton16Action(null);
break;
case J:
mwc.gridButton17Action(null);
break;
case K:
mwc.gridButton18Action(null);
break;
case L:
mwc.gridButton19Action(null);
break;
case Y:
mwc.gridButton20Action(null);
break;
case X:
mwc.gridButton21Action(null);
break;
case C:
mwc.gridButton22Action(null);
break;
case V:
mwc.gridButton23Action(null);
break;
case B:
mwc.gridButton24Action(null);
break;
case N:
mwc.gridButton25Action(null);
break;
default:
break;
}
}
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,135 @@
/**
* Some parts are from http://www.mets-blog.com/java-pos-thermal-printer-example/
*/
package com.jFxKasse.controller;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.print.PageFormat;
import java.awt.print.Printable;
import java.awt.print.PrinterException;
import java.awt.print.PrinterJob;
import java.nio.charset.StandardCharsets;
import javax.print.Doc;
import javax.print.DocFlavor;
import javax.print.DocPrintJob;
import javax.print.PrintService;
import javax.print.PrintServiceLookup;
import javax.print.SimpleDoc;
import javax.print.attribute.HashPrintRequestAttributeSet;
import javax.print.attribute.PrintRequestAttributeSet;
public class PrinterController implements Printable {
// All available printers on this system
private PrintService[] printService;
// Selected printer
private PrintService selectedPrinter;
private DocFlavor flavor;
public PrinterController() {
flavor = DocFlavor.BYTE_ARRAY.AUTOSENSE;
}
/**
* @return A String array with all available printers
*/
public String[] getAvailablePrinters() {
int printerSize = PrinterJob.lookupPrintServices().length;
String printers[] = new String[printerSize];
for (int i = 0; i < printers.length; i++) {
printers[i] = this.printService[i].getName();
}
return printers;
}
/**
* Searches for connected printers on the system
*/
public void searchPrinters() {
PrintRequestAttributeSet pras = new HashPrintRequestAttributeSet();
this.printService = PrintServiceLookup.lookupPrintServices(flavor, pras);
String printers[] = getAvailablePrinters();
System.out.println("Printers found:");
System.out.println("++++++++++++++++++++");
for (int i = 0; i < printers.length; i++) {
System.out.println(printers[i]);
}
System.out.println("++++++++++++++++++++");
}
/**
* Selects the printer by its name
*
* @param printerName
*/
public void selectPrinter(String printerName) {
String printers[] = getAvailablePrinters();
for (int i = 0; i < printers.length; i++) {
if (printerName.equals(printers[i])) {
selectedPrinter = printService[i];
System.out.println("Printer: " + printers[i] + " selected");
return;
}
}
}
/**
* Prints a string to the selected printer
*
* @param text data as String
*/
public void printString(String text) {
PrintService service = selectedPrinter;
DocPrintJob job = service.createPrintJob();
try {
byte[] bytes;
bytes = text.getBytes(StandardCharsets.UTF_8);
Doc doc = new SimpleDoc(bytes, flavor, null);
job.print(doc, null);
}
catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public int print(Graphics g, PageFormat pf, int page) throws PrinterException {
if (page > 0) { /* We have only one page, and 'page' is zero-based */
return NO_SUCH_PAGE;
}
/*
* User (0,0) is typically outside the imageable area, so we must translate by
* the X and Y values in the PageFormat to avoid clipping
*/
Graphics2D g2d = (Graphics2D) g;
g2d.translate(pf.getImageableX(), pf.getImageableY());
/* Now we perform our rendering */
return PAGE_EXISTS;
}
public void printBytes(byte[] bytes) {
PrintService service = selectedPrinter;
DocPrintJob job = service.createPrintJob();
try {
Doc doc = new SimpleDoc(bytes, flavor, null);
job.print(doc, null);
}
catch (Exception e) {
e.printStackTrace();
}
}
public void cutPaper() {
byte[] cutP = new byte[] { 0x1d, 'V', 1 };
printBytes(cutP);
}
}

View File

@ -0,0 +1,238 @@
package com.jFxKasse.controller;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Properties;
public class XMLController {
private String databaseName = null;
private String printername = null;
private int linebreak;
private int offsetHeader;
private int offsetFooter;
private String header = null;
private String footer = null;
private boolean categorySplitted;
private boolean autoPrintBill;
private String filePath = null;
private Properties props = null;
public XMLController(String filePath) {
this.filePath = filePath + "config.xml";
props = new Properties();
}
public void saveSettings() throws Exception { // Save settings to config.xml
System.out.println("Saving XML");
OutputStream outputStream;
String linebreak = Integer.toString(this.linebreak);
String offsetHeader = Integer.toString(this.offsetHeader);
String offsetFooter = Integer.toString(this.offsetFooter);
String categorySplitted = null;
if (this.categorySplitted) {
categorySplitted = "true";
}
else {
categorySplitted = "false";
}
String autoPrintBill = null;
if (this.autoPrintBill) {
autoPrintBill = "true";
}
else {
autoPrintBill = "false";
}
try {
props.setProperty("databasename", this.databaseName);
props.setProperty("printername", this.printername);
props.setProperty("linebreak", linebreak);
props.setProperty("offsetHeader", offsetHeader);
props.setProperty("offsetFooter", offsetFooter);
props.setProperty("header", this.header);
props.setProperty("footer", this.footer);
props.setProperty("categorySplitted", categorySplitted);
props.setProperty("autoPrintBill", autoPrintBill);
outputStream = new FileOutputStream(filePath);
props.storeToXML(outputStream, "jFxKasse settings");
outputStream.close();
}
catch (IOException e) {
}
}
public boolean loadSettings() throws Exception { // Read settings from config.xml
InputStream inputStream;
try {
inputStream = new FileInputStream(filePath);
props.loadFromXML(inputStream);
this.databaseName = (props.getProperty("databasename"));
this.printername = (props.getProperty("printername"));
try {
this.linebreak = Integer.valueOf(props.getProperty("linebreak"));
}
catch (Exception e) {
this.linebreak = 28;
}
try {
this.offsetHeader = Integer.valueOf(props.getProperty("offsetHeader"));
}
catch (Exception e) {
this.offsetHeader = 1;
}
try {
this.offsetFooter = Integer.valueOf(props.getProperty("offsetFooter"));
}
catch (Exception e) {
this.offsetFooter = 2;
}
this.header = (props.getProperty("header"));
this.footer = (props.getProperty("footer"));
try {
if (props.getProperty("categorySplitted").equals("true")) {
this.categorySplitted = true;
}
else {
this.categorySplitted = false;
}
}
catch (Exception e) {
this.categorySplitted = false;
}
try {
if (props.getProperty("autoPrintBill").equals("true")) {
this.autoPrintBill = true;
}
else {
this.autoPrintBill = false;
}
}
catch (Exception e) {
this.autoPrintBill = false;
}
inputStream.close();
return true;
}
catch (IOException e) {
e.printStackTrace();
return false;
}
}
public void initXML() {
this.printername = "Drucker auswählen";
this.offsetHeader = 1;
this.offsetFooter = 2;
this.linebreak = 28;
this.categorySplitted = false;
this.autoPrintBill = false;
this.header = "XYZ GmbH";
this.footer = "Vielen Dank für den Einkauf";
}
public String getDatabaseName() {
return databaseName;
}
public void setDatabaseName(String databaseName) {
this.databaseName = databaseName;
}
public String getPrintername() {
return printername;
}
public void setPrintername(String printername) {
this.printername = printername;
}
public int getLinebreak() {
return linebreak;
}
public void setLinebreak(int linebreak) {
this.linebreak = linebreak;
}
public int getOffsetHeader() {
return offsetHeader;
}
public void setOffsetHeader(int offsetHeader) {
this.offsetHeader = offsetHeader;
}
public int getOffsetFooter() {
return offsetFooter;
}
public void setOffsetFooter(int offsetFooter) {
this.offsetFooter = offsetFooter;
}
public String getHeader() {
return header;
}
public void setHeader(String header) {
this.header = header;
}
public String getFooter() {
return footer;
}
public void setFooter(String footer) {
this.footer = footer;
}
public boolean getCategorySplitted() {
return categorySplitted;
}
public void setCategorySplitted(boolean categorySplitted) {
this.categorySplitted = categorySplitted;
}
public boolean getAutoPrintBill() {
return autoPrintBill;
}
public void setAutoPrintBill(boolean autoPrintBill) {
this.autoPrintBill = autoPrintBill;
}
}

View File

@ -0,0 +1,25 @@
package com.jFxKasse.datatypes;
public class Category {
private String categoryName;
private String positionsString = "\n";
public Category(String categoryName) {
this.categoryName = categoryName;
}
public String getCategoryName() {
return categoryName;
}
public void addPosition(int quantity, String name, String value, PrintData pd) {
for (int i = 0; i < quantity; i++) {
positionsString = positionsString + pd.setRight(pd.breakLines(name), value + "") + "\n";
}
}
public String getPositionsString() {
return positionsString;
}
}

View File

@ -1,10 +1,10 @@
package application; package com.jFxKasse.datatypes;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.ArrayList; import java.util.ArrayList;
public class Job public class Job {
{
private int jobnumber; private int jobnumber;
private float jobvalue; private float jobvalue;
@ -19,48 +19,39 @@ public class Job
private ArrayList<String> positionenCat; private ArrayList<String> positionenCat;
public Job(int pJobnumber, String pTime) public Job(int pJobnumber) {
{
this.jobnumber = pJobnumber; this.jobnumber = pJobnumber;
this.jobtime = pTime;
positionenQuantity = new ArrayList<Integer>(); positionenQuantity = new ArrayList<Integer>();
positionenName = new ArrayList<String>(); positionenName = new ArrayList<String>();
positionenValue = new ArrayList<Float>(); positionenValue = new ArrayList<Float>();
positionenCat = new ArrayList<String>(); positionenCat = new ArrayList<String>();
// System.out.println("Größe: " + positionenName.size());
} }
public int getJobnumber() public void setJobtime(String jobtime) {
{ this.jobtime = jobtime;
}
public int getJobnumber() {
return this.jobnumber; return this.jobnumber;
} }
public String getJobtime() public String getJobtime() {
{
return this.jobtime; return this.jobtime;
} }
public float getJobValue() public float getJobValue() {
{
calcJobValue(); calcJobValue();
return this.jobvalue; return this.jobvalue;
} }
public void addPosition(String pPositionenName, float pPositionenValue, public void addPosition(String pPositionenName, float pPositionenValue, String pPositionenCat) {
String pPositionenCat)
{
// System.out.println("addName");
for (int i = 0; i < positionenName.size(); i++) { for (int i = 0; i < positionenName.size(); i++) {
if (positionenName.get(i).equals(pPositionenName)) { if (positionenName.get(i).equals(pPositionenName)) {
// Item is already in list, increase quantity // Item is already in list, increase quantity
positionenQuantity.set(i, positionenQuantity.get(i) + 1); positionenQuantity.set(i, positionenQuantity.get(i) + 1);
// System.out.println("Item exists, increasing quantity");
return; return;
} }
} }
@ -73,65 +64,44 @@ public class Job
calcJobValue(); calcJobValue();
} }
public void printJobOnConsole() public void printJobOnConsole() {
{
System.out.println("---------------------------------------------"); System.out.println("---------------------------------------------");
System.out.println("JobNummer: " + jobnumber); System.out.println("JobNummer: " + jobnumber);
System.out.println("---------------------------------------------"); System.out.println("---------------------------------------------");
// System.out.println("Größe: " + positionenName.size());
for (int i = 0; i < positionenName.size(); i++) { for (int i = 0; i < positionenName.size(); i++) {
System.out.println( System.out.println(positionenQuantity.get(i) + " " + positionenName.get(i) + " " + positionenValue.get(i)
positionenQuantity.get(i) + " " + positionenName.get(i) + " " + " " + positionenCat.get(i));
+ positionenValue.get(i) + " " + positionenCat.get(i));
/*
* System.out.println("i is: " + i);
* System.out.println(positionenName.get(i));
* System.out.println(positionenQuantity.get(i));
*/
} }
System.out.println("---------------------------------------------"); System.out.println("---------------------------------------------");
} }
public ArrayList<tableDataCurrentOrder> getCurrentJobPositionen() public ArrayList<tableDataCurrentOrder> getCurrentJobPositionen() {
{
ArrayList<tableDataCurrentOrder> jobitems = new ArrayList<tableDataCurrentOrder>(); ArrayList<tableDataCurrentOrder> jobitems = new ArrayList<tableDataCurrentOrder>();
for (int i = 0; i < positionenName.size(); i++) { for (int i = 0; i < positionenName.size(); i++) {
tableDataCurrentOrder tmp = new tableDataCurrentOrder( tableDataCurrentOrder tmp = new tableDataCurrentOrder(positionenName.get(i), positionenQuantity.get(i));
positionenName.get(i), positionenQuantity.get(i));
jobitems.add(tmp); jobitems.add(tmp);
} }
return jobitems; return jobitems;
} }
private void calcJobValue() private void calcJobValue() {
{
jobvalue = 0; jobvalue = 0;
for (int i = 0; i < positionenValue.size(); i++) { for (int i = 0; i < positionenValue.size(); i++) {
jobvalue = jobvalue + (positionenQuantity.get(i) * positionenValue.get(i));
jobvalue = jobvalue
+ (positionenQuantity.get(i) * positionenValue.get(i));
} }
// Round to two decimal places
jobvalue = BigDecimal.valueOf(jobvalue).setScale(2, RoundingMode.HALF_UP).floatValue();
} }
public String createPosQuantityDBString() public String createPosQuantityDBString() {
{
String tmp = String.valueOf(positionenQuantity.get(0)); String tmp = String.valueOf(positionenQuantity.get(0));
for (int i = 1; i < positionenName.size(); i++) { for (int i = 1; i < positionenName.size(); i++) {
@ -140,8 +110,7 @@ public class Job
return tmp; return tmp;
} }
public String createPosNameDBString() public String createPosNameDBString() {
{
String tmp = positionenName.get(0); String tmp = positionenName.get(0);
for (int i = 1; i < positionenName.size(); i++) { for (int i = 1; i < positionenName.size(); i++) {
@ -150,8 +119,7 @@ public class Job
return tmp; return tmp;
} }
public String createPosValueDBString() public String createPosValueDBString() {
{
String tmp = String.valueOf(positionenValue.get(0)); String tmp = String.valueOf(positionenValue.get(0));
for (int i = 1; i < positionenName.size(); i++) { for (int i = 1; i < positionenName.size(); i++) {
@ -160,8 +128,7 @@ public class Job
return tmp; return tmp;
} }
public String createPosCatDBString() public String createPosCatDBString() {
{
String tmp = positionenCat.get(0); String tmp = positionenCat.get(0);
for (int i = 1; i < positionenName.size(); i++) { for (int i = 1; i < positionenName.size(); i++) {
@ -170,8 +137,7 @@ public class Job
return tmp; return tmp;
} }
public void deletePosName(String pPosName) public void deletePosName(String pPosName) {
{
for (int i = 0; i < positionenName.size(); i++) { for (int i = 0; i < positionenName.size(); i++) {
@ -179,7 +145,8 @@ public class Job
if (positionenQuantity.get(i) > 1) { if (positionenQuantity.get(i) > 1) {
positionenQuantity.set(i, positionenQuantity.get(i) - 1); positionenQuantity.set(i, positionenQuantity.get(i) - 1);
} else { }
else {
positionenQuantity.remove(i); positionenQuantity.remove(i);
positionenName.remove(i); positionenName.remove(i);
@ -194,8 +161,15 @@ public class Job
} }
public boolean existsPosName(String pPosName) public void clearAllPositions() {
{ positionenQuantity.clear();
positionenName.clear();
positionenValue.clear();
positionenCat.clear();
jobvalue = 0;
}
public boolean existsPosName(String pPosName) {
for (int i = 0; i < positionenName.size(); i++) { for (int i = 0; i < positionenName.size(); i++) {
if (positionenName.get(i).equals(pPosName)) { if (positionenName.get(i).equals(pPosName)) {
return true; return true;

View File

@ -0,0 +1,180 @@
package com.jFxKasse.datatypes;
public abstract class PrintData {
protected int headerSpace;
protected int footerSpace;
protected int lineBreak;
protected String header;
protected String footer;
protected String positionsQuantity;
protected String positionsName;
protected String positionsValue;
protected String positionsCategory;
protected String jobID;
protected String timeAndDateOrder;
protected String timeAndDatePrint;
protected String jobValue;
/**
* Constructor with all data that is not stored in the DB
*
* @param lineBreak
* @param headerSpace
* @param footerSpace
* @param timeAndDatePrint
* @param header
* @param footer
*/
public PrintData(int lineBreak, int headerSpace, int footerSpace, String timeAndDatePrint, String header,
String footer) {
this.lineBreak = lineBreak;
this.headerSpace = headerSpace;
this.footerSpace = footerSpace;
this.timeAndDatePrint = timeAndDatePrint;
this.header = header;
this.footer = footer;
}
/**
* Set all data that is stored in the DB
*
* @param jobID
* @param timeAndDateOrder
* @param positionenQuantity
* @param positionenName
* @param positionenValue
* @param positionenCategory
* @param jobValue
*/
public void setData(String jobID, String timeAndDateOrder, String positionsQuantity, String positionsName,
String positionsValue, String positionsCategory, String jobValue) {
this.jobID = jobID;
this.timeAndDateOrder = timeAndDateOrder;
this.positionsQuantity = positionsQuantity;
this.positionsName = positionsName;
this.positionsValue = positionsValue;
this.positionsCategory = positionsCategory;
this.jobValue = jobValue;
}
/**
* Breaks a string with newlines after the max line length
*
* @param data String
* @return the same String split with \n after max line length
*/
protected String breakLines(String data) {
boolean next = false;
int count = lineBreak;
if (data.length() > lineBreak) {
// Needs to be split
next = true;
}
else {
// No need to split
return data;
}
// First part
String tmp = data.substring(0, lineBreak);
while (next) {
try {
tmp = tmp + "\n" + data.substring(count, lineBreak + count);
count = count + lineBreak;
}
catch (Exception e) {
// Data string not long enough
next = false;
}
}
// Add the last part
return tmp + "\n" + data.substring(count);
}
/**
* Prints a line of dashes '--------'
*
* @return separator line
*/
protected String getSeparator() {
String tmp = "-";
for (int i = 1; i < lineBreak; i++) {
tmp = tmp + "-";
}
return tmp;
}
/**
* Centers a string within the line width
*
* @param data
* @return the centered string
*/
protected String setCenter(String data) {
int dataLenght = data.length();
int prefix = ((lineBreak - dataLenght) / 2);
String tmp = " ";
for (int i = 1; i < prefix; i++) {
tmp = tmp + " ";
}
tmp = tmp + data;
return breakLines(tmp);
}
/**
* Right-justifies a string after a prefix
*
* @param prefix
* @param data
* @return the right-justified string
*/
protected String setRight(String prefix, String data) {
int prefixLenght = prefix.length();
int dataLenght = data.length();
String tmp = prefix;
int fill = lineBreak - (prefixLenght + dataLenght);
if (fill < 0) {
tmp = tmp + "\n";
fill = lineBreak - dataLenght;
}
for (int i = 0; i < fill; i++) {
tmp = tmp + " ";
}
tmp = tmp + data;
return tmp;
}
/**
* Defines how the print string(s) are generated
*/
abstract protected void generatePrintString();
}

View File

@ -0,0 +1,86 @@
package com.jFxKasse.datatypes;
public class PrintDataSimple extends PrintData {
private String printString;
/**
* Constructor with all data that is not stored in the DB
*
* @param lineBreak
* @param headerSpace
* @param footerSpace
* @param timeAndDatePrint
* @param header
* @param footer
*/
public PrintDataSimple(int lineBreak, int headerSpace, int footerSpace, String timeAndDatePrint, String header,
String footer) {
super(lineBreak, headerSpace, footerSpace, timeAndDatePrint, header, footer);
}
/**
* Generates the print string
*
* @return the final print string
*/
public String getPrintString() {
generatePrintString();
return this.printString;
}
@Override
protected void generatePrintString() {
/* Header */
String header = " ";
for (int i = 1; i < headerSpace; i++) {
header = header + "\n";
}
// This is the final header
header = header + setCenter(this.header);
/* Info */
String info = setRight("Bestellung: ", timeAndDateOrder) + "\n" + setRight("Druck: ", timeAndDatePrint) + "\n"
+ setRight("Bestellnummer: ", jobID);
/* Positionen */
String positionen = "\n";
int posCount = positionsQuantity.length() - positionsQuantity.replace(";", "").length() + 1;
String[] positionQuantity = positionsQuantity.split(";");
String[] positionName = positionsName.split(";");
String[] positionValue = positionsValue.split(";");
for (int i = 0; i < posCount; i++) { // All different posNames
int quantity = Integer.parseInt(positionQuantity[i]);
for (int j = 0; j < quantity; j++) { // quantities
positionen = positionen + setRight(breakLines(positionName[i]), positionValue[i] + "") + "\n";
}
}
/* Price */
String price = setRight("Gesamt: ", (jobValue + ""));
/* Footer */
String footer = setCenter(this.footer);
for (int i = 1; i < footerSpace; i++) {
footer = footer + "\n";
}
footer = footer + "_";
/* Build final Print String */
printString = header + "\n" + getSeparator() + "\n" + info + "\n" + getSeparator() + "\n" + positionen + "\n"
+ getSeparator() + "\n" + price + "\n" + getSeparator() + "\n" + footer;
}
}

View File

@ -0,0 +1,157 @@
package com.jFxKasse.datatypes;
import java.util.ArrayList;
public class PrintDataSplitted extends PrintData {
private ArrayList<String> printString = new ArrayList<String>();
private ArrayList<Category> categories = new ArrayList<Category>();
private int categoryCount = 0;
/**
* Constructor with all data that is not stored in the DB
*
* @param lineBreak
* @param headerSpace
* @param footerSpace
* @param timeAndDatePrint
* @param header
* @param footer
*/
public PrintDataSplitted(int lineBreak, int headerSpace, int footerSpace, String timeAndDatePrint, String header,
String footer) {
super(lineBreak, headerSpace, footerSpace, timeAndDatePrint, header, footer);
}
/**
* Generates the print strings
*
* @return the final array of print strings
*/
public ArrayList<String> getPrintStrings() {
generatePrintString();
return printString;
}
@Override
protected void generatePrintString() {
String firstBill;
/* Header */
String header = "-";
for (int i = 1; i < headerSpace; i++) {
header = header + "\n";
}
// This is the final header
header = header + setCenter(this.header);
/* Info */
String info = setRight("Bestellung: ", timeAndDateOrder) + "\n" + setRight("Druck: ", timeAndDatePrint) + "\n"
+ setRight("Bestellnummer: ", jobID);
/* Splitted Bills by Category */
/* Price */
String price = setRight("Gesamt: ", (jobValue + ""));
/* Footer */
String footer = setCenter(this.footer);
for (int i = 1; i < footerSpace; i++) {
footer = footer + "\n";
}
footer = footer + "_";
/* Build first Print String */
firstBill = header + "\n" + getSeparator() + "\n" + info + "\n" + getSeparator() + "\n"
+ setCenter("Bon wurde aufgeteilt") + "\n" + getSeparator() + "\n" + price + "\n" + getSeparator()
+ "\n" + footer;
printString.add(firstBill);
/* First bill ends here */
/* Category-specific extra bills */
String positions = null;
int posCount = positionsQuantity.length() - positionsQuantity.replace(";", "").length() + 1;
String[] positionQuantity = positionsQuantity.split(";");
String[] positionName = positionsName.split(";");
String[] positionValue = positionsValue.split(";");
String[] positionCategory = positionsCategory.split(";");
for (int i = 0; i < posCount; i++) { // All different posNames
int quantity = Integer.parseInt(positionQuantity[i]);
insertToCategory(quantity, positionName[i], positionValue[i], positionCategory[i]);
}
// Loops through all categories
for (int i = 0; i < categories.size(); i++) {
String thisBill;
/* Header */
header = " ";
for (int o = 1; o < headerSpace; o++) {
header = header + "\n";
}
// This is the final header
header = header + setCenter(this.header);
/* Info */
info = setRight("Bestellung: ", timeAndDateOrder) + "\n" + setRight("Druck: ", timeAndDatePrint) + "\n"
+ setRight("Bestellnummer: ", jobID);
/* Positions */
positions = categories.get(i).getPositionsString();
/* Footer */
footer = "\n";
for (int o = 2; o < footerSpace; o++) {
footer = footer + "\n";
}
footer = footer + "_";
thisBill = header + "\n" + getSeparator() + "\n" + info + "\n" + getSeparator() + "\n"
+ setCenter(categories.get(i).getCategoryName()) + "\n" + getSeparator() + positions + "\n"
+ getSeparator() + "\n" + footer;
printString.add(thisBill);
}
}
private void insertToCategory(int quantity, String name, String value, String category) {
boolean createNewCategorie = true;
for (int i = 0; i < categoryCount; i++) {
if (category.equals(categories.get(i).getCategoryName())) {
categories.get(i).addPosition(quantity, name, value, this);
createNewCategorie = false;
}
}
if (createNewCategorie) {
// Position has a new category
categories.add(new Category(category));
categories.get(categoryCount).addPosition(quantity, name, value, this);
categoryCount++;
}
}
}

View File

@ -1,51 +1,42 @@
package application; package com.jFxKasse.datatypes;
import javafx.beans.property.IntegerProperty; import javafx.beans.property.IntegerProperty;
import javafx.beans.property.SimpleIntegerProperty; import javafx.beans.property.SimpleIntegerProperty;
import javafx.beans.property.SimpleStringProperty; import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty; import javafx.beans.property.StringProperty;
public class tableDataCurrentOrder public class tableDataCurrentOrder {
{
private final StringProperty position = new SimpleStringProperty(); private final StringProperty position = new SimpleStringProperty();
private final IntegerProperty quantity = new SimpleIntegerProperty(); private final IntegerProperty quantity = new SimpleIntegerProperty();
public tableDataCurrentOrder(final String pPosition, final Integer pQuantity) public tableDataCurrentOrder(final String pPosition, final Integer pQuantity) {
{
this.position.set(pPosition); this.position.set(pPosition);
this.quantity.set(pQuantity); this.quantity.set(pQuantity);
} }
public StringProperty positionProperty() public StringProperty positionProperty() {
{
return position; return position;
} }
public IntegerProperty quantityProperty() public IntegerProperty quantityProperty() {
{
return quantity; return quantity;
} }
public String getPosition() public String getPosition() {
{
return positionProperty().get(); return positionProperty().get();
} }
public Integer getQuantity() public Integer getQuantity() {
{
return quantityProperty().get(); return quantityProperty().get();
} }
public final void setPosition(String pPosition) public final void setPosition(String pPosition) {
{
positionProperty().set(pPosition); positionProperty().set(pPosition);
} }
public final void setQuantity(int pQuantity) public final void setQuantity(int pQuantity) {
{
quantityProperty().set(pQuantity); quantityProperty().set(pQuantity);
} }
} }

View File

@ -1,12 +1,11 @@
package application; package com.jFxKasse.datatypes;
import javafx.beans.property.IntegerProperty; import javafx.beans.property.IntegerProperty;
import javafx.beans.property.SimpleIntegerProperty; import javafx.beans.property.SimpleIntegerProperty;
import javafx.beans.property.SimpleStringProperty; import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty; import javafx.beans.property.StringProperty;
public class tableDataJob public class tableDataJob {
{
private final IntegerProperty number = new SimpleIntegerProperty(); private final IntegerProperty number = new SimpleIntegerProperty();
@ -18,9 +17,8 @@ public class tableDataJob
private final StringProperty value = new SimpleStringProperty(); private final StringProperty value = new SimpleStringProperty();
public tableDataJob(final Integer pNumber, final String pTime, public tableDataJob(final Integer pNumber, final String pTime, final String pPositionen, final String pStatus,
final String pPositionen, final String pStatus, final String pValue) final String pValue) {
{
this.number.set(pNumber); this.number.set(pNumber);
this.time.set(pTime); this.time.set(pTime);
this.positionen.set(pPositionen); this.positionen.set(pPositionen);
@ -29,78 +27,63 @@ public class tableDataJob
} }
public IntegerProperty numberProperty() public IntegerProperty numberProperty() {
{
return number; return number;
} }
public StringProperty timeProperty() public StringProperty timeProperty() {
{
return time; return time;
} }
public StringProperty positionProperty() public StringProperty positionProperty() {
{
return positionen; return positionen;
} }
public StringProperty statusProperty() public StringProperty statusProperty() {
{
return status; return status;
} }
public StringProperty valueProperty() public StringProperty valueProperty() {
{
return value; return value;
} }
public Integer getNumber() public Integer getNumber() {
{
return numberProperty().get(); return numberProperty().get();
} }
public String getTime() public String getTime() {
{
return timeProperty().get(); return timeProperty().get();
} }
public String getPosition() public String getPosition() {
{
return positionProperty().get(); return positionProperty().get();
} }
public String getStatus() public String getStatus() {
{
return statusProperty().get(); return statusProperty().get();
} }
public String getValue() public String getValue() {
{
return valueProperty().get(); return valueProperty().get();
} }
public final void setNumber(int pNumber) public final void setNumber(int pNumber) {
{
numberProperty().set(pNumber); numberProperty().set(pNumber);
} }
public final void setTime(String pTime) public final void setTime(String pTime) {
{
timeProperty().set(pTime); timeProperty().set(pTime);
} }
public final void setPosition(String pPosition) public final void setPosition(String pPosition) {
{
positionProperty().set(pPosition); positionProperty().set(pPosition);
} }
public final void setStatus(String pStatus) public final void setStatus(String pStatus) {
{
statusProperty().set(pStatus); statusProperty().set(pStatus);
} }
public final void setValue(String pValue) public final void setValue(String pValue) {
{
valueProperty().set(pValue); valueProperty().set(pValue);
} }

View File

@ -1,12 +1,11 @@
package application; package com.jFxKasse.datatypes;
import javafx.beans.property.IntegerProperty; import javafx.beans.property.IntegerProperty;
import javafx.beans.property.SimpleIntegerProperty; import javafx.beans.property.SimpleIntegerProperty;
import javafx.beans.property.SimpleStringProperty; import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty; import javafx.beans.property.StringProperty;
public class tableDataPositionen public class tableDataPositionen { // Data object with id, name, value, color
{ // data-object with id, name, value, color
private final IntegerProperty id = new SimpleIntegerProperty(); private final IntegerProperty id = new SimpleIntegerProperty();
@ -18,8 +17,8 @@ public class tableDataPositionen
private final StringProperty color = new SimpleStringProperty(); private final StringProperty color = new SimpleStringProperty();
public tableDataPositionen(final int id, final String name, final String value, final String cat, final String color) public tableDataPositionen(final int id, final String name, final String value, final String cat,
{ final String color) {
this.id.set(id); this.id.set(id);
this.name.set(name); this.name.set(name);
this.value.set(value); this.value.set(value);
@ -27,18 +26,15 @@ public class tableDataPositionen
this.color.set(color); this.color.set(color);
} }
public IntegerProperty idProperty() public IntegerProperty idProperty() {
{
return id; return id;
} }
public StringProperty nameProperty() public StringProperty nameProperty() {
{
return name; return name;
} }
public StringProperty valueProperty() public StringProperty valueProperty() {
{
return value; return value;
} }
@ -46,23 +42,19 @@ public class tableDataPositionen
return cat; return cat;
} }
public StringProperty colorProperty() public StringProperty colorProperty() {
{
return color; return color;
} }
public int getID() public int getID() {
{
return idProperty().get(); return idProperty().get();
} }
public String getName() public String getName() {
{
return nameProperty().get(); return nameProperty().get();
} }
public String getValue() public String getValue() {
{
return valueProperty().get(); return valueProperty().get();
} }
@ -70,23 +62,19 @@ public class tableDataPositionen
return catProperty().get(); return catProperty().get();
} }
public String getColor() public String getColor() {
{
return colorProperty().get(); return colorProperty().get();
} }
public final void setID(int id) public final void setID(int id) {
{
idProperty().set(id); idProperty().set(id);
} }
public final void setName(String name) public final void setName(String name) {
{
nameProperty().set(name); nameProperty().set(name);
} }
public final void setValue(String value) public final void setValue(String value) {
{
valueProperty().set(value); valueProperty().set(value);
} }
@ -94,8 +82,7 @@ public class tableDataPositionen
catProperty().set(cat); catProperty().set(cat);
} }
public final void setColor(String color) public final void setColor(String color) {
{
colorProperty().set(color); colorProperty().set(color);
} }
} }

View File

@ -0,0 +1 @@
/* JavaFX CSS - Leave this comment until you have at least one rule which uses -fx-Property */

View File

@ -0,0 +1,552 @@
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.control.CheckBox?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.ChoiceBox?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.Spinner?>
<?import javafx.scene.control.Tab?>
<?import javafx.scene.control.TabPane?>
<?import javafx.scene.control.TitledPane?>
<?import javafx.scene.control.TreeTableColumn?>
<?import javafx.scene.control.TreeTableView?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.ColumnConstraints?>
<?import javafx.scene.layout.GridPane?>
<?import javafx.scene.layout.RowConstraints?>
<?import javafx.scene.shape.Line?>
<?import javafx.scene.text.Font?>
<AnchorPane fx:id="mainAnchorpane" maxHeight="732.0" maxWidth="1366.0" minHeight="732.0" minWidth="1366.0" prefHeight="732.0" prefWidth="1366.0" xmlns="http://javafx.com/javafx/9" xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.jFxKasse.controller.MainWindowController">
<children>
<TabPane layoutX="4.0" layoutY="5.0" nodeOrientation="RIGHT_TO_LEFT" prefHeight="924.0" prefWidth="1536.0" tabClosingPolicy="UNAVAILABLE" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
<tabs>
<Tab fx:id="tapSettings" text="Einstellungen">
<content>
<AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="180.0" prefWidth="200.0">
<children>
<Button fx:id="ueberbtn" layoutX="273.0" layoutY="448.0" mnemonicParsing="false" onAction="#ueberbtnAction" prefHeight="35.0" prefWidth="324.0" text="Informationen über jFxKasse">
<font>
<Font name="Cantarell Regular" size="18.0"/>
</font>
</Button>
<TitledPane alignment="CENTER" animated="false" collapsible="false" contentDisplay="CENTER" layoutX="790.0" layoutY="10.0" prefHeight="270.0" prefWidth="566.0" text="Datenbank Einstellungen">
<content>
<AnchorPane fx:id="paneDB" minHeight="0.0" minWidth="0.0" prefHeight="238.0" prefWidth="564.0">
<children>
<Label fx:id="labelDBName" alignment="TOP_RIGHT" contentDisplay="RIGHT" layoutX="329.0" layoutY="10.0" prefHeight="34.0" prefWidth="229.0" text="Datenbankname:">
<font>
<Font name="Cantarell Regular" size="18.0"/>
</font>
</Label>
<TextField fx:id="tftNewDBName" alignment="CENTER" layoutX="25.0" layoutY="10.0" prefHeight="25.0" prefWidth="376.0">
<font>
<Font name="Cantarell Regular" size="18.0"/>
</font>
</TextField>
<Label fx:id="labelDBStatus" alignment="TOP_RIGHT" contentDisplay="RIGHT" layoutX="1.0" layoutY="75.0" prefHeight="34.0" prefWidth="551.0" text="Keine Datenbank gefunden!">
<font>
<Font name="Cantarell Regular" size="18.0"/>
</font>
</Label>
<Button fx:id="btnCreateNewDatabase" layoutX="317.0" layoutY="126.0" mnemonicParsing="false" onAction="#btnCreateNewDatabaseAction" text="Neue Datenbank anlegen">
<font>
<Font name="Cantarell Regular" size="13.0"/>
</font>
</Button>
<Button fx:id="btnOpenFolder" layoutX="99.0" layoutY="126.0" mnemonicParsing="false" onAction="#btnOpenFolderAction" text="Speicherort öffnen">
<font>
<Font name="Cantarell Regular" size="13.0"/>
</font>
</Button>
<Label fx:id="labelFirstStart" alignment="CENTER" layoutX="1.0" layoutY="170.0" prefHeight="50.0" prefWidth="551.0" text="⚠ Erststart: Bitte geben Sie einen Datenbanknamen ein und klicken Sie auf 'Neue Datenbank anlegen'." textFill="#cc0000" visible="false" wrapText="true">
<font>
<Font name="Cantarell Bold" size="14.0"/>
</font>
</Label>
</children>
</AnchorPane>
</content>
<font>
<Font name="Cantarell Regular" size="13.0"/>
</font>
</TitledPane>
<TitledPane fx:id="titlePaneCat" alignment="CENTER" animated="false" collapsible="false" contentDisplay="CENTER" layoutX="170.0" layoutY="10.0" prefHeight="270.0" prefWidth="566.0" text="Kategorien (z.B. Getränke, Essen oder Kuchen)" textAlignment="CENTER">
<content>
<AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="260.0" prefWidth="564.0">
<children>
<Label fx:id="labelCat01" alignment="TOP_RIGHT" contentDisplay="RIGHT" layoutX="434.0" layoutY="10.0" prefHeight="34.0" prefWidth="124.0" text="Kategorie 1:">
<font>
<Font name="Cantarell Regular" size="18.0"/>
</font>
</Label>
<Label fx:id="labelCat02" alignment="TOP_RIGHT" contentDisplay="RIGHT" layoutX="442.0" layoutY="50.0" prefHeight="34.0" prefWidth="116.0" text="Kategorie 2:">
<font>
<Font name="Cantarell Regular" size="18.0"/>
</font>
</Label>
<Label fx:id="labelCat05" alignment="TOP_RIGHT" contentDisplay="RIGHT" layoutX="448.0" layoutY="170.0" prefHeight="34.0" prefWidth="110.0" text="Kategorie 5:">
<font>
<Font name="Cantarell Regular" size="18.0"/>
</font>
</Label>
<Label fx:id="labelCat04" alignment="TOP_RIGHT" contentDisplay="RIGHT" layoutX="454.0" layoutY="130.0" prefHeight="34.0" prefWidth="104.0" text="Kategorie 4:">
<font>
<Font name="Cantarell Regular" size="18.0"/>
</font>
</Label>
<Label fx:id="labelCat03" alignment="TOP_RIGHT" contentDisplay="RIGHT" layoutX="451.0" layoutY="90.0" prefHeight="34.0" prefWidth="107.0" text="Kategorie 3:">
<font>
<Font name="Cantarell Regular" size="18.0"/>
</font>
</Label>
<TextField fx:id="tftKat01" alignment="CENTER" layoutX="50.0" layoutY="5.0" prefHeight="25.0" prefWidth="376.0">
<font>
<Font name="Cantarell Regular" size="18.0"/>
</font>
</TextField>
<TextField fx:id="tftKat02" alignment="CENTER" layoutX="50.0" layoutY="45.0" prefHeight="25.0" prefWidth="376.0">
<font>
<Font name="Cantarell Regular" size="18.0"/>
</font>
</TextField>
<TextField fx:id="tftKat03" alignment="CENTER" layoutX="50.0" layoutY="85.0" prefHeight="25.0" prefWidth="376.0">
<font>
<Font name="Cantarell Regular" size="18.0"/>
</font>
</TextField>
<TextField fx:id="tftKat04" alignment="CENTER" layoutX="50.0" layoutY="125.0" prefHeight="25.0" prefWidth="376.0">
<font>
<Font name="Cantarell Regular" size="18.0"/>
</font>
</TextField>
<TextField fx:id="tftKat05" alignment="CENTER" layoutX="50.0" layoutY="165.0" prefHeight="25.0" prefWidth="376.0">
<font>
<Font name="Cantarell Regular" size="18.0"/>
</font>
</TextField>
<Button fx:id="btnSaveCat" layoutX="200.0" layoutY="204.0" mnemonicParsing="false" onAction="#btnSaveCatAction" text="Kategorien speichern">
<font>
<Font name="Cantarell Regular" size="13.0"/>
</font>
</Button>
</children>
</AnchorPane>
</content>
<font>
<Font name="Cantarell Regular" size="13.0"/>
</font>
</TitledPane>
<TitledPane fx:id="titlePanePrint" alignment="CENTER" animated="false" collapsible="false" contentDisplay="CENTER" layoutX="790.0" layoutY="330.0" prefHeight="270.0" prefWidth="566.0" text="Drucker Einstellungen">
<content>
<AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="327.0" prefWidth="564.0">
<children>
<ChoiceBox fx:id="printerChoise" layoutX="270.0" layoutY="10.0" nodeOrientation="LEFT_TO_RIGHT" prefHeight="25.0" prefWidth="178.0"/>
<Spinner fx:id="linesSpinner" layoutX="35.0" layoutY="10.0" nodeOrientation="LEFT_TO_RIGHT" prefHeight="25.0" prefWidth="92.0"/>
<TextField fx:id="tftheader" alignment="CENTER" layoutX="65.0" layoutY="90.0" nodeOrientation="LEFT_TO_RIGHT" prefHeight="25.0" prefWidth="377.0">
<font>
<Font name="Cantarell Regular" size="18.0"/>
</font>
</TextField>
<CheckBox fx:id="switchSeparate" layoutX="270.0" layoutY="170.0" text="Kategorien separat drucken">
<font>
<Font name="Cantarell Regular" size="18.0"/>
</font>
</CheckBox>
<CheckBox fx:id="switchAutoPrint" layoutX="270.0" layoutY="200.0" text="Bon direkt drucken">
<font>
<Font name="Cantarell Regular" size="18.0"/>
</font>
</CheckBox>
<Label alignment="TOP_RIGHT" contentDisplay="RIGHT" layoutX="450.0" layoutY="10.0" prefHeight="34.0" prefWidth="107.0" text="Drucker:">
<font>
<Font name="Cantarell Regular" size="18.0"/>
</font>
</Label>
<Label alignment="TOP_RIGHT" contentDisplay="RIGHT" layoutX="140.0" layoutY="10.0" prefHeight="34.0" prefWidth="107.0" text="Zeilenlänge:">
<font>
<Font name="Cantarell Regular" size="18.0"/>
</font>
</Label>
<Label alignment="TOP_RIGHT" contentDisplay="RIGHT" layoutX="365.0" layoutY="50.0" prefHeight="34.0" prefWidth="193.0" text="Versatz oben:">
<font>
<Font name="Cantarell Regular" size="18.0"/>
</font>
</Label>
<Label alignment="TOP_RIGHT" contentDisplay="RIGHT" layoutX="70.0" layoutY="50.0" prefHeight="34.0" prefWidth="193.0" text="Versatz unten:">
<font>
<Font name="Cantarell Regular" size="18.0"/>
</font>
</Label>
<Label alignment="TOP_RIGHT" contentDisplay="RIGHT" layoutX="365.0" layoutY="90.0" prefHeight="34.0" prefWidth="193.0" text="Kopfzeile:">
<font>
<Font name="Cantarell Regular" size="18.0"/>
</font>
</Label>
<Label alignment="TOP_RIGHT" contentDisplay="RIGHT" layoutX="365.0" layoutY="130.0" prefHeight="34.0" prefWidth="193.0" text="Fußzeile:">
<font>
<Font name="Cantarell Regular" size="18.0"/>
</font>
</Label>
<Button fx:id="btnSavePrinter" layoutX="27.0" layoutY="198.0" mnemonicParsing="false" onAction="#btnSavePrinterAction" text="Einstellungen speichern">
<font>
<Font name="Cantarell Regular" size="13.0"/>
</font>
</Button>
<Spinner fx:id="offsetHeaderSpinner" layoutX="324.0" layoutY="48.0" nodeOrientation="LEFT_TO_RIGHT" prefHeight="25.0" prefWidth="92.0"/>
<Spinner fx:id="offsetFooterSpinner" layoutX="35.0" layoutY="48.0" nodeOrientation="LEFT_TO_RIGHT" prefHeight="25.0" prefWidth="92.0"/>
<TextField fx:id="tftfooter" alignment="CENTER" layoutX="65.0" layoutY="130.0" nodeOrientation="LEFT_TO_RIGHT" prefHeight="25.0" prefWidth="377.0">
<font>
<Font name="Cantarell Regular" size="18.0"/>
</font>
</TextField>
</children>
</AnchorPane>
</content>
<font>
<Font name="Cantarell Regular" size="13.0"/>
</font>
</TitledPane>
</children>
</AnchorPane>
</content>
</Tab>
<Tab fx:id="tapPosEdit" text="Positionen bearbeiten">
<content>
<AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="180.0" prefWidth="200.0">
<children>
<TreeTableView fx:id="entryTreeTable" layoutX="11.0" layoutY="10.0" nodeOrientation="LEFT_TO_RIGHT" prefHeight="502.0" prefWidth="1346.0">
<placeholder>
<Label text=""/>
</placeholder>
<columns>
<TreeTableColumn fx:id="columnPosnumber" editable="false" maxWidth="1218.0" minWidth="59.0" prefWidth="165.0" resizable="false" sortable="false" text="Nummer"/>
<TreeTableColumn fx:id="columnPositionsEdit" editable="false" maxWidth="1581.6666870117188" minWidth="38.0" prefWidth="596.333251953125" resizable="false" sortable="false" text="Positionen"/>
<TreeTableColumn fx:id="columnPrize" editable="false" maxWidth="693.3333129882812" minWidth="44.33331298828125" prefWidth="140.33331298828125" resizable="false" sortable="false" text="Preis"/>
<TreeTableColumn fx:id="columnCat" editable="false" maxWidth="800.0" minWidth="94.0" prefWidth="300.0" resizable="false" sortable="false" text="Kategorie"/>
<TreeTableColumn fx:id="columnColor" editable="false" maxWidth="428.0" minWidth="119.333251953125" prefWidth="119.333251953125" resizable="false" sortable="false" text="Farbe"/>
</columns>
<columnResizePolicy>
<TreeTableView fx:constant="CONSTRAINED_RESIZE_POLICY"/>
</columnResizePolicy>
</TreeTableView>
<Button fx:id="btnClearEntry" layoutX="232.0" layoutY="590.0" mnemonicParsing="false" onAction="#btnClearEntryAction" text="Ausgewählten Eintrag zurücksetzten">
<font>
<Font name="Cantarell Regular" size="17.0"/>
</font>
</Button>
<TitledPane fx:id="titledPaneEntry" alignment="CENTER" animated="false" collapsible="false" contentDisplay="CENTER" layoutX="724.0" layoutY="525.0" prefHeight="163.0" prefWidth="633.0" text="Eintrag editieren">
<content>
<AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="135.0" prefWidth="640.0">
<children>
<Label fx:id="labelNewPosition" alignment="TOP_RIGHT" contentDisplay="RIGHT" layoutX="516.0" layoutY="10.0" prefHeight="34.0" prefWidth="105.0" text="Position:">
<font>
<Font name="Cantarell Regular" size="18.0"/>
</font>
</Label>
<TextField fx:id="tftNewPosition" alignment="CENTER" layoutX="307.0" layoutY="8.0" prefHeight="27.0" prefWidth="203.0">
<font>
<Font name="Cantarell Regular" size="13.0"/>
</font>
</TextField>
<Label fx:id="labelNewValue" alignment="TOP_RIGHT" contentDisplay="RIGHT" layoutX="504.0" layoutY="50.0" prefHeight="34.0" prefWidth="118.0" text="Preis in Euro:">
<font>
<Font name="Cantarell Regular" size="18.0"/>
</font>
</Label>
<TextField fx:id="tftNewValue" alignment="CENTER" layoutX="442.0" layoutY="42.0" nodeOrientation="LEFT_TO_RIGHT" prefHeight="27.0" prefWidth="66.0">
<font>
<Font name="Cantarell Regular" size="18.0"/>
</font>
</TextField>
<Label fx:id="labelNewColor" alignment="TOP_RIGHT" contentDisplay="RIGHT" layoutX="517.0" layoutY="90.0" prefHeight="34.0" prefWidth="105.0" text="Farbe:">
<font>
<Font name="Cantarell Regular" size="18.0"/>
</font>
</Label>
<ChoiceBox fx:id="colorChoise" layoutX="340.0" layoutY="90.0" nodeOrientation="LEFT_TO_RIGHT" prefHeight="25.0" prefWidth="169.0"/>
<Label fx:id="labelSelectCat" alignment="TOP_RIGHT" contentDisplay="RIGHT" layoutX="185.0" layoutY="10.0" prefHeight="34.0" prefWidth="105.0" text="Kategorie:">
<font>
<Font name="Cantarell Regular" size="18.0"/>
</font>
</Label>
<ChoiceBox fx:id="catChoise" layoutX="16.0" layoutY="10.0" nodeOrientation="LEFT_TO_RIGHT" prefHeight="25.0" prefWidth="180.0"/>
<Button fx:id="btnSaveEntry" layoutX="23.0" layoutY="86.0" mnemonicParsing="false" onAction="#btnSaveEntryAction" text="Ausgewählten Eintrag speichern">
<font>
<Font name="Cantarell Regular" size="17.0"/>
</font>
</Button>
</children>
</AnchorPane>
</content>
<font>
<Font name="Cantarell Regular" size="13.0"/>
</font>
</TitledPane>
</children>
</AnchorPane>
</content>
</Tab>
<Tab fx:id="tapJobs" text="Aufträge">
<content>
<AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="850.0" prefWidth="1536.0">
<children>
<TreeTableView fx:id="jobsTreeTable" layoutX="11.0" layoutY="10.0" nodeOrientation="LEFT_TO_RIGHT" prefHeight="541.0" prefWidth="1346.0">
<placeholder>
<Label text=""/>
</placeholder>
<columns>
<TreeTableColumn fx:id="columnJobNumber" editable="false" maxWidth="3000.0" prefWidth="85.0" resizable="false" sortable="false" text="Nummer"/>
<TreeTableColumn fx:id="columnTime" editable="false" prefWidth="160.0" resizable="false" sortable="false" text="Zeit"/>
<TreeTableColumn fx:id="columnPositions" editable="false" prefWidth="856.0" resizable="false" sortable="false" text="Positionen"/>
<TreeTableColumn fx:id="columnState" editable="false" prefWidth="116.0" resizable="false" sortable="false" text="Zustand"/>
<TreeTableColumn fx:id="columnJobValue" editable="false" prefWidth="103.0" resizable="false" sortable="false" text="Betrag"/>
</columns>
</TreeTableView>
<Button fx:id="btnReprintJob" layoutX="378.0" layoutY="603.0" mnemonicParsing="false" onAction="#btnReprintJobAction" text="Ausgewählter Auftrag drucken">
<font>
<Font name="Cantarell Regular" size="17.0"/>
</font>
</Button>
<TitledPane fx:id="titlePaneStats" alignment="CENTER" collapsible="false" contentDisplay="CENTER" layoutX="957.0" layoutY="561.0" prefHeight="118.0" prefWidth="400.0" text="Statistik - 30.03.2018 15:15 Uhr">
<content>
<AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="92.0" prefWidth="414.0">
<children>
<Label fx:id="labelJobCount" alignment="TOP_RIGHT" contentDisplay="RIGHT" layoutX="41.0" layoutY="2.0" prefHeight="34.0" prefWidth="340.0" text="Anzahl Aufträge: 2781">
<font>
<Font name="Cantarell Regular" size="18.0"/>
</font>
</Label>
<Label fx:id="labelAvgJob" alignment="TOP_RIGHT" contentDisplay="RIGHT" layoutX="41.0" layoutY="30.0" prefHeight="34.0" prefWidth="340.0" text="Durchschnittlicher Auftragswert: 12,90€">
<font>
<Font name="Cantarell Regular" size="18.0"/>
</font>
</Label>
<Label fx:id="labelAllValue" alignment="TOP_RIGHT" contentDisplay="RIGHT" layoutX="41.0" layoutY="60.0" prefHeight="34.0" prefWidth="340.0" text="Gesamt: 1088,48€">
<font>
<Font name="Cantarell Regular" size="18.0"/>
</font>
</Label>
</children>
</AnchorPane>
</content>
</TitledPane>
<Button fx:id="btnCancelJob" layoutX="44.0" layoutY="603.0" mnemonicParsing="false" onAction="#btnCancelJobAction" text="Ausgewählter Auftrag stornieren">
<font>
<Font name="Cantarell Regular" size="17.0"/>
</font>
</Button>
<Button fx:id="btnCalcStats" layoutX="712.0" layoutY="603.0" mnemonicParsing="false" onAction="#btnCalcStatsAction" text="Statistiken berrechnen">
<font>
<Font name="Cantarell Regular" size="17.0"/>
</font>
</Button>
</children>
</AnchorPane>
</content>
</Tab>
<Tab fx:id="tapNewJob" text="Neuer Auftrag">
<content>
<AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="850.0" prefWidth="1536.0">
<children>
<TreeTableView fx:id="tableCurrentOrder" layoutX="15.0" layoutY="85.0" nodeOrientation="LEFT_TO_RIGHT" prefHeight="358.0" prefWidth="382.0">
<placeholder>
<Label text=""/>
</placeholder>
<columns>
<TreeTableColumn fx:id="columnQuantity" editable="false" prefWidth="60.0" resizable="false" sortable="false" text="Anzahl"/>
<TreeTableColumn fx:id="columnPosition" editable="false" prefWidth="320.0" resizable="false" sortable="false" text="Position"/>
</columns>
<columnResizePolicy>
<TreeTableView fx:constant="CONSTRAINED_RESIZE_POLICY"/>
</columnResizePolicy>
</TreeTableView>
<GridPane gridLinesVisible="true" layoutX="430.0" layoutY="15.0" prefHeight="670.0" prefWidth="920.0">
<columnConstraints>
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0"/>
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0"/>
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0"/>
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0"/>
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0"/>
</columnConstraints>
<rowConstraints>
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES"/>
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES"/>
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES"/>
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES"/>
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES"/>
</rowConstraints>
<children>
<Button fx:id="gridButton04" maxWidth="235.0" minWidth="179.0" onAction="#gridButton04Action" prefHeight="169.0" prefWidth="235.0" text="leer 0,00€" textAlignment="CENTER" wrapText="true" GridPane.columnIndex="1">
<font>
<Font name="Cantarell Regular" size="24.0"/>
</font>
</Button>
<Button fx:id="gridButton05" maxWidth="235.0" minWidth="179.0" onAction="#gridButton05Action" prefHeight="169.0" prefWidth="235.0" text="leer 0,00€" textAlignment="CENTER" wrapText="true">
<font>
<Font name="Cantarell Regular" size="24.0"/>
</font>
</Button>
<Button fx:id="gridButton03" maxWidth="235.0" minWidth="179.0" onAction="#gridButton03Action" prefHeight="169.0" prefWidth="235.0" text="leer 0,00€" textAlignment="CENTER" wrapText="true" GridPane.columnIndex="2">
<font>
<Font name="Cantarell Regular" size="24.0"/>
</font>
</Button>
<Button fx:id="gridButton02" maxWidth="235.0" minWidth="179.0" onAction="#gridButton02Action" prefHeight="169.0" prefWidth="235.0" text="leer 0,00€" textAlignment="CENTER" wrapText="true" GridPane.columnIndex="3">
<font>
<Font name="Cantarell Regular" size="24.0"/>
</font>
</Button>
<Button fx:id="gridButton01" maxWidth="235.0" minWidth="179.0" onAction="#gridButton01Action" prefHeight="134.0" prefWidth="179.0" text="leer 0,00€" textAlignment="CENTER" wrapText="true" GridPane.columnIndex="4">
<font>
<Font name="Cantarell Regular" size="24.0"/>
</font>
</Button>
<Button fx:id="gridButton10" maxWidth="235.0" minWidth="179.0" onAction="#gridButton10Action" prefHeight="169.0" prefWidth="235.0" text="leer 0,00€" textAlignment="CENTER" wrapText="true" GridPane.rowIndex="1">
<font>
<Font name="Cantarell Regular" size="24.0"/>
</font>
</Button>
<Button fx:id="gridButton09" maxWidth="235.0" minWidth="179.0" onAction="#gridButton09Action" prefHeight="169.0" prefWidth="235.0" text="leer 0,00€" textAlignment="CENTER" wrapText="true" GridPane.columnIndex="1" GridPane.rowIndex="1">
<font>
<Font name="Cantarell Regular" size="24.0"/>
</font>
</Button>
<Button fx:id="gridButton08" maxWidth="235.0" minWidth="179.0" onAction="#gridButton08Action" prefHeight="169.0" prefWidth="235.0" text="leer 0,00€" textAlignment="CENTER" wrapText="true" GridPane.columnIndex="2" GridPane.rowIndex="1">
<font>
<Font name="Cantarell Regular" size="24.0"/>
</font>
</Button>
<Button fx:id="gridButton07" maxWidth="235.0" minWidth="179.0" onAction="#gridButton07Action" prefHeight="169.0" prefWidth="235.0" text="leer 0,00€" textAlignment="CENTER" wrapText="true" GridPane.columnIndex="3" GridPane.rowIndex="1">
<font>
<Font name="Cantarell Regular" size="24.0"/>
</font>
</Button>
<Button fx:id="gridButton06" maxWidth="235.0" minWidth="179.0" onAction="#gridButton06Action" prefHeight="169.0" prefWidth="235.0" text="leer 0,00€" textAlignment="CENTER" wrapText="true" GridPane.columnIndex="4" GridPane.rowIndex="1">
<font>
<Font name="Cantarell Regular" size="24.0"/>
</font>
</Button>
<Button fx:id="gridButton15" maxWidth="235.0" minWidth="179.0" onAction="#gridButton15Action" prefHeight="169.0" prefWidth="235.0" text="leer 0,00€" textAlignment="CENTER" wrapText="true" GridPane.rowIndex="2">
<font>
<Font name="Cantarell Regular" size="24.0"/>
</font>
</Button>
<Button fx:id="gridButton14" maxWidth="235.0" minWidth="179.0" onAction="#gridButton14Action" prefHeight="169.0" prefWidth="235.0" text="leer 0,00€" textAlignment="CENTER" wrapText="true" GridPane.columnIndex="1" GridPane.rowIndex="2">
<font>
<Font name="Cantarell Regular" size="24.0"/>
</font>
</Button>
<Button fx:id="gridButton13" maxWidth="235.0" minWidth="179.0" onAction="#gridButton13Action" prefHeight="169.0" prefWidth="235.0" text="leer 0,00€" textAlignment="CENTER" wrapText="true" GridPane.columnIndex="2" GridPane.rowIndex="2">
<font>
<Font name="Cantarell Regular" size="24.0"/>
</font>
</Button>
<Button fx:id="gridButton12" maxWidth="235.0" minWidth="179.0" onAction="#gridButton12Action" prefHeight="169.0" prefWidth="235.0" text="leer 0,00€" textAlignment="CENTER" wrapText="true" GridPane.columnIndex="3" GridPane.rowIndex="2">
<font>
<Font name="Cantarell Regular" size="24.0"/>
</font>
</Button>
<Button fx:id="gridButton11" maxWidth="235.0" minWidth="179.0" onAction="#gridButton11Action" prefHeight="169.0" prefWidth="235.0" text="leer 0,00€" textAlignment="CENTER" wrapText="true" GridPane.columnIndex="4" GridPane.rowIndex="2">
<font>
<Font name="Cantarell Regular" size="24.0"/>
</font>
</Button>
<Button fx:id="gridButton20" maxWidth="235.0" minWidth="179.0" onAction="#gridButton20Action" prefHeight="169.0" prefWidth="235.0" text="leer 0,00€" textAlignment="CENTER" wrapText="true" GridPane.rowIndex="3">
<font>
<Font name="Cantarell Regular" size="24.0"/>
</font>
</Button>
<Button fx:id="gridButton19" maxWidth="235.0" minWidth="179.0" onAction="#gridButton19Action" prefHeight="169.0" prefWidth="235.0" text="leer 0,00€" textAlignment="CENTER" wrapText="true" GridPane.columnIndex="1" GridPane.rowIndex="3">
<font>
<Font name="Cantarell Regular" size="24.0"/>
</font>
</Button>
<Button fx:id="gridButton18" maxWidth="235.0" minWidth="179.0" onAction="#gridButton18Action" prefHeight="169.0" prefWidth="235.0" text="leer 0,00€" textAlignment="CENTER" wrapText="true" GridPane.columnIndex="2" GridPane.rowIndex="3">
<font>
<Font name="Cantarell Regular" size="24.0"/>
</font>
</Button>
<Button fx:id="gridButton17" maxWidth="235.0" minWidth="179.0" onAction="#gridButton17Action" prefHeight="169.0" prefWidth="235.0" text="leer 0,00€" textAlignment="CENTER" wrapText="true" GridPane.columnIndex="3" GridPane.rowIndex="3">
<font>
<Font name="Cantarell Regular" size="24.0"/>
</font>
</Button>
<Button fx:id="gridButton16" maxWidth="235.0" minWidth="179.0" onAction="#gridButton16Action" prefHeight="169.0" prefWidth="235.0" text="leer 0,00€" textAlignment="CENTER" wrapText="true" GridPane.columnIndex="4" GridPane.rowIndex="3">
<font>
<Font name="Cantarell Regular" size="24.0"/>
</font>
</Button>
<Button fx:id="gridButton25" maxWidth="235.0" minWidth="179.0" onAction="#gridButton25Action" prefHeight="169.0" prefWidth="235.0" text="leer 0,00€" textAlignment="CENTER" wrapText="true" GridPane.rowIndex="4">
<font>
<Font name="Cantarell Regular" size="24.0"/>
</font>
</Button>
<Button fx:id="gridButton23" maxWidth="235.0" minWidth="179.0" onAction="#gridButton23Action" prefHeight="169.0" prefWidth="235.0" text="leer 0,00€" textAlignment="CENTER" wrapText="true" GridPane.columnIndex="2" GridPane.rowIndex="4">
<font>
<Font name="Cantarell Regular" size="24.0"/>
</font>
</Button>
<Button fx:id="gridButton22" maxWidth="235.0" minWidth="179.0" onAction="#gridButton22Action" prefHeight="169.0" prefWidth="235.0" text="leer 0,00€" textAlignment="CENTER" wrapText="true" GridPane.columnIndex="3" GridPane.rowIndex="4">
<font>
<Font name="Cantarell Regular" size="24.0"/>
</font>
</Button>
<Button fx:id="gridButton21" maxWidth="235.0" minWidth="179.0" onAction="#gridButton21Action" prefHeight="169.0" prefWidth="235.0" text="leer 0,00€" textAlignment="CENTER" wrapText="true" GridPane.columnIndex="4" GridPane.rowIndex="4">
<font>
<Font name="Cantarell Regular" size="24.0"/>
</font>
</Button>
<Button fx:id="gridButton24" maxWidth="235.0" minWidth="179.0" onAction="#gridButton24Action" prefHeight="169.0" prefWidth="235.0" text="leer 0,00€" textAlignment="CENTER" wrapText="true" GridPane.columnIndex="1" GridPane.rowIndex="4">
<font>
<Font name="Cantarell Regular" size="24.0"/>
</font>
</Button>
</children>
</GridPane>
<Button fx:id="btnPrintBill" contentDisplay="CENTER" focusTraversable="false" graphicTextGap="1.0" layoutX="75.0" layoutY="588.0" maxHeight="88.0" minHeight="75.0" mnemonicParsing="false" onAction="#btnPrintBillAction" prefHeight="88.0" prefWidth="258.0" text="Drucken" textAlignment="CENTER" wrapText="true">
<font>
<Font name="Cantarell Bold" size="48.0"/>
</font>
</Button>
<Button fx:id="btnDeleteSelectedPosition" layoutX="43.0" layoutY="438.0" mnemonicParsing="false" onAction="#btnDeleteSelectedPositionAction" prefHeight="17.0" prefWidth="332.0" text="Ausgewählte Position löschen" textAlignment="CENTER">
<font>
<Font name="Cantarell Regular" size="20.0"/>
</font>
</Button>
<Button fx:id="btnDeleteAllPositions" layoutX="43.0" layoutY="473.0" mnemonicParsing="false" onAction="#btnDeleteAllPositionsAction" prefHeight="17.0" prefWidth="332.0" text="Alle Positionen löschen" textAlignment="CENTER">
<font>
<Font name="Cantarell Regular" size="20.0"/>
</font>
</Button>
<Label fx:id="labelAllPrize" alignment="CENTER" contentDisplay="CENTER" layoutX="10.0" layoutY="496.0" prefHeight="15.0" prefWidth="386.0" text="0,00 €" textAlignment="CENTER">
<font>
<Font name="Cantarell Regular" size="70.0"/>
</font>
</Label>
<Label fx:id="labelJobCounter" alignment="TOP_RIGHT" contentDisplay="CENTER" layoutX="5.0" layoutY="45.0" prefHeight="34.0" prefWidth="392.0" text="Auftragsnummer: 0" textAlignment="CENTER">
<font>
<Font name="Cantarell Regular" size="26.0"/>
</font>
</Label>
<Label fx:id="labelTime" alignment="TOP_RIGHT" layoutX="7.0" layoutY="11.0" maxHeight="33.0" maxWidth="392.0" minHeight="33.0" minWidth="392.0" prefHeight="33.0" prefWidth="392.0" text="Uhrzeit: 12:15">
<font>
<Font name="Cantarell Regular" size="26.0"/>
</font>
</Label>
<Button fx:id="btnLock" layoutX="1.0" layoutY="6.0" lineSpacing="2.0" onAction="#btnLockAction" prefHeight="42.0" prefWidth="180.0" text="Kasse sperren" textAlignment="CENTER" textFill="#c91c1c" textOverrun="LEADING_WORD_ELLIPSIS">
<font>
<Font name="Cantarell Regular" size="19.0"/>
</font>
</Button>
<Line endX="800.0" layoutX="62.0" layoutY="465.0" rotate="90.0" startX="-100.0" strokeWidth="4.0"/>
</children>
</AnchorPane>
</content>
</Tab>
</tabs>
</TabPane>
</children>
</AnchorPane>