KHTMLW CHANGES
==============

Last Change: 20 November 1997 - Martin Jones.

Version 0.12.02
---------------

Fix bug with form elements in malformed tables.
Allow ' in tags, e.g. <img src='a.gif'>
Set scrollbar steps when begin() is called so that the scrollbar is correctly
 proportioned when the widget is first mapped.
Another review of where vspaces are inserted.
Allow HTMLClueFlow to break on object boundaries if a run of objects do
 not fit within the margins.
Number of columns in table is now set ONLY by the first line.
Tip from Arnt: use QPaintClever widget flag for KHTMLWidgets because it is
 a clever widget (it paints only in the update rect).  This reduces flicker
 when scrolling forms.
In <select>...</select> ignore \n when in <pre>...</pre>


Version 0.12.01 - Martin
------------------------

Bug fixes and optimisations from Norman Markgraf.
Allow spaces around an '=' in tags, e.g. <img src = "a.gif">


Version 0.12.00 - Martin
------------------------

Finally found the source of the slow-down.  Comparing QColor of fonts
 was not working, so new fonts were always created.  This also fixes
 one of the memory leaks.
Change tokenizer to use custom link list instead of QList, plus lots
 of other tokeniser fixes.
totalRows calculation in tables corrected and better handling of illegal
 html.
Allow empty <frame>.  Some people use this to space out the page.
Implement frameborder=0
Reimplement HTMLClueFlow to handle layout properly, i.e. don't break after
 tags ONLY on whitespace.
Implement <br clear=...
Tokeniser optimisations from Norman Markgraf and some more from me.
Added setUnderlineLinks( bool ).
Allow <table> ... </table> without any <td>, <tr>, <th>.
Delayed updates to prevent multiple updates causing flickering.
Added password form element from Henner Zeller <zeller@stud.fh-heilbronn.de>.
Discard repeated keys to prevent overrun when scrolling (from Alessandro
 Russo <alessandro.russo@ntt.it>).
Enabled QMovies and improved paintSingleObject for objects which need to be
 frequently updated (like HTMLImage).
Support for target=_top/_parent/_self/_blank
Allow <img src="a.gif"align=left>  i.e. don't mind if there is no space
 after a " in tags.
Killed some memory leaks - probably introduced new ones.
And LOTS of bug fixes.


Version 0.11.01 - Martin
-----------------------

More ampseqs including Greek characters, plus binary searching for ampseqs
 from Norman Markgraf <markgraf@hydra2.geol3.ruhr-uni-bochum.de>.
Implemented <font face=...>.
Ooops.  Even if you have setAutoDelete(true) for a stack, pop() does not
 delete the item. Must use remove().
Ignore additional </ul>, </ol>, </dir>, etc.
</a was being matched for </address.
Fixes for aligned clues.
Send documentChanged in KHTMLWidget::calcSize()
Initialize KHTMLWidget::url and KHTMLWidget::target to 0


Version 0.11.0 - Martin
-----------------------

Fixes for <blockquote>.
Fixes for <pre>.
More care with placement of vspaces.
Optimisations.


Version 0.10.1 - Martin
-----------------------

Changed <blockquote> so that it does not block and doesn't crash if a
</blockquote> is not supplied.
Improvements for forms.
More ampseq's from Norman Markgraf.
Fix scrolling with sb arrows.

Version 0.10.0 - Martin
-----------------------

Change the way <dl> <dt> <dd> is handled to be more like Netscape, and
less dependant on correct HTML.
Tokenizer fixes.


Version 0.9.1 - Martin
----------------------

Bug fixes


Version 0.8.12 - Martin  (actually 0.9.0)
-----------------------

Many changes to data structures to reduce memory usage.
More fixes for scrolling.


Version 0.8.11 - Martin
-----------------------

Recalc sizes and update when an image with unknown size is loaded.
Cleaner progressive updates.
Animated gifs with Qt 1.3
Top and Bottom borders.
Post paint events when scrolling instead of repaint() to make scrolling faster.
Fix scrollbars in HTMLView.


