Example usage for javax.swing JDialog JDialog

List of usage examples for javax.swing JDialog JDialog

Introduction

In this page you can find the example usage for javax.swing JDialog JDialog.

Prototype

public JDialog() 

Source Link

Document

Creates a modeless dialog without a title and without a specified Frame owner.

Usage

From source file:interfaces.InterfazPrincipal.java

private void botonGenerarReporteClienteActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_botonGenerarReporteClienteActionPerformed
    // TODO add your handling code here:
    try {// www .j ava  2s  . co m
        if (clienteReporteClienteFechaFinal.getSelectedDate().getTime()
                .compareTo(clienteReporteClienteFechaInicial.getSelectedDate().getTime()) < 0) {
            JOptionPane.showMessageDialog(this, "La fecha final debe ser posterior al dia de inicio");
        } else {
            final ArrayList<Integer> listaIDFlujos = new ArrayList<>();
            final JDialog dialogoEditar = new JDialog();
            dialogoEditar.setTitle("Reporte cliente");
            dialogoEditar.setSize(350, 610);
            dialogoEditar.setResizable(false);

            JPanel panelDialogo = new JPanel();
            panelDialogo.setLayout(new GridBagLayout());

            GridBagConstraints c = new GridBagConstraints();
            //c.fill = GridBagConstraints.HORIZONTAL;

            JLabel ediitarTextoPrincipalDialogo = new JLabel("Informe cliente");
            c.gridx = 0;
            c.gridy = 0;
            c.gridwidth = 1;
            c.insets = new Insets(10, 45, 10, 10);
            Font textoGrande = new Font("Arial", 1, 18);
            ediitarTextoPrincipalDialogo.setFont(textoGrande);
            panelDialogo.add(ediitarTextoPrincipalDialogo, c);

            final JTable tablaDialogo = new JTable();
            DefaultTableModel modeloTabla = new DefaultTableModel() {

                @Override
                public boolean isCellEditable(int row, int column) {
                    //all cells false
                    return false;
                }
            };
            ;

            modeloTabla.addColumn("Factura");
            modeloTabla.addColumn("Tipo Flujo");
            modeloTabla.addColumn("Fecha");
            modeloTabla.addColumn("Valor");

            //Llenar tabla
            ControladorFlujoFactura controladorFlujoFactura = new ControladorFlujoFactura();
            ArrayList<String[]> flujosCliente = controladorFlujoFactura.getTodosFlujo_Factura(
                    " where factura_id in (select factura_id from Factura where cliente_id = "
                            + String.valueOf(jTextFieldIdentificacionClienteReporte.getText())
                            + ") order by factura_id");
            // {"flujo_id","factura_id","tipo_flujo","fecha","valor"};
            ArrayList<Calendar> fechasFlujos = new ArrayList<>();

            for (int i = 0; i < flujosCliente.size(); i++) {
                String fila[] = new String[4];
                String[] objeto = flujosCliente.get(i);
                fila[0] = objeto[1];
                fila[1] = objeto[2];
                fila[2] = objeto[3];
                fila[3] = objeto[4];

                //Filtrar, mirar las fechas
                String[] partirEspacios = objeto[3].split("\\s");
                //El primer string es la fecha sin hora
                //Ahora esparamos por -
                String[] tomarAgeMesDia = partirEspacios[0].split("-");

                //Realizar filtro
                int ageConsulta = Integer.parseInt(tomarAgeMesDia[0]);
                int mesConsulta = Integer.parseInt(tomarAgeMesDia[1]);
                int diaConsulta = Integer.parseInt(tomarAgeMesDia[2]);

                //Obtenemos dias, mes y ao de la consulta
                //Inicial
                int anioInicial = clienteReporteClienteFechaFinal.getSelectedDate().get(Calendar.YEAR);
                int mesInicial = clienteReporteClienteFechaFinal.getSelectedDate().get(Calendar.MONTH) + 1;
                int diaInicial = clienteReporteClienteFechaFinal.getSelectedDate().get(Calendar.DAY_OF_MONTH);
                //Final
                int anioFinal = clienteReporteClienteFechaInicial.getSelectedDate().get(Calendar.YEAR);
                int mesFinal = clienteReporteClienteFechaInicial.getSelectedDate().get(Calendar.MONTH) + 1;
                int diaFinal = clienteReporteClienteFechaInicial.getSelectedDate().get(Calendar.DAY_OF_MONTH);

                //Construir fechas
                Calendar fechaDeLaBD = new GregorianCalendar(ageConsulta, mesConsulta, diaConsulta);
                //Set year, month, day)

                Calendar fechaInicialRango = new GregorianCalendar(anioInicial, mesInicial, diaInicial);
                Calendar fechaFinalRango = new GregorianCalendar(anioFinal, mesFinal, diaFinal);

                if (fechaDeLaBD.compareTo(fechaInicialRango) <= 0
                        && fechaDeLaBD.compareTo(fechaFinalRango) >= 0) {
                    fechasFlujos.add(fechaDeLaBD);
                    modeloTabla.addRow(fila);
                }

            }

            if (modeloTabla.getRowCount() > 0) {
                tablaDialogo.setModel(modeloTabla);
                tablaDialogo.getColumn("Factura").setMinWidth(80);
                tablaDialogo.getColumn("Tipo Flujo").setMinWidth(80);
                tablaDialogo.getColumn("Fecha").setMinWidth(90);
                tablaDialogo.getColumn("Valor").setMinWidth(80);
                tablaDialogo.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
                JScrollPane scroll = new JScrollPane(tablaDialogo);
                scroll.setPreferredSize(new Dimension(330, 150));

                c.gridx = 0;
                c.gridy = 1;
                c.gridwidth = 1;
                c.insets = new Insets(0, 0, 0, 0);
                panelDialogo.add(scroll, c);

                TimeSeries localTimeSeries = new TimeSeries("Compras del cliente en el periodo");

                Map listaAbonos = new HashMap();

                for (int i = 0; i < modeloTabla.getRowCount(); i++) {
                    listaIDFlujos.add(Integer.parseInt(flujosCliente.get(i)[0]));

                    if (modeloTabla.getValueAt(i, 1).equals("abono")) {
                        Calendar fechaFlujo = fechasFlujos.get(i);
                        double valor = Double.parseDouble(String.valueOf(modeloTabla.getValueAt(i, 3)));

                        int anoDato = fechaFlujo.get(Calendar.YEAR);
                        int mesDato = fechaFlujo.get(Calendar.MONTH) + 1;
                        int diaDato = fechaFlujo.get(Calendar.DAY_OF_MONTH);
                        Day FechaDato = new Day(diaDato, mesDato, anoDato);

                        if (listaAbonos.get(FechaDato) != null) {
                            double valorAbono = (double) listaAbonos.get(FechaDato);
                            listaAbonos.remove(FechaDato);
                            listaAbonos.put(FechaDato, valorAbono + valor);
                        } else {
                            listaAbonos.put(FechaDato, valor);

                        }

                    }

                }
                Double maximo = 0.0;
                Iterator iterator = listaAbonos.keySet().iterator();
                while (iterator.hasNext()) {
                    Day key = (Day) iterator.next();
                    Double value = (double) listaAbonos.get(key);
                    maximo = Math.max(maximo, value);
                    localTimeSeries.add(key, value);
                }

                //localTimeSeries.add();
                TimeSeriesCollection datos = new TimeSeriesCollection(localTimeSeries);

                JFreeChart chart = ChartFactory.createTimeSeriesChart("Compras del cliente en el periodo", // Title
                        "Tiempo", // x-axis Label
                        "Total ($)", // y-axis Label
                        datos, // Dataset
                        true, // Show Legend
                        true, // Use tooltips
                        false // Configure chart to generate URLs?
                );
                /*Altering the graph */
                XYPlot plot = (XYPlot) chart.getPlot();
                plot.setAxisOffset(new RectangleInsets(5.0, 10.0, 10.0, 5.0));
                plot.setDomainCrosshairVisible(true);
                plot.setRangeCrosshairVisible(true);

                XYLineAndShapeRenderer renderer = (XYLineAndShapeRenderer) plot.getRenderer();
                renderer.setBaseShapesVisible(true);
                renderer.setBaseShapesFilled(true);

                NumberAxis numberAxis = (NumberAxis) plot.getRangeAxis();
                numberAxis.setRange(new Range(0, maximo * 1.2));
                Font font = new Font("Dialog", Font.PLAIN, 9);
                numberAxis.setTickLabelFont(font);
                numberAxis.setLabelFont(font);

                DateAxis axis = (DateAxis) plot.getDomainAxis();
                axis.setDateFormatOverride(new SimpleDateFormat("dd-MM-yyyy"));
                axis.setAutoTickUnitSelection(false);
                axis.setVerticalTickLabels(true);

                axis.setTickLabelFont(font);
                axis.setLabelFont(font);

                LegendTitle leyendaChart = chart.getLegend();
                leyendaChart.setItemFont(font);

                Font fontTitulo = new Font("Dialog", Font.BOLD, 12);
                TextTitle tituloChart = chart.getTitle();
                tituloChart.setFont(fontTitulo);

                ChartPanel CP = new ChartPanel(chart);
                Dimension D = new Dimension(330, 300);
                CP.setPreferredSize(D);
                CP.setVisible(true);
                c.gridx = 0;
                c.gridy = 2;
                c.gridwidth = 1;
                c.insets = new Insets(10, 0, 0, 0);
                panelDialogo.add(CP, c);

                c.gridx = 0;
                c.gridy = 3;
                c.gridwidth = 1;
                c.anchor = GridBagConstraints.WEST;
                c.insets = new Insets(10, 30, 0, 0);

                JButton botonCerrar = new JButton("Cerrar");
                botonCerrar.addActionListener(new ActionListener() {

                    @Override
                    public void actionPerformed(ActionEvent e) {
                        dialogoEditar.dispose();
                    }
                });
                panelDialogo.add(botonCerrar, c);

                JButton botonGenerarPDF = new JButton("Guardar archivo");
                botonGenerarPDF.addActionListener(new ActionListener() {

                    @Override
                    public void actionPerformed(ActionEvent e) {
                        ReporteFlujosCliente reporteFlujosCliente = new ReporteFlujosCliente();
                        reporteFlujosCliente.guardarDocumentoDialogo(dialogoEditar, listaIDFlujos,
                                Integer.parseInt(jTextFieldIdentificacionClienteReporte.getText()),
                                clienteReporteClienteFechaInicial.getSelectedDate(),
                                clienteReporteClienteFechaFinal.getSelectedDate());

                    }
                });
                c.insets = new Insets(10, 100, 0, 0);

                panelDialogo.add(botonGenerarPDF, c);

                JButton botonImprimir = new JButton("Imprimir");
                botonImprimir.addActionListener(new ActionListener() {

                    @Override
                    public void actionPerformed(ActionEvent e) {
                        ReporteFlujosCliente reporteFlujosCliente = new ReporteFlujosCliente();
                        reporteFlujosCliente.imprimirFlujo(listaIDFlujos,
                                Integer.parseInt(jTextFieldIdentificacionClienteReporte.getText()),
                                clienteReporteClienteFechaInicial.getSelectedDate(),
                                clienteReporteClienteFechaFinal.getSelectedDate());

                    }
                });
                c.insets = new Insets(10, 230, 0, 0);

                panelDialogo.add(botonImprimir, c);
                dialogoEditar.add(panelDialogo);

                dialogoEditar.setVisible(true);

            } else {
                JOptionPane.showMessageDialog(this,
                        "El cliente no registra movimientos en el rango de fechas seleccionado");
            }

        }
    } catch (Exception e) {
        JOptionPane.showMessageDialog(this, "Debe seleccionar un da inicial y final de fechas");
    }

}

From source file:org.exist.launcher.Launcher.java

private boolean initSystemTray() {
    final Dimension iconDim = tray.getTrayIconSize();
    BufferedImage image = null;//  ww  w. j  ava2  s.c  o  m
    try {
        image = ImageIO.read(getClass().getResource("icon32.png"));
    } catch (final IOException e) {
        showMessageAndExit("Launcher failed", "Failed to read system tray icon.", false);
    }
    trayIcon = new TrayIcon(image.getScaledInstance(iconDim.width, iconDim.height, Image.SCALE_SMOOTH),
            "eXist-db Launcher");

    final JDialog hiddenFrame = new JDialog();
    hiddenFrame.setUndecorated(true);
    hiddenFrame.setIconImage(image);

    final PopupMenu popup = createMenu();
    trayIcon.setPopupMenu(popup);
    trayIcon.addActionListener(actionEvent -> {
        trayIcon.displayMessage(null, "Right click for menu", TrayIcon.MessageType.INFO);
        setServiceState();
    });

    // add listener for left click on system tray icon. doesn't work well on linux though.
    if (!SystemUtils.IS_OS_LINUX) {
        trayIcon.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent mouseEvent) {
                if (mouseEvent.getButton() == MouseEvent.BUTTON1) {
                    setServiceState();
                    hiddenFrame.add(popup);
                    popup.show(hiddenFrame, mouseEvent.getXOnScreen(), mouseEvent.getYOnScreen());
                }
            }
        });
    }

    try {
        hiddenFrame.setResizable(false);
        hiddenFrame.pack();
        hiddenFrame.setVisible(true);
        tray.add(trayIcon);
    } catch (final AWTException e) {
        return false;
    }

    return true;
}

From source file:org.geworkbench.components.lincs.LincsInterface.java

private void viewLicense_actionPerformed(String FileName) {

    getLicenseFromFile(FileName);//from w  ww.j  a v  a  2 s . c om
    JDialog licenseDialog = new JDialog();
    final JEditorPane jEditorPane = new JEditorPane("text/html", "");
    jEditorPane.getDocument().putProperty("IgnoreCharsetDirective", Boolean.TRUE);
    jEditorPane.setText(licenseContent);
    if (jEditorPane.getCaretPosition() > 1) {
        jEditorPane.setCaretPosition(1);
    }
    JScrollPane scrollPane = new JScrollPane(jEditorPane);
    licenseDialog.setTitle("Lincs Interface License");
    licenseDialog.setContentPane(scrollPane);
    licenseDialog.setSize(400, 300);
    licenseDialog.setLocationRelativeTo(this);
    licenseDialog.setVisible(true);
}

From source file:org.geworkbench.engine.ccm.ComponentConfigurationManagerWindow.java

/**
 * Display a dialog box with a components license in it.
 * //from w ww .ja v a2 s .c o m
 * @param ActionEvent
 * @return void
 */
private void viewLicense_actionPerformed(ActionEvent e) {

    int[] selectedRow = table.getSelectedRows();

    String license = "Select a component in order to view its license.";
    String componentName = null;
    if (selectedRow != null && selectedRow.length > 0 && selectedRow[0] >= 0) {

        int modelRow = table.convertRowIndexToModel(selectedRow[0]);
        license = (String) ccmTableModel.getModelValueAt(modelRow, CCMTableModel.LICENSE_INDEX);
        componentName = (String) ccmTableModel.getModelValueAt(modelRow, CCMTableModel.NAME_INDEX);
    }

    JDialog licenseDialog = new JDialog();
    final JEditorPane jEditorPane = new JEditorPane("text/html", "");
    jEditorPane.getDocument().putProperty("IgnoreCharsetDirective", Boolean.TRUE);
    jEditorPane.setText(license);
    if (jEditorPane.getCaretPosition() > 1) {
        jEditorPane.setCaretPosition(1);
    }
    JScrollPane scrollPane = new JScrollPane(jEditorPane);
    licenseDialog.setTitle(componentName + " License");
    licenseDialog.setContentPane(scrollPane);
    licenseDialog.setSize(400, 300);
    licenseDialog.setLocationRelativeTo(frame);
    licenseDialog.setVisible(true);
}

From source file:org.geworkbench.engine.ccm.ComponentConfigurationManagerWindow2.java

/**
 * Display a dialog box with a components license in it.
 * //from w  w  w.jav  a 2s. co m
 * @param ActionEvent
 * @return void
 */
private void viewLicense_actionPerformed(ActionEvent e) {

    int[] selectedRow = table.getSelectedRows();

    String license = "Select a component in order to view its license.";
    String componentName = null;
    if (selectedRow != null && selectedRow.length > 0 && selectedRow[0] >= 0) {

        int modelRow = table.convertRowIndexToModel(selectedRow[0]);
        license = (String) ccmTableModel.getModelValueAt(modelRow, CCMTableModel2.LICENSE_INDEX);
        componentName = (String) ccmTableModel.getModelValueAt(modelRow, CCMTableModel2.NAME_INDEX);
    }

    JDialog licenseDialog = new JDialog();
    final JEditorPane jEditorPane = new JEditorPane("text/html", "");
    jEditorPane.getDocument().putProperty("IgnoreCharsetDirective", Boolean.TRUE);
    jEditorPane.setText(license);
    if (jEditorPane.getCaretPosition() > 1) {
        jEditorPane.setCaretPosition(1);
    }
    JScrollPane scrollPane = new JScrollPane(jEditorPane);
    licenseDialog.setTitle(componentName + " License");
    licenseDialog.setContentPane(scrollPane);
    licenseDialog.setSize(400, 300);
    licenseDialog.setLocationRelativeTo(frame);
    licenseDialog.setVisible(true);
}

From source file:org.simmi.GeneSetHead.java

License:asdf

