package org.pegadi.disposal; import org.pegadi.model.ArticleStatus; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.swing.*; import javax.swing.table.TableCellRenderer; import javax.swing.table.TableModel; import javax.swing.text.BadLocationException; import javax.swing.text.Style; import javax.swing.text.StyleConstants; import javax.swing.text.StyledDocument; import java.awt.*; import java.util.List; public class DisposalCellRenderer implements TableCellRenderer{ TableCellRenderer wrappedRenderer; PageTableModel model; private final Logger log = LoggerFactory.getLogger(getClass()); public DisposalCellRenderer(TableCellRenderer wrappedRenderer, TableModel model) { this.wrappedRenderer = wrappedRenderer; this.model = (PageTableModel)model; } public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { Component component = wrappedRenderer.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); if(column == 2 || column == 3 || column == 4 || column == 5) { JTextArea textArea = new JTextArea((String) value); textArea.setBackground(component.getBackground()); textArea.setForeground(component.getForeground()); textArea.setFont(component.getFont()); textArea.setLineWrap(true); textArea.setWrapStyleWord(true); textArea.setSize(table.getColumnModel().getColumn(column).getWidth(), 10000); textArea.setSize(textArea.getWidth(), textArea.getPreferredSize().height); if (textArea.getHeight() > table.getRowHeight(row)) { table.setRowHeight(row, textArea.getHeight()); } textArea.setMargin(new Insets(3, 3, 0, 0)); component = textArea; } else if(column == 6) { List<ArticleStatus> statuses = (List<ArticleStatus>) value; JTextPane pane = new JTextPane(); pane.setBackground(component.getBackground()); pane.setForeground(component.getForeground()); pane.setFont(component.getFont()); StyledDocument doc = pane.getStyledDocument(); Style style = pane.addStyle("Style", null); try { for(int i = 0; i < statuses.size(); i++) { if(i > 0) { StyleConstants.setBackground(style, component.getBackground()); doc.insertString(doc.getLength(), " \n \n", style); } ArticleStatus status = statuses.get(i); if(status.getColor().equals(Color.white)) { StyleConstants.setBackground(style, pane.getBackground()); } else { StyleConstants.setBackground(style, status.getColor()); } String s = status.getName() + " (" + model.getPage(row).getArticles().get(i).getCurrentNumberOfCharacters() + " tegn)"; doc.insertString(doc.getLength(), s, style); } } catch (BadLocationException e) { log.error("error - something went wrong when showing a styled cell", e); } pane.setSize(table.getColumnModel().getColumn(column).getWidth(), 10000); pane.setSize(pane.getWidth(), pane.getPreferredSize().height); if(pane.getHeight() > table.getRowHeight(row)) { table.setRowHeight(row, pane.getHeight()); } pane.setMargin(new Insets(3, 3, 0, 0)); component = pane; } // If it's the page number, center it and make it bold if(column == 0) { ((JLabel)component).setHorizontalAlignment(JLabel.CENTER); component.setFont(component.getFont().deriveFont(component.getFont().getStyle() ^ Font.BOLD)); } // Here I can check for stuff and paint the row to match it (maybe colour codes etc.) if(model.getPage(row).isAdOnPage()) { if(!isSelected) component.setBackground(Color.lightGray); } else { if(!isSelected) component.setBackground(null); } return component; } }