Old Virtual Pen Project History
17 dec 2001
- More debugging.
- More attribute management is needed.
14-16 dec 2001
- Debugging (just a few hours).
13 dec 2001
- Got the open and save dialogs to work properly. This meant diving back
into OPaC. It also meant extending GUISyn in order to work with OS-specific
dialogs, where it has nothing to do, but start a thread and let it manage
the dialog.
- Debugging... and now open/save really works (sending command SaveDocument
test.vp really saves the active document; OpenDocument
test.vp really re-loads it).
12 dec 2001
- Changes in Document and ObjectStore
classes, in order to properly clean up referrers and aliased objects on
deletion.
- Extracted the CID_... definitions from the
vp/CmdManager.h header, which reduces the
dependencies and minimises the rebuild to the really affected cmd-*
source files.
- Added a set of debugging commands (DebugDumpDocument,
DebugDumpDialogs, DebugDumpDialogVars,
DebugDumpObjTypes, DebugBreak,
etc).
- Added a very simple debug console, which allows the user/tester to type
commands and get them executed by the back-end. The output is currently
displayed on the debug output, which can be viewed with DebugView.
- Fixed a few details with commands SetDefaultObject
and SpecialQuit.
11 dec 2001
- Virtually no Virtual Pen today.
10 dec 2001
- Fixing and debugging...
- WDGS now automatically shuts down if the back-end died unexpectedly. Also
avoid hanging in case a new WDGS instance shares the same process ID as a
dying one.
09 dec 2001
- Working on attribute identification. Mostly debugging.
- Fixed attribute identification; method Render::Context::FindAttributes
now really finds the specified object's attributes.
- Located and fixed a problem in GS 7.03, reversing two patches done to
gs_btokn.ps by Masatake Yamato, which caused
writeobject to generate truncated output.
06 dec 2001
- Continuing full sample controller implementation.
- Fixed small problem with GUISyn parser (a string could not, for instance,
contain braces).
- Added a generic command Exec which takes
the contents of the current !action GUI
variable and executes it as if it were a command itself. Does argument
substitution as needed (if the variable contains, for instance, 'Dialog.Test
{a1} {a2}' then Exec will generate
and execute command 'Settings_Test 1 2' if
the dialog is named 'Settings' and a1/a2
values are '1' and '2').
- Worked on the PostScript level to have a proper bounding box device (class
PostScript::Device using WDGS' bbox
device). Found a bug and a deficiency in Ghostscript 7.03.
- Added simplified data extraction mechanism to read PostScript output.
05 dec 2001
- Added support for creating sample figures in class DocObj::Editor
and its derivates.
- Added attribute A-Hairline.
- Improved the full sample controller (it now generates the samples for the
outline and surface paint, but also generates the sample figure).
Phew !
04 dec 2001
- Added a sampler class to build icons based on the graphic engine. This is
for instance used to build representations of attribute samples.
- First draft full sample controller (contains a sample of the graphical
object and its main attributes).
- Added synchronisation of back-end with front-end. This is needed when
sending icon definitions, for instance, since the pixels might otherwise get
copied too late.
- Updated the style management class so that a style can be analysed and its
basic surface and outline painting styles extracted.
03 dec 2001
- Modified Document and Family
core classes in order to enable FamilyManager
to be initialised based on an existing document.
- The back-end now has a very basic support for UI controllers (derived from
class UIControlBase).
- The resource compiler now generates a symbol table when the .symtable
directive is used. This is useful for resources accessed by their name
rather than by their index. The ResGate
tools are being updated to that purpose.
30 nov 2001
- Changed GSView to WidgetGraphicBoard.
Also changed files ctrpane into widgetpanectr
(more consistent).
- Added class WidgetSampleFig and drew
additional icons.
29 nov 2001
- Adjusted a few details for OPIcon and OPIconWell.
28 nov 2001
- Fixed a few details in OPIconWell.
- Updated class OPAdorner. Updated the PNG
files with the representations of the OPaC handles.
- Worked for the Swiss Army today...
27 nov 2001
- Half of the day devoted to the Swarm-bot brain-storming session (EPFL);
not at all related to VP.
- Added OPaC class OPIconWell.
- Updated DebugTools in order to properly
e-mail all temporary log files.
24-26 nov 2001
- A real week-end (without VP)... and a day off at EPFL for the Swarm-bot
project.
23 nov 2001
- Continued design.
- Implemented a back-door packet spy (class VP::BackdoorPacketSpy)
which records all packets exchanged between the front-end and the back-end.
- Reduced the amount of data exchanged between front-end and back-end. All
sub-variables were sent as soon as one of them was modified; updated GUISyn::Variables
to only send the fields tagged with the proper sequence ID.
- Written a parser for the back-door packet history.
- Turned DebugTools into a DLL.
22 nov 2001
- Design of the user interface for the attribute selection.
21 nov 2001
- Integrated the bug reporting mechanism into both the front-end and the
back-end.
- Added revision info to the DebugTools
library.
20 nov 2001
- Consolidation (4th day)...
- Fully implemented and tested the DebugTools
library, which can be used to generate a detailed stack dump (StackWalk).
This library needs imagehlp.dll, which is a
redistributable file.
- The DebugTools
library also contains a function to automatically e-mail bug reports.
19 nov 2001
- Consolidation (3rd day)...
- Reworked the back-end dialog management. Much cleaner now.
- Done a Release Build (the first in months). Things almost worked (throwing
an exception in OPaC was fatal, since the OPaC stack frame was not
available).
- Integrating more debugging stuff into the VP project, such as a real StackWalk
implementation for Win32.
18 nov 2001
- Consolidation (2nd day)...
- Refactored part of the variable change notification mechanism. It had
grown pretty ugly with all the incremental changes done to GUISyn.
- More than one variable spy can be attached to a GUISyn variable.
17 nov 2001
- Consolidation (1st day)...
- Replaced GripOp::HandleHover and GripOp::HandleAction
with a single method : HandleEvent.
16 nov 2001
- Debugging... Oh happy days. I found a problem with GS handling of native
IEEE numbers.
- Drawing works, finally; DocView::RenderView
gets executed experimentally.
15 nov 2001
- Integrated lightweight grip management in GSView;
updated GripManager and DocView
to interoperate with the front-end, using variable modifications and
commands for the notifications.
- The modifications were more far-reaching than expected. I upgraded the
command parser and fixed an old bug in the mathematics package.
13-14 nov 2001
- No Virtual Pen activities.
12 nov 2001
- Fixed OPEvent to dispatch the backdoor
pipe messages interleaved with the user events.
- Added ViewLeftPress, ViewLeftRelease,
ViewRightPress and ViewRightRelease
commands, which link front-end class GSView
to back-end class DocView and generate the
creation commands in the document view.
- Bound together the dialog descriptions in the back-end and class DocView.
- Analysing app/ll-docview.cpp to extract
the grip management algorithm.
11 nov 2001
- No work on VP today. Did some hardware development for LDV.
10 nov 2001
- Fixed bugs in the document view, in the back-end backdoor processor and in
the PostScript::Device class.
- Class GSView now properly clips its
selection rectangle.
- Updated OPView class to get notifications
when a view's child is entered or left.
09 nov 2001
- I feel a bit dizzy today. I hope I will not break anything...
- Added a sequence ID to every variable. This allows an easier
tracking of variable changes. The back-end increments the variable sequence
ID whenever DialogPool::UpdateVariables gets
called.
- The GUISyn::Variables class now supports a
spying feature, which can be used to be notified immediately of any variable
changes. This is now used by the DocView
class to update the scroller ratio.
08 nov 2001
- Working on class GSView and its coupling
with the back-end. Fixed a few bugs in the communication layer (front
backdoor processor was sending data out of order; back backdoor processor
was trashing data).
- Name scrubbing related to GUISyn.
07 nov 2001
- Added a static text widget to GUISyn.
- Cleaned up the interface between GUISyn and OPaC; introducing a helper
tied to the OPaC dependent implementation simplified GUISyn_EventHandler.
- Working on class GSView.
06 nov 2001
- Commented parser; cleaned up things and added proper memory handling of
allocated widgets; added support for ANSI, Unicode and UTF-8 sources.
05 nov 2001
- Created a GUISyn::Parser class, which takes a textual representation as its input
and generates the internal description based on GUISyn::Widget.
Look here for an example.
02 nov 2001
- Updated the GUISyn widget and widget context classes, in order to be able
to locate a widget in the static description; this will be useful once we
load the widgets from a resource file and need to add elements to the
structure.
- Trying to find a solution for an easy description of the user interface.
The goals are the following :
- Interface source must be human readable.
- XML is too verbose for me.
- Interface source must be easy to maintain.
- Interface source must be easy to internationalise.
- Separate interface structure from strings makes the edition more
tedious (everything is not in one place).
- Interface source must be easy to parse.
01 nov 2001
- Updated the objectives for the coming month (in French).
- Documented the resources.
- Updated the documentation about GUISyn.
- Added support for the front-end to notify the back-end of variable
changes.
31 oct 2001
- No VP today : worked for the Smaky (ZIP related trouble) and for the
internal VNC meeting of Friday.
30 oct 2001
- Finished cleanup in core/Render.cpp; the use of BuildTreeTrace
has been verified. There are still some areas which require testing.
- The to do list has shrunk.
29 oct 2001
- Work on core/Render.cpp lead to
following changes :
- Use of OBJBLOCK_BEGIN (and others) instead of
numeric offsets.
- Cleaned up core/DocObjBBox.cpp.
- Cleaned up the code in the Context
class.
- Cleaned up core/T-Group.cpp. Added
bounding box related decision taking, based on the group level; this
allows skipping fixed bounding boxes on updates.
- Method DocView::AnalyseAperture handles
the logical pages properly; we no longer rely on the bounding box to
determine the page size.
- The object editors now know about the aperture containing the
edited object. This is needed in order to compute the transform (see DocTrans::Transformer).
26 oct 2001
- Implemented the view coordinate transformation using a matrix. This
implied a lot of small changes. The grip manager takes profit of this
change : the grip coordinates (SelManager)
are transformed into document view relative coordinates.
- Updated the document store tree trace method.
- Class Render::Context will have to be
refreshed.
- Added more options to the apertures, for instance in order to flip the
direction of the [x] axis, shade groups of objects, etc.
25 oct 2001
- Implemented link following when moving up an object hierarchy using the
object store iterator.
- Started documentation about the selection
manager.
- Added support for front and back pages in the document view thanks to
method GetRootForAperture.
- Need to reconsider how the selection manager interacts with the object
store.
24 oct 2001
- Implemented a new class, VP::StoreIterator,
which is used to iterate over objects found in the object store. It comes
with following helper classes :
- VP::StoreFindOp, base class used to
implement find operations.
- VP::StoreFindTypedObject, used to find
typed objects.
- VP::StoreFindObject, used to find a
specific object.
- The ObjectStore::FindTypedObject was
replaced by FindTypedObjIndex, based on the
store iterator and store find classes.
- Cleaned up Document class.
- Tested the iterator and find classes. They work all right.
- Implemented the find direction "up". This does not follow links
(yet).
23 oct 2001
- I am still working at the document view... trying to solve the problem of
finding a reasonable root when selecting objects in a multi-page document.
The root might be the layout containing the pages (this makes sense when
working on a page oriented document), but it might be just an upper level
group if the view represents a figure from a library.
- Implemented method DocView::RetRootObject.
This is a satisfying solution for the problem described above.
- Tested the new design. The fact that the ObjectStore
does not follow links is really a problem. I will have to handle this sooner
than expected.
- Moved alias-following code from Document
to management class DocObj::Alias.
- ObjectStore::FindTypedObject implements
link following, but it must be reworked. Merge logic with FindMatchingObject.
22 oct 2001
Back to work... During my vacation, I had some thoughts about the overall
design of VP (some areas will need a few changes, mainly the
link/alias/referrer). I have refreshed my ideas about the way text should be
stored and manipulated in the core and am glad to see that what I came up with
was the same as the original design (about 20 months ago).
And by the way, I have discovered Ruby,
a most interesting dynamic object oriented language (I recommend reading Programming
Ruby, either online
or by purchasing the real book published by Addison Wesley, as I did). If I had
time, I would integrate Ruby with VP to do all the UI scripting. And Python
too :-)
And now :
- Renamed the GraRoot object to GUIRoot.
The former graphical root has become the GUI root, which is needed to store
the view definitions, the dialog states, etc. It could be discarded from a
document without any damage to the document's contents.
- The document view now provides the roots (nota bene : there can be
more than one root for a view, e.g. in a multi-page view) used by several
interactive operations (such as selection, detection, etc.). This leads to a
cascade of changes :
- The document manager has to know which is the active view.
- Class DocManager relies on the active
view's root objects for the object detection (DetectSelectedObject
and DetectAnyObject).
- Class GripManager relies on the active
view's root objects for the grip detection (DetectAnyGrip).
- Method Selector::HandleDragEnd is now
document view aware.
- The selection manager was updated; it no longer knows about the
document root by itself. It relies on the caller for this information.
- The selection manager is now thightly bound to the document view. There is
one selection manager for each view, which makes sense since several
different views might have radically different coordinate systems, and
selections would therefore also use different coordinates.
13 oct 2001 - 21 oct 2001
12 oct 2001
- TODO: Make menu commands do something.
- Added documentation about the Ghostscript
View.
- Modified the way OPaC does its quick BLT (in OPGrailPort::QuickBlt).
The destination box is passed to QuickBltToXxx
without any precalculation.
- Adjusted the QuickBlt class implemented in
the front-end.
- Added scrollers to GSView. The scrollers
notify the back-end when their position changes.
Debugging :
- Fixed problem with PostScript device destruction : the device created
by the DocView class was not reclaimed and
WDGS would hang on exit. This problem was related to a grestore
never being emitted in the document view.
11 oct 2001
- Implemented missing functionality in Document::InsertAlias.
This means that a logical page inserted in a physical page is now properly
aliased.
- Working on document view implementation. DocView::RenderView
is functional.
- Added explicit support for GUISyn in the GSView
class, through a dedicated interface (OPiGUISyn).
This will allow a simpler and more efficient communication of the
Ghostscript View in the front-end and the variables defining its parameters
in the back-end.
- Added recursive variables to GUISyn, which
means that a variable can contain other variables. This is useful for
widgets (such as GSView) where several
values need to be manipulated together.
10 oct 2001
- Updated the linear transformation arguments (DocTrans::LinearObject)
in order to use Unit::Val instead of
dimensionless numbers.
- The linear transformation now cascades the operations in the following
(more intuitive) order :
- Scale relative to local center.
- Rotate relative to local center (hint : the center is not
affected by scaling).
- Translate the resulting points.
- Set up a list of things to do (not
urgent, but which are needed sooner or later).
- Refreshed the DocTrans::Group management
class in order to match the changes done in DocTrans::Linear
management class.
- Changed the (hopefully definitive) format of the logical and physical page
blocks.
- Finished the implementation of the logical and physical page managers.
- Tested the logical and physical page creation. Seems to be working fine.
Class Document still lacks a full
implementation of method InsertAlias, but
this is for tomorrow, because I am really tired now !
09 oct 2001
- Started the reorganisation of how pages are defined (work still in
progress) :
- Extracted the complex logic of page management from the document
manager into three specific manager classes : Page::Manager,
LogPage::Manager and PhyPage::Manager.
- Implemented Page::Manager as the base
class to be used by the logical and physical page managers. It has all
the common logic.
- Implemented part of PhyPage::Manager.
- Defined but not yet implement LogPage::Manager.
- Updated documentation on the way pages
are stored.
08 oct 2001
- Checked in VP::DocObj::View::Manager; this
took a while to finalise. Now that the core contains a view manager, it is
time to implement the back-end's document view class (class DocView
has progressed).
- Added index remapping capability to the generic information management
class. This relies on the cooperation of classes such as the family manager
or view manager.
- Updated VP::DocObj::Family::Manager and VP::DocObj::Info::Generic
as needed.
- Changed physical pages and logical pages; formerly stored in block begin
objects, the page objects are now normal typed data objects contained in a
block of bounding-box type (UCID::Struct_BBox).
- Converted bounding box coordinates used by DocObj::BBoxObject
(object of type UCID::Struct_BBox) to Unit::Val
(instead of dimensionless VP::Box).
- Added documentation on the way pages
are stored.
07 oct 2001
- Documented the document view.
- Started the reorganisation of classes VP::DocObj::Family::Manager
and VP::DocObj::Info::Generic in order to
relocate common methods also needed by the new VP::DocObj::View::Manager
class.
06 oct 2001
- Verified the updated VP::Document class and
fixed small bugs introduced while refactoring.
05 oct 2001
- Continued design verification of document structure.
- Verified the VP::Document class to make
sure everything fits the model. Simplified creation and initialisation of
the roots.
- Documented the aliases in VP.
- Added new roots to the document hierarchy : PhyPageRoot
and LogPageRoot, for the physical page
(sheet) collection and the logical page (page) collection. Both are located
in the LayoutRoot.
- Physical Pages (sheets) are defined by DocObj::Info::Generic
objects, with sub-type PHY_PAGE_BLOCK.
- Logical Pages (pages) are defined by DocTrans::Group
objects, with group level GROUP_PAGE. The
group objects are also used for the layers (group level GROUP_LAYER)
or the geometric groups (group level GROUP_GEOMETRIC).
- Added a new interface (VP::Render::SubTypeOp)
to the base management class in order to manipulate consistently the
sub-types found in both generic information objects and group objects.
- Document view still missing, but now almost everything should be ready to
implement it.
04 oct 2001
- Rethinking the document structure. I want to make a distinction between a
sheet (or physical page) and a logical page (a sheet might contain several
logical pages, and not necessarily
consecutive ones). Here is a simple example of what should be possible :
- No programming done today.
03 oct 2001
- Updated grip manager, selection manager (taken code from
app/ll-docview.cpp). The resulting code is much cleaner and general.
- Updated following commands :
- ObjectCreation; takes an argument
(where to create). Added UpdatePointCreation
and ValidatePointCreation (formerly only
available as document manager methods).
- ObjectSelection; supports interactive
selection, which is not undoable/redoable as is.
- Better documentation of the command
management (specifically undo/redo).
- Implemented command parser for VP::ObjectIndexStack
arguments.
- Imported commands SetDefObject, DeleteObject,
AttrChangePropery, AttrSetStyleName
and AttrAddNewToStyle.
02 oct 2001
01 oct 2001
- Started intergration of command management (cmdparser/cmd-*) in the
back-end. The command parser undestands following data types : string,
boolean, unit value, object index, result code and document attribute
property.
- Started refactoring of class DocManager.
- Updated class OPString in order to support escape codes (commands use
space as a separator, and file names may contain spaces, therefore we need
to support '\ ' codes).
- Tested the interaction between the icon pool (class OPIconPool), the
front-end and the back-end.
- Changed Grafix to fit the PostScript model with a y-axis pointing
"up".
- Set up the Virtual Pen Project History page (http://opac.ch/virtualpen/history.html).
Todo
- Locate the PostScript related code in the core sources.
- Wrap generation of PostScript into a class.
- Reorganise the PostScript related files (PS engine, PS device, PS tools)
in order to hide them behind an abstract interface. Rename the already
abstract classes to avoid using the name "PostScript".