Example usage for javax.swing JComboBox setEditable

List of usage examples for javax.swing JComboBox setEditable

Introduction

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

Prototype

@BeanProperty(preferred = true, description = "If true, the user can type a new value in the combo box.")
public void setEditable(boolean aFlag) 

Source Link

Document

Determines whether the JComboBox field is editable.

Usage

From source file:org.apache.cayenne.modeler.editor.ObjEntityRelationshipPanel.java

protected void rebuildTable(ObjEntity entity) {
    final ObjRelationshipTableModel model = new ObjRelationshipTableModel(entity, mediator, this);

    model.addTableModelListener(new TableModelListener() {

        public void tableChanged(TableModelEvent e) {
            if (table.getSelectedRow() >= 0) {
                ObjRelationship rel = model.getRelationship(table.getSelectedRow());
                enabledResolve = rel.getSourceEntity().getDbEntity() != null;
                resolveMenu.setEnabled(enabledResolve);
            }/*  www. j a  v  a  2  s .  c  o m*/
        }
    });

    table.setModel(model);
    table.setRowHeight(25);
    table.setRowMargin(3);

    TableColumn col = table.getColumnModel().getColumn(ObjRelationshipTableModel.REL_TARGET_PATH);
    col.setCellEditor(new DbRelationshipPathComboBoxEditor());
    col.setCellRenderer(new DefaultTableCellRenderer() {
        @Override
        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
                boolean hasFocus, int row, int column) {
            super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
            setBorder(BorderFactory.createEmptyBorder(0, 5, 0, 0));
            setToolTipText(
                    "To choose relationship press enter two times.To choose next relationship press dot.");
            return this;
        }
    });

    col = table.getColumnModel().getColumn(ObjRelationshipTableModel.REL_DELETE_RULE);
    JComboBox deleteRulesCombo = Application.getWidgetFactory().createComboBox(DELETE_RULES, false);
    deleteRulesCombo.setFocusable(false);
    deleteRulesCombo.setEditable(true);
    ((JComponent) deleteRulesCombo.getEditor().getEditorComponent()).setBorder(null);
    deleteRulesCombo.setBorder(BorderFactory.createEmptyBorder(0, 5, 0, 0));
    deleteRulesCombo.setSelectedIndex(0); // Default to the first value
    col.setCellEditor(Application.getWidgetFactory().createCellEditor(deleteRulesCombo));

    tablePreferences.bind(table, null, null, null, ObjRelationshipTableModel.REL_NAME, true);
}

From source file:org.apache.cayenne.modeler.editor.ObjEntityRelationshipTab.java

protected void rebuildTable(ObjEntity entity) {
    final ObjRelationshipTableModel model = new ObjRelationshipTableModel(entity, mediator, this);

    model.addTableModelListener(new TableModelListener() {

        public void tableChanged(TableModelEvent e) {
            if (table.getSelectedRow() >= 0) {
                ObjRelationship rel = model.getRelationship(table.getSelectedRow());
                if (((ObjEntity) rel.getSourceEntity()).getDbEntity() != null) {
                    resolve.setEnabled(true);
                } else
                    resolve.setEnabled(false);

                resolveMenu.setEnabled(resolve.isEnabled());
            }/*from  w  ww. j  a va  2 s.  co m*/
        }
    });

    table.setModel(model);
    table.setRowHeight(25);
    table.setRowMargin(3);

    TableColumn col = table.getColumnModel().getColumn(ObjRelationshipTableModel.REL_TARGET);
    JComboBox targetCombo = Application.getWidgetFactory().createComboBox(createObjEntityComboModel(), false);
    AutoCompletion.enable(targetCombo);

    targetCombo.setRenderer(CellRenderers.entityListRendererWithIcons(entity.getDataMap()));
    targetCombo.setSelectedIndex(-1);
    col.setCellEditor(Application.getWidgetFactory().createCellEditor(targetCombo));

    col = table.getColumnModel().getColumn(ObjRelationshipTableModel.REL_DELETERULE);
    JComboBox deleteRulesCombo = Application.getWidgetFactory().createComboBox(deleteRules, false);
    deleteRulesCombo.setEditable(false);
    deleteRulesCombo.setSelectedIndex(0); // Default to the first value
    col.setCellEditor(Application.getWidgetFactory().createCellEditor(deleteRulesCombo));

    tablePreferences.bind(table, null, null, null, ObjRelationshipTableModel.REL_NAME, true);
}

From source file:org.pentaho.ui.xul.swing.tags.SwingTree.java

private TableCellRenderer getCellRenderer(final SwingTreeCol col) {

    return new DefaultTableCellRenderer() {

        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
                boolean hasFocus, int row, int column) {

            ColumnType colType = col.getColumnType();
            if (colType == ColumnType.DYNAMIC) {
                colType = ColumnType.valueOf(extractDynamicColType(elements.toArray()[row], column));
            }// ww  w .j av a2  s  .  co  m

            final XulTreeCell cell = getRootChildren().getItem(row).getRow().getCell(column);
            switch (colType) {
            case CHECKBOX:
                JCheckBox checkbox = new JCheckBox();
                if (value instanceof String) {
                    checkbox.setSelected(((String) value).equalsIgnoreCase("true")); //$NON-NLS-1$
                } else if (value instanceof Boolean) {
                    checkbox.setSelected((Boolean) value);
                } else if (value == null) {
                    checkbox.setSelected(false);
                }
                if (isSelected) {
                    checkbox.setBackground(Color.LIGHT_GRAY);
                }
                checkbox.setEnabled(!cell.isDisabled());
                return checkbox;
            case COMBOBOX:
            case EDITABLECOMBOBOX:
                Vector data;

                final JComboBox comboBox = new JComboBox();
                if (cell == null) {
                } else {
                    data = (cell.getValue() != null) ? (Vector) cell.getValue() : new Vector();

                    if (data == null) {
                        logger.debug("SwingTreeCell combobox data is null, passed in value: " + value); //$NON-NLS-1$
                        if (value instanceof Vector) {
                            data = (Vector) value;
                        }
                    }
                    if (data != null) {
                        comboBox.setModel(new DefaultComboBoxModel(data));
                        try {
                            comboBox.setSelectedIndex(cell.getSelectedIndex());
                        } catch (Exception e) {
                            logger.error("error setting selected index on the combobox editor"); //$NON-NLS-1$
                        }
                    }
                }

                if (colType == ColumnType.EDITABLECOMBOBOX) {
                    comboBox.setEditable(true);
                    ((JTextComponent) comboBox.getEditor().getEditorComponent()).setText(cell.getLabel());
                }

                if (isSelected) {
                    comboBox.setBackground(Color.LIGHT_GRAY);
                }
                comboBox.setEnabled(!cell.isDisabled());
                return comboBox;
            case CUSTOM:
                return new CustomCellEditorWrapper(cell, customEditors.get(col.getType()));
            default:
                JLabel label = new JLabel((String) value);

                if (isSelected) {
                    label.setOpaque(true);
                    label.setBackground(Color.LIGHT_GRAY);
                }
                return label;
            }

        }
    };

}

From source file:org.pentaho.ui.xul.swing.tags.SwingTree.java

private TableCellEditor getCellEditor(final SwingTreeCol col) {
    return new DefaultCellEditor(new JComboBox()) {

        JComponent control;//from w  w  w. j a  v  a 2 s  .  c om

        @Override
        public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected,
                final int row, final int column) {
            Component comp;
            ColumnType colType = col.getColumnType();
            if (colType == ColumnType.DYNAMIC) {
                colType = ColumnType.valueOf(extractDynamicColType(elements.toArray()[row], column));
            }

            final XulTreeCell cell = getRootChildren().getItem(row).getRow().getCell(column);
            switch (colType) {
            case CHECKBOX:
                final JCheckBox checkbox = new JCheckBox();
                final JTable tbl = table;
                checkbox.addActionListener(new ActionListener() {
                    public void actionPerformed(ActionEvent event) {
                        SwingTree.this.table.setValueAt(checkbox.isSelected(), row, column);
                        tbl.getCellEditor().stopCellEditing();
                    }
                });

                control = checkbox;
                if (value instanceof String) {
                    checkbox.setSelected(((String) value).equalsIgnoreCase("true")); //$NON-NLS-1$
                } else if (value instanceof Boolean) {
                    checkbox.setSelected((Boolean) value);
                } else if (value == null) {
                    checkbox.setSelected(false);
                }
                if (isSelected) {
                    checkbox.setBackground(Color.LIGHT_GRAY);
                }
                comp = checkbox;
                checkbox.setEnabled(!cell.isDisabled());
                break;
            case EDITABLECOMBOBOX:
            case COMBOBOX:
                Vector val = (value != null && value instanceof Vector) ? (Vector) value : new Vector();
                final JComboBox comboBox = new JComboBox(val);

                if (isSelected) {
                    comboBox.setBackground(Color.LIGHT_GRAY);
                }

                if (colType == ColumnType.EDITABLECOMBOBOX) {

                    comboBox.setEditable(true);
                    final JTextComponent textComp = (JTextComponent) comboBox.getEditor().getEditorComponent();

                    textComp.addKeyListener(new KeyListener() {
                        private String oldValue = ""; //$NON-NLS-1$

                        public void keyPressed(KeyEvent e) {
                            oldValue = textComp.getText();
                        }

                        public void keyReleased(KeyEvent e) {
                            if (oldValue != null && !oldValue.equals(textComp.getText())) {
                                SwingTree.this.table.setValueAt(textComp.getText(), row, column);

                                oldValue = textComp.getText();
                            } else if (oldValue == null) {
                                // AWT error where sometimes the keyReleased is fired before keyPressed.
                                oldValue = textComp.getText();
                            } else {
                                logger.debug("Special key pressed, ignoring"); //$NON-NLS-1$
                            }
                        }

                        public void keyTyped(KeyEvent e) {
                        }
                    });

                    comboBox.addActionListener(new ActionListener() {
                        public void actionPerformed(ActionEvent event) {
                            // if(textComp.hasFocus() == false && comboBox.hasFocus()){
                            SwingTree.logger.debug("Setting ComboBox value from editor: " //$NON-NLS-1$
                                    + comboBox.getSelectedItem() + ", " + row + ", " + column); //$NON-NLS-1$ //$NON-NLS-2$

                            SwingTree.this.table.setValueAt(comboBox.getSelectedIndex(), row, column);
                            // }
                        }
                    });
                } else {
                    comboBox.addActionListener(new ActionListener() {
                        public void actionPerformed(ActionEvent event) {

                            SwingTree.logger.debug("Setting ComboBox value from editor: " //$NON-NLS-1$
                                    + comboBox.getSelectedItem() + ", " + row + ", " + column); //$NON-NLS-1$ //$NON-NLS-2$

                            SwingTree.this.table.setValueAt(comboBox.getSelectedIndex(), row, column);
                        }
                    });
                }

                control = comboBox;
                comboBox.setEnabled(!cell.isDisabled());
                comp = comboBox;
                break;
            case LABEL:
                JLabel lbl = new JLabel(cell.getLabel());
                comp = lbl;
                control = lbl;
                break;
            case CUSTOM:
                return new CustomCellEditorWrapper(cell, customEditors.get(col.getType()));
            default:
                final JTextField label = new JTextField((String) value);

                label.getDocument().addDocumentListener(new DocumentListener() {

                    public void changedUpdate(DocumentEvent arg0) {
                        SwingTree.this.table.setValueAt(label.getText(), row, column);
                    }

                    public void insertUpdate(DocumentEvent arg0) {
                        SwingTree.this.table.setValueAt(label.getText(), row, column);
                    }

                    public void removeUpdate(DocumentEvent arg0) {
                        SwingTree.this.table.setValueAt(label.getText(), row, column);
                    }

                });
                if (isSelected) {
                    label.setOpaque(true);
                    // label.setBackground(Color.LIGHT_GRAY);
                }

                control = label;
                comp = label;
                label.setEnabled(!cell.isDisabled());
                label.setDisabledTextColor(Color.DARK_GRAY);
                break;
            }

            return comp;
        }

        @Override
        public Object getCellEditorValue() {
            if (control instanceof JCheckBox) {
                return ((JCheckBox) control).isSelected();
            } else if (control instanceof JComboBox) {
                JComboBox box = (JComboBox) control;
                if (box.isEditable()) {
                    return ((JTextComponent) box.getEditor().getEditorComponent()).getText();
                } else {
                    return box.getSelectedIndex();
                }
            } else if (control instanceof JTextField) {
                return ((JTextField) control).getText();
            } else {
                return ((JLabel) control).getText();
            }
        }

    };

}

From source file:org.rimudb.editor.DescriptorEditor.java

/**
 * Build the panel// w  w  w  . j av  a 2  s.c o m
 */
private JPanel createColumnTablePanel() {
    JPanel columnPanel = new JPanel();
    columnPanel.setLayout(new BoxLayout(columnPanel, BoxLayout.Y_AXIS));

    // Create the property table panel
    propertyModel = new PropertyTableModel();

    // Add a listener to set the changed state
    propertyModel.addTableModelListener(new TableModelListener() {
        public void tableChanged(TableModelEvent e) {
            markChanged();

            if (e instanceof PropertyTableModelEvent) {
                PropertyTableModelEvent ptme = (PropertyTableModelEvent) e;

                // If the columnName column was changed then check it isn't
                // a PK
                if (ptme.getColumn() == 1) {

                    String beforeColumnName = (String) ptme.getBeforeValue();
                    String afterColumnName = (String) ptme.getAfterValue();

                    // Is the field entry in the list of primary keys?
                    for (int i = 0; i < pkListModel.getSize(); i++) {
                        String pkColumnName = (String) pkListModel.get(i);
                        // If it's found then remove it
                        if (beforeColumnName.equals(pkColumnName)) {
                            pkListModel.set(i, afterColumnName);
                            break;
                        }
                    }

                }

            }
        }
    });

    table = new ATable(getPropertyModel());
    table.setName("ColumnTable");
    table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    table.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
        public void valueChanged(ListSelectionEvent e) {
            int selectedRowCount = table.getSelectedRowCount();
            removeColumnBtn.setEnabled(selectedRowCount > 0);
            moveUpBtn.setEnabled(selectedRowCount > 0);
            moveDownBtn.setEnabled(selectedRowCount > 0);
        }
    });
    table.setTransferHandler(new TransferHandler() {

        public int getSourceActions(JComponent c) {
            return COPY;
        }

        protected Transferable createTransferable(JComponent c) {
            ATable columnTable = (ATable) c;
            int row = columnTable.getSelectedRow();
            String columnName = getPropertyModel().getRow(row).getColumnName();
            return new StringSelection(columnName);
        }
    });
    table.setDragEnabled(true);

    JScrollPane sp = new JScrollPane(table);
    sp.setMaximumSize(new Dimension(Short.MAX_VALUE, 325));
    sp.setPreferredSize(new Dimension(Short.MAX_VALUE, 325));
    sp.setMinimumSize(new Dimension(Short.MAX_VALUE, 325));

    JComboBox typeCB = new JComboBox(DatabaseTypes.getAllTypes());
    typeCB.setEditable(false);

    javax.swing.table.TableColumn typeColumn = table.getColumnModel().getColumn(2);
    typeColumn.setCellEditor(new DefaultCellEditor(typeCB));

    // Create the popup menu and set it on the table
    propertyPopup = new TablePopupMenu(this, table);
    table.addMouseListener(propertyPopup);
    sp.addMouseListener(propertyPopup);
    sp.setAlignmentX(LEFT_ALIGNMENT);

    columnPanel.add(sp);

    columnPanel.add(Box.createVerticalStrut(10));

    JLabel pkLabel = new JLabel("Primary Key Columns", SwingConstants.LEFT);
    pkLabel.setAlignmentX(LEFT_ALIGNMENT);
    columnPanel.add(pkLabel);

    pkListModel = new DefaultListModel();
    pkListModel.addListDataListener(new ListDataListener() {
        public void intervalRemoved(ListDataEvent e) {
            markChanged();
        }

        public void intervalAdded(ListDataEvent e) {
            markChanged();
        }

        public void contentsChanged(ListDataEvent e) {
            markChanged();
        }
    });

    pkList = new JList(pkListModel);
    pkList.setName("pkList");
    pkList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    pkList.addListSelectionListener(new ListSelectionListener() {
        public void valueChanged(ListSelectionEvent e) {
            int selectedRowCount = pkList.getSelectedIndex();
            removePkBtn.setEnabled(selectedRowCount > -1);
        }
    });
    pkList.setTransferHandler(new TransferHandler() {

        public boolean canImport(TransferHandler.TransferSupport info) {
            // we only import Strings
            if (!info.isDataFlavorSupported(DataFlavor.stringFlavor)) {
                return false;
            }

            JList.DropLocation dl = (JList.DropLocation) info.getDropLocation();
            if (dl.getIndex() == -1) {
                return false;
            }
            return true;
        }

        public boolean importData(TransferHandler.TransferSupport info) {
            if (!info.isDrop()) {
                return false;
            }

            // Check for String flavor
            if (!info.isDataFlavorSupported(DataFlavor.stringFlavor)) {
                displayDropLocation("List doesn't accept a drop of this type.");
                return false;
            }

            JList.DropLocation dl = (JList.DropLocation) info.getDropLocation();
            DefaultListModel listModel = (DefaultListModel) pkList.getModel();
            int index = dl.getIndex();

            // Get the string that is being dropped.
            Transferable t = info.getTransferable();
            String data;
            try {
                data = (String) t.getTransferData(DataFlavor.stringFlavor);
            } catch (Exception e) {
                return false;
            }

            // If this is a copy action then check we don't already have that String
            if (info.getDropAction() == COPY && listModel.indexOf(data) > -1) {
                displayDropLocation("The column " + data + " is already a primary key");
                return false;
            }

            // Perform the actual import. 
            if (dl.isInsert()) {
                int oldIndex = listModel.indexOf(data);
                if (oldIndex < index) {
                    listModel.add(index, data);
                    listModel.remove(oldIndex);
                } else {
                    listModel.remove(oldIndex);
                    listModel.add(index, data);
                }
            } else {
                // Don't handle replacements
            }
            return true;
        }

        public int getSourceActions(JComponent c) {
            return MOVE;
        }

        protected Transferable createTransferable(JComponent c) {
            JList list = (JList) c;
            Object[] values = list.getSelectedValues();

            StringBuffer buff = new StringBuffer();

            for (int i = 0; i < values.length; i++) {
                Object val = values[i];
                buff.append(val == null ? "" : val.toString());
                if (i != values.length - 1) {
                    buff.append("\n");
                }
            }
            return new StringSelection(buff.toString());
        }
    });
    pkList.setDropMode(DropMode.INSERT);
    pkList.setDragEnabled(true);

    JScrollPane pkScrollPanel = new JScrollPane(pkList);
    pkScrollPanel.setMaximumSize(new Dimension(Short.MAX_VALUE, 100));
    pkScrollPanel.setAlignmentX(LEFT_ALIGNMENT);

    columnPanel.add(pkScrollPanel);

    return columnPanel;
}

