| /* |
| * Licensed to the Apache Software Foundation (ASF) under one or more |
| * contributor license agreements. See the NOTICE file distributed with |
| * this work for additional information regarding copyright ownership. |
| * The ASF licenses this file to You under the Apache License, Version 2.0 |
| * (the "License"); you may not use this file except in compliance with |
| * the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| */ |
| package org.apache.log4j.chainsaw; |
| |
| import java.beans.PropertyChangeListener; |
| import java.beans.PropertyChangeSupport; |
| import java.io.Serializable; |
| import java.util.ArrayList; |
| import java.util.Collection; |
| import java.util.Collections; |
| import java.util.HashSet; |
| import java.util.List; |
| import java.util.Map; |
| import java.util.Properties; |
| |
| import javax.swing.table.TableColumn; |
| |
| import org.apache.log4j.chainsaw.prefs.SettingsManager; |
| import org.apache.log4j.helpers.Constants; |
| |
| |
| /** |
| * Used to encapsulate all the preferences for a given LogPanel |
| * @author Paul Smith |
| */ |
| public class LogPanelPreferenceModel implements Serializable{ |
| public static final String ISO8601 = "ISO8601"; |
| public static final Collection DATE_FORMATS; |
| |
| private static final long serialVersionUID = 7526472295622776147L; |
| static { |
| Collection list = new ArrayList(); |
| |
| Properties properties = SettingsManager.getInstance().getDefaultSettings(); |
| |
| for (Map.Entry<Object, Object> objectObjectEntry : properties.entrySet()) { |
| Map.Entry entry = objectObjectEntry; |
| |
| if (entry.getKey().toString().startsWith("DateFormat")) { |
| list.add(entry.getValue()); |
| } |
| } |
| |
| DATE_FORMATS = Collections.unmodifiableCollection(list); |
| } |
| |
| private transient final PropertyChangeSupport propertySupport = |
| new PropertyChangeSupport(this); |
| private String dateFormatPattern = Constants.SIMPLE_TIME_PATTERN; |
| private boolean levelIcons; |
| private List allColumns = new ArrayList(); |
| private List visibleColumns = new ArrayList(); |
| private List visibleColumnOrder = new ArrayList(); |
| //set to true to match default 'detailPaneVisible' setting |
| private boolean detailPaneVisible = true; |
| private boolean toolTips; |
| //default thumbnail bar tooltips to true |
| private boolean thumbnailBarToolTips = true; |
| private boolean scrollToBottom; |
| private boolean logTreePanelVisible; |
| private String loggerPrecision = ""; |
| |
| private Collection hiddenLoggers = new HashSet(); |
| private String timeZone; |
| //default wrapMsg to true |
| private boolean wrapMsg = true; |
| private boolean highlightSearchMatchText; |
| private String hiddenExpression; |
| private String alwaysDisplayExpression; |
| private String clearTableExpression; |
| //default to cyclic mode off |
| private boolean cyclic = false; |
| private boolean showMillisDeltaAsGap; |
| //default search results to visible |
| private boolean searchResultsVisible = true; |
| |
| /** |
| * Returns an <b>unmodifiable</b> list of the columns. |
| * |
| * The reason it is unmodifiable is to enforce the requirement that |
| * the List is actually unique columns. IT _could_ be a set, |
| * but we need to maintain the order of insertion. |
| * |
| * @return |
| */ |
| public List getColumns() { |
| return Collections.unmodifiableList(allColumns); |
| } |
| |
| public void setCyclic(boolean cyclic) { |
| this.cyclic = cyclic; |
| } |
| |
| public boolean isCyclic() { |
| return cyclic; |
| } |
| |
| /** |
| * Returns an <b>unmodifiable</b> list of the visible columns. |
| * |
| * The reason it is unmodifiable is to enforce the requirement that |
| * the List is actually unique columns. IT _could_ be a set, |
| * but we need to maintain the order of insertion. |
| * |
| * @return |
| */ |
| public List getVisibleColumns() { |
| return Collections.unmodifiableList(visibleColumns); |
| } |
| |
| public void clearColumns(){ |
| Object oldValue = this.allColumns; |
| allColumns = new ArrayList(); |
| propertySupport.firePropertyChange("columns", oldValue, allColumns); |
| } |
| |
| private TableColumn findColumnByHeader(List list, String header) { |
| for (Object aList : list) { |
| TableColumn c = (TableColumn) aList; |
| //columns may have changed - header may not exist |
| if (c != null && c.getHeaderValue() != null && c.getHeaderValue().equals(header)) { |
| return c; |
| } |
| } |
| return null; |
| } |
| |
| public void setVisibleColumnOrder(List visibleColumnOrder) { |
| this.visibleColumnOrder = visibleColumnOrder; |
| } |
| |
| public List getVisibleColumnOrder() { |
| return visibleColumnOrder; |
| } |
| |
| public boolean addColumn(TableColumn column){ |
| if (findColumnByHeader(allColumns, column.getHeaderValue().toString()) != null) { |
| return false; |
| } |
| |
| Object oldValue = allColumns; |
| allColumns = new ArrayList(allColumns); |
| allColumns.add(column); |
| |
| propertySupport.firePropertyChange("columns", oldValue, allColumns); |
| return true; |
| } |
| |
| private void setColumns(List columns) { |
| Object oldValue = allColumns; |
| allColumns = new ArrayList(columns); |
| propertySupport.firePropertyChange("columns", oldValue, columns); |
| } |
| |
| /** |
| * Returns the Date Pattern string for the alternate date formatter. |
| * @return date pattern |
| */ |
| public final String getDateFormatPattern() { |
| return dateFormatPattern; |
| } |
| |
| public final void setDefaultDatePatternFormat() { |
| String oldVal = this.dateFormatPattern; |
| this.dateFormatPattern = Constants.SIMPLE_TIME_PATTERN; |
| propertySupport.firePropertyChange( |
| "dateFormatPattern", oldVal, this.dateFormatPattern); |
| } |
| /** |
| * @param dateFormatPattern |
| */ |
| public final void setDateFormatPattern(String dateFormatPattern) { |
| String oldVal = this.dateFormatPattern; |
| this.dateFormatPattern = dateFormatPattern; |
| propertySupport.firePropertyChange( |
| "dateFormatPattern", oldVal, this.dateFormatPattern); |
| } |
| |
| /** |
| * @param listener |
| */ |
| public synchronized void addPropertyChangeListener( |
| PropertyChangeListener listener) { |
| propertySupport.addPropertyChangeListener(listener); |
| } |
| |
| /** |
| * @param propertyName |
| * @param listener |
| */ |
| public synchronized void addPropertyChangeListener( |
| String propertyName, PropertyChangeListener listener) { |
| propertySupport.addPropertyChangeListener(propertyName, listener); |
| } |
| |
| /** |
| * @param listener |
| */ |
| public synchronized void removePropertyChangeListener( |
| PropertyChangeListener listener) { |
| propertySupport.removePropertyChangeListener(listener); |
| } |
| |
| /** |
| * @param propertyName |
| * @param listener |
| */ |
| public synchronized void removePropertyChangeListener( |
| String propertyName, PropertyChangeListener listener) { |
| propertySupport.removePropertyChangeListener(propertyName, listener); |
| } |
| |
| /** |
| * Applies all the properties of another model to this model |
| * |
| * @param model the model to copy |
| * all the properties from |
| */ |
| public void apply(LogPanelPreferenceModel model) { |
| setCyclic(model.isCyclic()); |
| setLoggerPrecision(model.getLoggerPrecision()); |
| setDateFormatPattern(model.getDateFormatPattern()); |
| setLevelIcons(model.isLevelIcons()); |
| setWrapMessage(model.isWrapMessage()); |
| setHighlightSearchMatchText(model.isHighlightSearchMatchText()); |
| setTimeZone(model.getTimeZone()); |
| setToolTips(model.isToolTips()); |
| setThumbnailBarToolTips((model.isThumbnailBarToolTips())); |
| setScrollToBottom(model.isScrollToBottom()); |
| setDetailPaneVisible(model.isDetailPaneVisible()); |
| setLogTreePanelVisible(model.isLogTreePanelVisible()); |
| setVisibleColumnOrder(model.getVisibleColumnOrder()); |
| setSearchResultsVisible(model.isSearchResultsVisible()); |
| // we have to copy the list, because getColumns() is unmodifiable |
| setColumns(model.getColumns()); |
| |
| setVisibleColumns(model.getVisibleColumns()); |
| setHiddenLoggers(model.getHiddenLoggers()); |
| setHiddenExpression(model.getHiddenExpression()); |
| setAlwaysDisplayExpression(model.getAlwaysDisplayExpression()); |
| setShowMillisDeltaAsGap(model.isShowMillisDeltaAsGap()); |
| setClearTableExpression(model.getClearTableExpression()); |
| } |
| |
| /** |
| * Returns true if this the fast ISO8601DateFormat object |
| * should be used instead of SimpleDateFormat |
| * @return use ISO8601 format flag |
| */ |
| public boolean isUseISO8601Format() { |
| return getDateFormatPattern().equals(ISO8601); |
| } |
| |
| /** |
| * @return level icons flag |
| */ |
| public boolean isLevelIcons() { |
| return levelIcons; |
| } |
| |
| public boolean isWrapMessage() { |
| return wrapMsg; |
| } |
| |
| public boolean isHighlightSearchMatchText() { |
| return highlightSearchMatchText; |
| } |
| |
| /** |
| * @param levelIcons |
| */ |
| public void setLevelIcons(boolean levelIcons) { |
| this.levelIcons = levelIcons; |
| propertySupport.firePropertyChange("levelIcons", !levelIcons, levelIcons); |
| } |
| |
| public void setSearchResultsVisible(boolean searchResultsVisible) { |
| boolean oldValue = this.searchResultsVisible; |
| this.searchResultsVisible = searchResultsVisible; |
| propertySupport.firePropertyChange("searchResultsVisible", oldValue, searchResultsVisible); |
| } |
| |
| public boolean isSearchResultsVisible() { |
| return searchResultsVisible; |
| } |
| |
| /** |
| * @param wrapMsg |
| */ |
| public void setWrapMessage(boolean wrapMsg) { |
| this.wrapMsg = wrapMsg; |
| propertySupport.firePropertyChange("wrapMessage", !wrapMsg, wrapMsg); |
| } |
| |
| /** |
| * @param highlightSearchMatchText |
| */ |
| public void setHighlightSearchMatchText(boolean highlightSearchMatchText) { |
| this.highlightSearchMatchText = highlightSearchMatchText; |
| propertySupport.firePropertyChange("highlightSearchMatchText", !highlightSearchMatchText, highlightSearchMatchText); |
| } |
| |
| /** |
| * @param loggerPrecision - an integer representing the number of packages to display, |
| * or an empty string representing 'display all packages' |
| */ |
| public void setLoggerPrecision(String loggerPrecision) { |
| String oldVal = this.loggerPrecision; |
| this.loggerPrecision = loggerPrecision; |
| propertySupport.firePropertyChange("loggerPrecision", oldVal, this.loggerPrecision); |
| } |
| |
| /** |
| * Returns the Logger precision. |
| * @return logger precision |
| */ |
| public final String getLoggerPrecision() { |
| return loggerPrecision; |
| } |
| |
| /** |
| * Returns true if the named column should be made visible otherwise |
| * false. |
| * @param column |
| * @return column visible flag |
| */ |
| public boolean isColumnVisible(TableColumn column) { |
| return (findColumnByHeader(visibleColumns, column.getHeaderValue().toString()) != null); |
| } |
| |
| private void setVisibleColumns(List visibleColumns) { |
| Object oldValue = new ArrayList(); |
| this.visibleColumns = new ArrayList(visibleColumns); |
| |
| propertySupport.firePropertyChange("visibleColumns", oldValue, this.visibleColumns); |
| } |
| |
| public void setColumnVisible(String columnName, boolean isVisible) { |
| boolean wasVisible = findColumnByHeader(visibleColumns, columnName) != null; |
| |
| //because we're a list and not a set, ensure we keep at most |
| //one entry for a tablecolumn |
| Object col = findColumnByHeader(allColumns, columnName); |
| if (isVisible && !wasVisible) { |
| visibleColumns.add(col); |
| visibleColumnOrder.add(col); |
| propertySupport.firePropertyChange("visibleColumns", Boolean.valueOf(isVisible), Boolean.valueOf(wasVisible)); |
| } |
| if (!isVisible && wasVisible) { |
| visibleColumns.remove(col); |
| visibleColumnOrder.remove(col); |
| propertySupport.firePropertyChange("visibleColumns", Boolean.valueOf(isVisible), Boolean.valueOf(wasVisible)); |
| } |
| } |
| |
| /** |
| * Toggles the state between visible, non-visible for a particular Column name |
| * @param column |
| */ |
| public void toggleColumn(TableColumn column) { |
| setColumnVisible(column.getHeaderValue().toString(), !isColumnVisible(column)); |
| } |
| |
| /** |
| * @return detail pane visible flag |
| */ |
| public final boolean isDetailPaneVisible() { |
| return detailPaneVisible; |
| } |
| |
| /** |
| * @param detailPaneVisible |
| */ |
| public final void setDetailPaneVisible(boolean detailPaneVisible) { |
| boolean oldValue = this.detailPaneVisible; |
| this.detailPaneVisible = detailPaneVisible; |
| propertySupport.firePropertyChange( |
| "detailPaneVisible", oldValue, this.detailPaneVisible); |
| } |
| |
| /** |
| * @return scroll to bottom flag |
| */ |
| public final boolean isScrollToBottom() { |
| return scrollToBottom; |
| } |
| |
| |
| public final boolean isShowMillisDeltaAsGap() { |
| return showMillisDeltaAsGap; |
| } |
| /** |
| * @param scrollToBottom |
| */ |
| public final void setScrollToBottom(boolean scrollToBottom) { |
| boolean oldValue = this.scrollToBottom; |
| this.scrollToBottom = scrollToBottom; |
| propertySupport.firePropertyChange( |
| "scrollToBottom", oldValue, this.scrollToBottom); |
| } |
| |
| /** |
| * @param showMillisDeltaAsGap |
| */ |
| public final void setShowMillisDeltaAsGap(boolean showMillisDeltaAsGap) { |
| boolean oldValue = this.showMillisDeltaAsGap; |
| this.showMillisDeltaAsGap = showMillisDeltaAsGap; |
| propertySupport.firePropertyChange( |
| "showMillisDeltaAsGap", oldValue, this.showMillisDeltaAsGap); |
| } |
| |
| public final void setThumbnailBarToolTips(boolean thumbnailBarToolTips) { |
| boolean oldValue = this.thumbnailBarToolTips; |
| this.thumbnailBarToolTips = thumbnailBarToolTips; |
| propertySupport.firePropertyChange("thumbnailBarToolTips", oldValue, this.thumbnailBarToolTips); |
| } |
| |
| public final boolean isThumbnailBarToolTips() { |
| return thumbnailBarToolTips; |
| } |
| |
| /** |
| * @return tool tips enabled flag |
| */ |
| public final boolean isToolTips() { |
| return toolTips; |
| } |
| |
| /** |
| * @param toolTips |
| */ |
| public final void setToolTips(boolean toolTips) { |
| boolean oldValue = this.toolTips; |
| this.toolTips = toolTips; |
| propertySupport.firePropertyChange("toolTips", oldValue, this.toolTips); |
| } |
| |
| /** |
| * @return log tree panel visible flag |
| */ |
| public final boolean isLogTreePanelVisible() { |
| return logTreePanelVisible; |
| } |
| |
| /** |
| * @param logTreePanelVisible |
| */ |
| public final void setLogTreePanelVisible(boolean logTreePanelVisible) { |
| boolean oldValue = this.logTreePanelVisible; |
| this.logTreePanelVisible = logTreePanelVisible; |
| propertySupport.firePropertyChange( |
| "logTreePanelVisible", oldValue, this.logTreePanelVisible); |
| } |
| |
| /** |
| * @return custom date format flag |
| */ |
| public boolean isCustomDateFormat() |
| { |
| return !DATE_FORMATS.contains(getDateFormatPattern()) && !isUseISO8601Format(); |
| } |
| |
| public void setHiddenLoggers(Collection hiddenSet) { |
| Object oldValue = this.hiddenLoggers; |
| this.hiddenLoggers = hiddenSet; |
| propertySupport.firePropertyChange("hiddenLoggers", oldValue, this.hiddenLoggers); |
| } |
| |
| public Collection getHiddenLoggers() { |
| return hiddenLoggers; |
| } |
| |
| public String getTimeZone() { |
| return timeZone; |
| } |
| |
| public void setTimeZone(String timeZone) { |
| Object oldValue = this.timeZone; |
| this.timeZone = timeZone; |
| propertySupport.firePropertyChange("dateFormatTimeZone", oldValue, this.timeZone); |
| } |
| |
| public void setHiddenExpression(String hiddenExpression) { |
| Object oldValue = this.hiddenExpression; |
| this.hiddenExpression = hiddenExpression; |
| propertySupport.firePropertyChange("hiddenExpression", oldValue, this.hiddenExpression); |
| } |
| |
| public String getHiddenExpression() { |
| return hiddenExpression; |
| } |
| |
| public void setAlwaysDisplayExpression(String alwaysDisplayExpression) { |
| Object oldValue = this.hiddenExpression; |
| this.alwaysDisplayExpression = alwaysDisplayExpression; |
| propertySupport.firePropertyChange("alwaysDisplayExpression", oldValue, this.alwaysDisplayExpression); |
| } |
| |
| public String getAlwaysDisplayExpression() { |
| return alwaysDisplayExpression; |
| } |
| |
| public void setClearTableExpression(String clearTableExpression) { |
| Object oldValue = this.clearTableExpression; |
| this.clearTableExpression = clearTableExpression; |
| //no propertychange if both null |
| if (oldValue == null && this.clearTableExpression == null) { |
| return; |
| } |
| propertySupport.firePropertyChange("clearTableExpression", oldValue, this.clearTableExpression); |
| } |
| |
| public String getClearTableExpression() { |
| return clearTableExpression; |
| } |
| } |