public void init(final Stage primaryStage, final Container comp, final SplitPane splitpane,
        final TableView<Gene> genetable, final TableView<Function> upper, final TableView<GeneGroup> lower,
        final MenuBar menubar, final ToolBar toolbar, final ToolBar btoolbar) {
    geneset.user = System.getProperty("user.name");
    JavaFasta.user = geneset.user;//from ww w. j  a  v a  2s. c o m
    this.splitpane = splitpane;
    this.primaryStage = primaryStage;

    table = lower;
    gtable = genetable;
    //SerifyApplet.user = user;

    /*try {
       UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
    } catch (ClassNotFoundException e) {
       e.printStackTrace();
    } catch (InstantiationException e) {
       e.printStackTrace();
    } catch (IllegalAccessException e) {
       e.printStackTrace();
    } catch (UnsupportedLookAndFeelException e) {
       e.printStackTrace();
    }*/

    String userhome = System.getProperty("user.home");
    boolean windows = false;
    try {
        InputStream isk = GeneSet.class.getClassLoader().getResourceAsStream("org/simmi/genesetkey");
        //Path gkey = Paths.get( url.toURI() );
        InputStream iskp = GeneSet.class.getClassLoader().getResourceAsStream("org/simmi/genesetkey.pub");
        //Path gkeypub = Paths.get( url.toURI() );

        Path gkeyssh = Paths.get(userhome);
        //Path gkeyssh = userpath.resolve(".ssh");
        if (!Files.exists(gkeyssh))
            Files.createDirectory(gkeyssh);
        Path gkeylocal = gkeyssh.resolve("org/simmi/genesetkey");
        Path gkeylocalpub = gkeyssh.resolve("org/simmi/genesetkey.pub");
        if (!Files.exists(gkeylocal) && isk != null) {
            Files.copy(isk, gkeylocal, StandardCopyOption.REPLACE_EXISTING);
        }
        if (!Files.exists(gkeylocalpub) && iskp != null) {
            Files.copy(iskp, gkeylocalpub);
        }

        Set<PosixFilePermission> poset = new HashSet<PosixFilePermission>();
        poset.add(PosixFilePermission.OWNER_READ);
        poset.add(PosixFilePermission.OWNER_WRITE);
        if (Files.exists(gkeylocal))
            Files.setPosixFilePermissions(gkeylocal, poset);
        if (Files.exists(gkeylocalpub))
            Files.setPosixFilePermissions(gkeylocalpub, poset);
    } catch (IOException e1) {
        e1.printStackTrace();
    } catch (UnsupportedOperationException e2) {
        windows = true;
        e2.printStackTrace();
    }

    if (windows) {
        File f = new File(userhome + "\\genesetkey");
        f.setExecutable(false, false);
        f.setWritable(false, false);
        f.setReadable(false, false);

        f.setWritable(true, true);
        f.setReadable(true, true);
    }

    this.comp = comp;
    selcomb = new ComboBox<>();
    searchcolcomb = new ComboBox<>();
    syncolorcomb = new ComboBox<>();

    searchcolcomb.getItems().add("Name");
    searchcolcomb.getItems().add("Symbol");
    searchcolcomb.getSelectionModel().select(0);

    setColors();

    JMenuBar jmenubar = new JMenuBar();
    Menu file = new Menu("File");

    MenuItem newitem = new MenuItem("New");
    newitem.setOnAction(actionEvent -> newFile());
    file.getItems().add(newitem);

    MenuItem openitem = new MenuItem("Open");
    openitem.setOnAction(actionEvent -> {
        try {
            importStuff();
        } catch (IOException e3) {
            e3.printStackTrace();
        } catch (UnavailableServiceException e3) {
            e3.printStackTrace();
        }
    });
    file.getItems().add(openitem);
    file.getItems().add(new SeparatorMenuItem());

    MenuItem importitem = new MenuItem("Import genomes");
    importitem.setOnAction(actionEvent -> fetchGenomes());
    file.getItems().add(importitem);

    MenuItem exportitem = new MenuItem("Export genomes");
    exportitem.setOnAction(actionEvent -> exportGenomes(geneset.speccontigMap));
    file.getItems().add(exportitem);

    file.getItems().add(new SeparatorMenuItem());

    MenuItem exportproteinitem = new MenuItem("Export protein sequences");
    exportproteinitem.setOnAction(actionEvent -> exportProteinSequences(geneset.genelist));
    file.getItems().add(exportproteinitem);

    MenuItem exportgeneitem = new MenuItem("Export gene clusters");
    exportgeneitem.setOnAction(actionEvent -> exportGeneClusters(geneset.allgenegroups));
    file.getItems().add(exportgeneitem);

    file.getItems().add(new SeparatorMenuItem());

    MenuItem quititem = new MenuItem("Quit");
    quititem.setOnAction(actionEvent -> System.exit(0));
    file.getItems().add(quititem);

    Menu edit = new Menu("Edit");
    MenuItem clustergenes = new MenuItem("Cluster genes");
    clustergenes.setOnAction(actionEvent -> {
        //fxpanel.setScene( null );
        /*Platform.runLater(new Runnable() {
              @Override
              public void run() {
          Label label1 = new Label("Id:");
              tb1 = new TextField("0.5");
              Label label2 = new Label("Len:");
              tb2 = new TextField("0.5");
                      
              VBox vbox = new VBox();
              HBox hbox1 = new HBox();
              hbox1.getChildren().addAll( label1, tb1 );
              HBox hbox2 = new HBox();
              hbox2.getChildren().addAll( label2, tb2 );
                      
              epar = new TextField();
              vbox.getChildren().add( epar );
                      
              vbox.getChildren().addAll( hbox1, hbox2 );
              if( fxs == null ) fxs = new Scene( vbox );
              fxs.setRoot( vbox );
                      
              fxpanel.setScene( fxs );
              }
        });*/

        JPanel panel = new JPanel();
        GridBagLayout grid = new GridBagLayout();
        GridBagConstraints c = new GridBagConstraints();
        panel.setLayout(grid);

        /*JLabel label1 = new JLabel("Id:");
        JTextField tb1 = new JTextField("0.5");
        JLabel label2 = new JLabel("Len:");
        JTextField tb2 = new JTextField("0.5");
                
        Dimension d = new Dimension( 300, 30 );
        JTextField epar = new JTextField();
        epar.setSize( d );
        epar.setPreferredSize( d );
                
        c.fill = GridBagConstraints.HORIZONTAL;
        c.gridwidth = 1;
        c.gridheight = 1;
                
        c.gridx = 0;
        c.gridy = 0;
        panel.add( label1, c );
        c.gridx = 1;
        c.gridy = 0;
        panel.add( tb1, c );
        c.gridx = 0;
        c.gridy = 1;
        panel.add( label2, c );
        c.gridx = 1;
        c.gridy = 1;
        panel.add( tb2, c );
        c.gridx = 0;
        c.gridy = 2;
        c.gridwidth = 2;
        panel.add( epar, c );
                
        JOptionPane.showMessageDialog(comp, new Object[] {panel}, "Clustering parameters", JOptionPane.PLAIN_MESSAGE );*/

        /*if( tb1 != null ) {
           float id = Float.parseFloat( tb1.getText() );
           float len = Float.parseFloat( tb2.getText() );
           String expar = epar.getText();
                   
           tb1 = null;
           tb2 = null;
           epar = null;*/

        Set<String> species = getSelspec(null, geneset.getSpecies(), null);
        geneset.clusterGenes(species, false);
        //}
    });
    MenuItem alignclusters = new MenuItem("Align clusters");
    alignclusters.setOnAction(actionEvent -> {
        try {
            String OS = System.getProperty("os.name").toLowerCase();

            Map<String, String> env = new HashMap<String, String>();
            env.put("create", "true");
            String uristr = "jar:" + geneset.zippath.toUri();
            geneset.zipuri = URI.create(uristr);
            geneset.zipfilesystem = FileSystems.newFileSystem(geneset.zipuri, env);
            //s.makeBlastCluster(zipfilesystem.getPath("/"), p, 1);
            Path aldir = geneset.zipfilesystem.getPath("aligned");
            final Path aligneddir = Files.exists(aldir) ? aldir : Files.createDirectory(aldir);

            Runnable run = new Runnable() {
                @Override
                public void run() {
                    try {
                        geneset.zipfilesystem.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            };

            NativeRun nrun = new NativeRun(run);
            //ExecutorService es = Executors.newFixedThreadPool( Runtime.getRuntime().availableProcessors() );

            Object[] cont = new Object[3];

            Collection<GeneGroup> ggset;
            ObservableList<GeneGroup> ogg = table.getSelectionModel().getSelectedItems();
            ggset = new HashSet<GeneGroup>();
            if (ogg.size() == 0) {
                for (GeneGroup gg : geneset.allgenegroups) {
                    //GeneGroup gg = allgenegroups.get(table.convertRowIndexToModel(r));
                    //gg.getCommonTag()
                    if (gg != null && gg.getCommonTag() == null && gg.size() > 1)
                        ggset.add(gg);
                }
            } else {
                for (GeneGroup gg : ogg) {
                    //GeneGroup gg = geneset.allgenegroups.get(table.convertRowIndexToModel(r));
                    //gg.getCommonTag()
                    if (gg != null && gg.getCommonTag() == null && gg.size() > 1)
                        ggset.add(gg);
                }
            }

            //int i = 0;
            List commandsList = new ArrayList();
            for (GeneGroup gg : ggset) {
                String fasta = gg.getFasta(true);
                String[] cmds = new String[] {
                        OS.indexOf("mac") >= 0 ? "/usr/local/bin/mafft" : "/usr/bin/mafft", "-" };
                Object[] paths = new Object[] { fasta.getBytes(), aligneddir.resolve(gg.getCommonId() + ".aa"),
                        null };
                commandsList.add(paths);
                commandsList.add(Arrays.asList(cmds));

                //if( i++ > 5000 ) break;
            }
            nrun.runProcessBuilder("Running mafft", commandsList, cont, true, run, false);
        } catch (IOException e1) {
            if (geneset.zipfilesystem != null) {
                try {
                    geneset.zipfilesystem.close();
                } catch (IOException e2) {
                    e2.printStackTrace();
                }
            }
            e1.printStackTrace();
        }
    });

    MenuItem sharenumaction = new MenuItem("Update share numbers");
    sharenumaction.setOnAction(actionEvent -> SwingUtilities.invokeLater(() -> {
        Set<String> specs = getSelspec(GeneSetHead.this, geneset.specList, null);
        geneset.updateShareNum(specs);
    }));

    MenuItem importgeneclusteringaction = new MenuItem("Import gene clustering");
    importgeneclusteringaction.setOnAction(actionEvent -> SwingUtilities.invokeLater(() -> {
        JPanel panel = new JPanel();
        GridBagLayout grid = new GridBagLayout();
        GridBagConstraints c = new GridBagConstraints();
        panel.setLayout(grid);

        JLabel label1 = new JLabel("Id:");
        JTextField tb11 = new JTextField("0.5");
        JLabel label2 = new JLabel("Len:");
        JTextField tb21 = new JTextField("0.5");

        Dimension d = new Dimension(300, 30);
        JTextField epar1 = new JTextField();
        epar1.setSize(d);
        epar1.setPreferredSize(d);

        c.fill = GridBagConstraints.HORIZONTAL;
        c.gridwidth = 1;
        c.gridheight = 1;

        c.gridx = 0;
        c.gridy = 0;
        panel.add(label1, c);
        c.gridx = 1;
        c.gridy = 0;
        panel.add(tb11, c);
        c.gridx = 0;
        c.gridy = 1;
        panel.add(label2, c);
        c.gridx = 1;
        c.gridy = 1;
        panel.add(tb21, c);
        c.gridx = 0;
        c.gridy = 2;
        c.gridwidth = 2;
        panel.add(epar1, c);

        JOptionPane.showMessageDialog(comp, new Object[] { panel }, "Clustering parameters",
                JOptionPane.PLAIN_MESSAGE);

        float id = Float.parseFloat(tb11.getText());
        float len = Float.parseFloat(tb21.getText());

        //JFileChooser fc = new JFileChooser();
        //if( fc.showOpenDialog( GeneSetHead.this ) == JFileChooser.APPROVE_OPTION ) {
        Serifier s = new Serifier();
        //s.mseq = aas;
        for (String gk : geneset.refmap.keySet()) {
            Gene g = geneset.refmap.get(gk);
            if (g.tegeval.getAlignedSequence() != null)
                System.err.println(g.tegeval.getAlignedSequence().getName());
            s.mseq.put(gk, g.tegeval.getAlignedSequence());
        }

        Map<String, String> idspec = new HashMap<String, String>();
        for (String idstr : geneset.refmap.keySet()) {
            if (idstr.contains(" ")) {
                System.err.println("coooonnnnnni " + idstr);
            }

            Gene gene = geneset.refmap.get(idstr);
            idspec.put(idstr, gene.getSpecies());
        }
        //Sequences seqs = new Sequences(user, name, type, path, nseq)
        try {
            Map<String, String> env = new HashMap<String, String>();
            env.put("create", "true");
            String uristr = "jar:" + geneset.zippath.toUri();
            geneset.zipuri = URI.create(uristr);
            geneset.zipfilesystem = FileSystems.newFileSystem(geneset.zipuri, env);

            Path root = geneset.zipfilesystem.getPath("/");
            Path p = geneset.zipfilesystem.getPath("cluster.blastout"); //root.resolve("culster.blastout");

            List<Set<String>> cluster = geneset.uclusterlist == null ? new ArrayList<>()
                    : new ArrayList<>(geneset.uclusterlist);
            s.makeBlastCluster(root, p, 1, id, len, idspec, cluster, geneset.refmap);

            System.err.println(cluster.get(0));
            if (geneset.uclusterlist != null)
                System.err.println(geneset.uclusterlist.get(0));

            geneset.zipfilesystem.close();
        } catch (IOException e1) {
            if (geneset.zipfilesystem != null) {
                try {
                    geneset.zipfilesystem.close();
                } catch (IOException e2) {
                    e2.printStackTrace();
                }
            }
            e1.printStackTrace();
        }
    }));
    MenuItem importgenesymbolaction = new MenuItem("Import gene symbols");
    importgenesymbolaction.setOnAction(actionEvent -> SwingUtilities.invokeLater(() -> {
        JFileChooser fc = new JFileChooser();
        if (fc.showOpenDialog(GeneSetHead.this) == JFileChooser.APPROVE_OPTION) {
            try {
                Map<String, String> env = new HashMap<>();
                env.put("create", "true");
                //Path path = zipfile.toPath();
                String uristr = "jar:" + geneset.zippath.toUri();
                geneset.zipuri = URI.create(uristr /*.replace("file://", "file:")*/ );
                geneset.zipfilesystem = FileSystems.newFileSystem(geneset.zipuri, env);

                Path nf = geneset.zipfilesystem.getPath("/smap_short.txt");
                BufferedWriter bw = Files.newBufferedWriter(nf, StandardOpenOption.CREATE);

                File f = fc.getSelectedFile();
                InputStream is = new FileInputStream(f);
                if (f.getName().endsWith(".gz"))
                    is = new GZIPInputStream(is);
                geneset.uni2symbol(new InputStreamReader(is), bw, geneset.unimap);

                bw.close();
                //long bl = Files.copy( new ByteArrayInputStream( baos.toByteArray() ), nf, StandardCopyOption.REPLACE_EXISTING );
                geneset.zipfilesystem.close();
            } catch (IOException e1) {
                e1.printStackTrace();
            }
        }
    }));

    MenuItem importcazyaction = new MenuItem("Import Cazy");
    importcazyaction.setOnAction(actionEvent -> SwingUtilities.invokeLater(() -> {
        JFileChooser fc = new JFileChooser();
        if (fc.showOpenDialog(GeneSetHead.this) == JFileChooser.APPROVE_OPTION) {
            try {
                BufferedReader rd = Files.newBufferedReader(fc.getSelectedFile().toPath());
                geneset.loadcazymap(geneset.cazymap, rd);
            } catch (IOException e1) {
                e1.printStackTrace();
            }
        }
    }));

    MenuItem gene2refseqaction = new MenuItem("Gene 2 refseq");
    gene2refseqaction.setOnAction(actionEvent -> {
        try {
            TextField tf = new TextField();
            tf.setText("ftp://ftp.ncbi.nlm.nih.gov/gene/DATA/gene2refseq.gz");
            Dialog<Path> dialog = new Dialog();
            dialog.getDialogPane().setContent(tf);
            dialog.getDialogPane().getButtonTypes().add(ButtonType.OK);
            dialog.getDialogPane().getButtonTypes().add(ButtonType.CANCEL);
            dialog.setResultConverter(param -> param.getButtonData().isCancelButton() ? null
                    : Paths.get(URI.create(tf.getText())));
            Optional<Path> opath = dialog.showAndWait();

            if (opath.isPresent()) {
                Map<String, String> env = new HashMap<>();
                env.put("create", "true");
                //Path path = zipfile.toPath();
                String uristr = "jar:" + geneset.zippath.toUri();
                geneset.zipuri = URI.create(uristr /*.replace("file://", "file:")*/);
                geneset.zipfilesystem = FileSystems.newFileSystem(geneset.zipuri, env);

                Path path = opath.get();
                InputStream is = path.toUri().toURL().openStream();
                if (path.getFileName().toString().endsWith(".gz")) {
                    is = new GZIPInputStream(is);
                }
                Path nf = geneset.zipfilesystem.getPath("/org/simmi/gene2refseq_short.txt");
                BufferedWriter bw = Files.newBufferedWriter(nf, StandardOpenOption.CREATE,
                        StandardOpenOption.TRUNCATE_EXISTING, StandardOpenOption.WRITE);
                geneset.idMapping(new InputStreamReader(is), bw, 5, 1, geneset.refmap, null, geneset.gimap);
                bw.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                geneset.zipfilesystem.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    });

    MenuItem functionmappingaction = new MenuItem("Function mapping");
    functionmappingaction.setOnAction(actionEvent -> SwingUtilities.invokeLater(() -> {
        final JTextField tf = new JTextField();
        JButton btn = new JButton("File");
        JComponent comp2 = new JComponent() {
        };
        comp2.setLayout(new BorderLayout());
        comp2.add(tf);
        comp2.add(btn, BorderLayout.EAST);
        tf.setText("http://130.208.252.239/data/sp2go.txt.gz");

        final File[] file2 = new File[1];
        btn.addActionListener(e -> {
            JFileChooser fc = new JFileChooser();
            if (fc.showOpenDialog(GeneSetHead.this) == JFileChooser.APPROVE_OPTION) {
                file2[0] = fc.getSelectedFile();
                try {
                    tf.setText(fc.getSelectedFile().toURI().toURL().toString());
                } catch (MalformedURLException e1) {
                    e1.printStackTrace();
                }
            }
        });

        try {
            Map<String, String> env = new HashMap<>();
            env.put("create", "true");
            //Path path = zipfile.toPath();
            String uristr = "jar:" + geneset.zippath.toUri();
            geneset.zipuri = URI.create(uristr /*.replace("file://", "file:")*/ );
            geneset.zipfilesystem = FileSystems.newFileSystem(geneset.zipuri, env);

            Path nf = geneset.zipfilesystem.getPath("/org/simmi/sp2go_short.txt");
            BufferedWriter bw = Files.newBufferedWriter(nf, StandardOpenOption.CREATE,
                    StandardOpenOption.TRUNCATE_EXISTING, StandardOpenOption.WRITE);

            JOptionPane.showMessageDialog(GeneSetHead.this, comp2);

            final JDialog dialog = new JDialog();
            dialog.setTitle("Function mapping");
            dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
            dialog.setSize(400, 300);

            comp2 = new JComponent() {
            };
            comp2.setLayout(new BorderLayout());

            final JTextArea ta = new JTextArea();
            /*final InputStream fis;
            if( file[0] != null ) fis = new FileInputStream( file[0] );
            else {
            JTextField host = new JTextField("localhost");
            JOptionPane.showMessageDialog(null, host);
                    
            String username = System.getProperty("user.name");
            String hostname = host.getText();
                    
            List<String> commandsList = Arrays.asList( new String[] {"ssh",username+"@"+hostname,"cat",tf.getText()} );
            ProcessBuilder pb = new ProcessBuilder( commandsList );
            Process p = pb.start();
                    
            for( Object commands : commandsList ) {
                if( commands instanceof List ) {
                    for( Object cmd : (List)commands ) {
                        ta.append(cmd+" ");
                    }
                    ta.append("\n");
                } else {
                    ta.append(commands+" ");
                }
            }
            ta.append("\n");
                    
            fis = p.getInputStream();
            }*/

            final JProgressBar pbar = new JProgressBar();
            final Thread t = new Thread() {
                public void run() {
                    try {
                        URL url = new URL(tf.getText());
                        InputStream fis = url.openStream();

                        BufferedReader br = new BufferedReader(new InputStreamReader(new GZIPInputStream(fis)));
                        //if( unimap != null ) unimap.clear();
                        //unimap = idMapping(new InputStreamReader(is), bw, 2, 0, refmap, genmap, gimap);
                        geneset.funcMappingUni(br, geneset.unimap, bw);

                        fis.close();
                        bw.close();

                        try {
                            geneset.zipfilesystem.close();
                        } catch (Exception e2) {
                            e2.printStackTrace();
                        }
                        ;

                        pbar.setIndeterminate(false);
                        pbar.setEnabled(false);
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            };

            ta.setEditable(false);
            final JScrollPane sp = new JScrollPane(ta);

            dialog.add(comp2);
            comp2.add(pbar, BorderLayout.NORTH);
            comp2.add(sp, BorderLayout.CENTER);
            pbar.setIndeterminate(true);

            t.start();
            /*okokdialog.addWindowListener( new WindowListener() {
                    
            @Override
            public void windowOpened(WindowEvent e) {}
                    
            @Override
            public void windowIconified(WindowEvent e) {}
                    
            @Override
            public void windowDeiconified(WindowEvent e) {}
                    
            @Override
            public void windowDeactivated(WindowEvent e) {}
                    
            @Override
            public void windowClosing(WindowEvent e) {}
                    
            @Override
            public void windowClosed(WindowEvent e) {
                if( pbar.isEnabled() ) {
                    pbar.setIndeterminate( false );
                    pbar.setEnabled( false );
                }
            }
                    
            @Override
            public void windowActivated(WindowEvent e) {}
            });*/
            dialog.setVisible(true);
            //long bl = Files.copy( new ByteArrayInputStream( baos.toByteArray() ), nf, StandardCopyOption.REPLACE_EXISTING );
        } catch (IOException e1) {
            e1.printStackTrace();
        }
    }));
    MenuItem importidmappingaction = new MenuItem("Import idmapping");
    importidmappingaction.setOnAction(actionEvent -> SwingUtilities.invokeLater(() -> {
        final JTextField tf = new JTextField();
        JButton btn = new JButton("File");
        JComponent comp2 = new JComponent() {
        };
        comp2.setLayout(new BorderLayout());
        comp2.add(tf);
        comp2.add(btn, BorderLayout.EAST);
        tf.setText(
                "ftp://ftp.uniprot.org/pub/databases/uniprot/current_release/knowledgebase/idmapping/idmapping.dat.gz");

        final File[] file2 = new File[1];
        btn.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                JFileChooser fc = new JFileChooser();
                if (fc.showOpenDialog(GeneSetHead.this) == JFileChooser.APPROVE_OPTION) {
                    file2[0] = fc.getSelectedFile();
                    try {
                        tf.setText(fc.getSelectedFile().toURI().toURL().toString());
                    } catch (MalformedURLException e1) {
                        e1.printStackTrace();
                    }
                }
            }
        });

        JOptionPane.showMessageDialog(GeneSetHead.this, comp2);

        //Thread t = new Thread() {
        //   public void run() {
        try {
            Map<String, String> env = new HashMap<String, String>();
            env.put("create", "true");
            //Path path = zipfile.toPath();
            String uristr = "jar:" + geneset.zippath.toUri();
            geneset.zipuri = URI.create(uristr /*.replace("file://", "file:")*/ );
            geneset.zipfilesystem = FileSystems.newFileSystem(geneset.zipuri, env);

            Path nf = geneset.zipfilesystem.getPath("/org/simmi/idmapping_short.dat");
            final BufferedWriter bw = Files.newBufferedWriter(nf, StandardOpenOption.CREATE,
                    StandardOpenOption.WRITE, StandardOpenOption.TRUNCATE_EXISTING);

            final JDialog dialog = new JDialog();
            dialog.setTitle("Id mapping");
            dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
            dialog.setSize(400, 300);

            comp2 = new JComponent() {
            };
            comp2.setLayout(new BorderLayout());

            final JTextArea ta = new JTextArea();

            /*final InputStream fis;
            if( file[0] != null ) fis = new FileInputStream( file[0] );
            else {
            /*Object[] cont = new Object[3];
            Runnable run = new Runnable() {
                public void run() {
                    try {
                        bw.close();
                        geneset.zipfilesystem.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            };*
                    
            JTextField host = new JTextField("localhost");
            JOptionPane.showMessageDialog(null, host);
                    
            String username = System.getProperty("user.name");
            String hostname = host.getText();
                    
            List<String> commandsList = Arrays.asList( new String[] {"ssh",username+"@"+hostname,"cat",tf.getText()} );
            ProcessBuilder pb = new ProcessBuilder( commandsList );
            Process p = pb.start();
                    
            for( Object commands : commandsList ) {
                if( commands instanceof List ) {
                    for( Object cmd : (List)commands ) {
                        ta.append(cmd+" ");
                    }
                    ta.append("\n");
                } else {
                    ta.append(commands+" ");
                }
            }
            ta.append("\n");
                    
            fis = p.getInputStream();
            }*/

            final JProgressBar pbar = new JProgressBar();
            final Thread t = new Thread() {
                public void run() {
                    try {
                        URL url = new URL(tf.getText());
                        InputStream fis = url.openStream();
                        InputStream is = new GZIPInputStream(fis);
                        if (geneset.unimap != null)
                            geneset.unimap.clear();
                        geneset.unimap = geneset.idMapping(new InputStreamReader(is), bw, 2, 0, geneset.refmap,
                                geneset.genmap, geneset.gimap);
                        is.close();
                        fis.close();
                        bw.close();

                        try {
                            geneset.zipfilesystem.close();
                        } catch (Exception ep) {
                            ep.printStackTrace();
                        }
                        ;

                        pbar.setIndeterminate(false);
                        pbar.setEnabled(false);
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            };

            ta.setEditable(false);
            final JScrollPane sp = new JScrollPane(ta);

            dialog.add(comp2);
            comp2.add(pbar, BorderLayout.NORTH);
            comp2.add(sp, BorderLayout.CENTER);
            pbar.setIndeterminate(true);

            t.start();

            /*System.err.println( "about to run" );
            for( Object commands : commandsList ) {
                if( commands instanceof List ) {
                    for( Object c : (List)commands ) {
                        System.err.print( c+" " );
                    }
                    System.err.println();
                } else {
                    System.err.print( commands+" " );
                }
            }
            System.err.println();*/

            /*okokdialog.addWindowListener( new WindowListener() {
                    
            @Override
            public void windowOpened(WindowEvent e) {}
                    
            @Override
            public void windowIconified(WindowEvent e) {}
                    
            @Override
            public void windowDeiconified(WindowEvent e) {}
                    
            @Override
            public void windowDeactivated(WindowEvent e) {}
                    
            @Override
            public void windowClosing(WindowEvent e) {}
                    
            @Override
            public void windowClosed(WindowEvent e) {
                if( pbar.isEnabled() ) {
                    /*String result = ta.getText().trim();
                    if( run != null ) {
                        cont[0] = null;
                        cont[1] = result;
                        cont[2] = new Date( System.currentTimeMillis() ).toString();
                        run.run();
                    }*
                    
                    pbar.setIndeterminate( false );
                    pbar.setEnabled( false );
                }
            }
                    
            @Override
            public void windowActivated(WindowEvent e) {}
            });*/
            dialog.setVisible(true);

            /*NativeRun nrun = new NativeRun();
            nrun.runProcessBuilder("Idmapping", Arrays.asList( tf.getText().split(" ") ), run, cont, false);
            ProcessBuilder pb = new ProcessBuilder( tf.getText().split(" ") );
            Process p = pb.start();
            fis = p.getInputStream();
            }*/

            //long bl = Files.copy( new ByteArrayInputStream( baos.toByteArray() ), nf, StandardCopyOption.REPLACE_EXISTING );
        } catch (IOException e1) {
            e1.printStackTrace();
            try {
                geneset.zipfilesystem.close();
            } catch (Exception e2) {
                e2.printStackTrace();
            }
            ;
        }
        //   }
        //};
        //t.start();
        //}
    }));
    MenuItem cogblastaction = new MenuItem("Cog blast");
    cogblastaction.setOnAction(actionEvent -> SwingUtilities.invokeLater(() -> {
        Set<String> species = getSelspec(null, geneset.getSpecies(), null);

        if (species != null && species.size() > 0)
            Platform.runLater(() -> cogBlastDlg(species));
    }));
    MenuItem unresolvedblastaction = new MenuItem("Unresolved blast");
    unresolvedblastaction.setOnAction(actionEvent -> SwingUtilities.invokeLater(() -> {
        try {
            Set<String> species = getSelspec(null, geneset.getSpecies(), null);

            StringWriter sb = new StringWriter();
            Path dbPath = Paths.get("/data/nr");
            ObservableList<Gene> genes = gtable.getSelectionModel().getSelectedItems();
            if (genes.size() > 0) {
                if (isGeneview()) {
                    for (Gene g : gtable.getSelectionModel().getSelectedItems()) {
                        //int i = table.convertRowIndexToModel(r);
                        //Gene g = geneset.genelist.get(i);
                        Sequence gs = g.tegeval.getProteinSequence();
                        gs.setName(g.id);
                        gs.writeSequence(sb);
                    }
                } else {
                    for (GeneGroup gg : table.getSelectionModel().getSelectedItems()) {
                        //int i = table.convertRowIndexToModel(r);
                        //GeneGroup gg = geneset.allgenegroups.get(i);
                        Gene g = null;
                        for (Gene gene : gg.genes) {
                            g = gene;
                            break;
                        }
                        Sequence gs = g.tegeval.getProteinSequence();
                        gs.setName(g.id);
                        gs.writeSequence(sb);
                    }
                }
            } else {
                for (Gene g : geneset.genelist) {
                    if (g.getTag() == null || g.getTag().equalsIgnoreCase("gene")) {
                        if (species.contains(g.getSpecies())) {
                            Sequence gs = g.tegeval.getProteinSequence();
                            gs.setName(g.id);
                            gs.writeSequence(sb);

                            /*sb.append(">" + g.id + "\n");
                            for (int i = 0; i < gs.length(); i += 70) {
                            sb.append( gs.substring(i, Math.min( i + 70, gs.length() )) + "\n");
                            }*/
                        }
                    }
                }
            }

            Map<String, String> env = new HashMap<>();
            env.put("create", "true");
            String uristr = "jar:" + geneset.zippath.toUri();
            geneset.zipuri = URI.create(uristr /*.replace("file://", "file:")*/ );
            geneset.zipfilesystem = FileSystems.newFileSystem(geneset.zipuri, env);
            Path resPath = geneset.zipfilesystem.getPath("/unresolved.blastout");

            NativeRun nrun = new NativeRun();
            SerifyApplet.blastpRun(nrun, sb.getBuffer(), dbPath, resPath, "-evalue 0.00001", null, true,
                    geneset.zipfilesystem, geneset.user, primaryStage);
        } catch (IOException e1) {
            e1.printStackTrace();
        }
    }));

    MenuItem importbiosystemsaction = new MenuItem("Import biosystems");
    importbiosystemsaction.setOnAction(actionEvent -> {
        Dialog<Map<String, Set<String>>> dialog = new Dialog();

        TextField gene = new TextField();
        TextField biosys = new TextField();

        gene.setText("ftp://ftp.ncbi.nlm.nih.gov/pub/biosystems/biosystems.20160519/biosystems_gene_all.gz");
        biosys.setText("ftp://ftp.ncbi.nlm.nih.gov/pub/biosystems/biosystems.20160519/bsid2info.gz");

        VBox duo = new VBox();
        duo.getChildren().add(gene);
        duo.getChildren().add(biosys);

        dialog.getDialogPane().setContent(duo);
        dialog.getDialogPane().getButtonTypes().add(ButtonType.OK);
        dialog.getDialogPane().getButtonTypes().add(ButtonType.CANCEL);
        dialog.setResultConverter(param -> {
            if (!param.getButtonData().isCancelButton()) {
                Map<String, Set<String>> result = null;
                Set<String> geneidset = geneset.genelist.stream().map(g -> g.genid).collect(Collectors.toSet());
                try {
                    InputStream p = new URI(gene.getText()).toURL().openStream();
                    InputStream b = new URI(biosys.getText()).toURL().openStream();

                    if (gene.getText().endsWith(".gz"))
                        p = new GZIPInputStream(p);
                    if (biosys.getText().endsWith(".gz"))
                        b = new GZIPInputStream(b);

                    Map<String, List<String[]>> group = new BufferedReader(new InputStreamReader(p)).lines()
                            .map(l -> l.split("\t")).filter(s -> geneidset.contains(s[1]))
                            .collect(Collectors.groupingBy(s -> s[1]));
                    Set<String> bsids = group.entrySet().stream().flatMap(e -> e.getValue().stream())
                            .map(s -> s[0]).collect(Collectors.toSet());
                    Map<String, String> bsid2name = new BufferedReader(new InputStreamReader(b)).lines()
                            .map(s -> s.split("\t")).filter(s -> bsids.contains(s[0]))
                            .collect(Collectors.toMap(s -> s[0], s -> s[2] + ":" + s[3]));
                    result = group.entrySet().stream()
                            .collect(Collectors.toMap(s -> s.getKey(), s -> s.getValue().stream()
                                    .map(sub -> bsid2name.get(sub[0])).collect(Collectors.toSet())));
                } catch (IOException e) {
                    e.printStackTrace();
                } catch (URISyntaxException e) {
                    e.printStackTrace();
                }
                //Path p = Paths.get(gene.getText());
                //Path b = Paths.get(biosys.getText());
                return result;
            }
            return null;
        });
        Optional<Map<String, Set<String>>> od = dialog.showAndWait();

        if (od.isPresent()) {
            geneset.biosystemsmap = od.get();
            Map<String, String> env = new HashMap<>();
            env.put("create", "true");
            String uristr = "jar:" + geneset.zippath.toUri();
            geneset.zipuri = URI.create(uristr /*.replace("file://", "file:")*/ );
            try {
                geneset.zipfilesystem = FileSystems.newFileSystem(geneset.zipuri, env);
                Path resPath = geneset.zipfilesystem.getPath("/biosystems.txt");
                BufferedWriter bw = Files.newBufferedWriter(resPath, StandardOpenOption.TRUNCATE_EXISTING);
                geneset.biosystemsmap.entrySet().stream().forEach(e -> {
                    try {
                        bw.write(e.getKey() + "\t" + e.getValue().stream().collect(Collectors.joining(";"))
                                + "\n");
                    } catch (IOException e1) {
                        e1.printStackTrace();
                    }
                });
                bw.close();
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                try {
                    geneset.zipfilesystem.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    });

    MenuItem importkeggpathwayaction = new MenuItem("Import kegg pathways");
    importkeggpathwayaction.setOnAction(actionEvent -> {
        Set<String> keggids = new HashSet<>();
        for (Gene g : geneset.genelist) {
            if (g.keggid != null) {
                int i = g.keggid.indexOf(':');
                if (i > 0) {
                    keggids.add(g.keggid.substring(0, i));
                }
            }
        }
        System.err.println(keggids);

        JTextField tf = new JTextField("http://130.208.252.239/organisms/");
        JOptionPane.showMessageDialog(null, tf);

        Map<String, String> env = new HashMap<>();
        env.put("create", "true");

        Path rootp = null;
        try {
            geneset.zipfilesystem = FileSystems.newFileSystem(geneset.zipuri, env);
        } catch (Exception ee) {
            ee.printStackTrace();
        }

        for (Path root : geneset.zipfilesystem.getRootDirectories()) {
            rootp = root;
            break;
        }

        for (String kegg : keggids) {
            try {
                URL url = new URL(tf.getText() + kegg + ".tar.gz");
                InputStream is = url.openStream();
                GZIPInputStream gz = new GZIPInputStream(is);

                TarArchiveInputStream tar = new TarArchiveInputStream(gz);
                TarArchiveEntry tae = (TarArchiveEntry) tar.getNextEntry();
                while (tae != null) {
                    geneset.traverseTar(tar, tae, rootp);

                    tae = (TarArchiveEntry) tar.getNextEntry();
                }

                is.close();
            } catch (IOException e1) {
                e1.printStackTrace();
            }
        }

        try {
            geneset.zipfilesystem.close();
        } catch (Exception ee) {
            ee.printStackTrace();
        }
        ;
    });

    edit.getItems().add(clustergenes);
    edit.getItems().add(alignclusters);
    edit.getItems().add(new SeparatorMenuItem());
    edit.getItems().add(sharenumaction);
    edit.getItems().add(importgeneclusteringaction);
    edit.getItems().add(importgenesymbolaction);
    edit.getItems().add(importcazyaction);
    edit.getItems().add(functionmappingaction);
    edit.getItems().add(importidmappingaction);
    edit.getItems().add(gene2refseqaction);
    edit.getItems().add(importbiosystemsaction);
    edit.getItems().add(importkeggpathwayaction);
    edit.getItems().add(new SeparatorMenuItem());
    edit.getItems().add(cogblastaction);
    edit.getItems().add(unresolvedblastaction);

    Menu view = new Menu("View");
    gb = new RadioMenuItem("Genes");
    gb.setOnAction(actionEvent -> {
        splitpane.getItems().remove(table);
        splitpane.getItems().add(0, gtable);
        //table.setModel( defaultModel );
    });
    view.getItems().add(gb);
    ggb = new RadioMenuItem("Gene groups");
    ggb.setOnAction(actionEvent -> {
        splitpane.getItems().remove(gtable);
        splitpane.getItems().add(0, table);
        //table.setModel( groupModel );
    });

    ToggleGroup bg = new ToggleGroup();
    gb.setToggleGroup(bg);
    ggb.setToggleGroup(bg);
    //ButtonGroup   bg = new ButtonGroup();
    //bg.add( gb );
    //bg.add( ggb );

    ggb.setSelected(true);
    view.getItems().add(ggb);
    ActionCollection.addAll(view, geneset.clusterMap, GeneSetHead.this, geneset.speccontigMap, table, comp,
            geneset.cs);

    Menu help = new Menu("Help");
    MenuItem about = new MenuItem("About");
    about.setOnAction(actionEvent -> SwingUtilities
            .invokeLater(() -> JOptionPane.showMessageDialog(comp, "CompGen 1.0")));
    help.getItems().add(about);

    MenuItem test = new MenuItem("Test");
    test.setOnAction(actionEvent -> {
        /*for( Gene g : geneset.genelist ) {
           Sequence seq = g.tegeval.getContig();
           if( seq == null ) {
          System.err.println();
           }
        }*/

        for (String spec : geneset.speccontigMap.keySet()) {
            if (spec.contains("RAST")) {
                List<Sequence> lseq = geneset.speccontigMap.get(spec);
                for (Sequence seq : lseq) {
                    for (Annotation a : seq.getAnnotations()) {
                        System.err.println(a.getGene().getGeneGroup().species);
                        /*Sequence tseq = a.getContig();
                        if( tseq == null ) {
                           System.err.println();
                        }*/
                    }
                }
            }
        }

        /*for( GeneGroup gg : allgenegroups ) {
           if( gg.species.size() > 1 ) {
          System.err.println( gg.species );
           }
        }*/
    });
    help.getItems().add(test);
    help.getItems().add(new SeparatorMenuItem());
    MenuItem runserver = new MenuItem("Run server");
    runserver.setOnAction(actionEvent -> {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                JSpinner spin = new JSpinner();
                JOptionPane.showMessageDialog(GeneSetHead.this, spin, "Port", JOptionPane.QUESTION_MESSAGE);
                try {
                    geneset.cs = WSServer.startServer(GeneSetHead.this, (Integer) spin.getValue());
                } catch (UnknownHostException e1) {
                    e1.printStackTrace();
                }
            }

        });
    });
    help.getItems().add(runserver);
    help.getItems().add(new SeparatorMenuItem());

    CheckMenuItem cbmi = new CheckMenuItem("Use geneset user");
    help.getItems().add(cbmi);

    cbmi.setOnAction(actionEvent -> {
        if (cbmi.isSelected()) {
            geneset.user = "geneset";
        } else
            geneset.user = System.getProperty("user.name");

        JavaFasta.user = geneset.user;
        if (geneset.currentSerify != null)
            geneset.currentSerify.user = geneset.user;
    });

    help.getItems().add(new SeparatorMenuItem());
    MenuItem helptut = new MenuItem("Help & Tutorial");
    helptut.setOnAction(actionEvent -> {
        try {
            Desktop.getDesktop().browse(new URI("http://thermusgenes.appspot.com/pancore.html"));
        } catch (IOException | URISyntaxException e1) {
            e1.printStackTrace();
        }
    });
    help.getItems().add(helptut);

    Menu sequencemenu = new Menu("Sequence");
    MenuItem showgroupseq = new MenuItem("Show group sequences");
    showgroupseq.setOnAction(actionEvent -> {
        //JTextArea textarea = new JTextArea();
        //JScrollPane scrollpane = new JScrollPane(textarea);

        /*try {
           if (clipboardService == null)
          clipboardService = (ClipboardService) ServiceManager.lookup("javax.jnlp.ClipboardService");
           Action action = new CopyAction("Copy", null, "Copy data", new Integer(KeyEvent.VK_CONTROL + KeyEvent.VK_C));
           textarea.getActionMap().put("copy", action);
           grabFocus = true;
        } catch (Exception ee) {
           ee.printStackTrace();
           System.err.println("Copy services not available.  Copy using 'Ctrl-c'.");
        }
                
        textarea.setDragEnabled(true);*/

        JFrame frame = null;
        if (geneset.currentSerify == null) {
            frame = new JFrame();
            frame.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
            frame.setSize(400, 300);

            Map<String, String> env = new HashMap<String, String>();
            //Path path = zipfile.toPath();
            String uristr = "jar:" + geneset.zippath.toUri();
            geneset.zipuri = URI.create(uristr /*.replace("file://", "file:")*/ );
            try {
                geneset.zipfilesystem = FileSystems.newFileSystem(geneset.zipuri, env);
            } catch (IOException e1) {
                e1.printStackTrace();
            }

            SerifyApplet sa = new SerifyApplet(geneset.zipfilesystem);
            sa.init(frame, null, geneset.user);
            //frame.add( )
            geneset.currentSerify = sa;
        } /* else frame = (JFrame)currentSerify.cnt;*/

        String[] farr = new String[] { "o.profundus", "mt.silvanus", "mt.ruber", "m.hydrothermalis",
                "t.thermophilus_SG0_5JP17_16", "t.thermophilusJL18", "t.thermophilusHB8", "t.thermophilusHB27",
                "t.scotoductusSA01", "t.scotoductus4063", "t.scotoductus1572", "t.scotoductus2101",
                "t.scotoductus2127", "t.scotoductus346", "t.scotoductus252", "t.antranikiani", "t.kawarayensis",
                "t.brockianus", "t.igniterrae", "t.eggertsoni", "t.RLM", "t.oshimai_JL2", "t.oshimai",
                "t.filiformis", "t.arciformis", "t.islandicus", "t.aquaticus", "t.spCCB" };

        Map<Integer, String> ups = new HashMap<Integer, String>();
        Set<Integer> stuck = new HashSet<Integer>();
        Map<Integer, List<Tegeval>> ups2 = new HashMap<Integer, List<Tegeval>>();
        //int[] rr = table.getSelectedRows();
        for (Gene gg : gtable.getSelectionModel().getSelectedItems()) {
            //int cr = table.convertRowIndexToModel(r);
            //Gene gg = geneset.genelist.get(cr);
            if (gg.getSpecies() != null) {
                if (gg.genid != null && gg.genid.length() > 0) {
                    ups.put(gg.getGroupIndex(), gg.name);
                    stuck.add(gg.getGroupIndex());
                }
                if (!stuck.contains(gg.getGroupIndex())) {
                    if (!ups.containsKey(gg.getGroupIndex())
                            || !(gg.name.contains("unnamed") || gg.name.contains("hypot")))
                        ups.put(gg.getGroupIndex(), gg.name);
                }

                List<Tegeval> tlist;
                if (ups2.containsKey(gg.getGroupIndex()))
                    tlist = ups2.get(gg.getGroupIndex());
                else {
                    tlist = new ArrayList<Tegeval>();
                    ups2.put(gg.getGroupIndex(), tlist);
                }

                //Set<String>    specs = new HashSet<String>();
                //textarea.append(gg.name + ":\n");
                //for (String sp : gg.species.keySet()) {
                int count = 0;
                for (String sp : farr) {
                    //Teginfo stv = gg.species.equals(sp) ? gg.teginfo : null;

                    if (gg.getSpecies().equals(sp))
                        tlist.add(gg.tegeval);
                    /*for( String key : gg.species.keySet() ) {
                       if( key.contains("JL2") ) {
                          System.err.println( " erm " + key );
                       }
                    }*/
                    /*if( stv == null && gg.species.size() == 28 ) {
                       System.err.println( gg.species );
                       System.err.println( sp );
                    }*/
                    //System.err.println( gg.species.keySet() );
                    /*if( stv == null ) {
                       //System.err.println( sp );
                    } else {
                       count++;
                       //specs.add( sp );
                       for (Tegeval tv : stv.tset) {
                          tlist.add( tv );
                          /*textarea.append(">" + tv.cont + " " + tv.teg + " " + tv.eval + "\n");
                          if (tv.dna != null) {
                      for (int i = 0; i < tv.dna.length(); i += 70) {
                         textarea.append(tv.dna.gg.speciessubstring(i, Math.min(i + 70, tv.dna.length())) + "\n");
                      }
                          }*
                       }
                    }*/
                }
                //if( count < gg.species.size() ) {
                //   System.err.println( gg.species );
                //   System.err.println();
                //}
                //if( specs.size() < 28 ) System.err.println("mu " + specs);
            }
        }

        try {
            StringWriter sb = new StringWriter();
            for (int gi : ups.keySet()) {
                String name = ups.get(gi);
                List<Tegeval> tlist = ups2.get(gi);

                sb.append(name.replace('/', '-') + ":\n");
                if (tlist.size() < 28) {
                    for (Tegeval tv : tlist) {
                        System.err.println(tv.name);
                    }
                    System.err.println();
                }
                for (Tegeval tv : tlist) {
                    Sequence ps = tv.getProteinSequence();
                    ps.setName(tv.name.substring(0, tv.name.indexOf('_')));
                    ps.writeSequence(sb);
                    /*sb.append(">" + tv.name.substring(0, tv.name.indexOf('_')) + "\n");
                    for (int i = 0; i < ps.length(); i += 70) {
                       sb.append( ps.substring(i, Math.min(i + 70, tv.getProteinLength() )) + "\n");
                    }*/
                }
            }

            geneset.currentSerify.addSequences("uh", new StringReader(sb.toString()), Paths.get("/"), null);
        } catch (URISyntaxException | IOException e1) {
            e1.printStackTrace();
        }
        frame.setVisible(true);
    });
    sequencemenu.getItems().add(showgroupseq);

    MenuItem showgroupdnaseq = new MenuItem("Show group DNA sequences");
    showgroupdnaseq.setOnAction(actionEvent -> {
        final JTextArea textarea = new JTextArea();
        JScrollPane scrollpane = new JScrollPane(textarea);

        try {
            if (clipboardService == null)
                clipboardService = (ClipboardService) ServiceManager.lookup("javax.jnlp.ClipboardService");
            Action action = new CopyAction("Copy", null, "Copy data",
                    new Integer(KeyEvent.VK_CONTROL + KeyEvent.VK_C));
            textarea.getActionMap().put("copy", action);
            grabFocus = true;
        } catch (Exception ee) {
            ee.printStackTrace();
            System.err.println("Copy services not available.  Copy using 'Ctrl-c'.");
        }

        textarea.setDragEnabled(true);

        try {
            final DataFlavor df = new DataFlavor("text/plain;charset=utf-8");
            TransferHandler th = new TransferHandler() {
                /**
                 * 
                 */
                private static final long serialVersionUID = 1L;

                public int getSourceActions(JComponent c) {
                    return TransferHandler.COPY_OR_MOVE;
                }

                public boolean canImport(TransferHandler.TransferSupport support) {
                    return false;
                }

                protected Transferable createTransferable(JComponent c) {
                    return new Transferable() {
                        @Override
                        public Object getTransferData(DataFlavor arg0)
                                throws UnsupportedFlavorException, IOException {
                            if (arg0.equals(df)) {
                                return new ByteArrayInputStream(textarea.getText().getBytes());
                            } else {
                                return textarea.getText();
                            }
                        }

                        @Override
                        public DataFlavor[] getTransferDataFlavors() {
                            return new DataFlavor[] { df, DataFlavor.stringFlavor };
                        }

                        @Override
                        public boolean isDataFlavorSupported(DataFlavor arg0) {
                            if (arg0.equals(df) || arg0.equals(DataFlavor.stringFlavor)) {
                                return true;
                            }
                            return false;
                        }
                    };
                }

                public boolean importData(TransferHandler.TransferSupport support) {
                    return false;
                }
            };
            textarea.setTransferHandler(th);
        } catch (ClassNotFoundException e1) {
            e1.printStackTrace();
        }

        Map<Integer, String> ups = new HashMap<Integer, String>();
        Set<Integer> stuck = new HashSet<Integer>();
        Map<Integer, List<Tegeval>> ups2 = new HashMap<Integer, List<Tegeval>>();
        //int[] rr = table.getSelectedRows();
        for (Gene gg : gtable.getSelectionModel().getSelectedItems()) {
            //int cr = table.convertRowIndexToModel(r);
            //Gene gg = geneset.genelist.get(cr);
            if (gg.getSpecies() != null) {
                if (gg.genid != null && gg.genid.length() > 0) {
                    ups.put(gg.getGroupIndex(), gg.name);
                    stuck.add(gg.getGroupIndex());
                }
                if (!stuck.contains(gg.getGroupIndex())) {
                    if (!ups.containsKey(gg.getGroupIndex())
                            || !(gg.name.contains("unnamed") || gg.name.contains("hypot")))
                        ups.put(gg.getGroupIndex(), gg.name);
                }

                List<Tegeval> tlist;
                if (ups2.containsKey(gg.getGroupIndex()))
                    tlist = ups2.get(gg.getGroupIndex());
                else {
                    tlist = new ArrayList<Tegeval>();
                    ups2.put(gg.getGroupIndex(), tlist);
                }

                //textarea.append(gg.name + ":\n");
                tlist.add(gg.tegeval);
                /*textarea.append(">" + tv.cont + " " + tv.teg + " " + tv.eval + "\n");
                if (tv.dna != null) {
                   for (int i = 0; i < tv.dna.length(); i += 70) {
                      textarea.append(tv.dna.substring(i, Math.min(i + 70, tv.dna.length())) + "\n");
                   }
                }*/
            }
        }

        for (int gi : ups.keySet()) {
            String name = ups.get(gi);
            List<Tegeval> tlist = ups2.get(gi);

            textarea.append(name.replace('/', '-') + ":\n");
            for (Tegeval tv : tlist) {
                textarea.append(">" + tv.name.substring(0, tv.name.indexOf('_')) + "\n");
                for (int i = 0; i < tv.getLength(); i += 70) {
                    textarea.append(tv.getSubstring(i, Math.min(i + 70, tv.getLength())) + "\n");
                }
            }
        }

        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.add(scrollpane);
        frame.setSize(400, 300);
        frame.setVisible(true);
    });
    sequencemenu.getItems().add(showgroupdnaseq);
    sequencemenu.getItems().add(new SeparatorMenuItem());

    MenuItem showallseq = new MenuItem("Show all sequences");
    showallseq.setOnAction(actionEvent -> {
        JFrame frame = new JFrame();
        frame.setSize(800, 600);
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

        Serifier serifier = new Serifier();
        JavaFasta jf = new JavaFasta((comp instanceof JApplet) ? (JApplet) comp : null, serifier, geneset.cs);
        jf.initGui(frame);

        Map<String, Sequence> contset = new HashMap<String, Sequence>();
        //int[] rr = table.getSelectedRows();
        for (Gene gg : gtable.getSelectionModel().getSelectedItems()) {
            //int cr = table.convertRowIndexToModel(r);
            //Gene gg = geneset.genelist.get(cr);
            Tegeval tv = gg.tegeval;
            String contig = tv.getContshort().getName();
            Sequence seq = tv.getProteinSequence();
            seq.setName(contig);
            serifier.mseq.put(seq.getName(), seq);
            //Sequence seq = new Sequence( contig, aa, serifier.mseq );
            serifier.addSequence(seq);
        }
        jf.updateView();

        frame.setVisible(true);
    });
    sequencemenu.getItems().add(showallseq);

    MenuItem showseq = new MenuItem("Show sequences");
    showseq.setOnAction(actionEvent -> {
        Set<GeneGroup> genegroups = new HashSet<GeneGroup>();
        //int[] rr = table.getSelectedRows();
        if (!isGeneview()) {
            for (GeneGroup gg : table.getSelectionModel().getSelectedItems()) {
                //int cr = table.convertRowIndexToModel(r);
                //GeneGroup gg = geneset.allgenegroups.get(cr);
                genegroups.add(gg);
            }
        } else {
            for (Gene gg : gtable.getSelectionModel().getSelectedItems()) {
                //int cr = table.convertRowIndexToModel(r);
                //Gene gg = geneset.genelist.get(cr);
                genegroups.add(gg.getGeneGroup());
            }
        }
        Platform.runLater(() -> {
            Set<String> specs = null;
            if (table.getItems().size() > 1)
                specs = getSelspec(comp, geneset.specList, null);
            showSequences(comp, genegroups, false, specs);
        });
    });
    sequencemenu.getItems().add(showseq);

    MenuItem showseqwgenenames = new MenuItem("Show sequences w/genenames");
    showseqwgenenames.setOnAction(actionEvent -> {
        Set<GeneGroup> genegroups = new HashSet<GeneGroup>();
        //int[] rr = table.getSelectedRows();
        if (!isGeneview()) {
            for (GeneGroup gg : table.getSelectionModel().getSelectedItems()) {
                //int cr = table.convertRowIndexToModel(r);
                //GeneGroup gg = geneset.allgenegroups.get(cr);
                genegroups.add(gg);
            }
        } else {
            for (Gene gg : gtable.getSelectionModel().getSelectedItems()) {
                //int cr = table.convertRowIndexToModel(r);
                //Gene gg = geneset.genelist.get(cr);
                genegroups.add(gg.getGeneGroup());
            }
        }
        //Set<String>   specs = null;
        //if( rr.length > 1 ) specs = getSelspec(comp, specList, null);
        showSequences(comp, genegroups, false, null, true);
    });
    sequencemenu.getItems().add(showseqwgenenames);

    MenuItem showalignseq = new MenuItem("Show aligned sequences");
    showalignseq.setOnAction(actionEvent -> {
        Set<GeneGroup> genegroups = new HashSet<GeneGroup>();
        //int[] rr = table.getSelectedRows();
        if (!isGeneview()) {
            for (GeneGroup gg : table.getSelectionModel().getSelectedItems()) {
                genegroups.add(gg);
            }
        } else {
            for (Gene gg : gtable.getSelectionModel().getSelectedItems()) {
                genegroups.add(gg.getGeneGroup());
            }
        }

        Serifier serifier = new Serifier();
        for (GeneGroup ggroup : genegroups) {
            for (Tegeval tv : ggroup.getTegevals()) {
                String selspec = tv.getContshort().getSpec();//tv.getContig();
                String spec = geneset.nameFix(selspec);
                /*if( selspec.contains("hermus") ) spec = selspec;
                else {
                   Matcher m = Pattern.compile("\\d").matcher(selspec); 
                   int firstDigitLocation = m.find() ? m.start() : 0;
                   if( firstDigitLocation == 0 ) spec = "Thermus_" + selspec;
                   else spec = "Thermus_" + selspec.substring(0,firstDigitLocation) + "_" + selspec.substring(firstDigitLocation);
                }*/

                Sequence seq = tv.getAlignedSequence();
                //System.err.println( "seqlen " + seq.length() );
                if (seq != null) {
                    seq.setName(spec);
                    //Sequence seq = new Sequence( contig, seqstr, null );
                    serifier.addSequence(seq);
                } else {
                    Sequence sb = tv.getProteinSequence();
                    sb.setName(spec);
                    //Sequence sseq = new Sequence( spec, sb, serifier.mseq );
                    serifier.addSequence(sb);
                }
            }
        }
        showAlignedSequences(comp, serifier);
    });
    sequencemenu.getItems().add(showalignseq);

    MenuItem splitseq = new MenuItem("Split/Show sequences");
    splitseq.setOnAction(actionEvent -> {
        try {
            StringBuffer sb = getSelectedASeqs(table, geneset.genelist, GeneSetHead.this, geneset.specList);
            if (geneset.currentSerify == null) {
                JFrame frame = new JFrame();
                frame.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
                frame.setSize(800, 600);

                SerifyApplet sa = new SerifyApplet(geneset.zipfilesystem);
                sa.init(frame, null, geneset.user);
                geneset.currentSerify = sa;

                frame.setVisible(true);
            }
            geneset.currentSerify.addSequences("uh", new StringReader(sb.toString()), Paths.get("/"), null);
        } catch (URISyntaxException | IOException e1) {
            e1.printStackTrace();
        }

        //JTextArea textarea = new JTextArea();
        //textarea.append( sb.toString() );

        /*try {
           if (clipboardService == null)
          clipboardService = (ClipboardService) ServiceManager.lookup("javax.jnlp.ClipboardService");
           Action action = new CopyAction("Copy", null, "Copy data", new Integer(KeyEvent.VK_CONTROL + KeyEvent.VK_C));
           textarea.getActionMap().put("copy", action);
           grabFocus = true;
        } catch (Exception ee) {
           ee.printStackTrace();
           System.err.println("Copy services not available.  Copy using 'Ctrl-c'.");
        }
                
        *
         * final DataFlavor df =
         * DataFlavor.getTextPlainUnicodeFlavor();//new
         * DataFlavor("text/plain;charset=utf-8"); final String charset
         * = df.getParameter("charset"); final Transferable transferable
         * = new Transferable() {
         * 
         * @Override public Object getTransferData(DataFlavor arg0)
         * throws UnsupportedFlavorException, IOException { String ret =
         * makeCopyString( detailTable ); return new
         * ByteArrayInputStream( ret.getBytes( charset ) ); }
         * 
         * @Override public DataFlavor[] getTransferDataFlavors() {
         * return new DataFlavor[] { df }; }
         * 
         * @Override public boolean isDataFlavorSupported(DataFlavor
         * arg0) { if( arg0.equals(df) ) { return true; } return false;
         * } };
         * 
         * TransferHandler th = new TransferHandler() { private static
         * final long serialVersionUID = 1L;
         * 
         * public int getSourceActions(JComponent c) { return
         * TransferHandler.COPY_OR_MOVE; }
         * 
         * public boolean canImport(TransferHandler.TransferSupport
         * support) { return false; }
         * 
         * protected Transferable createTransferable(JComponent c) {
         * return transferable; }
         * 
         * public boolean importData(TransferHandler.TransferSupport
         * support) { /*try { Object obj =
         * support.getTransferable().getTransferData( df ); InputStream
         * is = (InputStream)obj;
         * 
         * byte[] bb = new byte[2048]; int r = is.read(bb);
         * 
         * //importFromText( new String(bb,0,r) ); } catch
         * (UnsupportedFlavorException e) { e.printStackTrace(); } catch
         * (IOException e) { e.printStackTrace(); }* return false; } };
         * textarea.setTransferHandler( th );
         *
        textarea.setDragEnabled(true);
                
        JScrollPane scrollpane = new JScrollPane(textarea);
                
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.add(scrollpane);
        frame.setSize(400, 300);
        frame.setVisible(true);*/
    });
    sequencemenu.getItems().add(splitseq);

    MenuItem showdnaseq = new MenuItem("Show DNA sequences");
    showdnaseq.setOnAction(actionEvent -> {
        Set<GeneGroup> genegroups = new HashSet<GeneGroup>();
        int rr = 0;
        if (!isGeneview()) {
            ObservableList<GeneGroup> lgg = table.getSelectionModel().getSelectedItems();
            genegroups.addAll(lgg);
            rr = lgg.size();
        } else {
            for (Gene gg : gtable.getSelectionModel().getSelectedItems()) {
                genegroups.add(gg.getGeneGroup());
                rr++;
            }
        }
        Set<String> specs = null;
        if (rr > 1)
            specs = getSelspec(comp, geneset.specList, null);
        showSequences(comp, genegroups, true, specs);

        /*StringBuilder sb = getSelectedSeqs( table, genelist );
                
        if( currentSerify == null ) {
           JFrame frame = new JFrame();
           frame.setDefaultCloseOperation( JFrame.DO_NOTHING_ON_CLOSE );
           frame.setSize(800, 600);
                   
           SerifyApplet sa = new SerifyApplet();
           sa.init( frame );
                   
           try {
          sa.addSequences("uh", new StringReader( sb.toString() ), "/");
           } catch (URISyntaxException | IOException e1) {
          e1.printStackTrace();
           }
                   
           frame.setVisible( true );
        }
                
        JTextArea textarea = new JTextArea();
        JScrollPane scrollpane = new JScrollPane(textarea);
                
        try {
           if (clipboardService == null)
          clipboardService = (ClipboardService) ServiceManager.lookup("javax.jnlp.ClipboardService");
           Action action = new CopyAction("Copy", null, "Copy data", new Integer(KeyEvent.VK_CONTROL + KeyEvent.VK_C));
           textarea.getActionMap().put("copy", action);
           grabFocus = true;
        } catch (Exception ee) {
           ee.printStackTrace();
           System.err.println("Copy services not available.  Copy using 'Ctrl-c'.");
        }
                
        textarea.setDragEnabled(true);
        textarea.append( sb.toString() );
                
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.add(scrollpane);
        frame.setSize(400, 300);
        frame.setVisible(true);*/
    });
    sequencemenu.getItems().add(showdnaseq);

    MenuItem expalldna = new MenuItem("Export all DNA sequences");
    expalldna.setOnAction(actionEvent -> {
        JFileChooser jfc = new JFileChooser();
        jfc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);

        try {
            Map<Integer, FileWriter> lfw = new HashMap<Integer, FileWriter>();
            if (jfc.showOpenDialog(null) == JFileChooser.APPROVE_OPTION) {
                File f = jfc.getSelectedFile();
                for (Gene gg : getGeneTable().getSelectionModel().getSelectedItems()) {
                    FileWriter fw = null;
                    if (lfw.containsKey(gg.getGroupIndex())) {
                        fw = lfw.get(gg.getGroupIndex());
                    } else {
                        fw = new FileWriter(new File(f, "group_" + gg.getGroupIndex() + ".fasta"));
                        lfw.put(gg.getGroupIndex(), fw);
                    }

                    Tegeval tv = gg.tegeval;
                    fw.append(">" + tv.name + " " + tv.teg + " " + tv.eval + "\n");
                    for (int i = 0; i < tv.getLength(); i += 70) {
                        fw.append(tv.getSubstring(i, Math.min(i + 70, tv.getLength())) + "\n");
                    }
                }
            }
            for (int gi : lfw.keySet()) {
                lfw.get(gi).close();
            }
        } catch (IOException e1) {
            e1.printStackTrace();
        }
    });
    sequencemenu.getItems().add(expalldna);

    MenuItem exprelcont = new MenuItem("Export relevant contigs");
    exprelcont.setOnAction(actionEvent -> {
        JFileChooser jfc = new JFileChooser();

        try {
            Map<Integer, FileWriter> lfw = new HashMap<Integer, FileWriter>();
            if (jfc.showOpenDialog(null) == JFileChooser.APPROVE_OPTION) {
                File f = jfc.getSelectedFile();

                Set<Sequence> contset = new HashSet<Sequence>();
                for (Gene gg : getGeneTable().getSelectionModel().getSelectedItems()) {
                    Tegeval tv = gg.tegeval;
                    contset.add(tv.getContshort());
                }

                FileWriter fw = new FileWriter(f);
                for (Sequence contig : contset) {
                    fw.append(">" + contig + "\n");
                    if (geneset.contigmap.containsKey(contig)) {
                        StringBuilder dna = geneset.contigmap.get(contig).getStringBuilder();
                        for (int i = 0; i < dna.length(); i += 70) {
                            fw.append(dna.substring(i, Math.min(i + 70, dna.length())) + "\n");
                        }
                    }
                }
                fw.close();
            }
            for (int gi : lfw.keySet()) {
                lfw.get(gi).close();
            }
        } catch (IOException e1) {
            e1.printStackTrace();
        }
    });
    sequencemenu.getItems().add(exprelcont);
    sequencemenu.getItems().add(new SeparatorMenuItem());

    MenuItem viewselrange = new MenuItem("View selected range");
    viewselrange.setOnAction(actionEvent -> {
        JFrame frame = new JFrame();
        frame.setSize(800, 600);
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

        Serifier serifier = new Serifier();
        JavaFasta jf = new JavaFasta((comp instanceof JApplet) ? (JApplet) comp : null, serifier, geneset.cs);
        jf.initGui(frame);

        Set<Sequence> contset = new HashSet<Sequence>();
        Set<Tegeval> tvset = new HashSet<>();
        if (isGeneview()) {
            for (Gene gg : getGeneTable().getSelectionModel().getSelectedItems()) {
                Tegeval tv = gg.tegeval;
                tvset.add(tv);
                //serifier.addAnnotation( tv );
                contset.add(tv.getContshort());
            }
        } else {
            for (GeneGroup gg : getGeneGroupTable().getSelectionModel().getSelectedItems()) {
                for (Tegeval tv : gg.getTegevals()) {
                    tv.color = Color.red;
                    tvset.add(tv);
                    Sequence contig = tv.getContshort();
                    contset.add(contig);
                    //serifier.addAnnotation( tv );
                }
            }
        }
        /*Sequence seq;
        Sequence contig = tv.getContshort();
        /*if (contset.containsKey(contig)) {
          seq = contset.get(contig);
        } else {
          if( contigmap.containsKey(contig) ) {
             StringBuilder dna = contigmap.get(contig).getStringBuilder();
             seq = new Sequence(contig.getName(), dna, serifier.mseq);
          } else
             seq = new Sequence(contig.getName(), serifier.mseq);
          contset.put(contig, seq);
        }
                
        Annotation a = new Annotation(contig, contig.getName(), Color.green, serifier.mann);
        a.setStart(tv.start);
        a.setStop(tv.stop);
        a.setOri(tv.ori);
        a.setGroup(gg.name);
        a.setType("gene");*/
        // seq.addAnnotation( new Annotation( seq, ) );

        for (Sequence contig : contset) {
            int start = Integer.MAX_VALUE;
            int stop = Integer.MIN_VALUE;
            for (Tegeval tv : tvset) {
                if (contig == tv.seq) {
                    start = Math.min(start, tv.start);
                    stop = Math.max(stop, tv.stop);
                }
            }

            int rstart = 0;
            int rstop = contig.length();
            if (contig.annset != null)
                for (Annotation tv : contig.annset) {
                    if (contig == tv.seq) {
                        if (tv.stop < start && tv.stop > rstart) {
                            rstart = tv.stop;
                        }
                        if (tv.start > stop && tv.start < rstop) {
                            rstop = tv.start;
                        }
                    }
                }

            start = rstart;
            stop = rstop;

            Sequence newseq = new Sequence(contig.getName(),
                    new StringBuilder(contig.getSubstring(start, stop, 1)), serifier.mseq);
            /*if( contig.isReverse() ) {
               newseq.reverse();
               newseq.complement();
            }*/

            serifier.addSequence(newseq);
            for (Tegeval tv : tvset) {
                Annotation newann = new Annotation(newseq, tv.start - start, tv.stop - start, tv.ori, tv.name);
                if (contig == tv.seq) {
                    newseq.addAnnotation(newann);
                }
                serifier.addAnnotation(newann);
            }
            /*for( Annotation ann : contig.getAnnotations() ) {
               serifier.addAnnotation( ann );
            }*/
            /*if (seq.getAnnotations() != null)
               Collections.sort(seq.getAnnotations());*/
        }
        jf.updateView();

        frame.setVisible(true);
    });
    sequencemenu.getItems().add(viewselrange);

    MenuItem viewwhole = new MenuItem("View whole contigs for selection");
    viewwhole.setOnAction(actionEvent -> {
        JFrame frame = new JFrame();
        frame.setSize(800, 600);
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

        Serifier serifier = new Serifier();
        JavaFasta jf = new JavaFasta((comp instanceof JApplet) ? (JApplet) comp : null, serifier, geneset.cs);
        jf.initGui(frame);

        //Map<Sequence, Sequence> contset = new HashMap<Sequence, Sequence>();
        /*int[] rr = table.getSelectedRows();
        for (int r : rr) {
           int cr = table.convertRowIndexToModel(r);
           Gene gg = geneset.genelist.get(cr);
           if (gg.species != null) {
          for (String sp : gg.species.keySet()) {
             Teginfo stv = gg.species.get(sp);
             for (Tegeval tv : stv.tset) {
                Sequence seq;
                Sequence contig = tv.getContshort();
                if (contset.containsKey(contig)) {
                   seq = contset.get(contig);
                } else {
                   if( GeneSet.contigmap.containsKey(contig) ) {
                      //StringBuilder dna = GeneSet.contigmap.get(contig).seq;
                      StringBuilder dna = contig.getSequence().getStringBuilder();
                      seq = new Sequence(contig.getName(), dna, serifier.mseq);
                   } else {
                      seq = new Sequence(contig.getName(), serifier.mseq);
                   }
                
                   contset.put(contig, seq);
                }
                
                /*
                 * Annotation a = jf.new Annotation( seq,
                 * contig, Color.red ); a.setStart( tv.start );
                 * a.setStop( tv.stop ); a.setOri( tv.ori );
                 * a.setGroup( gg.name ); a.setType( "gene" );
                 * jf.addAnnotation( a );
                 *
                // seq.addAnnotation( new Annotation( seq, ) );
             }
          }
           }
        }*/

        Set<Sequence> contigs = new HashSet<Sequence>();
        if (isGeneview()) {
            for (Gene gg : getGeneTable().getSelectionModel().getSelectedItems()) {
                Tegeval tv = gg.tegeval;
                tv.color = Color.red;
                Sequence contig = tv.getContshort();
                //contig.offset = -tv.start;
                contigs.add(contig);
            }

            /*Annotation a = new Annotation(contig, contig.getName(), Color.red, serifier.mann);
            a.setStart(tv.start);
            a.setStop(tv.stop);
            a.setOri(tv.ori);
            a.setGroup(g.name);
            a.setType("gene");*/
            //serifier.addAnnotation( tv );
        } else {
            for (GeneGroup gg : getGeneGroupTable().getSelectionModel().getSelectedItems()) {
                for (Tegeval tv : gg.getTegevals()) {
                    tv.color = Color.red;
                    Sequence contig = tv.getContshort();
                    //contig.offset = -tv.start;
                    contigs.add(contig);

                    /*Annotation a = new Annotation(contig, contig.getName(), Color.red, serifier.mann);
                    a.setStart(tv.start);
                    a.setStop(tv.stop);
                    a.setOri(tv.ori);
                    a.setGroup(gg.getCommonName());
                    a.setType("gene");*/
                    //serifier.addAnnotation( tv );
                }
            }
        }
        //Gene gg = geneset.genelist.get(cr);
        //for (Gene g : geneset.genelist) {
        //if (g.species != null) {
        //for (String sp : g.species.keySet()) {

        for (Sequence contig : contigs) {
            for (Annotation ann : contig.getAnnotations()) {
                serifier.addAnnotation(ann);
            }

            serifier.addSequence(contig);
            serifier.mseq.put(contig.getName(), contig);
            //if(contig.getAnnotations() != null)
            //   Collections.sort(contig.getAnnotations());
        }
        jf.updateView();

        frame.setVisible(true);
    });
    sequencemenu.getItems().add(viewwhole);
    sequencemenu.getItems().add(new SeparatorMenuItem());

    MenuItem viewspecseq = new MenuItem("View species sequence");
    viewspecseq.setOnAction(actionEvent -> {
        Set<String> selspec = getSelspec(GeneSetHead.this, geneset.specList);

        JFrame frame = new JFrame();
        frame.setSize(800, 600);
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

        Serifier serifier = new Serifier();
        JavaFasta jf = new JavaFasta((comp instanceof JApplet) ? (JApplet) comp : null, serifier, geneset.cs);
        jf.initGui(frame);

        for (String spec : selspec) {
            List<Sequence> contigs = geneset.speccontigMap.get(spec);

            for (Sequence contig : contigs) {
                List<Annotation> lann = contig.getAnnotations();
                if (lann != null)
                    for (Annotation ann : lann) {
                        serifier.addAnnotation(ann);
                    }

                serifier.addSequence(contig);
                serifier.mseq.put(contig.getName(), contig);
            }
        }

        jf.updateView();

        frame.setVisible(true);
    });
    sequencemenu.getItems().add(viewspecseq);

    Menu windowmenu = new Menu("Tools");
    MenuItem seqviewer = new MenuItem("Sequence viewer");
    seqviewer.setOnAction(actionEvent -> {
        JFrame frame = new JFrame();
        frame.setSize(800, 600);
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

        Serifier serifier = new Serifier();
        JavaFasta jf = new JavaFasta((comp instanceof JApplet) ? (JApplet) comp : null, serifier, geneset.cs);
        jf.initGui(frame);
        jf.updateView();

        frame.setVisible(true);
    });
    windowmenu.getItems().add(seqviewer);
    windowmenu.getItems().add(new SeparatorMenuItem());
    MenuItem genesorter = new MenuItem("Gene sorter");
    genesorter.setOnAction(actionEvent -> {
        try {
            //if( gb.isSelected() ) new GeneSorter().mynd( GeneSetHead.this, genelist, table, null, contigmap );
            //else 
            new GeneSorter().groupMynd(GeneSetHead.this, geneset.allgenegroups, geneset.specList,
                    geneset.genelist, table, geneset.contigmap, geneset.specset);
        } catch (IOException e1) {
            e1.printStackTrace();
        }
    });
    windowmenu.getItems().add(genesorter);
    MenuItem specorderaction = new MenuItem("Order species list");
    specorderaction.setOnAction(actionEvent -> {
        TreeUtil tu = new TreeUtil();
        /*corrInd.clear();
        for( String spec : specList ) {
           corrInd.add( nameFix( spec ) );
        }*/

        Serifier serifier = getConcatenatedSequences(false, false);

        Map<String, Integer> blosumap = JavaFasta.getBlosumMap();
        double[] dmat = new double[serifier.lseq.size() * serifier.lseq.size()];
        Sequence.distanceMatrixNumeric(serifier.lseq, dmat, null, false, false, null, blosumap);

        List<String> ret = new ArrayList<String>();
        for (Sequence seqname : serifier.lseq) {
            ret.add(seqname.getName()); //.replace(' ', '_') );
        }
        //List<String>   corrInd = currentjavafasta.getNames();

        //Sequence.distanceMatrixNumeric(serifier.lseq, dmat, idxs, bootstrap, cantor, ent, blosum);
        Node n = tu.neighborJoin(dmat, ret, null, false, false);

        Comparator<Node> comp2 = (o1, o2) -> {
            int c1 = o1.countLeaves();
            int c2 = o2.countLeaves();

            if (c1 > c2)
                return 1;
            else if (c1 == c2)
                return 0;

            return -1;
        };
        tu.arrange(n, comp2);
        //corrInd.clear();
        List<String> ordInd = n.traverse();

        for (String spec : ordInd) {
            System.err.println(spec);
        }

        for (String oldspec : geneset.specList) {
            if (!ordInd.contains(oldspec)) {
                ordInd.add(oldspec);
            }
        }
        geneset.specList = ordInd;

        //TableModel model = table.getModel();
        //table.setModel( nullmodel );
        //table.setModel( model );

        //table.tableChanged( new TableModelEvent( table.getModel() ) );
        //table.getColumnModel().
        System.err.println(geneset.specList.size());
    });
    MenuItem matrixaction = new MenuItem("Relation matrix");
    matrixaction.setOnAction(actionEvent -> {
        SwingUtilities.invokeLater(() -> {
            JComboBox<String> descombo = new JComboBox<String>(
                    geneset.deset.toArray(new String[geneset.deset.size()]));
            JCheckBox anicheck = new JCheckBox("ANImatrix");
            JCheckBox plasmidcheck = new JCheckBox("Skip plasmids");
            descombo.insertItemAt("", 0);
            descombo.setSelectedIndex(0);
            JOptionPane.showMessageDialog(GeneSetHead.this, new Object[] { descombo, anicheck, plasmidcheck });
            String val = descombo.getSelectedItem().toString();

            Collection<GeneGroup> ss = new HashSet<>();
            /*int[] rr = table.getSelectedRows();
            for( int r : rr ) {
               ss.add( geneset.allgenegroups.get( table.convertRowIndexToModel(r) ) );
            }*/
            ss.addAll(table.getSelectionModel().getSelectedItems());
            if (ss.isEmpty())
                ss = geneset.allgenegroups;

            Set<String> species = getSelspec(GeneSetHead.this, geneset.specList);
            bimg = anicheck.isSelected()
                    ? geneset.animatrix(species, geneset.clusterMap, val, ss, plasmidcheck.isSelected())
                    : geneset.bmatrix(species, geneset.clusterMap, val);

            JFrame f = new JFrame("Relation matrix");
            f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
            f.setSize(500, 500);

            /*
             * { public void paintComponent( Graphics g ) {
             * super.paintComponent(g); g.drawImage(bimg, 0, 0, this); } };
             */

            try {
                final DataFlavor df = new DataFlavor("text/plain;charset=utf-8");
                final Transferable transferable = new Transferable() {
                    @Override
                    public Object getTransferData(DataFlavor arg0)
                            throws UnsupportedFlavorException, IOException {
                        StringBuilder ret = new StringBuilder();

                        int i = 0;
                        for (String spc : geneset.specList) {
                            if (++i == geneset.specList.size())
                                ret.append(spc + "\n");
                            else
                                ret.append(spc + "\t");
                        }

                        int where = 0;
                        for (String spc1 : geneset.specList) {
                            int wherex = 0;
                            for (String spc2 : geneset.specList) {
                                int spc1tot = 0;
                                int spc2tot = 0;
                                int totot = 0;

                                int spc1totwocore = 0;
                                int spc2totwocore = 0;
                                int tototwocore = 0;
                                for (Set<String> set : geneset.clusterMap.keySet()) {
                                    Set<Map<String, Set<String>>> erm = geneset.clusterMap.get(set);
                                    if (set.contains(spc1)) {
                                        if (set.size() < geneset.specList.size()) {
                                            spc1totwocore += erm.size();
                                            for (Map<String, Set<String>> sm : erm) {
                                                Set<String> hset = sm.get(spc1);
                                                tototwocore += hset.size();
                                            }

                                            if (set.contains(spc2)) {
                                                spc2totwocore += erm.size();
                                            }

                                            if (spc2totwocore > spc1totwocore)
                                                System.err.println(
                                                        "okoko " + spc1totwocore + " " + spc2totwocore);
                                        }

                                        spc1tot += erm.size();
                                        for (Map<String, Set<String>> sm : erm) {
                                            Set<String> hset = sm.get(spc1);
                                            totot += hset.size();
                                        }

                                        if (set.contains(spc2)) {
                                            spc2tot += erm.size();
                                        }
                                    }
                                }

                                if (where == wherex) {
                                    if (where == geneset.specList.size() - 1)
                                        ret.append(0 + "\n");
                                    else
                                        ret.append(0 + "\t");
                                } else {
                                    double hlut = (double) spc2totwocore / (double) spc1totwocore;
                                    double sval = hlut; // 1.0/( 1.1-hlut );
                                    double val = Math.pow(50.0, sval - 0.3) - 1.0;
                                    double dval = Math.round(100.0 * (val)) / 100.0;

                                    if (wherex == geneset.specList.size() - 1)
                                        ret.append(dval + "\n");
                                    else
                                        ret.append(dval + "\t");
                                }
                                wherex++;
                            }
                            where++;
                        }

                        return new ByteArrayInputStream(ret.toString().getBytes());
                    }

                    @Override
                    public DataFlavor[] getTransferDataFlavors() {
                        return new DataFlavor[] { df };
                    }

                    @Override
                    public boolean isDataFlavorSupported(DataFlavor arg0) {
                        if (arg0.equals(df)) {
                            return true;
                        }
                        return false;
                    }
                };
                final TransferComponent comp2 = new TransferComponent(bimg, transferable);

                TransferHandler th = new TransferHandler() {
                    private static final long serialVersionUID = 1L;

                    public int getSourceActions(JComponent c) {
                        return TransferHandler.COPY_OR_MOVE;
                    }

                    public boolean canImport(TransferSupport support) {
                        return false;
                    }

                    protected Transferable createTransferable(JComponent c) {
                        return transferable;
                    }

                    public boolean importData(TransferSupport support) {
                        return true;
                    }
                };
                comp2.setTransferHandler(th);

                comp2.setEnabled(true);
                JScrollPane fsc = new JScrollPane(comp2);
                comp2.setPreferredSize(new Dimension(bimg.getWidth(), bimg.getHeight()));

                JPopupMenu popup = new JPopupMenu();
                popup.add(new AbstractAction("Save image") {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        FileSaveService fss = null;
                        FileContents fileContents = null;

                        try {
                            ByteArrayOutputStream baos = new ByteArrayOutputStream();
                            OutputStreamWriter osw = new OutputStreamWriter(baos);
                            ImageIO.write(bimg, "png", baos);
                            baos.close();

                            try {
                                fss = (FileSaveService) ServiceManager.lookup("javax.jnlp.FileSaveService");
                            } catch (UnavailableServiceException e1) {
                                fss = null;
                            }

                            if (fss != null) {
                                ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
                                fileContents = fss.saveFileDialog(null, null, bais, "export.png");
                                bais.close();
                                OutputStream os = fileContents.getOutputStream(true);
                                os.write(baos.toByteArray());
                                os.close();
                            } else {
                                JFileChooser jfc = new JFileChooser();
                                if (jfc.showSaveDialog(GeneSetHead.this) == JFileChooser.APPROVE_OPTION) {
                                    File f = jfc.getSelectedFile();
                                    FileOutputStream fos = new FileOutputStream(f);
                                    fos.write(baos.toByteArray());
                                    fos.close();

                                    Desktop.getDesktop().browse(f.toURI());
                                }
                            }
                        } catch (IOException e2) {
                            e2.printStackTrace();
                        }
                    }
                });
                comp2.setComponentPopupMenu(popup);

                f.add(fsc);
                f.setVisible(true);
            } catch (ClassNotFoundException e1) {
                e1.printStackTrace();
            }
        });
    });
    MenuItem tniaction = new MenuItem("TNI/ANI");
    tniaction.setOnAction(actionEvent -> {
        SwingUtilities.invokeLater(() -> {
            Set<String> species = getSelspec(GeneSetHead.this, geneset.specList);
            String makeblastdb = "makeblastdb";
            String OS = System.getProperty("os.name").toLowerCase();
            if (OS.indexOf("mac") != -1)
                makeblastdb = "/usr/local/bin/makeblastdb";
            for (String spec : species) {
                List<Sequence> lseq = geneset.speccontigMap.get(spec);
                ProcessBuilder pb = new ProcessBuilder(makeblastdb, "-dbtype", "nucl", "-title", spec, "-out",
                        spec);
                File dir = new File(System.getProperty("user.home"));

                /*try {
                    FileWriter w = new FileWriter( new File(dir, spec+".fna") );
                    for( Sequence seq : lseq ) {
                seq.writeSequence(w);
                    }
                    w.close();
                } catch (IOException e2) {
                    e2.printStackTrace();
                }*/

                pb.directory(dir);
                try {
                    Process p = pb.start();
                    Writer fw = new OutputStreamWriter(p.getOutputStream());
                    for (Sequence seq : lseq) {
                        seq.writeSequence(fw);
                    }
                    fw.close();
                } catch (IOException e1) {
                    e1.printStackTrace();
                }
            }

            int y = 0;
            double[] matrix = new double[species.size() * species.size()];
            for (String dbspec : species) {
                int x = 0;
                for (String spec : species) {
                    //if( !spec.equals(dbspec) ) {
                    final List<Sequence> lseq = geneset.speccontigMap.get(spec);
                    String blastn = "blastn";
                    if (OS.indexOf("mac") != -1)
                        blastn = "/usr/local/bin/blastn";
                    ProcessBuilder pb = new ProcessBuilder(blastn, "-db", dbspec, "-num_threads",
                            Integer.toString(Runtime.getRuntime().availableProcessors()), "-num_alignments",
                            "1", "-num_descriptions", "1"); //,"-max_hsps","1");
                    File dir = new File(System.getProperty("user.home"));
                    pb.directory(dir);
                    try {
                        Process p = pb.start();
                        final BufferedWriter fw = new BufferedWriter(
                                new OutputStreamWriter(p.getOutputStream()));
                        Thread t = new Thread() {
                            public void run() {
                                try {
                                    for (Sequence seq : lseq) {
                                        seq.writeSplitSequence(fw);
                                        //seq.writeSequence(fw);
                                    }
                                    fw.close();
                                } catch (IOException e1) {
                                    e1.printStackTrace();
                                }
                            }
                        };
                        t.start();
                        //Path path = Paths.get("/Users/sigmar/"+spec+"_"+dbspec+".blastout");
                        //Files.copy(p.getInputStream(), path, StandardCopyOption.REPLACE_EXISTING);

                        int tnum = 0;
                        int tdenum = 0;
                        double avg = 0.0;
                        int count = 0;

                        BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
                        String line = br.readLine();
                        while (line != null) {
                            if (line.startsWith(" Identities")) {
                                int i = line.indexOf('(');
                                String sub = line.substring(14, i - 1);
                                String[] split = sub.split("/");
                                int num = Integer.parseInt(split[0]);
                                int denum = Integer.parseInt(split[1]);

                                avg += (double) num / (double) denum;

                                tnum += num;
                                tdenum += denum;
                                count++;
                            }
                            line = br.readLine();
                        }
                        br.close();

                        if (count > 0)
                            avg /= count;
                        double val = (double) tnum / (double) tdenum;
                        matrix[y * species.size() + x] = avg;//val;
                        System.err.println(spec + " on " + dbspec + " " + val);
                    } catch (IOException e1) {
                        e1.printStackTrace();
                    }
                    //}
                    x++;
                }
                y++;
            }

            geneset.corrInd.clear();
            for (String spec : species) {
                geneset.corrInd.add(geneset.nameFix(spec));
            }

            final BufferedImage bi = geneset.showRelation(geneset.corrInd, matrix, false);
            JFrame f = new JFrame("TNI matrix");
            f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
            f.setSize(500, 500);

            JComponent comp2 = new JComponent() {
                public void paintComponent(Graphics g) {
                    super.paintComponent(g);
                    g.drawImage(bi, 0, 0, bi.getWidth(), bi.getHeight(), 0, 0, bi.getWidth(), bi.getHeight(),
                            this);
                }
            };
            Dimension dim = new Dimension(bi.getWidth(), bi.getHeight());
            comp2.setPreferredSize(dim);
            comp2.setSize(dim);
            JScrollPane scroll = new JScrollPane(comp2);
            f.add(scroll);

            f.setVisible(true);
        });
    });
    MenuItem anitreeaction = new MenuItem("ANI tree");
    anitreeaction.setOnAction(actionEvent -> {
        Set<String> species = getSelspec(GeneSetHead.this, geneset.specList);
        List<String> speclist = new ArrayList<String>(species);

        Collection<GeneGroup> allgg = new HashSet<GeneGroup>();
        allgg.addAll(table.getSelectionModel().getSelectedItems());
        if (allgg.isEmpty())
            allgg = geneset.allgenegroups;
        Map<String, Integer> blosumap = JavaFasta.getBlosumMap();

        double[] corrarr = new double[speclist.size() * speclist.size()];
        int where = 0;
        for (String spec1 : speclist) {
            int wherex = 0;

            String spc1 = geneset.nameFix(spec1);

            //String spc1 = nameFix( spec1 );
            for (String spec2 : speclist) {
                if (where != wherex) {
                    int totalscore = 0;
                    int totaltscore = 1;
                    for (GeneGroup gg : allgg) {
                        if ( /*gg.getSpecies().size() > 40 &&*/ gg.getSpecies().contains(spec1)
                                && gg.getSpecies().contains(spec2)) {
                            Teginfo ti1 = gg.species.get(spec1);
                            Teginfo ti2 = gg.species.get(spec2);
                            //if( ti1.tset.size() == 1 && ti2.tset.size() == 1 ) {
                            //double bval = 0.0;

                            int score = 0;
                            int tscore = 1;
                            for (Tegeval tv1 : ti1.tset) {
                                for (Tegeval tv2 : ti2.tset) {
                                    Sequence seq1 = tv1.getAlignedSequence();
                                    Sequence seq2 = tv2.getAlignedSequence();
                                    if (seq1 != null && seq2 != null) {
                                        int mest = 0;
                                        int tmest = 0;

                                        int startcheck = 0;
                                        int start = -1;
                                        int stopcheck = 0;
                                        int stop = -1;
                                        for (int i = 0; i < seq1.length(); i++) {
                                            if (seq1.getCharAt(i) != '-') {
                                                startcheck |= 1;
                                            }
                                            if (seq2.getCharAt(i) != '-') {
                                                startcheck |= 2;
                                            }

                                            if (start == -1 && startcheck == 3) {
                                                start = i;
                                                break;
                                            }
                                        }

                                        for (int i = seq1.length() - 1; i >= 0; i--) {
                                            if (seq1.getCharAt(i) != '-') {
                                                stopcheck |= 1;
                                            }
                                            if (seq2.getCharAt(i) != '-') {
                                                stopcheck |= 2;
                                            }

                                            if (stop == -1 && stopcheck == 3) {
                                                stop = i + 1;
                                                break;
                                            }
                                        }
                                        //count += stop-start;

                                        for (int i = start; i < stop; i++) {
                                            char lc = seq1.getCharAt(i);
                                            char c = Character.toUpperCase(lc);
                                            //if( )
                                            String comb = c + "" + c;
                                            if (blosumap.containsKey(comb))
                                                tmest += blosumap.get(comb);
                                        }

                                        for (int i = start; i < stop; i++) {
                                            char lc = seq1.getCharAt(i);
                                            char c = Character.toUpperCase(lc);
                                            char lc2 = seq2.getCharAt(i);
                                            char c2 = Character.toUpperCase(lc2);

                                            String comb = c + "" + c2;
                                            if (blosumap.containsKey(comb))
                                                mest += blosumap.get(comb);
                                        }

                                        double tani = (double) mest / (double) tmest;
                                        if (tani > (double) score / (double) tscore) {
                                            score = mest;
                                            tscore = tmest;
                                        }
                                        //ret = (double)score/(double)tscore; //int cval = tscore == 0 ? 0 : Math.min( 192, 512-score*512/tscore );
                                        //return ret;
                                    }
                                    //if( where == 0 ) d1.add( gg.getCommonName() );
                                    //else d2.add( gg.getCommonName() );
                                }
                            }
                            totalscore += score;
                            totaltscore += tscore;

                            /*if( bval > 0 ) {
                               ani += bval;
                               count++;
                            }*/
                            //}
                        }
                    }
                    double ani = (double) (totaltscore - totalscore) / (double) totaltscore;
                    corrarr[where * speclist.size() + wherex] = ani;
                }
                wherex++;
            }
            where++;
        }
        TreeUtil tu = new TreeUtil();
        geneset.corrInd.clear();
        for (String spec : speclist) {
            geneset.corrInd.add(geneset.nameFix(spec));
        }
        Node n = tu.neighborJoin(corrarr, geneset.corrInd, null, false, false);
        System.err.println(n);
    });
    windowmenu.getItems().add(specorderaction);
    windowmenu.getItems().add(matrixaction);
    windowmenu.getItems().add(tniaction);
    windowmenu.getItems().add(anitreeaction);

    MenuItem neighbourhood = new MenuItem("Neighbourhood");
    neighbourhood.setOnAction(actionEvent -> {
        try {
            Set<GeneGroup> genset = new HashSet<>();
            if (!isGeneview()) {
                for (GeneGroup gg : table.getSelectionModel().getSelectedItems()) {
                    genset.add(gg);
                }
            } else {
                for (Gene gene : gtable.getSelectionModel().getSelectedItems()) {
                    genset.add(gene.getGeneGroup());
                }
            }
            new Neighbour(genset).neighbourMynd(GeneSetHead.this, comp, geneset.genelist, geneset.contigmap);
        } catch (IOException e1) {
            e1.printStackTrace();
        }
    });
    windowmenu.getItems().add(neighbourhood);

    MenuItem synteny = new MenuItem("Synteny");
    synteny.setOnAction(actionEvent -> {
        SwingUtilities.invokeLater(() -> {
            //Set<String> species = speciesFromCluster( clusterMap );
            new Synteni().syntenyMynd(GeneSetHead.this, comp, geneset.genelist);
        });
    });
    windowmenu.getItems().add(synteny);
    MenuItem compareplotaction = new MenuItem("Gene atlas");
    compareplotaction.setOnAction(actionEvent -> {
        SwingUtilities.invokeLater(() -> {
            try {
                new GeneCompare().comparePlot(GeneSetHead.this, comp, geneset.genelist, geneset.clusterMap,
                        8192, 8192);
            } catch (IOException e1) {
                e1.printStackTrace();
            }
        });

        /*gatest("MAT4726");
                
        final JFrame frame = new JFrame();
        frame.setDefaultCloseOperation( JFrame.DISPOSE_ON_CLOSE );
        frame.setSize(800, 600);
                
        final JComponent c = new JComponent() {
           public void paintComponent( Graphics g ) {
          g.drawImage(bimg, 0, 0, frame);
           }
        };
        c.setPreferredSize( new Dimension(bimg.getWidth(), bimg.getHeight()) );
        JScrollPane   scrollpane = new JScrollPane( c );
        frame.add( scrollpane );
        frame.setVisible( true );*/
    });
    windowmenu.getItems().add(compareplotaction);

    MenuItem syntenygradientaction = new MenuItem("Synteny gradient");
    syntenygradientaction.setOnAction(actionEvent -> {
        SwingUtilities.invokeLater(() -> {
            Set<String> presel = new HashSet<>();
            if (isGeneview()) {
                for (Gene g : gtable.getSelectionModel().getSelectedItems()) {
                    presel.addAll(g.getGeneGroup().getSpecies());
                }
            } else {
                for (GeneGroup gg : table.getSelectionModel().getSelectedItems()) {
                    presel.addAll(gg.getSpecies());
                }
            }
            new SyntGrad().syntGrad(GeneSetHead.this, 4096, 4096, presel);
        });
    });
    windowmenu.getItems().add(syntenygradientaction);

    MenuItem genexyplotaction = new MenuItem("Gene XY plot");
    genexyplotaction.setOnAction(actionEvent -> SwingUtilities.invokeLater(
            () -> new XYPlot().xyPlot(GeneSetHead.this, comp, geneset.genelist, geneset.clusterMap)));
    windowmenu.getItems().add(genexyplotaction);

    MenuItem refalignaction = new MenuItem("Reference align");
    refalignaction.setOnAction(actionEvent -> {
        SwingUtilities.invokeLater(() -> {
            final TableView<Gene> table12 = getGeneTable();
            final Collection<String> specset = geneset.getSpecies(); //speciesFromCluster( clusterMap );
            final List<String> species = new ArrayList<>(specset);

            TableModel model = new TableModel() {
                @Override
                public int getRowCount() {
                    return species.size();
                }

                @Override
                public int getColumnCount() {
                    return 1;
                }

                @Override
                public String getColumnName(int columnIndex) {
                    return null;
                }

                @Override
                public Class<?> getColumnClass(int columnIndex) {
                    return String.class;
                }

                @Override
                public boolean isCellEditable(int rowIndex, int columnIndex) {
                    return false;
                }

                @Override
                public Object getValueAt(int rowIndex, int columnIndex) {
                    return geneset.nameFix(species.get(rowIndex));
                }

                @Override
                public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
                }

                @Override
                public void addTableModelListener(TableModelListener l) {
                }

                @Override
                public void removeTableModelListener(TableModelListener l) {
                }
            };
            JTable table1 = new JTable(model);
            JTable table2 = new JTable(model);

            table1.getSelectionModel().setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
            table2.getSelectionModel().setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);

            JScrollPane scroll1 = new JScrollPane(table1);
            JScrollPane scroll2 = new JScrollPane(table2);

            FlowLayout flowlayout = new FlowLayout();
            JComponent c = new JComponent() {
            };
            c.setLayout(flowlayout);

            c.add(scroll1);
            c.add(scroll2);

            JOptionPane.showMessageDialog(comp, c);

            int r = table1.getSelectedRow();
            int i = table1.convertRowIndexToModel(r);
            String spec = i == -1 ? null : species.get(i);
            List<Sequence> lcont = geneset.speccontigMap.get(spec);

            r = table2.getSelectedRow();
            i = table2.convertRowIndexToModel(r);
            String refspec = i == -1 ? null : species.get(i);
            List<Sequence> lrefcont = geneset.speccontigMap.get(spec);

            /*ByteArrayOutputStream baos = new ByteArrayOutputStream();
            Writer fw = new OutputStreamWriter( baos );
            try {
            List<Sequence> lcont = geneset.speccontigMap.get(spec);
            for( Sequence seq : lcont ) {
                seq.writeSequence(fw);
            }
            fw.close();
            } catch (IOException e1) {
            e1.printStackTrace();
            }
                    
            String comp = spec;
            byte[] bb = baos.toByteArray();*/

            FlxReader flx = new FlxReader();

            Map<String, String> env = new HashMap<String, String>();
            env.put("create", "true");
            //String uristr = "jar:" + geneset.zippath.toUri();
            //URI geneset.zipuri = URI.create( uristr /*.replace("file://", "file:")*/ );

            try {
                geneset.zipfilesystem = FileSystems.newFileSystem(geneset.zipuri, env);
                for (Path root : geneset.zipfilesystem.getRootDirectories()) {
                    Path subf = root.resolve(spec + ".grp");
                    if (Files.exists(subf)) {
                        BufferedReader br = Files.newBufferedReader(subf);
                        Map<String, Map<String, String>> mm = flx.loadContigGraph(br);
                        br.close();

                        String home = System.getProperty("user.home") + "/";
                        StringBuilder sb = comp != null
                                ? flx.referenceAssembly(home, spec, refspec, lrefcont, lcont)
                                : null;
                        Sequence cseq = new Sequence(spec + "_chromosome", null);
                        if (sb != null && sb.length() > 0) {
                            br = new BufferedReader(new StringReader(sb.toString()));
                        } else {
                            Path sca = root.resolve(spec + ".csc");
                            if (!Files.exists(sca)) {
                                sca = root.resolve(spec + ".sca");
                            }
                            br = Files.newBufferedReader(sca);
                        }
                        //br = new BufferedReader( fr );

                        flx.connectContigs(br, cseq, false, new FileWriter(home + spec + "_new.fna"), spec);
                        br.close();
                    }

                    break;
                }
            } catch (Exception ex) {
                ex.printStackTrace();
            } finally {
                try {
                    geneset.zipfilesystem.close();
                } catch (IOException ie) {
                    ie.printStackTrace();
                }
                ;
            }
        });

        //flx.start( f.getParentFile().getAbsolutePath()+"/", f.getName(), false, fw, comp, bb);
    });
    windowmenu.getItems().add(refalignaction);

    windowmenu.getItems().add(new SeparatorMenuItem());

    MenuItem runantismash = new MenuItem("Run antismash");
    runantismash.setOnAction(actionEvent -> SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            try {
                Serifier ser = new Serifier();
                Set<String> selspec = getSelspec(null, geneset.getSpecies(), null);

                JTextField host = new JTextField("localhost");
                JOptionPane.showMessageDialog(null, host);

                String username = System.getProperty("user.name");
                String hostname = host.getText();

                /*Path[] pt = null;
                JFileChooser fc = new JFileChooser();
                fc.setFileSelectionMode( JFileChooser.DIRECTORIES_ONLY );
                if( fc.showSaveDialog(null) == JFileChooser.APPROVE_OPTION ) {
                   pt = new Path[3];
                   pt[2] = fc.getSelectedFile().toPath();
                }*/

                List<Object> commands = new ArrayList<Object>();
                //commands.add(genexyplotaction)

                for (String spec : selspec) {
                    Path pp = Paths.get(userhome);
                    Path p = pp.resolve(spec + ".gbk");
                    //BufferedWriter fw = Files.newBufferedWriter( p );
                    List<Sequence> clist = geneset.speccontigMap.get(spec);

                    Map<String, List<Annotation>> mapan = new HashMap<String, List<Annotation>>();
                    Serifier serifier = new Serifier();
                    for (Sequence c : clist) {
                        serifier.addSequence(c);
                        serifier.mseq.put(c.getName(), c);

                        List<Annotation> lann = new ArrayList<Annotation>();
                        if (c.getAnnotations() != null)
                            for (Annotation ann : c.getAnnotations()) {
                                Tegeval tv = (Tegeval) ann;

                                Gene g = tv.getGene();
                                GeneGroup gg = g.getGeneGroup();
                                String name = g.getName();
                                if (gg != null && name.contains(spec)) {
                                    name = gg.getName();
                                }
                                Annotation anno = new Annotation(c, tv.start, tv.stop, tv.ori, name);
                                anno.id = tv.getGene().getId();
                                anno.type = "CDS";

                                String cazy = gg != null ? gg.getCommonCazy(geneset.cazymap) : null;
                                if (cazy != null)
                                    anno.addDbRef("CAZY:" + cazy);
                                lann.add(anno);
                            }
                        mapan.put(c.getName(), lann);
                    }
                    Sequences s = new Sequences(null, spec, "nucl", null, clist.size());
                    //serifier.addSequences(seqs);
                    serifier.writeGenebank(p, false, true, s, mapan);

                    //fw.close();

                    String apath = p.toAbsolutePath().toString();
                    if (hostname.equals("localhost")) {
                        String[] cmds = { "run_antismash", apath };
                        //commands.add( pt );
                        commands.add(Arrays.asList(cmds));
                    } else {
                        String aname = p.getFileName().toString();
                        String adir = aname.substring(0, aname.length() - 4);
                        String cyghome = NativeRun.cygPath(userhome);
                        String[] cmds = { "scp", apath, hostname + ":~", ";", "ssh", hostname, "run_antismash",
                                aname, ";", "scp", "-r", hostname + ":~/" + adir, cyghome };//userhome+"~"};
                        //commands.add( pt );
                        commands.add(Arrays.asList(cmds));
                    }
                }

                Runnable run = new Runnable() {
                    @Override
                    public void run() {
                        for (String spec : selspec) {
                            Path p = Paths.get(userhome, spec);

                            Map<String, String> env = new HashMap<String, String>();
                            env.put("create", "true");

                            String uristr = "jar:" + geneset.zippath.toUri();
                            URI zipuri = URI.create(uristr /*.replace("file://", "file:")*/ );
                            final List<Path> lbi = new ArrayList<Path>();
                            try {
                                geneset.zipfilesystem = FileSystems.newFileSystem(geneset.zipuri, env);
                                for (Path root : geneset.zipfilesystem.getRootDirectories()) {
                                    Path specdir = root;
                                    Files.walkFileTree(p, new SimpleFileVisitor<Path>() {
                                        @Override
                                        public FileVisitResult visitFile(Path file, BasicFileAttributes attrs)
                                                throws IOException {
                                            final Path destFile = Paths.get(specdir.toString(),
                                                    file.toString());
                                            //System.out.printf("Extracting file %s to %s\n", file, destFile);
                                            Files.copy(file, destFile, StandardCopyOption.REPLACE_EXISTING);
                                            return FileVisitResult.CONTINUE;
                                        }

                                        @Override
                                        public FileVisitResult preVisitDirectory(Path dir,
                                                BasicFileAttributes attrs) throws IOException {
                                            String specdirstr = specdir.toString();
                                            String dirstr = dir.toString();
                                            final Path dirToCreate = specdir
                                                    .resolve(dirstr.substring(userhome.length() + 1));
                                            if (Files.notExists(dirToCreate)) {
                                                System.out.printf("Creating directory %s\n", dirToCreate);
                                                Files.createDirectory(dirToCreate);
                                            }
                                            return FileVisitResult.CONTINUE;
                                        }
                                    });
                                    break;
                                }

                                URI uri = new URI("file://" + userhome + "/" + spec + "/index.html");
                                Desktop.getDesktop().browse(uri);
                            } catch (Exception ex) {
                                ex.printStackTrace();
                            } finally {
                                try {
                                    geneset.zipfilesystem.close();
                                } catch (Exception e) {
                                    e.printStackTrace();
                                }
                                ;
                            }
                        }
                    }
                };

                NativeRun nr = new NativeRun(run);
                nr.runProcessBuilder("antismash", commands, new Object[3], false, run, false);
            } catch (IOException e1) {
                e1.printStackTrace();
            }
        }
    }));
    windowmenu.getItems().add(runantismash);

    MenuItem runsignalp = new MenuItem("Run signalP");
    runsignalp.setOnAction(actionEvent -> SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            try {
                Serifier ser = new Serifier();
                Set<String> selspec = getSelspec(null, geneset.getSpecies(), null);

                JTextField host = new JTextField("localhost");
                JOptionPane.showMessageDialog(null, host);

                String username = System.getProperty("user.name");
                String hostname = host.getText();

                /*Path[] pt = null;
                JFileChooser fc = new JFileChooser();
                fc.setFileSelectionMode( JFileChooser.DIRECTORIES_ONLY );
                if( fc.showSaveDialog(null) == JFileChooser.APPROVE_OPTION ) {
                   pt = new Path[3];
                   pt[2] = fc.getSelectedFile().toPath();
                }*/

                List<Object> commands = new ArrayList<Object>();
                //commands.add(genexyplotaction)

                try {
                    Map<String, String> env = new HashMap<String, String>();
                    env.put("create", "true");

                    String uristr = "jar:" + geneset.zippath.toUri();
                    URI zipuri = URI.create(uristr /*.replace("file://", "file:")*/ );

                    geneset.zipfilesystem = FileSystems.newFileSystem(geneset.zipuri, env);
                    for (Path root : geneset.zipfilesystem.getRootDirectories()) {
                        for (String spec : selspec) {
                            /*Path specdir = root.resolve(spec+".prodigal.fsa");
                            if( !Files.exists(specdir) ) {
                               if( spec.startsWith("MAT") ) {
                                  specdir = root.resolve(spec+".gbk.aa");
                               } else specdir = root.resolve("fn_"+spec+"_scaffolds.prodigal.fsa");
                            }*/
                            Stream<Gene> genestream = geneset.genelist.stream()
                                    .filter(gene -> spec.equals(gene.getSpecies())
                                            && (gene.tegeval.type == null || gene.tegeval.type.length() == 0));
                            Path sigout = root.resolve(spec + ".signalp");
                            Path[] pt = new Path[] { null, sigout, null };
                            if (hostname.equals("localhost")) {
                                String[] cmds = { "signalp", "-t", "gram-", "-" };
                                commands.add(pt);
                                commands.add(Arrays.asList(cmds));
                            } else {
                                Path p = Paths.get(spec + ".signalp");
                                BufferedWriter bw = Files.newBufferedWriter(p, StandardOpenOption.CREATE,
                                        StandardOpenOption.TRUNCATE_EXISTING, StandardOpenOption.WRITE);
                                genestream.forEachOrdered(gene -> {
                                    try {
                                        gene.writeGeneIdFasta(bw);
                                    } catch (Exception e1) {
                                        e1.printStackTrace();
                                    }
                                });
                                bw.close();

                                //Files.copy(specdir, p, StandardCopyOption.REPLACE_EXISTING);

                                String[] cmds = { "scp", spec + ".signalp", hostname + ":~", ";", "ssh",
                                        hostname, "signalp", "-t", "gram-", spec + ".signalp" };
                                //String[] cmds = {"ssh",hostname,"signalp","-t","gram-","-"};
                                commands.add(pt);
                                commands.add(Arrays.asList(cmds));
                            }
                        }

                        break;
                    }
                } catch (Exception ex) {
                    ex.printStackTrace();
                }

                Runnable run = new Runnable() {
                    @Override
                    public void run() {
                        try {
                            geneset.zipfilesystem.close();
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                        ;
                    }
                };

                NativeRun nr = new NativeRun(run);
                nr.runProcessBuilder("signalp", commands, new Object[3], false, run, false);
            } catch (IOException e1) {
                e1.printStackTrace();
            }
        }
    }));
    windowmenu.getItems().add(runsignalp);

    MenuItem runtransm = new MenuItem("Run TransM");
    runtransm.setOnAction(actionEvent -> SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            try {
                Serifier ser = new Serifier();
                Set<String> selspec = getSelspec(null, geneset.getSpecies(), null);

                JTextField host = new JTextField("localhost");
                JOptionPane.showMessageDialog(null, host);

                String username = System.getProperty("user.name");
                String hostname = host.getText();

                /*Path[] pt = null;
                JFileChooser fc = new JFileChooser();
                fc.setFileSelectionMode( JFileChooser.DIRECTORIES_ONLY );
                if( fc.showSaveDialog(null) == JFileChooser.APPROVE_OPTION ) {
                   pt = new Path[3];
                   pt[2] = fc.getSelectedFile().toPath();
                }*/

                List<Object> commands = new ArrayList<>();
                //commands.add(genexyplotaction)

                try {
                    Map<String, String> env = new HashMap<>();
                    env.put("create", "true");

                    String uristr = "jar:" + geneset.zippath.toUri();
                    URI zipuri = URI.create(uristr /*.replace("file://", "file:")*/ );

                    geneset.zipfilesystem = FileSystems.newFileSystem(geneset.zipuri, env);
                    for (Path root : geneset.zipfilesystem.getRootDirectories()) {
                        for (String spec : selspec) {
                            /*Path specdir = root.resolve(spec+".prodigal.fsa");
                            if( !Files.exists(specdir) ) {
                               if( spec.startsWith("MAT") ) {
                                  specdir = root.resolve(spec+".gbk.aa");
                               } else specdir = root.resolve("fn_"+spec+"_scaffolds.prodigal.fsa");
                            }*/

                            Stream<Gene> genestream = geneset.genelist.stream()
                                    .filter(gene -> spec.equals(gene.getSpecies())
                                            && (gene.tegeval.type == null || gene.tegeval.type.length() == 0));
                            ByteArrayOutputStream baos = new ByteArrayOutputStream();
                            BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(baos));
                            genestream.forEach(gene -> {
                                try {
                                    gene.writeGeneIdFasta(bw);
                                } catch (Exception e1) {
                                    e1.printStackTrace();
                                }
                            });
                            bw.close();
                            baos.close();
                            String seqs = baos.toString();
                            seqs = seqs.replace('*', 'X');
                            byte[] bb = seqs.getBytes();
                            Path sigout = root.resolve(spec + ".tm");
                            Object[] pt = new Object[] { bb, sigout, null };
                            if (hostname.equals("localhost")) {
                                String[] cmds = { "decodeanhmm", "-f", "/opt/tmhmm-2.0c/lib/TMHMM2.0.options",
                                        "-modelfile", "/opt/tmhmm-2.0c/lib/TMHMM2.0.model" };
                                commands.add(pt);
                                commands.add(Arrays.asList(cmds));
                            } else {
                                //Path p = Paths.get(spec+".tm");
                                //Files.copy(specdir, p, StandardCopyOption.REPLACE_EXISTING);

                                String[] cmds = { "ssh", hostname, "decodeanhmm", "-f",
                                        "/opt/tmhmm-2.0c/lib/TMHMM2.0.options", "-modelfile",
                                        "/opt/tmhmm-2.0c/lib/TMHMM2.0.model" };
                                commands.add(pt);
                                commands.add(Arrays.asList(cmds));
                            }
                        }

                        break;
                    }
                } catch (Exception ex) {
                    ex.printStackTrace();
                }

                Runnable run = () -> {
                    try {
                        geneset.zipfilesystem.close();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                    ;
                };

                NativeRun nr = new NativeRun(run);
                nr.runProcessBuilder("transm", commands, new Object[3], false, run, false);
            } catch (IOException e1) {
                e1.printStackTrace();
            }
        }
    }));
    windowmenu.getItems().add(runtransm);

    MenuItem runtrnascan = new MenuItem("tRNAscan");
    runtrnascan.setOnAction(actionEvent -> SwingUtilities.invokeLater(() -> {
        try {
            Serifier ser = new Serifier();
            Set<String> selspec = getSelspec(null, geneset.getSpecies(), null);

            JTextField host = new JTextField("localhost");
            JOptionPane.showMessageDialog(null, host);

            String username = System.getProperty("user.name");
            String hostname = host.getText();

            /*Path[] pt = null;
            JFileChooser fc = new JFileChooser();
            fc.setFileSelectionMode( JFileChooser.DIRECTORIES_ONLY );
            if( fc.showSaveDialog(null) == JFileChooser.APPROVE_OPTION ) {
            pt = new Path[3];
            pt[2] = fc.getSelectedFile().toPath();
            }*/

            List<Object> commands = new ArrayList<>();
            //commands.add(genexyplotaction)

            try {
                Map<String, String> env = new HashMap<>();
                env.put("create", "true");

                String uristr = "jar:" + geneset.zippath.toUri();
                URI zipuri = URI.create(uristr /*.replace("file://", "file:")*/ );

                geneset.zipfilesystem = FileSystems.newFileSystem(geneset.zipuri, env);
                for (Path root : geneset.zipfilesystem.getRootDirectories()) {
                    for (String spec : selspec) {
                        Path specdir = root.resolve(spec + ".fna");
                        if (!Files.exists(specdir)) {
                            if (spec.startsWith("MAT")) {
                                specdir = root.resolve(spec + ".gbk.fna");
                            } else
                                specdir = root.resolve("fn_" + spec + "_scaffolds.fastg");
                        }

                        System.err.println(Files.exists(specdir));

                        Path sigout = root.resolve("trnas.txt");
                        if (hostname.equals("localhost1")) {
                            Path[] pt = new Path[] { specdir, sigout, null };
                            String[] cmds = { "/usr/local/bin/tRNAscan-SE", "-B", "-" };
                            commands.add(pt);
                            commands.add(Arrays.asList(cmds));
                        } else {
                            Path[] pt = new Path[] { null, sigout, null };
                            Path p = Paths.get(spec + ".trnascan");
                            Files.copy(specdir, p, StandardCopyOption.REPLACE_EXISTING);

                            List<String> lcmd;
                            if (hostname.equals("localhost")) {
                                //String[] cmds = {"/usr/local/bin/trnascan-1.4", spec + ".trnascan"};
                                String[] cmds = { "/usr/local/bin/tRNAscan-SE", "-B", spec + ".trnascan" };
                                lcmd = Arrays.asList(cmds);
                            } else {
                                String[] cmds = { "scp", spec + ".trnascan", hostname + ":~", ";", "ssh",
                                        hostname, "trnascan-1.4", spec + ".trnascan" };
                                lcmd = Arrays.asList(cmds);
                                //String[] cmds = {"ssh",hostname,"tRNAscan-SE","-B","-"};
                            }

                            commands.add(pt);
                            commands.add(lcmd);
                        }
                    }

                    break;
                }
            } catch (Exception ex) {
                ex.printStackTrace();
            }

            Runnable run = () -> {
                try {
                    geneset.zipfilesystem.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
                ;
            };

            NativeRun nr = new NativeRun(run);
            nr.runProcessBuilder("tRNAscan", commands, new Object[3], false, run, false);
        } catch (IOException e1) {
            e1.printStackTrace();
        }
    }));
    windowmenu.getItems().add(runtrnascan);

    Menu select = new Menu("Select");
    MenuItem breakpointselAction = new MenuItem("Select breakpoints");
    breakpointselAction.setOnAction(actionEvent -> {
        String spec = syncolorcomb.getSelectionModel().getSelectedItem();

        int rr = 0;
        for (Gene g : geneset.genelist) {
            if (!spec.equals(g.getSpecies()) && g.getSpecies().contains("eggert")) {
                Tegeval tv2 = g.tegeval;
                Annotation n2 = tv2.getNext();
                Annotation p2 = tv2.getPrevious();

                GeneGroup gg = g.getGeneGroup();

                if (gg.getName().contains("rhodane")) {
                    System.err.println();
                }

                Teginfo ti = gg.getGenes(spec);
                int msimcount = 0;
                if (ti != null) {
                    for (Tegeval tv1 : ti.tset) {
                        int simcount = 0;

                        Annotation n = tv1.getNext();
                        Annotation p = tv1.getPrevious();

                        GeneGroup ggg = tv1.getGene().getGeneGroup();
                        if (n2 != null) {
                            if (ggg == n2.getGene().getGeneGroup()) {
                                simcount++;
                            }

                            Annotation nn2 = n2.getNext();
                            if (nn2 != null) {
                                if (ggg == nn2.getGene().getGeneGroup()) {
                                    simcount++;
                                }
                            }
                        }

                        if (p2 != null) {
                            if (ggg == p2.getGene().getGeneGroup()) {
                                simcount++;
                            }

                            Annotation pp2 = p2.getPrevious();
                            if (pp2 != null) {
                                if (ggg == pp2.getGene().getGeneGroup()) {
                                    simcount++;
                                }
                            }
                        }

                        if (n != null) {
                            GeneGroup ngg = n.getGene().getGeneGroup();

                            if (ngg == tv2.getGene().getGeneGroup()) {
                                simcount++;
                            }

                            if (n2 != null) {
                                if (ngg == n2.getGene().getGeneGroup()) {
                                    simcount++;
                                }
                            }

                            if (p2 != null) {
                                if (ngg == p2.getGene().getGeneGroup()) {
                                    simcount++;
                                }
                            }

                            Annotation nn = n.getNext();
                            if (nn != null) {
                                ngg = nn.getGene().getGeneGroup();

                                if (ngg == tv2.getGene().getGeneGroup()) {
                                    simcount++;
                                }

                                if (n2 != null) {
                                    if (ngg == n2.getGene().getGeneGroup()) {
                                        simcount++;
                                    }
                                }

                                if (p2 != null) {
                                    if (ngg == p2.getGene().getGeneGroup()) {
                                        simcount++;
                                    }
                                }
                            }
                        }

                        if (p != null) {
                            GeneGroup pgg = p.getGene().getGeneGroup();

                            if (pgg == tv2.getGene().getGeneGroup()) {
                                simcount++;
                            }

                            if (n2 != null) {
                                if (pgg == n2.getGene().getGeneGroup()) {
                                    simcount++;
                                }
                            }

                            if (p2 != null) {
                                if (pgg == p2.getGene().getGeneGroup()) {
                                    simcount++;
                                }
                            }

                            Annotation pp = p.getPrevious();
                            if (pp != null) {
                                pgg = pp.getGene().getGeneGroup();

                                if (pgg == tv2.getGene().getGeneGroup()) {
                                    simcount++;
                                }

                                if (n2 != null) {
                                    if (pgg == n2.getGene().getGeneGroup()) {
                                        simcount++;
                                    }
                                }

                                if (p2 != null) {
                                    if (pgg == p2.getGene().getGeneGroup()) {
                                        simcount++;
                                    }
                                }
                            }
                        }

                        //double rat = GeneCompare.invertedGradientRatio(spec, contigs, -1.0, gg, tv);
                        if (simcount >= msimcount) {
                            //tv = tv1;
                            msimcount = simcount;
                        }

                        //double ratio = GeneCompare.invertedGradientRatio(spec, contigs, -1.0, gg, tv);
                        //GeneCompare.gradientColor();
                    }

                    if (msimcount < 2) {
                        gtable.getSelectionModel().select(g);
                    }
                }
            }
            rr++;
        }
        /*List<Sequence> contigs = geneset.speccontigMap.get( spec );
        for( Sequence c : contigs ) {
           for( Annotation ann : c.annset ) {
          Tegeval tv = (Tegeval)ann;
                  
           }
        }*/
    });
    MenuItem saveselAction = new MenuItem("Save selection");
    saveselAction.setOnAction(actionEvent -> {
        /*int[] rr = table.getSelectedRows();
        if( rr.length > 0 ) {
           String val = Integer.toString( table.convertRowIndexToModel(rr[0]) );
           for( int i = 1; i < rr.length; i++ ) {
              val += ","+table.convertRowIndexToModel(rr[i]);
           }
           String selname = JOptionPane.showInputDialog("Selection name");
           if( comp instanceof Applet ) {
              try {
          ((GeneSetHead)comp).saveSel( selname, val);
              } catch (Exception e1) {
          e1.printStackTrace();
              }
           }
        }*/
    });
    select.getItems().add(breakpointselAction);
    select.getItems().add(saveselAction);
    select.getItems().add(new SeparatorMenuItem());

    MenuItem showall = new MenuItem("Show all");
    showall.setOnAction(actionEvent -> {
        genefilterset.clear();
        updateFilter(table, label);
    });
    select.getItems().add(showall);
    MenuItem croptosel = new MenuItem("Crop to selection");
    croptosel.setOnAction(actionEvent -> {
        Set<GeneGroup> selitems = new HashSet<>(table.getSelectionModel().getSelectedItems());
        filteredData.setPredicate(p -> selitems.contains(p));
    });
    select.getItems().add(croptosel);
    MenuItem croptoinvsel = new MenuItem("Crop to inverted selection");
    croptoinvsel.setOnAction(actionEvent -> {
        genefilterset.clear();
        for (int i = 0; i < table.getItems().size(); i++) {
            if (!table.getSelectionModel().isSelected(i)) {
                genefilterset.add(i);
            }
        }
        updateFilter(table, label);
    });
    select.getItems().add(croptoinvsel);
    MenuItem removesel = new MenuItem("Remove selection");
    removesel.setOnAction(actionEvent -> {
        // genefilterset.clear();
        //int[] rr = table.getSelectedRows();
        if (genefilterset.isEmpty()) {
            Set<Integer> ii = new HashSet<Integer>();
            for (int r : table.getSelectionModel().getSelectedIndices())
                ii.add(r);
            for (int i = 0; i < geneset.genelist.size(); i++) {
                if (!ii.contains(i))
                    genefilterset.add(i);
            }
        } else {
            for (int r : table.getSelectionModel().getSelectedIndices()) {
                //int mr = table.convertRowIndexToModel(r);
                genefilterset.remove(r);
            }
        }
        updateFilter(table, label);
    });
    select.getItems().add(removesel);
    MenuItem invsel = new MenuItem("Invert selection");
    invsel.setOnAction(actionEvent -> {
        ObservableList<GeneGroup> selitems = table.getSelectionModel().getSelectedItems();
        List<GeneGroup> newsel = new ArrayList<>(filteredData);
        newsel.removeAll(selitems);

        table.getSelectionModel().clearSelection();
        newsel.stream().forEach(gg -> table.getSelectionModel().select(gg));

        // genefilterset.clear();
        //int[] rr = table.getSelectedRows();
        /*Set<Integer> iset = new HashSet<>();
        for( int r : table.getSelectionModel().getSelectedIndices() ) {
           iset.add( r );
        }
        table.getSelectionModel().clearSelection();
        for (int r = 0; r < table.getItems().size(); r++) {
           if( !iset.contains(r) ) table.getSelectionModel().select(r);
           /*if (table.isRowSelected(r))
          table.removeRowSelectionInterval(r, r);
           else
          table.addRowSelectionInterval(r, r);
        }*/
    });
    select.getItems().add(invsel);
    //select.addSeparator();
    select.getItems().add(new SeparatorMenuItem());
    MenuItem selsinglemult = new MenuItem("Select single copy genes found in multiple strains");
    selsinglemult.setOnAction(actionEvent -> {
        Set<String> specset = getSelspec(GeneSetHead.this, geneset.specList);
        for (GeneGroup gg : geneset.allgenegroups) {
            Set<String> checkspec = new HashSet<String>(gg.species.keySet());
            checkspec.retainAll(specset);
            if (gg.getCommonTag() == null && checkspec.size() > 1
                    && gg.getTegevals().size() == gg.species.size()) {//gg.getTegevals(checkspec).size() == checkspec.size() ) {
                table.getSelectionModel().select(gg);
                //table.setro
            }
        }
    });
    select.getItems().add(selsinglemult);
    MenuItem selsinglemultstrain = new MenuItem(
            "Select single copy genes in accessory genome of multiple strains");
    selsinglemultstrain.setOnAction(actionEvent -> {
        Set<String> specset = getSelspec(GeneSetHead.this, geneset.specList);
        for (GeneGroup gg : geneset.allgenegroups) {
            Set<String> checkspec = new HashSet<String>(gg.species.keySet());
            checkspec.retainAll(specset);
            if (gg.getCommonTag() == null && checkspec.size() > 1 && checkspec.size() < specset.size()
                    && gg.getTegevals().size() == gg.species.size()) {//gg.getTegevals(checkspec).size() == checkspec.size() ) {
                table.getSelectionModel().select(gg);
                //table.setro
            }
        }
    });
    select.getItems().add(selsinglemultstrain);

    MenuItem selsinglecopygenes = new MenuItem("Select single copy genes");
    selsinglecopygenes.setOnAction(actionEvent -> {
        Set<String> specset = getSelspec(GeneSetHead.this, geneset.specList);
        for (GeneGroup gg : geneset.allgenegroups) {
            if (gg.getTegevals().size() == gg.species.size()) {
                table.getSelectionModel().select(gg);
                //table.setro
            }
        }
    });
    select.getItems().add(selsinglecopygenes);
    MenuItem selduplgenes = new MenuItem("Select duplicated genes");
    selduplgenes.setOnAction(actionEvent -> {
        for (GeneGroup gg : geneset.allgenegroups) {
            int cnt = 0;
            for (String spec : gg.species.keySet()) {
                Teginfo ti = gg.species.get(spec);
                if (ti.tset.size() == 2) {
                    List<Tegeval> ta = new ArrayList<Tegeval>(ti.tset);
                    if (ta.get(0).getNext() == ta.get(1) || ta.get(0).getPrevious() == ta.get(1))
                        cnt++;
                }
            }
            if ((float) cnt / (float) gg.species.size() > 0.7) {
                table.getSelectionModel().select(gg);
            }
        }
    });
    select.getItems().add(selduplgenes);
    MenuItem seltriplgenes = new MenuItem("Select triplicated genes");
    seltriplgenes.setOnAction(actionEvent -> {
        for (GeneGroup gg : geneset.allgenegroups) {
            int cnt = 0;
            for (String spec : gg.species.keySet()) {
                Teginfo ti = gg.species.get(spec);
                if (ti.tset.size() == 3) {
                    List<Tegeval> ta = new ArrayList<Tegeval>(ti.tset);
                    if ((ta.get(0).getNext() == ta.get(1) || ta.get(0).getPrevious() == ta.get(1))
                            && (ta.get(1).getNext() == ta.get(2) || ta.get(1).getPrevious() == ta.get(2)))
                        cnt++;
                }
            }
            if ((float) cnt / (float) gg.species.size() > 0.7) {
                table.getSelectionModel().select(gg);
            }
        }
    });
    select.getItems().add(seltriplgenes);

    MenuItem selplasmidgenes = new MenuItem("Select plasmid genes");
    selplasmidgenes.setOnAction(actionEvent -> {
        for (GeneGroup gg : geneset.allgenegroups) {
            if (gg.isOnAnyPlasmid()) {
                table.getSelectionModel().select(gg);
            }
            /*int cnt = 0;
            for( String spec : gg.species.keySet() ) {
               Teginfo ti = gg.species.get( spec );
               if( ti.tset.size() == 3 ) {
             List<Tegeval> ta = new ArrayList<Tegeval>( ti.tset );
             if( (ta.get(0).getNext() == ta.get(1) || ta.get(0).getPrevious() == ta.get(1)) && (ta.get(1).getNext() == ta.get(2) || ta.get(1).getPrevious() == ta.get(2))) cnt++;
               }
            }
            if( (float)cnt / (float)gg.species.size() > 0.7 ) {
               int r = table.convertRowIndexToView(gg.index);
               table.addRowSelectionInterval(r, r);
            }*/
        }
    });
    select.getItems().add(selplasmidgenes);

    MenuItem selectphagegenes = new MenuItem("Select phage genes");
    selectphagegenes.setOnAction(actionEvent -> {
        for (GeneGroup gg : geneset.allgenegroups) {
            if (gg.isInAnyPhage()) {
                table.getSelectionModel().select(gg);
            }
            /*int cnt = 0;
            for( String spec : gg.species.keySet() ) {
               Teginfo ti = gg.species.get( spec );
               if( ti.tset.size() == 3 ) {
             List<Tegeval> ta = new ArrayList<Tegeval>( ti.tset );
             if( (ta.get(0).getNext() == ta.get(1) || ta.get(0).getPrevious() == ta.get(1)) && (ta.get(1).getNext() == ta.get(2) || ta.get(1).getPrevious() == ta.get(2))) cnt++;
               }
            }
            if( (float)cnt / (float)gg.species.size() > 0.7 ) {
               int r = table.convertRowIndexToView(gg.index);
               table.addRowSelectionInterval(r, r);
            }*/
        }
    });
    select.getItems().add(selectphagegenes);
    select.getItems().add(new SeparatorMenuItem());
    MenuItem selectsharingaction = new MenuItem("Select sharing");
    selectsharingaction.setOnAction(actionEvent -> {
        RadioButton panbtn = new RadioButton("Pan");
        RadioButton corebtn = new RadioButton("Core");
        RadioButton blehbtn = new RadioButton("Only in");
        ToggleGroup tg = new ToggleGroup();
        panbtn.setToggleGroup(tg);
        corebtn.setToggleGroup(tg);
        blehbtn.setToggleGroup(tg);

        HBox sp = new HBox();
        sp.getChildren().add(panbtn);
        sp.getChildren().add(corebtn);
        sp.getChildren().add(blehbtn);
        Scene scene = new Scene(sp);

        //FlowLayout flowlayout = new FlowLayout();
        final JFXPanel c = new JFXPanel();
        c.setScene(scene);

        /*Group  root  =  new  Group();
          Scene  scene  =  new  Scene(root, javafx.scene.paint.Color.ALICEBLUE);
          root.getChildren().add(panbtn);
          root.getChildren().add(corebtn);
          root.getChildren().add(blehbtn);
        JFXPanel fxpanel = new JFXPanel();
        fxpanel.setScene( scene );*/
        //bg.add( panbtn );
        //bg.add( corebtn );
        //bg.add( blehbtn );
        corebtn.setSelected(true);
        //Object[] objs = new Object[] { panbtn, corebtn };
        //JOptionPane.showMessageDialog( geneset, objs, "Select id types", JOptionPane.PLAIN_MESSAGE );

        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                final List<String> species = geneset.getSpecies();
                TableModel model = new TableModel() {
                    @Override
                    public int getRowCount() {
                        return species.size();
                    }

                    @Override
                    public int getColumnCount() {
                        return 1;
                    }

                    @Override
                    public String getColumnName(int columnIndex) {
                        return null;
                    }

                    @Override
                    public Class<?> getColumnClass(int columnIndex) {
                        return String.class;
                    }

                    @Override
                    public boolean isCellEditable(int rowIndex, int columnIndex) {
                        return false;
                    }

                    @Override
                    public Object getValueAt(int rowIndex, int columnIndex) {
                        return species.get(rowIndex);
                    }

                    @Override
                    public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
                    }

                    @Override
                    public void addTableModelListener(TableModelListener l) {
                    }

                    @Override
                    public void removeTableModelListener(TableModelListener l) {
                    }
                };
                JTable table = new JTable(model);
                table.getSelectionModel().setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
                JScrollPane scroll = new JScrollPane(table);

                Object[] objs = new Object[] { scroll, c };
                JOptionPane.showMessageDialog(comp, objs);

                final Set<String> specs = new HashSet<String>();
                int[] rr = table.getSelectedRows();
                for (int r : rr) {
                    String spec = (String) table.getValueAt(r, 0);
                    specs.add(spec);
                }

                Platform.runLater(new Runnable() {
                    public void run() {
                        for (GeneGroup gg : geneset.allgenegroups) {
                            if (blehbtn.isSelected()) {
                                Set<String> ss = new HashSet<String>(gg.species.keySet());
                                ss.removeAll(specs);
                                if (ss.size() == 0) {
                                    GeneSetHead.this.table.getSelectionModel().select(gg);
                                }
                            } else if (gg.species.keySet().containsAll(specs)
                                    && (panbtn.isSelected() || specs.size() == gg.species.size())) {
                                GeneSetHead.this.table.getSelectionModel().select(gg);
                            }
                        }
                    }
                });
            }
        });
    });
    select.getItems().add(selectsharingaction);
    MenuItem selectdirtyaction = new MenuItem("Select dirty");
    selectdirtyaction.setOnAction(actionEvent -> {
        if (!isGeneview()) {
            int i = 0;
            for (GeneGroup gg : geneset.allgenegroups) {
                if (gg.containsDirty()) {
                    table.getSelectionModel().select(gg);
                }
                i++;
            }
        }
    });
    select.getItems().add(selectdirtyaction);
    MenuItem selectdesignationaction = new MenuItem("Select designation");
    selectdesignationaction.setOnAction(actionEvent -> {
        JComboBox<String> descombo = new JComboBox<String>(
                geneset.deset.toArray(new String[geneset.deset.size()]));
        descombo.insertItemAt("", 0);
        descombo.setSelectedIndex(0);

        JOptionPane.showMessageDialog(GeneSetHead.this, descombo);
        String seldes = (String) descombo.getSelectedItem();
        if (!isGeneview()) {
            int i = 0;
            for (GeneGroup gg : geneset.allgenegroups) {
                if (gg.genes != null)
                    for (Gene g : gg.genes) {
                        if (seldes.equals(g.tegeval.designation)) {
                            table.getSelectionModel().select(gg);
                        }
                    }
                i++;
            }
        }
    });
    select.getItems().add(selectdesignationaction);

    MenuItem blastselect = new MenuItem("Blast select");
    blastselect.setOnAction(actionEvent -> SwingUtilities.invokeLater(() -> blast(false)));
    select.getItems().add(blastselect);

    MenuItem blastxselect = new MenuItem("Blastx select");
    blastxselect.setOnAction(actionEvent -> SwingUtilities.invokeLater(() -> blast(true)));
    select.getItems().add(blastxselect);

    MenuItem blastnselect = new MenuItem("Blastn select");
    blastnselect.setOnAction(actionEvent -> SwingUtilities.invokeLater(() -> blastn(true)));
    select.getItems().add(blastnselect);

    MenuItem blastsearch = new MenuItem("Blastn search");
    blastsearch.setOnAction(actionEvent -> SwingUtilities.invokeLater(() -> blastn(false)));
    select.getItems().add(blastsearch);

    menubar.getMenus().add(file);
    menubar.getMenus().add(edit);
    menubar.getMenus().add(view);
    menubar.getMenus().add(sequencemenu);
    menubar.getMenus().add(windowmenu);
    menubar.getMenus().add(select);
    menubar.getMenus().add(help);

    if (comp != null) {
        final Window window = SwingUtilities.windowForComponent(comp);
        initFSKeyListener(window);
        if (comp instanceof JFrame || window instanceof JFrame) {
            JFrame frame = (JFrame) (window == null ? comp : window);
            if (!frame.isResizable())
                frame.setResizable(true);

            frame.addKeyListener(keylistener);
            frame.setJMenuBar(jmenubar);
        }
    }

    final Button jb = new Button("Atlas");
    jb.setOnAction(event -> {
        try {
            URL url = new URL("file:///home/sigmar/workspace/distann/bin/circle.html");
            GeneSetHead.this.getAppletContext().showDocument(url, "_blank");
        } catch (MalformedURLException e1) {
            e1.printStackTrace();
        }
    });

    try {
        newSoft(jb, comp, genetable, upper, lower, toolbar, btoolbar, GeneSetHead.this, selcomb);
    } catch (IOException e) {
        e.printStackTrace();
    }
    if (comp != null) {
        if (comp instanceof Applet)
            try {
                ((GeneSetHead) comp).saveSel(null, null);
            } catch (NoSuchMethodError | Exception e1) {
                e1.printStackTrace();
            }
        //comp.add( cc );
    }
}

