001/**
002 * Copyright (C) 2014  Universidade de Aveiro, DETI/IEETA, Bioinformatics Group - http://bioinformatics.ua.pt/
003 *
004 * This file is part of Dicoogle/dicoogle.
005 *
006 * Dicoogle/dicoogle is free software: you can redistribute it and/or modify
007 * it under the terms of the GNU General Public License as published by
008 * the Free Software Foundation, either version 3 of the License, or
009 * (at your option) any later version.
010 *
011 * Dicoogle/dicoogle is distributed in the hope that it will be useful,
012 * but WITHOUT ANY WARRANTY; without even the implied warranty of
013 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
014 * GNU General Public License for more details.
015 *
016 * You should have received a copy of the GNU General Public License
017 * along with Dicoogle.  If not, see <http://www.gnu.org/licenses/>.
018 */
019package pt.ua.dicoogle.rGUI.client.windows;
020
021import java.awt.Image;
022import java.awt.Toolkit;
023import java.io.File;
024import java.net.URL;
025import java.rmi.RemoteException;
026import java.util.ArrayList;
027import java.util.Collections;
028import java.util.Enumeration;
029import java.util.HashMap;
030import java.util.Observable;
031import java.util.Observer;
032
033import javax.swing.DefaultListModel;
034import javax.swing.ImageIcon;
035import javax.swing.JFileChooser;
036import javax.swing.JOptionPane;
037import javax.swing.filechooser.FileFilter;
038import org.slf4j.LoggerFactory;
039
040import pt.ua.dicoogle.common.ExtensionFilter;
041import pt.ua.dicoogle.core.ExportDataSupport;
042import pt.ua.dicoogle.rGUI.client.UserRefs;
043import pt.ua.dicoogle.rGUI.interfaces.controllers.ISearch;
044import pt.ua.dicoogle.sdk.utils.TagValue;
045
046/**
047 * This class is used to select the tags that will be used to export to file
048 *
049 * @author Samuel da Costa Campos <samuelcampos@ua.pt>
050 *
051 */
052@Deprecated
053public class ExportData extends javax.swing.JFrame implements Observer {
054
055    private ISearch search;
056    private HashMap<String, Integer> tags;
057    private HashMap<Integer, TagValue> dimFields;
058    private ArrayList<String> listAvaliable;
059    private ExportDataSupport eds;
060
061    private String query;
062    private boolean keywords;
063    private boolean local;
064    private boolean network;
065    private HashMap<String, Boolean> origins;
066    
067    /** Creates new form ExportData */
068    public ExportData(String query, boolean keywords, HashMap<String, Boolean> origins) {
069        initComponents();
070
071        Image image = Toolkit.getDefaultToolkit().getImage(Thread.currentThread().getContextClassLoader().getResource("trayicon.gif"));
072        this.setIconImage(image);
073        
074        jLabelExporting.setVisible(false);
075
076        try {
077            this.search = UserRefs.getInstance().getSearch();
078            
079            tags = search.getTagList();
080            dimFields = search.getDIMFields();
081
082            this.query = query;
083            this.keywords = keywords;
084            this.origins = origins;
085            
086            fillLists();
087
088        } catch (RemoteException ex) {
089            LoggerFactory.getLogger(ExportData.class).error(ex.getMessage(), ex);
090        }
091    }
092
093    
094    
095     public static Image getImage(final String pathAndFileName) {
096        final URL url = Thread.currentThread().getContextClassLoader().getResource(pathAndFileName);
097        return Toolkit.getDefaultToolkit().getImage(url);
098    }
099    
100    /** This method is called from within the constructor to
101     * initialize the form.
102     * WARNING: Do NOT modify this code. The content of this method is
103     * always regenerated by the Form Editor.
104     */
105    @SuppressWarnings("unchecked")
106    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
107    private void initComponents() {
108
109        jLabelExporting = new javax.swing.JLabel();
110        jTabbedPaneExport = new javax.swing.JTabbedPane();
111        jPanelBasic = new javax.swing.JPanel();
112        jButtonDown = new javax.swing.JButton();
113        jButtonUp = new javax.swing.JButton();
114        jTextFieldAvaliableFilter = new javax.swing.JTextField();
115        jLabel3 = new javax.swing.JLabel();
116        jLabel2 = new javax.swing.JLabel();
117        jLabel1 = new javax.swing.JLabel();
118        jButtonRemove = new javax.swing.JButton();
119        jButtonAdd = new javax.swing.JButton();
120        jScrollPane2 = new javax.swing.JScrollPane();
121        jListExportTags = new javax.swing.JList();
122        jScrollPane1 = new javax.swing.JScrollPane();
123        jListAvaliableTags = new javax.swing.JList();
124        jPanel2 = new javax.swing.JPanel();
125        jScrollPane3 = new javax.swing.JScrollPane();
126        jTextAreaTagList = new javax.swing.JTextArea();
127        jLabel4 = new javax.swing.JLabel();
128        jButtonExport = new javax.swing.JButton();
129        jButtonCancel = new javax.swing.JButton();
130
131        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
132        setTitle("Export Query Results");
133        setMinimumSize(new java.awt.Dimension(679, 387));
134
135        jLabelExporting.setIcon(new ImageIcon(getImage("ajax-loader.gif")));
136        jLabelExporting.setText("Exporting...");
137
138        jButtonDown.setText("Down");
139        jButtonDown.addActionListener(new java.awt.event.ActionListener() {
140            public void actionPerformed(java.awt.event.ActionEvent evt) {
141                jButtonDownActionPerformed(evt);
142            }
143        });
144
145        jButtonUp.setText("Up");
146        jButtonUp.addActionListener(new java.awt.event.ActionListener() {
147            public void actionPerformed(java.awt.event.ActionEvent evt) {
148                jButtonUpActionPerformed(evt);
149            }
150        });
151
152        jTextFieldAvaliableFilter.addKeyListener(new java.awt.event.KeyAdapter() {
153            public void keyReleased(java.awt.event.KeyEvent evt) {
154                jTextFieldAvaliableFilterKeyReleased(evt);
155            }
156        });
157
158        jLabel3.setText("Tags for export:");
159
160        jLabel2.setText("Avaliable Tags:");
161
162        jLabel1.setText("Select Tags to use for export:");
163
164        jButtonRemove.setText("<-");
165        jButtonRemove.addActionListener(new java.awt.event.ActionListener() {
166            public void actionPerformed(java.awt.event.ActionEvent evt) {
167                jButtonRemoveActionPerformed(evt);
168            }
169        });
170
171        jButtonAdd.setText("->");
172        jButtonAdd.addActionListener(new java.awt.event.ActionListener() {
173            public void actionPerformed(java.awt.event.ActionEvent evt) {
174                jButtonAddActionPerformed(evt);
175            }
176        });
177
178        jListExportTags.setSize(new java.awt.Dimension(39, 136));
179        jScrollPane2.setViewportView(jListExportTags);
180
181        jScrollPane1.setViewportView(jListAvaliableTags);
182
183        org.jdesktop.layout.GroupLayout jPanelBasicLayout = new org.jdesktop.layout.GroupLayout(jPanelBasic);
184        jPanelBasic.setLayout(jPanelBasicLayout);
185        jPanelBasicLayout.setHorizontalGroup(
186            jPanelBasicLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
187            .add(0, 992, Short.MAX_VALUE)
188            .add(jPanelBasicLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
189                .add(org.jdesktop.layout.GroupLayout.TRAILING, jPanelBasicLayout.createSequentialGroup()
190                    .addContainerGap()
191                    .add(jPanelBasicLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.TRAILING)
192                        .add(org.jdesktop.layout.GroupLayout.LEADING, jPanelBasicLayout.createSequentialGroup()
193                            .add(jPanelBasicLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
194                                .add(jPanelBasicLayout.createSequentialGroup()
195                                    .add(jLabel2)
196                                    .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
197                                    .add(jTextFieldAvaliableFilter, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 283, Short.MAX_VALUE))
198                                .add(org.jdesktop.layout.GroupLayout.TRAILING, jScrollPane1, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 394, Short.MAX_VALUE))
199                            .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
200                            .add(jPanelBasicLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
201                                .add(jButtonAdd, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 184, Short.MAX_VALUE)
202                                .add(jButtonRemove, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 184, Short.MAX_VALUE)
203                                .add(jButtonUp, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 184, Short.MAX_VALUE)
204                                .add(jButtonDown, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 192, Short.MAX_VALUE))
205                            .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
206                            .add(jPanelBasicLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
207                                .add(jScrollPane2, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 376, Short.MAX_VALUE)
208                                .add(jLabel3))
209                            .add(12, 12, 12))
210                        .add(org.jdesktop.layout.GroupLayout.LEADING, jPanelBasicLayout.createSequentialGroup()
211                            .add(jLabel1)
212                            .add(749, 749, 749)))
213                    .addContainerGap()))
214        );
215        jPanelBasicLayout.setVerticalGroup(
216            jPanelBasicLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
217            .add(0, 461, Short.MAX_VALUE)
218            .add(jPanelBasicLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
219                .add(jPanelBasicLayout.createSequentialGroup()
220                    .addContainerGap()
221                    .add(jLabel1)
222                    .add(jPanelBasicLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.TRAILING)
223                        .add(org.jdesktop.layout.GroupLayout.LEADING, jPanelBasicLayout.createSequentialGroup()
224                            .add(50, 50, 50)
225                            .add(jButtonAdd)
226                            .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
227                            .add(jButtonRemove)
228                            .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED, 182, Short.MAX_VALUE)
229                            .add(jButtonUp)
230                            .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
231                            .add(jButtonDown))
232                        .add(jPanelBasicLayout.createSequentialGroup()
233                            .add(11, 11, 11)
234                            .add(jPanelBasicLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.TRAILING)
235                                .add(org.jdesktop.layout.GroupLayout.LEADING, jPanelBasicLayout.createSequentialGroup()
236                                    .add(4, 4, 4)
237                                    .add(jLabel3)
238                                    .addPreferredGap(org.jdesktop.layout.LayoutStyle.UNRELATED)
239                                    .add(jScrollPane2, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 301, Short.MAX_VALUE))
240                                .add(org.jdesktop.layout.GroupLayout.LEADING, jPanelBasicLayout.createSequentialGroup()
241                                    .add(jPanelBasicLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
242                                        .add(jLabel2)
243                                        .add(jTextFieldAvaliableFilter, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
244                                    .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
245                                    .add(jScrollPane1, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 299, Short.MAX_VALUE)))))
246                    .add(79, 79, 79)))
247        );
248
249        jTabbedPaneExport.addTab("Basic", jPanelBasic);
250
251        jTextAreaTagList.setColumns(20);
252        jTextAreaTagList.setRows(5);
253        jScrollPane3.setViewportView(jTextAreaTagList);
254
255        jLabel4.setText("Write Tags to use for export (one per line):");
256
257        org.jdesktop.layout.GroupLayout jPanel2Layout = new org.jdesktop.layout.GroupLayout(jPanel2);
258        jPanel2.setLayout(jPanel2Layout);
259        jPanel2Layout.setHorizontalGroup(
260            jPanel2Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
261            .add(jPanel2Layout.createSequentialGroup()
262                .add(jPanel2Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
263                    .add(jPanel2Layout.createSequentialGroup()
264                        .add(35, 35, 35)
265                        .add(jLabel4))
266                    .add(jPanel2Layout.createSequentialGroup()
267                        .addContainerGap()
268                        .add(jScrollPane3, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 860, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)))
269                .addContainerGap(126, Short.MAX_VALUE))
270        );
271        jPanel2Layout.setVerticalGroup(
272            jPanel2Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
273            .add(jPanel2Layout.createSequentialGroup()
274                .add(jLabel4)
275                .addPreferredGap(org.jdesktop.layout.LayoutStyle.UNRELATED)
276                .add(jScrollPane3, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 427, Short.MAX_VALUE)
277                .addContainerGap())
278        );
279
280        jTabbedPaneExport.addTab("Expert", jPanel2);
281
282        jButtonExport.setText("Export Data");
283        jButtonExport.addActionListener(new java.awt.event.ActionListener() {
284            public void actionPerformed(java.awt.event.ActionEvent evt) {
285                jButtonExportActionPerformed(evt);
286            }
287        });
288
289        jButtonCancel.setText("Cancel");
290        jButtonCancel.addActionListener(new java.awt.event.ActionListener() {
291            public void actionPerformed(java.awt.event.ActionEvent evt) {
292                jButtonCancelActionPerformed(evt);
293            }
294        });
295
296        org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(getContentPane());
297        getContentPane().setLayout(layout);
298        layout.setHorizontalGroup(
299            layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
300            .add(org.jdesktop.layout.GroupLayout.TRAILING, layout.createSequentialGroup()
301                .add(612, 612, 612)
302                .add(jLabelExporting)
303                .add(101, 101, 101)
304                .add(jButtonExport)
305                .addPreferredGap(org.jdesktop.layout.LayoutStyle.UNRELATED)
306                .add(jButtonCancel)
307                .add(29, 29, 29))
308            .add(layout.createSequentialGroup()
309                .addContainerGap()
310                .add(jTabbedPaneExport, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 1013, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
311                .addContainerGap(32, Short.MAX_VALUE))
312        );
313        layout.setVerticalGroup(
314            layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
315            .add(org.jdesktop.layout.GroupLayout.TRAILING, layout.createSequentialGroup()
316                .addContainerGap()
317                .add(jTabbedPaneExport, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 507, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
318                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED, 38, Short.MAX_VALUE)
319                .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
320                    .add(jButtonExport)
321                    .add(jButtonCancel)
322                    .add(jLabelExporting))
323                .addContainerGap())
324        );
325
326        pack();
327    }// </editor-fold>//GEN-END:initComponents
328
329    private void jButtonCancelActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButtonCancelActionPerformed
330        this.dispose();
331    }//GEN-LAST:event_jButtonCancelActionPerformed
332
333    private void jButtonAddActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButtonAddActionPerformed
334        int index =  jListAvaliableTags.getSelectedIndex();
335
336        if (index == -1)
337            return;
338
339        // removes the selected element of the list of avaliable tags
340        DefaultListModel model = (DefaultListModel) jListAvaliableTags.getModel();
341        String tagName = (String) model.getElementAt(index);
342        listAvaliable.remove(tagName);
343        updateAvaliableList(jTextFieldAvaliableFilter.getText());
344
345        // inserts the element in the list of tags to be exported
346        model = (DefaultListModel) jListExportTags.getModel();
347        model.addElement(tagName);
348        jListExportTags.setModel(model);
349    }//GEN-LAST:event_jButtonAddActionPerformed
350
351    private void jButtonRemoveActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButtonRemoveActionPerformed
352        int index =  jListExportTags.getSelectedIndex();
353
354        if (index == -1)
355            return;
356
357        // removes the selected element of the list of export tags
358        DefaultListModel model = (DefaultListModel) jListExportTags.getModel();
359        String tagName = (String) model.getElementAt(index);
360        model.remove(index);
361        jListExportTags.setModel(model);
362
363        // inserts the element in the list of avaliable tags
364        listAvaliable.add(tagName);
365
366        //sort the list of avaliable tags
367        Collections.sort(listAvaliable);
368
369        updateAvaliableList(jTextFieldAvaliableFilter.getText());
370    }//GEN-LAST:event_jButtonRemoveActionPerformed
371
372    private void jButtonExportActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButtonExportActionPerformed
373
374        DefaultListModel list = (DefaultListModel) jListExportTags.getModel();
375
376        //if(list.isEmpty())
377        //    return;
378
379        JFileChooser chooser = new JFileChooser();
380        chooser.setCurrentDirectory(new File("."));
381        chooser.setDialogTitle("Export File Name");
382        
383        chooser.setDialogType(JFileChooser.SAVE_DIALOG);
384        chooser.setAcceptAllFileFilterUsed(false);
385        chooser.setApproveButtonText("Save");
386
387        FileFilter fileType = new ExtensionFilter("Comma-separated values", ".csv");
388
389        chooser.setFileFilter(fileType);
390        
391        if (chooser.showOpenDialog(this) == JFileChooser.APPROVE_OPTION){
392            String filePath = chooser.getSelectedFile().toString();
393
394            Enumeration<String> en = (Enumeration<String>) list.elements();
395            ArrayList<String> tagList = new ArrayList<String>();
396            if (jTabbedPaneExport.getSelectedIndex()==0)
397            {
398                
399                // Basic
400                while(en.hasMoreElements())
401                    tagList.add(en.nextElement());
402            }
403            else if (jTabbedPaneExport.getSelectedIndex()==1)
404            {
405                
406                String text = jTextAreaTagList.getText();
407                String [] arr = text.split("\n");
408            
409                for (String s:arr)
410                {
411                    if (!s.isEmpty())
412                    {
413                        tagList.add(s);
414                    }
415                }
416                
417            }
418            //System.out.println("Exporting with File Path: " + filePath);
419
420            try {
421                jLabelExporting.setVisible(true);
422
423                this.eds = new ExportDataSupport(query, origins, keywords, tagList, filePath);
424                //eds.addObserver(this);
425                this.eds.InitiateExport(this);
426                jListAvaliableTags.setEnabled(false);
427                jListExportTags.setEnabled(false);
428                jButtonAdd.setEnabled(false);
429                jButtonRemove.setEnabled(false);
430                jButtonExport.setEnabled(false);
431                jButtonCancel.setEnabled(false);
432                
433            } catch (Exception ex) {
434                LoggerFactory.getLogger(ExportData.class).error(ex.getMessage(), ex);
435            }
436        }
437    }//GEN-LAST:event_jButtonExportActionPerformed
438
439    private void jTextFieldAvaliableFilterKeyReleased(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_jTextFieldAvaliableFilterKeyReleased
440        updateAvaliableList(jTextFieldAvaliableFilter.getText());
441    }//GEN-LAST:event_jTextFieldAvaliableFilterKeyReleased
442
443    private void jButtonUpActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButtonUpActionPerformed
444        int index =  jListExportTags.getSelectedIndex();
445
446        if(index > 0){
447            DefaultListModel model = (DefaultListModel) jListExportTags.getModel();
448            Object element1 = model.getElementAt(index-1);
449            Object element2 = model.getElementAt(index);
450
451            model.set(index, element1);
452            model.set(index-1, element2);
453
454            jListExportTags.setModel(model);
455            jListExportTags.setSelectedIndex(index-1);
456        }
457    }//GEN-LAST:event_jButtonUpActionPerformed
458
459    private void jButtonDownActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButtonDownActionPerformed
460        int index =  jListExportTags.getSelectedIndex();
461        DefaultListModel model = (DefaultListModel) jListExportTags.getModel();
462
463        if(index > -1 && index < model.size()){
464
465            Object element1 = model.getElementAt(index);
466            Object element2 = model.getElementAt(index+1);
467
468            model.set(index+1, element1);
469            model.set(index, element2);
470
471            jListExportTags.setModel(model);
472            jListExportTags.setSelectedIndex(index+1);
473        }
474    }//GEN-LAST:event_jButtonDownActionPerformed
475
476    // Variables declaration - do not modify//GEN-BEGIN:variables
477    private javax.swing.JButton jButtonAdd;
478    private javax.swing.JButton jButtonCancel;
479    private javax.swing.JButton jButtonDown;
480    private javax.swing.JButton jButtonExport;
481    private javax.swing.JButton jButtonRemove;
482    private javax.swing.JButton jButtonUp;
483    private javax.swing.JLabel jLabel1;
484    private javax.swing.JLabel jLabel2;
485    private javax.swing.JLabel jLabel3;
486    private javax.swing.JLabel jLabel4;
487    private javax.swing.JLabel jLabelExporting;
488    private javax.swing.JList jListAvaliableTags;
489    private javax.swing.JList jListExportTags;
490    private javax.swing.JPanel jPanel2;
491    private javax.swing.JPanel jPanelBasic;
492    private javax.swing.JScrollPane jScrollPane1;
493    private javax.swing.JScrollPane jScrollPane2;
494    private javax.swing.JScrollPane jScrollPane3;
495    private javax.swing.JTabbedPane jTabbedPaneExport;
496    private javax.swing.JTextArea jTextAreaTagList;
497    private javax.swing.JTextField jTextFieldAvaliableFilter;
498    // End of variables declaration//GEN-END:variables
499
500
501    /**
502     * Fill the list of avaliable tags and the default list of export tags with DIM Fields
503     */
504    private void fillLists(){
505        DefaultListModel listModel = new DefaultListModel();
506
507        ArrayList<TagValue> list = new ArrayList<TagValue>( dimFields.values());
508        ArrayList<String> listDIM = new ArrayList<String>();
509        
510        for(TagValue tag : list)
511            listDIM.add(tag.getAlias());
512
513        Collections.sort(listDIM);
514
515        for(String tag : listDIM)
516            listModel.addElement(tag);
517
518        jListExportTags.setModel(listModel);
519
520
521        ArrayList<String> listTags = new ArrayList<String>(tags.keySet());
522        listAvaliable = new ArrayList<String>();
523
524        for(String tag: listTags)
525            if(!listDIM.contains(tag))
526                listAvaliable.add(tag);
527
528        listAvaliable.add("FileName");
529        listAvaliable.add("FilePath");
530
531        //sort the list of avaliable tags
532        Collections.sort(listAvaliable);
533
534        updateAvaliableList(null);
535    }
536
537    @Override
538    public void update(Observable o, Object arg) {
539        if (o==null)
540        {
541            LoggerFactory.getLogger(ExportData.class).error("Update invoked with null o");
542            return;
543        }
544        LoggerFactory.getLogger(ExportData.class).debug("Update");
545        Boolean finish = (Boolean) arg;
546        
547        class AuxThread extends Thread
548        {
549            private javax.swing.JFrame t;
550            public void set(javax.swing.JFrame t)
551            {
552                this.t = t;
553            }
554            
555            @Override
556            public void run() 
557            {
558                
559                JOptionPane.showMessageDialog(t, "Query results successfully exported!", "Export Query Results", JOptionPane.INFORMATION_MESSAGE);
560                t.dispose();
561            }
562        };
563        
564        if (finish)
565        {
566            AuxThread _thread = new AuxThread();
567            _thread.set(this);
568            _thread.start();
569            
570            this.setVisible(false);
571        }
572    }
573
574    /**
575     * Update the avaliable tags jList based on a String prefix to filter tags
576     * If you don't want to filter anything, send the prefix NULL or "" (empty string)
577     *
578     * @param prefix - string with the start of tag name to filter
579     */
580    private void updateAvaliableList(String prefix){
581        DefaultListModel listModel = new DefaultListModel();
582
583        for(String tag: listAvaliable){
584            if(prefix != null && !prefix.equals("")){
585                if(tag.toLowerCase().startsWith(prefix.toLowerCase()))
586                    listModel.addElement(tag);
587            }
588            else
589                listModel.addElement(tag);
590        }
591
592        jListAvaliableTags.setModel(listModel);
593    }
594
595}