From source file:org.simmi.GeneSetHead.java

License:asdf

private void showGeneTable(
        /*final Map<String, Gene> genemap, final List<Gene> genelist, 
        final List<Function> funclist, final List<Set<String>> iclusterlist, final List<Set<String>> uclusterlist,
        final Map<Set<String>, ShareNum> specset,*/ final Map<Set<String>, ClusterInfo> clustInfoMap,
        final Button jb, final TableView<Gene> genetable, final TableView<Function> upper,
        final TableView<GeneGroup> lower, final ToolBar toolbar, final ToolBar btoolbar, final Container comp,
        final JApplet applet, final ComboBox<String> selcomblocal) throws IOException {
    //JSplitPane splitpane = new JSplitPane();
    //splitpane.setOrientation(JSplitPane.VERTICAL_SPLIT);
    //splitpane.setDividerLocation(400);
    //JScrollPane scrollpane = new JScrollPane();

    /*table = new JTable() {
       public String getToolTipText(MouseEvent me) {
    Point p = me.getPoint();/*w w w  .ja  va2s . c om*/
    int r = rowAtPoint(p);
    int c = columnAtPoint(p);
    if (r >= 0 && r < super.getRowCount()) {
       Object ret = super.getValueAt(r, c);
       if (ret != null) {
          return ret.toString(); // super.getToolTipText( me );
       }
    }
    return "";
       }
    };*/

    //table.setDragEnabled(true);
    try {
        final DataFlavor df = new DataFlavor("text/plain;charset=utf-8");
        // System.err.println( df.getHumanPresentableName() + " " +
        // df.getPrimaryType() + " " + df.getSubType() + " " +
        // df.getMimeType() );
        // DataFlavor df1 = DataFlavor.getTextPlainUnicodeFlavor();
        // System.err.println( df.getHumanPresentableName() + " " +
        // df.getPrimaryType() + " " + df.getSubType() + " " +
        // df.getMimeType() );
        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 true;
            }

            protected Transferable createTransferable(JComponent c) {
                return new Transferable() {
                    @Override
                    public Object getTransferData(DataFlavor arg0)
                            throws UnsupportedFlavorException, IOException {
                        Map<String, List<Tegeval>> contigs = new HashMap<>();
                        StringBuilder ret = new StringBuilder();
                        for (Gene gg : gtable.getSelectionModel().getSelectedItems()) {
                            Tegeval tv = gg.tegeval;
                            if (!contigs.containsKey(tv.getContshort())) {
                                List<Tegeval> ltv = new ArrayList<>();
                                ltv.add(tv);
                                contigs.put(tv.getContshort().getName(), ltv);
                            } else {
                                List<Tegeval> ltv = contigs.get(tv.getContshort());
                                ltv.add(tv);
                            }
                            /*
                             * ret.append( ">" + tv.cont + " " +
                             * tv.teg + " " + tv.eval + "\n" );
                             * if( tv.dna != null ) { for( int i
                             * = 0; i < tv.dna.length(); i+=70 )
                             * { ret.append(tv.dna.substring( i,
                             * Math.min(i+70,tv.dna.length())
                             * )+"\n"); } }
                             */
                        }
                        for (String cont : contigs.keySet()) {
                            List<Tegeval> tv = contigs.get(cont);
                            String dna = tv.get(0).getSequence();
                            ret.append(">" + cont + "\n"); // + " " + tv.teg
                            // + " " +
                            // tv.eval +
                            // "\n" );
                            if (dna != null) {
                                for (int i = 0; i < dna.length(); i += 70) {
                                    ret.append(dna.substring(i, Math.min(i + 70, dna.length())) + "\n");
                                }
                            }
                        }
                        for (String cont : contigs.keySet()) {
                            List<Tegeval> ltv = contigs.get(cont);
                            ret.append(">" + cont + "\n"); // + " " + tv.teg
                            // + " " +
                            // tv.eval +
                            // "\n" );
                            for (Tegeval tv : ltv) {
                                ret.append("erm\t#0000ff\t" + tv.start + "\t" + tv.stop + "\n");
                            }
                        }

                        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;
                    }
                };
            }

            public boolean importData(TransferHandler.TransferSupport support) {
                Object obj = null;

                System.err.println(support.getDataFlavors().length);
                int b = Arrays.binarySearch(support.getDataFlavors(), DataFlavor.javaFileListFlavor,
                        (o1, o2) -> o1 == o2 ? 1 : 0);

                try {
                    obj = support.getTransferable().getTransferData(DataFlavor.imageFlavor);
                } catch (UnsupportedFlavorException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }

                try {
                    if (obj != null && obj instanceof File[]) {
                        // File[] ff = (File[])obj;
                        // wbStuff( ff[0].getCanonicalPath() );
                    } else if (obj instanceof Image) {

                    } else {
                        obj = support.getTransferable().getTransferData(DataFlavor.stringFlavor);
                        System.err.println(obj);
                        URL url = null;
                        try {
                            url = new URL((String) obj);
                            Image image = ImageIO.read(url);
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                } catch (UnsupportedFlavorException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }

                return true;
            }
        };
        //table.setTransferHandler(th);
    } catch (ClassNotFoundException e2) {
        e2.printStackTrace();
    }

    final Color darkgreen = new Color(0, 128, 0);
    final Color darkred = new Color(128, 0, 0);
    final Color darkblue = new Color(0, 0, 128);
    final Color darkmag = new Color(128, 0, 128);
    /*table.setDefaultRenderer(Teg.class, new DefaultTableCellRenderer() {
       @Override
       public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
    Component label = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
    if( value == null ) {
       label.setBackground(Color.white);
    } else {
       cellRender();
    }
    return label;
       }
    });*/

    //table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
    //table.setAutoCreateRowSorter(true);
    //scrollpane.setViewportView(table);

    Set<String> current = null;
    Set<String> currentko = null;
    InputStream is = GeneSet.class.getResourceAsStream("/kegg_pathways");
    BufferedReader br = new BufferedReader(new InputStreamReader(is));
    String line = br.readLine();
    while (line != null) {
        if (line.startsWith(">")) {
            current = new HashSet<>();
            currentko = new HashSet<>();
            geneset.pathwaymap.put(line.substring(1), current);
            geneset.pathwaykomap.put(line.substring(1), currentko);
        } else if (!line.startsWith("K")) {
            if (current != null) {
                String str = line.split("[\t ]+")[0];
                current.add(str);
            }
        } else {
            if (currentko != null) {
                String str = line.split("[\t ]+")[0];
                currentko.add(str);
            }
        }
        line = br.readLine();
    }
    br.close();

    //FileReader fr = new FileReader("/vg454flx/ko2go.txt");
    /*is = GeneSet.class.getResourceAsStream("/ko2go.txt");
    InputStreamReader isr = new InputStreamReader( is );
    br = new BufferedReader( isr );
    line = br.readLine();
    while (line != null) {
       String[] split = line.split(" = ");
       String[] subsplit = split[1].split(" ");
       Set<String> gos = new HashSet<String>();
       for( String go : subsplit ) {
    gos.add( go );
       }
       ko2go.put( split[0], gos );
       line = br.readLine();
    }
    br.close();*/

    final TextField textfield = new TextField();
    //JComponent topcomp = new JComponent() {};
    //topcomp.setLayout(new BorderLayout());
    //topcomp.add(scrollpane);

    textfield.setPrefSize(350, 25);

    final RadioButton search = new RadioButton("Search");
    final RadioButton filter = new RadioButton("Filter");

    ToggleGroup bgsf = new ToggleGroup();
    search.setToggleGroup(bgsf);
    filter.setToggleGroup(bgsf);
    //ButtonGroup bgsf = new ButtonGroup();
    //bgsf.add( search );
    //bgsf.add( filter );

    filter.setSelected(true);

    //ToolBar topcombo = new ToolBar();
    // topcombo.
    // topcombo.setLayout( new FlowLayout() );

    specombo = new ComboBox<>();
    combo = new ComboBox<>();

    specombo.getItems().add("Select blast species");
    combo.getItems().add("Select pathway");
    btoolbar.getItems().add(combo);
    btoolbar.getItems().add(specombo);
    //topcomp.add(topcombo, BorderLayout.SOUTH);

    //JComponent ttopcom = new JComponent() {};
    //ttopcom.setLayout(new FlowLayout());

    /*            frame.setVisible( true );
             }
          };
          AbstractAction   sharenumaction = new AbstractAction("Update share numbers") {
             @Override
             public void actionPerformed(ActionEvent e) {
    Set<String> specs = getSelspec(GeneSetHead.this, specList, null);
    updateShareNum(specs);
             }
          };
          AbstractAction   importgenesymbolaction = new AbstractAction("Import gene symbols") {
             @Override
             public void actionPerformed(ActionEvent e) {
    JFileChooser fc = new JFileChooser();
    if( fc.showOpenDialog( GeneSetHead.this ) == JFileChooser.APPROVE_OPTION ) {
       try {
          Map<String,String> env = new HashMap<String,String>();
          env.put("create", "true");
          Path path = zipfile.toPath();
          String uristr = "jar:" + path.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);
                  
          InputStream is = new GZIPInputStream( new FileInputStream( fc.getSelectedFile() ) );
          uni2symbol(new InputStreamReader(is), bw, unimap);
                  
          bw.close();
          //long bl = Files.copy( new ByteArrayInputStream( baos.toByteArray() ), nf, StandardCopyOption.REPLACE_EXISTING );
          geneset.zipfilesystem.close();
       } catch (IOException e1) {
          e1.printStackTrace();
       }
    }
             }
          };
                  
          AbstractAction   importidmappingaction = new AbstractAction("Id mapping") {
             @Override
             public void actionPerformed(ActionEvent e) {
    JFileChooser fc = new JFileChooser();
    if( fc.showOpenDialog( GeneSetHead.this ) == JFileChooser.APPROVE_OPTION ) {
       try {
          Map<String,String> env = new HashMap<String,String>();
          env.put("create", "true");
          Path path = zipfile.toPath();
          String uristr = "jar:" + path.toUri();
          geneset.zipuri = URI.create( uristr /*.replace("file://", "file:")/ );
          geneset.zipfilesystem = FileSystems.newFileSystem( geneset.zipuri, env );
                  
          Path nf = geneset.zipfilesystem.getPath("/idmapping_short.dat");
          BufferedWriter bw = Files.newBufferedWriter(nf, StandardOpenOption.CREATE);
                  
          InputStream is = new GZIPInputStream( new FileInputStream( fc.getSelectedFile() ) );
          if( unimap != null ) unimap.clear();
          unimap = idMapping(new InputStreamReader(is), bw, 2, 0, refmap, genmap, gimap);
                  
          bw.close();
          //long bl = Files.copy( new ByteArrayInputStream( baos.toByteArray() ), nf, StandardCopyOption.REPLACE_EXISTING );
          geneset.zipfilesystem.close();
       } catch (IOException e1) {
          e1.printStackTrace();
       }
    }
             }
          };
                  
          final JCheckBoxMenuItem checkbox = new JCheckBoxMenuItem();
          checkbox.setAction(new AbstractAction("Sort by location") {
             @Override
             public void actionPerformed(ActionEvent e) {
    Tegeval.locsort = checkbox.isSelected();
             }
          });
          AbstractAction saveselAction = new AbstractAction("Save selection") {
             @Override
             public void actionPerformed(ActionEvent e) {
    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 {
             ((GeneSet)comp).saveSel( selname, val);
          } catch (Exception e1) {
             e1.printStackTrace();
          }
       }
    }
             }
          };
                  
          JMenuBar   menubar = new JMenuBar();
          JMenu      menu = new JMenu("Functions");
          menu.add( importidmappingaction );
          menu.add( functionmappingaction );
          menu.add( importgenesymbolaction );
          menu.add( fetchaction );
          menu.add( blast2action );
          menu.add( sharenumaction );
          menu.addSeparator();
          menu.add( checkbox );
          menu.add( saveselAction );
          menu.addSeparator();
          menu.add( genomestataction );
          menu.add( selectsharingaction );
          menu.add( shuffletreeaction );
          menu.add( presabsaction );
          menu.add( freqdistaction );
          menu.add( gcpaction );
          menu.add( matrixaction );
          menu.add( pancoreaction );
          menu.add( blastaction );
          menu.add( koexportaction );
          menu.add( genomesizeaction );
          menu.add( gcaction );
          menu.add( gcskewaction );
          menu.add( mltreemapaction );
          menu.add( sevenaction );
          menu.add( cogaction );
          menu.add( genexyplotaction );
          menu.add( compareplotaction );
          menu.add( syntenygradientaction );
          menu.add( codregaction );
          menu.add( fetchcoreaction );
          menu.add( loadcontiggraphaction );
          menu.add( selectflankingaction );
          menu.add( showflankingaction );
          menu.add( showcontigsaction );
          menu.add( showunresolved );
          menu.add( genephyl );
                  
          menubar.add( menu );
          ttopcom.add( menubar );
                  
          JMenu      view = new JMenu("View");
          menubar.add( view );
                  
          gb = new JRadioButtonMenuItem( new AbstractAction("Genes") {
             @Override
             public void actionPerformed(ActionEvent e) {
    table.setModel( defaultModel );
             }
          });
          view.add( gb );
          ggb = new JRadioButtonMenuItem( new AbstractAction("Gene groups") {
             @Override
             public void actionPerformed(ActionEvent e) {
    table.setModel( groupModel );
             }
                     
          });
          ButtonGroup   bg = new ButtonGroup();
          bg.add( gb );
          bg.add( ggb );
                  
          ggb.setSelected( true );
                  
          view.add( ggb );*/

    //ttopcom.add( shuffletreebutton );
    //ttopcom.add( presabsbutton );
    //ttopcom.add(freqdistbutton);
    //ttopcom.add(matrixbutton);

    toolbar.getItems().add(textfield);
    toolbar.getItems().add(search);
    toolbar.getItems().add(filter);
    toolbar.getItems().add(label);

    selcomblocal.getSelectionModel().selectedItemProperty().addListener((observable, oldValue, newValue) -> {
        String key = newValue;
        if (((GeneSetHead) comp).selectionMap.containsKey(key)) {
            Set<Integer> val = ((GeneSetHead) comp).selectionMap.get(key);
            if (val != null) {
                table.getSelectionModel().clearSelection();
                for (int i : val) {
                    //int r = table.convertRowIndexToView(i);
                    table.getSelectionModel().select(i);
                }
            } else {
                System.err.println("null " + key);
            }
        } else {
            System.err.println("no " + key);
        }
    });
    toolbar.getItems().add(selcomblocal);

    /*syncolorcomb.addItemListener( new ItemListener() {
       @Override
       public void itemStateChanged(ItemEvent e) {
    String spec = (String)syncolorcomb.getSelectedItem();
    //if( spec.length() > 0 )
       }
    });*/
    toolbar.getItems().add(searchcolcomb);
    toolbar.getItems().add(syncolorcomb);
    //topcomp.add(ttopcom, BorderLayout.NORTH);

    table.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);
    table.getSelectionModel().selectedItemProperty().addListener(e -> {
        label.setText(table.getItems().size() + "/" + table.getSelectionModel().getSelectedItems().size());
    });

    gtable.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);
    gtable.getSelectionModel().selectedItemProperty().addListener(e -> {
        label.setText(gtable.getItems().size() + "/" + gtable.getSelectionModel().getSelectedItems().size());
    });

    /*JButton but = new JButton(new AbstractAction("Gene sorter") {
       @Override
       public void actionPerformed(ActionEvent e) {
    try {
       GeneSorter.mynd(genelist, table, "t.scotoductusSA01", contigs);
    } catch (IOException e1) {
       e1.printStackTrace();
    }
       }
    });*/

    final TextField ftextfield = new TextField();
    btoolbar.getItems().add(ftextfield);

    ComboBox<String> scombo = new ComboBox();
    scombo.getItems().add("5S/8S");
    scombo.getItems().add("16S/18S");
    scombo.getItems().add("23S/28S");
    scombo.getSelectionModel().selectedItemProperty().addListener(e -> {
        String name = e.toString().split("/")[0];
        InputStream iss = GeneSet.class.getResourceAsStream("/all" + name + ".fsa");
        InputStreamReader isr = new InputStreamReader(iss);
        BufferedReader brr = new BufferedReader(isr);

        JTextArea textarea = new JTextArea();
        JScrollPane scrollpane = new JScrollPane(textarea);

        try {
            String ln = brr.readLine();
            while (ln != null) {
                textarea.append(ln + "\n");

                ln = brr.readLine();
            }
        } catch (IOException e1) {
            e1.printStackTrace();
        }

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

    Button swsearch = new Button("SW Search");
    swsearch.setOnAction(e -> {
        JComponent c = new JComponent() {
        };
        final JProgressBar pb = new JProgressBar();
        final JTextArea textarea = new JTextArea();
        JButton searchbut = new JButton(new AbstractAction("Blast") {
            @Override
            public void actionPerformed(ActionEvent e) {
                final String fasta = textarea.getText();
                final SmithWater sw = new SmithWater();
                final InputStream is = GeneSet.class.getResourceAsStream("/allthermus.aa");
                new Thread() {
                    public void run() {
                        try {
                            sw.fasta_align(new StringReader(fasta), new InputStreamReader(is), pb);
                            List<SmithWater.ALN> alns = sw.getAlignments();
                            SmithWater.ALN first = null;
                            int count = 0;
                            String result = "";
                            Set<String> regnames = new HashSet<String>();
                            for (SmithWater.ALN aln : alns) {
                                if (first == null) {
                                    first = aln;
                                } else if (aln.getScore() < 3.0f * (first.getScore() / 4.0f))
                                    break;
                                result += aln.toString();
                                regnames.add(aln.getShortDestName());

                                if (++count == 10)
                                    break;
                            }
                            textarea.setText(result);

                            for (Gene g : geneset.genelist) {
                                boolean found = false;
                                Tegeval tv = g.tegeval;
                                if (regnames.contains(tv.name)) {
                                    found = true;
                                    break;
                                }
                                if (found) {
                                    gtable.getSelectionModel().select(g);
                                    break;
                                }
                            }
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                }.start();
            }
        });
        c.setLayout(new BorderLayout());
        JScrollPane scrollpane = new JScrollPane(textarea);
        c.add(scrollpane);
        c.add(pb, BorderLayout.NORTH);
        c.add(searchbut, BorderLayout.SOUTH);

        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.add(c);
        frame.setSize(400, 300);
        frame.setVisible(true);
    });
    btoolbar.getItems().add(swsearch);
    btoolbar.getItems().add(jb);

    TableColumn<GeneGroup, String> namedesccol = new TableColumn("Desc");
    namedesccol.setCellValueFactory(new PropertyValueFactory<>("name"));
    table.getColumns().add(namedesccol);
    TableColumn<GeneGroup, String> origincol = new TableColumn("Origin");
    origincol.setCellValueFactory(new PropertyValueFactory<>("origin"));
    table.getColumns().add(origincol);
    TableColumn<GeneGroup, String> geneidcol = new TableColumn("Genid");
    geneidcol.setCellValueFactory(new PropertyValueFactory<>("genid"));
    table.getColumns().add(geneidcol);
    TableColumn<GeneGroup, String> refidcol = new TableColumn("Refid");
    refidcol.setCellValueFactory(new PropertyValueFactory<>("refid"));
    table.getColumns().add(refidcol);
    TableColumn<GeneGroup, String> unidcol = new TableColumn("Unid");
    unidcol.setCellValueFactory(new PropertyValueFactory<>("unid"));
    table.getColumns().add(unidcol);
    TableColumn<GeneGroup, String> keggidcol = new TableColumn("Keggid");
    keggidcol.setCellValueFactory(new PropertyValueFactory<>("keggid"));
    table.getColumns().add(keggidcol);
    TableColumn<GeneGroup, String> keggpathcol = new TableColumn("Kegg pathway");
    keggpathcol.setCellValueFactory(new PropertyValueFactory<>("keggPathway"));
    table.getColumns().add(keggpathcol);
    TableColumn<GeneGroup, String> kocol = new TableColumn("KO");
    kocol.setCellValueFactory(new PropertyValueFactory<>("ko"));
    table.getColumns().add(kocol);
    TableColumn<GeneGroup, String> ksymbcol = new TableColumn("Ksymbol");
    ksymbcol.setCellValueFactory(new PropertyValueFactory<>("ksymbol"));
    table.getColumns().add(ksymbcol);
    TableColumn<GeneGroup, String> symbcol = new TableColumn("Symbol");
    symbcol.setCellValueFactory(new PropertyValueFactory<>("symbol"));
    table.getColumns().add(symbcol);
    TableColumn<GeneGroup, String> konamecol = new TableColumn("KO name");
    konamecol.setCellValueFactory(new PropertyValueFactory<>("koname"));
    table.getColumns().add(konamecol);
    TableColumn<GeneGroup, String> pbidcol = new TableColumn("Pbid");
    pbidcol.setCellValueFactory(new PropertyValueFactory<>("pbid"));
    table.getColumns().add(pbidcol);
    TableColumn<GeneGroup, String> eccol = new TableColumn("Ec");
    eccol.setCellValueFactory(new PropertyValueFactory<>("ec"));
    table.getColumns().add(eccol);
    TableColumn<GeneGroup, String> cognamecol = new TableColumn("Cog name");
    cognamecol.setCellValueFactory(new PropertyValueFactory<>("cogname"));
    table.getColumns().add(cognamecol);
    TableColumn<GeneGroup, String> cogcol = new TableColumn("Cog");
    cogcol.setCellValueFactory(new PropertyValueFactory<>("cog"));
    table.getColumns().add(cogcol);
    TableColumn<GeneGroup, String> cogannocol = new TableColumn("Cog annotation");
    cogannocol.setCellValueFactory(new PropertyValueFactory<>("coganno"));
    table.getColumns().add(cogannocol);
    TableColumn<GeneGroup, String> cogsymbcol = new TableColumn("Cog symbol");
    cogsymbcol.setCellValueFactory(new PropertyValueFactory<>("cogsymbol"));
    table.getColumns().add(cogsymbcol);
    TableColumn<GeneGroup, String> cazycol = new TableColumn("Cazy");
    cazycol.setCellValueFactory(new PropertyValueFactory<>("cazy"));
    table.getColumns().add(cazycol);
    TableColumn<GeneGroup, String> prescol = new TableColumn("Present in");
    prescol.setCellValueFactory(new PropertyValueFactory<>("presentin"));
    table.getColumns().add(prescol);

    TableColumn<GeneGroup, Integer> groupindcol = new TableColumn("Group index");
    groupindcol.setCellValueFactory(new PropertyValueFactory<GeneGroup, Integer>("groupIndex"));
    table.getColumns().add(groupindcol);
    TableColumn<GeneGroup, Integer> groupcovcol = new TableColumn("Group coverage");
    groupcovcol.setCellValueFactory(new PropertyValueFactory<GeneGroup, Integer>("groupCoverage"));
    table.getColumns().add(groupcovcol);
    TableColumn<GeneGroup, Integer> groupsizecol = new TableColumn("Group size");
    groupsizecol.setCellValueFactory(new PropertyValueFactory<GeneGroup, Integer>("groupGeneCount"));
    table.getColumns().add(groupsizecol);

    TableColumn<GeneGroup, String> locprefcol = new TableColumn("Loc pref");
    locprefcol.setCellValueFactory(new PropertyValueFactory<>("locpref"));
    table.getColumns().add(locprefcol);
    TableColumn<GeneGroup, String> avgcpcol = new TableColumn("Avg GC%");
    avgcpcol.setCellValueFactory(new PropertyValueFactory<>("avggcp"));
    table.getColumns().add(avgcpcol);
    TableColumn<GeneGroup, String> numloccol = new TableColumn("#Loc");
    numloccol.setCellValueFactory(new PropertyValueFactory<>("numloc"));
    table.getColumns().add(numloccol);
    TableColumn<GeneGroup, String> numlocgroupcol = new TableColumn("#Loc group");
    numlocgroupcol.setCellValueFactory(new PropertyValueFactory<>("numlocgroup"));
    table.getColumns().add(numlocgroupcol);

    TableColumn<GeneGroup, ShareNum> sharenumcol = new TableColumn("Sharing number");
    sharenumcol.setCellValueFactory(new PropertyValueFactory<>("sharingNumber"));
    table.getColumns().add(sharenumcol);
    TableColumn<GeneGroup, String> maxcyccol = new TableColumn("Max cyc");
    maxcyccol.setCellValueFactory(new PropertyValueFactory<>("maxCyc"));
    table.getColumns().add(maxcyccol);

    TableColumn<Gene, String> gnamedesccol = new TableColumn("Desc");
    gnamedesccol.setCellValueFactory(new PropertyValueFactory<>("name"));
    gtable.getColumns().add(gnamedesccol);
    TableColumn<Gene, String> gorigincol = new TableColumn("Origin");
    gorigincol.setCellValueFactory(new PropertyValueFactory<>("origin"));
    gtable.getColumns().add(gorigincol);
    TableColumn<Gene, String> ggeneidcol = new TableColumn("Genid");
    ggeneidcol.setCellValueFactory(new PropertyValueFactory<>("genid"));
    gtable.getColumns().add(ggeneidcol);
    TableColumn<Gene, String> grefidcol = new TableColumn("Refid");
    grefidcol.setCellValueFactory(new PropertyValueFactory<>("refid"));
    gtable.getColumns().add(grefidcol);
    TableColumn<Gene, String> gunidcol = new TableColumn("Unid");
    gunidcol.setCellValueFactory(new PropertyValueFactory<>("unid"));
    gtable.getColumns().add(gunidcol);
    TableColumn<Gene, String> gkeggidcol = new TableColumn("Keggid");
    gkeggidcol.setCellValueFactory(new PropertyValueFactory<>("keggid"));
    gtable.getColumns().add(gkeggidcol);
    TableColumn<Gene, String> gkeggpathcol = new TableColumn("Kegg pathway");
    gkeggpathcol.setCellValueFactory(new PropertyValueFactory<>("keggPathway"));
    gtable.getColumns().add(gkeggpathcol);
    TableColumn<Gene, String> gkocol = new TableColumn("KO");
    gkocol.setCellValueFactory(new PropertyValueFactory<>("ko"));
    gtable.getColumns().add(gkocol);
    TableColumn<Gene, String> gksymbcol = new TableColumn("Ksymbol");
    gksymbcol.setCellValueFactory(new PropertyValueFactory<>("ksymbol"));
    gtable.getColumns().add(gksymbcol);
    TableColumn<Gene, String> gsymbcol = new TableColumn("Symbol");
    gsymbcol.setCellValueFactory(new PropertyValueFactory<>("symbol"));
    gtable.getColumns().add(gsymbcol);
    TableColumn<Gene, String> gkonamecol = new TableColumn("KO name");
    gkonamecol.setCellValueFactory(new PropertyValueFactory<>("koname"));
    gtable.getColumns().add(gkonamecol);
    TableColumn<Gene, String> gpbidcol = new TableColumn("Pbid");
    gpbidcol.setCellValueFactory(new PropertyValueFactory<>("pbid"));
    gtable.getColumns().add(gpbidcol);
    TableColumn<Gene, String> geccol = new TableColumn("Ec");
    geccol.setCellValueFactory(new PropertyValueFactory<>("ec"));
    gtable.getColumns().add(geccol);
    TableColumn<Gene, String> gcognamecol = new TableColumn("Cog name");
    gcognamecol.setCellValueFactory(new PropertyValueFactory<>("cogname"));
    gtable.getColumns().add(gcognamecol);
    TableColumn<Gene, String> gcogcol = new TableColumn("Cog");
    gcogcol.setCellValueFactory(new PropertyValueFactory<>("cog"));
    gtable.getColumns().add(gcogcol);
    TableColumn<Gene, String> gcogannocol = new TableColumn("Cog annotation");
    gcogannocol.setCellValueFactory(new PropertyValueFactory<>("coganno"));
    gtable.getColumns().add(gcogannocol);
    TableColumn<Gene, String> gcogsymbcol = new TableColumn("Cog symbol");
    gcogsymbcol.setCellValueFactory(new PropertyValueFactory<>("cogsymbol"));
    gtable.getColumns().add(gcogsymbcol);
    TableColumn<Gene, String> gcazycol = new TableColumn("Cazy");
    gcazycol.setCellValueFactory(new PropertyValueFactory<>("cazy"));
    gtable.getColumns().add(gcazycol);
    TableColumn<Gene, String> gprescol = new TableColumn("Present in");
    gprescol.setCellValueFactory(new PropertyValueFactory<>("presentin"));
    gtable.getColumns().add(gprescol);

    TableColumn<Gene, Integer> ggroupindcol = new TableColumn("Group index");
    ggroupindcol.setCellValueFactory(new PropertyValueFactory<>("groupIndex"));
    gtable.getColumns().add(ggroupindcol);
    TableColumn<Gene, Integer> ggroupcovcol = new TableColumn("Group coverage");
    ggroupcovcol.setCellValueFactory(new PropertyValueFactory<>("groupCoverage"));
    gtable.getColumns().add(ggroupcovcol);
    TableColumn<Gene, Integer> ggroupsizecol = new TableColumn("Group size");
    ggroupsizecol.setCellValueFactory(new PropertyValueFactory<>("groupGeneCount"));
    gtable.getColumns().add(ggroupsizecol);

    TableColumn<Gene, String> glocprefcol = new TableColumn("Loc pref");
    glocprefcol.setCellValueFactory(new PropertyValueFactory<>("locpref"));
    gtable.getColumns().add(glocprefcol);
    TableColumn<Gene, String> gavgcpcol = new TableColumn("Avg GC%");
    gavgcpcol.setCellValueFactory(new PropertyValueFactory<>("avggcp"));
    gtable.getColumns().add(gavgcpcol);
    TableColumn<Gene, String> gnumloccol = new TableColumn("#Loc");
    gnumloccol.setCellValueFactory(new PropertyValueFactory<>("numloc"));
    gtable.getColumns().add(gnumloccol);
    TableColumn<Gene, String> gnumlocgroupcol = new TableColumn("#Loc group");
    gnumlocgroupcol.setCellValueFactory(new PropertyValueFactory<>("numlocgroup"));
    gtable.getColumns().add(gnumlocgroupcol);

    TableColumn<Gene, ShareNum> gsharenumcol = new TableColumn("Sharing number");
    gsharenumcol.setCellValueFactory(new PropertyValueFactory<>("sharingNumber"));
    gtable.getColumns().add(gsharenumcol);
    TableColumn<Gene, String> gmaxcyccol = new TableColumn("Max cyc");
    gmaxcyccol.setCellValueFactory(new PropertyValueFactory<>("maxCyc"));
    gtable.getColumns().add(gmaxcyccol);

    /*if( upper != null ) {
       SwingUtilities.invokeLater( new Runnable() {
    public void run() {
       //upper.setContent( botcomp );
       lower.setContent( topcomp );
    }
       });
    } else {
       splitpane.setBottomComponent(botcomp);
       splitpane.setTopComponent(topcomp);
    }
            
    groupModel = new TableModel() {
       @Override
       public int getRowCount() {
    return geneset.allgenegroups == null ? 0 : geneset.allgenegroups.size();
       }
            
       @Override
       public int getColumnCount() {
    return 32+geneset.specList.size();
       }
            
       @Override
       public String getColumnName(int columnIndex) {
    if (columnIndex == 0) {
       return "Desc";
    } else if (columnIndex == 1) {
       return "Origin";
    } else if (columnIndex == 2) {
       return "Genid";
    } else if (columnIndex == 3) {
       return "Refid";
    } else if (columnIndex == 4) {
       return "Unid";
    } else if (columnIndex == 5) {
       return "Keggid";
    } else if (columnIndex == 6) {
       return "Kegg pathway";
    } else if (columnIndex == 7) {
       return "KO";
    } else if (columnIndex == 8) {
       return "KSymbol";
    } else if (columnIndex == 9) {
       return "Symbol";
    } else if (columnIndex == 10) {
       return "KO name";
    } else if (columnIndex == 11) {
       return "Pdbid";
    } else if (columnIndex == 12) {
       return "EC";
    } else if (columnIndex == 13) {
       return "Cog name";
    } else if (columnIndex == 14) {
       return "Cog";
    } else if (columnIndex == 15) {
       return "Cog annotation";
    } else if (columnIndex == 16) {
       return "Cog symbol";
    } else if (columnIndex == 17) {
       return "Cazy";
    } else if (columnIndex == 18) {
       return "Present in";
    } else if (columnIndex == 19) {
       return "Group index";
    } else if (columnIndex == 20) {
       return "Group coverage";
    } else if (columnIndex == 21) {
       return "Group size";
    } else if (columnIndex == 22) {
       return "Locprev";
    } else if (columnIndex == 23) {
       return "Avg GC%";
    } else if (columnIndex == 24) {
       return "# of locus";
    } else if (columnIndex == 25) {
       return "# of loc in group";
    } else if (columnIndex == 26) {
       return "max length";
    } else if (columnIndex == 27) {
       return "sharing number";
    } else if (columnIndex == 28) {
       return "# Cyc";
    } else if (columnIndex == 29) {
       return "16S Corr";
    } else if (columnIndex == 30) {
       return "SingalP";
    } else if (columnIndex == 31) {
       return "TransM";
    } else {
       String spec = geneset.specList.get( columnIndex - 32 );
       if( spec != null ) {
          if( spec.toLowerCase().contains("thermus") ) {
             int i = spec.indexOf('_');
             return spec.substring(i+1, spec.length());
          } else return spec;
       }
       return "";
    }
    /* else if (columnIndex == 19) {
       return "T.tSG0";
    } else if (columnIndex == 20) {
       return "T.tJL18";
    } else if (columnIndex == 21) {
       return "T.tHB8";
    } else if (columnIndex == 22) {
       return "T.tHB27";
    } else if (columnIndex == 23) {
       return "T.scotoSA01";
    } else if (columnIndex == 24) {
       return "T.aqua";
    } else if (columnIndex == 25) {
       return "T.eggert";
    } else if (columnIndex == 26) {
       return "T.island";
    } else if (columnIndex == 27) {
       return "T.antan";
    } else if (columnIndex == 28) {
       return "T.scoto346";
    } else if (columnIndex == 29) {
       return "T.scoto1572";
    } else if (columnIndex == 30) {
       return "T.scoto252";
    } else if (columnIndex == 31) {
       return "T.scoto2101";
    } else if (columnIndex == 32) {
       return "T.scoto2127";
    } else if (columnIndex == 33) {
       return "T.scoto4063";
    } else if (columnIndex == 34) {
       return "T.oshimai";
    } else if (columnIndex == 35) {
       return "T.brockianus";
    } else if (columnIndex == 36) {
       return "T.filiformis";
    } else if (columnIndex == 37) {
       return "T.igniterrae";
    } else if (columnIndex == 38) {
       return "T.kawarayensis";
    } else if (columnIndex == 39) {
       return "T.arciformis";
    } else if (columnIndex == 40) {
       return "T.spCCB";
    } else if (columnIndex == 41) {
       return "T.spRLM";
    } else if (columnIndex == 42) {
       return "T.oshimaiJL2";
    } else if (columnIndex == 43) {
       return "MT.silvianus";
    } else if (columnIndex == 44) {
       return "MT.ruber";
    } else if (columnIndex == 45) {
       return "M.hydro";
    } else if (columnIndex == 46) {
       return "O.profu";
    }*
            
    //return "";
       }
            
       @Override
       public Class<?> getColumnClass(int columnIndex) {
    if( columnIndex == 19 || columnIndex == 20 || columnIndex == 28 )
       return Double.class;
    else if(columnIndex == 10 || (columnIndex >= 17 && columnIndex <= 28) )
       return Integer.class;
    else if (columnIndex >= 32)
       return Teg.class;
    return String.class;
       }
            
       @Override
       public boolean isCellEditable(int rowIndex, int columnIndex) {
    return false;
       }
            
       @Override
       public Object getValueAt(int rowIndex, int columnIndex) {
    GeneGroup gg = geneset.allgenegroups.get(rowIndex);
    if (columnIndex == 0) {
       return gg.getCommonName();
    } else if (columnIndex == 1) {
       return gg.getCommonOrigin();
    } else if (columnIndex == 2) {
       return null;//gene.genid;
    } else if (columnIndex == 3) {
       return gg.getCommonRefId();
    } else if (columnIndex == 4) {
       return gg.getCommonUnId();
    } else if (columnIndex == 5) {
       return gg.getKeggid();
    } else if (columnIndex == 6) {
       return gg.getKeggPathway();
    } else if (columnIndex == 7) {
       return gg.getCommonKO();
    } else if (columnIndex == 8) {
       return gg.getCommonKSymbol();
    } else if (columnIndex == 9) {
       return gg.getCommonSymbol(); //ko2name != null ? ko2name.get( gg.getCommonKO() ) : null;
    } else if (columnIndex == 10) {
       String ret = geneset.ko2name != null ? geneset.ko2name.get( gg.getCommonKO() ) : null;
       if( ret == null ) {
          String symbol = gg.getCommonSymbol();
          if( symbol != null ) {
             if( symbol.length() <= 5 ) ret = symbol;
          }
       }
       return ret;
    } else if (columnIndex == 11) {
       return null;//gene.pdbid;
    } else if (columnIndex == 12) {
       return gg.getCommonEc();
    } else if (columnIndex == 13) {
       Cog cog = gg.getCommonCog( geneset.cogmap );
       if( cog != null ) {
          if( cog.name == null ) cog.name = geneset.cogidmap.get( cog.id );
          return cog.name;
       }
       return null;
    } else if (columnIndex == 14) {
       Cog cog = gg.getCommonCog( geneset.cogmap );
       return cog != null ? cog.id : null;
    } else if (columnIndex == 15) {
       Cog cog = gg.getCommonCog( geneset.cogmap );
       return cog != null ? cog.annotation : null;
    } else if (columnIndex == 16) {
       Cog cog = gg.getCommonCog( geneset.cogmap );
       return cog != null ? cog.genesymbol : null;
    } else if (columnIndex == 17) {
       return gg.getCommonCazy( geneset.cazymap );
    } else if (columnIndex == 18) {
       return gg.getSpecies().size();
    } else if (columnIndex == 19) {
       return gg.groupIndex;
    } else if (columnIndex == 20) {
       return gg.getGroupCoverage();
    } else if (columnIndex == 21) {
       return gg.getGroupGeneCount();
    } else if (columnIndex == 22) {
       return null;//gene.proximityGroupPreservation;
    } else if (columnIndex == 23) {
       return gg.getAvgGCPerc();
    } else if (columnIndex == 24) {
       return gg.genes.size();
    } else if (columnIndex == 25) {
       return gg.getGroupCount();
    } else if (columnIndex == 26) {
       return gg.getMaxLength();
    } else if (columnIndex == 27) {
       return geneset.specset.get( gg.getSpecies() );
    } else if (columnIndex == 28) {
       return gg.getMaxCyc();
    } else if (columnIndex == 29) {
       return gg.getGroupCoverage() == 39 && gg.getGroupCount() == 39 ? 0 : -1;
    } else if (columnIndex == 30) {
       return gg.getCommonSignalP();
    } else if (columnIndex == 31) {
       return gg.getCommonTransM();
    } else {
       String spec = geneset.specList.get( columnIndex - 32 );
       Teginfo ret = geneset.getGroupTes( gg, spec );
       return ret;
       //return null;
    }
    //return columnIndex >= 11 ? null : "";
       }
            
       @Override
       public void setValueAt(Object aValue, int rowIndex, int columnIndex) {}
            
       @Override
       public void addTableModelListener(TableModelListener l) {}
            
       @Override
       public void removeTableModelListener(TableModelListener l) {}
    };
    defaultModel = new TableModel() {
       @Override
       public int getRowCount() {
    int gs = geneset.genelist.size();
    return gs;
       }
            
       @Override
       public int getColumnCount() {
    return 26+geneset.specList.size();
       }
            
       @Override
       public String getColumnName(int columnIndex) {
    if (columnIndex == 0) {
       return "Desc";
    } else if (columnIndex == 1) {
       return "Origin";
    } else if (columnIndex == 2) {
       return "Genid";
    } else if (columnIndex == 3) {
       return "Refid";
    } else if (columnIndex == 4) {
       return "Unid";
    } else if (columnIndex == 5) {
       return "Keggid";
    } else if (columnIndex == 6) {
       return "KOid";
    } else if (columnIndex == 7) {
       return "KSymbol";
    } else if (columnIndex == 8) {
       return "Symbol";
    } else if (columnIndex == 9) {
       return "KOname";
    } else if (columnIndex == 10) {
       return "Pdbid";
    } else if (columnIndex == 11) {
       return "ecid";
    } else if (columnIndex == 12) {
       return "COG";
    } else if (columnIndex == 13) {
       return "COG name";
    } else if (columnIndex == 14) {
       return "Present in";
    } else if (columnIndex == 15) {
       return "Group index";
    } else if (columnIndex == 16) {
       return "Group coverage";
    } else if (columnIndex == 17) {
       return "Group size";
    } else if (columnIndex == 18) {
       return "Locprev";
    } else if (columnIndex == 19) {
       return "Avg GC%";
    } else if (columnIndex == 20) {
       return "# of locus";
    } else if (columnIndex == 21) {
       return "# of loc in group";
    } else if (columnIndex == 22) {
       return "max length";
    } else if (columnIndex == 23) {
       return "sharing number";
    } else if (columnIndex == 24) {
       return "# Cyc";
    } else if (columnIndex == 25) {
       return "16S Corr";
    } else {
       return geneset.specList.get( columnIndex - 26 );
    } /*else if (columnIndex == 19) {
       return "T.tSG0";
    } else if (columnIndex == 20) {
       return "T.tJL18";
    } else if (columnIndex == 21) {
       return "T.tHB8";
    } else if (columnIndex == 22) {
       return "T.tHB27";
    } else if (columnIndex == 23) {
       return "T.scotoSA01";
    } else if (columnIndex == 24) {
       return "T.aqua";
    } else if (columnIndex == 25) {
       return "T.eggert";
    } else if (columnIndex == 26) {
       return "T.island";
    } else if (columnIndex == 27) {
       return "T.antan";
    } else if (columnIndex == 28) {
       return "T.scoto346";
    } else if (columnIndex == 29) {
       return "T.scoto1572";
    } else if (columnIndex == 30) {
       return "T.scoto252";
    } else if (columnIndex == 31) {
       return "T.scoto2101";
    } else if (columnIndex == 32) {
       return "T.scoto2127";
    } else if (columnIndex == 33) {
       return "T.scoto4063";
    } else if (columnIndex == 34) {
       return "T.oshimai";
    } else if (columnIndex == 35) {
       return "T.brockianus";
    } else if (columnIndex == 36) {
       return "T.filiformis";
    } else if (columnIndex == 37) {
       return "T.igniterrae";
    } else if (columnIndex == 38) {
       return "T.kawarayensis";
    } else if (columnIndex == 39) {
       return "T.arciformis";
    } else if (columnIndex == 40) {
       return "T.spCCB";
    } else if (columnIndex == 41) {
       return "T.spRLM";
    } else if (columnIndex == 42) {
       return "T.oshimaiJL2";
    } else if (columnIndex == 43) {
       return "MT.silvianus";
    } else if (columnIndex == 44) {
       return "MT.ruber";
    } else if (columnIndex == 45) {
       return "M.hydro";
    } else if (columnIndex == 46) {
       return "O.profu";
    }*
       }
            
       @Override
       public Class<?> getColumnClass(int columnIndex) {
    if( columnIndex == 16 || columnIndex == 19 || columnIndex == 25 )
       return Double.class;
    else if(columnIndex >= 13 && columnIndex <= 24)
       return Integer.class;
    else if (columnIndex >= 26)
       return Teg.class;
    return String.class;
       }
            
       @Override
       public boolean isCellEditable(int rowIndex, int columnIndex) {
    return false;
       }
            
       @Override
       public Object getValueAt(int rowIndex, int columnIndex) {
    Gene gene = geneset.genelist.get(rowIndex);
    if (columnIndex == 0) {
       GeneGroup gg = gene.getGeneGroup();
       return gg != null ? gene.getGeneGroup().getCommonName() : null;
    } else if (columnIndex == 1) {
       return gene.getSpecies();
    } else if (columnIndex == 2) {
       return gene.genid;
    } else if (columnIndex == 3) {
       return gene.refid;
    } else if (columnIndex == 4) {
       return gene.uniid;
    } else if (columnIndex == 5) {
       return gene.keggid;
    } else if (columnIndex == 6) {
       GeneGroup gg = gene.getGeneGroup();
       return gg != null ? gg.getCommonKO() : null;
    } else if (columnIndex == 7) {
       GeneGroup gg = gene.getGeneGroup();
       return gg != null ? gg.getCommonKSymbol() : null;
    } else if (columnIndex == 8) {
       GeneGroup gg = gene.getGeneGroup();
       return gg != null ? gg.getCommonSymbol() : null; //gene.symbol
    } else if (columnIndex == 9) {
       GeneGroup gg = gene.getGeneGroup();
       return gg != null ? gg.getCommonKOName( geneset.ko2name ) : null;
    } else if (columnIndex == 10) {
       return gene.pdbid;
    } else if (columnIndex == 11) {
       return gene.ecid;
    } else if (columnIndex == 12) {
       Cog cog = gene.getGeneGroup() != null ? gene.getGeneGroup().getCommonCog( geneset.cogmap ) : null;
       if( cog != null ) return cog.id;
       return null;
    } else if (columnIndex == 13) {
       Cog cog = gene.getGeneGroup() != null ? gene.getGeneGroup().getCommonCog( geneset.cogmap ) : null;
       if( cog != null ) return cog.name;
       return null;
    } else if (columnIndex == 14) {
       return gene.getGeneGroup().getSpecies().size();
    } else if (columnIndex == 15) {
       return gene.getGroupIndex();
    } else if (columnIndex == 16) {
       return gene.getGroupCoverage();
    } else if (columnIndex == 17) {
       return gene.getGroupGenCount();
    } else if (columnIndex == 18) {
       return gene.proximityGroupPreservation;
    } else if (columnIndex == 19) {
       return gene.getGCPerc();
    } else if (columnIndex == 20) {
       /*int val = 0;
       for (String str : gene.species.keySet()) {
          val += gene.species.get(str).tset.size();
       }*
       return 1;
    } else if (columnIndex == 21) {
       return gene.getGroupCount();
    } else if (columnIndex == 22) {
       return gene.getMaxLength();
    } else if (columnIndex == 23) {
       GeneGroup gg = gene.getGeneGroup();
       if( gg != null && gg.getSpecies() != null ) {
          return geneset.specset.get( gg.getSpecies() );
       }
       return null;
    } else if (columnIndex == 24) {
       gene.getMaxCyc();
    } else if (columnIndex == 25) {
       return gene.getGroupCoverage() == 35 && gene.getGroupCount() == 35 ? gene.corr16s : -1;
    } else {
       /*String spec = specList.get( columnIndex-26 );
       /*if( spec.contains("timidus") ) {
          System.err.println();
       }*
       //Teginfo set = gene.species.equals(spec) ? gene.teginfo : null;
       if( gene.getSpecies().equals( spec ) ) {
          return gene.tegeval;
       } else {
          return gene.getGeneGroup().species.get( spec );
       }*
               
       return null;
    }
    return columnIndex >= 17 ? null : "";
       }
            
       @Override
       public void setValueAt(Object aValue, int rowIndex, int columnIndex) {}
            
       @Override
       public void addTableModelListener(TableModelListener l) {}
            
       @Override
       public void removeTableModelListener(TableModelListener l) {}
    };
    table.setModel( groupModel );*/
    //table.setModel( defaultModel );

    /*
     * Comparator<Tegeval> wrapMe = new Comparator<Tegeval>() { public int
     * compare(Tegeval o1, Tegeval o2) { return o1.compareTo(o2); } };
     * DefaultRowSorter<TableModel, Integer> rowsorter =
     * (DefaultRowSorter<TableModel,Integer>)table.getRowSorter(); for( int
     * i = 10; i < 23; i++ ) { rowsorter.setComparator(i,
     * NullComparators.atEnd(wrapMe)); }
     */

    /*table.getRowSorter().addRowSorterListener( new RowSorterListener() {
       @Override
       public void sorterChanged(RowSorterEvent e) {
    for (String cstr : geneset.contigmap.keySet()) {
       Sequence c = geneset.contigmap.get(cstr);
       //c.count = 0;
       c.loc = 0.0;
    }
            
    if( table.getModel() == defaultModel ) {
       for (Gene g : geneset.genelist) {
          Tegeval tv = g.tegeval;
             // int first = tv.cont.indexOf('_');
             // int sec = tv.cont.indexOf('_',first+1);
          Sequence cont = tv.getContshort(); // tv.cont.substring(0,sec);
          if( cont != null && geneset.contigmap.containsKey(cont.getName()) ) {
             Sequence c = geneset.contigmap.get(cont.getName());
             //c.count++;
             int val = table.convertRowIndexToView(g.index);
             c.loc += (double) val;
          }
       }
    }
    for( JSplitPane gsplitpane : splitpaneList ) {
       gsplitpane.repaint();
    }
       }
    });*/

    ftable = upper;
    ftable.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);
    /*ftable = new JTable() {
       public String getToolTipText(MouseEvent me) {
    Point p = me.getPoint();
    int r = rowAtPoint(p);
    int c = columnAtPoint(p);
    if (r >= 0 && r < super.getRowCount()) {
       Object ret = super.getValueAt(r, c);
       if (ret != null) {
          return ret.toString(); // super.getToolTipText( me );
       }
    }
    return "";
       }
    };*/

    ContextMenu fpopup = new ContextMenu();
    MenuItem amigo = new MenuItem("Amigo lookup");
    amigo.setOnAction(e -> {
        String go = ftable.getSelectionModel().getSelectedItem().getGo();
        try {
            // GeneSetHead.this.getAppletContext().
            Desktop.getDesktop()
                    .browse(new URI("http://amigo.geneontology.org/cgi-bin/amigo/term_details?term=" + go));
        } catch (IOException e1) {
            e1.printStackTrace();
        } catch (URISyntaxException e1) {
            e1.printStackTrace();
        }
    });
    fpopup.getItems().add(amigo);
    MenuItem keggl = new MenuItem("KEGG lookup");
    keggl.setOnAction(e -> {
        String kegg = ftable.getSelectionModel().getSelectedItem().getKegg();
        try {
            Desktop.getDesktop().browse(new URI("http://www.genome.jp/dbget-bin/www_bget?rn:" + kegg));
        } catch (IOException e1) {
            e1.printStackTrace();
        } catch (URISyntaxException e1) {
            e1.printStackTrace();
        }
    });
    fpopup.getItems().add(keggl);
    MenuItem ecl = new MenuItem("EC lookup");
    ecl.setOnAction(e -> {
        String ec = ftable.getSelectionModel().getSelectedItem().getEc();
        try {
            Desktop.getDesktop().browse(new URI("http://enzyme.expasy.org/EC/" + ec));
        } catch (IOException e1) {
            e1.printStackTrace();
        } catch (URISyntaxException e1) {
            e1.printStackTrace();
        }
    });
    fpopup.getItems().add(ecl);
    fpopup.getItems().add(new SeparatorMenuItem());

    MenuItem excelreport = new MenuItem("Excel report");
    excelreport.setOnAction(e -> {
        Workbook workbook = new XSSFWorkbook();
        Sheet sheet = workbook.createSheet("enzyme");
        int k = 0;
        for (Function f : ftable.getSelectionModel().getSelectedItems()) {
            //String ec = (String)ftable.getValueAt(r, 1);
            //String go = (String)ftable.getValueAt(r, 0);

            //int i = ftable.getSelectionModel().convertRowIndexToModel(r);
            //Function f = geneset.funclist.get(i);
            for (GeneGroup gg : f.getGeneGroups()) {
                for (String spec : gg.getSpecies()) {
                    Teginfo ti = gg.getGenes(spec);

                    Row row = sheet.createRow(k++);
                    Cell ecell = row.createCell(0);
                    ecell.setCellValue("EC:" + f.getEc());
                    Cell ncell = row.createCell(1);
                    ncell.setCellValue(f.getName());
                    Cell spell = row.createCell(2);
                    spell.setCellValue(spec);
                    Cell seqcell = row.createCell(3);
                    seqcell.setCellValue(ti.tset.size());
                }
                /*for( Gene g :gg.genes ) {
                   Row    row = sheet.createRow(k++);
                   Cell    ecell = row.createCell(0);
                   ecell.setCellValue( "EC:"+f.ec );
                   Cell    ncell = row.createCell(1);
                   ncell.setCellValue( f.name );
                   Cell    spell = row.createCell(2);
                   spell.setCellValue( g.getSpecies() );
                   Cell    seqcell = row.createCell(3);
                   seqcell.setCellValue( g.tegeval.getAlignedSequence().toString() );
                }*/
            }
            sheet.createRow(k++);
        }

        try {
            Path tempfile = Files.createTempFile("enzyme", ".xlsx");
            OutputStream os = Files.newOutputStream(tempfile);
            workbook.write(os);
            os.close();

            Desktop.getDesktop().open(tempfile.toFile());
        } catch (FileNotFoundException e1) {
            e1.printStackTrace();
        } catch (IOException e1) {
            e1.printStackTrace();
        }
    });
    fpopup.getItems().add(excelreport);
    ftable.setContextMenu(fpopup);

    ContextMenu popup = new ContextMenu();
    MenuItem splitaction = new MenuItem("Split");
    splitaction.setOnAction(e -> {
        Dialog<Set<GeneGroup>> dialog = new Dialog<>();
        dialog.setResizable(true);

        GridPane grid = new GridPane();
        grid.setHgap(10);
        grid.setVgap(10);
        grid.setPadding(new Insets(20, 20, 10, 10));

        TextField len = new TextField();
        len.setPromptText("0.5");
        TextField id = new TextField();
        id.setPromptText("0.5");

        grid.add(new Label("%Length:"), 0, 0);
        grid.add(len, 1, 0);
        grid.add(new Label("%Identity:"), 0, 1);
        grid.add(id, 1, 1);

        final ListView<GeneGroup> list = new ListView<>();
        list.setPrefWidth(400);
        grid.add(list, 0, 2, 2, 1);

        final GeneGroup gg = table.getSelectionModel().getSelectedItem();
        list.setItems(FXCollections.singletonObservableList(gg));

        Label groupsize = new Label("" + gg.genes.size());
        grid.add(groupsize, 0, 3, 2, 1);

        len.textProperty().addListener((observable, oldValue, newValue) -> {
            if (!newValue.equals(oldValue)) {
                double d = 0;
                try {
                    d = Double.parseDouble(newValue);
                } catch (Exception ex) {
                }

                if (d > 0) {
                    Set<GeneGroup> ggmap = new HashSet<>();
                    Map<String, Integer> blosumMap = JavaFasta.getBlosumMap(false);
                    for (Gene gene : gg.genes) {
                        if (ggmap.stream().flatMap(f -> f.genes.stream()).noneMatch(p -> gene == p)) {
                            Set<Gene> ggset = new HashSet<>();
                            Sequence seq1 = gene.tegeval.getAlignedSequence();
                            for (Gene cgene : gg.genes) {
                                Sequence seq2 = cgene.tegeval.getAlignedSequence();
                                int[] tscore = GeneCompare.blosumValue(seq1, seq1, seq2, blosumMap);
                                int sscore = GeneCompare.blosumValue(seq1, seq2, blosumMap);

                                double dval = (double) (sscore - tscore[1]) / (double) (tscore[0] - tscore[1]);
                                if (dval > d) {
                                    ggset.add(cgene);
                                }
                            }
                            System.err.println(ggset.size());

                            Set<GeneGroup> osubgg = ggmap.stream().filter(f -> {
                                Set<Gene> gs = new HashSet<>(ggset);
                                gs.retainAll(f.genes);
                                return gs.size() > 0;
                            }).collect(Collectors.toSet());
                            GeneGroup subgg;
                            if (osubgg.size() > 0) {
                                Iterator<GeneGroup> git = osubgg.iterator();
                                subgg = git.next();
                                while (git.hasNext()) {
                                    GeneGroup remgg = git.next();
                                    subgg.addGenes(remgg.genes);
                                    ggmap.remove(remgg);
                                }
                            } else {
                                subgg = new GeneGroup();
                                subgg.setCogMap(gg.getCogMap());
                                subgg.setKonameMap(gg.getKonameMap());
                                subgg.setSpecSet(gg.getSpecSet());
                                ggmap.add(subgg);
                            }
                            subgg.addGenes(ggset);
                        }
                    }
                    Set<GeneGroup> sgg = ggmap.stream().collect(Collectors.toSet());

                    List<GeneGroup> lgg = new ArrayList(sgg);
                    list.setItems(FXCollections.observableList(lgg));
                    dialog.setResultConverter(param -> sgg);
                }
            }
        });

        dialog.getDialogPane().setContent(grid);
        dialog.getDialogPane().getButtonTypes().add(ButtonType.OK);
        dialog.getDialogPane().getButtonTypes().add(ButtonType.CANCEL);
        Optional<Set<GeneGroup>> ogg = dialog.showAndWait();

        ogg.ifPresent(c -> {
            geneset.allgenegroups.remove(gg);
            geneset.allgenegroups.addAll(c);

            Map<String, String> env = new HashMap<>();
            env.put("create", "true");
            try {
                geneset.zipfilesystem = FileSystems.newFileSystem(geneset.zipuri, env);
                for (Path root : geneset.zipfilesystem.getRootDirectories()) {
                    Files.walk(root).filter(f -> f.toString().startsWith("/aligned"))
                            .filter(f -> f.toString().endsWith(".aa")).filter(f -> {
                                String filename = f.getFileName().toString();
                                return gg.genes.stream().anyMatch(g -> {
                                    String fnid = filename.substring(0, filename.length() - 3);
                                    return g.name.equals(fnid);
                                });
                            }).forEach(p -> {
                                try {
                                    Files.deleteIfExists(p);
                                } catch (IOException e1) {
                                    e1.printStackTrace();
                                }
                            });
                    /*for( Gene g : gg.genes ) {
                       if( g.keggpathway != null ) {
                          String sub = g.keggpathway.substring(0,3);
                          Path subf = root.resolve(sub);
                          if( Files.exists(subf) ) {
                             String[] split = g.keggpathway.split(" ");
                             for( String s : split ) {
                      Path pimg = subf.resolve(s+".png");
                      if( Files.exists(pimg) ) {
                         showKeggPathway( sub, pimg );
                      }
                             }
                          }
                       }
                    }*/
                    final Path p = root.resolve("/aligned");
                    c.stream().forEach(fgg -> {
                        Path np = p.resolve(fgg.genes.iterator().next().getName());
                        try {
                            Writer w = Files.newBufferedWriter(np);
                            fgg.getFasta(w, false);
                            w.close();
                        } catch (IOException e1) {
                            e1.printStackTrace();
                        }
                    });
                    break;
                }
                geneset.zipfilesystem.close();
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        });
    });
    popup.getItems().add(splitaction);
    MenuItem joinaction = new MenuItem("Join");

    popup.getItems().add(joinaction);
    popup.getItems().add(new SeparatorMenuItem());
    MenuItem showkegg = new MenuItem("Show KEGG pathway");
    showkegg.setOnAction(e -> {
        GeneGroup gg = table.getSelectionModel().getSelectedItem();

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

        /*String uristr = "jar:" + geneset.zippath.toUri();
        URI zipuri = URI.create( uristr /*.replace("file://", "file:")* );
        final List<Path>   lbi = new ArrayList<>();*/
        boolean shown = false;
        try {
            geneset.zipfilesystem = FileSystems.newFileSystem(geneset.zipuri, env);
            for (Path root : geneset.zipfilesystem.getRootDirectories()) {
                for (Gene g : gg.genes) {
                    if (g.keggpathway != null) {
                        String sub = g.keggpathway.substring(0, 3);
                        Path subf = root.resolve(sub);
                        if (Files.exists(subf)) {
                            String[] split = g.keggpathway.split(" ");
                            for (String s : split) {
                                Path pimg = subf.resolve(s + ".png");
                                if (Files.exists(pimg)) {
                                    showKeggPathway(sub, pimg);
                                    shown = true;
                                    break;
                                }
                            }
                        }
                    }
                }
                break;
            }
            geneset.zipfilesystem.close();
        } catch (Exception ex) {
            ex.printStackTrace();
        }

        if (!shown) {
            for (Gene g : gg.genes) {
                if (g.keggpathway != null) {
                    String[] keggsplit = g.keggpathway.split(";");
                    Arrays.stream(keggsplit).map(s -> s.split(":")[0]).findFirst().ifPresent(c -> {
                        try {
                            Desktop.getDesktop().browse(
                                    URI.create("http://www.genome.jp/dbget-bin/www_bget?map" + c.substring(2)));
                        } catch (IOException e1) {
                            e1.printStackTrace();
                        }
                    });
                }
            }
        }
    });
    popup.getItems().add(showkegg);
    MenuItem plasmid = new MenuItem("Plasmid");
    plasmid.setOnAction(e -> {
        Gene g = gtable.getSelectionModel().getSelectedItem();
        Sequence contig = g.tegeval.getContshort();
        String contigstr = contig.toString();
        contig.plasmid = !geneset.plasmids.contains(contigstr);
        if (contig.plasmid)
            geneset.plasmids.add(contigstr);
        else
            geneset.plasmids.remove(contigstr);

        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);

            //fs = FileSystems.newFileSystem( uri, env );
            //FileSystem fs = FileSystems.newFileSystem(uri, env);

            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            for (String contigname : geneset.plasmids) {
                baos.write((contigname + "\n").getBytes());
            }

            Path nf = geneset.zipfilesystem.getPath("/plasmids.txt");
            long bl = Files.copy(new ByteArrayInputStream(baos.toByteArray()), nf,
                    StandardCopyOption.REPLACE_EXISTING);
            //System.err.println( "eeerm " + bl );
            geneset.zipfilesystem.close();

            /*Writer writer = Files.newBufferedWriter(nf, StandardCharsets.UTF_8, StandardOpenOption.CREATE);
            for( String phage : phageset ) {
               writer.write( phage + "\n" );
            }
            writer.close();*/

            //writer.write("hello");
        } catch (IOException e1) {
            e1.printStackTrace();
        }
    });
    popup.getItems().add(plasmid);
    MenuItem designate = new MenuItem("Designate");
    designate.setOnAction(e -> {
        SwingUtilities.invokeLater(() -> {
            JComboBox<String> descombo = new JComboBox<>(
                    geneset.deset.toArray(new String[geneset.deset.size()]));
            descombo.setEditable(true);
            JOptionPane.showMessageDialog(GeneSetHead.this, descombo);
            String val = descombo.getSelectedItem().toString();
            geneset.deset.add(val);
            for (Gene g : gtable.getSelectionModel().getSelectedItems()) {
                g.tegeval.designation = val;
                if (g.id != null) {
                    geneset.designations.put(g.id, val);
                } else {
                    System.err.println(g.refid);
                }
                //ta.append( g.tegeval.id + "\n" );
            }

            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);

                //fs = FileSystems.newFileSystem( uri, env );
                //FileSystem fs = FileSystems.newFileSystem(uri, env);

                ByteArrayOutputStream baos = new ByteArrayOutputStream();
                for (String geneid : geneset.designations.keySet()) {
                    String design = geneset.designations.get(geneid);
                    baos.write((geneid + "\t" + design + "\n").getBytes());
                }

                Path nf = geneset.zipfilesystem.getPath("/designations.txt");
                long bl = Files.copy(new ByteArrayInputStream(baos.toByteArray()), nf,
                        StandardCopyOption.REPLACE_EXISTING);
                //System.err.println( "eeerm " + bl );
                geneset.zipfilesystem.close();

                /*Writer writer = Files.newBufferedWriter(nf, StandardCharsets.UTF_8, StandardOpenOption.CREATE);
                for( String phage : phageset ) {
                    writer.write( phage + "\n" );
                }
                writer.close();*/

                //writer.write("hello");
            } catch (IOException e1) {
                e1.printStackTrace();
            }

            /*JFrame frame = new JFrame("Ids");
            frame.setDefaultCloseOperation( JFrame.DISPOSE_ON_CLOSE );
            frame.setSize(800, 600);
            JTextArea   ta = new JTextArea();
            JScrollPane sp = new JScrollPane( ta );
            frame.add( sp );
                    
            frame.setVisible( true );*/
        });
    });
    popup.getItems().add(designate);
    MenuItem koname = new MenuItem("KO to name");
    koname.setOnAction(e -> {
        Set<String> koids = new HashSet<>();
        for (Gene g : geneset.genelist) {
            if (g.koid != null && g.koid.length() > 0
                    && !(geneset.ko2name != null && geneset.ko2name.containsKey(g.koid)))
                koids.add(g.koid);
        }

        try {
            Map<String, String> ko2name = new HashMap<>();
            int cnt = 0;
            for (String koid : koids) {
                URL url = new URL("http://www.kegg.jp/dbget-bin/www_bget?ko:" + koid);
                InputStream is0 = url.openStream();
                StringBuilder sb = new StringBuilder();
                BufferedReader br0 = new BufferedReader(new InputStreamReader(is0));
                String line0 = br0.readLine();
                while (line0 != null) {
                    sb.append(line0);
                    line0 = br0.readLine();
                }
                br0.close();

                int i = sb.indexOf("<nobr>Name</nobr>");
                if (i != -1) {
                    int k = sb.indexOf(":hidden\">");
                    if (k != -1) {
                        k = sb.indexOf(":hidden\">", k + 9);
                        if (k != -1) {
                            String koname0 = sb.substring(k + 9, sb.indexOf("<br>", k));
                            ko2name.put(koid, koname0);

                            System.err.println(koid + "\t" + koname0);
                        }
                    }
                }

                System.err.println(ko2name.size() + " " + koids.size());
                //if( cnt++ > 20 ) break;
            }

            FileWriter fw = new FileWriter("~ko2name.txt");
            for (String koid : ko2name.keySet()) {
                fw.write(koid + "\t" + ko2name.get(koid) + "\n");
            }
            fw.close();
        } catch (IOException e1) {
            e1.printStackTrace();
        }
    });
    popup.getItems().add(koname);
    popup.getItems().add(new SeparatorMenuItem());
    MenuItem genegainloss = new MenuItem("Gene gain/loss");
    genegainloss.setOnAction(e -> {
        Map<Node, List<GeneGroup>> nodeGainMap = new HashMap<>();
        Map<Node, List<GeneGroup>> nodeLossMap = new HashMap<>();

        /*String treestr = "";
        JFileChooser fc = new JFileChooser();
        if( fc.showOpenDialog( applet ) == JFileChooser.APPROVE_OPTION ) {
           File file = fc.getSelectedFile();
           try {
              byte[] bb = Files.readAllBytes( Paths.get(file.toURI()) );
              treestr = new String( bb );
           } catch (IOException e1) {
              e1.printStackTrace();
           }
        }*/

        Serifier serifier = getConcatenatedSequences(false, true);
        String tree = serifier.getFastTree(serifier.lseq, geneset.user, false);

        TreeUtil tu = new TreeUtil();
        Node n = tu.parseTreeRecursive(tree, false);

        TableModel model = new TableModel() {
            @Override
            public int getRowCount() {
                return geneset.getSpecies().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.getSpecies().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);
        FlowLayout flowlayout = new FlowLayout();
        JComponent c = new JComponent() {
        };
        c.setLayout(flowlayout);
        c.add(scroll);
        JOptionPane.showMessageDialog(comp, c);

        List<String> rootgroup = new ArrayList<>();
        int[] rr = table.getSelectedRows();
        for (int r : rr) {
            rootgroup.add((String) table.getValueAt(r, 0));
        }

        //String[] sobj = {"mt.ruber", "mt.silvanus", "o.profundus", "m.hydrothermalis"};
        Node newnode = tu.getParent(n, new HashSet<>(rootgroup));
        tu.rerootRecur(n, newnode);

        File f = new File("/home/sigmar/gain_list.txt");
        try {
            PrintStream ps = new PrintStream(f);
            geneset.assignGain(newnode, nodeGainMap, ps);
            ps.close();
        } catch (FileNotFoundException e1) {
            e1.printStackTrace();
        }

        f = new File("/home/sigmar/loss_list.txt");
        try {
            PrintStream ps = new PrintStream(f);
            geneset.assignLoss(newnode, nodeLossMap, ps);
            ps.close();
        } catch (FileNotFoundException e1) {
            e1.printStackTrace();
        }
    });
    popup.getItems().add(genegainloss);
    MenuItem concattree = new MenuItem("Concatenate tree");
    concattree.setOnAction(e -> {
        Serifier serifier = getConcatenatedSequences(false, true);

        boolean succ = true;
        if (comp instanceof Applet) {
            try {
                JSObject win = JSObject.getWindow((Applet) comp);
                StringWriter sw = new StringWriter();
                serifier.writeFasta(serifier.lseq, sw, null);
                sw.close();
                win.call("fasttree", new Object[] { sw.toString() });
            } catch (NoSuchMethodError | Exception e1) {
                e1.printStackTrace();
                succ = false;
            }
        }

        /*if( !succ ) {
           String             tree = serifier.getFastTree();
           if( cs.connections().size() > 0 ) {
        cs.sendToAll( tree );
            } else if( Desktop.isDesktopSupported() ) {
        cs.message = tree;
        //String uristr = "http://webconnectron.appspot.com/Treedraw.html?tree="+URLEncoder.encode( tree, "UTF-8" );
        String uristr = "http://webconnectron.appspot.com/Treedraw.html?ws=127.0.0.1:8887";
              try {
          Desktop.getDesktop().browse( new URI(uristr) );
              } catch (IOException | URISyntaxException e1) {
          e1.printStackTrace();
              }
            }
           System.err.println( tree );
        }*/
        showAlignedSequences(comp, serifier);
    });
    popup.getItems().add(concattree);
    MenuItem majocons = new MenuItem("Majority rule consensus");
    majocons.setOnAction(e -> {
        Serifier serifier = new Serifier();

        Set<GeneGroup> genegroups = new HashSet<GeneGroup>();
        if (!isGeneview()) {
            genegroups.addAll(table.getSelectionModel().getSelectedItems());
        } else {
            for (Gene gg : gtable.getSelectionModel().getSelectedItems()) {
                genegroups.add(gg.getGeneGroup());
            }
        }

        TreeUtil treeutil = new TreeUtil();
        Map<Set<String>, NodeSet> nmap = new HashMap<Set<String>, NodeSet>();
        for (GeneGroup ggroup : genegroups) {
            //List<Sequence>   seqlist = new ArrayList<Sequence>();

            for (Tegeval tv : ggroup.getTegevals()) {
                String spec = tv.getContshort().getSpec();
                Sequence seq = tv.getAlignedSequence();

                //Sequence seq = new Sequence( spec, null );
                //if( seqstr != null && seqstr.length() > 0 ) seq.append( seqstr );
                serifier.addSequence(seq);
            }

            String tree = serifier.getFastTree(serifier.lseq, geneset.user, false);
            Node n = treeutil.parseTreeRecursive(tree, false);
            treeutil.setLoc(0);
            n.nodeCalcMap(nmap);
        }

        Node guidetree = null;

        /*********************************** Serifier serifier = getConcatenatedSequences();
        String tree = serifier.getFastTree();
        guidetree = treeutil.parseTreeRecursive( tree, false );*/

        Node root = DataTable.majoRuleConsensus(treeutil, nmap, guidetree, false);
        String tree = root.toString();

        if (geneset.cs.connections().size() > 0) {
            geneset.cs.sendToAll(tree);
        } else if (Desktop.isDesktopSupported()) {
            geneset.cs.message = tree;
            //String uristr = "http://webconnectron.appspot.com/Treedraw.html?tree="+URLEncoder.encode( tree, "UTF-8" );
            String uristr = "http://webconnectron.appspot.com/Treedraw.html?ws=127.0.0.1:8887";
            try {
                Desktop.getDesktop().browse(new URI(uristr));
            } catch (IOException | URISyntaxException e1) {
                e1.printStackTrace();
            }
        }
    });
    popup.getItems().add(majocons);
    MenuItem addsim = new MenuItem("Add similar");
    addsim.setOnAction(e -> {
        /*int r = table.getSelectedRow();
        int c = table.getSelectedColumn();
                
        Object o = table.getValueAt(r, c);
                
        if (c >= 18) {
           for (int i = 0; i < table.getRowCount(); i++) {
              Object no = table.getValueAt(i, c);
              if (no != null && !table.isRowSelected(i))
          table.addRowSelectionInterval(i, i);
           }
        } else {
           for (int i = 0; i < table.getRowCount(); i++) {
              Object no = table.getValueAt(i, c);
              if (o.equals(no) && !table.isRowSelected(i))
          table.addRowSelectionInterval(i, i);
           }
        }*/
    });
    popup.getItems().add(addsim);
    MenuItem selsim = new MenuItem("Select similar");
    selsim.setOnAction(e -> {
        /*int r = table.getSelectedRow();
        int c = table.getSelectedColumn();
                
        Object o = table.getValueAt(r, c);
                
        table.removeRowSelectionInterval(0, table.getRowCount() - 1);
        if (c >= 18) {
           for (int i = 0; i < table.getRowCount(); i++) {
              Object no = table.getValueAt(i, c);
              if (no != null)
          table.addRowSelectionInterval(i, i);
           }
        } else {
           for (int i = 0; i < table.getRowCount(); i++) {
              Object no = table.getValueAt(i, c);
              if (o.equals(no))
          table.addRowSelectionInterval(i, i);
           }
        }*/
    });
    popup.getItems().add(selsim);
    MenuItem tabtxt = new MenuItem("Table text");
    tabtxt.setOnAction(e -> {
        /*JTextArea ta = new JTextArea();
        ta.setDragEnabled(true);
        JScrollPane scrollpane = new JScrollPane(ta);
                
        StringBuilder sb = new StringBuilder();
        int[] rr = table.getSelectedRows();
        for (int r : rr) {
           for (int c = 0; c < table.getColumnCount() - 1; c++) {
              Object o = table.getValueAt(r, c);
              if (c > 18) {
          if (o != null) {
             String val = o.toString();
             int k = val.indexOf(' ');
             sb.append(val.substring(0, k));
             sb.append("\t" + val.substring(k + 1));
          } else
             sb.append("\t");
              } else {
          if (o != null) {
             sb.append(o.toString());
          }
              }
              sb.append("\t");
           }
           Object o = table.getValueAt(r, table.getColumnCount() - 1);
           if (o != null) {
              String val = o.toString();
              int k = val.indexOf(' ');
              sb.append(val.substring(0, k));
              sb.append("\t" + val.substring(k + 1));
           } else
              sb.append("\t");
           sb.append("\n");
        }
                
        ta.setText(sb.toString());
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.add(scrollpane);
        frame.setSize(400, 300);
        frame.setVisible(true);*/
    });
    popup.getItems().add(tabtxt);
    popup.getItems().add(new SeparatorMenuItem());
    MenuItem ncbil = new MenuItem("NCBI lookup");
    ncbil.setOnAction(e -> {
        /*int r = table.getSelectedRow();
        if (r >= 0) {
           String ref = (String) table.getValueAt(r, 2);
           try {
              Desktop.getDesktop().browse(new URI("http://www.ncbi.nlm.nih.gov/gene?term=" + ref));
           } catch (IOException e1) {
              e1.printStackTrace();
           } catch (URISyntaxException e1) {
              e1.printStackTrace();
           }
        }*/
    });
    popup.getItems().add(ncbil);
    table.setContextMenu(popup);
    gtable.setContextMenu(popup);

    TableColumn<Function, String> gocol = new TableColumn("GO");
    gocol.setCellValueFactory(new PropertyValueFactory<>("go"));
    ftable.getColumns().add(gocol);
    TableColumn<Function, String> ecfcol = new TableColumn("EC");
    ecfcol.setCellValueFactory(new PropertyValueFactory<>("ec"));
    ftable.getColumns().add(ecfcol);
    TableColumn<Function, String> metacyccol = new TableColumn("MetaCyc");
    metacyccol.setCellValueFactory(new PropertyValueFactory<>("metacyc"));
    ftable.getColumns().add(metacyccol);
    TableColumn<Function, String> keggcol = new TableColumn("KEGG");
    keggcol.setCellValueFactory(new PropertyValueFactory<>("kegg"));
    ftable.getColumns().add(keggcol);
    TableColumn<Function, String> funcovcol = new TableColumn("Funciton coverage");
    funcovcol.setCellValueFactory(new PropertyValueFactory<>("speciesCount"));
    ftable.getColumns().add(funcovcol);
    TableColumn<Function, String> numprotcol = new TableColumn("Number of proteins");
    numprotcol.setCellValueFactory(new PropertyValueFactory<>("groupCount"));
    ftable.getColumns().add(numprotcol);

    TableColumn<Function, String> namecol = new TableColumn("Name");
    namecol.setCellValueFactory(new PropertyValueFactory<>("name"));
    ftable.getColumns().add(namecol);
    TableColumn<Function, String> namespacecol = new TableColumn("Namespace");
    namespacecol.setCellValueFactory(new PropertyValueFactory<>("namespace"));
    ftable.getColumns().add(namespacecol);
    TableColumn<Function, String> desccol = new TableColumn("Desc");
    desccol.setCellValueFactory(new PropertyValueFactory<>("desc"));
    ftable.getColumns().add(desccol);

    ftable.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY);

    //ftable.setAutoCreateRowSorter(true);
    /*ftablemodel = new TableModel() {
       @Override
       public int getRowCount() {
    return geneset.funclist.size();
       }
            
       @Override
       public int getColumnCount() {
    return 9;
       }
            
       @Override
       public String getColumnName(int columnIndex) {
    if (columnIndex == 0)
       return "GO";
    else if (columnIndex == 1)
       return "EC";
    else if (columnIndex == 2)
       return "MetaCyc";
    else if (columnIndex == 3)
       return "KEGG";
    else if (columnIndex == 4)
       return "Function coverage";
    else if (columnIndex == 5)
       return "Number of proteins";
    else if (columnIndex == 6)
       return "Name";
    else if (columnIndex == 7)
       return "Namespace";
    else if (columnIndex == 8)
       return "Def";
    return "";
       }
            
       @Override
       public Class<?> getColumnClass(int columnIndex) {
    if( columnIndex == 4 || columnIndex == 5 )
       return Integer.class;
    return String.class;
       }
            
       @Override
       public boolean isCellEditable(int rowIndex, int columnIndex) {
    return false;
       }
            
       @Override
       public Object getValueAt(int rowIndex, int columnIndex) {
    Function func = geneset.funclist.get(rowIndex);
    if( columnIndex == 0 )
       return func.go;
    else if( columnIndex == 1 )
       return func.ec;
    else if( columnIndex == 2 )
       return func.metacyc;
    else if( columnIndex == 3 )
       return func.kegg;
    else if( columnIndex == 4 )
       return func.getSpeciesCount();
    else if( columnIndex == 5 )
       return table.getModel() == groupModel ? func.getGroupSize() : func.getGeneCount();
    else if( columnIndex == 6 )
       return func.name;
    else if( columnIndex == 7 )
       return func.namespace;
    else if( columnIndex == 8 )
       return func.desc;
    return null;
       }
            
       @Override
       public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
       }
            
       @Override
       public void addTableModelListener(TableModelListener l) {
       }
            
       @Override
       public void removeTableModelListener(TableModelListener l) {
       }
    };
    ftable.setModel( ftablemodel );
    fscrollpane.setViewportView(ftable);*/

    updateFilter(ftable, null);
    updateFilter(table, label);

    combo.getSelectionModel().selectedItemProperty().addListener((observable, oldValue, newValue) -> {
        String sel = newValue;
        filterset.clear();
        if (geneset.pathwaymap.containsKey(sel)) {
            Set<String> enz = geneset.pathwaymap.get(sel);
            for (Function f : geneset.funclist) {
                if (f.getEc() != null && enz.contains(f.getEc())) {
                    filterset.add(f.index);
                }
            }
        }
        updateFilter(ftable, null);
    });

    specombo.getSelectionModel().selectedItemProperty().addListener((observable, oldValue, newValue) -> {
        String sel = newValue;
        genefilterset.clear();
        for (Gene g : geneset.genelist) {
            Tegeval tv = g.tegeval;
            if (sel.equals(tv.teg)) {
                //System.out.println(g.name + " " + sp + " " + sel + "  " + tv.eval);
                genefilterset.add(g.index);
            }
        }
        updateFilter(table, label);
    });

    MenuItem findcon = new MenuItem("Find conserved terms");
    findcon.setOnAction(e -> {
        Set<Integer> res = new HashSet<>();
        for (Function f : geneset.funclist) {
            if (f.getGeneGroups() != null) {
                Set<String> check = new HashSet<>();
                for (GeneGroup g : f.getGeneGroups()) {
                    //Gene g = genemap.get(str);
                    if (g.species != null) {
                        if (check.isEmpty())
                            check.addAll(g.species.keySet());
                        else if (!(check.size() == g.species.size() && check.containsAll(g.species.keySet()))) {
                            check.clear();
                            break;
                        }
                    }
                }
                if (!check.isEmpty())
                    res.add(f.index);
            }
        }
        filterset.clear();
        for (int i : res) {
            filterset.add(i);
        }
        updateFilter(ftable, null);
    });
    fpopup.getItems().add(findcon);
    fpopup.getItems().add(new SeparatorMenuItem());

    MenuItem showgen = new MenuItem("Show genes");
    showgen.setOnAction(e -> {
        genefilterset.clear();
        Set<GeneGroup> sset = new HashSet<>();
        for (Function f : (ObservableList<Function>) ftable.getSelectionModel().getSelectedItems()) {
            if (!isGeneview()) {
                sset.addAll(f.getGeneGroups());
                /*if( sset != null ) for (GeneGroup gg : sset) {
                   //Gene g = genemap.get(s);
                   genefilterset.add(gg.index);
                }*/
            } else {
                /*Set<Gene> sset = f.getGeneentries();
                for (Gene g : sset) {
                   //Gene g = genemap.get(s);
                   genefilterset.add(g.index);
                }*/
            }
        }

        //int[] rows = sset.stream().mapToInt( gg -> sortedData.indexOf(gg) ).toArray();
        //table.getSelectionModel().selectIndices(rows[0], rows);

        filteredData.setPredicate(genegroup -> {
            return sset.contains(genegroup);
        });
        if (label != null)
            label.setText(
                    table.getItems().size() + "/" + table.getSelectionModel().getSelectedIndices().size());
    });
    fpopup.getItems().add(showgen);

    table.getSelectionModel().selectedItemProperty().addListener(e -> {
        // table.clearSelection();
        tableisselecting = true;
        if (!ftableisselecting && filterset.isEmpty()) {
            //ftable.removeRowSelectionInterval(0, ftable.getRowCount() - 1);
            if (!isGeneview()) {
                for (GeneGroup gg : table.getSelectionModel().getSelectedItems()) {
                    for (Function f : gg.getFunctions()) {
                        try {
                            ftable.getSelectionModel().select(f);
                            //int rf = ftable.convertRowIndexToView(f.index);
                            //if( rf >= 0 && rf < ftable.getRowCount() ) ftable.addRowSelectionInterval(rf, rf);
                        } catch (Exception ex) {
                            ex.printStackTrace();
                        }
                    }
                }
            } else {
                for (Gene g : gtable.getSelectionModel().getSelectedItems()) {
                    if (g.funcentries != null) {
                        for (Function f : g.funcentries) {
                            //Function f = funcmap.get(go);
                            try {
                                ftable.getSelectionModel().select(f);
                                //int rf = ftable.convertRowIndexToView(f.index);
                                //if( rf >= 0 && rf < ftable.getRowCount() ) ftable.addRowSelectionInterval(rf, rf);
                            } catch (Exception ex) {
                                ex.printStackTrace();
                            }
                        }
                    }
                }
            }
        }
        tableisselecting = false;
    });

    ftable.setOnKeyPressed(ke -> {
        if (ke.getCode() == KeyCode.ESCAPE) {
            ffilteredData.setPredicate(null);
        }
    });

    table.setOnKeyPressed(ke -> {
        if (ke.getCode() == KeyCode.ESCAPE) {
            GeneGroup selgg = table.getSelectionModel().getSelectedItem();

            List<GeneGroup> sel = new ArrayList<>(filteredData);
            filteredData.setPredicate(null);
            int[] rows = sel.stream().mapToInt(gg -> sortedData.indexOf(gg)).toArray();
            if (rows.length > 0)
                table.getSelectionModel().selectIndices(rows[0], rows);
            if (label != null)
                label.setText(
                        table.getItems().size() + "/" + table.getSelectionModel().getSelectedIndices().size());

            table.scrollTo(selgg);
            //genefilterset.clear();
            //updateFilter(table, genefilter, label);
            //geneset.scrollToSelection( table );
        }
    });

    table.setOnMousePressed(e -> {
        tableisselecting = true;
        if (!ftableisselecting && e.getClickCount() == 2) {
            /*
             * int[] rr = ftable.getSelectedRows(); int minr =
             * ftable.getRowCount(); int maxr = 0; for( int r : rr ) {
             * if( r < minr ) minr = r; if( r > maxr ) maxr = r; }
             * ftable.removeRowSelectionInterval(minr, maxr);
             */
            // ftable.removeRowSelectionInterval(0, filterset.isEmpty()
            // ? ftable.getRowCount()-1 : filterset.size()-1 );

            Set<Function> fset = new HashSet<>();
            filterset.clear();
            if (!isGeneview()) {
                for (GeneGroup gg : table.getSelectionModel().getSelectedItems()) {
                    fset.addAll(gg.getFunctions());
                }
            } else {
                for (Gene g : gtable.getSelectionModel().getSelectedItems()) {
                    if (g.funcentries != null) {
                        for (Function f : g.funcentries) {
                            //Function f = funcmap.get(go);
                            // ftable.getRowSorter().convertRowIndexToView(index)
                            // int rf = ftable.convertRowIndexToView(
                            // f.index );
                            filterset.add(f.index);
                            // ftable.addRowSelectionInterval(rf, rf);
                        }
                    }
                }
            }
            ffilteredData.setPredicate(p -> fset.contains(p));
        }
        tableisselecting = false;
    });

    ftable.setOnMousePressed(e -> {
        ftableisselecting = true;
        Set<GeneGroup> ggset = new HashSet<>();
        if (!tableisselecting && e.getClickCount() == 2) {
            genefilterset.clear();
            for (Function f : (ObservableList<Function>) ftable.getSelectionModel().getSelectedItems()) {
                if (f.getGeneentries() != null) {
                    if (!isGeneview()) {
                        ggset.addAll(f.getGeneGroups());
                    } else {
                        for (Gene g : f.getGeneentries()) {
                            //Gene g = genemap.get(ref);
                            // int rf = table.convertRowIndexToView( g.index
                            // );
                            // table.addRowSelectionInterval(rf, rf);
                            genefilterset.add(g.index);
                        }
                    }
                }
            }
            filteredData.setPredicate(p -> ggset.contains(p));
        }
        ftableisselecting = false;
    });

    ftable.getSelectionModel().selectedItemProperty().addListener(e -> {
        ftableisselecting = true;
        if (!tableisselecting && genefilterset.isEmpty()) {
            table.getSelectionModel().clearSelection();
            //table.removeRowSelectionInterval(0, table.getRowCount() - 1);
            for (Function f : ftable.getSelectionModel().getSelectedItems()) {
                if (f.getGeneentries() != null) {
                    for (Gene g : f.getGeneentries()) {
                        table.getSelectionModel().select(g.getGeneGroup());

                        //Gene g = genemap.get(ref);
                        /*int i = g.getGroupIndex();
                        if( i >= 0 && i <= table.getItems().size() ) {
                           int rf = table.convertRowIndexToView(i);
                           table.addRowSelectionInterval(rf, rf);
                        }*/
                    }
                }
            }
        }
        ftableisselecting = false;
    });

    textfield.setOnKeyPressed(e -> {
        String text = textfield.getText().toLowerCase();
        if (e.getCode() == KeyCode.ENTER) {
            searchi = searchcolcomb.getSelectionModel().getSelectedItem().equals("Symbol")
                    ? searchTable(table, text, searchi, e.isAltDown(), 8, 9, 10, 16)
                    : searchTable(table, text, searchi, e.isAltDown(), 0);
        }
    });

    textfield.textProperty().addListener((observable, oldValue, newValue) -> {
        //String text = textfield.getText().toLowerCase();
        String lowerCaseFilter = newValue.toLowerCase();
        Predicate<GeneGroup> p = genegroup -> {
            if (newValue == null || newValue.isEmpty()) {
                return true;
            }

            if (searchcolcomb.getSelectionModel().getSelectedItem().equals("Symbol")) {
                if ((genegroup.getCogsymbol() != null
                        && genegroup.getCogsymbol().toLowerCase().contains(lowerCaseFilter))
                        || (genegroup.getSymbol() != null
                                && genegroup.getSymbol().toLowerCase().contains(lowerCaseFilter))
                        || (genegroup.getKoname() != null
                                && genegroup.getKoname().toLowerCase().contains(lowerCaseFilter))) {
                    return true; // Filter matches first name.
                }
            } else {
                if (genegroup.getName().toLowerCase().contains(lowerCaseFilter) || genegroup.genes.stream()
                        .anyMatch(gg -> gg.getName().toLowerCase().contains(lowerCaseFilter))) {
                    return true; // Filter matches first name.
                } /* else if (genegroup.getLastName().toLowerCase().contains(lowerCaseFilter)) {
                    return true; // Filter matches last name.
                  }*/
            }
            return false; // Does not match.
        };
        if (filter.isSelected()) {
            filteredData.setPredicate(p);
            if (label != null)
                label.setText(
                        table.getItems().size() + "/" + table.getSelectionModel().getSelectedIndices().size());
            //if( searchcolcomb.getSelectionModel().getSelectedItem().equals("Symbol") ) updateFilter(0, text, table, genefilter, genefilterset, label, 8, 9, 10, 16 );
            //else updateFilter(0, text, table, genefilter, genefilterset, label, 0 );
        } else {
            Optional<GeneGroup> ogg = filteredData.stream().filter(p).findFirst();
            if (ogg.isPresent()) {
                GeneGroup gg = ogg.get();
                table.getSelectionModel().select(gg);
                table.scrollTo(gg);
            }
            //searchi = searchcolcomb.getSelectionModel().getSelectedItem().equals("Symbol") ? searchTable( table, text, 0, false, 8, 9, 10, 16 ) : searchTable( table, text, 0, false, 0 );
        }
    });
    /*textfield.getDocument().addDocumentListener(new DocumentListener() {
       public void changedUpdate(DocumentEvent e) {
    String text = textfield.getText().toLowerCase();
    if( filter.isSelected() ) {
       if( searchcolcomb.getSelectionModel().getSelectedItem().equals("Symbol") ) updateFilter(0, text, table, genefilter, genefilterset, label, 8, 9, 10, 16 );
       else updateFilter(0, text, table, genefilter, genefilterset, label, 0 );
    } else {
       searchi = searchcolcomb.getSelectionModel().getSelectedItem().equals("Symbol") ? searchTable( table, text, 0, false, 8, 9, 10, 16 ) : searchTable( table, text, 0, false, 0 );
    }
       }
            
       public void insertUpdate(DocumentEvent e) {
    String text = textfield.getText().toLowerCase();
    if( filter.isSelected() ) {
       if( searchcolcomb.getSelectionModel().getSelectedItem().equals("Symbol") ) updateFilter(1, text, table, genefilter, genefilterset, label, 8, 9, 10, 16);
       else updateFilter(1, text, table, genefilter, genefilterset, label, 0);
    } else {
       searchi = searchcolcomb.getSelectionModel().getSelectedItem().equals("Symbol") ? searchTable( table, text, 0, false, 8, 9, 10, 16 ) : searchTable( table, text, 0, false, 0 );
    }
       }
            
       public void removeUpdate(DocumentEvent e) {
    String text = textfield.getText().toLowerCase();
    if( filter.isSelected() ) {
       if( searchcolcomb.getSelectionModel().getSelectedItem().equals("Symbol") ) updateFilter(2, text, table, genefilter, genefilterset, label, 8, 9, 10, 16 );
       else updateFilter(2, text, table, genefilter, genefilterset, label, 0);
    } else {
       searchi = searchTable( table, text, 0, false, searchcolcomb.getSelectionModel().getSelectedItem().equals("Symbol") ? 7 : 0 );
    }
       }
    });*/

    ftextfield.textProperty().addListener(new javafx.beans.value.ChangeListener<String>() {
        public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) {
            //String text = textfield.getText().toLowerCase();
            if (filter.isSelected()) {
                ffilteredData.setPredicate(function -> {
                    // If filter text is empty, display all persons.
                    if (newValue == null || newValue.isEmpty()) {
                        return true;
                    }

                    // Compare first name and last name of every person with filter text.
                    String lowerCaseFilter = newValue.toLowerCase();

                    boolean desc = function.getDesc() != null
                            && function.getDesc().toLowerCase().contains(lowerCaseFilter);
                    boolean name = function.getName() != null
                            && function.getName().toLowerCase().contains(lowerCaseFilter);
                    boolean go = function.getGo() != null
                            && function.getGo().toLowerCase().contains(lowerCaseFilter);
                    boolean ec = function.getEc() != null
                            && function.getEc().toLowerCase().contains(lowerCaseFilter);

                    if (desc || name || go || ec) {
                        return true; // Filter matches first name.
                    } /* else if (genegroup.getLastName().toLowerCase().contains(lowerCaseFilter)) {
                         return true; // Filter matches last name.
                      }*/
                    return false; // Does not match.
                });
            } else {
                //searchi = searchcolcomb.getSelectionModel().getSelectedItem().equals("Symbol") ? searchTable( table, text, 0, false, 8, 9, 10, 16 ) : searchTable( table, text, 0, false, 0 );
            }
        }
    });
    /*ftextfield.getDocument().addDocumentListener(new DocumentListener() {
       public void changedUpdate(DocumentEvent e) {
    updateFilter(0, ftextfield.getText(), ftable, rowfilter, filterset, null, 6);
       }
            
       public void insertUpdate(DocumentEvent e) {
    updateFilter(1, ftextfield.getText(), ftable, rowfilter, filterset, null, 6);
       }
            
       public void removeUpdate(DocumentEvent e) {
    updateFilter(2, ftextfield.getText(), ftable, rowfilter, filterset, null, 6);
       }
    });*/
    MenuItem kegggl = new MenuItem("KEGG gene lookup");
    kegggl.setOnAction(e -> {
        Gene g = gtable.getSelectionModel().getSelectedItem();
        try {
            Desktop.getDesktop().browse(new URI("http://www.genome.jp/dbget-bin/www_bget?" + g.keggid));
        } catch (IOException e1) {
            e1.printStackTrace();
        } catch (URISyntaxException e1) {
            e1.printStackTrace();
        }
    });
    popup.getItems().add(kegggl);
    MenuItem showgenes = new MenuItem("Show genes with same sharing");
    showgenes.setOnAction(e -> {
        genefilterset.clear();
        GeneGroup gg = table.getSelectionModel().getSelectedItem();
        for (GeneGroup g : geneset.allgenegroups) {
            if (gg.species != null && g.species != null) {
                Set<String> ggset = gg.species.keySet();
                Set<String> gset = g.species.keySet();

                if (gset.size() == ggset.size() && gset.containsAll(ggset)) {
                    genefilterset.add(g.index);
                }
            }
        }
        updateFilter(table, label);
    });
    popup.getItems().add(showgenes);
    MenuItem showshared = new MenuItem("Show shared function");
    showshared.setOnAction(e -> {
        filterset.clear();
        Set<Function> startfunc = new HashSet<Function>();
        if (isGeneview()) {
            for (Gene gg : gtable.getSelectionModel().getSelectedItems()) {
                if (gg.funcentries != null) {
                    if (startfunc.isEmpty()) {
                        startfunc.addAll(gg.funcentries);
                    } else {
                        startfunc.retainAll(gg.funcentries);
                    }
                }
                /*if (startfunc == null)
                startfunc = new HashSet<Function>(gg.funcentries);
                else {
                startfunc.retainAll(gg.funcentries);
                }*/
            }
        } else {
            for (GeneGroup gg : table.getSelectionModel().getSelectedItems()) {
                Set<Function> fset = gg.getFunctions();
                if (startfunc.isEmpty()) {
                    startfunc.addAll(fset);
                } else {
                    startfunc.retainAll(fset);
                }
            }
        }
        for (Function f : geneset.funclist) {
            filterset.add(f.index);
        }
        updateFilter(ftable, null);
    });
    popup.getItems().add(showshared);
    MenuItem showall = new MenuItem("Show all functions");
    showall.setOnAction(e -> {
        filterset.clear();
        Set<Function> startfunc = null;
        if (isGeneview()) {
            for (Gene gg : gtable.getSelectionModel().getSelectedItems()) {
                if (gg.funcentries != null) {
                    for (Function f : gg.funcentries) {
                        filterset.add(f.index);
                    }
                }
            }
        } else {
            for (GeneGroup gg : table.getSelectionModel().getSelectedItems()) {
                Set<Function> fset = gg.getFunctions();
                for (Function f : fset) {
                    filterset.add(f.index);
                }
            }
        }
        updateFilter(ftable, null);
    });
    popup.getItems().add(showall);
    popup.getItems().add(new SeparatorMenuItem());
    MenuItem showgenegroups = new MenuItem("Show gene groups in proximity");
    showgenegroups.setOnAction(e -> {
        proxi(filteredData, false);
        updateFilter(table, label);
    });
    popup.getItems().add(showgenegroups);
    MenuItem selgenegroups = new MenuItem("Select gene groups in proximity");
    selgenegroups.setOnAction(e -> {
        genefilterset.clear();
        proxi(filteredData, false);
        for (int i : genefilterset) {
            table.getSelectionModel().select(i);
        }
        //table.tableChanged( new TableModelEvent( table.getModel() ) );
        if (label != null)
            label.setText(table.getItems().size() + "/" + table.getSelectionModel().getSelectedItems().size());
        //updateFilter(table, genefilter, label);
    });
    popup.getItems().add(selgenegroups);
    MenuItem selgenes = new MenuItem("Select genes in proximity");
    selgenes.setOnAction(e -> {
        genefilterset.clear();
        proxi(filteredData, true);
        for (int i : genefilterset) {
            table.getSelectionModel().select(i);
        }
        //table.tableChanged( new TableModelEvent( table.getModel() ) );
        if (label != null)
            label.setText(table.getItems().size() + "/" + table.getSelectionModel().getSelectedItems().size());
        //updateFilter(table, genefilter, label);
    });
    popup.getItems().add(selgenes);
    MenuItem addgene = new MenuItem("Add gene groups in proximity");
    addgene.setOnAction(e -> {
        proxi(filteredData, false);
        updateFilter(table, label);
    });
    popup.getItems().add(addgene);
    MenuItem remgene = new MenuItem("Remove gene groups in proximity");
    remgene.setOnAction(e -> {
        ObservableList<Integer> rr = table.getSelectionModel().getSelectedIndices();
        if (genefilterset.isEmpty()) {
            Set<Integer> ii = new HashSet<>();
            for (int r : rr)
                ii.add(r);
            for (int i = 0; i < geneset.genelist.size(); i++) {
                if (!ii.contains(i))
                    genefilterset.add(i);
            }
        }
        proxi(filteredData, false);
        updateFilter(table, label);
    });
    popup.getItems().add(remgene);
    popup.getItems().add(new SeparatorMenuItem());
    MenuItem showrel = new MenuItem("Show related genes");
    showrel.setOnAction(e -> {
        genefilterset.clear();
        relati(gtable, geneset.genelist, genefilterset, geneset.uclusterlist, false);
        updateFilter(gtable, label);
    });
    popup.getItems().add(showrel);
    MenuItem addrel = new MenuItem("Add related genes");
    addrel.setOnAction(e -> {
        relati(gtable, geneset.genelist, genefilterset, geneset.uclusterlist, false);
        updateFilter(gtable, label);
    });
    popup.getItems().add(addrel);
    MenuItem remrel = new MenuItem("Remove related genes");
    remrel.setOnAction(e -> {
        ObservableList<Integer> rr = gtable.getSelectionModel().getSelectedIndices();
        if (genefilterset.isEmpty()) {
            Set<Integer> ii = new HashSet<>();
            for (int r : rr)
                ii.add(r);
            for (int i = 0; i < geneset.genelist.size(); i++) {
                if (!ii.contains(i))
                    genefilterset.add(i);
            }
        }
        relati(gtable, geneset.genelist, genefilterset, geneset.uclusterlist, true);
        updateFilter(table, label);
    });
    popup.getItems().add(remrel);
    popup.getItems().add(new SeparatorMenuItem());
    MenuItem showcloserel = new MenuItem("Show closely related genes");
    showcloserel.setOnAction(e -> {
        genefilterset.clear();
        Set<String> ct = new HashSet<>();
        for (Gene gg : gtable.getSelectionModel().getSelectedItems()) {
            // genefilterset.add( gg.index );
            Tegeval tv = gg.tegeval;
            for (Set<String> uset : geneset.iclusterlist) {
                if (uset.contains(tv.name)) {
                    ct.addAll(uset);
                    break;
                }
            }
        }

        for (Gene g : geneset.genelist) {
            Tegeval tv = g.tegeval;
            if (ct.contains(tv.name)) {
                genefilterset.add(g.index);
                break;
            }
        }

        updateFilter(table, label);
    });
    popup.getItems().add(showcloserel);
    MenuItem showdist = new MenuItem("Show distance matrix");
    showdist.setOnAction(e -> {
        JTextArea textarea = new JTextArea();

        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);

        JScrollPane scrollpane = new JScrollPane(textarea);
        Gene gg = gtable.getSelectionModel().getSelectedItem();
        if (gg.getSpecies() != null) {
            for (String s : geneset.corrInd) {
                if (s.equals(geneset.corrInd.get(0)))
                    textarea.append(s);
                else
                    textarea.append("\t" + s);
            }

            int i = 0;
            int j = 0;

            int len = 16;
            double[] min = new double[len];
            double[] max = new double[len];

            for (i = 0; i < len; i++) {
                min[i] = Double.MAX_VALUE;
                max[i] = 0.0;
            }

            double[] corrarr = gg.corrarr;
            boolean symmetrize = true;
            if (symmetrize) {
                for (i = 0; i < len; i++) {
                    for (int k = i + 1; k < len; k++) {
                        corrarr[i * len + k] = (corrarr[k * len + i] + corrarr[i * len + k]) / 2.0;
                        corrarr[k * len + i] = corrarr[i * len + k];
                    }
                }
            }

            for (i = 0; i < len; i++) {
                for (int k = 0; k < len; k++) {
                    if (corrarr[i * len + k] < min[i])
                        min[i] = corrarr[i * len + k];
                    if (corrarr[i * len + k] > max[i])
                        max[i] = corrarr[i * len + k];
                }

                /*for (int k = 0; k < len; k++) {
                   corrarr[i * 16 + k] = corrarr[i * 16 + k] - min;
                }*/
            }

            i = 0;
            for (double d : corrarr) {
                double dval = d;
                if (i % len == 0)
                    textarea.append("\n" + dval);
                else
                    textarea.append("\t" + dval);

                i++;
            }
            textarea.append("\n");

            i = 0;
            for (double d : corrarr) {
                double dval = Math.exp((d - min[i / len]) / 20.0 + 1.0) / 100.0; // 0.0 ?
                // 0.0 :
                // 100.0/d;
                if (i % len == 0)
                    textarea.append("\n" + dval);
                else
                    textarea.append("\t" + dval);

                i++;
            }
            double[] newcorr = Arrays.copyOf(corrarr, corrarr.length);
            textarea.append("\nD matrix\n");
            i = 0;
            for (double d : corrarr) {
                double dval = max[i / len] - d;
                newcorr[i] = dval;
                if (i % len == 0)
                    textarea.append("\n" + dval);
                else
                    textarea.append("\t" + dval);

                i++;
            }

            TreeUtil treeutil = new TreeUtil();
            treeutil.neighborJoin(newcorr, geneset.corrInd, null, true, true);
        }

        /*
         * int[] rr = table.getSelectedRows(); for( int r : rr ) { int
         * cr = table.convertRowIndexToModel(r); Gene gg =
         * genelist.get(cr); if( gg.species != null ) { textarea.append(
         * gg.name + ":\n" ); for( String sp : gg.species.keySet() ) {
         * Teginfo stv = gg.species.get( sp ); for( Tegeval tv :
         * stv.tset ) { textarea.append( ">" + tv.cont + " " + tv.teg +
         * " " + tv.eval + "\n" ); for( int i = 0; i < tv.seq.length();
         * i+=70 ) { int end = Math.min(i+70,tv.seq.length());
         * textarea.append( tv.seq.substring(i, end)+"\n" ); //new
         * String( tv.seq, i, Math.min(i+70,tv.seq.length()) )+"\n"); }
         * //textarea.append( ">" + tv.cont + " " + tv.teg + " " +
         * tv.eval + "\n" + tv.seq + "\n" ); } } } }
         */
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.add(scrollpane);
        frame.setSize(400, 300);
        frame.setVisible(true);
    });

    /*
     * final List<String> reglist = new ArrayList<String>(); final
     * Map<String,Gene> regidx = new TreeMap<String,Gene>();
     * 
     * for( Gene g : geneset.genelist ) { if( g.species != null ) { for( String key
     * : g.species.keySet() ) { Set<Tegeval> stv = g.species.get(key); for(
     * Tegeval tv : stv ) { regidx.put(tv.cont, g); } } } }
     * 
     * for( String key : regidx.keySet() ) { reglist.add(key); }
     * 
     * final JTable contigtable = new JTable();
     * contigtable.setAutoCreateRowSorter( true ); contigtable.setModel( new
     * TableModel() {
     * 
     * @Override public int getRowCount() { return reglist.size(); }
     * 
     * @Override public int getColumnCount() { return 1; }
     * 
     * @Override public String getColumnName(int columnIndex) { return
     * "Region"; }
     * 
     * @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 reglist.get(rowIndex); }
     * 
     * @Override public void setValueAt(Object aValue, int rowIndex, int
     * columnIndex) { // TODO Auto-generated method stub
     * 
     * }
     * 
     * @Override public void addTableModelListener(TableModelListener l) {
     * // TODO Auto-generated method stub
     * 
     * }
     * 
     * @Override public void removeTableModelListener(TableModelListener l)
     * { // TODO Auto-generated method stub
     * 
     * } });
     * 
     * contigtable.getSelectionModel().addListSelectionListener( new
     * ListSelectionListener() {
     * 
     * @Override public void valueChanged(ListSelectionEvent e) {
     * genefilterset.clear(); int[] rr = contigtable.getSelectedRows(); for(
     * int r : rr ) { String s = (String)contigtable.getValueAt(r, 0); Gene
     * g = regidx.get( s );
     * 
     * genefilterset.add( g.index ); updateFilter(table, genefilter, label);
     * //int k = table.convertRowIndexToView(g.index); //if( k != -1
     * )table.addRowSelectionInterval(k, k); } } }); JScrollPane
     * contigscroll = new JScrollPane( contigtable );
     * 
     * JSplitPane mainsplit = new JSplitPane( JSplitPane.HORIZONTAL_SPLIT );
     * mainsplit.setLeftComponent( contigscroll );
     * mainsplit.setRightComponent( splitpane );
     */
}

