Search in sources :

Example 61 with DefaultTableCellRenderer

use of javax.swing.table.DefaultTableCellRenderer in project UniversalMediaServer by UniversalMediaServer.

the class NavigationShareTab method initSharedFoldersGuiComponents.

private PanelBuilder initSharedFoldersGuiComponents(CellConstraints cc) {
    // Apply the orientation for the locale
    ComponentOrientation orientation = ComponentOrientation.getOrientation(PMS.getLocale());
    String colSpec = FormLayoutUtil.getColSpec(SHARED_FOLDER_COL_SPEC, orientation);
    FormLayout layoutFolders = new FormLayout(colSpec, SHARED_FOLDER_ROW_SPEC);
    PanelBuilder builderFolder = new PanelBuilder(layoutFolders);
    builderFolder.opaque(true);
    JComponent cmp = builderFolder.addSeparator(Messages.getString("FoldTab.7"), FormLayoutUtil.flip(cc.xyw(1, 1, 7), colSpec, orientation));
    cmp = (JComponent) cmp.getComponent(0);
    cmp.setFont(cmp.getFont().deriveFont(Font.BOLD));
    folderTableModel = new SharedFoldersTableModel();
    FList = new JTable(folderTableModel);
    TableColumn column = FList.getColumnModel().getColumn(0);
    column.setMinWidth(650);
    JPopupMenu popupMenu = new JPopupMenu();
    JMenuItem menuItemMarkPlayed = new JMenuItem(Messages.getString("FoldTab.75"));
    JMenuItem menuItemMarkUnplayed = new JMenuItem(Messages.getString("FoldTab.76"));
    menuItemMarkPlayed.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent e) {
            String path = (String) FList.getValueAt(FList.getSelectedRow(), 0);
            TableFilesStatus.setDirectoryFullyPlayed(path, true);
        }
    });
    menuItemMarkUnplayed.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent e) {
            String path = (String) FList.getValueAt(FList.getSelectedRow(), 0);
            TableFilesStatus.setDirectoryFullyPlayed(path, false);
        }
    });
    popupMenu.add(menuItemMarkPlayed);
    popupMenu.add(menuItemMarkUnplayed);
    FList.setComponentPopupMenu(popupMenu);
    FList.addMouseListener(new TableMouseListener(FList));
    /* An attempt to set the correct row height adjusted for font scaling.
		 * It sets all rows based on the font size of cell (0, 0). The + 4 is
		 * to allow 2 pixels above and below the text. */
    DefaultTableCellRenderer cellRenderer = (DefaultTableCellRenderer) FList.getCellRenderer(0, 0);
    FontMetrics metrics = cellRenderer.getFontMetrics(cellRenderer.getFont());
    FList.setRowHeight(metrics.getLeading() + metrics.getMaxAscent() + metrics.getMaxDescent() + 4);
    FList.setIntercellSpacing(new Dimension(8, 2));
    CustomJButton but = new CustomJButton(LooksFrame.readImageIcon("button-adddirectory.png"));
    but.setToolTipText(Messages.getString("FoldTab.9"));
    but.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent e) {
            JFileChooser chooser;
            try {
                chooser = new JFileChooser();
            } catch (Exception ee) {
                chooser = new JFileChooser(new RestrictedFileSystemView());
            }
            chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
            int returnVal = chooser.showOpenDialog((Component) e.getSource());
            if (returnVal == JFileChooser.APPROVE_OPTION) {
                ((SharedFoldersTableModel) FList.getModel()).addRow(new Object[] { chooser.getSelectedFile().getAbsolutePath(), true });
                if (FList.getModel().getValueAt(0, 0).equals(ALL_DRIVES)) {
                    ((SharedFoldersTableModel) FList.getModel()).removeRow(0);
                }
                updateModel();
            }
        }
    });
    builderFolder.add(but, FormLayoutUtil.flip(cc.xy(1, 3), colSpec, orientation));
    CustomJButton but2 = new CustomJButton(LooksFrame.readImageIcon("button-remove.png"));
    but2.setToolTipText(Messages.getString("FoldTab.36"));
    but2.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent e) {
            if (FList.getSelectedRow() > -1) {
                if (FList.getModel().getRowCount() == 0) {
                    folderTableModel.addRow(new Object[] { ALL_DRIVES, false });
                } else {
                    PMS.get().getDatabase().removeMediaEntriesInFolder((String) FList.getValueAt(FList.getSelectedRow(), 0));
                }
                ((SharedFoldersTableModel) FList.getModel()).removeRow(FList.getSelectedRow());
                updateModel();
            }
        }
    });
    builderFolder.add(but2, FormLayoutUtil.flip(cc.xy(2, 3), colSpec, orientation));
    CustomJButton but3 = new CustomJButton(LooksFrame.readImageIcon("button-arrow-down.png"));
    but3.setToolTipText(Messages.getString("FoldTab.12"));
    but3.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent e) {
            for (int i = 0; i < FList.getRowCount() - 1; i++) {
                if (FList.isRowSelected(i)) {
                    Object value1 = FList.getValueAt(i, 0);
                    boolean value2 = (boolean) FList.getValueAt(i, 1);
                    FList.setValueAt(FList.getValueAt(i + 1, 0), i, 0);
                    FList.setValueAt(value1, i + 1, 0);
                    FList.setValueAt(FList.getValueAt(i + 1, 1), i, 1);
                    FList.setValueAt(value2, i + 1, 1);
                    FList.changeSelection(i + 1, 1, false, false);
                    break;
                }
            }
        }
    });
    builderFolder.add(but3, FormLayoutUtil.flip(cc.xy(3, 3), colSpec, orientation));
    CustomJButton but4 = new CustomJButton(LooksFrame.readImageIcon("button-arrow-up.png"));
    but4.setToolTipText(Messages.getString("FoldTab.12"));
    but4.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent e) {
            for (int i = 1; i < FList.getRowCount(); i++) {
                if (FList.isRowSelected(i)) {
                    Object value1 = FList.getValueAt(i, 0);
                    boolean value2 = (boolean) FList.getValueAt(i, 1);
                    FList.setValueAt(FList.getValueAt(i - 1, 0), i, 0);
                    FList.setValueAt(value1, i - 1, 0);
                    FList.setValueAt(FList.getValueAt(i - 1, 1), i, 1);
                    FList.setValueAt(value2, i - 1, 1);
                    FList.changeSelection(i - 1, 1, false, false);
                    break;
                }
            }
        }
    });
    builderFolder.add(but4, FormLayoutUtil.flip(cc.xy(4, 3), colSpec, orientation));
    but5 = new CustomJButton(LooksFrame.readImageIcon("button-scan.png"));
    but5.setToolTipText(Messages.getString("FoldTab.2"));
    but5.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent e) {
            if (configuration.getUseCache()) {
                DLNAMediaDatabase database = PMS.get().getDatabase();
                if (database != null) {
                    if (database.isScanLibraryRunning()) {
                        int option = JOptionPane.showConfirmDialog(looksFrame, Messages.getString("FoldTab.10"), Messages.getString("Dialog.Question"), JOptionPane.YES_NO_OPTION);
                        if (option == JOptionPane.YES_OPTION) {
                            database.stopScanLibrary();
                            looksFrame.setStatusLine(Messages.getString("FoldTab.41"));
                            setScanLibraryEnabled(false);
                            but5.setToolTipText(Messages.getString("FoldTab.41"));
                        }
                    } else {
                        database.scanLibrary();
                        but5.setIcon(LooksFrame.readImageIcon("button-scan-busy.gif"));
                        but5.setRolloverIcon(LooksFrame.readImageIcon("button-scan-cancel.png"));
                        but5.setToolTipText(Messages.getString("FoldTab.40"));
                    }
                }
            }
        }
    });
    /**
     * Hide the scan button in basic mode since we do it automatically now.
     */
    if (!configuration.isHideAdvancedOptions()) {
        builderFolder.add(but5, FormLayoutUtil.flip(cc.xy(5, 3), colSpec, orientation));
    }
    but5.setEnabled(configuration.getUseCache());
    isScanSharedFoldersOnStartup = new JCheckBox(Messages.getString("NetworkTab.StartupScan"), configuration.isScanSharedFoldersOnStartup());
    isScanSharedFoldersOnStartup.setToolTipText(Messages.getString("NetworkTab.StartupScanTooltip"));
    isScanSharedFoldersOnStartup.setContentAreaFilled(false);
    isScanSharedFoldersOnStartup.addItemListener(new ItemListener() {

        @Override
        public void itemStateChanged(ItemEvent e) {
            configuration.setScanSharedFoldersOnStartup((e.getStateChange() == ItemEvent.SELECTED));
        }
    });
    builderFolder.add(isScanSharedFoldersOnStartup, FormLayoutUtil.flip(cc.xy(7, 3), colSpec, orientation));
    File[] folders = PMS.get().getSharedFoldersArray(false);
    if (folders != null && folders.length > 0) {
        File[] foldersMonitored = PMS.get().getSharedFoldersArray(true);
        for (File folder : folders) {
            boolean isMonitored = false;
            if (foldersMonitored != null && foldersMonitored.length > 0) {
                for (File folderMonitored : foldersMonitored) {
                    if (folderMonitored.getAbsolutePath().equals(folder.getAbsolutePath())) {
                        isMonitored = true;
                    }
                }
            }
            folderTableModel.addRow(new Object[] { folder.getAbsolutePath(), isMonitored });
        }
    } else {
        folderTableModel.addRow(new Object[] { ALL_DRIVES, false });
    }
    JScrollPane pane = new JScrollPane(FList);
    Dimension d = FList.getPreferredSize();
    pane.setPreferredSize(new Dimension(d.width, FList.getRowHeight() * 2));
    builderFolder.add(pane, FormLayoutUtil.flip(cc.xyw(1, 5, 7), colSpec, orientation));
    return builderFolder;
}
Also used : DefaultTableCellRenderer(javax.swing.table.DefaultTableCellRenderer) FontMetrics(java.awt.FontMetrics) Component(java.awt.Component) FormLayout(com.jgoodies.forms.layout.FormLayout) PanelBuilder(com.jgoodies.forms.builder.PanelBuilder) ComponentOrientation(java.awt.ComponentOrientation) Dimension(java.awt.Dimension) TableColumn(javax.swing.table.TableColumn) CustomJButton(net.pms.newgui.components.CustomJButton) DLNAMediaDatabase(net.pms.dlna.DLNAMediaDatabase) File(java.io.File)

