Search in sources :

Example 1 with VirtualizedScrollPane

use of org.fxmisc.flowless.VirtualizedScrollPane in project RichTextFX by FXMisc.

the class RichText method start.

@Override
public void start(Stage primaryStage) {
    mainStage = primaryStage;
    Button loadBtn = createButton("loadfile", this::loadDocument, "Load document.\n\n" + "Note: the demo will load only previously-saved \"" + RTFX_FILE_EXTENSION + "\" files. " + "This file format is abitrary and may change across versions.");
    Button saveBtn = createButton("savefile", this::saveDocument, "Save document.\n\n" + "Note: the demo will save the area's content to a \"" + RTFX_FILE_EXTENSION + "\" file. " + "This file format is abitrary and may change across versions.");
    CheckBox wrapToggle = new CheckBox("Wrap");
    wrapToggle.setSelected(true);
    area.wrapTextProperty().bind(wrapToggle.selectedProperty());
    Button undoBtn = createButton("undo", area::undo, "Undo");
    Button redoBtn = createButton("redo", area::redo, "Redo");
    Button cutBtn = createButton("cut", area::cut, "Cut");
    Button copyBtn = createButton("copy", area::copy, "Copy");
    Button pasteBtn = createButton("paste", area::paste, "Paste");
    Button boldBtn = createButton("bold", this::toggleBold, "Bold");
    Button italicBtn = createButton("italic", this::toggleItalic, "Italic");
    Button underlineBtn = createButton("underline", this::toggleUnderline, "Underline");
    Button strikeBtn = createButton("strikethrough", this::toggleStrikethrough, "Strike Trough");
    Button insertImageBtn = createButton("insertimage", this::insertImage, "Insert Image");
    ToggleGroup alignmentGrp = new ToggleGroup();
    ToggleButton alignLeftBtn = createToggleButton(alignmentGrp, "align-left", this::alignLeft, "Align left");
    ToggleButton alignCenterBtn = createToggleButton(alignmentGrp, "align-center", this::alignCenter, "Align center");
    ToggleButton alignRightBtn = createToggleButton(alignmentGrp, "align-right", this::alignRight, "Align right");
    ToggleButton alignJustifyBtn = createToggleButton(alignmentGrp, "align-justify", this::alignJustify, "Justify");
    ColorPicker paragraphBackgroundPicker = new ColorPicker();
    ComboBox<Integer> sizeCombo = new ComboBox<>(FXCollections.observableArrayList(5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 16, 18, 20, 22, 24, 28, 32, 36, 40, 48, 56, 64, 72));
    sizeCombo.getSelectionModel().select(Integer.valueOf(12));
    sizeCombo.setTooltip(new Tooltip("Font size"));
    ComboBox<String> familyCombo = new ComboBox<>(FXCollections.observableList(Font.getFamilies()));
    familyCombo.getSelectionModel().select("Serif");
    familyCombo.setTooltip(new Tooltip("Font family"));
    ColorPicker textColorPicker = new ColorPicker(Color.BLACK);
    ColorPicker backgroundColorPicker = new ColorPicker();
    paragraphBackgroundPicker.setTooltip(new Tooltip("Paragraph background"));
    textColorPicker.setTooltip(new Tooltip("Text color"));
    backgroundColorPicker.setTooltip(new Tooltip("Text background"));
    paragraphBackgroundPicker.valueProperty().addListener((o, old, color) -> updateParagraphBackground(color));
    sizeCombo.setOnAction(evt -> updateFontSize(sizeCombo.getValue()));
    familyCombo.setOnAction(evt -> updateFontFamily(familyCombo.getValue()));
    textColorPicker.valueProperty().addListener((o, old, color) -> updateTextColor(color));
    backgroundColorPicker.valueProperty().addListener((o, old, color) -> updateBackgroundColor(color));
    undoBtn.disableProperty().bind(area.undoAvailableProperty().map(x -> !x));
    redoBtn.disableProperty().bind(area.redoAvailableProperty().map(x -> !x));
    BooleanBinding selectionEmpty = new BooleanBinding() {

        {
            bind(area.selectionProperty());
        }

        @Override
        protected boolean computeValue() {
            return area.getSelection().getLength() == 0;
        }
    };
    cutBtn.disableProperty().bind(selectionEmpty);
    copyBtn.disableProperty().bind(selectionEmpty);
    area.beingUpdatedProperty().addListener((o, old, beingUpdated) -> {
        if (!beingUpdated) {
            boolean bold, italic, underline, strike;
            Integer fontSize;
            String fontFamily;
            Color textColor;
            Color backgroundColor;
            IndexRange selection = area.getSelection();
            if (selection.getLength() != 0) {
                StyleSpans<TextStyle> styles = area.getStyleSpans(selection);
                bold = styles.styleStream().anyMatch(s -> s.bold.orElse(false));
                italic = styles.styleStream().anyMatch(s -> s.italic.orElse(false));
                underline = styles.styleStream().anyMatch(s -> s.underline.orElse(false));
                strike = styles.styleStream().anyMatch(s -> s.strikethrough.orElse(false));
                int[] sizes = styles.styleStream().mapToInt(s -> s.fontSize.orElse(-1)).distinct().toArray();
                fontSize = sizes.length == 1 ? sizes[0] : -1;
                String[] families = styles.styleStream().map(s -> s.fontFamily.orElse(null)).distinct().toArray(String[]::new);
                fontFamily = families.length == 1 ? families[0] : null;
                Color[] colors = styles.styleStream().map(s -> s.textColor.orElse(null)).distinct().toArray(Color[]::new);
                textColor = colors.length == 1 ? colors[0] : null;
                Color[] backgrounds = styles.styleStream().map(s -> s.backgroundColor.orElse(null)).distinct().toArray(i -> new Color[i]);
                backgroundColor = backgrounds.length == 1 ? backgrounds[0] : null;
            } else {
                int p = area.getCurrentParagraph();
                int col = area.getCaretColumn();
                TextStyle style = area.getStyleAtPosition(p, col);
                bold = style.bold.orElse(false);
                italic = style.italic.orElse(false);
                underline = style.underline.orElse(false);
                strike = style.strikethrough.orElse(false);
                fontSize = style.fontSize.orElse(-1);
                fontFamily = style.fontFamily.orElse(null);
                textColor = style.textColor.orElse(null);
                backgroundColor = style.backgroundColor.orElse(null);
            }
            int startPar = area.offsetToPosition(selection.getStart(), Forward).getMajor();
            int endPar = area.offsetToPosition(selection.getEnd(), Backward).getMajor();
            List<Paragraph<ParStyle, Either<String, LinkedImage>, TextStyle>> pars = area.getParagraphs().subList(startPar, endPar + 1);
            @SuppressWarnings("unchecked") Optional<TextAlignment>[] alignments = pars.stream().map(p -> p.getParagraphStyle().alignment).distinct().toArray(Optional[]::new);
            Optional<TextAlignment> alignment = alignments.length == 1 ? alignments[0] : Optional.empty();
            @SuppressWarnings("unchecked") Optional<Color>[] paragraphBackgrounds = pars.stream().map(p -> p.getParagraphStyle().backgroundColor).distinct().toArray(Optional[]::new);
            Optional<Color> paragraphBackground = paragraphBackgrounds.length == 1 ? paragraphBackgrounds[0] : Optional.empty();
            updatingToolbar.suspendWhile(() -> {
                if (bold) {
                    if (!boldBtn.getStyleClass().contains("pressed")) {
                        boldBtn.getStyleClass().add("pressed");
                    }
                } else {
                    boldBtn.getStyleClass().remove("pressed");
                }
                if (italic) {
                    if (!italicBtn.getStyleClass().contains("pressed")) {
                        italicBtn.getStyleClass().add("pressed");
                    }
                } else {
                    italicBtn.getStyleClass().remove("pressed");
                }
                if (underline) {
                    if (!underlineBtn.getStyleClass().contains("pressed")) {
                        underlineBtn.getStyleClass().add("pressed");
                    }
                } else {
                    underlineBtn.getStyleClass().remove("pressed");
                }
                if (strike) {
                    if (!strikeBtn.getStyleClass().contains("pressed")) {
                        strikeBtn.getStyleClass().add("pressed");
                    }
                } else {
                    strikeBtn.getStyleClass().remove("pressed");
                }
                if (alignment.isPresent()) {
                    TextAlignment al = alignment.get();
                    switch(al) {
                        case LEFT:
                            alignmentGrp.selectToggle(alignLeftBtn);
                            break;
                        case CENTER:
                            alignmentGrp.selectToggle(alignCenterBtn);
                            break;
                        case RIGHT:
                            alignmentGrp.selectToggle(alignRightBtn);
                            break;
                        case JUSTIFY:
                            alignmentGrp.selectToggle(alignJustifyBtn);
                            break;
                    }
                } else {
                    alignmentGrp.selectToggle(null);
                }
                paragraphBackgroundPicker.setValue(paragraphBackground.orElse(null));
                if (fontSize != -1) {
                    sizeCombo.getSelectionModel().select(fontSize);
                } else {
                    sizeCombo.getSelectionModel().clearSelection();
                }
                if (fontFamily != null) {
                    familyCombo.getSelectionModel().select(fontFamily);
                } else {
                    familyCombo.getSelectionModel().clearSelection();
                }
                if (textColor != null) {
                    textColorPicker.setValue(textColor);
                }
                backgroundColorPicker.setValue(backgroundColor);
            });
        }
    });
    ToolBar toolBar1 = new ToolBar(loadBtn, saveBtn, new Separator(Orientation.VERTICAL), wrapToggle, new Separator(Orientation.VERTICAL), undoBtn, redoBtn, new Separator(Orientation.VERTICAL), cutBtn, copyBtn, pasteBtn, new Separator(Orientation.VERTICAL), boldBtn, italicBtn, underlineBtn, strikeBtn, new Separator(Orientation.VERTICAL), alignLeftBtn, alignCenterBtn, alignRightBtn, alignJustifyBtn, new Separator(Orientation.VERTICAL), insertImageBtn, new Separator(Orientation.VERTICAL), paragraphBackgroundPicker);
    ToolBar toolBar2 = new ToolBar(sizeCombo, familyCombo, textColorPicker, backgroundColorPicker);
    VirtualizedScrollPane<GenericStyledArea<ParStyle, Either<String, LinkedImage>, TextStyle>> vsPane = new VirtualizedScrollPane<>(area);
    VBox vbox = new VBox();
    VBox.setVgrow(vsPane, Priority.ALWAYS);
    vbox.getChildren().addAll(toolBar1, toolBar2, vsPane);
    Scene scene = new Scene(vbox, 600, 400);
    scene.getStylesheets().add(RichText.class.getResource("rich-text.css").toExternalForm());
    primaryStage.setScene(scene);
    area.requestFocus();
    primaryStage.setTitle("Rich Text Demo");
    primaryStage.show();
}
Also used : Button(javafx.scene.control.Button) SegmentOps(org.fxmisc.richtext.model.SegmentOps) SuspendableNo(org.reactfx.SuspendableNo) BooleanBinding(javafx.beans.binding.BooleanBinding) VBox(javafx.scene.layout.VBox) TextExt(org.fxmisc.richtext.TextExt) TextOps(org.fxmisc.richtext.model.TextOps) Application(javafx.application.Application) Either(org.reactfx.util.Either) DataOutputStream(java.io.DataOutputStream) ComboBox(javafx.scene.control.ComboBox) Orientation(javafx.geometry.Orientation) Font(javafx.scene.text.Font) Separator(javafx.scene.control.Separator) Priority(javafx.scene.layout.Priority) List(java.util.List) ToggleButton(javafx.scene.control.ToggleButton) Tuple2(org.reactfx.util.Tuple2) Optional(java.util.Optional) GenericStyledArea(org.fxmisc.richtext.GenericStyledArea) DataInputStream(java.io.DataInputStream) Scene(javafx.scene.Scene) StyleSpans(org.fxmisc.richtext.model.StyleSpans) Bias(org.fxmisc.richtext.model.TwoDimensional.Bias) FXCollections(javafx.collections.FXCollections) Codec(org.fxmisc.richtext.model.Codec) Function(java.util.function.Function) IndexRange(javafx.scene.control.IndexRange) Paragraph(org.fxmisc.richtext.model.Paragraph) BiConsumer(java.util.function.BiConsumer) TextAlignment(javafx.scene.text.TextAlignment) StyledTextArea(org.fxmisc.richtext.StyledTextArea) Tooltip(javafx.scene.control.Tooltip) ColorPicker(javafx.scene.control.ColorPicker) Color(javafx.scene.paint.Color) ReadOnlyStyledDocument(org.fxmisc.richtext.model.ReadOnlyStyledDocument) ToolBar(javafx.scene.control.ToolBar) Node(javafx.scene.Node) CheckBox(javafx.scene.control.CheckBox) FileOutputStream(java.io.FileOutputStream) IOException(java.io.IOException) FileInputStream(java.io.FileInputStream) File(java.io.File) StyledDocument(org.fxmisc.richtext.model.StyledDocument) FileChooser(javafx.stage.FileChooser) ToggleGroup(javafx.scene.control.ToggleGroup) Stage(javafx.stage.Stage) VirtualizedScrollPane(org.fxmisc.flowless.VirtualizedScrollPane) StyledSegment(org.fxmisc.richtext.model.StyledSegment) ColorPicker(javafx.scene.control.ColorPicker) Button(javafx.scene.control.Button) ToggleButton(javafx.scene.control.ToggleButton) ToggleButton(javafx.scene.control.ToggleButton) Optional(java.util.Optional) GenericStyledArea(org.fxmisc.richtext.GenericStyledArea) ComboBox(javafx.scene.control.ComboBox) Tooltip(javafx.scene.control.Tooltip) Color(javafx.scene.paint.Color) Scene(javafx.scene.Scene) Paragraph(org.fxmisc.richtext.model.Paragraph) IndexRange(javafx.scene.control.IndexRange) BooleanBinding(javafx.beans.binding.BooleanBinding) CheckBox(javafx.scene.control.CheckBox) ToggleGroup(javafx.scene.control.ToggleGroup) TextAlignment(javafx.scene.text.TextAlignment) ToolBar(javafx.scene.control.ToolBar) VBox(javafx.scene.layout.VBox) Separator(javafx.scene.control.Separator) VirtualizedScrollPane(org.fxmisc.flowless.VirtualizedScrollPane)

