2009-02-01  Thomas Mills Hinkle  <tom@hydrophax>

	* src/lib/plugins/key_editor/keyeditor.glade: Remove "Edit
	nutritional info" button.

	* src/lib/plugins/key_editor/keyEditor.py (KeyEditor): Remove
	references to nutritional info. Update to work with current DB
	front-end.

	* src/lib/gtk_extras/treeview_extras.py (selectionSaver.add_selection):
	Fix mysterious bug that occurred when we tried to use sqlalchemy
	0.5 rowobjects as dictionary keys.
	(selectionSaver.restore_selections): Fix mysterious bug that
	occurred when we tried to use sqlalchemy 0.5 rowobjects as
	dictionary keys.

	* src/lib/backends/db.py (RecData.get_ingkeys_with_count):
	Implement the functionality needed for a keyEditor interface.

	* src/lib/gglobals.py: ++ png icons for reccard and reccard_edit.

2009-01-31  Thomas Mills Hinkle  <tom@hydrophax>

	* src/lib/plugins/unit_display_prefs: New plugin that allows user
	to specify which kinds of units to display, resulting in
	displaying e.g. all metric units without the need to tinker with
	the underlying data.

	* src/lib/defaults/defaults_en_GB.py (CONVERTER_TABLE): Add units for
	non-American cups (Japanese cup, metric cup, imperial cup,
	imperial pint).

	* src/lib/defaults/defaults_en.py (CONVERTER_TABLE): same change as defaults_en.py

	* src/lib/defaults/defaults.py (unit_rounding_guide): Add
	parameter unit_rounding_guide (which can be overridden in the
	defaults_XX files). This allows us to hone what kinds of decimal
	values we show for different units.

	* src/lib/backends/db.py (RecData.get_amount_and_unit): Make
	get_amount_and_unit take arguments favor_current_unit and
	preferred_unit_group to allow further control over how it handles
	conversion. Also make pluggable, enabling our new
	unit_display_prefs plugin to do its work.

	* src/lib/shopping.py (Shopper._ing_compare): Disable special
	ingorder comparisons, falling back to alphabetical. In the future,
	it would be worth looking into what was implemented and why it was
	failing -- I've simply disabled the functionality since it wasn't
	working properly anyway.

	* src/lib/reccard.py (RecCardDisplay.toggle_readable_units_cb):
	Fix reference to obsolete method resetIngList (replaced by
	display_ingredients)

	* src/lib/plugin_loader.py (Pluggable.run_pre_hook): Changed API
	around pre_hook -- pre-hooks can now modify the args fed to the
	function they're hooking around by returning args,kwargs as the
	return value. If they don't return a tuple and a dictionary, then
	we fail with a warning (this means the old API will fail with a
	warning until I update old plugins that use this).
	(pluggable_method._): Changed pre-hook API (see above)

	* src/lib/convert.py (float_to_metric): Changes to float-to-metric
	to allow rounding based on an approx value rather than always
	assuming we want 2 decimal points.
	(float_to_frac): Return a simple integer if we're within approx of
	an integer.
	(Converter.adjust_unit): Accept a parameter
	preferred_unit_groups. If we have this parameter, we look for
	conversions within our preferred groups and convert if possible. A
	group could be, e.g. metric mass, metric volume, imperial volume,
	etc., as defined in UNIT_GROUPS in defaults.
	(Converter.readability_score): Adjust scoring algorithm: being a
	weird decimal is less bad than being out of the defined range (I
	was getting values like 2034 mL instead of 2 L because it
	preferred the integer (2034) to the decimal even though the
	integer was outside the preferred range for mL).

2009-01-28  Thomas Mills Hinkle  <tom@hydrophax>

	* src/lib/reccard.py: Add shop-recipe to menus. Add key commands
	for most menu items.

	* glade/shopList.glade: Remove nutritional info button/icon (this
	should become a plugin anyway)

	* test_deb.sh (LATEST_DEB): Remove python version specificity.

	* Released 0.14.4 to SF as .deb and .tar.gz

	* src/lib/gtk_extras/treeview_extras.py (selectionSaver.restore_selections):
	Change variable names from iter->itr (to avoid unintended
	consequences). Unsuccessfully trying to get at mysterious
	traceback in restore_selections and add_selection (somehow builtin
	dictionary method get() is not working).

	* images/reccard.ico: Added reccard icon

	* images/Nutrition.png: Moved to the plugin

	* src/lib/plugins/nutritional_information/images/Nutrition.png: Moved from images/

