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