From a33c5f0f2c7857b91ec85d97301ddb835aae6b96 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=AE=B8=E8=BD=B2?= Date: Mon, 28 Aug 2023 02:15:47 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=80=A7=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../jcnc/jnotepad/ui/LineNumberTextArea.java | 92 +++++++++++++++++-- 1 file changed, 82 insertions(+), 10 deletions(-) diff --git a/src/main/java/org/jcnc/jnotepad/ui/LineNumberTextArea.java b/src/main/java/org/jcnc/jnotepad/ui/LineNumberTextArea.java index acb4a03..b2b1c9c 100644 --- a/src/main/java/org/jcnc/jnotepad/ui/LineNumberTextArea.java +++ b/src/main/java/org/jcnc/jnotepad/ui/LineNumberTextArea.java @@ -1,12 +1,11 @@ package org.jcnc.jnotepad.ui; import javafx.beans.property.StringProperty; +import javafx.scene.control.ScrollPane; import javafx.scene.control.TextArea; import javafx.scene.layout.BorderPane; -import org.jcnc.jnotepad.app.config.AppConfig; import org.jcnc.jnotepad.controller.config.AppConfigController; import org.jcnc.jnotepad.tool.LogUtil; -import org.jcnc.jnotepad.ui.menu.JNotepadMenuBar; import org.jcnc.jnotepad.ui.status.JNotepadStatusBox; import org.jcnc.jnotepad.ui.tab.JNotepadTab; import org.jcnc.jnotepad.ui.tab.JNotepadTabPane; @@ -27,16 +26,24 @@ public class LineNumberTextArea extends BorderPane { private final TextArea mainTextArea; private final TextArea lineNumberArea; + private boolean needToUpdateLineNumbers = false; + private static final int MIN_LINE_NUMBER_WIDTH = 30; + static final int[] SIZE_TABLE = {9, 99, 999, 9999, 99999, 999999, 9999999, 99999999, 999999999, Integer.MAX_VALUE}; - private static final int MIN_LINE_NUMBER_WIDTH = 30; + private final ScrollPane scrollPane; + + private int cachedNumOfLines = 0; + public LineNumberTextArea() { mainTextArea = new TextArea(); mainTextArea.setWrapText(AppConfigController.getInstance().getAutoLineConfig()); + scrollPane = new ScrollPane(mainTextArea); lineNumberArea = new TextArea(); lineNumberArea.setEditable(false); + lineNumberArea.setPrefWidth(MIN_LINE_NUMBER_WIDTH); lineNumberArea.setMinWidth(MIN_LINE_NUMBER_WIDTH); // 设定自定义样式 @@ -47,14 +54,29 @@ public class LineNumberTextArea extends BorderPane { "-fx-background-color:white" ); + scrollPane.setFitToWidth(true); + scrollPane.viewportBoundsProperty().addListener((observable, oldValue, newValue) -> { + int firstVisibleLine = calculateFirstVisibleLine(); + int lastVisibleLine = calculateLastVisibleLine(); + loadVisibleLines(firstVisibleLine, lastVisibleLine); + + loadVisibleLineNumbers(firstVisibleLine, lastVisibleLine); + + + // 如果标记为需要更新行号,则执行更新行号的操作 + if (needToUpdateLineNumbers) { + updateLineNumberArea(); + needToUpdateLineNumbers = false; // 重置标记 + } + }); + initListeners(); setCenter(mainTextArea); setLeft(lineNumberArea); - - } + private void initListeners() { // 当主要文本区域的垂直滚动位置发生变化时,使行号文本区域的滚动位置保持一致 mainTextArea.scrollTopProperty().addListener((observable, oldValue, newValue) -> lineNumberArea.setScrollTop(mainTextArea.getScrollTop())); @@ -72,6 +94,9 @@ public class LineNumberTextArea extends BorderPane { JNotepadStatusBox.getInstance().updateWordCountStatusLabel(); // 自动保存 save(); + + needToUpdateLineNumbers = true; + }); } @@ -124,10 +149,6 @@ public class LineNumberTextArea extends BorderPane { private void updateLineNumberArea() { - // 保存当前的滚动位置 - /* - 更新行号文本区域的内容,根据主要文本区域的段落数生成行号。 - */ double mainTextAreaScrollTop = mainTextArea.getScrollTop(); double lineNumberAreaScrollTop = lineNumberArea.getScrollTop(); @@ -138,14 +159,65 @@ public class LineNumberTextArea extends BorderPane { } lineNumberArea.setText(lineNumberText.toString()); - // 恢复之前的滚动位置 mainTextArea.setScrollTop(mainTextAreaScrollTop); lineNumberArea.setScrollTop(lineNumberAreaScrollTop); + + if (cachedNumOfLines != numOfLines) { + updateLineNumberWidth(); + cachedNumOfLines = numOfLines; + } + } + + + private int calculateFirstVisibleLine() { + double scrollTop = scrollPane.getVvalue() * mainTextArea.getParagraphs().size(); + return (int) Math.floor(scrollTop); } + private int calculateLastVisibleLine() { + double scrollTop = scrollPane.getVvalue() * mainTextArea.getParagraphs().size(); + double viewportHeight = scrollPane.getViewportBounds().getHeight(); + int lastVisibleLine = (int) Math.floor(scrollTop + viewportHeight / mainTextArea.getHeight()); + return Math.min(lastVisibleLine, mainTextArea.getParagraphs().size() - 1); + } + + + // 加载可见区域的数据到 mainTextArea + private void loadVisibleLines(int firstVisibleLine, int lastVisibleLine) { + StringBuilder visibleText = new StringBuilder(); + String[] lines = mainTextArea.getText().split("\n"); + + for (int i = firstVisibleLine; i <= lastVisibleLine && i < lines.length; i++) { + visibleText.append(lines[i]); + if (i < lastVisibleLine && i < lines.length - 1) { + visibleText.append("\n"); + } + } + + mainTextArea.setText(visibleText.toString()); + } + + // 加载可见区域的行号到 lineNumberArea + private void loadVisibleLineNumbers(int firstVisibleLine, int lastVisibleLine) { + StringBuilder visibleLineNumbers = new StringBuilder(); + + for (int i = firstVisibleLine; i <= lastVisibleLine; i++) { + visibleLineNumbers.append(i + 1).append("\n"); // 添加行号,注意行号从1开始 + } + + lineNumberArea.setText(visibleLineNumbers.toString()); + } + + public TextArea getMainTextArea() { return mainTextArea; } } + + + + + + -- Gitee From 8a192d5800fc8ae8e7d1dcfb164c9de3a2c9b68a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=AE=B8=E8=BD=B2?= Date: Mon, 28 Aug 2023 02:31:29 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=80=A7=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../jcnc/jnotepad/ui/LineNumberTextArea.java | 29 ++++++++++++------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/src/main/java/org/jcnc/jnotepad/ui/LineNumberTextArea.java b/src/main/java/org/jcnc/jnotepad/ui/LineNumberTextArea.java index b2b1c9c..539932c 100644 --- a/src/main/java/org/jcnc/jnotepad/ui/LineNumberTextArea.java +++ b/src/main/java/org/jcnc/jnotepad/ui/LineNumberTextArea.java @@ -14,6 +14,7 @@ import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; import java.io.IOException; +import java.util.List; /** * @author 许轲 @@ -25,7 +26,8 @@ public class LineNumberTextArea extends BorderPane { private boolean isRelevance = false; private final TextArea mainTextArea; private final TextArea lineNumberArea; - + private List paragraphs; // 缓存段落列表 + private String fullLineNumberText; // 缓存完整行号文本 private boolean needToUpdateLineNumbers = false; private static final int MIN_LINE_NUMBER_WIDTH = 30; @@ -37,6 +39,7 @@ public class LineNumberTextArea extends BorderPane { public LineNumberTextArea() { + mainTextArea = new TextArea(); mainTextArea.setWrapText(AppConfigController.getInstance().getAutoLineConfig()); scrollPane = new ScrollPane(mainTextArea); @@ -71,11 +74,20 @@ public class LineNumberTextArea extends BorderPane { }); initListeners(); - + paragraphs = mainTextArea.getParagraphs(); // 缓存段落列表 + generateFullLineNumberText(); // 初始化缓存的行号文本 setCenter(mainTextArea); setLeft(lineNumberArea); } + private void generateFullLineNumberText() { + StringBuilder lineNumberText = new StringBuilder(); + int numOfLines = paragraphs.size(); + for (int i = 1; i <= numOfLines; i++) { + lineNumberText.append(i).append("\n"); + } + fullLineNumberText = lineNumberText.toString(); + } private void initListeners() { // 当主要文本区域的垂直滚动位置发生变化时,使行号文本区域的滚动位置保持一致 @@ -166,6 +178,7 @@ public class LineNumberTextArea extends BorderPane { updateLineNumberWidth(); cachedNumOfLines = numOfLines; } + } @@ -201,8 +214,9 @@ public class LineNumberTextArea extends BorderPane { private void loadVisibleLineNumbers(int firstVisibleLine, int lastVisibleLine) { StringBuilder visibleLineNumbers = new StringBuilder(); + String[] lineNumbers = fullLineNumberText.split("\n"); for (int i = firstVisibleLine; i <= lastVisibleLine; i++) { - visibleLineNumbers.append(i + 1).append("\n"); // 添加行号,注意行号从1开始 + visibleLineNumbers.append(lineNumbers[i]).append("\n"); } lineNumberArea.setText(visibleLineNumbers.toString()); @@ -213,11 +227,4 @@ public class LineNumberTextArea extends BorderPane { return mainTextArea; } -} - - - - - - - +} \ No newline at end of file -- Gitee From e0340028d3fdc8d487d50e6abbe770c9de25a804 Mon Sep 17 00:00:00 2001 From: Luke Date: Mon, 28 Aug 2023 01:33:24 +0000 Subject: [PATCH 3/3] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=96=87=E4=BB=B6=20.ide?= =?UTF-8?q?a?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/codeStyles/codeStyleConfig.xml | 5 ----- .idea/encodings.xml | 7 ------- .idea/fileTemplates/code/JavaDoc Class.java | 7 ------- 3 files changed, 19 deletions(-) delete mode 100644 .idea/codeStyles/codeStyleConfig.xml delete mode 100644 .idea/encodings.xml delete mode 100644 .idea/fileTemplates/code/JavaDoc Class.java diff --git a/.idea/codeStyles/codeStyleConfig.xml b/.idea/codeStyles/codeStyleConfig.xml deleted file mode 100644 index 79ee123..0000000 --- a/.idea/codeStyles/codeStyleConfig.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - \ No newline at end of file diff --git a/.idea/encodings.xml b/.idea/encodings.xml deleted file mode 100644 index 106fade..0000000 --- a/.idea/encodings.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/.idea/fileTemplates/code/JavaDoc Class.java b/.idea/fileTemplates/code/JavaDoc Class.java deleted file mode 100644 index 8c770c8..0000000 --- a/.idea/fileTemplates/code/JavaDoc Class.java +++ /dev/null @@ -1,7 +0,0 @@ -#foreach($param in $RECORD_COMPONENTS) - * @param $param -#end -#foreach($param in $TYPE_PARAMS) - * @param <$param> -#end - * @author $USER -- Gitee