From source file:se.trixon.jota.client.ui.MainFrame.java

private void requestConnect() throws NotBoundException {
    String[] hosts = mOptions.getHosts().split(";");
    Arrays.sort(hosts);//from  w ww.jav a  2 s  .  c  om
    DefaultComboBoxModel comboBoxModel = new DefaultComboBoxModel(hosts);
    JComboBox hostComboBox = new JComboBox(comboBoxModel);
    hostComboBox.setEditable(true);

    hostComboBox.setSelectedItem(mClient.getHost());
    JTextField portTextField = new JTextField(String.valueOf(mClient.getPortHost()));
    final JComponent[] inputs = new JComponent[] { new JLabel(Dict.HOST.toString()), hostComboBox,
            new JLabel(Dict.PORT.toString()), portTextField, };

    Object[] options = { Dict.CONNECT.toString(), Dict.CANCEL.toString() };
    int retval = JOptionPane.showOptionDialog(this, inputs, Dict.CONNECT_TO_HOST.toString(),
            JOptionPane.YES_NO_OPTION, JOptionPane.PLAIN_MESSAGE, null, options, options[0]);

    if (retval == 0) {
        String currentHost = mClient.getHost();
        int currentPort = mClient.getPortHost();
        String host = (String) hostComboBox.getSelectedItem();
        String portString = portTextField.getText();

        try {
            int port = Integer.valueOf(portString);
            mManager.disconnect();
            mManager.connect(host, port);

            if (comboBoxModel.getIndexOf(host) == -1) {
                comboBoxModel.addElement(host);
            }
            mOptions.setHosts(SwingHelper.comboBoxModelToString(comboBoxModel));
        } catch (NumberFormatException e) {
            Message.error(this, Dict.ERROR.toString(), String.format(Dict.INVALID_PORT.toString(), portString));
        } catch (NotBoundException | MalformedURLException | RemoteException | SocketException ex) {
            Message.error(this, Dict.ERROR.toString(), ex.getLocalizedMessage());
            mClient.setHost(currentHost);
            mClient.setPortHost(currentPort);
        }
    }
}

