Man Linux: Main Page and Category List

NAME

       Prima::Docks - dockable widgets

DESCRIPTION

       The module contains a set of classes and an implementation of dockable
       widgets interface. The interface assumes two parties, the dockable
       widget and the dock widget; the generic methods for the dock widget
       class are contained in "Prima::AbstractDocker::Interface" package.

USAGE

       A dockable widget is required to take particular steps before it can
       dock to a dock widget. It needs to talk to the dock and find out if it
       is allowed to land, or if the dock contains lower-level dock widgets
       that might suit better for docking. If there’s more than one dock
       widget in the program, the dockable widget can select between the
       targets; this is especially actual when a dockable widget is dragged by
       mouse and the arbitration is performed on geometrical distance basis.

       The interface implies that there exists at least one tree-like
       hierarchy of dock widgets, linked up to a root dock widget. The
       hierarchy is not required to follow parent-child relationships,
       although this is the default behavior.  All dockable widgets are
       expected to know explicitly what hierarchy tree they wish to dock to.
       "Prima::InternalDockerShuttle" introduces "dockingRoot" property for
       this purpose.

       The conversation between parties starts when a dockable widget calls
       "open_session" method of the dock. The dockable widget passes set of
       parameters signaling if the widget is ready to change its size in case
       the dock widget requires so, and how. "open_session" method can either
       refuse or accept the widget.  In case of the positive answer from
       "open_session", the dockable widget calls "query" method, which either
       returns a new rectangle, or another dock widget.  In the latter case,
       the caller can enumerate all available dock widgets by repetitive calls
       to "next_docker" method. The session is closed by "close_session" call;
       after that, the widget is allowed to dock by setting its "owner" to the
       dock widget, the "rect" property to the negotiated position and size,
       and calling "dock" method.

       "open_session"/"close_session" brackets are used to cache all necessary
       calculations once, making "query" call as light as possible. This
       design allows a dockable widget, when dragged, repeatedly ask all
       reachable docks in an optimized way. The docking sessions are kept open
       until the drag session is finished.

       The conversation can be schematized in the following code:

               my $dock = $self-> dockingRoot;
               my $session_id = $dock-> open_session({ self => $self });
               return unless $session_id;
               my @result = $dock-> query( $session_id, $self-> rect );
               if ( 4 == scalar @result) {       # new rectangle is returned
                       if ( ..... is new rectangle acceptable ? ... ) {
                               $dock-> close_session( $session_id);
                               $dock-> dock( $self);
                               return;
                       }
               } elsif ( 1 == scalar @result) {  # another dock returned
                       my $next = $result[0];
                       while ( $next) {
                               if ( ... is new docker acceptable? ....) {
                                       $dock-> close_session( $session_id);
                                       $next-> dock( $self);
                                       return;
                               }
                               $next = $dock-> next_docker( $session_id, $self-> origin );
                       }
               }
               $dock-> close_session( $session_id);

       Since even the simplified code is quite cumbersome, direct calls to
       "open_session" are rare. Instead, "Prima::InternalDockerShuttle"
       implements "find_docking" method which performs the arbitration
       automatically and returns the appropriate dock widget.

       "Prima::InternalDockerShuttle" is a class that implements dockable
       widget functionality. It also employs a top-level window-like wrapper
       widget for the dockable widget when it is not docked.  By default,
       "Prima::ExternalDockerShuttle" is used as the wrapper widget class.

       It is not required, however, to use neither
       "Prima::InternalDockerShuttle" nor "Prima::AbstractDocker::Interface"
       to implement a dockable widget; the only requirements to one is to
       respect "open_session"/"close_session" protocol.

       "Prima::InternalDockerShuttle" initiates a class hierarchy of dockable
       widgets.  Its descendants are "Prima::LinearWidgetDocker" and, in turn,
       "Prima::SingleLinearWidgetDocker".  "Prima::SimpleWidgetDocker" and
       "Prima::LinearWidgetDocker", derived from
       "Prima::AbstractDocker::Interface", begin hierarchy of dock widgets.
       The full hierarchy is as follows:

               Prima::AbstractDocker::Interface
                       Prima::SimpleWidgetDocker
                       Prima::ClientWidgetDocker
                       Prima::LinearWidgetDocker
                       Prima::FourPartDocker

               Prima::InternalDockerShuttle
                       Prima::LinearDockerShuttle
                       Prima::SingleLinearWidgetDocker

               Prima::ExternalDockerShuttle

       All docker widget classes are derived from
       "Prima::AbstractDocker::Interface".  Depending on the specialization,
       they employ more or less sophisticated schemes for arranging dockable
       widgets inside. The most complicated scheme is implemented in
       "Prima::LinearWidgetDocker"; it does not allow children overlapping and
       is able to rearrange with children and resize itself when a widget is
       docked or undocked.

       The package provides only basic functionality. Module
       "Prima::DockManager" provides common dockable controls, - toolbars,
       panels, speed buttons etc.  based on "Prima::Docks" module. See
       Prima::DockManager.

