diff --git a/src/main/java/app/Main.java b/src/main/java/app/Main.java index 2ea0f76..f2ee58e 100644 --- a/src/main/java/app/Main.java +++ b/src/main/java/app/Main.java @@ -2,8 +2,6 @@ package app; import java.io.IOException; -import com.google.common.eventbus.EventBus; - import javafx.application.Application; import javafx.fxml.FXMLLoader; import javafx.scene.Parent; @@ -13,8 +11,6 @@ import javafx.stage.Stage; public class Main extends Application { - EventBus eventBus; - /** * Boilerplate function to launch the application */ @@ -38,7 +34,11 @@ public class Main extends Application { try { document = fxmlLoader.load(); } catch (IOException e) { - throw new RuntimeException(e); + System.err.println(e); + throw new RuntimeException( + "Couldn\'t find or missing permissions to load " + + getClass().getResource("/fxml/Main.fxml") + ); } Scene scene = new Scene(document); @@ -46,7 +46,4 @@ public class Main extends Application { window.show(); } - public EventBus getEventBus() { - return this.eventBus; - } } diff --git a/src/main/java/app/MainController.java b/src/main/java/app/MainController.java index 78cef22..5aeb26d 100644 --- a/src/main/java/app/MainController.java +++ b/src/main/java/app/MainController.java @@ -1,15 +1,49 @@ package app; import java.net.URL; +import java.util.List; import java.util.ResourceBundle; +import com.google.common.eventbus.EventBus; + +import app.controllers.*; import app.model.Model; +import javafx.fxml.FXML; import javafx.fxml.Initializable; public class MainController implements Initializable { + @FXML + private EditorController editorController; + + @FXML + private FiletreeController filetreeController; + + @FXML + private ModelineController modelineController; + + @FXML + private MenubarController menubarController; + + private EventBus eventBus; private Model model; + @Override + public void initialize(URL url, ResourceBundle resourceBundle) { + this.eventBus = new EventBus(); + + List.of( + editorController, + filetreeController, + modelineController, + menubarController + ).forEach(c -> c.setEventBus(this.eventBus)); + } + + public EventBus getEventBus() { + return this.eventBus; + } + /** * Links the controller to the global model * @param model The model to be linked @@ -18,11 +52,4 @@ public class MainController implements Initializable { this.model = model; } - /** - * Initializes and customizes the properties of the javafx objects. - */ - @Override - public void initialize(URL url, ResourceBundle resourceBundle) { - // - } } \ No newline at end of file diff --git a/src/main/java/app/controllers/Controller.java b/src/main/java/app/controllers/Controller.java new file mode 100644 index 0000000..ca86193 --- /dev/null +++ b/src/main/java/app/controllers/Controller.java @@ -0,0 +1,14 @@ +package app.controllers; + +import com.google.common.eventbus.EventBus; + +/** + * Interface to make a controller that contains an EventBus + */ +public interface Controller { + /** + * Registers the main EventBus into the controller. + * @param eventBus the main EventBus + */ + public void setEventBus(EventBus eventBus); +} diff --git a/src/main/java/app/controllers/EditorController.java b/src/main/java/app/controllers/EditorController.java index 3b80dcb..323dccb 100644 --- a/src/main/java/app/controllers/EditorController.java +++ b/src/main/java/app/controllers/EditorController.java @@ -3,21 +3,38 @@ package app.controllers; import java.net.URL; import java.util.ResourceBundle; +import com.google.common.eventbus.EventBus; + import org.fxmisc.richtext.CodeArea; import org.fxmisc.richtext.LineNumberFactory; +import org.fxmisc.richtext.model.TwoDimensional.Bias; +import org.fxmisc.richtext.model.TwoDimensional.Position; +import app.events.EditorChangedEvent; import app.model.Model; -import javafx.event.ActionEvent; import javafx.fxml.FXML; import javafx.fxml.Initializable; +import javafx.scene.input.KeyEvent; -public class EditorController implements Initializable { +public class EditorController implements Initializable, Controller { @FXML private CodeArea editor; + private EventBus eventBus; private Model model; + @Override + public void initialize(URL url, ResourceBundle resourceBundle) { + editor.setParagraphGraphicFactory(LineNumberFactory.get(editor)); + } + + @Override + public void setEventBus(EventBus eventBus) { + this.eventBus = eventBus; + this.eventBus.register(this); + } + /** * Links the controller to the global model * @param model The model to be linked @@ -26,21 +43,20 @@ public class EditorController implements Initializable { this.model = model; } - /** - * Initializes and customizes the properties of the javafx objects. - */ - @Override - public void initialize(URL url, ResourceBundle resourceBundle) { - editor.setParagraphGraphicFactory(LineNumberFactory.get(editor)); - } - /** * Handles events from the editor, and reflects them in the model * @param event The object containing metadata of the event */ @FXML - public void editorChanged(ActionEvent event) { - // + public void editorChanged(KeyEvent event) { + int offset = this.editor.getCaretPosition(); + Position pos = this.editor.offsetToPosition(offset, Bias.Forward); + this.eventBus.post( + new EditorChangedEvent( + event.getCode(), + pos.getMajor() + 1, + pos.getMinor() + )); } } diff --git a/src/main/java/app/controllers/FiletreeController.java b/src/main/java/app/controllers/FiletreeController.java index 159f3ee..70303f3 100644 --- a/src/main/java/app/controllers/FiletreeController.java +++ b/src/main/java/app/controllers/FiletreeController.java @@ -6,15 +6,27 @@ import javafx.scene.control.TreeView; import java.net.URL; import java.util.ResourceBundle; +import com.google.common.eventbus.EventBus; + import app.model.Model; import javafx.fxml.Initializable; -public class FiletreeController implements Initializable { +public class FiletreeController implements Initializable, Controller { - // TODO: Add component references, and event handlers - + private EventBus eventBus; private Model model; + @Override + public void initialize(URL url, ResourceBundle resourceBundle) { + // TODO: implement + } + + @Override + public void setEventBus(EventBus eventBus) { + this.eventBus = eventBus; + this.eventBus.register(this); + } + /** * Links the controller to the global model * @param model The model to be linked @@ -23,12 +35,4 @@ public class FiletreeController implements Initializable { this.model = model; } - /** - * Initializes and customizes the properties of the javafx objects. - */ - @Override - public void initialize(URL url, ResourceBundle resourceBundle) { - // TODO: implement - } - } diff --git a/src/main/java/app/controllers/MenubarController.java b/src/main/java/app/controllers/MenubarController.java index 5c8e14d..d849f0f 100644 --- a/src/main/java/app/controllers/MenubarController.java +++ b/src/main/java/app/controllers/MenubarController.java @@ -3,15 +3,27 @@ package app.controllers; import java.net.URL; import java.util.ResourceBundle; +import com.google.common.eventbus.EventBus; + import app.model.Model; import javafx.fxml.Initializable; -public class MenubarController implements Initializable { +public class MenubarController implements Initializable, Controller { - // TODO: Add component references, and event handlers - + private EventBus eventBus; private Model model; + @Override + public void initialize(URL url, ResourceBundle resourceBundle) { + // TODO: implement + } + + @Override + public void setEventBus(EventBus eventBus) { + this.eventBus = eventBus; + this.eventBus.register(this); + } + /** * Links the controller to the global model * @param model The model to be linked @@ -20,12 +32,5 @@ public class MenubarController implements Initializable { this.model = model; } - /** - * Initializes and customizes the properties of the javafx objects. - */ - @Override - public void initialize(URL url, ResourceBundle resourceBundle) { - // TODO: implement - } } diff --git a/src/main/java/app/controllers/ModelineController.java b/src/main/java/app/controllers/ModelineController.java index 6bf11b7..459eba6 100644 --- a/src/main/java/app/controllers/ModelineController.java +++ b/src/main/java/app/controllers/ModelineController.java @@ -3,15 +3,37 @@ package app.controllers; import java.net.URL; import java.util.ResourceBundle; +import com.google.common.eventbus.EventBus; +import com.google.common.eventbus.Subscribe; + +import app.events.EditorChangedEvent; import app.model.Model; +import javafx.fxml.FXML; import javafx.fxml.Initializable; +import javafx.scene.control.Label; -public class ModelineController implements Initializable { +public class ModelineController implements Initializable, Controller { - // TODO: Add component references, and event handlers + @FXML + private Label columnrow; + @FXML + private Label language; + + private EventBus eventBus; private Model model; + @Override + public void initialize(URL url, ResourceBundle resourceBundle) { + setColumnRow(0, 1); + } + + @Override + public void setEventBus(EventBus eventBus) { + this.eventBus = eventBus; + this.eventBus.register(this); + } + /** * Links the controller to the global model * @param model The model to be linked @@ -21,11 +43,17 @@ public class ModelineController implements Initializable { } /** - * Initializes and customizes the properties of the javafx objects. + * Update the colum row counter + * @param column The column number + * @param row The row number */ - @Override - public void initialize(URL url, ResourceBundle resourceBundle) { - // TODO: implement + public void setColumnRow(int column, int row) { + this.columnrow.setText(String.format("[%d:%d]", row, column)); } -} + @Subscribe + public void handle(EditorChangedEvent event) { + System.out.println("Key pressed: " + event.getKeyCode()); + this.setColumnRow(event.getColumn(), event.getLineNumber()); + } +} \ No newline at end of file diff --git a/src/main/java/app/events/EditorChangedEvent.java b/src/main/java/app/events/EditorChangedEvent.java new file mode 100644 index 0000000..b85e8d9 --- /dev/null +++ b/src/main/java/app/events/EditorChangedEvent.java @@ -0,0 +1,29 @@ +package app.events; + +import javafx.scene.input.KeyCode; + +public class EditorChangedEvent implements Event { + + private KeyCode keyCode; + private int lineNumber; + private int column; + + public EditorChangedEvent(KeyCode keyCode, int lineNumber, int column) { + this.keyCode = keyCode; + this.lineNumber = lineNumber; + this.column = column; + } + + public KeyCode getKeyCode() { + return this.keyCode; + } + + public int getLineNumber() { + return this.lineNumber; + } + + public int getColumn() { + return column; + } + +} diff --git a/src/main/java/app/events/Event.java b/src/main/java/app/events/Event.java new file mode 100644 index 0000000..f7ca520 --- /dev/null +++ b/src/main/java/app/events/Event.java @@ -0,0 +1,3 @@ +package app.events; + +interface Event {} diff --git a/src/main/resources/fxml/Main.fxml b/src/main/resources/fxml/Main.fxml index 91da24f..d7bc4ff 100644 --- a/src/main/resources/fxml/Main.fxml +++ b/src/main/resources/fxml/Main.fxml @@ -2,6 +2,7 @@ + - +
@@ -23,10 +24,10 @@ - + - + @@ -34,7 +35,7 @@ - + diff --git a/src/main/resources/fxml/components/Editor.fxml b/src/main/resources/fxml/components/Editor.fxml index 4774175..48751e3 100644 --- a/src/main/resources/fxml/components/Editor.fxml +++ b/src/main/resources/fxml/components/Editor.fxml @@ -9,6 +9,6 @@ xmlns:fx="http://javafx.com/fxml/1" fx:controller="app.controllers.EditorController"> - + \ No newline at end of file