/*
* Copyright [2014] [Christian Loehnert, krampenschiesser@gmail.com]
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package de.ks.idnadrev;
import de.ks.activity.ActivityCfg;
import de.ks.activity.ActivityController;
import de.ks.activity.ActivityHint;
import de.ks.application.MainWindow;
import de.ks.application.fxml.DefaultLoader;
import de.ks.idnadrev.overview.OverviewActivity;
import de.ks.idnadrev.task.work.WorkingOnTaskLink;
import de.ks.javafx.NodeLookup;
import de.ks.menu.presenter.MenuBarPresenter;
import de.ks.menu.sink.ContentSink;
import de.ks.menu.sink.PopupSink;
import javafx.application.Platform;
import javafx.scene.Node;
import javafx.scene.Parent;
import javafx.scene.control.Button;
import javafx.scene.control.Control;
import javafx.scene.control.MenuBar;
import javafx.scene.input.KeyCode;
import javafx.scene.input.KeyEvent;
import javafx.scene.layout.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.annotation.PostConstruct;
import javax.inject.Inject;
import javax.inject.Singleton;
import java.util.Set;
@Singleton
public class IdnadrevWindow extends MainWindow {
public static final String PROPERTY_INITIAL_ACTIVITY = "initialActivtiy";
private static final Logger log = LoggerFactory.getLogger(IdnadrevWindow.class);
@Inject
MenuBarPresenter menuBarPresenter;
@Inject
PopupSink popupSink;
@Inject
ContentSink contentSink;
@Inject
ActivityController activityController;
protected final WorkingOnTaskLink workingOnTaskLink = new WorkingOnTaskLink();
private BorderPane borderPane;
private DefaultLoader<BorderPane, Object> loader;
private ButtonBar buttonBar;
private GridPane buttonBarView;
private StackPane contentPane;
protected HBox progressBox;
@PostConstruct
public void initialize() {
popupSink.setMenuPath("/main/help");
contentSink.setMenuPath("/main");
loader = new DefaultLoader<>(IdnadrevWindow.class);
}
@Override
public Parent getNode() {
if (borderPane == null) {
borderPane = loader.getView();
VBox vBox = new VBox();
vBox.setMinSize(Control.USE_COMPUTED_SIZE, Control.USE_COMPUTED_SIZE);
vBox.setMaxSize(Control.USE_COMPUTED_SIZE, Control.USE_COMPUTED_SIZE);
MenuBar menu = menuBarPresenter.getMenu("/main");
menu.setMinSize(Control.USE_COMPUTED_SIZE, Control.USE_COMPUTED_SIZE);
vBox.getChildren().add(menu);
StackPane topPane = (StackPane) borderPane.getTop();
progressBox = (HBox) topPane.getChildren().get(0);
progressBox.getChildren().add(workingOnTaskLink);
topPane.getChildren().add(0, menu);
DefaultLoader<GridPane, ButtonBar> loader = new DefaultLoader<>(ButtonBar.class);
buttonBar = loader.getController();
buttonBarView = loader.getView();
contentPane = new StackPane();
borderPane.setCenter(contentPane);
contentSink.setPane(contentPane);
borderPane.setOnKeyReleased(this::checkShortcut);
Platform.runLater(this::startInitialActivity);
}
return borderPane;
}
protected void startInitialActivity() {
String activityClass = System.getProperty(PROPERTY_INITIAL_ACTIVITY, OverviewActivity.class.getName());
if (!activityClass.isEmpty()) {
try {
@SuppressWarnings("unchecked") Class<? extends ActivityCfg> clazz = (Class<? extends ActivityCfg>) Class.forName(activityClass);
activityController.startOrResume(new ActivityHint(clazz));
try {
Thread.sleep(100);
} catch (InterruptedException e) {
//
}
} catch (ClassNotFoundException e) {
log.error("Could not load activity class {}", activityClass, e);
}
}
}
private void checkShortcut(KeyEvent event) {
KeyCode code = event.getCode();
if (code == KeyCode.F1) {
if (buttonBar.isShowing()) {
buttonBar.hide();
} else {
buttonBar.show(borderPane);
}
event.consume();
} else if (code == KeyCode.F2) {
buttonBar.overview();
event.consume();
} else if (code == KeyCode.F3) {
buttonBar.addThought();
event.consume();
} else if (code == KeyCode.F4) {
buttonBar.createTask();
event.consume();
} else if (code == KeyCode.F5) {
buttonBar.createTextInfo();
event.consume();
} else if (code == KeyCode.F6) {
buttonBar.viewThoughts();
event.consume();
} else if (code == KeyCode.F7) {
buttonBar.viewTasks();
event.consume();
} else if (code == KeyCode.F8) {
buttonBar.informationOverview();
event.consume();
} else if (code == KeyCode.F9) {
buttonBar.planWeek();
event.consume();
} else if (code == KeyCode.F10) {
buttonBar.weeklyDone();
event.consume();
} else if (code == KeyCode.F11) {
buttonBar.chooseNextTask();
event.consume();
} else if (code == KeyCode.F12) {
buttonBar.fastTrack();
event.consume();
}
if (event.isControlDown() && event.getCode() == KeyCode.ENTER) {
Set<Node> defaultButtons = NodeLookup.getAllNodes(borderPane, n -> n.isVisible() && n instanceof Button && ((Button) n).isDefaultButton());
if (!defaultButtons.isEmpty()) {
Button defaultButton = (Button) defaultButtons.iterator().next();
if (!defaultButton.isDisabled()) {
log.debug("Executing default button {} on ctrl+enter", defaultButton);
defaultButton.getOnAction().handle(null);
}
event.consume();
}
}
}
public HBox getProgressBox() {
return progressBox;
}
public WorkingOnTaskLink getWorkingOnTaskLink() {
return workingOnTaskLink;
}
@Override
public String getApplicationTitle() {
return "Idnadrev Version " + Application.versioning.getVersionInfo().getVersionString();
}
}