Version 0.8.10 - Martin
-----------------------

 Fix drawing of remotely loaded images.
 emit documentDone() fixed.


Version 0.8.9 - Martin
----------------------

 Add support for vlink color
  - overload: virtual bool URLVisited( const char *_url );
  and return true if the _url has been visited previously.
 Underline URLs.
 Image borders.
 Remove dependancy on '>' being found in tags so that ignored attributes are
  accepted, e.g. find "<dl", not "<dl>".


Version 0.8.8 - Martin
----------------------

 Added setDefaultBGColor( const QColor &col );
 Added setDefaultTextColors( const QColor &text, const QColor &link,
                             const QColor &vlink );


Version 0.8.7 - Martin
----------------------

 Fix font selection.
 Change requestImage to requestFile to be more general.
 Fix bug in tokeniser - segv with tokens > 1000 chars.
 Disallow slotAddLine etc. if scrollbars are not visible.
 Add type="i"|"I"|"a"|"A" to <ol type=...>.
 Support server side image maps.
 Add support to client side image maps for separate (remote) map files.
 Fix black frames bug.
 Add text selection support to KHTMLView.
 Improve text selection in <pre>...</pre> mode.


Version 0.8.6 - Martin
----------------------

 Client side image maps.  Only works for maps defined within the HTML, not
 separate files.  Haven't tested shape=poly or shape=circle yet.
 Separated Clues from Objects.  Clues now in htmlclue.[h|cpp]


Version 0.8.5 - Martin
----------------------

 Discard empty rows, e.g. <TR><TR>
 Do not require </td>, </th>, </tr>

 Do text selection in tables properly.


Version 0.8.4 - Martin
----------------------

 Tables of course.

 Fixed <hr>

 Added and improved documentation for KHTMLWidget.

 First work on text selection.  Works Ok, but still much work left.
   Connect to textSelected( bool ) to be notified when text has been
   (de)selected.
   Use getSelectedText( QString &_str ) to get the selected text.


Version 0.8.3 - Martin
----------------------

 Yet more work on tables.

 Bugfix from Stephan Kulow - another static object crept in
 (static QList<KHTMLView> viewList).  Changed to pointer and
 constructed on first occurrence.

 fixed <br> and <p align=...>


Version 0.8.2 - Martin
----------------------

 More work on tables - they seem to be working much better now.

 Changed the way lists are parsed so that <ul></ul> can indent text like
 Netscape.  Added indent property to HTMLClueFlow.

 Fixed tokenising of tags so that they can be broken by CR, e.g. this
 works now:
     <a
     href="http://www.kde.org">KDE</a>


Version 0.8.2a - Martin
-----------------------

 Minor changes to make this version compatable with the version in the
 stable libraries.

 Added #define KHTMLW_VERSION 820 in html.h


Version 0.8.1 - Martin
----------------------

 Fixed bug introduced in 0.7.9 affecting lists and glossarys.

 More fixes to tables.


Version 0.8.0 - Torben
----------------------

 Introduced JavaScript. Most code resides in the HTML Tokenizer
 You have to compile and install libjscript now before you
 can compile and use this library. No JavaScript code is executed
 until used for the first time.

 Introduced some few JavaScript event handlers in htmlform.cpp

 You need libjscript to use the widget

 Fixed frame layout problem. The frames are resized and shown only
 if we have scanned the complete frame set. All resize events before
 are ignored.


