package view; import java.io.*; import java.security.*; import javafx.animation.*; import javafx.application.*; import javafx.concurrent.*; import javafx.event.*; import javafx.geometry.*; import javafx.scene.*; import javafx.scene.control.*; import javafx.scene.image.*; import javafx.scene.layout.*; import javafx.scene.web.*; import javafx.stage.*; import javafx.util.*; import model.*; import model.persistance.*; import org.apache.log4j.*; import org.bouncycastle.jce.provider.*; import org.controlsfx.control.textfield.*; import control.*; public class Dashboard extends Application { private Dashboard dashboard; private Stage stage; private Scene scene; private LoginFader loginFader; private SplitPane splitPane; private StackPane stackPane; private GridPane actualisationTimePane; private BorderPane background; private WebView webView; private static Label lastUpdateTime; private static ResultList resultList; private Button settingsButton; private Button refreshButton; private static Label statusFooterText; private static CoursesTreeView courses; private Button signIn; private GridPane actionBar; private LoginFader loginFader2; private boolean loaderRunning; private CustomTextField searchField; private Button showLocalNotThere; private Button showIgnored; private RotateTransition refreshTransition; static { Security.insertProviderAt(new BouncyCastleProvider(), 1); } public static void main(String[] args) { new File(System.getProperty("user.home") + "/.ilias/ilias.log").delete(); PropertyConfigurator.configure(Dashboard.class.getResourceAsStream("log4j.properties")); Logger.getLogger(Dashboard.class).warn("Start IliasDownloaderTool."); boolean newVersionCalled = new VersionValidator().validate(); if (newVersionCalled) { System.exit(0); } launch(); } @Override public void start(Stage stage) throws Exception { dashboard = this; stage.getIcons().add(new Image("img/folder.png")); stage.addEventHandler(WindowEvent.WINDOW_CLOSE_REQUEST, new EventHandler<WindowEvent>() { @Override public void handle(WindowEvent event) { Settings settings = Settings.getInstance(); settings.getFlags().setLogin(false); settings.getFlags().setUpdateCanceled(false); settings.store(); System.exit(0); }; }); this.stage = stage; background = new BorderPane(); background.setPadding(new Insets(20, 50, 20, 50)); actionBar = new GridPane(); final GridPane login = new GridPane(); login.setId("loginBackground"); login.setHgap(10); login.setVgap(5); Button goBack = new Button(); goBack.setId("loginButtonCancel"); loginFader2 = new LoginFader(this, -500, login); goBack.setOnAction(loginFader2); TextField username = new TextField(); username.setId("textField"); username.setPromptText("Benutzererkennung"); username.setText(Settings.getInstance().getUser().getName()); PasswordField password = new PasswordField(); password.setText(Settings.getInstance().getUser().getPassword()); password.setId("textField"); password.setPromptText("Passwort"); RadioButton savePwd = new RadioButton("Speichern"); savePwd.setSelected(true); Button loginBtn = new Button(); loginFader = new LoginFader(this, -500, login); loginBtn.setId("loginButtonGO"); loginFader.getT().setOnFinished(new LoginProvider(this, username, password, savePwd)); loginBtn.setOnAction(loginFader); username.setOnAction(loginFader); password.setOnAction(loginFader); Separator separator = new Separator(Orientation.VERTICAL); login.add(goBack, 0, 0); login.add(username, 1, 0); login.add(password, 2, 0); login.add(loginBtn, 3, 0); login.add(savePwd, 1, 1); login.add(separator, 4, 0); login.setOpacity(0); courses = new CoursesTreeView(this); resultList = new ResultList(this); actualisationTimePane = new GridPane(); actualisationTimePane.setHgap(10); actualisationTimePane.setVgap(5); lastUpdateTime = new Label(IliasTreeStorage.getActualisationDate()); lastUpdateTime.setId("lastUpdateTimeLabel"); actualisationTimePane.add(new Label(), 0, 0); actualisationTimePane.add(new Label(), 0, 1); actualisationTimePane.add(lastUpdateTime, 0, 2); stackPane = new StackPane(); stackPane.getChildren().add(actualisationTimePane); stackPane.getChildren().add(login); stackPane.getChildren().add(actionBar); actionBar.prefWidthProperty().bind(background.widthProperty()); actionBar.setHgap(10); Button collapseTree = new Button(); collapseTree.setId("collapseButton"); collapseTree.getStyleClass().add("doButton"); collapseTree.setOnAction(new EventHandler<ActionEvent>() { @Override public void handle(ActionEvent event) { courses.collapse(); } }); collapseTree.setTooltip(new Tooltip("Alle Ordner schließen")); collapseTree.prefWidthProperty().bind(actionBar.prefWidthProperty()); refreshButton = new Button(); refreshTransition = new RotateTransition(Duration.millis(1000), refreshButton); final Tooltip tooltip = new Tooltip("Aktualisieren"); refreshButton.setTooltip(tooltip); refreshButton.setId("loaderButton"); refreshButton.getStyleClass().add("doButton"); refreshButton.setMouseTransparent(true); refreshButton.setOnAction(new EventHandler<ActionEvent>() { @Override public void handle(ActionEvent event) { if (loaderRunning) { Settings.getInstance().getFlags().setUpdateCanceled(true); showLoader(false); } else { showLoader(true); if (Settings.getInstance().getFlags().isUserLoggedIn()) { new Thread(new Task<Void>() { @Override protected Void call() throws Exception { new IliasStarter(dashboard).loadIliasTree(); LocalFileStorage.getInstance().refresh(); return null; } }).start(); // LocalFileStorage.getInstance().refresh(); } } } }); signIn = new Button("Anmelden"); signIn.setId("loginButton"); signIn.setOnAction(new LoginFader(this, 500, login)); signIn.prefWidthProperty().bind(actionBar.prefWidthProperty()); showLocalNotThere = new Button("Lokal nicht vorhandene Dateien " + "(" + resultList.getUnsynchronizedPdfs().size() + ")"); showLocalNotThere.getStyleClass().add("actionButton"); showLocalNotThere.prefWidthProperty().bind(actionBar.prefWidthProperty()); showLocalNotThere.setOnAction(new EventHandler<ActionEvent>() { @Override public void handle(ActionEvent event) { resultList.showUnsynchronizedPdfs(); } }); showIgnored = new Button("Ignorierte Dateien " + "(" + resultList.getIgnoredIliasPdfs().size() + ")"); showIgnored.getStyleClass().add("actionButton"); showIgnored.setOnAction(new EventHandler<ActionEvent>() { @Override public void handle(ActionEvent event) { resultList.showIgnoredFiles(); } }); showIgnored.prefWidthProperty().bind(actionBar.prefWidthProperty()); showIgnored.setMaxWidth(Double.MAX_VALUE); searchField = new CustomTextField(); ImageView loupe = new ImageView(); loupe.setId("loupe"); searchField.setRight(loupe); searchField.setId("textField"); searchField.setPromptText("Datei suchen"); searchField.setOnKeyReleased(event -> { resultList.showPdfMatches(searchField.getText()); }); searchField.setOnMouseEntered(event -> { loupe.setId("loupeHover"); }); searchField.setOnMouseExited(event -> { if (!searchField.isFocused()) { loupe.setId("loupe"); } }); searchField.focusedProperty().addListener(changed -> { if (searchField.isFocused()) { loupe.setId("loupeHover"); } else { loupe.setId("loupe"); } }); searchField.prefWidthProperty().bind(actionBar.prefWidthProperty()); settingsButton = new Button(); settingsButton.setId("settingsButton"); settingsButton.getStyleClass().add("doButton"); settingsButton.setOnAction(event -> { SettingsMenu menu = new SettingsMenu(dashboard); menu.show(settingsButton); }); ColumnConstraints col1 = new ColumnConstraints(); col1.setPercentWidth(5); ColumnConstraints col15 = new ColumnConstraints(); col15.setPercentWidth(5); ColumnConstraints col2 = new ColumnConstraints(); col2.setPercentWidth(15); ColumnConstraints col3 = new ColumnConstraints(); col3.setPercentWidth(30); ColumnConstraints col4 = new ColumnConstraints(); col4.setPercentWidth(20); ColumnConstraints col5 = new ColumnConstraints(); col5.setPercentWidth(20); ColumnConstraints col6 = new ColumnConstraints(); col6.setPercentWidth(5); actionBar.getColumnConstraints().addAll(col1, col15, col2, col3, col4, col5, col6); actionBar.add(collapseTree, 0, 0); actionBar.add(refreshButton, 1, 0); actionBar.add(signIn, 2, 0); actionBar.add(showLocalNotThere, 3, 0); actionBar.add(showIgnored, 4, 0); actionBar.add(searchField, 5, 0); actionBar.add(settingsButton, 6, 0); background.setTop(stackPane); splitPane = new SplitPane(); splitPane.setId("splitPane"); splitPane.setDividerPositions(0.6f, 0.4f); splitPane.getItems().addAll(courses, resultList.getPane()); background.setCenter(splitPane); GridPane statusFooter = new GridPane(); statusFooter.setPadding(new Insets(10, 0, 0, 0)); statusFooterText = new Label(""); statusFooterText.setId("statusFooterText"); statusFooter.add(statusFooterText, 0, 0); GridPane footer = new GridPane(); footer.setVgap(20); footer.add(statusFooter, 0, 0); background.setBottom(footer); scene = new Scene(background); scene.getStylesheets().add("skin/lightgreen.css"); setScene(); stage.setTitle("Ilias"); LocalFileStorage.getInstance().refresh(); iliasTreeReloaded(false); stage.show(); if (Settings.getInstance().getFlags().isAutoLogin()) { signIn.setMouseTransparent(true); setStatusText("", false); showLoader(true); setMenuTransparent(false); new Thread(new Runnable() { @Override public void run() { Settings newSettings = Settings.getInstance(); User user = newSettings.getUser(); String name = user.getName(); String password = user.getPassword(); final IliasStarter iliasStarter = new IliasStarter(dashboard, name, password); final boolean loginSuccessfull = iliasStarter.login(); if (loginSuccessfull && newSettings.getFlags().autoUpdate()) { Platform.runLater(new Runnable() { @Override public void run() { setLoaderButtonActivated(true); loaderRunning = true; } }); iliasStarter.loadIliasTree(); } } }).start(); } } public void setScene() { stage.setMinWidth(1100); stage.setMinHeight(500); stage.setScene(scene); stage.sizeToScene(); } public void iliasTreeReloaded(final boolean showFinishText) { courses.update(); resultList.refresh(); if (showFinishText) { setStatusText("Aktualisierung beendet.", true); updateUpdateTime(); } } public static void updateUpdateTime() { IliasTreeStorage.setActualisationDate(); lastUpdateTime.setText(IliasTreeStorage.getActualisationDate()); } public void fadeInLogin() { loginFader2.fadeIn(); } public void setMenuTransparent(final boolean b) { Platform.runLater(new Runnable() { @Override public void run() { actionBar.setMouseTransparent(b); } }); } public void setSigInTransparent(final boolean b) { Platform.runLater(new Runnable() { @Override public void run() { signIn.setMouseTransparent(b); } }); } public void showLoader(final boolean show) { Platform.runLater(new Runnable() { @Override public void run() { if (show) { setLoaderButtonActivated(true); loaderRunning = true; refreshButton.getTooltip().setText("Aktualisieren abbrechen"); } else { refreshButton.getTooltip().setText("Aktualisieren"); setLoaderButtonActivated(false); loaderRunning = false; refreshButton.setMouseTransparent(false); signIn.setText("Angemeldet"); signIn.setOpacity(1); } } }); } public void setSignInColor() { signIn.setId("loginButtonActive"); } public void setTitle(final String title) { stage.setTitle(title); } public static void setStatusText(final String text, boolean alert) { final TranslateTransition t = new TranslateTransition(Duration.millis(600), statusFooterText); t.setInterpolator(Interpolator.EASE_BOTH); t.setFromX(statusFooterText.getLayoutX() - 500); t.setToX(statusFooterText.getLayoutX()); if (alert) { statusFooterText.setId("statusFooterAlertText"); } else { statusFooterText.setId("statusFooterText"); } Platform.runLater(new Runnable() { @Override public void run() { statusFooterText.setText(text); } }); t.play(); } public void setStatusText(final String text) { Platform.runLater(new Runnable() { @Override public void run() { statusFooterText.setId("statusFooterText"); statusFooterText.setText(text); } }); } public static void updateGraphicInTree(final IliasFile file) { courses.fileStatusChanged(file); } public void pdfIgnoredStateChanged(IliasFile file) { if (file.isIgnored()) { setStatusText(file.getName() + " wurde auf ignorieren gesetzt.", false); } else { setStatusText(file.getName() + " wird nicht mehr ignoriert.", false); } courses.fileStatusChanged(file); } public void browse(String url) { webView = new WebView(); background.setCenter(webView); final GridPane webControllerPane = new GridPane(); webControllerPane.add(new Label(), 0, 0); webControllerPane.add(new Label(), 0, 1); final Button button = new Button("X"); button.setId("closeBrowser"); button.setOnAction(new EventHandler<ActionEvent>() { @Override public void handle(ActionEvent event) { stackPane.getChildren().remove(webControllerPane); background.setCenter(splitPane); } }); webControllerPane.add(button, 0, 3); stackPane.getChildren().add(webControllerPane); background.setCenter(webView); WebEngine engine = webView.getEngine(); engine.load(url); } public static void fileDownloaded(IliasFile file) { setStatusText("Download abgeschlossen", false); updateGraphicInTree(file); resultList.fileSynchronizedStateChanged(file); } public ResultList getResultList() { return resultList; } public CoursesTreeView getCoursesTreeView() { return courses; } public GridPane getActionBar() { return actionBar; } public String getSearchFieldInput() { return searchField.getText(); } public void setNumberOfUnsynchronizedPdfs(int number) { showLocalNotThere.setText("Lokal nicht vorhandene Dateien " + "(" + String.valueOf(number) + ")"); } public void setNumberofIngoredPdfs(int number) { showIgnored.setText("Ignorierte Dateien " + "(" + String.valueOf(number) + ")"); } private void setLoaderButtonActivated(boolean activate) { if (activate) { refreshTransition.setByAngle(360f); refreshTransition.setCycleCount(Timeline.INDEFINITE); refreshTransition.play(); refreshButton.setId("loaderButtonActive"); } else { refreshTransition.stop(); refreshButton.setId("loaderButton"); } refreshButton.getStyleClass().add("doButton"); } public void showSettingsPrompt() { SettingsMenu menu = new SettingsMenu(dashboard); menu.changeLocalIliasFolderButton(); menu.activatePromptUpdater(); menu.show(settingsButton); } }