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 @@