Add comment toggle feature
This commit is contained in:
parent
0ba350395b
commit
302b10a5a6
@ -19,7 +19,7 @@ Probably tastes better than any Apple editor and NetBeans combined.
|
|||||||
- [X] Line numbers
|
- [X] Line numbers
|
||||||
- [X] Shortcuts
|
- [X] Shortcuts
|
||||||
- [X] Change languages
|
- [X] Change languages
|
||||||
- [ ] Toggle line comment
|
- [X] Toggle line comment
|
||||||
- [ ] Soft wrap
|
- [ ] Soft wrap
|
||||||
- [ ] Darkmode/Lightmode or color themes
|
- [ ] Darkmode/Lightmode or color themes
|
||||||
- [ ] Add icons for files/folders in filetree
|
- [ ] Add icons for files/folders in filetree
|
||||||
|
@ -15,6 +15,7 @@ import org.fxmisc.richtext.model.TwoDimensional.Position;
|
|||||||
|
|
||||||
import app.events.EditorChangedEvent;
|
import app.events.EditorChangedEvent;
|
||||||
import app.events.LanguageChangedEvent;
|
import app.events.LanguageChangedEvent;
|
||||||
|
import app.events.ToggleCommentEvent;
|
||||||
import app.events.FileSaveStateChangedEvent;
|
import app.events.FileSaveStateChangedEvent;
|
||||||
import app.model.Model;
|
import app.model.Model;
|
||||||
import app.service.LanguageOperations;
|
import app.service.LanguageOperations;
|
||||||
@ -63,6 +64,41 @@ public class EditorController implements Initializable, Controller {
|
|||||||
this.setHighlighting(LanguageOperations.syntaxHighlight(this.editor.getText(), Model.getLanguage()));
|
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.
|
* 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);
|
Position pos = this.editor.offsetToPosition(offset, Bias.Forward);
|
||||||
this.eventBus.post(new EditorChangedEvent(pos.getMajor() + 1, pos.getMinor()));
|
this.eventBus.post(new EditorChangedEvent(pos.getMajor() + 1, pos.getMinor()));
|
||||||
|
|
||||||
|
|
||||||
if (Model.getFileIsSaved())
|
if (Model.getFileIsSaved())
|
||||||
this.eventBus.post(new FileSaveStateChangedEvent(false));
|
this.eventBus.post(new FileSaveStateChangedEvent(false));
|
||||||
|
|
||||||
@ -80,11 +115,20 @@ public class EditorController implements Initializable, Controller {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Refreshes the editor whenever the language is changed.
|
* Refreshes the editor whenever the language is changed.
|
||||||
* @param event Which language was switched to
|
* @param event
|
||||||
*/
|
*/
|
||||||
@Subscribe
|
@Subscribe
|
||||||
private void handle(LanguageChangedEvent event) {
|
private void handle(LanguageChangedEvent event) {
|
||||||
this.refreshHighlighting();
|
this.refreshHighlighting();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Toggles a language specific comment of the line/selection
|
||||||
|
* @param event
|
||||||
|
*/
|
||||||
|
@Subscribe
|
||||||
|
private void handle(ToggleCommentEvent event) {
|
||||||
|
this.toggleComment();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -9,6 +9,7 @@ import com.google.common.eventbus.Subscribe;
|
|||||||
|
|
||||||
import app.events.ExitApplicationEvent;
|
import app.events.ExitApplicationEvent;
|
||||||
import app.events.LanguageChangedEvent;
|
import app.events.LanguageChangedEvent;
|
||||||
|
import app.events.ToggleCommentEvent;
|
||||||
import javafx.event.ActionEvent;
|
import javafx.event.ActionEvent;
|
||||||
import javafx.fxml.FXML;
|
import javafx.fxml.FXML;
|
||||||
import javafx.fxml.Initializable;
|
import javafx.fxml.Initializable;
|
||||||
@ -82,6 +83,10 @@ public class MenubarController implements Initializable, Controller {
|
|||||||
this.eventBus.register(this);
|
this.eventBus.register(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* ------------------------------------------------------------------------ */
|
||||||
|
/* FILE */
|
||||||
|
/* ------------------------------------------------------------------------ */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Handles the event where the language was change from the menu.
|
* Handles the event where the language was change from the menu.
|
||||||
* @param event
|
* @param event
|
||||||
@ -102,6 +107,15 @@ public class MenubarController implements Initializable, Controller {
|
|||||||
this.eventBus.post(new ExitApplicationEvent());
|
this.eventBus.post(new ExitApplicationEvent());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* ------------------------------------------------------------------------ */
|
||||||
|
/* EDIT */
|
||||||
|
/* ------------------------------------------------------------------------ */
|
||||||
|
|
||||||
|
@FXML
|
||||||
|
private void handleToggleComment(ActionEvent event) {
|
||||||
|
this.eventBus.post(new ToggleCommentEvent());
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Updates menubuttons whenever the language is changed
|
* Updates menubuttons whenever the language is changed
|
||||||
* @param event
|
* @param event
|
||||||
@ -117,4 +131,9 @@ public class MenubarController implements Initializable, Controller {
|
|||||||
.orElseThrow()
|
.orElseThrow()
|
||||||
.setSelected(true);
|
.setSelected(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* ------------------------------------------------------------------------ */
|
||||||
|
/* ABOUT */
|
||||||
|
/* ------------------------------------------------------------------------ */
|
||||||
|
|
||||||
}
|
}
|
||||||
|
5
src/main/java/app/events/ToggleCommentEvent.java
Normal file
5
src/main/java/app/events/ToggleCommentEvent.java
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
package app.events;
|
||||||
|
|
||||||
|
public class ToggleCommentEvent {
|
||||||
|
|
||||||
|
}
|
@ -2,6 +2,7 @@ package app.languages;
|
|||||||
|
|
||||||
import java.net.URL;
|
import java.net.URL;
|
||||||
import java.util.AbstractMap;
|
import java.util.AbstractMap;
|
||||||
|
import java.util.Arrays;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Map.Entry;
|
import java.util.Map.Entry;
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
@ -69,4 +70,45 @@ public class Java implements ProgrammingLanguage {
|
|||||||
.map(e -> String.format("(?<%s>%s)", e.getValue(), e.getKey()))
|
.map(e -> String.format("(?<%s>%s)", e.getValue(), e.getKey()))
|
||||||
.collect(Collectors.joining("|")));
|
.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("/*");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@ -2,6 +2,7 @@ package app.languages;
|
|||||||
|
|
||||||
import java.net.URL;
|
import java.net.URL;
|
||||||
import java.util.AbstractMap;
|
import java.util.AbstractMap;
|
||||||
|
import java.util.Arrays;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Map.Entry;
|
import java.util.Map.Entry;
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
@ -57,4 +58,48 @@ public class Markdown implements ProgrammingLanguage {
|
|||||||
.collect(Collectors.joining("|")));
|
.collect(Collectors.joining("|")));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------
|
||||||
|
|
||||||
|
// TODO: fix spacing of arrows
|
||||||
|
|
||||||
|
public String commentLine(String line) {
|
||||||
|
return "<!-- " + line + " -->";
|
||||||
|
}
|
||||||
|
|
||||||
|
public String unCommentLine(String line) {
|
||||||
|
return line
|
||||||
|
.replaceFirst("<!-- ?", "")
|
||||||
|
.replaceAll("-->\\s+?", "");
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isCommentedLine(String line) {
|
||||||
|
return line.startsWith("<!--") && line.endsWith("-->");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public String commentSelection(String selection) {
|
||||||
|
return
|
||||||
|
"<!-- " +
|
||||||
|
selection.lines()
|
||||||
|
.map(l -> " * " + l)
|
||||||
|
.collect(Collectors.joining("\n"))
|
||||||
|
+ " -->";
|
||||||
|
}
|
||||||
|
|
||||||
|
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("<!-- ", "")
|
||||||
|
+ String.join("\n", midlines)
|
||||||
|
+ lastLine.replaceAll(" -->\\s+?", "");
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isCommentedSelection(String selection) {
|
||||||
|
return selection.startsWith("<!--") && selection.endsWith("-->");
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -25,4 +25,13 @@ public interface ProgrammingLanguage {
|
|||||||
* The pattern containing all regexes for syntax highlighting
|
* The pattern containing all regexes for syntax highlighting
|
||||||
*/
|
*/
|
||||||
public Pattern getPattern();
|
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);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -45,7 +45,7 @@
|
|||||||
</items>
|
</items>
|
||||||
</Menu>
|
</Menu>
|
||||||
<SeparatorMenuItem/>
|
<SeparatorMenuItem/>
|
||||||
<MenuItem mnemonicParsing="false" text="Exit" accelerator="Shortcut+w"/>
|
<MenuItem mnemonicParsing="false" text="Exit" accelerator="Shortcut+w" onAction="#handleExitApplication"/>
|
||||||
</items>
|
</items>
|
||||||
</Menu>
|
</Menu>
|
||||||
<Menu mnemonicParsing="false" text="Edit">
|
<Menu mnemonicParsing="false" text="Edit">
|
||||||
@ -60,7 +60,7 @@
|
|||||||
<MenuItem mnemonicParsing="false" text="Find" accelerator="Shortcut+f"/>
|
<MenuItem mnemonicParsing="false" text="Find" accelerator="Shortcut+f"/>
|
||||||
<MenuItem mnemonicParsing="false" text="Replace" accelerator="Shortcut+h"/>
|
<MenuItem mnemonicParsing="false" text="Replace" accelerator="Shortcut+h"/>
|
||||||
<SeparatorMenuItem/>
|
<SeparatorMenuItem/>
|
||||||
<MenuItem mnemonicParsing="false" text="Toggle line comment" accelerator="Shortcut+k"/>
|
<MenuItem mnemonicParsing="false" text="Toggle line comment" accelerator="Shortcut+k" onAction="#handleToggleComment"/>
|
||||||
</items>
|
</items>
|
||||||
</Menu>
|
</Menu>
|
||||||
<Menu mnemonicParsing="false" text="Help">
|
<Menu mnemonicParsing="false" text="Help">
|
||||||
|
@ -12,6 +12,7 @@
|
|||||||
alignment="CENTER_LEFT">
|
alignment="CENTER_LEFT">
|
||||||
<Label text="Modeline :)"/>
|
<Label text="Modeline :)"/>
|
||||||
<Region HBox.hgrow="ALWAYS"/>
|
<Region HBox.hgrow="ALWAYS"/>
|
||||||
|
<Label fx:id="saveState" text="Saved!"/>
|
||||||
<Label fx:id="columnrow" text="[y:x]"/>
|
<Label fx:id="columnrow" text="[y:x]"/>
|
||||||
<Label fx:id="language" text="Java"/>
|
<Label fx:id="language" text="Java"/>
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user