Version 0.7.9 - Martin
----------------------

 Added printing capability - just call HTMLView::print()
 There are still some unresolved printing issues:
  * should the background be printed?
  * should all text be printed black?
  * should highlighted text be printed highlighted?
  * some objects don't print properly - <hr>, table borders.
  * form controls don't print.
  * aligned images not handled by paginator.
  * printing does not release control to the event loop.
  * no way of cancelling printing.
  * do we want to print headers/footers?
  * Qt-1.2 has some printing problems which do not have work-arounds
    - who cares... wait for 1.3.
 A long list, but in general I think you should find printer output quite
 good.

 Modified table cell width calculation slightly to match Netscape more closely.

 Fix left/right alignment.

 Support for left/right alignment and centering of tables.

 Merge <td> and <th> parsing.

 Support table captions


Version 0.7.8 - Torben
----------------------

 Changed the <cell> tag, deleted the <grid> tag ( html.cpp )

 Fixed bug in selecting by rectangle ( html.cpp )


Version 0.7.7 - Martin
----------------------

 Fixes for tables and independant parsing/position stuff.


Version 0.7.6 - Martin
----------------------

 Separate parsing and size/position calculations.  Document should now be
 parsed only once.  HTMLWidget handles resizing without reparsing.

 General fix-ups in HTMLView scrollbars.


Version 0.7.4 - Torben
----------------------
 
 Moving the panner in a framed HTML page works now ( again )

 No black frames any more

 Loading of background pixmaps from the net works now.


Version 0.7.3 - Torben
----------------------

 <frame noresize frameborder=... marginwidth=...> works now
 
 <frameset noresize frameborder=... >, too.
 
 <frame marginheight=... scrolling=...> is recongnized but does not have
 any effect right now.

 Other bug fixes related to frames.

 You can select a KHTMLView by clicking on it. It will show a black border
 to indicate its state. 


Version 0.7.1 - Torben
----------------------

 Some bug fixes, more frame support.

 Applied patch from Stephan.


Version 0.7 - Torben
--------------------

 This version supports FRAMES! It is not perfect yet, but it seems
 to work. I did not change much in the rendering engine, but added
 some new classes. The most interesting one is KHTMLView.
 I recommend not to use KHTMLWidget directly any more since you
 dont get frames this way. KHTMLWidget cares about frames and comes
 with integrated scrollbars. The scrollbars appear/disappera as needed.
 This causes an ugly hack. I set the right border to 20 pixels. If we
 need a vertical scrollbar, then the scrollbar is just put on top
 op the KHTMLWidget. The horizontal scrollbar does not need this track.
 As a result the scrollbars can appear/disappear very fast. Changing
 the width of the HTML Widget would cause a new parsing session!!!!

 KHTMLView is a layer on KHTMLWidget. It has many comments in his
 header files. So using it is not too hard, I hope.
 It is perhaps a good Idea to subclass KHTMLView. KFM does it.

 New classes are HTMLFrameSet and HTMLFramePanner.

 You can select all URLs in a given rectangle now.

 The select( QPainter *_painter, ...) Functions accept a 0L
 as argument to _painter now.

 KHTMLView has duplicate signals. One tells that the widget itself
 ( not one of its frames ) wants to tell you something. Use these ones
 if you subclasses KHTMLView.
 The other signals tell you which widget emitted the signal. This
 way you dont have to care about the children of your widget.
 The parent widget informs you about its children and their demands.
 Use this way if you did not subclass KHTMLView.

 Design:
 -------
 For every <frameset> a HTMLFrameSet object is created. A HTMLFrameSet
 may contain other frame sets, a HTMLView ( or subclass ) or
 a HTMLFramePanner. On resize events the HTMLFrameSet recalculates
 the size of its children and resizes them.
 A bug right now is this one:
  The user moves the HTMLFramePanner arround and resizes now
  the window. The widget wont remember that the user changed the
  panner. I will fix this later on.
 Every <frame> tag becomes a KHTMLView instance. If you subclass
 KHTMLView, subclass the function:
  KHTMLView* newView(...)
 This function is asked to create a new frame. This way all children
 of KHTMLWidget are of your subclassed class, not only KHTMLView.

 This works like this:

 KHTMLView* MyKHTMLView::newView(...)
 {
   return new MyKHTMLView(...)
 }

 The user may select a frame by clicking on it. The active frame
 is highlighted with a black border.

 This version is for developers only. My changes seem to not affect
 the stability, but I did not test it too hard yet.

 DND
 ---

 Make shure that a picture called
 khtmlw_dnd.xpm is in $KDEDIR/lib/pics. This is the default pixmap used for DND.
 The widget can Drag and Drop every link.


