diff --git a/README.md b/README.md index ad9cd31..55f6d9b 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,7 @@ Probably tastes better than any Apple editor and NetBeans combined. - [X] Line numbers - [X] Shortcuts - [X] Change languages -- [ ] Toggle line comment +- [X] Toggle line comment - [ ] Soft wrap - [ ] Darkmode/Lightmode or color themes - [ ] Add icons for files/folders in filetree diff --git a/src/main/java/app/controllers/EditorController.java b/src/main/java/app/controllers/EditorController.java index f8a66ca..6f74658 100644 --- a/src/main/java/app/controllers/EditorController.java +++ b/src/main/java/app/controllers/EditorController.java @@ -15,6 +15,7 @@ import org.fxmisc.richtext.model.TwoDimensional.Position; import app.events.EditorChangedEvent; import app.events.LanguageChangedEvent; +import app.events.ToggleCommentEvent; import app.events.FileSaveStateChangedEvent; import app.model.Model; import app.service.LanguageOperations; @@ -63,6 +64,41 @@ public class EditorController implements Initializable, Controller { this.setHighlighting(LanguageOperations.syntaxHighlight(this.editor.getText(), Model.getLanguage())); } + /** + * Uses Model.language to determine whether the current line/selection + * is commented or not, and toggles the comment. + */ + private void toggleComment() { + if (editor.getSelectedText().equals("")) { + String currentLine = editor.getText(editor.getCurrentParagraph()); + + String newText; + if (Model.getLanguage().isCommentedLine(currentLine)) + newText = Model.getLanguage().unCommentLine(currentLine); + else + newText = Model.getLanguage().commentLine(currentLine); + + editor.replaceText( + editor.getCurrentParagraph(), + 0, + editor.getCurrentParagraph(), + currentLine.length(), + newText + ); + + } else { // Comment selection + + String newText; + if (Model.getLanguage().isCommentedSelection(editor.getSelectedText())) + newText = Model.getLanguage().unCommentSelection(editor.getSelectedText()); + else + newText = Model.getLanguage().commentSelection(editor.getSelectedText()); + + editor.replaceSelection(newText); + + } + } + /** * Handles the event whenever the content of the editor is changed. */ @@ -71,7 +107,6 @@ public class EditorController implements Initializable, Controller { Position pos = this.editor.offsetToPosition(offset, Bias.Forward); this.eventBus.post(new EditorChangedEvent(pos.getMajor() + 1, pos.getMinor())); - if (Model.getFileIsSaved()) this.eventBus.post(new FileSaveStateChangedEvent(false)); @@ -80,11 +115,20 @@ public class EditorController implements Initializable, Controller { /** * Refreshes the editor whenever the language is changed. - * @param event Which language was switched to + * @param event */ @Subscribe private void handle(LanguageChangedEvent event) { this.refreshHighlighting(); } + /** + * Toggles a language specific comment of the line/selection + * @param event + */ + @Subscribe + private void handle(ToggleCommentEvent event) { + this.toggleComment(); + } + } diff --git a/src/main/java/app/controllers/MenubarController.java b/src/main/java/app/controllers/MenubarController.java index 33113cb..857eb1c 100644 --- a/src/main/java/app/controllers/MenubarController.java +++ b/src/main/java/app/controllers/MenubarController.java @@ -9,6 +9,7 @@ import com.google.common.eventbus.Subscribe; import app.events.ExitApplicationEvent; import app.events.LanguageChangedEvent; +import app.events.ToggleCommentEvent; import javafx.event.ActionEvent; import javafx.fxml.FXML; import javafx.fxml.Initializable; @@ -82,6 +83,10 @@ public class MenubarController implements Initializable, Controller { this.eventBus.register(this); } + /* ------------------------------------------------------------------------ */ + /* FILE */ + /* ------------------------------------------------------------------------ */ + /** * Handles the event where the language was change from the menu. * @param event @@ -102,6 +107,15 @@ public class MenubarController implements Initializable, Controller { this.eventBus.post(new ExitApplicationEvent()); } + /* ------------------------------------------------------------------------ */ + /* EDIT */ + /* ------------------------------------------------------------------------ */ + + @FXML + private void handleToggleComment(ActionEvent event) { + this.eventBus.post(new ToggleCommentEvent()); + } + /** * Updates menubuttons whenever the language is changed * @param event @@ -117,4 +131,9 @@ public class MenubarController implements Initializable, Controller { .orElseThrow() .setSelected(true); } + + /* ------------------------------------------------------------------------ */ + /* ABOUT */ + /* ------------------------------------------------------------------------ */ + } diff --git a/src/main/java/app/events/ToggleCommentEvent.java b/src/main/java/app/events/ToggleCommentEvent.java new file mode 100644 index 0000000..2de44dc --- /dev/null +++ b/src/main/java/app/events/ToggleCommentEvent.java @@ -0,0 +1,5 @@ +package app.events; + +public class ToggleCommentEvent { + +} diff --git a/src/main/java/app/languages/Java.java b/src/main/java/app/languages/Java.java index 90252e3..1251c14 100644 --- a/src/main/java/app/languages/Java.java +++ b/src/main/java/app/languages/Java.java @@ -2,6 +2,7 @@ package app.languages; import java.net.URL; import java.util.AbstractMap; +import java.util.Arrays; import java.util.Map; import java.util.Map.Entry; import java.util.regex.Pattern; @@ -69,4 +70,45 @@ public class Java implements ProgrammingLanguage { .map(e -> String.format("(?<%s>%s)", e.getValue(), e.getKey())) .collect(Collectors.joining("|"))); } + + // ---------------------------------------------------------------- + + public String commentLine(String line) { + return "// " + line; + } + + public String unCommentLine(String line) { + return line.replaceFirst("// ?", ""); + } + + public boolean isCommentedLine(String line) { + return line.matches("// ?.*"); + } + + + public String commentSelection(String selection) { + return + "/* \n" + + selection.lines() + .map(l -> " * " + l) + .collect(Collectors.joining("\n")) + + "\n */"; + } + + public String unCommentSelection(String selection) { + String[] rawLines = selection.split("\n"); + String[] lines = Arrays.copyOfRange(rawLines, 1, rawLines.length - 1); + + return Arrays + .stream(lines) + .map(l -> l.replaceFirst("^ \\* ", "")) + .collect(Collectors.joining("\n")); + } + + public boolean isCommentedSelection(String selection) { + // TODO: Fix + return selection.startsWith("/*"); + } + } + diff --git a/src/main/java/app/languages/Markdown.java b/src/main/java/app/languages/Markdown.java index 5ab3243..32cb17e 100644 --- a/src/main/java/app/languages/Markdown.java +++ b/src/main/java/app/languages/Markdown.java @@ -2,6 +2,7 @@ package app.languages; import java.net.URL; import java.util.AbstractMap; +import java.util.Arrays; import java.util.Map; import java.util.Map.Entry; import java.util.regex.Pattern; @@ -57,4 +58,48 @@ public class Markdown implements ProgrammingLanguage { .collect(Collectors.joining("|"))); } + // ---------------------------------------------------------------- + + // TODO: fix spacing of arrows + + public String commentLine(String line) { + return ""; + } + + public String unCommentLine(String line) { + return line + .replaceFirst("\\s+?", ""); + } + + public boolean isCommentedLine(String line) { + return line.startsWith(""); + } + + + public String commentSelection(String selection) { + return + ""; + } + + public String unCommentSelection(String selection) { + var lines = selection.split("\n"); + var firstLine = lines[0]; + var lastLine = lines[lines.length - 1]; + var midlines = Arrays.copyOfRange(lines, 1, lines.length - 1); + + return + firstLine.replaceFirst("\\s+?", ""); + } + + public boolean isCommentedSelection(String selection) { + return selection.startsWith(""); + } + } diff --git a/src/main/java/app/model/ProgrammingLanguage.java b/src/main/java/app/model/ProgrammingLanguage.java index cdbb414..df1d493 100644 --- a/src/main/java/app/model/ProgrammingLanguage.java +++ b/src/main/java/app/model/ProgrammingLanguage.java @@ -25,4 +25,13 @@ public interface ProgrammingLanguage { * The pattern containing all regexes for syntax highlighting */ public Pattern getPattern(); + + public String commentLine(String line); + public String unCommentLine(String line); + public boolean isCommentedLine(String line); + + public String commentSelection(String selection); + public String unCommentSelection(String selection); + public boolean isCommentedSelection(String selection); + } diff --git a/src/main/resources/fxml/components/Menubar.fxml b/src/main/resources/fxml/components/Menubar.fxml index 112f47f..1a90090 100644 --- a/src/main/resources/fxml/components/Menubar.fxml +++ b/src/main/resources/fxml/components/Menubar.fxml @@ -45,7 +45,7 @@ - + @@ -60,7 +60,7 @@ - + diff --git a/src/main/resources/fxml/components/Modeline.fxml b/src/main/resources/fxml/components/Modeline.fxml index 74649de..46e7cf7 100644 --- a/src/main/resources/fxml/components/Modeline.fxml +++ b/src/main/resources/fxml/components/Modeline.fxml @@ -12,6 +12,7 @@ alignment="CENTER_LEFT">