2008/04/01 15:51:48 thb 1.18.258.2: #i85898# Stripping all external header guards 2008/03/31 14:24:07 rt 1.18.258.1: #i87441# Change license header to LPGL v3.
790 lines
24 KiB
C++
790 lines
24 KiB
C++
/*************************************************************************
|
|
*
|
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
|
*
|
|
* Copyright 2008 by Sun Microsystems, Inc.
|
|
*
|
|
* OpenOffice.org - a multi-platform office productivity suite
|
|
*
|
|
* $RCSfile: linectrl.cxx,v $
|
|
* $Revision: 1.19 $
|
|
*
|
|
* This file is part of OpenOffice.org.
|
|
*
|
|
* OpenOffice.org is free software: you can redistribute it and/or modify
|
|
* it under the terms of the GNU Lesser General Public License version 3
|
|
* only, as published by the Free Software Foundation.
|
|
*
|
|
* OpenOffice.org is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU Lesser General Public License version 3 for more details
|
|
* (a copy is included in the LICENSE file that accompanied this code).
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public License
|
|
* version 3 along with OpenOffice.org. If not, see
|
|
* <http://www.openoffice.org/license.html>
|
|
* for a copy of the LGPLv3 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
|
|
|
|
#ifndef _TOOLBOX_HXX //autogen
|
|
#include <vcl/toolbox.hxx>
|
|
#endif
|
|
#include <sfx2/app.hxx>
|
|
#include <sfx2/dispatch.hxx>
|
|
#include <sfx2/objsh.hxx>
|
|
|
|
#include <svx/dialogs.hrc>
|
|
#include "helpid.hrc"
|
|
|
|
#include "drawitem.hxx"
|
|
#include "xattr.hxx"
|
|
#include <svx/xtable.hxx>
|
|
#include "linectrl.hxx"
|
|
#include <svx/itemwin.hxx>
|
|
#include <svx/dialmgr.hxx>
|
|
|
|
using namespace ::rtl;
|
|
using namespace ::com::sun::star::uno;
|
|
using namespace ::com::sun::star::beans;
|
|
using namespace ::com::sun::star::util;
|
|
using namespace ::com::sun::star::frame;
|
|
using namespace ::com::sun::star::lang;
|
|
|
|
// Fuer Linienenden-Controller
|
|
#define MAX_LINES 12
|
|
|
|
// STATIC DATA -----------------------------------------------------------
|
|
|
|
#define RESIZE_VALUE_POPUP(value_set) \
|
|
{ \
|
|
Size aSize = GetOutputSizePixel(); \
|
|
aSize.Width() -= 4; \
|
|
aSize.Height() -= 4; \
|
|
(value_set).SetPosSizePixel( Point(2,2), aSize ); \
|
|
}
|
|
|
|
#define CALCSIZE_VALUE_POPUP(value_set,item_size) \
|
|
{ \
|
|
Size aSize = (value_set).CalcWindowSizePixel( (item_size) ); \
|
|
aSize.Width() += 4; \
|
|
aSize.Height() += 4; \
|
|
SetOutputSizePixel( aSize ); \
|
|
}
|
|
|
|
|
|
SFX_IMPL_TOOLBOX_CONTROL( SvxLineStyleToolBoxControl, XLineStyleItem );
|
|
SFX_IMPL_TOOLBOX_CONTROL( SvxLineWidthToolBoxControl, XLineWidthItem );
|
|
SFX_IMPL_TOOLBOX_CONTROL( SvxLineColorToolBoxControl, XLineColorItem );
|
|
SFX_IMPL_TOOLBOX_CONTROL( SvxLineEndToolBoxControl, SfxBoolItem );
|
|
|
|
/*************************************************************************
|
|
|*
|
|
|* SvxLineStyleToolBoxControl
|
|
|*
|
|
\************************************************************************/
|
|
|
|
SvxLineStyleToolBoxControl::SvxLineStyleToolBoxControl( USHORT nSlotId,
|
|
USHORT nId,
|
|
ToolBox& rTbx ) :
|
|
SfxToolBoxControl( nSlotId, nId, rTbx ),
|
|
pStyleItem ( NULL ),
|
|
pDashItem ( NULL ),
|
|
bUpdate ( FALSE )
|
|
{
|
|
addStatusListener( OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:LineDash" )));
|
|
addStatusListener( OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:DashListState" )));
|
|
}
|
|
|
|
//========================================================================
|
|
|
|
SvxLineStyleToolBoxControl::~SvxLineStyleToolBoxControl()
|
|
{
|
|
delete pStyleItem;
|
|
delete pDashItem;
|
|
}
|
|
|
|
//========================================================================
|
|
|
|
void SvxLineStyleToolBoxControl::StateChanged (
|
|
|
|
USHORT nSID, SfxItemState eState, const SfxPoolItem* pState )
|
|
|
|
{
|
|
SvxLineBox* pBox = (SvxLineBox*)GetToolBox().GetItemWindow( GetId() );
|
|
DBG_ASSERT( pBox, "Window not found!" );
|
|
|
|
if( eState == SFX_ITEM_DISABLED )
|
|
{
|
|
pBox->Disable();
|
|
pBox->SetNoSelection();
|
|
}
|
|
else
|
|
{
|
|
pBox->Enable();
|
|
|
|
if ( eState == SFX_ITEM_AVAILABLE )
|
|
{
|
|
if( nSID == SID_ATTR_LINE_STYLE )
|
|
{
|
|
delete pStyleItem;
|
|
pStyleItem = (XLineStyleItem*)pState->Clone();
|
|
}
|
|
else if( nSID == SID_ATTR_LINE_DASH )
|
|
{
|
|
delete pDashItem;
|
|
pDashItem = (XLineDashItem*)pState->Clone();
|
|
}
|
|
|
|
bUpdate = TRUE;
|
|
Update( pState );
|
|
}
|
|
else if ( nSID != SID_DASH_LIST )
|
|
{
|
|
// kein oder uneindeutiger Status
|
|
pBox->SetNoSelection();
|
|
}
|
|
}
|
|
}
|
|
|
|
//========================================================================
|
|
|
|
void SvxLineStyleToolBoxControl::Update( const SfxPoolItem* pState )
|
|
{
|
|
if ( pState && bUpdate )
|
|
{
|
|
bUpdate = FALSE;
|
|
|
|
SvxLineBox* pBox = (SvxLineBox*)GetToolBox().GetItemWindow( GetId() );
|
|
DBG_ASSERT( pBox, "Window not found!" );
|
|
|
|
// Da der Timer unerwartet zuschlagen kann, kann es vorkommen, dass
|
|
// die LB noch nicht gefuellt ist. Ein ClearCache() am Control im
|
|
// DelayHdl() blieb ohne Erfolg.
|
|
if( pBox->GetEntryCount() == 0 )
|
|
pBox->FillControl();
|
|
|
|
XLineStyle eXLS;
|
|
|
|
if ( pStyleItem )
|
|
eXLS = ( XLineStyle )pStyleItem->GetValue();
|
|
else
|
|
eXLS = XLINE_NONE;
|
|
|
|
switch( eXLS )
|
|
{
|
|
case XLINE_NONE:
|
|
pBox->SelectEntryPos( 0 );
|
|
break;
|
|
|
|
case XLINE_SOLID:
|
|
pBox->SelectEntryPos( 1 );
|
|
break;
|
|
|
|
case XLINE_DASH:
|
|
{
|
|
if( pDashItem )
|
|
{
|
|
String aString( pDashItem->GetName() );
|
|
pBox->SelectEntry( aString );
|
|
}
|
|
else
|
|
pBox->SetNoSelection();
|
|
}
|
|
break;
|
|
|
|
default:
|
|
DBG_ERROR( "Nicht unterstuetzter Linientyp" );
|
|
break;
|
|
}
|
|
}
|
|
|
|
if ( pState && ( pState->ISA( SvxDashListItem ) ) )
|
|
{
|
|
// Die Liste der Linienstile hat sich geaendert
|
|
SvxLineBox* pBox = (SvxLineBox*)GetToolBox().GetItemWindow( GetId() );
|
|
DBG_ASSERT( pBox, "Window not found!" );
|
|
|
|
String aString( pBox->GetSelectEntry() );
|
|
pBox->Clear();
|
|
pBox->InsertEntry( SVX_RESSTR(RID_SVXSTR_INVISIBLE) );
|
|
pBox->InsertEntry( SVX_RESSTR(RID_SVXSTR_SOLID) );
|
|
pBox->Fill( ((SvxDashListItem*)pState )->GetDashList() );
|
|
pBox->SelectEntry( aString );
|
|
}
|
|
}
|
|
|
|
//========================================================================
|
|
|
|
Window* SvxLineStyleToolBoxControl::CreateItemWindow( Window *pParent )
|
|
{
|
|
return new SvxLineBox( pParent, m_xFrame );
|
|
}
|
|
|
|
/*************************************************************************
|
|
|*
|
|
|* SvxLineWidthToolBoxControl
|
|
|*
|
|
\************************************************************************/
|
|
|
|
SvxLineWidthToolBoxControl::SvxLineWidthToolBoxControl(
|
|
USHORT nSlotId, USHORT nId, ToolBox& rTbx ) :
|
|
SfxToolBoxControl( nSlotId, nId, rTbx )
|
|
{
|
|
addStatusListener( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:MetricUnit" )));
|
|
}
|
|
|
|
//========================================================================
|
|
|
|
SvxLineWidthToolBoxControl::~SvxLineWidthToolBoxControl()
|
|
{
|
|
}
|
|
|
|
//========================================================================
|
|
|
|
void SvxLineWidthToolBoxControl::StateChanged(
|
|
USHORT nSID, SfxItemState eState, const SfxPoolItem* pState )
|
|
{
|
|
SvxMetricField* pFld = (SvxMetricField*)
|
|
GetToolBox().GetItemWindow( GetId() );
|
|
DBG_ASSERT( pFld, "Window not found" );
|
|
|
|
if ( nSID == SID_ATTR_METRIC )
|
|
{
|
|
pFld->RefreshDlgUnit();
|
|
}
|
|
else
|
|
{
|
|
if ( eState == SFX_ITEM_DISABLED )
|
|
{
|
|
pFld->Disable();
|
|
pFld->SetText( String() );
|
|
}
|
|
else
|
|
{
|
|
pFld->Enable();
|
|
|
|
if ( eState == SFX_ITEM_AVAILABLE )
|
|
{
|
|
DBG_ASSERT( pState->ISA(XLineWidthItem), "falscher ItemType" )
|
|
|
|
// Core-Unit an MetricField uebergeben
|
|
// Darf nicht in CreateItemWin() geschehen!
|
|
SfxMapUnit eUnit = SFX_MAPUNIT_100TH_MM; // CD!!! GetCoreMetric();
|
|
pFld->SetCoreUnit( eUnit );
|
|
|
|
pFld->Update( (const XLineWidthItem*)pState );
|
|
}
|
|
else
|
|
pFld->Update( NULL );
|
|
}
|
|
}
|
|
}
|
|
|
|
//========================================================================
|
|
|
|
Window* SvxLineWidthToolBoxControl::CreateItemWindow( Window *pParent )
|
|
{
|
|
return( new SvxMetricField( pParent, m_xFrame ) );
|
|
}
|
|
|
|
/*************************************************************************
|
|
|*
|
|
|* SvxLineColorToolBoxControl
|
|
|*
|
|
\************************************************************************/
|
|
|
|
SvxLineColorToolBoxControl::SvxLineColorToolBoxControl(
|
|
USHORT nSlotId, USHORT nId, ToolBox& rTbx ) :
|
|
SfxToolBoxControl( nSlotId, nId, rTbx )
|
|
{
|
|
addStatusListener( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:ColorTableState" )));
|
|
}
|
|
|
|
//========================================================================
|
|
|
|
SvxLineColorToolBoxControl::~SvxLineColorToolBoxControl()
|
|
{
|
|
}
|
|
|
|
//========================================================================
|
|
|
|
void SvxLineColorToolBoxControl::StateChanged(
|
|
|
|
USHORT nSID, SfxItemState eState, const SfxPoolItem* pState )
|
|
|
|
{
|
|
SvxColorBox* pBox = (SvxColorBox*)GetToolBox().GetItemWindow( GetId() );
|
|
DBG_ASSERT( pBox, "Window not found" );
|
|
|
|
if ( nSID != SID_COLOR_TABLE )
|
|
{
|
|
if ( eState == SFX_ITEM_DISABLED )
|
|
{
|
|
pBox->Disable();
|
|
pBox->SetNoSelection();
|
|
}
|
|
else
|
|
{
|
|
pBox->Enable();
|
|
|
|
if ( eState == SFX_ITEM_AVAILABLE )
|
|
{
|
|
DBG_ASSERT( pState->ISA(XLineColorItem), "falscher ItemTyoe" );
|
|
pBox->Update( (const XLineColorItem*) pState );
|
|
}
|
|
else
|
|
pBox->Update( NULL );
|
|
}
|
|
}
|
|
else
|
|
Update( pState );
|
|
}
|
|
|
|
//========================================================================
|
|
|
|
void SvxLineColorToolBoxControl::Update( const SfxPoolItem* pState )
|
|
{
|
|
if ( pState && ( pState->ISA( SvxColorTableItem ) ) )
|
|
{
|
|
SvxColorBox* pBox = (SvxColorBox*)GetToolBox().GetItemWindow( GetId() );
|
|
|
|
DBG_ASSERT( pBox, "Window not found" );
|
|
|
|
// Die Liste der Farben (ColorTable) hat sich geaendert:
|
|
::Color aTmpColor( pBox->GetSelectEntryColor() );
|
|
pBox->Clear();
|
|
pBox->Fill( ( (SvxColorTableItem*)pState )->GetColorTable() );
|
|
pBox->SelectEntry( aTmpColor );
|
|
}
|
|
}
|
|
|
|
//========================================================================
|
|
|
|
Window* SvxLineColorToolBoxControl::CreateItemWindow( Window *pParent )
|
|
{
|
|
return new SvxColorBox( pParent, m_aCommandURL, m_xFrame );
|
|
}
|
|
|
|
/*************************************************************************
|
|
|*
|
|
|* SvxLineEndWindow
|
|
|*
|
|
\************************************************************************/
|
|
|
|
SvxLineEndWindow::SvxLineEndWindow(
|
|
USHORT nSlotId,
|
|
const Reference< XFrame >& rFrame,
|
|
const String& rWndTitle ) :
|
|
SfxPopupWindow( nSlotId,
|
|
rFrame,
|
|
WinBits( WB_BORDER | WB_STDFLOATWIN | WB_SIZEABLE | WB_3DLOOK ) ),
|
|
pLineEndList ( NULL ),
|
|
aLineEndSet ( this, WinBits( WB_ITEMBORDER | WB_3DLOOK | WB_NO_DIRECTSELECT ) ),
|
|
nCols ( 2 ),
|
|
nLines ( 12 ),
|
|
nLineEndWidth ( 400 ),
|
|
bPopupMode ( TRUE ),
|
|
mbInResize ( false ),
|
|
mxFrame ( rFrame )
|
|
{
|
|
SetText( rWndTitle );
|
|
implInit();
|
|
}
|
|
|
|
SvxLineEndWindow::SvxLineEndWindow(
|
|
USHORT nSlotId,
|
|
const Reference< XFrame >& rFrame,
|
|
Window* pParentWindow,
|
|
const String& rWndTitle ) :
|
|
SfxPopupWindow( nSlotId,
|
|
rFrame,
|
|
pParentWindow,
|
|
WinBits( WB_BORDER | WB_STDFLOATWIN | WB_SIZEABLE | WB_3DLOOK ) ),
|
|
pLineEndList ( NULL ),
|
|
aLineEndSet ( this, WinBits( WB_ITEMBORDER | WB_3DLOOK | WB_NO_DIRECTSELECT ) ),
|
|
nCols ( 2 ),
|
|
nLines ( 12 ),
|
|
nLineEndWidth ( 400 ),
|
|
bPopupMode ( TRUE ),
|
|
mbInResize ( false ),
|
|
mxFrame ( rFrame )
|
|
{
|
|
SetText( rWndTitle );
|
|
implInit();
|
|
}
|
|
|
|
void SvxLineEndWindow::implInit()
|
|
{
|
|
SfxObjectShell* pDocSh = SfxObjectShell::Current();
|
|
const SfxPoolItem* pItem = NULL;
|
|
|
|
SetHelpId( HID_POPUP_LINEEND );
|
|
aLineEndSet.SetHelpId( HID_POPUP_LINEEND_CTRL );
|
|
|
|
if ( pDocSh )
|
|
{
|
|
pItem = pDocSh->GetItem( SID_LINEEND_LIST );
|
|
if( pItem )
|
|
pLineEndList = ( (SvxLineEndListItem*) pItem )->GetLineEndList();
|
|
|
|
pItem = pDocSh->GetItem( SID_ATTR_LINEEND_WIDTH_DEFAULT );
|
|
if( pItem )
|
|
nLineEndWidth = ( (SfxUInt16Item*) pItem )->GetValue();
|
|
}
|
|
DBG_ASSERT( pLineEndList, "LineEndList wurde nicht gefunden" );
|
|
|
|
aLineEndSet.SetSelectHdl( LINK( this, SvxLineEndWindow, SelectHdl ) );
|
|
aLineEndSet.SetColCount( nCols );
|
|
|
|
// ValueSet mit Eintraegen der LineEndList fuellen
|
|
FillValueSet();
|
|
|
|
AddStatusListener( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:LineEndListState" )));
|
|
|
|
//ChangeHelpId( HID_POPUP_LINEENDSTYLE );
|
|
aLineEndSet.Show();
|
|
}
|
|
|
|
SfxPopupWindow* SvxLineEndWindow::Clone() const
|
|
{
|
|
return new SvxLineEndWindow( GetId(), mxFrame, GetText() );
|
|
}
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
SvxLineEndWindow::~SvxLineEndWindow()
|
|
{
|
|
}
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
IMPL_LINK( SvxLineEndWindow, SelectHdl, void *, EMPTYARG )
|
|
{
|
|
XLineEndItem* pLineEndItem = NULL;
|
|
XLineStartItem* pLineStartItem = NULL;
|
|
USHORT nId = aLineEndSet.GetSelectItemId();
|
|
|
|
if( nId == 1 )
|
|
{
|
|
pLineStartItem = new XLineStartItem();
|
|
}
|
|
else if( nId == 2 )
|
|
{
|
|
pLineEndItem = new XLineEndItem();
|
|
}
|
|
else if( nId % 2 ) // LinienAnfang
|
|
{
|
|
XLineEndEntry* pEntry = pLineEndList->GetLineEnd( ( nId - 1 ) / 2 - 1 );
|
|
pLineStartItem = new XLineStartItem( pEntry->GetName(), pEntry->GetLineEnd() );
|
|
}
|
|
else // LinienEnde
|
|
{
|
|
XLineEndEntry* pEntry = pLineEndList->GetLineEnd( nId / 2 - 2 );
|
|
pLineEndItem = new XLineEndItem( pEntry->GetName(), pEntry->GetLineEnd() );
|
|
}
|
|
|
|
if ( IsInPopupMode() )
|
|
EndPopupMode();
|
|
|
|
Sequence< PropertyValue > aArgs( 1 );
|
|
Any a;
|
|
|
|
if ( pLineStartItem )
|
|
{
|
|
aArgs[0].Name = OUString( RTL_CONSTASCII_USTRINGPARAM( "LineStart" ));
|
|
pLineStartItem->QueryValue( a );
|
|
aArgs[0].Value = a;
|
|
}
|
|
else
|
|
{
|
|
aArgs[0].Name = OUString( RTL_CONSTASCII_USTRINGPARAM( "LineEnd" ));
|
|
pLineEndItem->QueryValue( a );
|
|
aArgs[0].Value = a;
|
|
}
|
|
|
|
/* #i33380# DR 2004-09-03 Moved the following line above the Dispatch() call.
|
|
This instance may be deleted in the meantime (i.e. when a dialog is opened
|
|
while in Dispatch()), accessing members will crash in this case. */
|
|
aLineEndSet.SetNoSelection();
|
|
|
|
SfxToolBoxControl::Dispatch( Reference< XDispatchProvider >( mxFrame->getController(), UNO_QUERY ),
|
|
OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:LineEndStyle" )),
|
|
aArgs );
|
|
|
|
delete pLineEndItem;
|
|
delete pLineStartItem;
|
|
|
|
return 0;
|
|
}
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
void SvxLineEndWindow::FillValueSet()
|
|
{
|
|
if( pLineEndList )
|
|
{
|
|
XLineEndEntry* pEntry = NULL;
|
|
Bitmap* pBmp = NULL;
|
|
VirtualDevice aVD;
|
|
|
|
long nCount = pLineEndList->Count();
|
|
|
|
// Erster Eintrag: kein LinienEnde
|
|
// Temporaer wird ein Eintrag hinzugefuegt, um die UI-Bitmap zu erhalten
|
|
basegfx::B2DPolyPolygon aNothing;
|
|
pLineEndList->Insert( new XLineEndEntry( aNothing, SVX_RESSTR( RID_SVXSTR_NONE ) ) );
|
|
pEntry = pLineEndList->GetLineEnd( nCount );
|
|
pBmp = pLineEndList->GetBitmap( nCount );
|
|
DBG_ASSERT( pBmp, "UI-Bitmap wurde nicht erzeugt" );
|
|
|
|
aBmpSize = pBmp->GetSizePixel();
|
|
aVD.SetOutputSizePixel( aBmpSize, FALSE );
|
|
aBmpSize.Width() = aBmpSize.Width() / 2;
|
|
Point aPt0( 0, 0 );
|
|
Point aPt1( aBmpSize.Width(), 0 );
|
|
|
|
aVD.DrawBitmap( Point(), *pBmp );
|
|
aLineEndSet.InsertItem( 1, aVD.GetBitmap( aPt0, aBmpSize ), pEntry->GetName() );
|
|
aLineEndSet.InsertItem( 2, aVD.GetBitmap( aPt1, aBmpSize ), pEntry->GetName() );
|
|
|
|
delete pLineEndList->Remove( nCount );
|
|
|
|
for( long i = 0; i < nCount; i++ )
|
|
{
|
|
pEntry = pLineEndList->GetLineEnd( i );
|
|
DBG_ASSERT( pEntry, "Konnte auf LineEndEntry nicht zugreifen" );
|
|
pBmp = pLineEndList->GetBitmap( i );
|
|
DBG_ASSERT( pBmp, "UI-Bitmap wurde nicht erzeugt" );
|
|
|
|
aVD.DrawBitmap( aPt0, *pBmp );
|
|
aLineEndSet.InsertItem( (USHORT)((i+1L)*2L+1L), aVD.GetBitmap( aPt0, aBmpSize ), pEntry->GetName() );
|
|
aLineEndSet.InsertItem( (USHORT)((i+2L)*2L), aVD.GetBitmap( aPt1, aBmpSize ), pEntry->GetName() );
|
|
}
|
|
nLines = Min( (USHORT)(nCount + 1), (USHORT) MAX_LINES );
|
|
aLineEndSet.SetLineCount( nLines );
|
|
|
|
SetSize();
|
|
}
|
|
}
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
void SvxLineEndWindow::Resize()
|
|
{
|
|
// since we change the size inside this call, check if we
|
|
// are called recursive
|
|
if( !mbInResize )
|
|
{
|
|
mbInResize = true;
|
|
if ( !IsRollUp() )
|
|
{
|
|
aLineEndSet.SetColCount( nCols );
|
|
aLineEndSet.SetLineCount( nLines );
|
|
|
|
SetSize();
|
|
|
|
Size aSize = GetOutputSizePixel();
|
|
aSize.Width() -= 4;
|
|
aSize.Height() -= 4;
|
|
aLineEndSet.SetPosSizePixel( Point( 2, 2 ), aSize );
|
|
}
|
|
//SfxPopupWindow::Resize();
|
|
mbInResize = false;
|
|
}
|
|
}
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
void __EXPORT SvxLineEndWindow::Resizing( Size& rNewSize )
|
|
{
|
|
Size aBitmapSize = aBmpSize; // -> Member
|
|
aBitmapSize.Width() += 6; //
|
|
aBitmapSize.Height() += 6; //
|
|
|
|
Size aItemSize = aLineEndSet.CalcItemSizePixel( aBitmapSize ); // -> Member
|
|
//Size aOldSize = GetOutputSizePixel(); // fuer Breite
|
|
|
|
USHORT nItemCount = aLineEndSet.GetItemCount(); // -> Member
|
|
|
|
// Spalten ermitteln
|
|
long nItemW = aItemSize.Width();
|
|
long nW = rNewSize.Width();
|
|
nCols = (USHORT) Max( ( (ULONG)(( nW + nItemW ) / ( nItemW * 2 ) )),
|
|
(ULONG) 1L );
|
|
nCols *= 2;
|
|
|
|
// Reihen ermitteln
|
|
long nItemH = aItemSize.Height();
|
|
long nH = rNewSize.Height();
|
|
nLines = (USHORT) Max( ( ( nH + nItemH / 2 ) / nItemH ), 1L );
|
|
|
|
USHORT nMaxCols = nItemCount / nLines;
|
|
if( nItemCount % nLines )
|
|
nMaxCols++;
|
|
if( nCols > nMaxCols )
|
|
nCols = nMaxCols;
|
|
nW = nItemW * nCols;
|
|
|
|
// Keine ungerade Anzahl von Spalten
|
|
if( nCols % 2 )
|
|
nCols--;
|
|
nCols = Max( nCols, (USHORT) 2 );
|
|
|
|
USHORT nMaxLines = nItemCount / nCols;
|
|
if( nItemCount % nCols )
|
|
nMaxLines++;
|
|
if( nLines > nMaxLines )
|
|
nLines = nMaxLines;
|
|
nH = nItemH * nLines;
|
|
|
|
rNewSize.Width() = nW;
|
|
rNewSize.Height() = nH;
|
|
}
|
|
// -----------------------------------------------------------------------
|
|
|
|
void SvxLineEndWindow::StartSelection()
|
|
{
|
|
aLineEndSet.StartSelection();
|
|
}
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
BOOL SvxLineEndWindow::Close()
|
|
{
|
|
return SfxPopupWindow::Close();
|
|
}
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
void SvxLineEndWindow::StateChanged(
|
|
USHORT nSID, SfxItemState, const SfxPoolItem* pState )
|
|
{
|
|
if ( nSID == SID_LINEEND_LIST )
|
|
{
|
|
// Die Liste der LinienEnden (LineEndList) hat sich geaendert:
|
|
if ( pState && pState->ISA( SvxLineEndListItem ))
|
|
{
|
|
pLineEndList = ((SvxLineEndListItem*)pState)->GetLineEndList();
|
|
DBG_ASSERT( pLineEndList, "LineEndList nicht gefunden" );
|
|
|
|
aLineEndSet.Clear();
|
|
FillValueSet();
|
|
|
|
Size aSize = GetOutputSizePixel();
|
|
Resizing( aSize );
|
|
Resize();
|
|
}
|
|
}
|
|
}
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
void SvxLineEndWindow::PopupModeEnd()
|
|
{
|
|
if ( IsVisible() )
|
|
{
|
|
bPopupMode = FALSE;
|
|
SetSize();
|
|
}
|
|
SfxPopupWindow::PopupModeEnd();
|
|
}
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
void SvxLineEndWindow::SetSize()
|
|
{
|
|
//if( !bPopupMode )
|
|
if( !IsInPopupMode() )
|
|
{
|
|
USHORT nItemCount = aLineEndSet.GetItemCount(); // -> Member
|
|
USHORT nMaxLines = nItemCount / nCols; // -> Member ?
|
|
if( nItemCount % nCols )
|
|
nMaxLines++;
|
|
|
|
WinBits nBits = aLineEndSet.GetStyle();
|
|
if ( nLines == nMaxLines )
|
|
nBits &= ~WB_VSCROLL;
|
|
else
|
|
nBits |= WB_VSCROLL;
|
|
aLineEndSet.SetStyle( nBits );
|
|
}
|
|
|
|
Size aSize( aBmpSize );
|
|
aSize.Width() += 6;
|
|
aSize.Height() += 6;
|
|
aSize = aLineEndSet.CalcWindowSizePixel( aSize );
|
|
aSize.Width() += 4;
|
|
aSize.Height() += 4;
|
|
SetOutputSizePixel( aSize );
|
|
aSize.Height() = aBmpSize.Height();
|
|
aSize.Height() += 14;
|
|
//SetMinOutputSizePixel( aSize );
|
|
}
|
|
|
|
void SvxLineEndWindow::GetFocus (void)
|
|
{
|
|
SfxPopupWindow::GetFocus();
|
|
// Grab the focus to the line ends value set so that it can be controlled
|
|
// with the keyboard.
|
|
aLineEndSet.GrabFocus();
|
|
}
|
|
|
|
/*************************************************************************
|
|
|*
|
|
|* SvxLineEndToolBoxControl
|
|
|*
|
|
\************************************************************************/
|
|
|
|
SvxLineEndToolBoxControl::SvxLineEndToolBoxControl( USHORT nSlotId, USHORT nId, ToolBox &rTbx ) :
|
|
SfxToolBoxControl( nSlotId, nId, rTbx )
|
|
{
|
|
rTbx.SetItemBits( nId, TIB_DROPDOWNONLY | rTbx.GetItemBits( nId ) );
|
|
rTbx.Invalidate();
|
|
}
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
SvxLineEndToolBoxControl::~SvxLineEndToolBoxControl()
|
|
{
|
|
}
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
SfxPopupWindowType SvxLineEndToolBoxControl::GetPopupWindowType() const
|
|
{
|
|
return SFX_POPUPWINDOW_ONCLICK;
|
|
}
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
SfxPopupWindow* SvxLineEndToolBoxControl::CreatePopupWindow()
|
|
{
|
|
SvxLineEndWindow* pLineEndWin =
|
|
new SvxLineEndWindow( GetId(), m_xFrame, &GetToolBox(), SVX_RESSTR( RID_SVXSTR_LINEEND ) );
|
|
pLineEndWin->StartPopupMode( &GetToolBox(), TRUE );
|
|
pLineEndWin->StartSelection();
|
|
SetPopupWindow( pLineEndWin );
|
|
return pLineEndWin;
|
|
}
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
void SvxLineEndToolBoxControl::StateChanged( USHORT, SfxItemState eState, const SfxPoolItem* )
|
|
{
|
|
USHORT nId = GetId();
|
|
ToolBox& rTbx = GetToolBox();
|
|
|
|
rTbx.EnableItem( nId, SFX_ITEM_DISABLED != eState );
|
|
rTbx.SetItemState( nId, ( SFX_ITEM_DONTCARE == eState ) ? STATE_DONTKNOW : STATE_NOCHECK );
|
|
}
|
|
|