2000-02-22  Jason Leach  <leach@wam.umd.edu>

	Pan 0.7.6 Released.

2000-02-22  Jason Leach  <leach@wam.umd.edu>

	* pan/prefs.c (prefs_add_section_page): this function had bonehead
	arguments, changed the second parameter from a pointer to a
	function to a pointer to a GtkWidget.

	* pan/text.c (text_key_press_cb): the up/down stuff requires CTRL
	to be pressed, so people can scroll as they used to.

	* README,
	* configure.in: bumped versions to 0.7.6 for tomorrow.

	(add uulib fast ./configure option)

	* acconfig.h,
	* configure.in,
	* config.h.in,
	* pan/decode.c (decode_article): made the UUOPT_FAST option a
	compile-time option, so users could play with it if they find
	uulib really slow, off by default.

	(preferences touch ups)

	* pan/prefs.c (prefs_spawn): gave the preferences window a
	friendlier title line "Pan: Preferences"

	* pan/prefs.c (prefs_spawn): alpha sorted the clist items
	
2000-02-21  Jason Leach  <leach@wam.umd.edu>

	* TODO: updated, gave myself some tasks
	
	* pan/prefs.c (prefs_spawn): check me out! I'm cool! I can
	re-design the prefs so they don't look like ass!

2000-02-21  Charles Kerr <charles@skywalker.ecn.ou.edu>

	(bugfixes)

	* pan/text.c (text_key_press_cb): also key off of GDK_space

	* pan/text.c (text_page_down_or_next_article): page-down in text
	window didn't work because we were subtracting instead of adding.
	Fixed.

	(user interface)

	* pan/text.c (welcome): Added a plug for 0.8.0 in the introduction
	window.

2000-02-20  Matt Eagleson <e.Messiah@superpimp.org>

	* pan/util.c (pan_make_temp): New Function.  Makes a temporary
	file that should be guarenteed to be unique.

	* pan/util.c (pan_clean_temp_dir): New Function.  Cleans any
	temporary files made with pan_make_temp by the current process.

	* pan/pan.c (pan_shutdown): Call pan_clean_temp_dir.

	* pan/message-window.c (message_reply_external): This function now
	optionally quotes and supplies the body to the external Email app.

	* pan/prefs.c (prefs_general_page):  Added a note about the body
	parameter.

2000-02-19  Matt Eagleson <e.Messiah@superpimp.org>

	* pan/acache.c (acache_putline_body): We now collapse double
	periods at the start of a line as per RFC977 section 2.4.1.  This
	will stop a "corrupt decode" bug.  Thanks to: Tony
	<civ@brevard.net> for tracking this one down.

	* pan/message-send.c (build_nntp_message): Expand periods
	at the start of lines before posting.

	* pan/message-send.c (build_nntp_message): The article body was
	being leaked on posts.  Plus, made this ugly function slightly
	more readable by clarifying the use of "tmp"

2000-02-19  Charles Kerr <charles@skywalker.ecn.ou.edu>

	(decode attachment as)

	* pan/articlelist.c (articlelist_selected_decode_impl): added support
	for saving attachment by user-specified name.

	* pan/articlelist.c (articlelist_selected_decode_as): new function for
	saving attachment by user-specified name.

	* pan/articlelist.c (decode_as_callback): callback that queues the
	queue item after the user specifies a filename, or deletes the queue
	item and unflags the "QUEUED" flag from the article.

	* pan/articlelist.c (articlelist_menu_popup): added "Save Attachment
	As..." to the popup menu.

	* pan/articlelist.c (articlelist_button_press): sensitize the
	"save attachment as" button appropriately based on article selection.

	* pan/gui.c (article_mnu): added "Save Attachment As..." to the popup
	menu.

	* pan/gui.c (gui_articlelist_group_changed_cb): sensitize the
	"save attachment as" button appropriately based on article selection.

	(mailing list request)

	* pan/queue-item-decode.c (queue_item_decode_run): on a successful
	decode, we now mark the article as read.  This was a request from
	Francesco Lamonica on the mailing list.

2000-02-19  Jason Leach  <leach@wam.umd.edu>

	(get all/new headers from all subscribed groups)

	* pan/grouplist.c (grouplist_all_subscribed_download_new),
	(grouplist_all_subscribed_download_all): new functions,
	implementing the ability to download
	
	* pan/grouplist.c (grouplist_subscribed_gfunc): new function, for
	the above

	* pan/gui.c (online_menu): plugged in a menu item to access this
	new feature.
	
	(new message body key bindings)
	
	* pan/text.c (text_page_down_or_next_article): new function,
	should flip the message body text down a page, or if we're at the
	bottom already, then open the next article in the articlelist.

	* pan/text.c (text_key_press_cb): new function, process keyboard
	input events for the message body text pane.

2000-02-18  Charles Kerr <charles@skywalker.ecn.ou.edu>

	(bug fixes)

	* pan/message-filter.c (delete_button_clicked): memory leaks fixed.

	* pan/articlelist.c (articlelist_selected_delete_thread): fixed
	bug that killed Pan when deleting multiparts from "delete thread".
	Thanks to Will Lashell for finding this bug.

	* pan/pan-db.c: commented out the thread mutexes that we were
	using previously because Pan was deadlocking in some strange cases
	that Tov dreamt up. :) The January 9 ChangeLog entry concerning
	the thread safety of bdb doesn't seem very conclusive, and ISTR
	this was more from what I'd read about the bdb API than from
	actual experience.  Matt also has done some research and says that
	bdb is, in fact, threadsafe. (I said it *might* be! :) --Matt) So
	we'll see. :)

2000-02-17  Matt Eagleson <e.Messiah@superpimp.org>

	* pan/pan.c: Added a callback to do init functions
	after gtkmain.  Moved server_init to there.

	* pan/prefs.c: Added external_mailer and external_editor
	option to prefs.

	* pan/gui.c: Added a menu option for Replying with an 
	External mailer.

	* pan/message-windows (message_reply_external): Spawns
	an external mailer based on a user supplied string.

2000-02-17  Charles Kerr <charles@skywalker.ecn.ou.edu>

	(kill thread)

	* pan/articlelist.c (articlelist_selected_thread_delete): now handle
	all selected threads, rather than just the first one.

	(download entire thread)

	* pan/articlelist.c (articlelist_selected_thread_download): new
	function to download all the articles in a thread.  This was a request
	on the mailing list.

	(use subject header as filename for binary attachment)

	* pan/decode.c,
	* pan/prefs.c: Added support for this feature.  This was a request on
	the mailing list.

	(bug fixes)

	* pan/queue-item-body.c (queue_item_body_run): memory fixes.
	Thanks to Purify for finding them. :)

2000-02-17  Charles Kerr <charles@skywalker.ecn.ou.edu>

	(killfile/watch thread)

	* pan/articlelist.c (articlelist_set_node_style): added support for
	tracked-thread color.  The default color is green.
	* pan/prefs.c (struct PrefsWindow): same.
	* pan/prefs.c (prefs_apply): same.
	* pan/prefs.c (prefs_init): same.

	* pan/articlelist.c (articlelist_selected_thread_track): call the
	new func rekill_thread() to give visual cues that yes, Pan did
	just start tracking that thread the user pointed at.
	* pan/articlelist.c (articlelist_selected_thread_kill): same.

	(article deleting, again)

	* pan/gui.c (article_menu): added new menu option, "Delete
	Thread", which blows away the entire thread an article is in.
	This is for fast deleting and is more like what the old delete
	used to do.

	* pan/gui.c (articlelist_menu_popup): same.

	(utility funcs)

	* pan/article.c (article_get_entire_thread): new utility func.
	Given an adata, it traverses its parents and children and builds
	an array of all the articles in the thread.

	* pan/articlelist.c (rekill_thread): refreshes the killfile flags
	for a given thread, and updates the nodes in the articlelist
	accordingly.  This can be used to give visual feedback on
	newly-watched or newly- killed threads.

2000-02-16  Charles Kerr <charles@skywalker.ecn.ou.edu>

	(article delete)

	* pan/article.c (article_delete): new all-in-one function: it
	handles the delete-multipart-children special case, it clears the
	article from the acache, it frees the article, removes it from the
	article header db, and fires off a notification to anyone
	interested in listening to what articles are being deleted.

	* pan/article.c (article_isolate): new utility function for
	reparenting an article's children to the article's parent, and
	vice versa, and then clearing out the article's parent/child list.
	Nice for tying up loose ends before freeing an adata.

	* pan/articlelist.c (article_deleted_cb): when an article is
	deleted, make sure that the articlelist is in a consistent state
	with this.  This includes reparenting the child nodes (if any),
	removing the node corresponding to the article (if any) & removing
	it from the message-id/node hashtable, clearing it out of
	article_headers, and, if the adata passed in and its match in
	article_headers are two different article_data objects pointing to
	the same article, we clear out our copy.  Sheesh, and it all
	(apparently) works, too.  Will wonders never cease?

2000-02-16  Matt Eagleson <e.Messiah@superpimp.org>

	* pan/pan.c (main): Removed the gdk locks around gtk_main.
	server_init and main were fighting over the mutex and it was
	causing nasty deadlocks on SMP systems.

2000-02-16  Charles Kerr <charles@skywalker.ecn.ou.edu>

	(show all headers in body)

	* pan/text.c: added this to the text popup menu as well.
	* pan/gui.c: code to sync between the top-level menu and the gui popup
	menu, via a PanCallback

	(mark read/unread)

	* bugfixes to get marking read/unread to work with
	number-of-unread-children again.  I think all is correct now;
	hammer on it.

2000-02-16  Matt Eagleson <e.Messiah@superpimp.org>

	* pan/status-item-view.c (string_shorten): Tweaked the spacing
	so text doesn't get clipped.

2000-02-15  Charles Kerr <charles@skywalker.ecn.ou.edu>

	(new features)

	* pan/article-find.c: added "find backwards" button to search
	backwards through the article list.  This was from a user
	functionality request.

	* pan/gui.c, text.c: added "show all headers in body", because we
	only show a specific set of headers in the header bar, and a few
	users have asked for this.

2000-02-15  Charles Kerr <charles@skywalker.ecn.ou.edu>

	(code cleanup, part two)

	* pan/everything: changed the scope of header files, and try to
	include the minimum headers required to work.  The result: the
	.deps directory used to hold 29,738 lines of header dependencies;
	now we're down to 11,473.  The build is *much* faster. :)

	(article flags)

	* pan/article.c: lots of private implementation functions of
	public functions; ie, article_update(), article_add_flag(),
	article_remove_flag().  These are used so that user interface and
	database synchronization can be batched up for speed.  Mark
	read/unread seems to work now, but needs more testing.

2000-02-14  Charles Kerr <charles@skywalker.ecn.ou.edu>

	(code cleanup)

	* pan/everything: removed the all-inclusive pan.h dependencies.
	* pan/globals.h: new header.
	* pan/globals.h (Pan): moved global "text" widget here to share space
	with group_clist and article_ctree.

	(article flags):

	* pan/article.c (article_mark_read): We used to have a function
	like this, and now we have it again, to handle the special case of
	"top-level mp3 article is read, mark its children as read." *
	pan/article.c (article_mark_unread): same.

	I haven't had a chance to test these because my ride is here; I'll
	test them out tomorrow.  Happy Valentine's Day, everybody.

2000-02-13  Charles Kerr <charles@skywalker.ecn.ou.edu>

	(bug fixes)

	* pan/message-window.c (ensure_quoted_col_inited): fixed potential
	gui lockup -- ensure_quoted_col_inited could have been called from
	outside a pan_lock().  Thanks to Stephen Torri for reporting this
	bug.

	(user interface tweaks)

	* pan/decode.c (decode): by popular demand, removed the
	append-groupname-to-global-download-directory feature.

	* pan/article-toolbar.c: when making a wildmat expression that will
	be evaluated in the article subject filter, only wrap the expression
	in '*''s if there's not already a '*' in the string.  If there is,
	this implies the user knows what he wants and it's not a straight
	substring search.
	* pan/grouplist.c: same.
	* pan/article-find.c: same.

	* pan/decode.c: added a more descriptive message upon successful
	decoding.

2000-02-12  Charles Kerr <charles@skywalker.ecn.ou.edu>

	* NOTE TO CVS USERS:  remove ~/.pan/killfile.db before running this.

	(bug fixes)

	* pan/articlelist.c (articlelist_read_next_article): the "is this list
	empty" check in the beginning was buggy, so this function would try to
	get the next article even if the list was empty (which happens a lot
	now, with the article filters...)  Thanks to Stephen Torri for
	reporting this bug.
	* pan/articlelist (articlelist_read_next_thread): same.
	* pan/articlelist (articlelist_read_prev_article): same.
	* pan/articlelist (articlelist_read_prev_unread_article): same.

	* pan/articlelist.c (articlelist_selected_decode_impl): don't allow
	the user to queue for decoding an article which is already queued for
	decoding.  Thanks to Francesco Lamonica for reporting this bug.

	* pan/queue-item-body.c: No longer requires a socket connection if
	the article being requested is in the local cache.  This lets
	cached messages be read much more quicly.  Thanks to Francesco
	Lamonica for reporting this bug.

	* pan/gui.c: Fixed bug that caused the group name to disappear
	from the titlebar when an article was selected.  Thanks to Kang
	JeongHee for reporting this bug.

	* pan/articlelist.c (articlelist_button_press): Fixed bug that
	expanded article subtrees on a doubleclick in the article list.
	to expand a tree, you must click on the +/- box; other button-1
	clicks are reserved for reading messages.  Thanks to Kang JeongHee
	and others for reporting this bug.

	(message filter: minimum line count out, track thread in)

	* pan/message-filter.c (all): Removed the "minimum line count"
	rule because what it did (filter out nonbinaries) is much better
	done in the newer article state filter.  Instead I've added in
	better thread killing/tracking support.

	* pan/articlelist.c (articlelist_selected_thread_track): new
	function for tracking the currently-selected thread.  This thread
	will show up in the tracked color the next time you load the
	group, and its articles will be flagged with the "tracked" state
	so they can be filtered from the article state filter.

	* pan/articlelist.c (articlelist_selected_thread_track): new
	function for tracking the currently-selected thread.  This thread
	will show up in the tracked color the next time you load the
	group, and its articles will be flagged with the "killed" state so
	they can be filtered from the article state filter.

	(layout menu items)

	* pan/gui.c (gui_set_layout): simplify the code by removing the
	custom checkboxes and use the Gtk checkboxes instead.  This is
	mostly for orthogonality with the other radioboxes we have in the
	main menu, but also to get rid of the gnome menu insert warnings
	we get in I18N.

2000-02-10  Jason Leach  <leach@wam.umd.edu>

	* pan/prefs.c (prefs_get_dir): new #define macro.  prefs_init()
	seemed to have a bit of repetition in doing these basic steps,
	these 5 lines replace 15 others, and it's a #define so it's inline
	and doesn't waste cycles on function invokation.

	* pan/pan.c (session_die): made static
	* pan/pan.h (session_die): removed prototype
	
	* pan/pan.c (save_session): made static
	* pan/pan.h (save_session): removed prototype	

	* pan/server.c (server_list_save): made static
	* pan/server.h (server_list_save): removed prototype

	* pan/prefs.c (prefs_servers_changed): removed call to
	server_list_save()

	* pan/server.c (server_menu_update): this now calls
	server_list_save() at the beginning, seemed logical.
	
	* pan/server.h: removed the prototype for the non-existant
	server_menu_popup()

	* pan/grouplist.c (groups_menu_popup): reformatted this
	GnomeUIInfo struct to be easier to read/modify.

2000-02-10  Charles Kerr <charles@skywalker.ecn.ou.edu>

	Pan 0.7.5 Released.  This is mostly a bugfix release.

2000-02-10  Charles Kerr <charles@skywalker.ecn.ou.edu>

	* pan/article-thread.c (pp_adata_compare_subject): ignore leading
	noise characters when comparing subject names for sorting.

	* pan/article-thread.c (check_multipart_articles): parts >1 are no
	longer marked as binary incomplete or binary complete; this was
	throwing off the article filter.

	* pan/articlelist.c (ancestor_is_binary): new internal utility
	function.

	* pan/articlelist.c (apply_filter_tests): don't traverse children
	nodes if the parent is a multipart.  The children were messing up
	the article filter.  Thanks to Sandor Barany reporting this bug.

	* pan/decode.c (decode_article): by default, we now put the
	decoded file in a directory $download_dir/$groupname instead of
	$download_dir.

	* pan/gui.c (menu items): changed the alt-accelerators to
	ctrl-shift accelerators because Alt is used for popping up menus.

2000-02-08  Charles Kerr <charles@skywalker.ecn.ou.edu>

	* pan/articlelist.c (articlelist_all_mark_read):
	mark-all-crashes-pan bug fixed.

	* pan/gui.c (article_menu): added rot13 support.
	* pan/text.c (text_update): ditto.  Thanks to Douglas Kilpatrick
	for suggesting this.

	* pan/msort.c: added mergesort, which is stable, so that sorting
	the articlelist will look better when you sort by one key, then
	another.  Thanks to Svein Erik Brostigen for suggesting this.

	* pan/article-thread.c (pp_adata_compare_author): ignore leading
	noise characters (like '"') when comparing author names for
	sorting.  Thanks to Svein Erik Brostigen for suggesting this.