Example 62 with DefaultTableCellRenderer

use of javax.swing.table.DefaultTableCellRenderer in project UniversalMediaServer by UniversalMediaServer.

the class PluginTab method build.

public JComponent build() {
    ComponentOrientation orientation = ComponentOrientation.getOrientation(PMS.getLocale());
    String colSpec = FormLayoutUtil.getColSpec(COL_SPEC, orientation);
    FormLayout layout = new FormLayout(colSpec, ROW_SPEC);
    PanelBuilder builder = new PanelBuilder(layout);
    builder.border(Borders.DLU4);
    builder.opaque(true);
    CellConstraints cc = new CellConstraints();
    // Available Plugins section
    JComponent availablePluginsHeading = builder.addSeparator(Messages.getString("PluginTab.1"), FormLayoutUtil.flip(cc.xyw(1, 1, 9), colSpec, orientation));
    availablePluginsHeading = (JComponent) availablePluginsHeading.getComponent(0);
    availablePluginsHeading.setFont(availablePluginsHeading.getFont().deriveFont(Font.BOLD));
    final String[] cols = { Messages.getString("NetworkTab.41"), Messages.getString("PluginTab.3"), Messages.getString("NetworkTab.42"), Messages.getString("NetworkTab.43"), Messages.getString("NetworkTab.53") };
    final JTable table = new JTable(1, cols.length) {

        private static final long serialVersionUID = -5032210766949508624L;

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

        @Override
        public String getToolTipText(MouseEvent e) {
            java.awt.Point p = e.getPoint();
            int rowIndex = rowAtPoint(p);
            DownloadPlugins plugin = plugins.get(rowIndex);
            return plugin.htmlString();
        }
    };
    refresh(table, cols);
    /* An attempt to set the correct row height adjusted for font scaling.
		 * It sets all rows based on the font size of cell (0, 0). The + 4 is
		 * to allow 2 pixels above and below the text. */
    DefaultTableCellRenderer cellRenderer = (DefaultTableCellRenderer) table.getCellRenderer(0, 0);
    FontMetrics metrics = cellRenderer.getFontMetrics(cellRenderer.getFont());
    table.setRowHeight(metrics.getLeading() + metrics.getMaxAscent() + metrics.getMaxDescent() + 4);
    table.setIntercellSpacing(new Dimension(8, 2));
    // Define column widths
    TableColumn nameColumn = table.getColumnModel().getColumn(0);
    nameColumn.setMinWidth(70);
    TableColumn versionColumn = table.getColumnModel().getColumn(2);
    versionColumn.setPreferredWidth(45);
    TableColumn ratingColumn = table.getColumnModel().getColumn(2);
    ratingColumn.setPreferredWidth(45);
    TableColumn authorColumn = table.getColumnModel().getColumn(3);
    authorColumn.setMinWidth(150);
    TableColumn descriptionColumn = table.getColumnModel().getColumn(4);
    descriptionColumn.setMinWidth(300);
    JScrollPane pane = new JScrollPane(table, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
    pane.setBorder(BorderFactory.createEmptyBorder());
    pane.setPreferredSize(new Dimension(200, 139));
    builder.add(pane, FormLayoutUtil.flip(cc.xyw(1, 3, 9), colSpec, orientation));
    CustomJButton install = new CustomJButton(Messages.getString("NetworkTab.39"));
    builder.add(install, FormLayoutUtil.flip(cc.xy(1, 5), colSpec, orientation));
    install.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent e) {
            if (!ExternalFactory.localPluginsInstalled()) {
                JOptionPane.showMessageDialog(looksFrame, Messages.getString("NetworkTab.40"));
                return;
            }
            // need admin rights here.
            try {
                if (!FileUtil.getFilePermissions(configuration.getPluginDirectory()).isWritable()) {
                    JOptionPane.showMessageDialog(looksFrame, Messages.getString("PluginTab.16") + (Platform.isWindows() ? "\n" + Messages.getString("AutoUpdate.13") : ""), Messages.getString("Dialog.PermissionsError"), JOptionPane.ERROR_MESSAGE);
                    return;
                }
            } catch (FileNotFoundException e1) {
                JOptionPane.showMessageDialog(looksFrame, String.format(Messages.getString("PluginTab.17"), configuration.getPluginDirectory()), Messages.getString("Dialog.Error"), JOptionPane.ERROR_MESSAGE);
                return;
            }
            final int[] rows = table.getSelectedRows();
            JPanel panel = new JPanel();
            GridLayout layout = new GridLayout(3, 1);
            panel.setLayout(layout);
            final JFrame frame = new JFrame(Messages.getString("NetworkTab.46"));
            frame.setSize(250, 110);
            JProgressBar progressBar = new JProgressBar();
            progressBar.setIndeterminate(true);
            panel.add(progressBar);
            final JLabel label = new JLabel("");
            final JLabel inst = new JLabel("");
            panel.add(inst);
            panel.add(label);
            frame.add(panel);
            // Center the installation progress window
            frame.setLocationRelativeTo(null);
            Runnable r = new Runnable() {

                @Override
                public void run() {
                    for (int i = 0; i < rows.length; i++) {
                        DownloadPlugins plugin = plugins.get(rows[i]);
                        if (plugin.isOld()) {
                            // This plugin requires newer UMS
                            // display error and skip it.
                            JOptionPane.showMessageDialog(looksFrame, "Plugin " + plugin.getName() + " requires a newer version of UMS. Please upgrade.", "Version Error", JOptionPane.ERROR_MESSAGE);
                            frame.setVisible(false);
                            continue;
                        }
                        frame.setVisible(true);
                        inst.setText(Messages.getString("NetworkTab.50") + ": " + plugin.getName());
                        try {
                            plugin.install(label);
                        } catch (Exception e) {
                            LOGGER.debug("An error occurred when trying to install the plugin: " + plugin.getName());
                            LOGGER.debug("Full error: " + e);
                        }
                    }
                    frame.setVisible(false);
                }
            };
            new Thread(r).start();
        }
    });
    CustomJButton refresh = new CustomJButton(Messages.getString("PluginTab.2") + " " + Messages.getString("PluginTab.1").toLowerCase());
    builder.add(refresh, FormLayoutUtil.flip(cc.xy(3, 5), colSpec, orientation));
    refresh.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent e) {
            refresh(table, cols);
        }
    });
    // Installed Plugins section
    JComponent component;
    installedPluginsSeparator = (JPanel) builder.addSeparator(Messages.getString("PluginTab.0"), FormLayoutUtil.flip(cc.xyw(1, 7, 9), colSpec, orientation));
    installedPluginsSeparator.setVisible(false);
    component = (JComponent) installedPluginsSeparator.getComponent(0);
    component.setFont(component.getFont().deriveFont(Font.BOLD));
    pPlugins = new JPanel(new GridLayout());
    pPlugins.setVisible(false);
    builder.add(pPlugins, FormLayoutUtil.flip(cc.xyw(1, 9, 9), colSpec, orientation));
    // Credentials section
    component = builder.addSeparator(Messages.getString("PluginTab.8"), FormLayoutUtil.flip(cc.xyw(1, 11, 9), colSpec, orientation));
    component = (JComponent) component.getComponent(0);
    component.setFont(component.getFont().deriveFont(Font.BOLD));
    /* An attempt to set the correct row height adjusted for font scaling.
		 * It sets all rows based on the font size of cell (0, 0). The + 4 is
		 * to allow 2 pixels above and below the text. */
    cellRenderer = (DefaultTableCellRenderer) credTable.getCellRenderer(0, 0);
    metrics = cellRenderer.getFontMetrics(cellRenderer.getFont());
    credTable.setRowHeight(metrics.getLeading() + metrics.getMaxAscent() + metrics.getMaxDescent() + 4);
    credTable.setFillsViewportHeight(true);
    credTable.setIntercellSpacing(new Dimension(8, 2));
    // Define column widths
    TableColumn ownerColumn = credTable.getColumnModel().getColumn(0);
    ownerColumn.setMinWidth(70);
    TableColumn tagColumn = credTable.getColumnModel().getColumn(2);
    tagColumn.setPreferredWidth(45);
    TableColumn usrColumn = credTable.getColumnModel().getColumn(2);
    usrColumn.setPreferredWidth(45);
    TableColumn pwdColumn = credTable.getColumnModel().getColumn(3);
    pwdColumn.setPreferredWidth(45);
    pane = new JScrollPane(credTable, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
    pane.setBorder(BorderFactory.createEmptyBorder());
    pane.setPreferredSize(new Dimension(200, 95));
    builder.add(pane, FormLayoutUtil.flip(cc.xyw(1, 13, 9), colSpec, orientation));
    // Add button
    CustomJButton add = new CustomJButton(Messages.getString("PluginTab.9"));
    builder.add(add, FormLayoutUtil.flip(cc.xy(1, 15), colSpec, orientation));
    add.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent e) {
            addEditDialog(credTable, -1);
        }
    });
    // Edit button
    CustomJButton edit = new CustomJButton(Messages.getString("PluginTab.11"));
    builder.add(edit, FormLayoutUtil.flip(cc.xy(3, 15), colSpec, orientation));
    edit.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent e) {
            addEditDialog(credTable, credTable.getSelectedRow());
        }
    });
    // Delete button
    CustomJButton del = new CustomJButton(Messages.getString("PluginTab.12"));
    builder.add(del, FormLayoutUtil.flip(cc.xy(5, 15), colSpec, orientation));
    del.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent e) {
            int[] rows = credTable.getSelectedRows();
            if (rows.length > 0) {
                int n = JOptionPane.showConfirmDialog(looksFrame, Messages.getString("PluginTab.13"), "", JOptionPane.YES_NO_OPTION);
                if (n == JOptionPane.YES_OPTION) {
                    for (int i = 0; i < rows.length; i++) {
                        String key = (String) credTable.getValueAt(rows[i], 0);
                        if (StringUtils.isNotEmpty((String) credTable.getValueAt(rows[i], 1))) {
                            key = key + "." + (String) credTable.getValueAt(rows[i], 1);
                        }
                        cred.clearProperty(key);
                    }
                }
                try {
                    cred.save();
                } catch (ConfigurationException e1) {
                    LOGGER.warn("Couldn't save credentials file {}", e1.getMessage());
                    LOGGER.trace("", e1);
                }
                refreshCred(credTable);
            }
        }
    });
    // Edit Plugin Credential File button
    CustomJButton credEdit = new CustomJButton(Messages.getString("NetworkTab.54"));
    credEdit.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent e) {
            JPanel tPanel = new JPanel(new BorderLayout());
            final JTextArea textArea = new JTextArea();
            textArea.setFont(new Font("Courier", Font.PLAIN, 12));
            JScrollPane scrollPane = new JScrollPane(textArea);
            scrollPane.setPreferredSize(new Dimension(900, 450));
            try {
                configuration.initCred();
            } catch (IOException e2) {
                LOGGER.error("Could not create credentials file: {}", e2.getMessage());
                LOGGER.trace("", e2);
                return;
            }
            try {
                cred.save();
            } catch (ConfigurationException e3) {
                LOGGER.error("Could not save credentials file: {}", e3.getMessage());
                LOGGER.trace("", e3);
            }
            File f = configuration.getCredFile();
            try {
                try (BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream(f), StandardCharsets.UTF_8))) {
                    String line;
                    StringBuilder sb = new StringBuilder();
                    while ((line = in.readLine()) != null) {
                        sb.append(line);
                        sb.append("\n");
                    }
                    textArea.setText(sb.toString());
                }
            } catch (IOException e1) {
                LOGGER.error("Could not read credentials file: {}", e1.getMessage());
                LOGGER.trace("", e1);
                return;
            }
            tPanel.add(scrollPane, BorderLayout.NORTH);
            Object[] options = { Messages.getString("LooksFrame.9"), Messages.getString("NetworkTab.45") };
            if (JOptionPane.showOptionDialog(looksFrame, tPanel, Messages.getString("NetworkTab.54"), JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE, null, options, null) == JOptionPane.OK_OPTION) {
                String text = textArea.getText();
                try {
                    try (FileOutputStream fos = new FileOutputStream(f)) {
                        fos.write(text.getBytes(StandardCharsets.UTF_8));
                        fos.flush();
                    }
                    PMS.getConfiguration().reload();
                    try {
                        cred.refresh();
                    } catch (ConfigurationException e2) {
                        LOGGER.error("An error occurred while updating credentials: {}", e2);
                        LOGGER.trace("", e2);
                    }
                    refreshCred(credTable);
                } catch (Exception e1) {
                    JOptionPane.showMessageDialog(looksFrame, Messages.getString("NetworkTab.55") + ": " + e1.getMessage());
                }
            }
        }
    });
    builder.add(credEdit, FormLayoutUtil.flip(cc.xy(7, 15), colSpec, orientation));
    JPanel panel = builder.getPanel();
    JScrollPane scrollPane = new JScrollPane(panel, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
    scrollPane.setBorder(BorderFactory.createEmptyBorder());
    return scrollPane;
}
Also used : JPanel(javax.swing.JPanel) JTextArea(javax.swing.JTextArea) ActionEvent(java.awt.event.ActionEvent) FileNotFoundException(java.io.FileNotFoundException) JProgressBar(javax.swing.JProgressBar) Font(java.awt.Font) DefaultTableCellRenderer(javax.swing.table.DefaultTableCellRenderer) GridLayout(java.awt.GridLayout) BorderLayout(java.awt.BorderLayout) JFrame(javax.swing.JFrame) ConfigurationException(org.apache.commons.configuration.ConfigurationException) FontMetrics(java.awt.FontMetrics) DownloadPlugins(net.pms.configuration.DownloadPlugins) CellConstraints(com.jgoodies.forms.layout.CellConstraints) FormLayout(com.jgoodies.forms.layout.FormLayout) JScrollPane(javax.swing.JScrollPane) PanelBuilder(com.jgoodies.forms.builder.PanelBuilder) MouseEvent(java.awt.event.MouseEvent) InputStreamReader(java.io.InputStreamReader) JComponent(javax.swing.JComponent) JLabel(javax.swing.JLabel) ComponentOrientation(java.awt.ComponentOrientation) Dimension(java.awt.Dimension) IOException(java.io.IOException) TableColumn(javax.swing.table.TableColumn) FileNotFoundException(java.io.FileNotFoundException) ConfigurationException(org.apache.commons.configuration.ConfigurationException) IOException(java.io.IOException) FileInputStream(java.io.FileInputStream) CustomJButton(net.pms.newgui.components.CustomJButton) ActionListener(java.awt.event.ActionListener) JTable(javax.swing.JTable) FileOutputStream(java.io.FileOutputStream) BufferedReader(java.io.BufferedReader) File(java.io.File)