From source file:org.ut.biolab.medsavant.client.view.dialog.SavantExportForm.java

private void exportButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_exportButtonActionPerformed

    //exportButton.setEnabled(false);
    //chooseFileButton.setEnabled(false);
    //for (JCheckBox box : checkBoxes) {
    //    box.setEnabled(false);
    //}//from w  w w . j a v  a  2 s  . c om

    progressDialog = new JDialog();
    progressDialog.setTitle("Show in Savant");
    JPanel p = new JPanel();
    p.setPreferredSize(new Dimension(300, 100));
    p.setLayout(new BorderLayout());
    p.add(new WaitPanel("Exporting Savant Project"));
    progressDialog.getContentPane().add(p);
    progressDialog.pack();
    progressDialog.setLocationRelativeTo(null);
    this.setVisible(false);
    progressDialog.setVisible(true);

    new MedSavantWorker<Void>("SavantExportForm") {
        @Override
        protected void showProgress(double fraction) {
            throw new UnsupportedOperationException("Not supported yet.");
        }

        @Override
        protected void showSuccess(Void result) {
            throw new UnsupportedOperationException("Not supported yet.");
        }

        @Override
        protected Void doInBackground() throws Exception {
            export();
            return null;
        }
    }.execute();

}

From source file:renderer.DependencyGrapher.java

