diff --git a/rta/src/main/java/com/gluonhq/richtextarea/action/ActionFactory.java b/rta/src/main/java/com/gluonhq/richtextarea/action/ActionFactory.java index f125c1f..547a049 100644 --- a/rta/src/main/java/com/gluonhq/richtextarea/action/ActionFactory.java +++ b/rta/src/main/java/com/gluonhq/richtextarea/action/ActionFactory.java @@ -136,6 +136,14 @@ public Action removeExtremesAndDecorate(Selection selection, Decoration decorati return new BasicAction(control, action -> ACTION_CMD_FACTORY.removeExtremesAndDecorate(selection, decoration)); } + public Action insertText(String text) { + return new BasicAction(control, action -> ACTION_CMD_FACTORY.insertText(text)); + } + + public Action selectAndInsertText(Selection selection, String text) { + return new BasicAction(control, action -> ACTION_CMD_FACTORY.selectAndInsertText(selection, text)); + } + public Action insertEmoji(Emoji emoji) { return new BasicAction(control, action -> ACTION_CMD_FACTORY.insertEmoji(emoji)); } diff --git a/rta/src/main/java/com/gluonhq/richtextarea/viewmodel/ActionCmdFactory.java b/rta/src/main/java/com/gluonhq/richtextarea/viewmodel/ActionCmdFactory.java index 800534b..2c277ca 100644 --- a/rta/src/main/java/com/gluonhq/richtextarea/viewmodel/ActionCmdFactory.java +++ b/rta/src/main/java/com/gluonhq/richtextarea/viewmodel/ActionCmdFactory.java @@ -99,6 +99,9 @@ public ActionCmd removeExtremesAndDecorate(Selection selection, Decoration decor return new ActionCmdRemoveExtremesAndDecorate(selection, decoration); } + public ActionCmd selectAndInsertText(Selection selection, String text) { + return new ActionCmdSelectAndInsertText(text, selection); + } public ActionCmd insertText(String text) { return new ActionCmdInsertText(text); } diff --git a/rta/src/main/java/com/gluonhq/richtextarea/viewmodel/ActionCmdSelectAndInsertText.java b/rta/src/main/java/com/gluonhq/richtextarea/viewmodel/ActionCmdSelectAndInsertText.java new file mode 100644 index 0000000..327bae5 --- /dev/null +++ b/rta/src/main/java/com/gluonhq/richtextarea/viewmodel/ActionCmdSelectAndInsertText.java @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2024, Gluon + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL GLUON BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package com.gluonhq.richtextarea.viewmodel; + +import com.gluonhq.richtextarea.Selection; +import javafx.beans.binding.BooleanBinding; + +import java.util.Objects; + +class ActionCmdSelectAndInsertText implements ActionCmd { + + private final String content; + private final Selection selection; + + public ActionCmdSelectAndInsertText(String content, Selection selection) { + this.content = content; + this.selection = selection; + } + + @Override + public void apply(RichTextAreaViewModel viewModel) { + if (Objects.requireNonNull(viewModel).isEditable() && content != null) { + if (selection != null) { + viewModel.getCommandManager().execute(new SelectAndReplaceCmd( + viewModel.getTextBuffer().getInternalSelection(selection), content)); + } else { + viewModel.getCommandManager().execute(new InsertCmd(content)); + } + } + } + + @Override + public BooleanBinding getDisabledBinding(RichTextAreaViewModel viewModel) { + return viewModel.editableProperty().not(); + } +}