Revision: 5742
          http://sourceforge.net/p/jump-pilot/code/5742
Author:   ma15569
Date:     2018-04-06 17:00:47 +0000 (Fri, 06 Apr 2018)
Log Message:
-----------
Enhanced version of Feature Schema Panel: added Copy/Paste/Save to  file/Load 
from file schema actions to Schema toolbar

Modified Paths:
--------------
    core/trunk/ChangeLog
    core/trunk/src/com/vividsolutions/jump/workbench/ui/SchemaPanel.java

Added Paths:
-----------
    core/trunk/src/org/openjump/core/ui/util/FeatureSchemaUtils.java

Modified: core/trunk/ChangeLog
===================================================================
--- core/trunk/ChangeLog        2018-04-06 14:14:17 UTC (rev 5741)
+++ core/trunk/ChangeLog        2018-04-06 17:00:47 UTC (rev 5742)
@@ -5,6 +5,10 @@
 
 * Changes.txt updated until here **********************************************
 
+2018-04-06 Giuseppe Aruta
+      * Enhanced version of Feature Schema Panel: added Copy/Paste/Save to 
+        file/Load from file schema actions to Schema toolbar
+
 2018-04-03 Giuseppe Aruta
       * Added Boolen and Long attributes to Paste Schema plugin
 

Modified: core/trunk/src/com/vividsolutions/jump/workbench/ui/SchemaPanel.java
===================================================================
--- core/trunk/src/com/vividsolutions/jump/workbench/ui/SchemaPanel.java        
2018-04-06 14:14:17 UTC (rev 5741)
+++ core/trunk/src/com/vividsolutions/jump/workbench/ui/SchemaPanel.java        
2018-04-06 17:00:47 UTC (rev 5742)
@@ -35,6 +35,7 @@
 import java.awt.BorderLayout;
 import java.awt.Color;
 import java.awt.Component;
+import java.awt.Dimension;
 import java.awt.GridBagConstraints;
 import java.awt.GridBagLayout;
 import java.awt.Insets;
@@ -57,15 +58,16 @@
 import javax.swing.JComponent;
 import javax.swing.JLabel;
 import javax.swing.JList;
+import javax.swing.JOptionPane;
 import javax.swing.JPanel;
 import javax.swing.JPopupMenu;
 import javax.swing.JScrollPane;
+import javax.swing.JSeparator;
 import javax.swing.JTable;
 import javax.swing.JTextField;
 import javax.swing.JToolBar;
 import javax.swing.ListCellRenderer;
 import javax.swing.SwingUtilities;
-import javax.swing.border.Border;
 import javax.swing.border.LineBorder;
 import javax.swing.event.ListSelectionEvent;
 import javax.swing.event.ListSelectionListener;
@@ -74,10 +76,13 @@
 import javax.swing.table.TableCellRenderer;
 import javax.swing.table.TableColumn;
 
+import org.apache.log4j.Logger;
+import org.openjump.core.ui.util.FeatureSchemaUtils;
+
 import com.vividsolutions.jts.util.Assert;
 import com.vividsolutions.jump.I18N;
 import com.vividsolutions.jump.feature.AttributeType;
-import com.vividsolutions.jump.util.StringUtil;
+import com.vividsolutions.jump.workbench.JUMPWorkbench;
 import com.vividsolutions.jump.workbench.WorkbenchContext;
 import com.vividsolutions.jump.workbench.model.CategoryEvent;
 import com.vividsolutions.jump.workbench.model.FeatureEvent;
@@ -87,6 +92,7 @@
 import com.vividsolutions.jump.workbench.model.LayerListener;
 import com.vividsolutions.jump.workbench.plugin.AbstractPlugIn;
 import com.vividsolutions.jump.workbench.plugin.EnableCheck;
+import com.vividsolutions.jump.workbench.plugin.EnableCheckFactory;
 import com.vividsolutions.jump.workbench.plugin.MultiEnableCheck;
 import com.vividsolutions.jump.workbench.plugin.PlugIn;
 import com.vividsolutions.jump.workbench.plugin.PlugInContext;
@@ -93,35 +99,35 @@
 import com.vividsolutions.jump.workbench.ui.addremove.AddRemovePanel;
 import com.vividsolutions.jump.workbench.ui.cursortool.editing.EditingPlugIn;
 import com.vividsolutions.jump.workbench.ui.images.IconLoader;
+import com.vividsolutions.jump.workbench.ui.plugin.CopySchemaPlugIn;
 import com.vividsolutions.jump.workbench.ui.plugin.EditablePlugIn;
 import com.vividsolutions.jump.workbench.ui.plugin.FeatureInstaller;