2000-02-07  Charles Kerr <charles@skywalker.ecn.ou.edu>

	* pan/*.c: added #include <config.h> to the top of every file, for
	I18N to work properly.

	* pan/status-item-view.c (status_cb): force the progressbar to
	update immediately.  Often this was not redrawing before
	(esp. with grouplist)

	* pan/grouplist.c: use a status item to show the grouplist is,
	indeed, being loaded.  We're getting reports of "Pan froze!" when
	in fact it's just taking a long time to load 30,000 groups. :)

	* pan/queue-item-grouplist.c: fixed the .c:315 bug a couple of people
	reported.

2000-02-07  Charles Kerr <charles@skywalker.ecn.ou.edu>

	Pan 0.7.4 Released.

2000-02-07  Jason Leach  <leach@wam.umd.edu>

	* pan/gui.c:
	* pan/grouplist.c (grouplist_set_view_mode): added back in the
	Groups->Show Groups menu pullout, so users can bind keys to
	flipping groups I guess (or navigate to the Groups menu via ALT-G
	then down to that option, whatever).  Also unified the callback
	for flipping view modes, replaced 4 function calls with 1
	function.
	
	* pan/grouplist.h: moved the group_mode enum into here from group.h

	* pan/grouplist.c (grouplist_remove_row): made static
	(grouplist_create): removed unused 'extern GtkTooltips *ttips'

	* pan/grouplist.c: renamed the 'FooStruct' to
	'GrouplistModeMenuStruct' and made appropriate changes.

2000-02-06  Charles Kerr <charles@skywalker.ecn.ou.edu>

	(memory fixes)

	* pan/article-db.c (ahdb_get_all_gfunc): fix memory leak.
	* pan/decode.c (decode_open): memory leak fixed.
	
	* pan/decode.c (decode_open): array-bounds-write bug fixed.

	* pan/status-item-view.c (status_item_view_destroy): unregister from
	"size_allocated" events before g_free()ing out last_status.  Also,
	NULL out last_status after we g_free() it.

	(other bug fixes)

	* pan/decode.c (decode_open): quote the filename we're opening, so
	that files with spaces and special characters will be interpreted
	correctly.  Thanks to kennric@hypothetical.net for reporting this bug.

	* pan/queue-item-headers.c (queue_item_headers_run): changed the code
	around to merge new/all headers with old headers, especially to not
	clobber the read/unread/etc. states of the old messages.  Previously
	a "get all" would clobber out all the previous states.  A side-effect
	of this may be to get rid of the "Expected XXX, got XXY" warning
	messages.

	(purify)

	FYI: purify's pretty happy with this version of Pan.

	(article state filtering: fixed question of how to show articles in a
	thread when one or more children matched the filter but the top-level
	node didn't.  Previously we would filter a node only on whether or not
	it passed the test.  Now we filter a node on whether or not its
	subtree passes the test.)

	* pan/articlelist.c (apply_filter_tests): new function to set the
	self_passes_filter and tree_passes_filter fields for all of the article
	list's article_data objects.

	(article)

	* pan/article.[ch]: (article_new): new function for instantiating
	article objects.  This doesn't do much yet, but it's greppable.
	* pan/article-db.c (article_deserialize): use article_new().

	* pan/article.[ch]: (article_copy): now takes two arguments: source
	and destination.  This is so that we can copy one article onto an
	already-existing article.

	* pan/article.h (article_data struct): added two fields:
	self_passes_filter and tree_passes_filter, which are used in
	articlelist to avoid re-evaluating every node's subtree when building
	the article UI.

	(article_thread)

	* pan/article-thread.[ch] (check_multipart_articles): new function
	that does the second half of what thread_articles used to do: look at
	an array of threaded articles and update each one's state to one of
	MULTIPART_ALL, MULTIPART_SOME, or MULTIPART_NONE.  This also makes
	thread_articles a cleaner function.
	* pan/articlelist.c (articlelist_set_contents): sync.

	* pan/article-thread.c (thread_articles): more cyclical redundancy
	checks.

2000-02-05  Charles Kerr <charles@skywalker.ecn.ou.edu>

	(bug fixes)

	* pan/text.c (realize_text_cb): disconnect from the expose signal
	after the welcome message has been shown.  Otherwise the welcome
	message will show up every time the text gets an expose message, such
	as when changing layout mode.  Thanks to Hvard Lygre for reporting
	this bug.

	* pan/acache.c (acache_file_in_use): Fixed bug that caused Pan to crash
	when checking a file that didn't have a '>' in it.
	* pan/acache.c (acache_expire_to_size): same.
	* pan/acache.c (acache_expire_to_size): Fixed bug that caused Pan to go
	into an infinite loop when a file in the .data directory had an umlaut
	at the end of it; ie, "<messageid@foo.std.com>.body~".  Thanks to
	Frank Linneweber for reporting these two bugs.

2000-02-04  Charles Kerr <charles@skywalker.ecn.ou.edu>

	(lots of memory fixes)

	* pan/message-send.c (message_send): memory leak plugged.
	* pan/message-send.c (build_nntp_message): same.
	* pan/message-send.c (trim_references): same.
	* pan/message-window.c (message_window_destroy): same.
	* pan/message-window.c (create_post_body_pane): same.
	* pan/queue-item-body.c (queue_item_body_destructor): same.

	* pan/prefs.c (prefs_init): free-memory-read fixed.

	* pan/message-window.c (update_body_pane): array-bounds-read fixed.
	* pan/message-window.c (create_post_body_pane): same.

	(article toolbar)

	* pan/xpm/article_read.xpm: new icon
	* pan/xpm/article_unread.xpm: new icon
	* pan/article-toolbar.c (article_toolbar_new): use the new article
	read/unread icons.

	* pan/article-toolbar.c (article_toolbar_new): removed sorting menu;
	it was mostly useless now that column-click sorting is available again

	(task visualization)

	* pan/gui.c: changed from a GtkHBox to a GtkFixed container.  The
	taskbar now cracks the whip and makes sure those darn progress bars
	stay the right size!

	(article sorting)

	* pan/gui.c (article_sort_menu): added sort menu to the main menu and
	synced it with the article tree column headers.

	* pan/articlelist.c (articlelist_set_sort_type_nosort): update the
	article tree column headers to put a little '+' or '-' on the current
	sort column to show that articles are being sorted ascending/descending
	on that key.

	* pan/articlelist.c (sort_type_to_col): new private utility function.
	Given a sort type, it returns the article tree column that matches it.

	* pan/articlelist.c (column_to_title): new private utility function.
	Given an article tree column, it returns the title of that column.

	* pan/articlelist.c (articlelist_set_sort_type_nosort): new private
	utility function.  This updates the sort_type variable, updates the
	articlelist column headers, and fires the "sort type changed" callback.
	It's "nosort" so that this can be called both when we're about to
	sort and also when we're just loading a new group and setting the
	sort type passively.

	(misc)

	* pan/gui.c (gui_set_title): group_data* argument is now const.
	
2000-02-03  Charles Kerr <charles@skywalker.ecn.ou.edu>

	(bug fixes)

	* pan/queue-item-body.c (queue_item_body_run): free-memory-read fixed.

	* pan/queue-item-body.c (nntp_article_download): memory leaks fixed.
	* pan/message.c (message_import_adata): same.
	* pan/article-db.c (deserialize_article): same.

	* pan/status-item-view.c (string_shorten): fix memory corruption bugs.
	* pan/util.c (get_host_name): same.
	* pan/util.c (get_fqdn): same.

	* pan/article-thread.c (is_child_of): new function to add a cyclical
	redundancy check to article-thread.  Looks like a reply was posted
	before the original, thanks to differences in timezones, which 
	confused and crashed Pan.

	(viewing by unread children)

	* pan/article.c (article_add_flag): if the flag being poked is
	STATE_READ, call articlelist_adata_read_changed to let it know
	* pan/article.c (article_remove_flag): same

	* pan/article-thread.c (pp_adata_unread_children_comp): new func for
	sorting articles based on the number of children they have.

	* pan/article-thread.c (pp_adata_message_id_comp): added code to use
	pp_adata_unread_children_comp if the sort type is number-of-children

	* pan/article-thread.c (count_unread_children): new function to count
	the number of unread children an article has.  Used by thread_articles

	* pan/article-thread.c (thread_articles): tally up the number of
	unread children under each article.  The article itself, if unread,
	counts as one.

	* pan/article-thread.h (ArticleSortType): added
	ARTICLE_SORT_UNREAD_CHILDREN

	* pan/article-toolbar.c (article_toolbar_new): added optionmenu items
	for +Unread and -Unread

	* pan/articlelist.c (articlelist_selected_mark_unread): update the
	unread article count of all the article's parents
	* pan/articlelist.c (articlelist_selected_mark_read): same
	* pan/articlelist.c (articlelist_selected_delete): same

	* pan/articlelist.c (articlelist_unread_inc): new utility function
	for updating a node and it's parents' unread qty

	* pan/articlelist.c (count_unread_children): new utility function for
	counting the number of unread children a node has.

	* pan/articlelist.c (add_article_to_ctree): add column for number of
	unread children
	* pan/articlelist.c (articlelist_update_node_fast): same

	* pan/articlelist.c (articlelist_adata_read_changed): new utility
	function for decrementing a node and its parents' unread child
	count by one

	* pan/articlelist.c (articlelist_click_column): handle things
	correctly when user clicks on "number of unread children" column

	* pan/articlelist.c (create_articlelist_ctree): add "unread children"
	column

	(article find)

	* pan/articlelist.c (all the article-find code): migrated to new
	module, article-find.[ch]

	* pan/article-find.c (article_find_cb): find now keys off of current
	selection, rather than the last find point.  This lets you move the
	find point around.

	(pan object)

	* pan/pan-object.[ch] (pan_object_sink): added new do-nothing function
	just like Gtk does, for claiming ownership of an object.

	* pan/article-toolbar.c (filter_selected_thread): use pan_object_sink()
	instead of pan_object_ref() to denote that we own the object.
	* pan/article-toolbar.c (sort_selected_thread): same
	* pan/article-toolbar.c (thread_selected_thread): same
	* pan/articlelist.c (filter_changed_thread): same
	* pan/queue.c (queue_add): same
	* pan/queue.c (queue_get_socket_for_item): same
	* pan/queue.c (smtp_get_connection): same

	(misc)

	* pan/status-item-view.c (error_cb): downgrade error messages from a
	popup dialog to a g_warning.

	* pan/article.c (article_update): adata argument is now const

	* pan/articlelist.c (articlelist_get_adata_from_node): new utility
	function that does just what it says.  This is a little cleaner, as
	we don't have to drop down to the Gtk+ level anymore to do this.
	* pan/articlelist.c (articlelist_get_selected_adata): same

	* pan/articlelist.c (many): use articlelist_get_adata_from_node
	rather than using the gtk_ctree calls directly.

	* pan/articlelist.c (articlelist_get_next_article): code cleanup


2000-02-02  Charles Kerr <charles@skywalker.ecn.ou.edu>

	(finding & flagging binaries)

	* pan/queue-item-headers.c:  Came up with a reasonably good
	heuristic for guessing whether or not a message is a single-part
	image file.  This isn't perfect but scored >95% on all the groups
	I tested.

	(article state filtering)

	* pan/queue-item-grouplist.c: when creating new grouplist objects,
	make sure to set their state filter fields to a reasonable default.

	* pan/gui.c: turn the state filter on by default
	* pan/article-toolbar.c: same

	* pan/gui.c (view menu): added in code to allow user to turn on the
	state filter on/off in the article toolbar
	* pan/article-toolbar: sync

	* pan/articlelist.c (article_passes_filter): added new function to
	filter out articles based on their state variables

	* pan/articlelist.c (add_nodes): sync with new toolbar code and
	article_passes_filter

	* pan/article-toolbar.[ch]: new module
	* pan/articlelist.c (sort_selected_describe): moved to new
	article-toolbar module
	* pan/articlelist.c (sort_selected_thread): same
	* pan/articlelist.c (sort_selected_cb): same
	* pan/articlelist.c (article_filter_cb): same
	* pan/articlelist.c (threaded_toggled_cb): same
	* pan/articlelist.c (articlelist_create_toolbar): same

	* pan/articlelist.c (articlelist_group_changed_cb): ensure that the
	"state filter" callbacks are called whenever the articlelist's
	current group changes

	* pan/articlelist.c (create_articlelist_ctree): instantiate the new
	articlelist callback hooks.

	* pan/articlelist.c (articlelist_refresh): new public utility function.
	* pan/articlelist.c (articlelist_set_sort_type): same.
	* pan/articlelist.c (articlelist_set_threaded): same.
	* pan/articlelist.c (articlelist_poke_state_filter): same.

	* pan/group.h: added STATE_FILTER_* enum
	* pan/group.h (group_data): added state_filter guint
	* pan/grouplist.c (grouplist_load_gdata): update to read in the state
	filter, if there is one
	* pan/grouplist.c (grouplist_save_group): update to save state filter
	* pan/grouplist.c (grouplist_save_list): same

	* pan/gui.c (article_filter_menu): new menu of state filter
	* pan/gui.c (gui_articlelist_group_changed_cb): sensitizes/
	desensitizes article menubuttons depending on whether or not
	the articlelist has a group loaded.
	* pan/gui.c (gui_message_state_filter_changed_cb): new function that
	updates the state filter menu items when the articlelist's state filter
	changes

2000-02-01  Charles Kerr <charles@skywalker.ecn.ou.edu>

	(big bug fix)

	* pan/queue-item-headers.c (nntp_articlelist_download): removed broken
	faux expire code which was throwing away perfectly valid headers.
	Thanks to Michael Maluck for leading us to this bug.

	(socket/queue tweaks)

	* pan/queue.c (queue_get_socket_for_item): if user has limited max
	number of sockets to one, then don't worry about saving one for
	nonleech connections.

	* pan/queue.c (queue_run): if an item fails due to socket failure,
	resubmit it at a high priority regardless of its original priority.
	Rationale: the item may have resources lying around (ie, articles)
	that should be cleared out as soon as possible.

	* pan/socket.[ch]: added "error" boolean field to denote a socket
	read/write error.  This is now checked in queue_run(), rather than
	QUEUE_ITEM_STATUS_ESOCKET, because there are only two points where
	the variable is set and therefore harder for small errors to sneak
	in somewhere between pan_socket_*line() and queue_run().

2000-01-31  Charles Kerr <charles@skywalker.ecn.ou.edu>

	(sockets/queue-items)

	* queue items now return QUEUE_ITEM_STATUS_ESOCKET if there was a
	socket failure during the task.  If queue_run() gets this as the
	queue_item_run() return value, it throws the socket away and
	re-queues the task.

	(bug fix)

	* pan/articlelist.c (articlelist_selected_delete): remember to take
	deleted articles out of our local article buffer when they're
	deleted.  Otherwise when re-sorting they'll show up again and screw
	up the read/unread/total counts and give the db fits.  Thanks to
	Tony <civ@brevard.net> for reporting this bug.

	* pan/gui.c (gui_restore_column_widths): if the column widths can't be
	found in the prefs file, don't set them.  They'll be zero and look
	real bad.  This happens for new users.

	* pan/sockets.c (pan_socket_new): ignore SIGPIPE messages.  This way
	if pan_socket_putline() writes to a dead socket, it will return -1
	instead of crashing the program.

	(new user druid)

	* pan/druid.c (druid_email_page): guess the user's email address and
	put it in as the default.

	* pan/druid.c (druid_name_page): guess the user's real name and put it
	in as the default.

	(status-item-view widths)

	*pan/status-item-view.c,
	*pan/gui.c: some exploratory hacking to see if I can get these things
	to work right.  The text is "..."'ing at the right point now; ie, the
	text isn't clipped any more than it has to be, and the s-i-v hbox
	usually doesn't grow by itself.  However when a new s-i-v is added it
	does grow by itself, so there's still some more digging to be done
	here.

2000-01-31  Matt Eagleson <e.Messiah@superpimp.org>

	* pan/gui.c: Applied 64-bit patches from Konrad Podloucky.
	* pan/sockets.c: Same.

2000-01-30  Charles Kerr <charles@skywalker.ecn.ou.edu>

	(gnksa / signature files)

	* pan/message-send.c (check_body): check to see if the signature is
	more than four lines long or eighty characters wide.  If so, add a
	warning that must be confirmed before the message is queued to be sent.
	This satisfies gnksa 15b.

	* pan/message-send.c (check_body): check to see if any lines in the
	message are more than 80 characers wide.  If so, add a warning that
	must be confirmed before the message is queued to be sent.  This
	satisfies gnksa 14b.

	(bug fix)

	* pan/queue-item-headers.c (nntp_articlelist_download): small UI
	tweak.  The object was firing a "getting new articles" status message
	regardless of whether it was getting new or getting all.

2000-01-29  Charles Kerr <charles@skywalker.ecn.ou.edu>

	(gnksa / email addresses)

	* pan/message-send.c (trim_references): reworked the references
	shortener and moved it into this module.  This module satisfies
	gnksa 7a, 7b, 7c, and 7d.

	* pan/message-send.c (send_cb): use the new check_smtp_rcpts to ensure
	the "From" address is valid.  This fulfills gnksa 12a and 12b.

	* pan/message-send.c (check_smtp_rcpts): reworked to use the new rfc822
	Module.  This now checks for syntatically valid email addresses.

	* pan/mesasge_send.c (get_email_rcpts): reworked to use the new rfc822
	module.  This now strips out the 'phrase' part of the mail address and
	leaves in the route-addr part.  This may not be the perfect way to do
	things but is much better than what we had before.  Specifically I'm
	thinking this may keep out some of the invalid I18N chars until we get
	to mime-encoding the subject headers.

	* pan/message-send.c (send_cb): also check to make sure all the email
	recipients have valid email addresses.

	* pan/rfc822.[ch]: added these new modules for validating email
	addresses.  This is GPL'ed code taken from mutt 1.0.1.  Isn't 
	Free Software great?

	* pan/rfc822.c (parse_address): removed ability to not specify a domain
	name.  For Pan's needs, an explicit domain should always be specified.

	* pan/rfc822.c: small tweaks to remove compiler warnings.

	(mute)

	* pan/pan.c: added a new debug option, "--mute".  When running in this
	mode mesages and email will get dumped to stdout rather than being
	posted or mailed.  This is for debugging smtp/nntp headers on our end.

	* pan/smtp.c: added support for --mute.

	* pan/nntp.c: same.	

	(bug fix)

	* pan/util.c (pan_substitute): off-by-one memory bug fixed.  Very Big
	thanks to Steven Lawrance <slawrance@technologist.com> for reporting
	this bug.

	* pan/queue-item-grouplist.c (nntp_grouplist_download_all): finally got
	rid of that strtok warning.
	* pan/queue-item-grouplist.c (nntp_grouplist_download_new): same.

	(cleanup)

	* pan/pan.h (Pan): removed unused field idle_tag.
	* pan/pan.h (Pan): removed unused field timer_tag.

	* pan/message-window.c (message_popup_reply_window): removed unused
	function.
	* pan/message-window.h (message_popup_reply_window): same.

	(misc)

	* pan/util.h (pan_warn_if_fail): new utility macro.

2000-01-28  Charles Kerr <charles@skywalker.ecn.ou.edu>

	(bug fixes)

	* pan/message.c (message_new): if creating Mesasge from an adata,
	copy the adata's reply_to and followup_to fields.

	* pan/message-window.c (create_post_header_pane): Followup-To: poster
	special case: if reply-to is set, mail the reply to that address
	instead of the author address.

2000-01-28  Charles Kerr <charles@skywalker.ecn.ou.edu>

	(email functionality)

	* pan/smtp.c (smtp_send_message): now supports "Reply-To:".

	* pan/message-send.c (message_send): when both posting and mailing
	a message, the mailed message's body is preceeded by a line clearly
	stating that the message is an email copy of a usenet posting.  This
	satisfies gnksa 9d.

	* pan/smtp.h (smtp_send): new argument, "leader", that will precede
	the message body if non-NULL.
	* pan/smtp.c (smtp_send): same.

2000-01-28  Charles Kerr <charles@skywalker.ecn.ou.edu>

	(new functionality: now user can set reply-to and followup-to when
	posting new messages or sending mail.  This fulfills gnksa 4c)

	* pan/message-window.c: (headers_cb): new function to pop up the
	followup-to and reply-to fields when the "More Headers" button is
	clicked.  Rationale: these headers are infrequently used and add to
	the clutter if visible by default.

	* pan/message-window.c (message_post_toolbar): added "More Headers"
	button.

	* pan/xpm/more_headers.xpm: icon for the "More Headers" button.
	This (along with the envelope "subscribed group" icon, though I forgot
	to mention it at the time) are by Dean Jones and can be found at
	<http://jfa.javalobby.org/projects/icons/index.html>.

	* pan/message-send.c (check_followup_to): new function which checks
	the followup-to: header for legal group names and/or "poster", and for
	limiting the followup group list to a reasonably small number.

	* pan/message-send.c (build_nntp_message): added support for
	followup-to and reply-to in the nntp message.

	* pan/message-send.c (send_cb): added checks for followup-to.

	(I18N bug fix)

	* pan/gui.c (gui_set_layout): fixed the gnome_menu_insert I18N bugs.
	Thanks to Sandor Barany for helping me track this down.

	(version stuff)

	* configure.in: upped version number to 0.7.4

	* pan/text.c (welcome): removed "Snow Day" from the welcome message.

	* pan/gui.c (about_cb): removed "Snow Day" from the about Pan dialog.

2000-01-27  Charles Kerr <charles@skywalker.ecn.ou.edu>

	Pan 0.7.3 "Snow Day" Released.

	* pan/gui.c (about_cb): added "Snow Day" to the about dialog.

2000-01-27  Jason Leach  <leach@wam.umd.edu>

	* pan/xpm/thread.xpm: new pixmap of the little + in CLists

	* pan/text.c (welcome): forgot to add the "Snow Day" in.

	* pan/queue-item-headers.c (queue_item_headers_run): Prefer
	"Downloaded" over "Got" in the log viewer.

	* pan/article-db.c (ahdb_get_all): I didn't like the way the
	expiration log entry looked, modified it a bit.

2000-01-27  Charles Kerr <charles@skywalker.ecn.ou.edu>

	(bug fixes)

	* pan/articlelist.c: fixed a bug in sorting that caused sorts to
	come out ascending, whether they were supposed to be descending or not

	* pan/article-thread.c (pp_compare_loc): tidied up to count child
	article lines if and only if the parent is a multipart

	* pan/articlelist.c (sort_clicked_cb): wired the column headers back
	in for sorting.  This raises another issue; we need a column-visible
	way to get back into threaded mode.

	(new functionality)

	* pan/message-filter.c: hacked in support for a new rule to filter
	out articles of less than N lines in their body.  This is for the
	alt.binaries fans out there. :)

2000-01-27  Jason Leach  <leach@wam.umd.edu>

	* pan/articlelist.c (add_nodes): tied in the child node hiding
	
	* pan/prefs.c (prefs_general_page): new option allowing user to
	hide parts 2-x of complete multipart posts.

2000-01-26  Jason Leach  <leach@wam.umd.edu>

	* pan/gui.c (gui_key_press_cb): pressing the DELETE key in the
	articlelist will now delete the selected articles.

	* pan/log.c: poked with some of the formatting/comments some

	* pan/queue.c (queue_add): high priority items should be prepended
	to the queue, not appeneded, right?  (if it breaks, switch it
	back, me sorry)
	
2000-01-26  Charles Kerr <charles@skywalker.ecn.ou.edu>

	(posting messages)

	* pan/message-send (check_groups): new function.  We now check all the
	group names against the groups in the current server and warn if we
	don't recognize a group.  Also, warn if we're posting to too many
	groups.  This satisfies gnksa rule 3b.
	* pan/message-send (check_body): reworked.
	* pan/message-send (check_subject): reworked.
	* pan/message-send (send_cb): call check_groups().  If message gets
	warnings, put up an "are you sure you want to send this?" type
	message.
	* pan/message-send (check_groups): warn if we're posting to more than 2
	groups and don't have followup-to set.  This satisfies gnksa rule 3c.

	(bug fixes)

	* pan/message-send.c (build_nntp_message): fixed References: bug
	reported by Cameron <hrothgar@endor.hsutx.edu>.  Apparently Pan was
	attaching "References" whether the user specified a follow-up or not.

	(memory leaks)

	* pan/message-send.c (build_nntp_message): fixed an ugly g_strconcat
	memory leak.

	* pan/pan-db.c (pan_db_unref): fixed small free-memory-read bug.

	* pan/article-thread.c (thread_articles): largish memory leak fixed:
	every time the articles were thread, it would leak an array of
	pointers to the articles.

	(i18n fixes)

	* pan/articlelist.c: the sorting optionmenu is now I18Nable.
	* pan/articlelist.c: the articlelist column headers are now I18Nable.
	* pan/message-filter.c: the rules list column headers are now I18Nable.
	* pan/queue-item-body.c (queue_item_body_describe): I18N fixes.
	Thanks to Kang JeongHee <Keizi@mecom.net> for reporting all of these.

2000-01-25  Charles Kerr <charles@skywalker.ecn.ou.edu>

	(bug fixes)

	* pan/article-thread (articlelist_set_contents): If the sort type is
	somehow corrupted, just default to threaded.  Thanks to Will LaShell
	for finding this bug.

	(pan_warn_if_reached)

	* pan/util.h (pan_warn_if_reached): added new macro.  This is to
	replace g_assert_not_reached() in code that shouldn't be reached,
	but also are not serious enough to be fatal.

	* pan/*.c: replaced all occurances of g_assert_not_reached with
	pan_warn_if_reached() and had the code do reasonably-correct thing.

2000-01-25  Jason Leach  <leach@wam.umd.edu>

	* pan/text.c (text_button_press): minor sensitivity update: the
	"reply by e-mail" should be desensitized while the user hasn't
	opened any messages for viewing.

	* pan/message-send.c: made appropriate changes to some
	preprocessor conditionals to be sure necessary headers are
	included on Solaris platforms.  Thanks to Jim Robinson
	<robinson@ipsg.mot.com> for the patch.

	* CREDITS: credit for Jim Robinson	

2000-01-25  Charles Kerr <charles@skywalker.ecn.ou.edu>

	* pan/grouplist.c (process_menu_selection): unsubscribe wasn't working
	right when you were in the "subscribed" mode for the article list.
	Thanks to Peter R. Thorsen Jr. for reporting this bug.

	(futzing)

	* pan/group.c (clean_group): put the group name in the "clean group?"
	dialog.


2000-01-25  Charles Kerr <charles@skywalker.ecn.ou.edu>

	Pan 0.7.2 released.

2000-01-25  Charles Kerr <charles@skywalker.ecn.ou.edu>

	("find" dialog fixes)

	* pan/articlelist.c (find_compare_func): use the article data*
	associated with each row, rather than going to the article-db to
	pull out a new copy of the article data.  Removed the article_db
	from the header_data struct since we no longer need it.

	* pan/articlelist.c (find_next_cb): this would crash if user hadn't
	used the "find" dialog first.  Now, if the user hasn't used the "find"
	dialog first, we pop that dialog up instead of crashing.

	* pan/articlelist.c (find): fixed case sensitivity, which was broken.
	Thanks to Dave Williamson for reporting this bug.

	* pan/articlelist.c (find): 

	(misc bug fixes)

	* pan/util.c (pan_append): small bug fix: if the argument 'old' passed
	in is null, just use an empty string instead during the contatination.

	(cleanup)

	* pan/message-send.c (send_cb): removed unused debug console messages.
	* pan/message-send.c (message_send): same.


2000-01-25  Jason Leach  <leach@wam.umd.edu>

	* po/pl.po: updated translation.  Thanks to Karol Chatkowski.
	
	* pan/message-window.c (create_read_body_pane): resolved a double
	pan_lock() that was causing a freeze when trying to "open in
	window" on messages that needed to be downloaded first.

2000-01-24  Matt Eagleson <e.Messiah@superpimp.org>

	* pan/grouplist.c (grouplist_load_gdata) Killed
	a memory leak: now we free the first unused part of
	the str_split.  Thank 'memprof' for finding this one.

	* pan/servers.c (server_list_load): Call g_strfreev
	on the split data when done.  Also thanks to mem_prof.

	* pan/queue-item_decode.c: (queue_item_decode_run) The
	decode data struct was being malloc'd twice.

	* pan/acache.c (acache_delete): The const char * was being
	modified.

	* pan/decode.c (decode_article): Added a "preparing" message
	like we used to have... Not sure if the placement is right
	though.

2000-01-24  Charles Kerr <charles@skywalker.ecn.ou.edu>

	(bugfixes)

	* pan/queue-item-grouplist.c (queue_item_grouplist_run): the date
	buffer wasn't large enough to leave room for the trailing zero, so
	trailing noise was being written to the ~/.gnome/Pan config file.
	Thanks to David Chambers for reporting this.

	* pan/date.c (generate_date): applied many of Tov are Jacobsen's
	suggestions for this function.  In addition to existing bugfixes,
	Mr. Jacobsen pointed out that son-of-1036 sepcifies English
	abbreviations for the month and day-of-week in the date string.
	Since strftime() localizes these (Man instead of Mon, Okt instead of
	Oct), we now roll our own abbreviations.  Hopefully this will be the
	last time anyone has to think about generate_date()!

	(updates)

	* po/se.po: updated translation.  Thanks to Gunnar Lindholm for doing
	this translation.

	(message filter improvements)

	* pan/message-filter.c: reorganized to layout vertically, rather than
	horizontally, because the dialog was too wide for some screens.
	Also gimped the icons in xpm accordingly.

	* pan/message-filter.c: when changes have been made, now reload the
	articlelist when the user hits "done".

	* pan/message-filter.c (author entry): added descriptive tooltip on
	how to filter out an author who has multiple accounts.

	* pan/articlelist.c: bug fix; the killfile_style wasn't being given
	the correct color.

	* pan/prefs.c: bug fix; the killfile color wasn't being saved when it
	was changed by the user.

2000-01-24  Jason Leach  <leach@wam.umd.edu>

	* pan.spec.in: applied patch from Simon Piette for building
	RPM's on non-x86 archs (patch was on pan.spec, pan.spec.in
	generates the pan.spec though)

	* CREDITS: gave credit to Simon Piette for the above patch

	* pan/text.c: changed the copyright to (C) 1999-2000 for the
	welcome text thing

2000-01-24  Matt Eagleson <e.Messiah@superpimp.org>

	* pan/debug.c (debug): The label for pan object debug messages was
	wrong.  Fixed.
	* pan/sockets.[ch]: Converted the socket object to a PanObject.
	* pan/queue.c: Sync.
	* pan/smtp.c: Sync.

2000-01-24  Jason Leach  <leach@wam.umd.edu>

	* pan/prefs.c (edit_profile_dialog): implemented a "Max
	Connections" spin button box in the prefs to let a user specify
	between 1 and 4 max connections to server.
	
	* pan/server.c (server_fetch):
	(server_list_save): make the max connection prefs spinner work

	* pan/prefs.c (edit_profile_dialog): removed some empty hbox's
	(inialized, packed into something else, but never filled) in the
	prefs profile editor

	* pan/gui.c (gui_about): I thought copyrights were supposed to
	include inception date, i.e. (c) 1999-2000 or so...

2000-01-23  Charles Kerr <charles@skywalker.ecn.ou.edu>

	(Matt said his method for finding thread bugs was easy: select all,
	decode all.  PanObject now works with posting and decoding, and I've
	watched it chug through 550 pictures in a.b.p.fine-art, on a linux
	box, and it's still working. :)
 
	* pan/pan-object.[ch]: added get/set_user_data().

	* pan/message-send.c: tweaked to work with PanObject.
	* pan/queue-item-decode.c: same.

2000-01-23  Charles Kerr <charles@skywalker.ecn.ou.edu>

	* pan/*.[ch]: got the PanObject hierarchy working.  We now have
	objects that don't use GtkSignals!  Thread-safe data objects, what a
	concept.  What works: reference counting, ctors, dtors, virtual
	functions, queue-item, status-item, pan-object, queue-item-headers,
	queue-item-body, queue-item-grouplist.  Haven't tried decode or send
	yet.  What we don't have (and probably won't): RTTI.  Pan is now 1K
	lines smaller.  Matt, Jason: try running with --debug-pan-object.

2000-01-23  Matt Eagleson <e.Messiah@superpimp.org>

	* pan/*.[ch] Committed a little work on removing GtkObjects.

2000-01-23  Matt Eagleson <e.Messiah@superpimp.org>

	* pan/articlelist.c (articlelist_decode_selected_impl):
	Add a check for (adata == NULL)? so we don't crash when
	the root node is included in the selection.
	* pan/util.c (pan_lock): Added multiple lock detection when
	in debug mode... We can probably take this out later, but it
	might be useful for now

2000-01-23  Charles Kerr <charles@skywalker.ecn.ou.edu>

	(misc)

	* configure.in: set version number to 0.7.2.

	(bug fixes)

	* pan/group.c (choose_download_dialog): fix gui lockup that happened
	when pan_lock() was called twice.

	* pan/group.c (group_empty_dialog): same.

	* pan/message-window.c (message_window_close): don't wrap
	message_window_destroy in pan_lock()/pan_unlock(); m_w_d does its own
	locking.  Since this is a callback func, it's somewhat academic.

	* pan/article-db.c (ahdb_get_all): serious deadlock bug fixed.  Since
	both pan_db_foreach (called in loading the articles) and pan_db_erase
	(called in expiring articles) lock the database, the expiring code has
	been moved out of the foreach callback.  Thanks to Sandor Barany
	<S.Barany@infosys.tuwien.ac.at> for reporting this bug.

2000-01-22  Charles Kerr <charles@skywalker.ecn.ou.edu>

	(new functionality)

	* added attribution line configuration to prefs.  It's in the general
	tab for lack of a better place.  (prefs needs a reorg... :)
	Thanks to Maurice Kelly <mkelly@deadheart.org.uk> for suggesting this.

	* pan/pan.c: added command-line-argument "--debug-db"

	* pan/util.c: added new function pan_substitute().

	(article body behavior)

	* pan/message-window.c (create_post_body_pane): use message_body_font.
	* pan/message-window.c (create_read_body_pane): same.

	(bug fixes)

	* pan/articlelist.c (sort_selected_thread): if the articlelist isn't
	active (ie, no my_group variable), don't try to sort.  It'll only end
	in tears.

	* pan/articlelist.c (sort_selected_thread): don't call
	gui_remove_status_item while inside pan_lock(); it needs pan_lock
	itself, so this causes a gui lockup.

	* pan/message-window.c (create_*_pane): fix pan_lock() deadlocks.

	* pan/date.c (generate_date): Valenti Jove <vjove@intercom.es> has
	done some legwork in finding a close-to-son-of-rfc-1036 date format
	that INN will accept.  Apparently we leave off the timezone string and
	add a '+' if we're on the positive side of UTC.

	* pan/article-thread.c (thread_articles):  Sandor Barany
	<S.Barany@infosys.tuwien.ac.at> found a bug that, when the killfile
	filtered out *all* the articles in a group, the thread article code
	would panic at getting an empty list and crash Pan.

	(drudgework)

	* pan/gui.c (about): added pan_lock/unlock calls around gtk work.
	* pan/gui.c (gui_create_appbar): same.
	* pan/gui.c (replace_checkbox): same.
	* pan/gui.c (gui_page_set): same.
	* pan/gui.c (gui_enter_clicked): same.
	* pan/gui.c (gui_restore_column_widths): same.
	* pan/gui.c (gui_popup_draw): same.
	* pan/gui.c (gui_remove_status_item): same.
	* pan/gui.c (showmore_cb): same.

	* pan/debug.[ch]: added DEBUG_DB.
	* pan/pan-db.c (db_open): added debug call.
	* pan/pan-db.c (db_close): same.
	* pan/pan-db.c (db_ref): same.
	* pan/articlelist.c: make sure that current_group_article_db is set
	whenever we set the articlelist's active group.  This cuts down on a
	lot of open/close calls in pan-db.c

2000-01-22  Charles Kerr <charles@skywalker.ecn.ou.edu>

	(more threading problems solved)

	* pan/gui.c (gui_invoke_in_gui_thread): argh, it looks like it's
	possible to deadlock when adding a timeout function to glib from
	another thread.  So we're using pan_lock() from now on; this function
	is history.  Thanks to Matt and Dan for adding debugging eyes to the
	pan_lock() changeover.
	* pan/articlelist.c: use pan_lock instead of gui_invoke_in_gui_thread.
	* pan/group.c: same.
	* pan/grouplist.c: same.
	* pan/gui.c: same.
	* pan/log.c: same.
	* pan/message-send: same.
	* pan/message-window: same.
	* pan/status-item-view: same.
	* pan/text.c: same.
	* pan/util.c: same.

	(articlelist cleanup)

	* pan/articlelist.c (articlelist_get_row_message_id): the article row
	data is now an adata, not just the message id.  This fixes a couple
	of inconsistent article state bugs that we'd had, and also opens the
	way for more complex use of the article state flags -- number of unread
	children, for example.
	* pan/articlelist.c (articlelist_select_and_read_node): same.
	* pan/articlelist.c (articlelist_get_selected_message_id): same.
	* pan/articlelist.c (articlelist_button_press): same.
	* pan/articlelist.c (count_articles): same.
	* pan/articlelist.c (articlelist_selected_decode_impl): same.
	* pan/articlelist.c (articlelist_get_node_from_message_id): same.
	* pan/articlelist.c (articlelist_update_node): same.
	* pan/articlelist.c (articlelist_get_relative_article): new func.
	* pan/gui-paned.c (gui_paned_enter_clicked): use
	alist_get_selected_message_id() instead of peeking at the article list
	nodes directly.

	* pan/articlelist.c: (articlelist_read_next_unread): use adata
	"STATE_READ" check rather than looking at ctree node's style
	* pan/articlelist.c: (articlelist_read_prev_unread): same.
	* pan/articlelist.c: (articlelist_read_next_unread): fix infinite loop
	that occurred when all the articles in a group were unread.
	Thanks to Maurice Kelly <mkelly@deadheart.org.uk> for reporting this.
	* pan/articlelist.c: (articlelist_read_prev_unread): same.

2000-01-21  Matt Eagleson <e.Messiah@superpimp.org>

	* pan/acache.[ch]: reworked acache so that the STATE_KEEP
	flag has become obsolete.  We now keep a hash of "file_in_use"
	that we ignore when expiring articles.
	* pan/decode.c: removed some unnecessary data duplications and
	cleanup up a few things
	* pan/queue-item-decode.c: synced with above

2000-01-20  Charles Kerr <charles@skywalker.ecn.ou.edu>

	(the article toolbar now works -- you can sort ascending/descending,
	and filter out articles just like the group toolbar filters groups.)

	* pan/articlelist.c (sort_selected_thread): new func.
	* pan/articlelist.c (sort_selected_describe): new func.
	* pan/articlelist.c (sort_selected_cb): new func.
	* pan/articlelist.c (article_filter_cb): new func.
	* pan/articlelist.c (articlelist_create_toolbar): new func.
	* pan/articlelist.c: reworked the sorting to tie in the sort

	* pan/pan-callback.[ch]: new module to be used instead of Gtk signals.
	Gtk signals aren't threadsafe, and there's no indication when they
	will be.  The new module's top goals are code simplicity and thread
	safety.

2000-01-19  Charles Kerr <charles@skywalker.ecn.ou.edu>

	* pan/articlelist.c, pan/article-thread.c: started work on making
	article reading more netscape-like or agent-like.  Now we unthread
	the articles when sorting by loc, author, or date, and rethread in
	thread mode.  A side-effect is that sorting is faster now.

2000-01-15  Matt Eagleson <e.Messiah@superpimp.org>

	* pan/prefs.c (prefs_init): Set the TMPDIR environment
	variable here, base on the user's settings.  This way
	we don't have to bring the gnome stuff into uulib (messy, messy)
	and it will still use the right directory.
	* uulib/uunconc.c (UUDecode): Removed gnome stuff, this wasn't
	even compiling properly for me.

2000-01-15  Jason Leach  <leach@wam.umd.edu>

	* uulib/uunconc.c (UUDecode): fix for the uulib putting decodes
	into /tmp, now uses Pan's preferences setting (tmp_dir), please
	test this out.
	* CREDITS: thanks to Wendell Dingus
	<wendell@PrecisionLaserdisc.com> for spotting this bug.

2000-01-14  Jason Leach  <leach@wam.umd.edu>

	* NEWS: updated to list translation stuff and the bug fix below,
	ignore the 0.7.2 release date, I just made it up :)
	
	* pan/prefs.c (prefs_apply): fixed bug with directory preferences
	not actually getting set (prefs_apply() was saving them to
	/Pan/User/blah_dir instead of /Pan/Paths/blah_dir)
	* CREDITS: thanks to rapid@rapid.erols.com for reporting this bug.
	
	* po/se.po: swedish translation, thanks to Gunnar Lindholm for
	sending it in.
	* CREDITS: gave credit to Gunnar for this contribution.

	* po/da.po: replaced with updated translation file
	* po/ko.po: same
	* po/pl.po: same
	
	* README: version said 0.7.0, changed it to 0.7.2

	* configure.in: updated for version 0.7.2 and to add in Swedish
	language support

2000-01-13  Matt Eagleson <e.Messiah@superpimp.org>

	* pan/articlelist.c (find_article): Now we correctly
	call articlelist_set_selected_node, so that we select
	found articles without automatically downloading them.

2000-01-12  Charles Kerr <charles@skywalker.ecn.ou.edu>

	Pan 0.7.1 released.

2000-01-12  Matt Eagleson <e.Messiah@superpimp.org>
	
	* pan/articlelist.c (articlelist_update): Moved a mutex_lock
	to try and stop a race condition/deadlock I was seeing during 
	articlelist update.
	* pan/grouplist.c (grouplist_get_all): Fixed a silly bug where !=
	should have been ==
	* pan/grouplist.c (grouplist_get_new): Same.
	* pan/prefs.c (edit_profile_dialog_clicked): Make sure max_connections
	is set when new servers are created.

2000-01-12  Charles Kerr <charles@skywalker.ecn.ou.edu>

	* pan/print.c (print_dialog): bug fix: Pan would crash if you were
	printing an article from the main window, rather than from a popup
	window.

	* pan/print.c (print_execute): small memory leak fixed -- the print
	command wasn't being g_free()d if an error occurred during printing.

2000-01-11  Matt Eagleson <e.Messiah@superpimp.org>

	* pan/prefs.c (prefs_servers_changed):  Fixed a bug where changed
	passwords would be free'd before use.
	* pan/prefs.c (one_click_preview_cbutton_toggled): Apply now becomes
	sensitive when toggled.
	* pan/prefs.c (prefs_general_page): Online prompt button removed.
	* pan/prefs.c: Made each server profile dialog have its own independent
	structure, so more than one can be used.  Needs testing.

2000-01-11  Charles Kerr <charles@skywalker.ecn.ou.edu>

	* pan/articlelist.c (find_article): added a g_return_if_fail to fail
	gracefully when the user pulls up the "find" dialog and there are no
	articles yet in the articlelist.  The real answer is to grey out the
	"find" menu item until we have an articlelist loaded -- but then, you
	could say the same for other menu items too.  I'd rather not make big
	changes like that for a bugfix release, reworking the menus in that way
	will have to wait.  Thank to lol <lol@worldonline.fr> for reporting
	this bug.

	* pan/acache.c (acache_expire_all): even expire the 'k' files.  This
	is intended to be used for clearing out Pan's cache when the user
	exits Pan.

2000-01-11  Charles Kerr <charles@skywalker.ecn.ou.edu>

	* pan/gui.[ch] (gui_popup_draw): add "parent" argument to this function
	so that dialogs can be made transient to that parent.  For example, this
	lets the "No groups for this server.  Get them?"  dialog pop up _on top
	of_ the main window, rather than getting lost underneath.  Thanks to
	Martin Brown <mjbjr@beaudesign.com> for suggesting this.
	* pan/articlelist.c (articlelist_find_text_cb): sync.
	* pan/group-props.c (group_props_spawn): sync.
	* pan/group.c (choose_download_dialog_mainthread): sync.
	* pan/group.c (group_empty_dialog_mainthread): sync.
	* pan/prefs.c (prefs_spawn): sync.

	* pan/server.c (server_init): if there's not a current server in the
	config file, but the list of servers is non-empty, just pick the first
	server.  Thanks to Ben Pregont <lep@dwave.net> for being the first (of
	many) to report this bug.

	* pan/articlelist (menu): sync the reply/followup menu with the text
	window popup and the main menu.  Accidentally it had the old
	terminology and was trying to followup no matter which button you
	pressed.  Thanks to Jonathan Moran <moranjon@pilot.msu.edu> for
	reporting this bug.

	* pan/gui.c (gui_page_change): fixed null-pointer-dereference bug when
	the user got click-happy.

	* pan/grouplist.c (grouplist_get_current_group): new function.

	* pan/gui.c (gui_page_change): bug fix: hitting return on a selected
	group did switch the pane to the article pane, but it didn't load the
	articles for that group.  thanks to arkimage@jedimail.net for reporting
	this bug.

2000-01-10  Matt Eagleson <e.Messiah@superpimp.org>

	* pan/decode.c (decode_open): Stopped free memory
	we didn't malloc.
	* pan/decode.c (decode_article): Set the progress bar
	to 0 before displaying status message, and moved open
	of attachments outside of the uulib lock

	* pan/server.c (server_menu_update): Now when updating
	the menu we pay mind to what the current server is, and
	set it back if necessary.  Removed redundant and broken
	last server check.
	* pan/druid.c (druid_finish): Set the (last used) server
	state ahead of time, so the fresh new server gets picked
	when we finish init.
	* pan/server.c (server_init/shutdown): Changed the name
	of the server state for the hell of it.

	* pan/grouplist.c (grouplist_server_selected): Moved the
	setting of my_server here, where it belongs.  We now
	clear the clist immediately when the server changes so that
	we won't have the wrong list displayed if the user backs out
	of the list download.
	
2000-01-10  Charles Kerr <charles@skywalker.ecn.ou.edu>

	Pan 0.7.0 released.

2000-01-10  Charles Kerr <charles@skywalker.ecn.ou.edu>

	(bug fix)

	* pan/server.c (server_menu_update): wasn't activating the menu item
	when I blew away my .pan and .gnome/Pan and ran from scratch.  This
	caused the group not to load initially.

	(ui tweak)

	* pan/queue-item-grouplist.c (queue_item_grouplist_run): emit a status
	event right off the bat so that we get instant feedback in the status
	view.


2000-01-10  Charles Kerr <charles@skywalker.ecn.ou.edu>

	(more ui lockup tests)

	* pan/util.c (is_gui_thread): new function for testing to make sure
	we're in the gui thread.  This should be called before doing any gtk
	work.
	* pan/articlelist.c (articlelist_unselect_all): added
	g_assert(is_gui_thread)).
	* pan/articlelist.c (articlelist_set_selected_node): same.
	* pan/articlelist.c (articlelist_read_next_article): same.
	* pan/articlelist.c (articlelist_read_next_unread_article): same.
	* pan/articlelist.c (articlelist_read_next_thread): same.
	* pan/articlelist.c (articlelist_read_prev_article): same.
	* pan/articlelist.c (articlelist_read_prev_unread_article): same.
	* pan/articlelist.c (articlelist_read_prev_thread): same.
	* pan/articlelist.c (articlelist_get_previous_article): same.
	* pan/articlelist.c (find_dialog_destroy_cb): same.
	* pan/articlelist.c (find_article): same.
	* pan/articlelist.c (find_dialog_clicked_cb): same.
	* pan/articlelist.c (articlelist_find_text_cb): same.
	* pan/articlelist.c (articlelist_clear_mainthread): same.
	* pan/articlelist.c (articlelist_mark_read): same.
	* pan/articlelist.c (articlelist_selected_mark_unread): same.
	* pan/articlelist.c (articlelist_selected_decode_impl): same.
	* pan/articlelist.c (articlelist_set_node_style): same.
	* pan/articlelist.c (add_article_to_ctree): same.
	* pan/articlelist.c (build_article_ctree_recursive): same.
	* pan/articlelist.c (add_nodes): same.
	* pan/articlelist.c (clear_and_build_root_node): same.
	* pan/articlelist.c (articlelist_update_node_fast_mainthread): same.
	* pan/articlelist.c (articlelist_sort_init): same.
	* pan/articlelist.c (articlelist_sort): same.
	* pan/articlelist.c (articlelist_click_column): same.
	* pan/articlelist.c (article_ctree_destroy_cb): same.
	* pan/articlelist.c (create_articlelist_ctree): same.
	* pan/grouplist.c (grouplist_button_press): same.
	* pan/grouplist.c (grouplist_mode_menu_create): same.
	* pan/grouplist.c (grouplist_add_group): same.
	* pan/grouplist.c (grouplist_update_row_mainthread): same.
	* pan/text.c (text_select_all_mainthread): same
	* pan/text.c (realize_text_cb): same
	* pan/text.c (text_button_press): same
	* pan/text.c (text_create): same

	(articlelist: cleanup)

	* pan/articlelist.c (articlelist_selected_print): commented out unused
	function.
	* pan/articlelist.c (clear_and_build_root_node): moved call to
	article_sort_init() to here because this function is invoked in the
	gui thread.

	(grouplist: faster loading of groups; mainthread trick; better update
	of changes in selected rows)

	* pan/grouplist.c (click_groups_column_cb): commented out unused
	function.
	* pan/grouplist.c (grouplist_process_selected): update the selected
	rows after processing the user command.  This will, for example, update
	the subscribed icon colum to show/not show after subscribe/unsubscribe.
	* pan/grouplist.c (grouplist_select_all): use _mainthread trick.
	* pan/grouplist.c (grouplist_add_group): removed slug I added last
	night where the first two column's texts were set twice, when only
	once was needed.
	* pan/grouplist.c (gropulist_update_selected_rows): new function for
	updating the currently-selected rows.

	(message-window: menu cleanup)

	* pan/message-window.c (menu): reply/followup terminology synced with
	main menu terminology
	* pan/message-window.c (message_reply_window): bugfix: msg->type was
	being set to NNTP_REPLY, rather than EMAIL_REPLY.  My bad.
	* pan/message-send.c (check_from_syntax): commented out unused function.
	* pan/message-send.c (check_newsgroups_syntax): same.
	* pan/message-send.c (check_email_rcpts_syntax): same.
	* pan/message-send.c (check_nntp_rcpts_syntax): same.

	(text: popup menu cleanup; _mainthread trick)

	* pan/text.c (text_menu_popup): commented out "not implemented"
	features.
	* pan/text.c (text_menu_popup): sync reply/followup terminology with
	main menu terminology
	* pan/text.c (text_select_all): use _mainthread trick

2000-01-09  Charles Kerr <charles@skywalker.ecn.ou.edu>

	(ui changes)

	* pan/gui.c (gui_set_queue_size_mainthread): changed "Items Queued: %d"
	to the more Agent-like "Tasks:  %2d"
	* pan/gui.c (menu): commented out "queue manager" menu item because
	it's not done yet.
	* pan/gui.c (menu): added hotkeys for "Post to Newsgroup", "Followup
	to Newsgroup", and "Reply by e-mail".

	(threading changes)

	* pan/articlelist.c (articlelist_clear): remove use of pan_lock().
	* pan/articlelist.c (articlelist_clear): add gui_set_title(NULL);

	* pan_lock is almost completely unused now; I've confirmed that gimp
	and gtk at times use the _mainthread trick, and I added some debugging
	checks to the _mainthread trick -- this looks to be a fair way of
	routing gui calls to the main thread.  (And it also gives us a single
	API whose implementation to rewrite if we're wrong)

	(bug fixes)

	* pan/acache.c (acache_open_something): was crapping out when the
	message id had a '/' in it.  Replace all / and \ with _ now...
	* pan/acache.c (acache_delete): same
	* pan/acache.c (acache_get_existing_filename): same.

2000-01-09  Charles Kerr <charles@skywalker.ecn.ou.edu>

	(grouplist ui changes)

	* added a prototype for a new look for grouplist.  Basically the
	server selector, group mode selector, and find entry are in a toolbar.
	Advantages: (1) all the grouplist navigation is gathered together.
	(2) In paned mode, you can drag the pane over to give the articles
	more space.  Group navigation is still easy even if you don't have
	much space allocated to the group. (3) more intuitive than clicking
	on the column to switch from all/new/sub.  (4) solves the problem
	of the optionmenus not being tall enough. (5) grouplist/articlelist/
	text widgets all line up nicely.  Check it out and see if you like
	it too... hopefully you will...

	* added a "subscribed" icon for subscribed groups; it's a 16x16
	envelope.  Added small columns in the clist for subscribed and cached
	icons so that things line up nicely.

	(gui_invoke_in_gui_thread cleanup)

	* pan/gui.c (gui_invoke_in_gui_thread): simplified this a great deal;
	now we don't need to invoke the "invoke" method anymore or new/free
	the internal struct.
	* pan/gui.c (invokeme): removed unused function.

	(berkeley db threadsafety?)

	* pan/pan-db.c (private pan_db struct): It appears that bdb isn't
	completely threadsafe without explicitly telling bdb to initialize in
	a threaded way, and those APIs aren't in the db 1.85 headers.  Or I
	may be misunderstanding this.  To be on the safe side, I've added a
	mutex to this struct, for the access functions to use.
	* pan/pan-db.c (pan_db_foreach): lock the db with the mutex during the
	foreach.
	* pan/pan-db.c (pan_db_put_string_value): lock the db with the mutex
	during the add.
	* pan/pan-db.c (pan_db_get_string_value): lock the db with the mutex
	during the get.
	* pan/pan-db.c (pan_db_erase_value): lock the db with the mutex during
	the erase.

	(grouplist speedups)

	* pan/grouplist.c (grouplist_save_list): new function that saves the
	specified groups back to the grouplist database.
	* pan/grouplist.c (grouplist_save): now just calls
	grouplist_save_list.
	* pan/grouplist.c (grouplist_save_selected): new function to allow us
	to just save the selected groups, after a subscribe/unsubscribe order.
	Previously we were saving back the entire list, which could be quite
	large.

	(misc)

	* pan/queue.c (queue_run): call pthread_close() when done, even though
	the man pages say it's not necessary.

	* pan/grouplist.c (grouplist_load): got rid of the second thread that
	did the loading; the win of loading the grouplist outside of the gui
	thread isn't worth the extra complexity.

	* pan/queue-item-decode.c (class): rather than reffing the article_db
	every time we need it, ref it once in the ctor and unref it in the
	dtor.  This saves a lot of open db/close db overhead!

2000-01-08  Matt Eagleson <e.Messiah@superpimp.org>

	* pan/decode.c (nntp_article_decode): Now we properly unref the ahdb
	in the case of a non-existant header.
	
	* pan/server.c (server_fetch): Added code to make sure the server's
	directory exists.

	* pan/*.[ch]: Copyright notice changed to "Pan Development Team" so
	nobody gets undue credit. ;)
	* pan/text.c: Welcome message changed as well.

2000-01-08  Charles Kerr <charles@skywalker.ecn.ou.edu>

	(PR work)

	* submitted Pan to Yahoo's pages and to the Linux Software Map.

	(new cache features: flush cashe, set cache size, optionally flush
	cache when Pan exits)

	* pan/acache.c (acache_expire_to_size): new function that does what
	acache_expire used to do, except it takes the max_size value as a
	function argument.
	* pan/acache.c (acache_expire): now calls acache_expire_to_size()
	under the hood.
	* pan/acache.c (acache_expire_all): new function to allow user to flush
	the cache.  Thanks to Bill Piety <wfromoz@bellsouth.net> for
	(unknowingly) inspiring this by commenting in alt.linux about the lack
	of such a feature.
	* pan/prefs.c: added "Cache" tab where the user can specify how big
	the cache can be, and added a "clear cache" button.  Also allows user
	to say whether or not the cache should be flushed on exit.  Thanks
	again to Mr. Piety.

	(resources cleanup)

	* pan/message-window.c (update_body_pane): only allocate the "quoted
	text" color once, rather than every time called.
	* pan/message-window.c (create_post_body_pane): share the "quoted text"
	color that update_body_pane uses, rather than creating its own every
	time called.
	* pan/message-window.c (create_read_body_pane): same.

	* pan/message-window.c (create_read_body_pane): same.
	* pan/message-window.c (create_post_body_pane): same.

	* pan/message-window.c (create_read_body_pane): removed some
	unreachable code.

	(misc)

	* pan/prefs.c (update): after updating all the cache entries, call
	gnome_config_sync() before calling init_prefs() again.  We want those
	changes to be committed before we reload.

	* pan/message-window.c (menu): changed "exit" to "close", since it only
	closes that window and not the whole Pan app.

	* pan/message-window.c (message_window_update): #if 0'ed unused func.
	* pan/message-window.c (message_window_open_cb): same.
	* pan/message-window.c (update_body_pane): strip \r's from from
	articles before desplaying them; some fonts show \r as a "C/R" which
	is distracting.  Thanks to Barrie Spence <baz@sqf.hp.com> for
	suggesting this.

	* TODO: updated the gnksa checklist yet again.
	* NEWS: fixed a couple of syntax errors.

2000-01-07  Charles Kerr <charles@skywalker.ecn.ou.edu>

	* changed the version number from pan 0.7.0-beta-1 to 0.7.0.

	* pan/status-item-view.c (shorten_lines): reduced the maximum length
	from 50 characters to 35 characters.  This seems to leesen the number
	of resizes that pan generates when a queue is running through a large
	number of QueueItems.  Still not sure how to have the queue-item-view
	hbox say, "don't allow this to resize as the result of children being
	added/removed".  We may have to subclass to do it; there doesn't seem
	to be a standard way to tell the children "no" during size negotiation.

	* pan/gui-paned.c (gui_paned_enter_clicked): don't dump core if user
	clicks but there's no selected item.

	* pan/message-window.c (create_post_body_pane): follow gnksa
	recommendations for quoting original articles: "> " for newly-quoted
	material, ">" for old nested quoted material.

	* pan/message-window.c (create_post_body_pane): quote the message body
	for smtp replies, not just nntp replies.

	* pan/message-send.c (check_body): warn against messages that consist
	mostly of quotes; refuse to send message that consist entirely of
	quotes.

	* pan/message-send.c (send_done_cb): removed old debugging statements.
	* pan/articlelist.c (articlelist_update_node_fast_mainthread): same.

	* pan/grouplist.c (process_selected): typo fix: == should have been =.
	If nothing selected in the grouplist, we check the article list to see
	if it has a current group.  That way if we've got a group loaded, but
	nothing's selected in the grouplist, "get new headers" will do the
	right thing.

	* pan/article-thread.c (pp_adata_multipart_comp): fixed bug that was
	making articles be sorted based on the upper- or lower- case state of
	the first character in the subject.  Comparisons should be case
	insensitive.

	* pan/prefs.c (prefs_apply): if user didn't enter anything for smtp
	server, or smtp port, or data directory, or download directory or
	temp directory, then clear out that entry.  Previously "" was set as
	the key, which was frustrating -- I ran through the prefs dialog and
	then found that my smtp server was "" instead of "localhost". :)

	* pan/gui.c (menus): moved "Preferences" under edit, which is where
	one would expect it to be.

	* pan/log.c (log_update): removed unused function.
	* pan/log.c (remove_crlf): same.
	* pan/log.c (cut, paste, copy): removed; this doesn't make sense for a
	log function, and didn't work anyway because it was never updated from
	a gtk_text to a gtk_clist.

	* NEWS: updated pan 0.7.0's entry to show the new features in 0.7.0.

2000-01-06  Charles Kerr <charles@skywalker.ecn.ou.edu>

	(queue: the status views at the bottom of the window do tooltips now.
	status-item got a new utility function.  yawn.)

	* pan/status-item-view.c (status_item_view_new): use an eventbox
	underneath the progress bar; set the eventbox's tooltip instead of
	the progress bar's.

	* pan/status-item.c (status_item_emit_done): new utility function.

	(email/posting: This is the bulk of the changes.
	 + thorough smtp module cleanup including support for StatusItems
	 + better support for smtp vs. nntp recipients
	 + followup-to: poster now works
	 + better handling of reporting success/failure to the user
	 + send button is made insensitive while the send is queued.)

	* pan/queue-item-send.[ch]: new queue-item subclass that delegates
	its work off to message-send's "send_message" method.
	* pan/gui.c (menu): the "post reply on the news server" command now
	calls message_followup_window() instead of message_reply_window().
	* pan/message-send.c (check_body): upgraded empty messages from
	WARN to REFUSE as per gnksa suggestion.
	* pan/message-send.c (send_done_cb_mainthread): new function to
	mop up after the send message has gone through the queue.
	This pops up an error dialog if the send failed; otherwise, it
	pops up an ok dialog to say the message was sent.  If the send
	succeeded, the window is destroyed.  Otherwise, we just re-enable
	the "send" button to let the user fix & try again.
	* pan/message-send.c (send_done_cb): same.
	* pan/send-cb.c (send_cb): set the "send" button insensitive when
	the send has been queued.  Add callbacks to send_done_cb when the
	action has been run.
	* pan/send-message.c (message_send): added support for pulling email
	addresses and usenet group names from two different entry fields.
	the differing fields is to reduce confusion; a typo to add or remove
	a @ from a "to:" entry could send the message to a very wrong place
	w/o warning
	* pan/message-window.c (create_post_info_pane): added "users" entry
	field.
	* pan/message-window.c (create_post_info_pane): added support for
	"followup-to", smart support for smtp vs. nntp in deciding what groups
	and/or mail addresses should go to the newsgroups and users entry
	fields.
	* pan/message-window.c (message-followoup-window): new function for
	users replying to a post via email.
	* pan/message-window.c (message_window_new_mainthread): new function
	that does what message_window_new used to do.
	* pan/message-window.c (message_window_new): do the _mainthread trick
	to ensure that the gtk widgetry gets created in the main thread.k
	* pan/smtp.c (all): massive cleanup.  Now uses the StatusItem to emit
	status/errors.  I like this way of giving feedback; smtp is cleaner
	than the nntp module.
	* pan/smtp.c (send): no longer shortening long lines.  This will go
	back in after a prefs option is added to turn it off.

	(log changes: gui lockup fix; "pan started" logged on startup)

	* pan/log.c (log_add_mainthread): new function.
	* pan/log.c (log_add): delegate the work out to log_add_mainthread
	to avoid gui lockups.
	* pan/log.c (clist): since column 0 is so small, it's now the time
	column.
	* pan/pan.c (pan_init): send "Pan Started." to the log.

	(started to put in an icon to denote that a read message has unread
	messages underneath it, but it's mostly commented out)

	* pan/article-thread.c (thread_articles): part of a first cut on
	STATE_UNREAD_CHILDREN.
	* pan/article.h (state enum): added "STATE_UNREAD_CHILDREN".
	* pan/xpm/unread_children.xpm: new pixmap file.
	* pan/article.c: sync.

	(misc)

	* pan/sockets.c (sock_readline): better debugging info to the
	--debug-socket-input routines.

	* pan/text.c (text_set_from_message_id): added more sanity checks
	at the start of the function.

2000-01-06  Matt Eagleson <e.Messiah@superpimp.org>

	* pan/decode.c (decode_article): Fixed a bug where a file
	load error wouldn't give up the mutex.  Also deleted a
	redundant error popup.

2000-01-05  Charles Kerr <charles@skywalker.ecn.ou.edu>

	(message changes)

	* pan/message-send.c (check_body): updated to allow different
	goodness levels: okay, warn, and refuse.
	* pan/message-send.c (check_subject): new function like check_body.
	* pan/message-send.c (send_cb): call check_body and check_subject.

	(ui changes)

	* pan/gui.c (gui_set_queue_size_mainthread): new function.  Now the
	"items queued" label on the lower left is live.
	* pan/gui.c (gui_set_queue_size): same.
	* pan/gui.c (menu): made the followup/post/mail commands more "clear"
	as per gnksa suggestions
	* pan/gui.c (menu): commented out the not_implemented menu items

	(bugfixes)

	* pan/status-item-view.c: cleaned up reference counting bugs.

	* pan/article.c (article_copy): bugfix: state wasn't being copied.

	* pan/articlelist.c (articlelist_node_update_fast): this was sometimes
	being called outside of the main thread.  Now we use the _mainthread
	trick to ensure this is called inside the main thread.  Thanks to
	Phil Groce <phil@pglaptop2.cmcsmart.com> for reporting this bug.

	(misc cleanup)

	* pan/date.[ch]: made its macros/#defines private to date.c

	* pan/pan.h: removed some of the all-encompassing #includes to try to
	get the header dependencies knocked down some.

	* pan/gui.[ch] (gui_create_appbar): made function private to gui.c.
	* pan/grouplist.[ch] (grouplist_button_press): made function private to
	grouplist.c.
	* pan/grouplist.[ch] (grouplist_select_row): same.
	* pan/grouplist.[ch] (disk_pixmap): made field private to grouplist.c.

	* pan/gui.h: added API documentation.
	* pan/util.h: same.

	* pan/util.[ch] (Pan_strtrim): removed unused function.
	* pan/util.[ch] (Pan_strbrk): same.
	* pan/util.[ch] (make_string_from_list): same.
	* pan/util.[ch] (String_Split): same.

	* TODO: updated gnksa checklist

2000-01-04  Matt Eagleson <e.Messiah@superpimp.org>

	* pan/queue-item-grouplist.c (nntp_grouplist_download_all): Removed
	activity steps since they don't appear to work with internal progress
	labels.  The count will suffice I suppose...

2000-01-04  Matt Eagleson <e.Messiah@superpimp.org>

	* pan/pan.c (session_die): Made sure pan_shutdown gets called.

	* pan/server.c (server_init): Added automatic selection of the
	last server used.
	* pan/server.c (server_shutdown): Save the last server used.

2000-01-04  Charles Kerr <charles@skywalker.ecn.ou.edu>

	* pan/queue-item-headers.c (queue_item_headers_run): bug fix: was
	emiting the wrong number of steps in status_item_emit_steps() when
	the group == the current group.

	* pan/util.c (pan_error_dialog_mainthread): added new private utility
	function so that pan_error_dialog() no longer requires a pan_lock().

	* pan/nntp.h (network_error): this was functionally the same as
	pan_error_dialog, so it's been removed.
	* pan/nntp.c: sync.

	* pan/gui.c (gui_clean): removed unused func.
	* pan/gui.h (gui_clean): same.
	* pan/gui.c (gui_set_status_default): removed unused func.
	* pan/gui.h (gui_set_status_default): same.
	* pan/gui.c (gui_set_status): removed unused func.
	* pan/gui.h (gui_set_status): same.
	* pan/gui.c (gui_set_status_va): removed unused func.
	* pan/gui.h (gui_set_status_va): same.
	* pan/gui.c (gui_set_progress): removed unused func.
	* pan/gui.h (gui_set_progress): same.
	* pan/gui.c (gui_set_progress_activity): removed unused func.
	* pan/gui.h (gui_set_progress_activity): same.
	* pan/gui.c (gui_progress_init_steps): removed unused func.
	* pan/gui.h (gui_progress_init_steps): same.
	* pan/gui.c (gui_progress_next_step): removed unused func.
	* pan/gui.h (gui_progress_next_step): same.
	* pan/gui.c (gui_progress_next_step_gfunc): removed unused func.
	* pan/gui.h (gui_progress_next_step_gfunc): same.

2000-01-04  Charles Kerr <charles@skywalker.ecn.ou.edu>

	(Added a superclass "StatusItem" to "QueueItem".  This is just a
	generic class that emits the status/progress signals; it wouldn't
	need to be a QueueItem; it could be something else.  This seems to
	be the way to go so that we don't couple the rest of pan too tightly
	to the Queue.)

	* pan/article-thread.c (thread_articles): use StatusItem, not QueueItem.
	* pan/article-thread.h (thread_articles): same.
	* pan/articlelist.c (articlelist_set_contents): same.
	* pan/articlelist.c (articlelist_update): same.
	* pan/articlelist.c (build_article_ctree_recursive): same.
	* pan/articlelist.c (killfile_articles): same.
	* pan/articlelist.h (articlelist_load): same.
	* pan/articlelist.c (articlelist_load): same.
	* pan/articlelist.h (articlelist_set_contents): same.
	* pan/articlelist.c (articlelist_set_contents): same.
	* pan/decode.h (decode_data): same.

	* pan/status-item.[ch]: new class.
	* pan/queue-item-*.[ch]: sync.

2000-01-03  Matt Eagleson <e.Messiah@superpimp.org>

	* pan/decode.c (decode_article): Simplified decoding
	by removing the queue and using a single mutex to lock
	the uulib library.  No each decode happens in it's own
	queue-item thread.  This was done to facilitate easy
	progress updates with the new multiple bar method.
	* pan/queue-item-decode.c: Sync.

2000-01-03  Charles Kerr <charles@skywalker.ecn.ou.edu>

	* pan/decode.c (decode_processing): fixed another race condition where
	the queue condition could be raised while the decode thread wasn't
	listening for it.  The decode thread is a little smarter now; it gets
	the queue lock, then *checks to see if the queue is empty* before it
	goes to sleep waiting for a queue condition to be raised.

2000-01-03  Matt Eagleson <e.Messiah@superpimp.org>
	
	* pan/decode.c (decode_processing): Added proper locking
	before signaling the ready for business condition.

2000-01-03  Matt Eagleson <e.Messiah@superpimp.org>
	
	* pan/grouplist.c: Reactivated grouplist_get_all and grouplist_get_new
	that operate on the currently selected servers.
	* pan/group.c: Removed broken counterpart to the two above functions.
	* pan/gui.c: Updated the menu to call the proper to functions.
	
	* pan/group.c: (group_empty): Tweaked this so it will work again, and
	modified it so it will clear the articlelist if the displayed group
	is empty.
	* pan/group.c: (group_unload): Removed this unnecessary function. 

	* pan/articlelist.c (articlelist_clear): We now clear the local
	state when the articlelist is cleared.

	* pan/text.[ch] (text_set_from_message_id): This function now requires
	a server_data and group_data argument to enter into the Message struct

	* pan/message.[ch] (message_new): This function now takes a server_data
	and group_data argument and stores them in the struct.
	
2000-01-03  Charles Kerr <charles@skywalker.ecn.ou.edu>

	* pan/gui.c: new toolbar for the multiple thread code.  This doesn't
	work quite right yet, but it does look better than what we had before.

	* pan/queue-item-view.c: dump the "description" label and make it a
	tooltip instead.

2000-01-03  Charles Kerr <charles@skywalker.ecn.ou.edu>

	* configure.in: changed version number to "0.7.0-beta-1" and
	tentatively set the release date for January 10.  (Matt, Jason?)

	* pan/article-thread (thread_articles): yesterday's bug fix uncovered
	part two of the bug, which is that MULTIPART_ALL messages were getting
	incorrectly flagged as MULTIPART_SOME (and thus showed up with the red
	jigsaw icon).  Fixed.

	* pan/queue-item-decode.c (nntp_article_decode): make the progress bar
	go from 0 to 100% just once, rather than going from 0 to 100% for each
	part of a multipart message.

	* pan/queue-item-decode.c (nntp_article_decode): check the article
	cache to see if we already have the article/part that we need before
	downloading it.

	* pan/queue-item-decode.c (decode_data_free): only remove the acache
	files if the decode was successful.  This way if a piece is missing
	we can go back and rerun the decode without having to pull down all
	the pieces again. 

	* pan/decode.c (article_decode): fixed race condition when the decode
	thread is being created -- it was possible for the "tell-decode-thread-
	to-decode-this-message" condition could be signalled before the decode
	thread was listening for it.

	* pan/text.c (text_update): turned off text_update so that until the
	FIXME items from Matt's rewrite get filled into place, at least I'll
	stop crashing pan by accident. :)

	* pan/queue-item-headers (nntp_articlelist_download): cleaned up the
	article-loading code.  This eliminates some duplicate code and fixes
	an infinite loop bug that occurred when corrupt article data was loaded
	from the server.  Thanks to David Chambers <davidc@ccmi.salk.edu> for
	reporting (and tracking down!) this bug.

2000-01-02  Charles Kerr <charles@skywalker.ecn.ou.edu>

	* pan/article-thread (thread_articles): Bug fix: multipart messages
	were showing up as complete even when the final part was missing.
       	Thanks to Wendell Dingus <wendell@arkimage.ods.org> for reporting this
	bug.

2000-01-01  Charles Kerr <charles@skywalker.ecn.ou.edu>

	(summary: added group descriptions to grouplist.db and the group clist;
	replaced librx with fnmatch, which is more wildmat-like;
	got the Date: field up to spec with son-of-1036 (including time zones))

	* pan/fmnatch.[ch]: added new functions (GPLed code from GNU tar)
	* pan/grouplist.c: replace use of regexp with fnmatch.
	* pan/articlelist.c: same.
	* pan/message-filter.c: same.

	* pan/group.h (group_data): added description field.
	* pan/group.c (group_copy): same.
	* pan/group.c (group_free): same.
	* pan/grouplist.c (save): same.
	* pan/grouplist.c (load): same.
	* pan/grouplist.c (add_row): same.
	* pan/grouplist.c (update_row): same.

	* pan/group.c (group_free): memory leak fixed: free the name field.

	* pan/date.c (generate_date): updated this function to conform to
	son-of-1036, not just in the four-digit date, but also in the 
	numerical timezone offset.  Thanks to Darricke Rayl
	<drxenon@bellsouth.net> for reporting the y19k bug.

1999-12-30  Charles Kerr <charles@skywalker.ecn.ou.edu>

	* pan/queue-item-view: made this a little nicer on horizontal landscape
	by truncating out the middle of exceptionally long strings.

	* pan/gui.c: made the status hbar look a little nicer.

1999-12-30  Charles Kerr <charles@skywalker.ecn.ou.edu>

	* pan/server.c (server_menu_update): handle activating the
	"Active" server so that the grouplist is loaded and displayed on
	startup.  Also, uglified it for 80 columns.

	* pan/grouplist.c (grouplist_server_selected): small tweaks.

	* pan/sockets.c: added #include <string.h> to make strerror happy.

1999-12-30  Charles Kerr <charles@skywalker.ecn.ou.edu>

	(first cut at multiple statuses in the main window.  This isn't as
	pretty as it needs to be, but it does show multiple statuses at
	the same time.)

	* pan/article-thread.c (thread_articles): use queue_item_* rather than
	gui_* for status/progress feedback.
	* pan/articlelist.c (add_article_to_ctree): same.
	* pan/articlelist.c (articlelist_load): same.
	* pan/queue-item-headers.c (queue_item_headers_run): sync.
	* pan/articlelist.c (articlelist_set_contents): same.
	* pan/articlelist.c (articlelist_update): same.
	* pan/articlelist.c (build_article_ctree_recursive): same.
	* pan/articlelist.c (killfile_articles): same.

	* pan/gui.c (real_contents_vbox): new private variable.
	* pan/gui.c (queue_vbox): same.
	* pan/gui.c (item_view_to_hashtable): same.
	* pan/gui.c (gui_construct): hooks for the queue taskbar
	* pan/gui.c (gui_queue_get_row): new private function.
	* pan/gui.c (gui_queue_add_item): new function.
	* pan/gui.c (gui_queue_remove_item_mainthread): new private function.
	* pan/gui.c (gui_queue_remove_item): new function.

	* pan/prefs.c (prefs_apply): when changing the articlelist fonts,
	rather than calling articlelist_load() directly, use the queue instead
	so that we'll have visual feedback.

	* pan/queue-item-body.c (queue_item_body_run): use the queue_item_emit
	utility functions rather than gtk_signal_emit_by_name.
	* pan/queue-item-headers.c (queue_item_headers_run): same.

	* pan/queue-item-decode.c (readable_name): new class field.
	* pan/queue-item-decode.c (queue_item_decode_new): take readable_name
	as a constructor argument.
	* pan/queue-item-decode.c (queue_item_decode_destroy): free the
	readable_name string.
	* pan/queue-item-decode.c (queue_item_decode_describe): use the
	readable_name in the description.

	* pan/queue-item.c (queue_item_emit_init_steps): new function.

	* pan/queue.c (queue_run): call gui_queue_add_item() before the item
	starts running and gui_queue_remove_item() after it's done running.

	* pan/queue-item-view.[ch]: new files.

1999-12-24  Charles Kerr <charles@skywalker.ecn.ou.edu>

	* pan/queue-item-body.c: if the return code 221 (success), the error
	dialog now says "The article may have expired", since this is usually
	the problem.

	* pan/queue.c (run_what_we_can): be more graceful when we can't get a
	socket connection.  Previously it would crash, which is not very
	graceful.

	* pan/socket.c (pan_socket_new): add lots of g_warnings for the cases
	where we can't get a socket connection successfully.

1999-12-23  Charles Kerr <charles@skywalker.ecn.ou.edu>

	* pan/save.[ch]: added new module for saving articles to text files.
	* pan/gui.c: added "Save As..." menu item under File.

1999-12-23  Charles Kerr <charles@skywalker.ecn.ou.edu>

	* pan/queue-item-grouplist.c (queue_item_grouplist_run): changed the
	two-digit year to a four-digit year for the NEWSGROUPS command;
	ftp://ftp.academ.com/pub/nntp/ietf/nntpext.txt says that four digits
	for the year is legal and the servers I tested prefer it.

	* pan/queue-item-grouplist.[ch]: commented out the grouplist update
	code -- currently we're trashing memory as we free out the group_data*.
	This is unsafe anyway, since those group_data* are being passed around
	to queue and elsewhere... Matt or I need to update this code when Matt
	commits his Pan.servers / Pan.servers.groups code.

	* pan/queue.[ch]: removed queue_add_post and QUEUE_POST code;
	apparently this was unused even before we started hacking up queue.
	Looks like it's been replaced by Jason's nice message-send code.

	* pan/queue.[ch]: removed unused queue_run_grouplist code, since Matt
	added queue-item-grouplist which now does this.

1999-12-23  Charles Kerr <charles@skywalker.ecn.ou.edu>

	* pan/debug.c (debug): added support for debugging the decode thread.
	* pan/pan.c (main): added command-line option for decode debugging.
	* pan/decode.c: added support for debugging the decode thread.
	* pan/decode.c: reworked to have only a single decode thread, rather
	than a number of blocked decode threads.  Now there is a queue of items
	to be decoded; they're handled one-by-one by the single decode thread.

	* pan/articlelist.c (decode_selected): added in some g_return_if_fail
	code to make sure that we don't queue decode items when there's
	nothing in the articlelist.  Not sure how this can happen in the first
	place, it appears to be a race condition on my sluggish remote server.

1999-12-22  Charles Kerr <charles@skywalker.ecn.ou.edu>

	* pan/articlelist.c (articlelist_update): small tweak that really
	lowers the X traffic while populating the articlelist: we collapse
	the top-level node, and only expand it at the very end.  Finally
	loading the articlelist is comfortable when exporting the display out
	over a 56k modem.

1999-12-22  Charles Kerr <charles@skywalker.ecn.ou.edu>

	(queue now watches the server's maximum number of sockets and
	doesn't let you go over; we always save one socket for non-leech
	connections; when a socket is checked in we immediately try to
	allocate it to another item, rather than waiting til the next
	20-second timeout.  queue is working pretty nicely now!)

	* pan/queue.c (queue_qcond_broadcast): new utility function.
	* pan/queue.c (queue_add): debugging info tweaks
	* pan/queue.c (SocketshashtableRecord): new private struct for holding
	sockets and, if the socket isn't idle, the queue-item that's using it.
       	Now we can count the total number of sockets for a server.
	* pan/queue.c (queue_socket_checkout): sync.
	* pan/queue.c (queue_socket_checkin): sync.
	* pan/queue.c (socket_upkeep): sync.
	* pan/queue.c (run_what_we_can): check the current number of sockets
	before allocating another one.
	* pan/queue.c (run_what_we_can): don't let decode items fill up all
	the allowed sockets; make sure we save one non-leech socket out for
	all the other tasks so that we can read articles while leeching.

	* pan/articlelist.c (articlelist_set_contents): we call pan_unlock(),
	then pan_lock(), every so often when populating the articlelist, so
	that the gui thread can update the thermometer.  We now do this less
	frequently, which seems to decrease X traffic.

	* pan/queue-item-body.c (queue_item_body_describe): extra debugging
	information; fixed bug from last checkin: sometimes these messages
	don't have the subject headings loaded, so in the description use the
	message-id instead.

	* pan/queue-item-decode.c (queue_item_decode_describe): small bugfix in
	the description: it was saying it was opening, rather than saving, the
	article even when it wasn't.

	* pan/queue-item.c: removed temporary print statements that got checked
	in by accident last time.

1999-12-22  Charles Kerr <charles@skywalker.ecn.ou.edu>

        * pan/text.c (current_article): wasn't being initialized to zero; when
        we got to article_update() the first time,, random memory was being
        g_freed().

        * pan/text.c (article_update): update the text/headers in the
        gui thread.

	* pan/queue-item*.[ch] (queue_item_run): now returns a status variable,
	zero if successful.

	* pan/queue-item*.[ch] (queue_item_run): added description field.  This
	now shows up in --debug-queue mode; the queue manager can also use it.

	* pan/sockets.[ch] (pan_socket_getline): made the call more convenient.

1999-12-21  Charles Kerr <charles@skywalker.ecn.ou.edu>

	* pan/queue-item.[ch]: changed authorship to include all three of us.
	* pan/queue-item-header.[ch]: same.
	* pan/queue-item-body.[ch]: same.
	* pan/queue-item-decode.[ch]: same.

	* pan/queue.c (socket_upkeep): fixed bug that was keeping old, inactive
       	sockets from closing down.

	* pan/grouplist.c (grouplist_process): make downloading article headers
	for the current articlelist a high-priority process.

1999-12-21  Charles Kerr <charles@skywalker.ecn.ou.edu>

	added a more formal debugging system for watching queue and sockets.
	This way we can tell users to turn on these command-line arguments if
	(when) queue-related bug reports come up.

	* pan/debug.[ch]: new files.
	* pan/pan.c (main): initialize the debug level.
	* pan/queue.c (all): use the debug routines.
	* pan/sockets.c (all): use the debug routines.

	* pan/gui.c (add_header): made the "<more>" button right-justified in
	the header box.

	* pan/queue-item-headers.[ch]: added support for just loading headers
	from the local database.  Apparently this exists so that we can execute
	the loading in a thread other than the gui thread.
	* pan/group (group_set_active_group): sync.

1999-12-21  Charles Kerr <charles@skywalker.ecn.ou.edu>

	(part 1 of migrating queue to gtk objects.  post, email, and grouplists
	are still broken; however, open, decode, new/all/sample headers, and
	read message work.)

	* pan/queue-item.[ch]: new class.
	* pan/queue-item-header.[ch]: new class.
	* pan/queue-item-body.[ch]: new class.
	* pan/queue-item-decode.[ch]: new class.
	* pan/queue.[ch] sync.
	* pan/nntp.[ch] sync.

1999-12-20  Charles Kerr <charles@skywalker.ecn.ou.edu>

        * pan/articlelist.c: this file is getting too largs, so broke out all
        the threading pieces into article-thread, which is 440 lines.
        * pan/article-thread.[ch]: new files.

        * pan/queue.c: wrapped the g_message calls in debug() macros so that
        they can be turned on and off.

1999-12-20  Jason Leach  <leach@wam.umd.edu>

	* pan/util.c (dialog_draw_centered): new function, it's like
	gui_popup_dialog(), but this one centers with respect to a given
	window, so you get your little Print dialog in the center of your
	message window.  How cute.

	* pan/print.[ch]: new files, adds support for printing out
	messages.  It uses a cheezy print-via-lpr method rather than
	something nice like using gnome-print.  It doesn't work yet on
	right click menus in the articlelist (will talk about this) or in
	a Post message window, but I think it's working fine in all other
	situations.
	
	* pan/articlelist.c (articlelist_button_press): fixed the bug with
	notebook layout not flipping pages when double clicking on an
	article in the list, thanks to William Hester
	<darklite@linuxpower.cx> for reporting this bug.

	* pan/pan.h: added a license comment header thing, it didn't have
	one strangely.

	* pan/util.c (make_string_from_list): new function, handy for use
	in the message send stuff and for printing.

	* NEWS: updated
	
1999-12-20  Charles Kerr <charles@skywalker.ecn.ou.edu>

	(whittling away at Pan.active_server and Pan.active_group)

	* pan/articlelist.[ch] (articlelist_get_current_server): new function
	to let clients know what server the articlelist's currently using.
	* pan/articlelist.[ch] (articlelist_get_current_group): same.
	* pan/articlelist.c (articlelist_get_next_article): use internal
	server/group fields instead of Pan.active_group or Pan.active_server.
	* pan/articlelist.c (articlelist_get_previous_article): same.
	* pan/articlelist.c (find_article): same.
	* pan/articlelist.c (articlelist_selected_delete): same.
	* pan/articlelist.c (articlelist_selected_mark_unread): same.
	* pan/articlelist.c (articlelist_selected_decode_impl): same.
	* pan/articlelist.c (articlelist_click_column): same.

	* pan/articlelist.[ch] (articlelist_load): now takes a server_data*.
	* pan/articlelist.[ch] (articlelist_set_contents): same.
	* pan/queue.c (queue_run_articlelist): sync.
	* pan/queue.c (queue_run): sync.

	* pan/articlelist.c (killfile_articles): gdata arg is now const.
	* pan/articlelist.c (articlelist_update): same.
	* pan/articlelist.c (articlelist_sort_init): same.

	* pan/group.c (choose_download_dialog): now takes a server* argument.
	* pan/group.c (choose_download_dialog_clicked_cb): sync.
	* pan/group.c (group_set_active_group): sync.
	* pan/articlelist.c (articlelist_load): sync.

1999-12-20  Charles Kerr <charles@skywalker.ecn.ou.edu>

	(queue handles can't-get-a-socket errors more gracefully now;
	also, if a keepalive message to an idle socket fails, the socket is
	removed from the pool.)

	* pan/queue.c (queue_socket_checkout): don't pop up an error dialog if
	the socket connection fails; just send it quietly to the log.  That
	dialog is a big headache when you've got pending items waiting for a
	socket to free up.
	* pan/queue.c (sockets_upkeep): if the keepalive "noop" message to the
	nntp server fails, close out the socket and remove it from the socket
	pool.
	* pan/queue.c (queue_run_thread): store pthread_t in the queue_data.
	* pan/queue.c (pop_queue): replaced with queue_run_what_we_can.
	* pan/queue.c (queue_run_what_we_can): smarter version of queue_pop
	that runs any items in the queue for which the queue manager can get
	a free socket.
	* pan/queue.c (process_queue): sync.
	* pan/nntp.[ch] (nntp_send_noop): now returns nonzero on error.
	* pan/nntp.c: only include the headers we actually need.

	* pan/server.h (struct server_data): added gint max_connections.
	* pan/prefs.c: added "Max_Connections" check when creating a new sdata.
	* pan/server.c (server_fetch): same.

	(avoiding compiler warnings)

	* pan/message-send.c (check_email_rcpts_syntax): added "return 0" to
	avoid compiler warnings in this empty function.
	* pan/message-send.c (check_nntp_rcpts_syntax): same.
	* pan/message-send.c (get_email_rcpts): changed g_return_if_fail() to
	g_return_val_if_fail() to avoid compiler warnings.
	* pan/message-send.c (get_nntp_rcpts): same.
	* pan/message-send.c (build_nntp_message): same.
	* pan/message-send.c (message_send): commented out unused variable
	"email_msg" to avoid compiler warnings.

	(misc)

	* pan/util.c (widget_set_font): cast away const font_name argument;
	gdk doesn't change this argument but forgot to make it const

	* pan/acache.h: add #includes to define all the structs, types used in
	that header.
	* pan/article.h: same.
	* pan/gui.h: same.
	* pan/message-send.h: same.

1999-12-19  Charles Kerr <charles@skywalker.ecn.ou.edu>

	* pan/util.c (widget_set_font): changed gdk_font_load() calls to
	gdk_fontset_load() to support dual definiton for multibyte fontsets.
	Thanks to Kang JeongHee <Keizi@mecom.net> for reporting this.
	* pan/articlelist (articlelist_set_node_style): same.

1999-12-19  Charles Kerr <charles@skywalker.ecn.ou.edu>

	* pan/sockets.[ch]: PanSocket is now a GtkObject!  Woo-hoo!
	* pan/nntp.[ch] (nntp_disconnect): sync.
	* pan/nntp.[ch] (nntp_login): sync.
	* pan/nntp.[ch] (nntp_set_group): sync.
	* pan/nntp.[ch] (nntp_download_all): sync.
	* pan/nntp.[ch] (nntp_grouplist_download_new): sync.
	* pan/nntp.[ch] (nntp_articlelist_download): sync.
	* pan/nntp.[ch] (nntp_article_download): sync.
	* pan/nntp.[ch] (nntp_article_decode): sync.
	* pan/nntp.[ch] (nntp_send_noop): sync.
	* pan/queue.c (queue_data): sync.
	* pan/queue.c (queue_socket_checkout): sync.
	* pan/queue.c (queue_socket_checkin): sync.
	* pan/queue.c (queue_socket_checkin_dead): sync.
	* pan/queue.c (socket_upkeep): sync.
	* pan/mesasge-send.[ch] (message_send): sync.
	* pan/smtp.c (smtpsock): sync.
	* pan/smtp.c (smtpsock): sync.

	* pan/smtp.c (smtp_get_response): changed buf from gchar* to const
	gchar* to avoid compiler warnings
	* pan/smtp.c (smtp_get_response): cast isdigit arg to an int to avoid
	compiler warnings
	* pan/smtp.c (smtp_send_message): commented out unused variable
	reply_to to avoid compiler warnings
	* pan/smtp.c (smtp_send_message): made sure full_to is always
	initialized before being used to avoid compiler warnings

	* pan/server.c (server_selected_cb): removed is_online() code.

	* pan/nntp.c (online_m): removed unused field.
	* pan/nntp.c (online_c): same.
	* pan/nntp.c (offline_m): same.
	* pan/nntp.c (offline_c): same.
	* pan/nntp.[ch] (is_online): removed unused method.
	* pan/nntp.[ch] (stop_all_mf): same.

	* pan/pan.h: don't include sockets.h anymore; it's pointless for all
	of pan to be rebuilt just because a field in sockets changes.

1999-12-19  Jason Leach  <leach@wam.umd.edu>

	* NEWS: small corrections
	
	* CREDITS: added a few people to the list of testing and bug
	reports

	* pan/message-send.c (build_nntp_message): left out the word
	wrapping on posting in the last commit.

	* pan/prefs.c (struct): added smtp stuff.
	(prefs_smtp_page): new page for SMTP preferences.  This only
	allows you to set one server at the moment, but when I saw the new
	queue code I instantly though of ways to get multiple servers
	supported, but that's not really high on my list at all right now.

	* pan/smtp.c: new file, for the new SMTP code.  Probably buggy,
	leaks mem, not robust, ugly code even.  But the basics of it is
	working and I've got enough time free to clean it up and fix it
	up, just want to throw it onto the cvs repos so you guys can play
	with it if you want to (spam me repeatedly via email).  queue.[ch],
	message-send.[ch], and nntp.[ch] were changed to use this as well.
	* pan/smtp.h: new file

	* README: tentatively made the next version 0.7.0
	* configure.in: same
	* configure: same
	* NEWS: same
	
	* TODO: added a full list of the GNKSA with some checkbox's, check
	them off as they get finished, put a 'P' if it's partially done.

	* pan/decode.c (article_decode_func): set the option FAST on
	uulib, should make decodes a bit faster, but the docs warn that it
	can cause some misformed messages to fail to decode, test this out
	heavily, I haven't had any problems with it on ...

1999-12-19  Charles Kerr <charles@skywalker.ecn.ou.edu>

	* pan-db.c (open_database): change creation permissions from
	read/write/exec to read/write; exec permission is unnecessary.

1999-12-18  Charles Kerr <charles@skywalker.ecn.ou.edu>

	* part two of the new queue/nntp/socket code.  Probably lots of bugs,
	and lots of g_messages all over, but take a look anyway.  It's a big
	step past the single-socket world we were in.

	What works:
		* multiple connections to a single server
		* multiple connections to multiple servers
		* nntp has a per-server socket pool
		* keepalives for the socket pool
		* getting articlelists, decoding binaries, etc. through this
		* each queue request is given its own thread to execute in.
	What doesn't work:
		* stop all, offline menu btn, etc.  Queue manager UI is needed.

1999-12-18  Matt Eagleson <e.Messiah@superpimp.org>

	* pan/util.c (pan_lock): Changed the behaviour of pan_lock to
	make sure we are not the main thread, rather than check if we are
	one of the other threads.... Didn't scale very well the way I
	had it. :)
	* pan/util.c (pan_unlock): Same
	* pan/pan.h: Modified Pan struct so that we only save the thread
	id for the main thread
	* pan/nntp.c: Stopped recording the connection managers thread id
	* pan.queue.c: Stopped recording the queue threads id

1999-12-17  Matt Eagleson <e.Messiah@superpimp.org>

	* pan/decode.c (article_decode_func): removed unused counter

1999-12-17  Matt Eagleson <e.Messiah@superpimp.org>

	* pan/article.[c,h]: We now pass a gdata when updating article
	flags so that we don't have to make the assumption that 
	group = Pan.active_group.
	* pan/nntp.c: Fix args
	* pan/queue.c Fix args, move a flag update to here.
	* pan/text.c (text_update): Move flag update back in to the
	queue code.

1999-12-17  Matt Eagleson <e.Messiah@superpimp.org>

	* pan/decode.c (article_decode): Now creates and passes a struct
	to a worker thread for each decode so they happen in the background
	and downloads continue un-interrupted.  This will optimize Pan's use
	of online time and also will fit nicely in the new queue manager that
	is in the works.

	* pan/decode.c (article_decode_func): The worker function for each
	thread.

	* pan/queue.c (queue_run_decode): Changes to accomodate background
	decodes.

	* pan/gui.c Fixed a small but deadly bug where progress may have been 
	undefined.

1999-12-16  Charles Kerr <charles@skywalker.ecn.ou.edu>

	* pan/grouplist.[c,h] (grouplist_internal_select_row): new util func.
	* pan/grouplist.[c,h] (grouplist_select_row_if_unread): same.

	* pan/grouplist.[c,h] (grouplist_prev_group): new navigation function.
	* pan/grouplist.[c,h] (grouplist_prev_unread_group): same.
	* pan/grouplist.[c,h] (grouplist_next_group): same.
	* pan/grouplist.[c,h] (grouplist_next_unread_group): same.

	* pan/gui.c (GnomeUIInfo group_menu[]): keyboard/menu bindings to the
	new grouplist navigation functions.

1999-12-16  Charles Kerr <charles@skywalker.ecn.ou.edu>

	* pan/articlelist.c (articlelist_get_selected_node): new util function.
	* pan/articlelist.c (articlelist_unselect_all): same.

	* pan/articlelist.c (articlelist_get_selected_message_id): use
	articlelist_get_selected_node().

	* pan/articlelist.c (articlelist_get_next_article): handle empty lists
	and wraparounds at the end of the article list.
	* pan/articlelist.c (articlelist_get_next_unread_article): same.
	* pan/articlelist.c (articlelist_get_next_thread): same.

	* pan/articlelist.c (articlelist_get_prev_article): handle empty lists
	and wraparounds at the beginning of the article list.
	* pan/articlelist.c (articlelist_get_prev_unread_article): same.
	* pan/articlelist.c (articlelist_get_prev_thread): same.

1999-12-16  Jason Leach  <leach@wam.umd.edu>

	* pan/gui.c: realized we had grouplist popup items that weren't in
	the main 'Group' menu... that has to suck for keyboard users,
	thus I filled up the main 'Group' menu.

	* pan/group-props.c: re-wrote this file so it doesn't use a global
	var that would only let the user set properties for one group at a
	time.  Much cleaner, more robust code.  Now we just need to
	brainstorm ideas for how to expand the properties so the user can
	set more options for each group.
	
	* pan/text.c (text_button_press): switched the popup call from
	gtk_menu_popup() to gnome_popup_menu_do_popup() for no apparent
	reason.

	* pan/gui.c: in the menu definition I switched the
	layout_notebook_text stuff to the actual words.  Appears to be the
	only way to get the strings actually into the pan.pot file.
	
	* pan/log.c (log_save_ok_clicked): plugged a very tiny and very
	rare mem leak.

	* pan/server.h (struct server_data): made the 'port' field an int
	instead of a char, just because it feels right.  Adapted rest of
	code base to work correctly with this as an int and not char, it's
	actually fully backwards compatible, you don't have to change a
	thing in your setup to get it working with this as an int.

1999-12-16  Charles Kerr <charles@skywalker.ecn.ou.edu>

	* another thread-drawing problem solved.  Thanks to Jason Costomiris
	<jcostom@jasons.org> for reporting this bug.

1999-12-15  Charles Kerr <charles@skywalker.ecn.ou.edu>

	* pan/gui.c (gui_set_layout): 'Paned' and 'Notebook' weren't being
	I18Nized properly.  Thanks to Kang JeongHee <Keizi@mecom.net> for
	reporting this.

1999-12-15  Charles Kerr <charles@skywalker.ecn.ou.edu>

	* pan/articlelist.c (articlelist_get_next_node): tweaks.
	* pan/articlelist.c (articlelist_get_prev_node): tweaks, bug fixes.

	* pan/articlelist.c (articlelist_set_selected_node): new private util.
	* pan/articlelist.c (articlelist_set_selected_node): ctree_node_moveto
	now works.  What dummies we are; we never read the docs.  It takes a
	float to align the row in the window.  Please don't change this unless
	you have a good reason, it works great with the new key bindings.
	* pan/articlelist.c (articlelist_select_and_read_node): new util func.

	* pan/articlelist.[c,h] (articlelist_read_prev_thread): new function.
	* pan/articlelist.[c,h] (articlelist_read_prev_article): same.
	* pan/articlelist.[c,h] (articlelist_read_prev_unread_article): same.
	* pan/articlelist.[c,h] (articlelist_read_next_thread): new function.
	* pan/articlelist.[c,h] (articlelist_read_next_article): same.
	* pan/articlelist.[c,h] (articlelist_read_next_unread_article): same.
	I'd been thinking about writing these for awhile but finally got off
	my ass and did it, thanks to user feedback from Erik Hendrix
	<erik.hendrix@uk.ibm.com>.

	* pan/gui.c (message_menu): added menu/keyboard options for the new
	articlelist_read_* functions.  Hooray!
	* pan/gui.c (message_menu): "New Message" ctrl binding changed
	from N to M because 'N' for Next makes more sense.

1999-12-15  Charles Kerr <charles@skywalker.ecn.ou.edu>

	* pan/text.c (welcome): updated welcome to automatically pull the
	version number from config.h. ;)

	* pan/decode.c (decode_open): made fname arg const.

	* pan/decode.c (article_decode): potential memory corruption bug fixed:
	ddir was being g_free()ed, even if uninitialized

	* pan/decode.h (article_decode): take server_data and group_data
	arguments for deciding on where to save the article.
	* pan/decode.c (article_decode): same.
	* pan/queue.c (queue_run_decode): sync.
	* pan/articlelist.c (articlelist_selected_decode_impl): sync.

	* pan/article (struct article_data): remove unused group field.

	* pan/group.h (create_articlelist_clist): removed unused func.
	* pan/group.h (group_empty_cb): made private func.
	* pan/group.h (choose_download_dialog_clicked_cb): same.
	* pan/group.h (GtkWidget groups_clist_menu): moved to grouplist.c.
	* pan/group.c (GtkWidget groups_clist_menu): same.
	* pan/grouplist.c (GtkWidget groups_clist_menu): same.
	* pan/group.h (click_groups_column_cb): moved to grouplist.c.
	* pan/group.c (click_groups_column_cb): same.
	* pan/grouplist.c (click_groups_column_cb): sync.
	* pan/group.h (group_dialog_clicked_cb): moved to grouplist.c.
	* pan/group.c (group_dialog_clicked_cb): same.
	* pan/grouplist.c (group_dialog_clicked_cb): same.
	* pan/grouplist.h (grouplist_update): renamed as grouplist_update_ui.
	* pan/grouplist.c (grouplist_update): same.
	* pan/grouplist.c (grouplist_show_subscribed): sync.
	* pan/grouplist.c (grouplist_show_all): sync.
	* pan/grouplist.c (grouplist_show_new): sync.
	* pan/grouplist.c (click_groups_column_cb): sync.
	* pan/grouplist.c (grouplist_process_selected): sync.
	* pan/grouplist.c (queue_run_grouplist): sync.

	* pan/log.h (struct LogViewer): made private.
	* pan/log.c (struct LogViewer): same.

	* pan/nntp.h (connect_dialog_clicked_cb): made private.
	* pan/nntp.c (connect_dialog_clicked_cb): same.

	* pan/gui-paned.c (gui_paned_construct): removed unused infobar code.
	* pan/log.c (struct LogViewer): same.

	* pan/nntp.h (connect_dialog_clicked_cb): made private.
	* pan/nntp.c (connect_dialog_clicked_cb): same.

	* pan/gui-paned.c (gui_paned_construct): removed unused infobar code.
	* pan/log.c (struct LogViewer): same.

	* pan/nntp.h (connect_dialog_clicked_cb): made private.
	* pan/nntp.c (connect_dialog_clicked_cb): same.

	* pan/gui-paned.c (gui_paned_construct): removed unused infobar code.
	* pan/gui-notebook.c (gui_notebook_construct): same.
	* pan/gui.h (GtkWidget* infobar): removed unused variable.
	* pan/gui.c (GtkWidget* infobar): same.
	* pan/gui.h (gui_create_infobar): removed unused func.
	* pan/gui.c (gui_create_infobar): same.
	* pan/gui.c (gui_set_info_mainthread): same.
	* pan/gui.h (gui_set_info): same.
	* pan/gui.c (gui_set_info): same.
	* pan/gui.h (gui_set_info_va): same.
	* pan/gui.c (gui_set_info_va): same.
	* pan/decode.c (article_decode): removed unused call to gui_set_info.
	* pan/queue.c (nntp_grouplist_download_all): same.
	* pan/queue.c (queue_run_post): same.

	* pan/gui.h (gui_show_unsubscribed_groups): removed unused func.
	* pan/gui.h (gui_key_press_cb): made private.
	* pan/gui.c (gui_key_press_cb): same.

	* pan/acache.c (acache_open_something): new private acache util.
	* pan/acache.h (acache_open_header): made adata arg const.
	* pan/acache.c (acache_open_header): same.
	* pan/acache.c (acache_open_header): use acache_open_something.
	* pan/acache.h (acache_open_body): made adata arg const.
	* pan/acache.c (acache_open_body): same.
	* pan/acache.c (acache_open_body): use acache_open_something.
	* pan/acache.c (acache_close_body): removed unused var cache_max.

	* CREDITS: updated to include Mr. Gumina.

1999-12-15  Jason Leach  <leach@wam.umd.edu>

	* pan/queue.c (article_decode): fixed the bug with decodes not
	going to the right place if you change groups while decoding
	articles from another group, thanks to Tony Gumina
	<mantus@phreebyrd.dyndns.org> for reporting this.
	
	* pan/article.h (struct _article_data): needed to add group_data
	*group as a field for the above, is this ok?

	* pan/text.c (welcome): updated welcome for 0.6.8, before we get
	the chance to screw up the welcome text in the release copy :)

	* pan/group-props.c (group_props_spawn): corrected a small
	annoyance where the group properties dialog just said "pan" for
	it's window title instead of something like "Group properties for %s".

1999-12-14  Jason Leach  <leach@wam.umd.edu>

	* pan/text.c (welcome): man, we're goobers... didn't updated the
	'welcome' for 0.6.7 ...

1999-12-14  Charles Kerr <charles@skywalker.ecn.ou.edu>

	* pan/sockets.h: completely reworked sockets code/API to handle
	multiple connections/servers cleanly.  This is still very early code,
	and hasn't been cleaned up yet, but it does at least work with our
	single-connection model.
	* pan/sockets.c: same.

	* pan/nntp.c: sync with new sockets API.  Currently we just have one
	socket object "sock" in nntp.c to let things work under the single
	connection model.  This is not a bad first step; I've confirmed I can
	get article lists and decode articles with it.  Kick it around and let
	me know if you can break it.

	* pan/pan.c (pan_shutdown): don't call tcp_close(), because we're not
	that far yet.  Next step is to have a connection manager that will tell
	them all to shutdown.

	* pan/acache.h (acache_putline_body): made line arg const.
	* pan/acache.c (acache_putline_body): same.
	* pan/acache.h (acache_putline_header): made line arg const.
	* pan/acache.c (acache_putline_header): same.

1999-12-14  Charles Kerr <charles@skywalker.ecn.ou.edu>

	* Pan 0.6.7 released.

1999-12-14  Charles Kerr <charles@skywalker.ecn.ou.edu>

	* pan/articlelist.c (articlelist_set_contents): fixed bug that
	corrupted g_slist's chunks.  This bug was introduced last night by
	me in my "I can't believe all these leaks!" fit of rage.

	* pan/articlelist.c (articlelist_mark_unread): fixed bug that cast
	the ctree to a list instead of a clist, causing all kinds of fun.
	Thanks to Noah Robin <sitz@onastick.net> for reporting this bug.

	* pan/articlelist.c (sort_articles): added new function to sort the
	array of article_data*'s before they're added to the ctree.  This is
	much faster than having the ctree sort them itself.  thread_articles
	used to do something like this, but it didn't handle descending-order
	sorting correctly.

	* CREDITS: updated.
	* NEWS: same.

1999-12-14  Jason Leach  <leach@wam.umd.edu>

	* pan/decode.c: added the UNKNOWN.??? patch from Rich Unger
	<rbu1@cec.wustl.edu>

1999-12-14  Charles Kerr <charles@skywalker.ecn.ou.edu>

	* pan/gui.c (gui_set_headers): added new code to truncate really long
	lines and turn the labels into buttons that will pop up a dialog
	showing the entire string.

	* pan/articlelist.h (articlelist_free): removed unneeded func; it had
	special handling for the article_data.threads field which is not used
	outside of articlelist.  Its use should be replaced with
        g_slist_foreach(alist,article_free_gfunc); g_slist_free(alist);
	* pan/nntp.c (nntp_articlelist_download): sync.
	* pan/queue.c (queue_run_articlelist): sync.

	* pan/gui.c (gui_set_progress_mainthread): more checks to make sure
	we're not updating the progress bar too much.  This is put in for the
	benefit of decode, where it's difficult to predict the number of steps
	that will be needed and so gui_progress_next_step() can't be used.
	Thanks to Frank de Lange <frank@unternet.org> for reporting this bug.

	* pan/text.h (text_rightclick_popup): made private.
	* pan/text.c (text_rightclick_popup): sync.

	* pan/acache.c (acache_delete): removed some hardcoded array sizes
	use g_strdup_printf() instead.  Yawn.

1999-12-13  Jason Leach  <leach@wam.umd.edu>

	* pan/message-send.c (message_send): fixed the 'empty message' on
	post bug.

	* pan/text.c (text_update): this is where the Message needs to be
	free'd 

1999-12-13  Charles Kerr <charles@skywalker.ecn.ou.edu>

	* pan/util.c (read_file): bugfix: forgot to fclose() the file
	descriptor.  oops.

	* pan/pan.c (pan_shutdown): small memory leak plugged: if
	current_article exists, it's freed.

	* pan/message.c (message_free): medium memory leak: message_free()
	didn't free the message struct.

	* pan/text.c (text_set_from_message_id): serious memory leak plugged:
	message was not being free()d.  Depending on the twisty paths between
	this, text_update(), and queue_run_article_download(), it was sometimes
	not certain whether or not it even *needed* to be free()d.
	* pan/queue.c (queue_run_article): fixed an obscene number of leaks
	and potential leaks.
	* pan/text.c (text_udpate): made Message arg const; a copy is passed
	into message_window_new if necessary.
	* pan/queue.h (queue_add_article_download): made Message arg const.
	* pan/message.c (message_copy): source arg made const.

	* pan/articlelist.c (articlelist_set_contents): enormous memory leak
	fixed: article headers were being leaked.  This appears to be at least
	partially my fault.
	* pan/article.h (article_free_gfunc): made a gfunc for freeing articles
	in a list.

	* pan/text.c (text_update): large memory leak plugged: adata was not
	being freed.

	* pan/text.h (article): renamed global article_data* "article" to
	"current_article" because "article" is too hard to grep for
	* pan/message-window.c (message_popup_reply_window): sync
	* pan/prefs.c (prefs_apply): sync
	* pan/text.c (text_update): sync
	* pan/text.c (text_button_press): sync

1999-12-13  Charles Kerr <charles@skywalker.ecn.ou.edu>

	* pan/text.c (text_update): serious memory leak plugged:
	acache_load_body()'s retval was not being g_free()d.

	* pan/message-window.c (message_window_save_ok_clicked): minor memory
	leak plugged: acache_load_body() and acache_load_header()'s retvals
	were not being g_free()d when saving failed.

	* pan/text.c (text_update): removed old version of text_update().
	* pan/text.c (displayed_article): removed unused function.

	* pan/acache.h (acache_hit_header): renamed acache_header_exists.
	* pan/acache.c (acache_hit_header): sync.
	* pan/queue.c (queue_run_article): sync.
	* pan/acache.h (acache_hit_body): renamed acache_body_exists.
	* pan/acache.c (acache_hit_body): sync.
	* pan/queue.c (queue_run_article): sync.
	* pan/text.c (text_set_from_message_id): sync.

1999-12-13  Charles Kerr <charles@skywalker.ecn.ou.edu>

	* pan/util.c (get_filesize): new utility to get the size of a file.
	* pan/util.h (get_filesize): new proto.
	* pan/util.c (read_file): use get_filesize() intead of ftell().
	ftell() is a very slow way of getting a filesize and was causing
	slowdowns during binary decodes.  Thanks to Frank de Lange
	<frank@unternet.org> for reporting this bug.

	* pan/grouplist.c (grouplist_load): use get_filesize(), not ftell().

	* pan/acache.c (acache_get_existing_filename):  new utility function
	to find the filename of an article's existing head or body.
	* pan/acache.c (acache_load_something): new utility to load a body
	or header from disk.  Uses acache_get_existing_filename.
	* pan/acache.c (acache_load_something): use read_file().
	* pan/acache.c (acache_hit_body): use acache_get_existing_filename
	* pan/acache.c (acache_hit_header): same
	* pan/acache.c (acache_load_body): use acache_load_something.
	* pan/acache.c (acache_load_header): same

1999-12-13 Matt Eagleson <e.Messiah@superpimp.org>
	
	* pan/article-db.c (ahdb_get_all) Moved expiration to get_all,
	where it belongs.

	* pan/queue.c (queue_run_articlelist) Bent to above changes.

1999-12-13  Charles Kerr <charles@skywalker.ecn.ou.edu>

	* Pan 0.6.6 released.

1999-12-13  Charles Kerr <charles@skywalker.ecn.ou.edu>

	* pan/message-filter.c (message_filter_ui): memory corruption bug
	patched.  Thanks to Jason Leach <leach@wam.umd.edu> for reporting this
	bug.

	* pan/grouplist.c (grouplist_grep): matching now works for subscribed
	and new modes, not just "all" mode as was previously the case

	* pan/group.c (add_group_to_clist_if_match): added new func, a generic
	add function to replace the less generic add_subscribed_group_to_clist
	add_new_group_to_clist.

	* pan/group.c (add_subscribed_group_to_clist): removed unused fuc.
	* pan/group.c (add_new_group_to_clist): same.
	* pan/group.h (add_group_to_clist_if_match): added new proto.
	* pan/group.h (add_group_to_clist_if_match_gfunc): same.
	* pan/group.h (add_subscribed_group_to_clist): removed unused proto.
	* pan/group.h (add_new_group_to_clist): same.
	* pan/group.h (unsubscribe_from_selected_cb): removed unused proto.
	* pan/group.h (subscribe_from_selected_cb): same.
	* pan/group.h (download_selected_groups_cb): same.
	* pan/group.h (download_selected_groups_new_cb): same.
	* pan/group.h (struct AHDB): removed unused typedef.
	* pan/group.h (grouplist_process_selected): made function private.

	* pan/date.h (struct Timezone_Table_Type): made struct private.
	* pan/date.h (parse_date): made gchar* arg const.
	* pan/date.c (skip_whitespace): same.
	* pan/date.c (parse_timezone): same.

	* pan/log.h (log_add): same.
	* pan/log.h (log_add_va): same.

	* pan/article-db.h (ahdb_field): return value made const.
	* pan/article-db.c (ahdb_field): made p const to avoid compiler warns

	* pan/gui.c (pan_main_toolbar): commented out to avoid compiler warns

1999-12-13  Jason Leach  <leach@wam.umd.edu>

	* pan/grouplist.c (grouplist_create): when pulling the group_mode
	var from gnome_config, make default equal to 1 (GROUP_ALL), not 0.
	(otherwise it'll set it to GROUP_SUBSCRIBED, so basically all new
	users start in Subscribed mode)

	* pan/queue.c (queue_run_article): small fix, don't wipe the text
	body pane unless an article is being loaded to it(opening a new
	message window would wipe our pretty copyright message away, even
	though the new message was going in the window not in the pane)

	* pan/grouplist.c (grouplist_remove_row): new function, being used
	for when the user unsubscribes from a group.

	* pan/group.c (group_empty_dialog): these dialogs don't really
	need to be modal.
	
	* pan/group.c (group_empty): haha, so I lied, one last annoyance
	found, "group empty" wasn't behaving correctly (row in grouplist
	wasn't updating and then the article database whined that it
	thought we had X articles but instead had 0), fixed it all up.

	* pan/prefs.c (prefs_display_page): fixed the font funkyness I
	described in the TODO file in the last commit.  For first time
	users, it uses their GTK+ default, and the only way it will become
	times-14 lets say in the grouplist, is if they go into the Display
	page, click grouplist, and change that to Times-14.  See the TODO
	for a full description of what the problem was before.

	* pan/message-filter.c (message_filter_ui): switched from
	gui_popup_draw'ing the dialog to gtk_widget_show_all with setting
	the window position to CENTER.  I'm not sure if it is just me, but
	gui_popup_draw wasn't actually centering it (with respect to Pan's
	main window) correctly.  I'd estimate the window is about 725
	pixels wide, but a little debug printf in gui.c shows that
	gui_popup_draw thinks its 97 x 68, so the centering was screwed
	and half the window would be off screen.

	* pan/druid.c: fixed the problem with going 'back' incorrectly 
	that matt had just reported.

1999-12-12  Matt Eagleson <e.Messiah@superpimp.org>

	* pan/article-db.c: Added ahdb_foreach.  Also added new function:
	ahdb_field to return a pointer to the start of a field in the flat
	article data strings.  This way we don't have to deserialize when
	we only want to check a couple fields.  This depends on some defines
	in the article-db.h file which should be updated if the format of
	the db string changes.  Any suggestions for better ways to do this
	would be appreciated.

	* pan/queue.c: Cleaned up step precalculating a little bit.  It now
	works much better in the "Get New" case.  Note that get the steps can
	be a little off depending on how many articles are expired.

	* pan/articlelist.c: rewrote articlelist_expire so that it doesn't need
	to use a GSList, operates directly on the DB with foreach.  Can be slow
	for large groups, but I think that's the price we pay for expiration.
	Works well for me, please test.

1999-12-12  Jason Leach  <leach@wam.umd.edu>

	* modified AUTHORS and INSTALL to match the styles of README,
	CREDITS, etc

	* pan/gui.c (add_header): charles, you gotta hate me toying with
	add_header ... but I did it again :).  How about size 1 height
	spacing? (and right aligned fields), take a look, feel free to
	revert. When I think about it, if we are having disputes over how
	the preview pane will/should look, maybe we could put some little
	options in the Prefs->Message page for the user to play with.

	* pan/article.[ch]: switched to new license comment

	* updated NEWS and TODO

	* pan.spec.in: updated Summary and description fields.

	* pan/message.[ch]: corrections on the license comment

	* pan/druid.c (druid_name_page): removed the style stuff I was
	playing with, I wasn't able to make it work...

	* pan/message-window.c: commented out the Next/Previous buttons on
	the Message Window toolbar.

	* pan/gui.c (gui_construct): commented out the toolbar on the main
	menu, it's not useful enough yet.

	* pan/queue.c: killed on of the compile warnings, last remaining
	is the Y2K whines about %y, which isn't really our fault, because
	NNTP needs just the last 2 in the NEWGROUPS command.

1999-12-12  Charles Kerr <charles@skywalker.ecn.ou.edu>

	* pan/group.c (grouplist_create): do a sanity check on group_mode
	after we load it from gnome_config.  If it's not a valid mode, set it
	to a valid mode to avoid g_assert_not_reached() errors.  Thanks to
	John Mellor <john@mellor.kw.net> for reporting this bug.

	* pan/server.h (server_menu_sensitize): removed unused proto.
	* pan/server.h (server_menu_desensitize): same.
	* pan/server.h (server_menu_create): same.
	* pan/server.h (server_menu_update): removed duplicate declaration.
	* pan/server.h (server_selected_cb): made function private.
	* pan/server.h (server_fetch): made server name arg const.

	* pan/druid.c (druid_email_page): I18N fixes.
	* pan/druid.c (druid_spawn): same.
	* pan/druid.c (druid_finish): memory leak plugged: ddata

1999-12-12  Jason Leach  <leach@wam.umd.edu>

	* pan/grouplist.c: in setting columns to be nice for first-run
	users I had made the mistake of locking the max_width on the group
	name column.  fixed.

	* pan/druid.c: re-wrote the whole first run wizard, the new one
	should be "easier" or "simpler" ... more like what a wizard
	actually is, instead of before where it was mainly just a paste of
	the prefs.c profile editor.

	* pan/queue.c (queue_run_articlelist): commented out expiration
	code, after thorough testing here, it doesn't appear to actually
	expire any articles, and makes massive I/O hits while
	processing...

1999-12-12  Charles Kerr <charles@skywalker.ecn.ou.edu>

	(nothing exciting)

	* pan/gui.c (gui_set_headers): handle NULL adata pointer arguments by
	clearing out the headers GtkTable instead of crashing.

	* pan/text.c (text_clear): added call to gui_set_headers_default() with
	a null adata so that the headers will get cleared out too.

	* pan/acache.h (acache_load): removed unused proto.

	* pan/sockets.h (read_char): made function private.

1999-12-11  Charles Kerr <charles@skywalker.ecn.ou.edu>

	* Hoo-ya, just LOOK at how much we did today!

	* pan/prefs.c (prefs_message_page): made the new explanation string
	I18N friendly.

	* pan/gui.c (gui_set_headers): use a GtkTable instead of GtkVBox so
	that the headers and their values can line up nice and pretty.  Added
	a GtkWidget* parameter so that message-window can use this code...?
	* pan/gui.c (gui_set_headers_default): same
	* pan/gui.c (add_header): same
	* pan/guitext.c (text_update): sync with new sig for gui_set_header
	* pan/prefs.c (prefs_apply): same

	* pan/message-window.c (create_post_info_pane): use followup-to and
	newsgroups, before falling back to Pan.active_group, to decide where a
	followup should go.

	* pan/message-window.c (menu): tooltip tweaks; ie, change "cancel
	message" to close message; we haven't done "cancel message" yet. :)

1999-12-11  Jason Leach  <leach@wam.umd.edu>

	* pan/gui-paned.c (gui_paned_construct): played with pane sizes
	until I found a very sensible setting for the first-time users
	(which Pan defaults to 640x400 for...)

	* pan/prefs.c (prefs_display_page): removed the Headers toggle
	buttons.
	(prefs_message_page): renamed from message_page() just for consistency
	(prefs_display_page): removed unused variable 'gint header'
	(prefs_message_page): worked a little GUI code in to make the
	message page a little easier/prettier.

	* pan/message-window.c: modified Message menu to have sensible
	options, maintaining different menus now for Post/Reply and Read
	windows.

	* pan/gui.c (gui_about): changed the about window copyright string
	a little, more formal and correct now (matt approved).

	* pan/druid.c (druid_finish): show the main Pan window after the
	user clicks finish.
	(druid_cancel): new function, so if the user clicks Cancel, Pan
	completely shuts down.
	(druid_next): made private

	* pan/pan.c (main): don't pop open the Pan window until the druid has
	finished (and the user has clicked Finish).

1999-12-11  Charles Kerr <charles@skywalker.ecn.ou.edu>

	* pan/gui.c (gui_set_headers): in references, cut all but the immediate
	parent of the article; threading all of it is too large for the window.

	* pan/prefs.c (message_page): updated to new gui article header code.
	* pan/prefs.c (prefs_apply): same.
	* pan/prefs.c (header_selection_changed): new func for header selection
	* pan/prefs.c (get_header_flags): same

	* pan/prefs.h (articlelist_set_font): removed unused proto.
	* pan/prefs.h (message_body_set_font): same

	* pan/prefs.h (struct PrefsWindow): made private in prefs.c
	* pan/prefs.h (PrefsWindow prefs_window): same
	* pan/prefs.h (function message_page): same
	* pan/prefs.h (function load_servers): same
	* pan/prefs.h (function save_servers): same

	* pan/message-send.c (check_from_syntax): made static to avoid
	"why-isn't-this-prototyped-in-a-header" compiler warnings.
	* pan/message-send.c (check_newsgroups_syntax): same
	* pan/message-send.c (check_body): same
	* pan/message-send.c (parse_to_field): same
	* pan/message-window.c (create_read_info_pane): same
	* pan/message-window.c (create_post_info_pane): same
	* pan/message-window.c (message_window_update): same
	* pan/message-window.c (message_post_window_create): same
	* pan/message-window.c (message_read_window_create): same
	* pan/message-window.c (message_reply_window_create): same

1999-12-11  Matt Eagleson <e.Messiah@superpimp.org>

	* pan/nntp.c (nntp_articlelist_download): Fixed the handling of
	sample header download so that last would be properly set.  Added
	a group attrib for first so that we can begin to expire properly.

	* pan/queue.c (queue_run_articlelist): Added a call to the new
	expire function.

	* pan/articlelist.c (articlelist_expire): Added a function that
	expires articles from the db based on the "first" value returned
	from the server during the "GROUP" command.

1999-12-11  Charles Kerr <charles@skywalker.ecn.ou.edu>

	* pan/article.c (article_copy): added reply_to, followup_to, 
	newsgroups 

	* pan/gui.c (gui_set_headers): added "newsgroups" display back in,
	but so that it's not annoying, don't show it if there's only one
	group in the header.  This is per gnksa suggestions for rule #1.

	* pan/message-window.c (update_info_pane): commented unused variable
	to avoid compiler warnings.
	* pan/gui.c (gui_set_headers): replaced bzero with memset to avoid
	compiler warnings.

	(housekeeping: cleanup of article.h's API; author citation tweaks)

	* pan/article.c (article_delete): removed unused function.
	* pan/article.c (article_delete_body): same.
	* pan/article.c (article_find): same.
	* pan/article.c (article_get_current): same.

	* pan/article.h (article_find): removed unused proto.
	* pan/article.h (article_delete): same.
	* pan/article.h (article_delete_body): same.
	* pan/article.h (article_free_protected): same.
	* pan/article.h (article_get_current): same.
	* pan/article.h (extract_header): same.

	* pan/article.c: tweaked "author" heading.
	* pan/articlelist.c: same.
	* pan/message-filter.c: same.
	* pan/pan-db.c: same.
	* pan/prefs.c: same.
	* pan/queue.c: same.
	* pan/util.c: same.

1999-12-11  Jason Leach  <leach@wam.umd.edu>

	* pan/log.h (logging_toggle): removed unused proto
	
	* pan/date.c (skip_whitespace): made private
	* pan/date.c (parse_timezone): same
	
	* pan/group.h (load_groups_file): removed unused proto
	* pan/group.h (load_group_list): same
	* pan/group.h (open_group_file): same
	
	(cleanup of prefs.c)
	* pan/prefs.c (prefs_apply): made private
	* pan/prefs.c (prefs_update_clist): same
	* pan/prefs.c (edit_profile_changed): same
	* pan/prefs.c (edit_profile_dialog): same
	* pan/prefs.c (edit_profile_dialog_clicked): same
	* pan/prefs.c (server_clist_button_press): same
	* pan/prefs.c (new_server_cb): same
	* pan/prefs.c (edit_server_cb): same
	* pan/prefs.c (delete_server_cb): same
	* pan/prefs.c (prefs_server_page): same
	* pan/prefs.c (prefs_userinfo_page): same
	* pan/prefs.c (prefs_directories_page): same
	* pan/prefs.c (prefs_display_page): same
	* pan/prefs.c (one_click_preview_cbutton_toggled): same
	* pan/prefs.c (online_cbutton_toggled): same
	* pan/prefs.c (prefs_cancel): same
	
	* pan/sockets.h: removed unused prototypes
	* pan/util.h: same

1999-12-10  Charles Kerr <charles@skywalker.ecn.ou.edu>

	* pan/queue.c (nntp_grouplist_download_new): bugfix: code assumed that
	users's prefs file would always have a Last_Grouplist_Update entry and
	dumped core otherwise.  Now we default to the Unix epoch. :)

	* pan/post.c (check_body): new function checks to make sure user isn't
	sending a stupid message.  Currently just checks for an empty message.
	* pan/message-send.c (check_body): same.
	* pan/post.c (send_post): use check_body.
	* pan/message-send.c (send_post): same.

	(cleanup of queue's public API)

	* pan/queue.c (queue_append): made private.
	* pan/queue.c (queue_get_next): same.
	* pan/queue.h (struct queue_data): same.
	* pan/queue.h (int qtotal): same.
	* pan/queue.h (queue_run): same.
	* pan/queue.h (articlelist_download): removed unused proto.
	* pan/queue.h (queue_add_grouplist_download): add server_data to args
	* pan/queue.h (queue_add_articlelist_download): same.
	* pan/queue.c (queue_add_grouplist_download): use server_data
	* pan/queue.c (queue_add_articlelist_download): same.
	* pan/queue.c (queue_run_grouplist): same.
	* pan/queue.c (queue_run_article): same.
	* pan/queue.c (queue_run_articlelist): same.
	* pan/group.c (choose_download_dialog_clicked_cb): sync with queue api.
	* pan/group.c (group_set_active_group): same.
	* pan/grouplist.c (grouplist_process_selected): same.
	* pan/grouplist.c (grouplist_get_all): same.
	* pan/grouplist.c (grouplist_get_new): same.

	* pan/message-send.c (reformat_body): shut up compiler warnings.
	* pan/message-send.c (parse_to_field): same.

	* pan/nntp.c (nntp_connect); made private function.
	* pan/nntp.h (multipart_decode): removed unused proto.

1999-12-10  Charles Kerr <charles@skywalker.ecn.ou.edu>

        * pan/articlelist.c (insert_node): do a pan_lock when building the
	articlelist because Matt's reporting gdk deadlock.  We do pan_unlock/
	pan_lock() every few hundred nodes to let the gui process some events
	and give some visual feedback other than a frozen display. :)

	* pan/pan-db.c (pan_db_foreach): fixed a bug in the cursor code -- it
	wasn't being reset to the beginning at the start of each foreach().
	This fixes the dumps-core-during-get-new bug.
	* pan/queue.c (queue_run_articlelist): added stronger assertions and
	error-checking while on the trail of the dumps-core-during-get-new bug.

	* pan/text.c (welcome): added this to the welcome message, so that
	Jason and I don't feel left out. (BTW, Jason, it's alphabetic...)
	> "Source Code Copyright (C) 1999 by \n"
	> "Matt Eagleson (e.Messiah@superpimp.org) \n"
	> "Charles Kerr (charles@skywalker.ecn.ou.edu) \n"
	> "Jason Leach (leach@umd.edu) \n"
	* pan/text.c (realize_text_cb): scootch the adjustments so that the 
	top of our welcome message is always visible on startup, even if Pan
	defaults to a small window.

        * pan/message.c (message_copy): added reply_to, followup_to, newsgroups
        * pan/message.c (message_free): same.
        * pan/message.c (message_import_adata): same.
	* pan/article-db.c (ahdb_save): same.
	* pan/article-db.c (article_deserialize): same.
	* pan/article.c (article_free): same.
	* pan/article.h (struct _article_data): same.
	* pam/message.h (Message struct): same.
	* pan/message.c (message_copy): same.
	* pan/message.c (message_free): same.
	* pan/message.c (message_import_adata): same.
	* pan/nntp.c (nntp_article_download): same.

	* pan/gui.c (gui_set_headers): new function for setting configurable
	article headers in main window.  This is kind of cool: I wrote it to
	follow gnksa suggestion #1, but it can also be used to let the user
	customize what headers to show.  (I should do a prefs page for this.)
	* pan/gui.c (gui_set_headers_defaults): same.
	* pan/gui.h (gui_set_headers): new proto.
	* pan/gui.h (gui_set_headers_defaults): new proto.
	* pan/gui.h (HEADER_SUBJECT): flag for gui_set_headers
	* pan/gui.h (HEADER_AUTHOR): same.
	* pan/gui.h (HEADER_MESSAGE_ID): same.
	* pan/gui.h (HEADER_PREFERENCES): same.
	* pan/gui.h (HEADER_REPLY_TO): same.
	* pan/gui.h (HEADER_FOLLOWUP_TO): same.
	* pan/gui.h (HEADER_DATE): same.

	* pan/message-window.c (update_info_pane): tried to add reply_to,
	followup_to, newsgroups support, but Jason will probably want to rework
	this because my results aren't very clean.  (IMHO gui_set_headers()
	would work here...)
	* pan/message-window.c (populate_read_info_pane): same.
	* pan/message-window.c (create_read_info_pane): same.

        * pan/message.c (message_copy): added references, which was left out.

1999-12-10  Jason Leach  <leach@wam.umd.edu>

	* pan/message-window.c (message_window_save_cb): new function, now
	the 'save as' in the message window works.
	(message_window_save_ok_clicked): ditto.
	(message_window_appbar_toggle): this makes the view->status bar
	function work, even though having a status bar is pretty pointless

	* pan/log.c (log_save_cb): house cleaning

	* pan/log.h (log_setup_appbar): house cleaning

	* pan/message-send.c (message_send): wrap the long lines in the
	body before sending it off.

	* pan/message-window.c (create_post_info_pane): changed the user's
	from: string from "e-mail address (Full Name)" to "Full Name
	<e-mail address>"

	* pan/util.c (wrap_long_lines): new function, truncates long lines
	at the maxlen, will be applied to the body of the message before
	sending.

	* pan/text.c (text_clear): have it blank out the little 'from' and
	'subject' labels when it goes to clearn
	(realize_text_cb): text box has a little welcome message, right
	now it's just our disclaimer/COPYING file

1999-12-09  Charles Kerr <charles@skywalker.ecn.ou.edu>

	* pan/gui.c (pan_main_toolbar): typo fix.
	* pan/message-window.c (message_read_toolbar): same.

	* pan/message-filter.c: still grinding away.

	* pan/articlelist.h (articlelist_step): removed unused function.
	It was too old; already three days old.

	* pan/articlelist.c (articlelist_menu_popup): changed "Open" to
	"Open in New Window" so as not to confuse with "Open Attachment".

	* pan/articlelist.c (articlelist_button_press): updated sensitivity
	to match the new menu options.

	* pan/articlelist.c (thread_articles): now sorts on the ctree's sort
	column so that we don't have to make ctree do it when we load the
	articles.  it's faster!
	* pan/articlelist.c (pp_adata_loc_comp): new function.
	* pan/articlelist.c (pp_adata_author_comp): same.
	* pan/articlelist.c (pp_adata_time_comp): same.

1999-12-09  Jason Leach  <leach@wam.umd.edu>

	* pan/text.c (text_update): threw in a fix for marking cached
	items read after they get pulled from cache and viewed (i.e. if
	you did 'get all' on a group and it starts anew on that group in
	terms of totals and article states, the cache still exists from
	the last session, so when you go to read articles, it never goes
	through the queue to download them, and they never get marked with
	READ state)

	* pan/articlelist.c (articlelist_set_selected_message_id): small
	improvment to keep the jittery jumping around of the CTree when
	going to next/previous (if the next node is still in the viewport,
	don't re-position) 

1999-12-08  Charles Kerr <charles@skywalker.ecn.ou.edu>

	* pan/message-filter.c (all): now works! (ui tweaks remaining?)

	* pan/queue.c (queue_run_articlelist): smoothed out the progressbar
	steps s.t. loading new headers looks better

	* pan/articlelist.c (articlelist_set_contents): added killfile support!
	* pan/articlelist.c (articlelist_set_node_style): same.

	* pan/prefs.c (prefs_apply): add killfile color
	* pan/prefs.c (prefs_init): same.
	* pan/prefs.c (prefs_display_page): same.
	* pan/prefs.h (struct _PanPrefsWindow): same.

	* pan/nntp.c (nntp_articlelist_download): removed dead killfile code

	* pan/article.h (STATE_KILLFILE): new article state.
	* pan/article.h (article_data): made state a ulong.
	* pan/article-db.c (ahdb_save): sync with article state ulong.
	* pan/article-db.c (article_deserialize): same.

	* pan/articlelist.h (killfile_color): added declaration.
	* pan/articlelist.h (killfile_style): added declaration.
	* pan/articlelist.c (killfile_color): added definition.
	* pan/articlelist.c (killfile_style): added definition.

	* pan/articlelist.c (add_article_to_ctree): don't render S in HMS

1999-12-08  Charles Kerr <charles@skywalker.ecn.ou.edu>

	* pan/articlelist.h (articlelist_get_next_message_id): new prototype.
	* pan/articlelist.h (articlelist_set_selected_message_id): same.

	* pan/articlelist.c (articlelist_get_next_message_id): new public func.
	* pan/articlelist.c (articlelist_set_selected_message_id): same.

	* pan/articlelist.c (articlelist_node_next): new internal utility func.
	* pan/articlelist.c (articlelist_node_prev): same.
	* pan/articlelist.c (articlelist_get_row_message_id): same.
	* pan/articlelist.c (articlelist_get_node_from_message_id): same.

	* pan/articlelist.c (articlelist_get_next_article): re-implemented.
	* pan/articlelist.c (articlelist_get_previous_article): same.

	* pan/message.c (message_previous): now traverses correctly.
	* pan/message.c (message_next): same.

	* pan/message-filter.c (all): still not done; just a ping checkin

1999-12-07  Charles Kerr <charles@skywalker.ecn.ou.edu>

	* pan/articlelist.c (compare_article): now support regular expressions
	* pan/articlelist.c (find_article): same.

	* pan/articlelist.c (find_article): show the text of the match.
	* pan/articlelist.c (find_article): bugfix in find: the search wasn't
	recursing into the children properly after a match.  This bug was
	my doing (in 0.6.4?).  I misunderstood how GTK_CTREE_NODE(foo)->next
	threaded the nodees.

	* pan/util.c (stristr): removed unused function.  This was only used
	in the article search, and has now been replaced with the regexp code.

1999-12-07  Jason Leach  <leach@wam.umd.edu>
	
	* pan/articlelist.c (articlelist_get_next_article):
	* pan/articlelist.c (articlelist_get_previous_article): new
	functions, based on Charles' new articlelist_step().
	
	* pan/articlelist.h (articlelist_get_previous_article):
	* pan/articlelist.h (articlelist_get_next_article): new proto's
	
	* pan/articlelist.c: added the 'Open' and 'Print' items to the
	right click popup menu for the articlelist

1999-12-07  Charles Kerr <charles@skywalker.ecn.ou.edu>

	* pan/server.c (server_selected_cb): if online, rather than telling
	user "you can't do this while online", make an offline request and
	proceed anyway.

	* pan/articlelist.c (articlelist_load): the progressbar now goes from
	start to complete only one time, instead of three: loading, threading,
	and adding are all one statusbar step.  This isn't seamless yet;
	I still need to make it work with queue_run_articlelist.

	* pan/articlelist.c (articlelist_set_contents): new function that
	handles threading, sorting, and setting the tree contents.
	* pan/queue.c (queue_run_articlelist): use articlelist_set_contents.

	* pan/articlelist.c (thread_articles): is now a private function
	called by articlelist_set_contents.  Now that it's internal-only,
	it no longer needs to use or return GSList nodes.  The "threads" field
	in article_data will probably go away in the next iteration of this. :)
	* pan/articlelist.c (article_subject_comp): sync with thread_articles.
	* pan/articlelist.c (gslist_message_id_comp): same.
	* pan/articlelist.c (gslist_subject_comp): same.
	* pan/articlelist.c (articlelist_update): same.
	* pan/articlelist.c (articlelist_set_contents): same.

	* pan/articlelist.c (articlelist_get_all): removed unused function.
	* pan/articlelist.c (articlelist_get_new): same.

	* pan/nntp.c (nntp_articlelist_download): in status bar, tell which
	group we're loading the articles for.  This looks better when you've
	queued up article grabs for multiple groups.

1999-12-06  Charles Kerr <charles@skywalker.ecn.ou.edu>

	* pan/articlelist.c (articlelist_step): new function.

	* configure.in: bundled rx into pan.
	* Makefile.am: same.

	* grouplist.c (grouplist_grep): support regular expressions matching.

1999-12-06  Charles Kerr <charles@skywalker.ecn.ou.edu>

	* pan/articlelist.c (articlelist_update): trying a new approach with
	threads & ui in articlelist: unmap the tree widget, and don't map it
	until after the sorting.  Thus no gdk calls are made on the tree,
	so we don't have to lock the gui.  (TODO: would be nice to set the
	parent's color to the tree's color s.t. unmapping doesn't look so
	dramatic, but copying the style doesn't do the trick.  Matt, Jason?)

	* pan/articlelist.c (articlelist_update): the progressbar now works
	when adding all the article headers to the article_ctree.

	* pan/articlelist.c (articlelist_sort): only sort the top-level items.
	It makes more sense to leave the threads sorted by thread, rather than
	by subject name, number of lines in body, etc.

	* pan/gui.c (gui_invoke_in_gui_thread): new utility function used
	to invoke a method in the main gui thread.  This is intended as a
	lightweight substitute for pan_lock/pan_unlock for simple UI refreshes.
	This should give the UI a smoother, and threadsafe, feel.
	More complicated methods should stick with pan_lock/pan_unlock.

	* pan/gui.c (gui_clean): use gui_invoke_in_gui_thread(), not pan_lock()
	* pan/gui.c (gui_clean): same.
	* pan/gui.c (gui_set_status): same.
	* pan/gui.c (gui_set_status_default): same.
	* pan/gui.c (gui_set_progress): same.
	* pan/gui.c (gui_set_progress_activity): same.
	* pan/gui.c (gui_set_info): same.
	* pan/grouplist.c (grouplist_update): same.
	* pan/grouplist.c (grouplist_update_row): same.

	* pan/queue: (queue_run_articlelist): made a private static function.
	* pan/queue: (queue_run_post): same.
	* pan/queue: (queue_run_grouplist): same.

1999-12-05  Jason Leach  <leach@wam.umd.edu>

	* pan/date.c (generate_newgroups_date): commented out unused function.

	* pan/queue.c (queue_run_grouplist): just found strftime(), using
	it now instead of generate_newsgroups_date() for simplicity's sake.

	* pan/group.c (get_new_groups): new function, guess what it's for

	* pan/queue.h
	(QUEUE_GROUPLIST_DOWNLOAD_NEW): new queue #define
	(QUEUE_GROUPLIST_DOWNLOAD_ALL): rename on old queue #define

	* pan/date.c (generate_newgroups_date): new function, used in
	getting list of 'new' groups

	* pan/nntp.c (nntp_grouplist_download_new): new function for
	downloading list of 'new' groups (based on RFC977)

	* pan/queue.c (queue_run_grouplist): added code for getting 'new'
	group lists

	* pan/post.c (create_text_area): fixed the little quirk with the
	sig file separator being "--" instead of "-- ".  Thanks to John Moreno
	<<phenix@interpath.com> for reporting this.

1999-12-03  Charles Kerr <charles@skywalker.ecn.ou.edu>

	* pan/message-filter.c (message_filter_get_action): plugged in code and
	removed old stub.  Adding authors to the killfile now works; good for
	filtering out known spammers.

	* pan/nntp.c (nntp_articlelist_download): plugged into message-filter
	to see if the message we just downloaded is in our killfile.

	* pan/gui.c (main menu): renamed "Article Filter" as "Message Filter"
	and added it back in.

	* pan/articlelist.c (articlelist_get_selected_message_id): new function.

	* pan/articlelist.h (articlelist_mark_articles_unread): removed unused
	prototype.
	* pan/articlelist.h (articlelist_mark_articles_read): same.
	* pan/articlelist.h (set_node_image): same.
	* pan/articlelist.h (articlelist_mark_all_read): same.

1999-12-03  Charles Kerr <charles@skywalker.ecn.ou.edu>

	* pan/nntp.c (nntp_articlelist_download): Check to make sure we got
	enough lines before we start parsing the header.  Otherwise, a corrupt
	header will bring down Pan.  Thanks to Ray Muir <rjmuir@attglobal.net>
	for reporting this bug.

	* pan/nntp.c (nntp_articlelist_download): rather than g_strdup()ing
	all of the article_data strings, just keep the strings allocated by
	g_strsplit().  This is the same trick used in article-db, and before
	that, in pan-db.  I didn't come up with it.

	* pan/nntp.c (nntp_articlelist_download): when splitting the article
	header into separate lines, don't bother splitting any lines after
	number eight -- there are optional lines the server may follow with,
	but we don't use them.

	* pan/article.h (article_data): removed unused field "nthreads".

	* pan/queue.c (queue_add_articlelist_download): replaced homebrew
	unreachable message with g_assert_not_reached().
	* pan/queue.c (queue_add_article_download): same.

	* pan/queue.c (queue_run): memory leak plugged: the GSList of message
	ids built in queue_add_article_decode is now being freed after the
	request is processed.

1999-12-02  Charles Kerr <charles@skywalker.ecn.ou.edu>

	(summary: fix 0.6.5 bug on sorting-by-line-number; spead tweaks to
	article list loading/threading/sorting)

	* pan/articlelist.c (atoi_commatized): new helper function for
	sorting articles by line count.
	* pan/articlelist.c (articlelist_compare_commatized): replaces
	articlelist_compare_lines, which was giving the wrong results when
	sorting by line count.  Thanks to Kevin Brammer <kncbram@hawaii.rr.com>
	for reporting this bug.

	* pan/articlelist.c (articlelist_get_new): commented out unused
	function.

	* pan/articlelist.c (articlelist_update): added code to turn off resize
	requests in tree-building code, a gtk tweak which should speed up style
	setting somewhat.

	* pan/util.c (commatize_ulong): user passes in a buffer, so this can
	be done on the stack instead of having g_mallocs/g_frees galore.
	also, tweaked this function to be faster.
	* pan/articlelist.c (add_article_to_ctree): update commatize usage.
	* pan/group.c (add_group_to_clist): same.
	* pan/grouplist.c (grouplist_update_row): same.
	* pan/statistics.c (stats_window_spawn): same.

	* pan/articlelist.c (mp_strcasecmp): speed tweaks

	* pan/articlelist.c (articlelist_compare_subjects): speed tweaks

	* pan/articlelist.c (articlelist_compare_text): speed tweaks

	* pan/articlelist.c (build_article_ctree_recursive): takes tree
	argument now to avoid overhead of gtk's RTTI.

	* pan/articlelist.c (thread_articles): pass in the article qty so that
	we don't have to walk through the list to find it.
	* pan/articlelist.c (articlelist_load): update thread_articles usage.
	* pan/queue.c (queue_run_articlelist): same.

	* pan/articlelist.c (skip_reply_leader): made this function a macro to
	inline it.

	* pan/sockets.c: upped BUFSIZE from 4096 to 8192 for no apparent reason

1999-12-01  Charles Kerr <charles@skywalker.ecn.ou.edu>

	* Pan 0.6.5 released.

1999-12-01  Charles Kerr <charles@skywalker.ecn.ou.edu>

	* pan/gui.c (gui_progress_next_step): avoid a division by zero crash
	when the number of steps is zero.  This happens, for example, when
	downloading an article with zero lines.  Thanks to Michael Dungan
	<vega@mail.rit.edu> for reporting this bug.

	* pan/post.c (send_post): small memory leak patched; the return value
	of generate_references() wasn't being g_free()d.

	* pan/post.c (send_post): small memory leak patched; the return value
	of 'path = g_strconcat (host, "!", uname, NULL);' wasn't being
	g_free()d.

	* pan/post.c (create_info_pane): small memory leak patched; the return
	value of 'g_strconcat ( "Re: ", pw->article->subject, NULL );' wasn't
	being g_free()d.

	* pan/post.c (generate_references): small memory leak patched; the
	return value of the first "new_refs = g_strconcat" call wasn't being
	g_free()d.

	* pan/post.c (send_post): small memory leak patched: was passing
	"message" on to queue_add_post(), which then implicitly took ownership
	but never freed.  Now queue makes its own copy and manages it;
	send_post() frees the original copy after calling queue_add_post().
	* pan/queue.c (queue_add_post): same.
	* pan/queue.c (queue_run): same.

	* pan/post.c (generate_references): make sure that refs is always
	initialized to some value before being evaluated.

	* pan/post.c (get_host_name): g_strdup the return string; previously
	an array was being returned form the stack.
	* pan/post.c (send_post): sync with get_host_name() update.

	* pan/articlelist.c (ancestor_is_selected): replaced old notreached
	code with the glib macro "g_assert_not_reached", which I just learned
	about.
	* pan/grouplist.c (grouplist_update): same.
	* pan/message-filter.c (rule_to_ui): same.
	* pan/queue.c (queue_run): same.

	* pan/text.c (text_update): the message_id argument is now const.
	* pan/acache.[ch] (acache_load_body): same.
	* pan/acache.[ch] (acache_load_header): same.
	* pan/acache.[ch] (acache_delete): same.
	* pan/acache.[ch] (acache_hit_body): same.
	* pan/acache.[ch] (acache_hit_header): same.

	* pan/text.c: removed unused static field current_article to avoid
	compiler warnings.

1999-11-30  Jason Leach  <leach@wam.umd.edu>

	* pan/grouplist.c (grouplist_create): commented out the column
	justification stuff because it didn't look so hot in notebook
	layout, we need to find a solution that will please users of both.

	* pan/gui.c (gui_shutdown): modifications on the patch sent in to
	preserve pane positions, in notebook layout, gui_shutdown() sets
	the pane widths to extremes (size of window), which makes next
	time you switch to paned mode in Pan insanely annoying and
	unuseful, fixed.

	* pan/sockets.c (tcp_open): made changes that the guy suggested
	that are working fine for me (and seem to be simpler), test it out
	and whine to me if it's not working for you.

1999-11-30  Charles Kerr <charles@skywalker.ecn.ou.edu>

	* pan/articlelist.c (ancestor_is_selected): helper function for
	articlelist_delete_selected

	* pan/articlelist.c (articlelist_delete_selected): fixed bugs that
	caused total/unread attributes to get thrown off when walking through
	articles.
	* pan/articlelist.c (articlelist_mark_selected_read): same
	* pan/articlelist.c (articlelist_mark_selected_unread): same

	* pan/grouplist.c (grouplist_update_row): bugfix: when users were
	deleting all the articles from a group, grouplist wouldn't reset the
	total/unread columns.

	* pan/group.c: commatize grouplist, right-justify numerical columns

        * pan/statistics.c: plugged leaks from commatize
        * pan/articlelist.c: same
        * pan/util.c: same

        * pan/util.c (commatize): made sure there's enough space allocated for
        the commatized string

1999-11-30  Jason Leach  <leach@wam.umd.edu>
	* pan/articlelist.c (add_article_to_ctree): corrected a little bug
	with line counts for incomplete multiparts not being commatized,
	it just looked weird.
	
	* pan/gui-paned.c (gui_paned_construct): added patch from Chris
	Jones for saving paned positions (made some small changes to patch
	too)

	* pan/articlelist.c (add_article_to_ctree): make line counts
	commatized using newly renamed and moved function.

	* pan/util.c (commatize_ulong): moved this function in from
	statistics.c and renamed it while I was at it, it commatizes a
	ulong number and returns a gchar *

	* pan/articlelist.c (create_articlelist_ctree): right justify the
	line column.

	* pan/article.c (article_copy): don't need to copy over 'header'
	and 'body' anymore.  

	* pan/post.c (post_window_spawn): made appropriate changes to get
	replies working without the 'header' and 'body' fields and with
	the global var article.

	* pan/text.c (text_update): fixed up the reply window by properly
	setting article to be the currently viewed article.

	* pan/article.h: removed the fields 'header' and 'body' as they
	were unusued.

	* pan/article.c (article_delete_body): dead unused function, goodbye

1999-11-30  Charles Kerr <charles@skywalker.ecn.ou.edu>

	* pan/pan-db.c (close_database): no longer used; removed.

	* pan/queue.c (queue_show_next): not used; commented out

	* pan/gui.c (gui_construct): moved keypress callback registration from
	the paned/notebook layout modules to here.  Previously each time a
	user changed layouts, another callback would be added.  This caused
	too many calls to gui_page_change/gui_enter_clicked via
	gui_key_press_cb, which usually resulted in a crash.  Thanks to 
	j.f. shoberg <jshoberg@cbd.net> for reporting this bug.
	(This is kind of nasty.  Whatsay we aim 0.6.5 for Sunday?)

1999-11-29  Charles Kerr <charles@skywalker.ecn.ou.edu>

	* pan/xpm/arrow_left.xpm: new pixmap.
	* pan/xpm/arrow_right.xpm: same.
	* pan/xpm/arrow_right_create.xpm: same.
	* pan/xpm/delete.xpm: same.

	* pan/message-filter.c: new file.
	* pan/message-filter.h: same.

	* pan/gui.c: added hooks into message filter.

	* pan/pan.h: added active_message_id into the Pan global struct.

	* pan/text.c (text_update): update Pan.active_message_id.
	
1999-11-29  Charles Kerr <charles@skywalker.ecn.ou.edu>

	* Pan 0.6.4 released.

1999-11-29  Matt Eagleson <e.Messiah@superpimp.org>

	* articlelist.c: Fixed some bugs in articlelist_selected_decode_impl
	that caused unusual behaviour when the root node was selected.

	* nntp.c: changed nntp_article_decode so that it doesn't say:
	downloading: part # of # when there is only one part.

1999-11-29  Jason Leach  <leach@wam.umd.edu>

	* pan/articlelist.c (articlelist_button_press): added needed call
	to gui_page_set to make it flip pages in notebook view on double
	click.

1999-11-25  Charles Kerr <charles@skywalker.ecn.ou.edu>

	* configure.in: added the same configure flags and checks for bdb
	that gnome-libs uses.  (In fact, they're cut-and-pasted from
	gnome-libs 1.0.54)

	* changed the Berkeley db calls in pan-db.c to use the Berkeley 1.85
	API.  This is consistent with gnome's usage of Berkeley DB, so pan
	users should be able to make the switch from gdbm to Berkeley DB
	without having to install new libraries.

	* Users, please note that according to its authors, Berkeley DB 1.85
	has known bugs.  You may be better off building and running gnome and
	pan with Berkeley 2.7.7 built with the 185 compatibility flag turned on.

	* changed the suffixes of the Berkeley DB files from ".bdb" to ".db".

	* updated README to give a list of current features, to explain to
	users about the differences between bdb 1.85, 2.7.7, and 3.0.55, added
	the FSF to the URL list; gave users an explanation of how to make
	stack traces; changed the wording to make it clear how nice stack
	traces are to have.

1999-11-24  Charles Kerr <charles@skywalker.ecn.ou.edu>

	* pan/group.h (group_save): prototype no longer used; removed.

	* pan/article.c (article_update): removed unused variable "node"

	* pan/queue.c (queue_run_articlelist): set GROUP_ONDISK flag to true
	on a successful load.

	* pan/util.[ch] (gslist_to_gptrarray): no longer used; removed.
	* pan/util.[ch] (get_all_in_article_tree): same.

	* pan/articlelist.[ch] (articlelist_get_all): not used; commented out

	* pan/articlelist.c (articlelist_selected_decode_impl): removed debugging
	printfs

	* pan/articlelist.h (articlelist_ctree_clean): removed dead prototype.
	* pan/articlelist.h (articlelist_count_unread): same.

	* pan/articlelist.c (articlelist_set_node_style): fix a bug I
	introduced that caused the user-selected font to be loaded even if
	user didn't specify a font.

	* pan/articlelist.c (articlelist_set_node_style): just load the article
	list font once, rather than three times.

	* pan/queue.[ch] (pan_queue_processing): is now a static function.

1999-11-23  Charles Kerr <charles@skywalker.ecn.ou.edu>

	* pan/pan-db.c: added more debugging checks.

	* pan/articlelist.c (articlelist_update_node): broke into two methods:
	an internal one, article_update_node_fast() which takes a GtkCTreeNode*
	and an article_data*, and a public one, article_update_node(), which
	only takes an article_data* and finds the node for itself based on the
	article's message_id.

	* pan/article.c (article_update): sync with new version of
	articlelist_update_node().

1999-11-23  Charles Kerr <charles@skywalker.ecn.ou.edu>

	* pan/articlelist.c (articlelist_selected_decode): bugfix from last
	commit.

	* pan/pan.c (pan_shutdown): call group_set_active_group(NULL) to make
	sure the current group's database gets shutdown nicely.

	* pan/pan-db.c (pan_db_ref, pan_db_unref): reference counting bugfixes

	* pan/group.c (group_set_active_group): removed unused variable "old"
	to avoid compiler warnings.

1999-11-23  Charles Kerr <charles@skywalker.ecn.ou.edu>

	* By unpopular demand, It's the son-of-guaranteed-to-break-everything
	commit from Hell!

	* pan/article-db.c (ahdb_ref): new function for sharing open database
	between modules without coupling them too tightly.
	* pan/article-db.c (ahdb_unref): same.

	* pan/article-db.c (ahdb_save_all): was able to simplify this code
	because the article_datas being passed in are all unthreaded, so
	adata->threads need not be traversed.  (adata->threads is going away,
	so this shouldn't come back to bite us later.)

	* pan/article-db: the db accessor is now an "article_db" instead of a
	"void*".  This gives slightly better type checking for other modules
	that use article-db.

	* pan/article.c (article_add_flag): added "flush to db now?" arg flag.
	* pan/article.c (article_remove_flag): same.

	* pan/article.c (article_update): only do a pan_lock if the specified
	article is actually in the article_ctree.  Added a "sync" flag
	to determine whether or not the database changes should be flushed
	immediately.  (If you're calling this in a batch, it's more efficient
	to say no and call ahdb_syc() by hand)

	* pan/article.c (article_in_memory): no longer used; removed.
	* pan/article.c (article_foreach): same.
	* pan/article.c (article_mark_read): same.
	* pan/article.c (article_mark_unread): same.
	* pan/article.c (article_mark_new): same.
	* pan/article.c (article_mark_old): same.

	* pan/articlelist.c (articlelist_button_press): now calls
	text_set_from_message_id() instead of queueing/loading/showing
	article by hand.

	* pan/articlelist.c (find_compare_func): use the database to find
	article header information, since we're not keeping the article headers
	in memory anymore.

	* pan/articlelist.c (find_article): use GTK_CTREE_NODE_NEXT() instead
	of walking through the siblings/parents/children by hand.

	* pan/articlelist.c (articlelist_load): now takes a group_data instead
	of a queue_data.  We only used the group_data field, so this makes
	more sense.

	* pan/articlelist.c (articlelist_load): free the article_headers
	when we're done building the list!  Hooray!

	* pan/articlelist.c (get_selected_articles): no longer used; removed.
	* pan/articlelist.c (articlelist_process_selected): same.
	* pan/articlelist.c (article_ctree_clean): same.

	* pan/articlelist.c (articlelist_selected_delete): this works properly
	now, regardless of whether or not the article is a parent or leaf.
	Saves the new states to the database and updates group attribs.
	* pan/articlelist.c (articlelist_selected_mark_read): same.
	* pan/articlelist.c (articlelist_all_mark_read): same.
	* pan/articlelist.c (articlelist_selected_mark_unread): same.

	* pan/articlelist.c (articlelist_selected_decode): updated to use
	message_id's instead of article_data*'s.	
	* pan/articlelist.c (articlelist_selected_open): same.

	* pan/articlelist.c (articlelist_set_node_style): new function used by
	the node builder and update_node s.t. style-setting code isn't
	duplicated in two places.

	* pan/articlelist.c (build_article_ctree_recursive): is now static.
	* pan/articlelist.c (add_article_to_ctree): same.

	* pan/druid.c (druid_server_page2): commented out this unused function
	to avoid compiler warnings

	* pan/group.c (group_add_attrib_i): only do any work if the increment
	is nonzero.

	* pan/group.c (group_set_active_group): updated to use ahdb_open and
	ahdb_ref.

	* pan/group.c (group_clean): no longer used; removed.
	* pan/group.c (group_save): same.
	* pan/group.c (mark_article_read_gfunc): same.
	* pan/group.c (mark_article_old_gfunc): same.
	* pan/group.c (free_article_gfunc): same.
	* pan/group.c (count_article_func): same.
	* pan/group.c (group_foreach_article_impl): same.
	* pan/group.c (group_mark_all_read): same.
	* pan/group.c (group_mark_all_old): same.
	* pan/group.c (group_free_all_articles): same.
	* pan/group.c (group_article_count): same.

	* pan/group.h: small tweak: changed group flags from #defines to enums

	* pan/group.h (group_data): removed "articlelist" field!  Hooray!

	* pan/group.h (group_data): removed "article_header_db" field;
	it was unreliable when changing the active group.  Better to use
	ahdb_ref/ahdb_unref instead.

	* pan/gui-paned.c (gui_paned_enter_clicked): now calls
	text_set_from_message_id() instead of queueing/showing/loading
	article message by hand.
	* pan/gui.c (gui_page_change): same.

	* pan/gui.c (menu): put a separator between "delete message" and
	"select all" to try to lessen the odds of user clicking
	"delete" by accident.  Added "mark all read" in the same
	separator area as "delete", since they're both destructive
	functions.

	* pan/log.c (log_add_old): #if 0'ed out this unused function to avoid
	compiler warnings.

	* pan/nntp.c (nntp_article_decode): now takes a GSList of message_id
	strings, rather than of article_data*s.

	* pan/db.c (get_article_header_db_filename): no longer used; removed.
	* pan/db.c (open_article_header_database): same.
	* pan/db.c (db_article_erase): same.
	* pan/db.c (save_article_gslist): same.
	* pan/db.c (db_fetch_article): same.
	* pan/db.c (db_load_articles): same.
	* pan/db.c (db_save_articles): same.
	* pan/db.c (db_store_article): same.

	* pan/db.c (pan_db_ref, pan_db_unref): new functions for sharing
	open databases between modules in pan w/o coupling them together.

	* pan/pan.h: jiggered the #include order to get server_data* defined
	before article-db.h and queue.h.

	* pan/prefs.c: article_update now uses article_load, because the
	article headers aren't left lying around in memory anymore.

	* pan/prefs.c (auth_cbutton_set): made static to avoid compiler
	warnings.

	* pan/queue.c: made private variables static.

	* pan/queue.c (queue_add_article_download): now takes a message_id
	instead of an article_data*.
	* pan/queue.c (queue_add_article_decode): same.

	* pan/queue.c (queue_add_post): cleaned up.
	* pan/queue.c (queue_get_total): same.
	* pan/queue.c (queue_prepend): same.
	* pan/queue.c (queue_get_next): same.  Only lock if queue isn't empty.

	* pan/queue.c (queue_run_articlelist): significant changes to make
	this work without having the old article headers in memory.

	* pan/queue.h (queue_data): added server_data* field.  Maybe someday
	we'll get to the point where we can queue lots of things.

	* pan/queue.c (queue_run_decode): is now static.
	* pan/queue.c (queue_run_article): same.
	* pan/queue.c (queue_prepend): same.

	* pan/text.c (text_set_from_message_id): new function that will handle
	loading/downloading/showing a message in the message text window.
	This is a stub right now; Matt's going to rework this and acache
	to handle our brave new db-happy, article_data*-less world.
	There won't be any way to read articles til this gets written. :P


1999-11-19  Charles Kerr <charles@skywalker.ecn.ou.edu>

	* By popular demand, It's the guaranteed-to-break-everything commit
	from Hell!

	BUGFIXES / TWEAKS / MISC.

	* pan/log.c: bug fix: log viewer would crash the first time it popped
	up because the viewer struct wasn't being zeroed out in malloc and did
	a non-NULL check on startup

	* pan/prefs.c: leak plugged: a frame "Personal Information"
	was being created and never used.

	* pan: removed "Unread" attrib everywhere.  Unread was redundant
	because we keep "Total" and "Read" attributes already.

	* pan: changed calls of isdigit(ch) to isdigit((int)ch) to avoid
	compiler warnings.  Ditto for isalpha(ch).

	* pan/log.c: s/rindex/strrchr/ to avoid compiler warnings.

	* pan/statistics.c: commented out unused variables to avoid compiler
	warnings.

	* pan/group.c (add_group_to_clist): speed tweaks; number of unread
	messages (ie, middle column) gets set.  Before, sometimes only the total
	column would get set.

	* pan/gui.c (progress): conform to the rest of the project's indent
	style. :)

	* pan/grouplist.c, pan/grouplist.h (grouplist_update_row): is now
	const-friendly.

	SET ACTIVE GROUP

	* pan/group.c: added new method (group_set_active_group):
	This new method eliminates a lot of duplicate code all throughout pan.
	This is good for code cleanup, but needs to be tested.

	* pan/grouplist.c: on second buttonpress, call group_set_active_group,
	which (should) do all the things that the rest of this code used to do.

	* pan/gui.c (gui_page_change): when user hits key call
	group_set_active_group, which (should) do all the things that the rest
	of this code used to do.

	* pan/gui-paned.c: on activate, call group_set_active_group, which
	(should) do all the things that the rest of this code used to do.

	FOREACH MADNESS

	* pan/article.c (article_foreach): new function that will do some
	operation for all articles in the given article tree.  If e-Messiah
	gets his way, this won't be necessary anymore, which is a good thing.

	* pan/gui.c (progress): added GFunc version of progress_next_step.
	This is handy for incrementing the progress bar in a foreach call
	without having to code gui knowledge into the foreach function.

	DATABASE CHANGES

	* pan/pan-db.c, pan/pan-db.h: following the lead the last "let's use
	the generic pan-db API to put group attributes into a db file", pan-db
	has been reworked s.t. it's now *just* the generic API to insulate the
	other DB interfaces from whatever database we wind up using.
	Added a foreach method.

	* pan/article-db.c, pan-article-db.h: new interface for working with
	the article header database.  It uses the pan-db API to work with the
	database.  All the calls to pan-db for article header handling have
	been updated to this.  (FIXME: aging out articles is broken again.)

	* pan/article.c (mark_article_read): store the article header so that
	the database knows this article is read.

	* pan/article.c (mark_article_unread, mark_article_new,
	mark_article_old): new functions that also store the header to the
	database.

	* pan/articlelist.c: reworked how "mark read" and "mark all read" work;
	they now use the article_mark_* functions and then call ahdb_sync()
	to flush the database writes

	* pan/queue.c, pan/nntp.c: use the new article-db interfaces to work
	with article headers.

	MINOR ARTICLE HANDLING CHANGES

	* pan/articlelist.c: removed articlelist_not_new, article_ctree_clean.

	* pan/group.c: removed group_clean, group_save.  added
	group_mark_all_read, group_mark_all_old, group_free_all_articles
	(which does pretty much the same as group_clean), get_article_count.

	* pan/nntp.c (nntp_articlelist_download): use article_foreach and
	article_free to clear out the list, rather than articlelist_free.


1999-11-18  Jason Leach  <leach@wam.umd.edu>

	* pan/grouplist.c: added grouplist_show_* functions to be used in
	the menu addition described below.

	* pan/gui.c: created a subtree menu for setting group_mode in the
	'Group" menu, so the user can switch modes without column
	clicking, a little more intuitive and at least visible if they
	can and try to read menus.

	* pan/articlelist.c (articlelist_mark_all_read): fix to prevent
	segfaulting when you do 'mark all read' with no group loaded.

1999-11-18  Jason Leach  <leach@wam.umd.edu>

	* pan/prefs.c: worked on the aesthetics of the User and the
	Directories preference pages, making labels right justified and
	setting spacing to what I think looks better.

	* pan/prefs.c (prefs_general_page): renamed from general_page() to
	prefs_general_page()

	* pan/prefs.c (prefs_userinfo_page): changed the "Signature File:"
	entry box into a gnome file entry widget, which makes it super
	easy for a user to set the value by letting them do 'browse' or
	drop down list of their latest entries.

	* pan/post.c (create_text_area): add a small text separator "--"
	between the body and the sig.

	* pan/post.c (create_text_area): modified to not try and attach a
	sig if the Signature_File return is of strlen() == 0, which means
	the user had wiped out that section (before it would complain
	about not being able to open file "").

1999-11-17  Charles Kerr <charles@skywalker.ecn.ou.edu>

	* pan/queue (load_article_headers): bug fix: if loading the current
	group's headers via "load all headers", make sure to thread the
	articles and update the article display with them.

	* pan/server.c pan/server.h (server_get_attrib_db): new function used
	to access server attributes.  This replaces the kludge of keeping
	server's group's info (read/unread/total/last etc.) in the Pan ini
	file.  These are now stored in one db file for each server.

	* pan/group.c pan/group.h (attrib functions): made arguments to the
	attrib functions const-friendly.  attrib functions now use
	server_get_attrib_db() instead of the gnome ini file.

	* pan/pan-db.h pan/pan-db.c (attrib functions): new functions for
	semi-opaque db access, based on the group attrib functions:
	void* pan_db_open ( const char* filename );
	void  pan_db_close ( void* );
	char* pan_db_get_value_str ( void* db, const char* key );
	void  pan_db_put_value_str ( void* db, const char* key, const char* );
	int   pan_db_get_value_i ( void* db, const char* key );
	void  pan_db_put_value_i ( void* db, const char* key, int i );
	void  pan_db_add_value_i ( void* db, const char* key, int i );

	* pan/util.h pan/util.c (fgetline): commented out this unused function.

	* pan/prefs.c pan/prefs.h (default_server_cb): commented out this
	unused function.

1999-11-17  Charles Kerr <charles@skywalker.ecn.ou.edu>

	* pan/post.c (create_text_area): If user has specified a signature
	file, put its contents in the new text message window.

	* pan/prefs.c pan/prefs.h: Let user specify their signature file under
	the "User" tab

	* pan/util.c pan/util.h (read_file): new utility function.

1999-11-16  Charles Kerr <charles@skywalker.ecn.ou.edu>

	* pan/nntp.c (nntp_articlelist_download): Fix an article threading bug
	introduced in the last release-- references had a max depth of two
	rather than n.  made article part/parts variables zero, rather than
	one, when the article is not a multipart message.  This is as we
	agreed in IRC (irc.gimp.org #pan, check us out!).

	* pan/grouplist.c (grouplist_save): small memory leak plugged.

	* pan/pan-db.c (db_store_article): free memory *after* it's written to
	the database, not before, dummy! :) This bug was mine.

	* pan/articlelist.c (find): added "find only unread" togglebutton to
	the find dialog.

	* pan/articlelist.c (find): don't destroy the find dialog; just unmap
	it instead.  That way we don't have to spend time rebuilding it and it
	always remembers the user's settings.

	* pan/articlelist.c (mark all as read): first cut at this.  This is
	buggy, but shouldn't destabilize anything else.  I just wanted to get
	do a commit and get synced with cvs.

1999-11-16  Charles Kerr <charles@skywalker.ecn.ou.edu>

	* pan/util.c (widget_set_font): new function that checks to make
	sure gdk_font_load was successful before setting the widget's font.
	If it was unsuccessful, it prints a g_warning.  Font on one x server
	may not be available on another, as my machine reminded me this
	morning...

	* pan/prefs.c, pan/text.c, pan/grouplist.c: use widget_set_font()
	instead of loading and setting the font by hand

1999-11-16  Jason Leach  <leach@wam.umd.edu>

	* pan/gui.c (gui_construct): realize the window first and pull style 
	copies from it to ensure the colors stay with the GTK theme default.

1999-11-16  Charles Kerr <charles@skywalker.ecn.ou.edu>

	* pan/nntp.c: reduce the amount of display locks and x traffic on
	pulling down new group lists and new article headers.

	* pan/pan.c: call init_prefs() before the widgets are built, so that
	the widgets can pick up the style preferences

	* pan/grouplist.c, pan/group.c: don't bother setting the style for
	each grouplist row individually -- just set the style for the complete
	grouplist and let all the rows pick it up that way.  This is much
	cleaner, and gives us no performance hit for using user-specified fonts
	in the grouplist.

	* pan/text.c: same.

	* pan/prefs.c: instead of redrawing the contents of the group list or
	message text, just set the widget's style when the "apply" button is
	hit.

1999-11-15  Jason Leach  <leach@wam.umd.edu>

	* pan/grouplist.c (grouplist_process_selected): I created a bug
	with my toying with the grouplist_process_selected in downloading
	new and all.  It was doing the actions twice, believe to have
	fixed it.

1999-11-15  Charles Kerr <charles@skywalker.ecn.ou.edu>

	* Applied patch submitted by David <david@wmol.com> to get post.c
	to build on FreeBSD.

	* First stab at moving from gdbm to Berkeley DB 2.x.  This includes
	the source and autoconf madness to let users specify where to find
	it.  The main reason for this change is speed.  As an example, reading
	2732 message headers from disk via gdbm takes 140 seconds on my machine;
	using Berkeley DB; it takes 4 seconds.

1999-11-15  Charles Kerr <charles@skywalker.ecn.ou.edu>

	* Pan 0.6.3 released.

1999-11-15  Jason Leach  <leach@wam.umd.edu>

	* pan/queue.c (queue_run_articlelist): if the user has a group
	loaded when they do a 'get new' or 'get all', must re-run
	articlelist_update() to add in the new articles and sort them as well.

	* pan/queue.c (queue_run_articlelist): removed unecessary
	gui_set_progress(0), it's already done in the
	gui_progress_init_steps() function

	* pan/grouplist.c: I didn't see the point of grouplist_get_all and
	grouplist_get_new when we had grouplist_selected_* functions that
	did the same thing.  Re-implemented the old style, and added the
	one thing that the _get_all and _get_new added of where if there
	isn't anything selected but there is an active group (the user is
	doing 'get all' from the Group menu then), then the active group
	is used to get all or get new.

	* pan/prefs.c (prefs_apply): fixed segfault for when no article
	has been loaded and a user tries to change any of the fonts.

1999-11-13  Jason Leach  <leach@wam.umd.edu>

	* Makefile.am: added pan.spec to make sure people can still do
	rpm -tb pan.tar.gz to build binary RPMs straigt from the tarball.

	* pan/group.c (add_group_to_clist): applied the same thing as
	below, this time for the grouplist.

	* pan/articlelist.c (add_article_to_ctree): added a little
	optimization in where if you haven't specified the articlelist
	font to be anything (just using your default GTK theme font), then
	the Updating Display part of articlelist loading should be much
	faster, apparently setting the style can be slow.

	* pan/prefs.c (prefs_display_page): right justified the labels for
	the color section. Also played with the spacings a little until
	it looked even.

1999-11-12  Jason Leach  <leach@wam.umd.edu>

	* pan/group.c (add_group_to_clist): applied the same mem leak fix
	as below, but this one for the grouplist.

	* pan/articlelist.c (add_article_to_ctree): was leaking insane
	amounts of memory in setting the fonts and colors, because it was
	making a copy of the GtkStyle of Pan.window with every node in the
	articlelist... fixed that up.

1999-11-11  Matt Eagleson <e.Messiah@superpimp.org>
	
	* pan/prefs.c Fixed the behavior of the font pickers
	so that the changes are only applied when prefs_apply
	is called.  Also added a picker for the STATE_NEW color.

	* pan/articlelist.c Fixed the handling of the new message
	color so that it should work again.

	* pan/nntp.c (nntp_articlelist_download) Moved some articlelist
	logic out of nntp.c and into queue.c where it belongs

	* pan/queue.c (queue_run_articlelist) Modified the articlelist
	logic to inprove handling of "get new" functionality

	* pan/grouplist.c Added two new functions, grouplist_get_new
	and grouplist_get_all which will do the download functions
	based on the state of the current grouplist selection

1999-11-11  Charles Kerr <charles@skywalker.ecn.ou.edu>

	* pan/articlelist.c (thread_articles) fixed a memory leak; bugfixed
	the multipart counting again, more thread code futzing.  Unless
	someone finds a bug, the new thread code is done.

	* pan/articlelist.c (articlelist_update): don't unfreeze until *after*
	the first sorting is done.

	* pan/articlelist.c (article ctree): consolidated the pixmap selection
	and drawing.

	* pan/articlelist.c (article ctree): you can expand the multipart
	messages again.  I'd like to leave this in, for extracting individual
	parts, until we add a getright-like interface for resuming an
	extraction.

	* pan/xpm/binary.xpm: tweaked this to look more like the multipart
	icon so that there will be a visual hint about what this icon means.

	* pan/sockets.c (read_server): small speed tweaks in read_char and
	get_server, since we call these functions like mad.  Also upped the
	buffer size from 1024 to 4096, which seems more sensible if we're
	going to be reading multipart messages.  Was there an important reason
	for choosing 1024?

	* pan/server.c, pan/prefs.c, pan/gui.c, pan/druid.c, pan/db.c: removed
	some hardcoded array sizes (ie, a fixed 256 bytes) and use
	g_strdup_printf() instead.  Yawn.

1999-11-10  Matt Eagleson <e.Messiah@superpimp.org>

	* pan/decode.c Added a decode_open function to open
	decoded attachments based on Gnome mime settings

	* pan/gui.c Added "Open Attachment" to the menu

	* pan/articlelist.c Added "Open Attachment" to the articlelist
	popup menu

	* pan/queue.h Added a flag to specify that decodes should be
	opened.

1999-11-09  Charles Kerr <charles@skywalker.ecn.ou.edu>

	* pan/gui.c (progress): added gui_progress_init_steps() and
	gui_progress_next_step().  These are preferred over gui_set_progress()
	because they lessen the number of UI locks we make.

	* pan/db.c (load_articles): nasty bug squashed: data from gdbm was
	being g_free()d instead of free()d.  switched from gui_set_progress to
	gui_progress_steps.

   	* pan/nntp.c (load new headers/all headers): switched from
	gui_set_progress to gui_progress_steps

   	* pan/articlelist.c (thread articles): switched from gui_set_progress
	to gui_progress_steps

	* pan/db.c (save articles): switched from gui_set_progress to
	gui_progress_steps.  (No, it didn't help much. :)


1999-11-09  Charles Kerr <charles@skywalker.ecn.ou.edu>

	* pan/articlelist.c: rewrote article threading from scratch.
	Kick it around; break it.  Highlights:

	  o threading is faster, especially in worst-case scenarios.
	    alt.binaries.sounds.mp3.comedy (4,203 posts): 2 sec -> 1 sec
	    alt.binaries.sounds.mp3 (79,536 posts): 263 sec -> 33 sec

 	  o now checks for each multipart, rather than counting the multipart
	    qty, when deciding whether or not the multipart is complete.
	    (Previously got bad results in (pathological?) case of reposts with
	    identical subjects)

	  o leave part 0 of a multipart out of the multipart's thread, as per
	    TODO's suggestion

	  o article threading code is somewhat smaller/simpler

	* pan/articlelist.c (articlelist_compare_subjects): "Re:" is ignored
	when sorting subjects in the tree, so "Re: Antitrust" on the top level
	shows up in the A's instead of the R's.  IMO this is a nice improvement

	* pan/articlelist.c (add_article_to_ctree): changed the date so that
	clicking the date column sorts correctly, as before.  Not as pretty as
	before, though.

	* pan/articlelist.h: moved lots of internal methods out of this header
	and into articlelist.c as statics; removed declarations of a few
	nonexistent functions

	* pan/db.c (db_store_article): bugfix: db kept trying to sprintf '%s'
	a null reference string.  Question is, is it legal to have a null
	reference?

        * pan/util.c added lower_bound, a bsearch-like implementation of STL's
	lower_bound.

1999-11-07  Jason Leach  <leach@wam.umd.edu>

	* pan/db.c (save_article_gslist): removed the unused variable
	'time_t current_time' and the call to 'time (&current_time)'
	the information of these is never used, and this function can
	be called many many times for heavily threaded groups, so this
	actually results in a good speed increase.

	* pan/grouplist.c (grouplist_process_selected): added a little
	grouplist_save_index() piece at the bottom, so when a user does
	Subscribe, Unsubscribe, or Remove 'New' Flag, then the grouplist
	index is saved to take these changes in the group flag into effect.
	Did this because formerly if pan were to crash or be shutdown
	abnormally, the latest group flags would not be saved... still not
	finished with this functionality, because grouplist_save_index() can
	be wasteful (although a lot less wasteful than a full grouplist_save())

	* pan/db.c (db_load_articles): think I fixed all the whining with
	the article expiration.  It was failing to do gdbm_delete () in
	the for loop on the 'expirelist' variable, because we had free()'d
	all the keys in the above while loop.  Solved this by instead of
	building an 'expirelist', just do the gdbm_delete() at each article
	that is supposed to be expired.

1999-11-06  Jason Leach  <leach@wam.umd.edu>

	* pan/gui.c (gui_construct): fixed an issue in the patched part
	of the contributed code from Greg McLean where on a fresh run the
	window wouldn't be 640x400 as it should...

	* pan/pan.c (main): if the Pan.window isn't realized first, then
	in subsequent calls to gtk_style_copy (Pan.window) (used in the parts
	where it sets fonts and stuff), the colors aren't matched with what
	they should be for the theme default.  fixes that without adding any
	special overhead.

	* pan/gui.c: merged in the patches from Gregory McLean for geometry
	string parsing and session management, but took out the preserved
	x,y screen coordinates.  We've done this before and commented it out
	as well, the window manager should do all remembering/restoring of
	window positions.
	
	* pan/grouplist.c: took out the icon for properties in the right
	click menu popup

1999-11-04  Charles Kerr <charles@skywalker.ecn.ou.edu>

	* pan/articlelist.c: added author, case sensitivity, and "find next"
	button to search dialog.

	* pan/articlelist.c: bugfix to "find next" where next_pos wasn't
	getting cleared out when the articles were reloaded

	* pan/util.c: added Fred Cole's public domain stristr() code.  (Why is
	there no g_stristr?)

1999-11-04  Jason Leach  <leach@wam.umd.edu>

	* pan/nntp.c (nntp_articlelist_download): disabled the marking
	of all previouis messages as "Unread" when a user does a 
	"get new" for a group... should only change the 'unread' count
	when a user has actually read a body

1999-11-03  Jason Leach  <leach@wam.umd.edu>

	* pan/gui.c (gui_construct): added a little tooltip to the find box,
	just for shits and giggles and to learn about how to make tooltips in
	GTK+

	* pan/grouplist.c (grouplist_create): removed 2 unnecessary calls
	to gtk_widget_show.

1999-11-02  Charles Kerr <charles@skywalker.ecn.ou.edu>

	* pan/queue.c: call check_new_group_list_for_newness after snarfing a
	new group list

	* pan/qui.c: added the group list's checkboxes to paned/notebook layout

	* pan/groups.c: added check_new_group_list_for_newness() which checks
	the new list of groups against an old list and flags new groups as new

	* pan/groups.c: the groups popup menu now desensitizes all the menu
	items requiring a selection (currently all of 'em) when no groups are
	selected

	* pan/groups.c: added "Remove new flag" button in groups popup

	* pan/groups.c: compare_group_data returns a gint as declared in
	groups.h

	* pan/groups.h: commented out function declarations to nonexistent
	functions, added declaration for check_new_group_list_for_newness()

1999-11-02  Jason Leach  <leach@wam.umd.edu>

	* pan/post.c: made some menu keybinds to the post window.

	* pan/gui.c (gui_select_all): added a pair of functions
	to gui-notebook.c and gui-paned.c to make the Edit->Select All
	menu function in notebook or paned mode.  The Edit->Select All
	will select all the items in the current section you are in (i.e.
	if you are in paned mode, in the text body, it selects all the text)

	* pan/gui.c: added more keystroke shortcuts, this time for the 
	'group', 'online', and 'edit' menu
	
	* pan/gui.c: added some keystroke shortcuts to the 'message' menu

	* pan/prefs.c (prefs_init): set default first-run colors to something
	nice, a blue-ish unread color and a dark black-ish read color

	* pan/queue.c (queue_run_grouplist): removed unused variable 'count'

	* pan/prefs.c (prefs_display_page): now it lets you set your colors.
	woo-wee, I'm on a roll!
	(prefs_display_page): moved the 'message' tab into this display page
	while I'm at it...

1999-11-01  Jason Leach  <leach@wam.umd.edu>

	* pan/prefs.c (prefs_init): load font settings on startup
	
	* pan/text.c (text_update): added customizable font support to this
	function

	* pan/articlelist.c (articlelist_update_node): added customizable font
	support to this function
	(add_article_to_ctree): added customizable font support to this function
	as well.

	* pan/prefs.c (display_page): new page in the prefs screen for
	display type settings (fonts, colors).  Added ability to set articlelist
	and message body fonts.

1999-11-01  Charles Kerr <charles@skywalker.ecn.ou.edu>

	* configure.in: check to see what platform we're building on; if
	Solaris, make some platform-specific #defines for config.h

	* acconfig.h: added DIRENT_NEEDS_MAXNAMLEN and AF_NEEDS_SYS_SOCKET_H
        for building out of the box on Solaris.

	* pan/acache.c: on Solaris, use MAXNAMLEN for dirent's d_name buffer.

	* pan/post.c: on Solaris, #include <sys/socket.h>'s AF_INET declaration.

1999-10-30  Charles Kerr <charles@skywalker.ecn.ou.edu>

	* Pan 0.6.2 released.

1999-10-30  Jason Leach  <leach@wam.umd.edu>

	* pan/prefs.c (general_page): added a toggle button for single
	click previewing in paned mode

	* pan/articlelist.c (articlelist_button_press): updated to recognize
	the new global var for one click previewing

	* pan/gui.c (gui_construct): made the 'help' menu right justified

	* pan/text.c (text_select_all): new function

	* pan/text.c (text_update): moved the g_malloc()'ing of the
	'article' global var from text_create() into here... this
	prevents article_get_current() from returning 'TRUE' when
	in fact there is no article in the text box.

1999-10-29  Jason Leach  <leach@wam.umd.edu>

	* pan/props.c (general_page): added a new page to the prefs
	screen, 'General', which lets people tell Pan not to prompt
	to go online.

	* pan/queue.c (queue_active): turned the 9 line function into 3
	lines

	* pan/post.c (send_post): similar fix for gtk_entry_get_text()
	return 	values getting g_free()'d, and guess what: POSTING NOW 
	WORKS!!!

	* pan/groups.c (grouplist_grep): fixed 'find' related segfaults (you
	don't need to g_free() the returned value of gtk_entry_get_text(),
	it says in the GTK+ docs.

1999-10-28  Jason Leach  <leach@wam.umd.edu>

	* pan/props.c (edit_profile_dialog): when doing 'new' from the
	profile editor, set the port section to "119".

	* pan/log.c: flipped the columns around so the log entry comes first
	then the date

1999-10-27  Jason Leach  <leach@wam.umd.edu>

	* pan/db.c (db_load_articles): fixed the mem leak of the
	year, reported by Charles Kerr

	* pan/server.c (server_free): fixed 3 mem leaks reported by
	Charles Kerr

	* pan/sockets.c (put_server_va): fixed mem leak reported by
	Charles Kerr

1999-10-26  Jason Leach  <leach@wam.umd.edu>

	* pan/groups.c: patched using the xchat guy's grouplist loading
	speed-up.  It really is a lot faster.  Currently going to make it
	show all groups by default though.

	* pan/post.c: added #include <sys/socket.h>, to accomodate
	for Solaris compilation.

	* pan/util.c (directory_check): fixed a reported mem leak
	with gchar *dir not being freed after being g_strdup(). (this
	one is actually a leak! and my fix doesn't segfault! w00p!)

	* pan/article.c (article_delete): fixed a bug (I made) with
	deleting messages causing a segfault.

	* pan/props.c (paths_page): fixed the bug the xchat guy reported

	* pan/articlelist.c (articlelist_button_press): added single
	click message viewing (while in paned mode), 
	similar to netscape/outlook (it was requested heavily by users).
	Try it out.

	* pan/gui.c (gui_shutdown): fixed bug with column widths not
	being preserved in paned mode.

	* pan/groups.c (grouplist_select_row): Function select_group_row()
	renamed to grouplist_select_row(), all references
	changed as well.

	* pan/groups.c: added group_{get,set}_attrib_char() functions,
	to be used in the per group configuration options (for download
	directory and such).

1999-10-23  Matt Eagleson <emessiah@superpimp.org>

	* Applied patches for memleak fixes and Japanese translation
	contributed by Shingo Akagaki <akagaki@ece.numazu-ct.ac.jp>
	* Tried a new experimental online/offline manager thread

1999-10-19  Jason Leach  <leach@wam.umd.edu>

	* pan/article.c (article_delete): decrease the 'Unread' and 'Total'
	count when an article is deleted.
	
1999-10-18  Jason Leach  <leach@wam.umd.edu>

	* pan/pan.h: removed unused variables 'int p[2]' and 'gchar *error'
	from the Pan data structure.

1999-10-11  Jason Leach  <leach@wam.umd.edu>

	* Pan 0.6.1 released.

1999-10-11  Jason Leach  <leach@wam.umd.edu>

	* pan/gui.c: added some key bindings for the menu's, so you can do
	ALT-O to pull up the 'Online' menu and so forth (previously only File,
	Help, and Edit were keyboard accessible).

	* pan/articlelist.c (add_article_to_ctree): added code that sums
	up the total line count of all parts of a multipart and makes the
	ctree show the sum of the linecounts
	(build_article_ctree_recursive): make it so that complete multipart
	posts don't have the thread siblings in the article_ctree, so you
	can't 'expand' the view... I think it's nice (it's how agent did
	it)...

1999-10-08  Jason Leach  <leach@wam.umd.edu>

	* pan/articlelist.c (articlelist_find_text_cb): find entry
	grabs focus now, so when a user does CTRL-F or find from
	the menu, it's ready to accept keyboard input.

	* pan/log.c: log viewer switched to using a GtkClist widget
	instead of a GtkText... which was the original plan anyhow.
	It looks smooth (and it'll be easy to set colors now too).

	* all strings marked for i18n and all files included into
	POTFILES.in

1999-10-07  Jason Leach  <leach@wam.umd.edu>

	* pan/groups.c (group_empty_dialog): the 'group empty' dialog
	should have been modal in the first place.
	
	* pan/props.c (paths_page): prefs for paths switched to using
	GnomeFileEntry widgets, which provide neat features like a 'browse...'
	button that pops up a dir selector, and a history dropdown list.

	* pan/log.c: file saving finished and functional, edit menu (just
	copy, but cut and paste done and ready to be uncommented) working,
	statusbar that assists with menu selections

1999-10-06  Jason Leach  <leach@wam.umd.edu>

	* pan/groups.c (group_empty_cb): switched grouplist_update() to
	grouplist_update_row(), now called in any group_mode... better
	because if you empty a group in a mode other than 'subscribed'
 	before, it didn't update to show that there are now 0 unread
	and 0 total. It's not totally finished yet... 

	* pan/nntp.c (nntp_articlelist_download): 'Total' is set to the
	wrong thing when 'get new' is done... 'total' gets set to the
	same thing as 'Unread' ... fixed.

	* pan/props.c: removed all of the old properties crap for
	log_dir and stuff... no dir is needed anymore with the
	new logging setup.

	* pan/decode.c: switched all the article caching stuff back
	to 'data_dir' instead of 'temp_dir' ... would still like to
	split them apart sometime later though...

	* pan/text.c (text_create): oops, the message box was set to
	be editable, we don't want that :)
	
	* pan/log.c: rewrote the log viewer and how it works.  Test it out,
	I actually like the looks of it _A LOT_ already =).  Still a lot of
	missing things though...
	
1999-10-05  Jason Leach  <leach@wam.umd.edu>

	* pan/gui.c (gui_construct): added gnome_app_install_menu_hints()
	call, check the statusbar as you go through the menu's now...
	groovy and professional looking (getting closer to removing
	the infobar)

	* pan/xpm/pan_druid.xpm: shrunk the image down a little, the
	old one was big, and this looks nicer in a 1.0.40+ GnomeDruid.

	* pan/queue.c (queue_run_decode): the lag between the download phase
	and when the actual progress bar for decoding started is due
	to uulib's loading the files up and processing them.  So I changed
	the statusbar to report 'preparing article %s for decode', to indicate
	that decoding hasn't actually started.  The preparing phase seems
	kind of slow... we'll have to look into that.

	* pan/acache.c (acache_open_body): if ACACHE_KEEP isn't set, then
	the cache dumps/opens from the 'temp_dir', not the 'data_dir'

	* pan/decode.c (article_decode): decode pulling bodies from the
	temp dir now.

	* pan/druid.c (druid_spawn): 'cancel' is now functional, destroying
	the druid window...

	* pan/acache.c: added preprocessor define DEBUG_MSG to
	control whether the debug messages ("cache delete: blah", etc.)
	are shown... it should be off in the next public release

	* pan/decode.c (UUD_busy_callback): progress bar shows
	actual decoding progress now.

	* pan/nntp.c (nntp_articlelist_download): check out the sweet
	new statusbar information when doing 'get all headers'

	* pan.desktop: new file, contributed by Datazone

	* pan.spec: gnome-libs requirements jacked up to 1.0.16,
	where it should be

	* pan/groups.c (select_group_row): if the group is already
	loaded, don't load it again!

	* pan/pan.h: removed the GnomePixmaps from the Pan struct, moved
	them to articlelist.c as static variables with the other pixmaps

	* pan/gui.c: split off notebook and paned code into gui-paned.c
	and gui-notebook.c (and .h header files of both)

	* pan/props.c: no reason to include <gtk/gtk.h>, gnome.h includes
	that already.

1999-10-04  Jason Leach  <leach@wam.umd.edu>

	* Pan 0.6.0 released.

1999-10-04  Jason Leach  <leach@wam.umd.edu>

	* pan/text.c (text_create): now using a GtkScrolledWindow widget
	too.  It's just so smooth and pretty.

	* pan/post.c: now using GnomeUIInfo structs for the menu's and
	toolbar.  Equal functionally to the old setup, just a lot easier
	to add new toolbar/menu items and much less code in general.
	(create_text_area): switched to using a GtkScrolledWindow widget
	instead of manually making GtkAdjustments.  Creates smoother
	and more 'automatic' scrollbars (also allows mouse scrolling).

1999-10-01  Jason Leach  <leach@wam.umd.edu>

	* pan/articlelist.c: moved the GnomeUIInfo struct for the popup
	menu from gui.c into articlelist.c, the home of the popup menu

	* pan/groups.c (create_groups_clist_menu): function deprecated,
	removed

	* pan/groups.c: moved the GnomeUIInfo struct for the popup menu
	from gui.c into groups.c, the home of the popup menu itself.

	* pan/articlelist.c (create_article_ctree_menu): function deprecated,
	removed

	* pan/gui.c (gui_paned_construct): gtk_widget_show_all at end
	shows entire contents_vbox, not just the paned part (fixes infobar
	being destroyed bug)
	(gui_notebook_construct): same as above

1999-09-30  Jason Leach  <leach@wam.umd.edu>

	* pan/pan.c (main): added calls to gettext functions for i18n	

	* pan/groups.h: all functions prototyped	

	* pan/articlelist.c (add_article_to_ctree): unused char *p removed

	* pan/articlelist.h: all functions prototyped

	* pan/gui.h: all functions prototyped

	* pan/log.c (log_add): fixed two mem leaks

	* pan/nntp.h: all functions prototyped

	* pan/decode.h: added prototypes for functions in decode.c

	* pan/text.h: was missing a prototype

	* pan/queue.h: added prototypes for functions in queue.c

	* pan/date.h: added prototypes for _all_ functions in date.c,
	moved some of the #define macros into here, and the data
	structures as well.

	* pan/props.h: Added prototypes for _all_ functions in props.c

1999-09-26  Jason Leach  <leach@wam.umd.edu>

	* pan/groups.c (group_empty_dialog): improved group_empty_dialog
	popup ascthetics some.

	* pan/groups.h (struct _group_data): couldn't find any place that
	was actually using the 'row' variable, commented it out, everything
	still works great, and that frees up 64k mem (and speeds grouplist
	loads a little). w00p.

	* pan/db.c (db_group_index_erase): new function, removes the
	groups .gdbm file

	* pan/groups.c (group_empty): created group_empty functions
	that wipe out all articles, the gnome_config section for that group,
	the .gdbm database for that, and also basically 'unloads' the
	article_clist if the group being emptied is the currently
	viewed group.

	* pan/gui.c (gui_popup_draw): new function, use this instead of
	gtk_widget_show_all on a window that's gonna be a popup of Pan.

1999-09-24  Jason Leach  <leach@wam.umd.edu>

	* pan/article.h: the #define's for STATE were 0-256, skippin over 
	the number 1.  Because we might need to add another STATE (CACHED), we
	need the max to be less than 256, so I dropped down the numbers
	so now its 0-128.
	WARNING: this will break your article databases (no big deal, we're
	restructuring to do caching already :)), so you must delete your .gdbm
	files in your ./pan/data dir.

	* pan/groups.c: grouplist_selected_* created, mimicks the
	process_selected type of articlelist, where one function actually
	grabs the selected and runs a switch on different possabilities.
	makes callback functions 1 line :)

	* pan/gui.c (gui_set_title): sets the title to reflect the current
	open group, added calls to it in appropriate places.  works 
	wonderfully

1999-09-23  Jason Leach  <leach@wam.umd.edu>

	* pan/groups.c (grouplist_load): checks to see if group exists,
	and if so, set the GROUP_ONDISK flag.

1999-09-22  Jason Leach  <leach@wam.umd.edu>

	* pan/articlelist.c (create_articlelist_ctree): lightened up the 
	'unread' color a little bit

	* pan/gui.c (gui_save_column_widths): new function, saves the column
	widths using gnome_config_*
	(gui_restore_column_widths): new function, restore the column widths, 
	also using gnome_config_*

	* GIMPed the icons and made some changes!  now they got pretty
	bright colors, and a sorta gradient style.  Some of the colors
	will change, but I like the binary_complete and binary_incomplete 
	style.
		
	* pan/db.c: removed 3 extra #include definitions

	* pan/article.c (article_mark_read): new function, marks an
	article as read and then updates its node in the article list.
	(article_mark_unread): new function, marks an article as unread
	and then updates its node in the article list.

	code cleaned up, function defs in alpha order, removed 2 unneeded 
	#include

	* pan/articlelist.c (articlelist_process_selected): added
	articlelist_ to front of function name, changed all calls to old.

	created articlelist_selected_ functions, adding mark_read and
	mark_unread into the arsenal.
	
1999-09-20  Matt Eagleson <e.messiah@superpimp.org>

	* pan/nntp.c: Big changes to the go_online stuff and
	the queue stuff.  We now run the queue thread constantly
	and use a condition variable to wake it up at the right times.
	We also stay online until we are asked to go offline.
	
1999-09-20  Jason Leach  <leach@wam.umd.edu>

	* pan/groups.c (create_groups_clist_menu): switched the popup
	menus to use the GnomeUIInfo struct

	* pan/articlelist.c (create_article_ctree_menu): switched the
	popup menus to use the GnomeUIInfo struct

	* pan/gui.c: switched the main_menu struct to use _MENU_EDIT_TREE
	and _MENU_HELP_TREE instead of _SUBTREE, to be a little more
	standard (and now you can do alt-e or alt-h to get to the
	edit/help menu popups)

1999-09-18  Jason Leach  <leach@wam.umd.edu>

	* pan/queue.c (queue_processing): added text_clear() before the
	article download itself, wipe the old text from the message area.

	* pan/text.c (text_update): added a call to gtk_widget_draw at the 
	end to solve a problem involving display when text_clear was
	called earlier than text_update
	
	* pan/text.c (text_clear): renamed to text_clear from clear_text,
	* pan/gui.c (gui_key_press_cb): pressing 'q' and 'return' in any
	of the notebook pages does the equivalent of flipping out of a
	page (q) and double clicking on the selected (enter).
	(gui_page_change): new function with some dope, but somewhat
	sloppy code for doing the notebook page flipping.

1999-09-17  Jason Leach  <leach@wam.umd.edu>

	* pan/articlelist.c (article_ctree_button_press): when it
	automatically flips to the message page in notebook view, the
	keyboard focus will now be set to the text body

1999-09-16  Jason Leach  <leach@wam.umd.edu>

	* pan/gui.c: 'find' and 'find next' menu entries moved into Edit menu.

	* pan/groups.c (select_group_row): double clicking on a group in
	the group list flips to the article list tab in notebook view.

	* pan/articlelist.c (article_ctree_button_press): double clicking
	on a message in the article list flips to the message tab in
	notebook view.

1999-09-14  Jason Leach  <jleach@erols.com>

	* pan/druid.c (druid_spawn): now the druid has our beautiful pan
	logo for a 'watermark' (left side of the druid).  Kinda stretched, 
	but I don't see any functions/easy method for setting sizes of the 
	sections of a druid page.
	(druid_spawn): cancel button actually closes druid now.

1999-09-13  Jason Leach  <jleach@erols.com>

	* pan/druid.c: new druid wizard replacing the depreciated guru
	wizard for first time runs of Pan.  Really needs some work on
	improving the look of it (kinda ugly and defaultish at the moment).

	* pan/pan.c (main): switched to druid_spawn() from guru_spawn()

1999-09-12  Jason Leach  <jleach@erols.com>

	* pan/nntp.c (articlelist_download): commented out first instance
	of gdata->articles += count;  I'm almost certain that it was
	doubling the article count when it reports how many articles have
	been downloaded after you 'retrieve all' on a group.

	* pan/groups.c: Removed itoa() and reverse() functions,
	g_strdup_printf is better.

1999-09-10  Jason Leach  <jleach@erols.com>

	* pan/articlelist.c (create_articlelist_ctree): column width of
	lines and date are set with _auto_resize instead of hard coded sizing.
	The subject field is still set to a static 400 pixels width, for
	the moment.

 	* pan/groups.c (grouplist_update_row): show the message counts in
	a separate column, add sorting by that information later.

1999-09-09  Jason Leach  <jleach@erols.com>

	* pan/groups.c (grouplist_grep): grep_activated renamed to
	grouplist_grep
