All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.bidib.wizard.mvc.script.view.NodeScriptView Maven / Gradle / Ivy

There is a newer version: 2.0.0-M1
Show newest version
package org.bidib.wizard.mvc.script.view;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.KeyStroke;
import javax.swing.filechooser.FileFilter;

import org.apache.commons.io.FilenameUtils;
import org.bidib.wizard.dialog.FileDialog;
import org.bidib.wizard.highlight.BidibScriptScanner;
import org.bidib.wizard.highlight.Scanner;
import org.bidib.wizard.highlight.SyntaxHighlighter;
import org.bidib.wizard.highlight.TextLineNumber;
import org.bidib.wizard.highlight.TokenTypes;
import org.bidib.wizard.locale.Resources;
import org.bidib.wizard.mvc.script.controller.listener.ExecuteScriptListener;
import org.bidib.wizard.mvc.script.model.NodeScriptModel;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.jgoodies.binding.adapter.BasicComponentFactory;
import com.jgoodies.binding.beans.PropertyAdapter;
import com.jgoodies.binding.beans.PropertyConnector;
import com.jgoodies.binding.value.ConverterValueModel;
import com.jgoodies.binding.value.ValueModel;
import com.jgoodies.forms.builder.ButtonBarBuilder;
import com.jgoodies.forms.builder.DefaultFormBuilder;
import com.jgoodies.forms.debug.FormDebugPanel;
import com.jgoodies.forms.factories.Borders;
import com.jgoodies.forms.layout.FormLayout;
import com.vlsolutions.swing.docking.DockKey;
import com.vlsolutions.swing.docking.Dockable;

public class NodeScriptView implements Dockable {
    private static final Logger LOGGER = LoggerFactory.getLogger(NodeScriptView.class);

    public static final String NODE_SCRIPT_VIEW = "NodeScriptView";

    private static final String SUFFIX_NODESCRIPT = "nodescript";

    public final DockKey DOCKKEY = new DockKey(NODE_SCRIPT_VIEW);

    private final JPanel contentPanel;

    private static final String ENCODED_DIALOG_COLUMN_SPECS = "pref, 3dlu, fill:50dlu:grow, 3dlu, pref";

    private ValueModel selectedFileValueModel;

    private ValueModel selectedNodeValueModel;

    private final JButton selectNodeScriptButton = new JButton(Resources.getString(getClass(), "select-nodescript"));

    private final JButton saveNodeScriptButton = new JButton(Resources.getString(getClass(), "save-nodescript"));

    private final JButton applyOnNodeButton = new JButton(Resources.getString(getClass(), "apply-on-node"));

    private SyntaxHighlighter highlighter;

    private TextLineNumber tln;

    private JScrollPane scrollPane;

    private final NodeScriptModel nodeScriptModel;

    private ExecuteScriptListener executeScriptListener;

    private final FileFilter ff = new FileFilter() {

        @Override
        public boolean accept(File file) {
            boolean result = false;

            if (file != null) {
                if (file.isDirectory()) {
                    result = true;
                }
                else if (FilenameUtils.wildcardMatch(file.getName(), "*." + SUFFIX_NODESCRIPT)) {
                    result = true;
                }
            }
            return result;
        }

        @Override
        public String getDescription() {
            return Resources.getString(NodeScriptView.class, "filter") + " (*." + SUFFIX_NODESCRIPT + ")";
        }
    };