+import com.vividsolutions.jump.workbench.ui.plugin.PasteSchemaPlugIn;
 
 public class SchemaPanel extends JPanel {
-    private JPanel jPanel3 = new JPanel();
-    private JPanel jPanel1 = new JPanel();
-    private GridBagLayout gridBagLayout1 = new GridBagLayout();
-    private JLabel statusLabel = new JLabel();
+    private final JPanel jPanel3 = new JPanel();
+    private final JPanel jPanel1 = new JPanel();
+    private final GridBagLayout gridBagLayout1 = new GridBagLayout();
+    private final JLabel statusLabel = new JLabel();
     private Layer layer;
     private Point currentClickPoint;
-    private JPopupMenu popupMenu = new JPopupMenu();
-    private GridBagLayout gridBagLayout2 = new GridBagLayout();
-    private JPanel buttonPanel = new JPanel();
-    private JButton applyButton = new JButton();
-    private JCheckBox forceInvalidConversionsToNullCheckBox = new JCheckBox();
-    private GridBagLayout gridBagLayout3 = new GridBagLayout();
-    private JPanel jPanel2 = new JPanel();
-    private Border border1;
+    private final JPopupMenu popupMenu = new JPopupMenu();
+    private final GridBagLayout gridBagLayout2 = new GridBagLayout();
+    private final JPanel buttonPanel = new JPanel();
+    private final JButton applyButton = new JButton();
+    private final JCheckBox forceInvalidConversionsToNullCheckBox = new 
JCheckBox();
+    private final GridBagLayout gridBagLayout3 = new GridBagLayout();
+    private final JPanel jPanel2 = new JPanel();
     private boolean modified = false;
-    private ArrayList listeners = new ArrayList();
-    private JButton revertButton = new JButton();
-    private BorderLayout borderLayout1 = new BorderLayout();
-    private WorkbenchToolBar toolBar = new WorkbenchToolBar(null) {
-        public JButton addPlugIn(
-            Icon icon,
-            PlugIn plugIn,
-            EnableCheck enableCheck,
-            WorkbenchContext workbenchContext) {
-            return super.addPlugIn(icon, addCleanUp(plugIn), enableCheck, 
workbenchContext);
+    private final ArrayList listeners = new ArrayList();
+    private final JButton revertButton = new JButton();
+    private final BorderLayout borderLayout1 = new BorderLayout();
+    private final WorkbenchToolBar toolBar = new WorkbenchToolBar(null) {
+        @Override
+        public JButton addPlugIn(Icon icon, PlugIn plugIn,
+                EnableCheck enableCheck, WorkbenchContext workbenchContext) {
+            return super.addPlugIn(icon, addCleanUp(plugIn), enableCheck,
+                    workbenchContext);
         }
 
     };
@@ -129,35 +135,45 @@
     private void setModel(SchemaTableModel model) {
         table.setModel(model);
         table.getModel().addTableModelListener(new TableModelListener() {
+            @Override
             public void tableChanged(TableModelEvent e) {
                 updateComponents();
             }
         });
-        //Must init cell editors every time we init model. [Jon Aquino]
+        // Must init cell editors every time we init model. [Jon Aquino]
         initCellEditors();
         updateComponents();
     }
 
-    public SchemaPanel(final Layer layer, EditingPlugIn editingPlugIn, 
WorkbenchContext context) {
+    public SchemaPanel(final Layer layer, EditingPlugIn editingPlugIn,
+            WorkbenchContext context) {
         editablePlugIn = new EditablePlugIn(editingPlugIn);
         try {
-            table.getSelectionModel().addListSelectionListener(new 
ListSelectionListener() {
-                public void valueChanged(ListSelectionEvent e) {
-                    updateComponents();
-                }
-            });
+            table.getSelectionModel().addListSelectionListener(
+                    new ListSelectionListener() {
+                        @Override
+                        public void valueChanged(ListSelectionEvent e) {
+                            updateComponents();
+                        }
+                    });
             this.layer = layer;
             jbInit();
-            //Call #initPopupMenu and #initToolBar before #setModel, because 
#setModel
-            //calls #updateComponents. [Jon Aquino]
+            // Call #initPopupMenu and #initToolBar before #setModel, because
+            // #setModel
+            // calls #updateComponents. [Jon Aquino]
             initPopupMenu(context);
             initToolBar(context);
             setModel(new SchemaTableModel(layer));
             layer.getLayerManager().addLayerListener(new LayerListener() {
-                public void categoryChanged(CategoryEvent e) {}
+                @Override
+                public void categoryChanged(CategoryEvent e) {
+                }
 
-                public void featuresChanged(FeatureEvent e) {}
+                @Override
+                public void featuresChanged(FeatureEvent e) {
+                }
 
+                @Override
                 public void layerChanged(LayerEvent e) {
                     if (e.getLayerable() != layer) {
                         return;
@@ -164,14 +180,16 @@
                     }
 
                     if (e.getType() == LayerEventType.METADATA_CHANGED) {
-                        //If layer becomes editable, apply row striping and 
remove gridlines,
-                        //as recommended in Java Look and Feel Design 
Guidelines: Advanced Topics [Jon Aquino]
+                        // If layer becomes editable, apply row striping and
+                        // remove gridlines,
+                        // as recommended in Java Look and Feel Design
+                        // Guidelines: Advanced Topics [Jon Aquino]
                         updateComponents();
                         repaint();
                     }
                 }
             });
-        } catch (Exception ex) {
+        } catch (final Exception ex) {
             Assert.shouldNeverReachHere(ex.toString());
         }
     }
@@ -180,19 +198,22 @@
         if (table.getSelectedRowCount() > 0) {
             return table.getSelectedRows();
         }
-        if (getCurrentClickPoint() != null && 
table.rowAtPoint(getCurrentClickPoint()) != -1) {
-            return new int[] { table.rowAtPoint(getCurrentClickPoint())};
+        if (getCurrentClickPoint() != null
+                && table.rowAtPoint(getCurrentClickPoint()) != -1) {
+            return new int[] { table.rowAtPoint(getCurrentClickPoint()) };
         }
         return new int[] {};
     }
 
-    private EnableCheck basicEnableCheck = new EnableCheck() {
+    private final EnableCheck basicEnableCheck = new EnableCheck() {
+        @Override
         public String check(JComponent component) {
             if (!layer.isEditable()) {
                 return I18N.get("ui.SchemaPanel.layer-must-be-editable");
             }
             if (rowsToActOn().length == 0) {
-                return 
I18N.get("ui.SchemaPanel.at-least-1-row-must-be-selected");
+                return I18N
+                        .get("ui.SchemaPanel.at-least-1-row-must-be-selected");
             }
             return null;
         }
@@ -202,14 +223,22 @@
         public MultiEnableCheck createEnableCheck() {
             return new MultiEnableCheck().add(basicEnableCheck);
         }
+
         public abstract Icon getIcon();
     }
 
-    private MyPlugIn insertPlugIn = new MyPlugIn() {
+    private final MyPlugIn insertPlugIn = new MyPlugIn() {
+        @Override
         public String getName() {
             return I18N.get("ui.SchemaPanel.insert");
         }
-        public Icon getIcon() { return 
GUIUtil.toSmallIcon(IconLoader.icon("Plus.gif")); }
+
+        @Override
+        public Icon getIcon() {
+            return GUIUtil.toSmallIcon(IconLoader.icon("Plus.gif"));
+        }
+
+        @Override
         public boolean execute(PlugInContext context) throws Exception {
             markAsModified();
             getModel().insertBlankRow(rowsToActOn()[0]);
@@ -217,11 +246,18 @@
         }
     };
 
-    private MyPlugIn deletePlugIn = new MyPlugIn() {
+    private final MyPlugIn deletePlugIn = new MyPlugIn() {
+        @Override
         public String getName() {
             return I18N.get("ui.SchemaPanel.delete");
         }
-        public Icon getIcon() { return 
GUIUtil.toSmallIcon(IconLoader.icon("Delete.gif")); }        
+
+        @Override
+        public Icon getIcon() {
+            return GUIUtil.toSmallIcon(IconLoader.icon("Delete.gif"));
+        }
+
+        @Override
         public boolean execute(PlugInContext context) throws Exception {
             markAsModified();
             getModel().removeFields(rowsToActOn());
@@ -229,22 +265,36 @@
         }
     };
 
-    private MyPlugIn moveUpPlugIn = new MyPlugIn() {
-        public Icon getIcon() { return 
GUIUtil.toSmallIcon(IconLoader.icon("VCRUp.gif")); }        
+    private final MyPlugIn moveUpPlugIn = new MyPlugIn() {
+        @Override
+        public Icon getIcon() {
+            return GUIUtil.toSmallIcon(IconLoader.icon("VCRUp.gif"));
+        }
+
+        @Override
         public String getName() {
             return I18N.get("ui.SchemaPanel.move-field-up");
         }
+
+        @Override
         public boolean execute(PlugInContext context) throws Exception {
             markAsModified();
-            move(AddRemovePanel.itemsToMoveUp(getModel().getFields(), 
toFields(rowsToActOn())), -1);
+            move(AddRemovePanel.itemsToMoveUp(getModel().getFields(),
+                    toFields(rowsToActOn())), -1);
             return true;
         }
+
+        @Override
         public MultiEnableCheck createEnableCheck() {
             return super.createEnableCheck().add(new EnableCheck() {
+                @Override
                 public String check(JComponent component) {
-                    return min(rowsToActOn()) == 0 ? 
I18N.get("ui.SchemaPanel.field-is-already-at-the-top") : null;
-                    //No corresponding check in moveDownPlugIn because there 
is no
-                    //bottom! (We keep adding rows as necessary) [Jon Aquino]
+                    return min(rowsToActOn()) == 0 ? I18N
+                            .get("ui.SchemaPanel.field-is-already-at-the-top")
+                            : null;
+                    // No corresponding check in moveDownPlugIn because there 
is
+                    // no
+                    // bottom! (We keep adding rows as necessary) [Jon Aquino]
                 }
             });
         }
@@ -251,47 +301,198 @@
     };
     private EditablePlugIn editablePlugIn;
 
-    private MyPlugIn moveDownPlugIn = new MyPlugIn() {
-        public Icon getIcon() { return 
GUIUtil.toSmallIcon(IconLoader.icon("VCRDown.gif")); }                
+    private final MyPlugIn moveDownPlugIn = new MyPlugIn() {
+        @Override
+        public Icon getIcon() {
+            return GUIUtil.toSmallIcon(IconLoader.icon("VCRDown.gif"));
+        }
+
+        @Override
         public String getName() {
             return I18N.get("ui.SchemaPanel.move-field-down");
         }
+
+        @Override
         public boolean execute(PlugInContext context) throws Exception {
             markAsModified();
-            move(
-                AddRemovePanel.itemsToMoveDown(getModel().getFields(), 
toFields(rowsToActOn())),
-                1);
+            move(AddRemovePanel.itemsToMoveDown(getModel().getFields(),
+                    toFields(rowsToActOn())), 1);
             return true;
         }
     };
-    private JScrollPane jScrollPane1 = new JScrollPane();
-    private JTable table = new JTable();
 
+    private final MyPlugIn saveSchemaPlugIn = new MyPlugIn() {
+        @Override
+        public Icon getIcon() {
+            return GUIUtil.toSmallIcon(IconLoader.icon("disk.png"));
+        }
+
+        @Override
+        public String getName() {
+            return I18N.get("ui.MenuNames.SCHEMA ")
+                    + " - "
+                    + 
I18N.get("deejump.pluging.style.LayerStyle2SLDPlugIn.Save");
+        }
+
+        @Override
+        public boolean execute(PlugInContext context) throws Exception {
+
+            try {
+                final Layer lyr = context.getSelectedLayer(0);
+                FeatureSchemaUtils.saveSchema(lyr);
+
+                JOptionPane.showMessageDialog(JUMPWorkbench.getInstance()
+                        .getFrame(), FileSaved + ": "
+                        + FeatureSchemaUtils.GetSavedFileName, getName(), 1);
+
+            } catch (final Exception ex) {
+
+                final Logger LOG = Logger.getLogger(this.getClass());
+                JUMPWorkbench
+                        .getInstance()
+                        .getFrame()
+                        .warnUser(
+                                this.getClass().getSimpleName() + " " + Error
+                                        + ": " + ex.toString());
+                LOG.error(this.getClass().getName() + " " + Error + ": ", ex);
+                JOptionPane.showMessageDialog(JUMPWorkbench.getInstance()
+                        .getFrame(), Error + ": " + ex, getName(), 0);
+            }
+
+            return true;
+        }
+    };
+
+    static String Error = I18N
+            
.get("org.openjump.core.ui.plugin.mousemenu.SaveDatasetsPlugIn.Error-See-Output-Window");
+
+    static String FileSaved = I18N
+            
.get("org.openjump.core.ui.plugin.raster.RasterImageLayerPropertiesPlugIn.file.saved");
+
+    private final MyPlugIn loadSchemaPlugIn = new MyPlugIn() {
+        @Override
+        public Icon getIcon() {
+            return IconLoader.icon("fugue/folder-open.png");
+        }
+
+        @Override
+        public String getName() {
+            return I18N.get("ui.MenuNames.SCHEMA ")
+                    + " - "
+                    + 
I18N.get("org.openjump.core.ui.plugin.queries.SimpleQuery.open");
+        }
+
+        @Override
+        public boolean execute(PlugInContext context) throws Exception {
+            // Layer lyr = context.getSelectedLayer(0);
+            executeLoadSchema(context);
+            // executeLoadSchema(context);
+            return true;
+        }
+    };
+
+    public boolean executeLoadSchema(PlugInContext context) throws Exception {
+        final Layer lyr = context.getSelectedLayer(0);
+        FeatureSchemaUtils.loadSchema(lyr);
+        setModel(new SchemaTableModel(layer));
+        table.repaint();
+        this.repaint();
+        this.validate();
+        return true;
+    }
+
+    private final MyPlugIn pasteSchemaPlugIn = new MyPlugIn() {
+        final PasteSchemaPlugIn paste = new PasteSchemaPlugIn();
+
+        @Override
+        public Icon getIcon() {
+            return paste.getIcon();
+        }
+
+        @Override
+        public String getName() {
+            return paste.getName();
+        }
+
+        @Override
+        public boolean execute(PlugInContext context) throws Exception {
+
+            executePasteSchema(context);
+
+            return true;
+        }
+
+    };
+
+    public boolean executePasteSchema(PlugInContext context) throws Exception {
+        final PasteSchemaPlugIn paste = new PasteSchemaPlugIn();
+        paste.execute(context);
+        setModel(new SchemaTableModel(layer));
+        table.repaint();
+        this.repaint();
+        this.validate();
+        return true;
+    }
+
+    public static MultiEnableCheck createPasteEnableCheck(
+            WorkbenchContext workbenchContext) {
+        final EnableCheckFactory checkFactory = new EnableCheckFactory(
+                workbenchContext);
+
+        return new MultiEnableCheck()
+
+        .add(checkFactory.createAtLeastNLayersMustBeSelectedCheck(1)).add(
+                checkFactory.createSelectedLayersMustBeEditableCheck());
+    }
+
+    private final JScrollPane jScrollPane1 = new JScrollPane();
+    private final JTable table = new JTable();
+
     private void initToolBar(WorkbenchContext context) {
-        toolBar.addPlugIn(
-            insertPlugIn.getIcon(),
-            insertPlugIn,
-            insertPlugIn.createEnableCheck(),
-            context);
-        toolBar.addPlugIn(
-            deletePlugIn.getIcon(),
-            deletePlugIn,
-            deletePlugIn.createEnableCheck(),
-            context);
-        toolBar.addPlugIn(
-            moveUpPlugIn.getIcon(),
-            moveUpPlugIn,
-            moveUpPlugIn.createEnableCheck(),
-            context);
-        toolBar.addPlugIn(
-            moveDownPlugIn.getIcon(),
-            moveDownPlugIn,
-            moveDownPlugIn.createEnableCheck(),
-            context);
+        final CopySchemaPlugIn copy = new CopySchemaPlugIn();
+
+        toolBar.addPlugIn(insertPlugIn.getIcon(), insertPlugIn,
+                insertPlugIn.createEnableCheck(), context);
+        toolBar.addPlugIn(deletePlugIn.getIcon(), deletePlugIn,
+                deletePlugIn.createEnableCheck(), context);
+        toolBar.addPlugIn(moveUpPlugIn.getIcon(), moveUpPlugIn,
+                moveUpPlugIn.createEnableCheck(), context);
+        toolBar.addPlugIn(moveDownPlugIn.getIcon(), moveDownPlugIn,
+                moveDownPlugIn.createEnableCheck(), context);
+        // toolBar.addSeparator();
+        // final JSeparator separator = new JSeparator();
+        // separator.setOrientation(JSeparator.VERTICAL);
+
+        final JSeparator sep = new JSeparator() {
+            @Override
+            public Dimension getMaximumSize() {
+                return new Dimension(20, 20);
+            }
+
+            @Override
+            public Dimension getPreferredSize() {
+                return new Dimension(20, 20);
+            }
+
+        };
+        sep.setForeground(toolBar.getForeground());
+        sep.setOrientation(JSeparator.VERTICAL);
+        toolBar.add(sep);
+        // toolBar.add(separator);
+        // toolBar.addSeparator();
+        toolBar.addPlugIn(copy.getIcon(), copy, null, context);
+        toolBar.addPlugIn(pasteSchemaPlugIn.getIcon(), pasteSchemaPlugIn,
+                createPasteEnableCheck(context), context);
+        toolBar.addSpacer();
+        toolBar.addPlugIn(saveSchemaPlugIn.getIcon(), saveSchemaPlugIn, null,
+                context);
+        toolBar.addPlugIn(loadSchemaPlugIn.getIcon(), loadSchemaPlugIn, null,
+                context);
     }
 
     private void initPopupMenu(WorkbenchContext context) {
         table.addMouseListener(new MouseAdapter() {
+            @Override
             public void mouseReleased(MouseEvent e) {
                 setCurrentClickPoint(e.getPoint());
 
@@ -301,59 +502,50 @@
 
             }
         });
-        addPopupMenuItem(
-            editablePlugIn,
-            true,
-            null,
-            editablePlugIn.createEnableCheck(context), context);
+        addPopupMenuItem(editablePlugIn, true, null,
+                editablePlugIn.createEnableCheck(context), context);
         popupMenu.addSeparator();
-        addPopupMenuItem(
-            insertPlugIn,
-            false,
-            insertPlugIn.getIcon(),
-            insertPlugIn.createEnableCheck(), context);
-        addPopupMenuItem(
-            deletePlugIn,
-            false,
-            deletePlugIn.getIcon(),
-            deletePlugIn.createEnableCheck(), context);
+        addPopupMenuItem(insertPlugIn, false, insertPlugIn.getIcon(),
+                insertPlugIn.createEnableCheck(), context);
+        addPopupMenuItem(deletePlugIn, false, deletePlugIn.getIcon(),
+                deletePlugIn.createEnableCheck(), context);
         popupMenu.addSeparator();
-        addPopupMenuItem(
-            moveUpPlugIn,
-            false,
-            moveUpPlugIn.getIcon(),
-            moveUpPlugIn.createEnableCheck(), context);
-        addPopupMenuItem(
-            moveDownPlugIn,
-            false,
-            moveDownPlugIn.getIcon(),
-            moveDownPlugIn.createEnableCheck(), context);
+        addPopupMenuItem(moveUpPlugIn, false, moveUpPlugIn.getIcon(),
+                moveUpPlugIn.createEnableCheck(), context);
+        addPopupMenuItem(moveDownPlugIn, false, moveDownPlugIn.getIcon(),
+                moveDownPlugIn.createEnableCheck(), context);
     }
 
-    private void addPopupMenuItem(PlugIn plugIn, boolean checkBox, Icon icon, 
EnableCheck enableCheck, WorkbenchContext context) {
-        FeatureInstaller installer = new FeatureInstaller(context);
-        installer.addPopupMenuItem(popupMenu,
-        addCleanUp(plugIn),
-        plugIn.getName(), checkBox, icon, enableCheck);
+    private void addPopupMenuItem(PlugIn plugIn, boolean checkBox, Icon icon,
+            EnableCheck enableCheck, WorkbenchContext context) {
+        final FeatureInstaller installer = new FeatureInstaller(context);
+        installer.addPopupMenuItem(popupMenu, addCleanUp(plugIn),
+                plugIn.getName(), checkBox, icon, enableCheck);
     }
 
     private PlugIn addCleanUp(final PlugIn plugIn) {
         return new PlugIn() {
+            @Override
             public String toString() {
                 return plugIn.toString();
             }
+
+            @Override
             public boolean execute(PlugInContext context) throws Exception {
                 try {
-                return plugIn.execute(context);
-                }
-                finally {
+                    return plugIn.execute(context);
+                } finally {
                     setCurrentClickPoint(null);
                     updateComponents();
                 }
             }
+
+            @Override
             public void initialize(PlugInContext context) throws Exception {
                 plugIn.initialize(context);
             }
+
+            @Override
             public String getName() {
                 return plugIn.getName();
             }
@@ -365,10 +557,10 @@
     }
 
     private Collection toFields(int[] rows) {
-        ArrayList fields = new ArrayList();
+        final ArrayList fields = new ArrayList();
 
-        for (int i = 0; i < rows.length; i++) {
-            fields.add(getModel().get(rows[i]));
+        for (final int row : rows) {
+            fields.add(getModel().get(row));
         }
 
         return fields;
@@ -376,7 +568,8 @@
 
     private void updateComponents() {
         table.setShowGrid(layer.isEditable());
-        table.setRowHeight(20); // fix proposed by uwe to have readable 
comboboxes with MetalL&F
+        table.setRowHeight(20); // fix proposed by uwe to have readable
+                                // comboboxes with MetalL&F
         applyButton.setEnabled(layer.isEditable());
         revertButton.setEnabled(layer.isEditable());
         forceInvalidConversionsToNullCheckBox.setEnabled(layer.isEditable());
@@ -390,42 +583,45 @@
 
     private TableColumn fieldNameColumn() {
         return table.getColumnModel().getColumn(
-            getModel().indexOfColumn(SchemaTableModel.FIELD_NAME_COLUMN_NAME));
+                getModel().indexOfColumn(
+                        SchemaTableModel.FIELD_NAME_COLUMN_NAME));
     }
 
     private TableColumn dataTypeColumn() {
         return table.getColumnModel().getColumn(
-            getModel().indexOfColumn(SchemaTableModel.DATA_TYPE_COLUMN_NAME));
+                getModel()
+                        
.indexOfColumn(SchemaTableModel.DATA_TYPE_COLUMN_NAME));
     }
 
     private void initCellEditors() {
         fieldNameColumn().setCellEditor(new MyFieldNameEditor());
-        // Switched to basic types only (to get all types available, switch to 
AttributeType.allTypes())
-        dataTypeColumn().setCellEditor(new 
MyDataTypeEditor(AttributeType.basicTypes().toArray()));
+        // Switched to basic types only (to get all types available, switch to
+        // AttributeType.allTypes())
+        dataTypeColumn().setCellEditor(
+                new MyDataTypeEditor(AttributeType.basicTypes().toArray()));
         fieldNameColumn().setCellRenderer(
-            new StripingRenderer(table.getDefaultRenderer(String.class)));
-        dataTypeColumn().setCellRenderer(new StripingRenderer(new 
TableCellRenderer() {
-            public Component getTableCellRendererComponent(
-                JTable table,
-                Object value,
-                boolean isSelected,
-                boolean hasFocus,
-                int row,
-                int column) {
-                return 
table.getDefaultRenderer(String.class).getTableCellRendererComponent(
-                    table,
-                    (value != null) ? capitalizeFirstLetter(value.toString()) 
: null,
-                    isSelected,
-                    hasFocus,
-                    row,
-                    column);
-            }
-        }));
+                new StripingRenderer(table.getDefaultRenderer(String.class)));
+        dataTypeColumn().setCellRenderer(
+                new StripingRenderer(new TableCellRenderer() {
+                    @Override
+                    public Component getTableCellRendererComponent(
+                            JTable table, Object value, boolean isSelected,
+                            boolean hasFocus, int row, int column) {
+                        return table
+                                .getDefaultRenderer(String.class)
+                                .getTableCellRendererComponent(
+                                        table,
+                                        (value != null) ? 
capitalizeFirstLetter(value
+                                                .toString()) : null,
+                                        isSelected, hasFocus, row, column);
+                    }
+                }));
         table.getModel().addTableModelListener(new TableModelListener() {
+            @Override
             public void tableChanged(TableModelEvent e) {
                 for (int i = 0; i < table.getColumnCount(); i++) {
-                    ((MyEditor) 
table.getColumnModel().getColumn(i).getCellEditor())
-                        .cancelCellEditing();
+                    ((MyEditor) table.getColumnModel().getColumn(i)
+                            .getCellEditor()).cancelCellEditing();
                 }
             }
         });
@@ -432,154 +628,74 @@
     }
 
     private String capitalizeFirstLetter(String string) {
-        return string.toUpperCase().charAt(0) + 
string.toLowerCase().substring(1);
+        return string.toUpperCase().charAt(0)
+                + string.toLowerCase().substring(1);
     }
 
     void jbInit() throws Exception {
-        toolBar.setOrientation(JToolBar.VERTICAL);
-        border1 = BorderFactory.createEtchedBorder(Color.white, new Color(148, 
145, 140));
-        this.setLayout(gridBagLayout2);
+        toolBar.setOrientation(JToolBar.HORIZONTAL);
+        BorderFactory.createEtchedBorder(Color.white, new Color(148, 145, 
140));
+        setLayout(gridBagLayout2);
         jPanel1.setLayout(gridBagLayout1);
         statusLabel.setBorder(BorderFactory.createLoweredBevelBorder());
         statusLabel.setText(" ");
         applyButton.setText(I18N.get("ui.SchemaPanel.apply-changes"));
         applyButton.addActionListener(new java.awt.event.ActionListener() {
+            @Override
             public void actionPerformed(ActionEvent e) {
                 applyButton_actionPerformed(e);
             }
         });
-        
forceInvalidConversionsToNullCheckBox.setToolTipText(I18N.get("ui.SchemaPanel.leave-unchecked-if-you-want-to-be-notified-of-conversion-errors"));
-        
forceInvalidConversionsToNullCheckBox.setText(I18N.get("ui.SchemaPanel.force-invalid-conversions-to-null"));
+        forceInvalidConversionsToNullCheckBox
+                .setToolTipText(I18N
+                        
.get("ui.SchemaPanel.leave-unchecked-if-you-want-to-be-notified-of-conversion-errors"));
+        forceInvalidConversionsToNullCheckBox.setText(I18N
+                .get("ui.SchemaPanel.force-invalid-conversions-to-null"));
         buttonPanel.setLayout(gridBagLayout3);
         buttonPanel.setBorder(BorderFactory.createLoweredBevelBorder());
         revertButton.setText(I18N.get("ui.SchemaPanel.revert-changes"));
         revertButton.addActionListener(new java.awt.event.ActionListener() {
+            @Override
             public void actionPerformed(ActionEvent e) {
                 revertButton_actionPerformed(e);
             }
         });
         jPanel3.setLayout(borderLayout1);
-        this.add(
-            jPanel3,
-            new GridBagConstraints(
-                0,
-                0,
-                1,
-                1,
-                1.0,
-                1.0,
-                GridBagConstraints.CENTER,
-                GridBagConstraints.BOTH,
-                new Insets(0, 0, 0, 0),
-                0,
-                0));
-        jPanel3.add(toolBar, BorderLayout.WEST);
+        this.add(jPanel3, new GridBagConstraints(0, 0, 1, 1, 1.0, 1.0,
+                GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(
+                        0, 0, 0, 0), 0, 0));
+        jPanel3.add(toolBar, BorderLayout.NORTH);
         jPanel3.add(jScrollPane1, BorderLayout.CENTER);
         jScrollPane1.getViewport().add(table, null);
-        this.add(
-            jPanel1,
-            new GridBagConstraints(
-                0,
-                3,
-                1,
-                1,
-                0.0,
-                0.0,
-                GridBagConstraints.CENTER,
-                GridBagConstraints.HORIZONTAL,
-                new Insets(0, 0, 0, 0),
-                0,
-                0));
-        jPanel1.add(
-            statusLabel,
-            new GridBagConstraints(
-                0,
-                0,
-                1,
-                1,
-                1.0,
-                0.0,
-                GridBagConstraints.CENTER,
-                GridBagConstraints.HORIZONTAL,
-                new Insets(0, 0, 0, 0),
-                0,
-                0));
-        this.add(
-            buttonPanel,
-            new GridBagConstraints(
-                0,
-                2,
-                1,
-                1,
-                1.0,
-                0.0,
-                GridBagConstraints.CENTER,
-                GridBagConstraints.HORIZONTAL,
-                new Insets(0, 0, 0, 0),
-                0,
-                0));
-        buttonPanel.add(
-            applyButton,
-            new GridBagConstraints(
-                1,
-                1,
-                1,
-                1,
-                0.0,
-                0.0,
-                GridBagConstraints.CENTER,
-                GridBagConstraints.NONE,
-                new Insets(4, 4, 4, 4),
-                0,
-                0));
-        buttonPanel.add(
-            forceInvalidConversionsToNullCheckBox,
-            new GridBagConstraints(
-                4,
-                1,
-                1,
-                1,
-                0.0,
-                0.0,
-                GridBagConstraints.CENTER,
-                GridBagConstraints.NONE,
-                new Insets(0, 0, 0, 0),
-                0,
-                0));
-        buttonPanel.add(
-            jPanel2,
-            new GridBagConstraints(
-                3,
-                1,
-                1,
-                1,
-                1.0,
-                0.0,
-                GridBagConstraints.CENTER,
-                GridBagConstraints.HORIZONTAL,
-                new Insets(0, 0, 0, 0),
-                0,
-                0));
-        buttonPanel.add(
-            revertButton,
-            new GridBagConstraints(
-                2,
-                1,
-                1,
-                1,
-                0.0,
-                0.0,
-                GridBagConstraints.CENTER,
-                GridBagConstraints.NONE,
-                new Insets(0, 0, 0, 4),
-                0,
-                0));
+        this.add(jPanel1, new GridBagConstraints(0, 3, 1, 1, 0.0, 0.0,
+                GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL,
+                new Insets(0, 0, 0, 0), 0, 0));
+        jPanel1.add(statusLabel, new GridBagConstraints(0, 0, 1, 1, 1.0, 0.0,
+                GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL,
+                new Insets(0, 0, 0, 0), 0, 0));
+        this.add(buttonPanel, new GridBagConstraints(0, 2, 1, 1, 1.0, 0.0,
+                GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL,
+                new Insets(0, 0, 0, 0), 0, 0));
+        buttonPanel.add(applyButton, new GridBagConstraints(1, 1, 1, 1, 0.0,
+                0.0, GridBagConstraints.CENTER, GridBagConstraints.NONE,
+                new Insets(4, 4, 4, 4), 0, 0));
+        buttonPanel.add(forceInvalidConversionsToNullCheckBox,
+                new GridBagConstraints(4, 1, 1, 1, 0.0, 0.0,
+                        GridBagConstraints.CENTER, GridBagConstraints.NONE,
+                        new Insets(0, 0, 0, 0), 0, 0));
+        buttonPanel.add(jPanel2, new GridBagConstraints(3, 1, 1, 1, 1.0, 0.0,
+                GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL,
+                new Insets(0, 0, 0, 0), 0, 0));
+        buttonPanel.add(revertButton, new GridBagConstraints(2, 1, 1, 1, 0.0,
+                0.0, GridBagConstraints.CENTER, GridBagConstraints.NONE,
+                new Insets(0, 0, 0, 4), 0, 0));
     }
 
     private void reportError(String message) {
         if (message != null) {
             statusLabel.setText(message);
-            
statusLabel.setIcon(GUIUtil.toSmallIcon(IconLoader.icon("Delete.gif")));
+            statusLabel.setIcon(GUIUtil.toSmallIcon(IconLoader
+                    .icon("Delete.gif")));
         } else {
             statusLabel.setText(" ");
             statusLabel.setIcon(null);
@@ -600,9 +716,8 @@
 
     public String validateInput() {
         for (int i = 0; i < table.getColumnCount(); i++) {
-            String error =
-                ((MyEditor) 
table.getColumnModel().getColumn(i).getCellEditor())
-                    .getCurrentErrorMessage();
+            final String error = ((MyEditor) table.getColumnModel()
+                    .getColumn(i).getCellEditor()).getCurrentErrorMessage();
 
             if (error != null) {
                 return error;
@@ -610,7 +725,8 @@
         }
 
         if (geometryCount() > 1) {
-            return 
I18N.get("ui.SchemaPanel.only-one-geometry-field-is-allowed");
+            return I18N
+                    .get("ui.SchemaPanel.only-one-geometry-field-is-allowed");
         }
 
         if (geometryCount() == 0) {
@@ -628,7 +744,7 @@
                 }
 
                 if (getModel().get(i).getType() == null) {
-                    //One of the blank rows. [Jon Aquino]
+                    // One of the blank rows. [Jon Aquino]
                     continue;
                 }
             }
@@ -642,7 +758,7 @@
             return I18N.get("ui.SchemaPanel.field-name-cannot-be-blank");
         }
 
-        //Existing fields are already trimmed. [Jon Aquino]
+        // Existing fields are already trimmed. [Jon Aquino]
         for (int i = 0; i < getModel().getRowCount(); i++) {
             if (i == row) {
                 continue;
@@ -649,12 +765,13 @@
             }
 
             if (getModel().get(i).getName() == null) {
-                //One of the blank rows. [Jon Aquino]
+                // One of the blank rows. [Jon Aquino]
                 continue;
             }
 
             if (getModel().get(i).getName().equalsIgnoreCase(name.trim())) {
-                return I18N.get("ui.SchemaPanel.field-name-already-exists")+": 
" + name;
+                return I18N.get("ui.SchemaPanel.field-name-already-exists")
+                        + ": " + name;
             }
         }
 
@@ -682,8 +799,8 @@
     }
 
     private void fireActionPerformed() {
-        for (Iterator i = listeners.iterator(); i.hasNext();) {
-            ActionListener l = (ActionListener) i.next();
+        for (final Iterator i = listeners.iterator(); i.hasNext();) {
+            final ActionListener l = (ActionListener) i.next();
             l.actionPerformed(null);
         }
     }
@@ -693,37 +810,43 @@
     }
 
     public void move(Collection fieldsToMove, int displacement) {
-        //Use rows-to-act-on, not selected row, because no rows may be selected
-        //i.e. we might just be operating on the row the user right-clicked 
on. [Jon Aquino]
-        int guaranteedVisibleRow = displacement > 0 ? max(rowsToActOn()) : 
min(rowsToActOn());
+        // Use rows-to-act-on, not selected row, because no rows may be 
selected
+        // i.e. we might just be operating on the row the user right-clicked 
on.
+        // [Jon Aquino]
+        int guaranteedVisibleRow = displacement > 0 ? max(rowsToActOn())
+                : min(rowsToActOn());
         guaranteedVisibleRow += displacement;
-        //Compute guaranteedVisibleRow before doing the move, because after the
-        //move the selection would have moved, or if a row were merely clicked 
and not
-        //selected, its click point would *not* have moved -- would tricky to 
compute it
-        //after the move! [Jon Aquino]
+        // Compute guaranteedVisibleRow before doing the move, because after 
the
+        // move the selection would have moved, or if a row were merely clicked
+        // and not
+        // selected, its click point would *not* have moved -- would tricky to
+        // compute it
+        // after the move! [Jon Aquino]
 
-        ArrayList selectedFields = new ArrayList();
-        int[] selectedRows = table.getSelectedRows();
+        final ArrayList selectedFields = new ArrayList();
+        final int[] selectedRows = table.getSelectedRows();
 
-        for (int i = 0; i < selectedRows.length; i++) {
-            selectedFields.add(getModel().get(selectedRows[i]));
+        for (final int selectedRow : selectedRows) {
+            selectedFields.add(getModel().get(selectedRow));
         }
 
         getModel().move(fieldsToMove, displacement);
         table.clearSelection();
 
-        for (Iterator i = selectedFields.iterator(); i.hasNext();) {
-            SchemaTableModel.Field field = (SchemaTableModel.Field) i.next();
-            table.addRowSelectionInterval(getModel().indexOf(field), 
getModel().indexOf(field));
+        for (final Iterator i = selectedFields.iterator(); i.hasNext();) {
+            final SchemaTableModel.Field field = (SchemaTableModel.Field) i
+                    .next();
+            table.addRowSelectionInterval(getModel().indexOf(field), getModel()
+                    .indexOf(field));
         }
-        Rectangle r = table.getCellRect(guaranteedVisibleRow, 0, true);
+        final Rectangle r = table.getCellRect(guaranteedVisibleRow, 0, true);
         table.scrollRectToVisible(r);
     }
 
     private int min(int[] ints) {
         int min = ints[0];
-        for (int i = 0; i < ints.length; i++) {
-            min = Math.min(min, ints[i]);
+        for (final int j : ints) {
+            min = Math.min(min, j);
         }
         return min;
     }
@@ -730,18 +853,17 @@
 
     private int max(int[] ints) {
         int max = ints[0];
-        for (int i = 0; i < ints.length; i++) {
-            max = Math.max(max, ints[i]);
+        for (final int j : ints) {
+            max = Math.max(max, j);
         }
         return max;
     }
 
-
     private class StripingRenderer implements TableCellRenderer {
-        private TableCellRenderer originalRenderer;
+        private final TableCellRenderer originalRenderer;
 
-        //Row-stripe colour recommended in
-        //Java Look and Feel Design Guidelines: Advanced Topics [Jon Aquino]
+        // Row-stripe colour recommended in
+        // Java Look and Feel Design Guidelines: Advanced Topics [Jon Aquino]
         private final Color LIGHT_GRAY = new Color(230, 230, 230);
 
         public StripingRenderer(TableCellRenderer originalRenderer) {
@@ -748,30 +870,24 @@
             this.originalRenderer = originalRenderer;
         }
 
-        public Component getTableCellRendererComponent(
-            JTable table,
-            Object value,
-            boolean isSelected,
-            boolean hasFocus,
-            int row,
-            int column) {
-            JComponent component =
-                (JComponent) originalRenderer.getTableCellRendererComponent(
-                    table,
-                    value,
-                    isSelected,
-                    hasFocus,
-                    row,
-                    column);
+        @Override
+        public Component getTableCellRendererComponent(JTable table,
+                Object value, boolean isSelected, boolean hasFocus, int row,
+                int column) {
+            final JComponent component = (JComponent) originalRenderer
+                    .getTableCellRendererComponent(table, value, isSelected,
+                            hasFocus, row, column);
 
-            //If not editable, use row striping, as recommended in
-            //Java Look and Feel Design Guidelines: Advanced Topics [Jon 
Aquino]
+            // If not editable, use row striping, as recommended in
+            // Java Look and Feel Design Guidelines: Advanced Topics [Jon
+            // Aquino]
             component.setOpaque(true);
 
             if (!isSelected) {
                 component.setForeground(Color.black);
-                component.setBackground(
-                    (layer.isEditable() || ((row % 2) == 0)) ? Color.white : 
LIGHT_GRAY);
+                component
+                        .setBackground((layer.isEditable() || ((row % 2) == 
0)) ? Color.white
+                                : LIGHT_GRAY);
             }
 
             return component;
@@ -780,23 +896,22 @@
 
     public class MyDataTypeEditor extends MyEditor {
         private AttributeType originalType;
+
         public MyDataTypeEditor(Object[] items) {
             super(new JComboBox(items));
 
             final ListCellRenderer originalRenderer = comboBox().getRenderer();
             comboBox().setRenderer(new ListCellRenderer() {
-                public Component getListCellRendererComponent(
-                    JList list,
-                    Object value,
-                    int index,
-                    boolean isSelected,
-                    boolean cellHasFocus) {
-                    Component component = 
originalRenderer.getListCellRendererComponent(
-                            list,
-                            (value != null) ? 
capitalizeFirstLetter(value.toString()) : null,
-                            index,
-                            isSelected,
-                            cellHasFocus);
+                @Override
+                public Component getListCellRendererComponent(JList list,
+                        Object value, int index, boolean isSelected,
+                        boolean cellHasFocus) {
+                    final Component component = originalRenderer
+                            .getListCellRendererComponent(
+                                    list,
+                                    (value != null) ? 
capitalizeFirstLetter(value
+                                            .toString()) : null, index,
+                                    isSelected, cellHasFocus);
                     if (!AttributeType.basicTypes().contains(value)) {
                         component.setForeground(Color.RED);
                     }
@@ -805,19 +920,19 @@
             });
         }
 
-        public Component getTableCellEditorComponent(
-            JTable table,
-            Object value,
-            boolean isSelected,
-            int row,
-            int column) {
+        @Override
+        public Component getTableCellEditorComponent(JTable table,
+                Object value, boolean isSelected, int row, int column) {
             originalType = (AttributeType) value;
-            return super.getTableCellEditorComponent(table, value, isSelected, 
row, column);
+            return super.getTableCellEditorComponent(table, value, isSelected,
+                    row, column);
         }
 
         private JComboBox comboBox() {
             return (JComboBox) getComponent();
         }
+
+        @Override
         public boolean stopCellEditing() {
             if (originalType != comboBox().getSelectedItem()) {
                 markAsModified();
@@ -825,8 +940,10 @@
             return super.stopCellEditing();
         }
 
+        @Override
         protected String validate() {
-            return SchemaPanel.this.validate(row, (AttributeType) 
comboBox().getSelectedItem());
+            return SchemaPanel.this.validate(row, (AttributeType) comboBox()
+                    .getSelectedItem());
         }
     }
 
@@ -842,18 +959,18 @@
             super(textField);
         }
 
-        public Component getTableCellEditorComponent(
-            JTable table,
-            Object value,
-            boolean isSelected,
-            int row,
-            int column) {
+        @Override
+        public Component getTableCellEditorComponent(JTable table,
+                Object value, boolean isSelected, int row, int column) {
             this.row = row;
-            ((JComponent) getComponent()).setBorder(new 
LineBorder(Color.black));
+            ((JComponent) getComponent())
+                    .setBorder(new LineBorder(Color.black));
 
-            return super.getTableCellEditorComponent(table, value, isSelected, 
row, column);
+            return super.getTableCellEditorComponent(table, value, isSelected,
+                    row, column);
         }
 
+        @Override
         public void cancelCellEditing() {
             currentErrorMessage = null;
             updateComponents();
@@ -860,10 +977,12 @@
             super.cancelCellEditing();
         }
 
+        @Override
         public boolean stopCellEditing() {
             try {
                 if (validate() != null) {
-                    ((JComponent) getComponent()).setBorder(new 
LineBorder(Color.red));
+                    ((JComponent) getComponent()).setBorder(new LineBorder(
+                            Color.red));
 
                     return false;
                 }
@@ -870,8 +989,10 @@
 
                 return super.stopCellEditing();
             } finally {
-                //Can't just call #validate at the top of this method, because 
other validations
-                //apply to when the edit is finished (e.g. checking the number 
of geometries). [Jon Aquino]
+                // Can't just call #validate at the top of this method, because
+                // other validations
+                // apply to when the edit is finished (e.g. checking the number
+                // of geometries). [Jon Aquino]
                 currentErrorMessage = validate();
                 updateComponents();
             }
@@ -889,6 +1010,7 @@
             super(new JTextField());
         }
 
+        @Override
         public boolean stopCellEditing() {
             if (!textField().getText().equals(originalText)) {
                 markAsModified();
@@ -898,14 +1020,12 @@
 
         private String originalText;
 
-        public Component getTableCellEditorComponent(
-            JTable table,
-            Object value,
-            boolean isSelected,
-            int row,
-            int column) {
+        @Override
+        public Component getTableCellEditorComponent(JTable table,
+                Object value, boolean isSelected, int row, int column) {
             originalText = (String) value;
-            return super.getTableCellEditorComponent(table, value, isSelected, 
row, column);
+            return super.getTableCellEditorComponent(table, value, isSelected,
+                    row, column);
         }
 
         private JTextField textField() {
@@ -912,6 +1032,7 @@
             return (JTextField) getComponent();
         }
 
+        @Override
         protected String validate() {
             return SchemaPanel.this.validate(row, textField().getText());
         }

Added: core/trunk/src/org/openjump/core/ui/util/FeatureSchemaUtils.java
===================================================================
--- core/trunk/src/org/openjump/core/ui/util/FeatureSchemaUtils.java            
                (rev 0)
+++ core/trunk/src/org/openjump/core/ui/util/FeatureSchemaUtils.java    
2018-04-06 17:00:47 UTC (rev 5742)
@@ -0,0 +1,203 @@
+package org.openjump.core.ui.util;
+
+import it.betastudio.adbtoolbox.libs.FileOperations;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.FileReader;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.util.List;
+
+import javax.swing.JFileChooser;
+
+import org.openjump.core.ui.io.file.FileNameExtensionFilter;
+
+import com.vividsolutions.jump.feature.AttributeType;
+import com.vividsolutions.jump.feature.BasicFeature;
+import com.vividsolutions.jump.feature.Feature;
+import com.vividsolutions.jump.feature.FeatureSchema;
+import com.vividsolutions.jump.workbench.JUMPWorkbench;
+import com.vividsolutions.jump.workbench.model.Layer;
+import com.vividsolutions.jump.workbench.model.LayerEventType;
+import com.vividsolutions.jump.workbench.ui.GUIUtil;
+
+public class FeatureSchemaUtils {
+
+    // [Giuseppe Aruta 2018-04-06] Utils to work with Feature Schema
+
+    // Text file extension
+    final static String EXTENSION = "schema";
+
+    public static String GetSavedFileName;
+
+    /**
+     * save Feature schema of a selected Layer.class to external text file
+     * 
+     * @param layer
+     * @return
+     * @throws Exception
+     */
+    public static boolean saveSchema(Layer layer) throws Exception {
+        String schemaString = "";
+        final JFileChooser chooser = new 
GUIUtil.FileChooserWithOverwritePrompting();
+        chooser.setFileSelectionMode(0);
+        chooser.setDialogType(1);
+        final FileNameExtensionFilter filter = new FileNameExtensionFilter(
+                "Layer schema", EXTENSION);
+        chooser.setFileFilter(filter);
+        File file = null;
+        final String ext = EXTENSION;
+        final int ret = chooser.showSaveDialog(JUMPWorkbench.getInstance()
+                .getFrame());
+        if (ret == 0) {
+            file = chooser.getSelectedFile();
+            String fileName = file.getAbsolutePath();
+            if (!fileName.endsWith("." + ext)) {
+                fileName = fileName + "." + ext;
+            }
+            FileOperations.setFile(file);
+            final File filePrintfFormateStats = new File(fileName);
+            GetSavedFileName = filePrintfFormateStats.getAbsolutePath();
+            final PrintWriter pWriter = new PrintWriter(new FileOutputStream(
+                    filePrintfFormateStats));
+            final FeatureSchema featureSchema = layer
+                    .getFeatureCollectionWrapper().getFeatureSchema();
+            final int numAttributes = featureSchema.getAttributeCount();
+            for (int index = 0; index < numAttributes; index++) {
+                final String name = featureSchema.getAttributeName(index);
+                final AttributeType type = featureSchema
+                        .getAttributeType(index);
+
+                schemaString = name + "\t" + type;
+                pWriter.println(schemaString.trim());
+            }
+            pWriter.close();
+        }
+        return true;
+    }
+
+    private static String readFile(String filePath) {
+        final StringBuilder contentBuilder = new StringBuilder();
+        try (BufferedReader br = new BufferedReader(new FileReader(filePath))) 
{
+
+            String sCurrentLine;
+            while ((sCurrentLine = br.readLine()) != null) {
+                contentBuilder.append(sCurrentLine).append("\n");
+            }
+        } catch (final IOException e) {
+            e.printStackTrace();
+        }
+        return contentBuilder.toString();
+    }
+
+    /**
+     * load feature schema into a selected Layer.class from an external text
+     * file
+     * 
+     * @param layer
+     * @return
+     * @throws Exception
+     */
+    public static boolean loadSchema(Layer layer) throws Exception {
+        final FileNameExtensionFilter filter = new FileNameExtensionFilter(
+                "Layer schema", EXTENSION);
+        final JFileChooser chooser = new JFileChooser();
+        chooser.setFileFilter(filter);
+        chooser.addChoosableFileFilter(filter);
+        chooser.setFileSelectionMode(0);
+        chooser.setDialogType(0);
+        final int result = chooser.showOpenDialog(JUMPWorkbench.getInstance()
+                .getFrame());
+        String schemaString = "";
+        File file = null;
+        if (result == JFileChooser.APPROVE_OPTION) {
+            file = chooser.getSelectedFile();
+            schemaString = readFile(file.getAbsolutePath());
+            final FeatureSchema featureSchema = new FeatureSchema();
+            boolean isSchema = (schemaString.length() > 0);
+            if (isSchema) {
+                int tabIndex = schemaString.indexOf("\t");
+                int crIndex = schemaString.indexOf("\n");
+                boolean endOfString = ((tabIndex < 0) || (crIndex < 0));
+                while (!endOfString) {
+                    final String name = schemaString.substring(0, tabIndex);
+                    final String typeStr = schemaString.substring(tabIndex + 1,
+                            crIndex);
+                    AttributeType type = AttributeType.STRING;
+                    if (typeStr.compareToIgnoreCase("STRING") == 0) {
+                        type = AttributeType.STRING;
+                    } else if (typeStr.compareToIgnoreCase("DOUBLE") == 0) {
+                        type = AttributeType.DOUBLE;
+                    } else if (typeStr.compareToIgnoreCase("INTEGER") == 0) {
+                        type = AttributeType.INTEGER;
+                    } else if (typeStr.compareToIgnoreCase("DATE") == 0) {
+                        type = AttributeType.DATE;
+                    } else if (typeStr.compareToIgnoreCase("GEOMETRY") == 0) {
+                        type = AttributeType.GEOMETRY;
+                    } else if (typeStr.compareToIgnoreCase("OBJECT") == 0) {
+                        type = AttributeType.OBJECT;
+                    } else if (typeStr.compareToIgnoreCase("BOOLEAN") == 0) {
+                        type = AttributeType.BOOLEAN;
+                    } else if (typeStr.compareToIgnoreCase("LONG") == 0) {
+                        type = AttributeType.LONG;
+                    } else {
+                        isSchema = false;
+                        break;
+                    }
+                    featureSchema.addAttribute(name, type);
+                    schemaString = schemaString.substring(crIndex + 1);
+                    tabIndex = schemaString.indexOf("\t");
+                    crIndex = schemaString.indexOf("\n");
+                    endOfString = ((tabIndex < 0) || (crIndex < 0));
+                }
+                isSchema = (featureSchema.getAttributeCount() > 0);
+            }
+            if (isSchema) {
+                final FeatureSchema layerSchema = layer
+                        .getFeatureCollectionWrapper().getFeatureSchema();
+                final int numAttributes = featureSchema.getAttributeCount();
+                boolean changedSchema = false;
+                for (int index = 0; index < numAttributes; index++) {
+                    final String name = featureSchema.getAttributeName(index);
+                    final AttributeType type = featureSchema
+                            .getAttributeType(index);
+
+                    if (!layerSchema.hasAttribute(name)) {
+                        if ((type == AttributeType.STRING)
+                                || (type == AttributeType.DOUBLE)
+                                || (type == AttributeType.INTEGER)
+                                || (type == AttributeType.DATE)
+                                || (type == AttributeType.OBJECT)
+                                || (type == AttributeType.BOOLEAN)
+                                || (type == AttributeType.LONG)) {
+                            layerSchema.addAttribute(name, type);
+                            changedSchema = true;
+                        }
+                    }
+                }
+
+                if (changedSchema) {
+                    final List<Feature> layerFeatures = layer
+                            .getFeatureCollectionWrapper().getFeatures();
+                    for (int j = 0; j < layerFeatures.size(); j++) {
+                        final Feature newFeature = new 
BasicFeature(layerSchema);
+                        final Feature oldFeature = layerFeatures.get(j);
+                        final int numAttribs = 
oldFeature.getAttributes().length;
+
+                        for (int k = 0; k < numAttribs; k++) {
+                            newFeature.setAttribute(k,
+                                    oldFeature.getAttribute(k));
+                        }
+                        oldFeature.setSchema(newFeature.getSchema());
+                        oldFeature.setAttributes(newFeature.getAttributes());
+                    }
+                    layer.setFeatureCollectionModified(true);
+                    layer.fireLayerChanged(LayerEventType.METADATA_CHANGED);
+                }
+            }
+        }
+        return true;
+    }
+}


Property changes on: 
core/trunk/src/org/openjump/core/ui/util/FeatureSchemaUtils.java
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property

------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
Jump-pilot-devel mailing list
Jump-pilot-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/jump-pilot-devel

Reply via email to