Example 63 with DefaultTableCellRenderer

use of javax.swing.table.DefaultTableCellRenderer in project MultiTypeTree by tgvaughan.

the class MigrationModelInputEditor method init.

@Override
public void init(Input<?> input, BEASTInterface beastObject, int itemNr, ExpandOption bExpandOption, boolean bAddButtons) {
    // Set up fields
    m_bAddButtons = bAddButtons;
    m_input = input;
    m_beastObject = beastObject;
    this.itemNr = itemNr;
    // Adds label to left of input editor
    addInputLabel();
    // Create component models and fill them with data from input
    migModel = (SCMigrationModel) input.get();
    fullTypeListModel = new DefaultListModel<>();
    additionalTypeListModel = new DefaultListModel<>();
    popSizeModel = new DefaultTableModel();
    rateMatrixModel = new DefaultTableModel() {

        @Override
        public boolean isCellEditable(int row, int column) {
            return row != column && column != migModel.getNTypes();
        }
    };
    popSizeEstCheckBox = new JCheckBox("estimate pop. sizes");
    rateMatrixEstCheckBox = new JCheckBox("estimate mig. rates");
    popSizeScaleFactorEstCheckBox = new JCheckBox("estimate scale factor");
    rateMatrixScaleFactorEstCheckBox = new JCheckBox("estimate scale factor");
    loadFromMigrationModel();
    JPanel panel = new JPanel(new GridBagLayout());
    panel.setBorder(new EtchedBorder());
    GridBagConstraints c = new GridBagConstraints();
    c.insets = new Insets(3, 3, 3, 3);
    c.weighty = 0.5;
    // Type list:
    c.gridx = 0;
    c.gridy = 0;
    c.weightx = 0.0;
    c.anchor = GridBagConstraints.LINE_END;
    panel.add(new JLabel("<html><body>Type list:</body></html>"), c);
    JList<String> jlist;
    Box tlBox = Box.createHorizontalBox();
    Box tlBoxLeft = Box.createVerticalBox();
    JLabel labelLeft = new JLabel("All types");
    tlBoxLeft.add(labelLeft);
    jlist = new JList<>(fullTypeListModel);
    jlist.setSelectionModel(new DefaultListSelectionModel() {

        @Override
        public void setSelectionInterval(int index0, int index1) {
            super.setSelectionInterval(-1, -1);
        }
    });
    JScrollPane listScrollPane = new JScrollPane(jlist);
    listScrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
    tlBoxLeft.add(listScrollPane);
    tlBox.add(tlBoxLeft);
    Box tlBoxRight = Box.createVerticalBox();
    JLabel labelRight = new JLabel("Additional types");
    tlBoxRight.add(labelRight);
    jlist = new JList<>(additionalTypeListModel);
    additionalTypeListSelectionModel = jlist.getSelectionModel();
    listScrollPane = new JScrollPane(jlist);
    listScrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
    tlBoxRight.add(listScrollPane);
    Box addRemBox = Box.createHorizontalBox();
    addTypeButton = new JButton("+");
    remTypeButton = new JButton("-");
    remTypeButton.setEnabled(false);
    addTypesFromFileButton = new JButton("Add from file...");
    addRemBox.add(addTypeButton);
    addRemBox.add(remTypeButton);
    addRemBox.add(addTypesFromFileButton);
    tlBoxRight.add(addRemBox);
    tlBox.add(tlBoxRight);
    c.gridx = 1;
    c.gridy = 0;
    c.weightx = 1.0;
    c.anchor = GridBagConstraints.LINE_START;
    panel.add(tlBox, c);
    // Population size table
    c.gridx = 0;
    c.gridy = 1;
    c.weightx = 0.0;
    c.anchor = GridBagConstraints.LINE_END;
    Box psBox = Box.createVerticalBox();
    psBox.add(new JLabel("Population sizes: "), c);
    loadPopSizesFromFileButton = new JButton("Load from file...");
    psBox.add(loadPopSizesFromFileButton);
    panel.add(psBox, c);
    JTable popSizeTable = new JTable(popSizeModel) {

        @Override
        public TableCellRenderer getCellRenderer(int row, int column) {
            return new DefaultTableCellRenderer() {

                @Override
                public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
                    setHorizontalAlignment(SwingConstants.CENTER);
                    return super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
                }
            };
        }
    };
    popSizeTable.setShowVerticalLines(true);
    popSizeTable.setCellSelectionEnabled(true);
    popSizeTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    popSizeTable.setMaximumSize(new Dimension(100, Short.MAX_VALUE));
    c.gridx = 1;
    c.gridy = 1;
    c.weightx = 1.0;
    c.anchor = GridBagConstraints.LINE_START;
    panel.add(popSizeTable, c);
    popSizeEstCheckBox.setSelected(((RealParameter) migModel.popSizesInput.get()).isEstimatedInput.get());
    popSizeScaleFactorEstCheckBox.setSelected(((RealParameter) migModel.popSizesScaleFactorInput.get()).isEstimatedInput.get());
    c.gridx = 2;
    c.gridy = 1;
    c.anchor = GridBagConstraints.LINE_END;
    c.weightx = 1.0;
    Box estBox = Box.createVerticalBox();
    estBox.add(popSizeEstCheckBox);
    estBox.add(popSizeScaleFactorEstCheckBox);
    panel.add(estBox, c);
    // Migration rate table
    // (Uses custom cell renderer to grey out diagonal elements.)
    c.gridx = 0;
    c.gridy = 2;
    c.weightx = 0.0;
    c.anchor = GridBagConstraints.LINE_END;
    Box mrBox = Box.createVerticalBox();
    mrBox.add(new JLabel("Migration rates: "), c);
    loadMigRatesFromFileButton = new JButton("Load from file...");
    mrBox.add(loadMigRatesFromFileButton);
    panel.add(mrBox, c);
    JTable rateMatrixTable = new JTable(rateMatrixModel) {

        @Override
        public TableCellRenderer getCellRenderer(int row, int column) {
            return new DefaultTableCellRenderer() {

                @Override
                public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
                    if (row == column) {
                        JLabel label = new JLabel();
                        label.setOpaque(true);
                        label.setBackground(Color.GRAY);
                        return label;
                    } else {
                        Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
                        if (column == migModel.getNTypes()) {
                            c.setBackground(panel.getBackground());
                            c.setForeground(Color.gray);
                            setHorizontalAlignment(SwingConstants.LEFT);
                        } else {
                            int l = 1, r = 1, t = 1, b = 1;
                            if (column > 0)
                                l = 0;
                            if (row > 0)
                                t = 0;
                            setBorder(BorderFactory.createMatteBorder(t, l, b, r, Color.GRAY));
                            setHorizontalAlignment(SwingConstants.CENTER);
                        }
                        return c;
                    }
                }
            };
        }
    };
    rateMatrixTable.setShowGrid(false);
    rateMatrixTable.setIntercellSpacing(new Dimension(0, 0));
    rateMatrixTable.setCellSelectionEnabled(true);
    rateMatrixTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    rateMatrixTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
    TableColumn col = rateMatrixTable.getColumnModel().getColumn(migModel.getNTypes());
    FontMetrics metrics = new Canvas().getFontMetrics(getFont());
    int maxWidth = 0;
    for (String rowName : rowNames) maxWidth = Math.max(maxWidth, metrics.stringWidth(rowName + "M"));
    col.setPreferredWidth(maxWidth);
    c.gridx = 1;
    c.gridy = 2;
    c.anchor = GridBagConstraints.LINE_START;
    c.weightx = 1.0;
    panel.add(rateMatrixTable, c);
    rateMatrixEstCheckBox.setSelected(((RealParameter) migModel.rateMatrixInput.get()).isEstimatedInput.get());
    rateMatrixScaleFactorEstCheckBox.setSelected(((RealParameter) migModel.rateMatrixScaleFactorInput.get()).isEstimatedInput.get());
    c.gridx = 2;
    c.gridy = 2;
    c.anchor = GridBagConstraints.LINE_END;
    c.weightx = 1.0;
    estBox = Box.createVerticalBox();
    estBox.add(rateMatrixEstCheckBox);
    estBox.add(rateMatrixScaleFactorEstCheckBox);
    panel.add(estBox, c);
    c.gridx = 1;
    c.gridy = 3;
    c.anchor = GridBagConstraints.LINE_START;
    c.weightx = 1.0;
    panel.add(new JLabel("Rows: sources, columns: sinks (backwards in time)"), c);
    c.gridx = 1;
    c.gridy = 4;
    c.anchor = GridBagConstraints.LINE_START;
    c.weightx = 1.0;
    JLabel multilineLabel = new JLabel();
    multilineLabel.setText("<html><body>Correspondence between row/col indices<br>" + "and deme names shown to right of matrix.</body></html>");
    panel.add(multilineLabel, c);
    add(panel);
    // Event handlers
    popSizeModel.addTableModelListener(e -> {
        if (e.getType() != TableModelEvent.UPDATE)
            return;
        if (!fileLoadInProgress)
            saveToMigrationModel();
    });
    popSizeEstCheckBox.addItemListener(e -> saveToMigrationModel());
    popSizeScaleFactorEstCheckBox.addItemListener(e -> saveToMigrationModel());
    rateMatrixModel.addTableModelListener(e -> {
        if (e.getType() != TableModelEvent.UPDATE)
            return;
        if (!fileLoadInProgress)
            saveToMigrationModel();
    });
    rateMatrixEstCheckBox.addItemListener(e -> saveToMigrationModel());
    rateMatrixScaleFactorEstCheckBox.addItemListener(e -> saveToMigrationModel());
    addTypeButton.addActionListener(e -> {
        String newTypeName = JOptionPane.showInputDialog("Name of type");
        if (newTypeName != null) {
            if (migModel.getTypeSet().containsTypeWithName(newTypeName)) {
                JOptionPane.showMessageDialog(panel, "Type with this name already present.", "Error", JOptionPane.ERROR_MESSAGE);
            } else {
                additionalTypeListModel.add(additionalTypeListModel.size(), newTypeName);
                saveToMigrationModel();
            }
        }
    });
    addTypesFromFileButton.addActionListener(e -> {
        JFileChooser fc = new JFileChooser();
        fc.setDialogTitle("Choose file containing type names (one per line)");
        fc.setFileSelectionMode(JFileChooser.FILES_ONLY);
        fc.setMultiSelectionEnabled(false);
        int result = fc.showDialog(panel, "Load");
        if (result == JFileChooser.APPROVE_OPTION) {
            File file = fc.getSelectedFile();
            try {
                BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(file)));
                String line;
                while ((line = reader.readLine()) != null) {
                    line = line.trim();
                    if (!line.isEmpty())
                        additionalTypeListModel.add(additionalTypeListModel.size(), line);
                }
                saveToMigrationModel();
            } catch (IOException e1) {
                JOptionPane.showMessageDialog(panel, "Error reading from file: " + e1.getMessage(), "Error", JOptionPane.ERROR_MESSAGE);
            }
        }
    });
    additionalTypeListSelectionModel.addListSelectionListener(e -> {
        if (additionalTypeListSelectionModel.getMinSelectionIndex() < 0)
            remTypeButton.setEnabled(false);
        else
            remTypeButton.setEnabled(true);
    });
    remTypeButton.addActionListener(e -> {
        int selectionMin = additionalTypeListSelectionModel.getMinSelectionIndex();
        int selectionMax = additionalTypeListSelectionModel.getMaxSelectionIndex();
        additionalTypeListModel.removeRange(selectionMin, selectionMax);
        additionalTypeListSelectionModel.clearSelection();
        saveToMigrationModel();
    });
    loadPopSizesFromFileButton.addActionListener(e -> {
        JFileChooser fc = new JFileChooser();
        fc.setDialogTitle("Choose file containing population sizes (one per line)");
        fc.setFileSelectionMode(JFileChooser.FILES_ONLY);
        fc.setMultiSelectionEnabled(false);
        int result = fc.showDialog(panel, "Load");
        if (result == JFileChooser.APPROVE_OPTION) {
            File file = fc.getSelectedFile();
            try {
                BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(file)));
                List<Double> popSizes = new ArrayList<>();
                String line;
                while ((line = reader.readLine()) != null) {
                    line = line.trim();
                    if (!line.isEmpty())
                        popSizes.add(Double.parseDouble(line));
                }
                if (popSizes.size() == migModel.getNTypes()) {
                    fileLoadInProgress = true;
                    for (int i = 0; i < popSizes.size(); i++) popSizeModel.setValueAt(popSizes.get(i), 0, i);
                    fileLoadInProgress = false;
                    saveToMigrationModel();
                } else {
                    JOptionPane.showMessageDialog(panel, "<html>File must contain exactly one population<br> size for each type/deme.</html>", "Error", JOptionPane.ERROR_MESSAGE);
                }
            } catch (IOException ex) {
                JOptionPane.showMessageDialog(panel, "Error reading from file: " + ex.getMessage(), "Error", JOptionPane.ERROR_MESSAGE);
            } catch (NumberFormatException ex) {
                JOptionPane.showMessageDialog(panel, "<html>File contains non-numeric line. " + "Every line must contain<br> exactly one population size.</html>", "Error", JOptionPane.ERROR_MESSAGE);
            }
        }
    });
    loadMigRatesFromFileButton.addActionListener(e -> {
        JFileChooser fc = new JFileChooser();
        fc.setDialogTitle("Choose CSV file containing migration rate matrix (diagonal ignored)");
        fc.setFileSelectionMode(JFileChooser.FILES_ONLY);
        fc.setMultiSelectionEnabled(false);
        int result = fc.showDialog(panel, "Load");
        if (result == JFileChooser.APPROVE_OPTION) {
            File file = fc.getSelectedFile();
            try {
                BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(file)));
                List<Double> migRates = new ArrayList<>();
                String line;
                while ((line = reader.readLine()) != null) {
                    line = line.trim();
                    for (String field : line.split(",")) {
                        if (!field.isEmpty())
                            migRates.add(Double.parseDouble(field));
                    }
                }
                boolean diagonalsPresent = (migRates.size() == migModel.getNTypes() * migModel.getNTypes());
                if (diagonalsPresent || migRates.size() == migModel.getNTypes() * (migModel.getNTypes() - 1)) {
                    fileLoadInProgress = true;
                    for (int i = 0; i < migModel.getNTypes(); i++) {
                        for (int j = 0; j < migModel.getNTypes(); j++) {
                            if (i == j)
                                continue;
                            int offset;
                            if (diagonalsPresent)
                                offset = i * migModel.getNTypes() + j;
                            else {
                                offset = i * (migModel.getNTypes() - 1) + j;
                                if (j > i)
                                    offset -= 1;
                            }
                            rateMatrixModel.setValueAt(migRates.get(offset), i, j);
                        }
                    }
                    fileLoadInProgress = false;
                    saveToMigrationModel();
                } else {
                    JOptionPane.showMessageDialog(panel, "<html>CSV file must contain a square matrix with exactly one<br>" + "row for each type/deme.</html>", "Error", JOptionPane.ERROR_MESSAGE);
                }
            } catch (IOException ex) {
                JOptionPane.showMessageDialog(panel, "Error reading from file: " + ex.getMessage(), "Error", JOptionPane.ERROR_MESSAGE);
            } catch (NumberFormatException ex) {
                JOptionPane.showMessageDialog(panel, "<html>CSV file contains non-numeric element.</html", "Error", JOptionPane.ERROR_MESSAGE);
            }
        }
    });
}
Also used : DefaultTableModel(javax.swing.table.DefaultTableModel) ArrayList(java.util.ArrayList) DefaultTableCellRenderer(javax.swing.table.DefaultTableCellRenderer) RealParameter(beast.core.parameter.RealParameter) TableColumn(javax.swing.table.TableColumn) EtchedBorder(javax.swing.border.EtchedBorder)

