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 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_sd.hxx"
26
27
28 #include <sfx2/bindings.hxx>
29 #include <svx/svxids.hrc>
30 #include <svx/grafctrl.hxx>
31 #include <svl/cjkoptions.hxx>
32 #include <sfx2/viewsh.hxx>
33 #ifndef _SFX_IMAGEMGR_HXX
34 #include <sfx2/imagemgr.hxx>
35 #endif
36 #include <rtl/ustring.hxx>
37 #include <rtl/ustrbuf.hxx>
38
39 #include "sddll.hxx"
40 #include "GraphicDocShell.hxx"
41
42 #include <vcl/toolbox.hxx>
43
44 #include "app.hxx"
45 #include "app.hrc"
46 #include "res_bmp.hrc"
47 #include "sdresid.hxx"
48 #include "tbx_ww.hxx"
49 #include "tbx_ww.hrc"
50
SFX_IMPL_TOOLBOX_CONTROL(SdTbxControl,TbxImageItem)51 SFX_IMPL_TOOLBOX_CONTROL( SdTbxControl, TbxImageItem )
52
53 /*************************************************************************
54 |*
55 |* PopUp-Window
56 |*
57 \************************************************************************/
58 /*
59 SdPopupWindowTbx::SdPopupWindowTbx( sal_uInt16 nId, WindowAlign eAlign,
60 SdResId aRIdWin, SdResId aRIdTbx,
61 SfxBindings& rBindings ) :
62 SfxPopupWindow ( nId, aRIdWin, rBindings ),
63 aTbx ( this, GetBindings(), aRIdTbx ),
64 aSdResIdWin ( aRIdWin ),
65 aSdResIdTbx ( aRIdTbx ),
66 eTbxAlign ( eAlign )
67 {
68 aTbx.UseDefault();
69 aSelectLink = aTbx.GetToolBox().GetSelectHdl();
70 aTbx.GetToolBox().SetSelectHdl( LINK( this, SdPopupWindowTbx, TbxSelectHdl ) );
71
72 FreeResource();
73
74 if( ( eAlign == WINDOWALIGN_TOP ) || ( eAlign == WINDOWALIGN_BOTTOM ) )
75 {
76 if ( aSdResIdWin.GetId() != RID_TEXT )
77 aTbx.GetToolBox().SetAlign( WINDOWALIGN_LEFT );
78
79 SetText( String() );
80 }
81
82 AdaptToCTL();
83 }
84
85
86 void SdPopupWindowTbx::AdaptToCTL (void)
87 {
88 Size aSize = aTbx.CalcWindowSizePixel();
89 if (aSdResIdWin.GetId() == RID_TEXT)
90 {
91 SvtCJKOptions aCJKOptions;
92 if ( ! aCJKOptions.IsVerticalTextEnabled())
93 {
94 ToolBox& aToolBox = aTbx.GetToolBox();
95
96 // Iterate over all tool box items and remove those that are
97 // specific to complex text layout.
98 sal_uInt16 i=0;
99 while (i < aToolBox.GetItemCount())
100 {
101 sal_uInt16 nIndex = aToolBox.GetItemId(i);
102 switch (nIndex)
103 {
104 case 0: // Line break.
105 case SID_ATTR_CHAR_VERTICAL:
106 case SID_TEXT_FITTOSIZE_VERTICAL:
107 case SID_DRAW_CAPTION_VERTICAL:
108 case SID_DRAW_FONTWORK_VERTICAL:
109 aToolBox.RemoveItem (i);
110 break;
111
112 default:
113 // Leave the item unmodified. Advance to the next one.
114 i+=1;
115 }
116 }
117 aToolBox.RecalcItems();
118 // Why is this necessary?
119 aToolBox.SetLineCount(1);
120 sal_uInt16 nLineCount = aToolBox.GetLineCount();
121 aSize = aToolBox.CalcWindowSizePixel(nLineCount);
122 }
123 }
124 aTbx.SetPosSizePixel( Point(), aSize );
125 SetOutputSizePixel( aSize );
126 }
127 */
128
129 /*-------------------------------------------------------------------------*/
130 /*
131 SdPopupWindowTbx::~SdPopupWindowTbx()
132 {
133 }
134 */
135 /*-------------------------------------------------------------------------*/
136 /*
137 SfxPopupWindow* SdPopupWindowTbx::Clone() const
138 {
139 SfxBindings& rBindings = (SfxBindings&)GetBindings();
140
141 return( new SdPopupWindowTbx( GetId(), eTbxAlign,
142 aSdResIdWin, aSdResIdTbx, rBindings ) );
143
144 //return( SfxPopupWindow::Clone() );
145 }
146 */
147 /*-------------------------------------------------------------------------*/
148 /*
149 void SdPopupWindowTbx::Update()
150 {
151 AdaptToCTL();
152
153 ToolBox *pBox = &aTbx.GetToolBox();
154 aTbx.Activate( pBox );
155 aTbx.Deactivate( pBox );
156 }
157 */
158 /*-------------------------------------------------------------------------*/
159 /*
160 void SdPopupWindowTbx::PopupModeEnd()
161 {
162 aTbx.GetToolBox().EndSelection();
163
164 SfxPopupWindow::PopupModeEnd();
165 }
166 */
167 /*-------------------------------------------------------------------------*/
168 /*
169 IMPL_LINK( SdPopupWindowTbx, TbxSelectHdl, ToolBox*, pBox)
170 {
171 if( IsInPopupMode() )
172 EndPopupMode();
173
174 aSelectLink.Call( &aTbx.GetToolBox() );
175
176 if ( pBox->GetModifier() & KEY_MOD1 )
177 {
178 // #99013# if selected with control key, return focus to current view
179 Window* pShellWnd = SfxViewShell::Current()->GetWindow();
180 if ( pShellWnd )
181 pShellWnd->GrabFocus();
182 }
183
184 return( 0L );
185 }
186 */
187 /*************************************************************************
188 |*
189 |* Klasse fuer Toolbox
190 |*
191 \************************************************************************/
192
193 SdTbxControl::SdTbxControl( sal_uInt16 nSlotId, sal_uInt16 nId, ToolBox& rTbx ) :
194 SfxToolBoxControl( nSlotId, nId, rTbx )
195 {
196 rTbx.SetItemBits( nId, TIB_DROPDOWN | rTbx.GetItemBits( nId ) );
197 rTbx.Invalidate();
198 }
199
200 /*-------------------------------------------------------------------------*/
201
GetPopupWindowType() const202 SfxPopupWindowType SdTbxControl::GetPopupWindowType() const
203 {
204 return( SFX_POPUPWINDOW_ONTIMEOUT );
205 }
206
207 /*************************************************************************
208 |*
209 |* Hier wird das Fenster erzeugt
210 |* Lage der Toolbox mit GetToolBox() abfragbar
211 |* rItemRect sind die Screen-Koordinaten
212 |*
213 \************************************************************************/
214
CreatePopupWindow()215 SfxPopupWindow* SdTbxControl::CreatePopupWindow()
216 {
217 SfxPopupWindow *pWin = NULL;
218 rtl::OUString aToolBarResStr;
219 rtl::OUStringBuffer aTbxResName( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "private:resource/toolbar/" )));
220 switch( GetSlotId() )
221 {
222 case SID_OBJECT_ALIGN:
223 aTbxResName.appendAscii( "alignmentbar" );
224 aToolBarResStr = aTbxResName.makeStringAndClear();
225 break;
226 case SID_ZOOM_TOOLBOX:
227 aTbxResName.appendAscii( "zoombar" );
228 aToolBarResStr = aTbxResName.makeStringAndClear();
229 break;
230 case SID_OBJECT_CHOOSE_MODE:
231 aTbxResName.appendAscii( "choosemodebar" );
232 aToolBarResStr = aTbxResName.makeStringAndClear();
233 break;
234 case SID_POSITION:
235 aTbxResName.appendAscii( "positionbar" );
236 aToolBarResStr = aTbxResName.makeStringAndClear();
237 break;
238 case SID_DRAWTBX_TEXT:
239 aTbxResName.appendAscii( "textbar" );
240 aToolBarResStr = aTbxResName.makeStringAndClear();
241 break;
242 case SID_DRAWTBX_RECTANGLES:
243 aTbxResName.appendAscii( "rectanglesbar" );
244 aToolBarResStr = aTbxResName.makeStringAndClear();
245 break;
246 case SID_DRAWTBX_ELLIPSES:
247 aTbxResName.appendAscii( "ellipsesbar" );
248 aToolBarResStr = aTbxResName.makeStringAndClear();
249 break;
250 case SID_DRAWTBX_LINES:
251 aTbxResName.appendAscii( "linesbar" );
252 aToolBarResStr = aTbxResName.makeStringAndClear();
253 break;
254 case SID_DRAWTBX_ARROWS:
255 aTbxResName.appendAscii( "arrowsbar" );
256 aToolBarResStr = aTbxResName.makeStringAndClear();
257 break;
258 case SID_DRAWTBX_3D_OBJECTS:
259 aTbxResName.appendAscii( "3dobjectsbar" );
260 aToolBarResStr = aTbxResName.makeStringAndClear();
261 break;
262 case SID_DRAWTBX_CONNECTORS:
263 aTbxResName.appendAscii( "connectorsbar" );
264 aToolBarResStr = aTbxResName.makeStringAndClear();
265 break;
266 case SID_DRAWTBX_INSERT:
267 aTbxResName.appendAscii( "insertbar" );
268 aToolBarResStr = aTbxResName.makeStringAndClear();
269 break;
270 }
271
272 if ( aToolBarResStr.getLength() > 0 )
273 createAndPositionSubToolBar( aToolBarResStr );
274
275 return( pWin );
276 }
277
278 /*-------------------------------------------------------------------------*/
279
StateChanged(sal_uInt16 nSId,SfxItemState eState,const SfxPoolItem * pState)280 void SdTbxControl::StateChanged( sal_uInt16 nSId,
281 SfxItemState eState, const SfxPoolItem* pState )
282 {
283 SfxToolBoxControl::StateChanged( nSId, eState, pState );
284
285 if( eState == SFX_ITEM_AVAILABLE )
286 {
287 TbxImageItem* pItem = PTR_CAST( TbxImageItem, pState );
288 //DBG_ASSERT( pItem, "TbxImageItem erwartet!" );
289 // Im StarDesktop kann jetzt auch ein anderes Item ankommen,
290 // das nicht ausgewertet werden darf (#33802# und #33838#)
291 if( pItem )
292 {
293 ToolBox& rTbx = GetToolBox();
294 sal_uInt16 nImage = pItem->GetValue();
295 if( nImage == 0 )
296 {
297 if( rTbx.IsItemChecked( nSId ) )
298 rTbx.CheckItem( nSId, sal_False );
299 }
300 else
301 {
302 rtl::OUString aSlotURL( RTL_CONSTASCII_USTRINGPARAM( "slot:" ));
303 aSlotURL += rtl::OUString::valueOf( sal_Int32( nImage ));
304 Image aImage = GetImage( m_xFrame,
305 aSlotURL,
306 hasBigImages(),
307 GetToolBox().GetSettings().GetStyleSettings().GetHighContrastMode() );
308
309 // !-Operator prueft, ob Image nicht vorhanden ist
310 if( !!aImage )
311 {
312 rTbx.SetItemImage( GetId(), aImage );
313 rTbx.CheckItem( GetId(), IsCheckable( nImage ) );
314
315 if( nSId != SID_ZOOM_TOOLBOX &&
316 nSId != SID_DRAWTBX_INSERT &&
317 nSId != SID_POSITION &&
318 nSId != SID_OBJECT_ALIGN )
319 {
320 if( nSId != SID_OBJECT_CHOOSE_MODE &&
321 rTbx.IsItemChecked( SID_OBJECT_CHOOSE_MODE ) )
322 rTbx.CheckItem( SID_OBJECT_CHOOSE_MODE, sal_False );
323 if( nSId != SID_DRAWTBX_TEXT &&
324 rTbx.IsItemChecked( SID_DRAWTBX_TEXT ) )
325 rTbx.CheckItem( SID_DRAWTBX_TEXT, sal_False );
326 if( nSId != SID_DRAWTBX_RECTANGLES &&
327 rTbx.IsItemChecked( SID_DRAWTBX_RECTANGLES ) )
328 rTbx.CheckItem( SID_DRAWTBX_RECTANGLES, sal_False );
329 if( nSId != SID_DRAWTBX_ELLIPSES &&
330 rTbx.IsItemChecked( SID_DRAWTBX_ELLIPSES ) )
331 rTbx.CheckItem( SID_DRAWTBX_ELLIPSES, sal_False );
332 if( nSId != SID_DRAWTBX_LINES &&
333 rTbx.IsItemChecked( SID_DRAWTBX_LINES ) )
334 rTbx.CheckItem( SID_DRAWTBX_LINES, sal_False );
335 if( nSId != SID_DRAWTBX_ARROWS &&
336 rTbx.IsItemChecked( SID_DRAWTBX_ARROWS ) )
337 rTbx.CheckItem( SID_DRAWTBX_ARROWS, sal_False );
338 if( nSId != SID_DRAWTBX_3D_OBJECTS &&
339 rTbx.IsItemChecked( SID_DRAWTBX_3D_OBJECTS ) )
340 rTbx.CheckItem( SID_DRAWTBX_3D_OBJECTS, sal_False );
341 if( nSId != SID_DRAWTBX_CONNECTORS &&
342 rTbx.IsItemChecked( SID_DRAWTBX_CONNECTORS ) )
343 rTbx.CheckItem( SID_DRAWTBX_CONNECTORS, sal_False );
344 }
345 }
346 }
347 }
348 }
349 }
350
351 /*-------------------------------------------------------------------------*/
352
IsCheckable(sal_uInt16 nSId)353 sal_Bool SdTbxControl::IsCheckable( sal_uInt16 nSId )
354 {
355 switch( nSId )
356 {
357 case SID_OBJECT_ROTATE:
358 case SID_OBJECT_MIRROR:
359 case SID_OBJECT_CROP:
360 case SID_OBJECT_TRANSPARENCE:
361 case SID_OBJECT_GRADIENT:
362 case SID_OBJECT_SHEAR:
363 case SID_OBJECT_CROOK_ROTATE:
364 case SID_OBJECT_CROOK_SLANT:
365 case SID_OBJECT_CROOK_STRETCH:
366 case SID_CONVERT_TO_3D_LATHE:
367
368 case SID_ATTR_CHAR:
369 case SID_ATTR_CHAR_VERTICAL:
370 case SID_TEXT_FITTOSIZE:
371 case SID_TEXT_FITTOSIZE_VERTICAL:
372 case SID_DRAW_CAPTION:
373 case SID_DRAW_CAPTION_VERTICAL:
374 case SID_DRAW_FONTWORK:
375 case SID_DRAW_FONTWORK_VERTICAL:
376
377 case SID_DRAW_RECT:
378 case SID_DRAW_SQUARE:
379 case SID_DRAW_RECT_ROUND:
380 case SID_DRAW_SQUARE_ROUND:
381 case SID_DRAW_RECT_NOFILL:
382 case SID_DRAW_SQUARE_NOFILL:
383 case SID_DRAW_RECT_ROUND_NOFILL:
384 case SID_DRAW_SQUARE_ROUND_NOFILL:
385
386 case SID_DRAW_ELLIPSE:
387 case SID_DRAW_CIRCLE:
388 case SID_DRAW_PIE:
389 case SID_DRAW_CIRCLEPIE:
390 case SID_DRAW_ELLIPSECUT:
391 case SID_DRAW_CIRCLECUT:
392 case SID_DRAW_ARC:
393 case SID_DRAW_CIRCLEARC:
394 case SID_DRAW_ELLIPSE_NOFILL:
395 case SID_DRAW_CIRCLE_NOFILL:
396 case SID_DRAW_PIE_NOFILL:
397 case SID_DRAW_CIRCLEPIE_NOFILL:
398 case SID_DRAW_ELLIPSECUT_NOFILL:
399 case SID_DRAW_CIRCLECUT_NOFILL:
400
401 case SID_DRAW_BEZIER_NOFILL:
402 case SID_DRAW_POLYGON_NOFILL:
403 case SID_DRAW_XPOLYGON_NOFILL:
404 case SID_DRAW_BEZIER_FILL:
405 case SID_DRAW_POLYGON:
406 case SID_DRAW_XPOLYGON:
407 case SID_DRAW_FREELINE:
408 case SID_DRAW_FREELINE_NOFILL:
409
410 case SID_DRAW_LINE:
411 case SID_DRAW_XLINE:
412 case SID_DRAW_MEASURELINE:
413 case SID_LINE_ARROW_START:
414 case SID_LINE_ARROW_END:
415 case SID_LINE_ARROWS:
416 case SID_LINE_ARROW_CIRCLE:
417 case SID_LINE_CIRCLE_ARROW:
418 case SID_LINE_ARROW_SQUARE:
419 case SID_LINE_SQUARE_ARROW:
420
421 case SID_3D_CUBE:
422 case SID_3D_SPHERE:
423 case SID_3D_CYLINDER:
424 case SID_3D_CONE:
425 case SID_3D_PYRAMID:
426 case SID_3D_TORUS:
427 case SID_3D_SHELL:
428 case SID_3D_HALF_SPHERE:
429
430 case SID_TOOL_CONNECTOR:
431 case SID_CONNECTOR_ARROW_START:
432 case SID_CONNECTOR_ARROW_END:
433 case SID_CONNECTOR_ARROWS:
434 case SID_CONNECTOR_CIRCLE_START:
435 case SID_CONNECTOR_CIRCLE_END:
436 case SID_CONNECTOR_CIRCLES:
437 case SID_CONNECTOR_LINE:
438 case SID_CONNECTOR_LINE_ARROW_START:
439 case SID_CONNECTOR_LINE_ARROW_END:
440 case SID_CONNECTOR_LINE_ARROWS:
441 case SID_CONNECTOR_LINE_CIRCLE_START:
442 case SID_CONNECTOR_LINE_CIRCLE_END:
443 case SID_CONNECTOR_LINE_CIRCLES:
444 case SID_CONNECTOR_CURVE:
445 case SID_CONNECTOR_CURVE_ARROW_START:
446 case SID_CONNECTOR_CURVE_ARROW_END:
447 case SID_CONNECTOR_CURVE_ARROWS:
448 case SID_CONNECTOR_CURVE_CIRCLE_START:
449 case SID_CONNECTOR_CURVE_CIRCLE_END:
450 case SID_CONNECTOR_CURVE_CIRCLES:
451 case SID_CONNECTOR_LINES:
452 case SID_CONNECTOR_LINES_ARROW_START:
453 case SID_CONNECTOR_LINES_ARROW_END:
454 case SID_CONNECTOR_LINES_ARROWS:
455 case SID_CONNECTOR_LINES_CIRCLE_START:
456 case SID_CONNECTOR_LINES_CIRCLE_END:
457 case SID_CONNECTOR_LINES_CIRCLES:
458
459
460
461 //case SID_ZOOM_OUT:
462 return( sal_True );
463 }
464 return( sal_False );
465 }
466
467
468
469