1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 #ifndef SD_TASKPANE_SUB_TOOL_PANEL_HXX
25 #define SD_TASKPANE_SUB_TOOL_PANEL_HXX
26 
27 #include "taskpane/TaskPaneTreeNode.hxx"
28 
29 #include <vcl/ctrl.hxx>
30 #include <vcl/scrbar.hxx>
31 #include <memory>
32 #include <vector>
33 
34 
35 class Window;
36 
37 namespace sd { namespace toolpanel {
38 
39 /** The sub tool panel is in function similar to the tool panel.  It
40     differes in two points.  First, it is a control that can be used
41     as element in a tool panel and thus is actually a nested tool
42     panel.
43 
44     <p>Secondly, it formats its elements differently.  The actual controls
45     are placed one below the other with a title bar above each control.
46     Clicking on the title bar expands or collapses the control.  When there
47     is not enough space then scroll bars are shown.</p>
48 
49     <p>To avoid flickering when painting the sub tool panel the background
50     is made transparent and painting it is done by this class.  While
51     layouting its children it remembers the gaps between children and stores
52     them in maStripeList.  In Paint() those gaps as well as the border
53     around all children are painted in the background color.</p>
54 */
55 class SubToolPanel
56     : public Control,
57       public TreeNode
58 {
59 public:
60     /** Create a new sub tool panel with the given window as its
61         parent.  This will usually be a child window.
62     */
63     SubToolPanel (Window& i_rParentWindow);
64     virtual ~SubToolPanel (void);
65 
66     virtual void Paint (const Rectangle& rRect);
67 
68     /** Initiate a rearrangement of the controls and title bars.
69     */
70     virtual void Resize (void);
71 
72     virtual void RequestResize (void);
73 
74     virtual Size GetPreferredSize (void);
75     virtual sal_Int32 GetPreferredWidth (sal_Int32 nHeight);
76     virtual sal_Int32 GetPreferredHeight (sal_Int32 nWidth);
77     virtual bool IsResizable (void);
78     virtual ::Window* GetWindow (void);
79     virtual sal_Int32 GetMinimumWidth (void);
80 
81     virtual void ExpandControl (
82         TreeNode* pControl,
83         bool bExpansionState);
84 
85     virtual ::com::sun::star::uno::Reference<
86         ::com::sun::star::accessibility::XAccessible> CreateAccessibleObject (
87             const ::com::sun::star::uno::Reference<
88             ::com::sun::star::accessibility::XAccessible>& rxParent);
89 
90 	using Window::GetWindow;
91 private:
92     ::Window maWindowFiller;
93     bool mbIsRearrangePending;
94     bool mbIsLayoutPending;
95     sal_uInt32 mnChildrenWidth;
96     /// Border above top-most and below bottom-most control.
97     const int mnVerticalBorder;
98     /// Gap between two controls.
99     const int mnVerticalGap;
100     /// Border at the left and right of the controls.
101     const int mnHorizontalBorder;
102     /** List of horizontal stripes that is created from the gaps between
103         children when they are layouted.  The stripes are painted in Paint()
104         to fill the space around the children.
105     */
106     typedef ::std::vector< ::std::pair<int,int> > StripeList;
107     StripeList maStripeList;
108 
109     /** Calculate position, size, and visibility of the controls.
110         Call this method after the list of controls, their expansion
111         state, or the size of the sub panel has changed.
112     */
113     void Rearrange (void);
114 
115     /** Determine the minimal size that is necessary to show the controls
116         one over the other.  It may be smaller than the available area.
117     */
118     Size GetRequiredSize (void);
119 
120     /** Place the child windows one above the other and return the size of
121         the bounding box.
122     */
123     sal_Int32 LayoutChildren (void);
124 
125     DECL_LINK(WindowEventListener, VclSimpleEvent*);
126 };
127 
128 } } // end of namespace ::sd::toolpanel
129 
130 #endif
131