blob: 47187dab13c4952db231cec06761eff89af194a9 [file] [log] [blame]
/*
* 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<Object, Object> 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;
}
}