Example 64 with DefaultTableCellRenderer

use of javax.swing.table.DefaultTableCellRenderer in project mafscaling by vimsh.

the class ACompCalc method createDataTable.

private JTable createDataTable(JPanel panel, String tableName, int colCount, int rowCount, int gridx, int gridy, boolean isOriginalTable, boolean extendRows, boolean extendCols) {
    final JTable table;
    ExcelAdapter excelAdapter;
    if (isOriginalTable) {
        table = new JTable() {

            private static final long serialVersionUID = 3218402382894083287L;

            public boolean isCellEditable(int row, int column) {
                return false;
            }
        };
        excelAdapter = new ExcelAdapter() {

            protected void onPaste(JTable table, boolean extendRows, boolean extendCols) {
                if (table.getSelectedRows() == null || table.getSelectedRows().length == 0 || table.getSelectedColumns() == null || table.getSelectedColumns().length == 0)
                    return;
                if (table.getSelectedRows()[0] != 0 || table.getSelectedColumns()[0] != 0) {
                    JOptionPane.showMessageDialog(null, "Please paste copied table into the first cell", "Error", JOptionPane.ERROR_MESSAGE);
                    return;
                }
                super.onPaste(table, extendRows, extendCols);
                validateTable(table);
                clearRunTables();
            }
        };
        excelAdapter.addTable(table, false, true, false, false, true, true, false, extendRows, extendCols);
        excelAdapterList.add(excelAdapter);
    } else {
        table = new JTable() {

            private static final long serialVersionUID = -3754572906310312568L;

            public boolean isCellEditable(int row, int column) {
                return isNonOriginalTableCellEditable(row, column);
            }

            public Component prepareEditor(TableCellEditor editor, int row, int column) {
                Component c = super.prepareEditor(editor, row, column);
                if (c instanceof JTextComponent)
                    ((JTextComponent) c).selectAll();
                return c;
            }
        };
        excelAdapter = new ExcelAdapter();
        excelAdapter.addTable(table, false, true, false, false, true, true, false, false, false);
        excelAdapterList.add(excelAdapter);
    }
    DefaultTableColumnModel tableModel = new DefaultTableColumnModel();
    final TableColumn tableColumn = new TableColumn(0, (colCount == 1 ? ColumnWidth : TableWidth));
    tableColumn.setHeaderValue(tableName);
    tableModel.addColumn(tableColumn);
    JTableHeader lblTableHeaderName = table.getTableHeader();
    lblTableHeaderName.setColumnModel(tableModel);
    lblTableHeaderName.setReorderingAllowed(false);
    DefaultTableCellRenderer headerRenderer = (DefaultTableCellRenderer) lblTableHeaderName.getDefaultRenderer();
    headerRenderer.setHorizontalAlignment(SwingConstants.LEFT);
    GridBagConstraints gbc_lblTableName = new GridBagConstraints();
    gbc_lblTableName.insets = new Insets((gridy == 0 ? 0 : 5), 0, 0, 0);
    gbc_lblTableName.anchor = GridBagConstraints.NORTHWEST;
    gbc_lblTableName.fill = GridBagConstraints.HORIZONTAL;
    gbc_lblTableName.gridx = gridx;
    gbc_lblTableName.gridy = gridy;
    panel.add(lblTableHeaderName, gbc_lblTableName);
    table.addComponentListener(new ComponentAdapter() {

        @Override
        public void componentResized(ComponentEvent e) {
            tableColumn.setWidth(table.getWidth());
        }
    });
    table.addMouseListener(new MouseAdapter() {

        public void mousePressed(MouseEvent event) {
            JTable eventTable = (JTable) event.getSource();
            int colIdx = eventTable.getSelectedColumn();
            int rowIdx = eventTable.getSelectedRow();
            JTable[] tables = new JTable[] { origTable, newTable, corrTable, corrCountTable };
            for (JTable t : tables) {
                if (t == null || t == eventTable)
                    continue;
                if (t.getColumnCount() - 1 >= colIdx && t.getRowCount() - 1 >= rowIdx) {
                    t.setColumnSelectionInterval(colIdx, colIdx);
                    t.setRowSelectionInterval(rowIdx, rowIdx);
                }
            }
        }

        public void mouseReleased(MouseEvent event) {
            JTable eventTable = (JTable) event.getSource();
            int[] cols = eventTable.getSelectedColumns();
            int[] rows = eventTable.getSelectedRows();
            int lastColIdx = cols.length - 1;
            int lastRowIdx = rows.length - 1;
            JTable[] tables = new JTable[] { origTable, newTable, corrTable, corrCountTable };
            for (JTable t : tables) {
                if (t == null || t == eventTable)
                    continue;
                if (t.getColumnCount() - 1 >= cols[lastColIdx] && t.getRowCount() - 1 >= rows[lastRowIdx]) {
                    t.setColumnSelectionInterval(cols[0], cols[lastColIdx]);
                    t.setRowSelectionInterval(rows[0], rows[lastRowIdx]);
                }
            }
        }
    });
    table.setName(tableName);
    table.getTableHeader().setReorderingAllowed(false);
    table.setColumnSelectionAllowed(true);
    table.setCellSelectionEnabled(true);
    table.setBorder(new LineBorder(new Color(0, 0, 0)));
    table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
    table.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
    table.setModel(new DefaultTableModel(rowCount, colCount));
    table.putClientProperty("terminateEditOnFocusLost", true);
    Utils.initializeTable(table, ColumnWidth);
    formatTable(table);
    GridBagConstraints gbc_table = new GridBagConstraints();
    gbc_table.insets = insets0;
    gbc_table.anchor = GridBagConstraints.NORTHWEST;
    gbc_table.gridx = gridx;
    gbc_table.gridy = gridy + 1;
    panel.add(table, gbc_table);
    return table;
}
Also used : GridBagConstraints(java.awt.GridBagConstraints) Insets(java.awt.Insets) MouseEvent(java.awt.event.MouseEvent) DefaultTableColumnModel(javax.swing.table.DefaultTableColumnModel) LineBorder(javax.swing.border.LineBorder) Color(java.awt.Color) DefaultTableModel(javax.swing.table.DefaultTableModel) MouseAdapter(java.awt.event.MouseAdapter) JTableHeader(javax.swing.table.JTableHeader) JTextComponent(javax.swing.text.JTextComponent) TableColumn(javax.swing.table.TableColumn) DefaultTableCellRenderer(javax.swing.table.DefaultTableCellRenderer) JTable(javax.swing.JTable) TableCellEditor(javax.swing.table.TableCellEditor) ComponentEvent(java.awt.event.ComponentEvent) Component(java.awt.Component) JTextComponent(javax.swing.text.JTextComponent) ComponentAdapter(java.awt.event.ComponentAdapter)

