xref: /trunk/main/svx/source/tbxctrls/itemwin.cxx (revision a893be29343ee97512d484e6e8fefa91df2b44cb)
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_svx.hxx"
26 
27 // include ---------------------------------------------------------------
28 #include <tools/shl.hxx>
29 #include <sfx2/dispatch.hxx>
30 #include <sfx2/objsh.hxx>
31 #include <sfx2/viewsh.hxx>
32 #include <sfx2/module.hxx>
33 #include <tools/urlobj.hxx>
34 
35 #define _SVX_ITEMWIN_CXX
36 
37 #include <vcl/svapp.hxx>
38 
39 #include <svx/dialogs.hrc>
40 
41 #define DELAY_TIMEOUT           100
42 
43 #include <svx/xlnclit.hxx>
44 #include <svx/xlnwtit.hxx>
45 #include <svx/xlineit0.hxx>
46 #include <svx/xlndsit.hxx>
47 #include <svx/xtable.hxx>
48 #include "svx/drawitem.hxx"
49 #include <svx/dialmgr.hxx>
50 #include "svx/dlgutil.hxx"
51 #include <svx/itemwin.hxx>
52 #include "svx/linectrl.hxx"
53 #include <svtools/colorcfg.hxx>
54 
55 using namespace ::com::sun::star::uno;
56 using namespace ::com::sun::star::frame;
57 using namespace ::com::sun::star::util;
58 using namespace ::com::sun::star::lang;
59 using namespace ::com::sun::star::beans;
60 
61 #define LOGICAL_EDIT_HEIGHT         12
62 //========================================================================
63 // SvxLineBox
64 //========================================================================
65 
66 SvxLineBox::SvxLineBox( Window* pParent, const Reference< XFrame >& rFrame, WinBits nBits ) :
67     LineLB( pParent, nBits ),
68     meBmpMode   ( GetSettings().GetStyleSettings().GetHighContrastMode() ? BMP_COLOR_HIGHCONTRAST : BMP_COLOR_NORMAL ),
69     nCurPos     ( 0 ),
70     aLogicalSize(40,140),
71     bRelease    ( sal_True ),
72     mpSh        ( NULL ),
73     mxFrame     ( rFrame )
74 {
75     SetSizePixel( LogicToPixel( aLogicalSize, MAP_APPFONT ));
76     Show();
77 
78     aDelayTimer.SetTimeout( DELAY_TIMEOUT );
79     aDelayTimer.SetTimeoutHdl( LINK( this, SvxLineBox, DelayHdl_Impl ) );
80     aDelayTimer.Start();
81 }
82 
83 // -----------------------------------------------------------------------
84 
85 SvxLineBox::~SvxLineBox()
86 {
87 }
88 
89 // -----------------------------------------------------------------------
90 
91 IMPL_LINK( SvxLineBox, DelayHdl_Impl, Timer *, EMPTYARG )
92 {
93     if ( GetEntryCount() == 0 )
94     {
95         mpSh = SfxObjectShell::Current();
96         FillControl();
97     }
98     return 0;
99 }
100 
101 // -----------------------------------------------------------------------
102 
103 void SvxLineBox::Select()
104 {
105     // Call the parent's Select() member to trigger accessibility events.
106     LineLB::Select();
107 
108     if ( !IsTravelSelect() )
109     {
110         XLineStyle eXLS;
111         sal_uInt16 nPos = GetSelectEntryPos();
112 //      SfxDispatcher* pDisp = rBindings.GetDispatcher();
113         //DBG_ASSERT( pDisp, "invalid Dispatcher" );
114 
115         switch ( nPos )
116         {
117             case 0:
118                 eXLS = XLINE_NONE;
119                 break;
120 
121             case 1:
122                 eXLS = XLINE_SOLID;
123                 break;
124 
125             default:
126             {
127                 eXLS = XLINE_DASH;
128 
129                 if ( nPos != LISTBOX_ENTRY_NOTFOUND &&
130                      SfxObjectShell::Current()  &&
131                      SfxObjectShell::Current()->GetItem( SID_DASH_LIST ) )
132                 {
133                     // LineDashItem wird nur geschickt, wenn es auch einen Dash besitzt.
134                     // Notify k"ummert sich darum!
135                     SvxDashListItem aItem( *(const SvxDashListItem*)(
136                         SfxObjectShell::Current()->GetItem( SID_DASH_LIST ) ) );
137                     XLineDashItem aLineDashItem( GetSelectEntry(),
138                         aItem.GetDashList()->GetDash( nPos - 2 )->GetDash() );
139 
140                     Any a;
141                     Sequence< PropertyValue > aArgs( 1 );
142                     aArgs[0].Name = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "LineDash" ));
143                     aLineDashItem.QueryValue ( a );
144                     aArgs[0].Value = a;
145                     SfxToolBoxControl::Dispatch( Reference< XDispatchProvider >( mxFrame->getController(), UNO_QUERY ),
146                                                  ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:LineDash" )),
147                                                  aArgs );
148 //                    pDisp->Execute( SID_ATTR_LINE_DASH, SFX_CALLMODE_RECORD, &aLineDashItem, 0L );
149                 }
150             }
151             break;
152         }
153 
154         XLineStyleItem aLineStyleItem( eXLS );
155         Any a;
156         Sequence< PropertyValue > aArgs( 1 );
157         aArgs[0].Name = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "XLineStyle" ));
158         aLineStyleItem.QueryValue ( a );
159         aArgs[0].Value = a;
160         SfxToolBoxControl::Dispatch( Reference< XDispatchProvider >( mxFrame->getController(), UNO_QUERY ),
161                                      ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:XLineStyle" )),
162                                      aArgs );
163 //      pDisp->Execute( SID_ATTR_LINE_STYLE, SFX_CALLMODE_RECORD, &aLineStyleItem, 0L );
164 
165         nCurPos = GetSelectEntryPos();
166         ReleaseFocus_Impl();
167     }
168 }
169 
170 // -----------------------------------------------------------------------
171 
172 long SvxLineBox::PreNotify( NotifyEvent& rNEvt )
173 {
174     sal_uInt16 nType = rNEvt.GetType();
175 
176     switch(nType)
177     {
178         case EVENT_MOUSEBUTTONDOWN:
179         case EVENT_GETFOCUS:
180             nCurPos = GetSelectEntryPos();
181         break;
182         case EVENT_LOSEFOCUS:
183             SelectEntryPos(nCurPos);
184         break;
185         case EVENT_KEYINPUT:
186         {
187             const KeyEvent* pKEvt = rNEvt.GetKeyEvent();
188             if( pKEvt->GetKeyCode().GetCode() == KEY_TAB)
189             {
190                 bRelease = sal_False;
191                 Select();
192             }
193         }
194         break;
195     }
196     return LineLB::PreNotify( rNEvt );
197 }
198 
199 // -----------------------------------------------------------------------
200 
201 long SvxLineBox::Notify( NotifyEvent& rNEvt )
202 {
203     long nHandled = LineLB::Notify( rNEvt );
204 
205     if ( rNEvt.GetType() == EVENT_KEYINPUT )
206     {
207         const KeyEvent* pKEvt = rNEvt.GetKeyEvent();
208 
209         switch ( pKEvt->GetKeyCode().GetCode() )
210         {
211             case KEY_RETURN:
212                 Select();
213                 nHandled = 1;
214                 break;
215 
216             case KEY_ESCAPE:
217                 SelectEntryPos( nCurPos );
218                 ReleaseFocus_Impl();
219                 nHandled = 1;
220                 break;
221         }
222     }
223     return nHandled;
224 }
225 
226 // -----------------------------------------------------------------------
227 
228 void SvxLineBox::ReleaseFocus_Impl()
229 {
230     if(!bRelease)
231     {
232         bRelease = sal_True;
233         return;
234     }
235 
236     if( SfxViewShell::Current() )
237     {
238         Window* pShellWnd = SfxViewShell::Current()->GetWindow();
239 
240         if ( pShellWnd )
241             pShellWnd->GrabFocus();
242     }
243 }
244 /* -----------------------------08.03.2002 15:39------------------------------
245 
246  ---------------------------------------------------------------------------*/
247 void SvxLineBox::DataChanged( const DataChangedEvent& rDCEvt )
248 {
249     if ( (rDCEvt.GetType() == DATACHANGED_SETTINGS) &&
250          (rDCEvt.GetFlags() & SETTINGS_STYLE) )
251     {
252         SetSizePixel(LogicToPixel(aLogicalSize, MAP_APPFONT));
253         Size aDropSize( aLogicalSize.Width(), LOGICAL_EDIT_HEIGHT);
254         SetDropDownSizePixel(LogicToPixel(aDropSize, MAP_APPFONT));
255    }
256 
257     LineLB::DataChanged( rDCEvt );
258 
259     if ( (rDCEvt.GetType() == DATACHANGED_SETTINGS) &&
260          (rDCEvt.GetFlags() & SETTINGS_STYLE) )
261     {
262         BmpColorMode eMode = GetSettings().GetStyleSettings().GetHighContrastMode() ? BMP_COLOR_HIGHCONTRAST : BMP_COLOR_NORMAL;
263         if( eMode != meBmpMode )
264         {
265             meBmpMode = eMode;
266             FillControl();
267         }
268     }
269 }
270 
271 void SvxLineBox::FillControl()
272 {
273     // FillStyles();
274     if ( !mpSh )
275         mpSh = SfxObjectShell::Current();
276 
277     if( mpSh )
278     {
279         const SvxDashListItem* pItem = (const SvxDashListItem*)( mpSh->GetItem( SID_DASH_LIST ) );
280         if ( pItem )
281             Fill( pItem->GetDashList() );
282     }
283 
284 
285 //  rBindings.Invalidate( SID_ATTR_LINE_DASH );
286 }
287 //========================================================================
288 // SvxColorBox
289 //========================================================================
290 
291 SvxColorBox::SvxColorBox(
292     Window* pParent,
293     const ::rtl::OUString& rCommand,
294     const Reference< XFrame >& rFrame,
295     WinBits nBits ) :
296     ColorLB( pParent, nBits ),
297     nCurPos     ( 0 ),
298     aLogicalSize(45,80),
299     bRelease    ( sal_True ),
300     maCommand   ( rCommand ),
301     mxFrame     ( rFrame )
302 {
303     SetSizePixel( LogicToPixel( aLogicalSize , MAP_APPFONT));
304     Show();
305 
306     SfxObjectShell* pSh = SfxObjectShell::Current();
307 
308     if ( pSh )
309     {
310         const SvxColorTableItem* pItem =
311             (const SvxColorTableItem*)( pSh->GetItem( SID_COLOR_TABLE ) );
312         if(pItem)
313             Fill( pItem->GetColorTable() );
314     }
315 }
316 
317 // -----------------------------------------------------------------------
318 
319 IMPL_LINK( SvxColorBox, DelayHdl_Impl, Timer *, EMPTYARG )
320 {
321     SfxObjectShell* pSh = SfxObjectShell::Current();
322 
323     if ( pSh )
324     {
325         const SvxColorTableItem* pItem = (const SvxColorTableItem*)( pSh->GetItem( SID_COLOR_TABLE ) );
326         if ( pItem )
327             Fill( pItem->GetColorTable() );
328 //      rBindings.Invalidate( nId );
329     }
330     return 0;
331 }
332 
333 // -----------------------------------------------------------------------
334 
335 SvxColorBox::~SvxColorBox()
336 {
337 }
338 
339 // -----------------------------------------------------------------------
340 
341 void SvxColorBox::Update( const XLineColorItem* pItem )
342 {
343     if ( pItem )
344         SelectEntry( pItem->GetColorValue() );
345     else
346         SetNoSelection();
347 }
348 
349 // -----------------------------------------------------------------------
350 
351 void SvxColorBox::Select()
352 {
353     // OJ: base class call needed here because otherwise no event is send for accessibility
354     ColorLB::Select();
355     if ( !IsTravelSelect() )
356     {
357         XLineColorItem aLineColorItem( GetSelectEntry(), GetSelectEntryColor() );
358 
359         INetURLObject aObj( maCommand );
360 
361         Any a;
362         Sequence< PropertyValue > aArgs( 1 );
363         aArgs[0].Name = aObj.GetURLPath();
364         aLineColorItem.QueryValue( a );
365         aArgs[0].Value = a;
366         SfxToolBoxControl::Dispatch( Reference< XDispatchProvider >( mxFrame->getController(), UNO_QUERY ),
367                                      maCommand,
368                                      aArgs );
369 //        rBindings.GetDispatcher()->Execute( nId, SFX_CALLMODE_RECORD, &aLineColorItem, 0L );
370 
371         nCurPos = GetSelectEntryPos();
372         ReleaseFocus_Impl();
373     }
374 }
375 
376 // -----------------------------------------------------------------------
377 
378 long SvxColorBox::PreNotify( NotifyEvent& rNEvt )
379 {
380     sal_uInt16 nType = rNEvt.GetType();
381 
382     switch(nType)
383     {
384         case  EVENT_MOUSEBUTTONDOWN:
385         case EVENT_GETFOCUS:
386             nCurPos = GetSelectEntryPos();
387         break;
388         case EVENT_LOSEFOCUS:
389             SelectEntryPos(nCurPos);
390         break;
391         case EVENT_KEYINPUT:
392         {
393             const KeyEvent* pKEvt = rNEvt.GetKeyEvent();
394 
395             if( pKEvt->GetKeyCode().GetCode() == KEY_TAB)
396             {
397                 bRelease = sal_False;
398                 Select();
399             }
400         }
401     }
402 
403     return ColorLB::PreNotify( rNEvt );
404 }
405 
406 // -----------------------------------------------------------------------
407 
408 long SvxColorBox::Notify( NotifyEvent& rNEvt )
409 {
410     long nHandled = ColorLB::Notify( rNEvt );
411 
412     if ( rNEvt.GetType() == EVENT_KEYINPUT )
413     {
414         const KeyEvent* pKEvt = rNEvt.GetKeyEvent();
415 
416         switch ( pKEvt->GetKeyCode().GetCode() )
417         {
418             case KEY_RETURN:
419                 Select();
420                 nHandled = 1;
421                 break;
422 
423             case KEY_ESCAPE:
424                 SelectEntryPos( nCurPos );
425                 ReleaseFocus_Impl();
426                 nHandled = 1;
427                 break;
428         }
429     }
430     return nHandled;
431 }
432 /* -----------------------------08.03.2002 15:35------------------------------
433 
434  ---------------------------------------------------------------------------*/
435 void SvxColorBox::DataChanged( const DataChangedEvent& rDCEvt )
436 {
437     if ( (rDCEvt.GetType() == DATACHANGED_SETTINGS) &&
438          (rDCEvt.GetFlags() & SETTINGS_STYLE) )
439     {
440         SetSizePixel(LogicToPixel(aLogicalSize, MAP_APPFONT));
441         Size aDropSize( aLogicalSize.Width(), LOGICAL_EDIT_HEIGHT);
442         SetDropDownSizePixel(LogicToPixel(aDropSize, MAP_APPFONT));
443     }
444 
445     ColorLB::DataChanged( rDCEvt );
446 }
447 // -----------------------------------------------------------------------
448 
449 void SvxColorBox::ReleaseFocus_Impl()
450 {
451     if(!bRelease)
452     {
453         bRelease = sal_True;
454         return;
455     }
456 
457     if( SfxViewShell::Current() )
458     {
459         Window* pShellWnd = SfxViewShell::Current()->GetWindow();
460 
461         if ( pShellWnd )
462             pShellWnd->GrabFocus();
463     }
464 }
465 
466 //========================================================================
467 // SvxMetricField
468 //========================================================================
469 
470 SvxMetricField::SvxMetricField(
471     Window* pParent, const Reference< XFrame >& rFrame, WinBits nBits ) :
472     MetricField( pParent, nBits ),
473     aCurTxt( String() ),
474     mxFrame( rFrame )
475 {
476     Size aSize = Size(GetTextWidth( String::CreateFromAscii("99,99mm") ),GetTextHeight());
477     aSize.Width() += 20;
478     aSize.Height() += 6;
479     SetSizePixel( aSize );
480     aLogicalSize = PixelToLogic(aSize, MAP_APPFONT);
481     SetUnit( FUNIT_MM );
482     SetDecimalDigits( 2 );
483     SetMax( 5000 );
484     SetMin( 0 );
485     SetLast( 5000 );
486     SetFirst( 0 );
487 
488     eDlgUnit = SfxModule::GetModuleFieldUnit( mxFrame );
489     SetFieldUnit( *this, eDlgUnit, sal_False );
490     Show();
491 }
492 
493 // -----------------------------------------------------------------------
494 
495 SvxMetricField::~SvxMetricField()
496 {
497 }
498 
499 // -----------------------------------------------------------------------
500 
501 void SvxMetricField::Update( const XLineWidthItem* pItem )
502 {
503     if ( pItem )
504     {
505         if ( pItem->GetValue() != GetCoreValue( *this, ePoolUnit ) )
506             SetMetricValue( *this, pItem->GetValue(), ePoolUnit );
507     }
508     else
509         SetText( String() );
510 }
511 
512 // -----------------------------------------------------------------------
513 
514 void SvxMetricField::Modify()
515 {
516     MetricField::Modify();
517     long nTmp = GetCoreValue( *this, ePoolUnit );
518     XLineWidthItem aLineWidthItem( nTmp );
519 
520     Any a;
521     Sequence< PropertyValue > aArgs( 1 );
522     aArgs[0].Name = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "LineWidth" ));
523     aLineWidthItem.QueryValue( a );
524     aArgs[0].Value = a;
525     SfxToolBoxControl::Dispatch( Reference< XDispatchProvider >( mxFrame->getController(), UNO_QUERY ),
526                                  ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:LineWidth" )),
527                                  aArgs );
528 //  rBindings.GetDispatcher()->Execute( SID_ATTR_LINE_WIDTH, SFX_CALLMODE_RECORD, &aLineWidthItem, 0L );
529 }
530 
531 // -----------------------------------------------------------------------
532 
533 void SvxMetricField::ReleaseFocus_Impl()
534 {
535     if( SfxViewShell::Current() )
536     {
537         Window* pShellWnd = SfxViewShell::Current()->GetWindow();
538         if ( pShellWnd )
539             pShellWnd->GrabFocus();
540     }
541 }
542 
543 // -----------------------------------------------------------------------
544 
545 void SvxMetricField::Down()
546 {
547     // #124425# make the OS2 case OS2-only (if still needed); under
548     // non-OS2 it prevents the value to go to zero on down presses,
549     // s do not use there. Also added a fix for OS2, but could not test
550 #ifdef OS2
551     const sal_Int64 nValue(GetValue() - GetSpinSize());
552 
553     // prevent a jump to spin max on OS2
554     if ( nValue >= GetMin() )
555     {
556         MetricField::Down();
557     }
558     else if ( nValue < GetMin() )
559     {
560         // still set to GetMin() when spin min is reached
561         SetMetricValue( *this, GetMin(), ePoolUnit );
562     }
563 
564 #else
565     MetricField::Down();
566 #endif
567 }
568 
569 // -----------------------------------------------------------------------
570 
571 void SvxMetricField::Up()
572 {
573     MetricField::Up();
574 }
575 
576 // -----------------------------------------------------------------------
577 
578 void SvxMetricField::SetCoreUnit( SfxMapUnit eUnit )
579 {
580     ePoolUnit = eUnit;
581 }
582 
583 // -----------------------------------------------------------------------
584 
585 void SvxMetricField::RefreshDlgUnit()
586 {
587     FieldUnit eTmpUnit = SfxModule::GetModuleFieldUnit( mxFrame );
588     if ( eDlgUnit != eTmpUnit )
589     {
590         eDlgUnit = eTmpUnit;
591         SetFieldUnit( *this, eDlgUnit, sal_False );
592     }
593 }
594 
595 // -----------------------------------------------------------------------
596 
597 long SvxMetricField::PreNotify( NotifyEvent& rNEvt )
598 {
599     sal_uInt16 nType = rNEvt.GetType();
600 
601     if ( EVENT_MOUSEBUTTONDOWN == nType || EVENT_GETFOCUS == nType )
602         aCurTxt = GetText();
603 
604     return MetricField::PreNotify( rNEvt );
605 }
606 
607 // -----------------------------------------------------------------------
608 
609 long SvxMetricField::Notify( NotifyEvent& rNEvt )
610 {
611     long nHandled = MetricField::Notify( rNEvt );
612 
613     if ( rNEvt.GetType() == EVENT_KEYINPUT )
614     {
615         const KeyEvent* pKEvt = rNEvt.GetKeyEvent();
616         const KeyCode& rKey = pKEvt->GetKeyCode();
617         SfxViewShell* pSh = SfxViewShell::Current();
618 
619         if ( rKey.GetModifier() && rKey.GetGroup() != KEYGROUP_CURSOR && pSh )
620             pSh->KeyInput( *pKEvt );
621         else
622         {
623             bool bHandled = sal_False;
624 
625             switch ( rKey.GetCode() )
626             {
627                 case KEY_RETURN:
628                     Reformat();
629                     bHandled = sal_True;
630                     break;
631 
632                 case KEY_ESCAPE:
633                     SetText( aCurTxt );
634                     bHandled = sal_True;
635                     break;
636             }
637 
638             if ( bHandled )
639             {
640                 nHandled = 1;
641                 Modify();
642                 ReleaseFocus_Impl();
643             }
644         }
645     }
646     return nHandled;
647 }
648 /* -----------------------------08.03.2002 15:32------------------------------
649 
650  ---------------------------------------------------------------------------*/
651 void SvxMetricField::DataChanged( const DataChangedEvent& rDCEvt )
652 {
653     if ( (rDCEvt.GetType() == DATACHANGED_SETTINGS) &&
654          (rDCEvt.GetFlags() & SETTINGS_STYLE) )
655     {
656         SetSizePixel(LogicToPixel(aLogicalSize, MAP_APPFONT));
657     }
658 
659     MetricField::DataChanged( rDCEvt );
660 }
661 
662 //========================================================================
663 // SvxFillTypeBox
664 //========================================================================
665 
666 SvxFillTypeBox::SvxFillTypeBox( Window* pParent, WinBits nBits ) :
667     FillTypeLB( pParent, nBits | WB_TABSTOP ),
668     nCurPos ( 0 ),
669     bSelect ( sal_False ),
670     bRelease(sal_True)
671 {
672     SetSizePixel( LogicToPixel( Size(40, 40 ),MAP_APPFONT ));
673     Fill();
674     SelectEntryPos( XFILL_SOLID );
675     Show();
676 }
677 
678 // -----------------------------------------------------------------------
679 
680 SvxFillTypeBox::~SvxFillTypeBox()
681 {
682 }
683 
684 // -----------------------------------------------------------------------
685 
686 long SvxFillTypeBox::PreNotify( NotifyEvent& rNEvt )
687 {
688     sal_uInt16 nType = rNEvt.GetType();
689 
690     if ( EVENT_MOUSEBUTTONDOWN == nType || EVENT_GETFOCUS == nType )
691         nCurPos = GetSelectEntryPos();
692     else if ( EVENT_LOSEFOCUS == nType
693         && Application::GetFocusWindow()
694         && !IsWindowOrChild( Application::GetFocusWindow(), sal_True ) )
695     {
696         if ( !bSelect )
697             SelectEntryPos( nCurPos );
698         else
699             bSelect = sal_False;
700     }
701 
702     return FillTypeLB::PreNotify( rNEvt );
703 }
704 
705 // -----------------------------------------------------------------------
706 
707 long SvxFillTypeBox::Notify( NotifyEvent& rNEvt )
708 {
709     long nHandled = FillTypeLB::Notify( rNEvt );
710 
711     if ( rNEvt.GetType() == EVENT_KEYINPUT )
712     {
713         const KeyEvent* pKEvt = rNEvt.GetKeyEvent();
714         switch ( pKEvt->GetKeyCode().GetCode() )
715         {
716             case KEY_RETURN:
717                 nHandled = 1;
718                 ( (Link&)GetSelectHdl() ).Call( this );
719             break;
720             case KEY_TAB:
721                 bRelease = sal_False;
722                 ( (Link&)GetSelectHdl() ).Call( this );
723                 bRelease = sal_True;
724                 break;
725 
726             case KEY_ESCAPE:
727                 SelectEntryPos( nCurPos );
728                 ReleaseFocus_Impl();
729                 nHandled = 1;
730                 break;
731         }
732     }
733     return nHandled;
734 }
735 
736 // -----------------------------------------------------------------------
737 
738 void SvxFillTypeBox::ReleaseFocus_Impl()
739 {
740     if( SfxViewShell::Current() )
741     {
742         Window* pShellWnd = SfxViewShell::Current()->GetWindow();
743 
744         if ( pShellWnd )
745             pShellWnd->GrabFocus();
746     }
747 }
748 
749 //========================================================================
750 // SvxFillAttrBox
751 //========================================================================
752 
753 SvxFillAttrBox::SvxFillAttrBox( Window* pParent, WinBits nBits ) :
754 
755     FillAttrLB( pParent, nBits | WB_TABSTOP ),
756 
757     nCurPos( 0 ),
758     bRelease( sal_True )
759 
760 {
761     SetPosPixel( Point( 90, 0 ) );
762     SetSizePixel( LogicToPixel( Size(50, 80 ), MAP_APPFONT ));
763     Show();
764 }
765 
766 // -----------------------------------------------------------------------
767 
768 SvxFillAttrBox::~SvxFillAttrBox()
769 {
770 }
771 
772 // -----------------------------------------------------------------------
773 
774 long SvxFillAttrBox::PreNotify( NotifyEvent& rNEvt )
775 {
776     sal_uInt16 nType = rNEvt.GetType();
777 
778     if ( EVENT_MOUSEBUTTONDOWN == nType || EVENT_GETFOCUS == nType )
779         nCurPos = GetSelectEntryPos();
780 
781     return FillAttrLB::PreNotify( rNEvt );
782 }
783 
784 // -----------------------------------------------------------------------
785 
786 long SvxFillAttrBox::Notify( NotifyEvent& rNEvt )
787 {
788     long nHandled = FillAttrLB::Notify( rNEvt );
789 
790     if ( rNEvt.GetType() == EVENT_KEYINPUT )
791     {
792         const KeyEvent* pKEvt = rNEvt.GetKeyEvent();
793 
794         switch ( pKEvt->GetKeyCode().GetCode() )
795         {
796             case KEY_RETURN:
797                 ( (Link&)GetSelectHdl() ).Call( this );
798                 nHandled = 1;
799             break;
800             case KEY_TAB:
801                 bRelease = sal_False;
802                 GetSelectHdl().Call( this );
803                 bRelease = sal_True;
804             break;
805             case KEY_ESCAPE:
806                 SelectEntryPos( nCurPos );
807                 ReleaseFocus_Impl();
808                 nHandled = 1;
809                 break;
810         }
811     }
812     return nHandled;
813 }
814 
815 // -----------------------------------------------------------------------
816 
817 void SvxFillAttrBox::Select()
818 {
819     FillAttrLB::Select();
820 }
821 
822 // -----------------------------------------------------------------------
823 
824 void SvxFillAttrBox::ReleaseFocus_Impl()
825 {
826     if( SfxViewShell::Current() )
827     {
828         Window* pShellWnd = SfxViewShell::Current()->GetWindow();
829 
830         if ( pShellWnd )
831             pShellWnd->GrabFocus();
832     }
833 }
834