Added history combo to 'Title' field of transform, print/preview dialogs

Added drag'n'drop support for re-ordering tabs

Added optional confirmation dialog to time tracking

Added close buttons to tasklist tabs

Added blank line to single-selection droplists

And much, much more.

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 interface

Support for hierarchical data

Numbered items/subitems

Open file format

Freeware

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:

Files are stored in XML format with .xml file extension.

Trying to load a non-tasklist file will generally fail (unless you read the code to see how to circumvent it).

The number of items/subitems is limited only by memory (although performance may be the deciding factor before you exhaust memory).

Marking a parent item as 'done' will also gray-out child items, but they are not disabled or automatically marked as 'done'.

An ellipsis (...) indicates that an item has sub-items.

All items can be expanded or collapsed (by double-clicking).

Top-level items and sub-items are created using different toolbar buttons.

There are task-specific context-menus.

The previously open tasklists are re-opened on startup.

The tasklist is automatically saved when closing the software or minimizing it to the system tray.

The priority of a task is shown as a grayscale box to the left of the item.

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:

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:

Handle TVM_INSERTITEM and TVM_DELETEITEM to know exactly when items are added and removed.

In these handlers recalculate the width of the gutter required to display the widest 'dotted' item/subitem number. (Note: this is not necessarily simply the deepest subitem.)

Handle WM_NCCALCSIZE when it does, and offset the left border by the required gutter width.

Handle WM_NCPAINT for painting the numbers.

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.

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:

First, you design your dialog template in the resource editor, create a CDialog derived class using class wizard, and wire up all the controls just as you normally would.

Next, you #include "runtimedlg.h" and change all instances of CDialog to CRuntimeDlg.

Then, you cut and paste the control definition section from the appropriate section in the .RC file and embed it directly in the dialog's .cpp file as a static string (with a bit of tweaking to handle double quotes and such like).

Finally, in the constructor of your dialog, you simply call CRuntimeDlg::AddRCControls(...) passing the control definitions as a string.

And CRuntimeDlg takes care of the rest including, if required, auto-sizing the dialog to suit the control layout.

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.

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.

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.