/**
 * create an instance of a simple graph in two views with controls to
 * demo the features./*from  w w w.  j  a va2 s  .c  om*/
 * 
 */
public DependencyGrapher() {

    // create a simple graph for the demo
    final DependencyDirectedSparceMultiGraph<String, Number> graph = createGraph(); //TestGraphs.getOneComponentGraph();

    // the preferred sizes for the two views

    // create one layout for the graph
    final FRLayout2<String, Number> layout = new FRLayout2<String, Number>(graph);
    layout.setMaxIterations(500);

    VisualizationModel<String, Number> vm = new DefaultVisualizationModel<String, Number>(layout,
            preferredSize1);

    Transformer<Number, String> stringer = new Transformer<Number, String>() {
        public String transform(Number e) {
            if (graph.getEdgeAttributes(e) != null) {
                return graph.getEdgeAttributes(e).toString();
            }
            return null;
        }
    };
    // create 2 views that share the same model
    final VisualizationViewer<String, Number> vv = new VisualizationViewer<String, Number>(vm, preferredSize1);
    vv.setBackground(Color.white);
    vv.getRenderContext().setEdgeLabelTransformer(stringer);
    vv.getRenderContext().setEdgeDrawPaintTransformer(
            new PickableEdgePaintTransformer<String, Number>(vv.getPickedEdgeState(), Color.black, Color.cyan));
    vv.getRenderContext().setVertexFillPaintTransformer(
            new PickableVertexPaintTransformer<String>(vv.getPickedVertexState(), Color.red, Color.yellow));
    vv.getRenderContext().setVertexLabelTransformer(new ToStringLabeller<String>());
    vv.getRenderer().getVertexLabelRenderer().setPosition(Renderer.VertexLabel.Position.AUTO);

    // add default listener for ToolTips
    vv.setVertexToolTipTransformer(new ToStringLabeller<String>());

    //      ToolTipManager.sharedInstance().setDismissDelay(10000);

    Container content = getContentPane();
    Container panel = new JPanel(new BorderLayout());

    GraphZoomScrollPane gzsp = new GraphZoomScrollPane(vv);
    panel.add(gzsp);

    helpDialog = new JDialog();
    helpDialog.getContentPane().add(new JLabel(instructions));

    RenderContext<String, Number> rc = vv.getRenderContext();
    AnnotatingGraphMousePlugin annotatingPlugin = new AnnotatingGraphMousePlugin(rc);
    // create a GraphMouse for the main view
    // 
    final AnnotatingModalGraphMouse graphMouse = new AnnotatingModalGraphMouse(rc, annotatingPlugin);
    vv.setGraphMouse(graphMouse);
    vv.addKeyListener(graphMouse.getModeKeyListener());

    final ScalingControl scaler = new CrossoverScalingControl();

    JButton filterReset = new JButton("Reset");
    filterReset.addActionListener(new ActionListener() {

        public void actionPerformed(ActionEvent e) {
            vv.getModel().setGraphLayout(layout);
        }
    });
    JButton filterFilter = new JButton("Filter");
    filterReset.addActionListener(new ActionListener() {

        public void actionPerformed(ActionEvent e) {
            vv.getModel().setGraphLayout(layout);
        }
    });
    JRadioButton filterDirectionInOut = new JRadioButton("In/Out");
    filterDirectionInOut.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            System.out.println("Dependency Direction: " + EdgeType.IN_OUT);
            _filterEdgeDirection = EdgeType.IN_OUT;
            filterLayout = getNewLayout(graph, layout);
            vv.getModel().setGraphLayout(filterLayout);
        }

    });
    JRadioButton filterDirectionIn = new JRadioButton("In");
    filterDirectionIn.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            System.out.println("Dependency Direction: " + EdgeType.IN);
            _filterEdgeDirection = EdgeType.IN;
            filterLayout = getNewLayout(graph, layout);
            vv.getModel().setGraphLayout(filterLayout);
        }

    });
    JRadioButton filterDirectionOut = new JRadioButton("Out");
    filterDirectionOut.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            System.out.println("Dependency Direction: " + EdgeType.OUT);
            _filterEdgeDirection = EdgeType.OUT;
            filterLayout = getNewLayout(graph, layout);
            vv.getModel().setGraphLayout(filterLayout);
        }

    });
    ButtonGroup filterRadios = new ButtonGroup();
    filterRadios.add(filterDirectionInOut);
    filterRadios.add(filterDirectionIn);
    filterRadios.add(filterDirectionOut);
    filterRadios.setSelected(filterDirectionInOut.getModel(), true);

    JComboBox modeBox = graphMouse.getModeComboBox();
    modeBox.setSelectedItem(ModalGraphMouse.Mode.PICKING);

    final JComboBox filterBox = new JComboBox(graph.getVertices().toArray());
    filterBox.addActionListener(new ActionListener() {

        public void actionPerformed(ActionEvent e) {
            _filterChoice = filterBox.getSelectedItem().toString();
            System.out.println(_filterChoice);
            filterLayout = getNewLayout(graph, layout);
            vv.getModel().setGraphLayout(filterLayout);
        }
    });

    JButton help = new JButton("Help");
    help.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            helpDialog.pack();
            helpDialog.setVisible(true);
        }
    });

    JPanel controls = new JPanel();

    JPanel modeControls = new JPanel();
    modeControls.setBorder(BorderFactory.createTitledBorder("Mouse Mode"));
    modeControls.add(graphMouse.getModeComboBox());
    controls.add(modeControls);

    JPanel annotationControlPanel = new JPanel();
    annotationControlPanel.setBorder(BorderFactory.createTitledBorder("Annotation Controls"));

    AnnotationControls annotationControls = new AnnotationControls(annotatingPlugin);

    annotationControlPanel.add(annotationControls.getAnnotationsToolBar());
    controls.add(annotationControlPanel);

    JPanel helpControls = new JPanel();
    helpControls.setBorder(BorderFactory.createTitledBorder("Help"));
    helpControls.add(help);
    controls.add(helpControls);

    JPanel filterControls = new JPanel();
    filterControls.setBorder(BorderFactory.createTitledBorder("Filter"));
    filterControls.add(filterBox);
    filterControls.add(filterDirectionInOut);
    filterControls.add(filterDirectionIn);
    filterControls.add(filterDirectionOut);
    filterControls.add(filterReset);
    controls.add(filterControls);

    content.add(panel);
    content.add(controls, BorderLayout.SOUTH);

}

