Dave Jarvis' Repositories

git clone https://repo.autonoma.ca/repo/keenwrite.git

'Insert Link' action added LinkDialog is the first "real-world" JavaFX dialog created with a development version of JFormDesigner. And it uses MigPane :) But there is still a long way to go for a final product...

AuthorKarl Tauber <email>
Date2015-08-05 10:12:47 GMT+0200
Commitd6442627e677a80e81ac44e2786936661c51886b
Parent45669c4
Delta168 lines added, 0 lines removed, 168-line increase
src/main/java/org/markdownwriterfx/util/Utils.java
public class Utils
{
+ public static boolean isNullOrEmpty(String s) {
+ return s == null || s.isEmpty();
+ }
+
public static String ltrim(String s) {
int i = 0;
src/main/java/org/markdownwriterfx/dialogs/LinkDialog.jfd
+JFDML JFormDesigner: "9.9.9.9.9999" Java: "1.8.0_51" encoding: "UTF-8"
+
+new FormModel {
+ contentType: "form/javafx"
+ root: new FormRoot {
+ add( new FormContainer( "org.tbee.javafx.scene.layout.fxml.MigPane", new FormLayoutManager( class org.tbee.javafx.scene.layout.fxml.MigPane ) {
+ "$layoutConstraints": ""
+ "$columnConstraints": "[shrink 0,fill][300,grow,fill][fill][fill]"
+ "$rowConstraints": "[][][][]"
+ } ) {
+ name: "pane"
+ add( new FormComponent( "javafx.scene.control.Label" ) {
+ name: "urlLabel"
+ "text": "Link URL:"
+ auxiliary() {
+ "JavaCodeGenerator.variableLocal": true
+ }
+ }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
+ "value": "cell 0 0"
+ } )
+ add( new FormComponent( "org.markdownwriterfx.controls.EscapeTextField" ) {
+ name: "urlField"
+ "escapeCharacters": "()"
+ "text": "http://yourlink.com"
+ "promptText": "http://yourlink.com"
+ }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
+ "value": "cell 1 0"
+ } )
+ add( new FormComponent( "org.markdownwriterfx.controls.BrowseDirectoryButton" ) {
+ name: "linkBrowseDirectoyButton"
+ }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
+ "value": "cell 2 0"
+ } )
+ add( new FormComponent( "org.markdownwriterfx.controls.BrowseFileButton" ) {
+ name: "linkBrowseFileButton"
+ }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
+ "value": "cell 3 0"
+ } )
+ add( new FormComponent( "javafx.scene.control.Label" ) {
+ name: "textLabel"
+ "text": "Link Text:"
+ auxiliary() {
+ "JavaCodeGenerator.variableLocal": true
+ }
+ }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
+ "value": "cell 0 1"
+ } )
+ add( new FormComponent( "org.markdownwriterfx.controls.EscapeTextField" ) {
+ name: "textField"
+ "escapeCharacters": "[]"
+ }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
+ "value": "cell 1 1 3 1"
+ } )
+ add( new FormComponent( "javafx.scene.control.Label" ) {
+ name: "titleLabel"
+ "text": "Title (tooltip):"
+ auxiliary() {
+ "JavaCodeGenerator.variableLocal": true
+ }
+ }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
+ "value": "cell 0 2"
+ } )
+ add( new FormComponent( "org.markdownwriterfx.controls.EscapeTextField" ) {
+ name: "titleField"
+ }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
+ "value": "cell 1 2 3 1"
+ } )
+ add( new FormComponent( "javafx.scene.control.Label" ) {
+ name: "previewLabel"
+ "text": "Markdown Preview:"
+ auxiliary() {
+ "JavaCodeGenerator.variableLocal": true
+ }
+ }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
+ "value": "cell 0 3"
+ } )
+ add( new FormComponent( "javafx.scene.control.Label" ) {
+ name: "previewField"
+ }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
+ "value": "cell 1 3 3 1"
+ } )
+ }, new FormLayoutConstraints( null ) {
+ "location": new javafx.geometry.Point2D( 0.0, 0.0 )
+ "size": new javafx.geometry.Dimension2D( 500.0, 300.0 )
+ } )
+ }
+}
src/main/java/org/markdownwriterfx/controls/EscapeTextField.java
+/*
+ * Copyright (c) 2015 Karl Tauber <karl at jformdesigner dot com>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * o Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * o Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * 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 THE COPYRIGHT
+ * HOLDER OR CONTRIBUTORS 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 org.markdownwriterfx.controls;
+
+import javafx.beans.property.SimpleStringProperty;
+import javafx.beans.property.StringProperty;
+import javafx.scene.control.TextField;
+import javafx.util.StringConverter;
+import org.markdownwriterfx.util.Utils;
+
+/**
+ * TextField that can escape/unescape characters for markdown.
+ *
+ * @author Karl Tauber
+ */
+public class EscapeTextField
+ extends TextField
+{
+ public EscapeTextField() {
+ escapedText.bindBidirectional(textProperty(), new StringConverter<String>() {
+ @Override public String toString(String object) { return escape(object); }
+ @Override public String fromString(String string) { return unescape(string); }
+ });
+ escapeCharacters.addListener(e -> escapedText.set(escape(textProperty().get())));
+ }
+
+ // 'escapedText' property
+ private final StringProperty escapedText = new SimpleStringProperty();
+ public String getEscapedText() { return escapedText.get(); }
+ public void setEscapedText(String escapedText) { this.escapedText.set(escapedText); }
+ public StringProperty escapedTextProperty() { return escapedText; }
+
+ // 'escapeCharacters' property
+ private final StringProperty escapeCharacters = new SimpleStringProperty();
+ public String getEscapeCharacters() { return escapeCharacters.get(); }
+ public void setEscapeCharacters(String escapeCharacters) { this.escapeCharacters.set(escapeCharacters); }
+ public StringProperty escapeCharactersProperty() { return escapeCharacters; }
+
+ private String escape(String s) {
+ String escapeChars = getEscapeCharacters();
+ return !Utils.isNullOrEmpty(escapeChars)
+ ? s.replaceAll("([" + escapeChars.replaceAll("(.)", "\\\\$1") + "])", "\\\\$1")
+ : s;
+ }
+
+ private String unescape(String s) {
+ String escapeChars = getEscapeCharacters();
+ return !Utils.isNullOrEmpty(escapeChars)
+ ? s.replaceAll("\\\\([" + escapeChars.replaceAll("(.)", "\\\\$1") + "])", "$1")
+ : s;
+ }
+}