Click here to Skip to main content
Email Password   helpLost your password?

Downloads 

todolist.png

Latest Update (6.1 Beta Release)

Once again this release is not full of big features but instead a range of smaller features that should make using ToDoList easier.

Features include: 

Related Links

After finally compiling a FAQ of the most relevant questions asked about ToDoList I've moved all resources related to ToDoList to a new page on my website.

Introduction

You know how it is - you start work on one project and halfway through, you find one or two side-projects crop up that have to be solved before you can continue on the original project.

This is one such project with the added twist that it too started its life as a side-project. Here's what happened:

<Cue wavy screen effect>

I can only imagine that the planets must have been in (mis-)alignment or something, because at one point a few months ago, I was suddenly fielding emails on four or five separate articles I had previously submitted to CodeProject, some asking for features and others for bug fixes.

Foolishly or otherwise, I largely agreed with all the points raised, and subsequently found myself with fourteen or fifteen separate issues to resolve.

The situation was also made worse because I was trying to use CodeProject to keep track of all the things I had agreed to do, meaning that I had to continuously trawl the comments section of each article to remind myself of what I was supposed to be working on.

It even got to the stage where I was worrying that I'd fail to deliver on something - silly I know, but there you are!

Keeping a list on paper was a definite step in the right direction, but since I do all my coding on the same machine, it seemed somewhat inelegant, and anyway, we all know what happens to crucial bits of paper left lying around on desks and such.

The next step was to hunt around on the web for a tool to meet the following requirements:

Simple, huh! not!

I will admit that I did not spend weeks searching, but I am still surprised at the general lack of software matching my needs.

On reflection, I think that the reason may be simple: people are so used to commercial software being 'feature-rich' that when they come to design software themselves, they (not unreasonably) think they too need to cram as much in as possible, often leading to software where a lot of essential functionality is hidden away in the menu bar.

So, surprise, surprise, I decided to write something myself.

However, it's fair to say that I did not originally intend to post it on CodeProject and am only really doing so because I had a heap of fun solving some very interesting problems and these are what I think make it worth it.

Using the Software

There's really very little I need to say here since every feature/function is explicitly visible in the interface.

Nevertheless, the following list of basic capabilities and omissions may go someway to answering any questions that arise:

Points of Interest

Here's where we come to the side-projects I was talking about, the first two of which I intend to work up into follow-up articles.

