Last modified 13 years ago Last modified on 07/17/09 16:36:31

Error: Macro BackLinksMenu(None) failed
compressed data is corrupt

Error: Macro TicketQuery(summary=GROUP_TIMELINES_R0, format=table, col=summary|owner|status|type|component|priority|effort|importance, rows=description|analysis_owners|analysis_reviewers|analysis_score|design_owners|design_reviewers|design_score|implementation_owners|implementation_reviewers|implementation_score|test_owners|test_reviewers|test_score|) failed
current transaction is aborted, commands ignored until end of transaction block



This group of tasks covers the basics of Timelines. It describes the model (internal structure) and the user interactions (external structure) related to timelines. After this iteration we should have a prototypical timeline model with a simple user interface to demonstrate it.

Task requirements

In this revision, this task should create:

  • an "Show Timeline" toggle at the top of the timeline palette in the timeline tab that opens the bottom flap and shows the currently selected object's timeline.

The timeline flap shows timeline properties for a selected object (which can be a frame or a group of frames) or a page.

The timeline flap for an object should consist of:

  • the title bar of the timeline flap should display the name of the selected object.
  • activation channels or a visibility channel; more channels will appear in later revisions of this task.
  • (If more than one frame is in the group, each frame in the group should have its own set of channels.)
  • a playhead that can be moved across the timeline from 0:00 to 1:00.
  • a control bar for the selected channel with two fields and four buttons:
    • a field where the user can enter a start point (by default 0:00)
    • a field where the user can enter a stop point (by default 0:00)
    • a "toggle visibility" button: if clicked this will change the state of the frame's visibility from the start point to the end point.
    • a "show all" button: if clicked this will make the frame visible for the complete duration of the timeline.
    • a "hide all" button: if clicked this will make the frame invisible for the complete duration of the timeline.

Activation for a frame or a group of frames means the time span when the frame's own timeline is played. The channel for activation allows to set these periods in the parent timeline.

By default, all frames on the page are shown all the time. If the user changes a frame's visibility, this will be reflected in the frame's channel at the point in time where the playhead is currently set. If the user moves the playhead, the page should reflect the visibility of the text frames at that particular point in the timeline.

In future revisions of this task, other kinds of frames will appear on the timeline. Other frame properties (example: margin types) will appear as channels for each frame; each of these properties should probably have its own dedicated control bar (e.g., color & width settings for margins).

Future revisions of this task will allow starting a timeline from a link; this task only includes manipulating the timeline via the timeline interface in Author to show and hide text frames.

A wireframe:


