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 // MARKER(update_precomp.py): autogen include statement, do not remove
23 #include "precompiled_svx.hxx"
24
25 #include <vcl/split.hxx>
26 #include <vcl/ctrl.hxx>
27 #include <unotools/pathoptions.hxx>
28 #include <sfx2/app.hxx>
29 #include <sfx2/sfxsids.hrc>
30 #include "gallery.hrc"
31 #include "svx/galmisc.hxx"
32 #include "svx/gallery1.hxx"
33 #include "galbrws1.hxx"
34 #include "galbrws2.hxx"
35 #include "svx/galbrws.hxx"
36 #include "GallerySplitter.hxx"
37
38 #include <boost/bind.hpp>
39
40 // -------------------------
41 // - SvxGalleryChildWindow -
42 // -------------------------
DBG_NAME(GalleryChildWindow)43 DBG_NAME(GalleryChildWindow)
44
45 GalleryChildWindow::GalleryChildWindow( Window* _pParent, sal_uInt16 nId, SfxBindings* pBindings, SfxChildWinInfo* pInfo ) :
46 SfxChildWindow( _pParent, nId )
47 {
48 DBG_CTOR(GalleryChildWindow,NULL);
49
50 pWindow = new GalleryBrowser( pBindings, this, _pParent, GAL_RESID( RID_SVXDLG_GALLERYBROWSER ) );
51 eChildAlignment = SFX_ALIGN_TOP;
52 ( (GalleryBrowser*) pWindow )->Initialize( pInfo );
53 };
54
55 // -----------------------------------------------------------------------------
56
~GalleryChildWindow()57 GalleryChildWindow::~GalleryChildWindow()
58 {
59
60 DBG_DTOR(GalleryChildWindow,NULL);
61 }
62
63 // -----------------------------------------------------------------------------
64
SFX_IMPL_DOCKINGWINDOW(GalleryChildWindow,SID_GALLERY)65 SFX_IMPL_DOCKINGWINDOW( GalleryChildWindow, SID_GALLERY )
66
67 // ------------------
68 // - GalleryBrowser -
69 // ------------------
70 DBG_NAME(GalleryBrowser)
71
72 GalleryBrowser::GalleryBrowser(
73 SfxBindings* _pBindings,
74 SfxChildWindow* pCW,
75 Window* pParent,
76 const ResId& rResId)
77 : SfxDockingWindow(_pBindings, pCW, pParent, rResId),
78 maLastSize(GetOutputSizePixel()),
79 mpSplitter(0),
80 mpBrowser1(0),
81 mpBrowser2(0),
82 mpGallery(0)
83 {
84 DBG_CTOR(GalleryBrowser,NULL);
85
86 mpGallery = Gallery::GetGalleryInstance();
87 mpBrowser1 = new GalleryBrowser1(
88 this,
89 GAL_RESID( GALLERY_BROWSER1 ),
90 mpGallery,
91 ::boost::bind(&GalleryBrowser::KeyInput,this,_1,_2),
92 ::boost::bind(&GalleryBrowser::ThemeSelectionHasChanged, this));
93 mpSplitter = new GallerySplitter( this, GAL_RESID( GALLERY_SPLITTER ),
94 ::boost::bind(&GalleryBrowser::InitSettings, this));
95 mpBrowser2 = new GalleryBrowser2( this, GAL_RESID( GALLERY_BROWSER2 ), mpGallery );
96
97 FreeResource();
98 SetMinOutputSizePixel(maLastSize);
99
100 mpBrowser1->SelectTheme( 0 );
101 mpBrowser1->Show( sal_True );
102 mpBrowser2->Show( sal_True );
103
104 const bool bLayoutHorizontal(maLastSize.Width() > maLastSize.Height());
105 mpSplitter->SetHorizontal(bLayoutHorizontal);
106 mpSplitter->SetSplitHdl( LINK( this, GalleryBrowser, SplitHdl ) );
107 mpSplitter->Show( sal_True );
108
109 InitSettings();
110 }
111
112 // -----------------------------------------------------------------------------
113
~GalleryBrowser()114 GalleryBrowser::~GalleryBrowser()
115 {
116 delete mpBrowser2;
117 delete mpSplitter;
118 delete mpBrowser1;
119
120 DBG_DTOR(GalleryBrowser,NULL);
121 }
122
123 // -----------------------------------------------------------------------------
124
InitSettings()125 void GalleryBrowser::InitSettings()
126 {
127 SetBackground( Wallpaper( GALLERY_DLG_COLOR ) );
128 SetControlBackground( GALLERY_DLG_COLOR );
129 SetControlForeground( GALLERY_DLG_COLOR );
130
131 mpSplitter->SetBackground( Wallpaper( GALLERY_DLG_COLOR ) );
132 mpSplitter->SetControlBackground( GALLERY_DLG_COLOR );
133 mpSplitter->SetControlForeground( GALLERY_DLG_COLOR );
134
135 mpBrowser1->SetBackground( Wallpaper( GALLERY_DLG_COLOR ) );
136 mpBrowser1->SetControlBackground( GALLERY_DLG_COLOR );
137 mpBrowser1->SetControlForeground( GALLERY_DLG_COLOR );
138
139 mpBrowser2->SetBackground( Wallpaper( GALLERY_DLG_COLOR ) );
140 mpBrowser2->SetControlBackground( GALLERY_DLG_COLOR );
141 mpBrowser2->SetControlForeground( GALLERY_DLG_COLOR );
142 }
143
144 // -----------------------------------------------------------------------------
145
Resize()146 void GalleryBrowser::Resize()
147 {
148 // call parent
149 SfxDockingWindow::Resize();
150
151 // update hor/ver
152 const Size aNewSize( GetOutputSizePixel() );
153 const bool bNewLayoutHorizontal(aNewSize.Width() > aNewSize.Height());
154 const bool bOldLayoutHorizontal(mpSplitter->IsHorizontal());
155 const long nSplitPos( bOldLayoutHorizontal ? mpSplitter->GetPosPixel().X() : mpSplitter->GetPosPixel().Y());
156 const long nSplitSize( bOldLayoutHorizontal ? mpSplitter->GetOutputSizePixel().Width() : mpSplitter->GetOutputSizePixel().Height());
157
158 if(bNewLayoutHorizontal != bOldLayoutHorizontal)
159 {
160 mpSplitter->SetHorizontal(bNewLayoutHorizontal);
161 }
162
163 const long nFrameLen = LogicToPixel( Size( 3, 0 ), MAP_APPFONT ).Width();
164 const long nFrameLen2 = nFrameLen << 1;
165
166 if(bNewLayoutHorizontal)
167 {
168 mpBrowser1->SetPosSizePixel(
169 Point( nFrameLen, nFrameLen ),
170 Size(nSplitPos - nFrameLen, aNewSize.Height() - nFrameLen2) );
171
172 mpSplitter->SetPosSizePixel(
173 Point( nSplitPos, 0),
174 Size( nSplitSize, aNewSize.Height() ) );
175
176 mpSplitter->SetDragRectPixel(
177 Rectangle(
178 Point( nFrameLen2, 0 ),
179 Size( aNewSize.Width() - ( nFrameLen2 << 1 ) - nSplitSize, aNewSize.Height() ) ) );
180
181 mpBrowser2->SetPosSizePixel(
182 Point( nSplitPos + nSplitSize, nFrameLen ),
183 Size( aNewSize.Width() - nSplitSize - nSplitPos - nFrameLen, aNewSize.Height() - nFrameLen2 ) );
184 }
185 else
186 {
187 mpBrowser1->SetPosSizePixel(
188 Point( nFrameLen, nFrameLen ),
189 Size(aNewSize.Width() - nFrameLen2, nSplitPos - nFrameLen));
190
191 mpSplitter->SetPosSizePixel(
192 Point( 0, nSplitPos),
193 Size( aNewSize.Width(), nSplitSize ) );
194
195 mpSplitter->SetDragRectPixel(
196 Rectangle(
197 Point( 0, nFrameLen2 ),
198 Size( aNewSize.Width(), aNewSize.Height() - ( nFrameLen2 << 1 ) - nSplitSize ) ));
199
200 mpBrowser2->SetPosSizePixel(
201 Point( nFrameLen, nSplitPos + nSplitSize ),
202 Size( aNewSize.Width() - nFrameLen2, aNewSize.Height() - nSplitSize - nSplitPos - nFrameLen ));
203 }
204
205 maLastSize = aNewSize;
206 }
207
208 // -----------------------------------------------------------------------------
209
KeyInput(const KeyEvent & rKEvt,Window *)210 sal_Bool GalleryBrowser::KeyInput( const KeyEvent& rKEvt, Window* )
211 {
212 const sal_uInt16 nCode = rKEvt.GetKeyCode().GetCode();
213 sal_Bool bRet = ( !rKEvt.GetKeyCode().IsMod1() &&
214 ( ( KEY_TAB == nCode ) || ( KEY_F6 == nCode && rKEvt.GetKeyCode().IsMod2() ) ) );
215
216 if( bRet )
217 {
218 if( !rKEvt.GetKeyCode().IsShift() )
219 {
220 if( mpBrowser1->mpThemes->HasChildPathFocus( sal_True ) )
221 mpBrowser2->GetViewWindow()->GrabFocus();
222 else if( mpBrowser2->GetViewWindow()->HasFocus() )
223 mpBrowser2->maViewBox.GrabFocus();
224 else if( mpBrowser2->maViewBox.HasFocus() )
225 mpBrowser1->maNewTheme.GrabFocus();
226 else
227 mpBrowser1->mpThemes->GrabFocus();
228 }
229 else
230 {
231 if( mpBrowser1->mpThemes->HasChildPathFocus( sal_True ) )
232 mpBrowser1->maNewTheme.GrabFocus();
233 else if( mpBrowser1->maNewTheme.HasFocus() )
234 mpBrowser2->maViewBox.GrabFocus();
235 else if( mpBrowser2->maViewBox.HasFocus() )
236 mpBrowser2->GetViewWindow()->GrabFocus();
237 else
238 mpBrowser1->mpThemes->GrabFocus();
239 }
240 }
241
242 return bRet;
243 }
244
245 // -----------------------------------------------------------------------------
246
Close()247 sal_Bool GalleryBrowser::Close()
248 {
249 return SfxDockingWindow::Close();
250 }
251
252 // -----------------------------------------------------------------------------
253
GetFocus()254 void GalleryBrowser::GetFocus()
255 {
256 SfxDockingWindow::GetFocus();
257 mpBrowser1->GrabFocus();
258 }
259
260 // -----------------------------------------------------------------------------
261
ThemeSelectionHasChanged()262 void GalleryBrowser::ThemeSelectionHasChanged()
263 {
264 mpBrowser2->SelectTheme( mpBrowser1->GetSelectedTheme() );
265 }
266
267 // -----------------------------------------------------------------------------
268
IMPL_LINK(GalleryBrowser,SplitHdl,void *,EMPTYARG)269 IMPL_LINK( GalleryBrowser, SplitHdl, void*, EMPTYARG )
270 {
271 if(mpSplitter->IsHorizontal())
272 {
273 mpSplitter->SetPosPixel( Point( mpSplitter->GetSplitPosPixel(), mpSplitter->GetPosPixel().Y() ) );
274 }
275 else
276 {
277 mpSplitter->SetPosPixel( Point( mpSplitter->GetPosPixel().X(), mpSplitter->GetSplitPosPixel() ) );
278 }
279
280 Resize();
281
282 return 0L;
283 }
284
285 // -----------------------------------------------------------------------------
286 // eof
287