xref: /trunk/main/sd/source/ui/sidebar/LayoutMenu.hxx (revision 02c50d82)
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 #ifndef SD_SIDEBAR_LAYOUT_MENU_HXX
23 #define SD_SIDEBAR_LAYOUT_MENU_HXX
24 
25 #include "IDisposable.hxx"
26 #include "ISidebarReceiver.hxx"
27 #include <sfx2/sidebar/ILayoutableWindow.hxx>
28 
29 #include "glob.hxx"
30 #include "pres.hxx"
31 
32 #include <vcl/ctrl.hxx>
33 #include <svtools/valueset.hxx>
34 #include <svtools/transfer.hxx>
35 #include <sfx2/shell.hxx>
36 
37 #include <com/sun/star/frame/XStatusListener.hpp>
38 #include <com/sun/star/ui/XSidebar.hpp>
39 
40 
41 class SfxModule;
42 
43 namespace css = ::com::sun::star;
44 namespace cssu = ::com::sun::star::uno;
45 
46 namespace sd {
47 class DrawDocShell;
48 class PaneManagerEvent;
49 class ViewShellBase;
50 }
51 
52 
53 namespace sd { namespace tools {
54 class EventMultiplexerEvent;
55 } }
56 
57 
58 namespace sd { namespace sidebar {
59 
60 class ControlFactory;
61 class SidebarViewShell;
62 class SidebarShellManager;
63 
64 
65 class LayoutMenu
66     : public ValueSet,
67       public DragSourceHelper,
68       public DropTargetHelper,
69       public sfx2::sidebar::ILayoutableWindow
70 {
71 public:
72     /** Create a new layout menu.  Depending on the given flag it
73         displays its own scroll bar or lets a surrounding window
74         handle that.
75         @param i_pParent
76             the parent node in the control tree
77         @param i_rPanelViewShell
78             the view shell of the task pane.
79     */
80     LayoutMenu (
81         ::Window* pParent,
82         ViewShellBase& rViewShellBase,
83         const cssu::Reference<css::ui::XSidebar>& rxSidebar);
84     virtual ~LayoutMenu (void);
85 
86     virtual void Dispose (void);
87 
88     /** Return a numerical value representing the currently selected
89         layout.
90     */
91     AutoLayout GetSelectedAutoLayout (void);
92 
93     Size GetPreferredSize (void);
94     sal_Int32 GetPreferredWidth (sal_Int32 nHeight);
95     sal_Int32 GetMinimumWidth (void);
96 
97     // From ILayoutableWindow
98     virtual css::ui::LayoutSize GetHeightForWidth (const sal_Int32 nWidth);
99 
100     // From ::Window
101 	virtual void Paint (const Rectangle& rRect);
102     virtual void Resize (void);
103 
104     /** Show a context menu when the right mouse button is pressed.
105     */
106     virtual void MouseButtonDown (const MouseEvent& rEvent);
107 
108     /** The LayoutMenu does not support some main views.  In this case the
109         LayoutMenu is disabled.  This state is updated in this method.
110         @param eMode
111             On some occasions the edit mode is being switched when this
112             method is called can not (yet) be reliably detected.  Luckily,
113             in these cases the new value is provided by some broadcaster.
114             On other occasions the edit mode is not modified and is also not
115             provided.  Therefore the Unknown value.
116     */
117     enum MasterMode { MM_NORMAL, MM_MASTER, MM_UNKNOWN };
118     void UpdateEnabledState (const MasterMode eMode);
119 
120     /** Call this method when the set of displayed layouts is not up-to-date
121         anymore.  It will re-assemple this set according to the current
122         settings.
123     */
124     void InvalidateContent (void);
125 
126 	// DragSourceHelper
127 	virtual void StartDrag (sal_Int8 nAction, const Point& rPosPixel);
128 
129 	// DropTargetHelper
130 	virtual sal_Int8 AcceptDrop (const AcceptDropEvent& rEvent);
131 	virtual sal_Int8 ExecuteDrop (const ExecuteDropEvent& rEvent);
132 
133     /** The context menu is requested over this Command() method.
134     */
135 	virtual void Command (const CommandEvent& rEvent);
136 
137     /** Call Fill() when switching to or from high contrast mode so that the
138         correct set of icons is displayed.
139     */
140     virtual void DataChanged (const DataChangedEvent& rEvent);
141 
142 	using Window::GetWindow;
143 	using ValueSet::StartDrag;
144 
145 private:
146     ViewShellBase& mrBase;
147 
148     /** Do we use our own scroll bar or is viewport handling done by
149         our parent?
150     */
151     bool mbUseOwnScrollBar;
152 
153     /** If we are asked for the preferred window size, then use this
154         many columns for the calculation.
155     */
156     const int mnPreferredColumnCount;
157     cssu::Reference<css::frame::XStatusListener> mxListener;
158     bool mbSelectionUpdatePending;
159     bool mbIsMainViewChangePending;
160     cssu::Reference<css::ui::XSidebar> mxSidebar;
161     bool mbIsDisposed;
162 
163     /** Calculate the number of displayed rows.  This depends on the given
164         item size, the given number of columns, and the size of the
165         control.  Note that this is not the number of rows managed by the
166         valueset.  This number may be larger.  In that case a vertical
167         scroll bar is displayed.
168     */
169     int CalculateRowCount (const Size& rItemSize, int nColumnCount);
170 
171     /** Fill the value set with the layouts that are applicable to the
172         current main view shell.
173     */
174     void Fill (void);
175 
176     /** Remove all items from the value set.
177     */
178     void Clear (void);
179 
180     /** Assign the given layout to all selected slides of a slide sorter.
181         If no slide sorter is active then this call is ignored.  The slide
182         sorter in the center pane is preferred if the choice exists.
183     */
184     void AssignLayoutToSelectedSlides (AutoLayout aLayout);
185 
186     /** Insert a new page with the given layout.  The page is inserted via
187         the main view shell, i.e. its SID_INSERTPAGE slot is called.  It it
188         does not support this slot then inserting a new page does not take
189         place.  The new page is inserted after the currently active one (the
190         one returned by ViewShell::GetActualPage().)
191     */
192     void InsertPageWithLayout (AutoLayout aLayout);
193 
194     /** Create a request structure that can be used with the SID_INSERTPAGE
195         and SID_MODIFYPAGE slots.  The parameters are set so that the given
196         layout is assigned to the current page of the main view shell.
197         @param nSlotId
198             Supported slots are SID_INSERTPAGE and SID_MODIFYPAGE.
199         @param aLayout
200             Layout of the page to insert or to assign.
201     */
202     SfxRequest CreateRequest (
203         sal_uInt16 nSlotId,
204         AutoLayout aLayout);
205 
206     /** Select the layout that is used by the current page.
207     */
208     void UpdateSelection (void);
209 
210     // internal ctor
211     void    implConstruct( DrawDocShell& rDocumentShell );
212 
213     /** When clicked then set the current page of the view in the center pane.
214     */
215     DECL_LINK(ClickHandler, ValueSet*);
216     DECL_LINK(RightClickHandler, MouseEvent*);
217     DECL_LINK(StateChangeHandler, ::rtl::OUString*);
218     DECL_LINK(EventMultiplexerListener, ::sd::tools::EventMultiplexerEvent*);
219     DECL_LINK(WindowEventHandler, VclWindowEvent*);
220     DECL_LINK(OnMenuItemSelected, Menu*);
221 };
222 
223 } } // end of namespace ::sd::toolpanel
224 
225 #endif
226