They are:

  1. The 'ordered' tree control, which incorporates a non-client gutter for displaying the item numbers.

    The idea stemmed from research I did into alternative designs for a tree-list control, which did not solve it by creating a hybrid control incorporating a tree and a list.

    The hybrid control seems such an obvious solution that I suspect few people have stopped to question it, but it has still always struck me as looking far too much like hard work to be truly elegant ('square pegs' and 'round holes' spring to mind).

    One possible idea is to implement the 'list' portion entirely in the non-client area of the tree. I.e., shift the right hand client edge to the left and then render the list portion in the resulting non-client area.

    Whilst I've yet to get round to building a proof of concept, it was nevertheless this ongoing mental debate which prompted me to try to solve the requirement for numbered items and subitems by rendering the item/subitem numbers in the non-client area.

    Without going into too much detail (as this will subsequently be an article of its own), this is how I got it to work:

    This is necessarily an over-simplification, but it captures the essence of the solution, and all that essentially remains is lots of fiddling about to ensure the non-client area gets redrawn at the the right times to stay synchronized with the client area.

  2. Embedding .RC control definition data directly in a .cpp file to break the dependency on binary resources (a.k.a. 'Runtime Dialogs').

    This is an idea that has been floating about for quite some time and which has only recently gelled into a workable solution.

    The problem, put simply, is that if you want to take advantage of the resource editor in Visual Studio (and who doesn't), then you very quickly find yourself stuck with having to load dialog templates from resources compiled into the binary file.

    This further means that if you want to make use of a dialog across multiple projects, then either you need to copy and paste the dialog template between project .RC files, or you need to build the dialog into a DLL from which it can be accessed.

    'Runtime Dialogs' (a snappy title I coined myself) is a solution that neatly sidesteps both the nuisance of copying dialog resources between resource files and the extra work (and maintenance) involved in packaging dialogs in DLLs.

    And it works like this:

    I'm certainly not suggesting that this is a 'win-win' solution for all situations but it certainly has merits in its closer coupling of dialog template to dialog code which makes sharing dialogs across multiple projects a breeze.

    P.S.: In case it's not clear here, I used CRuntimeDlg to create CToDoCtrl which encapsulates the ordered tree together with the priority, date and comments controls as a single simple-to-instantiate control.

    I'm also proposing to use them in the .NET port of my ProjectZip add-in for VC6.

  3. Embedding the XML file in a web page.

    This is possibly the most satisfying aspect of the whole project because it was completely unexpected.

    What I mean is that, until recently, my knowledge of DOM and XMLDOM was virtually non-existent, as it's only since I've become more interested in the presentation of AbstractSpoon that I've been forced to get to grips with the various implementations of DOM and XMLDOM out there.

    I'm pleased to say that the code on my site works under IE 6.0, Netscape 7.1, and Mozilla, although custom code was required to achieve this.

Generic MFC Classes that may prove Useful to You

The following table lists a wide range of utility classes written for this project. They can all be included in any MFC project provided you include any class dependencies too. Feel free to ask any questions relating to these specific classes and how to use them.

Class Name

Description

Class Dependencies
(apart from MFC)

CAboutDlg

Customizable "About…' dialog not requiring a dialog resource. Supports html encoded text

CRuntimeDlg, CRCCtrlParser

CAutoComboBox

Adds only unique items to the drop list and shuffles the list so that the last added item is at the top

CHoldRedraw

CAutoFlag

Encapsulates the setting and unsetting of a boolean variable thru the lifetime of the class instance

CColorButton

Non-ownerdraw button that displays the selected colour on the button face and displays the colour dialog when clicked

CEnColorDialog

CColorComboBox

Owner-draw combobox for displaying and selecting user defined colours

CDateHelper

Encapsulation of various rountines for calculating date spans and for formatting

CDeferWndMove

Encapsulation of the Win32 API

CDialogHelper

Re-implementation of the CDialog DDX/DDV rountines to avoid the MFC error messages when the user clears a number edit (for instance)

CDlgUnits

Encapsulates the MapDialogRect Win32 API

CDockManager

Class for managing the docking of one popup window to another.

*CSubclassWnd, CHoldRedraw, CAutoFlag

CDriveInfo

Encapsulates various rountines for querying about drives, files and disk space

CEnBitmap

Adds support to CBitmap for loading non-bmp files and resources.

CEnBitmapEx, CColorReplacer, CImageBlurrer, CImageColorizer, CImageContraster, CImageEmbosser, CImageFlipper, CImageGrayer, CImageLightener, CImageNegator, CImageResizer, CImageRotator, CImageSharpener, CImageShearer, CImageSysColorMapper, CImageTinter

Adds image manipulation funationality to CEnBitmap

CEnBitmap

CEnColorDialog

Adds saving and restoring of custom colours to CColorDialog

CEnCommandLineInfo

Adds functions for extracting and querying commandline switches

CEnEdit

Adds user-defined button capabilities to CEdit

CMaskEdit, CThemed, CDlgUnits

CEnToolBar

Adds support for using alternative resource or file images

CFileEdit

Adds buttons for browsing and displaying the file represented by the text in the edit control. Also shows the file's small icon.

CEnEdit, CFolderDialog, CMaskEdit, CDlgUnits, CThemed, CSysImageList

CHoldRedraw

Encapsulates WM_SETREDRAW

CHotKeyCtrlEx

Fixes a number of behavioural problems including the handling of certain keypresses

CHotTracker

Tracks the cursor movement over user-defined windows and posts event messages as necessary

*CSubclassWnd,

CLimitSingleInstance

Provides simple method to detect if another instance of an app is running

CMaskEdit

Adds simple character masking to CEdit

CNcGutter

Allows the UI of standard windows controls to be extended by supporting any number of columns to be added to the non-client area of the window. Favours tabular controls like lists, trees, etc

*CSubclassWnd, CHoldRedraw, CThemed, CDlgUnits

COrderedTreeCtrl

CTreeCtrl implementation of CNcGutter displaying a single column showing the hierarchical position of each tree item in '1.2.3.4' notation.

CHoldRedraw, CThemed

CPasswordDialog

Very simple password dialog not requiring a dialog resource

CRuntimeDlg, CRCCtrlParser

CPropertyPageHost

Simpler replacement for CPropertySheet allowing easier creation as a child window

CRCCtrlParser

Used by CRuntimeDlg for parsing dialog resource-like text

CRuntimeDlg

Adds support to CDialog for building dialogs at runtime ie. dialogs do not require a dialog resource

CRCCtrlParser

CShortcutManager

Class for handling application keyboard shortcuts.

*CSubclassWnd, CWinClasses

CSpellCheckDlg

Spellcheck dialog not requiring a dialog resource, which interfaces with ISpellCheck (interface to Open Office dictionaries)

CRuntimeDlg, CRCCtrlParser, ISpellCheck

CSysImageList

Encapsulates the Windows system image list (file/folder images)

CTabCtrlEx

Adds post rendering callback for the tabs without using owner-draw

CThemed

Encapsulates themed (XP) and non-themed (the rest) drawing of windows controls

CTimeEdit

Adds a button for specifying time units and provided routines for converting time to and from different time units

CEnEdit, CMaskEdit, CThemed, CDlgUnits

CToolbarHelper

Adds support for dialog toolbar tooltips, multiline tooltips and dropbuttons with menus

*CSubclassWnd, CEnBitmap, CEnBitmapEx

CTrayIcon

Encapsulates the Shell_NotifyIcon Win32 API. Also provides balloon tips and animation

*CSubclassWnd,

CUrlRichEditCtrl

Adds support for recognizing urls, clicking them and setting custom url callbacks

CWinClasses

Encapsulates the ::GetClassName Win32 functions

CXmlFile, CXmlItem

Non-Unicode class for reading and writing xml files

CXmlFileEx

Adds encryption capabilities to CXmlFile

CXmlFile, IEncryption

* CSubclassWnd was originally written by Paul DiLascia for MSJ magazine. The version I use has been heavily extended to suit my specific needs. The classes that depend on it here need this extended version.

Further Work

Whilst this tool was originally intended for my personal use only, it is now a 'community' project, so if you find it useful and want to make suggestions for enhancements or bug fixes, then post below.

History      

You must Sign In to use this message board.
 
 
Per page   
 FirstPrevNext
GeneralTask Dependencies
bdlitman
15:41 25 Feb '06  
Further to what benxshen ref'd, if you could enable the feature whereby a Task or Sub-task cannot be *completed* unless a LINKED and DEPENDENT (but not subordinate) TASK is also completed, that would be great.

This would give TDL two key and powerful aspects: HIERARCHY and DEPENDENCIES

... or, being a newbie... did I miss something?

-B
GeneralRe: Task Dependencies
.dan.g.
18:30 25 Feb '06  
bdlitman wrote:
cannot be *completed* unless a LINKED and DEPENDENT

this is exactly what i will be doing. if you try to complete a task that is dependent on an incomplete task you will be warned that the other task must be completed first. and i'll probably try to display the dependency chain together with an option to go to the first task in the list but this can all be worked out after the 4.8 alpha.

.dan.g.

AbstractSpoon Software abstractspoon2_at_optusnet_dot_com_dot_au
GeneralRe: Task Dependencies
benxshen
4:58 26 Feb '06  
Cool~~~
The idea is so great!!! Big Grin
GeneralRe: Task Dependencies
Hoppfrosch
22:47 26 Feb '06  
Hi .dan.g.

you're really great. Cannot wait to see this feature being implemented.

I already asked for this feature I in a separate thread. I also made a few (perhaps helpful) suggestions on features I woluld like to see supported

-- modified at 3:48 Monday 27th February, 2006
GeneralRe: Task Dependencies
.dan.g.
13:45 27 Feb '06  
initially, i propose to add dependencies which use the same syntax as task links but without the tdl://. and to ease the usability of this feature i will add an option to allow a copied task to be pasted into the dependency field.

ie.

1. go to the tasklist which contains the 'base' task
2. copy it
3. go to the tasklist which depends on this task
4. right-click i the 'Depends On' field and select paste
5. display a warning if there is a circular dependency

.dan.g.

AbstractSpoon Software abstractspoon2_at_optusnet_dot_com_dot_au
NewsToDoList 4.7 in Alpha
.dan.g.
16:49 24 Feb '06  
Here[^]

changes:
  • task selection functionality added to transform option
  • option added to omit subtasks when exporting/printing/transforming
  • tasklist capability added to tdl: protocol (syntax: tdl://<tasklist>?<taskID> )
  • 'File > print' separated from 'File > print preview'
  • dialog control accelerators (Alt+<key> ) fixed. ie pressing the same accelerator repeatedly will cycle through all the controls sharing that accelerators.
  • rtf format commands added to context menu
  • preference added for new subtasks to inherit parents due task (Preferences > Tasks > Defaults)
  • due tag added to priority colours. ie actual task priority is displayed and the corner is coloured if the task is due (same as the tasklist tab)
  • 'num completed / number of subtasks' displayed to left of task title if task has subtasks
  • 'filter bar' fields are hidden if the respective tasklist column is hidden
  • view menu option added to hide project name field (applied to all tasklists)
  • toolbar button added to rtf toolbar for strikethrough
  • resizing of external ID tasklist column fixed
  • 'status' added to filter bar/dialog
  • -help,-h,-? commandline support added
  • support added for offsetting task dates (Edit > Offset Dates)
  • Logging added to the time tracking functionality (Preferences > Tasks > Attributes)
.dan.g.

AbstractSpoon Software abstractspoon2_at_optusnet_dot_com_dot_au
GeneralRe: ToDoList 4.7 in Alpha
Hoppfrosch
0:36 27 Feb '06  
.dan.g. wrote:
support added for offsetting task dates (Edit > Offset Dates)

Looks good - seems to do the things I expected - thanks!


.dan.g. wrote:
tasklist capability added to tdl: protocol (syntax: tdl://<tasklist>?<taskID> )

Whats the correct syntax of <tasklist>? Is it possible to link to tasklists, not currently open in TDL (or even not open and in a different directory than the current tasklist)? Anyway - great feature ...







-- modified at 5:37 Monday 27th February, 2006
GeneralRe: ToDoList 4.7 in Alpha
.dan.g.
12:43 27 Feb '06  
Hoppfrosch wrote:
Whats the correct syntax of ?

you can do full paths and relative paths.

eg.

tdl://c:\mystuff\tasklist.tdl?37
tdl://subdir\tasklist.tdl?37

however like all urls you can't have spaces (unless they're translated to '20'.

also i haven't tried using ellipses (...) in the path. Seems to work fine.

[more] here's the easiest way to do it:

1. drag and drop the tasklist of interest into the comments field or file ref field
2. change/add the tdl:// at the front
3. append '?' and the task number

.dan.g.

AbstractSpoon Software abstractspoon2_at_optusnet_dot_com_dot_au

-- modified at 18:29 Monday 27th February, 2006
GeneralRe: ToDoList 4.7 in Alpha
Valik
7:22 27 Feb '06  
.dan.g. wrote:
due tag added to priority colours. ie actual task priority is displayed and the corner is coloured if the task is due (same as the tasklist tab)
This is a nice effect but there's one fundamental problem with it: You can't see it if the priority begins to approach being red. I use HSL to set my colors with 00FF00 as the lowest and FF0000 as the highest. I can't see the due marker on priorities 8 - 10 with those settings.


GeneralRe: ToDoList 4.7 in Alpha
.dan.g.
12:45 27 Feb '06  
i anticipated this and have already experimented with some code that draws a line between the tag and the priority colour. if i remember correctly, a black line was the most appealing.

i'll release a build with it re-enabled.

.dan.g.

AbstractSpoon Software abstractspoon2_at_optusnet_dot_com_dot_au
GeneralCan I make links/refers to other tasks?
benxshen
16:39 22 Feb '06  
The idea is like "see also". If so, I can easily check out what related tasklists for one todo are.
GeneralRe: Can I make links/refers to other tasks?
.dan.g.
17:44 22 Feb '06  
yes, but only to tasks in the same tasklist (until 4.7).

using the syntax 'tdl://<taskID>', you can place links in the file references field and the comments field.

.dan.g.

AbstractSpoon Software abstractspoon2_at_optusnet_dot_com_dot_au
GeneralAdd new tasks in archive ??
Doublebogey
13:47 22 Feb '06  
Hi Dan

Current real scenario.
We often have the archived task list open at the same time as our Main List. So we can check that tasks marked completed appear in the archive and to reference finished work.

If we are not paying attention, we sometimes add a new task to the archive.
This causes some confusion later when we think we have lost a task.

Would it be better that you are unable to add new tasks to a archive, and that all tasks are entered via the main List and then marked completed.

Others may use the archive list differently though.

Thanks
dB
GeneralRe: Add new tasks in archive ??
.dan.g.
17:52 22 Feb '06  
Doublebogey wrote:
unable to add new tasks to a archive

i'm tempted to prevent any editing of the archive but that's probably a little heavy handed. the problem this highlights though is: where to stop?

should i also prevent deletion of tasks and other more subtle edits(especially if the archive is used as a sort of audit trail)?

or perhaps i could just add a preference to control a warning message if you attempt to add or delete tasks from an archive.

.dan.g.

AbstractSpoon Software abstractspoon2_at_optusnet_dot_com_dot_au
GeneralRe: Add new tasks in archive ??
Doublebogey
22:46 22 Feb '06  
.dan.g. wrote:
i'm tempted to prevent any editing of the archive but that's probably a little heavy handed. the problem this highlights though is: where to stop?

should i also prevent deletion of tasks and other more subtle edits(especially if the archive is used as a sort of audit trail)?

or perhaps i could just add a preference to control a warning message if you attempt to add or delete tasks from an archive.

.dan.g.

I guess it all depends on how users access their archive file, and what for (if at all).

A warning message as suggested would certainly satisfy our needs.

Thanks
dB



GeneralRe: Add new tasks in archive ??
.dan.g.
12:55 27 Feb '06  
4.7.a4 has this.

.dan.g.

AbstractSpoon Software abstractspoon2_at_optusnet_dot_com_dot_au
QuestionSubitem gets category of main item
Torsten Eineter
12:41 22 Feb '06  
Hi Dan!

First a big thank you to you for this great program Smile !!
I have encoutered a litte "feature" (maybe bug): I use the category to sort the type of tasks I have to to (e.g. implement, bugfix, refactor). I did not set a default category in the properties. When I create a new subitem it automatically gets the category of the parent item instead of no category Confused . Sometimes I have a task "implement a big thing" (cat. "implement") and working on this I have to bugfix a litte part. Then I create a new subitem - it should have no category on creation so that I can set it to "bugfix" but it becomes a "implement". Is it possible to fix this in the next release? Big thanks again!

Torsten Eineter
AnswerRe: Subitem gets category of main item
.dan.g.
13:20 22 Feb '06  
hi torsten,

there is another set of preferences on the defaults page which allows a subtask to inherit attributes from its parent. i may be that you have this turned on for 'category'.

.dan.g.

AbstractSpoon Software abstractspoon2_at_optusnet_dot_com_dot_au
GeneralRe: Subitem gets category of main item
Torsten Eineter
13:33 22 Feb '06  
Hi Dan!

You are right, I missed that. Now it works exactly as I need it. Thanks!!

Torsten

GeneralStart/Stop clock and switching task
MarioZG
10:55 22 Feb '06  
1. Start clock (time spent counter) on task A
2. Select other task (eg. B)
3. the timer doesn`t tick. the view column has a timer icon by task A but time spent counter dosen`t icrease.

Is it bug or demanded behavior?

PS. Are you thinking about make some SQL version?
GeneralRe: Start/Stop clock and switching task
.dan.g.
13:16 22 Feb '06  
this is by design.

however, there are options in 'preferences > tasks > attributes' to control this behaviour.

>> PS. Are you thinking about make some SQL version?

some time (i don't know when) i will create a plugin interface for linking to other data sources like SQL, ODBC, web.

.dan.g.

AbstractSpoon Software abstractspoon2_at_optusnet_dot_com_dot_au

-- modified at 18:24 Wednesday 22nd February, 2006
GeneralRe: Start/Stop clock and switching task
Rock7
9:59 23 Feb '06  
Hi,.....

If that happen (database conection), i have a
very, very, very,very big interest......

Becouse (in task list from a team) each user can modify only their task (not necessarily make an lock to entire XML file).

Actualy he have a Check In / check Out but to all XML file.

In database version he can have a lock to only the task from each user owner.... (something like)

I supose the realy cool explosion, it's a DataBase version.
Any way, Todolist are a very cool application.

And i have a team with 7 guys, using file control (check in / check out).

Regards,
Luis Calhau

Generala bug - during delete some old task
Xabatcha
22:18 21 Feb '06  
When I try delete task it gives me an error and todolist is closed. It came when I tried delete some older task, which I created in earlier version. When I create a new one and then try delete it, it is oki.

Just in case, there is a task which make an error:
<TASK PRIORITYCOLOR="16122042" WEBCOLOR="#BA00F6" STARTDATESTRING="20.9.2005" RISK="0" LASTMODSTRING="18.11.2005 (8:15:35)" TEXTWEBCOLOR="#BA00F6" PRIORITY="7" LASTMOD="38674.34415509" TEXTCOLOR="16122042" CREATIONDATESTRING="" TITLE="Question" CREATIONDATE="0.00000000" PRIORITYWEBCOLOR="#BA00F6" ID="20" PERCENTDONE="0" STARTDATE="38615.00000000" COLOR="16122042" POS="2">
I am using new version 4.6. Running on WinXPsp2 prof.

Have a nice day.

--------------------------
Xabatcha ... test the best
--------------------------

GeneralRe: a bug - during delete some old task
.dan.g.
13:23 22 Feb '06  
i think maybe that a bug in the older version has created 2 tasks with the same task ID. can you send me the entire tasklist so that i can check this out (remove any private information if necessary)?

.dan.g.

AbstractSpoon Software abstractspoon2_at_optusnet_dot_com_dot_au
Generalhyperlink problem in comment editor
benxshen
5:55 21 Feb '06  
Please take a look http://www.flickr.com/photos/77348877@N00/102633010/[^].

When comment text mixed chinese and english, the hyperlink would be messed.

ToDoList version: v4.6

-- modified at 10:55 Tuesday 21st February, 2006


Last Updated 13 Feb 2010 | Advertise | Privacy | Terms of Use | Copyright © CodeProject, 1999-2010