
org.bidib.wizard.mvc.script.view.NodeScriptView Maven / Gradle / Ivy
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