Skip to content

Commit

Permalink
Merge pull request #846 from Jugen/code_area_enhancement
Browse files Browse the repository at this point in the history
Enhancements to CodeArea and JavaKeywordsDemo
  • Loading branch information
Jugen authored Aug 25, 2019
2 parents 3f8f305 + 7766ec2 commit e90c3a9
Show file tree
Hide file tree
Showing 2 changed files with 65 additions and 2 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,10 @@
import java.util.regex.Pattern;

import javafx.application.Application;
import javafx.application.Platform;
import javafx.scene.Scene;
import javafx.scene.input.KeyCode;
import javafx.scene.input.KeyEvent;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

Expand Down Expand Up @@ -103,6 +106,20 @@ public void start(Stage primaryStage) {
// when no longer need syntax highlighting and wish to clean up memory leaks
// run: `cleanupWhenNoLongerNeedIt.unsubscribe();`


// auto-indent: insert previous line's indents on enter
final Pattern whiteSpace = Pattern.compile( "^\\s+" );
codeArea.addEventHandler( KeyEvent.KEY_PRESSED, KE ->
{
if ( KE.getCode() == KeyCode.ENTER ) {
int caretPosition = codeArea.getCaretPosition();
int currentParagraph = codeArea.getCurrentParagraph();
Matcher m0 = whiteSpace.matcher( codeArea.getParagraph( currentParagraph-1 ).getSegments().get( 0 ) );
if ( m0.find() ) Platform.runLater( () -> codeArea.insertText( caretPosition, m0.group() ) );
}
});


codeArea.replaceText(0, 0, sampleCode);

Scene scene = new Scene(new StackPane(new VirtualizedScrollPane<>(codeArea)), 600, 400);
Expand Down
50 changes: 48 additions & 2 deletions richtextfx/src/main/java/org/fxmisc/richtext/CodeArea.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package org.fxmisc.richtext;


import java.text.BreakIterator;
import java.util.Collection;

import javafx.beans.NamedArg;
Expand All @@ -21,7 +21,7 @@ public class CodeArea extends StyleClassedTextArea {
// don't apply preceding style to typed text
setUseInitialStyleForInsertion(true);
}

/**
* Creates an area that can render and edit the same {@link EditableStyledDocument} as another {@link CodeArea}.
*/
Expand Down Expand Up @@ -52,4 +52,50 @@ public CodeArea(@NamedArg("text") String text) {
// position the caret at the beginning
selectRange(0, 0);
}

@Override // to select words containing underscores
public void selectWord()
{
if ( getLength() == 0 ) return;

CaretSelectionBind<?,?,?> csb = getCaretSelectionBind();
int paragraph = csb.getParagraphIndex();
int position = csb.getColumnPosition();

String paragraphText = getText( paragraph );
BreakIterator breakIterator = BreakIterator.getWordInstance();
breakIterator.setText( paragraphText );

breakIterator.preceding( position );
int start = breakIterator.current();

while ( start > 0 && paragraphText.charAt( start-1 ) == '_' )
{
if ( --start > 0 && ! breakIterator.isBoundary( start-1 ) )
{
breakIterator.preceding( start );
start = breakIterator.current();
}
}

breakIterator.following( position );
int end = breakIterator.current();
int len = paragraphText.length();

while ( end < len && paragraphText.charAt( end ) == '_' )
{
if ( ++end < len && ! breakIterator.isBoundary( end+1 ) )
{
breakIterator.following( end );
end = breakIterator.current();
}
// For some reason single digits aren't picked up so ....
else if ( Character.isDigit( paragraphText.charAt( end ) ) )
{
end++;
}
}

csb.selectRange( paragraph, start, paragraph, end );
}
}

0 comments on commit e90c3a9

Please sign in to comment.