LCOV - code coverage report
Current view: top level - libreoffice/svx/source/tbxctrls - linectrl.cxx (source / functions) Hit Total Coverage
Test: libreoffice_filtered.info Lines: 5 315 1.6 %
Date: 2012-12-27 Functions: 6 50 12.0 %
Legend: Lines: hit not hit

          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 <string>
      21             : 
      22             : #include <vcl/toolbox.hxx>
      23             : #include <sfx2/app.hxx>
      24             : #include <sfx2/dispatch.hxx>
      25             : #include <sfx2/objsh.hxx>
      26             : 
      27             : #include <svx/dialogs.hrc>
      28             : #include "helpid.hrc"
      29             : 
      30             : #include "svx/drawitem.hxx"
      31             : #include "svx/xattr.hxx"
      32             : #include <svx/xtable.hxx>
      33             : #include "svx/linectrl.hxx"
      34             : #include <svx/itemwin.hxx>
      35             : #include <svx/dialmgr.hxx>
      36             : #include <svx/unoapi.hxx>
      37             : 
      38             : using namespace ::com::sun::star::uno;
      39             : using namespace ::com::sun::star::beans;
      40             : using namespace ::com::sun::star::util;
      41             : using namespace ::com::sun::star::frame;
      42             : using namespace ::com::sun::star::lang;
      43             : 
      44             : // Fuer Linienenden-Controller
      45             : #define MAX_LINES 12
      46             : 
      47             : // STATIC DATA -----------------------------------------------------------
      48             : 
      49          18 : SFX_IMPL_TOOLBOX_CONTROL( SvxLineStyleToolBoxControl, XLineStyleItem );
      50          18 : SFX_IMPL_TOOLBOX_CONTROL( SvxLineWidthToolBoxControl, XLineWidthItem );
      51          18 : SFX_IMPL_TOOLBOX_CONTROL( SvxLineColorToolBoxControl, XLineColorItem );
      52          18 : SFX_IMPL_TOOLBOX_CONTROL( SvxLineEndToolBoxControl,   SfxBoolItem );
      53             : 
      54             : /*************************************************************************
      55             : |*
      56             : |* SvxLineStyleToolBoxControl
      57             : |*
      58             : \************************************************************************/
      59             : 
      60           0 : SvxLineStyleToolBoxControl::SvxLineStyleToolBoxControl( sal_uInt16 nSlotId,
      61             :                                                         sal_uInt16 nId,
      62             :                                                         ToolBox& rTbx ) :
      63             :     SfxToolBoxControl( nSlotId, nId, rTbx ),
      64             :     pStyleItem      ( NULL ),
      65             :     pDashItem       ( NULL ),
      66           0 :     bUpdate         ( sal_False )
      67             : {
      68           0 :     addStatusListener( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:LineDash" )));
      69           0 :     addStatusListener( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:DashListState" )));
      70           0 : }
      71             : 
      72             : //========================================================================
      73             : 
      74           0 : SvxLineStyleToolBoxControl::~SvxLineStyleToolBoxControl()
      75             : {
      76           0 :     delete pStyleItem;
      77           0 :     delete pDashItem;
      78           0 : }
      79             : 
      80             : //========================================================================
      81             : 
      82           0 : void SvxLineStyleToolBoxControl::StateChanged (
      83             : 
      84             :     sal_uInt16 nSID, SfxItemState eState, const SfxPoolItem* pState )
      85             : 
      86             : {
      87           0 :     SvxLineBox* pBox = (SvxLineBox*)GetToolBox().GetItemWindow( GetId() );
      88             :     DBG_ASSERT( pBox, "Window not found!" );
      89             : 
      90           0 :     if( eState == SFX_ITEM_DISABLED )
      91             :     {
      92           0 :         pBox->Disable();
      93           0 :         pBox->SetNoSelection();
      94             :     }
      95             :     else
      96             :     {
      97           0 :         pBox->Enable();
      98             : 
      99           0 :         if ( eState == SFX_ITEM_AVAILABLE )
     100             :         {
     101           0 :             if( nSID == SID_ATTR_LINE_STYLE )
     102             :             {
     103           0 :                 delete pStyleItem;
     104           0 :                 pStyleItem = (XLineStyleItem*)pState->Clone();
     105             :             }
     106           0 :             else if( nSID == SID_ATTR_LINE_DASH )
     107             :             {
     108           0 :                 delete pDashItem;
     109           0 :                 pDashItem = (XLineDashItem*)pState->Clone();
     110             :             }
     111             : 
     112           0 :             bUpdate = sal_True;
     113           0 :             Update( pState );
     114             :         }
     115           0 :         else if ( nSID != SID_DASH_LIST )
     116             :         {
     117             :             // kein oder uneindeutiger Status
     118           0 :             pBox->SetNoSelection();
     119             :         }
     120             :     }
     121           0 : }
     122             : 
     123             : //========================================================================
     124             : 
     125           0 : void SvxLineStyleToolBoxControl::Update( const SfxPoolItem* pState )
     126             : {
     127           0 :     if ( pState && bUpdate )
     128             :     {
     129           0 :         bUpdate = sal_False;
     130             : 
     131           0 :         SvxLineBox* pBox = (SvxLineBox*)GetToolBox().GetItemWindow( GetId() );
     132             :         DBG_ASSERT( pBox, "Window not found!" );
     133             : 
     134             :         // Da der Timer unerwartet zuschlagen kann, kann es vorkommen, dass
     135             :         // die LB noch nicht gefuellt ist. Ein ClearCache() am Control im
     136             :         // DelayHdl() blieb ohne Erfolg.
     137           0 :         if( pBox->GetEntryCount() == 0 )
     138           0 :             pBox->FillControl();
     139             : 
     140             :         XLineStyle eXLS;
     141             : 
     142           0 :         if ( pStyleItem )
     143           0 :             eXLS = ( XLineStyle )pStyleItem->GetValue();
     144             :         else
     145           0 :             eXLS = XLINE_NONE;
     146             : 
     147           0 :         switch( eXLS )
     148             :         {
     149             :             case XLINE_NONE:
     150           0 :                 pBox->SelectEntryPos( 0 );
     151           0 :                 break;
     152             : 
     153             :             case XLINE_SOLID:
     154           0 :                 pBox->SelectEntryPos( 1 );
     155           0 :                 break;
     156             : 
     157             :             case XLINE_DASH:
     158             :             {
     159           0 :                 if( pDashItem )
     160             :                 {
     161             :                     OUString aString = SvxUnogetInternalNameForItem(
     162           0 :                         XATTR_LINEDASH, pDashItem->GetName());
     163           0 :                     pBox->SelectEntry( aString );
     164             :                 }
     165             :                 else
     166           0 :                     pBox->SetNoSelection();
     167             :             }
     168           0 :             break;
     169             : 
     170             :             default:
     171             :                 OSL_FAIL( "Nicht unterstuetzter Linientyp" );
     172           0 :                 break;
     173             :         }
     174             :     }
     175             : 
     176           0 :     if ( pState && ( pState->ISA( SvxDashListItem ) ) )
     177             :     {
     178             :         // Die Liste der Linienstile hat sich geaendert
     179           0 :         SvxLineBox* pBox = (SvxLineBox*)GetToolBox().GetItemWindow( GetId() );
     180             :         DBG_ASSERT( pBox, "Window not found!" );
     181             : 
     182           0 :         String aString( pBox->GetSelectEntry() );
     183           0 :         pBox->Clear();
     184           0 :         pBox->InsertEntry( SVX_RESSTR(RID_SVXSTR_INVISIBLE) );
     185           0 :         pBox->InsertEntry( SVX_RESSTR(RID_SVXSTR_SOLID) );
     186           0 :         pBox->Fill( ((SvxDashListItem*)pState )->GetDashList() );
     187           0 :         pBox->SelectEntry( aString );
     188             :     }
     189           0 : }
     190             : 
     191             : //========================================================================
     192             : 
     193           0 : Window* SvxLineStyleToolBoxControl::CreateItemWindow( Window *pParent )
     194             : {
     195           0 :     return new SvxLineBox( pParent, m_xFrame );
     196             : }
     197             : 
     198             : /*************************************************************************
     199             : |*
     200             : |* SvxLineWidthToolBoxControl
     201             : |*
     202             : \************************************************************************/
     203             : 
     204           0 : SvxLineWidthToolBoxControl::SvxLineWidthToolBoxControl(
     205             :     sal_uInt16 nSlotId, sal_uInt16 nId, ToolBox& rTbx ) :
     206           0 :     SfxToolBoxControl( nSlotId, nId, rTbx )
     207             : {
     208           0 :     addStatusListener( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:MetricUnit" )));
     209           0 : }
     210             : 
     211             : //========================================================================
     212             : 
     213           0 : SvxLineWidthToolBoxControl::~SvxLineWidthToolBoxControl()
     214             : {
     215           0 : }
     216             : 
     217             : //========================================================================
     218             : 
     219           0 : void SvxLineWidthToolBoxControl::StateChanged(
     220             :     sal_uInt16 nSID, SfxItemState eState, const SfxPoolItem* pState )
     221             : {
     222             :     SvxMetricField* pFld = (SvxMetricField*)
     223           0 :                            GetToolBox().GetItemWindow( GetId() );
     224             :     DBG_ASSERT( pFld, "Window not found" );
     225             : 
     226           0 :     if ( nSID == SID_ATTR_METRIC )
     227             :     {
     228           0 :         pFld->RefreshDlgUnit();
     229             :     }
     230             :     else
     231             :     {
     232           0 :         if ( eState == SFX_ITEM_DISABLED )
     233             :         {
     234           0 :             pFld->Disable();
     235           0 :             pFld->SetText( String() );
     236             :         }
     237             :         else
     238             :         {
     239           0 :             pFld->Enable();
     240             : 
     241           0 :             if ( eState == SFX_ITEM_AVAILABLE )
     242             :             {
     243             :                 DBG_ASSERT( pState->ISA(XLineWidthItem), "falscher ItemType" );
     244             : 
     245             :                 // Core-Unit an MetricField uebergeben
     246             :                 // Darf nicht in CreateItemWin() geschehen!
     247           0 :                 SfxMapUnit eUnit = SFX_MAPUNIT_100TH_MM; // CD!!! GetCoreMetric();
     248           0 :                 pFld->SetCoreUnit( eUnit );
     249             : 
     250           0 :                 pFld->Update( (const XLineWidthItem*)pState );
     251             :             }
     252             :             else
     253           0 :                 pFld->Update( NULL );
     254             :         }
     255             :     }
     256           0 : }
     257             : 
     258             : //========================================================================
     259             : 
     260           0 : Window* SvxLineWidthToolBoxControl::CreateItemWindow( Window *pParent )
     261             : {
     262           0 :     return( new SvxMetricField( pParent, m_xFrame ) );
     263             : }
     264             : 
     265             : /*************************************************************************
     266             : |*
     267             : |* SvxLineColorToolBoxControl
     268             : |*
     269             : \************************************************************************/
     270             : 
     271           0 : SvxLineColorToolBoxControl::SvxLineColorToolBoxControl(
     272             :     sal_uInt16 nSlotId, sal_uInt16 nId, ToolBox& rTbx ) :
     273           0 :     SfxToolBoxControl( nSlotId, nId, rTbx )
     274             : {
     275           0 :     addStatusListener( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:ColorTableState" )));
     276           0 : }
     277             : 
     278             : //========================================================================
     279             : 
     280           0 : SvxLineColorToolBoxControl::~SvxLineColorToolBoxControl()
     281             : {
     282           0 : }
     283             : 
     284             : //========================================================================
     285             : 
     286           0 : void SvxLineColorToolBoxControl::StateChanged(
     287             : 
     288             :     sal_uInt16 nSID, SfxItemState eState, const SfxPoolItem* pState )
     289             : 
     290             : {
     291           0 :     SvxColorBox* pBox = (SvxColorBox*)GetToolBox().GetItemWindow( GetId() );
     292             :     DBG_ASSERT( pBox, "Window not found" );
     293             : 
     294           0 :     if ( nSID != SID_COLOR_TABLE )
     295             :     {
     296           0 :         if ( eState == SFX_ITEM_DISABLED )
     297             :         {
     298           0 :             pBox->Disable();
     299           0 :             pBox->SetNoSelection();
     300             :         }
     301             :         else
     302             :         {
     303           0 :             pBox->Enable();
     304             : 
     305           0 :             if ( eState == SFX_ITEM_AVAILABLE )
     306             :             {
     307             :                 DBG_ASSERT( pState->ISA(XLineColorItem), "falscher ItemTyoe" );
     308           0 :                 pBox->Update( (const XLineColorItem*) pState );
     309             :             }
     310             :             else
     311           0 :                 pBox->Update( NULL );
     312             :         }
     313             :     }
     314             :     else
     315           0 :         Update( pState );
     316           0 : }
     317             : 
     318             : //========================================================================
     319             : 
     320           0 : void SvxLineColorToolBoxControl::Update( const SfxPoolItem* pState )
     321             : {
     322           0 :     if ( pState && ( pState->ISA( SvxColorListItem ) ) )
     323             :     {
     324           0 :         SvxColorBox* pBox = (SvxColorBox*)GetToolBox().GetItemWindow( GetId() );
     325             : 
     326             :         DBG_ASSERT( pBox, "Window not found" );
     327             : 
     328             :         // Die Liste der Farben (ColorTable) hat sich geaendert:
     329           0 :         ::Color aTmpColor( pBox->GetSelectEntryColor() );
     330           0 :         pBox->Clear();
     331           0 :         pBox->Fill( ( (SvxColorListItem*)pState )->GetColorList() );
     332           0 :         pBox->SelectEntry( aTmpColor );
     333             :     }
     334           0 : }
     335             : 
     336             : //========================================================================
     337             : 
     338           0 : Window* SvxLineColorToolBoxControl::CreateItemWindow( Window *pParent )
     339             : {
     340           0 :     return new SvxColorBox( pParent, m_aCommandURL, m_xFrame );
     341             : }
     342             : 
     343             : /*************************************************************************
     344             : |*
     345             : |* SvxLineEndWindow
     346             : |*
     347             : \************************************************************************/
     348             : 
     349           0 : SvxLineEndWindow::SvxLineEndWindow(
     350             :     sal_uInt16 nSlotId,
     351             :     const Reference< XFrame >& rFrame,
     352             :     const String& rWndTitle ) :
     353             :     SfxPopupWindow( nSlotId,
     354             :                     rFrame,
     355             :                     WinBits( WB_STDPOPUP | WB_OWNERDRAWDECORATION ) ),
     356             :     aLineEndSet     ( this, WinBits( WB_ITEMBORDER | WB_3DLOOK | WB_NO_DIRECTSELECT ) ),
     357             :     nCols           ( 2 ),
     358             :     nLines          ( 12 ),
     359             :     nLineEndWidth   ( 400 ),
     360             :     bPopupMode      ( sal_True ),
     361             :     mbInResize      ( false ),
     362           0 :     mxFrame         ( rFrame )
     363             : {
     364           0 :     SetText( rWndTitle );
     365           0 :     implInit();
     366           0 : }
     367             : 
     368           0 : SvxLineEndWindow::SvxLineEndWindow(
     369             :     sal_uInt16 nSlotId,
     370             :     const Reference< XFrame >& rFrame,
     371             :     Window* pParentWindow,
     372             :     const String& rWndTitle ) :
     373             :     SfxPopupWindow( nSlotId,
     374             :                     rFrame,
     375             :                     pParentWindow,
     376             :                     WinBits( WB_STDPOPUP | WB_OWNERDRAWDECORATION ) ),
     377             :     aLineEndSet     ( this, WinBits( WB_ITEMBORDER | WB_3DLOOK | WB_NO_DIRECTSELECT ) ),
     378             :     nCols           ( 2 ),
     379             :     nLines          ( 12 ),
     380             :     nLineEndWidth   ( 400 ),
     381             :     bPopupMode      ( sal_True ),
     382             :     mbInResize      ( false ),
     383           0 :     mxFrame         ( rFrame )
     384             : {
     385           0 :     SetText( rWndTitle );
     386           0 :     implInit();
     387           0 : }
     388             : 
     389           0 : void SvxLineEndWindow::implInit()
     390             : {
     391           0 :     SfxObjectShell*     pDocSh  = SfxObjectShell::Current();
     392           0 :     const SfxPoolItem*  pItem   = NULL;
     393             : 
     394           0 :     SetHelpId( HID_POPUP_LINEEND );
     395           0 :     aLineEndSet.SetHelpId( HID_POPUP_LINEEND_CTRL );
     396             : 
     397           0 :     if ( pDocSh )
     398             :     {
     399           0 :         pItem = pDocSh->GetItem( SID_LINEEND_LIST );
     400           0 :         if( pItem )
     401           0 :             pLineEndList = ( (SvxLineEndListItem*) pItem )->GetLineEndList();
     402             : 
     403           0 :         pItem = pDocSh->GetItem( SID_ATTR_LINEEND_WIDTH_DEFAULT );
     404           0 :         if( pItem )
     405           0 :             nLineEndWidth = ( (SfxUInt16Item*) pItem )->GetValue();
     406             :     }
     407             :     DBG_ASSERT( pLineEndList.is(), "LineEndList wurde nicht gefunden" );
     408             : 
     409           0 :     aLineEndSet.SetSelectHdl( LINK( this, SvxLineEndWindow, SelectHdl ) );
     410           0 :     aLineEndSet.SetColCount( nCols );
     411             : 
     412             :     // ValueSet mit Eintraegen der LineEndList fuellen
     413           0 :     FillValueSet();
     414             : 
     415           0 :     AddStatusListener( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:LineEndListState" )));
     416             : 
     417             :     //ChangeHelpId( HID_POPUP_LINEENDSTYLE );
     418           0 :     aLineEndSet.Show();
     419           0 : }
     420             : 
     421           0 : SfxPopupWindow* SvxLineEndWindow::Clone() const
     422             : {
     423           0 :     return new SvxLineEndWindow( GetId(), mxFrame, GetText() );
     424             : }
     425             : 
     426             : // -----------------------------------------------------------------------
     427             : 
     428           0 : SvxLineEndWindow::~SvxLineEndWindow()
     429             : {
     430           0 : }
     431             : 
     432             : // -----------------------------------------------------------------------
     433             : 
     434           0 : IMPL_LINK_NOARG(SvxLineEndWindow, SelectHdl)
     435             : {
     436           0 :     XLineEndItem*           pLineEndItem = NULL;
     437           0 :     XLineStartItem*         pLineStartItem = NULL;
     438           0 :     sal_uInt16                  nId = aLineEndSet.GetSelectItemId();
     439             : 
     440           0 :     if( nId == 1 )
     441             :     {
     442           0 :         pLineStartItem  = new XLineStartItem();
     443             :     }
     444           0 :     else if( nId == 2 )
     445             :     {
     446           0 :         pLineEndItem    = new XLineEndItem();
     447             :     }
     448           0 :     else if( nId % 2 ) // LinienAnfang
     449             :     {
     450           0 :         XLineEndEntry* pEntry = pLineEndList->GetLineEnd( ( nId - 1 ) / 2 - 1 );
     451           0 :         pLineStartItem  = new XLineStartItem( pEntry->GetName(), pEntry->GetLineEnd() );
     452             :     }
     453             :     else // LinienEnde
     454             :     {
     455           0 :         XLineEndEntry* pEntry = pLineEndList->GetLineEnd( nId / 2 - 2 );
     456           0 :         pLineEndItem    = new XLineEndItem( pEntry->GetName(), pEntry->GetLineEnd() );
     457             :     }
     458             : 
     459           0 :     if ( IsInPopupMode() )
     460           0 :         EndPopupMode();
     461             : 
     462           0 :     Sequence< PropertyValue > aArgs( 1 );
     463           0 :     Any a;
     464             : 
     465           0 :     if ( pLineStartItem )
     466             :     {
     467           0 :         aArgs[0].Name = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "LineStart" ));
     468           0 :         pLineStartItem->QueryValue( a );
     469           0 :         aArgs[0].Value = a;
     470             :     }
     471             :     else
     472             :     {
     473           0 :         aArgs[0].Name = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "LineEnd" ));
     474           0 :         pLineEndItem->QueryValue( a );
     475           0 :         aArgs[0].Value = a;
     476             :     }
     477             : 
     478             :     /*  #i33380# DR 2004-09-03 Moved the following line above the Dispatch() call.
     479             :         This instance may be deleted in the meantime (i.e. when a dialog is opened
     480             :         while in Dispatch()), accessing members will crash in this case. */
     481           0 :     aLineEndSet.SetNoSelection();
     482             : 
     483           0 :     SfxToolBoxControl::Dispatch( Reference< XDispatchProvider >( mxFrame->getController(), UNO_QUERY ),
     484             :                                  ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:LineEndStyle" )),
     485           0 :                                  aArgs );
     486             : 
     487           0 :     delete pLineEndItem;
     488           0 :     delete pLineStartItem;
     489             : 
     490           0 :     return 0;
     491             : }
     492             : 
     493             : // -----------------------------------------------------------------------
     494             : 
     495           0 : void SvxLineEndWindow::FillValueSet()
     496             : {
     497           0 :     if( pLineEndList.is() )
     498             :     {
     499           0 :         XLineEndEntry*      pEntry  = NULL;
     500           0 :         Bitmap*             pBmp    = NULL;
     501           0 :         VirtualDevice       aVD;
     502             : 
     503           0 :         long nCount = pLineEndList->Count();
     504             : 
     505             :         // Erster Eintrag: kein LinienEnde
     506             :         // Temporaer wird ein Eintrag hinzugefuegt, um die UI-Bitmap zu erhalten
     507           0 :         basegfx::B2DPolyPolygon aNothing;
     508           0 :         pLineEndList->Insert( new XLineEndEntry( aNothing, SVX_RESSTR( RID_SVXSTR_NONE ) ) );
     509           0 :         pEntry = pLineEndList->GetLineEnd( nCount );
     510           0 :         pBmp = pLineEndList->GetBitmap( nCount );
     511             :         DBG_ASSERT( pBmp, "UI-Bitmap wurde nicht erzeugt" );
     512             : 
     513           0 :         aBmpSize = pBmp->GetSizePixel();
     514           0 :         aVD.SetOutputSizePixel( aBmpSize, sal_False );
     515           0 :         aBmpSize.Width() = aBmpSize.Width() / 2;
     516           0 :         Point aPt0( 0, 0 );
     517           0 :         Point aPt1( aBmpSize.Width(), 0 );
     518             : 
     519           0 :         aVD.DrawBitmap( Point(), *pBmp );
     520           0 :         aLineEndSet.InsertItem( 1, aVD.GetBitmap( aPt0, aBmpSize ), pEntry->GetName() );
     521           0 :         aLineEndSet.InsertItem( 2, aVD.GetBitmap( aPt1, aBmpSize ), pEntry->GetName() );
     522             : 
     523           0 :         delete pLineEndList->Remove( nCount );
     524             : 
     525           0 :         for( long i = 0; i < nCount; i++ )
     526             :         {
     527           0 :             pEntry = pLineEndList->GetLineEnd( i );
     528             :             DBG_ASSERT( pEntry, "Konnte auf LineEndEntry nicht zugreifen" );
     529           0 :             pBmp = pLineEndList->GetBitmap( i );
     530             :             DBG_ASSERT( pBmp, "UI-Bitmap wurde nicht erzeugt" );
     531             : 
     532           0 :             aVD.DrawBitmap( aPt0, *pBmp );
     533           0 :             aLineEndSet.InsertItem( (sal_uInt16)((i+1L)*2L+1L), aVD.GetBitmap( aPt0, aBmpSize ), pEntry->GetName() );
     534           0 :             aLineEndSet.InsertItem( (sal_uInt16)((i+2L)*2L),    aVD.GetBitmap( aPt1, aBmpSize ), pEntry->GetName() );
     535             :         }
     536           0 :         nLines = Min( (sal_uInt16)(nCount + 1), (sal_uInt16) MAX_LINES );
     537           0 :         aLineEndSet.SetLineCount( nLines );
     538             : 
     539           0 :         SetSize();
     540             :     }
     541           0 : }
     542             : 
     543             : // -----------------------------------------------------------------------
     544             : 
     545           0 : void SvxLineEndWindow::Resize()
     546             : {
     547             :     // since we change the size inside this call, check if we
     548             :     // are called recursive
     549           0 :     if( !mbInResize )
     550             :     {
     551           0 :         mbInResize = true;
     552           0 :         if ( !IsRollUp() )
     553             :         {
     554           0 :             aLineEndSet.SetColCount( nCols );
     555           0 :             aLineEndSet.SetLineCount( nLines );
     556             : 
     557           0 :             SetSize();
     558             : 
     559           0 :             Size aSize = GetOutputSizePixel();
     560           0 :             aSize.Width()  -= 4;
     561           0 :             aSize.Height() -= 4;
     562           0 :             aLineEndSet.SetPosSizePixel( Point( 2, 2 ), aSize );
     563             :         }
     564             :         //SfxPopupWindow::Resize();
     565           0 :         mbInResize = false;
     566             :     }
     567           0 : }
     568             : 
     569             : // -----------------------------------------------------------------------
     570             : 
     571           0 : void SvxLineEndWindow::Resizing( Size& rNewSize )
     572             : {
     573           0 :     Size aBitmapSize = aBmpSize; // -> Member
     574           0 :     aBitmapSize.Width()  += 6; //
     575           0 :     aBitmapSize.Height() += 6; //
     576             : 
     577           0 :     Size aItemSize = aLineEndSet.CalcItemSizePixel( aBitmapSize );  // -> Member
     578             :     //Size aOldSize = GetOutputSizePixel(); // fuer Breite
     579             : 
     580           0 :     sal_uInt16 nItemCount = aLineEndSet.GetItemCount(); // -> Member
     581             : 
     582             :     // Spalten ermitteln
     583           0 :     long nItemW = aItemSize.Width();
     584           0 :     long nW = rNewSize.Width();
     585             :     nCols = (sal_uInt16) Max( ( (sal_uIntPtr)(( nW + nItemW ) / ( nItemW * 2 ) )),
     586           0 :                                             (sal_uIntPtr) 1L );
     587           0 :     nCols *= 2;
     588             : 
     589             :     // Reihen ermitteln
     590           0 :     long nItemH = aItemSize.Height();
     591           0 :     long nH = rNewSize.Height();
     592           0 :     nLines = (sal_uInt16) Max( ( ( nH + nItemH / 2 ) / nItemH ), 1L );
     593             : 
     594           0 :     sal_uInt16 nMaxCols  = nItemCount / nLines;
     595           0 :     if( nItemCount % nLines )
     596           0 :         nMaxCols++;
     597           0 :     if( nCols > nMaxCols )
     598           0 :         nCols = nMaxCols;
     599           0 :     nW = nItemW * nCols;
     600             : 
     601             :     // Keine ungerade Anzahl von Spalten
     602           0 :     if( nCols % 2 )
     603           0 :         nCols--;
     604           0 :     nCols = Max( nCols, (sal_uInt16) 2 );
     605             : 
     606           0 :     sal_uInt16 nMaxLines  = nItemCount / nCols;
     607           0 :     if( nItemCount % nCols )
     608           0 :         nMaxLines++;
     609           0 :     if( nLines > nMaxLines )
     610           0 :         nLines = nMaxLines;
     611           0 :     nH = nItemH * nLines;
     612             : 
     613           0 :     rNewSize.Width() = nW;
     614           0 :     rNewSize.Height() = nH;
     615           0 : }
     616             : // -----------------------------------------------------------------------
     617             : 
     618           0 : void SvxLineEndWindow::StartSelection()
     619             : {
     620           0 :     aLineEndSet.StartSelection();
     621           0 : }
     622             : 
     623             : // -----------------------------------------------------------------------
     624             : 
     625           0 : sal_Bool SvxLineEndWindow::Close()
     626             : {
     627           0 :     return SfxPopupWindow::Close();
     628             : }
     629             : 
     630             : // -----------------------------------------------------------------------
     631             : 
     632           0 : void SvxLineEndWindow::StateChanged(
     633             :     sal_uInt16 nSID, SfxItemState, const SfxPoolItem* pState )
     634             : {
     635           0 :     if ( nSID == SID_LINEEND_LIST )
     636             :     {
     637             :         // Die Liste der LinienEnden (LineEndList) hat sich geaendert:
     638           0 :         if ( pState && pState->ISA( SvxLineEndListItem ))
     639             :         {
     640           0 :             pLineEndList = ((SvxLineEndListItem*)pState)->GetLineEndList();
     641             :             DBG_ASSERT( pLineEndList.is(), "LineEndList nicht gefunden" );
     642             : 
     643           0 :             aLineEndSet.Clear();
     644           0 :             FillValueSet();
     645             : 
     646           0 :             Size aSize = GetOutputSizePixel();
     647           0 :             Resizing( aSize );
     648           0 :             Resize();
     649             :         }
     650             :     }
     651           0 : }
     652             : 
     653             : // -----------------------------------------------------------------------
     654             : 
     655           0 : void SvxLineEndWindow::PopupModeEnd()
     656             : {
     657           0 :     if ( IsVisible() )
     658             :     {
     659           0 :         bPopupMode = sal_False;
     660           0 :         SetSize();
     661             :     }
     662           0 :     SfxPopupWindow::PopupModeEnd();
     663           0 : }
     664             : 
     665             : // -----------------------------------------------------------------------
     666             : 
     667           0 : void SvxLineEndWindow::SetSize()
     668             : {
     669             :     //if( !bPopupMode )
     670           0 :     if( !IsInPopupMode() )
     671             :     {
     672           0 :         sal_uInt16 nItemCount = aLineEndSet.GetItemCount(); // -> Member
     673           0 :         sal_uInt16 nMaxLines  = nItemCount / nCols; // -> Member ?
     674           0 :         if( nItemCount % nCols )
     675           0 :             nMaxLines++;
     676             : 
     677           0 :         WinBits nBits = aLineEndSet.GetStyle();
     678           0 :         if ( nLines == nMaxLines )
     679           0 :             nBits &= ~WB_VSCROLL;
     680             :         else
     681           0 :             nBits |= WB_VSCROLL;
     682           0 :         aLineEndSet.SetStyle( nBits );
     683             :     }
     684             : 
     685           0 :     Size aSize( aBmpSize );
     686           0 :     aSize.Width()  += 6;
     687           0 :     aSize.Height() += 6;
     688           0 :     aSize = aLineEndSet.CalcWindowSizePixel( aSize );
     689           0 :     aSize.Width()  += 4;
     690           0 :     aSize.Height() += 4;
     691           0 :     SetOutputSizePixel( aSize );
     692           0 :     aSize.Height() = aBmpSize.Height();
     693           0 :     aSize.Height() += 14;
     694             :     //SetMinOutputSizePixel( aSize );
     695           0 : }
     696             : 
     697           0 : void SvxLineEndWindow::GetFocus (void)
     698             : {
     699           0 :     SfxPopupWindow::GetFocus();
     700             :     // Grab the focus to the line ends value set so that it can be controlled
     701             :     // with the keyboard.
     702           0 :     aLineEndSet.GrabFocus();
     703           0 : }
     704             : 
     705             : /*************************************************************************
     706             : |*
     707             : |* SvxLineEndToolBoxControl
     708             : |*
     709             : \************************************************************************/
     710             : 
     711           0 : SvxLineEndToolBoxControl::SvxLineEndToolBoxControl( sal_uInt16 nSlotId, sal_uInt16 nId, ToolBox &rTbx ) :
     712           0 :     SfxToolBoxControl( nSlotId, nId, rTbx )
     713             : {
     714           0 :     rTbx.SetItemBits( nId, TIB_DROPDOWNONLY | rTbx.GetItemBits( nId ) );
     715           0 :     rTbx.Invalidate();
     716           0 : }
     717             : 
     718             : // -----------------------------------------------------------------------
     719             : 
     720           0 : SvxLineEndToolBoxControl::~SvxLineEndToolBoxControl()
     721             : {
     722           0 : }
     723             : 
     724             : // -----------------------------------------------------------------------
     725             : 
     726           0 : SfxPopupWindowType SvxLineEndToolBoxControl::GetPopupWindowType() const
     727             : {
     728           0 :     return SFX_POPUPWINDOW_ONCLICK;
     729             : }
     730             : 
     731             : // -----------------------------------------------------------------------
     732             : 
     733           0 : SfxPopupWindow* SvxLineEndToolBoxControl::CreatePopupWindow()
     734             : {
     735             :     SvxLineEndWindow* pLineEndWin =
     736           0 :         new SvxLineEndWindow( GetId(), m_xFrame, &GetToolBox(), SVX_RESSTR( RID_SVXSTR_LINEEND ) );
     737           0 :     pLineEndWin->StartPopupMode( &GetToolBox(),
     738             :                                  FLOATWIN_POPUPMODE_GRABFOCUS |
     739             :                                  FLOATWIN_POPUPMODE_ALLOWTEAROFF |
     740           0 :                                  FLOATWIN_POPUPMODE_NOAPPFOCUSCLOSE );
     741           0 :     pLineEndWin->StartSelection();
     742           0 :     SetPopupWindow( pLineEndWin );
     743           0 :     return pLineEndWin;
     744             : }
     745             : 
     746             : // -----------------------------------------------------------------------
     747             : 
     748           0 : void SvxLineEndToolBoxControl::StateChanged( sal_uInt16, SfxItemState eState, const SfxPoolItem* )
     749             : {
     750           0 :     sal_uInt16 nId = GetId();
     751           0 :     ToolBox& rTbx = GetToolBox();
     752             : 
     753           0 :     rTbx.EnableItem( nId, SFX_ITEM_DISABLED != eState );
     754           0 :     rTbx.SetItemState( nId, ( SFX_ITEM_DONTCARE == eState ) ? STATE_DONTKNOW : STATE_NOCHECK );
     755          57 : }
     756             : 
     757             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10