The properties of the selected frame or object appear as channels. For this revision, it's just visibility. The channels can be selected; in this wireframe, Frame A's visibility is selected. (In the future, we'll want multiple selection.)

The control bar of the timeline interface has fields for start point, end point, and four buttons. If the user clicks the "Hide All" button, the frame will be hidden from 0:00-1:00. If the user thn enters 0:10-0:20 and clicks the "Toggle Visiblity" button, the frame will be shown from 0:10-0:20.

Below the control bar is the slider (the orange arrow); this can be dragged back and forth by the user.

The timeline for a page shows channels for all the objects on the page; they can be activated or deactivated:


An activated frame will play its timeline when the page timeline plays.

Task result

Source code

Implementation idea

Have a TimedElement interface that will be implemented by all classes (Frame, Page, etc.) that have a timeline. This interface will have a list property of channels.

Have a templated Channel class that can return the value of a tracked object property in time. It will perform an interpolation of the two neighboring values in case a value doesn't exist for this point in time.

Make Frame inherit TimedElement. Change Frame visible property to be tracked in a channel.

Make Page inherit TimedElement. Change Page elements property to be tracked in a channel.

TIMELINES/OldVersion (previous version of this task)

How to demo

  • Create a book
  • Add 2 text frames to the page
  • Open the page's timeline.
  • Set the activation time span for the frames.
  • Open the frames timelines.
  • Set one of the frames to show at a certain time; set the other to hide at the same time.
  • Drag the slider back and forth to show that the timeline works.


A timeline is a list of channels holding timed values. Each page, group and frame will have a timeline (there will be also timelines for stickies and annotations but without channels). For this revision the Page acts as top level element for timelines.
Each timeline can be active or inactive which is controlled in its parent timeline activation channel. Activation channels are a special type of channels which should be present for each non-leaf timeline element.
There are three time values (not to be confused with timed values) associated with each timeline:

  • activation time: the time when this timeline was activated in its parent local time. For top level elements this is the system time when the application started.
  • wanted local time: where the play head has been moved.
  • local time: parent local time - activation time. For top level elements wanted local time.

Thus when the playhead is moved the local times for all timelines are updated. The elements interested in timed values should use the element's local time to obtain it.

  • Example: The FrameView local time is used to obtain frame visibility.

Timelines are separated into model and view. The model holds channels with timed data while the view keeps track and allows manipulation of the different time values.
The existing PageElement and PageElementView should be supplemented with timeline logic (and renamed to Element and ElementView). This will allow all pages, groups and frames to have a timeline.

UML class diagram:

User interface

The timeline of a selected element will be displayed in the bottom flap, when another element is selected the timeline view will switch to its timeline.
The timelines will be displayed in a ListPalette with elements - a title, a timeline control allowing to change values for a selected channel, a play head that can be manipulated and a panel for each channel with a name and values to the right. The ListPalette will easy allow selection of channels.

Changes in code

  • Classes to add:
    • Element, ElementView
    • ActivationChannel, BooleanChannel, TimelineViewOptions, TimelineTopView, TimelineMemberView
    • TimelinesPanel, ChannelPanel, BooleanChannelControls
  • Classes to modify:
    • TimelineEntry, Channel - new meaning
    • Frame, Group, Page, ResourcePageElement, AudioAnnotation, Sticky, SceneAudioAnnotationView, SceneStickyView, FrameView, GroupView, PageWorkArea, BackgroundPageElementView- inheriting the new Element and ElementView interfaces
    • Book, BookExtra, AnnotationSet, StickyHaloMenu, AudioAnnotationViewProvider, StickyViewProvider, DummyExtra, PageElementViewProvider, SceneViewProviderFactory, AlignElementsBottom, AlignElementsHorizontally, AlignElementsLeft, AlignElementsRight, AlignElementsTop, AlignElementsVertically, AlignElementsHaloButton, AppHaloUtil, FrameContentUseTemplateHaloButton, FrameMoveHaloButton, FrameRotationPropertiesHud, GroupPageElementsButton, UngroupPageElementsButton, BackgroundAndBorderHud, InsetsHud, ShadowHud, SizeAndPositionHud, ReaderModule, LinksHud, ResourcePaletteLogic - from merging PageElement and TimedElement into Element
    • ElementContainer, GroupPersister, PagePersister, GroupTest - substitution of element type to ActivationChannel
    • BookToHtmlExporter, AuthorPageWorkArea, ReaderPageWorkArea, ShowingActionOperation - visible property of Frames changed to boolean channel
    • BasePro, DestroyedBeanData, AutoTracker, Property, ResourcePropretyTest, AutoTrackerTest, ComposingListTest, TrackingProListTest, TransformingProListTest, OwnPropertyTest5, AppDocumentsDesktop, OpenBooksPalette, WindowMenu, ReaderAppDocumentsDeeesktop, LinksHud, NotAvailableException - reworking of NotAvailableException to describe chains of causes.
    • Bottom flap, TimelinesTab, TimelinesPalette
  • Classes to delete:
    • Timeline, TimelinesIntegrationTest, TimelineUnitTest
    • PageElement, PageElementView, TimelineUITest

Test [3686], [3755], [3769]

Task branch - svn://


The Channel class was changed to be immutable, and all its setter methods produce a new Channel. Convenience static methods for direct replacement of one channel in its container after a change were added. TimelineEntry is immutable by design, just the diagram was wrong.

An ImmList implementation of an immutable list was added to serve for channels and elements.

PageElement and ElementContainer interfaces were merged into Element, and PageElementView was renamed to ElementView. All page, group, frame, sticky and audio annotation classes implement Element, while their corresponding views implement ElementView. The elements property of Element was changed to be of type RwProp<ImmList<ActivationChannel>>, so each sub element of a page or group is now an ActivationChannel.

ResourceProperty was changed to have status Ready independent of problems that might have occured. The corresponding test was changed to pass.

Persistence was added for channels and entries.

We can demonstrate timelines in preview mode or by saving a book with timelines set and opening it in reader.

Merged into the trunk in [4308].


Place the testing results here.


I've moved the old version of this page here: TIMELINES/OldVersion. --danvisel, 17-06-09.