incubator-ooo-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From conflue...@apache.org
Subject [CONF] Apache OpenOffice Community > Sidebar Introduction
Date Sat, 28 Apr 2012 08:41:00 GMT
Space: Apache OpenOffice Community (https://cwiki.apache.org/confluence/display/OOOUSERS)
Page: Sidebar Introduction (https://cwiki.apache.org/confluence/display/OOOUSERS/Sidebar+Introduction)


Edited by JackyLi1011:
---------------------------------------------------------------------
*{+}Sidebar overview{+}*

A sidebar is a replace or an alternative to toolbar. Normally it will docked in the right
side of whole window. It can also be floated to other places by dragging the dock window title
bar. A sidebar contains two parts: panel dock(right narrow window like a vertical table bar)
and dock window(left side). Panel dock contains some buttons which is used to show/hide left
related dock window. A button is expressed with a image which indicates the function of its
related dock window. A dock window can be design for property, style, navigator, clip arts
and so on. It contains a title bar and a panel. A panel can contains several sections such
as text section and paragraph section. A section is divides two parts: section title bar and
section page.

!sidebar.JPG|border=1!

*{+}Sidebar code view{+}*

Sidebar implementation is mainly in sfx module. Related files or concept is as follows. The
object down will be created by the object up. !General.jpg|border=1!
For above picture, below concept are referred to:
|| Concept || Roles ||
| Dispatcher | {color:#000000}Internally maintains a stack of objects, each representing a
context. Examples for these contexts are “document”, “view”, “text”, “table”,
“cell” etc{color} \\ |
| Binding \\ | Associate for dispatcher. To be a connector between dispatcher and context
state. |
| Context | A specific situation, such as the current selection or cursor position in a document,
has a context\\ |
| View frame(shell) \\ | View frame extended from shell. Context is represented by a stack
of shell object |
| Interface \\ | Each interface has a static slot array |
| Slot \\ | Slot represents a command  
2) contains function pointers to 
execute the command or get
status information about it   
3) has a unique slotID 
Represents a command. Contains functions pointers to execute the command or get status info
about it. Has a unique slotID |
| Work window \\ | Dispatch use it to created sidebar child window. |
| Child window \\ | Child window is not a real window. But it relates with a real window which
can be a docking window. It is a data structure for framework to operate real window in a
common way. |
| Others \\ | Dock window, panel and section are easy to be understood from the overview picture.
|

For more details, refer to here: [http://wiki.services.openoffice.org/wiki/Framework/Article/Implementation_of_the_Dispatch_API_In_SFX2]

[|http://wiki.services.openoffice.org/wiki/Framework/Article/Implementation_of_the_Dispatch_API_In_SFX2]
*{+}Sidebar creation process{+}*

This section will focus on sidebar creation process. It will take property dock window in
spreadsheet as an example. Most of classes will be referred to. Besides, some key content
out of creation process will be listed.

1. Child window and factory registration

When module(sc) is initialized, it will register all interfaces containing child window interface
in corresponding SfxInterface through ScTabeViewShell. Child window factory will also be registered
in application through ScPropertyDockWinWrapper(extends from basic SfxChildWindow). Later
the factory will be used to created property child window.


!window_registration.jpg|border=1!

2. Panel dock creation

The panel dock will always lies in the rightest of window and it cannot be moved. It will
be used to show/hide dock window. So it will be created in the first. Here panel dock class
is named SfxTabbarWin. From the code view picture, we can understand the process clearly.
SfxFrame is a shell. Shell create panel dock window through SfxWorkWindow.

!panel_dock_creation.jpg|border=1!

3. Dock(Child) window creation

(1) Define SID_PROPERTY_SIDEBAR_DLG

\#define SID_PROPERTY_SIDEBAR_DLG(SID_SVX_START + 1100)

(2) Slot definition in sdi file

SID_PROPERTY_SIDEBAR_DLG

\[

ExecMethod = ChildWindowExecute ;

StateMethod = ChildWindowState ;

\]

(3) state method definition and implementation(also part of slot)

SfxBoolItem PropertyPanel SID_PROPERTY_SIDEBAR_DLG

\[

/\* flags: \*/

AutoUpdate = TRUE,

Cachable = Cachable,

FastCall = TRUE,

HasCoreId = FALSE,

HasDialog = FALSE,

ReadOnlyDoc = FALSE,

Toggle = FALSE,

Container = FALSE,

RecordAbsolute = FALSE,

RecordPerSet;

Synchron;

Readonly = FALSE,

/\* config: \*/

AccelConfig = TRUE,

MenuConfig = TRUE,

StatusBarConfig = FALSE,

ToolBoxConfig = TRUE,

GroupId = GID_FORMAT;

\]

Its implementation is in the common shell “SfxViewFrame: public SfxShell”
{quote}
void                
       ChildWindowExecute(SfxRequest&);
{quote}

!docking_window_creation_1.jpg|border=1!

!docking_window_creation_2.jpg|border=1!

4. Property panel creation

Responsibility of PropertyPanel
* manage the life cycle of section 	control. AddSection(), RemoveSection(), ClearSections()
* layout each section(set each 	section's position and size).
* manage when to show or hide 	scrollbar, set size of the scroll window. Rearrange(), 	SetupScrollBars(),
SetupVerticalScrollBar(), 	SetupHorizontalScrollBar(), scroll scrollBar, 	ScrollBarHandler()
* context switch, delegate the function to ContextSwitchHelper class
* maintain section state(expand/collapse) during context switch, delegate the function to
ContextSwitchHelper class

Responsibility of ContextSwitchHelper
* store the relationship of context 	and sections. map<ContextID, vector<SectionID>>
	macontext2sections, InitCtxt2SectionInfos().
* store section infos. 	vector<PanelSectionInfo>  maSectionInfos, InitSectionInfos().
* context switch.  	contextSwitch(ContextID)
* map<ContextID, 	SectioIDWithState> maDefaultStates, maContextStates;
* GetSectionState(), 	SetCurrentSectionState(), GetSectionDefaultState()

Key points

(1) Define SID_SVX_PROPERTY_CONTEXT

{quote}
\#define SID_SVX_PROPERTY_CONTEXT(SID_SVX_START + 1101)
{quote}
(2) Use SfxControllerItem to create the relationship between SID_SVX_PROPERTY_CONTEXT and
SfxBindings and SfxDispatcher. This happens when property panel is creating

{quote}
mpCtxItem(new SfxPropertyContextItem(SID_SVX_PROPERTY_CONTEXT,*mpBindings,this))
{quote}

!docking_window_creation_3.jpg|border=1!

5. Section creation with context sensitive

(1) Slot definition in sdi file

{quote}
SfxUInt16Item PropertyContextId SID_SVX_PROPERTY_CONTEXT

\[

 /\* flags: \*/

 AutoUpdate = TRUE,

 Cachable = Cachable,

 FastCall = TRUE,

 HasCoreId = FALSE,

 HasDialog = FALSE,

 ReadOnlyDoc = FALSE,

 Toggle = FALSE,

 Container = FALSE,

 RecordAbsolute = FALSE,

 RecordPerSet;

 Synchron;

 Readonly = FALSE,

 /\* config: \*/

 AccelConfig = TRUE,

 MenuConfig = TRUE,

 StatusBarConfig = FALSE,

 ToolBoxConfig = TRUE,

 GroupId = GID_FORMAT;

\]
{quote}
(2) state method definition and implementation(also part of slot)

{quote}
SID_SVX_PROPERTY_CONTEXT

\[

 StateMethod = GetPropertyContextId ;

\]//please pay attention that its interface is name Window.
{quote}
Its implementation is in the common shell “SfxViewFrame: public SfxShell”

{quote}
SAL_DLLPRIVATE void GetPropertyContextId( SfxItemSet &rSet );
{quote}
(3) If context is changed, dispatcher will call binding's update_Impl. In it, SfxStateCache(pCache)
will be got from bindings. And this state will be set. Then controller's stateChanged will
be called. And property panel will switch context according to context id. Related sections
will be added in panel. Below the first picture follows the first picture in "Dock(Child)
window creation" part.


!docking_window_creation_4.jpg|border=1!

!docking_window_creation_5.jpg|border=1!

Change your notification preferences: https://cwiki.apache.org/confluence/users/viewnotifications.action
  

Mime
View raw message