Example 2 with VirtualizedScrollPane

use of org.fxmisc.flowless.VirtualizedScrollPane in project RichTextFX by FXMisc.

the class XMLEditor method start.

@Override
public void start(Stage primaryStage) {
    CodeArea codeArea = new CodeArea();
    codeArea.setParagraphGraphicFactory(LineNumberFactory.get(codeArea));
    codeArea.textProperty().addListener((obs, oldText, newText) -> {
        codeArea.setStyleSpans(0, computeHighlighting(newText));
    });
    codeArea.replaceText(0, 0, sampleCode);
    Scene scene = new Scene(new StackPane(new VirtualizedScrollPane<>(codeArea)), 600, 400);
    scene.getStylesheets().add(XMLEditor.class.getResource("xml-highlighting.css").toExternalForm());
    primaryStage.setScene(scene);
    primaryStage.setTitle("XML Editor Demo");
    primaryStage.show();
}
Also used : Scene(javafx.scene.Scene) StackPane(javafx.scene.layout.StackPane) VirtualizedScrollPane(org.fxmisc.flowless.VirtualizedScrollPane) CodeArea(org.fxmisc.richtext.CodeArea)

Example 3 with VirtualizedScrollPane

use of org.fxmisc.flowless.VirtualizedScrollPane in project RichTextFX by FXMisc.