From source file:skoa.helpers.ConfiguracionGraficas.java

private void vistaIntermedia4() {
    vacia = true; //Una vez llegado aqu, ya se empieza a llenar la carpeta destino.
    for (int i = 0; i < datos.getComponentCount(); i++)
        datos.remove(i); //Borra 
    datos.removeAll();/*from   w w  w  .  j  a  v a  2  s.co  m*/
    JPanel p = new JPanel();
    p.setLayout(new GridLayout(3, 1));
    //JLabel l=new JLabel(" Grfica "+ng+":  "+"Direcciones: "+seleccionadas);
    //l.setFont(new Font("Tahoma",Font.BOLD,12));
    p2 = new JPanel();
    p2.setLayout(new GridLayout(1, 3));
    l = new JLabel(" Grfica " + ng + ":  " + "Direcciones: ");
    l.setFont(new Font("Tahoma", Font.BOLD, 12));
    p2.add(l);
    Vector<String> AuxSeleccionadas = new Vector<String>();
    AuxSeleccionadas.addAll(seleccionadas);
    JComboBox laux = new JComboBox(AuxSeleccionadas);
    laux.setEditable(false);
    laux.setSelectedIndex(0);
    laux.setFont(new Font("Tahoma", Font.ITALIC, 12));
    //p2.add(lo);
    p2.add(laux);//para que se mantengan las anteriores al aadir nuevas.
    p2.add(new JPanel());
    ng++;
    //p.add(l);
    p.add(p2);
    String l2 = "                  ";
    if (c == 1) {
        if (ejeDual.contentEquals("dual"))
            l2 = l2 + "Consulta: Evolucin temporal dual, ";
        else
            l2 = l2 + "Consulta: Evolucin temporal, ";
    } else if (c == 2) {
        if (ejeDual.contentEquals("dual"))
            l2 = l2 + "Consulta: Acumulacin por intervalos temporales dual, ";
        else
            l2 = l2 + "Consulta: Acumulacin por intervalos temporales, ";
    } else if (c == 3)
        l2 = l2 + "Consulta: Mx-Mn-Med por intervalos temporales, ";
    else if (c == 5)
        l2 = l2 + "Consulta: Evolucin de diferencias en %, ";
    else if (c == 6)
        l2 = l2 + "Consulta: Evolucin de diferencias, ";
    if (f == 1)
        l2 = l2 + "de un intervalo.";
    else if (f == 2)
        l2 = l2 + "completa.";
    l = new JLabel(l2);
    l.setFont(new Font("Tahoma", Font.PLAIN, 12));
    p.add(l);
    l2 = "                  ";
    if (f == 1) {
        l2 = l2 + "Desde " + fini + " hasta " + ffin;
        if (c == 2 || c == 3)
            l2 = l2 + " con rango de " + rango + " horas.";
        if (c > 4)
            l2 = l2 + " con rango de " + rango + " minutos.";
    }
    if (f == 2) {
        if (c == 2 || c == 3)
            l2 = l2 + "Con rango de " + rango + " horas.";
        if (c > 4)
            l2 = l2 + "Con rango de " + rango + " minutos.";
    }
    l = new JLabel(l2);
    l.setFont(new Font("Tahoma", Font.PLAIN, 12));
    p.add(l);
    mantenerVista(p);
    //EN ESTE PUNTO DEL CDIGO, ANTES DE RESTABLECERVALORES, INVOCAR A LAS CONSULTAS (al constructor)
    //PARA GENERAR LA CONSULTA CORRESPONDIENTE ANTES DE OBTENER LOS PARMETROS DE LA SIGUIENTE CONSULTA.
    //nh indica el hilo que se tiene que coger para la consulta actual.
    try {
        if (nh == 1) { //Los hilos en su constructor llaman start.
            h1 = new Consultas(H, c, f, fini, ffin, rango, direcciones, NombreCarpetaActual, dataSource);
            h1.start();
        } else if (nh == 2) {
            h2 = new Consultas(H, c, f, fini, ffin, rango, direcciones, dataSource);
            h2.start();
        } else if (nh == 3) {
            h3 = new Consultas(H, c, f, fini, ffin, rango, direcciones, dataSource);
            h3.start();
        } else if (nh == 4) {
            h4 = new Consultas(H, c, f, fini, ffin, rango, direcciones, dataSource);
            h4.start();
        }
        nh++;
    } catch (IOException e) {
        e.printStackTrace();
    } catch (SQLException e) {
        e.printStackTrace();
    }
    consultasDuales.add(ejeDual);
    JPanel gen = new JPanel();
    gen.setLayout(new GridLayout(2, 1));
    gen.add(new JPanel());
    gen.add(generar);
    obtenidos.add(gen);
    reestablecerPaneles();
    cargarVista();
}