I've been working on the tab pane UI - which isn't released because it needs cleaned up and it includes the column sorting code provided by Claude Duguay and I haven't been told the T's have been crossed and the I's dotted.
I wanted to let the group know what I've been doing and get some feedback on the choices I've made, specifically the filtering, since that's primarily what I've been working on. I started by modifying Chainsaw and ended up rewriting things from the ground up with my own UI. The colorizing and display filtering was easier to create from the ground up than add, at least that's how I felt at the time. I didn't reinvent the wheel, I used some existing Chainsaw code, but not much. Chainsaw takes up a good amount of space with the filtering panel and I've moved that functionality primarily to a popup. I'm not sure if Chainsaw devotees would be upset with the choices I've made so I'm not sure if this UI should be a patch to Chainsaw or a new UI. I obviously want contribute something useful so I'm happy to provide this code as a patch to Chainsaw if that's what people would like. If people don't want these changes to become 'Chainsaw', I'm just as happy calling it something else. I know Paul Smith has mentioned he's looking at an MDI interface, so maybe there's some way we could make the new UI support both. I'd like as much feedback as people are willing to provide. If people aren't interested in this becoming a log4j contribution, I suppose I'd just keep it for my personal work, since that's primarily why I started down this road. Here's what I does. * Logging events are added to a table on a tab pane which is identified by the combination of an app name and the source machine name or IP. If neither are provided, there will still be a unique match on two empty strings and all entries will go to that tab pane. The features described below are applied to each tab pane separately: * Sort on any column ascending or descending * Pause/unpause event reception * Define an overriding display filter (display filters are described below) * Find/find next These features are available via a context popup menu: * Show/hide tool tips per logging event * Clear entries * Select displayed columns * Select tool tip columns * Define color filters * Apply a color filter (a submenu containing radio buttons for the column names appears) * Clear color filters * Define display filters * Apply a display filter (a submenu containing radio buttons for the column names appears) * Clear display filters Choosing the 'select displayed columns' or 'select tooltip columns' pops up a window with a checkbox for each available column. If the checkbox is selected, the column is added in the tooltip or display. (The tooltip is multi-line, html-based). All columns are displayed and are added to the tooltip by default. Here's how the color filtering works. When 'Define color filters' is selected, a popup appears. On the left are a series of radio buttons which map to a number of the columns in the table. (see below) To the right of the radio buttons is a list which is populated with the unique entries for that column. For example, if Thread is the selected radio button, all of the unique entries in table's Thread column would appear. To the right of the list is the color chooser UI (Swatches/HSB/RGB). If an entry in the list is selected, and then a color is selected, the entry's background color changes to the selected color. All color selections are remembered, so if you re-open this popup, the color choices you've made for each column reappear as you previously colorized them. If the column you are changing is the active color filter, the table's colors change in real-time to match the colors you're selecting. The 'Apply' button makes the currently selected radio button column the color filter for the pane. COLOR FILTER POPUP O Class Category1 Color chooser UI O Method Category2 O NDC Category3 O MDC Category4 X Category O Thread O Level O File [Apply] Here's how the display filtering works. When 'Define display filters' is selected, a popup appears. Similar to the color filter, the column list appears on the left as radio buttons. As radio buttons are selected, the entries in the list change to the unique contents of the selected column. DISPLAY FILTER POPUP O Class Category1 Active Display Levels Global display levels O Method Category2 [ ] FATAL [ ] FATAL O NDC Category3 [ ] ERROR [ ] ERROR O MDC Category4 [ ] DEBUG [ ] DEBUG X Category [ ] INFO [ ] INFO O Thread [ ] WARN [ ] WARN O Level O File [Apply] To the right of the list is a group of checkboxes which display each available level. Similar to the color filter, as an entry in the list is selected, the active display levels get checked. To add a display level, check the box. Global display levels affect all entries for the column. Selecting the global 'ERROR' checkbox with Category selected as the active column will make all entries in the Category list (Category 1-4 in the above-example) will have the 'ERROR' level filter added. Conversely, unchecking a global level that is checked will remove the 'ERROR' level filter from all entries in the Category list. If no display filters exist for the selected column, all entries are shown. If the active display filter is the column you're modifying, the underlying data changes in real-time. Selecting apply makes the currently selected column the active display filter. The only issue is I don't have a good way to show that some entries in the list have a level active and some don't (the global list will display that as unchecked). If someone has a good idea here, let me know. As I mentioned above, I also added an overriding display filter. A drop down column list is and a text field for entering the field exists above the table in the tab pane. If a value is in the text field, that value is matched for the selected column and matching entries are displayed in the table. Existing display filters are ignored. If the text field is empty, existing display filters are applied. While the filters work using the regexp package (which could be oro, I just haven't looked in to it), the find is an exact-match (indexOf string comparison). Find scrolls the view to the found row. There's more to add but I wanted to get some feedback on the utility of the filters I've described above. --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]