/******************************************************************************* * LogDruid : Generate charts and reports using data gathered in log files * Copyright (C) 2016 Frederic Valente (frederic.valente@gmail.com) * * This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. *******************************************************************************/ package logdruid.ui.mainpanel; import javax.swing.JPanel; import java.awt.BorderLayout; import java.awt.Component; import javax.swing.BorderFactory; import javax.swing.DefaultCellEditor; import javax.swing.DefaultRowSorter; import javax.swing.JComboBox; import javax.swing.JFrame; import javax.swing.JTextField; import javax.swing.JLabel; import javax.swing.JButton; import javax.swing.RowSorter; import javax.swing.SortOrder; import java.awt.FlowLayout; import java.awt.event.ActionListener; import java.awt.event.ActionEvent; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.io.BufferedReader; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; import logdruid.data.DateFormat; import logdruid.data.Repository; import logdruid.data.Source; import logdruid.ui.MainFrame; import logdruid.ui.dialog.DateSelector; import logdruid.ui.dialog.FileChooserDialog; import logdruid.util.DataMiner; import logdruid.util.FileListing; import logdruid.util.PatternCache; import javax.swing.JList; import javax.swing.JTable; import javax.swing.table.AbstractTableModel; import javax.swing.table.DefaultTableCellRenderer; import javax.swing.table.TableCellRenderer; import javax.swing.table.TableColumn; import javax.swing.text.BadLocationException; import javax.swing.text.DefaultHighlighter; import javax.swing.text.Document; import javax.swing.text.Highlighter; import javax.swing.border.Border; import javax.swing.border.LineBorder; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import javax.swing.event.TableModelEvent; import javax.swing.event.TableModelListener; import java.awt.Color; import javax.swing.JScrollPane; import javax.swing.JTextPane; import java.awt.CardLayout; import java.awt.Dimension; import java.awt.GridBagLayout; import java.awt.GridBagConstraints; import java.awt.Insets; import java.awt.Point; import javax.swing.JSeparator; import javax.swing.SwingConstants; import javax.swing.BoxLayout; import javax.swing.JCheckBox; import org.apache.log4j.Level; import org.apache.log4j.Logger; import java.awt.Font; import javax.swing.JSplitPane; public class SourcePanel extends JPanel { private static Logger logger = Logger.getLogger(SourcePanel.class.getName()); private JTextField basePathTextField; boolean DEBUG = false; private JTable table; private String[] header = { "name", "regexp", "Date Format", "active", "nb files", "size(MB)" }; private Repository repository; private ArrayList<Object[]> data = new ArrayList<Object[]>(); public MyTableModel2 model; static ArrayList<Source> sourceArrayList = null; private JTextPane txtpnTest = null; private Document doc; private MainFrame mainFrame; JCheckBox chckbxSubfolders = null; JCheckBox chckbxOnlyMatches = null; Map<Source, long[]> srcFileSummary = new HashMap<Source, long[]>(); /** * Create the panel. */ public SourcePanel(final Repository repo, final MainFrame _mainFrame) { mainFrame = _mainFrame; model = new MyTableModel2(data, header); repository = repo; GridBagLayout gridBagLayout = new GridBagLayout(); gridBagLayout.columnWidths = new int[] { 575, 0 }; gridBagLayout.rowHeights = new int[] { 45, 338, 0 }; gridBagLayout.columnWeights = new double[] { 1.0, Double.MIN_VALUE }; gridBagLayout.rowWeights = new double[] { 0.0, 1.0, Double.MIN_VALUE }; setLayout(gridBagLayout); JPanel descriptionPanel = new JPanel(); GridBagConstraints gbc_descriptionPanel = new GridBagConstraints(); gbc_descriptionPanel.insets = new Insets(0, 0, 5, 0); gbc_descriptionPanel.fill = GridBagConstraints.BOTH; gbc_descriptionPanel.gridx = 0; gbc_descriptionPanel.gridy = 0; add(descriptionPanel, gbc_descriptionPanel); descriptionPanel.setLayout(new BorderLayout(0, 0)); JPanel panel = new JPanel(); descriptionPanel.add(panel, BorderLayout.EAST); JButton btnFolder = new JButton("Folder..."); panel.add(btnFolder); JPanel panel_2 = new JPanel(); descriptionPanel.add(panel_2, BorderLayout.CENTER); GridBagLayout gbl_panel_2 = new GridBagLayout(); gbl_panel_2.columnWidths = new int[] { 499 }; gbl_panel_2.rowHeights = new int[] { 2, 0, 0, 0 }; gbl_panel_2.columnWeights = new double[] { 1.0 }; gbl_panel_2.rowWeights = new double[] { 1.0, 0.0, 1.0, 1.0 }; panel_2.setLayout(gbl_panel_2); JPanel panel_5 = new JPanel(); FlowLayout flowLayout = (FlowLayout) panel_5.getLayout(); flowLayout.setVgap(2); flowLayout.setHgap(2); GridBagConstraints gbc_panel_5 = new GridBagConstraints(); gbc_panel_5.insets = new Insets(0, 0, 5, 0); gbc_panel_5.fill = GridBagConstraints.BOTH; gbc_panel_5.gridx = 0; gbc_panel_5.gridy = 0; panel_2.add(panel_5, gbc_panel_5); basePathTextField = new JTextField(); basePathTextField.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) { File temp = new File(basePathTextField.getText()); if (temp.exists()) { repo.setBaseSourcePath(basePathTextField.getText()); _mainFrame.setTitle("LogDruid - " + _mainFrame.configFile + " - " + basePathTextField.getText()); // _mainFrame.setTitle("LogDruid - " + // _mainFrame.currentRepositoryFile + " - " + // basePathTextField.getText()); } } }); GridBagConstraints gbc_textField = new GridBagConstraints(); gbc_textField.insets = new Insets(0, 0, 5, 0); gbc_textField.fill = GridBagConstraints.HORIZONTAL; gbc_textField.gridx = 0; gbc_textField.gridy = 1; panel_2.add(basePathTextField, gbc_textField); basePathTextField.setColumns(60); basePathTextField.setText(repo.getBaseSourcePath()); JPanel panel_4 = new JPanel(); FlowLayout flowLayout_1 = (FlowLayout) panel_4.getLayout(); flowLayout_1.setHgap(2); flowLayout_1.setVgap(2); GridBagConstraints gbc_panel_4 = new GridBagConstraints(); gbc_panel_4.insets = new Insets(0, 0, 5, 0); gbc_panel_4.fill = GridBagConstraints.BOTH; gbc_panel_4.gridx = 0; gbc_panel_4.gridy = 2; panel_2.add(panel_4, gbc_panel_4); JPanel panel_3 = new JPanel(); FlowLayout flowLayout_2 = (FlowLayout) panel_3.getLayout(); flowLayout_2.setVgap(10); descriptionPanel.add(panel_3, BorderLayout.WEST); JLabel lblBasePath = new JLabel("Logs folder:"); panel_3.add(lblBasePath); btnFolder.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { FileChooserDialog fileChooserDialog; File temp = new File(basePathTextField.getText()); if (temp.exists()) { fileChooserDialog = new FileChooserDialog(temp); } else { fileChooserDialog = new FileChooserDialog(); } if ((fileChooserDialog != null) && (fileChooserDialog.isValidate())) { for (File file : fileChooserDialog.getSelectedFiles()) { repository.setBaseSourcePath(file.getAbsolutePath()); basePathTextField.setText(file.getAbsolutePath()); repo.setBaseSourcePath(file.getAbsolutePath()); _mainFrame.setTitle("LogDruid - " + _mainFrame.configFile + " - " + basePathTextField.getText()); } } } }); JPanel tablePanel = new JPanel(); GridBagConstraints gbc_tablePanel = new GridBagConstraints(); gbc_tablePanel.fill = GridBagConstraints.BOTH; gbc_tablePanel.gridx = 0; gbc_tablePanel.gridy = 1; add(tablePanel, gbc_tablePanel); tablePanel.setLayout(new BorderLayout(0, 0)); JSplitPane splitPane = new JSplitPane(); splitPane.setOneTouchExpandable(true); splitPane.setOrientation(JSplitPane.VERTICAL_SPLIT); tablePanel.add(splitPane, BorderLayout.CENTER); JPanel fileMatchPanel = new JPanel(); splitPane.setRightComponent(fileMatchPanel); fileMatchPanel.setLayout(new BorderLayout(0, 0)); JPanel panel_1 = new JPanel(); fileMatchPanel.add(panel_1, BorderLayout.CENTER); panel_1.setLayout(new BorderLayout(0, 0)); txtpnTest = new JTextPane(); JScrollPane scrollPane = new JScrollPane(txtpnTest); panel_1.add(scrollPane); JPanel panel_6 = new JPanel(); panel_6.setMinimumSize(new Dimension(0, 200)); panel_6.setPreferredSize(new Dimension(0, 300)); splitPane.setLeftComponent(panel_6); panel_6.setLayout(new BorderLayout(0, 0)); JPanel buttonsPanel = new JPanel(); panel_6.add(buttonsPanel, BorderLayout.SOUTH); JButton btnNew = new JButton("New"); buttonsPanel.add(btnNew); JButton btnDelete = new JButton("Delete"); btnDelete.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { int selectedRow = ((table.getSelectedRow() != -1) ? table.convertRowIndexToModel(table.getSelectedRow()) : -1); repository.deleteSource(((table.getSelectedRow() != -1) ? table.convertRowIndexToModel(table.getSelectedRow()) : -1)); // reloadTable(); if (selectedRow == table.getRowCount()) { table.setRowSelectionInterval(selectedRow - 1, selectedRow - 1); } else if (selectedRow > 0) { table.setRowSelectionInterval(selectedRow, selectedRow); } else { table.setRowSelectionInterval(0, 0); } mainFrame.updateTreeSources(repository.getSources()); refreshList(); logger.info("selectedRow: " + selectedRow + " row count: " + table.getRowCount()); } }); buttonsPanel.add(btnDelete); JSeparator separator = new JSeparator(); separator.setOrientation(SwingConstants.VERTICAL); buttonsPanel.add(separator); JButton btnRefresh = new JButton("Refresh"); btnRefresh.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { int selectedRow = ((table.getSelectedRow() != -1) ? table.convertRowIndexToModel(table.getSelectedRow()) : -1); // updateSources(); // reloadTable(); if (selectedRow > 0) { table.setRowSelectionInterval(selectedRow, selectedRow); } mainFrame.updateTreeSources(repository.getSources()); refreshList(); // model.fireTableDataChanged(); } }); chckbxSubfolders = new JCheckBox("sub-folders"); chckbxSubfolders.setFont(new Font("Dialog", Font.BOLD, 11)); chckbxSubfolders.setSelected(repo.isRecursiveMode()); chckbxSubfolders.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { repo.setRecursiveMode(chckbxSubfolders.isSelected()); } }); buttonsPanel.add(chckbxSubfolders); chckbxOnlyMatches = new JCheckBox("only matches"); chckbxOnlyMatches.setFont(new Font("Dialog", Font.BOLD, 11)); chckbxOnlyMatches.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { repo.setOnlyMatches(chckbxOnlyMatches.isSelected()); } }); buttonsPanel.add(chckbxOnlyMatches); chckbxOnlyMatches.setSelected(repo.isOnlyMatches()); btnRefresh.setForeground(Color.BLUE); buttonsPanel.add(btnRefresh); JSeparator separator_1 = new JSeparator(); separator_1.setOrientation(SwingConstants.VERTICAL); buttonsPanel.add(separator_1); JButton btnCheck = new JButton("Get samplings"); btnCheck.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { DataMiner.populateRecordingSamples(repo); } }); buttonsPanel.add(btnCheck); // scrollPane.add(txtpnTest); btnNew.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { int rowCount = table.getRowCount(); if (rowCount==-1){rowCount=0;} //int selectedRow = ((table.getSelectedRow() != -1) ? table.convertRowIndexToModel(table.getSelectedRow()) : -1); logger.info(repository); logger.info(rowCount); model.addRow(new Object[] { "default", ".*", "none", Boolean.TRUE, 0, 0 }); model.fireTableDataChanged();//(rowCount, rowCount); table.setRowSelectionInterval(rowCount, rowCount); // table.repaint(); // reloadTable(); /* if (selectedRow >= 0) { table.setRowSelectionInterval(selectedRow, selectedRow); } else { table.setRowSelectionInterval(0, 0); }*/ // table.repaint(); refreshList(); mainFrame.updateTreeSources(repository.getSources()); } }); table = new JTable(model); initColumnSizes(table); // setUpProcessingColumn(table,table.getColumnModel().getColumn(2)); //table.setAutoCreateRowSorter(true); JScrollPane scrollPane_1 = new JScrollPane(table); panel_6.add(scrollPane_1); // tablePanel.add(table, BorderLayout.CENTER); table.getModel().addTableModelListener(new TableModelListener() { public void tableChanged(TableModelEvent e) { // if (!e.getValueIsAdjusting()){ // model.fireTableDataChanged(); // int selectedRow = ((table.getSelectedRow() != -1) ? table.convertRowIndexToModel(table.getSelectedRow()) : -1); // updateSources(); mainFrame.updateTreeSources(repository.getSources()); // reloadTable(); // table.setRowSelectionInterval(selectedRow, selectedRow); refreshList(); // } } }); table.getSelectionModel().addListSelectionListener(new ListSelectionListener() { public void valueChanged(ListSelectionEvent e) { if (!e.getValueIsAdjusting()) { // model.fireTableDataChanged(); // int selectedRow = ((table.getSelectedRow() != -1) ? table.convertRowIndexToModel(table.getSelectedRow()) : -1); // updateSources(); mainFrame.updateTreeSources(repository.getSources()); // reloadTable(); // table.setRowSelectionInterval(selectedRow, selectedRow); refreshList(); } } }); table.addMouseListener(new MouseAdapter() { public void mousePressed(MouseEvent me) { if (table.getSelectedRow()!=-1){ int x = me.getX(); int y = me.getY(); int row = table.rowAtPoint(new Point(x,y)); int col = table.columnAtPoint(new Point(x,y)); if (col == 2) { DateSelector ds = new DateSelector(repository); ds.setVisible(true); if (ds.isValidate() && (ds.getDateFormat()!=null)){ model.setValueAt(ds.getDateFormat(), table.getSelectedRow(), 2); model.fireTableCellUpdated(table.getSelectedRow(), 2); repository.getSource(row).setDateFormat((DateFormat)ds.getDateFormat()); logger.debug("updated with " + ds.getDateFormat().getName() ); } }} } }); reloadTable(); if (table.getRowCount() > 0) { table.setRowSelectionInterval(0, 0); } refreshList(); /* if (model.getRowCount()>0){ table.getRowSorter().toggleSortOrder(2); table.getRowSorter().toggleSortOrder(0); }*/ } public void refreshList() { // ((table.getSelectedRow()!=-1)?table.convertRowIndexToModel(table.getSelectedRow()):-1) // persist repository // display selected row PatternCache patternCache = new PatternCache(); Matcher matcher; List<File> listOfFiles = null; srcFileSummary = new HashMap<Source, long[]>(); sourceArrayList = repository.getSources(); if (((table.getSelectedRow() != -1) ? table.convertRowIndexToModel(table.getSelectedRow()) : -1) >= 0 && repository.getBaseSourcePath() != null) { /* * recEditor = new RecordingEditor(repository * .getRecordings().get((( * table.getSelectedRow()!=-1)?table.convertRowIndexToModel * (table.getSelectedRow()):-1)), repository); * jPanelDetail.removeAll(); */ // jPanelDetail.add(recEditor, gbc_jPanelDetail); File folder = new File(repository.getBaseSourcePath()); try { if (!folder.exists()) { if (logger.isEnabledFor(Level.INFO)) logger.info("base path did, not exist defaulting to current: " + System.getProperty("user.dir")); folder = new File(System.getProperty("user.dir")); repository.setBaseSourcePath(System.getProperty("user.dir")); basePathTextField.setText(System.getProperty("user.dir")); repository.setRecursiveMode(false); chckbxSubfolders.setSelected(false); } if (repository.isRecursiveMode()) { long estimatedTime = 0; long startTime = System.currentTimeMillis(); listOfFiles = FileListing.getFileListing(folder); estimatedTime = System.currentTimeMillis() - startTime; logger.debug("gathering time: " + estimatedTime); } else { listOfFiles = Arrays.asList(folder.listFiles()); } // File[] listOfFiles = folder.listFiles(); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } int[][] fileListMatches = new int[listOfFiles.size()][3]; doc = txtpnTest.getDocument(); try { doc.remove(0, doc.getLength()); } catch (BadLocationException e2) { // TODO Auto-generated catch block e2.printStackTrace(); } int count = 0; for (int i = 0; i < listOfFiles.size(); i++) { fileListMatches[i][0] = 0; if (listOfFiles.get(i).isFile()) { if (logger.isDebugEnabled()) logger.debug("source File " + listOfFiles.get(i).getName()); if (sourceArrayList != null) { Iterator<Source> it = sourceArrayList.iterator(); count = 0; while (it.hasNext()) { Source src = (Source) it.next(); String s1 = (src).getSourcePattern(); matcher = patternCache.getPattern(s1,true).matcher(FileListing.getPath(repository, listOfFiles.get(i))); if (logger.isDebugEnabled()) logger.debug("matching with pattern: " + s1); if (logger.isDebugEnabled()) logger.debug("matching file: " + FileListing.getPath(repository, listOfFiles.get(i))); if (matcher.find()) { if (logger.isDebugEnabled()) logger.debug("match" + FileListing.getPath(repository, listOfFiles.get(i))); if (count == ((table.getSelectedRow() != -1) ? table.convertRowIndexToModel(table.getSelectedRow()) : -1)) { if (src.getActive()) { fileListMatches[i][0] = 1; } else { fileListMatches[i][0] = 3; } fileListMatches[i][1] = matcher.start(); fileListMatches[i][2] = matcher.end(); if (logger.isDebugEnabled()) logger.debug("matched file" + FileListing.getPath(repository, listOfFiles.get(i))); } else if (fileListMatches[i][0] == 0) { if (logger.isDebugEnabled()) logger.debug("Already matched file" + FileListing.getPath(repository, listOfFiles.get(i))); if (src.getActive()) { fileListMatches[i][0] = 2; } else { fileListMatches[i][0] = 3; } } if (!srcFileSummary.containsKey(src)) { srcFileSummary.put(src, new long[] { 0, 0 }); } long[] intTable = srcFileSummary.get(src); intTable[0] = intTable[0] + 1; intTable[1] = intTable[1] + listOfFiles.get(i).length(); srcFileSummary.put(src, intTable); fileListMatches[i][1] = matcher.start(); fileListMatches[i][2] = matcher.end(); } else { // fileListMatches[i][0]=0; if (logger.isDebugEnabled()) logger.debug("not matched file" + FileListing.getPath(repository, listOfFiles.get(i))); } count++; } } } } try { // txtpnTest.setText( "original text" ); for (int i = 0; i < fileListMatches.length; i++) { int currIndex = doc.getLength(); // String relative = new // File(repository.getBaseSourcePath()).toURI().relativize(new // File(listOfFiles.get(i).getCanonicalPath()+listOfFiles.get(i).getName()).toURI()).getPath(); // logger.info("match added"); Highlighter h = txtpnTest.getHighlighter(); if (fileListMatches[i][0] == 1) { String fileName = FileListing.getPath(repository, listOfFiles.get(i)); doc.insertString(doc.getLength(), fileName + "\n", null); txtpnTest.setCaretPosition(0); h.addHighlight(currIndex + fileListMatches[i][1], currIndex + fileListMatches[i][2], new DefaultHighlighter.DefaultHighlightPainter( Color.ORANGE)); if (logger.isDebugEnabled()) logger.debug("matched - l: " + i + "file" + FileListing.getPath(repository, listOfFiles.get(i)) + " currIndex : " + currIndex + ", match start: " + fileListMatches[i][1] + ", match end: " + fileListMatches[i][2]); } else if (fileListMatches[i][0] == 2) { String fileName = FileListing.getPath(repository, listOfFiles.get(i)); doc.insertString(doc.getLength(), fileName + "\n", null); txtpnTest.setCaretPosition(0); h.addHighlight(currIndex + fileListMatches[i][1], currIndex + fileListMatches[i][2], DefaultHighlighter.DefaultPainter); if (logger.isDebugEnabled()) logger.debug("ALREADY matched - l: " + i + "file" + listOfFiles.get(i).getName() + " currIndex : " + currIndex + ", match start: " + fileListMatches[i][1] + ", match end: " + fileListMatches[i][2]); } else if (fileListMatches[i][0] == 3) { String fileName = FileListing.getPath(repository, listOfFiles.get(i)); doc.insertString(doc.getLength(), fileName + "\n", null); txtpnTest.setCaretPosition(0); h.addHighlight(currIndex + fileListMatches[i][1], currIndex + fileListMatches[i][2], new DefaultHighlighter.DefaultHighlightPainter( Color.lightGray)); if (logger.isDebugEnabled()) logger.debug("ALREADY matched - l: " + i + "file" + listOfFiles.get(i).getName() + " currIndex : " + currIndex + ", match start: " + fileListMatches[i][1] + ", match end: " + fileListMatches[i][2]); } else if (!repository.isOnlyMatches()) { String fileName = FileListing.getPath(repository, listOfFiles.get(i)); doc.insertString(doc.getLength(), fileName + "\n", null); txtpnTest.setCaretPosition(0); } } // txtpnTest.setText( "original text" ); } catch (BadLocationException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } } sourceArrayList = repository.getSources(); if (sourceArrayList != null) { Iterator<Source> it = sourceArrayList.iterator(); int count = 0; data.clear(); // this.repaint(); while (it.hasNext()) { Source record = (Source) it.next(); logger.debug("reloadTable - record reloaded : " + count + ", " + record + ", " + record.getSourcePattern() + ", " + record.getActive() + " srcFileSummary.get(record): " + srcFileSummary.get(record)); data.add(new Object[] { record.getSourceName(), record.getSourcePattern(), record.getDateFormat(),record.getActive(), srcFileSummary.get(record) != null ? srcFileSummary.get(record)[0] : 0, srcFileSummary.get(record) != null ? ((float) srcFileSummary.get(record)[1]) / 1024000 : 0 }); } table.revalidate(); table.repaint(); } } /* public void updateSources() { // "name", "regexp", "active" Iterator it = data.iterator(); Object[] obj; int count = 0; while (it.hasNext()) { obj = (Object[]) it.next(); String stName = (String) obj[0]; String stregexp = (String) obj[1]; Boolean stActive = (Boolean) obj[2]; // logger.info("stType: " +stType); // logger.info("getTypeString(stType) -: " // +Miner.getTypeString(stType) ); // patternString += stBefore + "(" + Miner.getTypeString(stType) + // ")"+stAfter; Source source = repository.getSource(count); source.setSourceName(stName); source.setSourcePattern(stregexp); source.setActive(stActive); // repository.updateSource(count,stName,stregexp, stActive); logger.info("updateSources - Source updated : " + stName + ",regexp: " + stregexp); count++; } }*/ public void reloadTable() { // int selectedRow = ((table.getSelectedRow() != -1) ? // table.convertRowIndexToModel(table.getSelectedRow()) : -1); sourceArrayList = repository.getSources(); // Collections.sort(records); if (sourceArrayList != null) { Iterator<Source> it = sourceArrayList.iterator(); int count = 0; data.clear(); // this.repaint(); while (it.hasNext()) { Source record = (Source) it.next(); data.add(new Object[] { record.getSourceName(), record.getSourcePattern(), record.getActive(), 0, 0 }); logger.debug("reloadTable - record reloaded : " + count + ", " + record + ", " + record.getSourcePattern() + ", " + record.getActive()); } table.revalidate(); } } private void initColumnSizes(JTable theTable) { // MyTableModel2 model = (MyTableModel2) theTable.getModel(); TableColumn column = null; Component comp = null; int headerWidth = 0; int cellWidth = 0; TableCellRenderer headerRenderer = theTable.getTableHeader().getDefaultRenderer(); for (int i = 0; i < 6; i++) { column = theTable.getColumnModel().getColumn(i); comp = headerRenderer.getTableCellRendererComponent(null, column.getHeaderValue(), false, false, 0, 0); if (i < 3) { headerWidth = comp.getPreferredSize().width; cellWidth = comp.getPreferredSize().width; column.setPreferredWidth(400); } else { cellWidth = 140; column.setMaxWidth(cellWidth * 4); column.setPreferredWidth(cellWidth); } } } class DateFormatRenderer extends JLabel implements TableCellRenderer { Border unselectedBorder = null; Border selectedBorder = null; boolean isBordered = true; public DateFormatRenderer(boolean isBordered) { this.isBordered = isBordered; setOpaque(true); // MUST do this for background to show up. } public Component getTableCellRendererComponent(JTable table, Object color, boolean isSelected, boolean hasFocus, int row, int column) { Color newColor = (Color) color; setBackground(newColor); if (isBordered) { if (isSelected) { if (selectedBorder == null) { selectedBorder = BorderFactory.createMatteBorder(2, 5, 2, 5, table.getSelectionBackground()); } setBorder(selectedBorder); } else { if (unselectedBorder == null) { unselectedBorder = BorderFactory.createMatteBorder(2, 5, 2, 5, table.getBackground()); } setBorder(unselectedBorder); } } setToolTipText("RGB value: " + newColor.getRed() + ", " + newColor.getGreen() + ", " + newColor.getBlue()); return this; } } /* public void setUpProcessingColumn(JTable theTable, TableColumn typeColumn) { JTextField textField= new JTextField(); typeColumn.setCellEditor(new DefaultCellEditor(textField)); DefaultTableCellRenderer renderer = new DefaultTableCellRenderer(); renderer.setToolTipText("Click"); typeColumn.setCellRenderer(renderer); textField.addMouseListener(new java.awt.event.MouseAdapter(){ public void mouseClicked(java.awt.event.MouseEvent e){ // JTextField combo = (JTextField) e.getSource(); // Object selected = combo.get(); if (table.getSelectedRow()!=-1){ DateSelector ds = new DateSelector(repository); if (ds.getDateFormat()!=null) model.setValueAt(ds.getDateFormat(), table.getSelectedRow(), 4); model.fireTableCellUpdated(table.getSelectedRow(), 4); } } } ); } */ class MyTableModel2 extends AbstractTableModel { private String[] header; private ArrayList<Object[]> data; public MyTableModel2(ArrayList<Object[]> data, String[] header) { this.header = header; this.data = data; } @Override public int getColumnCount() { if (header == null) { return 0; } else return header.length; } @Override public String getColumnName(int column) { return header[column]; } @Override public int getRowCount() { return data.size(); } public void addRow(Object[] obj) { Source s = new Source("default", ".*", null, Boolean.TRUE); repository.addSource(s); data.add(obj); } public void updateRow(int rowId, Object[] obj) { data.set(rowId, obj); } @Override public Object getValueAt(int row, int column) { //return data.get(row)[column]; if (column == 0 ) { return repository.getSource(row).getSourceName(); } else if (column == 1 ) { return repository.getSource(row).getSourcePattern(); } else if (column == 2 ) { if ( repository.getSource(row).getDateFormat()!=null) return ((String) repository.getSource(row).getDateFormat().getName() + " | "+ repository.getSource(row).getDateFormat().getDateFormat() ); else { return "none"; } } else if (column == 3 ) { return repository.getSource(row).getActive(); } else if (column >= 4 ) { return data.get(row)[column]; } else return 0; } @Override public void setValueAt(Object value, int row, int column) { if (column == 0 ) { repository.getSource(row).setSourceName((String) value); fireTableCellUpdated(row, column); } else if (column == 1 ) { repository.getSource(row).setSourcePattern((String) value); fireTableCellUpdated(row, column); } else if (column == 2 ) { repository.getSource(row).setDateFormat((DateFormat)value); logger.info("set "+((DateFormat)value).getPattern()); fireTableCellUpdated(row, column); } else if (column == 3 ) { repository.getSource(row).setActive((Boolean)value); fireTableCellUpdated(row, column); } else { ((Object[]) data.get(row))[column] = value; fireTableCellUpdated(row, column); } } /* * JTable uses this method to determine the default renderer/ editor for * each cell. If we didn't implement this method, then the last column * would contain text ("true"/"false"), rather than a check box. */ public Class getColumnClass(int c) { if (c==2){ return String.class; } else { return getValueAt(0, c).getClass(); } } /* * Don't need to implement this method unless your table's editable. */ public boolean isCellEditable(int row, int col) { // Note that the data/cell address is constant, // no matt&er where the cell appears onscreen. if (col<4){ return true; } else return false; } } public void Remove() { data.remove(((table.getSelectedRow() != -1) ? table.convertRowIndexToModel(table.getSelectedRow()) : -1)); repository.deleteRecording(((table.getSelectedRow() != -1) ? table.convertRowIndexToModel(table.getSelectedRow()) : -1)); table.repaint(); } }