Framers
Focus-n framers are software components that are responsible for rendering the content of an object of a specific type within a particular frame. FIG. 24 shows the Framer structure 2400, which is a particular instance of a system object, containing an Object_ID 2410 that indicates the unique identifier of the framer, a Type_ID 2411 equals to 150 (the type identifier for framer objects), a Lang_ID 2412 that indicates the language of the Name 2413 and Description 2414 of the framer, and other fields composed by the Ref_Type_ID 2420, which is the identifier of the type (or ancestor type) of the objects to be processed by the framer, the {list of format fields} 2430, that indicates which kinds of fields for formatting attributes must have the correspondent frames, and the Computer code (reference) 2440, which provides a means for locating the computer code of a Java class (typically, a “.jar” file) for executing the framer processes.
In the 'Hierarchic Frames' page, FIG. 6 shows the structure of a hierarchic frame, which enables the inventive system to represent the hierarchical structure of user objects. The Framer_ID 610 of each hierarchic frame must be equal to the Object_ID 2410 of the framer that will control that frame. Hence, the object identifier of the framer acts as a “frame type”. Since third-party developers will have to program the framers for their particular types of user objects, there must be a central organization that assigns the object identifiers for framers in order to avoid numbering conflicts.
Besides, this approach opens the possibility to define different framers for the same type of objects, according to the Ref_Type_ID field 2420 of the framer. Actually, this possibility is useful for allowing different formatting and layout information for the same type of objects. For example, there may be a text framer that provides typical formatting features, like font type, size and style, and typical layout features, like left-to-right word alignment in top-to-down horizontal lines, whereas there may be other text framers that provide specific formatting and layout features for special character combinations and ligatures, or for artistic word effects. Therefore, each frame will record the formatting and layout information needed by its framer. If the user changes the framer of a frame, the previous formatting information may be discarded and the user may be required to supply new formatting information.
Any Java class implementing a framer must provide a zero-parameters constructor and the following public methods:
result setOuterBounds(mode, bounds);
void innerShapeUpdated(mode);
Focus-n frames are defined by rectangular outer bounds but also by an arbitrary inner shape inscribed in the outer bounds. This inner shape provides a means of modifying the internal layout of the object. For example, a framer for text objects may fit the text within several columns, or a framer for image objects may fit or clip the pixels into non-rectangular shapes.
The setOuterBounds() method will be instantiated when the user changes the area of the frame, specifying the new area in the parameter bounds. Another possibility is that the user changes the area of a parent frame, and the parent framer stretches or expands the inner frames proportionally, so it will call setOuterBounds() for its inner frames and, recursively, this call may provoke other calls into deeper levels of the object hierarchy. The mode parameter is intended to distinguish between different calling situations (user command or parent invocation). The method returns as the result an error code to indicate whether the bounds could be changed and eventually the reason for failure.
In the other hand, the framers will provide means for the user to change the inner shape of a frame, but this may provoke a change in the size of the frame. For example, stretching the width of a text column may make the text flow to require extra lines, thereby enlarging the frame height. If this text object is inserted into another object, the available area within the parent frame may be reduced. Indeed, the shape of a frame can delimit the inner shape of parent or sibling frames. For this reason, any change in the position or shape of a frame must be communicated to the parent frames and also to other inner frames by instantiating their innerShapeUpdated() method, so that the corresponding framers can adjust their content accordingly. The parameter mode can be used to distinguish between different types of calls (from inner frame, from parent frame), which will be necessary to avoid infinite recurrent calls in the traversal of the frame hierarchy. This method does not return anything because is intended for notification purposes, so the successive processing will be performed in any case.
FIG. 25 is an example of interactions between outer bounds and inner shapes in a specific object hierarchy. There are two main frames, named as “Frame 0” 2500 and “Frame 1” 2540, which are supposed to be siblings within another top frame that is not shown. Moreover, frame 0 contain three internal frames, “Frame 0.1” 2510, “Frame 0.2” 2520 and “Frame 0.3” 2530. Frames 0 and 0.1 contain text, frames 1 and 0.2 contain images and frame 0.3 contains a drawing. Except for frame 0.1, the rest of frames present differences between their rectangular bounds (in black) and their inner shape (in gray). In frame 1, for example, the inner shape is an oval 2545 that clips the image content. The inner shape of frame 0.3 is the perimeter of the drawing (i.e. a star) 2535. In frame 0.2, the user adjusted the inner shape to follow the margins of the main topic of the image (i.e. the Eiffel tower) 2525. Finally, the text of frame 0 is delimited by the double column form 2503 and the rounded limit in the top-right corner 2505, as well as by the inner shapes of the other frames.
Therefore, the framer of frame 0 layouts the text according to the resultant inner shape. Any change in position or inner shape of the internal frames or the sibling frame must result in a call to method innerShapeUpdated() of framer of frame 0, in order to update the layout of text. On the contrary, a change in the inner shape of frame 0 will not notify the internal frames or sibling frame, because the inner shape delimitation is an unidirectional relationship between frames, that must be stated by the user.
FIG. 26 shows several examples of frame scaling and object scaling. Frame scaling occurs when the user sets a frame width that differs from the original width of the object, which needs a specific scaling factor, named as “frameScale”, to adjust the visualization of the object. The image in the example is 150 pixels width. The frame widths in 2600, 2610 and 2620 are smaller, equal and bigger that the image width, which results in specific frame scaling factors 0.5, 1.0 and 1.67, respectively.
Object scaling occurs when the user needs to make the object smaller or bigger than the frame space, which needs another specific scaling factor, named as “objectScale”. The object widths in 2630, 2640 and 2650 are smaller, equal and bigger than the frame width, which results in the corresponding object scaling factors and, eventually, the margining (objectScale < 1.0) or the clipping (objectScale > 1.0) of the object content, as in 2630 and 2650.
The final scaling of the object content will be the product of the two scaling factors. Moreover, since the whole working environment is zoomable, the inventive system must multiply a third scaling factor (named as “viewScale”) to render the objects within the screen or graphics window.
FIG. 27 shows several examples of shape rotation and object rotation. Shape rotation occurs when the user rotates the inner shape of a frame by a certain amount of degrees, which needs a specific rotation factor, named as “shapeRotation”. The shape rotations in 2700, 2710 and 2720 are -90º, 0º and 15º, respectively. The object content will be rotated as well, because the scaling and rotation factors apply to the rendering of the whole content of the frame. Moreover, the system will adjust the outer bounds of the frame to box the rotated inner shapes.
Object rotation occurs when the user needs to rotate the object content with independence of the orientation of the inner shape, which needs another specific rotation factor, named as “objectRotation”. The object rotations in 2730, 2740 and 2750 are -90º, 0º and 15º, respectively. In this case, the frame shape will not be adapted, so the content of the object may be clipped as in 2730 and 2750. The final rotation of the object content will be the sum of the two rotation factors.