From source file:uk.ac.ucl.cs.cmic.giftcloud.uploadapp.ConfigurationDialog.java

ConfigurationDialog(final Component owner, final UploaderGuiController controller,
        final GiftCloudPropertiesFromApplication giftCloudProperties, final ProjectListModel projectListModel,
        final ResourceBundle resourceBundle, final GiftCloudDialogs giftCloudDialogs,
        final GiftCloudReporter reporter) {
    this.controller = controller;
    this.giftCloudProperties = giftCloudProperties;
    this.projectListModel = projectListModel;
    this.resourceBundle = resourceBundle;
    this.giftCloudDialogs = giftCloudDialogs;
    this.reporter = reporter;
    temporaryDropDownListModel = new TemporaryProjectListModel(projectListModel,
            giftCloudProperties.getLastProject());
    componentToCenterDialogOver = owner;

    dialog = new JDialog();
    dialog.setModal(true);//from   ww w  .  j  a v a 2 s  .  co m
    dialog.setResizable(false);

    // Call custom dialog close code when the close button is clicked
    dialog.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
    dialog.addWindowListener(new WindowAdapter() {
        public void windowClosing(WindowEvent ev) {
            closeDialog();
        }
    });

    dialog.setLocationRelativeTo(componentToCenterDialogOver); // without this, appears at TLHC rather then center of parent or screen
    dialog.setTitle(resourceBundle.getString("configurationDialogTitle"));

    final GridBagConstraints sectionTitleConstraints = new GridBagConstraints();
    sectionTitleConstraints.gridx = 0;
    sectionTitleConstraints.gridy = 1;
    sectionTitleConstraints.gridwidth = 2;
    sectionTitleConstraints.weightx = 1;
    sectionTitleConstraints.weighty = 1;
    sectionTitleConstraints.anchor = GridBagConstraints.CENTER;
    sectionTitleConstraints.fill = GridBagConstraints.HORIZONTAL;

    final GridBagConstraints labelConstraints = new GridBagConstraints();
    labelConstraints.gridx = 0;
    labelConstraints.gridy = 0;
    labelConstraints.gridwidth = 1;
    labelConstraints.weightx = 1;
    labelConstraints.weighty = 1;
    labelConstraints.anchor = GridBagConstraints.LINE_START;
    labelConstraints.fill = GridBagConstraints.NONE;

    final GridBagConstraints inputConstraints = new GridBagConstraints();
    inputConstraints.gridx = 1;
    inputConstraints.gridy = 0;
    inputConstraints.gridwidth = 1;
    inputConstraints.weightx = 1;
    inputConstraints.weighty = 1;
    inputConstraints.anchor = GridBagConstraints.LINE_END;
    inputConstraints.fill = GridBagConstraints.HORIZONTAL;

    GridBagConstraints separatorConstraint = new GridBagConstraints();
    separatorConstraint.weightx = 1.0;
    separatorConstraint.fill = GridBagConstraints.HORIZONTAL;
    separatorConstraint.gridwidth = GridBagConstraints.REMAINDER;

    // The panel containing the GIFT-Cloud server configuration
    final JPanel giftCloudServerPanel = new JPanel();
    {
        GridBagLayout projectUploadlayout = new GridBagLayout();
        giftCloudServerPanel.setLayout(projectUploadlayout);
        JLabel serverPanelLabel = new JLabel(resourceBundle.getString("configPanelServerConfig"),
                SwingConstants.CENTER);
        giftCloudServerPanel.add(serverPanelLabel, sectionTitleConstraints);

        // GIFT-Cloud server URL
        {
            labelConstraints.gridwidth = 1;
            labelConstraints.gridy = 2;
            final JLabel giftCloudServerLabel = new JLabel(resourceBundle.getString("giftCloudServerText"),
                    SwingConstants.RIGHT);
            giftCloudServerLabel.setToolTipText(resourceBundle.getString("giftCloudServerTextToolTipText"));
            giftCloudServerPanel.add(giftCloudServerLabel, labelConstraints);

            giftCloudServerText = new AutoFocusTextField(giftCloudProperties.getGiftCloudUrl().orElse(""),
                    textFieldLengthForGiftCloudServerUrl);
            inputConstraints.gridy = 2;
            giftCloudServerPanel.add(giftCloudServerText, inputConstraints);
        }

        // GIFT-Cloud username
        {
            labelConstraints.gridy = 3;
            final JLabel giftCloudUserNameLabel = new JLabel(resourceBundle.getString("giftCloudUsername"),
                    SwingConstants.RIGHT);
            giftCloudUserNameLabel.setToolTipText(resourceBundle.getString("giftCloudUsernameToolTipText"));
            giftCloudServerPanel.add(giftCloudUserNameLabel, labelConstraints);

            final Optional<String> serverUrl = giftCloudProperties.getLastUserName();
            final String initialServerText = serverUrl.isPresent() ? serverUrl.get() : "";
            giftCloudUsernameText = new AutoFocusTextField(initialServerText);
            inputConstraints.gridy = 3;
            giftCloudServerPanel.add(giftCloudUsernameText, inputConstraints);
        }

        // GIFT-Cloud password
        {
            labelConstraints.gridy = 4;
            final JLabel giftCloudPasswordLabel = new JLabel(resourceBundle.getString("giftCloudPassword"),
                    SwingConstants.RIGHT);
            giftCloudPasswordLabel.setToolTipText(resourceBundle.getString("giftCloudPasswordToolTipText"));
            giftCloudServerPanel.add(giftCloudPasswordLabel, labelConstraints);

            final Optional<char[]> password = giftCloudProperties.getLastPassword();
            final char[] initialPassword = password.isPresent() ? password.get() : "".toCharArray();
            giftCloudPasswordText = new JPasswordField(new String(initialPassword), 16); // Shouldn't create a String but there's no other way to initialize the password field
            inputConstraints.gridy = 4;
            giftCloudServerPanel.add(giftCloudPasswordText, inputConstraints);
        }

        // Project list
        {
            labelConstraints.gridy = 5;
            JLabel projectListLabel = new JLabel(resourceBundle.getString("giftCloudProjectLabelText"),
                    SwingConstants.RIGHT);
            giftCloudServerPanel.add(projectListLabel, labelConstraints);

            inputConstraints.gridy = 5;
            projectList = new BackwardsCompatibleComboBox();
            projectList.setEditable(false);
            projectList.setToolTipText(resourceBundle.getString("giftCloudProjectTooltip"));
            giftCloudServerPanel.add(projectList, inputConstraints);

            labelConstraints.gridx = 1;
            projectListWaitingLabel = new JLabel(resourceBundle.getString("giftCloudProjectWaitingLabelText"),
                    SwingConstants.RIGHT);
            giftCloudServerPanel.add(projectListWaitingLabel, labelConstraints);
            labelConstraints.gridx = 0;
        }

        // Subject prefix
        {
            labelConstraints.gridy = 6;
            JLabel subjectPrefixLabel = new JLabel(resourceBundle.getString("configPanelListenerSubjectPrefix"),
                    SwingConstants.RIGHT);
            subjectPrefixLabel
                    .setToolTipText(resourceBundle.getString("configPanelListenerSubjectPrefixTooltip"));
            giftCloudServerPanel.add(subjectPrefixLabel, labelConstraints);

            inputConstraints.gridy = 6;
            final Optional<String> subjectPrefixText = giftCloudProperties.getSubjectPrefix();
            subjectPrefixField = new AutoFocusTextField(subjectPrefixText.orElse(""));
            giftCloudServerPanel.add(subjectPrefixField, inputConstraints);
        }
    }

    // Local Dicom node configuration
    final JPanel listenerPanel = new JPanel();
    {
        GridBagLayout listenerPanellayout = new GridBagLayout();
        listenerPanel.setLayout(listenerPanellayout);
        JSeparator separator = new JSeparator();
        listenerPanel.add(separator, separatorConstraint);

        JLabel listenerPanelLabel = new JLabel(resourceBundle.getString("configPanelListenerConfig"),
                SwingConstants.CENTER);
        listenerPanel.add(listenerPanelLabel, sectionTitleConstraints);

        {
            labelConstraints.gridy = 2;
            JLabel listeningAETitleJLabel = new JLabel(resourceBundle.getString("configPanelListenerAe"),
                    SwingConstants.RIGHT);
            listeningAETitleJLabel.setToolTipText(resourceBundle.getString("configPanelListenerAeToolTip"));
            listenerPanellayout.setConstraints(listeningAETitleJLabel, labelConstraints);
            listenerPanel.add(listeningAETitleJLabel);

            inputConstraints.gridy = 2;
            final String listeningAETitleInitialText = giftCloudProperties.getListenerAETitle();
            listeningAETitleField = new AutoFocusTextField(listeningAETitleInitialText);
            listenerPanellayout.setConstraints(listeningAETitleField, inputConstraints);
            listenerPanel.add(listeningAETitleField);
        }
        {
            labelConstraints.gridy = 3;
            JLabel listeningPortJLabel = new JLabel(resourceBundle.getString("configPanelListenerPort"),
                    SwingConstants.RIGHT);
            listeningPortJLabel.setToolTipText(resourceBundle.getString("configPanelListenerPortToolTip"));
            listenerPanellayout.setConstraints(listeningPortJLabel, labelConstraints);
            listenerPanel.add(listeningPortJLabel);

            inputConstraints.gridy = 3;
            final int port = giftCloudProperties.getListeningPort();
            final String portValue = Integer.toString(port);
            listeningPortField = new AutoFocusTextField(portValue);
            listenerPanellayout.setConstraints(listeningPortField, inputConstraints);
            listenerPanel.add(listeningPortField);
        }
        {
            labelConstraints.gridy = 4;
            JLabel patientListExportFolderLabel = new JLabel(
                    resourceBundle.getString("configPanelListenerPatientListExportFolder"),
                    SwingConstants.RIGHT);
            patientListExportFolderLabel.setToolTipText(
                    resourceBundle.getString("configPanelListenerPatientListExportFolderTooltip"));
            listenerPanellayout.setConstraints(patientListExportFolderLabel, labelConstraints);
            listenerPanel.add(patientListExportFolderLabel);

            inputConstraints.gridy = 4;
            final Optional<String> patientListExportFolder = giftCloudProperties.getPatientListExportFolder();
            patientListExportFolderField = new AutoFocusTextField(patientListExportFolder.orElse(""));
            listenerPanellayout.setConstraints(patientListExportFolderField, inputConstraints);
            listenerPanel.add(patientListExportFolderField);
        }

        // Patient list spreadsheet password
        {
            labelConstraints.gridy = 5;
            final JLabel patientListSpreadsheetPasswordLabel = new JLabel(
                    resourceBundle.getString("configPanelListenerPatientListSpreadhsheetPassword"),
                    SwingConstants.RIGHT);
            patientListSpreadsheetPasswordLabel.setToolTipText(
                    resourceBundle.getString("configPanelListenerPatientListSpreadhsheetPasswordTooltip"));
            listenerPanel.add(patientListSpreadsheetPasswordLabel, labelConstraints);

            final Optional<char[]> password = giftCloudProperties.getPatientListPassword();
            final char[] initialPassword = password.isPresent() ? password.get() : "".toCharArray();
            patientListSpreadsheetPasswordField = new JPasswordField(new String(initialPassword), 16); // Shouldn't create a String but there's no other way to initialize the password field
            inputConstraints.gridy = 5;
            listenerPanel.add(patientListSpreadsheetPasswordField, inputConstraints);
        }
    }

    // Remote PACS configuration
    final JPanel remoteAEPanel = new JPanel();

    {
        GridBagLayout pacsPanellayout = new GridBagLayout();
        remoteAEPanel.setLayout(pacsPanellayout);

        JSeparator separator = new JSeparator();
        remoteAEPanel.add(separator, separatorConstraint);

        JLabel remotePanelLabel = new JLabel(resourceBundle.getString("pacsPanelListenerConfig"),
                SwingConstants.CENTER);
        remoteAEPanel.add(remotePanelLabel, sectionTitleConstraints);

        {
            labelConstraints.gridy = 2;
            JLabel remoteAeTitleLabel = new JLabel(resourceBundle.getString("configPanelPacsAeTitle"),
                    SwingConstants.RIGHT);
            remoteAeTitleLabel.setToolTipText(resourceBundle.getString("configPanelPacsAeTitleTooltip"));
            remoteAEPanel.add(remoteAeTitleLabel, labelConstraints);

            final Optional<String> pacsAeTitle = giftCloudProperties.getPacsAeTitle();
            remoteAETitleField = new AutoFocusTextField(pacsAeTitle.isPresent() ? pacsAeTitle.get() : "");
            inputConstraints.gridy = 2;
            remoteAEPanel.add(remoteAETitleField, inputConstraints);
        }

        {
            labelConstraints.gridy = 3;
            JLabel remoteAeHostLabel = new JLabel(resourceBundle.getString("configPanelPacsHostname"),
                    SwingConstants.RIGHT);
            remoteAeHostLabel.setToolTipText(resourceBundle.getString("configPanelPacsHostnameTooltip"));
            remoteAEPanel.add(remoteAeHostLabel, labelConstraints);

            remoteAEHostName = new AutoFocusTextField(giftCloudProperties.getPacsHostName().orElse(""));
            inputConstraints.gridy = 3;
            remoteAEPanel.add(remoteAEHostName, inputConstraints);
        }

        {
            labelConstraints.gridy = 4;
            JLabel remoteAeTitleLabel = new JLabel(resourceBundle.getString("configPanelPacsPort"),
                    SwingConstants.RIGHT);
            remoteAeTitleLabel.setToolTipText(resourceBundle.getString("configPanelPacsPortTooltip"));
            remoteAEPanel.add(remoteAeTitleLabel, labelConstraints);

            remoteAEPortField = new AutoFocusTextField(Integer.toString(giftCloudProperties.getPacsPort()));
            inputConstraints.gridy = 4;
            remoteAEPanel.add(remoteAEPortField, inputConstraints);
        }

    }

    // The panel containing the cancel and apply buttons
    JPanel buttonPanel = new JPanel();
    JPanel closeButtonPanel = new JPanel();
    {
        final GridBagLayout buttonPanellayout = new GridBagLayout();
        buttonPanel.setLayout(buttonPanellayout);

        JSeparator separator = new JSeparator();
        buttonPanel.add(separator, separatorConstraint);

        closeButtonPanel.setLayout(new FlowLayout(FlowLayout.RIGHT));

        JButton cancelButton = new JButton(resourceBundle.getString("cancelSettingsButtonLabelText"));
        cancelButton.setToolTipText(resourceBundle.getString("cancelSettingsButtonToolTipText"));
        closeButtonPanel.add(cancelButton);
        cancelButton.addActionListener(new CancelActionListener());

        JButton applyButton = new JButton(resourceBundle.getString("applySettingsButtonLabelText"));
        applyButton.setToolTipText(resourceBundle.getString("applySettingsButtonToolTipText"));
        closeButtonPanel.add(applyButton);
        applyButton.addActionListener(new ApplyActionListener());

        JButton closeButton = new JButton(resourceBundle.getString("closeSettingsButtonLabelText"));
        closeButton.setToolTipText(resourceBundle.getString("closeSettingsButtonToolTipText"));
        closeButtonPanel.add(closeButton);
        closeButton.addActionListener(new CloseActionListener());

        final GridBagConstraints constraints = new GridBagConstraints();
        constraints.gridx = 0;
        constraints.gridy = 1;
        constraints.weightx = 1;
        constraints.weighty = 1;
        constraints.insets = new Insets(5, 5, 5, 5);
        constraints.fill = GridBagConstraints.HORIZONTAL;
        buttonPanellayout.setConstraints(closeButtonPanel, constraints);
        buttonPanel.add(closeButtonPanel);
    }

    // The main panel of the configuration dialog
    JPanel configPanel = new JPanel();
    {
        final GridBagLayout configPanelLayout = new GridBagLayout();
        configPanel.setLayout(configPanelLayout);
        {
            final GridBagConstraints constraints = new GridBagConstraints();
            constraints.gridx = 0;
            constraints.gridy = 0;
            constraints.weightx = 1;
            constraints.weighty = 1;
            constraints.insets = new Insets(5, 5, 5, 5);
            constraints.fill = GridBagConstraints.HORIZONTAL;
            configPanelLayout.setConstraints(giftCloudServerPanel, constraints);
            configPanel.add(giftCloudServerPanel);
        }
        {
            final GridBagConstraints constraints = new GridBagConstraints();
            constraints.gridx = 0;
            constraints.gridy = 1;
            constraints.weightx = 1;
            constraints.weighty = 1;
            constraints.insets = new Insets(5, 5, 5, 5);
            constraints.fill = GridBagConstraints.HORIZONTAL;
            configPanelLayout.setConstraints(listenerPanel, constraints);
            configPanel.add(listenerPanel);
        }
        {
            final GridBagConstraints constraints = new GridBagConstraints();
            constraints.gridx = 0;
            constraints.gridy = 2;
            constraints.insets = new Insets(5, 5, 5, 5);
            constraints.fill = GridBagConstraints.HORIZONTAL;
            configPanelLayout.setConstraints(remoteAEPanel, constraints);
            configPanel.add(remoteAEPanel);
        }
        {
            final GridBagConstraints constraints = new GridBagConstraints();
            constraints.gridx = 0;
            constraints.gridy = 3;
            constraints.insets = new Insets(5, 5, 5, 5);
            constraints.fill = GridBagConstraints.HORIZONTAL;
            configPanelLayout.setConstraints(buttonPanel, constraints);
            configPanel.add(buttonPanel);
        }
    }

    projectList.setModel(temporaryDropDownListModel);
    showProjectList(projectListModel.isEnabled());

    // Create a listener to enable/disable the project list when it is set from the server.
    // The reason for this is that the project list is set after logging into the server, which can happen asynchronously after property changes have been applied.
    // If the server was configured in the dialog and apply clicked, it might take a few seconds for the project list to be updated, and we want it to become available when this happens
    projectListEnabledListener = new DropDownListModel.EnabledListener<Boolean>() {
        @Override
        public void statusChanged(final Boolean visibility) {
            showProjectList(projectListModel.isEnabled());
        }
    };

    projectListModel.addListener(projectListEnabledListener);

    GridBagLayout layout = new GridBagLayout();
    dialog.setLayout(layout);
    Container content = dialog.getContentPane();
    content.add(configPanel);
    dialog.pack();
    dialog.setVisible(true);
    dialog.pack();
}