Example 65 with DefaultTableCellRenderer

use of javax.swing.table.DefaultTableCellRenderer in project vcell by virtualcell.

the class ViewGeneratedReactionsPanel method initialize.

private void initialize() {
    try {
        setName("ViewGeneratedReactionsPanel");
        setLayout(new GridBagLayout());
        shapePanel = new RulesShapePanel() {

            @Override
            public void paintComponent(Graphics g) {
                super.paintComponent(g);
                for (AbstractComponentShape stls : reactantPatternShapeList) {
                    stls.paintSelf(g);
                }
                for (AbstractComponentShape stls : productPatternShapeList) {
                    stls.paintSelf(g);
                }
            }
        };
        Border loweredEtchedBorder = BorderFactory.createEtchedBorder(EtchedBorder.LOWERED);
        Border loweredBevelBorder = BorderFactory.createLoweredBevelBorder();
        shapePanel.setLayout(new GridBagLayout());
        shapePanel.setBackground(Color.white);
        // don't show the brown contour even though it's not editable
        shapePanel.setEditable(true);
        shapePanel.setShowMoleculeColor(true);
        shapePanel.setShowNonTrivialOnly(true);
        JScrollPane scrollPane = new JScrollPane(shapePanel);
        scrollPane.setBorder(loweredBevelBorder);
        scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
        scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_NEVER);
        JPanel optionsPanel = new JPanel();
        optionsPanel.setLayout(new GridBagLayout());
        getZoomSmallerButton().setEnabled(true);
        getZoomLargerButton().setEnabled(false);
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.gridx = 0;
        gbc.gridy = 0;
        gbc.insets = new Insets(0, 0, 0, 10);
        gbc.anchor = GridBagConstraints.WEST;
        optionsPanel.add(getZoomLargerButton(), gbc);
        gbc = new GridBagConstraints();
        gbc.gridx = 0;
        gbc.gridy = 1;
        gbc.insets = new Insets(2, 0, 4, 10);
        gbc.anchor = GridBagConstraints.WEST;
        optionsPanel.add(getZoomSmallerButton(), gbc);
        gbc = new GridBagConstraints();
        gbc.gridx = 0;
        gbc.gridy = 2;
        gbc.weightx = 1;
        // fake cell used for filling all the vertical empty space
        gbc.weighty = 1;
        gbc.anchor = GridBagConstraints.WEST;
        gbc.insets = new Insets(4, 4, 4, 10);
        optionsPanel.add(new JLabel(""), gbc);
        JPanel containerOfScrollPanel = new JPanel();
        containerOfScrollPanel.setLayout(new BorderLayout());
        containerOfScrollPanel.add(optionsPanel, BorderLayout.WEST);
        containerOfScrollPanel.add(scrollPane, BorderLayout.CENTER);
        Dimension dim = new Dimension(500, 140);
        // dimension of shape panel
        containerOfScrollPanel.setPreferredSize(dim);
        containerOfScrollPanel.setMinimumSize(dim);
        containerOfScrollPanel.setMaximumSize(dim);
        // -----------------------------------------------------------------------------
        table = new EditorScrollTable();
        tableModel = new GeneratedReactionTableModel(table, owner);
        table.setModel(tableModel);
        table.getSelectionModel().addListSelectionListener(eventHandler);
        table.getModel().addTableModelListener(eventHandler);
        DefaultTableCellRenderer rightRenderer = new DefaultTableCellRenderer();
        rightRenderer.setHorizontalAlignment(JLabel.RIGHT);
        // table.getColumnModel().getColumn(GeneratedReactionTableModel.iColIndex).setCellRenderer(rightRenderer);	// right align first table column
        // table.getColumnModel().getColumn(GeneratedReactionTableModel.iColIndex).setMaxWidth(60);				// left column wide enough for 6-7 digits
        int gridy = 0;
        gbc = new GridBagConstraints();
        gbc.gridx = 0;
        gbc.gridy = gridy;
        gbc.weightx = 1.0;
        gbc.weighty = 1.0;
        gbc.gridwidth = 8;
        gbc.fill = GridBagConstraints.BOTH;
        gbc.insets = new Insets(4, 4, 4, 4);
        // table.setPreferredScrollableViewportSize(new Dimension(400,200));
        add(table.getEnclosingScrollPane(), gbc);
        // add toolTipText for each table cell
        table.addMouseMotionListener(new MouseMotionAdapter() {

            public void mouseMoved(MouseEvent e) {
                Point p = e.getPoint();
                int row = table.rowAtPoint(p);
                int column = table.columnAtPoint(p);
                table.setToolTipText(String.valueOf(table.getValueAt(row, column)));
            }
        });
        gridy++;
        gbc = new GridBagConstraints();
        gbc.gridx = 0;
        gbc.gridy = gridy;
        gbc.anchor = GridBagConstraints.LINE_END;
        gbc.insets = new Insets(4, 4, 4, 4);
        add(new JLabel("Search "), gbc);
        textFieldSearch = new JTextField(70);
        textFieldSearch.addActionListener(eventHandler);
        textFieldSearch.getDocument().addDocumentListener(eventHandler);
        textFieldSearch.putClientProperty("JTextField.variant", "search");
        gbc = new GridBagConstraints();
        gbc.weightx = 1.0;
        gbc.gridx = 1;
        gbc.gridy = gridy;
        gbc.gridwidth = 3;
        gbc.anchor = GridBagConstraints.LINE_START;
        gbc.fill = java.awt.GridBagConstraints.HORIZONTAL;
        gbc.insets = new Insets(4, 0, 4, 4);
        add(textFieldSearch, gbc);
        gbc = new GridBagConstraints();
        gbc.gridx = 4;
        gbc.gridy = gridy;
        gbc.fill = GridBagConstraints.HORIZONTAL;
        gbc.insets = new Insets(4, 4, 4, 10);
        add(totalReactionsLabel, gbc);
        gridy++;
        gbc = new GridBagConstraints();
        gbc.gridx = 0;
        gbc.gridy = gridy;
        // gbc.weightx = 1.0;
        // gbc.weighty = 1.0;
        gbc.gridwidth = 8;
        gbc.anchor = GridBagConstraints.LINE_END;
        gbc.fill = java.awt.GridBagConstraints.BOTH;
        gbc.insets = new Insets(4, 4, 4, 4);
        add(containerOfScrollPanel, gbc);
        // rendering the small shapes of a fake rule in the Depiction column of this viewer table)
        // TODO: this renderer is almost identical with the one in BioModelEditorModelPanel (which paints the small shapes
        // of a rule in the Depiction column of the reaction table)
        DefaultScrollTableCellRenderer rbmReactionShapeDepictionCellRenderer = new DefaultScrollTableCellRenderer() {

            List<SpeciesPatternSmallShape> spssList = new ArrayList<SpeciesPatternSmallShape>();

            SpeciesPatternSmallShape spss = null;

            @Override
            public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
                super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
                if (table.getModel() instanceof VCellSortTableModel<?>) {
                    Object selectedObject = null;
                    if (table.getModel() == tableModel) {
                        selectedObject = tableModel.getValueAt(row);
                    }
                    if (selectedObject != null) {
                        if (selectedObject instanceof GeneratedReactionTableRow) {
                            ReactionRule rr = ((GeneratedReactionTableRow) selectedObject).getReactionRule();
                            Graphics panelContext = table.getGraphics();
                            BioModel bioModel = owner.getSimulationContext().getBioModel();
                            spssList.clear();
                            List<ReactantPattern> rpList = rr.getReactantPatterns();
                            int xPos = 4;
                            for (int i = 0; i < rpList.size(); i++) {
                                SpeciesPattern sp = rr.getReactantPattern(i).getSpeciesPattern();
                                spss = new SpeciesPatternSmallShape(xPos, 2, sp, null, panelContext, rr, isSelected, issueManager);
                                if (i < rpList.size() - 1) {
                                    spss.addEndText("+");
                                } else {
                                    if (rr.isReversible()) {
                                        spss.addEndText("<->");
                                        xPos += 7;
                                    } else {
                                        spss.addEndText("->");
                                    }
                                }
                                xPos += spss.getWidth() + 14;
                                spssList.add(spss);
                            }
                            List<ProductPattern> ppList = rr.getProductPatterns();
                            xPos += 7;
                            for (int i = 0; i < ppList.size(); i++) {
                                SpeciesPattern sp = rr.getProductPattern(i).getSpeciesPattern();
                                spss = new SpeciesPatternSmallShape(xPos, 2, sp, null, panelContext, rr, isSelected, issueManager);
                                if (i < ppList.size() - 1) {
                                    spss.addEndText("+");
                                }
                                xPos += spss.getWidth() + 14;
                                spssList.add(spss);
                            }
                        }
                    } else {
                        spssList.clear();
                    }
                }
                setText("");
                return this;
            }

            @Override
            public void paintComponent(Graphics g) {
                super.paintComponent(g);
                for (SpeciesPatternSmallShape spss : spssList) {
                    if (spss == null) {
                        continue;
                    }
                    spss.paintSelf(g);
                }
            }
        };
        table.getColumnModel().getColumn(GeneratedReactionTableModel.iColDepiction).setCellRenderer(rbmReactionShapeDepictionCellRenderer);
        table.getColumnModel().getColumn(GeneratedReactionTableModel.iColDepiction).setPreferredWidth(400);
        table.getColumnModel().getColumn(GeneratedReactionTableModel.iColDepiction).setMinWidth(400);
        table.getColumnModel().getColumn(GeneratedReactionTableModel.iColDefinition).setPreferredWidth(30);
        table.setAutoResizeMode(JTable.AUTO_RESIZE_LAST_COLUMN);
    } catch (java.lang.Throwable ivjExc) {
        handleException(ivjExc);
    }
}
Also used : JPanel(javax.swing.JPanel) GridBagConstraints(java.awt.GridBagConstraints) Insets(java.awt.Insets) GridBagLayout(java.awt.GridBagLayout) SpeciesPatternSmallShape(cbit.vcell.graph.SpeciesPatternSmallShape) JTextField(javax.swing.JTextField) SpeciesPattern(org.vcell.model.rbm.SpeciesPattern) RulesShapePanel(cbit.vcell.graph.gui.RulesShapePanel) DefaultTableCellRenderer(javax.swing.table.DefaultTableCellRenderer) BorderLayout(java.awt.BorderLayout) VCellSortTableModel(cbit.vcell.client.desktop.biomodel.VCellSortTableModel) List(java.util.List) ArrayList(java.util.ArrayList) AbstractComponentShape(cbit.vcell.graph.AbstractComponentShape) ReactantPattern(cbit.vcell.model.ReactantPattern) JScrollPane(javax.swing.JScrollPane) MouseEvent(java.awt.event.MouseEvent) ReactionRule(cbit.vcell.model.ReactionRule) ProductPattern(cbit.vcell.model.ProductPattern) JLabel(javax.swing.JLabel) Dimension(java.awt.Dimension) Point(java.awt.Point) Point(java.awt.Point) Graphics(java.awt.Graphics) MouseMotionAdapter(java.awt.event.MouseMotionAdapter) JTable(javax.swing.JTable) BioModel(cbit.vcell.biomodel.BioModel) DefaultScrollTableCellRenderer(org.vcell.util.gui.DefaultScrollTableCellRenderer) EditorScrollTable(org.vcell.util.gui.EditorScrollTable) Border(javax.swing.border.Border) EtchedBorder(javax.swing.border.EtchedBorder)

Aggregations

DefaultTableCellRenderer (javax.swing.table.DefaultTableCellRenderer)85 JTable (javax.swing.JTable)30 TableColumn (javax.swing.table.TableColumn)27 Component (java.awt.Component)21 JScrollPane (javax.swing.JScrollPane)20 DefaultTableModel (javax.swing.table.DefaultTableModel)17 TableCellRenderer (javax.swing.table.TableCellRenderer)17 JLabel (javax.swing.JLabel)14 MouseEvent (java.awt.event.MouseEvent)12 JComponent (javax.swing.JComponent)12 Dimension (java.awt.Dimension)11 Font (java.awt.Font)11 JTableHeader (javax.swing.table.JTableHeader)11 BorderLayout (java.awt.BorderLayout)9 Color (java.awt.Color)9 GridBagConstraints (java.awt.GridBagConstraints)9 Insets (java.awt.Insets)9 JPanel (javax.swing.JPanel)9 GridBagLayout (java.awt.GridBagLayout)7 Point (java.awt.Point)7