    /**
     * @param nodeScriptModel
     *            the nodeScript model
     */
    public NodeScriptView(NodeScriptModel nodeScriptModel) {
        this.nodeScriptModel = nodeScriptModel;

        DOCKKEY.setName(Resources.getString(getClass(), "title"));
        DOCKKEY.setFloatEnabled(true);
        DOCKKEY.setAutoHideEnabled(false);

        LOGGER.info("Create new BoosterTableView");

        DefaultFormBuilder dialogBuilder = null;
        boolean debugDialog = false;
        if (debugDialog) {
            JPanel panel = new FormDebugPanel();
            dialogBuilder = new DefaultFormBuilder(new FormLayout(ENCODED_DIALOG_COLUMN_SPECS), panel);
        }
        else {
            JPanel panel = new JPanel(new BorderLayout());
            dialogBuilder = new DefaultFormBuilder(new FormLayout(ENCODED_DIALOG_COLUMN_SPECS), panel);
        }
        dialogBuilder.border(Borders.DIALOG);

        selectedFileValueModel =
            new PropertyAdapter(nodeScriptModel, NodeScriptModel.PROPERTYNAME_NODE_SCRIPT_NAME, true);
        JTextField selectedFileText = BasicComponentFactory.createTextField(selectedFileValueModel, true);
        selectedFileText.setEditable(false);
        dialogBuilder.append(Resources.getString(getClass(), "scriptFile"), selectedFileText);

        // prepare the select and save button
        JPanel nodeScriptActionButtons =
            new ButtonBarBuilder().addButton(selectNodeScriptButton).addGlue().addButton(saveNodeScriptButton).build();
        dialogBuilder.append(nodeScriptActionButtons);

        selectNodeScriptButton.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                selectNodeScript();
            }
        });

        // saveNodeScriptButton.setMnemonic(KeyEvent.VK_S);
        saveNodeScriptButton.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                saveNodeScript();
            }
        });

        Scanner scanner = new BidibScriptScanner();

        highlighter = new SyntaxHighlighter(24, 80, scanner);
        highlighter.changeStyle(TokenTypes.KEYWORD2, Color.green.darker().darker().darker());
        scrollPane = new JScrollPane();
        scrollPane.setViewportView(highlighter);
        tln = new TextLineNumber(highlighter);
        scrollPane.setRowHeaderView(tln);

        dialogBuilder.appendRow("3dlu");
        dialogBuilder.appendRow("fill:300px:grow");
        dialogBuilder.nextLine(2);

        dialogBuilder.append(scrollPane, 5);

        dialogBuilder.appendRow("3dlu");
        dialogBuilder.appendRow("p");
        dialogBuilder.nextLine(2);

        selectedNodeValueModel =
            new PropertyAdapter(nodeScriptModel, NodeScriptModel.PROPERTYNAME_SELECTED_NODE, true);
        ValueModel valueConverterModel = new ConverterValueModel(selectedNodeValueModel, new NodeConverter());

        JTextField selectedNodeText = BasicComponentFactory.createTextField(valueConverterModel, true);
        selectedFileText.setEditable(false);
        dialogBuilder.append(Resources.getString(getClass(), "selectedNode"), selectedNodeText);

        // prepare the select and save button
        applyOnNodeButton.setEnabled(false);
        JPanel nodeActionButtons = new ButtonBarBuilder().addButton(applyOnNodeButton).build();
        dialogBuilder.append(nodeActionButtons);

        // applyOnNodeButton.setMnemonic(KeyEvent.VK_A);
        applyOnNodeButton.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                applyOnNode();
            }
        });

        // create the content panel
        contentPanel = new JPanel();
        contentPanel.setLayout(new BorderLayout());

        JScrollPane scrollPane = new JScrollPane(dialogBuilder.build());
        contentPanel.add(scrollPane, BorderLayout.CENTER);

        // add bindings for enable/disable the write button
        PropertyConnector.connect(nodeScriptModel, NodeScriptModel.PROPERTYNAME_CAN_EXECUTE_SCRIPT, applyOnNodeButton,
            "enabled");

        final Action selectNodeScriptAction = new AbstractAction() {
            private static final long serialVersionUID = 1L;

            @Override
            public void actionPerformed(ActionEvent e) {
                LOGGER.warn("Abstract selectNodeScriptAction was performed.");
                selectNodeScript();
            }
        };

        contentPanel.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(
            KeyStroke.getKeyStroke(KeyEvent.VK_O, ActionEvent.CTRL_MASK), "selectNodeScript");
        contentPanel.getActionMap().put("selectNodeScript", selectNodeScriptAction);

        // TODO register keys
        // KeyStroke OPEN = KeyStroke.getKeyStroke(KeyEvent.VK_O, ActionEvent.CTRL_MASK);
        // getRootPane().getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(OPEN, "OPEN");
        // getRootPane().getActionMap().put("OPEN", selectNodeScriptAction);
        // table.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(OPEN, "OPEN");
        // table.getActionMap().put("OPEN", selectNodeScriptAction);

    }

    /**
     * @param executeScriptListener
     *            the executeScriptListener to set
     */
    public void setExecuteScriptListener(ExecuteScriptListener executeScriptListener) {
        this.executeScriptListener = executeScriptListener;
    }

    @Override
    public DockKey getDockKey() {
        return DOCKKEY;
    }

    @Override
    public Component getComponent() {
        return contentPanel;
    }

    private void selectNodeScript() {

        final FileDialog dialog = new FileDialog(
            contentPanel, FileDialog.OPEN, null, ff) {
            @Override
            public void approve(String selectedFile) {
                File file = new File(selectedFile);

                selectedFile = file.getName();

                try {
                    nodeScriptModel.setNodeScriptName(null);
                    loadScript(file);
                    nodeScriptModel.setNodeScriptName(file.toString());
                }
                catch (IOException ex) {
                    LOGGER.warn("Load nodeScript from file failed.", ex);
                    // TODO I18N
                    JOptionPane.showMessageDialog(contentPanel, "Load nodeScript from file failed.", "Load nodescript",
                        JOptionPane.ERROR_MESSAGE);
                }
            }
        };
        dialog.showDialog();
    }

    private void loadScript(File nodeScript) throws IOException {
        LOGGER.info("Load script from file: {}", nodeScript);

        BufferedReader reader = new BufferedReader(new FileReader(nodeScript));
        highlighter.read(reader, "scriptFile");

        // update the row view header
        tln = new TextLineNumber(highlighter);
        scrollPane.setRowHeaderView(tln);
    }

    private void saveNodeScript() {

        final FileDialog dialog = new FileDialog(
            contentPanel, FileDialog.SAVE, null, ff) {
            @Override
            public void approve(String selectedFile) {
                File file = new File(selectedFile);

                selectedFile = file.getName();

                nodeScriptModel.setNodeScriptName(file.toString());

                try {
                    saveScript(file);
                }
                catch (IOException ex) {
                    LOGGER.warn("Save nodeScript to file failed.", ex);
                    // TODO I18N
                    JOptionPane.showMessageDialog(contentPanel, "Save nodeScript to file failed.", "Save nodeScript",
                        JOptionPane.ERROR_MESSAGE);
                }
            }
        };
        dialog.showDialog();
    }

    private void saveScript(File nodeScript) throws IOException {
        LOGGER.info("Save script to file: {}", nodeScript);

        BufferedWriter writer = new BufferedWriter(new FileWriter(nodeScript));
        highlighter.write(writer);
    }

    private void applyOnNode() {
        LOGGER.info("Apply the script on node.");

        if (executeScriptListener != null) {
            executeScriptListener.executeScript(highlighter.getText());
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy