From bb9a816dc9a29e75129cfe6545d6bc9a5224a47c Mon Sep 17 00:00:00 2001 From: Omar JERIDI Date: Fri, 12 May 2023 22:40:54 +0200 Subject: [PATCH] Add Interview font size management #98 --- .../Controllers/InterviewTextController.java | 12 ++- .../Controllers/RichTextAreaController.java | 29 ++++++- .../Controllers/PoliceSizeController.java | 77 ++++++++++++++++++ .../images/decrease-font-disabled.png | Bin 0 -> 779 bytes src/main/resources/images/decrease-font.png | Bin 0 -> 624 bytes .../images/increase-font-disabled.png | Bin 0 -> 922 bytes src/main/resources/images/increase-font.png | Bin 0 -> 722 bytes 7 files changed, 115 insertions(+), 3 deletions(-) create mode 100644 src/main/java/components/interviewPanel/ToolBar/tools/Controllers/PoliceSizeController.java create mode 100644 src/main/resources/images/decrease-font-disabled.png create mode 100644 src/main/resources/images/decrease-font.png create mode 100644 src/main/resources/images/increase-font-disabled.png create mode 100644 src/main/resources/images/increase-font.png diff --git a/src/main/java/components/interviewPanel/Controllers/InterviewTextController.java b/src/main/java/components/interviewPanel/Controllers/InterviewTextController.java index 1fe6cdd7..77a8046a 100644 --- a/src/main/java/components/interviewPanel/Controllers/InterviewTextController.java +++ b/src/main/java/components/interviewPanel/Controllers/InterviewTextController.java @@ -12,6 +12,7 @@ import javafx.beans.InvalidationListener; import javafx.beans.property.BooleanProperty; import javafx.beans.property.SimpleBooleanProperty; +import javafx.beans.property.SimpleIntegerProperty; import javafx.beans.value.ChangeListener; import javafx.beans.value.ObservableValue; import javafx.fxml.FXML; @@ -56,9 +57,12 @@ public class InterviewTextController implements Initializable { private InterviewTextCommandFactory interviewTextCommandFactory; private RichTextAreaController richTextAreaController; private SearchToolController searchToolController; + private PoliceSizeController increaseSizeController; + private PoliceSizeController decreaseSizeController; private final Interview interview; private Pane paneDragText; private SimpleBooleanProperty isSearchClicked; + private SimpleIntegerProperty fontSize; private InterviewTextController(Interview interview) { this.interview = interview; @@ -87,7 +91,9 @@ public void initialize(URL location, ResourceBundle resources) { annotationColorList.add(new AnnotationColor("blue", "#7084B0")); annotationColorList.add(new AnnotationColor("green", "#7BCF7B")); this.isSearchClicked = new SimpleBooleanProperty(false); - richTextAreaController = new RichTextAreaController(interview.getInterviewText(), annotationColorList, isSearchClicked); + this.fontSize = new SimpleIntegerProperty(1); + richTextAreaController = new RichTextAreaController(interview.getInterviewText(), annotationColorList, + isSearchClicked, fontSize); stackPaneInterview.getChildren().add(richTextAreaController.getNode()); @@ -115,6 +121,10 @@ public void initialize(URL location, ResourceBundle resources) { toolBarController.setSelectedToolProperty(selectionToolController); hboxAnnotation.getChildren().add(toolBarController); searchToolController = new SearchToolController(hboxAnnotation.getChildren(), isSearchClicked); + this.increaseSizeController = new PoliceSizeController( + hboxAnnotation.getChildren(), fontSize, PoliceSizeController.FontAction.INCREASE); + this.increaseSizeController = new PoliceSizeController( + hboxAnnotation.getChildren(), fontSize, PoliceSizeController.FontAction.DECREASE); // On click release on text area: add a pane over the text area richTextAreaController.getUserSelection().addListener((change) -> toolBarController.getSelectedToolProperty().get() diff --git a/src/main/java/components/interviewPanel/Controllers/RichTextAreaController.java b/src/main/java/components/interviewPanel/Controllers/RichTextAreaController.java index 4a12b2e0..f4a413d3 100644 --- a/src/main/java/components/interviewPanel/Controllers/RichTextAreaController.java +++ b/src/main/java/components/interviewPanel/Controllers/RichTextAreaController.java @@ -2,11 +2,13 @@ import application.configuration.Configuration; import components.interviewPanel.ContextMenus.ContextMenuFactory; +import components.interviewPanel.ToolBar.tools.Controllers.PoliceSizeController; import components.interviewPanel.search.ButtonSearchType; import components.interviewPanel.search.SearchButtonHandler; import javafx.application.Platform; import javafx.beans.binding.Bindings; import javafx.beans.property.SimpleBooleanProperty; +import javafx.beans.property.SimpleIntegerProperty; import javafx.beans.property.SimpleObjectProperty; import javafx.beans.value.ChangeListener; import javafx.collections.ListChangeListener; @@ -32,6 +34,8 @@ import java.util.HashSet; import java.util.List; import java.util.Objects; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import static utils.GlobalVariables.getGlobalVariables; @@ -46,12 +50,16 @@ public class RichTextAreaController { private final List annotationColorList; private SearchResult searchResult; private SimpleBooleanProperty isSearchClicked; + private SimpleIntegerProperty fontSize; - public RichTextAreaController(InterviewText interviewText, List annotationColorList, SimpleBooleanProperty isSearchClicked) { + + public RichTextAreaController(InterviewText interviewText, List annotationColorList, + SimpleBooleanProperty isSearchClicked, SimpleIntegerProperty fontSize) { this.interviewText = interviewText; this.annotationColorList = annotationColorList; this.isSearchClicked = isSearchClicked; userSelection = new SimpleObjectProperty<>(); + this.fontSize = fontSize; area = new InlineCssTextArea(); area.setWrapText(true); area.setEditable(false); @@ -80,6 +88,23 @@ public RichTextAreaController(InterviewText interviewText, List showFindDialog(area); } }); + this.fontSize.addListener((obs, oldValue, newValue) -> { + String currentStyle = this.area.getStyle(); + + // Extract the font size from the style using regular expressions + Pattern pattern = Pattern.compile("-fx-font-size: (\\d+)em;"); + Matcher matcher = pattern.matcher(currentStyle); + if (matcher.find()) { + // Extract the font size as an integer + int currentFontSize = newValue.intValue(); + // Update the style with the new font size + String newStyle = currentStyle.replaceAll("-fx-font-size: \\d+em;", "-fx-font-size: " + currentFontSize + "em;"); + this.area.setStyle(newStyle); + } else { + // If the pattern doesn't match, set the font size to the default value (12 px in this example) + this.area.setStyle(currentStyle+"\n-fx-font-size: "+this.fontSize.get()+"em;\n"); + } + }); } @@ -140,7 +165,7 @@ private void showFindDialog(InlineCssTextArea richTextArea) { s += resultCount + " "; s += Configuration.langBundle.getString("matches_found"); return s; - }, this.searchResult.resultCountProperty(),this.searchResult.getCurrentSearchIndexProperty())); + }, this.searchResult.resultCountProperty(), this.searchResult.getCurrentSearchIndexProperty())); } else { this.searchResult.resetSearch(); matchCountLabel.setVisible(false); diff --git a/src/main/java/components/interviewPanel/ToolBar/tools/Controllers/PoliceSizeController.java b/src/main/java/components/interviewPanel/ToolBar/tools/Controllers/PoliceSizeController.java new file mode 100644 index 00000000..26d24403 --- /dev/null +++ b/src/main/java/components/interviewPanel/ToolBar/tools/Controllers/PoliceSizeController.java @@ -0,0 +1,77 @@ +package components.interviewPanel.ToolBar.tools.Controllers; + +import javafx.beans.property.SimpleBooleanProperty; +import javafx.beans.property.SimpleIntegerProperty; +import javafx.collections.ObservableList; +import javafx.geometry.Insets; +import javafx.geometry.Pos; +import javafx.scene.Node; +import javafx.scene.canvas.Canvas; +import javafx.scene.canvas.GraphicsContext; +import javafx.scene.image.Image; +import javafx.scene.layout.VBox; +import javafx.scene.paint.Color; + +public class PoliceSizeController { + final String increaseIcon = "/images/increase-font.png"; + final String decreaseIcon = "/images/decrease-font.png"; + final String increaseIconDisabled = "/images/increase-font-disabled.png"; + final String decreaseIconDisabled = "/images/decrease-font-disabled.png"; + private VBox vbox; + private Canvas canvas; + private GraphicsContext gc; + private SimpleIntegerProperty fontSize; + private ObservableList hboxChildrens; + private FontAction fontAction; + + public enum FontAction { + INCREASE, + DECREASE + } + + public PoliceSizeController(ObservableList hboxChildrens, SimpleIntegerProperty fontSize, FontAction fontAction) { + this.hboxChildrens = hboxChildrens; + vbox = new VBox(); + canvas = new Canvas(35, 35); + this.fontAction = fontAction; + this.fontSize = fontSize; + this.initGraphic(); + } + + public void initGraphic() { + vbox.setAlignment(Pos.CENTER); + vbox.setPadding(new Insets(3)); + gc = canvas.getGraphicsContext2D(); + vbox.getChildren().add(canvas); + gc.setFill(Color.TRANSPARENT); + gc.fillRect(0, 0, 35, 35); + if (this.fontAction.equals(FontAction.INCREASE)) { + gc.drawImage(new Image(increaseIcon), 0, 0, 35, 35); + } else { + gc.drawImage(new Image(decreaseIconDisabled), 0, 0, 35, 35); + } + + vbox.setOnMouseClicked( + (e) -> { + if (this.fontAction.equals(FontAction.INCREASE)) { + fontSize.set(fontSize.get() + 1); + } else { + if (fontSize.get() > 1) { + fontSize.set(fontSize.get() - 1); + } + + } + }); + this.fontSize.addListener((obs, oldValue, newValue) -> { + if (this.fontAction.equals(FontAction.DECREASE)) { + if (newValue.intValue() <= 1) { + this.gc.drawImage(new Image(decreaseIconDisabled), 0, 0, 35, 35); + }else{ + this.gc.drawImage(new Image(decreaseIcon), 0, 0, 35, 35); + } + } + }); + hboxChildrens.add(vbox); + } + +} diff --git a/src/main/resources/images/decrease-font-disabled.png b/src/main/resources/images/decrease-font-disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..19781d929e0192f9ef0b343b99f425bf1e6b15fa GIT binary patch literal 779 zcmV+m1N8ifP)Lil`CgAS;D$=v%A^5dn5OQ zsqVRF&VQaW<6K5YMn*JS4u{6O@N=`{du=oQ1V=@h^iR!W2sbH;T8i* zKDC6D#fThtX{X@*-Z&9u1BPAN5#aWGLIn7us#{%J866#6rR3*%SEOS7F0CkVra=+G z-b7Kf)TI#xXbk$7aaInyv>_rp1emUK9;O7iWn9IBE^R1z)i~HURCSN>?T3i0cWJ?U zzg&U$^#)6FcW9%)q#@>#OA8A07-wLz+J@{mw%3a&ik7%Epun&p|JlQUlBRk(UOq@CrpQ`J6rA7d%sf2FUG389U2;1)>a`gQR~D)`&ROvHAw~X zNa9)Gj9px4|0EB_T*ZU!Q4v!(2!*$?e179X`wtaI1>PlIG7{jWFL(4I0F#6LoAzw?Ji&L&R$|99d#*8NCvcZdI@p=54o(>VQ8&(sTuJpV@91JvAh3 ztsw3dU{{E{30xv#q$Qws_)3{EOj0)%Zh^{%B8dOcAS6SCqzsL>n-RoU9miibT1G#G zBy&+E(7U!kch=f_pS^C9bk$W?9haG{QSuWbE7MJZgK3&RklYV4;BzC> zsEPC>WtWINX5^R)0-R0CE+czghza|}%oZnQRhp)Al)Rh)B-qj>RBJ zzLk_ks=CQ3p#!SAA(}1HlCsFiQ&AAJRbh+*m!dGLPnY2&e?)+i~*0ae^{vRA4yE|T5s=76Es`DD~t=BTLc7Pc0QO7~T?Gf1AF_2KZ zp@xe9QQ*Cffhe%22#86LpG9QRe}VwjmhLf1UMvb^97beE?#V_WRJRlf(Xp11k!PGT zc;7@`%w^=e9t_E~ZG)&(DvySmjRmWUJe$||AnrYaJlC>+=aa?A(MF@O zuq_}4eC3qYu9p3a^vtqW-fS5{RiAN!%(%|xQ8>j7_}&3w%OIgfodBP<9N?cg`@O6H zcq+H^dcD5DfSW}$3;;Yi%XWMyw{sPF!&`&_G%2PdlPdXRqtSRUuVWP1Ne_Si%(CcT zZQ7~VP#ZUqjqL{Ux-2%4mCu@X>b5w6OG$@hz{gHj#%i_NvZfqX$(P3eDgeIwmys88 wr8uKVu2g=;WX|2-?z2b*{Ale{x9cz>-)a{ z+3TFW*LR?zqQVEWfllCBi1q;kXb`Rdflvz#z(k-g#>i&_7!kgnA}8(SR@+V z3oH=tcTpmai$-VIm}eqpIwfEv@Fk+bdo^*pgpq@kfX$-8Z8dRIfWHxOAAlj$nY$6q z{RSrVi@hUEucMC46pdXDiQg*XucoMb8|ZfEgF~XR){ywI;-2ycn3S+?VC96t!25`% zzKR=Nr!e194>`(B#|5bO60Bb)*8c*UYht@n7`c_kM3ep0qmnJL$5d&0UtdL45r2y*`Fu* zhL|s*G3sL?69DgkL0J>u@H|Oxi@7Rmvm{jmHKT>@eaIz9JeSgh`N2i z__PUE+P?~V`sqp5OPrATz=M#wJ@$WkXE(=+iV7N^f4733p2k$@MF0Q*07*qoM6N<$ Eg0X8&bpQYW literal 0 HcmV?d00001