Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 : #include <com/sun/star/drawing/FillStyle.hpp>
21 :
22 : #include <sfx2/dispatch.hxx>
23 : #include <sfx2/objsh.hxx>
24 : #include <sfx2/viewsh.hxx>
25 : #include <sfx2/module.hxx>
26 : #include <tools/urlobj.hxx>
27 :
28 : #include <vcl/svapp.hxx>
29 : #include <vcl/settings.hxx>
30 :
31 : #include <svx/dialogs.hrc>
32 :
33 : #define DELAY_TIMEOUT 100
34 :
35 : #include <svx/xlnclit.hxx>
36 : #include <svx/xlnwtit.hxx>
37 : #include <svx/xlineit0.hxx>
38 : #include <svx/xlndsit.hxx>
39 : #include <svx/xtable.hxx>
40 : #include "svx/drawitem.hxx"
41 : #include <svx/dialmgr.hxx>
42 : #include "svx/dlgutil.hxx"
43 : #include <svx/itemwin.hxx>
44 : #include "svx/linectrl.hxx"
45 : #include <svtools/colorcfg.hxx>
46 :
47 : using namespace ::com::sun::star;
48 : using namespace ::com::sun::star::uno;
49 : using namespace ::com::sun::star::frame;
50 : using namespace ::com::sun::star::util;
51 : using namespace ::com::sun::star::lang;
52 : using namespace ::com::sun::star::beans;
53 :
54 : #define LOGICAL_EDIT_HEIGHT 12
55 :
56 126 : SvxLineBox::SvxLineBox( vcl::Window* pParent, const Reference< XFrame >& rFrame, WinBits nBits ) :
57 : LineLB( pParent, nBits ),
58 : nCurPos ( 0 ),
59 : aLogicalSize(40,140),
60 : bRelease ( true ),
61 : mpSh ( NULL ),
62 126 : mxFrame ( rFrame )
63 : {
64 126 : SetSizePixel( LogicToPixel( aLogicalSize, MAP_APPFONT ));
65 126 : Show();
66 :
67 126 : aDelayTimer.SetTimeout( DELAY_TIMEOUT );
68 126 : aDelayTimer.SetTimeoutHdl( LINK( this, SvxLineBox, DelayHdl_Impl ) );
69 126 : aDelayTimer.Start();
70 126 : }
71 :
72 :
73 :
74 252 : SvxLineBox::~SvxLineBox()
75 : {
76 252 : }
77 :
78 :
79 :
80 210 : IMPL_LINK_NOARG(SvxLineBox, DelayHdl_Impl)
81 : {
82 105 : if ( GetEntryCount() == 0 )
83 : {
84 105 : mpSh = SfxObjectShell::Current();
85 105 : FillControl();
86 : }
87 105 : return 0;
88 : }
89 :
90 :
91 :
92 0 : void SvxLineBox::Select()
93 : {
94 : // Call the parent's Select() member to trigger accessibility events.
95 0 : LineLB::Select();
96 :
97 0 : if ( !IsTravelSelect() )
98 : {
99 : XLineStyle eXLS;
100 0 : sal_Int32 nPos = GetSelectEntryPos();
101 :
102 0 : switch ( nPos )
103 : {
104 : case 0:
105 0 : eXLS = XLINE_NONE;
106 0 : break;
107 :
108 : case 1:
109 0 : eXLS = XLINE_SOLID;
110 0 : break;
111 :
112 : default:
113 : {
114 0 : eXLS = XLINE_DASH;
115 :
116 0 : if ( nPos != LISTBOX_ENTRY_NOTFOUND &&
117 0 : SfxObjectShell::Current() &&
118 0 : SfxObjectShell::Current()->GetItem( SID_DASH_LIST ) )
119 : {
120 : // LineDashItem will only be sent if it also has a dash.
121 : // Notify cares!
122 : SvxDashListItem aItem( *static_cast<const SvxDashListItem*>(
123 0 : SfxObjectShell::Current()->GetItem( SID_DASH_LIST ) ) );
124 : XLineDashItem aLineDashItem( GetSelectEntry(),
125 0 : aItem.GetDashList()->GetDash( nPos - 2 )->GetDash() );
126 :
127 0 : Any a;
128 0 : Sequence< PropertyValue > aArgs( 1 );
129 0 : aArgs[0].Name = "LineDash";
130 0 : aLineDashItem.QueryValue ( a );
131 0 : aArgs[0].Value = a;
132 0 : SfxToolBoxControl::Dispatch( Reference< XDispatchProvider >( mxFrame->getController(), UNO_QUERY ),
133 : OUString( ".uno:LineDash" ),
134 0 : aArgs );
135 : }
136 : }
137 0 : break;
138 : }
139 :
140 0 : XLineStyleItem aLineStyleItem( eXLS );
141 0 : Any a;
142 0 : Sequence< PropertyValue > aArgs( 1 );
143 0 : aArgs[0].Name = "XLineStyle";
144 0 : aLineStyleItem.QueryValue ( a );
145 0 : aArgs[0].Value = a;
146 0 : SfxToolBoxControl::Dispatch( Reference< XDispatchProvider >( mxFrame->getController(), UNO_QUERY ),
147 : OUString( ".uno:XLineStyle" ),
148 0 : aArgs );
149 :
150 0 : nCurPos = GetSelectEntryPos();
151 0 : ReleaseFocus_Impl();
152 : }
153 0 : }
154 :
155 :
156 :
157 0 : bool SvxLineBox::PreNotify( NotifyEvent& rNEvt )
158 : {
159 0 : sal_uInt16 nType = rNEvt.GetType();
160 :
161 0 : switch(nType)
162 : {
163 : case EVENT_MOUSEBUTTONDOWN:
164 : case EVENT_GETFOCUS:
165 0 : nCurPos = GetSelectEntryPos();
166 0 : break;
167 : case EVENT_LOSEFOCUS:
168 0 : SelectEntryPos(nCurPos);
169 0 : break;
170 : case EVENT_KEYINPUT:
171 : {
172 0 : const KeyEvent* pKEvt = rNEvt.GetKeyEvent();
173 0 : if( pKEvt->GetKeyCode().GetCode() == KEY_TAB)
174 : {
175 0 : bRelease = false;
176 0 : Select();
177 : }
178 : }
179 0 : break;
180 : }
181 0 : return LineLB::PreNotify( rNEvt );
182 : }
183 :
184 :
185 :
186 0 : bool SvxLineBox::Notify( NotifyEvent& rNEvt )
187 : {
188 0 : bool nHandled = LineLB::Notify( rNEvt );
189 :
190 0 : if ( rNEvt.GetType() == EVENT_KEYINPUT )
191 : {
192 0 : const KeyEvent* pKEvt = rNEvt.GetKeyEvent();
193 :
194 0 : switch ( pKEvt->GetKeyCode().GetCode() )
195 : {
196 : case KEY_RETURN:
197 0 : Select();
198 0 : nHandled = true;
199 0 : break;
200 :
201 : case KEY_ESCAPE:
202 0 : SelectEntryPos( nCurPos );
203 0 : ReleaseFocus_Impl();
204 0 : nHandled = true;
205 0 : break;
206 : }
207 : }
208 0 : return nHandled;
209 : }
210 :
211 :
212 :
213 0 : void SvxLineBox::ReleaseFocus_Impl()
214 : {
215 0 : if(!bRelease)
216 : {
217 0 : bRelease = true;
218 0 : return;
219 : }
220 :
221 0 : if( SfxViewShell::Current() )
222 : {
223 0 : vcl::Window* pShellWnd = SfxViewShell::Current()->GetWindow();
224 :
225 0 : if ( pShellWnd )
226 0 : pShellWnd->GrabFocus();
227 : }
228 : }
229 :
230 0 : void SvxLineBox::DataChanged( const DataChangedEvent& rDCEvt )
231 : {
232 0 : if ( (rDCEvt.GetType() == DATACHANGED_SETTINGS) &&
233 0 : (rDCEvt.GetFlags() & SETTINGS_STYLE) )
234 : {
235 0 : SetSizePixel(LogicToPixel(aLogicalSize, MAP_APPFONT));
236 0 : Size aDropSize( aLogicalSize.Width(), LOGICAL_EDIT_HEIGHT);
237 0 : SetDropDownSizePixel(LogicToPixel(aDropSize, MAP_APPFONT));
238 : }
239 :
240 0 : LineLB::DataChanged( rDCEvt );
241 0 : }
242 :
243 105 : void SvxLineBox::FillControl()
244 : {
245 : // FillStyles();
246 105 : if ( !mpSh )
247 0 : mpSh = SfxObjectShell::Current();
248 :
249 105 : if( mpSh )
250 : {
251 105 : const SvxDashListItem* pItem = static_cast<const SvxDashListItem*>( mpSh->GetItem( SID_DASH_LIST ) );
252 105 : if ( pItem )
253 105 : Fill( pItem->GetDashList() );
254 : }
255 105 : }
256 :
257 126 : SvxMetricField::SvxMetricField(
258 : vcl::Window* pParent, const Reference< XFrame >& rFrame, WinBits nBits )
259 : : MetricField(pParent, nBits)
260 : , aCurTxt()
261 : , ePoolUnit(SFX_MAPUNIT_CM)
262 126 : , mxFrame(rFrame)
263 : {
264 126 : Size aSize = Size(GetTextWidth( OUString("99,99mm") ),GetTextHeight());
265 126 : aSize.Width() += 20;
266 126 : aSize.Height() += 6;
267 126 : SetSizePixel( aSize );
268 126 : aLogicalSize = PixelToLogic(aSize, MAP_APPFONT);
269 126 : SetUnit( FUNIT_MM );
270 126 : SetDecimalDigits( 2 );
271 126 : SetMax( 5000 );
272 126 : SetMin( 0 );
273 126 : SetLast( 5000 );
274 126 : SetFirst( 0 );
275 :
276 126 : eDlgUnit = SfxModule::GetModuleFieldUnit( mxFrame );
277 126 : SetFieldUnit( *this, eDlgUnit, false );
278 126 : Show();
279 126 : }
280 :
281 :
282 :
283 252 : SvxMetricField::~SvxMetricField()
284 : {
285 252 : }
286 :
287 :
288 :
289 66 : void SvxMetricField::Update( const XLineWidthItem* pItem )
290 : {
291 66 : if ( pItem )
292 : {
293 66 : if ( pItem->GetValue() != GetCoreValue( *this, ePoolUnit ) )
294 0 : SetMetricValue( *this, pItem->GetValue(), ePoolUnit );
295 : }
296 : else
297 0 : SetText( "" );
298 66 : }
299 :
300 :
301 :
302 0 : void SvxMetricField::Modify()
303 : {
304 0 : MetricField::Modify();
305 0 : long nTmp = GetCoreValue( *this, ePoolUnit );
306 0 : XLineWidthItem aLineWidthItem( nTmp );
307 :
308 0 : Any a;
309 0 : Sequence< PropertyValue > aArgs( 1 );
310 0 : aArgs[0].Name = "LineWidth";
311 0 : aLineWidthItem.QueryValue( a );
312 0 : aArgs[0].Value = a;
313 0 : SfxToolBoxControl::Dispatch( Reference< XDispatchProvider >( mxFrame->getController(), UNO_QUERY ),
314 : OUString( ".uno:LineWidth" ),
315 0 : aArgs );
316 0 : }
317 :
318 :
319 :
320 0 : void SvxMetricField::ReleaseFocus_Impl()
321 : {
322 0 : if( SfxViewShell::Current() )
323 : {
324 0 : vcl::Window* pShellWnd = SfxViewShell::Current()->GetWindow();
325 0 : if ( pShellWnd )
326 0 : pShellWnd->GrabFocus();
327 : }
328 0 : }
329 :
330 0 : void SvxMetricField::Down()
331 : {
332 0 : MetricField::Down();
333 0 : }
334 :
335 0 : void SvxMetricField::Up()
336 : {
337 0 : MetricField::Up();
338 0 : }
339 :
340 66 : void SvxMetricField::SetCoreUnit( SfxMapUnit eUnit )
341 : {
342 66 : ePoolUnit = eUnit;
343 66 : }
344 :
345 114 : void SvxMetricField::RefreshDlgUnit()
346 : {
347 114 : FieldUnit eTmpUnit = SfxModule::GetModuleFieldUnit( mxFrame );
348 114 : if ( eDlgUnit != eTmpUnit )
349 : {
350 0 : eDlgUnit = eTmpUnit;
351 0 : SetFieldUnit( *this, eDlgUnit, false );
352 : }
353 114 : }
354 :
355 0 : bool SvxMetricField::PreNotify( NotifyEvent& rNEvt )
356 : {
357 0 : sal_uInt16 nType = rNEvt.GetType();
358 :
359 0 : if ( EVENT_MOUSEBUTTONDOWN == nType || EVENT_GETFOCUS == nType )
360 0 : aCurTxt = GetText();
361 :
362 0 : return MetricField::PreNotify( rNEvt );
363 : }
364 :
365 :
366 :
367 0 : bool SvxMetricField::Notify( NotifyEvent& rNEvt )
368 : {
369 0 : bool nHandled = MetricField::Notify( rNEvt );
370 :
371 0 : if ( rNEvt.GetType() == EVENT_KEYINPUT )
372 : {
373 0 : const KeyEvent* pKEvt = rNEvt.GetKeyEvent();
374 0 : const vcl::KeyCode& rKey = pKEvt->GetKeyCode();
375 0 : SfxViewShell* pSh = SfxViewShell::Current();
376 :
377 0 : if ( rKey.GetModifier() && rKey.GetGroup() != KEYGROUP_CURSOR && pSh )
378 0 : pSh->KeyInput( *pKEvt );
379 : else
380 : {
381 0 : bool bHandled = false;
382 :
383 0 : switch ( rKey.GetCode() )
384 : {
385 : case KEY_RETURN:
386 0 : Reformat();
387 0 : bHandled = true;
388 0 : break;
389 :
390 : case KEY_ESCAPE:
391 0 : SetText( aCurTxt );
392 0 : bHandled = true;
393 0 : break;
394 : }
395 :
396 0 : if ( bHandled )
397 : {
398 0 : nHandled = true;
399 0 : Modify();
400 0 : ReleaseFocus_Impl();
401 : }
402 : }
403 : }
404 0 : return nHandled;
405 : }
406 :
407 0 : void SvxMetricField::DataChanged( const DataChangedEvent& rDCEvt )
408 : {
409 0 : if ( (rDCEvt.GetType() == DATACHANGED_SETTINGS) &&
410 0 : (rDCEvt.GetFlags() & SETTINGS_STYLE) )
411 : {
412 0 : SetSizePixel(LogicToPixel(aLogicalSize, MAP_APPFONT));
413 : }
414 :
415 0 : MetricField::DataChanged( rDCEvt );
416 0 : }
417 :
418 126 : SvxFillTypeBox::SvxFillTypeBox( vcl::Window* pParent, WinBits nBits ) :
419 : FillTypeLB( pParent, nBits | WB_TABSTOP ),
420 : nCurPos ( 0 ),
421 : bSelect ( false ),
422 126 : bRelease( true )
423 : {
424 126 : SetSizePixel( LogicToPixel( Size(40, 40 ),MAP_APPFONT ));
425 126 : Fill();
426 126 : SelectEntryPos( drawing::FillStyle_SOLID );
427 126 : Show();
428 126 : }
429 :
430 0 : extern "C" SAL_DLLPUBLIC_EXPORT vcl::Window* SAL_CALL makeSvxFillTypeBox(vcl::Window *pParent, VclBuilder::stringmap &)
431 : {
432 0 : return new SvxFillTypeBox(pParent);
433 : }
434 :
435 :
436 :
437 252 : SvxFillTypeBox::~SvxFillTypeBox()
438 : {
439 252 : }
440 :
441 :
442 :
443 0 : bool SvxFillTypeBox::PreNotify( NotifyEvent& rNEvt )
444 : {
445 0 : sal_uInt16 nType = rNEvt.GetType();
446 :
447 0 : if ( EVENT_MOUSEBUTTONDOWN == nType || EVENT_GETFOCUS == nType )
448 0 : nCurPos = GetSelectEntryPos();
449 0 : else if ( EVENT_LOSEFOCUS == nType
450 0 : && Application::GetFocusWindow()
451 0 : && !IsWindowOrChild( Application::GetFocusWindow(), true ) )
452 : {
453 0 : if ( !bSelect )
454 0 : SelectEntryPos( nCurPos );
455 : else
456 0 : bSelect = false;
457 : }
458 :
459 0 : return FillTypeLB::PreNotify( rNEvt );
460 : }
461 :
462 :
463 :
464 0 : bool SvxFillTypeBox::Notify( NotifyEvent& rNEvt )
465 : {
466 0 : bool nHandled = FillTypeLB::Notify( rNEvt );
467 :
468 0 : if ( rNEvt.GetType() == EVENT_KEYINPUT )
469 : {
470 0 : const KeyEvent* pKEvt = rNEvt.GetKeyEvent();
471 0 : switch ( pKEvt->GetKeyCode().GetCode() )
472 : {
473 : case KEY_RETURN:
474 0 : nHandled = true;
475 0 : ( (Link&)GetSelectHdl() ).Call( this );
476 0 : break;
477 : case KEY_TAB:
478 0 : bRelease = false;
479 0 : ( (Link&)GetSelectHdl() ).Call( this );
480 0 : bRelease = true;
481 0 : break;
482 :
483 : case KEY_ESCAPE:
484 0 : SelectEntryPos( nCurPos );
485 0 : ReleaseFocus_Impl();
486 0 : nHandled = true;
487 0 : break;
488 : }
489 : }
490 0 : return nHandled;
491 : }
492 :
493 :
494 :
495 0 : void SvxFillTypeBox::ReleaseFocus_Impl()
496 : {
497 0 : if( SfxViewShell::Current() )
498 : {
499 0 : vcl::Window* pShellWnd = SfxViewShell::Current()->GetWindow();
500 :
501 0 : if ( pShellWnd )
502 0 : pShellWnd->GrabFocus();
503 : }
504 0 : }
505 :
506 126 : SvxFillAttrBox::SvxFillAttrBox( vcl::Window* pParent, WinBits nBits ) :
507 : FillAttrLB( pParent, nBits | WB_TABSTOP ),
508 : nCurPos( 0 ),
509 126 : bRelease( true )
510 :
511 : {
512 126 : SetPosPixel( Point( 90, 0 ) );
513 126 : SetSizePixel( LogicToPixel( Size(50, 80 ), MAP_APPFONT ));
514 126 : Show();
515 126 : }
516 :
517 0 : extern "C" SAL_DLLPUBLIC_EXPORT vcl::Window* SAL_CALL makeSvxFillAttrBox(vcl::Window *pParent, VclBuilder::stringmap &)
518 : {
519 0 : return new SvxFillAttrBox(pParent);
520 : }
521 :
522 :
523 :
524 252 : SvxFillAttrBox::~SvxFillAttrBox()
525 : {
526 252 : }
527 :
528 :
529 :
530 0 : bool SvxFillAttrBox::PreNotify( NotifyEvent& rNEvt )
531 : {
532 0 : sal_uInt16 nType = rNEvt.GetType();
533 :
534 0 : if ( EVENT_MOUSEBUTTONDOWN == nType || EVENT_GETFOCUS == nType )
535 0 : nCurPos = GetSelectEntryPos();
536 :
537 0 : return FillAttrLB::PreNotify( rNEvt );
538 : }
539 :
540 :
541 :
542 0 : bool SvxFillAttrBox::Notify( NotifyEvent& rNEvt )
543 : {
544 0 : bool nHandled = FillAttrLB::Notify( rNEvt );
545 :
546 0 : if ( rNEvt.GetType() == EVENT_KEYINPUT )
547 : {
548 0 : const KeyEvent* pKEvt = rNEvt.GetKeyEvent();
549 :
550 0 : switch ( pKEvt->GetKeyCode().GetCode() )
551 : {
552 : case KEY_RETURN:
553 0 : ( (Link&)GetSelectHdl() ).Call( this );
554 0 : nHandled = true;
555 0 : break;
556 : case KEY_TAB:
557 0 : bRelease = false;
558 0 : GetSelectHdl().Call( this );
559 0 : bRelease = true;
560 0 : break;
561 : case KEY_ESCAPE:
562 0 : SelectEntryPos( nCurPos );
563 0 : ReleaseFocus_Impl();
564 0 : nHandled = true;
565 0 : break;
566 : }
567 : }
568 0 : return nHandled;
569 : }
570 :
571 :
572 :
573 0 : void SvxFillAttrBox::Select()
574 : {
575 0 : FillAttrLB::Select();
576 0 : }
577 :
578 :
579 :
580 0 : void SvxFillAttrBox::ReleaseFocus_Impl()
581 : {
582 0 : if( SfxViewShell::Current() )
583 : {
584 0 : vcl::Window* pShellWnd = SfxViewShell::Current()->GetWindow();
585 :
586 0 : if ( pShellWnd )
587 0 : pShellWnd->GrabFocus();
588 : }
589 594 : }
590 :
591 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|