Version 0.6 - Martin
--------------------

 Moved tokenizers to htmltoken.[h|cpp]
 Many changes to support progressive loading of the page. You can now do
  something like:
     begin();
	 parse();    // doing this here will make the widget parse and display as
	             // more html is added using write() (provided control is
				 // released to the event loop).
	 write();
	   :
	   :
	 write();
	 end();
 Added support for <li> without <ul></ul> because Netscape supports it.
 Change HTMLImage::pCache and pFontManager to be dynamically constructed
  so that khtmlw can be created as a shared lib on brain dead systems.
 Applied patches from Christian Czezatke to make more robust when poor
  (illegal) HTML is processed.
 General cleanups.
 Suppress space at the start of a paragraph (HTMLClueFlow)


Version 0.5.4 - Martin
----------------------

 Added align=left|right for images.
 Use gif.cpp with transparency (from Richard J. Moore).
 Fixed <center> and added <div>.
 More general HTML stuff implemented.
 Found bug painting most objects - were testing _y+height() < y-getHeight()
  and _y > y when should be < y-getAscent() and > y+getDescent().
 Added keyboard control - you must call setFocusPolicy() to enable focus.
 Another profiler session and some speedups.
 bgcolor for table cells.
 Fix <font size=?> stuff
 Accept bgcolor="XXXXXX" when it should be bgcolor="#XXXXXX"
 Implement align and valign in <tr>


Version 0.5.3 - Martin
----------------------

 Fixed horizontal scrolling while partially covered bug.
 Catch setPalette() so that global color changes don't screw up html page.
 Modified HTMLTokenizer so that it keeps space appended to the word
  preceding it.  This means that there are considerably (~35%) less objects
  in the parsed HTML - thats a lot less memory and processing in a large
  document.  I have yet to see a situation where this has caused poor
  formatting.
 Fixed <pre> so that inline markups don't cause lines to be broken.


Version 0.5.2 - Martin
----------------------

 Spent some quality time with the profiler - now at least twice as fast
  for large HTML documents (qwidget.html is a good test).
 setStandardFont() and setFixedFont() added.


Version 0.5.1 - Martin
----------------------

 Forms implemented, though not complete.
 Fixed bug which caused segv when </ul>, </dl>, etc. was omitted
 

Version 0.5.0 - Torben
----------------------

 Changes to the handling of baseURL and changes in the <grid> tag


Version 0.4.9 - Martin
----------------------

 Changes to background parsing stuff
 minor bug fixes


Version 0.4.7 - Torben
----------------------

 Added supportz for delayed loading of images. The widget emits the signal
 'imageRequest' to tell its owner that it needs data from the net. The widget
 does NOT load the stuff.
 The owner must signal the widget if the images arrived. The widget will
 display the image if the <img width=.. height=... > was given. If width or
 height is missing the widget weits until all images arrived and parses the
 HTML code again. There are several new functions/slots/signals dealing with
 this. 

 KFM implements a cache class that caches images and HTML pages. The widget
 may expect that images arrive before the 'emit imageRequest' call returns.
 In this case the image was already in the cache. This is the best case since
 parsing continous like usual in this case. This means you can call the slot
 'slotImageLoaded' of the widget if you get the signal 'imageRequest'. Wait
 for kfm-0.5.3 to see how this works.

 Added 2 parameters to begin. They allow the owner to tell the widget about the
 position of the upper left corner. If KFM deletes files I don't want to see
 the top of the HTML page after updating the display. Thats what this is for.


