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 : #include <vcl/builderfactory.hxx>
31 :
32 : #include <svx/dialogs.hrc>
33 :
34 : #define DELAY_TIMEOUT 100
35 :
36 : #include <svx/xlnclit.hxx>
37 : #include <svx/xlnwtit.hxx>
38 : #include <svx/xlineit0.hxx>
39 : #include <svx/xlndsit.hxx>
40 : #include <svx/xtable.hxx>
41 : #include "svx/drawitem.hxx"
42 : #include <svx/dialmgr.hxx>
43 : #include "svx/dlgutil.hxx"
44 : #include <svx/itemwin.hxx>
45 : #include "svx/linectrl.hxx"
46 : #include <svtools/colorcfg.hxx>
47 :
48 : using namespace ::com::sun::star;
49 : using namespace ::com::sun::star::uno;
50 : using namespace ::com::sun::star::frame;
51 : using namespace ::com::sun::star::util;
52 : using namespace ::com::sun::star::lang;
53 : using namespace ::com::sun::star::beans;
54 :
55 0 : SvxLineBox::SvxLineBox( vcl::Window* pParent, const Reference< XFrame >& rFrame, WinBits nBits ) :
56 : LineLB( pParent, nBits ),
57 : nCurPos ( 0 ),
58 : aLogicalSize(40,140),
59 : bRelease ( true ),
60 : mpSh ( NULL ),
61 0 : mxFrame ( rFrame )
62 : {
63 0 : SetSizePixel( LogicToPixel( aLogicalSize, MAP_APPFONT ));
64 0 : Show();
65 :
66 0 : aDelayTimer.SetTimeout( DELAY_TIMEOUT );
67 0 : aDelayTimer.SetTimeoutHdl( LINK( this, SvxLineBox, DelayHdl_Impl ) );
68 0 : aDelayTimer.Start();
69 0 : }
70 :
71 :
72 :
73 0 : IMPL_LINK_NOARG_TYPED(SvxLineBox, DelayHdl_Impl, Timer *, void)
74 : {
75 0 : if ( GetEntryCount() == 0 )
76 : {
77 0 : mpSh = SfxObjectShell::Current();
78 0 : FillControl();
79 : }
80 0 : }
81 :
82 :
83 :
84 0 : void SvxLineBox::Select()
85 : {
86 : // Call the parent's Select() member to trigger accessibility events.
87 0 : LineLB::Select();
88 :
89 0 : if ( !IsTravelSelect() )
90 : {
91 : drawing::LineStyle eXLS;
92 0 : sal_Int32 nPos = GetSelectEntryPos();
93 :
94 0 : switch ( nPos )
95 : {
96 : case 0:
97 0 : eXLS = drawing::LineStyle_NONE;
98 0 : break;
99 :
100 : case 1:
101 0 : eXLS = drawing::LineStyle_SOLID;
102 0 : break;
103 :
104 : default:
105 : {
106 0 : eXLS = drawing::LineStyle_DASH;
107 :
108 0 : if ( nPos != LISTBOX_ENTRY_NOTFOUND &&
109 0 : SfxObjectShell::Current() &&
110 0 : SfxObjectShell::Current()->GetItem( SID_DASH_LIST ) )
111 : {
112 : // LineDashItem will only be sent if it also has a dash.
113 : // Notify cares!
114 : SvxDashListItem aItem( *static_cast<const SvxDashListItem*>(
115 0 : SfxObjectShell::Current()->GetItem( SID_DASH_LIST ) ) );
116 : XLineDashItem aLineDashItem( GetSelectEntry(),
117 0 : aItem.GetDashList()->GetDash( nPos - 2 )->GetDash() );
118 :
119 0 : Any a;
120 0 : Sequence< PropertyValue > aArgs( 1 );
121 0 : aArgs[0].Name = "LineDash";
122 0 : aLineDashItem.QueryValue ( a );
123 0 : aArgs[0].Value = a;
124 0 : SfxToolBoxControl::Dispatch( Reference< XDispatchProvider >( mxFrame->getController(), UNO_QUERY ),
125 : OUString( ".uno:LineDash" ),
126 0 : aArgs );
127 : }
128 : }
129 0 : break;
130 : }
131 :
132 0 : XLineStyleItem aLineStyleItem( eXLS );
133 0 : Any a;
134 0 : Sequence< PropertyValue > aArgs( 1 );
135 0 : aArgs[0].Name = "XLineStyle";
136 0 : aLineStyleItem.QueryValue ( a );
137 0 : aArgs[0].Value = a;
138 0 : SfxToolBoxControl::Dispatch( Reference< XDispatchProvider >( mxFrame->getController(), UNO_QUERY ),
139 : OUString( ".uno:XLineStyle" ),
140 0 : aArgs );
141 :
142 0 : nCurPos = GetSelectEntryPos();
143 0 : ReleaseFocus_Impl();
144 : }
145 0 : }
146 :
147 :
148 :
149 0 : bool SvxLineBox::PreNotify( NotifyEvent& rNEvt )
150 : {
151 0 : MouseNotifyEvent nType = rNEvt.GetType();
152 :
153 0 : switch(nType)
154 : {
155 : case MouseNotifyEvent::MOUSEBUTTONDOWN:
156 : case MouseNotifyEvent::GETFOCUS:
157 0 : nCurPos = GetSelectEntryPos();
158 0 : break;
159 : case MouseNotifyEvent::LOSEFOCUS:
160 0 : SelectEntryPos(nCurPos);
161 0 : break;
162 : case MouseNotifyEvent::KEYINPUT:
163 : {
164 0 : const KeyEvent* pKEvt = rNEvt.GetKeyEvent();
165 0 : if( pKEvt->GetKeyCode().GetCode() == KEY_TAB)
166 : {
167 0 : bRelease = false;
168 0 : Select();
169 : }
170 : }
171 0 : break;
172 : default:
173 0 : break;
174 : }
175 0 : return LineLB::PreNotify( rNEvt );
176 : }
177 :
178 :
179 :
180 0 : bool SvxLineBox::Notify( NotifyEvent& rNEvt )
181 : {
182 0 : bool nHandled = LineLB::Notify( rNEvt );
183 :
184 0 : if ( rNEvt.GetType() == MouseNotifyEvent::KEYINPUT )
185 : {
186 0 : const KeyEvent* pKEvt = rNEvt.GetKeyEvent();
187 :
188 0 : switch ( pKEvt->GetKeyCode().GetCode() )
189 : {
190 : case KEY_RETURN:
191 0 : Select();
192 0 : nHandled = true;
193 0 : break;
194 :
195 : case KEY_ESCAPE:
196 0 : SelectEntryPos( nCurPos );
197 0 : ReleaseFocus_Impl();
198 0 : nHandled = true;
199 0 : break;
200 : }
201 : }
202 0 : return nHandled;
203 : }
204 :
205 :
206 :
207 0 : void SvxLineBox::ReleaseFocus_Impl()
208 : {
209 0 : if(!bRelease)
210 : {
211 0 : bRelease = true;
212 0 : return;
213 : }
214 :
215 0 : if( SfxViewShell::Current() )
216 : {
217 0 : vcl::Window* pShellWnd = SfxViewShell::Current()->GetWindow();
218 :
219 0 : if ( pShellWnd )
220 0 : pShellWnd->GrabFocus();
221 : }
222 : }
223 :
224 0 : void SvxLineBox::DataChanged( const DataChangedEvent& rDCEvt )
225 : {
226 0 : if ( (rDCEvt.GetType() == DataChangedEventType::SETTINGS) &&
227 0 : (rDCEvt.GetFlags() & AllSettingsFlags::STYLE) )
228 : {
229 0 : SetSizePixel(LogicToPixel(aLogicalSize, MAP_APPFONT));
230 : }
231 :
232 0 : LineLB::DataChanged( rDCEvt );
233 0 : }
234 :
235 0 : void SvxLineBox::FillControl()
236 : {
237 : // FillStyles();
238 0 : if ( !mpSh )
239 0 : mpSh = SfxObjectShell::Current();
240 :
241 0 : if( mpSh )
242 : {
243 0 : const SvxDashListItem* pItem = static_cast<const SvxDashListItem*>( mpSh->GetItem( SID_DASH_LIST ) );
244 0 : if ( pItem )
245 0 : Fill( pItem->GetDashList() );
246 : }
247 0 : }
248 :
249 0 : SvxMetricField::SvxMetricField(
250 : vcl::Window* pParent, const Reference< XFrame >& rFrame, WinBits nBits )
251 : : MetricField(pParent, nBits)
252 : , aCurTxt()
253 : , ePoolUnit(SFX_MAPUNIT_CM)
254 0 : , mxFrame(rFrame)
255 : {
256 0 : Size aSize = Size(GetTextWidth( OUString("99,99mm") ),GetTextHeight());
257 0 : aSize.Width() += 20;
258 0 : aSize.Height() += 6;
259 0 : SetSizePixel( aSize );
260 0 : aLogicalSize = PixelToLogic(aSize, MAP_APPFONT);
261 0 : SetUnit( FUNIT_MM );
262 0 : SetDecimalDigits( 2 );
263 0 : SetMax( 5000 );
264 0 : SetMin( 0 );
265 0 : SetLast( 5000 );
266 0 : SetFirst( 0 );
267 :
268 0 : eDlgUnit = SfxModule::GetModuleFieldUnit( mxFrame );
269 0 : SetFieldUnit( *this, eDlgUnit, false );
270 0 : Show();
271 0 : }
272 :
273 :
274 :
275 0 : void SvxMetricField::Update( const XLineWidthItem* pItem )
276 : {
277 0 : if ( pItem )
278 : {
279 0 : if ( pItem->GetValue() != GetCoreValue( *this, ePoolUnit ) )
280 0 : SetMetricValue( *this, pItem->GetValue(), ePoolUnit );
281 : }
282 : else
283 0 : SetText( "" );
284 0 : }
285 :
286 :
287 :
288 0 : void SvxMetricField::Modify()
289 : {
290 0 : MetricField::Modify();
291 0 : long nTmp = GetCoreValue( *this, ePoolUnit );
292 0 : XLineWidthItem aLineWidthItem( nTmp );
293 :
294 0 : Any a;
295 0 : Sequence< PropertyValue > aArgs( 1 );
296 0 : aArgs[0].Name = "LineWidth";
297 0 : aLineWidthItem.QueryValue( a );
298 0 : aArgs[0].Value = a;
299 0 : SfxToolBoxControl::Dispatch( Reference< XDispatchProvider >( mxFrame->getController(), UNO_QUERY ),
300 : OUString( ".uno:LineWidth" ),
301 0 : aArgs );
302 0 : }
303 :
304 :
305 :
306 0 : void SvxMetricField::ReleaseFocus_Impl()
307 : {
308 0 : if( SfxViewShell::Current() )
309 : {
310 0 : vcl::Window* pShellWnd = SfxViewShell::Current()->GetWindow();
311 0 : if ( pShellWnd )
312 0 : pShellWnd->GrabFocus();
313 : }
314 0 : }
315 :
316 0 : void SvxMetricField::Down()
317 : {
318 0 : MetricField::Down();
319 0 : }
320 :
321 0 : void SvxMetricField::Up()
322 : {
323 0 : MetricField::Up();
324 0 : }
325 :
326 0 : void SvxMetricField::SetCoreUnit( SfxMapUnit eUnit )
327 : {
328 0 : ePoolUnit = eUnit;
329 0 : }
330 :
331 0 : void SvxMetricField::RefreshDlgUnit()
332 : {
333 0 : FieldUnit eTmpUnit = SfxModule::GetModuleFieldUnit( mxFrame );
334 0 : if ( eDlgUnit != eTmpUnit )
335 : {
336 0 : eDlgUnit = eTmpUnit;
337 0 : SetFieldUnit( *this, eDlgUnit, false );
338 : }
339 0 : }
340 :
341 0 : bool SvxMetricField::PreNotify( NotifyEvent& rNEvt )
342 : {
343 0 : MouseNotifyEvent nType = rNEvt.GetType();
344 :
345 0 : if ( MouseNotifyEvent::MOUSEBUTTONDOWN == nType || MouseNotifyEvent::GETFOCUS == nType )
346 0 : aCurTxt = GetText();
347 :
348 0 : return MetricField::PreNotify( rNEvt );
349 : }
350 :
351 :
352 :
353 0 : bool SvxMetricField::Notify( NotifyEvent& rNEvt )
354 : {
355 0 : bool nHandled = MetricField::Notify( rNEvt );
356 :
357 0 : if ( rNEvt.GetType() == MouseNotifyEvent::KEYINPUT )
358 : {
359 0 : const KeyEvent* pKEvt = rNEvt.GetKeyEvent();
360 0 : const vcl::KeyCode& rKey = pKEvt->GetKeyCode();
361 0 : SfxViewShell* pSh = SfxViewShell::Current();
362 :
363 0 : if ( rKey.GetModifier() && rKey.GetGroup() != KEYGROUP_CURSOR && pSh )
364 0 : (void)pSh->KeyInput( *pKEvt );
365 : else
366 : {
367 0 : bool bHandled = false;
368 :
369 0 : switch ( rKey.GetCode() )
370 : {
371 : case KEY_RETURN:
372 0 : Reformat();
373 0 : bHandled = true;
374 0 : break;
375 :
376 : case KEY_ESCAPE:
377 0 : SetText( aCurTxt );
378 0 : bHandled = true;
379 0 : break;
380 : }
381 :
382 0 : if ( bHandled )
383 : {
384 0 : nHandled = true;
385 0 : Modify();
386 0 : ReleaseFocus_Impl();
387 : }
388 : }
389 : }
390 0 : return nHandled;
391 : }
392 :
393 0 : void SvxMetricField::DataChanged( const DataChangedEvent& rDCEvt )
394 : {
395 0 : if ( (rDCEvt.GetType() == DataChangedEventType::SETTINGS) &&
396 0 : (rDCEvt.GetFlags() & AllSettingsFlags::STYLE) )
397 : {
398 0 : SetSizePixel(LogicToPixel(aLogicalSize, MAP_APPFONT));
399 : }
400 :
401 0 : MetricField::DataChanged( rDCEvt );
402 0 : }
403 :
404 51 : SvxFillTypeBox::SvxFillTypeBox( vcl::Window* pParent, WinBits nBits ) :
405 : FillTypeLB( pParent, nBits | WB_TABSTOP ),
406 : nCurPos ( 0 ),
407 : bSelect ( false ),
408 51 : bRelease( true )
409 : {
410 51 : SetSizePixel( LogicToPixel( Size(40, 40 ),MAP_APPFONT ));
411 51 : Fill();
412 51 : SelectEntryPos( drawing::FillStyle_SOLID );
413 51 : Show();
414 51 : }
415 :
416 1 : VCL_BUILDER_FACTORY(SvxFillTypeBox)
417 :
418 0 : bool SvxFillTypeBox::PreNotify( NotifyEvent& rNEvt )
419 : {
420 0 : MouseNotifyEvent nType = rNEvt.GetType();
421 :
422 0 : if ( MouseNotifyEvent::MOUSEBUTTONDOWN == nType || MouseNotifyEvent::GETFOCUS == nType )
423 0 : nCurPos = GetSelectEntryPos();
424 0 : else if ( MouseNotifyEvent::LOSEFOCUS == nType
425 0 : && Application::GetFocusWindow()
426 0 : && !IsWindowOrChild( Application::GetFocusWindow(), true ) )
427 : {
428 0 : if ( !bSelect )
429 0 : SelectEntryPos( nCurPos );
430 : else
431 0 : bSelect = false;
432 : }
433 :
434 0 : return FillTypeLB::PreNotify( rNEvt );
435 : }
436 :
437 :
438 :
439 102 : bool SvxFillTypeBox::Notify( NotifyEvent& rNEvt )
440 : {
441 102 : bool nHandled = FillTypeLB::Notify( rNEvt );
442 :
443 102 : if ( rNEvt.GetType() == MouseNotifyEvent::KEYINPUT )
444 : {
445 0 : const KeyEvent* pKEvt = rNEvt.GetKeyEvent();
446 0 : switch ( pKEvt->GetKeyCode().GetCode() )
447 : {
448 : case KEY_RETURN:
449 0 : nHandled = true;
450 0 : ( (Link<>&)GetSelectHdl() ).Call( this );
451 0 : break;
452 : case KEY_TAB:
453 0 : bRelease = false;
454 0 : ( (Link<>&)GetSelectHdl() ).Call( this );
455 0 : bRelease = true;
456 0 : break;
457 :
458 : case KEY_ESCAPE:
459 0 : SelectEntryPos( nCurPos );
460 0 : ReleaseFocus_Impl();
461 0 : nHandled = true;
462 0 : break;
463 : }
464 : }
465 102 : return nHandled;
466 : }
467 :
468 :
469 :
470 0 : void SvxFillTypeBox::ReleaseFocus_Impl()
471 : {
472 0 : if( SfxViewShell::Current() )
473 : {
474 0 : vcl::Window* pShellWnd = SfxViewShell::Current()->GetWindow();
475 :
476 0 : if ( pShellWnd )
477 0 : pShellWnd->GrabFocus();
478 : }
479 0 : }
480 :
481 51 : SvxFillAttrBox::SvxFillAttrBox( vcl::Window* pParent, WinBits nBits ) :
482 : FillAttrLB( pParent, nBits | WB_TABSTOP ),
483 : nCurPos( 0 ),
484 51 : bRelease( true )
485 :
486 : {
487 51 : SetPosPixel( Point( 90, 0 ) );
488 51 : SetSizePixel( LogicToPixel( Size(50, 80 ), MAP_APPFONT ));
489 51 : Show();
490 51 : }
491 :
492 1 : VCL_BUILDER_FACTORY(SvxFillAttrBox)
493 :
494 0 : bool SvxFillAttrBox::PreNotify( NotifyEvent& rNEvt )
495 : {
496 0 : MouseNotifyEvent nType = rNEvt.GetType();
497 :
498 0 : if ( MouseNotifyEvent::MOUSEBUTTONDOWN == nType || MouseNotifyEvent::GETFOCUS == nType )
499 0 : nCurPos = GetSelectEntryPos();
500 :
501 0 : return FillAttrLB::PreNotify( rNEvt );
502 : }
503 :
504 :
505 :
506 102 : bool SvxFillAttrBox::Notify( NotifyEvent& rNEvt )
507 : {
508 102 : bool nHandled = FillAttrLB::Notify( rNEvt );
509 :
510 102 : if ( rNEvt.GetType() == MouseNotifyEvent::KEYINPUT )
511 : {
512 0 : const KeyEvent* pKEvt = rNEvt.GetKeyEvent();
513 :
514 0 : switch ( pKEvt->GetKeyCode().GetCode() )
515 : {
516 : case KEY_RETURN:
517 0 : ( (Link<>&)GetSelectHdl() ).Call( this );
518 0 : nHandled = true;
519 0 : break;
520 : case KEY_TAB:
521 0 : bRelease = false;
522 0 : GetSelectHdl().Call( this );
523 0 : bRelease = true;
524 0 : break;
525 : case KEY_ESCAPE:
526 0 : SelectEntryPos( nCurPos );
527 0 : ReleaseFocus_Impl();
528 0 : nHandled = true;
529 0 : break;
530 : }
531 : }
532 102 : return nHandled;
533 : }
534 :
535 :
536 :
537 0 : void SvxFillAttrBox::Select()
538 : {
539 0 : FillAttrLB::Select();
540 0 : }
541 :
542 :
543 :
544 0 : void SvxFillAttrBox::ReleaseFocus_Impl()
545 : {
546 0 : if( SfxViewShell::Current() )
547 : {
548 0 : vcl::Window* pShellWnd = SfxViewShell::Current()->GetWindow();
549 :
550 0 : if ( pShellWnd )
551 0 : pShellWnd->GrabFocus();
552 : }
553 390 : }
554 :
555 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|