blob: 567815278c05b0d7175c60ea87232442a932022d [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_svx.hxx"
// include ---------------------------------------------------------------
#include <string> // HACK: prevent conflict between STLPORT and Workshop headers
#include <sfx2/app.hxx>
#include <sfx2/dispatch.hxx>
#include <sfx2/objsh.hxx>
#include <sfx2/viewsh.hxx>
#include <rtl/ustring.hxx>
#include <svx/dialogs.hrc>
#define DELAY_TIMEOUT 300
#define TMP_STR_BEGIN '['
#define TMP_STR_END ']'
#include "svx/drawitem.hxx"
#include "svx/xattr.hxx"
#include <svx/xtable.hxx>
#include <svx/fillctrl.hxx>
#include <svx/itemwin.hxx>
#include <svx/dialmgr.hxx>
#include "helpid.hrc"
using namespace ::com::sun::star::uno;
using namespace ::com::sun::star::util;
using namespace ::com::sun::star::beans;
using namespace ::com::sun::star::frame;
using namespace ::com::sun::star::lang;
SFX_IMPL_TOOLBOX_CONTROL( SvxFillToolBoxControl, XFillStyleItem );
/*************************************************************************
|*
|* SvxFillToolBoxControl
|*
\************************************************************************/
SvxFillToolBoxControl::SvxFillToolBoxControl( sal_uInt16 nSlotId, sal_uInt16 nId, ToolBox& rTbx ) :
SfxToolBoxControl( nSlotId, nId, rTbx ),
pStyleItem ( NULL ),
pColorItem ( NULL ),
pGradientItem ( NULL ),
pHatchItem ( NULL ),
pBitmapItem ( NULL ),
pFillControl ( NULL ),
pFillTypeLB ( NULL ),
pFillAttrLB ( NULL ),
bUpdate ( sal_False ),
eLastXFS ( XFILL_NONE )
{
addStatusListener( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:FillColor" )));
addStatusListener( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:FillGradient" )));
addStatusListener( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:FillHatch" )));
addStatusListener( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:FillBitmap" )));
addStatusListener( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:ColorTableState" )));
addStatusListener( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:GradientListState" )));
addStatusListener( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:HatchListState" )));
addStatusListener( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:BitmapListState" )));
}
//========================================================================
SvxFillToolBoxControl::~SvxFillToolBoxControl()
{
delete pStyleItem;
delete pColorItem;
delete pGradientItem;
delete pHatchItem;
delete pBitmapItem;
}
//========================================================================
void SvxFillToolBoxControl::StateChanged(
sal_uInt16 nSID, SfxItemState eState, const SfxPoolItem* pState )
{
bool bEnableControls = sal_False;
if( eState == SFX_ITEM_DISABLED )
{
if( nSID == SID_ATTR_FILL_STYLE )
{
pFillTypeLB->Disable();
pFillTypeLB->SetNoSelection();
}
pFillAttrLB->Disable();
pFillAttrLB->SetNoSelection();
}
else
{
if ( SFX_ITEM_AVAILABLE == eState )
{
if( nSID == SID_ATTR_FILL_STYLE )
{
delete pStyleItem;
pStyleItem = (XFillStyleItem*) pState->Clone();
pFillTypeLB->Enable();
}
else if( pStyleItem )
{
XFillStyle eXFS = (XFillStyle)pStyleItem->GetValue();
if( nSID == SID_ATTR_FILL_COLOR )
{
delete pColorItem;
pColorItem = (XFillColorItem*) pState->Clone();
if( eXFS == XFILL_SOLID )
bEnableControls = sal_True;
}
else if( nSID == SID_ATTR_FILL_GRADIENT )
{
delete pGradientItem;
pGradientItem = (XFillGradientItem*) pState->Clone();
if( eXFS == XFILL_GRADIENT )
bEnableControls = sal_True;
}
else if( nSID == SID_ATTR_FILL_HATCH )
{
delete pHatchItem;
pHatchItem = (XFillHatchItem*) pState->Clone();
if( eXFS == XFILL_HATCH )
bEnableControls = sal_True;
}
else if( nSID == SID_ATTR_FILL_BITMAP )
{
delete pBitmapItem;
pBitmapItem = (XFillBitmapItem*) pState->Clone();
if( eXFS == XFILL_BITMAP )
bEnableControls = sal_True;
}
}
if( pStyleItem )
{
// ensure that the correct entry is selected in pFillTypeLB. It
// might have been changed by nSID == SID_ATTR_FILL_STYLE, but
// it might also be in an in-between state when user had started to
// change fillstyle, but not yet changed fillvalue for new style
// and when nSID == SID_ATTR_FILL_COLOR/SID_ATTR_FILL_GRADIENT/
// SID_ATTR_FILL_HATCH/SID_ATTR_FILL_BITMAP value change is triggered
eLastXFS = pFillTypeLB->GetSelectEntryPos();
XFillStyle eXFS = (XFillStyle)pStyleItem->GetValue();
if(eLastXFS != eXFS)
{
bUpdate = sal_True;
pFillTypeLB->SelectEntryPos( sal::static_int_cast< sal_uInt16 >( eXFS ) );
}
pFillAttrLB->Enable();
}
if( bEnableControls )
{
//pFillTypeLB->Enable();
pFillAttrLB->Enable();
bUpdate = sal_True;
}
Update( pState );
}
else
{
// leerer oder uneindeutiger Status
if( nSID == SID_ATTR_FILL_STYLE )
{
pFillTypeLB->SetNoSelection();
pFillAttrLB->Disable();
pFillAttrLB->SetNoSelection();
bUpdate = sal_False;
}
else
{
XFillStyle eXFS = XFILL_NONE;
if( pStyleItem )
eXFS = (XFillStyle)pStyleItem->GetValue();
if( !pStyleItem ||
( nSID == SID_ATTR_FILL_COLOR && eXFS == XFILL_SOLID ) ||
( nSID == SID_ATTR_FILL_GRADIENT && eXFS == XFILL_GRADIENT ) ||
( nSID == SID_ATTR_FILL_HATCH && eXFS == XFILL_HATCH ) ||
( nSID == SID_ATTR_FILL_BITMAP && eXFS == XFILL_BITMAP ) )
{
pFillAttrLB->SetNoSelection();
//bUpdate = sal_False;
}
}
}
}
}
//========================================================================
void SvxFillToolBoxControl::Update( const SfxPoolItem* pState )
{
if ( pStyleItem && pState && bUpdate )
{
bUpdate = sal_False;
XFillStyle eXFS = (XFillStyle)pStyleItem->GetValue();
// Pruefen, ob Fuellstil schon vorher aktiv war
//if( eTmpXFS != eXFS )
if( (XFillStyle) eLastXFS != eXFS )
pFillControl->SelectFillTypeHdl( NULL );
//eLastXFS = eXFS;
switch( eXFS )
{
case XFILL_NONE:
break;
case XFILL_SOLID:
{
if ( pColorItem )
{
String aString( pColorItem->GetName() );
::Color aColor = pColorItem->GetColorValue();
pFillAttrLB->SelectEntry( aString );
if ( pFillAttrLB->GetSelectEntryPos() == LISTBOX_ENTRY_NOTFOUND ||
pFillAttrLB->GetSelectEntryColor() != aColor )
pFillAttrLB->SelectEntry( aColor );
// NEU
// Pruefen, ob Eintrag nicht in der Liste ist
if( pFillAttrLB->GetSelectEntryPos() ==
LISTBOX_ENTRY_NOTFOUND ||
pFillAttrLB->GetSelectEntryColor() != aColor )
{
sal_uInt16 nCount = pFillAttrLB->GetEntryCount();
String aTmpStr;
if( nCount > 0 )
{
//Letzter Eintrag wird auf temporaere Farbe geprueft
aTmpStr = pFillAttrLB->GetEntry( nCount - 1 );
if( aTmpStr.GetChar(0) == TMP_STR_BEGIN &&
aTmpStr.GetChar(aTmpStr.Len()-1) == TMP_STR_END )
{
pFillAttrLB->RemoveEntry( nCount - 1 );
}
}
aTmpStr = TMP_STR_BEGIN;
aTmpStr += aString;
aTmpStr += TMP_STR_END;
//pFillAttrLB->SetUpdateMode( sal_False );
sal_uInt16 nPos = pFillAttrLB->InsertEntry( aColor, aTmpStr );
//pFillAttrLB->SetUpdateMode( sal_True );
pFillAttrLB->SelectEntryPos( nPos );
}
// NEU
}
else
pFillAttrLB->SetNoSelection();
}
break;
case XFILL_GRADIENT:
{
if ( pGradientItem )
{
String aString( pGradientItem->GetName() );
pFillAttrLB->SelectEntry( aString );
// NEU
// Pruefen, ob Eintrag nicht in der Liste ist
if( pFillAttrLB->GetSelectEntry() != aString )
{
sal_uInt16 nCount = pFillAttrLB->GetEntryCount();
String aTmpStr;
if( nCount > 0 )
{
//Letzter Eintrag wird auf temporaeren Eintrag geprueft
aTmpStr = pFillAttrLB->GetEntry( nCount - 1 );
if( aTmpStr.GetChar(0) == TMP_STR_BEGIN &&
aTmpStr.GetChar(aTmpStr.Len()-1) == TMP_STR_END )
{
pFillAttrLB->RemoveEntry( nCount - 1 );
}
}
aTmpStr = TMP_STR_BEGIN;
aTmpStr += aString;
aTmpStr += TMP_STR_END;
XGradientEntry* pEntry = new XGradientEntry( pGradientItem->GetGradientValue(), aTmpStr );
XGradientListSharedPtr aGradientList(XPropertyListFactory::CreateSharedXGradientList(String::CreateFromAscii("TmpList")));
aGradientList->Insert(pEntry);
aGradientList->SetDirty(false);
const Bitmap aBmp = aGradientList->GetUiBitmap( 0 );
if( !aBmp.IsEmpty() )
{
( (ListBox*)pFillAttrLB )->InsertEntry( pEntry->GetName(), aBmp );
pFillAttrLB->SelectEntryPos( pFillAttrLB->GetEntryCount() - 1 );
}
}
// NEU
}
else
pFillAttrLB->SetNoSelection();
}
break;
case XFILL_HATCH:
{
if ( pHatchItem )
{
String aString( pHatchItem->GetName() );
pFillAttrLB->SelectEntry( aString );
// NEU
// Pruefen, ob Eintrag nicht in der Liste ist
if( pFillAttrLB->GetSelectEntry() != aString )
{
sal_uInt16 nCount = pFillAttrLB->GetEntryCount();
String aTmpStr;
if( nCount > 0 )
{
//Letzter Eintrag wird auf temporaeren Eintrag geprueft
aTmpStr = pFillAttrLB->GetEntry( nCount - 1 );
if( aTmpStr.GetChar(0) == TMP_STR_BEGIN &&
aTmpStr.GetChar(aTmpStr.Len()-1) == TMP_STR_END )
{
pFillAttrLB->RemoveEntry( nCount - 1 );
}
}
aTmpStr = TMP_STR_BEGIN;
aTmpStr += aString;
aTmpStr += TMP_STR_END;
XHatchEntry* pEntry = new XHatchEntry( pHatchItem->GetHatchValue(), aTmpStr );
XHatchListSharedPtr aHatchList(XPropertyListFactory::CreateSharedXHatchList(String::CreateFromAscii("TmpList")));
aHatchList->Insert( pEntry );
aHatchList->SetDirty( sal_False );
const Bitmap aBmp = aHatchList->GetUiBitmap( 0 );
if( !aBmp.IsEmpty() )
{
( (ListBox*)pFillAttrLB )->InsertEntry( pEntry->GetName(), aBmp );
pFillAttrLB->SelectEntryPos( pFillAttrLB->GetEntryCount() - 1 );
}
}
// NEU
}
else
pFillAttrLB->SetNoSelection();
}
break;
case XFILL_BITMAP:
{
if ( pBitmapItem )
// &&
// SfxObjectShell::Current() &&
// SfxObjectShell::Current()->GetItem( SID_BITMAP_LIST ) )
{
String aString( pBitmapItem->GetName() );
// Bitmap aBitmap( pBitmapItem->GetValue() );
// SvxBitmapListItem aItem( *(const SvxBitmapListItem*)(
// SfxObjectShell::Current()->GetItem( SID_BITMAP_LIST ) ) );
pFillAttrLB->SelectEntry( aString );
// NEU
// Pruefen, ob Eintrag nicht in der Liste ist
if( pFillAttrLB->GetSelectEntry() != aString )
{
sal_uInt16 nCount = pFillAttrLB->GetEntryCount();
String aTmpStr;
if( nCount > 0 )
{
//Letzter Eintrag wird auf temporaeren Eintrag geprueft
aTmpStr = pFillAttrLB->GetEntry( nCount - 1 );
if( aTmpStr.GetChar(0) == TMP_STR_BEGIN &&
aTmpStr.GetChar(aTmpStr.Len()-1) == TMP_STR_END )
{
pFillAttrLB->RemoveEntry( nCount - 1 );
}
}
aTmpStr = TMP_STR_BEGIN;
aTmpStr += aString;
aTmpStr += TMP_STR_END;
XBitmapListSharedPtr aNew(XPropertyListFactory::CreateSharedXBitmapList(String::CreateFromAscii("TmpList")));
aNew->Insert(new XBitmapEntry(pBitmapItem->GetGraphicObject(), aTmpStr));
aNew->SetDirty(false);
pFillAttrLB->Fill( aNew );
pFillAttrLB->SelectEntryPos( pFillAttrLB->GetEntryCount() - 1 );
}
// NEU
}
else
pFillAttrLB->SetNoSelection();
}
break;
default:
DBG_ERROR( "Nicht unterstuetzter Flaechentyp" );
break;
}
}
if( pState && pStyleItem )
{
XFillStyle eXFS = (XFillStyle) pStyleItem->GetValue();
// Die Listen haben sich geaendert ?
if( pState->ISA( SvxColorTableItem ) &&
eXFS == XFILL_SOLID )
{
::Color aTmpColor( pFillAttrLB->GetSelectEntryColor() );
pFillAttrLB->Clear();
pFillAttrLB->Fill( ( (SvxColorTableItem*)pState )->GetColorTable() );
pFillAttrLB->SelectEntry( aTmpColor );
}
if( pState->ISA( SvxGradientListItem ) &&
eXFS == XFILL_GRADIENT )
{
String aString( pFillAttrLB->GetSelectEntry() );
pFillAttrLB->Clear();
pFillAttrLB->Fill( ( (SvxGradientListItem*)pState )->GetGradientList() );
pFillAttrLB->SelectEntry( aString );
}
if( pState->ISA( SvxHatchListItem ) &&
eXFS == XFILL_HATCH )
{
String aString( pFillAttrLB->GetSelectEntry() );
pFillAttrLB->Clear();
pFillAttrLB->Fill( ( (SvxHatchListItem*)pState )->GetHatchList() );
pFillAttrLB->SelectEntry( aString );
}
if( pState->ISA( SvxBitmapListItem ) &&
eXFS == XFILL_BITMAP )
{
String aString( pFillAttrLB->GetSelectEntry() );
pFillAttrLB->Clear();
pFillAttrLB->Fill( ( (SvxBitmapListItem*)pState )->GetBitmapList() );
pFillAttrLB->SelectEntry( aString );
}
}
}
//========================================================================
Window* SvxFillToolBoxControl::CreateItemWindow( Window *pParent )
{
if ( GetSlotId() == SID_ATTR_FILL_STYLE )
{
pFillControl = new FillControl( pParent );
// Damit dem FillControl das SvxFillToolBoxControl bekannt ist
// (und um kompatibel zu bleiben)
pFillControl->SetData( this );
pFillAttrLB = (SvxFillAttrBox*)pFillControl->pLbFillAttr;
pFillTypeLB = (SvxFillTypeBox*)pFillControl->pLbFillType;
pFillAttrLB->SetUniqueId( HID_FILL_ATTR_LISTBOX );
pFillTypeLB->SetUniqueId( HID_FILL_TYPE_LISTBOX );
return pFillControl;
}
return NULL;
}
/*************************************************************************
|*
|* FillControl
|*
\************************************************************************/
FillControl::FillControl( Window* pParent, WinBits nStyle ) :
Window( pParent, nStyle | WB_DIALOGCONTROL ),
pLbFillType(new SvxFillTypeBox( this )),
aLogicalFillSize(40,80),
aLogicalAttrSize(50,80)
{
pLbFillAttr = new SvxFillAttrBox( this );
Size aTypeSize(LogicToPixel(aLogicalFillSize, MAP_APPFONT));
Size aAttrSize(LogicToPixel(aLogicalAttrSize, MAP_APPFONT));
pLbFillType->SetSizePixel(aTypeSize);
pLbFillAttr->SetSizePixel(aAttrSize);
//to get the base height
aTypeSize = pLbFillType->GetSizePixel();
aAttrSize = pLbFillAttr->GetSizePixel();
Point aAttrPnt = pLbFillAttr->GetPosPixel();
SetSizePixel(
Size( aAttrPnt.X() + aAttrSize.Width(),
Max( aAttrSize.Height(), aTypeSize.Height() ) ) );
pLbFillType->SetSelectHdl( LINK( this, FillControl, SelectFillTypeHdl ) );
pLbFillAttr->SetSelectHdl( LINK( this, FillControl, SelectFillAttrHdl ) );
aDelayTimer.SetTimeout( DELAY_TIMEOUT );
aDelayTimer.SetTimeoutHdl( LINK( this, FillControl, DelayHdl ) );
aDelayTimer.Start();
}
//------------------------------------------------------------------------
FillControl::~FillControl()
{
delete pLbFillType;
delete pLbFillAttr;
}
//------------------------------------------------------------------------
IMPL_LINK_INLINE_START( FillControl, DelayHdl, Timer *, EMPTYARG )
{
SelectFillTypeHdl( NULL );
( (SvxFillToolBoxControl*)GetData() )->updateStatus( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:FillStyle" )));
// ( (SvxFillToolBoxControl*)GetData() )->GetBindings().Invalidate( SID_ATTR_FILL_STYLE );
return 0;
}
IMPL_LINK_INLINE_END( FillControl, DelayHdl, Timer *, pTimer )
//------------------------------------------------------------------------
IMPL_LINK( FillControl, SelectFillTypeHdl, ListBox *, pBox )
{
XFillStyle eXFS = (XFillStyle)pLbFillType->GetSelectEntryPos();
// Spaeter sollte eine Optimierung derart erfolgen, dass die
// Listen, bzw. Tables nur dann geloescht und wieder aufgebaut
// werden, wenn sich die Listen, bzw. Tables tatsaechlich geaendert
// haben (in den LBs natuerlich).
if ( ( pBox && !pBox->IsTravelSelect() ) || !pBox )
{
// Damit wir in folgendem Fall einen Status anzeigen koennen:
// Ein Typ wurde ausgewaehlt aber kein Attribut.
// Die Selektion hat genau die gleichen Attribute wie die vorherige.
// SvxFillToolBoxControl* pControlerItem = (SvxFillToolBoxControl*)GetData();
// if( pControlerItem )
// pControlerItem->ClearCache();
pLbFillAttr->Clear();
SfxObjectShell* pSh = SfxObjectShell::Current();
switch( eXFS )
{
case XFILL_NONE:
{
pLbFillType->Selected();
SelectFillAttrHdl( pBox );
pLbFillAttr->Disable();
}
break;
case XFILL_SOLID:
{
if ( pSh && pSh->GetItem( SID_COLOR_TABLE ) )
{
SvxColorTableItem aItem( *(const SvxColorTableItem*)(
pSh->GetItem( SID_COLOR_TABLE ) ) );
pLbFillAttr->Enable();
pLbFillAttr->Fill( aItem.GetColorTable() );
}
else
pLbFillAttr->Disable();
}
break;
case XFILL_GRADIENT:
{
if ( pSh && pSh->GetItem( SID_GRADIENT_LIST ) )
{
SvxGradientListItem aItem( *(const SvxGradientListItem*)(
pSh->GetItem( SID_GRADIENT_LIST ) ) );
pLbFillAttr->Enable();
pLbFillAttr->Fill( aItem.GetGradientList() );
}
else
pLbFillAttr->Disable();
}
break;
case XFILL_HATCH:
{
if ( pSh && pSh->GetItem( SID_HATCH_LIST ) )
{
SvxHatchListItem aItem( *(const SvxHatchListItem*)(
pSh->GetItem( SID_HATCH_LIST ) ) );
pLbFillAttr->Enable();
pLbFillAttr->Fill( aItem.GetHatchList() );
}
else
pLbFillAttr->Disable();
}
break;
case XFILL_BITMAP:
{
if ( pSh && pSh->GetItem( SID_BITMAP_LIST ) )
{
SvxBitmapListItem aItem( *(const SvxBitmapListItem*)(
pSh->GetItem( SID_BITMAP_LIST ) ) );
pLbFillAttr->Enable();
pLbFillAttr->Fill( aItem.GetBitmapList() );
}
else
pLbFillAttr->Disable();
}
break;
}
if( eXFS != XFILL_NONE ) // Wurde schon erledigt
{
if ( pBox )
pLbFillType->Selected();
// release focus
if ( pBox && pLbFillType->IsRelease() )
{
SfxViewShell* pViewShell = SfxViewShell::Current();
if( pViewShell && pViewShell->GetWindow() )
pViewShell->GetWindow()->GrabFocus();
}
}
}
return 0;
}
//------------------------------------------------------------------------
IMPL_LINK( FillControl, SelectFillAttrHdl, ListBox *, pBox )
{
XFillStyle eXFS = (XFillStyle)pLbFillType->GetSelectEntryPos();
XFillStyleItem aXFillStyleItem( eXFS );
sal_Bool bAction = pBox && !pLbFillAttr->IsTravelSelect();
SfxObjectShell* pSh = SfxObjectShell::Current();
if ( bAction )
{
Any a;
Sequence< PropertyValue > aArgs( 1 );
// First set the style
aArgs[0].Name = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "FillStyle" ));
aXFillStyleItem.QueryValue( a );
aArgs[0].Value = a;
((SvxFillToolBoxControl*)GetData())->Dispatch(
::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:FillStyle" )), aArgs );
switch( eXFS )
{
case XFILL_NONE:
{
}
break;
case XFILL_SOLID:
{
// NEU
//Eintrag wird auf temporaere Farbe geprueft
String aTmpStr = pLbFillAttr->GetSelectEntry();
if( aTmpStr.GetChar(0) == TMP_STR_BEGIN && aTmpStr.GetChar(aTmpStr.Len()-1) == TMP_STR_END )
{
aTmpStr.Erase( aTmpStr.Len()-1, 1 );
aTmpStr.Erase( 0, 1 );
}
XFillColorItem aXFillColorItem( aTmpStr, pLbFillAttr->GetSelectEntryColor() );
aArgs[0].Name = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "FillColor" ));
aXFillColorItem.QueryValue( a );
aArgs[0].Value = a;
((SvxFillToolBoxControl*)GetData())->Dispatch( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:FillColor" )),
aArgs );
}
break;
case XFILL_GRADIENT:
{
sal_uInt16 nPos = pLbFillAttr->GetSelectEntryPos();
if ( nPos != LISTBOX_ENTRY_NOTFOUND && pSh && pSh->GetItem( SID_GRADIENT_LIST ) )
{
SvxGradientListItem aItem(
*(const SvxGradientListItem*)( pSh->GetItem( SID_GRADIENT_LIST ) ) );
if ( nPos < aItem.GetGradientList()->Count() ) // kein temp. Eintrag ?
{
XGradient aGradient = aItem.GetGradientList()->GetGradient( nPos )->GetGradient();
XFillGradientItem aXFillGradientItem( pLbFillAttr->GetSelectEntry(), aGradient );
aArgs[0].Name = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "FillGradient" ));
aXFillGradientItem.QueryValue( a );
aArgs[0].Value = a;
((SvxFillToolBoxControl*)GetData())->Dispatch( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:FillGradient" )),
aArgs );
}
}
}
break;
case XFILL_HATCH:
{
sal_uInt16 nPos = pLbFillAttr->GetSelectEntryPos();
if ( nPos != LISTBOX_ENTRY_NOTFOUND && pSh && pSh->GetItem( SID_HATCH_LIST ) )
{
SvxHatchListItem aItem( *(const SvxHatchListItem*)( pSh->GetItem( SID_HATCH_LIST ) ) );
if ( nPos < aItem.GetHatchList()->Count() ) // kein temp. Eintrag ?
{
XHatch aHatch = aItem.GetHatchList()->GetHatch( nPos )->GetHatch();
XFillHatchItem aXFillHatchItem( pLbFillAttr->GetSelectEntry(), aHatch );
aArgs[0].Name = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "FillHatch" ));
aXFillHatchItem.QueryValue( a );
aArgs[0].Value = a;
((SvxFillToolBoxControl*)GetData())->Dispatch( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:FillHatch" )),
aArgs );
}
}
}
break;
case XFILL_BITMAP:
{
sal_uInt16 nPos = pLbFillAttr->GetSelectEntryPos();
if ( nPos != LISTBOX_ENTRY_NOTFOUND && pSh && pSh->GetItem( SID_BITMAP_LIST ) )
{
SvxBitmapListItem aItem(
*(const SvxBitmapListItem*)( pSh->GetItem( SID_BITMAP_LIST ) ) );
if ( nPos < aItem.GetBitmapList()->Count() ) // kein temp. Eintrag ?
{
const XBitmapEntry* pXBitmapEntry = aItem.GetBitmapList()->GetBitmap(nPos);
const XFillBitmapItem aXFillBitmapItem(pLbFillAttr->GetSelectEntry(), pXBitmapEntry->GetGraphicObject());
aArgs[0].Name = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "FillBitmap" ));
aXFillBitmapItem.QueryValue( a );
aArgs[0].Value = a;
((SvxFillToolBoxControl*)GetData())->Dispatch(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(".uno:FillBitmap")), aArgs);
}
}
}
break;
}
// release focus
if ( pLbFillAttr->IsRelease() && pBox )
{
SfxViewShell* pViewShell = SfxViewShell::Current();
if( pViewShell && pViewShell->GetWindow() )
{
pViewShell->GetWindow()->GrabFocus();
}
}
}
return 0;
}
//------------------------------------------------------------------------
void FillControl::Resize()
{
// Breite der beiden ListBoxen nicht 1/2 : 1/2, sondern 2/5 : 3/5
long nW = GetOutputSizePixel().Width() / 5;
long nH = 180;
long nSep = 0; // war vorher 4
pLbFillType->SetSizePixel( Size( nW * 2 - nSep, nH ) );
pLbFillAttr->SetPosSizePixel( Point( nW * 2 + nSep, 0 ), Size( nW * 3 - nSep, nH ) );
}
/* -----------------------------08.03.2002 15:04------------------------------
---------------------------------------------------------------------------*/
void FillControl::DataChanged( const DataChangedEvent& rDCEvt )
{
if ( (rDCEvt.GetType() == DATACHANGED_SETTINGS) &&
(rDCEvt.GetFlags() & SETTINGS_STYLE) )
{
Size aTypeSize(LogicToPixel(aLogicalFillSize, MAP_APPFONT));
Size aAttrSize(LogicToPixel(aLogicalAttrSize, MAP_APPFONT));
pLbFillType->SetSizePixel(aTypeSize);
pLbFillAttr->SetSizePixel(aAttrSize);
//to get the base height
aTypeSize = pLbFillType->GetSizePixel();
aAttrSize = pLbFillAttr->GetSizePixel();
Point aAttrPnt = pLbFillAttr->GetPosPixel();
SetSizePixel(
Size( aAttrPnt.X() + aAttrSize.Width(),
Max( aAttrSize.Height(), aTypeSize.Height() ) ) );
}
Window::DataChanged( rDCEvt );
}