package com.digiarea.closure.preferences.model.controller;
import java.io.File;
import java.net.URL;
import java.util.ResourceBundle;
import javafx.beans.property.SimpleBooleanProperty;
import javafx.beans.property.SimpleStringProperty;
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.control.Button;
import javafx.scene.control.RadioButton;
import javafx.scene.control.SelectionMode;
import javafx.scene.control.TableCell;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.ToggleGroup;
import javafx.scene.control.Tooltip;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.scene.text.Font;
import javafx.scene.text.FontPosture;
import javafx.util.Callback;
import com.digiarea.closure.model.controller.UIUtils;
import com.digiarea.closure.preferences.model.Editor;
import com.digiarea.closure.preferences.model.bind.ModelFacade;
import com.digiarea.closurefx.IConstants;
import com.digiarea.closurefx.editors.EditorLoader;
/**
* FXML Controller class
*
* @author daginno
*/
public class PreferenceEditorsController extends ClosurePreferencesController implements Initializable {
public PreferenceEditorsController(ModelFacade modelFacade, ResourceBundle bundle) {
super(modelFacade, bundle);
}
@FXML
private TableView<Editor> controlEditors;
@FXML
private TableColumn<Editor, Boolean> controlDefault;
@FXML
private TableColumn<Editor, String> controlName;
@FXML
private TableColumn<Editor, String> controlEditorPath;
@FXML
private TableColumn<Editor, String> controlButton;
/**
* Initializes the controller class.
*/
@Override
public void initialize(URL url, ResourceBundle rb) {
controlEditors.getSelectionModel().setSelectionMode(SelectionMode.SINGLE);
final ToggleGroup toggleGroup = new ToggleGroup();
controlEditors.setEditable(true);
controlEditors.widthProperty().addListener(new ChangeListener<Number>() {
@Override
public void changed(ObservableValue<? extends Number> ov, Number t, Number t1) {
Pane header = (Pane) controlEditors.lookup("TableHeaderRow");
if (header != null && header.isVisible()) {
header.setMaxHeight(0);
header.setMinHeight(0);
header.setPrefHeight(0);
header.setVisible(false);
header.setManaged(false);
}
}
});
controlDefault.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<Editor, Boolean>, ObservableValue<Boolean>>() {
@Override
public ObservableValue<Boolean> call(TableColumn.CellDataFeatures<Editor, Boolean> p) {
if (p.getValue() != null) {
return new SimpleBooleanProperty(p.getValue().isDefault());
} else {
return new SimpleBooleanProperty(false);
}
}
});
controlDefault.setCellFactory(new Callback<TableColumn<Editor, Boolean>, TableCell<Editor, Boolean>>() {
@Override
public TableCell<Editor, Boolean> call(TableColumn<Editor, Boolean> param) {
return new PreferenceEditorsController.EditorRectCell(toggleGroup);
}
});
controlButton.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<Editor, String>, ObservableValue<String>>() {
@Override
public ObservableValue<String> call(TableColumn.CellDataFeatures<Editor, String> p) {
if (p.getValue() != null) {
return p.getValue().nameProperty();
} else {
return new SimpleStringProperty();
}
}
});
controlButton.setCellFactory(new Callback<TableColumn<Editor, String>, TableCell<Editor, String>>() {
@Override
public TableCell<Editor, String> call(TableColumn<Editor, String> param) {
return new PreferenceEditorsController.ButtonCell();
}
});
controlEditorPath.setCellFactory(new Callback<TableColumn<Editor, String>, TableCell<Editor, String>>() {
@Override
public TableCell<Editor, String> call(TableColumn<Editor, String> param) {
return new PreferenceEditorsController.PathCell();
}
});
controlEditorPath.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<Editor, String>, ObservableValue<String>>() {
@Override
public ObservableValue<String> call(TableColumn.CellDataFeatures<Editor, String> p) {
return p.getValue().pathProperty();
}
});
controlName.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<Editor, String>, ObservableValue<String>>() {
@Override
public ObservableValue<String> call(TableColumn.CellDataFeatures<Editor, String> p) {
if (p.getValue() != null) {
return p.getValue().nameProperty();
} else {
return new SimpleStringProperty("<no name>");
}
}
});
}
@FXML
private void handleApplyButtonAction(ActionEvent event) {
modelFacade.saveEditors();
}
public class PathCell extends TableCell<Editor, String> {
public PathCell() {
}
@Override
protected void updateItem(String item, boolean empty) {
super.updateItem(item, empty);
Editor editor = (Editor) getTableRow().getItem();
if (editor != null) {
if (EditorLoader.isSupported(editor)) {
if (editor.getPath() == null || editor.getPath().isEmpty()) {
setText("");
} else if (!EditorLoader.isValid((Editor) getTableRow().getItem())) {
setText("<invalid path> " + item);
setTooltip(new Tooltip(item));
setTextFill(Color.RED);
setFont(Font.font("Arial", FontPosture.ITALIC, 11));
} else {
setText(item);
setTooltip(new Tooltip(item));
setTextFill(Color.BLACK);
setFont(Font.font("Arial", FontPosture.REGULAR, 11));
}
} else {
setText("<unsupported for your os>");
setTextFill(Color.LIGHTCORAL);
setFont(Font.font("Arial", FontPosture.ITALIC, 11));
}
}
}
}
public class ButtonCell extends TableCell<Editor, String> {
private Button box;
public ButtonCell() {
}
@Override
protected void updateItem(String item, boolean empty) {
super.updateItem(item, empty);
if (!isEmpty()) {
if (box == null) {
createCheckBox();
}
setGraphic(box);
}
}
private void createCheckBox() {
box = new Button("Browse");
box.getStyleClass().add(IConstants.CSS_INVISIBLE_BUTTON);
box.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
File file = UIUtils.chooseFolder(null, "Select source folder");
if (file != null) {
Editor editor = (Editor) getTableRow().getItem();
if (editor != null) {
modelFacade.updateEditorPath(editor, file.getAbsolutePath());
}
}
}
});
}
}
public class EditorRectCell extends TableCell<Editor, Boolean> {
private RadioButton box;
private ToggleGroup toggleGroup;
public EditorRectCell(ToggleGroup toggleGroup) {
this.toggleGroup = toggleGroup;
}
@Override
protected void updateItem(Boolean item, boolean empty) {
super.updateItem(item, empty);
if (!isEmpty()) {
if (box == null) {
createCheckBox();
}
if (item != null) {
box.setSelected(item);
}
setGraphic(box);
setTooltip(new Tooltip("Mark as Default"));
getTableRow().setDisable(!EditorLoader.isSupported(((Editor) getTableRow().getItem())));
}
}
private void createCheckBox() {
box = new RadioButton();
box.setToggleGroup(toggleGroup);
box.getStyleClass().add(IConstants.CSS_INVISIBLE_RADIO_BUTTON);
box.selectedProperty().addListener(new ChangeListener<Boolean>() {
@Override
public void changed(ObservableValue<? extends Boolean> arg0, Boolean arg1, Boolean arg2) {
((Editor) getTableRow().getItem()).setDefault(box.isSelected());
commitEdit(getItem());
}
});
}
}
public TableView<Editor> getControlEditors() {
return controlEditors;
}
public TableColumn<Editor, Boolean> getControlDefault() {
return controlDefault;
}
public TableColumn<Editor, String> getControlName() {
return controlName;
}
public TableColumn<Editor, String> getControlEditorPath() {
return controlEditorPath;
}
public TableColumn<Editor, String> getControlButton() {
return controlButton;
}
}