2009-01-27  Thomas Mills Hinkle  <tom@hydrophax>

	* create_manifest.py: Add png's to plugin files to include; add images/*.ico to included files.

	* gourmet.desktop.in (Categories): Category->Utility

	* setup.py: Apply debian patch; include png etc.

	* src/lib/plugins/nutritional_information/main_plugin.py (NutritionMainPlugin.activate):
	Add nutritional icon.

	* src/lib/plugins/import_export/website_import_plugins/foodnetwork_plugin.py (test_url):
	Be less verbose.

	* src/lib/plugins/import_export/website_import_plugins/about_dot_com_plugin.py (test_url):
	Be less verbose.

	* src/lib/gtk_extras/treeview_extras.py: Remove python version
	dependency

	* src/lib/version.py (version): Version->0.14.4
	(copyright): ++2009

	* src/lib/threadManager.py (ThreadManagerGui): Fix resizing
	ugliness on table (it's still ugly, but less so)

	* src/lib/reccard.py (RecCardDisplay.setup_main_window): Add icon
	(RecEditor.setup_main_interface): Add icon

	* src/lib/gglobals.py (add_icon): Rework code for adding icons to
	make it easy for plugins to add stock icons using the convenience
	function add_icon

	* src/lib/gdebug.py: Remove python version dependency.

	* src/lib/GourmetRecipeManager.py (RecGui.setup_main_window): Add icon to window.

2009-01-19  Thomas Mills Hinkle  <tom@hydrophax>

	* src/lib/timeScanner.py (make_time_links): Remove line that
	escaped text automatically (caller can handle escaping)

2009-01-18  Thomas Mills Hinkle  <tom@hydrophax>

	* src/lib/gtk_extras/TextBufferMarkup.py (PangoBuffer.set_text):
	Give a better error message when we have problems with unescaped
	text.

	* src/lib/gtk_extras/LinkedTextView.py (set_text): Remove line
	that unescapes incoming text (this was an attempt to fix another
	bug in the wrong place, but it causes problems when the clients
	are behaving properly...)
	(set_text): Remove line that unescapes incoming text (see above
	comment about dumb fixes creating more problems than they solve).

	* src/lib/plugins/python_shell/ipython_view.py: Eitan Isaacson's
	IPython console widget, with a few modifications.

	* src/lib/plugins/python_shell/__init__.py (ConsolePlugin): Plugin
	to allow access to a python shell from within Gourmet. This is
	incredibly handy for testing/development. It also allows a
	super-geeky user to modify their DB on the fly etc.

	* src/lib/plugins/field_editor/__init__.py (FieldEditorPlugin.show_field_editor):
	Grab GourmetApplication singleton rather than relying on pluggable
	being the GourmetApp, which it isn't always.

	* src/lib/plugins/browse_recipes/browser.py (RecipeBrowserView):
	to selection-multiple mode
	(RecipeBrowserView.get_selected_recipes): Add handy method to grab
	selected recs.
	(RecipeBrowserView.reset_model): Add handy method to reset model
	in response to DB updates.

	* src/lib/plugins/browse_recipes/__init__.py (BrowserPlugin): Set
	up hooks so that actions-on-recipes work (add-to-shopping list,
	delete, etc)

	* src/lib/backends/db.py (RecData.fetch_count): Fix fetch_count to
	actually work as described. Previously, it ignored criteria.
	(RecData.fetch_len): Fix fetch_len to actually use criteria.

	* src/lib/plugin_loader.py (Pluggable.run_post_hook): Post hooks
	should be allowed to modify the return value -- now they're
	required to do so (otherwise they change the return value of the
	method to None, of course.

	* src/lib/GourmetRecipeManager.py (RecGui.get_selected_recs_from_rec_tree):
	Add this method here as a pluggable_method so that plugins can
	implement recipe browsers/search of their own and have it work
	with actions that require selected recipes.
	(RecGui.update_recipe): Make pluggable
	(RecGui.redo_search): Make pluggable
	(RecGui.delete_open_card_carefully): Use
	get_selected_recs_from_rec_tree for deletion (this allows plugins
	to simply modify get_selected_recs_from_rec_tree and have deletion
	of selected recipes work right)
	(RecGui.rec_tree_delete_recs): Add call to show user a message
	telling them they've deleted recipes and offering undo.
	(RecGui.setup_delete_messagebox): Method to set up a message to
	user offering undo after delete.

2009-01-16  Thomas Mills Hinkle  <tom@hydrophax>

	* src/lib/plugins/field_editor.gourmet-plugin.in: Added field
	editor plugin (provides material previously in valueEditor
	module).

	* src/lib/GourmetRecipeManager.py (showValueEditor): Removed value
	editor -- this is now a plugin (field-editor).

	* src/lib/ValueEditor.py - removed file (moved to field_editor plugin)

2009-01-13  Thomas Hinkle  <tom@grenville>

	* src/lib/plugins/browse_recipes/images/cooktime_empty_clock.png:
	Adjust pixel height so preptime and cooktime clock-pie-wedges can
	be drawn with same size and position
	
	* src/lib/batchEditor.py (BatchEditor.setup_glade): Use new
	gglobals-based custom handler system.

	* src/lib/GourmetRecipeManager.py (StuffThatShouldBePlugins.batch_edit_recs):
	Fix batch edit callback (self.update_rec_iter ->
	self.rmodel.update_recipe

2009-01-13  Thomas Mills Hinkle  <tom@hydrophax>

	* src/lib/backends/db.py (RecData.fetch_count): Correctly alias
	select "COUNT AS COUNT" using sqlalchemy's "label" keyword,
	avoiding ugly hack that fails in 0.5 anyway.

	* src/lib/exporters/exportManager.py (ExportManager.do_single_export):
	Fix API for exporting single recipes (this fixes recipe export
	from recipe card view).

2009-01-12  Thomas Mills Hinkle  <tom@hydrophax>

	* src/lib/backends/db.py (make_order_by): Sort nulls last
	(RecData.search_recipes): Special case sorting of 'rating' (the
	default feels backwards)

2009-01-11  Thomas Hinkle  <tom@grenville>

	* src/lib/plugins/browse_recipes/browser.py (RecipeBrowser.append_button):
	Use i18n'd text rather than attribute names themselves for
	breadcrumbs buttons.
	(RecipeBrowserView.get_pixbuf): Use generic icons differentiated
	by attribute (source, category, etc)
	(RecipeBrowserView.build_base_model): Don't browse by link attribute.
	(RecipeBrowserView.get_base_icon): Use base icons from icon_helpers.py

	* src/lib/plugins/browse_recipes/icon_helpers.py (get_pixbuf_from_image):
	Add the rest of the icons.

2009-01-11  Thomas Mills Hinkle  <tom@hydrophax>

	* src/lib/importers/imageBrowser.py (ImageBrowserDialog.setup_dialog):
	Fix giant-dialog-window problem caused when Progressbar gets
	super-long text (e.g. if an image name is gigantic). Fixes Ubuntu
	bug #289861

	* src/lib/backends/db.py (make_simple_select_arg): Update in_()
	call to comply with SQLAlchemy 0.5 API change.

2009-01-10  Thomas Mills Hinkle  <tom@hydrophax>

	* src/lib/backends/db.py (RecData._setup_object_for_table): All
	tables need an explicit primary key declared now -- sqlalchemy no
	longer supports implicit oid/rowid in 0.5
	(RecData.setup_info_table): Add sqlite rowid column to table
	explicitly.

	* src/lib/plugin.py (MainPlugin): Add base methods to MainPlugin
	to make it easy to add a tab to main interface (add_tab)

	* src/lib/GourmetRecipeManager.py (RecGui.setup_main_window): Add
	notebook to which plugins can add tabs.

2009-01-07  Thomas Mills Hinkle  <tom@hydrophax>

	* src/lib/plugins/nutritional_information/parser_data.py (ABBREVS):
	Remove RED as abbreviation (and add more specification
	abbreviations like RED NA, RED FAT, RED CAL). (bug # 2492442)

	* src/lib/plugins/browse_recipes/* Implement basic recipe browsing
	interface as alternative to search (a new plugin).

2009-01-03  Thomas Hinkle  <tom@grenville>

	* src/lib/plugins/duplicate_finder/recipeMerger.glade: Add
	auto-merge button to glade file. Rename some buttons for
	convenient handling from recipeMerger dialog.

	* src/lib/importers/plaintext_importer.py (TextImporter.pre_run):
	Change attribute total to total_lines to avoid confusing ourbase
	class into thinking that we know how many recipes have based on
	how many lines we have (this fixes a bug where users would see
	something like "Imported 56 of 5000 recipes" for a 5000 lines text
	file with 56 recipes in it).

	* src/lib/importers/importManager.py (ImportManager.__init__): Add
	support for ImportManager plugins (which are separate from our
	standard ImporterPlugins). This allows our RecipeMerger plugin to
	add a post-import hook.

	* src/lib/plugin.py (ImportManagerPlugin): Add base class for
	plugings that modify the ImportManager itself (not new import
	plugins which are already covered by the ImporterPlugin)

	* src/lib/plugins/duplicate_finder/recipeMergerPlugin.py (RecipeMergerImportManagerPlugin):
	Separate out plugin that adds a check for duplicates after new
	imports

	* src/lib/plugins/duplicate_finder/recipeMerger.py (RecipeMergerDialog.merge_next_recipe):
	Add label to interface showing how many recipes have been merged
	so far (giving user a sense of progress).
	(RecipeMergerDialog): Add last_modified time to list of attributes
	shown to user so they can see which recipe is older/newer.
	(RecipeMergerDialog.offer_auto_merge): Add option to automatically
	merge, always selecting for newer or older recipes.

	* src/lib/GourmetRecipeManager.py (GourmetApplication.setup_recipes):
	Remove misleading catchall database connection error message

	* src/lib/check_encodings.py (getEncoding): Fix typo that broke
	encoding dialog by always returning ascii

2008-12-28  Thomas Mills Hinkle  <tom@hydrophax>

	* README: Cut down README to keep it from going out of date so
	fast; update README to describe plugin system; add reportlab as a
	requirement.


2008-12-22  Thomas Hinkle  <tom@grenville>

	* src/lib/plugins/import_export/mealmaster_plugin/mealmaster_exporter_plugin.py (MealmasterExporterPlugin):
	Mealmaster file are text/plain, not text/html

	* src/lib/plugins/import_export/gxml_plugin/gxml_exporter_plugin.py (GourmetExporterPlugin.get_multiple_exporter):
	Remove obsolete references to progress_func

	* src/lib/plugins/import_export/gxml_plugin/gxml2_exporter.py (__init__):
	Remove obsolete references to progress_func

	* src/lib/plugins/import_export/pdf_plugin/pdf_exporter_plugin.py (PdfExporterPlugin.get_default_prefs):
	Add method to bypass prefs dialog when necessary.

	* src/lib/gtk_extras/dialog_extras.py (get_type_for_filters):
	Separate function to grab the type of a file based on the filters
	used to save it. Split this out of the functions that get the
	actual file.

	* src/lib/exporters/exportManager.py (ExportManager): Split off
	separate do_multiple_export and do_single_export methods to allow
	outside functions/plugins to use exporters without having the user
	select the file name/type through the UI.

	* src/lib/backends/db.py (RecData.backup_db): Warn user when doing
	a DB update with little/no feedback on progress.

	* src/lib/plugin.py (ExporterPlugin): Add get_default_prefs method
	as alternative to run_extra_prefs_dialog (to enable full
	automation, for example, of libraries that like to ask users for
	prefs)

	* src/lib/plugins/email_plugin/*: Pluginify email
	functionality. We now just support PDF and plain text (the HTML
	was a failed attempt to write HTML email anyway)

	* TESTS: Add some more tests we should do before stable releases.

2008-12-21  Thomas Hinkle  <tom@grenville>

	* src/lib/plugins/import_export/plaintext.gourmet-plugin.in (_Comment):
	++export.

	* src/lib/plugins/import_export/plaintext_plugin/__init__.py: Add
	plaintext_exporter to plaintext_plugin.

	* src/lib/backends/db.py (RecData.backup_db): Let user know when
	we're doing a potentially slow DB upgrade (note that this is
	implemented directly in GTK so the DB code now depends on GTK at
	least in the upgrade spot; if we ever properly abstract the DB for
	another front-end we'll need to rework this.

	* src/lib/plugin.py (BaseExporterPlugin.add_field.do_write): Don't
	pass mark-up to exporters that expect plain text.

2008-12-19  Thomas Hinkle  <tom@grenville>

	* src/tests/testImporters.py (ImportTestCase.testArchive): Add
	test of archive plugin

	* src/lib/plugins/import_export/archive_plugin/zip_importer_plugin.py (ArchiveImporterPlugin.test_file):
	Fix file pattern matching using fnmatch.

	* glade/preferenceDialog.glade: Hide label for removing items you
	don't use from recipe card interface, since this interface isn't
	currently functional anyway.

	* src/lib/exporters/exporter.py (exporter): Create new
	ALLOW_PLUGINS_TO_WRITE_NEW_FIELDS attribute (defaults to True).

	* src/lib/plugins/import_export/gxml_plugin/gxml2_exporter.py (rec_to_xml):
	Don't allow plugins to create new fields since supposedly we could
	be creating valid XML and plugins would create a moving target.

	* src/lib/plugin.py (BaseExporterPlugin.add_field.do_write):
	Respect new exporter attribute ALLOW_PLUGINS_TO_WRITE_NEW_FIELDS
	which allows exporters to prevent their write_attr/write_text
	methods from being called with new plugin-invented fields

	* src/lib/importers/importManager.py (ImportManager.get_filters):
	Remove repeat filetypes in file dialog filter dropdown + add "All
	importable files" filter as default file filter.

	* src/lib/check_encodings.py (EncodingDialog.create_options): Make
	encodings in encoding choosing dialog follow order given in source
	code for encodings/all_encodings (presumably the order of common
	to uncommon).
	(getEncoding): If user cancels dialog, give them the first
	encoding on the list rather than throwing an error.

2008-12-19  Thomas Mills Hinkle  <tom@hydrophax>

	* src/lib/check_encodings.py: Fix bug #2446589 by adding utf-16 to
	our list of commonly tried encodings. Also, fix a bug in
	check-encodings/diffy code.

2008-12-16  Thomas Hinkle  <tom@grenville>

	* src/lib/plugins/import_export/web_import_plugin/webpage_importer.py (WebParser.__init__):
	Instantiate InteractiveImporter in __init__.py call.

	* src/lib/importers/imageBrowser.py (grab_thumbnail): Ignore errors
	in thumbnail creation (with warning).

	* src/lib/plugins/nutritional_information/data_plugin.py (NutritionDataPlugin.do_add_nutrition):
	Add do_add_nutrition convenience method (fix bug #2405494)

2008-12-15  Thomas Mills Hinkle  <tom@hydrophax>

	* src/lib/plugin_loader.py (MasterLoader.register_pluggable):
	Fixed warning message.

	* src/lib/GourmetRecipeManager.py (SuspendableDeletions): Create
	class for running deletions in their own thread. This used to be
	in the moribund GourmetThreads module.
	(purge_selected_recs): Update deletion code to work with new
	threadManager module.
	(ImporterExporter): Get rid of unused old code.
	(purge_rec_tree): Remove old lock-checking code.
	(RecGui.purge_rec_tree): Update deletion code to work with new
	threadManager module.

	* src/lib/gtk_extras/LinkedTextView.py (LinkedPangoBuffer.set_text):
	Unescape all text so that markup outside of links works
	properly (fixes bug where <span> tags showed up in recipe card
	display view.)

2008-12-13  Thomas Hinkle  <tom@grenville>

	* src/lib/exporters/exportManager.py (ExportManager.offer_single_export):
	Give us a useful error message when ignoring an invalid file mode.

	* src/lib/backends/db.py (RecData._format_amount_string_from_amount):
	Don't set default here to be FRACTIONS_ALL. Instead, default to
	use the converter default (whatever that has been set to). This
	will be correct as far as i18n etc.

2008-12-13  Thomas Mills Hinkle  <tom@hydrophax>

	* src/tests/testImporters.py: Update testImporters to work with
	importManager.

	* src/tests/test.py: Use same method gourmet_in_place uses for
	making sure we use our version of Gourmet libraries and not ones
	installed elsewhere in system.
	(profile): Add convenience function for profiling calls.

	* src/lib/plugins/unit_converter/convertGui.py (ConvGui.__init__):
	Use new convert.get_converter() method instead of
	convert.Converter()

	* src/lib/plugins/nutritional_information/enter_nutritional_defaults.py:
	Use new get_converter() method.

	* src/lib/plugins/import_export/mastercook_import_plugin/mastercook_importer_plugin.py (MastercookTextImporterPlugin.get_importer):
	Fix typo (actually return an importer object instead of none).

	* src/lib/plugins/import_export/mastercook_import_plugin/mastercook_importer.py (MastercookXMLHandler.IngR_handler):
	Update start_ing() call (we no longer set recipe_ids before
	commit-time.

	* src/lib/plugins/import_export/gxml_plugin/gxml2_importer.py (RecHandler.endElement):
	Make sure our keys in our dictionary rec are all strings and not
	unicode objects (this throws an error on the DB side).

	* src/lib/version.py (version): 0.14.3 - Get ready for another release soon.
	* src/lib/importers/importer.py (Importer.__init__): use new
	get_converter() method to get Converter singleton. This speeds up
	import by a factor of 3 or so (we were wasting a lot of time
	instantiating new Converter classes all the time because we
	weren't passing it around as designed. It's easier just to use the
	singleton and not have to worry about remembering to pass the
	converter instance back and forth.
	(Importer.check_for_sleep): Fix name error (we no longer import
	anything as gt)
	(Importer.start_rec): Add a warning when ingredients are left from
	previous recipe at start of next recipe.
	(Importer.start_rec): Don't generate new id in start_rec code.
	(Importer.commit_rec): Fix IDs here -- if we have an ID from our
	importer, we add it here to our ID converter (or get it from our
	ID converter if we already created it -- if, for example, another
	recipe in the import referenced this recipe before it was
	created).  We also add ingredients to the database all at once now
	rather than making separate INSERT calls for each ingredient.
	(Importer.start_ing): No longer set recipe_id up in start_ing --
	it will be handled in commit_rec now.
	(Importer.finish_ing): Change commit_ing to finish_ing as we no
	longer commit our ingredients here (we commit all ingredients
	together in commit_rec. This should help speed up imports.
	(Importer.commit_ing): commit_ing is now an alias for finish_ing
	-- this enables all our old code to keep working. However, if any
	old code actually depended on commit_ing commiting the ingredient
	to the database, it will break. The model now is that we run
	start_ing and finish_ing for each ing before running commit_rec.
	(MultipleImporter): Remove MultipleImporter class. This is now
	handled in importManager (and has been for some time)

	* src/lib/importers/importManager.py (ImportManager.__init__):
	Singleton exception should be the first thing that happens here.
	(ImportManager.get_app_and_prefs): Move the get_application() call
	out of __init__ for convenience of subclassing (this allows the
	creation of non-gui-dependant subclasses easily.

	* src/lib/gtk_extras/timeEntry.py (TimeEntry.__init__): use new
	get_converter() method to get Converter singleton.

	* src/lib/exporters/exporter.py (exporter.__init__): use new
	get_converter() method to get Converter singleton.

	* src/lib/backends/db.py (RecData.initialize_connection): Run
	commit() once after initialization. This appears to fix a problem
	where some importers were throwing a "database locked" error on
	import if no recipe had been created yet in that instance of the
	application.
	(RecData.add_rec): Always return ID of recipe (it was
	unpredictable before whether this would return an ID or an object.

	* src/lib/timeScanner.py (c): use new get_converter() method to
	get Converter singleton

	* src/lib/recipeManager.py (DatabaseShopper.init_converter): use
	new get_converter() method to get Converter singleton

	* src/lib/recipeIdentifier.py (hash_recipe): use new
	get_converter() method to get Converter singleton

	* src/lib/convertGui.py (ConvGui.__init__): Converter is now a singleton.
	(get_converter): Convenience method to get the Converter singleton.

	* src/lib/convert.py (Converter.__single): Converter is now a singleton.
	(get_converter): Convenience method to get the Converter singleton.

	* src/lib/GourmetRecipeManager.py (GourmetApplication.__init__):
	use new get_converter() method to get Converter singleton

	(GourmetApplication.setup_prefs): Make sure that we set
	useFractions the same way from prefs and from user toggling.

2008-12-06  Thomas Mills Hinkle  <tom@hydrophax>

	* src/lib/importers/importManager.py: Remove broken import of
	zip_importer (this has moved into a plugin)

	* test_tarball.sh: Print contents of TESTS as a reminder of what
	to test.

	* create_manifest.py (STARTER_LIST): Include TESTS file in MANIFEST

	* MANIFEST: Include TESTS file in MANIFEST (list of common tests
	we should run on releases -- this might be something downstream
	packages want to make sure they run through.

	* src/lib/plugins/import_export/web_import_plugin/webpage_importer.py (WebParser.get_images):
	Ignore <img> tags with no src= attribute (I didn't realize there
	were such tags)

	* src/lib/recipeIdentifier.py (apply_line_markup): Don't throw
	error when we get diff markup we don't expect

	* src/lib/gglobals.py (launch_url): Project Ridley -
	gnome.url_show -> gtk.show_uri

	* MANIFEST Update manifest.

	* src/lib/plugins/import_export/pdf_plugin/pdf_exporter_plugin.py (PdfExporterPlugin.do_single_export):
	Fix name of method.

	* src/lib/plugins/import_export/pdf_plugin/pdf_exporter.py (PdfExporter.__init__):
	Fix handling of output arg that is an open file.

2008-12-04  Thomas Mills Hinkle  <tom@hydrophax>

	* src/lib/gtk_extras/treeview_extras.py (print_tree): Add a handy
	convenience function for debugging treeview changes
	(move_iter): Fix destination description on drag-n-drop
	calls. This should fix dnd.

	* src/lib/gdebug.py (debug_decorator): Add handy decorator for
	quick debugging.

2008-12-02  Thomas Mills Hinkle  <tom@hydrophax>

	* src/lib/plugins/import_export/html_plugin/html_exporter_plugin.py (HtmlExporterPlugin.do_single_export):
	Fix single export (export from recipe card view)

	* src/lib/reccard.py (RecCardDisplay.ui): Eliminate KeyEditor (it's a plugin now).
	(IngredientEditorModule.setup_action_groups): Shorten button names
	for ingredient editing toolbar.
	(TextEditor): Add generic TextEditor base class with copy/paste/cut support.
	(DescriptionEditorModule.ui): Add "Cut" item
	(TextFieldEditor.ui): Add "Cut" item
	(TextFieldEditor.setup_action_groups): Add rich text editing (bold/italic/underline)
	(IngredientController.get_path_from_persistent_ref): Avoid
	throwing error when we don't find an iter (return None instead)
	(IngredientController.commit_ingredients.commit_iter): Save new
	ingredient object into ListStore -- this fixes bug that broke
	editing of new ingredients once committed.
	(UndoableTreeStuff.record_positions): Fix typo (rc->re)

2008-12-01  Thomas Hinkle  <tom@grenville>

	* src/lib/backends/db.py (RecData.setup_info_table): String->Text
	fix to avoid annoying warning.
	(make_simple_select_arg): Make sure we use unicode in our select
	args.

2008-11-23  Thomas Hinkle  <tom@grenville>

	* setup.py: Fix typo that prevented new import/export .in files from being i18n'd.

2008-11-23  Thomas Mills Hinkle  <tom@hydrophax>

	* setup.py (crawl): Automate addition of plugin directories to
	setup.py script.

2008-11-23  Thomas Hinkle  <tom@grenville>

	* src/lib/plugins/import_export/krecipe_plugin.gourmet-plugin.in:
	Port old krecipe importer to new plugin system.

	* src/lib/plugins/import_export/krecipe_plugin/ New krecipe plugin.

	* src/lib/threadManager.py (ThreadManagerGui.thread_done): Handle
	case where there is no text when we're done with progress bar;
	show completed processes as progress 100% no matter what.

	* src/lib/plugin_loader.py (MasterLoader): Add all import/export
	as defaults (these don't clog up the interface, so why not include
	them).

	* src/lib/GourmetRecipeManager.py (GourmetApplication.quit): Fix
	error saving recipe card on quit.

2008-11-22  Thomas Hinkle  <tom@grenville>

	This is the warning-fix edition, where we get rid of all the
	annoying warnings on Gourmet startup!

	* src/lib/backends/db.py: Use Text() class explicitly for strings
	without length limit instead of deprecated String(length=None

	* src/lib/GourmetRecipeManager.py (RecGui.__init__): Add action
	group search_action before calling setup_main_window -- this gets
	rid of annoying warning about missing actions on startup.

	* src/lib/recindex.py (RecIndex.setup_reccolumns.get_colnum): cell
	renderers take pango.WRAP_* enums, not gtk.WRAP_* enums

	* src/lib/reccard.py (IngredientDisplay.setup_widgets): cell
	renderers take pango.WRAP_ enums, not gtk.WRAP_* enums.

	* glade/preferenceDialog.glade: Fix deprecation error about
	setting an adjustment with non-zero page size.

2008-11-20  Thomas Mills Hinkle  <tom@hydrophax>

	* src/lib/plugins/import_export/web_import_plugin/webpage_importer.py:
	Change back to BeautifulSoup instead of BeautifulStoneSoup -- this
	makes sure we know about, e.g., standard self-closing tags.

2008-11-17  Thomas Mills Hinkle  <tom@hydrophax>

	* src/lib/plugins/import_export/gxml_plugin/gxml2_exporter.py (rec_to_xml.write_text):
	Make sure we don't create element names with spaces in them.

2008-11-15  Thomas Mills Hinkle  <tom@hydrophax>

	* src/lib/plugins/import_export/web_import_plugin/webpage_importer.py (WebParser.add_buffer_to_parsed):
	Add code to cycle through MS chars and eliminate those that
	remain/were foobarred by beautifupsoup.

2008-11-11  Thomas Mills Hinkle  <thomas_hinkle@users.sf.net>

	* src/lib/importers/importManager.py (ImportManager.finish_web_import):
	Recognize mimetypes with ;'s and encoding declarations to fix
	issue reported at
	https://sourceforge.net/forum/message.php?msg_id=5619998

2008-11-08  Thomas Mills Hinkle  <thomas_hinkle@users.sf.net>

	* src/lib/plugin_loader.py: Catch plugin errors and display as
	warning; don't let plugin failures bring down whole app at
	start-up.

2008-10-27  Thomas Hinkle  <tom@grenville>

	* Version->0.14.2

	* src/lib/importers/html_importer.py: Don't import old
	html_plugins directory

v	* setup.py (result): Add new plugins.
	(data_files): Fix data files.

	* src/lib/backends/db.py (RecData.backup_db): Automatically make a
	copy of the database when we're about to do a DB update, just in
	case something ugly happens.

2008-10-27  Thomas Hinkle  <tom@grenville>

	* src/lib/plugin_loader.py: Add debug calls to make it easy to see
	what plugins are being loaded from where with a -v flag.

	* src/lib/backends/db.py (RecData.do_add): On ValueError, try
	coercing our dictionary of column->values into proper types or
	None and reinserting. This fixes a bug with the update code, where
	empty strings were being passed where we needed null (None).

2008-10-25  Thomas Hinkle  <thomas_hinkle@users.sourceforge.net>

	* Release 0.14.1

2008-10-25  Thomas Mills HInkle  <tom@hydrophax>

	* src/lib/recindex.py (RecIndex.setup_widgets): Make
	search-as-you-type the default.

	* create_manifest.py: Add data directory
	* src/lib/plugins/import_export/gxml.gourmet-plugin.in: This is an
	import and export plugin

2008-10-25  Thomas Mills HInkle  <thomas_hinkle@users.sourceforge.net>

	* MANIFEST: Include data/ directory.

	* src/lib/legacy_db/db_085/rdatabase.py (mkConverter.create_conv_table):
	Fix capitalization of converter.Converter

2008-10-18  Thomas Mills HInkle  <thomas_hinkle@users.sourceforge.net>
	* src/lib/gtk_extras/mnemonic_manager.py: Fix mnemonic-manager's
	handling of submenus. Automatically add TreeViews to mnemonic
	manager.

	* src/lib/GourmetRecipeManager.py: Add mnemonic-manager calls to
	resolve conflicts.

	* src/lib/reccard.py: Add mnemonic-manager calls to resolve
	mnemonic conflicts.

2008-10-16  Thomas Mills HInkle  <thomas_hinkle@users.sourceforge.net>

	* src/lib/plugins/import_export/web_import_plugin/* - Add web
	import plugin. We've removed the fully-automated web import in
	favor of a preparser to the interactive importer; this means that
	work we do building scrapers can only help, since users can always
	fall-back to fully manual marking up if the scraper does a bad
	job.

	* src/lib/plugins/import_export/website_import_plugins/* - Add web
	import plugin plugin for helping scrape specific websites (food
	channel, about.com, etc).

	* src/lib/importers/interactive_importer.py
	(InteractiveImporter.commit_changes): Add image browser dialog
	back to interactive importer (if self.images is populated)

	* src/lib/plugin_loader.py (MasterLoader.activate_plugin_set):
	Don't iterate over the dictionary since we might modify it.

	* src/lib/plugin.py (PluginPlugin): Create PluginPlugin class for
	allowing Pluggables in plugin classes -- we have plugin plugins
	specify a target string so that different pluggable plugins can
	differentiate among themselves. (This is currently used only for
	allowing the web importer to accept plugins).

2008-10-13  Thomas Mills HInkle  <thinkle@sf.net>

	* src/lib/plugin_loader.py (Pluggable.__init__): Be less verbose...

	* src/lib/GourmetRecipeManager.py (print_recs): Remove gt.* calls.

	* src/lib/exporters/gnomeprinter.py: Correct printing (we were
	using old exporter API in which exporter's did export on
	instantiation. We now work with the new API, though printing is
	not properly threaded (this is a one-line fix to get printing back
	for now -- printing should be reworked with the different printers
	written as plug-ins etc).

	* src/lib/gglobals.py (GladeCustomHandlers.__init__.custom_handler):
	Be less verbose.

2008-10-12  Thomas Mills HInkle  <thomas_hinkle@users.sourceforge.net>

	* src/lib/plugins/import_export/pdf_plugin/pdf_exporter.py: Move
	finish-up code out of PdfExporter.__init__ and into write_foot, so
	that it happens after writing the recipe (this reflects a change
	in the design of exporters -- everything used to happen on
	instantiation, but with threading, everything should happen in the
	do_run call that can be run as a separate thread.

	* src/lib/plugin_loader.py: Fix dependency checking. Add
	check_if_depended_upon and make deactivating a dependee plugin
	deactivate depender plugins well.

	* src/lib/plugin_gui.py (PluginChooser): Check dependencies when
	activating and deactivating and act appropriately. Automatically
	activate dependencies. Ask users when deactivating a
	depeneded-upon plugin.

	* src/lib/sound.py (Player.play_file): Remove debug print statement

2008-10-12  Thomas Mills Hinkle  <thomas_hinkle@sf.net>

	* src/lib/reccard.py (IngredientController.commit_ingredients.commit_iter):
	Fix null amounts (they should be None, not the empty string). 

2008-10-12  Thomas Mills HInkle  <thomas_hinkle@sf.net>

	* src/lib/plugin_loader.py: Remove excess print statements. Don't
	write duplicate entries for plugins in saved_plugins file.

	* src/lib/GourmetRecipeManager.py: Remove all obsolete
	gt.threads calls

	* style/default.css: Make title sans-serif
	* src/lib/exporters/gnomeprinter.py (renderer.write_paragraph):
	Catch IndexErrors if we're trying to break a string with no spaces
	in it.

2008-10-03  Thomas Mills HInkle  <thomas_hinkle@sf.net>

	* src/lib/importers/interactive_importer.py Add support for
	'ignore' tag in parsed data. This will lead to "hidden" text (we
	display a button to un-hide it if the user so chooses).
	* src/lib/importers/generic_recipe_parser.py (RecipeParser.parse):
	Add 'ignored' keyword to base parser (this allows a preparser to
	mark some text not worth the user seeing (for example, banner ads
	in HTML import)
	* src/lib/backends/db
	* src/lib/plugins/import_export/web_import_plugin Port basic
        web import plugin to plugin system. Still not clear on how
        we'll do web import plugin plugins.

2008-08-10  Thomas Hinkle  <tom@grenville>

	* src/lib/exporters/xml_exporter.py (XmlExporter.append_text):
	Raise a clear type error when handed non-text.

	* src/lib/backends/db.py (RecData): Fix alter table and
	add-column-to-table routines. Add new table plugin_info for
	storing version info on plugins, so that plugins know the Gourmet
	version and Plugin version at the last time of
	instantiation (since a plugin could have been in use, then out of
	use, then reactivated after an upgrade).

	* src/lib/plugin_loader.py (MasterLoader.activate_plugin_set):
	Avoid activating a plugin set twice.

	* src/lib/plugin.py (DatabasePlugin.activate): Update database
	plugin code to work with new versioning code for telling plugins
	about version changes reliably. Fix bug in exporter plugin when we
	get a None where we expect text.

2008-08-10  Thomas Hinkle  <tom@grenville>

	* src/lib/exporters/xml_exporter.py (XmlExporter.append_text):
	Raise a clear type error when handed non-text.

	* src/lib/backends/db.py (RecData): Fix alter table and
	add-column-to-table routines. Add new table plugin_info for
	storing version info on plugins, so that plugins know the Gourmet
	version and Plugin version at the last time of
	instantiation (since a plugin could have been in use, then out of
	use, then reactivated after an upgrade).

	* src/lib/plugin_loader.py (MasterLoader.activate_plugin_set):
	Avoid activating a plugin set twice.

	* src/lib/plugin.py (DatabasePlugin.activate): Update database
	plugin code to work with new versioning code for telling plugins
	about version changes reliably. Fix bug in exporter plugin when we
	get a None where we expect text.

2008-07-24  Thomas Mills HInkle  <thomas_hinkle@sf.net>

	* src/lib/plugins/import_export/mealmaster_plugin/mealmaster_importer_plugin.py (MealmasterImporterPlugin.test_file):
	Fix typo but that made no file look like a Mealmaster file.

	* src/lib/importers/xml_importer.py: Stop passing around recData
	instances (use singleton pattern instead). Also, fix
	capitalization of classes.

	* src/lib/importers/interactive_importer.py: Rewrite interactive
	importer to allow removing tags once applied and to include
	auto-markup of recipes. The UI is basic but functional now, with a
	number of obvious improvements yet-to-be-made. Once this UI is
	mature, it is likely many imprecise importers will be implemented
	as preparsers for the interactive importer rather than as their
	own importers.

	* src/lib/importers/importManager.py (ImportManager): Add code to
	handle web-based import (asking user for URL, fetching file,
	finding importer)

	* src/lib/importers/generic_recipe_parser.py (RecipeParser.parse):
	Update code to work with threadManager based progress-reporting

	* src/lib/backends/db.py (RecData.update_version_info): Fix
	indentation error bug in version update that meant that in new
	installations, the version was being set to an old verison,
	resulting in an attempt to run upgrade code on the 2nd run.

	* src/lib/threadManager.py (NotThreadSafe): Add class
	NotThreadSafe for the somewhat hackish purpose of allowing
	e.g. importer classes that touch the GUI. By inheriting
	NotThreadSafe, subclasses will ensure that such classes are not
	run in their own threads, no matter what, even when they look like
	they should be.

	* src/lib/plugin.py (ImporterPlugin.test_url): Add web methods
	test_url and get_web_importer to ImporterPlugin base class. By
	default, these methods act on normal files (which our
	importManager will retrieve for us), so nothing special has to
	happen except for importers that might, for example, need to know
	the URL whence a file came.

	* src/lib/GourmetRecipeManager.py (ImporterExporter.import_webpageg):
	Move import code for web import to importManager where it belongs

2008-07-08  Thomas Mills HInkle  <thomas_hinkle@sf.net>

	* src/lib/importers/importManager.py (ImportFileList): Add a way
	to handle an importer calling more importers -- specifically, we
	allow ourselves to raise an exception that contains a list of
	files, thus circumventing any threading problems that would happen
	from calling importManager methods within an importer.

	* src/lib/plugin.py (ImporterPlugin.get_importer): Update method
	name in accordance with actual usage (we return an importer class
	rather than doing the import here, so the import manager can
	handle threading etc.

	* src/lib/importers/plaintext_importer.py (TextImporter.__init__):
	Remove rd argument from TextImporter.

	* src/lib/plugins/import_export/ Add mealmaster plugin to cvs. Add
	plugin to handle zip archives and tarballs.

	* src/lib/recipeManager.py (get_recipe_manager): Add
	get_recipe_manager name as alias for poorly named
	default_rec_manager (the right thing would be just to replace the
	name, but I'm lazy just now)

	* src/lib/importers/importer.py (Importer): Rename class Importer
	in accord with conventions. Remove rd argument (as we move to
	singleton pattern to handle this). Remove prog arguments (as we
	move to SuspendableThread to handle this). Move convenience
	function add_to_fn to this file

2008-06-01  Thomas Hinkle   <tmhinkle@gmail.com>

	* Release 0.14.0
	
	* src/lib/plugins/duplicate_finder/recipeMergerPlugin.py: Get rid
	of all GourmetThreads calls (as we plan to delete that module).

	* src/lib/importers/importManager.py (ImportManager.offer_import):
	Call make_rec_visible when we're done importing to show newly
	imported recipes.

	* src/lib/version.py (copyright): ++ last 2 years

	* src/lib/gglobals.py: Get rid of attempts to use gnomevfs

	* setup.py: Remove obsolete nutrition module

	* create_manifest.py: Create a script to generate a MANIFEST
	automatically (this is what MANIFEST.in should do, but trying to
	use MANIFEST.in was turning into a living hell, so I gave up and
	hand-coded a script to do the job more easily)
	* test_tarball.sh: Add call to new MANIFEST-generating script +
	clear out old directories from /tmp/ before starting.

	* src/lib/reccard.py (RecCardDisplay.ui): Remove e-mail
	stuff (this will be reimplemented as a plugin).
	* src/lib/GourmetRecipeManager.py: Remove all e-mail stuff (this
	will be reimplemented in a plugin).

2008-05-24  Thomas Mills Hinkle  <tmhinkle@gmail.com>

	* setup.py (result): Change location of import/export plugins.
	* src/lib/reccard.py (RecCardDisplay.update_image): Show/hide
	image when image has been created or removed.
	(ImageBox.commit): Fix typo that raised error.

2008-05-20  Thomas Mills HInkle  <tmhinkle@gmail.com>

	* src/lib/backends/db.py (RecData.initialize_connection): Handle
	newer sqlalchemy API
	* src/lib/threadManager.py: Add Terminated exception class
	* src/lib/GourmetRecipeManager.py: Make use of new threading for
	export and import
	* src/lib/gglobals.py: Remove old threading stuff
	* src/lib/prefs.py: Make Prefs a singleton
	* src/lib/exporters/exportManager.py: Use threadManager
	* src/lib/exporters/exporter.py: Use threadManager
	* src/lib/gtk_extras/dialog_extras.py (ModalDialog.setup_expander):
	Put expander into a scrolled window so we don't create monstrous
	dialogs that exceed the screenspace.
	* src/lib/importers/*: Continue working to port importers to
	threadManager and to plugins...

2008-04-26  Thomas Mills HInkle  <tmhinkle@gmail.com>

	* src/lib/plugins/import_export/mealmaster_plugin/mealmaster_exporter.py (mealmaster_exporter.write_text):
	Fix from Christopher Donham (#1151150)

2008-04-23  Thomas Mills HInkle  <tmhinkle@gmail.com>

	* src/lib/gtk_extras/dialog_extras.py (ModalDialog.setup_expander):
	Add expander text in scrolled window in case it's too big to fit
	in one dialog

2008-03-05  Thomas Mills HInkle  <tmhinkle@gmail.com>

	** Note - I'm half-way through re-implementing importers and
	import plugins.

	* src/lib/threadManager.py : Create a new module to handle
	threading (so we can move this out of GourmetRecipeManager.py and
	handle it more carefully. This will lead to the elimination of
	GourmetThreads.py and GourmetFauxThreads.py

	* src/lib/importers/__init__.py (Module): Remove importer set-up
	code from here. It now belongs in the new file name
	importManager.py

	* src/lib/keymanager.py (get_keymanager): Make KeyManager a singleton.

	* src/lib/GourmetRecipeManager.py (GourmetApplication.__init__):
	Use new import manager to do imports.

2008-02-25  Thomas Mills HInkle  <tmhinkle@gmail.com>

	* glade/recCardDescriptionEditor.glade: Put recipe card
	description into its own Glade file (part of UIManager rewrite)
	* glade/recCardDisplay.glade UIManager rewrite
	* glade/recCardIngredientsEditor.glade  UIManager rewrite
	* glade/recipe_index.glade - Move recipe index view into its own
	individual glade file
	* src/gourmet_in_place Update gourmet_in_place script to i18n .in files.
	* src/lib/gtk_extras/timeEntry.py (make_time_entry): Rename
	makeTimeEntry to make_time_entry for consistency with new coding
	style.
	* MANIFEST: Add many of plugins to Manifest. (This probably isn't
	all-the-way-updated yet though).

	* Various-other-files-I'm-too-lazy-to-track Making the change to a
	plugin system, this means adding logs of plugins and moving around
	import/export modules. As of this commit, exporters have been
	fully plugin-a-fied; importers have yet to be converted properly.

2008-02-24  Thomas Mills HInkle  <tmhinkle@gmail.com>

	* gourmet.desktop.in: This is now the gourmet desktop file (built
	into an i18n'd version with intltool).

	* setup.py : Add calls to intltool to build desktop files. Add new
	export_plugins.
	
	
2008-01-26  Thomas Mills HInkle  <tmhinkle@gmail.com>

	* src/lib/gglobals.py: Add our own icons as stock icons.
	* src/lib/backends/db.py (RecData.get_amount_as_float): Our new
	SQLAlchemy class can make amounts show up as floats *or* integers.

2008-01-18  Thomas Mills HInkle  <tmhinkle@gmail.com>

	* setup.py: Proper i18n of desktop file and plugin information files.
	* gourmet.desktop.in: Proper i18n of desktop file.
	* glade/app.glade Remove app.glade
	* glade/converter.glade Remove converter.glade -- this now belongs
	in the UnitConverter plugin.
	* glade/recCardDescriptionEditor.glade Break recCard.glade into pieces
	* glade/recCardDisplay.glade Break recCard.glade into pieces.
	* glade/recCardIngredientsEditor.glade Break recCard.glade up
	* glade/recipe_index.glade Main search view (replaces app.glade)
	* src/lib/plugins/key_editor/*: Create keyEditorPlugin (move
	keyEditor from src/lib/keyEditor to here).
	* src/lib/plugins/key_editor.gourmet-plugin.in: Add Key Editor
	plugin.
	* src/lib/plugins/unit_converter.gourmet-plugin.in: Add Unit
	Converter plugin.
	* src/lib/plugins/nutritional_information.gourmet-plugin.in: Add
	nutritional information plugin.
	* src/lib/plugins/nutritional_information/* Move files from
	src/lib/nutrition/ here. Create reccard_plugin, main_plugin and
	data_plugin
	* src/lib/plugins/duplicate_finder.gourmet-plugin.in: Add
	duplicate_finder plugin.
	* src/lib/gtk_extras/timeEntry.py (make_time_entry): Use proper
	function_or_method_style name for function (was makeTimeEntry)
	* src/lib/exporters/*: Fix Converter capitalization.
	* src/lib/backends/db.py (RecData): Make RecData pluggable.
	(RecData.__init__): Make RecData a singleton (on a per-file basis
	-- that is, we keep a dictionary of database files and only allow
	one instance to be created per file. Also, add a _created flag so
	plugins can tell if they're being plugged in before or after the
	creation of the DB.
	(RecData.setup_tables): Make setup_tables pluggable.
	(setup_nutrition_tables): Remove all nutrition table setup code -
	this is now implemented in the nutrition plugin.
	(RecData.update_version_info): Add code to run the plugin method
	update_version()
	(get_database): Add method to grab singleton database.
	* src/lib/shopgui.py: Remove nutritional information code -- will
	be reimplemented as part of our plugin.
	* src/lib/recipeManager.py (default_rec_manager): Return singleton
	RecipeManager() (singleton for a given db file, that is)
	* src/lib/reccard.py: Remove nutrition items and import new plugin
	framework -- nutrition is now a plugin!
	(GladeCustomHandlers): Remove GladeCustomHandlers -- this is now
	part of gglobals. Update code to use gglobals.gladeCustomHandlers.
	(RecCard.set_edited): Allow edited property to be set (when
	GourmetApplication saves, it does this)
	(RecCardDisplay): Make RecCardDisplay pluggable.
	(RecCardDisplay.setup_style): Make widgets white.
	(RecCardDisplay.remove_plugin_to_left_notebook): Make it possible
	to remove plugin
	(RecEditor): Make RecEditor pluggable.
	(DescriptionEditorModule.setup_main_interface): Use separate glade
	file - recCardDescriptionEditor.glade
	(TextFieldEditor.setup_main_interface): Workaround textview bug by
	setting scroll policy to AUTOMATIC,AUTOMATIC even though we don't
	really want it that way.

	* src/lib/GourmetRecipeManager.py (GourmetApplication.__init__):
	Make GourmetApplication a singleton -- this simplifies life here
	on out.
	(setup_nutrition): Remove - nutrition into a plugin
	(quit): Update reccard calls to work with new recipe card.
	(ImporterExporter.import_cleanup): Add plugin
	hook (pluggable_method decorator) so that the recipeMerger plugin
	can hook into imports.
	(UnitModel): Move UnitModel from convertGui (which is now a
	plugin) here.
	(show_duplicate_finder): Remove - now a plugin
	(show_duplicate_editor): Remove - now a plugin
	(RecGui.__init__): Make Pluggable
	(RecGui.setup_actions): Add show_plugin_chooser action. Remove
	items that are now plugins
	(get_application): Create convenience method to get our singleton
	application.

	* src/lib/Undo.py (UndoHistoryList.set_sensitive): Be less verbose.
	(Module): 

	* src/lib/gglobals.py (GladeCustomHandlers): Add custom handler
	code for glade here. Now anyone who needs a custom handler
	registers it through the gladeCustomHandlers instance that's
	instantiated in gglobals.
	(Module): 

	* src/lib/plugin.py New plugin module. This provides the base
	classes that plugins need to subclass.
	(Module): 

	* src/lib/plugin_gui.py Dialog for turning plugins on and off.
	* src/lib/plugin_loader.py Plugin management module. This provides
	the base class that pluggables need to subclass, as well as
	providing a nice decorator function for making individual methods
	"pluggable" (i.e. for adding pre-hooks and post-hooks)


2008-01-17  Thomas Mills HInkle  <tmhinkle@gmail.com>

	* src/lib/gtk_extras/timeEntry.py (make_time_entry): Update
	function name to new underscore_function_name norm

2008-01-09  Thomas Mills HInkle  <tmhinkle@gmail.com>

	* src/lib/convertGui.py: 

	* src/lib/recipeMerger.py: 

2008-01-06  Thomas Mills HInkle  <tmhinkle@gmail.com>

	* glade/recCard.glade (Module): Reorganize glade file as we move
	more of the UI construction into code and out of glade.

	* src/lib/GourmetRecipeManager.py (Module): Reorganize module in
	preparation for coming change to plugin basis. Separate out
	various bits of RecGui class into sub-classes that make more sense
	-- ImporterExporter, GourmetApplication, and so on. Use UIManager
	and ActionManager to build UI rather than glade -- now we use
	UIManager's nifty merging to handle our updated Go menu (formerly
	View menu)

	* src/lib/Undo.py (Module): Move undo stuff that was in reccard.py here.

	* src/lib/batchEditor.py (Module): changed method names (from GourmetRecipeManager.py)

	* src/lib/reccard.py (Module): Completely rearrange module. We
	break recipe editor and recipe display into separate classes. We
	use UIManager and ActionManager for the UI in preparation for the
	coming plugin interface.

	* src/lib/recindex.py (Module): Setup searchActions action group
	for user with uimanager.

	setup_search_views - respect the default_searches parameter.

	searchentry_activate_cb - this callback belongs here and not in
	subclasses.

	* src/lib/backends/db.py: Allow sorting by category.  Implement
	duplicate-finding methods.  make_simple_select_arg now supports
	operators including "in"

	* src/lib/defaults/defaults_en.py: Remove periods from units.

	* src/lib/defaults/defaults_en_GB.py: Remove periods from units.

	* src/lib/gtk_extras/ratingWidget.py: Don't throw an error when we
	receive a click event w/ no selected row

	* src/lib/nutrition/nutritionDruid.py: Use proper exception class
	so that unicode doesn't throw an error in the error-throwing.


2008-01-04  Thomas Mills HInkle  <thomas_hinkle@sf.net>

	* src/lib/exporters/lprprinter.py (Module): Fix import statement
	for dialog_extras (moved to gtk_extras)
	* src/lib/exporters/winprinter.py (Module): Fix import statement
	for dialog_extras (moved to gtk_extras)


2007-12-29  Thomas Mills HInkle  <thomas_hinkle@sf.net>

	* src/lib/convert.py (Module): adjust_amount - if we somehow have
	units in our unit list that don't convert, print warning rather
	than defaulting to no conversion.

	* src/lib/defaults/defaults_en_GB.py (Module): Fix tsp/Tbs. Remove
	periods after imperial unit names.

	* src/lib/defaults/defaults_en.py (Module): Fix tsp/Tbs
	conversion. Remove periods after imperial unit names.

	* src/lib/backends/db.py (Module): Fix category modifications. Fix
	amount-fetching convenience methods (apparently sqlalchemy can
	return an integer out of a float field!?!) Fix dbDic.


2007-12-28  Thomas Mills HInkle  <tmhinkle@gmail.com>

	* Everywhere Change names of database tables from views (metakit
	legacy) to table (current reality). Capitalize all classes.

	* MANIFEST - Remove old database modules; add new one.

	* test_tarball.sh - Assume python2.5 rather than python2.4

	* glade/app.glade - Move search options to menus; hide and
	simplify search interface by default (now that we have "search
	anywhere")

	* src/gourmet_in_place - Some improvements to make sure this gets
	its glade and data files from the source directory.

	* src/lib/convertGui.py (Module): Fix import statement to work
	with the new code organization (gtk_extras.cb_extras)

	* src/lib/gglobals.py (Module): Remove old database stuff (metakit
	v sqlite etc), replace with new.

	* src/lib/GourmetRecipeManager.py (Module) - Break up giant
	__init__ method so it is more readable. Make hitting return work
	if we are not in search-as-you-type mode.

	* src/lib/OptionParser.py (Module) - Remove old database
	options. Add --database-url argument for custom database
	arguments.

	* src/lib/recindex.py (Module): Add "anywhere" to search options
	-- this allows us to search for a string in any of the columns
	without specifying! Also, fix search-as-you-type toggle.
	
	* src/lib/recipeManager.py (Module): Update to use new database.

	* src/lib/timeScanner.py (Module): Update to use capitalized Converter class name.

	* src/lib/upgradeHandler.py (Module): Fix import dialog_extras statement.
	
	* src/lib/backends/__init__.py (Module): Remove inaccurate comments
	
	* src/lib/backends/db.py (Module) - New database backend class
	based on sqlalchemy. This provides at least the basis for support
	for all sql dialects that sqlalchemy supports. You can try other
	database settings by using the database-url argument to Gourmet.

	* src/lib/backends/db_tests.py (Module) - Move tests that were at the
	bottom of rdatabase.py to a separate test file.

	* src/lib/backends/db/* - Remove old legacy database files.

	* src/lib/gtk_extras/timeEntry.py (Module): Fix reference to
	capitalized Converter() class

	* src/lib/exporters/__init__.py (Module): Change rview_to_xml to
	recipe_table_to_xml in accordance with our new freedom from
	metakit semantics.
	
	* src/lib/importers/imageBrowser.py (Module): Fix gtk_extras import.

	* src/lib/importers/importer.py (Module): Fix gtk_extras import.

	* src/lib/nutrition/nutritionDruid.py (Module): Fix up various import
	statements for modules now in gtk_extras.


2007-11-19  Thomas Mills HInkle  <thomas_hinkle@sf.net>

	* src/lib/FileChooserSaveAs.py Class renaming - capitalize all class names.
	* src/lib/convert.py Class renaming - capitalize all class names.
	* src/lib/convertGui.py Class renaming - capitalize all class names.
	* src/lib/reccard.py Class renaming - capitalize all class names.
	* src/lib/recipeManager.py Class renaming - capitalize all class names.
	* src/lib/shopgui.py Class renaming - capitalize all class names.
	* src/lib/shopping.py Class renaming - capitalize all class names.
	* src/lib/backends/rdatabase.py Class renaming - capitalize all class names.
	* src/tests/reference_setup/recipes.db Class renaming - capitalize all class names.

2007-11-19  Thomas Mills HInkle  <thomas_hinkle@sf.net>

	* src/lib/exporters/gxml2_exporter.py Rearrange order of
	attributes to be slightly more logical (with link following
	source, since they are related).

2007-11-11  Thomas Mills HInkle  <thomas_hinkle@sf.net>

	* everything or close to it: Rearrange code -- move all defaults_*
	files into defaults/. Move all widgety convenience libraries into
	gtk_extras

2007-10-12  Thomas Mills HInkle  <thomas_hinkle@sf.net>

	* Fix non-GNOME fallback about dialog in GourmetRecipeManager.py

2007-09-12  Thomas M. Hinkle  <thomas_hinkle@sf.net>

	* i18n/ca.po Updated Catalan translation from Raul Cambero.

2007-09-10  Thomas M. Hinkle  <thomas_hinkle@sf.net>

	* src/lib/defaults_de.py patch from SF user enfant_terribly fixing
	up some problems in the German translation.
	* src/lib/defaults.py  patch from SF user enfant_terrible
	fixing language support on Windows.
	* src/lib/gettext_setup.py patch from SF user enfant_terrible
	fixing language support on Windows.
	* src/lib/GourmetRecipeManager.py patch from SF user
	enfant_terrible fixing language support on Windows.
	* src/lib/recipeMerger.py Properly destroy dialog on close.
	* src/lib/exporters/html_exporter.py Actually apply the changes
	logged on 8/25
	* i18n/de_AT.po Updates from enfant_terrible
	* i18n/de_DE.po Updates from enfant_terrible	

2007-08-25  Thomas M. Hinkle  <thomas_hinkle@sf.net>

	* src/lib/exporters/html_exporter.py Make recipe links hyperlinks.
	
2007-08-25  Thomas M. Hinkle  <thomas_hinkle@sf.net>
	
	* RELEASE 0.13.7
	* TODO Update todo list.
	* glade/nutritionDruid.glade Fix reversion/bug introduced in UI
	cleanup from Jeff/Kiddo
	* src/lib/version.py Upped version to 0.13.7
	* src/lib/backends/sql_db.py Respect SQL libraries different
	paramstyles rather than hardcoding the question mark.
	* src/lib/backends/sqlite_db.py Make sqlite3 (built-into
	python2.5) the default and fallback to pysqlite2 only as
	needed. Respect SQL libraries different paramstyles rather than
	hardcoding the question mark.
	* src/lib/exporters/exporter.py Update exporter so that if two
	recipes have the same name, they can both be exported
	(generate_filename now gets a flag -- if we are exporting multiple
	recipes, we automatically append ID numbers, otherwise we don't,
	since they are unnecessarily ugly if someone just wants to e-mail
	a copy of a single recipe to their mom or whatnot.
	* src/lib/exporters/pdf_exporter.py Fix bug 1776930 (formatting
	broken in PDF). Add links for recipe references and for webpages.
	* src/lib/exporters/html_exporter.py Use the changes in exporter.py
	to avoid screwing up if more than one recipe have the same name.
	* src/lib/exporters/gxml2_exporter.py Export the link field.
	* src/lib/nutrition/nutritionDruid.py Fix nutrition labels per
	ingredients so they don't say "per recipe". Fix bug that broke the
	nutrition druid when user changed an ingredient key.
	* src/tests/testExporters.py Update export tests.
	* src/tests/reference_setup/recipes.db Add a webpage to export
	test suite.
	
2007-08-20  Thomas M. Hinkle  <thomas_hinkle@sf.net>

	* src/lib/defaults_en.py Call granulated sugar granulated sugar,
	not white sugar.
	* src/lib/GourmetRecipeManager When threaded quitting fails, save
	our database just in case the user force-quits and loses
	data. Also, purge deleted ingredients on quit since they won't be
	of any use (they're already lost to the UI--why keep them in the DB)
	* src/lib/backends/sql_db.py Don't return deleted ingredients in
	list of ingredient keys (in get_ingkeys_with_count)
	
2007-08-15  Thomas M. Hinkle  <thomas_hinkle@sf.net>

	* src/lib/backends/sql_db.py Applied patch from Anthony Foglia to
	fix typo bug in find_dupliaces

2007-08-08  Thomas M. Hinkle  <thomas_hinkle@sf.net>

	* src/lib/timer.py Backwards compatability for pre-2.8 versions:
	set_urgency_hint.

2007-08-08  Thomas M. Hinkle  <thomas_hinkle@sf.net>

	* src/lib/Undo.py Fix potential bug that prevents action_hooks
	from being run correctly -- we grab a reference to the action
	directly in case carrying the action out modifies the history list
	itself.
	* src/tests/testRecCard.py Reduce repetition of try/except blocks
	by abstracting out the try/except-with-informative-message
	pattern. Also, make VERBOSE into a global variable (again,
	simplifies).

2007-08-04  Thomas M. Hinkle  <thomas_hinkle@sf.net>

	* src/lib/importers/mastercook_importer.py Make Notes import as
	Notes rather than instructions (bug report from Anthony Foglia).

2007-08-03  Thomas M. Hinkle  <thomas_hinkle@sf.net>

	* src/lib/prefs.py Handle broken config files gracefully. Namely,
	if there is an error loading, print the error to the screen and
	save a backup of the broken file. Then proceed as if there had
	been no original config file (overwriting the old one on a clean
	close with a new, clean config file).

	* src/lib/importers/mastercook_importer.py Fix for attributes with
	< or > signs - path from Anthony Foglia.

2007-07-30  Thomas M. Hinkle  <thomas_hinkle@sf.net>

	* glade/recSelector.glade Fix reversion introduced in Jeff/Kiddo
	patch (ShowingLabel had gone missing)

2007-07-19  Thomas M. Hinkle  <thomas_hinkle@sf.net>

	* glade/app.glade Glade cleanup from Jeff/Kiddo
	* glade/generic_importer.glade Glade cleanup from Jeff/Kiddo
	* glade/nutritionDruid.glade Glade cleanup from Jeff/Kiddo
	* glade/recMerger.glade Glade cleanup from Jeff/Kiddo
	* glade/recSelector.glade Glade cleanup from Jeff/Kiddo
	* glade/valueEditor.glade Glade cleanup from Jeff/Kiddo
	* src/lib/nutrition/nutritionInfoEditor.py: Add to CVS.

2007-07-19  Thomas M. Hinkle  <thomas_hinkle@sf.net>

	* src/lib/GourmetRecipeManager Use default DEFAULT_HIDDEN_COLUMNS
	for hidden columns (so that not all columns are shown by default).
	* src/lib/cb_extras.py Don't screw up the alignment of combo boxes.
	* src/lib/gglobals.py Add DEFAULT_HIDDEN_COLUMNS so that link,
	servings, preptime and cooktime are not included in index views by
	default.
	* src/lib/recindex.py Use DEFAULT_HIDDEN_COLUMNS
	variable. Ellipsize links when they are shown rather than wraping
	them.
	
2007-07-17  Thomas M. Hinkle  <thomas_hinkle@sf.net>

	* src/gourmet Update copyright dates.
	* src/gourmet_in_place Add convenient script to run Gourmet from
	source in tree.
	* glade/app.glade Change name of ingredient editor, since now it
	edits nutritional info as well as keys.
	* src/lib/ImageExtras.py Commit method needed in bugfix committed
	on on 6/29

2007-07-15  Thomas M. Hinkle  <thomas_hinkle@sf.net>

	* MANIFEST Added nutritionInfoEditor.py
	* src/lib/defaults_en_GB.py Declared encoding (PEP 263)

2007-06-29  Thomas M. Hinkle  <thomas_hinkle@sf.net>

	* src/lib/reccard.py Fix bug that prevented images from being
	deleted. While we're at it, remove confirmation dialog on image
	deletion, since it is undo-able.

2007-06-29  Thomas M. Hinkle  <thomas_hinkle@sf.net>

	* glade/keyeditor.glade Add button to edit nutritional
	information.
	* glade/nutritionDruid.glade Fix name collisions between two
	different treeview setups that are now in this druid. Make various
	tweaks to nutritional info display page.
	* glade/recCard.glade Add generic "edit nutritional info" button
	(in parallel with all other edit buttons).
	* src/lib/keyEditor.py Add check mark to show whether there is
	nutritional info. Also add callbacks to handle editing nutritional
	info from this view. Wrap text if possible to avoid horizontal
	scrolling.
	* src/lib/reccard.py Add edit_nutrition callback.
	* src/lib/backends/rdatabase.py Add fetch_join method.
	* src/lib/backends/sql_db.py Tweak make_where_statement call to
	allow "in (foo, bar)" SQL queries. Also change handling of "OR"
	and "AND" syntax. Add fetch_join method to allow simple joins.
	* src/lib/nutrition/nutrition.py Allow modifying of existing
	ingkey->ndbno association and conversions. Change from "g." to "g"
	everywhere.
	* src/lib/nutrition/nutritionDruid.py We now allow editing
	nutritional information (and viewing and searching existing info
	in the database). Change "g." to "g" everywhere. Added methods for
	display of nutrtional information. Reconceptualize "back" button
	to work with a simpler stack model.
	* src/lib/nutrition/nutritionLabel.py Add generic show_druid
	method to show druid even when there is no vapor.
	
2007-06-28  Thomas M. Hinkle  <thomas_hinkle@sf.net>

	* nutritionDruid.py Clean up code for nutrition druid (part way to
	a complete rewrite).

2007-06-27  Thomas M. Hinkle  <thomas_hinkle@sf.net>

	* src/lib/importers/mastercook_importer.py Fixed order of
	encodings, fixing bug #1721376

2007-06-23  Thomas M. Hinkle  <thomas_hinkle@sf.net>

	* glade/recipeMerger.glade Add label for possible message when
	merger window is used as a dialog. Fix close and cancel buttons.
	* src/lib/backends/sql_db.py Fix behavior of find_duplicates and
	find_complete_duplicates when given a recipes parameter.
	* src/lib/importers.py Make MulipleImporter track added_recs
	* src/lib/importers/xml_importer.py Give converters added_ings and
	added_rec attributes (references to underlying importer class)
	* src/lib/GourmetRecipeManager.py Fix typo bug in progress_dialog
	close callback. Add importer callback to bring up duplicates
	dialog when we import recipes that look like duplicates. Fix
	normal RecipeMergerDialog call (from Tools->Find Duplicates) so
	that it uses our new callbacks that will try to show whatever kind
	of duplicate there is rather than show an empty list.

	* src/lib/recipeMerger Merge identical recipes in one-click rather
	than making user click "Apply". Add show_if_there_are_dups
	callback to show the dialog only if there are duplicates found
	(i.e. for use as a post-importer dialog). Also add
	populate_tree_if_possible callback to attempt to set the
	searchType combo box so there will be something to show. Add a
	parameter for a on_close_callback that allows our creator to do
	something when we're closed. Add very lame image display (namely,
	text that says "An image" or "No image").

	* src/lib/version.py Up version to 0.13.6
	
2007-06-18  Thomas M. Hinkle  <thomas_hinkle@sf.net>

	* MANIFEST Added recipeMerger stuff.

2007-06-18  Thomas M. Hinkle  <thomas_hinkle@sf.net>

	* glade/app.glade Add button to get to recipe merger tool
	(duplicate finder)
	* glade/recipeMerger.glade Make cancel buttons visible. Hide
	tabs. Improve spacing.
	* src/lib/GourmetRecipeManager.py Add callback to show duplicate
	finder/recipe merger.
	* src/lib/recipeIdentifier.py Added header comment.
	* src/lib/recipeMerger.py Fix bug that made ingredient selection
	fail. Add close callback. Remove print statements and add better
	documentation.
	* src/lib/version.py Bring version to 0.13.5 -- we'll up to 0.14
	when we have a "stable" version with our handy new features.

2007-06-17  Thomas M. Hinkle  <thomas_hinkle@sf.net>

	* src/lib/defaults_* Remove . from SI units (such as g, kg, etc.).
	
2007-05-19  Thomas Hinkle  <thomas_hinkle@sf.net>

	* src/lib/convert.py Fix bug in regexp in time parser that would
	through error on some misidentified times.

2007-05-18  Thomas M. Hinkle  <thomas_hinkle@sf.net>

	* src/lib/dialog_extras.py Improve docstring
	* src/lib/mnemonic_manager.py Improve crawling algorithm for
	finding mnemonic labels.
	* src/lib/nutrition/nutritionDruid.py Behave better when user
	cancels out of a dialog.
	* src/lib/reccard.py Move selection down when user adds an
	ingredient.
	* src/lib/recipeIdentifier.py Rework API as I work on writing a
	recipeMerger dialog.
	* src/lib/recipeMerger.py Check in incomplete duplicate-recipe
	merger/eliminator code.
	* glade/recipeMerger.glade Check in incomplete duplicate-recipe
	merger/eliminator code.
	* src/lib/recindex.py Expand title column by default (rather than
	letting the last column take up all the extra space)
	* src/lib/version.py Bump up version number - When we finish this
	merger stuff &c this will be a new .x version (0.14.0)
	* src/lib/backends/rdatabase.py Add methods for finding duplicates
	* src/lib/backends/sql_db.py Improve duplicate-finding SQL
	* src/lib/exporters/recipe_emailer.py Allow e-mailing PDFs.
	
	
2007-03-25  Thomas M. Hinkle  <thomas_hinkle@sf.net>

	* src/lib/importers/rezkonv_importer.py Fix encoding on top. Also
	fix some other errors -- import convert module and fix a regexp.

2007-03-18  Thomas M. Hinkle  <thomas_hinkle@sf.net>

	* src/lib/mnemonic_manager.py Improve documentation.

2007-03-17  Thomas M. Hinkle  <thomas_hinkle@sf.net>

	* src/lib/exporters/xml_exporter.py Patch [ 1682624 ] Remove
	double escaping in xml export from Lennart Fricke
	* src/lib/exporters/exporter.py Fix Bug [ 1682613 ] Export with
	German locale Servings multiplied by 10. We avoid unnecessary
	float->text->float conversion in mult_exporter.py. Hopefully this
	fixes the issue (not yet tested in German Locale)


2007-03-09  Thomas M. Hinkle  <thomas_hinkle@sf.net>

	* src/lib/importers/interactive_importer.py Fix bug where, when
	unknown units are put into the item string, a space was omitted.

	

2007-02-11  Thomas M. Hinkle  <thomas_hinkle@sf.net>

	* src/lib/convert.py Fix bug in timestring_to_seconds that threw
	error in some unparseable times.

2007-02-10  Thomas M. Hinkle  <thomas_hinkle@sf.net>

	* src/lib/recipeIdentifier.py Only round when we have something to
	round.

2007-01-21  Thomas M. Hinkle  <thomas_hinkle@sf.net>

	* src/lib/backends/rdatabase.py Fix bug in update code that kept
	us from properly updating if a version was not stored correctly.
	* src/lib/recipeIdentifier.py Fix bug in standardize_ingredient
	that threw an exception with g. or ml. and no amount
	
2007-01-20  Thomas M. Hinkle  <thomas_hinkle@sf.net>

	* src/lib/shopgui.py Clarify logic around optional ingredient
	adding.
	* src/lib/recipeIdentifier.py Some more work toward a diff-ing
	interface (not done)
	
2007-01-17  Thomas M. Hinkle  <thomas_hinkle@sf.net>

	* src/lib/importers/html_importer.py Raise more useful error
	message when a rule is malformed. If custom ingdic has ['text']
	but not ['item'], make sure we end up with an item.
	
	* src/lib/importers/html_plugins/recipezaar.py Update importer
	script for updated website. Add import for cuisine and category
	and servings.

2007-01-17  Thomas M. Hinkle  <thomas_hinkle@sf.net>

	* MANIFEST add batchEditor.py and batchEditor.glade
	* glade/app.glade Add menu items for launching batch editor 
	* glade/recCard.glade Fix alignment of items on Recipe Details page.
	* src/lib/GourmetRecipeManager.py Add batch editor. Create new
	methods to store models for attributes (cuisine, category, etc) in
	one place, rather than re-creating them in each recipe card,
	etc. that needs them.
	* src/lib/reccard.py Use new methods for creating global attribute
	models.
	* src/lib/recindex.py Fix type error that cropped up in update_recipe
	* src/lib/backends/sql_db.py
	* src/lib/importers/html_importer.py When dealing with pre-parsed
	ingredient dictionaries, only use our own parsing to fill in gaps
	(this allows html importer scripts to do some but not all parsing
	on their own).
	

2007-01-11  Thomas M. Hinkle  <thomas_hinkle@sf.net>

	* src/lib/importers/html_importer.py When scrapers fail, display
	the error, but fallback to a generic importer -- this is really
	important since scrapers will certainly fail as websites change.

2007-01-06  Thomas M. Hinkle  <thomas_hinkle@sf.net>

	* MANIFEST add valueEditor.glade and valueEditor.py
	* glade/app.glade add button to open valueEditor (called fieldEditor)
	* glade/valueEditor.glade Fix typo in "title" label. Add interface
	for changing *other* values (i.e. so that you can change the
	cuisine from foo->bar wherever the source is set to baz.)
	* src/lib/GourmetRecipeManager.py Add valueEditor to main interface.
	* src/lib/valueEditor.py Add ability to change *other* fields that
	the field selected for (i.e. so that you can change the cuisine
	from foo->bar wherever the source is set to baz.) Make sure the
	recipe index is updated when we make a change.

2007-01-04  Thomas M. Hinkle  <thomas_hinkle@sf.net>

	* glade/valueEditor.glade Create basic value editor for editing
	values of e.g. categories throughout the database.	
	* src/lib/backends/sql_db.py Make get_unique_values() sort
	results.  Allow new syntax for criteria for make_where_statement
	whereby we can have a list of "and"/"or" values for a single
	column. Add update_by_criteria alias for update since that's what
	the rdatabase.py parent class uses.
	* src/lib/defaults_es.py Added gr. abbreviation.
	* src/lib/defaults_en.py Added gr. abbreviation.
	* src/lib/valueEditor.py Create basic value editor for editing
	values of e.g. categories throughout the database.

2007-01-03  Thomas M. Hinkle  <thomas_hinkle@sf.net>

	* src/lib/recindex.py Hide First/Last/Prev/Next buttons when there
	are only 1 page's worth of recipes.

2007-01-02  Thomas M. Hinkle  <thomas_hinkle@sf.net>

	* src/lib/importers/html_plugins/allrecipes.py Disable this plugin
	temporarily -- it isn't working properly and I don't have time to
	fix it.
	* src/lib/reccard.py Fix up group undo/redo so that ingredient
	group editing works again. This started with a simple typo fix
	(self.history->self.rc.history), but in the process of fixing it,
	I realized the undo was more fundamentally broken and had to be
	updated to properly use "permanent references"
	* src/lib/reccard.py Disable ingredient group toggling from the UI
	since it does not work and cannot be easily made to sensibly work
	given the structure of our ingredient DB.
	* src/lib/version.py Version 0.13.3
	* src/tests/testExporters.py Update to work with fancy PDF Export.
	* src/tests/testImporters.py Disable AllRecipes test since it's
	broken and we're disabling the plugin. Also, improve message on
	failure of import to produce a recipe with the expected title.
	* src/tests/reference_setup/recipes.db Update to latest DB.
	* src/tests/testRecCard.py Add a test for group editing. Exit when
	tests complete successfully.

	
2007-01-01  Thomas M. Hinkle  <thomas_hinkle@sf.net>

	* src/lib/convert.py Fix i18n related bug in new unit-parsing
	regular expression. Also, keep new code for debugging bug (this
	will make us fail more verbosely if we haven't caught all such
	bugs with our new unicode() call
	* src/lib/defaults_es.py Fix some typos in Spanish defaults.
	
2006-12-29  Thomas M. Hinkle  <thomas_hinkle@sf.net>

	* glade/recCard.glade Move scrollbar inside of notebook so that
	nutrition/Recipe tabs are always in view.
	* src/lib/backends/rdatabase.py Only update if we have a new
	database.
	* src/lib/backends/sqlite_db.py	Set a flag if we are a new database.
	* src/lib/exports/pdf_exporter.py Fix typo in get_pdf_prefs that
	required extra nonsense argument.
	* src/lib/defaults_en.py Fix fl. oz.
	* src/lib/nutrition/databaseGrabber.py Be less verbose.
	* src/lib/nutrition/nutritionLabel.py Improve formatting
	* src/lib/reccard.py Respect "Allow Units to Change" preference
	(previously, we were always adjusting the units in the recipe card
	display and never adjusting them in the nutritional info
	display). Properly handle redrawing and flowing with changed
	reccard glade layout.
	* src/lib/version.py Version 0.13.2

2006-12-28  Thomas M. Hinkle  <thomas_hinkle@sf.net>

	* src/lib/defaults_en.py Fix tablespoons (standardized to Tbs.)

2006-12-27  Thomas M. Hinkle  <thomas_hinkle@sf.net>

	* src/lib/backends/rdatabase.py Fix bug in URL-finding code in updater.
	* src/lib/ratingWidget.py Prevent warning about integer v. float
	* src/lib/shopgui.py Fix typo which prevented add-to-shopping-list
	from working with optional ingredients in some cases.
	* src/lib/shopping.py Fix ingredients when a range is being added
	to "None"
	* src/lib/TextBufferMarkup.py Make sure we are using unicode for
	text we get from textbuffer. (This seems to prevent unicode
	conversion errors elsewhere).
	* src/lib/version.py Set version to 0.13.1
	
2006-12-26  Thomas M. Hinkle  <thomas_hinkle@sf.net>

	* src/lib/backends/rdatabase.py Fix bug in new installations (this
	change was actually made before 0.13.0 went up to SF but not
	committed to cvs). Also, fix bug in ingredient parser that meant
	the space between two words in an ingredient got eliminated.
	* src/lib/Undo.py Catch all "Too many changes" errors that can
	happen in our text-change undo routine.

2006-12-24  Thomas M. Hinkle  <thomas_hinkle@sf.net>

	* src/lib/reccard Hide "Website:" label when there is no link.

2006-12-23  Thomas M. Hinkle  <thomas_hinkle@sf.net>

	* data/recipe.dtd Add link
	* glade/recCard.glade Move title and shopping-list button above
	other stuff to un-clutter ingredient text and keep title in view
	at all times.
	* src/lib/reccard.py Default to highlighting calories, and save
	last-highlighted nutritional item as a preference. Update flowing
	to take into account different default widths (so that our title,
	which is not the width of the whole card, can be wrapped
	appropriately). Highlight ingredients with boldness as well as
	color. Also, change color highlighting so that all items with some
	of the content will have a visible amount of yellow behind them.
	* src/lib/nutrition/nutritionLabel.py Hide MINOR items for which
	there is no nutritional content. Also, track toggles in a
	dictionary so that callers can programatically toggle highlighting
	(i.e. so that we can store preferences for which nutritional info
	to highlight)

2006-12-22  Thomas M. Hinkle  <thomas_hinkle@sf.net>


	* glade/recCard.glade Less confusing naming of notebook widgets.
	* src/lib/nutrition/nutrition.py Allow nested
	NutritionInfoLists. Handle embedded recipes from here. rather than
	forcing caller to deal with them.
	* src/lib/nutrition/nutritionLabel.py Set up label to work as
	button for selecting one part of nutrition to focus on elsewhere
	(e.g. to choose "Calories" or "Protein" or what have you.
	* src/lib/reccard.py Set up nutritional highlighting of ingredients.
	* src/lib/shopgui.py Use modify_ing method to modify ings (not assignment).
	* src/lib/TextBufferMarkup.py Fix bug in setting background color.


2006-12-16  Thomas M. Hinkle  <thomas_hinkle@sf.net>

	* glade/recCard.glade Move nutrition into a separate tab to reduce clutter/scrolling.
	* src/lib/LinkedTextView.py Fix links with escaped characters (e.g. &)
	* src/lib/defaults_en.py Add fluid ounces
	* src/lib/reccard.py Comment on text-wrapping code. Fix title display.
	* src/lib/recindex.py Set up text wrapping for index view
	* src/lib/backends/rdatabase.py Add last-modified timestamp. Add some methods for dealing with dups.
	* src/lib/backends/sql_db.py Raise an error if we set attributes on read-only RowObject
	* src/lib/recipeIdentifier.py Updates in still-experimental-and-incomplete recipeIdentifier code
	* src/lib/importers/html_importer.py Automatically add 'link' attribute to all HTML imports

