/**
* erlyberly, erlang trace debugger
* Copyright (C) 2016 Andy Till
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package erlyberly;
import de.jensd.fx.fontawesome.AwesomeIcon;
import javafx.beans.property.SimpleBooleanProperty;
import javafx.beans.property.SimpleStringProperty;
import javafx.scene.control.Label;
import javafx.scene.control.Tooltip;
import javafx.scene.layout.HBox;
import ui.CellController;
import ui.FAIcon;
class ModFuncGraphic extends HBox implements CellController<ModFunc> {
public interface TraceFn {
void trace(ModFunc modFunc);
}
public interface IsTracedFn {
boolean isTraced(ModFunc mf);
}
private static final String ICON_STYLE = "-fx-font-family: FontAwesome; -fx-font-size: 1em;";
private final SimpleStringProperty text = new SimpleStringProperty();
private final SimpleStringProperty exportIconText = new SimpleStringProperty();
private final SimpleStringProperty exportToolTipText = new SimpleStringProperty();
private final SimpleStringProperty tracedIconText = new SimpleStringProperty(AwesomeIcon.STAR_ALT.toString());
private final SimpleBooleanProperty tracable = new SimpleBooleanProperty();
private final TraceFn traceFn;
private final IsTracedFn isTracedFn;
private boolean showModuleName;
private ModFunc modFunc;
public ModFuncGraphic(TraceFn aTraceFn, IsTracedFn isTracedFn) {
traceFn = aTraceFn;
this.isTracedFn = isTracedFn;
getStyleClass().add("mod-func-graphic");
getChildren().addAll(
exportIconGraphic(),
traceIcon(),
functionLabel()
);
}
private FAIcon exportIconGraphic() {
Tooltip tooltip;
tooltip = new Tooltip();
tooltip.textProperty().bind(exportToolTipText);
FAIcon treeIcon;
treeIcon = treeIcon(AwesomeIcon.SQUARE);
treeIcon.textProperty().bind(exportIconText);
treeIcon.setTooltip(tooltip);
return treeIcon;
}
private FAIcon traceIcon() {
FAIcon traceIcon;
traceIcon = FAIcon.create().style(ICON_STYLE);
traceIcon.textProperty().bind(tracedIconText);
traceIcon.visibleProperty().bind(tracable);
traceIcon.setTooltip(new Tooltip("Toggle tracing, double click on this star or ctrl+t when selected"));
traceIcon.getStyleClass().add("erlyberly-icon-button");
traceIcon.setOnMouseClicked((e) -> {
if(e.getClickCount() == 2)
traceFn.trace(modFunc);
});
return traceIcon;
}
private Label functionLabel() {
Label label;
label = new Label();
label.textProperty().bind(text);
return label;
}
private FAIcon treeIcon(AwesomeIcon treeIcon) {
return FAIcon.create().icon(treeIcon).style(ICON_STYLE);
}
@Override
public void updateItem(ModFunc item, boolean empty) {
if (item == null || empty) {
text.set(null);
}
else {
if(isShowModuleName())
text.set(item.toFullString());
else
text.set(item.toString());
updateExportIcon(item);
// no tracing of the whole module for now!
tracable.set(!item.isModule());
}
modFunc = item;
onTracesChange();
}
private void updateExportIcon(ModFunc item) {
AwesomeIcon icon;
String tooltipText;
if(item.isModule()) {
tooltipText = "Module";
icon = AwesomeIcon.CUBE;
}
else if(item.isExported()) {
tooltipText = "Exported function";
icon = AwesomeIcon.UNLOCK_ALT;
}
else {
tooltipText = "Unexported function";
icon = AwesomeIcon.LOCK;
}
exportToolTipText.set(tooltipText);
exportIconText.set(icon.toString());
}
public void onTracesChange() {
if(modFunc != null && isTracedFn.isTraced(modFunc))
tracedIconText.set(AwesomeIcon.CHECK_SQUARE_ALT.toString());
else
tracedIconText.set(AwesomeIcon.SQUARE_ALT.toString());
}
public boolean isShowModuleName() {
return showModuleName;
}
public void setShowModuleName(boolean showModuleName) {
this.showModuleName = showModuleName;
}
}