for most of users I introduced TDL to, yes, it is. They just don't care too much about functionality (at least in the beginning), it looks confusing to them, they don't stay with the app for long so there's no chance for them to become advance users and they rarely come back.
Another issue is a learning curve, some extensive actions to reach a goal (remember, http://www.codeproject.com/Messages/4680904/Task-focus.aspx[^], your solution was

Quote:

What about combining: Filter Bar > Show > Selected Tasks

with Filter Bar > Options > Show all subtasks ?

Still it's a good solution and you are getting the required result but not everybody would be so insistent to come over it even if there's already some experience with the app.
We mentioned MLO several times, it's a shareware so they have to do something to sell it good. Have a look at its evolution within last, say, 7-8 years.

In the beginning users want something eye-candy, then they want functionality and in the end they insist on customization.
In my view for most users TDL has the latter twos but lacks the first one, as soon as it gets it http://www.youtube.com/watch?v=ryrQ8nadah8[^]

Unfortunately I cannot help with the design itself, probably it can be somehow outsourced but if you ask what exactly can be helpful:
1. ability to choose between simple, moderate and advanced layouts during installation.
Probably it's even better to have some advice for users which layout to choose depending on their previous experience and workflow requirements (a housemaid doesn't need Gantt charting and Burndown statistics so a simple layout is a good choice for her, likewise a project manager wouldn't be embarrassed by these terms and will choose an advanced layout)
2. more themes to choose from
3. more curved edges of GUI windows
4. icon sets (or different icons)
5. more visual effects
P.S. mostly the abovementioned are feedbacks from users in my surrounding, they are not keyboard ninjas or masters of planning, just normal users

I have come back here (TDL) [again] after having not kept with it, as the poster above mentions. Again the only real competition is MLO - even then it's not much competition, given the cost ...

What I have been searching for for quite some time, and still not found, is a PIM with subtasks, post-Palm world.The world has moved on in a number of ways since Palm, not the least Google, Android, and Linux. i.e. Agendus + ShadowPlan/Bonsai in a larger cross-platform Linux / Windows / Google / Android / Internet world. And none of this website subscription / synchronization nonsense, direct sync only. (But I appreciate that the subscription route is probably the only way to keep food in your mouth in this ecosystem.)

I am back to TDL mostly for two things - Android app, and finally got Wine going and found I could run TDL under it. TDL as a windows only app, still, is harming itself. Which is all to say, it's not TDL, it's the ecosystem surrounding it - pbworks and codeproject are easy examples of this. Everything screams 'coders only'. The lack of (Google) calendar integration also holds it back.

(Given my recent experience, had to play with Windows 8.1 for the first time, I've vowed never to buy another MS machine, and to get off all things MS ASAP. Like I said, TDL windows only holds it back.)

Anywho ... the reason / what caused me to write this ... careful if you take up the offer to check out MLO - the free version is still many, many, years old, and also 'plainly ugly'. If you want to see the esthetics of what the above poster is talking about, stick with the screenshots the website shows. Or purchase.

In the mean time ... in many ways I appreciate the 'ugliness' of TDL - it's CLEAN! Straightforward. Easy to use / understand - once you understand outlines, and project management, little extraneous. But, if all that were intuitive to most people ... there'd be more competition for it out there - and there isn't.

Dan: I totally agree with what Alex said.
I am a graphic designer. AND I REGRET be unable to help, I not have time! had begun with icons, but -you see- I could not move much.
TDL functionality is AWESOME. And certainly, if I TDL had an attractive UI ... quickly be positioned as the best program of its kind ..
There are many programs with beautiful UI. In a future post try to post some links.
Yes, TDL it's a bit ugly, but... we love it
Regards,

Thx Alex, I really appreciate the time and effort you have put into your response.

mugrrrr wrote:

they don't stay with the app for long so there's no chance for them to become advance users and they rarely come back.

I would appreciate you outlining (in any level of detail) what you might consider to be a good 'Out of the Box' experience for TDL that we could aim for. I hope you appreciate that after 10 years it's very difficult for me to see TDL with 'new' eyes.

mugrrrr wrote:

Another issue is a learning curve, some extensive actions to reach a goal

I get you. Perhaps here too you could suggest some further 'goal-oriented' simplifications we could make.

mugrrrr wrote:

ability to choose between simple, moderate and advanced layouts during installation.

Feel free to highlight which parts of the UI (in your opinion) significantly add to its complexity.

mugrrrr wrote:

a housemaid doesn't need Gantt charting and Burndown statistics

It is my intention to add preferences to control what tabs are visible, so that certain tabs can be turned off by default.

mugrrrr wrote:

feedbacks from users in my surrounding

I know that many people don't know what they do like, but do know what they don't like, but it would be great if we could translate what they don't like into statements of what they would prefer.

mugrrrr wrote:

as soon as it gets it

And we could change TDL's name to FLYTRAP!

Thx again for all your comments. I'd love to make this an ongoing conversation where everyone can contribute to the debate.

I guess i know or more feel what the author of those lines meant.
The design of TDL is not fresh. It can´t be as it hardly changed over the years.

But:
Design is a fashion-victim. What does that mean? Same as fashion it runs through the standard fashionpsychology cycle of perception which is chronological:

strange - unknown - new - fresh - stylish - wannabuy - must have - more common - even used by standard people - not capable to stand out any more - not stylish - not wearable

The more special the design the quicker the runthrough of the cycle. You may remember the fashion brand ED HARDY ? Explore your feelings about it then and now...

At the moment grey, colourless designs are the trend. Office 2013 and iOS 7 are examples for that. You actually wonder why you are using a color monitor. Please, don´t go there!

IMHO you should not look for any designs at all. Instead make it just a bit more visual and adaptable. This way it will never look outdated. Designwishes are even more userspecific as featurewishs. I know Prefs are already big but what about:

- Definable fonts for Tasks and the subtasks up to Level 5 including Options for Bold and Italic
- Definable fonts for attribute columns
- Definable fonts for Menu´s
- The possibility to display icons instead of text in the attribute columns. Just one example: In the "Occurs" columns you could display icons for daily, weekly, monthly... instead of words. It would also save space!

I would not say TDL is 'ugly'. There are prettier and uglier applications out there. It is however very busy and loud when compared to more recent aesthetics. It is functional though, and when using its substantial capabilities needs to be able to show a lot of information. However, some things I have noticed:

The initial level of detail can put people off - as has been mentioned above. You tend to grow into task planning, often going from simple to complex (and then back to simple again ). It seems only certain types of people actually want / enjoy / can be bothered with extensive task management. So some people I work with use no task management, others use simple systems (e.g. post-its, diaries, google tasks etc), and others again use slightly more able systems, such as Toggl, usually for team or time recording reasons. My point I guess is that the interface may put off those in the first 2 camps, especially if they really only want a simple, non-hierarchical list, with task title and a due date... But then are these people target audience?

Back to the styling. I have also looked at a variety of task managers on Android. They are often quite pretty and minimalist. They are obviously touch based, and don't have the extensive functionality of TDL, but some have some very nice ways of hiding detail unless you want it (e.g. slide out toolbars and menus, information only becoming visible when hovering over or clicking). TDL is a bit inflexible in what and how things are displayed (e.g. it would be great to specify visibility of columns, filter, entry fields separately in user defined 'views', grouping of tasks in task view, ability to hide/slide/pin toolbars easily in the interface rather than by shortcut or menu navigation)

As also mentioned above, the TDL functionality is fantastic and you can do all sorts of things, but sometimes it feels hard / inelegant. It is often just little things, and they are probably really hard to deal with, as everyone works a bit differently. You usually just get used to them. So much so I can't really recall any specific cases..

I would personally like the option for in-place editing, and it is more intuitive for new users IMO. I rarely change multiple items at once, and it means I am looking directly at the row I am editing, rather than looking up and down. But I can see reasons for both, and am used to it.

To summarise, for a propeller head like me, the interface is fine. It has its rough edges, but most things are able to be handled in one way or another. To me, of more value is the functionality. But for people who are after a simple list of task names with due dates/days, the additional functionality is not relevant, and hence the look and ease of use will be of greater importance.

Maybe you can have a parallel release ("the beauty edition") just to see how it goes.

Best regards,
Stefan

P.S. Initially I was using the KeyNote Note taking app (not the apple one) until it become discontinued. It was a delphi application, but the use of it came so naturally that I thought it was beautiful. So in my eyes user experience is beauty

I build a Ruby on Rails application which does stats on the completed tasks by parsing the *.done.tdl files. When I can't complete a recurring task and want to skip it, at the moment I can do as follows
+ Mark it as completed so it moves to its next occurrence. This would make the stats incorrect.
+ OR I can manually move the task to its next occurrence. This is a bit tedious.

So my suggestion is adding a new action called something like "Skip this occurrence" which moves a recurring task to its next occurrence.