the class HyperlinkDemo method start.

@Override
public void start(Stage primaryStage) {
    Consumer<String> showLink = (string) -> {
        try {
            Desktop.getDesktop().browse(new URI(string));
        } catch (IOException | URISyntaxException e) {
            throw new RuntimeException(e);
        }
    };
    TextHyperlinkArea area = new TextHyperlinkArea(showLink);
    area.appendText("Some text in the area\n");
    area.appendWithLink("Google.com", "http://www.google.com");
    VirtualizedScrollPane<TextHyperlinkArea> vsPane = new VirtualizedScrollPane<>(area);
    Scene scene = new Scene(vsPane, 500, 500);
    primaryStage.setScene(scene);
    primaryStage.show();
}
Also used : Application(javafx.application.Application) java.awt(java.awt) Consumer(java.util.function.Consumer) Scene(javafx.scene.Scene) Stage(javafx.stage.Stage) VirtualizedScrollPane(org.fxmisc.flowless.VirtualizedScrollPane) URISyntaxException(java.net.URISyntaxException) IOException(java.io.IOException) URI(java.net.URI) Scene(javafx.scene.Scene) URI(java.net.URI) VirtualizedScrollPane(org.fxmisc.flowless.VirtualizedScrollPane)

Example 4 with VirtualizedScrollPane

