Update documentation for controllers

This commit is contained in:
Oystein Kristoffer Tveit 2021-04-26 14:35:47 +02:00
parent 0c16ae3f15
commit ad9ee1c84e
6 changed files with 180 additions and 88 deletions

View File

@ -20,6 +20,9 @@ import javafx.application.Platform;
import javafx.fxml.FXML; import javafx.fxml.FXML;
import javafx.fxml.Initializable; import javafx.fxml.Initializable;
/**
* An FXML controller that controls the application and all subcontrollers
*/
public class MainController implements Initializable { public class MainController implements Initializable {
@FXML @FXML
@ -94,13 +97,17 @@ public class MainController implements Initializable {
Model.getScene().getStylesheets().set(position, nextStyleSheet); Model.getScene().getStylesheets().set(position, nextStyleSheet);
} }
/* ------------------------------------------------------------------------ */
/* EVENT BUS LISTENERS */
/* ------------------------------------------------------------------------ */
/** /**
* Change the CSS according to which language is being used * Change the CSS according to which language is being used
* *
* @param event * @param event
*/ */
@Subscribe @Subscribe
private void handle(LanguageChangedEvent event) { public void handle(LanguageChangedEvent event) {
this.setCSSAt(1, "/styling/languages/" + event.getLanguage().toLowerCase() + ".css"); this.setCSSAt(1, "/styling/languages/" + event.getLanguage().toLowerCase() + ".css");
} }
@ -110,7 +117,7 @@ public class MainController implements Initializable {
* @param event * @param event
*/ */
@Subscribe @Subscribe
private void handle(ThemeChangedEvent event) { public void handle(ThemeChangedEvent event) {
this.setCSSAt(0, "/styling/themes/" + event.getTheme().toLowerCase().replace(" ", "-") + ".css"); this.setCSSAt(0, "/styling/themes/" + event.getTheme().toLowerCase().replace(" ", "-") + ".css");
} }
@ -120,7 +127,7 @@ public class MainController implements Initializable {
* @param event * @param event
*/ */
@Subscribe @Subscribe
private void handle(OpenLinkInBrowserEvent event) { public void handle(OpenLinkInBrowserEvent event) {
this.getHostServices().showDocument(event.getLink()); this.getHostServices().showDocument(event.getLink());
} }
@ -132,7 +139,7 @@ public class MainController implements Initializable {
* @param event * @param event
*/ */
@Subscribe @Subscribe
private void handle(ExitApplicationEvent event) { public void handle(ExitApplicationEvent event) {
if (!Model.getFileIsSaved()) { if (!Model.getFileIsSaved()) {
int g = JOptionPane.showConfirmDialog(null, "Your files are not saved.\nSave before exit?", "Exit", int g = JOptionPane.showConfirmDialog(null, "Your files are not saved.\nSave before exit?", "Exit",
JOptionPane.YES_NO_OPTION); JOptionPane.YES_NO_OPTION);

View File

@ -3,12 +3,12 @@ package app.controllers;
import com.google.common.eventbus.EventBus; import com.google.common.eventbus.EventBus;
/** /**
* Interface describing a controller that contains an EventBus * Interface describing a JavaFX controller that contains an EventBus
*/ */
public interface Controller { public interface Controller {
/** /**
* Registers the main EventBus into the controller. * Registers the main EventBus into the controller.
* @param eventBus The EventBus * @param eventBus
*/ */
public void setEventBus(EventBus eventBus); public void setEventBus(EventBus eventBus);
} }

View File

@ -34,7 +34,7 @@ import javafx.fxml.Initializable;
import javafx.stage.Stage; import javafx.stage.Stage;
/** /**
* A FXML controller that controls the editor component of the UI * An FXML controller that controls the CodeArea
*/ */
public class EditorController implements Initializable, Controller { public class EditorController implements Initializable, Controller {
@ -60,15 +60,10 @@ public class EditorController implements Initializable, Controller {
this.eventBus.register(this); this.eventBus.register(this);
} }
// TODO: document
public CodeArea getEditor() {
return editor;
}
/** /**
* Applies highlighting to the editor. * Applies highlighting to the editor.
* *
* @param highlighting highlighting data * @param highlighting Syntax highlighting data
*/ */
private void setHighlighting(StyleSpans<Collection<String>> highlighting) { private void setHighlighting(StyleSpans<Collection<String>> highlighting) {
this.editor.setStyleSpans(0, highlighting); this.editor.setStyleSpans(0, highlighting);
@ -90,7 +85,6 @@ public class EditorController implements Initializable, Controller {
* ProgrammingLanguage.commentLine(line) * ProgrammingLanguage.commentLine(line)
*/ */
private void toggleComment() { private void toggleComment() {
// TODO: This logic might need to be moved to LanguageOperations
if (editor.getSelectedText().equals("")) { if (editor.getSelectedText().equals("")) {
String currentLine = editor.getText(editor.getCurrentParagraph()); String currentLine = editor.getText(editor.getCurrentParagraph());
@ -118,7 +112,7 @@ public class EditorController implements Initializable, Controller {
/** /**
* Updates the wraptext setting of the code area * Updates the wraptext setting of the code area
* *
* @param isWrapText The new value for the setting * @param isWrapText The updated setting value
*/ */
private void setWrapText(boolean isWrapText) { private void setWrapText(boolean isWrapText) {
this.editor.setWrapText(isWrapText); this.editor.setWrapText(isWrapText);
@ -143,14 +137,16 @@ public class EditorController implements Initializable, Controller {
* *
* @param newContent The String to be inserted into the editor * @param newContent The String to be inserted into the editor
*/ */
public void setEditorContent(String newContent) { private void setEditorContent(String newContent) {
editor.clear(); editor.clear();
editor.appendText(newContent); editor.appendText(newContent);
} }
/** /**
* Saving/Writing to the file based on the spesific filepath. Otherwise it will * Saving/Writing to the file based on the active filepath in {@link app.model.Model Model}
* open an error dialog to give the user feedback about what has happened. * if it is a new File. Otherwise it will open a dialog to ask the user where to save the file.
*
* @param isNewFile Whether or not the file already has a path
*/ */
public void saveCodeArea(boolean isNewFile) { public void saveCodeArea(boolean isNewFile) {
Stage stage = (Stage) editor.getScene().getWindow(); Stage stage = (Stage) editor.getScene().getWindow();
@ -166,17 +162,14 @@ public class EditorController implements Initializable, Controller {
} }
} }
/**
* Checking if all is saved before closing the app. The user can either choose
* to exit or go back to the application and save.
*/
/* ------------------------------------------------------------------------ */ /* ------------------------------------------------------------------------ */
/* SUBSCRIPTIONS */ /* EVENT BUS LISTENERS */
/* ------------------------------------------------------------------------ */ /* ------------------------------------------------------------------------ */
/** /**
* Updates Code Area (read from file) whenever the FileSelected is changed * Updates the CodeArea whenever a new file is opened.
*
* @param event
*/ */
@Subscribe @Subscribe
public void handle(OpenFileEvent event) { public void handle(OpenFileEvent event) {
@ -189,54 +182,96 @@ public class EditorController implements Initializable, Controller {
} }
/** /**
* Save file (write to file) whenever the save in the menubare is selected * Saves the editor content to a file
*
* @param event
*/ */
@Subscribe @Subscribe
private void handle(SaveFileEvent event) { public void handle(SaveFileEvent event) {
this.saveCodeArea(event.getIsNewFile()); this.saveCodeArea(event.getIsNewFile());
} }
/**
* Refreshes the syntax highlighting when the Programming language is changed
*
* @param event
*/
@Subscribe @Subscribe
private void handle(LanguageChangedEvent event) { public void handle(LanguageChangedEvent event) {
this.refreshHighlighting(); this.refreshHighlighting();
} }
/**
* Toggles a comment based on the editor state
*
* @param event
*/
@Subscribe @Subscribe
public void handle(ToggleCommentEvent event) { public void handle(ToggleCommentEvent event) {
this.toggleComment(); this.toggleComment();
} }
/**
* Toggles the WrapText setting
*
* @param event
*/
@Subscribe @Subscribe
private void handle(ToggleWrapTextEvent event) { public void handle(ToggleWrapTextEvent event) {
this.setWrapText(event.getIsWrapped()); this.setWrapText(event.getIsWrapped());
} }
/**
* Undo if focused
*
* @param event
*/
@Subscribe @Subscribe
private void handle(UndoEvent event) { public void handle(UndoEvent event) {
if (this.editor.isFocused()) if (this.editor.isFocused())
this.editor.undo(); this.editor.undo();
} }
/**
* Redo if focused
*
* @param event
*/
@Subscribe @Subscribe
private void handle(RedoEvent event) { public void handle(RedoEvent event) {
if (this.editor.isFocused()) if (this.editor.isFocused())
this.editor.redo(); this.editor.redo();
} }
/**
* Copy selected content if focused
*
* @param event
*/
@Subscribe @Subscribe
private void handle(CopyEvent event) { public void handle(CopyEvent event) {
if (this.editor.isFocused()) if (this.editor.isFocused())
this.editor.copy(); this.editor.copy();
} }
/**
* Cut selected content if focused
*
* @param event
*/
@Subscribe @Subscribe
private void handle(CutEvent event) { public void handle(CutEvent event) {
if (this.editor.isFocused()) if (this.editor.isFocused())
this.editor.cut(); this.editor.cut();
} }
/**
* Paste from clipboard if focused
*
* @param event
*/
@Subscribe @Subscribe
private void handle(PasteEvent event) { public void handle(PasteEvent event) {
if (this.editor.isFocused()) if (this.editor.isFocused())
this.editor.paste(); this.editor.paste();
} }

View File

@ -26,7 +26,7 @@ import app.service.FiletreeOperations;
import javafx.fxml.Initializable; import javafx.fxml.Initializable;
/** /**
* A FXML controller that controls the filetree component of the UI * An FXML controller that controls the Filetree
*/ */
public class FiletreeController implements Initializable, Controller { public class FiletreeController implements Initializable, Controller {
@ -44,19 +44,16 @@ public class FiletreeController implements Initializable, Controller {
this.eventBus.register(this); this.eventBus.register(this);
} }
/* ------------------------------------------------------------------------ */
/* FILETREE */
/* ------------------------------------------------------------------------ */
/** /**
* The displaying of the fileTree. The inputChosen(the path) is aquired from the * Generate a tree structure of a directory, and set the filetree to
* eventBus (OpeFileProjectEvent). The root is created as a CheckBoxItems and * show the new tree
* sends it to generateTree, and after that setting it to the root. *
* @param rootDir Path to the directory to be the root of the tree
*/ */
private void showTree(String inputChosen) { private void showTree(Path rootDir) {
CheckBoxTreeItem<String> root = new CheckBoxTreeItem<>(inputChosen); CheckBoxTreeItem<String> root = new CheckBoxTreeItem<>(rootDir.getFileName().toString());
filetree.setShowRoot(false); filetree.setShowRoot(false);
File fileInputChosen = new File(inputChosen); File fileInputChosen = rootDir.toFile();
try { try {
FiletreeOperations.generateTree(fileInputChosen, root); FiletreeOperations.generateTree(fileInputChosen, root);
@ -67,18 +64,13 @@ public class FiletreeController implements Initializable, Controller {
DialogBoxes.showErrorMessage( DialogBoxes.showErrorMessage(
"Could not open folder.\n\n" "Could not open folder.\n\n"
+ "Do you have the right permissions for this folder?\n" + "Do you have the right permissions for this folder?\n"
+ "Or does the folder contain any shortcut to somewhere within itself?"); + "Or does the folder contain any shortcut to somewhere within itself?"
);
} }
} }
/* ------------------------------------------------------------------------ */
/* MouseClick */
/* ------------------------------------------------------------------------ */
/** /**
* Handles whenever a filetree item is clicked twice. A while loop to create the * Handles opening a file whenever a filetree item is clicked twice. */
* correct filepath.
*/
@FXML @FXML
private void handleMouseClick(MouseEvent event) { private void handleMouseClick(MouseEvent event) {
if (event.getClickCount() == 2) { if (event.getClickCount() == 2) {
@ -98,27 +90,33 @@ public class FiletreeController implements Initializable, Controller {
} }
/* ------------------------------------------------------------------------ */ /* ------------------------------------------------------------------------ */
/* SUBSCRIPTIONS */ /* EVENT BUS LISTENERS */
/* ------------------------------------------------------------------------ */ /* ------------------------------------------------------------------------ */
/** /**
* Updates the filetree whenever a new ProjectPath is selected. * Updates the filetree whenever a new project is opened
*
* @param event
*/ */
@Subscribe @Subscribe
private void handle(OpenProjectEvent event) { private void handle(OpenProjectEvent event) {
event.getPath().ifPresentOrElse( event.getPath().ifPresentOrElse(
path -> this.showTree(path.toString()), path -> this.showTree(path),
() -> System.err.println("[ERROR] OpenProjectEvent was empty") () -> System.err.println("[ERROR] OpenProjectEvent was empty")
); );
} }
/**
* Updates the filetree whenever a new file gets saved
*
* @param event
*/
@Subscribe @Subscribe
private void handle(SaveFileEvent event) { private void handle(SaveFileEvent event) {
if (event.getIsNewFile()) if (event.getIsNewFile())
Model Model
.getProjectPath() .getProjectPath()
.ifPresent(path -> this.showTree(path.toString())); .ifPresent(path -> this.showTree(path));
} }
} }

View File

@ -60,23 +60,25 @@ public class MenubarController implements Initializable, Controller {
this.eventBus.register(this); this.eventBus.register(this);
} }
/* ------------------------------------------------------------------------ */ /* ---------------------------------- File ---------------------------------- */
/* CREATE FILE */
/* ------------------------------------------------------------------------ */ /**
* Handles whenever the New File button is pressed in the menubar
*
* @param event
*/
@FXML @FXML
private void handleNewFile() { private void handleNewFile() {
this.eventBus.post(new OpenFileEvent(Optional.empty())); this.eventBus.post(new OpenFileEvent(Optional.empty()));
} }
/* ------------------------------------------------------------------------ */
/* OPEN FILE/PROJECT */
/* ------------------------------------------------------------------------ */
/** /**
* Handles whenever the Open File button is pressed in the menubar * Handles whenever the Open File button is pressed in the menubar
*
* @param event
*/ */
@FXML @FXML
public void handleOpenFile() { private void handleOpenFile() {
Stage stage = (Stage) menubar.getScene().getWindow(); Stage stage = (Stage) menubar.getScene().getWindow();
try { try {
@ -90,6 +92,8 @@ public class MenubarController implements Initializable, Controller {
/** /**
* Handles whenever the Open Project button is pressed in the menubar * Handles whenever the Open Project button is pressed in the menubar
*
* @param event
*/ */
@FXML @FXML
private void handleOpenProject() { private void handleOpenProject() {
@ -102,12 +106,11 @@ public class MenubarController implements Initializable, Controller {
} catch (FileNotFoundException e) {} } catch (FileNotFoundException e) {}
} }
/* ------------------------------------------------------------------------ */
/* SAVE FILE */
/* ------------------------------------------------------------------------ */
/** /**
* Handles whenever the Save button is pressed in the menubar * Handles whenever the Save button is pressed in the menubar
*
* @param event
*/ */
@FXML @FXML
private void handleSaveFile() { private void handleSaveFile() {
@ -116,6 +119,8 @@ public class MenubarController implements Initializable, Controller {
/** /**
* Handles whenever the Save as button is pressed in the menubar * Handles whenever the Save as button is pressed in the menubar
*
* @param event
*/ */
@FXML @FXML
private void handleSaveAsFile() { private void handleSaveAsFile() {
@ -124,6 +129,8 @@ public class MenubarController implements Initializable, Controller {
/** /**
* Handles whenever the programming language is changed from the menubar. * Handles whenever the programming language is changed from the menubar.
*
* @param event
*/ */
@FXML @FXML
private void handleLanguageChange(ActionEvent event) { private void handleLanguageChange(ActionEvent event) {
@ -132,6 +139,8 @@ public class MenubarController implements Initializable, Controller {
/** /**
* Handles whenever the wraptext togglebutton is pressed in the menubar * Handles whenever the wraptext togglebutton is pressed in the menubar
*
* @param event
*/ */
@FXML @FXML
private void handleToggleWraptext(ActionEvent event) { private void handleToggleWraptext(ActionEvent event) {
@ -141,6 +150,8 @@ public class MenubarController implements Initializable, Controller {
/** /**
* Handles whenever the theme is changed from the menubar * Handles whenever the theme is changed from the menubar
*
* @param event
*/ */
@FXML @FXML
private void handleThemeChange(ActionEvent event) { private void handleThemeChange(ActionEvent event) {
@ -149,18 +160,20 @@ public class MenubarController implements Initializable, Controller {
/** /**
* Handles whenever the exit button is pressed in the menubar * Handles whenever the exit button is pressed in the menubar
*
* @param event
*/ */
@FXML @FXML
private void handleExitApplication(ActionEvent event) { private void handleExitApplication(ActionEvent event) {
this.eventBus.post(new ExitApplicationEvent()); this.eventBus.post(new ExitApplicationEvent());
} }
/* ------------------------------------------------------------------------ */ /* ---------------------------------- Edit ---------------------------------- */
/* EDIT */
/* ------------------------------------------------------------------------ */
/** /**
* Handles whenever the undo button is pressed in the menubar * Handles whenever the undo button is pressed in the menubar
*
* @param event
*/ */
@FXML @FXML
private void handleUndo(ActionEvent event) { private void handleUndo(ActionEvent event) {
@ -169,6 +182,8 @@ public class MenubarController implements Initializable, Controller {
/** /**
* Handles whenever the redo button is pressed in the menubar * Handles whenever the redo button is pressed in the menubar
*
* @param event
*/ */
@FXML @FXML
private void handleRedo(ActionEvent event) { private void handleRedo(ActionEvent event) {
@ -177,6 +192,8 @@ public class MenubarController implements Initializable, Controller {
/** /**
* Handles whenever the copy button is pressed in the menubar * Handles whenever the copy button is pressed in the menubar
*
* @param event
*/ */
@FXML @FXML
private void handleCopy(ActionEvent event) { private void handleCopy(ActionEvent event) {
@ -185,6 +202,8 @@ public class MenubarController implements Initializable, Controller {
/** /**
* Handles whenever the cut button is pressed in the menubar * Handles whenever the cut button is pressed in the menubar
*
* @param event
*/ */
@FXML @FXML
private void handleCut(ActionEvent event) { private void handleCut(ActionEvent event) {
@ -193,6 +212,8 @@ public class MenubarController implements Initializable, Controller {
/** /**
* Handles whenever the paste button is pressed in the menubar * Handles whenever the paste button is pressed in the menubar
*
* @param event
*/ */
@FXML @FXML
private void handlePaste(ActionEvent event) { private void handlePaste(ActionEvent event) {
@ -201,18 +222,20 @@ public class MenubarController implements Initializable, Controller {
/** /**
* Handles whenever the Toggle Comment button is pressed in the menubar * Handles whenever the Toggle Comment button is pressed in the menubar
*
* @param event
*/ */
@FXML @FXML
private void handleToggleComment(ActionEvent event) { private void handleToggleComment(ActionEvent event) {
this.eventBus.post(new ToggleCommentEvent()); this.eventBus.post(new ToggleCommentEvent());
} }
/* ------------------------------------------------------------------------ */ /* ---------------------------------- About --------------------------------- */
/* ABOUT */
/* ------------------------------------------------------------------------ */
/** /**
* Handles whenever the About button is pressed in the menubar * Handles whenever the About button is pressed in the menubar
*
* @param event
*/ */
@FXML @FXML
private void handleAbout(ActionEvent event) { private void handleAbout(ActionEvent event) {
@ -226,22 +249,37 @@ public class MenubarController implements Initializable, Controller {
/** /**
* Updates menubuttons whenever the language is changed * Updates menubuttons whenever the language is changed
*
* @param event
*/ */
@Subscribe @Subscribe
private void handle(LanguageChangedEvent event) { public void handle(LanguageChangedEvent event) {
this.languageToggleGroup.getToggles().stream().map(RadioMenuItem.class::cast) this.languageToggleGroup
.filter(t -> t.getId().equals("toggle" + event.getLanguage())).findFirst().orElseThrow().setSelected(true); .getToggles()
.stream()
.map(RadioMenuItem.class::cast)
.filter(t -> t.getId().equals("toggle" + event.getLanguage()))
.findFirst()
// This should never happen!
.orElseThrow(() -> new IllegalStateException("Language button missing: " + event.getLanguage()))
.setSelected(true);
} }
/** /**
* Updates menubuttons whenever the theme is changed * Updates menubuttons whenever the theme is changed
*
* @param event
*/ */
@Subscribe @Subscribe
private void handle(ThemeChangedEvent event) { public void handle(ThemeChangedEvent event) {
this.themeToggleGroup.getToggles().stream().map(RadioMenuItem.class::cast) this.themeToggleGroup
.filter(t -> t.getId().equals("toggle" + event.getTheme().replace(" ", "_"))).findFirst().orElseThrow().setSelected(true); .getToggles()
.stream()
.map(RadioMenuItem.class::cast)
.filter(t -> t.getId().equals("toggle" + event.getTheme().replace(" ", "_")))
.findFirst()
// This should never happen!
.orElseThrow(() -> new IllegalStateException("Theme button missing: " + event.getTheme()))
.setSelected(true);
} }
} }

View File

@ -53,34 +53,48 @@ public class ModelineController implements Initializable, Controller {
this.columnrow.setText(String.format("[%d:%d]", row, column)); this.columnrow.setText(String.format("[%d:%d]", row, column));
} }
/* ------------------------------------------------------------------------ */
/* SUBSCRIPTIONS */
/* ------------------------------------------------------------------------ */
/** /**
* Updates the column-row number display whenever the editor cursor * Updates the column-row number display whenever the editor cursor
* changes position. * changes position.
*
* @param event
*/ */
@Subscribe @Subscribe
private void handle(EditorChangedEvent event) { public void handle(EditorChangedEvent event) {
this.setColumnRow(event.getColumn(), event.getLine()); this.setColumnRow(event.getColumn(), event.getLine());
} }
/** /**
* Updates the saveState label whenever the file either is saved or modified * Updates the saveState label whenever the file either is saved or modified
*
* @param event
*/ */
@Subscribe @Subscribe
private void handle(FileSaveStateChangedEvent event) { public void handle(FileSaveStateChangedEvent event) {
// TODO: Add CSS styleclass for coloring the saveState label // TODO: Add CSS styleclass for coloring the saveState label
// whenever it changes // whenever it changes
this.saveState.setText(event.getIsSaved() ? "Saved!" : "Modified"); this.saveState.setText(event.getIsSaved() ? "Saved!" : "Modified");
} }
/** /**
* Updates the modeline to display a new language * Updates the modeline to display a new language when changed.
* whenever it is changed. *
* @param event
*/ */
@Subscribe @Subscribe
private void handle(LanguageChangedEvent event) { private void handle(LanguageChangedEvent event) {
this.language.setText(event.getLanguage()); this.language.setText(event.getLanguage());
} }
/**
* Updates the modeline to display the name of the current file when changed
*
* @param event
*/
@Subscribe @Subscribe
private void handle(OpenFileEvent event) { private void handle(OpenFileEvent event) {
this.filename.setText( this.filename.setText(