Version 0.4.5 - Martin
----------------------

 Bug (see above) fixed and printfs removed

 Tables (how much fun do you think this was?)

 minor bug fixes, and more mark-ups implemented.

 Added onURL() signal which is emitted as links are passed over.
 Added setURLCursor() to set the cursor to use when cursor in on a URL.


Version 0.41 - Torben
---------------------

 Inserted some debug code. Left it there to find bug in kdehelp. Sometimes Qt
 complains about painter.begin() and painter.end() problems. Delete the printf
 stuff if the debug thing is no longer needed.

 Changed the 'getSelected' function. It uses QStrList to transmit multiple
 URLs instead of space separated solution.

 Some minor bug fixes.


Version 0.4 - Martin
--------------------

 HTML is now parsed in the background.  You should connect documentChanged()
 to a function that updates scroll bars.  THERE IS NO NEED TO CALL REPAINT()
 ANYMORE unless you explicitly wish to force a repaint.

 The default background color is now lightGray.  Use <body bgcolor=#XXXXXX>
 to set the background color.  Background pixmap implemented.

 setDefaultFontBase() sets the default font size.

 Reorganised parser and split into more files.  Compiles as a library.

 Added basic support for lists, glossaries, <hr> and lots more.

 Horizontal Scrolling.


Version 0.3a - Torben
---------------------

 The event handling changed a little bit.
 
 Support for drag and drop.

 Some bugs fixed

 Needs libkde-0.52 or greater right now. Uses KURL.

 For an example of how to use the widget see kfm-0.42 or greater 
 or kdehelp ( a version greate than 0.3 ).

 You may ( but you must not ) set -DHAVE_LIBGIF and -DHAVE_JPEG to include
 support for such images formats.


Version 0.2a - Torben
---------------------

 I implemented <a name="#anchor">. Since the widget may scroll automatically
 if the user selects an anchor, you must connect the signals

  scrollVert();
  scrollHorz();

  Example implementation:
	void MyHTMLParentWidget::slotScrollVert( int _y )
	{
	    vert->setValue( _y );
	}


 When the user presses the mouse button over an URL, the signal
 URLSelected is emitted. See the header files for details and
 documentation. When the URL transmitted by this signal is only
 an anchor in the actual document, use only 'gotoAnchor' to
 view the anchor ( anchor <=> <a name="Intro"> ).
 MARTIN: Some of your code has made its way in the widget, for
 example the URLSelected signal. You dont need your own HTML
 class any more I think.

 When loading a new HTML URL with a ref., you must use
 gotoAnchor( ref ), to display the referenced section.
 For example for the URL file:/home/html/test.html#myref
 should cause a call like
 
	gotoAnchor( "myref" );

 To avoid flickering between loading a new file and scrolling
 to the anchor, you can use code like this:

	QString ref="";

	... set 'ref' to whatever ...

	view->parse();
	if ( view->docHeight() > view->height() )
		vert->setRange( 0, view->docHeight() - view->height() );
	else
		vert->setRange( 0, 0 );
	
	if ( ref.data()[0] != 0 )
	{
	    if ( !view->gotoAnchor( ref.data() ) )
		vert->setValue( 0 );
	}
	else
	    vert->setValue( 0 );
	view->repaint();

 The above is interesting for "file:/usr/local/doc/text.html#Intro" for
 example.

 Support for JPEG/Gif has been added by Josip.

 Works with quoted hrefs now.

 The widgets supports drags. Every <a href...> can be dragged. To override
 this behavior, you must overload
	
	dndMouseMoveEvent( QMouseEvent * );

 Dont forget to change the definition of KHTMLW_PICS_PATH in html.h. This path
 references an icon that is used for drags.
 Only complete URLs can be dragged. For example <a href="classes.html"> will
 lead into problems because the data of the drag is "classes.html" which does
 not mean very much. When KURL is completed, the HTMLWidget will complete the
 URL itself.  Until then you must live with this bug, sorry :-(

