de.chaosfisch.uploader.gui.renderer.TagTextArea.java Source code

Java tutorial

Introduction

Here is the source code for de.chaosfisch.uploader.gui.renderer.TagTextArea.java

Source

/*
 * Copyright (c) 2014 Dennis Fischer.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the GNU Public License v3.0+
 * which accompanies this distribution, and is available at
 * http://www.gnu.org/licenses/gpl.html
 *
 * Contributors: Dennis Fischer
 */

package de.chaosfisch.uploader.gui.renderer;

import com.google.common.base.Splitter;
import com.google.inject.Inject;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.event.EventHandler;
import javafx.scene.control.TextArea;
import javafx.scene.layout.StackPane;
import javafx.scene.web.WebEvent;
import javafx.scene.web.WebView;
import org.apache.commons.configuration.Configuration;

public class TagTextArea extends StackPane {

    public static final String OLD_TAG_INPUT = "old_tags";
    private final SimpleStringProperty tags = new SimpleStringProperty();
    private final WebView webView = new WebView();
    private final boolean useOldTags;

    @Inject
    public TagTextArea(final Configuration configuration) {
        useOldTags = configuration.getBoolean(OLD_TAG_INPUT, false);
        if (useOldTags) {
            initTextArea();
        } else {
            initPicker(webView);
        }
    }

    private void initTextArea() {
        final TextArea textArea = new TextArea();
        textArea.setWrapText(true);
        textArea.textProperty().bindBidirectional(tags);
        getChildren().add(textArea);
    }

    public void setTags(final String tags) {
        this.tags.set(tags);
        if (!useOldTags) {
            webView.getEngine().getLoadWorker().runningProperty().addListener(new ChangeListener<Boolean>() {
                @Override
                public void changed(final ObservableValue<? extends Boolean> observableValue,
                        final Boolean oldValue, final Boolean newValue) {
                    if (!newValue) {
                        _createTags(tags);
                    }
                }
            });
            if (!webView.getEngine().getLoadWorker().isRunning()) {
                _createTags(tags);
            }
        }
    }

    private void _createTags(final String tags) {
        webView.getEngine().executeScript("$(document).ready(function() { $('#myTags').tagit('removeAll'); });");
        final Iterable<String> tagIterator = Splitter.on(",").omitEmptyStrings().split(tags);
        for (final String tag : tagIterator) {
            webView.getEngine()
                    .executeScript(String.format(
                            "$(document).ready(function() { $('#myTags').tagit('createTag', \"%s\"); });",
                            tag.replace("\"", "\\\"")));
        }
    }

    public String getTags() {
        return tags.get();
    }

    public SimpleStringProperty tagsProperty() {
        return tags;
    }

    // initialize the date picker.
    private void initPicker(final WebView webView) {
        webView.getEngine().loadContent(getInlineHtml());
        webView.setContextMenuEnabled(false);
        webView.getEngine().setOnAlert(new EventHandler<WebEvent<String>>() {
            @Override
            public void handle(final WebEvent<String> event) {
                tags.set(event.getData());
            }
        });

        getChildren().add(webView);
    }

    // return an inline html template based upon the provided initialization parameters.
    private String getInlineHtml() {
        return "<!DOCTYPE html>\n" + "<html lang=\"en\">\n" + "\t<head>\n" + "\t\t<meta charset=\"utf-8\">\n"
                + "\t\t<script src=\"http://ajax.googleapis.com/ajax/libs/jquery/1.5.2/jquery.min.js\" type=\"text/javascript\" charset=\"utf-8\"></script>\n"
                + "\t\t<script src=\"https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.12/jquery-ui.min.js\" type=\"text/javascript\" charset=\"utf-8\"></script>\n"
                + "\t\t<script src=\"http://aehlke.github.io/tag-it/js/tag-it.js\" type=\"text/javascript\" charset=\"utf-8\"></script>\n"
                + "\t\t<link href=\"http://aehlke.github.io/tag-it/css/jquery.tagit.css\" rel=\"stylesheet\" type=\"text/css\">\n"
                + "\t\t<link rel=\"stylesheet\" type=\"text/css\" href=\"http://code.jquery.com/ui/1.10.3/themes/smoothness/jquery-ui.css\">\n"
                + "\t\t<script type=\"text/javascript\">\n" + "\t\t\t$(document).ready(function() {\n"
                + "\t\t\t\t$(\"#myTags\").tagit({\n" + "\t\t\t\t\tremoveConfirmation: true,\n"
                + "\t\t\t\t\tallowSpaces: true,\n" + "\t\t\t\t\tsingleField: true,\n"
                + "\t\t\t\t\tsingleFieldDelimiter: \",\",\n" + "\t\t\t\t\tsingleFieldNode: \"#node\",\n"
                + "\t\t\t\t\tafterTagAdded: function(event, ui) {\n"
                + "\t\t\t\t\t\talert($(\"#myTags\").tagit(\"assignedTags\"));\n" + "\t\t\t\t\t},\n"
                + "\t\t\t\t\tafterTagRemoved: function(event, ui) {\n"
                + "\t\t\t\t\t\talert($(\"#myTags\").tagit(\"assignedTags\"));\n" + "\t\t\t\t\t}\n" + "\t\t\t\t});\n"
                + "\t\t\t});\n" + "\t\t</script>\n" + "\t\t<style type=\"text/css\">\n" + "\t\t\tul, html, body {\n"
                + "\t\t\t\toverflow: hidden;\t\n" + "    \t\t\t\tmargin: 0;\n" + "    \t\t\t\theight: 100%;\n"
                + "\t\t\t}\n" + "\t\t\t.ui-corner-all {\n" + "\t\t\t\tborder-radius: 0px;\n" + "\t\t\t}\n"
                + "\t\t\t.ui-widget {\n" + "    \t\t\t\tfont-family: Verdana,Arial,sans-serif;\n"
                + "    \t\t\t\tfont-size: 8pt;\n" + "\t\t\t}\n" + "\t\t</style>\n" + "\t</head>\n" + "\t<body>\n"
                + "\t\t<ul id=\"myTags\"></ul>\n" + "\t\t<input type=\"hidden\" id=\"node\" />\n" + "\t</body>\n"
                + "</html>";
    }
}