Copyright (c) 1993 by Sanjay Ghemawat

Bugs + Stuff to Fix
===================
* Alarms are killed on flush: should be killed only if changed
* Calendar that includes itself creates problems.
  See messages from Murray.Cameron
* Select an item, do "Properties...", mark it as a todo item, click Okay.
  Pull down the Item menu, notice that "Todo" is not marked.
* Tk 4.1 configuration does not pick up -lsocket -lnsl -lbsd etc...
* Allow CFLAGS passing to sub-make invocations
* Set the "wm client" and "wm command" properties.
* Use -tearoffcommand to track menus that have to be updated
* Do not change border widths to "1" on monochrome displays
* Add menu entry for pasting text into an item
* New alarms created by the ruler widget are not aligned properly
* Add preferences to select WWW viewer
* Fix focus list ordering for all toplevels
* Fix documentation to reflect new menu items (if any)
* Fix and re-enable insert-text/delete-text commands
* Add control-u for editor bindings?
* People keep complaining about overlap between scrollbar and NoteList


Changes for Tcl 7.5/Tk 4.1
==========================
* How does Tk_CreateMainWindow get called now?
* Use "package" stuff?
* "foreach" is now better"
* Use portable file IO?
* "grid" geometry manager
* Look for uses of "fd" and change to Tcl_File?
* Switch to using the "clock" command?

Various proposals
=================
(PS. I am not sure if all of these are good ideas.)

* Optionally use pair of dateeditors for item range setting
* When indicating "late for appt", say how late.
* Make "todo" items that are marked as "done" sort after normal items.
* Israel weekends are Friday and Saturday.
  - fix dateeditor.tcl to hilite the appropriate columns
  - fix the "nth" working day stuff for monthly repetitions.  Yikes!

* Allow "ical -print" for generating postscript
* Set up end range (for date range editing) by default to be a year away?
* "Appointment range" changes do not affect window sizes if the window
  has already been resized.
* Add a menu button to restart ical, which gets any new X resource settings.
* Allow todo list items to also allow overflow, as with appointments.
  This lets todos take up only one line, but contain as much information
  as needed to describe the task.
* Check for duplicate calendar inclusion?
* Incremental searching
* Keyboard shortcuts
* Keyboard macros
* TTY interface
* Option to work with A4 paper (change /RealWidth to 8 inch?)
* Alarms > 60 minutes
* Ability to annotate items with long messages.
* Different views (month, week, year)
* Always leave a small box around today's date
* Add more on-line editing of options
* More control over queries (string dates/regexps/...)
* De-iconify window on update to shared calendar
* More hooks for various events --  ...
* Allow reminder window to be completely overridden
* Support for scheduling meetings? (look at ftp.cs.washington.edu: vsched).
* Various converters (I will accept contributions...)
* Viewing all the attributes of a bunch of appointments?
* Use less screen space (as an option for people with smaller screens)
* Quick way to jump to dates
* Automatically delete blank entries
* Start off with old settings when editing repetition info
* Unhiding items somehow
* Allow clicking in date editor past end of month to go to next month
* Make the month heading in date editor a menu.
* Distinguish between file/directory for permission denied.
* Allow geometry spec/resizing for dayview
* Different widths for appt/notice lists
* Flag when some appts are not visible
* Allow single click and drag to create and size appointment
* Create option to control stay-up menus.

* Item types (with icons)? (Merge Phillipe Defert's changes?)
* Change owner field on each modification?
* Clock
* Working/lunch hours
* Put month view in a small icon?

Comments from "Steve Simmons..."
* Turn the "Help" menu into a button
* Merge "edit weekly" and "edit monthly"
* Improve "edit range..."

Hacks to compile with SGI compiler.  Arghh!!!!
* Does not like code after return statement in inline functions
* Does not like inline functions with static variables
* The <assert.h> file uses printf, but forgets to include <stdio.h>

* Build loadable libraries:
  - ical
  - screen saver reset?

Cleanup
=======
* Share code between apptlist/notelist
* Move widget configurations into resource files?

Speedups
========

Editing code
ApptList::layout (Time spent computing offsets?)

Todo Items
==========
* Assign priority and category to each items
* Implement TodoList widget for displaying todo items
  based on categories.
* NoteList displays only the high priority items
* TodoList widget:
  - list of items sorted by priority and then increasing/decreasing date
  - can mark item as done (done items go to "Category/Done" list)
  - can delete item
  - can change priority
  - can change category

Merging Calendars
=================

C++	Calendar* merge(Calendar* a, Calendar* );
Tcl	<cal> merge [fileA] <filenameB>
	requires	fileA is one of the included calendars in <cal>
			(fileA defaults to main if ommited)
	modifies	volatile copy of fileA
	effects		Reads calendar contents of <filenameB> and merges
			them into volatile copy of fileA

Merging calendars
=================
	if item in exactly one of a, b, use as is.
	if item in both a, b then merge item

	if hide entry in any one of a, b then use it
	if include entry in any one of a, b then use it

	if option in exactly one of a, b then use it
	if option in both and same, then use it
	if option in both and different, report error

Merging items
=============
	compare item unparsing, if same then no problem
	report error

Logging Modifications
=====================

All logged items have a time stamp + unique id for modifier

Logged items:
	set <id> <value>
	delete <id>

	<id> -> <option name> | <uid>
	<value> -> <option value> | {<note> <rep>} | {<appt> <rep>}

Merging log L into a calendar log C:
	- create new merged log
	- foreach entry from L:
		if not obsoleted by later entry in merged log, then apply

Trimming the log part 1:
  For any id X, only keep latest entry.
  For existing data items, we will store just the latest entry,
  but we might have a huge list of delete log entries.

Getting rid of delete entries:
  Time based, or just forget about it?

New rep:
  Place time stamps on all items and options.
  Generate timestamped delete entries when appropriate.
  To merge: foreach item/option/calendar/..., find newest entry
  in either calendar and use that.

Implementation:
  1. Items: just put a time stamp field and generate delete records
  2. Options: Calendar maps from option names to time stamps.
  3. Hide: Just create a union of the two sets
  4. Includes: Calendar maps to time stamps and may have delete records
=============================================================
