/***************************************************
*
* cismet GmbH, Saarbruecken, Germany
*
* ... and it just works.
*
****************************************************/
package de.cismet.commons.cismap.io;
import org.apache.log4j.Logger;
import org.openide.util.NbBundle;
import org.openide.util.WeakListeners;
import java.awt.datatransfer.DataFlavor;
import java.awt.dnd.DnDConstants;
import java.awt.dnd.DropTarget;
import java.awt.dnd.DropTargetDragEvent;
import java.awt.dnd.DropTargetDropEvent;
import java.awt.dnd.DropTargetEvent;
import java.awt.dnd.DropTargetListener;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.net.URI;
import java.util.List;
import javax.swing.JButton;
import javax.swing.JEditorPane;
import javax.swing.JFileChooser;
import javax.swing.JTextField;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import de.cismet.cismap.commons.util.DnDUtils;
import de.cismet.commons.converter.Converter;
import de.cismet.commons.converter.FormatHint;
/**
* DOCUMENT ME!
*
* @author mscholl
* @version 1.0
*/
public class AddGeometriesToMapEnterDataVisualPanel extends javax.swing.JPanel {
//~ Static fields/initializers ---------------------------------------------
/** LOGGER. */
private static final transient Logger LOG = Logger.getLogger(AddGeometriesToMapEnterDataVisualPanel.class);
//~ Instance fields --------------------------------------------------------
private final transient AddGeometriesToMapEnterDataWizardPanel model;
private final transient ChangeListener modelChangeL;
private final transient ActionListener openFileL;
private final transient JFileChooser fileChooser;
// Variables declaration - do not modify//GEN-BEGIN:variables
private final transient javax.swing.JButton btnOpenFile = new DnDButton();
private final transient javax.swing.JEditorPane edpCoordinates = new DnDEditorPane();
private final transient javax.swing.JScrollPane jScrollPane1 = new javax.swing.JScrollPane();
private final transient javax.swing.JLabel lblCoordinates = new javax.swing.JLabel();
private final transient javax.swing.JLabel lblFile = new javax.swing.JLabel();
private final transient javax.swing.JLabel lblSelectedConverter = new javax.swing.JLabel();
private final transient javax.swing.JLabel lblSelectedConverterValue = new javax.swing.JLabel();
private final transient javax.swing.JPanel pnlSelectedConverter = new javax.swing.JPanel();
private final transient javax.swing.JSeparator sepSelectedConverter = new javax.swing.JSeparator();
private final transient javax.swing.JTextField txtFile = new DnDTextField();
private org.jdesktop.beansbinding.BindingGroup bindingGroup;
// End of variables declaration//GEN-END:variables
//~ Constructors -----------------------------------------------------------
/**
* Creates new form AddGeometriesToMapEnterDataVisualPanel.
*
* @param model DOCUMENT ME!
*/
public AddGeometriesToMapEnterDataVisualPanel(final AddGeometriesToMapEnterDataWizardPanel model) {
this.model = model;
this.modelChangeL = new ModelChangeListener();
this.openFileL = new OpenFileListener();
this.fileChooser = new JFileChooser();
fileChooser.setAcceptAllFileFilterUsed(true);
fileChooser.setMultiSelectionEnabled(false);
initComponents();
this.setName(NbBundle.getMessage(
AddGeometriesToMapEnterDataVisualPanel.class,
"AddGeometriesToMapEnterDataVisualPanel.<init>(AddGeomtriesToMapEnterDataWizardPanel).panelName")); // NOI18N
this.model.addChangeListener(WeakListeners.change(modelChangeL, model));
this.btnOpenFile.addActionListener(WeakListeners.create(ActionListener.class, openFileL, btnOpenFile));
}
//~ Methods ----------------------------------------------------------------
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public AddGeometriesToMapEnterDataWizardPanel getModel() {
return model;
}
/**
* DOCUMENT ME!
*
* @param input DOCUMENT ME!
*/
private void openFileChooser(final File input) {
if (input == null) {
fileChooser.setSelectedFile(model.getInputFile());
} else {
fileChooser.setSelectedFile(input);
}
final int answer = fileChooser.showOpenDialog(AddGeometriesToMapEnterDataVisualPanel.this);
if (JFileChooser.APPROVE_OPTION == answer) {
final File file = fileChooser.getSelectedFile();
model.setInputFile(file);
}
}
/**
* This method is called from within the constructor to initialize the form. WARNING: Do NOT modify this code. The
* content of this method is always regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {
java.awt.GridBagConstraints gridBagConstraints;
bindingGroup = new org.jdesktop.beansbinding.BindingGroup();
setOpaque(false);
setLayout(new java.awt.GridBagLayout());
lblCoordinates.setText(NbBundle.getMessage(
AddGeometriesToMapEnterDataVisualPanel.class,
"AddGeometriesToMapEnterDataVisualPanel.lblCoordinates.text")); // NOI18N
lblCoordinates.setToolTipText(NbBundle.getMessage(
AddGeometriesToMapEnterDataVisualPanel.class,
"AddGeometriesToMapEnterDataVisualPanel.lblCoordinates.toolTipText")); // NOI18N
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 0;
gridBagConstraints.gridwidth = 2;
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
gridBagConstraints.insets = new java.awt.Insets(5, 5, 5, 5);
add(lblCoordinates, gridBagConstraints);
edpCoordinates.setToolTipText(NbBundle.getMessage(
AddGeometriesToMapEnterDataVisualPanel.class,
"AddGeometriesToMapEnterDataVisualPanel.edpCoordinates.toolTipText")); // NOI18N
org.jdesktop.beansbinding.Binding binding = org.jdesktop.beansbinding.Bindings.createAutoBinding(
org.jdesktop.beansbinding.AutoBinding.UpdateStrategy.READ_WRITE,
this,
org.jdesktop.beansbinding.ELProperty.create("${model.coordinateData}"),
edpCoordinates,
org.jdesktop.beansbinding.BeanProperty.create("text"));
bindingGroup.addBinding(binding);
jScrollPane1.setViewportView(edpCoordinates);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 1;
gridBagConstraints.gridwidth = 3;
gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.weighty = 1.0;
gridBagConstraints.insets = new java.awt.Insets(5, 5, 5, 5);
add(jScrollPane1, gridBagConstraints);
lblFile.setText(NbBundle.getMessage(
AddGeometriesToMapEnterDataVisualPanel.class,
"AddGeometriesToMapEnterDataVisualPanel.lblFile.text")); // NOI18N
lblFile.setToolTipText(NbBundle.getMessage(
AddGeometriesToMapEnterDataVisualPanel.class,
"AddGeometriesToMapEnterDataVisualPanel.lblFile.toolTipText")); // NOI18N
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 2;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
gridBagConstraints.insets = new java.awt.Insets(5, 5, 5, 5);
add(lblFile, gridBagConstraints);
txtFile.setToolTipText(NbBundle.getMessage(
AddGeometriesToMapEnterDataVisualPanel.class,
"AddGeometriesToMapEnterDataVisualPanel.txtFile.toolTipText")); // NOI18N
binding = org.jdesktop.beansbinding.Bindings.createAutoBinding(
org.jdesktop.beansbinding.AutoBinding.UpdateStrategy.READ_WRITE,
this,
org.jdesktop.beansbinding.ELProperty.create("${model.inputFile}"),
txtFile,
org.jdesktop.beansbinding.BeanProperty.create("text"));
binding.setConverter(new InputFileConverter());
bindingGroup.addBinding(binding);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 2;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.insets = new java.awt.Insets(5, 5, 5, 5);
add(txtFile, gridBagConstraints);
btnOpenFile.setText(NbBundle.getMessage(
AddGeometriesToMapEnterDataVisualPanel.class,
"AddGeometriesToMapEnterDataVisualPanel.btnOpenFile.text")); // NOI18N
btnOpenFile.setToolTipText(NbBundle.getMessage(
AddGeometriesToMapEnterDataVisualPanel.class,
"AddGeometriesToMapEnterDataVisualPanel.btnOpenFile.toolTipText")); // NOI18N
btnOpenFile.setMaximumSize(new java.awt.Dimension(50, 29));
btnOpenFile.setMinimumSize(new java.awt.Dimension(50, 29));
btnOpenFile.setPreferredSize(new java.awt.Dimension(50, 29));
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 2;
gridBagConstraints.gridy = 2;
gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST;
gridBagConstraints.insets = new java.awt.Insets(5, 5, 5, 5);
add(btnOpenFile, gridBagConstraints);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 3;
gridBagConstraints.gridwidth = 3;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.insets = new java.awt.Insets(0, 10, 0, 10);
add(sepSelectedConverter, gridBagConstraints);
pnlSelectedConverter.setOpaque(false);
pnlSelectedConverter.setLayout(new java.awt.GridBagLayout());
lblSelectedConverterValue.setText(NbBundle.getMessage(
AddGeometriesToMapEnterDataVisualPanel.class,
"AddGeometriesToMapEnterDataVisualPanel.lblSelectedConverterValue.text")); // NOI18N
lblSelectedConverterValue.setToolTipText(NbBundle.getMessage(
AddGeometriesToMapEnterDataVisualPanel.class,
"AddGeometriesToMapEnterDataVisualPanel.lblSelectedConverterValue.toolTipText")); // NOI18N
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 0;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.insets = new java.awt.Insets(5, 5, 5, 5);
pnlSelectedConverter.add(lblSelectedConverterValue, gridBagConstraints);
lblSelectedConverter.setText(NbBundle.getMessage(
AddGeometriesToMapEnterDataVisualPanel.class,
"AddGeometriesToMapEnterDataVisualPanel.lblSelectedConverter.text")); // NOI18N
lblSelectedConverter.setToolTipText(NbBundle.getMessage(
AddGeometriesToMapEnterDataVisualPanel.class,
"AddGeometriesToMapEnterDataVisualPanel.lblSelectedConverter.toolTipText")); // NOI18N
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 0;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
gridBagConstraints.insets = new java.awt.Insets(5, 5, 5, 5);
pnlSelectedConverter.add(lblSelectedConverter, gridBagConstraints);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 4;
gridBagConstraints.gridwidth = 3;
gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
add(pnlSelectedConverter, gridBagConstraints);
bindingGroup.bind();
} // </editor-fold>//GEN-END:initComponents
//~ Inner Classes ----------------------------------------------------------
/**
* DOCUMENT ME!
*
* @version $Revision$, $Date$
*/
private final class OpenFileListener implements ActionListener {
//~ Methods ------------------------------------------------------------
@Override
public void actionPerformed(final ActionEvent e) {
openFileChooser(null);
}
}
/**
* DOCUMENT ME!
*
* @version $Revision$, $Date$
*/
// TODO: use property change listener for more fine grained control
private final class ModelChangeListener implements ChangeListener {
//~ Methods ------------------------------------------------------------
// subobtimal, propertychange would be better
@Override
public void stateChanged(final ChangeEvent e) {
if (e.getSource() instanceof AddGeometriesToMapEnterDataWizardPanel) {
lblCoordinates.setText(NbBundle.getMessage(
AddGeometriesToMapEnterDataVisualPanel.class,
"AddGeometriesToMapEnterDataVisualPanel.lblCoordinates.text", // NOI18N
model.getCrsName()));
final String text = model.getCoordinateData();
if ((text == null) || !text.equals(edpCoordinates.getText())) {
edpCoordinates.setText(text);
}
final Converter conv = model.getSelectedConverter();
if (conv instanceof FormatHint) {
lblSelectedConverterValue.setText(((FormatHint)conv).getFormatDisplayName());
} else if (conv == null) {
lblSelectedConverterValue.setText(NbBundle.getMessage(
AddGeometriesToMapEnterDataVisualPanel.class,
"AddGeometriesToMapEnterDataVisualPanel.lblSelectedConverterValue.text")); // NOI18N
} else {
lblSelectedConverterValue.setText(conv.toString());
}
lblSelectedConverterValue.setToolTipText(NbBundle.getMessage(
AddGeometriesToMapEnterDataVisualPanel.class,
"AddGeometriesToMapEnterDataVisualPanel.lblSelectedConverterValue.toolTipText", // NOI18N
model.getConverterPreselectionMode()));
}
}
}
/**
* DOCUMENT ME!
*
* @version $Revision$, $Date$
*/
private static final class InputFileConverter extends org.jdesktop.beansbinding.Converter<File, String> {
//~ Methods ------------------------------------------------------------
@Override
public String convertForward(final File value) {
if (value == null) {
return null;
} else {
return value.getAbsolutePath();
}
}
@Override
public File convertReverse(final String value) {
if (value == null) {
return null;
} else {
return new File(value);
}
}
}
/**
* DOCUMENT ME!
*
* @version $Revision$, $Date$
*/
private final class DnDButton extends JButton implements DropTargetListener {
//~ Instance fields ----------------------------------------------------
private final transient DropTarget dropTarget = new DropTarget(this, this);
//~ Methods ------------------------------------------------------------
@Override
public void dragEnter(final DropTargetDragEvent dtde) {
if (dtde.isDataFlavorSupported(DataFlavor.javaFileListFlavor)
|| dtde.isDataFlavorSupported(DnDUtils.URI_LIST_FLAVOR)) {
dtde.acceptDrag(DnDConstants.ACTION_COPY_OR_MOVE);
} else {
dtde.rejectDrag();
}
}
@Override
public void dragOver(final DropTargetDragEvent dtde) {
if (dtde.isDataFlavorSupported(DataFlavor.javaFileListFlavor)
|| dtde.isDataFlavorSupported(DnDUtils.URI_LIST_FLAVOR)) {
dtde.acceptDrag(DnDConstants.ACTION_COPY_OR_MOVE);
} else {
dtde.rejectDrag();
}
}
@Override
public void dropActionChanged(final DropTargetDragEvent dtde) {
if (dtde.isDataFlavorSupported(DataFlavor.javaFileListFlavor)
|| dtde.isDataFlavorSupported(DnDUtils.URI_LIST_FLAVOR)) {
dtde.acceptDrag(DnDConstants.ACTION_COPY_OR_MOVE);
} else {
dtde.rejectDrag();
}
}
@Override
public void dragExit(final DropTargetEvent dte) {
// noop
}
@Override
public void drop(final DropTargetDropEvent dtde) {
try {
dtde.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
final File file;
if (dtde.isDataFlavorSupported(DnDUtils.URI_LIST_FLAVOR)) {
// unix drop
final String uriList = (String)dtde.getTransferable().getTransferData(DnDUtils.URI_LIST_FLAVOR);
final String[] uris = uriList.split(System.getProperty("line.separator")); // NOI18N
if (uris.length == 1) {
file = new File(new URI(uris[0].replaceFirst("localhost", ""))); // NOI18N
dtde.dropComplete(true);
} else {
file = null;
dtde.dropComplete(false);
}
} else {
// win drop
@SuppressWarnings("unchecked")
final List<File> data = (List)dtde.getTransferable().getTransferData(DataFlavor.javaFileListFlavor);
if (data.size() == 1) {
file = data.get(0);
dtde.dropComplete(true);
} else {
file = null;
dtde.dropComplete(false);
}
}
if (file != null) {
openFileChooser(file);
}
} catch (final Exception e) {
if (LOG.isDebugEnabled()) {
LOG.debug("reject drop: " + dtde, e); // NOI18N
}
dtde.dropComplete(false);
}
}
}
/**
* DOCUMENT ME!
*
* @version $Revision$, $Date$
*/
private final class DnDEditorPane extends JEditorPane implements DropTargetListener {
//~ Instance fields ----------------------------------------------------
private final transient DropTarget dropTarget = new DropTarget(this, this);
//~ Methods ------------------------------------------------------------
@Override
public void dragEnter(final DropTargetDragEvent dtde) {
if (dtde.isDataFlavorSupported(DataFlavor.javaFileListFlavor)
|| dtde.isDataFlavorSupported(DnDUtils.URI_LIST_FLAVOR)
|| dtde.isDataFlavorSupported(DataFlavor.stringFlavor)) {
dtde.acceptDrag(DnDConstants.ACTION_COPY_OR_MOVE);
} else {
dtde.rejectDrag();
}
}
@Override
public void dragOver(final DropTargetDragEvent dtde) {
if (dtde.isDataFlavorSupported(DataFlavor.javaFileListFlavor)
|| dtde.isDataFlavorSupported(DnDUtils.URI_LIST_FLAVOR)
|| dtde.isDataFlavorSupported(DataFlavor.stringFlavor)) {
dtde.acceptDrag(DnDConstants.ACTION_COPY_OR_MOVE);
} else {
dtde.rejectDrag();
}
}
@Override
public void dropActionChanged(final DropTargetDragEvent dtde) {
if (dtde.isDataFlavorSupported(DataFlavor.javaFileListFlavor)
|| dtde.isDataFlavorSupported(DnDUtils.URI_LIST_FLAVOR)
|| dtde.isDataFlavorSupported(DataFlavor.stringFlavor)) {
dtde.acceptDrag(DnDConstants.ACTION_COPY_OR_MOVE);
} else {
dtde.rejectDrag();
}
}
@Override
public void dragExit(final DropTargetEvent dte) {
// noop
}
@Override
public void drop(final DropTargetDropEvent dtde) {
try {
dtde.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
if (dtde.isDataFlavorSupported(DnDUtils.URI_LIST_FLAVOR)) {
// unix drop
final String uriList = (String)dtde.getTransferable().getTransferData(DnDUtils.URI_LIST_FLAVOR);
final String[] uris = uriList.split(System.getProperty("line.separator")); // NOI18N
if (uris.length == 1) {
final File file = new File(new URI(uris[0].replaceFirst("localhost", ""))); // NOI18N
dtde.dropComplete(true);
AddGeometriesToMapEnterDataVisualPanel.this.model.setInputFile(file);
} else {
dtde.dropComplete(false);
}
} else if (dtde.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) {
// win drop
@SuppressWarnings("unchecked")
final List<File> data = (List)dtde.getTransferable().getTransferData(DataFlavor.javaFileListFlavor);
if (data.size() == 1) {
final File file = data.get(0);
dtde.dropComplete(true);
AddGeometriesToMapEnterDataVisualPanel.this.model.setInputFile(file);
} else {
dtde.dropComplete(false);
}
} else {
final String data = (String)dtde.getTransferable().getTransferData(DataFlavor.stringFlavor);
dtde.dropComplete(true);
// String drop, empty file
AddGeometriesToMapEnterDataVisualPanel.this.model.setInputFile(null);
AddGeometriesToMapEnterDataVisualPanel.this.model.setCoordinateData(data);
}
} catch (final Exception e) {
if (LOG.isDebugEnabled()) {
LOG.debug("reject drop: " + dtde, e); // NOI18N
}
dtde.dropComplete(false);
}
}
}
/**
* DOCUMENT ME!
*
* @version $Revision$, $Date$
*/
private final class DnDTextField extends JTextField implements DropTargetListener {
//~ Instance fields ----------------------------------------------------
private final transient DropTarget dropTarget = new DropTarget(this, this);
//~ Methods ------------------------------------------------------------
@Override
public void dragEnter(final DropTargetDragEvent dtde) {
if (dtde.isDataFlavorSupported(DataFlavor.javaFileListFlavor)
|| dtde.isDataFlavorSupported(DnDUtils.URI_LIST_FLAVOR)) {
dtde.acceptDrag(DnDConstants.ACTION_COPY_OR_MOVE);
} else {
dtde.rejectDrag();
}
}
@Override
public void dragOver(final DropTargetDragEvent dtde) {
if (dtde.isDataFlavorSupported(DataFlavor.javaFileListFlavor)
|| dtde.isDataFlavorSupported(DnDUtils.URI_LIST_FLAVOR)) {
dtde.acceptDrag(DnDConstants.ACTION_COPY_OR_MOVE);
} else {
dtde.rejectDrag();
}
}
@Override
public void dropActionChanged(final DropTargetDragEvent dtde) {
if (dtde.isDataFlavorSupported(DataFlavor.javaFileListFlavor)
|| dtde.isDataFlavorSupported(DnDUtils.URI_LIST_FLAVOR)) {
dtde.acceptDrag(DnDConstants.ACTION_COPY_OR_MOVE);
} else {
dtde.rejectDrag();
}
}
@Override
public void dragExit(final DropTargetEvent dte) {
// noop
}
@Override
public void drop(final DropTargetDropEvent dtde) {
try {
dtde.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
if (dtde.isDataFlavorSupported(DnDUtils.URI_LIST_FLAVOR)) {
// unix drop
final String uriList = (String)dtde.getTransferable().getTransferData(DnDUtils.URI_LIST_FLAVOR);
final String[] uris = uriList.split(System.getProperty("line.separator")); // NOI18N
if (uris.length == 1) {
final File file = new File(new URI(uris[0].replaceFirst("localhost", ""))); // NOI18N
dtde.dropComplete(true);
AddGeometriesToMapEnterDataVisualPanel.this.model.setInputFile(file);
} else {
dtde.dropComplete(false);
}
} else {
// win drop
@SuppressWarnings("unchecked")
final List<File> data = (List)dtde.getTransferable().getTransferData(DataFlavor.javaFileListFlavor);
if (data.size() == 1) {
final File file = data.get(0);
dtde.dropComplete(true);
AddGeometriesToMapEnterDataVisualPanel.this.model.setInputFile(file);
} else {
dtde.dropComplete(false);
}
}
} catch (final Exception e) {
if (LOG.isDebugEnabled()) {
LOG.debug("reject drop: " + dtde, e); // NOI18N
}
dtde.dropComplete(false);
}
}
}
}