 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.

This file just contains a list of things we are considering for Chainsaw.  Please don't take
the contents as given, just that we all thought they were good ideas worth remembering/prioritizing.

 - A way to send feedback via email from the help menu...maybe we can't have it sent to log4j-dev since that requires the user to be subscribed, but something like that would be helpful
- Some flash movies of common stuff (specifying the config file, configuring the UI, filtering)
- Maybe a wiki doc describing the different appender/receiver combinations and usage scenarios (when would I use x, vs y appender/receiver combo)
  (this is worth considering creating a PDF guide)

- (PARTIALLY DONE)(Paul) all settings saved as xml or regular text files instead of combination of properties & serialized java object files
  (use Xstream for bean serialization)
  
- (IN PROGRESS)(Paul) would be nice to be able to have a way to modify the detail pane layout & save it as a default layout (default layout would always be used to display events - maybe not bother with settings per tab)
  (Xstream handy here)
  
- (PARTIALLY DONE))(Paul)someone mentioned in log4j-user that they'd like a way to auto-load an xml log file on chainsaw start (err...could just write an xml file receiver..I already did it but didn't create a real receiver).
  - Do this via an MRU list in the File menu
  
- (Scott) I talked the JToaster guy into changing his code to ASL v2, so I'd like to support it in the ui..maybe just app-wide expression controls notification (with associated saved preference)
- might be nice to remember refine focus expressions per tab
- gui improvements
- docs (at least the wiki more often), improvements to the tutorial

FYI, I also talked to the person who wrote rssappender and she's probably going to make changes to it to be 1.3 compatible so that it could be included in the core (I assume something like that would be useful to some folks).

- (Paul) Now that JmDNS is licensed with ASL, we can create a ZeroConfSocketHubAppender and have Chainsaw autodetect things to connect to.

- For jars that are not ASL compatible, maybe have Chainsaw auto-download and install in the .plugins area?

- (Paul) add OSX integration
	- (DONE) About/Preference/Menu bar stuff
	- add ant script to create iSaw.dmg
	
*(DONE) (Paul) Need ta add appropriate credit to stuff in the Help->About menu (ie. XStream et al)
	- (DONE) implement as Scrolling view port (end title movie style effect.)
	
- (Paul/Scott) VFS
	- Fix up VFSPlugin so it's actually useful
	
- (Paul) Scrap MessageCenter - just get Chainsaw to log to itself.