use of org.fxmisc.flowless.VirtualizedScrollPane in project RichTextFX by FXMisc.

the class ManualHighlighting method start.

@Override
public void start(Stage primaryStage) {
    Button red = createColorButton(Color.RED, "red");
    Button green = createColorButton(Color.GREEN, "green");
    Button blue = createColorButton(Color.BLUE, "blue");
    Button bold = createBoldButton("bold");
    HBox panel = new HBox(red, green, blue, bold);
    VirtualizedScrollPane<StyleClassedTextArea> vsPane = new VirtualizedScrollPane<>(area);
    VBox.setVgrow(vsPane, Priority.ALWAYS);
    area.setWrapText(true);
    VBox vbox = new VBox(panel, vsPane);
    Scene scene = new Scene(vbox, 600, 400);
    scene.getStylesheets().add(ManualHighlighting.class.getResource("manual-highlighting.css").toExternalForm());
    primaryStage.setScene(scene);
    primaryStage.setTitle("Manual Highlighting Demo");
    primaryStage.show();
    area.requestFocus();
}
Also used : HBox(javafx.scene.layout.HBox) Button(javafx.scene.control.Button) StyleClassedTextArea(org.fxmisc.richtext.StyleClassedTextArea) Scene(javafx.scene.Scene) VBox(javafx.scene.layout.VBox) VirtualizedScrollPane(org.fxmisc.flowless.VirtualizedScrollPane)

