From 884847990a8b4f43d0c6e162d5f1262b0f4f4b91 Mon Sep 17 00:00:00 2001
From: psanxiao <psanxiao@icarto.es>
Date: Tue, 20 Sep 2011 13:29:12 +0200
Subject: [PATCH 2/2] Added new feature to filter dialog: Export selected to csv file


Signed-off-by: psanxiao <psanxiao@icarto.es>
---
 src/com/iver/cit/gvsig/FiltroExtension.java        |   93 +++++++++++++++++++-
 src/com/iver/cit/gvsig/TableOperations.java        |    3 +
 .../cit/gvsig/gui/filter/ExpressionListener.java   |    1 +
 .../iver/cit/gvsig/gui/filter/FilterDialog.java    |   23 +++++
 4 files changed, 119 insertions(+), 1 deletions(-)

diff --git a/src/com/iver/cit/gvsig/FiltroExtension.java b/src/com/iver/cit/gvsig/FiltroExtension.java
index c340e94..8418556 100644
--- a/src/com/iver/cit/gvsig/FiltroExtension.java
+++ b/src/com/iver/cit/gvsig/FiltroExtension.java
@@ -41,9 +41,14 @@
 package com.iver.cit.gvsig;
 
 import java.awt.Component;
+import java.io.File;
+import java.io.FileOutputStream;
 import java.io.IOException;
+import java.io.PrintStream;
 
+import javax.swing.JFileChooser;
 import javax.swing.JOptionPane;
+import javax.swing.filechooser.FileNameExtensionFilter;
 
 import com.hardcode.driverManager.DriverLoadException;
 import com.hardcode.gdbms.driver.exceptions.ReadDriverException;
@@ -377,4 +382,90 @@ public class FiltroExtension extends Extension implements ExpressionListener {
 		else
 			return false;
 	}
-}
+
+	@Override
+	public void exportSet(String expression) {
+	    File file = null;
+	    FileNameExtensionFilter filter = new FileNameExtensionFilter(
+	    PluginServices.getText(this, "CSV_file"), "csv");
+	    newSet(expression);
+	     
+	    JFileChooser fc = new JFileChooser();
+	    fc.setFileFilter(filter);
+	    int returnVal = fc.showSaveDialog(vista);
+
+	    do {
+		if (returnVal == JFileChooser.CANCEL_OPTION) {
+		    break;
+	    	} else {
+	    	    file = fc.getSelectedFile();
+	    	    if (!file.getName().toLowerCase().endsWith(".csv")) {
+	    		file = new File(file.getAbsolutePath() + ".csv");
+	    	    }
+	    	    if (file.exists()) {
+	    		int overwriteFile = JOptionPane.showConfirmDialog(null, PluginServices.getText(
+	    			this, "file_already_exists"),
+	    			PluginServices.getText(this, "warning"),
+	    			JOptionPane.YES_NO_OPTION);
+	    		 if (overwriteFile == JOptionPane.NO_OPTION) {
+	    		     continue;
+	    		 }
+	    	    }
+
+	    	    if (writeSelectionToFile(getCSVContentsFromSelectedRecords(), file)) {
+	    		NotificationManager.showMessageError("error_saving_file", null);
+	    	    }
+	    	}
+	    
+	    } while (file == null);
+	 }
+	    
+	 private boolean writeSelectionToFile(String contents, File file) {
+	     FileOutputStream fos = null;
+	     PrintStream ps = null;
+	     boolean error = false;
+	     try {
+		 fos = new FileOutputStream(file);
+	    	 ps = new PrintStream(fos);
+	    	 ps.println(contents);
+	     } catch (IOException e1) {
+	    	 error = true;
+	    	 e1.printStackTrace();
+	     } finally {
+	    	 if (ps != null) {
+	    	     ps.close();
+	    	 }
+	    	 if (fos != null) {
+	    	     try {
+	    		 fos.close();
+	    	     } catch (IOException e) {
+	    		 error = true;
+	    	     }
+	    	 }
+	     }
+	    	return error;
+	    } 
+
+	 private String getCSVContentsFromSelectedRecords() {
+	     String contents = "";
+	     try {
+		 String[] fieldNames = dataSource.getFieldNames();
+		 for (int i = 0; i < fieldNames.length; i++) {
+		     contents = contents + fieldNames[i] + ";";
+	    	 }
+	    	 contents = contents + "\n";
+	    	 for (int i = 0; i < dataSource.getRowCount(); i++) {
+	    	     if (dataSource.isSelected(i)) {
+	    		 for (int j = 0; j < dataSource.getFieldCount(); j++) {
+	    		     contents = contents + dataSource.getFieldValue(i, j) + ";";
+	    		 }
+	    		 contents = contents + "\n";
+	    	     }
+	    	 }
+	    	} catch (ReadDriverException e1) {
+	    	    // TODO Auto-generated catch block
+	    	    e1.printStackTrace();
+	     	}
+	    	return contents;
+	 }
+}	
\ No newline at end of file
diff --git a/src/com/iver/cit/gvsig/TableOperations.java b/src/com/iver/cit/gvsig/TableOperations.java
index d43a048..913f2b0 100644
--- a/src/com/iver/cit/gvsig/TableOperations.java
+++ b/src/com/iver/cit/gvsig/TableOperations.java
@@ -518,4 +518,7 @@ public class TableOperations extends Extension implements ExpressionListener {
 		return fieldName.replaceAll("\\W", "_"); // replace any non-word character by an underscore
 	}
 
+	@Override
+	public void exportSet(String expression) {
+	}
 }
diff --git a/src/com/iver/cit/gvsig/gui/filter/ExpressionListener.java b/src/com/iver/cit/gvsig/gui/filter/ExpressionListener.java
index 0bedfbe..a11df95 100644
--- a/src/com/iver/cit/gvsig/gui/filter/ExpressionListener.java
+++ b/src/com/iver/cit/gvsig/gui/filter/ExpressionListener.java
@@ -44,4 +44,5 @@ public interface ExpressionListener {
 	public void newSet(String expression);
 	public void addToSet(String expression);
 	public void fromSet(String expression);
+	public void exportSet(String expression);
 }
diff --git a/src/com/iver/cit/gvsig/gui/filter/FilterDialog.java b/src/com/iver/cit/gvsig/gui/filter/FilterDialog.java
index 37bd654..3ed7cc2 100644
--- a/src/com/iver/cit/gvsig/gui/filter/FilterDialog.java
+++ b/src/com/iver/cit/gvsig/gui/filter/FilterDialog.java
@@ -196,6 +196,29 @@ public class FilterDialog extends TableFilterQueryJPanel implements IWindow, IWi
 				});
 			}
 		});
+		
+		// Listener for "btnExportSet"
+		// Export selected elements in the table to csv file that are according
+		// the current filter
+		// condition
+		getBtnExportSet().addActionListener(new java.awt.event.ActionListener() {
+			public void actionPerformed(java.awt.event.ActionEvent e) {
+				final String expr = "select * from '" + 
+				model.getDataSourceName() + "' where " + 
+				getTxtExpression().getText() + ";";
+		
+				logger.debug(expr);
+			
+				PluginServices.backgroundExecution(new Runnable() {
+					public void run() {
+						for (int i = 0; i < expressionListeners.size(); i++) {
+							ExpressionListener l = (ExpressionListener) expressionListeners.get(i);
+							l.exportSet(expr);
+						}
+					}
+				});
+			}
+		});
 
 		// Listener for "fieldsJTree"
 		getFieldsJTree().addMouseListener(new MouseAdapter() {
-- 
1.7.1