From source file:Widgets.Simulation.java

public Simulation(final JFrame aFrame, NetworkElement item) {
    super(aFrame);
    grn = ((DynamicalModelElement) item).getGeneNetwork();
    plot = new Plot2DPanel();

    //closing listener
    this.addWindowListener(new WindowAdapter() {
        @Override// w  w w. j  av a  2  s.  c  om
        public void windowClosing(WindowEvent windowEvent) {
            if (simulation != null && simulation.myThread_.isAlive()) {
                simulation.stop();
                System.out.print("Simulation is canceled.\n");
                JOptionPane.showMessageDialog(new Frame(), "Simulation is canceled.", "Warning!",
                        JOptionPane.INFORMATION_MESSAGE);
            }
            escapeAction();
        }
    });

    // Model
    model_.setModel(new DefaultComboBoxModel(new String[] { "Deterministic Model (ODEs)",
            "Stochastic Model (SDEs)", "Stochastic Simulation (Gillespie Algorithm)" }));
    model_.setSelectedIndex(0);

    setModelAction();

    //set plot part
    //display result
    if (grn.getTimeScale().size() >= 1) {
        //update parameters
        numTimeSeries_.setValue(grn.getTraj_itsValue());
        tmax_.setValue(grn.getTraj_maxTime());
        sdeDiffusionCoeff_.setValue(grn.getTraj_noise());

        if (grn.getTraj_model().equals("ode"))
            model_.setSelectedIndex(0);
        else if (grn.getTraj_model().equals("sde"))
            model_.setSelectedIndex(1);
        else
            model_.setSelectedIndex(2);

        //update plot
        trajPlot.removeAll();
        trajPlot.add(trajectoryTabb());
        trajPlot.updateUI();
        trajPlot.setVisible(true);
        trajPlot.repaint();

        analyzeResult.setVisible(true);
    }

    /**
     * ACTIONS
     */

    model_.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent arg0) {
            setModelAction();
        }
    });

    analyzeResult.addActionListener(new ActionListener() {
        public void actionPerformed(final ActionEvent arg0) {
            final JDialog a = new JDialog();
            a.setSize(new Dimension(500, 450));
            a.setModal(true);
            a.setTitle("Gene List (seperated by ';')");
            a.setLocationRelativeTo(null);

            final JTextArea focusGenesArea = new JTextArea();
            focusGenesArea.setLineWrap(true);
            focusGenesArea.setEditable(false);
            focusGenesArea.setRows(3);

            String geneNames = "";
            for (int i = 0; i < grn.getNodes().size(); i++)
                geneNames += grn.getNodes().get(i).getLabel() + ";";
            focusGenesArea.setText(geneNames);

            JButton submitButton = new JButton("Submit");
            JButton cancelButton = new JButton("Cancel");
            JPanel buttonPanel = new JPanel();
            buttonPanel.setLayout(new BoxLayout(buttonPanel, BoxLayout.X_AXIS));
            buttonPanel.add(submitButton);
            buttonPanel.add(cancelButton);

            cancelButton.addActionListener(new ActionListener() {
                public void actionPerformed(final ActionEvent arg0) {
                    a.dispose();
                }
            });

            submitButton.addActionListener(new ActionListener() {
                public void actionPerformed(final ActionEvent arg0) {
                    a.dispose();
                    final JDialog a = new JDialog();
                    a.setSize(new Dimension(500, 450));
                    a.setModal(true);
                    a.setTitle("Statistics");
                    a.setLocationRelativeTo(null);

                    if (grn.getTimeSeries().isEmpty()) {
                        JOptionPane.showMessageDialog(new Frame(), "Please run the simulation first.",
                                "Warning!", JOptionPane.INFORMATION_MESSAGE);
                    } else {
                        JPanel infoPanel = new JPanel();
                        infoPanel.setLayout(new BorderLayout());

                        //output 
                        String[] focusGenes = focusGenesArea.getText().split(";");
                        ;
                        String content = "";

                        //discrete the final state
                        int dimension = grn.getNodes().size();

                        //get gene index
                        int[] focus_index = new int[focusGenes.length];
                        for (int j = 0; j < focusGenes.length; j++)
                            for (int i = 0; i < dimension; i++)
                                if (grn.getNode(i).getLabel().equals(focusGenes[j]))
                                    focus_index[j] = i;

                        JScrollPane jsp = new JScrollPane();
                        //calculate steady states      
                        grn.setLand_itsValue((Integer) numTimeSeries_.getModel().getValue());
                        int[] isConverge = new int[grn.getTraj_itsValue()];
                        String out = calculateSteadyStates(focusGenes, focus_index, isConverge);

                        //show the convergence
                        final JDialog ifconvergent = new JDialog();
                        ifconvergent.setSize(new Dimension(500, 450));
                        ifconvergent.setModal(true);
                        ifconvergent.setTitle("Convergence");
                        ifconvergent.setLocationRelativeTo(null);

                        ConvergenceTable tablePanel = new ConvergenceTable(isConverge);
                        JButton continueButton = new JButton("Click to check the attractors.");
                        continueButton.addActionListener(new ActionListener() {
                            public void actionPerformed(final ActionEvent arg0) {
                                ifconvergent.dispose();
                            }
                        });

                        JPanel ifconvergentPanel = new JPanel();
                        ifconvergentPanel.setLayout(new BorderLayout());
                        ifconvergentPanel.add(tablePanel, BorderLayout.NORTH);
                        ifconvergentPanel.add(continueButton, BorderLayout.SOUTH);

                        ifconvergent.add(ifconvergentPanel);
                        ifconvergent.setVisible(true);

                        //show attractors
                        if (out.equals("ok")) {
                            AttractorTable panel = new AttractorTable(grn, focusGenes);
                            jsp.setViewportView(panel);
                        } else if (grn.getSumPara().size() == 0)
                            content += "Cannot find a steady state!";
                        else
                            content += "\nI dont know why!";

                        if (content != "") {
                            JLabel warningLabel = new JLabel();
                            warningLabel.setText(content);
                            jsp.setViewportView(warningLabel);
                        }

                        grn.setSumPara(null);
                        grn.setCounts(null);

                        //jsp.setPreferredSize(new Dimension(280,130));
                        jsp.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED);
                        jsp.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
                        infoPanel.add(jsp, BorderLayout.CENTER);

                        a.add(infoPanel);
                        a.setVisible(true);
                    } //end of else
                }

            });

            JPanel options3 = new JPanel();
            options3.setLayout(new BorderLayout());
            options3.add(focusGenesArea, BorderLayout.NORTH);
            options3.add(buttonPanel);

            options3.setBorder(new EmptyBorder(5, 0, 5, 0));

            a.add(options3);
            a.setVisible(true);
        }
    });

    runButton_.addActionListener(new ActionListener() {
        public void actionPerformed(final ActionEvent arg0) {
            //System.out.print("Memory start: "+s_runtime.totalMemory()+"\n"); 
            enterAction();
        }
    });

    cancelButton_.addActionListener(new ActionListener() {
        public void actionPerformed(final ActionEvent arg0) {
            if (simulation != null)
                simulation.stop();
            System.out.print("Simulation is canceled!\n");
        }
    });

    fixButton.addActionListener(new ActionListener() {
        public void actionPerformed(final ActionEvent arg0) {
            JDialog a = new JDialog();
            a.setTitle("Fixed initial values");
            a.setSize(new Dimension(400, 400));
            a.setLocationRelativeTo(null);

            JPanel speciesPanel = new JPanel();
            String[] columnName = { "Name", "InitialValue" };
            boolean editable = false; //false;
            new SpeciesTable(speciesPanel, columnName, grn, editable);

            /** LAYOUT **/
            JPanel wholePanel = new JPanel();
            wholePanel.setLayout(new BoxLayout(wholePanel, BoxLayout.Y_AXIS));
            wholePanel.add(speciesPanel);

            a.add(wholePanel);
            a.setModal(true);
            a.setVisible(true);
        }
    });

    randomButton.addActionListener(new ActionListener() {
        public void actionPerformed(final ActionEvent arg0) {
            final JDialog a = new JDialog();
            a.setTitle("Set boundaries");
            a.setSize(new Dimension(300, 200));
            a.setModal(true);
            a.setLocationRelativeTo(null);

            JPanel upPanel = new JPanel();
            JLabel upLabel = new JLabel("Input the upper boundary: ");
            final JTextField upValue = new JTextField("3");
            upPanel.setLayout(new BoxLayout(upPanel, BoxLayout.X_AXIS));
            upPanel.add(upLabel);
            upPanel.add(upValue);

            JPanel lowPanel = new JPanel();
            JLabel lowLabel = new JLabel("Input the lower boundary: ");
            final JTextField lowValue = new JTextField("0");
            lowPanel.setLayout(new BoxLayout(lowPanel, BoxLayout.X_AXIS));
            lowPanel.add(lowLabel);
            lowPanel.add(lowValue);

            JPanel buttonPanel = new JPanel();
            JButton submit = new JButton("Submit");
            JButton cancel = new JButton("Cancel");
            buttonPanel.setLayout(new BoxLayout(buttonPanel, BoxLayout.X_AXIS));
            buttonPanel.add(submit);
            buttonPanel.add(cancel);
            buttonPanel.setBorder(new EmptyBorder(5, 5, 5, 5));

            submit.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    if (upValue.getText().equals(""))
                        JOptionPane.showMessageDialog(null, "Please input upper boundary", "Error",
                                JOptionPane.ERROR_MESSAGE);
                    else {
                        try {
                            upbound = Double.parseDouble(upValue.getText());

                            if (lowValue.getText().equals(""))
                                JOptionPane.showMessageDialog(null, "Please input lower boundary", "Error",
                                        JOptionPane.ERROR_MESSAGE);
                            else {
                                try {
                                    lowbound = Double.parseDouble(lowValue.getText());

                                    if (upbound < lowbound)
                                        JOptionPane.showMessageDialog(null,
                                                "Upper boundary should be not less than lower boundary",
                                                "Error", JOptionPane.ERROR_MESSAGE);
                                    else
                                        a.dispose();
                                } catch (Exception er) {
                                    JOptionPane.showMessageDialog(null, "Invalid value", "Error",
                                            JOptionPane.INFORMATION_MESSAGE);
                                    MsgManager.Messages.errorMessage(er, "Error", "");
                                }
                            }
                        } catch (Exception er) {
                            JOptionPane.showMessageDialog(null, "Invalid value", "Error",
                                    JOptionPane.INFORMATION_MESSAGE);
                            MsgManager.Messages.errorMessage(er, "Error", "");
                        }
                    }

                }
            });

            cancel.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    JOptionPane.showMessageDialog(null, "The default values are used!", "",
                            JOptionPane.INFORMATION_MESSAGE);
                    a.dispose();
                }
            });

            JPanel wholePanel = new JPanel();
            wholePanel.setLayout(new BoxLayout(wholePanel, BoxLayout.Y_AXIS));
            wholePanel.add(upPanel);
            wholePanel.add(lowPanel);
            wholePanel.add(buttonPanel);
            wholePanel.setBorder(new EmptyBorder(5, 5, 5, 5));

            a.add(wholePanel);
            a.setVisible(true);

        }
    });
}