Prima::AbstractDocker::Interface

       Implements generic functionality of a docket widget. The class is not
       derived from "Prima::Widget"; is used as a secondary ascendant class
       for dock widget classes.

   Properties
       Since the class is not "Prima::Object" descendant, it provides only
       run-time implementation of its properties. It is up to the descendant
       object whether the properties are recognized on the creation stage or
       not.

       fingerprint INTEGER
           A custom bit mask, to be used by docking widgets to reject
           inappropriate dock widgets on early stage. The "fingerprint"
           property is not part of the protocol, and is not required to be
           present in a dockable widget implementation.

           Default value: 0x0000FFFF

       dockup DOCK_WIDGET
           Selects the upper link in dock widgets hierarchy tree. The upper
           link is required to be a dock widget, but is not required to be a
           direct or an indirect parent. In this case, however, the
           maintenance of the link must be implemented separately, for
           example:

                   $self-> dockup( $upper_dock_not_parent );

                   $upper_dock_not_parent-> add_notification( 'Destroy', sub {
                           return unless $_[0] == $self-> dockup;
                           undef $self-> {dockup_event_id};
                           $self-> dockup( undef );
                   }, $self);

                   $self-> {destroy_id} = $self-> add_notification( 'Destroy', sub {
                           $self-> dockup( undef );
                   } unless $self-> {destroy_id};

   Methods
       add_subdocker SUBDOCK
           Appends SUBDOCK to the list of lower-level docker widgets. The
           items of the list are returned by "next_docker" method.

       check_session SESSION
           Debugging procedure; checks SESSION hash, warns if its members are
           invalid or incomplete. Returns 1 if no fatal errors were
           encountered; 0 otherwise.

       close_session SESSION
           Closes docking SESSION and frees the associated resources.

       dock WIDGET
           Called after WIDGET is successfully finished negotiation with the
           dock widget and changed its "owner" property. The method adapts the
           dock widget layout and lists WIDGET into list of docked widgets.
           The method does not change "owner" property of WIDGET.

           The method must not be called directly.

       dock_bunch @WIDGETS
           Effectively docks set of WIDGETS by updating internal structures
           and calling "rearrange".

       docklings
           Returns array of docked widgets.

       next_docker SESSION, [ X, Y ]
           Enumerates lower-level docker widgets within SESSION; returns one
           docker widget at a time. After the last widget returns "undef".

           The enumeration pointer is reset by "query" call.

           X and Y are coordinates of the point of interest.

       open_session PROFILE
           Opens docking session with parameters stored in PROFILE and returns
           session ID scalar in case of success, or "undef" otherwise.  The
           following keys must be set in PROFILE:

           position ARRAY
               Contains two integer coordinates of the desired position of a
               widget in (X,Y) format in screen coordinate system.

           self WIDGET
               Widget that is about to dock.

           sizeable ARRAY
               Contains two boolean flags, representing if the widget can be
               resized to an arbitrary size, horizontally and vertically. The
               arbitrary resize option used as last resort if "sizes" key does
               not contain the desired size.

           sizeMin ARRAY
               Two integers; minimal size that the widget can accept.

           sizes ARRAY
               Contains arrays of points in (X,Y) format; each point
               represents an acceptable size of the widget. If "sizeable"
               flags are set to 0, and none of "sizes" can be accepted by the
               dock widget, "open_session" fails.

       query SESSION [ X1, Y1, X2, Y2 ]
           Checks if a dockable widget can be landed into the dock.  If it
           can, returns a rectangle that the widget must be set to.  If
           coordinates ( X1 .. Y2 ) are specified, returns the rectangle
           closest to these. If "sizes" or "sizeable" keys of "open_session"
           profile were set, the returned size might be different from the
           current docking widget size.

           Once the caller finds the result appropriate, it is allowed to
           change its owner to the dock; after that, it must change its origin
           and size correspondingly to the result, and then call "dock".

           If the dock cannot accept the widget, but contains lower-lever dock
           widgets, returns the first lower-lever widget. The caller can use
           subsequent calls to "next_docker" to enumerate all lower-level dock
           widgets. A call to "query" resets the internal enumeration pointer.

           If the widget cannot be landed, an empty array is returned.

       rearrange
           Effectively re-docks all the docked widgets. The effect is as same
           as of

                   $self-> redock_widget($_) for $self-> docklings;

           but usually "rearrange" is faster.

       redock_widget WIDGET
           Effectively re-docks the docked WIDGET. If WIDGET has "redock"
           method in its namespace, it is called instead.

       remove_subdocker SUBDOCK
           Removes SUBDOCK from the list of lower-level docker widgets.  See
           also add_subdocker.

       replace FROM, TO
           Assigns widget TO same owner and rectangle as FROM. The FROM widget
           must be a docked widget.

       undock WIDGET
           Removes WIDGET from list of docked widgets. The layout of the dock
           widget can be changed after execution of this method. The method
           does not change "owner" property of WIDGET.

           The method must not be called directly.

Prima::SimpleWidgetDocker

       A simple dock widget; accepts any widget that geometrically fits into.
       Allows overlapping of the docked widgets.

Prima::ClientWidgetDocker

       A simple dock widget; accepts any widget that can be fit to cover all
       dock’s interior.

Prima::LinearWidgetDocker

       A toolbar-like docking widget class. The implementation does not allow
       tiling, and can reshape the dock widget and rearrange the docked
       widgets if necessary.

       "Prima::LinearWidgetDocker" is orientation-dependent; its main axis,
       governed by "vertical" property, is used to align docked widgets in
       ’lines’, which in turn are aligned by the opposite axis ( ’major’ and
       ’minor’ terms are used in the code for the axes ).

   Properties
       growable INTEGER
           A combination of "grow::XXX" constants, that describes how the dock
           widget can be resized. The constants are divided in two sets,
           direct and indirect, or, "vertical" property independent and
           dependent.

           The first set contains explicitly named constants:

                   grow::Left       grow::ForwardLeft       grow::BackLeft
                   grow::Down       grow::ForwardDown       grow::BackDown
                   grow::Right      grow::ForwardRight      grow::BackRight
                   grow::Up         grow::ForwardUp         grow::BackUp

           that select if the widget can be grown to the direction shown.
           These do not change meaning when "vertical" changes, though they do
           change the dock widget behavior. The second set does not affect
           dock widget behavior when "vertical" changes, however the names are
           not that illustrative:

                   grow::MajorLess  grow::ForwardMajorLess  grow::BackMajorLess
                   grow::MajorMore  grow::ForwardMajorMore  grow::BackMajorMore
                   grow::MinorLess  grow::ForwardMinorLess  grow::BackMinorLess
                   grow::MinorMore  grow::ForwardMinorMore  grow::BackMinorMore

           "Forward" and "Back" prefixes select if the dock widget can be
           respectively expanded or shrunk in the given direction. "Less" and
           "More" are equivalent to "Left" and "Right" when "vertical" is 0,
           and to "Up" and "Down" otherwise.

           The use of constants from the second set is preferred.

           Default value: 0

       hasPocket BOOLEAN
           A boolean flag, affects the possibility of a docked widget to
           reside outside the dock widget inferior. If 1, a docked wigdet is
           allowed to stay docked ( or dock into a position ) further on the
           major axis ( to the right when "vertical" is 0, up otherwise ), as
           if there’s a ’pocket’. If 0, a widget is neither allowed to dock
           outside the inferior, nor is allowed to stay docked ( and is
           undocked automatically ) when the dock widget shrinks so that the
           docked widget cannot stay in the dock boundaries.

           Default value: 1

       vertical BOOLEAN
           Selects the major axis of the dock widget. If 1, it is vertical,
           horizontal otherwise.

           Default value: 0

   Events
       Dock
           Called when "dock" is successfully finished.

       DockError WIDGET
           Called when "dock" is unsuccessfully finished. This only happens if
           WIDGET does not follow the docking protocol, and inserts itself
           into a non-approved area.

       Undock
           Called when "undock" is finished.

Prima::SingleLinearWidgetDocker

       Descendant of "Prima::LinearWidgetDocker". In addition to the
       constraints, introduced by the ascendant class,
       "Prima::SingleLinearWidgetDocker" allows only one line ( or row,
       depending on "vertical" property value ) of docked widgets.

Prima::FourPartDocker

       Implementation of a docking widget, with its four sides acting as
       ’rubber’ docking areas.

   Properties
       indents ARRAY
           Contains four integers, specifying the breadth of offset for each
           side. The first integer is width of the left side, the second -
           height of the bottom side, the third - width of the right side, the
           fourth - height of the top side.

       dockerClassLeft STRING
           Assigns class of left-side dock window.

           Default value: "Prima::LinearWidgetDocker".  Create-only property.

       dockerClassRight STRING
           Assigns class of right-side dock window.

           Default value: "Prima::LinearWidgetDocker".  Create-only property.

       dockerClassTop STRING
           Assigns class of top-side dock window.

           Default value: "Prima::LinearWidgetDocker".  Create-only property.

       dockerClassBottom STRING
           Assigns class of bottom-side dock window.

           Default value: "Prima::LinearWidgetDocker".  Create-only property.

       dockerClassClient STRING
           Assigns class of center dock window.

           Default value: "Prima::ClientWidgetDocker".  Create-only property.

       dockerProfileLeft HASH
           Assigns hash of properties, passed to the left-side dock widget
           during the creation.

           Create-only property.

       dockerProfileRight HASH
           Assigns hash of properties, passed to the right-side dock widget
           during the creation.

           Create-only property.

       dockerProfileTop HASH
           Assigns hash of properties, passed to the top-side dock widget
           during the creation.

           Create-only property.

       dockerProfileBottom HASH
           Assigns hash of properties, passed to the bottom-side dock widget
           during the creation.

           Create-only property.

       dockerProfileClient HASH
           Assigns hash of properties, passed to the center dock widget during
           the creation.

           Create-only property.

       dockerDelegationsLeft ARRAY
           Assigns the left-side dock list of delegated notifications.

           Create-only property.

       dockerDelegationsRight ARRAY
           Assigns the right-side dock list of delegated notifications.

           Create-only property.

       dockerDelegationsTop ARRAY
           Assigns the top-side dock list of delegated notifications.

           Create-only property.

       dockerDelegationsBottom ARRAY
           Assigns the bottom-side dock list of delegated notifications.

           Create-only property.

       dockerDelegationsClient ARRAY
           Assigns the center dock list of delegated notifications.

           Create-only property.

       dockerCommonProfile HASH
           Assigns hash of properties, passed to all five dock widgets during
           the creation.

           Create-only property.

Prima::InternalDockerShuttle

       The class provides a container, or a ’shuttle’, for a client widget,
       while is docked to an "Prima::AbstractDocker::Interface" descendant
       instance. The functionality includes communicating with dock widgets,
       the user interface for dragging and interactive dock selection, and a
       client widget container for non-docked state. The latter is implemented
       by reparenting of the client widget to an external shuttle widget,
       selected by "externalDockerClass" property. Both user interfaces for
       the docked and the non-docked shuttle states are minimal.

       The class implements dockable widget functionality, served by
       "Prima::AbstractDocker::Interface", while itself it is derived from
       "Prima::Widget" only.

       See also: "Prima::ExternalDockerShuttle".

   Properties
       client WIDGET
           Provides access to the client widget, which always resides either
           in the internal or the external shuttle. By default there is no
           client, and any widget capable of changing its parent can be set as
           one.  After a widget is assigned as a client, its "owner" and
           "clipOwner" properties must not be used.

           Run-time only property.

       dock WIDGET
           Selects the dock widget that the shuttle is landed on. If "undef",
           the shuttle is in the non-docked state.

           Default value: "undef"

       dockingRoot WIDGET
           Selects the root of dock widgets hierarchy.  If "undef", the
           shuttle can only exist in the non-docked state.

           Default value: "undef"

           See "USAGE" for reference.

       externalDockerClass STRING
           Assigns class of external shuttle widget.

           Default value: "Prima::ExternalDockerShuttle"

       externalDockerModule STRING
           Assigns module that contains the external shuttle widget class.

           Default value: "Prima::MDI" ( "Prima::ExternalDockerShuttle" is
           derived from "Prima::MDI" ).

       externalDockerProfile HASH
           Assigns hash of properties, passed to the external shuttle widget
           during the creation.

       fingerprint INTEGER
           A custom bit mask, used to reject inappropriate dock widgets on
           early stage.

           Default value: 0x0000FFFF

       indents ARRAY
           Contains four integers, specifying the breadth of offset in pixels
           for each widget side in the docked state.

           Default value: "5,5,5,5".

       snapDistance INTEGER
           A maximum offset, in pixels, between the actual shuttle coordinates
           and the coordinates proposed by the dock widget, where the shuttle
           is allowed to land.  In other words, it is the distance between the
           dock and the shuttle when the latter ’snaps’ to the dock during the
           dragging session.

           Default value: 10

       x_sizeable BOOLEAN
           Selects whether the shuttle can change its width in case the dock
           widget suggests so.

           Default value: 0

       y_sizeable BOOLEAN
           Selects whether the shuttle can change its height in case the dock
           widget suggests so.

           Default value: 0

   Methods
       client2frame X1, Y1, X2, Y2
           Returns a rectangle that the shuttle would occupy if its client
           rectangle is assigned to X1, Y1, X2, Y2 rectangle.

       dock_back
           Docks to the recent dock widget, if it is still available.

       drag STATE, RECT, ANCHOR_X, ANCHOR_Y
           Initiates or aborts the dragging session, depending on STATE
           boolean flag.

           If it is 1, RECT is an array with the coordinates of the shuttle
           rectangle before the drag has started; ANCHOR_X and ANCHOR_Y are
           coordinates of the aperture point where the mouse event occurred
           that has initiated the drag.  Depending on how the drag session
           ended, the shuttle can be relocated to another dock, undocked, or
           left intact. Also, "Dock", "Undock", or "FailDock" notifications
           can be triggered.

           If STATE is 0, RECT, ANCHOR_X ,and ANCHOR_Y parameters are not
           used.

       find_docking DOCK, [ POSITION ]
           Opens a session with DOCK, unless it is already opened, and
           negotiates about the possibility of landing ( at particular
           POSITION, if this parameter is present ).

           "find_docking" caches the dock widget sessions, and provides a
           possibility to select different parameters passed to "open_session"
           for different dock widgets. To achieve this, "GetCaps" request
           notification is triggered, which fills the parameters. The default
           action sets "sizeable" options according to "x_sizeable" and
           "y_sizeable" properties.

           In case an appropriate landing area is found, "Landing"
           notification is triggered with the proposed dock widget and the
           target rectangle. The area can be rejected on this stage if
           "Landing" returns negative answer.

           On success, returns a dock widget found and the target rectangle;
           the widget is never docked though. On failure returns an empty
           array.

           This method is used by the dragging routine to provide a visual
           feedback to the user, to indicate that a shuttle may or may not
           land in a particular area.

       frame2client X1, Y1, X2, Y2
           Returns a rectangle that the client would occupy if the shuttle
           rectangle is assigned to X1, Y1, X2, Y2 rectangle.

       redock
           If docked, undocks form the dock widget and docks back.  If not
           docked, does not perform anything.

   Events
       Dock
           Called when shuttle is docked.

       EDSClose
           Triggered when the user presses close button or otherwise activates
           the "close" function of the EDS ( external docker shuttle ). To
           cancel the closing, "clear_event" must be called inside the event
           handler.

       FailDock X, Y
           Called after the dragging session in the non-docked stage is
           finished, but did not result in docking. X and Y are the
           coordinates of the new external shuttle position.

       GetCaps DOCK, PROFILE
           Called before the shuttle opens a docking session with DOCK widget.
           PROFILE is a hash reference, which is to be filled inside the event
           handler. After that PROFILE is passed to "open_session" call.

           The default action sets "sizeable" options according to
           "x_sizeable" and "y_sizeable" properties.

       Landing DOCK, X1, Y1, X2, Y2
           Called inside the docking session, after an appropriate dock widget
           is selected and the landing area is defined as X1, Y1, X2, Y2. To
           reject the landing on either DOCK or area, "clear_event" must be
           called.

       Undock
           Called when shuttle is switched to the non-docked state.

Prima::ExternalDockerShuttle

       A shuttle class, used to host a client of
       "Prima::InternalDockerShuttle" widget when it is in the non-docked
       state. The class represents an emulation of a top-level window, which
       can be moved, resized ( this feature is not on by default though ), and
       closed.

       "Prima::ExternalDockerShuttle" is inherited from "Prima::MDI" class,
       and its window emulating functionality is a subset of its ascendant.
       See also Prima::MDI.

   Properties
       shuttle WIDGET
           Contains reference to the dockable WIDGET

Prima::LinearDockerShuttle

       A simple descendant of "Prima::InternalDockerShuttle", used for
       toolbars. Introduces orientation and draws a tiny header along the
       minor shuttle axis. All its properties concern only the way the shuttle
       draws itself.

   Properties
       headerBreadth INTEGER
           Breadth of the header in pixels.

           Default value: 8

       indent INTEGER
           Provides a wrapper to "indents" property; besides the space for the
           header, all indents are assigned to "indent" property value.

       vertical BOOLEAN
           If 1, the shuttle is drawn as a vertical bar.  If 0, the shuttle is
           drawn as a horizontal bar.

           Default value: 0

AUTHOR

       Dmitry Karasik, <dmitry@karasik.eu.org>.

SEE ALSO

       Prima, Prima::Widget, Prima::MDI, Prima::DockManager, examples/dock.pl