package com.kodcu.service.ui;
import com.kodcu.component.EditorPane;
import com.kodcu.component.LabelBuilt;
import com.kodcu.component.MenuItemBuilt;
import com.kodcu.component.MyTab;
import com.kodcu.controller.ApplicationController;
import com.kodcu.other.Current;
import com.kodcu.other.DocumentMode;
import com.kodcu.service.shortcut.ShortcutProvider;
import javafx.collections.ObservableList;
import javafx.geometry.Pos;
import javafx.scene.Node;
import javafx.scene.control.*;
import javafx.scene.layout.*;
import org.kordamp.ikonli.fontawesome.FontAwesome;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* Created by usta on 25.12.2014.
*/
@Component
public class EditorService {
private final Current current;
private final ApplicationController controller;
@Autowired
public EditorService(final Current current, final ApplicationController controller) {
this.current = current;
this.controller = controller;
}
@Autowired
private ShortcutProvider shortcutProvider;
public Node createEditorVBox(EditorPane editorPane, MyTab myTab) {
FlowPane flowPane = new FlowPane();
String iconSize = "14.0";
double minSize = 14.01;
final Label saveLabel = LabelBuilt.icon(FontAwesome.SAVE, minSize)
.clazz("top-label")
.tip("Save").click(controller::saveDoc).build();
final Label newLabel = LabelBuilt.icon(FontAwesome.FILE_TEXT_O, minSize)
.clazz("top-label").tip("New File").click(controller::newDoc).build();
final Label openLabel = LabelBuilt.icon(FontAwesome.FOLDER_OPEN_O, minSize)
.clazz("top-label").tip("Open File").click(controller::openDoc).build();
final Label boldLabel = LabelBuilt.icon(FontAwesome.BOLD, minSize)
.clazz("top-label").tip("Bold").click(event -> {
shortcutProvider.getProvider().addBold();
}).build();
final Label italicLabel = LabelBuilt.icon(FontAwesome.ITALIC, minSize)
.clazz("top-label").tip("Italic").click(event -> {
shortcutProvider.getProvider().addItalic();
}).build();
final Label headerLabel = LabelBuilt.icon(FontAwesome.HEADER, minSize)
.clazz("top-label").tip("Headings").click(event -> {
shortcutProvider.getProvider().addHeading();
}).build();
final Label codeLabel = LabelBuilt.icon(FontAwesome.CODE, minSize)
.clazz("top-label").tip("Code Snippet").click(event -> {
shortcutProvider.getProvider().addCode("");
}).build();
final Label ulListLabel = LabelBuilt.icon(FontAwesome.LIST_UL, minSize)
.clazz("top-label").tip("Bulleted List").click(event -> {
shortcutProvider.getProvider().addUnorderedList();
}).build();
final Label olListLabel = LabelBuilt.icon(FontAwesome.LIST_ALT, minSize)
.clazz("top-label").tip("Numbered List").click(event -> {
shortcutProvider.getProvider().addOrderedList();
}).build();
final Label tableLabel = LabelBuilt.icon(FontAwesome.TABLE, minSize)
.clazz("top-label").tip("Table").click(event -> {
shortcutProvider.getProvider().addTable();
;
}).build();
final Label imageLabel = LabelBuilt.icon(FontAwesome.IMAGE, minSize)
.clazz("top-label").tip("Image").click(event -> {
shortcutProvider.getProvider().addImage();
}).build();
final Label subscriptLabel = LabelBuilt.icon(FontAwesome.SUBSCRIPT, minSize)
.clazz("top-label").tip("Subscript").click(event -> {
shortcutProvider.getProvider().addSubscript();
}).build();
final Label superScriptLabel = LabelBuilt.icon(FontAwesome.SUPERSCRIPT, minSize)
.clazz("top-label").tip("Superscript").click(event -> {
shortcutProvider.getProvider().addSuperscript();
}).build();
final Label underlineLabel = LabelBuilt.icon(FontAwesome.UNDERLINE, minSize)
.clazz("top-label").tip("Underline").click(event -> {
shortcutProvider.getProvider().addUnderline();
}).build();
final Label hyperlinkLabel = LabelBuilt.icon(FontAwesome.LINK, minSize)
.clazz("top-label").tip("Hyperlink").click(event -> {
shortcutProvider.getProvider().addHyperlink();
}).build();
final Label strikethroughLabel = LabelBuilt.icon(FontAwesome.STRIKETHROUGH, minSize)
.clazz("top-label").tip("Strikethrough").click(event -> {
shortcutProvider.getProvider().addStrike();
}).build();
final Label quoteLabel = LabelBuilt.icon(FontAwesome.QUOTE_LEFT, minSize)
.clazz("top-label").tip("Blockquote").click(event -> {
shortcutProvider.getProvider().addQuote();
}).build();
final Label openMenuLabel = LabelBuilt.icon(FontAwesome.CHEVRON_CIRCLE_DOWN, minSize)
.clazz("top-label").tip("More...").build();
Pane placeholderPane = new Pane();
placeholderPane.maxWidth(Integer.MAX_VALUE);
placeholderPane.prefHeight(1);
placeholderPane.prefWidth(1);
HBox.setHgrow(placeholderPane, Priority.ALWAYS);
List<Node> moreMenuButtons = new LinkedList<>();
openMenuLabel.setOnMouseClicked(event -> {
if (moreMenuButtons.isEmpty()) {
moreMenuButtons.addAll(createMoreMenuButtons(iconSize, minSize));
}
openMenuLabel.setRotate(openMenuLabel.getRotate() + 180);
ObservableList<Node> children = flowPane.getChildren();
if (openMenuLabel.getRotate() % 360 == 0) {
children.removeAll(moreMenuButtons);
} else {
children.addAll(children.indexOf(openMenuLabel) - 1, moreMenuButtons);
}
});
ObservableList<DocumentMode> modeList = controller.getModeList();
MenuButton menuButton = new MenuButton("Doctype");
menuButton.setMinWidth(70);
Map<String, List<String>> modulus = modeList.stream()
.map(e -> e.getCaption())
.collect(Collectors.groupingBy(e -> e.substring(0, 1)));
for (Map.Entry<String, List<String>> listEntry : modulus.entrySet()) {
Menu e = new Menu(listEntry.getKey());
menuButton.getItems().add(e);
for (String val : listEntry.getValue()) {
MenuItem menuItem = new MenuItem(val);
e.getItems().add(menuItem);
menuItem.setOnAction(event -> {
menuButton.setText(menuItem.getText());
modeList.stream().filter(d -> d.getCaption().equals(menuItem.getText()))
.findFirst().ifPresent(documentMode -> {
editorPane.setMode(documentMode.getMode());
editorPane.switchMode(documentMode.getMode());
});
;
});
}
}
flowPane.getChildren().addAll(
newLabel,
openLabel,
saveLabel,
boldLabel,
italicLabel,
underlineLabel,
strikethroughLabel,
headerLabel,
hyperlinkLabel,
quoteLabel,
codeLabel,
ulListLabel,
olListLabel,
tableLabel,
imageLabel,
subscriptLabel,
superScriptLabel,
menuButton,
openMenuLabel,
placeholderPane);
flowPane.setHgap(7.5);
flowPane.setVgap(5);
flowPane.setAlignment(Pos.CENTER_LEFT);
flowPane.setOnMouseClicked(event -> {
editorPane.focus();
});
flowPane.setMinWidth(0); // fix
flowPane.getStyleClass().add("top-menu");
final ScrollPane scrollPane = new ScrollPane();
scrollPane.setContent(editorPane);
scrollPane.setFitToHeight(true);
scrollPane.setFitToWidth(true);
VBox.setVgrow(scrollPane, Priority.ALWAYS);
return new VBox(flowPane, scrollPane);
}
private List<Node> createMoreMenuButtons(final String iconSize, final double minSize) {
MenuButton admonitionButton = new MenuButton("Admonitions");
admonitionButton.setFocusTraversable(false);
admonitionButton.getItems().add(new MenuItem("NOTE"));
admonitionButton.getItems().add(new MenuItem("TIP"));
admonitionButton.getItems().add(new MenuItem("IMPORTANT"));
admonitionButton.getItems().add(new MenuItem("CAUTION"));
admonitionButton.getItems().add(new MenuItem("WARNING"));
admonitionButton.getItems().stream().forEach(item -> {
item.setOnAction(e -> {
shortcutProvider.getProvider().addAdmonition(item.getText());
});
});
MenuButton blocks = new MenuButton("Blocks");
blocks.setFocusTraversable(false);
blocks.getItems().add(MenuItemBuilt.item("Sidebar").click(event -> {
shortcutProvider.getProvider().addSidebarBlock();
}));
blocks.getItems().add(MenuItemBuilt.item("Example").click(event -> {
shortcutProvider.getProvider().addExampleBlock();
}));
blocks.getItems().add(MenuItemBuilt.item("Passthrough").click(event -> {
shortcutProvider.getProvider().addPassthroughBlock();
}));
blocks.getItems().add(MenuItemBuilt.item("Blockquote").click(event -> {
shortcutProvider.getProvider().addQuote();
}));
final MenuButton documentHelpers = new MenuButton("Document helpers");
documentHelpers.setFocusTraversable(false);
documentHelpers.getItems().add(MenuItemBuilt.item("Book header").click(event -> {
shortcutProvider.getProvider().addBookHeader();
}));
documentHelpers.getItems().add(MenuItemBuilt.item("Article header").click(event -> {
shortcutProvider.getProvider().addArticleHeader();
}));
documentHelpers.getItems().add(MenuItemBuilt.item("Colophon").click(event -> {
shortcutProvider.getProvider().addColophon();
}));
documentHelpers.getItems().add(MenuItemBuilt.item("Preface").click(event -> {
shortcutProvider.getProvider().addPreface();
}));
documentHelpers.getItems().add(MenuItemBuilt.item("Dedication").click(event -> {
shortcutProvider.getProvider().addDedication();
}));
documentHelpers.getItems().add(MenuItemBuilt.item("Appendix").click(event -> {
shortcutProvider.getProvider().addAppendix();
}));
documentHelpers.getItems().add(MenuItemBuilt.item("Glossary").click(event -> {
shortcutProvider.getProvider().addGlossary();
}));
documentHelpers.getItems().add(MenuItemBuilt.item("Bibliography").click(event -> {
shortcutProvider.getProvider().addBibliography();
}));
documentHelpers.getItems().add(MenuItemBuilt.item("Colophon").click(event -> {
shortcutProvider.getProvider().addColophon();
}));
documentHelpers.getItems().add(MenuItemBuilt.item("Index").click(event -> {
shortcutProvider.getProvider().addIndex();
}));
final MenuButton extensions = new MenuButton("Extensions");
extensions.setFocusTraversable(false);
extensions.getItems().add(MenuItemBuilt.item("Mathjax").click(event -> {
shortcutProvider.getProvider().addMathBlock();
}));
extensions.getItems().add(MenuItemBuilt.item("PlantUML").click(event -> {
shortcutProvider.getProvider().addUmlBlock();
}));
extensions.getItems().add(MenuItemBuilt.item("Ditaa").click(event -> {
shortcutProvider.getProvider().addDitaaBlock();
}));
extensions.getItems().add(MenuItemBuilt.item("Filesystem Tree").click(event -> {
shortcutProvider.getProvider().addTreeBlock();
}));
final MenuButton chartMenu = new MenuButton("Charts");
chartMenu.setFocusTraversable(false);
chartMenu.getItems().add(MenuItemBuilt.item("Pie").click(event -> {
shortcutProvider.getProvider().addPieChart();
}));
chartMenu.getItems().add(MenuItemBuilt.item("Bar").click(event -> {
shortcutProvider.getProvider().addBarChart();
}));
chartMenu.getItems().add(MenuItemBuilt.item("Line").click(event -> {
shortcutProvider.getProvider().addLineChart();
}));
chartMenu.getItems().add(MenuItemBuilt.item("Area").click(event -> {
shortcutProvider.getProvider().addAreaChart();
}));
chartMenu.getItems().add(MenuItemBuilt.item("Scatter").click(event -> {
shortcutProvider.getProvider().addScatterChart();
}));
chartMenu.getItems().add(MenuItemBuilt.item("Bubble").click(event -> {
shortcutProvider.getProvider().addBubbleChart();
}));
chartMenu.getItems().add(MenuItemBuilt.item("Stacked Area").click(event -> {
shortcutProvider.getProvider().addStackedAreaChart();
}));
chartMenu.getItems().add(MenuItemBuilt.item("Stacked Bar").click(event -> {
shortcutProvider.getProvider().addStackedBarChart();
}));
return Arrays.asList(blocks, admonitionButton, documentHelpers, extensions, chartMenu);
}
}