diff --git a/.vscode/launch.json b/.vscode/launch.json
new file mode 100644
index 0000000..79763db
--- /dev/null
+++ b/.vscode/launch.json
@@ -0,0 +1,21 @@
+{
+ // Use IntelliSense to learn about possible attributes.
+ // Hover to view descriptions of existing attributes.
+ // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
+ "version": "0.2.0",
+ "configurations": [
+ {
+ "type": "java",
+ "name": "Launch Current File",
+ "request": "launch",
+ "mainClass": "${file}"
+ },
+ {
+ "type": "java",
+ "name": "Launch App",
+ "request": "launch",
+ "mainClass": "xyz.thastertyn.App",
+ "projectName": "jecnak-tui"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/src/main/java/xyz/thastertyn/App.java b/src/main/java/xyz/thastertyn/App.java
index dcdb9b4..29eec7c 100644
--- a/src/main/java/xyz/thastertyn/App.java
+++ b/src/main/java/xyz/thastertyn/App.java
@@ -1,6 +1,5 @@
package xyz.thastertyn;
-import xyz.thastertyn.Jecna.*;
import xyz.thastertyn.Window.MainWindow;
/**
@@ -20,49 +19,7 @@ public class App {
- //#region Jidelna
- //#region JSESSIONID
- Connection.Response jidelna = Jsoup.connect("https://objednavky.jidelnasokolska.cz/")
- .header("Connection", "keep-alive")
- .method(Method.HEAD)
- .execute();
-
- String jidelnaJSESSIONID = jidelna.cookie("JSESSIONID");
- String XSRF_TOKEN = jidelna.cookie("XSRF-TOKEN");
- //#endregion
-
- //#region CSRF
- String csrf = Jsoup.connect("https://objednavky.jidelnasokolska.cz/faces/login.jsp")
- .header("Connection", "keep-alive")
- .cookie("XSRF-TOKEN", XSRF_TOKEN)
- .cookie("JSESSIONID", jidelnaJSESSIONID)
- .get()
- .select("input[name=_csrf]")
- .attr("value");
-
-
- if(!XSRF_TOKEN.equals(csrf))
- {
- throw new SecurityException("CSRF tokens do not match, something is up");
- }
- //#endregion
-
- //#region Login
- Connection.Response jidelnaLogin = Jsoup.connect("https://objednavky.jidelnasokolska.cz/j_spring_security_check")
- .header("Connection", "keep-alive")
- .header("Content-Type", "application/x-www-form-urlencoded")
- .cookie("XSRF-TOKEN", XSRF_TOKEN)
- .cookie("JSESSIONID", jidelnaJSESSIONID)
- .data("j_username", Credentials.user)
- .data("j_password", Credentials.pass)
- .data("terminal", "false")
- .data("type", "web")
- .data("_csrf", XSRF_TOKEN)
- .data("targetUrl", "/faces/secured/main.jsp?terminal=false&status=true&printer=false&keyboard=false")
- .method(Method.POST)
- .execute();
- //#endregion
Document obedy = Jsoup.connect("https://objednavky.jidelnasokolska.cz/faces/secured/month.jsp?terminal=false&keyboard=&printer=")
.header("Connection", "keep-alive")
diff --git a/src/main/java/xyz/thastertyn/Connection.java b/src/main/java/xyz/thastertyn/Connection.java
deleted file mode 100644
index 1d5dbbf..0000000
--- a/src/main/java/xyz/thastertyn/Connection.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package xyz.thastertyn;
-
-import org.jsoup.Jsoup;
-
-public class Connection {
-
- private static final org.jsoup.Connection CONNECTION = Jsoup.connect("")
- .header("Connection", "keep-alive")
- .cookie("role", "student");
-
- public static org.jsoup.Connection getConnection()
- {
- return CONNECTION;
- }
-}
diff --git a/src/main/java/xyz/thastertyn/Download.java b/src/main/java/xyz/thastertyn/Download.java
deleted file mode 100644
index be16dd4..0000000
--- a/src/main/java/xyz/thastertyn/Download.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package xyz.thastertyn;
-
-public class Download {
-
-}
diff --git a/src/main/java/xyz/thastertyn/Jecna/Dochazka.java b/src/main/java/xyz/thastertyn/Jecna/Dochazka.java
index 900d7e7..ab34da4 100644
--- a/src/main/java/xyz/thastertyn/Jecna/Dochazka.java
+++ b/src/main/java/xyz/thastertyn/Jecna/Dochazka.java
@@ -3,9 +3,9 @@ package xyz.thastertyn.Jecna;
import java.io.IOException;
import java.util.HashMap;
+import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
-import xyz.thastertyn.Connection;
import xyz.thastertyn.Tuple.Pair;
public class Dochazka {
@@ -18,9 +18,10 @@ public class Dochazka {
try {
// absence-list
- absenceDoc = Connection.getConnection()
+ absenceDoc = Jsoup.connect("https://www.spsejecna.cz" + "/absence/passing-student")
.cookie("JSESSIOND", JSESSIOND)
- .url("https://www.spsejecna.cz" + "/absence/passing-student")
+ .cookie("role", "student")
+ .header("Connection", "keep-alive")
.get();
} catch (IOException e) {
e.printStackTrace();
diff --git a/src/main/java/xyz/thastertyn/Jecna/Jidelna.java b/src/main/java/xyz/thastertyn/Jecna/Jidelna.java
new file mode 100644
index 0000000..48b4871
--- /dev/null
+++ b/src/main/java/xyz/thastertyn/Jecna/Jidelna.java
@@ -0,0 +1,5 @@
+package xyz.thastertyn.Jecna;
+
+public class Jidelna {
+
+}
diff --git a/src/main/java/xyz/thastertyn/Jecna/Login.java b/src/main/java/xyz/thastertyn/Jecna/Login.java
index 8cc25be..385301e 100644
--- a/src/main/java/xyz/thastertyn/Jecna/Login.java
+++ b/src/main/java/xyz/thastertyn/Jecna/Login.java
@@ -4,9 +4,12 @@ import java.io.File;
import java.io.IOException;
import java.net.UnknownHostException;
+import javax.security.auth.login.CredentialException;
+
import org.jsoup.Connection;
import org.jsoup.Jsoup;
import org.jsoup.Connection.Method;
+import org.jsoup.nodes.Document;
public class Login {
@@ -23,7 +26,7 @@ public class Login {
*
{@code false} neexistuje, nebo jsou prazdne
*
*/
- public boolean getCredentials()
+ public boolean checkForCredentials()
{
File credentials = null;
@@ -67,9 +70,8 @@ public class Login {
return Jsessionid;
}
- public byte login(String user, String pass)
+ public void loginJecna(String user, String pass) throws UnknownHostException, IOException, CredentialException
{
- try {
//#region JSESSIONID
Connection.Response response = Jsoup.connect("https://www.spsejecna.cz")
.header("Connection", "keep-alive")
@@ -89,7 +91,7 @@ public class Login {
//#endregion
//#region Login
- Connection.Response login = Jsoup.connect("https://www.spsejecna.cz/user/login")
+ Jsoup.connect("https://www.spsejecna.cz/user/login")
.method(Connection.Method.POST)
.header("Content-Type", "application/x-www-form-urlencoded")
//.header("Content-Length", "71") Adds 10 seconds to total request time
@@ -105,17 +107,63 @@ public class Login {
.execute();
//#endregion
+ Document test = Jsoup.connect("https://www.spsejecna.cz/score/student")
+ .header("Connection", "keep-alive")
+ .cookie("JSESSIONID", Jsessionid)
+ .cookie("role", "student")
+ .get();
+
+ if(test.toString().contains("Pro pokračování se přihlaste do systému"))
+ {
+ throw new CredentialException("Incorrect username or password");
+ }
+
start = System.currentTimeMillis() / 1000L;
lastCheck = start;
+ }
- return 0;
- } catch(UnknownHostException e)
- {
- // Not connected to internet
- return 127;
- } catch(IOException e)
- {
- return 126;
- }
+ public void loginJidelna() throws UnknownHostException, IOException
+ {
+ //#region JSESSIONID
+ Connection.Response jidelna = Jsoup.connect("https://objednavky.jidelnasokolska.cz/")
+ .header("Connection", "keep-alive")
+ .method(Method.HEAD)
+ .execute();
+
+ String jidelnaJSESSIONID = jidelna.cookie("JSESSIONID");
+ String XSRF_TOKEN = jidelna.cookie("XSRF-TOKEN");
+ //#endregion
+
+ //#region CSRF
+ String csrf = Jsoup.connect("https://objednavky.jidelnasokolska.cz/faces/login.jsp")
+ .header("Connection", "keep-alive")
+ .cookie("XSRF-TOKEN", XSRF_TOKEN)
+ .cookie("JSESSIONID", jidelnaJSESSIONID)
+ .get()
+ .select("input[name=_csrf]")
+ .attr("value");
+
+
+ if(!XSRF_TOKEN.equals(csrf))
+ {
+ throw new SecurityException("CSRF tokens do not match, something is up");
+ }
+ //#endregion
+
+ //#region Login
+ Connection.Response jidelnaLogin = Jsoup.connect("https://objednavky.jidelnasokolska.cz/j_spring_security_check")
+ .header("Connection", "keep-alive")
+ .header("Content-Type", "application/x-www-form-urlencoded")
+ .cookie("XSRF-TOKEN", XSRF_TOKEN)
+ .cookie("JSESSIONID", jidelnaJSESSIONID)
+ .data("j_username", Credentials.user)
+ .data("j_password", Credentials.pass)
+ .data("terminal", "false")
+ .data("type", "web")
+ .data("_csrf", XSRF_TOKEN)
+ .data("targetUrl", "/faces/secured/main.jsp?terminal=false&status=true&printer=false&keyboard=false")
+ .method(Method.POST)
+ .execute();
+ //#endregion
}
}
diff --git a/src/main/java/xyz/thastertyn/Jecna/Znamky.java b/src/main/java/xyz/thastertyn/Jecna/Znamky.java
index 82fa990..6996cf1 100644
--- a/src/main/java/xyz/thastertyn/Jecna/Znamky.java
+++ b/src/main/java/xyz/thastertyn/Jecna/Znamky.java
@@ -1,9 +1,10 @@
package xyz.thastertyn.Jecna;
import java.io.IOException;
+import java.net.UnknownHostException;
import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
@@ -15,17 +16,20 @@ public class Znamky {
private boolean wasDownloaded;
- // key (String) reprezentuje predmet, value (arraylist) znamky a pair znamku s jeji vahou
- private HashMap>> grades = new HashMap<>();
+ private ArrayList>,Double>>> grades = new ArrayList<>();
- public void addGrade(String subject, int grade, double weight)
+ public void addGrade(int index, String subject, int grade, double weight)
{
- grades.get(subject).add(new Pair(grade, weight));
+ Pair znamka = new Pair<>(grade, weight);
+
+ grades.get(index).getValue1().getValue0().add(znamka);
}
public void addSubject(String subject)
{
- grades.put(subject, new ArrayList>());
+ Pair>, Double> p = new Pair<>(new ArrayList>(), 0.0);
+
+ grades.add(new Pair<>(subject, p));
}
private double getAverage(ArrayList> a)
@@ -39,7 +43,8 @@ public class Znamky {
divisor += p.getValue1();
}
- return (double) divident / divisor;
+ double prumer = (double) divident / divisor;
+ return (double) Math.round(prumer * 100) / 100;
}catch(ArithmeticException e)
{
@@ -47,17 +52,10 @@ public class Znamky {
}
}
- public byte downloadZnamky(final String Jsessionid)
+ public void downloadZnamky(final String Jsessionid) throws UnknownHostException, IOException
{
wasDownloaded = true;
- Document znamkyDoc = null;
-
- try {
- znamkyDoc = Downloader.download("https://www.spsejecna.cz" + "/score/student", Jsessionid).get();
- } catch (IOException e) {
- e.printStackTrace();
- return 127;
- }
+ Document znamkyDoc = Downloader.download("https://www.spsejecna.cz" + "/score/student", Jsessionid).get();
Elements rows = znamkyDoc.select("table.score").select("tr");
@@ -68,25 +66,43 @@ public class Znamky {
rows_split[i] = rows.get(i).children();
}
+ int subj = 0;
+
for(int i = 1; i < rows_split.length; i++)
{
- String predmet = rows_split[i].get(0).text();
+ String predmetFull = rows_split[i].get(0).text();
+
+ Matcher matcher = Pattern.compile("\\((.*)\\)").matcher(predmetFull);
+
+ String predmet = matcher.find() ? matcher.group(1) : predmetFull;
addSubject(predmet);
- for(Element e : rows_split[i].get(1).select("a.score"))
+ for(Element znamkaElement : rows_split[i].get(1).select("a.score"))
{
- int znamka = Integer.parseInt(e.select("span.value").text());
+ if(znamkaElement == null)
+ {
+ break;
+ }
+
+ int znamka = Integer.parseInt(znamkaElement.select("span.value").text());
// Mala znamka se bude pocitat jako polovicni vaha
- if(e.hasClass("scoreSmall"))
+ if(znamkaElement.hasClass("scoreSmall"))
{
- addGrade(predmet, znamka, 0.5);
+ addGrade(subj, predmet, znamka, 0.5);
}else{
- addGrade(predmet, znamka, 1);
+ addGrade(subj, predmet, znamka, 1);
}
}
+
+ grades.get(subj).getValue1().setValue1(getAverage(grades.get(subj).getValue1().getValue0()));
+ subj++;
}
- return 0;
+ }
+
+ public ArrayList>,Double>>> getGrades()
+ {
+ return grades;
}
@Override
@@ -96,11 +112,9 @@ public class Znamky {
{
String s = "";
- for(Map.Entry>> entry : grades.entrySet())
+ for(Pair>,Double>> p : grades)
{
- double prumer = getAverage(entry.getValue());
- double p = (double) Math.round(prumer * 100) / 100;
- s += entry.getKey() + " | " + entry.getValue().toString() + " { " + p + " }\n";
+ s += p.getValue0() + " | " + p.getValue1().getValue0().toString() + " { " + p.getValue1().getValue1() + " } ";
}
return s;
}else{
diff --git a/src/main/java/xyz/thastertyn/Predmet.java b/src/main/java/xyz/thastertyn/Predmet.java
deleted file mode 100644
index 3e8f98a..0000000
--- a/src/main/java/xyz/thastertyn/Predmet.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package xyz.thastertyn;
-
-import java.util.ArrayList;
-
-public class Predmet {
-
-
-}
diff --git a/src/main/java/xyz/thastertyn/RozvrhDownload.java b/src/main/java/xyz/thastertyn/RozvrhDownload.java
deleted file mode 100644
index 0267187..0000000
--- a/src/main/java/xyz/thastertyn/RozvrhDownload.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package xyz.thastertyn;
-
-public class RozvrhDownload {
-
-}
diff --git a/src/main/java/xyz/thastertyn/Window/Content/JecnaContent.java b/src/main/java/xyz/thastertyn/Window/Content/JecnaContent.java
new file mode 100644
index 0000000..2967d90
--- /dev/null
+++ b/src/main/java/xyz/thastertyn/Window/Content/JecnaContent.java
@@ -0,0 +1,29 @@
+package xyz.thastertyn.Window.Content;
+
+import com.googlecode.lanterna.gui2.Panel;
+
+/**
+ * Wrapper to include all classes that deal with content in some way
+ */
+public class JecnaContent {
+
+ public Panel getPanel()
+ {
+ return null;
+ }
+
+ public void download(String s)
+ {
+
+ }
+
+ public boolean hasStarted()
+ {
+ return false;
+ }
+
+ public String getLabel()
+ {
+ return "";
+ }
+}
diff --git a/src/main/java/xyz/thastertyn/Window/Content/Jidelna.java b/src/main/java/xyz/thastertyn/Window/Content/Jidelna.java
new file mode 100644
index 0000000..62fb593
--- /dev/null
+++ b/src/main/java/xyz/thastertyn/Window/Content/Jidelna.java
@@ -0,0 +1,5 @@
+package xyz.thastertyn.Window.Content;
+
+public class Jidelna {
+
+}
diff --git a/src/main/java/xyz/thastertyn/Window/Content/Rozvrh.java b/src/main/java/xyz/thastertyn/Window/Content/Rozvrh.java
new file mode 100644
index 0000000..b8aeb0f
--- /dev/null
+++ b/src/main/java/xyz/thastertyn/Window/Content/Rozvrh.java
@@ -0,0 +1,70 @@
+package xyz.thastertyn.Window.Content;
+
+import java.io.IOException;
+import java.net.UnknownHostException;
+
+import com.googlecode.lanterna.gui2.Label;
+import com.googlecode.lanterna.gui2.Panel;
+import com.googlecode.lanterna.gui2.table.Table;
+
+public class Rozvrh extends JecnaContent {
+
+ private Panel rozvrhPanel = new Panel();
+
+ private boolean hasStarted = false;
+
+ private xyz.thastertyn.Jecna.Rozvrh rozvrh = new xyz.thastertyn.Jecna.Rozvrh();
+
+ //private String[] labels = {"Den", "7:30-8:15", "8:25-9:10", "9:20-10:05", "10:20-11:05", "11:15-12:00", "12:10-12:55", "13:05-13:50", "14:00-14:45", "14:55-15:40", "15:50-16:35"};
+ private String[] labels = {"Den", "1.", "2.", "3.", "4.", "5.", "6.", "7.", "8.", "9.", "10."};
+
+ String[] days = {"PO", "UT", "ST", "CT", "PA"};
+
+ Table t = new Table<>(labels);
+
+ @Override
+ public void download(String Jsessionid)
+ {
+ try{
+ rozvrh.downloadRozvrh(Jsessionid);
+
+ String[][] r = rozvrh.getRozvrh();
+
+ String[] s = new String[labels.length];
+
+ for(int i = 0; i < r.length; i++)
+ {
+ s[0] = days[i];
+ for(int j = 1; j < r[i].length; j++) { s[j] = r[i][j]; }
+
+ t.getTableModel().addRow(s);
+ }
+ rozvrhPanel.addComponent(t);
+ hasStarted = true;
+ }catch(UnknownHostException e)
+ {
+ rozvrhPanel.addComponent(new Label("A connection error occurred"));
+ }catch(IOException e)
+ {
+ rozvrhPanel.addComponent(new Label("An error occurred"));
+ }
+ }
+
+ @Override
+ public boolean hasStarted()
+ {
+ return hasStarted;
+ }
+
+ @Override
+ public Panel getPanel()
+ {
+ return rozvrhPanel;
+ }
+
+ @Override
+ public String getLabel()
+ {
+ return "Rozvrh";
+ }
+}
diff --git a/src/main/java/xyz/thastertyn/Window/Content/Znamky.java b/src/main/java/xyz/thastertyn/Window/Content/Znamky.java
new file mode 100644
index 0000000..acac87f
--- /dev/null
+++ b/src/main/java/xyz/thastertyn/Window/Content/Znamky.java
@@ -0,0 +1,127 @@
+package xyz.thastertyn.Window.Content;
+
+import java.io.IOException;
+import java.util.ArrayList;
+
+import com.googlecode.lanterna.TextColor;
+import com.googlecode.lanterna.graphics.SimpleTheme;
+import com.googlecode.lanterna.gui2.Direction;
+import com.googlecode.lanterna.gui2.Label;
+import com.googlecode.lanterna.gui2.LinearLayout;
+import com.googlecode.lanterna.gui2.Panel;
+import xyz.thastertyn.Tuple.Pair;
+
+public class Znamky extends JecnaContent {
+
+ private Panel znamkyPanel = new Panel().setLayoutManager(new LinearLayout(Direction.HORIZONTAL));
+
+ private xyz.thastertyn.Jecna.Znamky znamky = new xyz.thastertyn.Jecna.Znamky();
+
+ private boolean hasStarted = false;
+
+ @Override
+ public void download(String JsessionId)
+ {
+ try{
+ znamky.downloadZnamky(JsessionId);
+
+ Panel predmetyPanel = new Panel().setLayoutManager(new LinearLayout(Direction.VERTICAL));
+ Panel znamkyP = new Panel().setLayoutManager(new LinearLayout(Direction.VERTICAL));
+ Panel vyslPanel = new Panel().setLayoutManager(new LinearLayout(Direction.VERTICAL));
+
+ ArrayList>,Double>>> grades = znamky.getGrades();
+
+ for(Pair>,Double>> predmet : grades)
+ {
+ predmetyPanel.addComponent(new Label(predmet.getValue0()));
+
+ Panel znamkyZPredmetu = new Panel().setLayoutManager(new LinearLayout(Direction.HORIZONTAL));
+
+ if(predmet.getValue1().getValue0().isEmpty())
+ {
+ znamkyZPredmetu.addComponent(new Label(""));
+ }
+
+ for(Pair znamka : predmet.getValue1().getValue0())
+ {
+ // TODO pridat predmet.getValue0() ktery premeni znamky na jmeno predmetu jako funkci (not a bug, its a feature)
+ Label znamkaLabel = new Label(znamka.getValue0() + "");
+ switch(znamka.getValue0())
+ {
+ case 1:
+ znamkaLabel.setTheme(new SimpleTheme(TextColor.ANSI.BLACK, TextColor.ANSI.GREEN));
+ break;
+ case 2:
+ znamkaLabel.setTheme(new SimpleTheme(TextColor.ANSI.BLACK, TextColor.ANSI.BLUE));
+ break;
+ case 3:
+ znamkaLabel.setTheme(new SimpleTheme(TextColor.ANSI.BLACK, TextColor.ANSI.YELLOW));
+ break;
+ case 4:
+ znamkaLabel.setTheme(new SimpleTheme(TextColor.ANSI.BLACK, TextColor.ANSI.MAGENTA));
+ break;
+ case 5:
+ znamkaLabel.setTheme(new SimpleTheme(TextColor.ANSI.BLACK, TextColor.ANSI.RED));
+ break;
+ }
+
+ znamkyZPredmetu.addComponent(znamkaLabel);
+ }
+
+ znamkyP.addComponent(znamkyZPredmetu);
+
+ double prumer = predmet.getValue1().getValue1();
+
+ Label vysl = new Label("" + prumer);
+
+ if(prumer >= 1 && prumer < 1.5)
+ {
+ vysl.setTheme(new SimpleTheme(TextColor.ANSI.BLACK, TextColor.ANSI.GREEN));
+ }else if(prumer >= 1.5 && prumer < 2.5)
+ {
+ vysl.setTheme(new SimpleTheme(TextColor.ANSI.BLACK, TextColor.ANSI.BLUE));
+
+ }else if(prumer >= 2.5 && prumer < 3.5)
+ {
+ vysl.setTheme(new SimpleTheme(TextColor.ANSI.BLACK, TextColor.ANSI.YELLOW));
+
+ }else if(prumer >= 3.5 && prumer < 4.5)
+ {
+ vysl.setTheme(new SimpleTheme(TextColor.ANSI.BLACK, TextColor.ANSI.MAGENTA));
+ }else if(prumer >= 4.5)
+ {
+ vysl.setTheme(new SimpleTheme(TextColor.ANSI.BLACK, TextColor.ANSI.RED));
+ }
+
+ vyslPanel.addComponent(vysl);
+ }
+
+ znamkyPanel.addComponent(predmetyPanel);
+ znamkyPanel.addComponent(znamkyP);
+ znamkyPanel.addComponent(vyslPanel);
+
+ hasStarted = true;
+ }catch(IOException e)
+ {
+ znamkyPanel.addComponent(new Label("An error has occured"));
+ }
+ }
+
+ @Override
+ public Panel getPanel()
+ {
+ return znamkyPanel;
+ }
+
+ @Override
+ public boolean hasStarted()
+ {
+ return hasStarted;
+ }
+
+ @Override
+ public String getLabel()
+ {
+ return "Znamky";
+ }
+}
diff --git a/src/main/java/xyz/thastertyn/Window/Login.java b/src/main/java/xyz/thastertyn/Window/Login.java
index 1253417..ed3dd78 100644
--- a/src/main/java/xyz/thastertyn/Window/Login.java
+++ b/src/main/java/xyz/thastertyn/Window/Login.java
@@ -1,36 +1,164 @@
package xyz.thastertyn.Window;
+import java.io.IOException;
+import java.net.UnknownHostException;
+import java.util.Arrays;
+
+import javax.security.auth.login.CredentialException;
+
+import com.googlecode.lanterna.TerminalSize;
+import com.googlecode.lanterna.gui2.Button;
+import com.googlecode.lanterna.gui2.EmptySpace;
+import com.googlecode.lanterna.gui2.GridLayout;
+import com.googlecode.lanterna.gui2.Label;
+import com.googlecode.lanterna.gui2.LocalizedString;
+import com.googlecode.lanterna.gui2.Panel;
+import com.googlecode.lanterna.gui2.TextBox;
+import com.googlecode.lanterna.gui2.Window;
import com.googlecode.lanterna.gui2.WindowBasedTextGUI;
+import com.googlecode.lanterna.gui2.GridLayout.Alignment;
+import com.googlecode.lanterna.gui2.dialogs.DialogWindow;
+import com.googlecode.lanterna.gui2.dialogs.MessageDialog;
+import com.googlecode.lanterna.gui2.dialogs.MessageDialogButton;
-public class Login {
-
- String user = "";
- String pass = "";
+public class Login extends DialogWindow {
- xyz.thastertyn.Jecna.Login login = new xyz.thastertyn.Jecna.Login();
+ private TextBox username;
+ private TextBox password;
+ private String user;
+ private String pass;
- LoginDialog dialog = new LoginDialog("Login", "Enter your username and password");
+ private xyz.thastertyn.Jecna.Login login = new xyz.thastertyn.Jecna.Login();
- public void showDialog(WindowBasedTextGUI textGUI)
+ Login()
{
- String[] input = dialog.showDialog(textGUI);
+ super("Login");
+ this.user = null;
+ this.pass = null;
+ this.username = new TextBox();
+ this.password = new TextBox().setMask('*');
- user = input[0];
- pass = input[1];
+ Panel buttonPanel = new Panel();
+ buttonPanel
+ .setLayoutManager(
+ new GridLayout(2).setHorizontalSpacing(1))
+ .addComponent(
+ new Button(LocalizedString.OK.toString(), this::onOK)
+ .setLayoutData(GridLayout.createLayoutData(
+ GridLayout.Alignment.CENTER,
+ GridLayout.Alignment.CENTER,
+ true,
+ false)))
+ .addComponent(
+ new Button(LocalizedString.Cancel.toString(), this::onCancel));
- login();
+ Panel mainPanel = new Panel()
+ .setLayoutManager(new GridLayout(1)
+ .setLeftMarginSize(1)
+ .setRightMarginSize(1));
+
+ mainPanel.addComponent(new Label("Enter your username and password"));
+
+ mainPanel.addComponent(new EmptySpace(TerminalSize.ONE));
+
+ Panel userPanel = new Panel()
+ .setLayoutManager(new GridLayout(3))
+ .setLayoutData(
+ GridLayout.createLayoutData(
+ GridLayout.Alignment.FILL,
+ Alignment.CENTER,
+ true,
+ false));
+
+ this.username.setLayoutData(
+ GridLayout.createLayoutData(
+ GridLayout.Alignment.FILL,
+ GridLayout.Alignment.CENTER,
+ true,
+ false));
+
+ userPanel.addComponent(new Label("Username: "))
+ .addComponent(username)
+ .addTo(mainPanel);
+
+ this.password
+ .setLayoutData(
+ GridLayout.createLayoutData(GridLayout.Alignment.FILL,
+ GridLayout.Alignment.CENTER,
+ true,
+ false))
+ .addTo(mainPanel);
+
+ Panel passPanel = new Panel()
+ .setLayoutManager(new GridLayout(3))
+ .setLayoutData(GridLayout.createLayoutData(
+ GridLayout.Alignment.FILL,
+ Alignment.CENTER,
+ true,
+ false));
+
+ passPanel.addComponent(new Label("Password: "))
+ .addComponent(password)
+ .addTo(mainPanel);
+
+ mainPanel.addComponent(new EmptySpace(TerminalSize.ONE));
+
+ buttonPanel.setLayoutData(
+ GridLayout.createLayoutData(
+ Alignment.END,
+ Alignment.CENTER,
+ false, false))
+ .addTo(mainPanel);
+
+ setHints(Arrays.asList(Window.Hint.CENTERED));
+ setComponent(mainPanel);
}
- private void login()
+ public void onOK()
{
- login.login(user, pass);
+ this.user = username.getText();
+ this.pass = password.getText();
- user = null;
- pass = null;
+ if (user.isEmpty() || pass.isEmpty())
+ {
+ MessageDialog.showMessageDialog(getTextGUI(), getTitle(), "Username and password cannot be blank",
+ MessageDialogButton.OK);
+ return;
+ }
+
+ try
+ {
+ login.loginJecna(user, pass);
+ } catch (UnknownHostException e) {
+ MessageDialog.showMessageDialog(getTextGUI(), "No Internet connection",
+ "There seems to be no internet connection, reverting to cached data", MessageDialogButton.OK);
+ return;
+ } catch (CredentialException e)
+ {
+ MessageDialog.showMessageDialog(getTextGUI(), "Incorrect username or password",
+ "The username or password you entered is incorrect", MessageDialogButton.OK);
+ return;
+ } catch (IOException e)
+ {
+ MessageDialog.showMessageDialog(getTextGUI(), "There was an error", "Maybe try again and it will go away",
+ MessageDialogButton.OK);
+ return;
+ }
+
+ close();
}
- public String getJsessionId()
- {
+ public String getJessionId() {
return login.getJSESSIONID();
}
+
+ public void onCancel() {
+ close();
+ }
+
+ @Override
+ public String[] showDialog(WindowBasedTextGUI textGUI) {
+ super.showDialog(textGUI);
+ return new String[] { user, pass };
+ }
}
diff --git a/src/main/java/xyz/thastertyn/Window/LoginDialog.java b/src/main/java/xyz/thastertyn/Window/LoginDialog.java
deleted file mode 100644
index f7296f4..0000000
--- a/src/main/java/xyz/thastertyn/Window/LoginDialog.java
+++ /dev/null
@@ -1,112 +0,0 @@
-package xyz.thastertyn.Window;
-
-import com.googlecode.lanterna.TerminalSize;
-import com.googlecode.lanterna.gui2.Button;
-import com.googlecode.lanterna.gui2.EmptySpace;
-import com.googlecode.lanterna.gui2.GridLayout;
-import com.googlecode.lanterna.gui2.Label;
-import com.googlecode.lanterna.gui2.LocalizedString;
-import com.googlecode.lanterna.gui2.Panel;
-import com.googlecode.lanterna.gui2.TextBox;
-import com.googlecode.lanterna.gui2.WindowBasedTextGUI;
-import com.googlecode.lanterna.gui2.GridLayout.Alignment;
-import com.googlecode.lanterna.gui2.dialogs.DialogWindow;
-import com.googlecode.lanterna.gui2.dialogs.MessageDialog;
-import com.googlecode.lanterna.gui2.dialogs.MessageDialogButton;
-
-public class LoginDialog extends DialogWindow {
-
- private TextBox username;
- private TextBox password;
- private String user;
- private String pass;
-
- LoginDialog(
- String title,
- String description
- )
- {
- super(title);
- this.user = null;
- this.pass = null;
- this.username = new TextBox();
- this.password = new TextBox().setMask('*');
-
- Panel buttonPanel = new Panel();
- buttonPanel.setLayoutManager((new GridLayout(2).setHorizontalSpacing(1)));
- buttonPanel
- .addComponent((new Button(LocalizedString.OK.toString(), this::onOK)
- .setLayoutData(GridLayout.createLayoutData(GridLayout.Alignment.CENTER, GridLayout.Alignment.CENTER, true, false))));
- buttonPanel.addComponent(new Button(LocalizedString.Cancel.toString(), this::onCancel));
-
- Panel mainPanel = new Panel();
- mainPanel.setLayoutManager(new GridLayout(1).setLeftMarginSize(1).setRightMarginSize(1));
-
- if(description != null)
- {
- mainPanel.addComponent(new Label(description));
- }
-
- mainPanel.addComponent(new EmptySpace(TerminalSize.ONE));
-
- Panel userPanel = new Panel()
- .setLayoutManager(new GridLayout(3))
- .setLayoutData(GridLayout.createLayoutData(GridLayout.Alignment.FILL, Alignment.CENTER, true, false));
-
- this.username.setLayoutData(GridLayout.createLayoutData(GridLayout.Alignment.FILL, GridLayout.Alignment.CENTER, true, false));
-
- userPanel.addComponent(new Label("Username: "))
- .addComponent(username)
- .addTo(mainPanel);
-
- this.password.setLayoutData(GridLayout.createLayoutData(GridLayout.Alignment.FILL, GridLayout.Alignment.CENTER, true, false))
- .addTo(mainPanel);
-
- Panel passPanel = new Panel()
- .setLayoutManager(new GridLayout(3))
- .setLayoutData(GridLayout.createLayoutData(GridLayout.Alignment.FILL, Alignment.CENTER, true, false));
-
- passPanel.addComponent(new Label("Password: "))
- .addComponent(password)
- .addTo(mainPanel);
-
- mainPanel.addComponent(new EmptySpace(TerminalSize.ONE));
-
- buttonPanel.setLayoutData(
- GridLayout.createLayoutData(
- Alignment.END,
- Alignment.CENTER,
- false, false))
- .addTo(mainPanel);
-
- setComponent(mainPanel);
- }
-
- public void onOK()
- {
- if(username.getText().isEmpty() || password.getText().isEmpty())
- {
- MessageDialog.showMessageDialog(getTextGUI(), getTitle(), "Username and password cannot be blank", MessageDialogButton.OK);
- return;
- }
-
- this.user = username.getText();
- this.pass = password.getText();
-
- close();
- }
-
- public void onCancel()
- {
- close();
- }
-
- @Override
- public String[] showDialog(WindowBasedTextGUI textGUI)
- {
- user = null;
- pass = null;
- super.showDialog(textGUI);
- return new String[] {user, pass};
- }
-}
diff --git a/src/main/java/xyz/thastertyn/Window/MainWindow.java b/src/main/java/xyz/thastertyn/Window/MainWindow.java
index 1b274cb..33e2342 100644
--- a/src/main/java/xyz/thastertyn/Window/MainWindow.java
+++ b/src/main/java/xyz/thastertyn/Window/MainWindow.java
@@ -2,13 +2,12 @@ package xyz.thastertyn.Window;
import java.io.IOException;
import java.util.Arrays;
-
import com.googlecode.lanterna.TextColor;
import com.googlecode.lanterna.gui2.BasicWindow;
-import com.googlecode.lanterna.gui2.Borders;
import com.googlecode.lanterna.gui2.DefaultWindowManager;
import com.googlecode.lanterna.gui2.Direction;
import com.googlecode.lanterna.gui2.EmptySpace;
+import com.googlecode.lanterna.gui2.Label;
import com.googlecode.lanterna.gui2.LinearLayout;
import com.googlecode.lanterna.gui2.MultiWindowTextGUI;
import com.googlecode.lanterna.gui2.Panel;
@@ -19,58 +18,53 @@ import com.googlecode.lanterna.screen.TerminalScreen;
import com.googlecode.lanterna.terminal.DefaultTerminalFactory;
import com.googlecode.lanterna.terminal.Terminal;
-import xyz.thastertyn.Jecna.Credentials;
-import xyz.thastertyn.Jecna.Login;
-
public class MainWindow {
-
- Login l = new Login();
+ private Terminal terminal;
+ private Screen screen;
+ private Window window;
+ private MultiWindowTextGUI textGUI;
+
+
public void run()
{
- Terminal terminal = null;
try {
+ //#region init
// Setup terminal and screen layers
terminal = new DefaultTerminalFactory().createTerminal();
- Screen screen = new TerminalScreen(terminal);
+ screen = new TerminalScreen(terminal);
screen.startScreen();
+ // Create window to hold the panel
+ window = new BasicWindow();
+ window.setHints(Arrays.asList(Window.Hint.CENTERED));
+
+ // Create gui and start gui
+ textGUI = new MultiWindowTextGUI(screen, new DefaultWindowManager(), new EmptySpace(TextColor.ANSI.BLACK_BRIGHT));
+ //#endregion
+
// Create panel to hold components
final Panel mainPanel = new Panel();
- mainPanel.setLayoutManager(new LinearLayout(Direction.HORIZONTAL));
+ mainPanel.setLayoutManager(new LinearLayout(Direction.VERTICAL));
- // Create window to hold the panel
- BasicWindow window = new BasicWindow();
window.setComponent(mainPanel);
- window.setHints(Arrays.asList(Window.Hint.CENTERED));
mainPanel.addComponent(new Separator(Direction.VERTICAL).setLayoutData(LinearLayout.createLayoutData(LinearLayout.Alignment.Fill)));
- final Panel content = new Panel();
- mainPanel.addComponent(content);
+ Panel content = new Panel();
+ content.addTo(mainPanel);
- xyz.thastertyn.Window.Login login = new xyz.thastertyn.Window.Login();
+ Login login = new Login();
+ login.showDialog(textGUI);
- /*Rozvrh r = new Rozvrh();
- r.download(login.getJsessionId());
-
- content.addComponent(r.getPanel());*/
+ window.addWindowListener(new WindowSwitchListener(content, login.getJessionId()));
+
+ textGUI.addWindowAndWait(window);
- // Create gui and start gui
- final MultiWindowTextGUI gui = new MultiWindowTextGUI(screen, new DefaultWindowManager(), new EmptySpace(TextColor.ANSI.BLACK_BRIGHT));
- login.showDialog(gui);
- /*KeyStroke k = terminal.readInput();
- if(k.equals(KeyStroke.fromString("")))
- {
- window.close();
- }*/
- gui.addWindowAndWait(window);
-
-
- } catch (IOException e) {
- e.printStackTrace();
- }
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
}
}
diff --git a/src/main/java/xyz/thastertyn/Window/Rozvrh.java b/src/main/java/xyz/thastertyn/Window/Rozvrh.java
deleted file mode 100644
index 8a8d45f..0000000
--- a/src/main/java/xyz/thastertyn/Window/Rozvrh.java
+++ /dev/null
@@ -1,62 +0,0 @@
-package xyz.thastertyn.Window;
-
-import java.io.IOException;
-import java.net.UnknownHostException;
-import java.util.List;
-
-import com.googlecode.lanterna.TerminalSize;
-import com.googlecode.lanterna.TextColor;
-import com.googlecode.lanterna.graphics.SimpleTheme;
-import com.googlecode.lanterna.gui2.Direction;
-import com.googlecode.lanterna.gui2.Panel;
-import com.googlecode.lanterna.gui2.Separator;
-import com.googlecode.lanterna.gui2.TextGUIGraphics;
-import com.googlecode.lanterna.gui2.table.Table;
-import com.googlecode.lanterna.gui2.table.TableCellRenderer;
-
-public class Rozvrh {
-
- private Panel rozvrhPanel = new Panel();
-
- private xyz.thastertyn.Jecna.Rozvrh rozvrh = new xyz.thastertyn.Jecna.Rozvrh();
-
- private String[] labels = {"Den", "7:30-8:15", "8:25-9:10", "9:20-10:05", "10:20-11:05", "11:15-12:00", "12:10-12:55", "13:05-13:50", "14:00-14:45", "14:55-15:40", "15:50-16:35"};
-
- String[] days = {"PO", "UT", "ST", "CT", "PA"};
-
- Table t = new Table<>(labels);
-
- public byte download(String Jsessionid)
- {
- try
- {
- rozvrh.downloadRozvrh(Jsessionid);
-
- String[][] r = rozvrh.getRozvrh();
-
- String[] s = new String[labels.length];
-
- for(int i = 0; i < r.length; i++)
- {
- s[0] = days[i];
- for(int j = 1; j < r[i].length; j++) { s[j] = r[i][j]; }
-
- t.getTableModel().addRow(s);
- }
- t.addTo(rozvrhPanel);
-
- return 0;
- }catch(UnknownHostException e)
- {
- return 127;
- }catch(IOException e)
- {
- return 126;
- }
- }
-
- public Panel getPanel()
- {
- return rozvrhPanel;
- }
-}
diff --git a/src/main/java/xyz/thastertyn/Window/WindowSwitchListener.java b/src/main/java/xyz/thastertyn/Window/WindowSwitchListener.java
new file mode 100644
index 0000000..4a70d2c
--- /dev/null
+++ b/src/main/java/xyz/thastertyn/Window/WindowSwitchListener.java
@@ -0,0 +1,123 @@
+package xyz.thastertyn.Window;
+
+import java.util.concurrent.atomic.AtomicBoolean;
+
+import com.googlecode.lanterna.TerminalPosition;
+import com.googlecode.lanterna.TerminalSize;
+import com.googlecode.lanterna.gui2.Label;
+import com.googlecode.lanterna.gui2.Panel;
+import com.googlecode.lanterna.gui2.Window;
+import com.googlecode.lanterna.gui2.WindowBasedTextGUI;
+import com.googlecode.lanterna.gui2.WindowListener;
+import com.googlecode.lanterna.input.KeyStroke;
+import com.googlecode.lanterna.input.KeyType;
+
+import xyz.thastertyn.Window.Content.JecnaContent;
+import xyz.thastertyn.Window.Content.Rozvrh;
+import xyz.thastertyn.Window.Content.Znamky;
+
+public class WindowSwitchListener implements WindowListener {
+
+ WindowBasedTextGUI gui;
+
+ private JecnaContent[] contents = {new Rozvrh(), new Znamky()};
+
+ private String JsessionId;
+
+ Panel panel;
+ Label label;
+
+ int current = 0;
+
+ public WindowSwitchListener(Panel holder, String JsessionId)
+ {
+ panel = holder;
+ this.JsessionId = JsessionId;
+ this.label = label;
+ defaultPanel();
+ }
+
+ private void defaultPanel()
+ {
+ contents[0].download(JsessionId);
+ panel.removeAllComponents();
+ panel.addComponent(contents[0].getPanel());
+ //label.setText(contents[0].getLabel());
+ }
+
+ public void next()
+ {
+ if(current + 1 == contents.length)
+ {
+ current = 0;
+ }else{
+ current++;
+ }
+
+ if(!contents[current].hasStarted())
+ {
+ contents[current].download(JsessionId);
+ }
+
+ panel.removeAllComponents();
+ panel.addComponent(contents[current].getPanel());
+
+ //label.setText(contents[current].getLabel());
+ }
+
+ public void previous()
+ {
+ if(current - 1 == -1)
+ {
+ current = contents.length - 1;
+ }else{
+ current--;
+ }
+
+ if(!contents[current].hasStarted())
+ {
+ contents[current].download(JsessionId);
+ }
+ panel.removeAllComponents();
+ panel.addComponent(contents[current].getPanel());
+
+ //label.setText(contents[current].getLabel());
+ }
+
+
+
+ @Override
+ public void onInput(Window basePane, KeyStroke keyStroke, AtomicBoolean deliverEvent) {
+ KeyType type = keyStroke.getKeyType();
+
+ switch(type)
+ {
+ case Tab:
+ if(!keyStroke.isShiftDown())
+ {
+ next();
+ }else{
+ previous();
+ }
+ break;
+ default:
+ break;
+ }
+ }
+
+ @Override
+ public void onUnhandledInput(Window basePane, KeyStroke keyStroke, AtomicBoolean hasBeenHandled) {
+ // TODO Auto-generated method stub
+ }
+
+ @Override
+ public void onResized(Window window, TerminalSize oldSize, TerminalSize newSize) {
+ window.invalidate();
+ }
+
+ @Override
+ public void onMoved(Window window, TerminalPosition oldPosition, TerminalPosition newPosition) {
+ // TODO Auto-generated method stub
+ }
+
+}
diff --git a/target/classes/xyz/thastertyn/App.class b/target/classes/xyz/thastertyn/App.class
index 8c05ee8..8fc5f3f 100644
Binary files a/target/classes/xyz/thastertyn/App.class and b/target/classes/xyz/thastertyn/App.class differ
diff --git a/target/classes/xyz/thastertyn/Connection.class b/target/classes/xyz/thastertyn/Connection.class
deleted file mode 100644
index 242c415..0000000
Binary files a/target/classes/xyz/thastertyn/Connection.class and /dev/null differ
diff --git a/target/classes/xyz/thastertyn/Download.class b/target/classes/xyz/thastertyn/Download.class
deleted file mode 100644
index 51b02c3..0000000
Binary files a/target/classes/xyz/thastertyn/Download.class and /dev/null differ
diff --git a/target/classes/xyz/thastertyn/Jecna/Dochazka.class b/target/classes/xyz/thastertyn/Jecna/Dochazka.class
index 5e44996..42f6c0e 100644
Binary files a/target/classes/xyz/thastertyn/Jecna/Dochazka.class and b/target/classes/xyz/thastertyn/Jecna/Dochazka.class differ
diff --git a/target/classes/xyz/thastertyn/Jecna/Jidelna.class b/target/classes/xyz/thastertyn/Jecna/Jidelna.class
new file mode 100644
index 0000000..b7f1869
Binary files /dev/null and b/target/classes/xyz/thastertyn/Jecna/Jidelna.class differ
diff --git a/target/classes/xyz/thastertyn/Jecna/Login.class b/target/classes/xyz/thastertyn/Jecna/Login.class
index f8ffa27..572fe36 100644
Binary files a/target/classes/xyz/thastertyn/Jecna/Login.class and b/target/classes/xyz/thastertyn/Jecna/Login.class differ
diff --git a/target/classes/xyz/thastertyn/Jecna/Znamky.class b/target/classes/xyz/thastertyn/Jecna/Znamky.class
index bc021b4..78c6ac4 100644
Binary files a/target/classes/xyz/thastertyn/Jecna/Znamky.class and b/target/classes/xyz/thastertyn/Jecna/Znamky.class differ
diff --git a/target/classes/xyz/thastertyn/Predmet.class b/target/classes/xyz/thastertyn/Predmet.class
deleted file mode 100644
index 8ffad90..0000000
Binary files a/target/classes/xyz/thastertyn/Predmet.class and /dev/null differ
diff --git a/target/classes/xyz/thastertyn/RozvrhDownload.class b/target/classes/xyz/thastertyn/RozvrhDownload.class
deleted file mode 100644
index 29eccbb..0000000
Binary files a/target/classes/xyz/thastertyn/RozvrhDownload.class and /dev/null differ
diff --git a/target/classes/xyz/thastertyn/Window/Content/JecnaContent.class b/target/classes/xyz/thastertyn/Window/Content/JecnaContent.class
new file mode 100644
index 0000000..4a1dc85
Binary files /dev/null and b/target/classes/xyz/thastertyn/Window/Content/JecnaContent.class differ
diff --git a/target/classes/xyz/thastertyn/Window/Content/Jidelna.class b/target/classes/xyz/thastertyn/Window/Content/Jidelna.class
new file mode 100644
index 0000000..2451488
Binary files /dev/null and b/target/classes/xyz/thastertyn/Window/Content/Jidelna.class differ
diff --git a/target/classes/xyz/thastertyn/Window/Content/Rozvrh.class b/target/classes/xyz/thastertyn/Window/Content/Rozvrh.class
new file mode 100644
index 0000000..dec4b33
Binary files /dev/null and b/target/classes/xyz/thastertyn/Window/Content/Rozvrh.class differ
diff --git a/target/classes/xyz/thastertyn/Window/Content/Znamky.class b/target/classes/xyz/thastertyn/Window/Content/Znamky.class
new file mode 100644
index 0000000..360f92f
Binary files /dev/null and b/target/classes/xyz/thastertyn/Window/Content/Znamky.class differ
diff --git a/target/classes/xyz/thastertyn/Window/Login.class b/target/classes/xyz/thastertyn/Window/Login.class
index efdcebf..b20da03 100644
Binary files a/target/classes/xyz/thastertyn/Window/Login.class and b/target/classes/xyz/thastertyn/Window/Login.class differ
diff --git a/target/classes/xyz/thastertyn/Window/LoginDialog.class b/target/classes/xyz/thastertyn/Window/LoginDialog.class
deleted file mode 100644
index 926ccde..0000000
Binary files a/target/classes/xyz/thastertyn/Window/LoginDialog.class and /dev/null differ
diff --git a/target/classes/xyz/thastertyn/Window/MainWindow.class b/target/classes/xyz/thastertyn/Window/MainWindow.class
index 299a09c..c77f893 100644
Binary files a/target/classes/xyz/thastertyn/Window/MainWindow.class and b/target/classes/xyz/thastertyn/Window/MainWindow.class differ
diff --git a/target/classes/xyz/thastertyn/Window/Rozvrh.class b/target/classes/xyz/thastertyn/Window/Rozvrh.class
deleted file mode 100644
index 3a4dab8..0000000
Binary files a/target/classes/xyz/thastertyn/Window/Rozvrh.class and /dev/null differ
diff --git a/target/classes/xyz/thastertyn/Window/WindowSwitchListener.class b/target/classes/xyz/thastertyn/Window/WindowSwitchListener.class
new file mode 100644
index 0000000..a401765
Binary files /dev/null and b/target/classes/xyz/thastertyn/Window/WindowSwitchListener.class differ