package com.digiarea.closure.help.model.controller; import java.net.URL; import java.util.ResourceBundle; import javafx.beans.value.ChangeListener; import javafx.beans.value.ObservableValue; import javafx.event.ActionEvent; import javafx.event.EventHandler; import javafx.fxml.FXML; import javafx.fxml.Initializable; import javafx.scene.Cursor; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.control.ProgressBar; import javafx.scene.control.SplitPane; import javafx.scene.control.Tooltip; import javafx.scene.control.TreeCell; import javafx.scene.control.TreeItem; import javafx.scene.control.TreeView; import javafx.scene.image.ImageView; import javafx.scene.input.KeyCode; import javafx.scene.input.KeyCodeCombination; import javafx.scene.input.MouseEvent; import javafx.scene.layout.VBox; import javafx.scene.web.WebEngine; import javafx.scene.web.WebView; import javafx.stage.Stage; import javafx.util.Callback; import netscape.javascript.JSObject; import com.digiarea.closure.help.model.HelpTopic; import com.digiarea.closure.help.providers.HelpProviderFactory; import com.digiarea.closure.help.providers.IHelpProvider; import com.digiarea.closurefx.ResourceUtils; /** * FXML Controller class * * @author daginno */ public class HelpController implements Initializable { @FXML private VBox container; private Stage stage; private Helpwalker helpwalker; @FXML private TreeView<HelpTopic> controlTree; private TreeItem<HelpTopic> root; private HelpTopic help; @FXML private WebView controlWebview; private WebEngine webEngine; @FXML private Button btnUpdate; @FXML private SplitPane controlSplit; @FXML private ProgressBar controlProgress; private URL initialURL; public void setInitialURL(URL initialURL, String link) { this.initialURL = initialURL; if (this.initialURL != null) { webEngine.load(this.initialURL.toString() + link); } } /** * Initializes the controller class. */ @Override public void initialize(URL url, ResourceBundle rb) { webEngine = controlWebview.getEngine(); controlProgress.progressProperty().bind( webEngine.getLoadWorker().progressProperty()); helpwalker = new Helpwalker(); IHelpProvider helpProvider = HelpProviderFactory.getHelp(); help = helpProvider.getHelp(); root = new TreeItem<HelpTopic>(help); helpwalker.walk(help, root); controlTree.setRoot(root); controlTree.setShowRoot(false); controlTree .setCellFactory(new Callback<TreeView<HelpTopic>, TreeCell<HelpTopic>>() { @Override public TreeCell<HelpTopic> call(TreeView<HelpTopic> p) { return new HelpCell(); } }); controlTree.getSelectionModel().selectedItemProperty() .addListener(new ChangeListener<TreeItem<HelpTopic>>() { @Override public void changed( ObservableValue<? extends TreeItem<HelpTopic>> observable, TreeItem<HelpTopic> oldValue, TreeItem<HelpTopic> newValue) { if (newValue != null) { if (newValue.getValue().getLink() != null) { webEngine.load(newValue.getValue().getLink() .toString()); } } } }); loadHome(); } private double lastWidth = 0; public void setStage(Stage stage) { this.stage = stage; Scene scene = this.stage.getScene(); if (scene != null) { scene.getAccelerators().put(new KeyCodeCombination(KeyCode.F5), new Runnable() { @Override public void run() { btnUpdate.fireEvent(new ActionEvent()); } }); } lastWidth = scene.getWidth(); controlSplit.getDividers().get(0).positionProperty() .addListener(new ChangeListener<Number>() { @Override public void changed( ObservableValue<? extends Number> observable, Number oldValue, Number newValue) { if (lastWidth != getStage().getScene().getWidth()) { controlSplit.getDividers().get(0).setPosition(0.25); lastWidth = getStage().getScene().getWidth(); } } }); } public Stage getStage() { return stage; } private class HelpCell extends TreeCell<HelpTopic> { public HelpCell() { setOnMouseExited(new EventHandler<MouseEvent>() { @Override public void handle(MouseEvent e) { setCursor(Cursor.DEFAULT); } }); setOnMouseMoved(new EventHandler<MouseEvent>() { @Override public void handle(MouseEvent e) { if (!isEmpty()) { setCursor(Cursor.HAND); } } }); } @Override public void updateItem(HelpTopic item, boolean empty) { super.updateItem(item, empty); if (isEmpty() || item == null) { setText(null); setGraphic(null); setTooltip(null); } else { setText(item.getName()); setTooltip(new Tooltip(item.getName())); setGraphic(getGraphics()); } } private ImageView getGraphics() { if (getItem().isRoot()) { return new ImageView(ResourceUtils.HELP_HELP); } if (getItem().hasChildren()) { return new ImageView(ResourceUtils.HELP_BOOK); } return new ImageView(ResourceUtils.SIMPLE_FILE); } } @FXML private void handleBackButtonAction(ActionEvent event) { JSObject history = (JSObject) webEngine.executeScript("history"); history.call("back"); } @FXML private void handleForwardButtonAction(ActionEvent event) { JSObject history = (JSObject) webEngine.executeScript("history"); history.call("forward"); } @FXML private void handleHomeButtonAction(ActionEvent event) { loadHome(); } private void loadHome() { webEngine.load(help.getLink().toString()); } @FXML private void handleUpdateButtonAction(ActionEvent event) { controlWebview.getEngine().reload(); } private class Helpwalker { public Helpwalker() { } public void walk(HelpTopic topics, TreeItem<HelpTopic> tree) { for (HelpTopic topic : topics.getChildren()) { TreeItem<HelpTopic> currentTopic = new TreeItem<HelpTopic>( topic); tree.getChildren().add(currentTopic); if (topic.hasChildren()) { walk(topic, currentTopic); } } } } }