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 */
019
020/*
021 * MainWindow.java
022 *
023 * Created on 9 de Novembro de 2007, 11:25
024 */
025package pt.ua.dicoogle.rGUI.client.windows;
026
027import org.apache.commons.codec.binary.Base64;
028import org.jvnet.substance.SubstanceLookAndFeel;
029import org.jvnet.substance.skin.*;
030import org.slf4j.LoggerFactory;
031import pt.ua.dicoogle.Main;
032import pt.ua.dicoogle.core.ClientSettings;
033import pt.ua.dicoogle.core.QueryHistorySupport;
034import pt.ua.dicoogle.plugins.NetworkMember;
035import pt.ua.dicoogle.plugins.PluginController;
036import pt.ua.dicoogle.rGUI.RFileBrowser.FileAction;
037import pt.ua.dicoogle.rGUI.RFileBrowser.RemoteFile;
038import pt.ua.dicoogle.rGUI.RFileBrowser.RemoteFileChooser;
039import pt.ua.dicoogle.rGUI.client.AdminRefs;
040import pt.ua.dicoogle.rGUI.client.ClientCore;
041import pt.ua.dicoogle.rGUI.client.UIHelper.DisplayJAI;
042import pt.ua.dicoogle.rGUI.client.UIHelper.OSXAdapter;
043import pt.ua.dicoogle.rGUI.client.UIHelper.Result2Tree;
044import pt.ua.dicoogle.rGUI.client.UIHelper.TrayIconCreator;
045import pt.ua.dicoogle.rGUI.client.UserRefs;
046import pt.ua.dicoogle.rGUI.fileTransfer.FileReceiver;
047import pt.ua.dicoogle.rGUI.fileTransfer.TransferStatus;
048import pt.ua.dicoogle.rGUI.server.controllers.PluginController4user;
049import pt.ua.dicoogle.sdk.datastructs.SearchResult;
050import pt.ua.dicoogle.sdk.task.JointQueryTask;
051import pt.ua.dicoogle.sdk.task.Task;
052import pt.ua.dicoogle.utils.Dicom2JPEG;
053
054import javax.imageio.ImageIO;
055import javax.swing.GroupLayout.Group;
056import javax.swing.GroupLayout.ParallelGroup;
057import javax.swing.GroupLayout.SequentialGroup;
058import javax.swing.*;
059import javax.swing.tree.DefaultMutableTreeNode;
060import javax.swing.tree.DefaultTreeModel;
061import javax.swing.tree.TreePath;
062import javax.swing.tree.TreeSelectionModel;
063import java.awt.*;
064import java.awt.event.KeyEvent;
065import java.awt.event.MouseEvent;
066import java.awt.image.RenderedImage;
067import java.io.ByteArrayInputStream;
068import java.io.File;
069import java.io.IOException;
070import java.net.URL;
071import java.rmi.RemoteException;
072import java.text.SimpleDateFormat;
073import java.util.AbstractMap.SimpleEntry;
074import java.util.*;
075import java.util.List;
076import java.util.concurrent.ExecutionException;
077import java.util.concurrent.Semaphore;
078
079/**
080 * Dicoogle GUI Main form
081 *
082 * @author Filipe Freitas
083 * @author Luís A. Bastião Silva <bastiao@ua.pt>
084 * @author Marco Pereira
085 * @author João Pereira
086 * @author Samuel Campos <samuelcampos@ua.pt>
087 * @author Carlos Ferreira <c.ferreira@ua.pt>
088 * @author Frederico Valente
089 */
090@Deprecated
091public class MainWindow extends javax.swing.JFrame {
092
093    private Result2Tree searchTree;
094    private static MainWindow instance = null;
095    private static Semaphore sem = new Semaphore(1, true);
096    private ClientCore clientCore;
097    //private DefaultMutableTreeNode top = null;
098
099    /*
100     * Information about last query executed
101     * It is usefull to the Export Module
102     */
103    private String lastQueryExecuted;
104    private boolean lastQueryKeywords;
105    private boolean lastQueryAdvanced;
106    private ArrayList<javax.swing.JCheckBox> ranges;
107
108    //a popup menu for plugin extension on retrieved results
109    private JPopupMenu popupMenu = new JPopupMenu();
110
111    public static synchronized MainWindow getInstance() {
112        try {
113            sem.acquire();
114            if (instance == null) {
115                instance = new MainWindow();
116            }
117            sem.release();
118        } catch (InterruptedException ex) {
119            LoggerFactory.getLogger(MainWindow.class).error(ex.getMessage(), ex);
120        }
121        return instance;
122    }
123
124    public static Image getImage(final String pathAndFileName) {
125        final URL url = Thread.currentThread().getContextClassLoader().getResource(pathAndFileName);
126        return Toolkit.getDefaultToolkit().getImage(url);
127    }
128    private final TaskList taskList;
129
130    /**
131     * Creates new form MainWindow
132     */
133    private MainWindow() {
134        ranges = new ArrayList<>();
135        List<String> names = null;
136        try {
137            names = PluginController4user.getInstance().getPluginNames();
138            for (String name : names) {
139                JCheckBox newJCB = new JCheckBox(name);
140                if (PluginController4user.getInstance().isLocalPlugin(name)) {
141                    newJCB.setSelected(true);
142                }
143                this.ranges.add(newJCB);
144            }
145        } catch (RemoteException ex) {
146            LoggerFactory.getLogger(MainWindow.class).error(ex.getMessage(), ex);
147        }
148
149        initComponents();
150
151        javax.swing.GroupLayout jPanel6Layout = new javax.swing.GroupLayout(jPanel6);
152        jPanel6.setLayout(jPanel6Layout);
153        SequentialGroup groupBoxesH = jPanel6Layout.createSequentialGroup().addComponent(jLabel2);
154        ParallelGroup groupBoxesV = jPanel6Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE).addComponent(jLabel2);
155
156        for (JCheckBox cbox : this.ranges) {
157            groupBoxesH.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED).addComponent(cbox);
158            groupBoxesV.addComponent(cbox);
159        }
160
161        Group groupH = jPanel6Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).
162                addGroup(groupBoxesH.addContainerGap(10, Short.MAX_VALUE));
163
164        Group groupV = jPanel6Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addGroup(jPanel6Layout.createSequentialGroup().addGroup(groupBoxesV).addContainerGap(5, Short.MAX_VALUE));
165
166        jPanel6Layout.setHorizontalGroup(groupH);
167        jPanel6Layout.setVerticalGroup(groupV);
168
169        Image image = getImage("trayicon.gif");
170        this.setIconImage(image);
171
172        clientCore = ClientCore.getInstance();
173
174        if (!clientCore.isAdmin()) {
175            jMenu10.setVisible(false);
176            jMenuItemShutdown.setVisible(false);
177            jMenuDirScan2.setVisible(false);
178
179            //jPanel8.setVisible(false);
180            jButtonServices.setVisible(false);
181            jButtonPreferences.setVisible(false);
182            jButtonLogs.setVisible(false);
183        }
184
185        if (!clientCore.isUser()) {
186            jPanel5.setVisible(false);
187            jButtonClientPreferences.setVisible(false);
188        } else {
189            searchTree = Result2Tree.getInstance();
190        }
191
192        if (Main.isFixedClient()) {
193            jMenuItemShutdown.setVisible(false);
194
195        } else {
196            jMenuItem7.setVisible(false);
197        }
198
199        jLabelResults.setText("Enter your terms and hit the button.");
200        SelectDefaultSearch.setSelected(true);
201        SelectAdvancedSearch.setSelected(false);
202        jPanel2.setVisible(false);
203        ModalSelectNone.setSelected(false);
204        ModalSelectAll.setSelected(true);
205        ModalCR.setSelected(true);
206        ModalCT.setSelected(true);
207        ModalDX.setSelected(true);
208        ModalES.setSelected(true);
209        ModalMG.setSelected(true);
210        ModalMR.setSelected(true);
211        ModalNM.setSelected(true);
212        ModalOT.setSelected(true);
213        ModalPT.setSelected(true);
214        ModalRF.setSelected(true);
215        ModalSC.setSelected(true);
216        ModalUS.setSelected(true);
217        ModalXA.setSelected(true);
218
219        StudyDateRangeInitialBoundary.setEnabled(false);
220        StudyDateRangeTerminalBoundary.setEnabled(false);
221        DateRange.setSelected(false);
222        ExactDate.setSelected(true);
223
224        StudyDateRangeInitialBoundaryActivation.setEnabled(false);
225        StudyDateRangeTerminalBoundaryActivation.setEnabled(false);
226        StudyDateRangeInitialBoundary.setEnabled(false);
227        StudyDateRangeTerminalBoundary.setEnabled(false);
228
229        //tree view init
230        jTreeResults.setModel(new DefaultTreeModel(Result2Tree.getInstance().getTop()));
231        jTreeResults.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
232
233        jButtonDownload.setEnabled(false);
234        jButtonView.setEnabled(false);
235        jButtonDump.setEnabled(false);
236        this.resizeWindow();
237        registerForMacOSXEvents();
238        centerWindow();
239
240//////////////////////////////////////////////////////////////
241        /**
242         * This search is needed to autocomplete
243         */
244        /*
245         QueryResults q = new QueryResults("*:*");
246        
247        
248         List<String> items = q.getFields();
249        
250        
251        
252         boolean strictMatching = false;
253         AutoCompleteDecorator.decorate(jTextFieldQuery, items, strictMatching);
254         *
255         */
256        //plugins v2
257        try {
258            List<JPanel> panels = PluginController4user.getInstance().getTabPanels();
259            if (panels != null) {
260                for (JPanel panel : panels) {
261                    tabPanel.add(panel);
262                }
263            }
264        } catch (RemoteException ex) {
265            LoggerFactory.getLogger(MainWindow.class).error(ex.getMessage(), ex);
266        }
267
268        try {
269            List<JMenuItem> menus = PluginController4user.getInstance().getPluginMenus();
270            if (menus != null) {
271                for (JMenuItem menu : menus) {
272                    pluginMenu.add(menu);
273                }
274            }
275        } catch (RemoteException ex) {
276            LoggerFactory.getLogger(MainWindow.class).error(ex.getMessage(), ex);
277        }
278
279        try {
280            System.err.println("Checking for plugins requiring gui expansion.,.");
281            List<JMenuItem> items = PluginController4user.getInstance().getRightButtonItems();
282            if (items != null) {
283                for (JMenuItem item : items) {
284                    popupMenu.add(item);
285                }
286            }
287        } catch (RemoteException ex) {
288            LoggerFactory.getLogger(MainWindow.class).error(ex.getMessage(), ex);
289        }
290
291        taskList = new TaskList();
292        taskList.setName("Task Progress");
293        tabPanel.add(taskList);
294
295    }
296
297    /**
298     * Center the main Window taking into account the Screen Size
299     */
300    private void centerWindow() {
301        // Positions the window in the center of screen
302        int width = this.getWidth();
303        int height = this.getHeight();
304        Dimension screen = Toolkit.getDefaultToolkit().getScreenSize();
305        int x = (screen.width - width) / 2;
306        int y = (screen.height - height) / 2;
307        setBounds(x, y, width, height);
308    }
309
310    private void resizeWindow() {
311        Dimension screen = Toolkit.getDefaultToolkit().getScreenSize();
312        this.setSize(screen.width - 30, screen.height - 50);
313    }
314
315    /**
316     * Register the Events to Quit and About if Dicoogle is running on Mac_OSX
317     */
318    private void registerForMacOSXEvents() {
319        if (Main.MAC_OS_X) {
320            try {
321                //System.out.println("Registering MAC_OSX Events");
322
323                // Generate and register the OSXAdapter, passing it a hash of all the methods we wish to
324                // use as delegates for various com.apple.eawt.ApplicationListener methods
325                if (Main.isFixedClient()) {
326                    OSXAdapter.setQuitHandler(this, getClass().getDeclaredMethod("exit", (Class[]) null));
327                } else {
328                    OSXAdapter.setQuitHandler(this, getClass().getDeclaredMethod("exitClient", (Class[]) null));
329                }
330
331                OSXAdapter.setAboutHandler(this, getClass().getDeclaredMethod("about", (Class[]) null));
332                //OSXAdapter.setPreferencesHandler(this, getClass().getDeclaredMethod("preferences", (Class[])null));
333                //OSXAdapter.setFileHandler(this, getClass().getDeclaredMethod("loadImageFile", new Class[] { String.class }));
334
335            } catch (Exception e) {
336                System.err.println("Error while loading the OSXAdapter:");
337                e.printStackTrace();
338            }
339        }
340    }
341
342    public void exit() {
343        jMenuItem1ActionPerformed(null);
344    }
345
346    public void exitClient() {
347        jMenuItem11ActionPerformed(null);
348    }
349
350    public void about() {
351        jMenuItem3ActionPerformed(null);
352    }
353
354    /**
355     * ************************************************
356     * Private Methods
357     *************************************************
358     */
359    /**
360     * Stops the window from minimizing to tray while in options screen
361     */
362    private void showOptions() {
363    }
364
365    private void cleanThumbnails() {
366//        Result2Tree.showImage("Image Thumbnail", null, jPanelThumbnail);
367        jPanelThumbnail.setSize(64, 64);
368        repaint();
369        return;
370    }
371
372    /**
373     *  * @author Joaoffr  <joaoffr@ua.pt>
374     *  * @author DavidP   <davidp@ua.pt>
375     * @param t
376     * @return
377     */
378    private String convMillisToTimeString(long t) {
379        long milis = t % 1000;
380        t /= 1000;
381        long segs = t % 60;
382        t /= 60;
383        long mins = t % 60;
384        t /= 60;
385        long hours = t % 60;
386        t /= 24;
387        long days = t;
388
389        return String.format("%d:%02d:%02d:%02d", days, hours, mins, segs);
390    }
391
392    private void dcm2JPEG(int thumbnailSize) {
393
394        /**
395         * Why couldn't? It works!
396         *
397         * if (System.getProperty("os.name").toUpperCase().indexOf("MAC OS") !=
398         * -1) { JOptionPane.showMessageDialog(this, "Operation Not Available to
399         * MAC OS.", "Missing JAI Tool", JOptionPane.WARNING_MESSAGE); return; }
400         */
401        String pathDir = ".";
402
403        JFileChooser chooser = new JFileChooser();
404        chooser.setCurrentDirectory(new java.io.File(pathDir));
405        chooser.setDialogTitle("Dicoogle Dcm2JPG - Select DICOM File");
406        chooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
407        //chooser.setFileFilter(arg0)
408        chooser.setAcceptAllFileFilterUsed(false);
409
410        if (chooser.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) {
411            File filePath = new File(chooser.getSelectedFile().toString());
412            if (filePath.exists() && filePath.isFile() && filePath.canRead()) {
413                File jpgFile = new File(filePath.getAbsolutePath() + ".jpg");
414                Dicom2JPEG.convertDicom2Jpeg(filePath, jpgFile, thumbnailSize);
415            }
416        }
417    }
418
419    /**
420     * @return ArrayList<String> with selected items in the tree
421     */
422    private ArrayList<String> getSelectedLocalFiles() {
423        ArrayList<String> files = new ArrayList<String>();
424
425        TreePath path = jTreeResults.getSelectionPath();
426
427        // Tree Root is not permited
428        if (path == null || path.getPathCount() < 2) {
429            return null;
430        }
431
432        jTreeResults.expandPath(path);
433
434        if (path != null) {
435            DefaultMutableTreeNode node = (DefaultMutableTreeNode) path.getLastPathComponent();
436
437            // recieves all childs
438            ArrayList<DefaultMutableTreeNode> childs = getLocalLeafs(node, path);
439
440            Iterator<DefaultMutableTreeNode> it = childs.iterator();
441
442            // converts TreeNodes to filePaths
443            while (it.hasNext()) {
444                Object obj = it.next().getUserObject();
445
446                if (SearchResult.class.isInstance(obj)) {
447                    files.add(obj.toString());
448                }
449            }
450        }
451
452        return files;
453    }
454
455    private ArrayList<DefaultMutableTreeNode> getLocalLeafs(DefaultMutableTreeNode node, TreePath path) {
456        ArrayList<DefaultMutableTreeNode> list = new ArrayList<DefaultMutableTreeNode>();
457        TreePath temp;
458
459        if (node.isLeaf()) {
460            list.add(node);
461        } else {
462            Enumeration<DefaultMutableTreeNode> en = node.children();
463
464            while (en.hasMoreElements()) {
465                DefaultMutableTreeNode elem = en.nextElement();
466
467                temp = path.pathByAddingChild(elem);
468                jTreeResults.expandPath(temp);
469
470                list.addAll(getLocalLeafs(elem, temp));
471            }
472        }
473
474        return list;
475    }
476
477    /**
478     * This method is called from within the constructor to initialize the form.
479     * WARNING: Do NOT modify this code. The content of this method is always
480     * regenerated by the Form Editor.
481     */
482    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
483    private void initComponents() {
484
485        tabPanel = new javax.swing.JTabbedPane();
486        jScrollPane2 = new javax.swing.JScrollPane();
487        jPanel5 = new javax.swing.JPanel();
488        SelectAdvancedSearch = new javax.swing.JRadioButton();
489        SelectDefaultSearch = new javax.swing.JRadioButton();
490        jLabel5 = new javax.swing.JLabel();
491        jPanel2 = new javax.swing.JPanel();
492        jLabel7 = new javax.swing.JLabel();
493        jLabel8 = new javax.swing.JLabel();
494        jLabel9 = new javax.swing.JLabel();
495        jLabel10 = new javax.swing.JLabel();
496        jLabel11 = new javax.swing.JLabel();
497        OperatorName = new javax.swing.JTextField();
498        Physician = new javax.swing.JTextField();
499        PatientGender = new javax.swing.JComboBox();
500        PatientName = new javax.swing.JTextField();
501        InstitutionName = new javax.swing.JTextField();
502        jPanel3 = new javax.swing.JPanel();
503        ModalCR = new javax.swing.JCheckBox();
504        ModalMG = new javax.swing.JCheckBox();
505        ModalPT = new javax.swing.JCheckBox();
506        ModalCT = new javax.swing.JCheckBox();
507        ModalMR = new javax.swing.JCheckBox();
508        ModalRF = new javax.swing.JCheckBox();
509        ModalDX = new javax.swing.JCheckBox();
510        ModalNM = new javax.swing.JCheckBox();
511        ModalSC = new javax.swing.JCheckBox();
512        ModalES = new javax.swing.JCheckBox();
513        ModalOT = new javax.swing.JCheckBox();
514        ModalUS = new javax.swing.JCheckBox();
515        ModalXA = new javax.swing.JCheckBox();
516        jLabel14 = new javax.swing.JLabel();
517        ModalSelectAll = new javax.swing.JRadioButton();
518        ModalSelectNone = new javax.swing.JRadioButton();
519        jLabel19 = new javax.swing.JLabel();
520        jLabel20 = new javax.swing.JLabel();
521        PatientID = new javax.swing.JTextField();
522        AdvancedSearchButton = new javax.swing.JButton();
523        ResetFields = new javax.swing.JButton();
524        jPanel4 = new javax.swing.JPanel();
525        StudyDateRangeInitialBoundaryActivation = new javax.swing.JCheckBox();
526        StudyDateRangeInitialBoundary = new javax.swing.JTextField();
527        jLabel16 = new javax.swing.JLabel();
528        StudyDateRangeTerminalBoundaryActivation = new javax.swing.JCheckBox();
529        StudyDateRangeTerminalBoundary = new javax.swing.JTextField();
530        StudyDate = new javax.swing.JTextField();
531        jLabel13 = new javax.swing.JLabel();
532        jLabel15 = new javax.swing.JLabel();
533        jLabel12 = new javax.swing.JLabel();
534        jLabel4 = new javax.swing.JLabel();
535        ExactDate = new javax.swing.JRadioButton();
536        DateRange = new javax.swing.JRadioButton();
537        jLabel17 = new javax.swing.JLabel();
538        jPanel1 = new javax.swing.JPanel();
539        jLabel1 = new javax.swing.JLabel();
540        jLabel3 = new javax.swing.JLabel();
541        jTextFieldQuery = new javax.swing.JTextField();
542        jButtonSearch = new javax.swing.JButton();
543        SearchTips = new javax.swing.JButton();
544        jCheckBoxKeywords = new javax.swing.JCheckBox();
545        jButtonQueryHistory = new javax.swing.JButton();
546        jPanel9 = new javax.swing.JPanel();
547        jButtonSend = new javax.swing.JButton();
548        jLabelResults = new javax.swing.JLabel();
549        jButtonDump = new javax.swing.JButton();
550        jButtonDownload = new javax.swing.JButton();
551        jLabelTime = new javax.swing.JLabel();
552        jLabel22 = new javax.swing.JLabel();
553        jButtonView = new javax.swing.JButton();
554        jPanelThumbnail = new javax.swing.JPanel();
555        jButtonExport = new javax.swing.JButton();
556        jScrollPane1 = new javax.swing.JScrollPane();
557        jTreeResults = new javax.swing.JTree();
558        jPanel6 = new javax.swing.JPanel();
559        jLabel2 = new javax.swing.JLabel();
560        jSeparator1 = new javax.swing.JSeparator();
561        jSeparator2 = new javax.swing.JSeparator();
562        jSplitPane1 = new javax.swing.JSplitPane();
563        jPanel8 = new javax.swing.JPanel();
564        jButtonServices = new javax.swing.JButton();
565        jButtonPreferences = new javax.swing.JButton();
566        jSeparator3 = new javax.swing.JSeparator();
567        jButtonLogs = new javax.swing.JButton();
568        jButtonPeers = new javax.swing.JButton();
569        jButtonClientPreferences = new javax.swing.JButton();
570        jMenuBar3 = new javax.swing.JMenuBar();
571        jMenu9 = new javax.swing.JMenu();
572        jMenuItemChangePassword = new javax.swing.JMenuItem();
573        jMenuDirScan2 = new javax.swing.JMenuItem();
574        jMenuDirScanResume = new javax.swing.JMenuItem();
575        jMenuItemShutdown = new javax.swing.JMenuItem();
576        jMenuItem11 = new javax.swing.JMenuItem();
577        jMenuItem7 = new javax.swing.JMenuItem();
578        jMenu10 = new javax.swing.JMenu();
579        jMenuItemPreferences = new javax.swing.JMenuItem();
580        jMenuItemServices = new javax.swing.JMenuItem();
581        jMenuItem10 = new javax.swing.JMenuItem();
582        jMenuItemUsers = new javax.swing.JMenuItem();
583        jMenuItemActiveUsers = new javax.swing.JMenuItem();
584        jMenuTools2 = new javax.swing.JMenu();
585        jMenuItemDcm2jpeg2 = new javax.swing.JMenuItem();
586        jMenu11 = new javax.swing.JMenu();
587        jMenuItem1 = new javax.swing.JMenuItem();
588        jMenuItem2 = new javax.swing.JMenuItem();
589        jMenuItem3 = new javax.swing.JMenuItem();
590        jMenuItem4 = new javax.swing.JMenuItem();
591        jMenuItem5 = new javax.swing.JMenuItem();
592        jMenuItem6 = new javax.swing.JMenuItem();
593        jMenuItem8 = new javax.swing.JMenuItem();
594        pluginMenu = new javax.swing.JMenu();
595        jMenu12 = new javax.swing.JMenu();
596        jMenuItem9 = new javax.swing.JMenuItem();
597
598        setDefaultCloseOperation(javax.swing.WindowConstants.DO_NOTHING_ON_CLOSE);
599        setTitle("Dicoogle PACS Archive");
600        setMinimumSize(new java.awt.Dimension(700, 526));
601        setName("MainWindow"); // NOI18N
602        addWindowListener(new java.awt.event.WindowAdapter() {
603            public void windowOpened(java.awt.event.WindowEvent evt) {
604                formWindowOpened(evt);
605            }
606            public void windowClosing(java.awt.event.WindowEvent evt) {
607                formWindowClosing(evt);
608            }
609            public void windowIconified(java.awt.event.WindowEvent evt) {
610                formWindowIconified(evt);
611            }
612            public void windowDeiconified(java.awt.event.WindowEvent evt) {
613                formWindowDeiconified(evt);
614            }
615        });
616
617        jScrollPane2.setPreferredSize(new java.awt.Dimension(602, 602));
618
619        jPanel5.setMaximumSize(new java.awt.Dimension(1197, 100));
620        jPanel5.setPreferredSize(new java.awt.Dimension(1197, 100));
621
622        SelectAdvancedSearch.setText("Advanced search");
623        SelectAdvancedSearch.addActionListener(new java.awt.event.ActionListener() {
624            public void actionPerformed(java.awt.event.ActionEvent evt) {
625                SelectAdvancedSearchActionPerformed(evt);
626            }
627        });
628
629        SelectDefaultSearch.setText("Default search");
630        SelectDefaultSearch.addActionListener(new java.awt.event.ActionListener() {
631            public void actionPerformed(java.awt.event.ActionEvent evt) {
632                SelectDefaultSearchActionPerformed(evt);
633            }
634        });
635
636        jLabel5.setText("Search type:");
637
638        jLabel7.setText("Patient Name:");
639
640        jLabel8.setText("Patient Gender:");
641
642        jLabel9.setText("Institution Name:");
643
644        jLabel10.setText("Physician:");
645
646        jLabel11.setText("Operator Name:");
647
648        OperatorName.setText("(All operators)");
649
650        Physician.setText("(All physicians)");
651
652        PatientGender.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "All", "Male", "Female" }));
653
654        PatientName.setText("(All patients)");
655
656        InstitutionName.setText("(All institutions)");
657
658        ModalCR.setText("CR");
659        ModalCR.addActionListener(new java.awt.event.ActionListener() {
660            public void actionPerformed(java.awt.event.ActionEvent evt) {
661                ModalCRActionPerformed(evt);
662            }
663        });
664
665        ModalMG.setText("MG");
666        ModalMG.addActionListener(new java.awt.event.ActionListener() {
667            public void actionPerformed(java.awt.event.ActionEvent evt) {
668                ModalMGActionPerformed(evt);
669            }
670        });
671
672        ModalPT.setText("PT");
673        ModalPT.addActionListener(new java.awt.event.ActionListener() {
674            public void actionPerformed(java.awt.event.ActionEvent evt) {
675                ModalPTActionPerformed(evt);
676            }
677        });
678
679        ModalCT.setText("CT");
680        ModalCT.addActionListener(new java.awt.event.ActionListener() {
681            public void actionPerformed(java.awt.event.ActionEvent evt) {
682                ModalCTActionPerformed(evt);
683            }
684        });
685
686        ModalMR.setText("MR");
687        ModalMR.addActionListener(new java.awt.event.ActionListener() {
688            public void actionPerformed(java.awt.event.ActionEvent evt) {
689                ModalMRActionPerformed(evt);
690            }
691        });
692
693        ModalRF.setText("RF");
694        ModalRF.addActionListener(new java.awt.event.ActionListener() {
695            public void actionPerformed(java.awt.event.ActionEvent evt) {
696                ModalRFActionPerformed(evt);
697            }
698        });
699
700        ModalDX.setText("DX");
701        ModalDX.addActionListener(new java.awt.event.ActionListener() {
702            public void actionPerformed(java.awt.event.ActionEvent evt) {
703                ModalDXActionPerformed(evt);
704            }
705        });
706
707        ModalNM.setText("NM");
708        ModalNM.addActionListener(new java.awt.event.ActionListener() {
709            public void actionPerformed(java.awt.event.ActionEvent evt) {
710                ModalNMActionPerformed(evt);
711            }
712        });
713
714        ModalSC.setText("SC");
715        ModalSC.addActionListener(new java.awt.event.ActionListener() {
716            public void actionPerformed(java.awt.event.ActionEvent evt) {
717                ModalSCActionPerformed(evt);
718            }
719        });
720
721        ModalES.setText("ES");
722        ModalES.addActionListener(new java.awt.event.ActionListener() {
723            public void actionPerformed(java.awt.event.ActionEvent evt) {
724                ModalESActionPerformed(evt);
725            }
726        });
727
728        ModalOT.setText("OT");
729        ModalOT.addActionListener(new java.awt.event.ActionListener() {
730            public void actionPerformed(java.awt.event.ActionEvent evt) {
731                ModalOTActionPerformed(evt);
732            }
733        });
734
735        ModalUS.setText("US");
736        ModalUS.addActionListener(new java.awt.event.ActionListener() {
737            public void actionPerformed(java.awt.event.ActionEvent evt) {
738                ModalUSActionPerformed(evt);
739            }
740        });
741
742        ModalXA.setText("XA");
743        ModalXA.addActionListener(new java.awt.event.ActionListener() {
744            public void actionPerformed(java.awt.event.ActionEvent evt) {
745                ModalXAActionPerformed(evt);
746            }
747        });
748
749        jLabel14.setText("Modality:");
750
751        ModalSelectAll.setText("Select all");
752        ModalSelectAll.addActionListener(new java.awt.event.ActionListener() {
753            public void actionPerformed(java.awt.event.ActionEvent evt) {
754                ModalSelectAllActionPerformed(evt);
755            }
756        });
757
758        ModalSelectNone.setText("Select none");
759        ModalSelectNone.addActionListener(new java.awt.event.ActionListener() {
760            public void actionPerformed(java.awt.event.ActionEvent evt) {
761                ModalSelectNoneActionPerformed(evt);
762            }
763        });
764
765        javax.swing.GroupLayout jPanel3Layout = new javax.swing.GroupLayout(jPanel3);
766        jPanel3.setLayout(jPanel3Layout);
767        jPanel3Layout.setHorizontalGroup(
768            jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
769            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel3Layout.createSequentialGroup()
770                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
771                .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
772                    .addGroup(jPanel3Layout.createSequentialGroup()
773                        .addComponent(jLabel14)
774                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
775                        .addComponent(ModalSelectAll)
776                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
777                        .addComponent(ModalSelectNone))
778                    .addGroup(jPanel3Layout.createSequentialGroup()
779                        .addGap(6, 6, 6)
780                        .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
781                            .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
782                                .addComponent(ModalDX)
783                                .addComponent(ModalCT))
784                            .addComponent(ModalCR))
785                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
786                        .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
787                            .addComponent(ModalMG)
788                            .addComponent(ModalNM)
789                            .addComponent(ModalMR))
790                        .addGap(6, 6, 6)
791                        .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
792                            .addComponent(ModalPT)
793                            .addComponent(ModalSC)
794                            .addComponent(ModalRF))
795                        .addGap(12, 12, 12)
796                        .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
797                            .addComponent(ModalUS)
798                            .addComponent(ModalXA)
799                            .addComponent(ModalOT))
800                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
801                        .addComponent(ModalES)))
802                .addGap(202, 202, 202))
803        );
804        jPanel3Layout.setVerticalGroup(
805            jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
806            .addGroup(jPanel3Layout.createSequentialGroup()
807                .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
808                    .addComponent(jLabel14)
809                    .addComponent(ModalSelectAll)
810                    .addComponent(ModalSelectNone))
811                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
812                .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
813                    .addComponent(ModalPT)
814                    .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
815                        .addComponent(ModalMG)
816                        .addComponent(ModalCR, javax.swing.GroupLayout.PREFERRED_SIZE, 18, javax.swing.GroupLayout.PREFERRED_SIZE))
817                    .addComponent(ModalXA)
818                    .addComponent(ModalES))
819                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
820                .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
821                    .addComponent(ModalUS, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE)
822                    .addComponent(ModalRF)
823                    .addComponent(ModalMR)
824                    .addComponent(ModalCT))
825                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
826                .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
827                    .addComponent(ModalOT)
828                    .addComponent(ModalSC)
829                    .addComponent(ModalNM)
830                    .addComponent(ModalDX))
831                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
832        );
833
834        jLabel19.setText("Note: Only what you change will modify the default query.");
835
836        jLabel20.setText("Patient ID:");
837
838        PatientID.setText("(All IDs)");
839
840        AdvancedSearchButton.setText("Search");
841        AdvancedSearchButton.addActionListener(new java.awt.event.ActionListener() {
842            public void actionPerformed(java.awt.event.ActionEvent evt) {
843                AdvancedSearchButtonActionPerformed(evt);
844            }
845        });
846
847        ResetFields.setText("Reset fields");
848        ResetFields.addActionListener(new java.awt.event.ActionListener() {
849            public void actionPerformed(java.awt.event.ActionEvent evt) {
850                ResetFieldsActionPerformed(evt);
851            }
852        });
853
854        StudyDateRangeInitialBoundaryActivation.setText("From:");
855        StudyDateRangeInitialBoundaryActivation.addActionListener(new java.awt.event.ActionListener() {
856            public void actionPerformed(java.awt.event.ActionEvent evt) {
857                StudyDateRangeInitialBoundaryActivationActionPerformed(evt);
858            }
859        });
860
861        StudyDateRangeInitialBoundary.setText("(Beginning)");
862
863        jLabel16.setText("--");
864
865        StudyDateRangeTerminalBoundaryActivation.setText("To:");
866        StudyDateRangeTerminalBoundaryActivation.addActionListener(new java.awt.event.ActionListener() {
867            public void actionPerformed(java.awt.event.ActionEvent evt) {
868                StudyDateRangeTerminalBoundaryActivationActionPerformed(evt);
869            }
870        });
871
872        StudyDateRangeTerminalBoundary.setText("(Today)");
873
874        StudyDate.setText("(All dates)");
875
876        jLabel13.setText("(yyyymmdd form)");
877
878        jLabel15.setText("Date Range:");
879
880        jLabel12.setText("Date:");
881
882        jLabel4.setText("Study Date search type:");
883
884        ExactDate.setText("Exact Date");
885        ExactDate.addActionListener(new java.awt.event.ActionListener() {
886            public void actionPerformed(java.awt.event.ActionEvent evt) {
887                ExactDateActionPerformed(evt);
888            }
889        });
890
891        DateRange.setText("Date Range");
892        DateRange.addActionListener(new java.awt.event.ActionListener() {
893            public void actionPerformed(java.awt.event.ActionEvent evt) {
894                DateRangeActionPerformed(evt);
895            }
896        });
897
898        jLabel17.setText("(yyyymmdd form)");
899
900        javax.swing.GroupLayout jPanel4Layout = new javax.swing.GroupLayout(jPanel4);
901        jPanel4.setLayout(jPanel4Layout);
902        jPanel4Layout.setHorizontalGroup(
903            jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
904            .addGroup(jPanel4Layout.createSequentialGroup()
905                .addGap(8, 8, 8)
906                .addGroup(jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
907                    .addGroup(jPanel4Layout.createSequentialGroup()
908                        .addComponent(jLabel4)
909                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
910                        .addComponent(ExactDate)
911                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
912                        .addComponent(DateRange))
913                    .addGroup(jPanel4Layout.createSequentialGroup()
914                        .addComponent(jLabel12)
915                        .addGap(2, 2, 2)
916                        .addComponent(StudyDate, javax.swing.GroupLayout.PREFERRED_SIZE, 87, javax.swing.GroupLayout.PREFERRED_SIZE)
917                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
918                        .addComponent(jLabel13)))
919                .addGap(71, 71, 71))
920            .addGroup(jPanel4Layout.createSequentialGroup()
921                .addGap(6, 6, 6)
922                .addComponent(jLabel15)
923                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
924                .addGroup(jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
925                    .addGroup(jPanel4Layout.createSequentialGroup()
926                        .addComponent(StudyDateRangeInitialBoundary, javax.swing.GroupLayout.PREFERRED_SIZE, 92, javax.swing.GroupLayout.PREFERRED_SIZE)
927                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
928                        .addComponent(jLabel16))
929                    .addComponent(StudyDateRangeInitialBoundaryActivation))
930                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
931                .addGroup(jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
932                    .addGroup(jPanel4Layout.createSequentialGroup()
933                        .addComponent(StudyDateRangeTerminalBoundary, javax.swing.GroupLayout.PREFERRED_SIZE, 92, javax.swing.GroupLayout.PREFERRED_SIZE)
934                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
935                        .addComponent(jLabel17))
936                    .addComponent(StudyDateRangeTerminalBoundaryActivation))
937                .addContainerGap())
938        );
939        jPanel4Layout.setVerticalGroup(
940            jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
941            .addGroup(jPanel4Layout.createSequentialGroup()
942                .addGroup(jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
943                    .addComponent(ExactDate)
944                    .addComponent(DateRange)
945                    .addComponent(jLabel4))
946                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
947                .addGroup(jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
948                    .addComponent(StudyDate, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
949                    .addComponent(jLabel13)
950                    .addComponent(jLabel12))
951                .addGroup(jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
952                    .addGroup(jPanel4Layout.createSequentialGroup()
953                        .addGap(10, 10, 10)
954                        .addGroup(jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
955                            .addComponent(StudyDateRangeInitialBoundaryActivation)
956                            .addComponent(StudyDateRangeTerminalBoundaryActivation)
957                            .addComponent(jLabel15)))
958                    .addGroup(jPanel4Layout.createSequentialGroup()
959                        .addGap(35, 35, 35)
960                        .addGroup(jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
961                            .addComponent(StudyDateRangeInitialBoundary, javax.swing.GroupLayout.PREFERRED_SIZE, 20, javax.swing.GroupLayout.PREFERRED_SIZE)
962                            .addComponent(jLabel16)
963                            .addComponent(StudyDateRangeTerminalBoundary, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
964                            .addComponent(jLabel17))))
965                .addContainerGap())
966        );
967
968        javax.swing.GroupLayout jPanel2Layout = new javax.swing.GroupLayout(jPanel2);
969        jPanel2.setLayout(jPanel2Layout);
970        jPanel2Layout.setHorizontalGroup(
971            jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
972            .addGroup(jPanel2Layout.createSequentialGroup()
973                .addContainerGap()
974                .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
975                    .addGroup(jPanel2Layout.createSequentialGroup()
976                        .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
977                            .addComponent(jLabel8)
978                            .addComponent(jLabel9)
979                            .addComponent(jLabel10)
980                            .addComponent(jLabel11))
981                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
982                        .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
983                            .addComponent(PatientID)
984                            .addComponent(PatientGender, 0, 118, Short.MAX_VALUE)
985                            .addComponent(Physician)
986                            .addComponent(InstitutionName)
987                            .addComponent(PatientName)
988                            .addComponent(OperatorName)))
989                    .addGroup(jPanel2Layout.createSequentialGroup()
990                        .addComponent(AdvancedSearchButton)
991                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
992                        .addComponent(ResetFields))
993                    .addComponent(jLabel19)
994                    .addComponent(jLabel7)
995                    .addComponent(jLabel20))
996                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
997                .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
998                    .addComponent(jPanel3, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
999                    .addComponent(jPanel4, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
1000                .addContainerGap(381, Short.MAX_VALUE))
1001        );
1002        jPanel2Layout.setVerticalGroup(
1003            jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
1004            .addGroup(jPanel2Layout.createSequentialGroup()
1005                .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
1006                    .addGroup(jPanel2Layout.createSequentialGroup()
1007                        .addGap(14, 14, 14)
1008                        .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
1009                            .addComponent(AdvancedSearchButton)
1010                            .addComponent(ResetFields))
1011                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
1012                        .addComponent(jLabel19)
1013                        .addGap(18, 18, 18)
1014                        .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
1015                            .addComponent(jLabel7)
1016                            .addComponent(PatientName, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
1017                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
1018                        .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
1019                            .addComponent(jLabel20)
1020                            .addComponent(PatientID, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
1021                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
1022                        .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
1023                            .addComponent(jLabel8)
1024                            .addComponent(PatientGender, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
1025                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
1026                        .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
1027                            .addComponent(jLabel9)
1028                            .addComponent(InstitutionName, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
1029                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
1030                        .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
1031                            .addComponent(jLabel10)
1032                            .addComponent(Physician, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
1033                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
1034                        .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
1035                            .addComponent(jLabel11)
1036                            .addComponent(OperatorName, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))
1037                    .addGroup(jPanel2Layout.createSequentialGroup()
1038                        .addContainerGap()
1039                        .addComponent(jPanel3, javax.swing.GroupLayout.PREFERRED_SIZE, 96, javax.swing.GroupLayout.PREFERRED_SIZE)
1040                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
1041                        .addComponent(jPanel4, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))
1042                .addContainerGap())
1043        );
1044
1045        jLabel1.setText("Search Pattern :");
1046
1047        jLabel3.setText("Regular expressions are supported (eg: A*).");
1048
1049        jTextFieldQuery.addActionListener(new java.awt.event.ActionListener() {
1050            public void actionPerformed(java.awt.event.ActionEvent evt) {
1051                jTextFieldQueryActionPerformed(evt);
1052            }
1053        });
1054        jTextFieldQuery.addKeyListener(new java.awt.event.KeyAdapter() {
1055            public void keyPressed(java.awt.event.KeyEvent evt) {
1056                jTextFieldQueryKeyPressed(evt);
1057            }
1058        });
1059
1060        jButtonSearch.setText("Search");
1061        jButtonSearch.addActionListener(new java.awt.event.ActionListener() {
1062            public void actionPerformed(java.awt.event.ActionEvent evt) {
1063                jButtonSearchActionPerformed(evt);
1064            }
1065        });
1066
1067        SearchTips.setText("Search Tips");
1068        SearchTips.addActionListener(new java.awt.event.ActionListener() {
1069            public void actionPerformed(java.awt.event.ActionEvent evt) {
1070                SearchTipsActionPerformed(evt);
1071            }
1072        });
1073
1074        jCheckBoxKeywords.setSelected(true);
1075        jCheckBoxKeywords.setText("keywords");
1076
1077        jButtonQueryHistory.setText("Query History");
1078        jButtonQueryHistory.addActionListener(new java.awt.event.ActionListener() {
1079            public void actionPerformed(java.awt.event.ActionEvent evt) {
1080                jButtonQueryHistoryActionPerformed(evt);
1081            }
1082        });
1083
1084        javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
1085        jPanel1.setLayout(jPanel1Layout);
1086        jPanel1Layout.setHorizontalGroup(
1087            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
1088            .addGroup(jPanel1Layout.createSequentialGroup()
1089                .addContainerGap()
1090                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
1091                    .addGroup(jPanel1Layout.createSequentialGroup()
1092                        .addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 108, javax.swing.GroupLayout.PREFERRED_SIZE)
1093                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
1094                        .addComponent(jTextFieldQuery, javax.swing.GroupLayout.PREFERRED_SIZE, 328, javax.swing.GroupLayout.PREFERRED_SIZE)
1095                        .addGap(18, 18, 18)
1096                        .addComponent(jCheckBoxKeywords))
1097                    .addGroup(jPanel1Layout.createSequentialGroup()
1098                        .addComponent(jButtonSearch)
1099                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
1100                        .addComponent(SearchTips)
1101                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
1102                        .addComponent(jButtonQueryHistory))
1103                    .addComponent(jLabel3))
1104                .addContainerGap(683, Short.MAX_VALUE))
1105        );
1106        jPanel1Layout.setVerticalGroup(
1107            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
1108            .addGroup(jPanel1Layout.createSequentialGroup()
1109                .addContainerGap()
1110                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
1111                    .addComponent(jButtonSearch, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
1112                    .addComponent(SearchTips, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
1113                    .addComponent(jButtonQueryHistory, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
1114                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
1115                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
1116                    .addComponent(jLabel1)
1117                    .addComponent(jTextFieldQuery, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
1118                    .addComponent(jCheckBoxKeywords))
1119                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
1120                .addComponent(jLabel3)
1121                .addContainerGap(37, Short.MAX_VALUE))
1122        );
1123
1124        jButtonSend.setText("Send");
1125        jButtonSend.addActionListener(new java.awt.event.ActionListener() {
1126            public void actionPerformed(java.awt.event.ActionEvent evt) {
1127                jButtonSendActionPerformed(evt);
1128            }
1129        });
1130
1131        jLabelResults.setText("jLabel2");
1132
1133        jButtonDump.setText("Dump");
1134        jButtonDump.addActionListener(new java.awt.event.ActionListener() {
1135            public void actionPerformed(java.awt.event.ActionEvent evt) {
1136                jButtonDumpActionPerformed(evt);
1137            }
1138        });
1139
1140        jButtonDownload.setText("Download");
1141        jButtonDownload.addActionListener(new java.awt.event.ActionListener() {
1142            public void actionPerformed(java.awt.event.ActionEvent evt) {
1143                jButtonDownloadActionPerformed(evt);
1144            }
1145        });
1146
1147        jLabelTime.setText("<<results time>>");
1148
1149        jLabel22.setText("Time Results(ms):");
1150
1151        jButtonView.setText("View");
1152        jButtonView.addActionListener(new java.awt.event.ActionListener() {
1153            public void actionPerformed(java.awt.event.ActionEvent evt) {
1154                jButtonViewActionPerformed(evt);
1155            }
1156        });
1157
1158        javax.swing.GroupLayout jPanelThumbnailLayout = new javax.swing.GroupLayout(jPanelThumbnail);
1159        jPanelThumbnail.setLayout(jPanelThumbnailLayout);
1160        jPanelThumbnailLayout.setHorizontalGroup(
1161            jPanelThumbnailLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
1162            .addGap(0, 67, Short.MAX_VALUE)
1163        );
1164        jPanelThumbnailLayout.setVerticalGroup(
1165            jPanelThumbnailLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
1166            .addGap(0, 62, Short.MAX_VALUE)
1167        );
1168
1169        jButtonExport.setText("Export");
1170        jButtonExport.setMaximumSize(new java.awt.Dimension(82, 29));
1171        jButtonExport.setMinimumSize(new java.awt.Dimension(82, 29));
1172        jButtonExport.setPreferredSize(new java.awt.Dimension(82, 29));
1173        jButtonExport.addActionListener(new java.awt.event.ActionListener() {
1174            public void actionPerformed(java.awt.event.ActionEvent evt) {
1175                jButtonExportActionPerformed(evt);
1176            }
1177        });
1178
1179        javax.swing.GroupLayout jPanel9Layout = new javax.swing.GroupLayout(jPanel9);
1180        jPanel9.setLayout(jPanel9Layout);
1181        jPanel9Layout.setHorizontalGroup(
1182            jPanel9Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
1183            .addGroup(jPanel9Layout.createSequentialGroup()
1184                .addGap(120, 120, 120)
1185                .addGroup(jPanel9Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
1186                    .addComponent(jButtonExport, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 259, Short.MAX_VALUE)
1187                    .addComponent(jButtonDownload, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 271, Short.MAX_VALUE)
1188                    .addComponent(jButtonSend, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 259, Short.MAX_VALUE)
1189                    .addComponent(jButtonView, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 259, Short.MAX_VALUE)
1190                    .addComponent(jButtonDump, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 259, Short.MAX_VALUE))
1191                .addContainerGap())
1192            .addGroup(jPanel9Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
1193                .addGroup(jPanel9Layout.createSequentialGroup()
1194                    .addContainerGap()
1195                    .addGroup(jPanel9Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
1196                        .addComponent(jLabelResults)
1197                        .addGroup(jPanel9Layout.createSequentialGroup()
1198                            .addGroup(jPanel9Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
1199                                .addComponent(jLabel22)
1200                                .addGroup(jPanel9Layout.createSequentialGroup()
1201                                    .addGap(10, 10, 10)
1202                                    .addComponent(jPanelThumbnail, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))
1203                            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 129, Short.MAX_VALUE)
1204                            .addComponent(jLabelTime)))
1205                    .addContainerGap()))
1206        );
1207        jPanel9Layout.setVerticalGroup(
1208            jPanel9Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
1209            .addGroup(jPanel9Layout.createSequentialGroup()
1210                .addContainerGap(92, Short.MAX_VALUE)
1211                .addComponent(jButtonExport, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
1212                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
1213                .addComponent(jButtonDownload)
1214                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
1215                .addComponent(jButtonSend)
1216                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
1217                .addComponent(jButtonView)
1218                .addGap(5, 5, 5)
1219                .addComponent(jButtonDump)
1220                .addContainerGap())
1221            .addGroup(jPanel9Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
1222                .addGroup(jPanel9Layout.createSequentialGroup()
1223                    .addContainerGap()
1224                    .addComponent(jLabelResults)
1225                    .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
1226                    .addGroup(jPanel9Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
1227                        .addComponent(jLabel22)
1228                        .addComponent(jLabelTime))
1229                    .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 21, Short.MAX_VALUE)
1230                    .addComponent(jPanelThumbnail, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
1231                    .addGap(53, 53, 53)))
1232        );
1233
1234        jTreeResults.setModel(null);
1235        jTreeResults.setRowHeight(15);
1236        jTreeResults.setToggleClickCount(3);
1237        jTreeResults.addMouseListener(new java.awt.event.MouseAdapter() {
1238            public void mouseClicked(java.awt.event.MouseEvent evt) {
1239                jTreeResultsMouseClicked(evt);
1240            }
1241        });
1242        jTreeResults.addTreeExpansionListener(new javax.swing.event.TreeExpansionListener() {
1243            public void treeCollapsed(javax.swing.event.TreeExpansionEvent evt) {
1244            }
1245            public void treeExpanded(javax.swing.event.TreeExpansionEvent evt) {
1246                jTreeResultsTreeExpanded(evt);
1247            }
1248        });
1249        jTreeResults.addTreeSelectionListener(new javax.swing.event.TreeSelectionListener() {
1250            public void valueChanged(javax.swing.event.TreeSelectionEvent evt) {
1251                jTreeResultsValueChanged(evt);
1252            }
1253        });
1254        jTreeResults.addKeyListener(new java.awt.event.KeyAdapter() {
1255            public void keyReleased(java.awt.event.KeyEvent evt) {
1256                jTreeResultsKeyReleased(evt);
1257            }
1258        });
1259        jScrollPane1.setViewportView(jTreeResults);
1260
1261        jLabel2.setText("Search Range:");
1262
1263        javax.swing.GroupLayout jPanel6Layout = new javax.swing.GroupLayout(jPanel6);
1264        jPanel6.setLayout(jPanel6Layout);
1265        jPanel6Layout.setHorizontalGroup(
1266            jPanel6Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
1267            .addGroup(jPanel6Layout.createSequentialGroup()
1268                .addComponent(jLabel2)
1269                .addContainerGap(474, Short.MAX_VALUE))
1270        );
1271        jPanel6Layout.setVerticalGroup(
1272            jPanel6Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
1273            .addComponent(jLabel2)
1274        );
1275
1276        jSeparator2.setMaximumSize(new java.awt.Dimension(50, 10));
1277
1278        javax.swing.GroupLayout jPanel5Layout = new javax.swing.GroupLayout(jPanel5);
1279        jPanel5.setLayout(jPanel5Layout);
1280        jPanel5Layout.setHorizontalGroup(
1281            jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
1282            .addComponent(jSeparator2, javax.swing.GroupLayout.DEFAULT_SIZE, 1279, Short.MAX_VALUE)
1283            .addComponent(jSeparator1, javax.swing.GroupLayout.DEFAULT_SIZE, 1279, Short.MAX_VALUE)
1284            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel5Layout.createSequentialGroup()
1285                .addContainerGap()
1286                .addGroup(jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
1287                    .addGroup(jPanel5Layout.createSequentialGroup()
1288                        .addComponent(jLabel5)
1289                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
1290                        .addComponent(SelectDefaultSearch)
1291                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
1292                        .addComponent(SelectAdvancedSearch)
1293                        .addGap(28, 28, 28)
1294                        .addComponent(jPanel6, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
1295                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel5Layout.createSequentialGroup()
1296                        .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 846, Short.MAX_VALUE)
1297                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
1298                        .addComponent(jPanel9, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
1299                    .addComponent(jPanel2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
1300                    .addComponent(jPanel1, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
1301                .addContainerGap())
1302        );
1303        jPanel5Layout.setVerticalGroup(
1304            jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
1305            .addGroup(jPanel5Layout.createSequentialGroup()
1306                .addGroup(jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
1307                    .addGroup(jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
1308                        .addComponent(jLabel5)
1309                        .addComponent(SelectDefaultSearch)
1310                        .addComponent(SelectAdvancedSearch))
1311                    .addComponent(jPanel6, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
1312                .addGap(10, 10, 10)
1313                .addComponent(jSeparator2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
1314                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
1315                .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
1316                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
1317                .addComponent(jPanel2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
1318                .addGap(15, 15, 15)
1319                .addComponent(jSeparator1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
1320                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
1321                .addGroup(jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
1322                    .addComponent(jPanel9, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
1323                    .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE)))
1324        );
1325
1326        jScrollPane2.setViewportView(jPanel5);
1327
1328        tabPanel.addTab("Search", jScrollPane2);
1329
1330        getContentPane().add(tabPanel, java.awt.BorderLayout.CENTER);
1331
1332        jSplitPane1.setDividerSize(2);
1333        jSplitPane1.setOrientation(javax.swing.JSplitPane.VERTICAL_SPLIT);
1334        jSplitPane1.setMaximumSize(new java.awt.Dimension(2147483647, 100));
1335        jSplitPane1.setPreferredSize(new java.awt.Dimension(606, 100));
1336
1337        jPanel8.setPreferredSize(new java.awt.Dimension(604, 80));
1338
1339        jButtonServices.setIcon(new ImageIcon(getImage("services.gif")));
1340        jButtonServices.setText("Services");
1341        jButtonServices.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
1342        jButtonServices.setMaximumSize(new java.awt.Dimension(80, 80));
1343        jButtonServices.setMinimumSize(new java.awt.Dimension(80, 80));
1344        jButtonServices.setPreferredSize(new java.awt.Dimension(80, 80));
1345        jButtonServices.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
1346        jButtonServices.addActionListener(new java.awt.event.ActionListener() {
1347            public void actionPerformed(java.awt.event.ActionEvent evt) {
1348                jButtonServicesActionPerformed(evt);
1349            }
1350        });
1351
1352        jButtonPreferences.setIcon(new ImageIcon(getImage("config.gif")));
1353        jButtonPreferences.setText("Preferences");
1354        jButtonPreferences.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
1355        jButtonPreferences.setMaximumSize(new java.awt.Dimension(80, 80));
1356        jButtonPreferences.setMinimumSize(new java.awt.Dimension(80, 80));
1357        jButtonPreferences.setPreferredSize(new java.awt.Dimension(80, 80));
1358        jButtonPreferences.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
1359        jButtonPreferences.addActionListener(new java.awt.event.ActionListener() {
1360            public void actionPerformed(java.awt.event.ActionEvent evt) {
1361                jButtonPreferencesActionPerformed(evt);
1362            }
1363        });
1364
1365        jButtonLogs.setIcon(new ImageIcon(getImage("log.gif")));
1366        jButtonLogs.setText("Logs");
1367        jButtonLogs.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
1368        jButtonLogs.setMaximumSize(new java.awt.Dimension(80, 80));
1369        jButtonLogs.setMinimumSize(new java.awt.Dimension(80, 80));
1370        jButtonLogs.setPreferredSize(new java.awt.Dimension(80, 80));
1371        jButtonLogs.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
1372        jButtonLogs.addActionListener(new java.awt.event.ActionListener() {
1373            public void actionPerformed(java.awt.event.ActionEvent evt) {
1374                jButtonLogsActionPerformed(evt);
1375            }
1376        });
1377
1378        jButtonPeers.setIcon(new ImageIcon(getImage("peers.png")));
1379        jButtonPeers.setText("P2P Peers");
1380        jButtonPeers.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
1381        jButtonPeers.setMaximumSize(new java.awt.Dimension(80, 80));
1382        jButtonPeers.setMinimumSize(new java.awt.Dimension(80, 80));
1383        jButtonPeers.setPreferredSize(new java.awt.Dimension(80, 80));
1384        jButtonPeers.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
1385        jButtonPeers.addActionListener(new java.awt.event.ActionListener() {
1386            public void actionPerformed(java.awt.event.ActionEvent evt) {
1387                jButtonPeersActionPerformed(evt);
1388            }
1389        });
1390
1391        jButtonClientPreferences.setIcon(new ImageIcon(getImage("settings.png")));
1392        jButtonClientPreferences.setText("Client Prefs");
1393        jButtonClientPreferences.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
1394        jButtonClientPreferences.setMaximumSize(new java.awt.Dimension(80, 80));
1395        jButtonClientPreferences.setMinimumSize(new java.awt.Dimension(80, 80));
1396        jButtonClientPreferences.setPreferredSize(new java.awt.Dimension(80, 80));
1397        jButtonClientPreferences.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
1398        jButtonClientPreferences.addActionListener(new java.awt.event.ActionListener() {
1399            public void actionPerformed(java.awt.event.ActionEvent evt) {
1400                jButtonClientPreferencesActionPerformed(evt);
1401            }
1402        });
1403
1404        javax.swing.GroupLayout jPanel8Layout = new javax.swing.GroupLayout(jPanel8);
1405        jPanel8.setLayout(jPanel8Layout);
1406        jPanel8Layout.setHorizontalGroup(
1407            jPanel8Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
1408            .addGroup(jPanel8Layout.createSequentialGroup()
1409                .addContainerGap()
1410                .addComponent(jButtonServices, javax.swing.GroupLayout.PREFERRED_SIZE, 79, javax.swing.GroupLayout.PREFERRED_SIZE)
1411                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
1412                .addComponent(jButtonPreferences, javax.swing.GroupLayout.PREFERRED_SIZE, 79, javax.swing.GroupLayout.PREFERRED_SIZE)
1413                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
1414                .addComponent(jButtonLogs, javax.swing.GroupLayout.PREFERRED_SIZE, 79, javax.swing.GroupLayout.PREFERRED_SIZE)
1415                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
1416                .addComponent(jButtonPeers, javax.swing.GroupLayout.PREFERRED_SIZE, 79, javax.swing.GroupLayout.PREFERRED_SIZE)
1417                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
1418                .addComponent(jButtonClientPreferences, javax.swing.GroupLayout.PREFERRED_SIZE, 79, javax.swing.GroupLayout.PREFERRED_SIZE)
1419                .addGap(102, 102, 102)
1420                .addComponent(jSeparator3, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
1421                .addContainerGap(752, Short.MAX_VALUE))
1422        );
1423        jPanel8Layout.setVerticalGroup(
1424            jPanel8Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
1425            .addGroup(jPanel8Layout.createSequentialGroup()
1426                .addGroup(jPanel8Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
1427                    .addGroup(jPanel8Layout.createSequentialGroup()
1428                        .addGap(32, 32, 32)
1429                        .addComponent(jSeparator3, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
1430                    .addGroup(jPanel8Layout.createSequentialGroup()
1431                        .addContainerGap()
1432                        .addGroup(jPanel8Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
1433                            .addComponent(jButtonClientPreferences, 0, 0, Short.MAX_VALUE)
1434                            .addComponent(jButtonPeers, 0, 0, Short.MAX_VALUE)
1435                            .addComponent(jButtonLogs, 0, 0, Short.MAX_VALUE)
1436                            .addComponent(jButtonPreferences, 0, 0, Short.MAX_VALUE)
1437                            .addComponent(jButtonServices, javax.swing.GroupLayout.PREFERRED_SIZE, 64, Short.MAX_VALUE))))
1438                .addGap(124, 124, 124))
1439        );
1440
1441        jSplitPane1.setTopComponent(jPanel8);
1442
1443        getContentPane().add(jSplitPane1, java.awt.BorderLayout.NORTH);
1444
1445        jMenu9.setText("File");
1446
1447        jMenuItemChangePassword.setText("Change Password");
1448        jMenuItemChangePassword.addActionListener(new java.awt.event.ActionListener() {
1449            public void actionPerformed(java.awt.event.ActionEvent evt) {
1450                jMenuItemChangePasswordActionPerformed(evt);
1451            }
1452        });
1453        jMenu9.add(jMenuItemChangePassword);
1454
1455        jMenuDirScan2.setText("Scan Disk");
1456        jMenuDirScan2.addActionListener(new java.awt.event.ActionListener() {
1457            public void actionPerformed(java.awt.event.ActionEvent evt) {
1458                jMenuDirScanActionPerformed(evt);
1459            }
1460        });
1461        jMenu9.add(jMenuDirScan2);
1462
1463        jMenuDirScanResume.setText("Scan Disk (resume)");
1464        jMenuDirScanResume.addActionListener(new java.awt.event.ActionListener() {
1465            public void actionPerformed(java.awt.event.ActionEvent evt) {
1466                jMenuDirScanResumeActionPerformed(evt);
1467            }
1468        });
1469        jMenu9.add(jMenuDirScanResume);
1470
1471        jMenuItemShutdown.setText("Shutdown Client&Server");
1472        jMenuItemShutdown.addActionListener(new java.awt.event.ActionListener() {
1473            public void actionPerformed(java.awt.event.ActionEvent evt) {
1474                jMenuItemShutdownActionPerformed(evt);
1475            }
1476        });
1477        jMenu9.add(jMenuItemShutdown);
1478
1479        jMenuItem11.setText("Exit Client");
1480        jMenuItem11.addActionListener(new java.awt.event.ActionListener() {
1481            public void actionPerformed(java.awt.event.ActionEvent evt) {
1482                jMenuItem11ActionPerformed(evt);
1483            }
1484        });
1485        jMenu9.add(jMenuItem11);
1486
1487        jMenuItem7.setText("Exit Client&Server");
1488        jMenuItem7.addActionListener(new java.awt.event.ActionListener() {
1489            public void actionPerformed(java.awt.event.ActionEvent evt) {
1490                jMenuItem7ActionPerformed(evt);
1491            }
1492        });
1493        jMenu9.add(jMenuItem7);
1494
1495        jMenuBar3.add(jMenu9);
1496
1497        jMenu10.setText("Edit");
1498
1499        jMenuItemPreferences.setText("Preferences");
1500        jMenuItemPreferences.addActionListener(new java.awt.event.ActionListener() {
1501            public void actionPerformed(java.awt.event.ActionEvent evt) {
1502                jMenuItem2ActionPerformed(evt);
1503            }
1504        });
1505        jMenu10.add(jMenuItemPreferences);
1506
1507        jMenuItemServices.setText("Services");
1508        jMenuItemServices.addActionListener(new java.awt.event.ActionListener() {
1509            public void actionPerformed(java.awt.event.ActionEvent evt) {
1510                jMenuItemServicesActionPerformed(evt);
1511            }
1512        });
1513        jMenu10.add(jMenuItemServices);
1514
1515        jMenuItem10.setText("Logs");
1516        jMenuItem10.addActionListener(new java.awt.event.ActionListener() {
1517            public void actionPerformed(java.awt.event.ActionEvent evt) {
1518                jMenuItem10ActionPerformed(evt);
1519            }
1520        });
1521        jMenu10.add(jMenuItem10);
1522
1523        jMenuItemUsers.setText("User Accounts");
1524        jMenuItemUsers.addActionListener(new java.awt.event.ActionListener() {
1525            public void actionPerformed(java.awt.event.ActionEvent evt) {
1526                jMenuItemUsersActionPerformed(evt);
1527            }
1528        });
1529        jMenu10.add(jMenuItemUsers);
1530
1531        jMenuItemActiveUsers.setText("ActiveUsers");
1532        jMenuItemActiveUsers.addActionListener(new java.awt.event.ActionListener() {
1533            public void actionPerformed(java.awt.event.ActionEvent evt) {
1534                jMenuItemActiveUsersActionPerformed(evt);
1535            }
1536        });
1537        jMenu10.add(jMenuItemActiveUsers);
1538
1539        jMenuBar3.add(jMenu10);
1540
1541        jMenuTools2.setText("Tools");
1542
1543        jMenuItemDcm2jpeg2.setText("dcm2jpeg");
1544        jMenuItemDcm2jpeg2.addActionListener(new java.awt.event.ActionListener() {
1545            public void actionPerformed(java.awt.event.ActionEvent evt) {
1546                jMenuItemDcm2jpeg2ActionPerformed(evt);
1547            }
1548        });
1549        jMenuTools2.add(jMenuItemDcm2jpeg2);
1550
1551        jMenuBar3.add(jMenuTools2);
1552
1553        jMenu11.setText("Skin");
1554
1555        jMenuItem1.setText("Business");
1556        jMenuItem1.addActionListener(new java.awt.event.ActionListener() {
1557            public void actionPerformed(java.awt.event.ActionEvent evt) {
1558                jMenuItem1ActionPerformed1(evt);
1559            }
1560        });
1561        jMenu11.add(jMenuItem1);
1562
1563        jMenuItem2.setText("Business Blue Steel");
1564        jMenuItem2.addActionListener(new java.awt.event.ActionListener() {
1565            public void actionPerformed(java.awt.event.ActionEvent evt) {
1566                jMenuItem2ActionPerformed1(evt);
1567            }
1568        });
1569        jMenu11.add(jMenuItem2);
1570
1571        jMenuItem3.setText("Business Black Steel");
1572        jMenuItem3.addActionListener(new java.awt.event.ActionListener() {
1573            public void actionPerformed(java.awt.event.ActionEvent evt) {
1574                jMenuItem3ActionPerformed1(evt);
1575            }
1576        });
1577        jMenu11.add(jMenuItem3);
1578
1579        jMenuItem4.setText("Creme");
1580        jMenuItem4.addActionListener(new java.awt.event.ActionListener() {
1581            public void actionPerformed(java.awt.event.ActionEvent evt) {
1582                jMenuItem4ActionPerformed(evt);
1583            }
1584        });
1585        jMenu11.add(jMenuItem4);
1586
1587        jMenuItem5.setText("Magma");
1588        jMenuItem5.addActionListener(new java.awt.event.ActionListener() {
1589            public void actionPerformed(java.awt.event.ActionEvent evt) {
1590                jMenuItem5ActionPerformed(evt);
1591            }
1592        });
1593        jMenu11.add(jMenuItem5);
1594
1595        jMenuItem6.setText("Raven");
1596        jMenuItem6.addActionListener(new java.awt.event.ActionListener() {
1597            public void actionPerformed(java.awt.event.ActionEvent evt) {
1598                jMenuItem6ActionPerformed(evt);
1599            }
1600        });
1601        jMenu11.add(jMenuItem6);
1602
1603        jMenuItem8.setText("Raven Graphite Glass");
1604        jMenuItem8.addActionListener(new java.awt.event.ActionListener() {
1605            public void actionPerformed(java.awt.event.ActionEvent evt) {
1606                jMenuItem8ActionPerformed(evt);
1607            }
1608        });
1609        jMenu11.add(jMenuItem8);
1610
1611        jMenuBar3.add(jMenu11);
1612
1613        pluginMenu.setText("Plugins");
1614        jMenuBar3.add(pluginMenu);
1615
1616        jMenu12.setText("Help");
1617
1618        jMenuItem9.setText("About");
1619        jMenuItem9.addActionListener(new java.awt.event.ActionListener() {
1620            public void actionPerformed(java.awt.event.ActionEvent evt) {
1621                jMenuItem3ActionPerformed(evt);
1622            }
1623        });
1624        jMenu12.add(jMenuItem9);
1625
1626        jMenuBar3.add(jMenu12);
1627
1628        setJMenuBar(jMenuBar3);
1629
1630        getAccessibleContext().setAccessibleDescription("Dicoogle PACS Archive");
1631
1632        pack();
1633    }// </editor-fold>//GEN-END:initComponents
1634
1635    private void formWindowClosing(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_formWindowClosing
1636        if (Main.isFixedClient()) {
1637            jMenuItem7.doClick();
1638        } else {
1639            jMenuItem11.doClick();
1640        }
1641    }//GEN-LAST:event_formWindowClosing
1642
1643    private void formWindowIconified(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_formWindowIconified
1644        this.setExtendedState(MainWindow.ICONIFIED);
1645        this.setVisible(false);
1646    }//GEN-LAST:event_formWindowIconified
1647
1648    private void formWindowDeiconified(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_formWindowDeiconified
1649        this.setExtendedState(MainWindow.NORMAL);
1650        this.setVisible(true);
1651    }//GEN-LAST:event_formWindowDeiconified
1652
1653    private void jButtonPreferencesActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButtonPreferencesActionPerformed
1654        showOptions();
1655    }//GEN-LAST:event_jButtonPreferencesActionPerformed
1656
1657    private void jMenuItem2ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItem2ActionPerformed
1658        showOptions();
1659    }//GEN-LAST:event_jMenuItem2ActionPerformed
1660
1661    private void jMenuItem1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItem1ActionPerformed
1662
1663        File toDelete = new File("pluginClasses");
1664        String[] deleteArray = toDelete.list();
1665        if (deleteArray != null) {
1666            for (String fileName : deleteArray) {
1667                File f = new File("pluginClasses/" + fileName);
1668                f.delete();
1669            }
1670        }
1671        if (clientCore.isAdmin() && AdminRefs.getInstance().unsavedSettings()) {
1672            Object[] opt
1673                    = {
1674                        "Save", "Discard", "Cancel"
1675                    };
1676
1677            String message = "There are unsaved Server Settings.\nDo you want to save them?";
1678            int op = JOptionPane.showOptionDialog(this, message, "Unsaved Server Settings", JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE, null, opt, opt[2]);
1679
1680            if (op == 0) {
1681                AdminRefs.getInstance().saveSettings();
1682            }
1683
1684            if (op == 2) {
1685                return;
1686            }
1687        }
1688
1689        if (ClientOptions.getInstance().unsavedSettings()) {
1690            Object[] opt
1691                    = {
1692                        "Save", "Discard", "Cancel"
1693                    };
1694
1695            String message = "There are unsaved Client Settings.\nDo you want to save them?";
1696            int op = JOptionPane.showOptionDialog(this, message, "Unsaved Client Settings", JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE, null, opt, opt[2]);
1697
1698            if (op == 0) {
1699                ClientOptions.getInstance().saveSettings();
1700            }
1701
1702            if (op == 2) {
1703                return;
1704            }
1705        }
1706
1707        QueryHistorySupport.getInstance().saveQueryHistory();
1708
1709        if (clientCore.isAdmin()) {
1710            AdminRefs.getInstance().shutdownServer();
1711        }
1712
1713        System.exit(0);
1714    }//GEN-LAST:event_jMenuItem1ActionPerformed
1715
1716    private void jMenuItem3ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItem3ActionPerformed
1717    }//GEN-LAST:event_jMenuItem3ActionPerformed
1718
1719private void jMenuDirScanActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuDirScanActionPerformed
1720    scanDisk(false);
1721}//GEN-LAST:event_jMenuDirScanActionPerformed
1722
1723    /**
1724     * Do an advanced search
1725     *
1726     * @param evt
1727     */
1728    private void jButtonLogsActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButtonLogsActionPerformed
1729
1730        Logs logs = Logs.getInstance();
1731
1732        if (logs != null) {
1733            logs.setVisible(true);
1734            logs.toFront();
1735            //this.setEnabled(false);
1736        }
1737
1738    }//GEN-LAST:event_jButtonLogsActionPerformed
1739
1740    private void jButtonServicesActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButtonServicesActionPerformed
1741        Services serv = Services.getInstance();
1742        serv.setVisible(true);
1743        serv.toFront();
1744        //this.setEnabled(false);
1745    }//GEN-LAST:event_jButtonServicesActionPerformed
1746
1747    private void jMenuItemServicesActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItemServicesActionPerformed
1748
1749        // invokes the event of the button jButtonServices
1750        jButtonServices.doClick();
1751    }//GEN-LAST:event_jMenuItemServicesActionPerformed
1752
1753    private void jMenuItem1ActionPerformed1(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItem1ActionPerformed1
1754        SubstanceLookAndFeel.setSkin(new BusinessSkin());
1755        repaint();
1756    }//GEN-LAST:event_jMenuItem1ActionPerformed1
1757
1758    private void jMenuItem2ActionPerformed1(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItem2ActionPerformed1
1759        SubstanceLookAndFeel.setSkin(new BusinessBlueSteelSkin());
1760        repaint();
1761    }//GEN-LAST:event_jMenuItem2ActionPerformed1
1762
1763    private void jMenuItem3ActionPerformed1(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItem3ActionPerformed1
1764        SubstanceLookAndFeel.setSkin(new BusinessBlackSteelSkin());
1765        repaint();
1766    }//GEN-LAST:event_jMenuItem3ActionPerformed1
1767
1768    private void jMenuItem4ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItem4ActionPerformed
1769        SubstanceLookAndFeel.setSkin(new CremeSkin());
1770        repaint();
1771    }//GEN-LAST:event_jMenuItem4ActionPerformed
1772
1773    private void jMenuItem5ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItem5ActionPerformed
1774        SubstanceLookAndFeel.setSkin(new MagmaSkin());
1775        repaint();
1776    }//GEN-LAST:event_jMenuItem5ActionPerformed
1777
1778    private void jMenuItem6ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItem6ActionPerformed
1779        SubstanceLookAndFeel.setSkin(new RavenSkin());
1780        repaint();
1781    }//GEN-LAST:event_jMenuItem6ActionPerformed
1782
1783    private void jMenuItem8ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItem8ActionPerformed
1784        SubstanceLookAndFeel.setSkin(new RavenGraphiteGlassSkin());
1785        repaint();
1786    }//GEN-LAST:event_jMenuItem8ActionPerformed
1787
1788    private void jMenuItem10ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItem10ActionPerformed
1789
1790        // invokes the event of the button jButtonLogs
1791        jButtonLogs.doClick();
1792    }//GEN-LAST:event_jMenuItem10ActionPerformed
1793
1794    private void jButtonPeersActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButtonPeersActionPerformed
1795        try {
1796            List<NetworkMember> peerList = UserRefs.getInstance().getSearch().getPeerList();
1797
1798            String peerNames = "These are the P2P peers that are connected:";
1799            if (peerList.size() == 0) {
1800                peerNames = "No peers connected!";
1801            }
1802
1803            for (NetworkMember s : peerList) {
1804                peerNames += "\n" + s.getPeerName() + " : " + s.getPluginName();
1805            }
1806
1807            JOptionPane.showMessageDialog(this, peerNames, "P2P Peers", JOptionPane.INFORMATION_MESSAGE);
1808
1809        } catch (RemoteException ex) {
1810            LoggerFactory.getLogger(MainWindow.class).error(ex.getMessage(), ex);
1811        }
1812    }//GEN-LAST:event_jButtonPeersActionPerformed
1813
1814    private void jMenuItemUsersActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItemUsersActionPerformed
1815        UsersManager usersManager = UsersManager.getInstance();
1816
1817        if (usersManager != null) {
1818            usersManager.setVisible(true);
1819            usersManager.toFront();
1820            //this.setEnabled(false);
1821        }
1822    }//GEN-LAST:event_jMenuItemUsersActionPerformed
1823
1824    public void updateP2PThumbnail(SearchResult result) {
1825        DefaultMutableTreeNode node = (DefaultMutableTreeNode) getjTreeResults().getLastSelectedPathComponent();
1826        if (node == null) {
1827            return;
1828        }
1829
1830        Object nodeInfo = null;
1831        DefaultMutableTreeNode nodeLeaf = null;
1832
1833        if (node.getLevel() == 4 || (node.isLeaf() && node.getLevel() > 1)) {
1834            Object nodeInfoLeaf = null;
1835
1836            if (node.getLevel() == 4) {
1837                nodeLeaf = node.getFirstLeaf();
1838                nodeInfoLeaf = nodeLeaf.getUserObject();
1839            } else {
1840                // Leaf
1841                nodeInfo = node.getUserObject();
1842                nodeLeaf = node;
1843                nodeInfoLeaf = nodeInfo;
1844            }
1845
1846            //SearchResult r = (SearchResult) nodeInfoLeaf;
1847            if (nodeInfoLeaf == result) {
1848                showThumbnail((String) result.getExtraData().get("Thumbnail"));
1849            }
1850        }
1851
1852    }
1853
1854    private void jMenuItemChangePasswordActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItemChangePasswordActionPerformed
1855        ChangePassword changePassword = ChangePassword.getInstance();
1856
1857        if (changePassword != null) {
1858            changePassword.setVisible(true);
1859            changePassword.toFront();
1860        }
1861    }//GEN-LAST:event_jMenuItemChangePasswordActionPerformed
1862
1863    private void jMenuItemActiveUsersActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItemActiveUsersActionPerformed
1864        ActiveSessions activeSessions = ActiveSessions.getInstance();
1865
1866        if (activeSessions != null) {
1867            activeSessions.setVisible(true);
1868            activeSessions.toFront();
1869            //this.setEnabled(false);
1870        }
1871    }//GEN-LAST:event_jMenuItemActiveUsersActionPerformed
1872
1873    private void jButtonClientPreferencesActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButtonClientPreferencesActionPerformed
1874        ClientOptions cliOptions = ClientOptions.getInstance();
1875
1876        if (cliOptions != null) {
1877            cliOptions.setVisible(true);
1878            cliOptions.toFront();
1879        }
1880    }//GEN-LAST:event_jButtonClientPreferencesActionPerformed
1881
1882    @SuppressWarnings("empty-statement")
1883    private void jMenuItemShutdownActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItemShutdownActionPerformed
1884        Object[] opt
1885                = {
1886                    "Yes", "No"
1887                };
1888
1889        String message = "Are you shure you want to shutdown the server?";
1890        int op = JOptionPane.showOptionDialog(this, message, "Shut down Server", JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE, null, opt, opt[1]);
1891
1892        if (op == 0) {
1893            //Logout from GUI Server
1894            if (clientCore.isAdmin()) {
1895
1896                if (AdminRefs.getInstance().unsavedSettings()) {
1897                    Object[] opt1
1898                            = {
1899                                "Save", "Discard"
1900                            };
1901
1902                    message = "There are unsaved Server Settings.\nDo you want to save them?";
1903                    op = JOptionPane.showOptionDialog(this, message, "Unsaved Server Settings", JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE, null, opt1, opt1[0]);
1904
1905                    if (op == 0) {
1906                        AdminRefs.getInstance().saveSettings();
1907                    }
1908
1909                }
1910            }
1911
1912            if (clientCore.isUser()) {
1913                if (ClientOptions.getInstance().unsavedSettings()) {
1914                    Object[] opt2
1915                            = {
1916                                "Save",
1917                                "Discard"
1918                            };
1919
1920                    message = "There are unsaved Client Settings.\nDo you want to save them?";
1921                    op = JOptionPane.showOptionDialog(this, message, "Unsaved Client Settings", JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE, null, opt2, opt2[0]);
1922
1923                    if (op == 0) {
1924                        ClientOptions.getInstance().saveSettings();
1925                    }
1926                }
1927            }
1928
1929            QueryHistorySupport.getInstance().saveQueryHistory();
1930
1931            if (clientCore.isAdmin()) {
1932                AdminRefs.getInstance().shutdownServer();
1933            }
1934
1935            System.exit(0);
1936        }
1937    }//GEN-LAST:event_jMenuItemShutdownActionPerformed
1938
1939    private void jMenuItemDcm2jpeg2ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItemDcm2jpeg2ActionPerformed
1940        dcm2JPEG(0);
1941    }//GEN-LAST:event_jMenuItemDcm2jpeg2ActionPerformed
1942
1943    private void jMenuItem11ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItem11ActionPerformed
1944        //Logout from GUI Server
1945        try {
1946            if (clientCore.isAdmin() && AdminRefs.getInstance().unsavedSettings()) {
1947                Object[] opt
1948                        = {
1949                            "Save", "Discard", "Cancel"
1950                        };
1951
1952                String message = "There are unsaved Server Settings.\nDo you want to save them?";
1953                int op = JOptionPane.showOptionDialog(this, message, "Unsaved Server Settings", JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE, null, opt, opt[2]);
1954
1955                if (op == 0) {
1956                    AdminRefs.getInstance().saveSettings();
1957                }
1958
1959                if (op == 2) {
1960                    return;
1961                }
1962            }
1963
1964            if (clientCore.isUser() && ClientOptions.getInstance().unsavedSettings()) {
1965                Object[] opt
1966                        = {
1967                            "Save", "Discard", "Cancel"
1968                        };
1969
1970                String message = "There are unsaved Client Settings.\nDo you want to save them?";
1971                int op = JOptionPane.showOptionDialog(this, message, "Unsaved Client Settings", JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE, null, opt, opt[2]);
1972
1973                if (op == 0) {
1974                    ClientOptions.getInstance().saveSettings();
1975                }
1976
1977                if (op == 2) {
1978                    return;
1979                }
1980            }
1981
1982            if (clientCore.isAdmin()) {
1983                AdminRefs.getInstance().logout();
1984            }
1985
1986            searchTree.unexportSearchSignal();
1987            clientCore.getUser().logout();
1988
1989        } catch (RemoteException ex) {
1990            LoggerFactory.getLogger(MainWindow.class).error(ex.getMessage(), ex);
1991        }
1992        File toDelete = new File("pluginClasses");
1993        String[] deleteArray = toDelete.list();
1994        if (deleteArray != null) {
1995            for (String fileName : deleteArray) {
1996                File f = new File("pluginClasses/" + fileName);
1997                f.delete();
1998            }
1999        }
2000        QueryHistorySupport.getInstance().saveQueryHistory();
2001
2002        if (Main.isFixedClient()) {
2003            clientCore.stopKeepAlives();
2004            this.dispose();
2005        } else {
2006            System.exit(0);
2007        }
2008    }//GEN-LAST:event_jMenuItem11ActionPerformed
2009
2010private void jMenuItem7ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItem7ActionPerformed
2011    File toDelete = new File("pluginClasses");
2012    String[] deleteArray = toDelete.list();
2013    if (deleteArray != null) {
2014        for (String fileName : deleteArray) {
2015            File f = new File("pluginClasses/" + fileName);
2016            f.delete();
2017        }
2018    }
2019    if (clientCore.isAdmin() && AdminRefs.getInstance().unsavedSettings()) {
2020        Object[] opt
2021                = {
2022                    "Save", "Discard", "Cancel"
2023                };
2024
2025        String message = "There are unsaved Server Settings.\nDo you want to save them?";
2026        int op = JOptionPane.showOptionDialog(this, message, "Unsaved Server Settings", JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE, null, opt, opt[2]);
2027
2028        if (op == 0) {
2029            AdminRefs.getInstance().saveSettings();
2030        }
2031
2032        if (op == 2) {
2033            return;
2034        }
2035    }
2036
2037    if (ClientOptions.getInstance().unsavedSettings()) {
2038        Object[] opt
2039                = {
2040                    "Save", "Discard", "Cancel"
2041                };
2042
2043        String message = "There are unsaved Client Settings.\nDo you want to save them?";
2044        int op = JOptionPane.showOptionDialog(this, message, "Unsaved Client Settings", JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE, null, opt, opt[2]);
2045
2046        if (op == 0) {
2047            ClientOptions.getInstance().saveSettings();
2048        }
2049
2050        if (op == 2) {
2051            return;
2052        }
2053    }
2054
2055    QueryHistorySupport.getInstance().saveQueryHistory();
2056
2057    if (clientCore.isAdmin()) {
2058        AdminRefs.getInstance().shutdownServer();
2059    }
2060
2061    System.exit(0);
2062}//GEN-LAST:event_jMenuItem7ActionPerformed
2063
2064private void jTreeResultsKeyReleased(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_jTreeResultsKeyReleased
2065    if (KeyEvent.VK_DELETE == evt.getKeyCode() && clientCore.isAdmin()) {
2066        ArrayList<String> files = getSelectedLocalFiles();
2067
2068        if (files != null && !files.isEmpty()) {
2069            try {
2070                Object[] opt
2071                        = {
2072                            "Remove and Delete", "Remove", "Cancel"
2073                        };
2074                String message = "Are you sure you want to remove these files from Index Engine?";
2075
2076                int op = JOptionPane.showOptionDialog(this, message, "Remove Files", JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.WARNING_MESSAGE, null, opt, opt[2]);
2077
2078                if (op == 0) {
2079                    AdminRefs.getInstance().getIndexOptions().removeFilesFromIndexer(files, true);
2080                }
2081                if (op == 1) {
2082                    AdminRefs.getInstance().getIndexOptions().removeFilesFromIndexer(files, false);
2083                }
2084            } catch (RemoteException ex) {
2085                LoggerFactory.getLogger(MainWindow.class).error(ex.getMessage(), ex);
2086            }
2087        }
2088    }
2089}//GEN-LAST:event_jTreeResultsKeyReleased
2090
2091    /*
2092     * This need some serious rewritting
2093     * alot of cruft
2094     */
2095private void jTreeResultsValueChanged(javax.swing.event.TreeSelectionEvent evt) {//GEN-FIRST:event_jTreeResultsValueChanged
2096
2097    /*
2098     DefaultMutableTreeNode node = (DefaultMutableTreeNode) getjTreeResults().getLastSelectedPathComponent();
2099     if (node == null){
2100     return;
2101     }
2102     this.jButtonDownload.setEnabled(false);
2103     Object nodeInfo = null;
2104     DefaultMutableTreeNode nodeLeaf = null;
2105
2106
2107     if (node.getLevel() == 4 || (node.isLeaf() && node.getLevel() > 1)){
2108     Object nodeInfoLeaf = null;
2109
2110     if (node.getLevel() == 4){
2111     nodeLeaf = node.getFirstLeaf();
2112     nodeInfoLeaf = nodeLeaf.getUserObject();
2113     }
2114     else{
2115     // Leaf
2116     nodeInfo = node.getUserObject();
2117     nodeLeaf = node;
2118     nodeInfoLeaf = nodeInfo;
2119     }
2120
2121     SearchResult r = (SearchResult) nodeInfoLeaf;
2122
2123     //HashMap extras = r.getExtraData();
2124     //String thumb = (String) extras.get("Thumbnail");
2125
2126     //System.out.println("Filename: " + r.getFileName());
2127     //System.out.println("FileHash: " + r.getFileHash());
2128     */
2129    /*if (thumb != null){
2130     showThumbnail(thumb);
2131     }
2132     else if (!SearchResult.class.isInstance(nodeInfoLeaf) && SearchResult.class.isInstance(nodeInfoLeaf)){
2133     SearchResult res = searchTree.searchThumbnail(r.getURI(), "filehash");//was r.getFileHash, should be placed on extradata
2134
2135     if (res != null){
2136     HashMap extras2 = res.getExtraData();
2137
2138     if (extras2 != null){
2139     thumb = (String) extras2.get("Thumbnail");
2140
2141     if (thumb != null){
2142     extras.put("Thumbnail", thumb); // put the thumbnail in the original SearchResult
2143
2144     showThumbnail(thumb);
2145     }
2146     else{
2147     cleanThumbnails();
2148     }
2149     }
2150     }
2151     //TODO
2152     //this must be removed! we must not care where the search comes from
2153     }
2154     else if (SearchResult.class.isInstance(nodeInfoLeaf)){
2155     searchTree.searchP2PThumbnail(r);
2156     cleanThumbnails();
2157     }
2158     else{
2159     cleanThumbnails();
2160     }*/
2161    /*  }
2162     else{
2163     cleanThumbnails();
2164     }
2165
2166     //Controll the enable buttons
2167     if (node.isLeaf())
2168     {
2169     jButtonDump.setEnabled(true);
2170     IPluginControllerUser plugins = null;
2171     try
2172     {
2173     plugins = this.clientCore.getUser().getPluginController();
2174            
2175     //dafuq is this?
2176     if ((SearchResult) nodeInfo==null)
2177     {
2178                
2179            
2180     }
2181     */
2182            //TODO: fix this!
2183            /*if (!plugins.isLocalPlugin(((SearchResult) nodeInfo).getPluginName()))
2184     {
2185     jButtonDownload.setEnabled(true);
2186     jButtonSend.setEnabled(false);
2187     } else
2188     {*/
2189    /*          jButtonSend.setEnabled(true);
2190     jButtonView.setEnabled(true);
2191     //}
2192     }
2193     catch (RemoteException ex){
2194     Logger.getLogger(MainWindow.class.getName()).log(Level.SEVERE, null, ex);
2195     }
2196     }
2197     else{
2198     jButtonDump.setEnabled(false);
2199     jButtonDownload.setEnabled(false);
2200     jButtonView.setEnabled(false);
2201
2202     jButtonSend.setEnabled(true);
2203     }*/
2204}//GEN-LAST:event_jTreeResultsValueChanged
2205
2206private void jTreeResultsTreeExpanded(javax.swing.event.TreeExpansionEvent evt) {//GEN-FIRST:event_jTreeResultsTreeExpanded
2207    //searchTree.completeTree(evt);
2208}//GEN-LAST:event_jTreeResultsTreeExpanded
2209
2210private void jTreeResultsMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_jTreeResultsMouseClicked
2211    //Double Click -> Show MetaData
2212    if (evt.getClickCount() == 2) {
2213        showMetaData();
2214    }
2215
2216    if (evt.getButton() == MouseEvent.BUTTON3) {
2217        popupMenu.show(evt.getComponent(), evt.getX(), evt.getY());
2218        popupMenu.list();
2219    }
2220}//GEN-LAST:event_jTreeResultsMouseClicked
2221
2222private void jButtonExportActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButtonExportActionPerformed
2223    if (jTreeResults.getModel().getChildCount(jTreeResults.getModel().getRoot()) == 0) {
2224        JOptionPane.showMessageDialog(this, "You can't export information without search results.", "Lack of Search Results", JOptionPane.INFORMATION_MESSAGE);
2225        return;
2226    }
2227
2228    ExportData ed;
2229
2230    HashMap<String, Boolean> plugins = new HashMap<String, Boolean>();
2231    for (JCheckBox box : this.ranges) {
2232        plugins.put(box.getText(), box.isSelected());
2233    }
2234    if (!lastQueryAdvanced) {
2235
2236        ed = new ExportData(lastQueryExecuted, lastQueryKeywords, plugins);
2237    } else {
2238        ed = new ExportData(lastQueryExecuted, true, plugins);
2239    }
2240
2241    ed.setVisible(true);
2242    ed.toFront();
2243}//GEN-LAST:event_jButtonExportActionPerformed
2244
2245//what a nice and descriptive name... I don't know what it does,
2246//so there is a big chance of having broke something
2247private void jButtonViewActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButtonViewActionPerformed
2248    DefaultMutableTreeNode node = (DefaultMutableTreeNode) jTreeResults.getLastSelectedPathComponent();
2249    if (node == null) {
2250        return;
2251    }
2252
2253    Object nodeInfo = node.getUserObject();
2254    // int selected = this.jList1.getSelectedIndex();
2255    if (node.isLeaf()) {
2256        if (SearchResult.class.isInstance(nodeInfo)) {
2257            SearchResult tmp = (SearchResult) nodeInfo;
2258
2259            //Why are we caring about this?
2260            if (clientCore.isLocalServer()) {
2261
2262                File f = new File(tmp.getURI());
2263                if (!f.exists()) {
2264                    JOptionPane.showMessageDialog(this, "Dicoogle can't open this file, because this file does not exists in your file system. Try Dump button instead View!", "Error opening the file", JOptionPane.ERROR_MESSAGE);
2265                    return;
2266                }
2267
2268                if (ClientSettings.getInstance().getExtV() == null
2269                        || ClientSettings.getInstance().getExtV().equals("")) {
2270
2271                    try {
2272                        Desktop.getDesktop().open(new File(tmp.getURI()));
2273
2274                    } catch (IOException ex) {
2275                        //oh dear
2276                        String folder = f.getAbsolutePath().substring(0, f.getAbsolutePath().lastIndexOf('/'));
2277
2278                        try {
2279                            Desktop.getDesktop().open(new File(folder));
2280
2281                        } catch (IOException ex1) {
2282                            JOptionPane.showMessageDialog(this, "Dicoogle can't open this file!", "Error opening the file", JOptionPane.ERROR_MESSAGE);
2283                        }
2284                    }
2285                } else {
2286                    try {
2287                        //I changed something, no ideia do i have on what goes around here
2288                        ProcessBuilder pb = new ProcessBuilder(ClientSettings.getInstance().getExtV(), tmp.getURI().toString());
2289                        pb.start();
2290
2291                        //Runtime.getRuntime().exec(ClientSettings.getInstance().getExtV() + " "+path);
2292                    } catch (IOException ex) {
2293                        //ex.printStackTrace();
2294
2295                        String folder = f.getAbsolutePath().substring(0, f.getAbsolutePath().lastIndexOf('/'));
2296
2297                        try {
2298                            Desktop.getDesktop().open(new File(folder));
2299
2300                        } catch (IOException ex1) {
2301                            JOptionPane.showMessageDialog(this, "Dicoogle can't open this file!", "Error opening the file", JOptionPane.ERROR_MESSAGE);
2302                        }
2303                    }
2304                }
2305            } else {
2306                try {
2307                    SimpleEntry<RemoteFile, Integer> entry = UserRefs.getInstance().getSearch().downloadFile(tmp);
2308
2309                    TransferStatus ts = new TransferStatus(entry.getKey());
2310
2311                    FileReceiver receiver = new FileReceiver(entry.getKey(), clientCore.getServerAddress(), entry.getValue(), ts);
2312
2313                    Thread tReceiver = receiver;
2314                    tReceiver.start();
2315
2316                    ts.setVisible(true);
2317                    ts.toFront();
2318
2319                } catch (RemoteException ex) {
2320                    LoggerFactory.getLogger(MainWindow.class).error(ex.getMessage(), ex);
2321                } catch (IOException ex) {
2322                    LoggerFactory.getLogger(MainWindow.class).error(ex.getMessage(), ex);
2323                }
2324            }
2325        }
2326    }
2327}//GEN-LAST:event_jButtonViewActionPerformed
2328
2329private void jButtonDownloadActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButtonDownloadActionPerformed
2330
2331    DefaultMutableTreeNode node = (DefaultMutableTreeNode) jTreeResults.getLastSelectedPathComponent();
2332    if (node == null) {
2333        return;
2334    }
2335
2336    Object nodeInfo = node.getUserObject();
2337
2338    if (node.isLeaf() && SearchResult.class.isInstance(nodeInfo)) {
2339        try {
2340            SearchResult temp = (SearchResult) nodeInfo;
2341            UserRefs.getInstance().getSearch().RequestP2PFile(temp);
2342
2343        } catch (RemoteException ex) {
2344            LoggerFactory.getLogger(MainWindow.class).error(ex.getMessage(), ex);
2345        }
2346    }
2347}//GEN-LAST:event_jButtonDownloadActionPerformed
2348
2349private void jButtonDumpActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButtonDumpActionPerformed
2350    showMetaData();
2351}//GEN-LAST:event_jButtonDumpActionPerformed
2352
2353private void jButtonSendActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButtonSendActionPerformed
2354    ArrayList<String> files = getSelectedLocalFiles();
2355
2356    if (files != null && !files.isEmpty()) {
2357        DicomSend d = new DicomSend(files);
2358
2359        d.setVisible(true);
2360        d.toFront();
2361    } else {
2362        JOptionPane.showMessageDialog(this, "Please Select Local Files to send.", "Select files", JOptionPane.INFORMATION_MESSAGE);
2363    }
2364}//GEN-LAST:event_jButtonSendActionPerformed
2365
2366private void jButtonQueryHistoryActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButtonQueryHistoryActionPerformed
2367    QueryHistory QH = QueryHistory.getInstance();
2368    QH.setVisible(true);
2369    QH.toFront();
2370    QH.setJTextFieldQuery(jTextFieldQuery, jCheckBoxKeywords);
2371}//GEN-LAST:event_jButtonQueryHistoryActionPerformed
2372
2373private void SearchTipsActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_SearchTipsActionPerformed
2374    SearchTips tip = new SearchTips(this.jTextFieldQuery);
2375    tip.setVisible(true);
2376    tip.toFront();
2377}//GEN-LAST:event_SearchTipsActionPerformed
2378
2379    enum QUERY_STATE {
2380
2381        READY_TO_SEARCH, WAITING_FOR_RESULTS
2382    }
2383    private QUERY_STATE state = QUERY_STATE.READY_TO_SEARCH;
2384    private boolean basicSearch = true;
2385
2386    public void search() {
2387
2388        LoggerFactory.getLogger(MainWindow.class).debug("State: {}", state);
2389        if (state == QUERY_STATE.WAITING_FOR_RESULTS) {
2390
2391            LoggerFactory.getLogger(MainWindow.class).debug("Pruning query");
2392
2393            pruneQuery();
2394            return;
2395        }
2396
2397        this.jButtonDownload.setEnabled(false);
2398        lastQueryExecuted = jTextFieldQuery.getText();
2399        lastQueryKeywords = jCheckBoxKeywords.isSelected();
2400        lastQueryAdvanced = false;
2401        HashMap<String, Boolean> plugins = new HashMap<String, Boolean>();
2402        boolean isSelectedPlugins = false;
2403        for (JCheckBox box : this.ranges) {
2404            plugins.put(box.getText(), box.isSelected());
2405            isSelectedPlugins = isSelectedPlugins || box.isSelected();
2406        }
2407        if (!isSelectedPlugins) {
2408            JOptionPane.showMessageDialog(this, "Please select a source to search", "Missing data source", JOptionPane.INFORMATION_MESSAGE);
2409        } else {
2410            basicSearch = true;
2411            searchTree.search(lastQueryExecuted, lastQueryKeywords, plugins);
2412            state = QUERY_STATE.WAITING_FOR_RESULTS;
2413            jButtonSearch.setText("Cancel");
2414            cleanThumbnails();
2415            QueryHistorySupport.getInstance().saveQueryHistory();
2416        }
2417
2418    }
2419
2420    public void pruneQuery() {
2421        System.out.println("Prune here");
2422        searchTree.pruneQuery(null);
2423        state = QUERY_STATE.READY_TO_SEARCH;
2424        jButtonSearch.setText("Search");
2425    }
2426
2427    public void finishQuery() {
2428        //System.out.println("The query is done");
2429        jButtonSearch.setText("Search");
2430
2431        state = QUERY_STATE.READY_TO_SEARCH;
2432    }
2433
2434    /*
2435     * Updates the tree view using the query results.
2436     * 
2437     * todo: the tree is not a parameter to the method, as such it has state. make the tree to be updated an argument
2438     */
2439    private void updateSearchView(Iterable<SearchResult> searchResultIterator) {
2440
2441        HashMap<String, HashMap<String, HashMap<String, HashMap<String, SearchResult>>>> tree;//omfgIHateYou;
2442        tree = SearchResult.toTree(searchResultIterator);
2443
2444        DefaultMutableTreeNode root = new DefaultMutableTreeNode("Search Results");
2445
2446        for (String patientName : tree.keySet()) {
2447            DefaultMutableTreeNode patientMap = new DefaultMutableTreeNode(patientName);
2448            root.add(patientMap);
2449
2450            for (String studyUID : tree.get(patientName).keySet()) {
2451                DefaultMutableTreeNode studyMap = new DefaultMutableTreeNode(studyUID);
2452                patientMap.add(studyMap);
2453
2454                for (String seriesUID : tree.get(patientName).get(studyUID).keySet()) {
2455                    DefaultMutableTreeNode seriesMap = new DefaultMutableTreeNode(seriesUID);
2456                    studyMap.add(seriesMap);
2457
2458                    for (SearchResult r : tree.get(patientName).get(studyUID).get(seriesUID).values()) {
2459                        DefaultMutableTreeNode images = new DefaultMutableTreeNode(r);
2460                        seriesMap.add(images);
2461                    }
2462                }
2463            }
2464        }
2465        DefaultTreeModel treeModel = new DefaultTreeModel(root);
2466        jTreeResults.setModel(treeModel);
2467    }
2468
2469private void jButtonSearchActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButtonSearchActionPerformed
2470    String query = jTextFieldQuery.getText();
2471
2472    //prepares the info we are interested in
2473    HashMap<String, Object> options = new HashMap<>();
2474    options.put("PatientName", null);
2475    options.put("PatientID", null);
2476    options.put("StudyInstanceUID", null);
2477    options.put("SeriesInstanceUID", null);
2478    options.put("SOPInstanceUID", null);
2479
2480    //runs the query task asynchronously
2481    List<String> providers = new ArrayList<>();
2482    for (JCheckBox chkBox : this.ranges) {
2483        if (chkBox.isSelected()) {
2484            providers.add(chkBox.getText());
2485            System.out.println("Selected: " + chkBox.getText());
2486        }
2487    }
2488
2489    JointQueryTask task = new JointQueryTask() {
2490
2491        @Override
2492        public void onReceive(Task<Iterable<SearchResult>> e) {
2493            // TODO Auto-generated method stub
2494            try {
2495                updateSearchView(e.get());
2496            } catch (InterruptedException | ExecutionException e1) {
2497                // TODO Auto-generated catch block
2498                e1.printStackTrace();
2499            }
2500        }
2501
2502        @Override
2503        public void onCompletion() {
2504                        // TODO Auto-generated method stub
2505
2506        }
2507    };
2508
2509    task = PluginController.getInstance().query(task, providers, query, options);
2510
2511
2512}//GEN-LAST:event_jButtonSearchActionPerformed
2513
2514
2515private void DateRangeActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_DateRangeActionPerformed
2516    if (ExactDate.isSelected()) {
2517        ExactDate.setSelected(false);
2518    }
2519    StudyDateRangeInitialBoundaryActivation.setEnabled(true);
2520    StudyDateRangeTerminalBoundaryActivation.setEnabled(true);
2521    StudyDateRangeInitialBoundary.setEnabled(false);
2522    StudyDateRangeTerminalBoundary.setEnabled(false);
2523    StudyDate.setEnabled(false);
2524}//GEN-LAST:event_DateRangeActionPerformed
2525
2526private void ExactDateActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_ExactDateActionPerformed
2527    if (DateRange.isSelected()) {
2528        DateRange.setSelected(false);
2529    }
2530    StudyDateRangeInitialBoundaryActivation.setEnabled(false);
2531    StudyDateRangeTerminalBoundaryActivation.setEnabled(false);
2532    StudyDateRangeInitialBoundary.setEnabled(false);
2533    StudyDateRangeTerminalBoundary.setEnabled(false);
2534    StudyDate.setEnabled(true);
2535}//GEN-LAST:event_ExactDateActionPerformed
2536
2537private void StudyDateRangeTerminalBoundaryActivationActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_StudyDateRangeTerminalBoundaryActivationActionPerformed
2538    if (StudyDateRangeTerminalBoundaryActivation.isSelected()) {
2539        StudyDateRangeTerminalBoundary.setEnabled(true);
2540    } else {
2541        StudyDateRangeTerminalBoundary.setEnabled(false);
2542    }
2543}//GEN-LAST:event_StudyDateRangeTerminalBoundaryActivationActionPerformed
2544
2545private void StudyDateRangeInitialBoundaryActivationActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_StudyDateRangeInitialBoundaryActivationActionPerformed
2546    if (StudyDateRangeInitialBoundaryActivation.isSelected()) {
2547        StudyDateRangeInitialBoundary.setEnabled(true);
2548    } else {
2549        StudyDateRangeInitialBoundary.setEnabled(false);
2550    }
2551}//GEN-LAST:event_StudyDateRangeInitialBoundaryActivationActionPerformed
2552
2553private void ResetFieldsActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_ResetFieldsActionPerformed
2554
2555    ModalSelectNone.setSelected(false);
2556    ModalSelectAll.setSelected(true);
2557    ModalCR.setSelected(true);
2558    ModalCT.setSelected(true);
2559    ModalDX.setSelected(true);
2560    ModalES.setSelected(true);
2561    ModalMG.setSelected(true);
2562    ModalMR.setSelected(true);
2563    ModalNM.setSelected(true);
2564    ModalOT.setSelected(true);
2565    ModalPT.setSelected(true);
2566    ModalRF.setSelected(true);
2567    ModalSC.setSelected(true);
2568    ModalUS.setSelected(true);
2569    ModalXA.setSelected(true);
2570
2571    StudyDateRangeInitialBoundary.setEnabled(false);
2572    StudyDateRangeTerminalBoundary.setEnabled(false);
2573
2574    DateRange.setSelected(false);
2575    ExactDate.setSelected(true);
2576
2577    StudyDateRangeInitialBoundaryActivation.setEnabled(false);
2578    StudyDateRangeTerminalBoundaryActivation.setEnabled(false);
2579    StudyDateRangeInitialBoundary.setEnabled(false);
2580    StudyDateRangeTerminalBoundary.setEnabled(false);
2581    StudyDate.setEnabled(true);
2582    PatientName.setText("(All patients)");
2583    PatientID.setText("(All IDs)");
2584    PatientGender.setSelectedIndex(0);
2585    InstitutionName.setText("(All institutions)");
2586    Physician.setText("(All physicians)");
2587    OperatorName.setText("(All operators)");
2588    StudyDate.setText("(All dates)");
2589    StudyDateRangeInitialBoundary.setText("(Beginning)");
2590    StudyDateRangeTerminalBoundary.setText("(Today)");
2591}//GEN-LAST:event_ResetFieldsActionPerformed
2592
2593private void AdvancedSearchButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_AdvancedSearchButtonActionPerformed
2594    lastQueryExecuted = getAdvancedQuery();
2595    lastQueryAdvanced = true;
2596    HashMap<String, Boolean> plugins = new HashMap<String, Boolean>();
2597    for (JCheckBox box : this.ranges) {
2598        plugins.put(box.getText(), box.isSelected());
2599    }
2600    searchTree.search(lastQueryExecuted, true, plugins);
2601
2602    cleanThumbnails();
2603}//GEN-LAST:event_AdvancedSearchButtonActionPerformed
2604
2605private void ModalSelectNoneActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_ModalSelectNoneActionPerformed
2606    ModalSelectNone.setSelected(true);
2607    ModalSelectAll.setSelected(false);
2608    ModalCR.setSelected(false);
2609    ModalCT.setSelected(false);
2610    ModalDX.setSelected(false);
2611    ModalES.setSelected(false);
2612    ModalMG.setSelected(false);
2613    ModalMR.setSelected(false);
2614    ModalNM.setSelected(false);
2615    ModalOT.setSelected(false);
2616    ModalPT.setSelected(false);
2617    ModalRF.setSelected(false);
2618    ModalSC.setSelected(false);
2619    ModalUS.setSelected(false);
2620    ModalXA.setSelected(false);
2621}//GEN-LAST:event_ModalSelectNoneActionPerformed
2622
2623private void ModalSelectAllActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_ModalSelectAllActionPerformed
2624    ModalSelectNone.setSelected(false);
2625    ModalSelectAll.setSelected(true);
2626    ModalCR.setSelected(true);
2627    ModalCT.setSelected(true);
2628    ModalDX.setSelected(true);
2629    ModalES.setSelected(true);
2630    ModalMG.setSelected(true);
2631    ModalMR.setSelected(true);
2632    ModalNM.setSelected(true);
2633    ModalOT.setSelected(true);
2634    ModalPT.setSelected(true);
2635    ModalRF.setSelected(true);
2636    ModalSC.setSelected(true);
2637    ModalUS.setSelected(true);
2638    ModalXA.setSelected(true);
2639}//GEN-LAST:event_ModalSelectAllActionPerformed
2640
2641private void ModalXAActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_ModalXAActionPerformed
2642    ModalSelectNone.setSelected(true);
2643    ModalSelectAll.setSelected(false);
2644}//GEN-LAST:event_ModalXAActionPerformed
2645
2646private void ModalUSActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_ModalUSActionPerformed
2647    ModalSelectNone.setSelected(true);
2648    ModalSelectAll.setSelected(false);
2649}//GEN-LAST:event_ModalUSActionPerformed
2650
2651private void ModalOTActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_ModalOTActionPerformed
2652    ModalSelectAll.setSelected(false);
2653    ModalSelectNone.setSelected(true);
2654}//GEN-LAST:event_ModalOTActionPerformed
2655
2656private void ModalESActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_ModalESActionPerformed
2657    ModalSelectNone.setSelected(true);
2658    ModalSelectAll.setSelected(false);
2659}//GEN-LAST:event_ModalESActionPerformed
2660
2661private void ModalSCActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_ModalSCActionPerformed
2662    ModalSelectNone.setSelected(true);
2663    ModalSelectAll.setSelected(false);
2664}//GEN-LAST:event_ModalSCActionPerformed
2665
2666private void ModalNMActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_ModalNMActionPerformed
2667    ModalSelectNone.setSelected(true);
2668    ModalSelectAll.setSelected(false);
2669}//GEN-LAST:event_ModalNMActionPerformed
2670
2671private void ModalDXActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_ModalDXActionPerformed
2672    ModalSelectNone.setSelected(true);
2673    ModalSelectAll.setSelected(false);
2674}//GEN-LAST:event_ModalDXActionPerformed
2675
2676private void ModalRFActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_ModalRFActionPerformed
2677    ModalSelectNone.setSelected(true);
2678    ModalSelectAll.setSelected(false);
2679}//GEN-LAST:event_ModalRFActionPerformed
2680
2681private void ModalMRActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_ModalMRActionPerformed
2682    ModalSelectNone.setSelected(true);
2683    ModalSelectAll.setSelected(false);
2684}//GEN-LAST:event_ModalMRActionPerformed
2685
2686private void ModalCTActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_ModalCTActionPerformed
2687    ModalSelectNone.setSelected(true);
2688    ModalSelectAll.setSelected(false);
2689}//GEN-LAST:event_ModalCTActionPerformed
2690
2691private void ModalPTActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_ModalPTActionPerformed
2692    ModalSelectNone.setSelected(true);
2693    ModalSelectAll.setSelected(false);
2694}//GEN-LAST:event_ModalPTActionPerformed
2695
2696private void ModalMGActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_ModalMGActionPerformed
2697    ModalSelectNone.setSelected(true);
2698    ModalSelectAll.setSelected(false);
2699}//GEN-LAST:event_ModalMGActionPerformed
2700
2701private void ModalCRActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_ModalCRActionPerformed
2702    ModalSelectNone.setSelected(true);
2703    ModalSelectAll.setSelected(false);
2704}//GEN-LAST:event_ModalCRActionPerformed
2705
2706private void SelectDefaultSearchActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_SelectDefaultSearchActionPerformed
2707    SelectAdvancedSearch.setSelected(false);
2708    SelectDefaultSearch.setSelected(true);
2709    jPanel1.setVisible(true);
2710    jPanel2.setVisible(false);
2711}//GEN-LAST:event_SelectDefaultSearchActionPerformed
2712
2713private void SelectAdvancedSearchActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_SelectAdvancedSearchActionPerformed
2714    SelectDefaultSearch.setSelected(false);
2715    SelectAdvancedSearch.setSelected(true);
2716    jPanel1.setVisible(false);
2717    jPanel2.setVisible(true);
2718}//GEN-LAST:event_SelectAdvancedSearchActionPerformed
2719
2720    private void scanDisk(boolean resume) {
2721
2722        if (!clientCore.isLocalServer()) {
2723            class Action1 extends FileAction {
2724
2725                private boolean resume = false;
2726
2727                public void setResume(boolean resume) {
2728
2729                    this.resume = resume;
2730                }
2731
2732                @Override
2733                public void setFileChoosed(String filePath) {
2734                    AdminRefs.getInstance().index(filePath, resume);
2735
2736                    /*TaskList tasks = TaskList.getInstance();
2737                     tasks.setVisible(true);
2738                     tasks.toFront();*/
2739                }
2740            }
2741
2742            Action1 action = new Action1();
2743            action.setResume(resume);
2744
2745            RemoteFileChooser chooser = new RemoteFileChooser(AdminRefs.getInstance().getRFS(), AdminRefs.getInstance().getDefaultFilePath(), action);
2746
2747            chooser.setTitle("Dicoogle Scan Directory");
2748            chooser.setFileSelectionMode(RemoteFileChooser.DIRECTORIES_ONLY);
2749
2750            chooser.setVisible(true);
2751            // TODO:  put showTaskList = false; -- somewhere...
2752
2753        } else {
2754            JFileChooser chooser = new JFileChooser();
2755            chooser.setCurrentDirectory(new java.io.File(AdminRefs.getInstance().getDefaultFilePath()));
2756            chooser.setDialogTitle("Dicoogle Scan Directory");
2757            chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
2758            chooser.setAcceptAllFileFilterUsed(false);
2759
2760            if (chooser.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) {
2761                AdminRefs.getInstance().index(chooser.getSelectedFile().toString(), resume);
2762
2763                /*TaskList tasks = TaskList.getInstance();
2764                 tasks.setVisible(true);
2765                 tasks.toFront();*/
2766            }
2767
2768        }
2769
2770    }
2771
2772private void jMenuDirScanResumeActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuDirScanResumeActionPerformed
2773
2774    scanDisk(true);
2775
2776}//GEN-LAST:event_jMenuDirScanResumeActionPerformed
2777
2778private void jTextFieldQueryKeyPressed(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_jTextFieldQueryKeyPressed
2779
2780    if (evt.getKeyCode() == KeyEvent.VK_ENTER) {
2781        search();
2782    }
2783
2784
2785}//GEN-LAST:event_jTextFieldQueryKeyPressed
2786
2787    private void formWindowOpened(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_formWindowOpened
2788
2789        if (Main.isFixedClient()) {
2790
2791            PluginController PController = PluginController.getInstance();
2792            //TODO: DELETED
2793            //PController.initGUI();
2794        }
2795
2796    }//GEN-LAST:event_formWindowOpened
2797
2798    private void jTextFieldQueryActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jTextFieldQueryActionPerformed
2799        // TODO add your handling code here:
2800    }//GEN-LAST:event_jTextFieldQueryActionPerformed
2801
2802    // Variables declaration - do not modify//GEN-BEGIN:variables
2803    private javax.swing.JButton AdvancedSearchButton;
2804    private javax.swing.JRadioButton DateRange;
2805    private javax.swing.JRadioButton ExactDate;
2806    private javax.swing.JTextField InstitutionName;
2807    private javax.swing.JCheckBox ModalCR;
2808    private javax.swing.JCheckBox ModalCT;
2809    private javax.swing.JCheckBox ModalDX;
2810    private javax.swing.JCheckBox ModalES;
2811    private javax.swing.JCheckBox ModalMG;
2812    private javax.swing.JCheckBox ModalMR;
2813    private javax.swing.JCheckBox ModalNM;
2814    private javax.swing.JCheckBox ModalOT;
2815    private javax.swing.JCheckBox ModalPT;
2816    private javax.swing.JCheckBox ModalRF;
2817    private javax.swing.JCheckBox ModalSC;
2818    private javax.swing.JRadioButton ModalSelectAll;
2819    private javax.swing.JRadioButton ModalSelectNone;
2820    private javax.swing.JCheckBox ModalUS;
2821    private javax.swing.JCheckBox ModalXA;
2822    private javax.swing.JTextField OperatorName;
2823    private javax.swing.JComboBox PatientGender;
2824    private javax.swing.JTextField PatientID;
2825    private javax.swing.JTextField PatientName;
2826    private javax.swing.JTextField Physician;
2827    private javax.swing.JButton ResetFields;
2828    private javax.swing.JButton SearchTips;
2829    private javax.swing.JRadioButton SelectAdvancedSearch;
2830    private javax.swing.JRadioButton SelectDefaultSearch;
2831    private javax.swing.JTextField StudyDate;
2832    private javax.swing.JTextField StudyDateRangeInitialBoundary;
2833    private javax.swing.JCheckBox StudyDateRangeInitialBoundaryActivation;
2834    private javax.swing.JTextField StudyDateRangeTerminalBoundary;
2835    private javax.swing.JCheckBox StudyDateRangeTerminalBoundaryActivation;
2836    private javax.swing.JButton jButtonClientPreferences;
2837    private javax.swing.JButton jButtonDownload;
2838    private javax.swing.JButton jButtonDump;
2839    private javax.swing.JButton jButtonExport;
2840    private javax.swing.JButton jButtonLogs;
2841    private javax.swing.JButton jButtonPeers;
2842    private javax.swing.JButton jButtonPreferences;
2843    private javax.swing.JButton jButtonQueryHistory;
2844    private javax.swing.JButton jButtonSearch;
2845    private javax.swing.JButton jButtonSend;
2846    private javax.swing.JButton jButtonServices;
2847    private javax.swing.JButton jButtonView;
2848    private javax.swing.JCheckBox jCheckBoxKeywords;
2849    private javax.swing.JLabel jLabel1;
2850    private javax.swing.JLabel jLabel10;
2851    private javax.swing.JLabel jLabel11;
2852    private javax.swing.JLabel jLabel12;
2853    private javax.swing.JLabel jLabel13;
2854    private javax.swing.JLabel jLabel14;
2855    private javax.swing.JLabel jLabel15;
2856    private javax.swing.JLabel jLabel16;
2857    private javax.swing.JLabel jLabel17;
2858    private javax.swing.JLabel jLabel19;
2859    private javax.swing.JLabel jLabel2;
2860    private javax.swing.JLabel jLabel20;
2861    private javax.swing.JLabel jLabel22;
2862    private javax.swing.JLabel jLabel3;
2863    private javax.swing.JLabel jLabel4;
2864    private javax.swing.JLabel jLabel5;
2865    private javax.swing.JLabel jLabel7;
2866    private javax.swing.JLabel jLabel8;
2867    private javax.swing.JLabel jLabel9;
2868    private javax.swing.JLabel jLabelResults;
2869    private javax.swing.JLabel jLabelTime;
2870    private javax.swing.JMenu jMenu10;
2871    private javax.swing.JMenu jMenu11;
2872    private javax.swing.JMenu jMenu12;
2873    private javax.swing.JMenu jMenu9;
2874    private javax.swing.JMenuBar jMenuBar3;
2875    private javax.swing.JMenuItem jMenuDirScan2;
2876    private javax.swing.JMenuItem jMenuDirScanResume;
2877    private javax.swing.JMenuItem jMenuItem1;
2878    private javax.swing.JMenuItem jMenuItem10;
2879    private javax.swing.JMenuItem jMenuItem11;
2880    private javax.swing.JMenuItem jMenuItem2;
2881    private javax.swing.JMenuItem jMenuItem3;
2882    private javax.swing.JMenuItem jMenuItem4;
2883    private javax.swing.JMenuItem jMenuItem5;
2884    private javax.swing.JMenuItem jMenuItem6;
2885    private javax.swing.JMenuItem jMenuItem7;
2886    private javax.swing.JMenuItem jMenuItem8;
2887    private javax.swing.JMenuItem jMenuItem9;
2888    private javax.swing.JMenuItem jMenuItemActiveUsers;
2889    private javax.swing.JMenuItem jMenuItemChangePassword;
2890    private javax.swing.JMenuItem jMenuItemDcm2jpeg2;
2891    private javax.swing.JMenuItem jMenuItemPreferences;
2892    private javax.swing.JMenuItem jMenuItemServices;
2893    private javax.swing.JMenuItem jMenuItemShutdown;
2894    private javax.swing.JMenuItem jMenuItemUsers;
2895    private javax.swing.JMenu jMenuTools2;
2896    private javax.swing.JPanel jPanel1;
2897    private javax.swing.JPanel jPanel2;
2898    private javax.swing.JPanel jPanel3;
2899    private javax.swing.JPanel jPanel4;
2900    private javax.swing.JPanel jPanel5;
2901    private javax.swing.JPanel jPanel6;
2902    private javax.swing.JPanel jPanel8;
2903    private javax.swing.JPanel jPanel9;
2904    private javax.swing.JPanel jPanelThumbnail;
2905    private javax.swing.JScrollPane jScrollPane1;
2906    private javax.swing.JScrollPane jScrollPane2;
2907    private javax.swing.JSeparator jSeparator1;
2908    private javax.swing.JSeparator jSeparator2;
2909    private javax.swing.JSeparator jSeparator3;
2910    private javax.swing.JSplitPane jSplitPane1;
2911    private javax.swing.JTextField jTextFieldQuery;
2912    private javax.swing.JTree jTreeResults;
2913    private javax.swing.JMenu pluginMenu;
2914    private javax.swing.JTabbedPane tabPanel;
2915    // End of variables declaration//GEN-END:variables
2916
2917    /**
2918     * ************************************************
2919     * Public Methods
2920     *************************************************
2921     */
2922    /**
2923     * Checks if the options form is displayed
2924     *
2925     * @return true if not displaying, true otherwise
2926     */
2927    private void showMetaData() {
2928        /**
2929         * Just show metadata for now
2930         *
2931         */
2932        DefaultMutableTreeNode node = (DefaultMutableTreeNode) jTreeResults.getLastSelectedPathComponent();
2933
2934        if (node != null && node.isLeaf() && node.getLevel() > 3) {
2935
2936            Object nodeInfo = node.getUserObject();
2937            SearchResult fileInfo = (SearchResult) nodeInfo;
2938
2939            if (nodeInfo instanceof SearchResult) {
2940                IndexedMetaData metadataWindow = new IndexedMetaData(fileInfo, this);
2941                metadataWindow.setVisible(true);
2942                metadataWindow.toFront();
2943            }
2944        }
2945    }
2946
2947    public void showImage(String title, RenderedImage image) {
2948        if (jPanelThumbnail == null) {
2949
2950            // It can be used to show image in external window
2951            JFrame f = new JFrame(title);
2952            if (image != null) {
2953                f.getContentPane().add(new DisplayJAI(image));
2954            }
2955            f.pack();
2956            //f.setVisible(true);
2957            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
2958        } else {
2959            jPanelThumbnail.removeAll();
2960            jPanelThumbnail.setLayout(new FlowLayout());
2961
2962            // Yet another bugfix
2963            // If the indexed image does not have a thumbnail, it leads to a Null Pointer Exception
2964            if (image != null) {
2965                jPanelThumbnail.add(new DisplayJAI(image));
2966            }
2967
2968            jPanelThumbnail.validate();
2969            jPanelThumbnail.setVisible(true);
2970        }
2971    }
2972
2973    /**
2974     * @return the jLabelResults
2975     */
2976    public javax.swing.JLabel getjLabelResults() {
2977        return jLabelResults;
2978    }
2979
2980    /**
2981     * @param jLabelResults the jLabelResults to set
2982     */
2983    public void setjLabelResults(javax.swing.JLabel jLabelResults) {
2984        this.jLabelResults = jLabelResults;
2985    }
2986
2987    /**
2988     * @return the jLabelTime
2989     */
2990    public javax.swing.JLabel getjLabelTime() {
2991        return jLabelTime;
2992    }
2993
2994    /**
2995     * @param jLabelTime the jLabelTime to set
2996     */
2997    public void setjLabelTime(javax.swing.JLabel jLabelTime) {
2998        this.jLabelTime = jLabelTime;
2999    }
3000
3001    /**
3002     * @return the jTreeResults
3003     */
3004    public javax.swing.JTree getjTreeResults() {
3005        return jTreeResults;
3006    }
3007
3008    /**
3009     * @param jTreeResults the jTreeResults to set
3010     */
3011    public void setjTreeResults(javax.swing.JTree jTreeResults) {
3012        this.jTreeResults = jTreeResults;
3013    }
3014
3015    private void showThumbnail(String thumb) {
3016        if (thumb == null) {
3017            return;
3018        }
3019
3020        byte[] tb = Base64.decodeBase64(thumb.getBytes());
3021        ByteArrayInputStream in = new ByteArrayInputStream(tb);
3022        RenderedImage out;
3023        try {
3024            out = ImageIO.read(in);
3025            jPanelThumbnail.setSize(64, 64);
3026            Result2Tree.showImage("Image Thumbnail", out, jPanelThumbnail);
3027            repaint();
3028        } catch (IOException ex) {
3029            cleanThumbnails();
3030        }
3031    }
3032
3033    private String getAdvancedQuery() {
3034        boolean modified = false;
3035        String advancedquery = "";
3036
3037        if (!((PatientName.getText()).equals("(All patients)")) && !((PatientName.getText()).isEmpty())) {
3038            if (!modified) {
3039                advancedquery = (advancedquery + "PatientName:(" + PatientName.getText() + ")");
3040                modified = true;
3041            } else {
3042                advancedquery = (advancedquery + " AND PatientName:(" + PatientName.getText() + ")");
3043            }
3044        }
3045
3046        if (!((PatientID.getText()).equals("(All IDs)")) && !((PatientID.getText()).isEmpty())) {
3047            if (!modified) {
3048                advancedquery = (advancedquery + "PatientID:(" + PatientID.getText() + ")");
3049                modified = true;
3050            } else {
3051                advancedquery = (advancedquery + " AND PatientID:(" + PatientID.getText() + ")");
3052            }
3053        }
3054
3055        // 0 - All 1 - Male  1 - Female
3056        if (PatientGender.getSelectedItem().equals("All")) {
3057        } else if (PatientGender.getSelectedItem().equals("Male")) {
3058            if (!modified) {
3059                advancedquery = (advancedquery + "PatientSex:M");
3060                modified = true;
3061            } else {
3062                advancedquery = (advancedquery + " AND PatientSex:M");
3063            }
3064        } else if (PatientGender.getSelectedItem().equals("Female")) {
3065            if (!modified) {
3066                advancedquery = (advancedquery + "PatientSex:F");
3067                modified = true;
3068            } else {
3069                advancedquery = (advancedquery + " AND PatientSex:F");
3070            }
3071        }
3072
3073        if (!((InstitutionName.getText()).equals("(All institutions)")) && !((InstitutionName.getText()).isEmpty())) {
3074            if (!modified) {
3075                advancedquery = (advancedquery + "InstitutionName:(" + InstitutionName.getText() + ")");
3076                modified = true;
3077            } else {
3078                advancedquery = (advancedquery + " AND InstitutionName:(" + InstitutionName.getText() + ")");
3079            }
3080        }
3081
3082        if (!((Physician.getText()).equals("(All physicians)")) && !((Physician.getText()).isEmpty())) {
3083            if (!modified) {
3084                advancedquery = (advancedquery + "(PerformingPhysicianName:(" + Physician.getText() + ") OR ReferringPhysicianName:(" + Physician.getText() + "))");
3085                modified = true;
3086            } else {
3087                advancedquery = (advancedquery + " AND (PerformingPhysicianName:(" + Physician.getText() + ") OR ReferringPhysicianName:(" + Physician.getText() + "))");
3088            }
3089        }
3090
3091        if (!((OperatorName.getText()).equals("(All operators)")) && !((OperatorName.getText()).isEmpty())) {
3092            if (!modified) {
3093                advancedquery = (advancedquery + "OperatorName:(" + OperatorName.getText() + ")");
3094                modified = true;
3095            } else {
3096                advancedquery = (advancedquery + " AND OperatorName:(" + OperatorName.getText() + ")");
3097            }
3098        }
3099
3100        if (ExactDate.isSelected()) {
3101            if (!((StudyDate.getText()).equals("(All dates)")) && !((StudyDate.getText()).isEmpty())) {
3102                if (!modified) {
3103                    advancedquery = (advancedquery + "StudyDate:(" + StudyDate.getText() + ")");
3104                    modified = true;
3105                } else {
3106                    advancedquery = (advancedquery + " AND StudyDate:(" + StudyDate.getText() + ")");
3107                }
3108            }
3109        } else {
3110            //http://www.rgagnon.com/javadetails/java-0106.html
3111            Calendar cal = Calendar.getInstance();
3112            SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
3113            //sdf.format(cal.getTime());
3114
3115            if (modified) {
3116                advancedquery = (advancedquery + " AND StudyDate:[");
3117            } else {
3118                advancedquery = advancedquery + "StudyDate:[";
3119            }
3120            modified = true;
3121
3122            if (StudyDateRangeInitialBoundaryActivation.isSelected() && StudyDateRangeTerminalBoundaryActivation.isSelected()) {
3123                if (((StudyDateRangeInitialBoundary.getText()).equals("(Beginning)")) || ((StudyDateRangeInitialBoundary.getText()).isEmpty())) {
3124                    advancedquery = (advancedquery + "0000101 TO ");
3125                } else {
3126                    advancedquery = advancedquery + StudyDateRangeInitialBoundary.getText() + " TO ";
3127                }
3128
3129                if (((StudyDateRangeTerminalBoundary.getText()).equals("(Today)")) || ((StudyDateRangeTerminalBoundary.getText()).isEmpty())) {
3130                    advancedquery = advancedquery + sdf.format(cal.getTime()) + "]";
3131                } else {
3132                    advancedquery = advancedquery + StudyDateRangeTerminalBoundary.getText() + "]";
3133                }
3134            } else if (StudyDateRangeInitialBoundaryActivation.isSelected() && !StudyDateRangeTerminalBoundaryActivation.isSelected()) {
3135                if (((StudyDateRangeInitialBoundary.getText()).equals("(Beginning)")) || ((StudyDateRangeInitialBoundary.getText()).isEmpty())) {
3136                    advancedquery = (advancedquery + "0000101 TO ");
3137                } else {
3138                    advancedquery = advancedquery + StudyDateRangeInitialBoundary.getText() + " TO ";
3139                }
3140
3141                advancedquery = advancedquery + sdf.format(cal.getTime()) + "]";
3142            } else if (!StudyDateRangeInitialBoundaryActivation.isSelected() && StudyDateRangeTerminalBoundaryActivation.isSelected()) {
3143                advancedquery = advancedquery + "0000101 TO ";
3144                if (((StudyDateRangeTerminalBoundary.getText()).equals("(Today)")) || ((StudyDateRangeTerminalBoundary.getText()).isEmpty())) {
3145                    advancedquery = advancedquery + sdf.format(cal.getTime()) + "]";
3146                } else {
3147                    advancedquery = advancedquery + StudyDateRangeTerminalBoundary.getText() + "]";
3148                }
3149
3150            } else {
3151                advancedquery = (advancedquery + "0000101 TO ");
3152                advancedquery = advancedquery + sdf.format(cal.getTime()) + "]";
3153            }
3154        }
3155
3156        if (ModalSelectAll.isSelected()) {
3157            if (modified) {
3158                advancedquery = advancedquery + " AND ";
3159            }
3160
3161            advancedquery = advancedquery + "*:*";
3162        } else {
3163            String modalities = "";
3164            if (modified) {
3165                modalities = modalities + " AND (";
3166            } else {
3167                modalities = modalities + "(";
3168            }
3169            boolean ModSelected = false;
3170
3171            if (ModalCR.isSelected()) {
3172                modified = true;
3173                ModSelected = true;
3174                modalities = modalities + "Modality:CR";
3175            }
3176
3177            if (ModalCT.isSelected()) {
3178                modified = true;
3179                if (ModSelected) {
3180                    modalities = modalities + " OR ";
3181                }
3182                ModSelected = true;
3183                modalities = modalities + "Modality:CT";
3184            }
3185
3186            if (ModalDX.isSelected()) {
3187                modified = true;
3188                if (ModSelected) {
3189                    modalities = modalities + " OR ";
3190                }
3191                ModSelected = true;
3192                modalities = modalities + "Modality:DX";
3193            }
3194
3195            if (ModalES.isSelected()) {
3196                modified = true;
3197                if (ModSelected) {
3198                    modalities = modalities + " OR ";
3199                }
3200                ModSelected = true;
3201                modalities = modalities + "Modality:ES";
3202            }
3203
3204            if (ModalMG.isSelected()) {
3205                modified = true;
3206                if (ModSelected) {
3207                    modalities = modalities + " OR ";
3208                }
3209                ModSelected = true;
3210                modalities = modalities + "Modality:MG";
3211            }
3212
3213            if (ModalMR.isSelected()) {
3214                modified = true;
3215                if (ModSelected) {
3216                    modalities = modalities + " OR ";
3217                }
3218                ModSelected = true;
3219                modalities = modalities + "Modality:MR";
3220            }
3221
3222            if (ModalNM.isSelected()) {
3223                modified = true;
3224                if (ModSelected) {
3225                    modalities = modalities + " OR ";
3226                }
3227                ModSelected = true;
3228                modalities = modalities + "Modality:NM";
3229            }
3230
3231            if (ModalOT.isSelected()) {
3232                modified = true;
3233                if (ModSelected) {
3234                    modalities = modalities + " OR ";
3235                }
3236                ModSelected = true;
3237                modalities = modalities + "Modality:OT";
3238            }
3239
3240            if (ModalPT.isSelected()) {
3241                modified = true;
3242                if (ModSelected) {
3243                    modalities = modalities + " OR ";
3244                }
3245                ModSelected = true;
3246                modalities = modalities + "Modality:PT";
3247            }
3248
3249            if (ModalRF.isSelected()) {
3250                modified = true;
3251                if (ModSelected) {
3252                    modalities = modalities + " OR ";
3253                }
3254                ModSelected = true;
3255                modalities = modalities + "Modality:RF";
3256            }
3257
3258            if (ModalSC.isSelected()) {
3259                modified = true;
3260                if (ModSelected) {
3261                    modalities = modalities + " OR ";
3262                }
3263                ModSelected = true;
3264                modalities = modalities + "Modality:SC";
3265            }
3266
3267            if (ModalUS.isSelected()) {
3268                modified = true;
3269                if (ModSelected) {
3270                    modalities = modalities + " OR ";
3271                }
3272                ModSelected = true;
3273                modalities = modalities + "Modality:US";
3274            }
3275
3276            if (ModalXA.isSelected()) {
3277                modified = true;
3278                if (ModSelected) {
3279                    modalities = modalities + " OR ";
3280                }
3281                ModSelected = true;
3282                modalities = modalities + "Modality:XA";
3283            }
3284
3285            modalities = modalities + ")";
3286
3287            if (!modalities.equals(" AND ()")) {
3288                advancedquery = advancedquery + modalities;
3289            }
3290        }
3291
3292        // System.out.println(modalities);
3293        if (!modified) {
3294            advancedquery = "*:*";
3295        }
3296
3297        return advancedquery;
3298    }
3299
3300    public javax.swing.JMenu getMenu() {
3301        return jMenuTools2;
3302    }
3303
3304}