

import java.io.*;
import java.util.ArrayList;
    import javafx.scene.Scene;
import javafx.event.*;
import java.util.StringJoiner;
import javafx.stage.FileChooser;
import javafx.scene.control.*;
import java.util.stream.Stream;
    import javafx.scene.layout.BorderPane;
import javafx.scene.input.KeyCodeCombination;
import javafx.scene.input.KeyCode;

public class FlatDocumentContainer {
public static final String Utf8Bom = "\uFEFF";
private BrboxGui application;
private Scene scene;
private File fileName;
public File getFileName() {
return this.fileName;
}

private int[] getIndexes(String s, String sub) {
if (!(s.contains(sub))) {
return new int[0];
}
int ind = 0;
ArrayList<Integer> ints = new ArrayList<Integer>();
while (ind < s.length()) {
var gind = s.indexOf(sub,ind);
if (gind == -1) break;
ints.add(gind);
ind = gind + 1;
}
var res = ints.toArray(new Integer[ints.size()]);
var rres = new int[res.length];
for (int i = 0; i < res.length; i++) {
rres[i] = res[i];
}
return rres;
}

private MenuItem constructSimpleMenuItem(String text, EventHandler<ActionEvent> handler) {
MenuItem item = new MenuItem(text);
item.setOnAction(handler);
return item;
}

private void constructEditorContextMenu(TextArea te) {
ContextMenu cm = new ContextMenu();
var items = cm.getItems();
items.add(constructSimpleMenuItem("Cut",(event) -> te.cut()));
items.add(constructSimpleMenuItem("Copy", (event) -> te.copy()));
items.add(constructSimpleMenuItem("Paste", (event) -> te.paste()));
items.add(constructSimpleMenuItem("select all", (event) -> te.selectAll()));
items.add(constructSimpleMenuItem("delete", (event) -> te.deleteNextChar()));
te.setContextMenu(cm);
}
FlatDocumentContainer(BrboxGui app) {
this.application = app;
TextArea te = new TextArea();
this.editor = te;
te.setWrapText(true);
constructEditorContextMenu(te);
BorderPane root = new BorderPane();
root.setCenter(te);
MenuItem quitMenuItem = new MenuItem("Quit");
quitMenuItem.setOnAction((event) -> this.application.stage.close());
quitMenuItem.setAccelerator(new KeyCodeCombination(KeyCode.Q, KeyCodeCombination.SHORTCUT_DOWN));
MenuItem openMenuItem = new MenuItem("open");
openMenuItem.setAccelerator(new KeyCodeCombination(KeyCode.O, KeyCodeCombination.SHORTCUT_DOWN));
openMenuItem.setOnAction((event) -> {
FileChooser chooser = new FileChooser();
try {
File rs = chooser.showOpenDialog(this.application.stage);
if (rs != null) this.openFile(rs);
} catch (Exception ex) {
new Alert(Alert.AlertType.ERROR, ex.getMessage()).showAndWait();
}
});
Menu fileMenu = new Menu("file");
fileMenu.getItems().add(openMenuItem);
fileMenu.getItems().add(quitMenuItem);
Menu editMenu = new Menu("edit");
editMenu.getItems().addAll(te.getContextMenu().getItems());
MenuBar menuBar = new MenuBar(fileMenu, editMenu);
menuBar.setUseSystemMenuBar(true);
root.setTop(menuBar);
this.scene = new Scene(root);
}
public Scene getScene() {
return this.scene;
}
private TextArea editor;
public void openFile(File f) throws IOException,FileNotFoundException {
FileReader fr = null;
try {
fr = new FileReader(f, java.nio.charset.Charset.forName("utf-8"));
BufferedReader br = new BufferedReader(fr);
StringJoiner joiner = new StringJoiner("\n");
br.lines().forEach(new java.util.function.Consumer<String>() {
private boolean first = true;
public void accept(String line) {
if (first && line.startsWith(Utf8Bom)) {
joiner.add(line.substring(1));
} else {
joiner.add(line);
}
if (first) {
first = false;
}
}
});
String res = joiner.toString();
this.fileName = f;
this.editor.setText(res);
this.updateTitle();
} finally {
if (fr != null) fr.close();
}
}
public void updateTitle() {
String title = "";
if (this.fileName != null) {
title = title.concat(this.fileName.getName());
} else {
title = title.concat("unnamed");
}
title = title.concat(" - brbox p");
this.application.stage.setTitle(title);
}
}