Thumbelina

Extract the images behind thumbnail images. This package is a demonstration of filtering the tags that are produced by the Lexer package. In this case the idea is to find links to known types of image file (.gif, .png and .jpg) that have as the link text a reference to a smaller or lower resolution image, often called a thumbnail image; hence the name.

Besides a lot of support code to provide a user interface, the heart of the process is found in `Thumbelina.extractImageLinks()`, which has a wee state machine that notes when an <IMG> tag is discovered within the body of an <A></A> tag pair. This triggers a fetch of the `HREF` (image file).

The fetch is performed in the background by the `ToolKit` image loading code which runs 4 threads (on my machine). When an image is received it is added to the list of pending images. This list is drained by the `Sequencer` as it presents images at fixed intervals.

The `TileSet` and `Picture` classes provide a framework for displaying the various sizes of image that arrive in a random way, while still being able to repaint the panel when required.

The images are only retained in memory long enough to get covered over by subsequent images, but in general, the manipulation of images is a memory intensive task which requires a higher than normal limit on the maximum heap memory, i.e. use the `-Xms256M` command line switch to avoid `java.lang.OutOfMemoryError` messages.

The rest is just the UI code, that can be altered by intrepid programmers as they see fit.

TODO

- Fix race condition that background thread adds new URL's after a reset.
- Send output to log window instead of URL's in titlebar.
- Add pending list items as greyed out items to the history list.
- Make status bar a pipeline with valves and limit switches (better on/off buttons).
- Fix race condition that sometimes doesn't resize PicturePanel with frame.
- Tree view.
- Drag and drop support.
- JavaHelp.
- Allow filter configuration.
- Handle OutOfMemoryError more gracefully (trap System.err?).
- Add more background threads.
- Find out how to honour reset on the image fetcher threads.