Example 5 with VirtualizedScrollPane

use of org.fxmisc.flowless.VirtualizedScrollPane in project RichTextFX by FXMisc.

the class FontSizeSwitcher method start.

@Override
public void start(Stage primaryStage) {
    StyleClassedTextArea area = new StyleClassedTextArea();
    area.setWrapText(true);
    for (int i = 0; i < 10; ++i) {
        area.appendText("Lorem ipsum dolor sit amet, consectetur adipiscing elit.\n");
    }
    HBox panel = new HBox();
    for (int size : new int[] { 8, 10, 12, 14, 16, 18, 20, 24, 28, 32, 36, 40, 48, 56, 64, 72 }) {
        Button b = new Button(Integer.toString(size));
        b.setOnAction(ae -> area.setStyle("-fx-font-size:" + size));
        panel.getChildren().add(b);
    }
    VBox vbox = new VBox();
    VirtualizedScrollPane<StyleClassedTextArea> vsPane = new VirtualizedScrollPane<>(area);
    VBox.setVgrow(vsPane, Priority.ALWAYS);
    vbox.getChildren().addAll(panel, vsPane);
    Scene scene = new Scene(vbox, 600, 400);
    primaryStage.setScene(scene);
    area.requestFocus();
    primaryStage.setTitle("Font Size Switching Test");
    primaryStage.show();
}
Also used : HBox(javafx.scene.layout.HBox) Button(javafx.scene.control.Button) StyleClassedTextArea(org.fxmisc.richtext.StyleClassedTextArea) Scene(javafx.scene.Scene) VBox(javafx.scene.layout.VBox) VirtualizedScrollPane(org.fxmisc.flowless.VirtualizedScrollPane)

Aggregations

Scene (javafx.scene.Scene)10 VirtualizedScrollPane (org.fxmisc.flowless.VirtualizedScrollPane)10 VBox (javafx.scene.layout.VBox)5 Application (javafx.application.Application)4 Button (javafx.scene.control.Button)4 StackPane (javafx.scene.layout.StackPane)4 Stage (javafx.stage.Stage)4 IOException (java.io.IOException)3 Optional (java.util.Optional)3 StyleClassedTextArea (org.fxmisc.richtext.StyleClassedTextArea)3 Subscription (org.reactfx.Subscription)3 Consumer (java.util.function.Consumer)2 Function (java.util.function.Function)2 BorderPane (javafx.scene.layout.BorderPane)2 HBox (javafx.scene.layout.HBox)2 CodeArea (org.fxmisc.richtext.CodeArea)2 java.awt (java.awt)1 BufferedReader (java.io.BufferedReader)1 DataInputStream (java.io.DataInputStream)1 DataOutputStream (java.io.DataOutputStream)1