2000-09-18 16:07:07 +00:00
|
|
|
/*************************************************************************
|
|
|
|
*
|
2008-04-10 19:29:54 +00:00
|
|
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
2000-09-18 16:07:07 +00:00
|
|
|
*
|
2010-02-12 15:01:35 +01:00
|
|
|
* Copyright 2000, 2010 Oracle and/or its affiliates.
|
2000-09-18 16:07:07 +00:00
|
|
|
*
|
2008-04-10 19:29:54 +00:00
|
|
|
* OpenOffice.org - a multi-platform office productivity suite
|
2000-09-18 16:07:07 +00:00
|
|
|
*
|
2008-04-10 19:29:54 +00:00
|
|
|
* This file is part of OpenOffice.org.
|
2000-09-18 16:07:07 +00:00
|
|
|
*
|
2008-04-10 19:29:54 +00:00
|
|
|
* 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.
|
2000-09-18 16:07:07 +00:00
|
|
|
*
|
2008-04-10 19:29:54 +00:00
|
|
|
* 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).
|
2000-09-18 16:07:07 +00:00
|
|
|
*
|
2008-04-10 19:29:54 +00:00
|
|
|
* 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.
|
2000-09-18 16:07:07 +00:00
|
|
|
*
|
|
|
|
************************************************************************/
|
|
|
|
|
2006-09-17 13:42:56 +00:00
|
|
|
// MARKER(update_precomp.py): autogen include statement, do not remove
|
|
|
|
#include "precompiled_svtools.hxx"
|
2000-09-18 16:07:07 +00:00
|
|
|
#include <tools/list.hxx>
|
|
|
|
#include <tools/debug.hxx>
|
|
|
|
#include <vcl/decoview.hxx>
|
|
|
|
#include <vcl/svapp.hxx>
|
|
|
|
#ifndef _SCRBAR_HXX
|
|
|
|
#include <vcl/scrbar.hxx>
|
|
|
|
#endif
|
|
|
|
#ifndef _HELP_HXX
|
|
|
|
#include <vcl/help.hxx>
|
|
|
|
#endif
|
2003-04-24 14:49:45 +00:00
|
|
|
#include <com/sun/star/accessibility/AccessibleEventObject.hpp>
|
|
|
|
#include <com/sun/star/accessibility/AccessibleEventId.hpp>
|
|
|
|
#include <com/sun/star/accessibility/AccessibleStateType.hpp>
|
2002-11-20 15:37:01 +00:00
|
|
|
#include <com/sun/star/lang/XComponent.hpp>
|
2002-11-26 11:05:04 +00:00
|
|
|
#include <rtl/ustring.hxx>
|
2002-02-25 09:52:14 +00:00
|
|
|
|
2002-03-05 14:54:15 +00:00
|
|
|
#include "valueimp.hxx"
|
|
|
|
|
2000-09-18 16:07:07 +00:00
|
|
|
#define _SV_VALUESET_CXX
|
2007-06-27 20:26:38 +00:00
|
|
|
#include <svtools/valueset.hxx>
|
2000-09-18 16:07:07 +00:00
|
|
|
|
2002-02-25 09:52:14 +00:00
|
|
|
// ------------
|
|
|
|
// - ValueSet -
|
|
|
|
// ------------
|
2000-09-18 16:07:07 +00:00
|
|
|
|
2006-06-19 19:58:33 +00:00
|
|
|
void ValueSet::ImplInit()
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
2004-06-16 09:13:21 +00:00
|
|
|
// Size aWinSize = GetSizePixel();
|
2007-05-22 18:33:21 +00:00
|
|
|
mpImpl = new ValueSet_Impl;
|
2000-09-18 16:07:07 +00:00
|
|
|
mpNoneItem = NULL;
|
|
|
|
mpScrBar = NULL;
|
|
|
|
mnTextOffset = 0;
|
|
|
|
mnVisLines = 0;
|
|
|
|
mnLines = 0;
|
|
|
|
mnUserItemWidth = 0;
|
|
|
|
mnUserItemHeight = 0;
|
|
|
|
mnFirstLine = 0;
|
|
|
|
mnOldItemId = 0;
|
|
|
|
mnSelItemId = 0;
|
|
|
|
mnHighItemId = 0;
|
|
|
|
mnDropPos = VALUESET_ITEM_NOTFOUND;
|
|
|
|
mnCols = 0;
|
|
|
|
mnCurCol = 0;
|
|
|
|
mnUserCols = 0;
|
|
|
|
mnUserVisLines = 0;
|
|
|
|
mnSpacing = 0;
|
|
|
|
mnFrameStyle = 0;
|
2010-11-05 10:31:15 +08:00
|
|
|
mbFormat = sal_True;
|
|
|
|
mbHighlight = sal_False ;
|
|
|
|
mbSelection = sal_False;
|
|
|
|
mbNoSelection = sal_True;
|
|
|
|
mbDrawSelection = sal_True;
|
|
|
|
mbBlackSel = sal_False;
|
|
|
|
mbDoubleSel = sal_False;
|
|
|
|
mbScroll = sal_False;
|
|
|
|
mbDropPos = sal_False;
|
|
|
|
mbFullMode = sal_True;
|
2000-09-18 16:07:07 +00:00
|
|
|
|
2003-03-27 13:40:07 +00:00
|
|
|
// #106446#, #106601# force mirroring of virtual device
|
|
|
|
maVirDev.EnableRTL( GetParent()->IsRTLEnabled() );
|
|
|
|
|
2010-11-05 10:31:15 +08:00
|
|
|
ImplInitSettings( sal_True, sal_True, sal_True );
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
2007-08-03 12:32:02 +00:00
|
|
|
ValueSet::ValueSet( Window* pParent, WinBits nWinStyle, bool bDisableTransientChildren ) :
|
2000-09-18 16:07:07 +00:00
|
|
|
Control( pParent, nWinStyle ),
|
|
|
|
maVirDev( *this ),
|
|
|
|
maColor( COL_TRANSPARENT )
|
|
|
|
{
|
2006-06-19 19:58:33 +00:00
|
|
|
ImplInit();
|
2007-08-03 12:32:02 +00:00
|
|
|
if( mpImpl )
|
|
|
|
mpImpl->mbIsTransientChildrenDisabled = bDisableTransientChildren;
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
2007-08-03 12:32:02 +00:00
|
|
|
ValueSet::ValueSet( Window* pParent, const ResId& rResId, bool bDisableTransientChildren ) :
|
2000-09-18 16:07:07 +00:00
|
|
|
Control( pParent, rResId ),
|
|
|
|
maVirDev( *this ),
|
|
|
|
maColor( COL_TRANSPARENT )
|
|
|
|
{
|
2006-06-19 19:58:33 +00:00
|
|
|
ImplInit();
|
2007-08-03 12:32:02 +00:00
|
|
|
if( mpImpl )
|
|
|
|
mpImpl->mbIsTransientChildrenDisabled = bDisableTransientChildren;
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
ValueSet::~ValueSet()
|
|
|
|
{
|
2002-11-21 11:50:41 +00:00
|
|
|
::com::sun::star::uno::Reference< ::com::sun::star::lang::XComponent>
|
2010-11-05 10:31:15 +08:00
|
|
|
xComponent (GetAccessible(sal_False), ::com::sun::star::uno::UNO_QUERY);
|
2002-11-20 15:37:01 +00:00
|
|
|
if (xComponent.is())
|
|
|
|
xComponent->dispose ();
|
|
|
|
|
2000-09-18 16:07:07 +00:00
|
|
|
if ( mpScrBar )
|
|
|
|
delete mpScrBar;
|
|
|
|
|
|
|
|
if ( mpNoneItem )
|
|
|
|
delete mpNoneItem;
|
|
|
|
|
2002-02-25 09:52:14 +00:00
|
|
|
ImplDeleteItems();
|
2007-05-22 18:33:21 +00:00
|
|
|
delete mpImpl;
|
2002-02-25 09:52:14 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
void ValueSet::ImplDeleteItems()
|
|
|
|
{
|
2007-05-22 18:33:21 +00:00
|
|
|
for( ValueSetItem* pItem = mpImpl->mpItemList->First(); pItem; pItem = mpImpl->mpItemList->Next() )
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
2002-02-25 09:52:14 +00:00
|
|
|
if( !pItem->maRect.IsEmpty() && ImplHasAccessibleListeners() )
|
|
|
|
{
|
|
|
|
::com::sun::star::uno::Any aOldAny, aNewAny;
|
|
|
|
|
2007-05-22 18:33:21 +00:00
|
|
|
aOldAny <<= pItem->GetAccessible( mpImpl->mbIsTransientChildrenDisabled );
|
2003-04-24 14:49:45 +00:00
|
|
|
ImplFireAccessibleEvent( ::com::sun::star::accessibility::AccessibleEventId::CHILD, aOldAny, aNewAny );
|
2002-02-25 09:52:14 +00:00
|
|
|
}
|
|
|
|
|
2000-09-18 16:07:07 +00:00
|
|
|
delete pItem;
|
|
|
|
}
|
2002-02-25 09:52:14 +00:00
|
|
|
|
2007-05-22 18:33:21 +00:00
|
|
|
mpImpl->mpItemList->Clear();
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
2010-11-05 10:31:15 +08:00
|
|
|
void ValueSet::ImplInitSettings( sal_Bool bFont,
|
|
|
|
sal_Bool bForeground, sal_Bool bBackground )
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings();
|
|
|
|
|
|
|
|
if ( bFont )
|
|
|
|
{
|
|
|
|
Font aFont;
|
|
|
|
aFont = rStyleSettings.GetAppFont();
|
|
|
|
if ( IsControlFont() )
|
|
|
|
aFont.Merge( GetControlFont() );
|
|
|
|
SetZoomedPointFont( aFont );
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( bForeground || bFont )
|
|
|
|
{
|
|
|
|
Color aColor;
|
|
|
|
if ( IsControlForeground() )
|
|
|
|
aColor = GetControlForeground();
|
|
|
|
else
|
|
|
|
aColor = rStyleSettings.GetButtonTextColor();
|
|
|
|
SetTextColor( aColor );
|
|
|
|
SetTextFillColor();
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( bBackground )
|
|
|
|
{
|
|
|
|
Color aColor;
|
|
|
|
if ( IsControlBackground() )
|
|
|
|
aColor = GetControlBackground();
|
2004-08-02 16:56:55 +00:00
|
|
|
else if ( GetStyle() & WB_MENUSTYLEVALUESET )
|
|
|
|
aColor = rStyleSettings.GetMenuColor();
|
|
|
|
else if ( IsEnabled() && (GetStyle() & WB_FLATVALUESET) )
|
2000-09-18 16:07:07 +00:00
|
|
|
aColor = rStyleSettings.GetWindowColor();
|
|
|
|
else
|
|
|
|
aColor = rStyleSettings.GetFaceColor();
|
|
|
|
SetBackground( aColor );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
void ValueSet::ImplInitScrollBar()
|
|
|
|
{
|
|
|
|
if ( GetStyle() & WB_VSCROLL )
|
|
|
|
{
|
|
|
|
if ( !mpScrBar )
|
|
|
|
{
|
|
|
|
mpScrBar = new ScrollBar( this, WB_VSCROLL | WB_DRAG );
|
|
|
|
mpScrBar->SetScrollHdl( LINK( this, ValueSet, ImplScrollHdl ) );
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
// Wegen Einstellungsaenderungen passen wir hier die Breite an
|
|
|
|
long nScrBarWidth = GetSettings().GetStyleSettings().GetScrollBarSize();
|
|
|
|
mpScrBar->SetPosSizePixel( 0, 0, nScrBarWidth, 0, WINDOW_POSSIZE_WIDTH );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
void ValueSet::ImplFormatItem( ValueSetItem* pItem )
|
|
|
|
{
|
|
|
|
if ( pItem->meType == VALUESETITEM_SPACE )
|
|
|
|
return;
|
|
|
|
|
|
|
|
Rectangle aRect = pItem->maRect;
|
|
|
|
WinBits nStyle = GetStyle();
|
|
|
|
if ( nStyle & WB_ITEMBORDER )
|
|
|
|
{
|
|
|
|
aRect.Left()++;
|
|
|
|
aRect.Top()++;
|
|
|
|
aRect.Right()--;
|
|
|
|
aRect.Bottom()--;
|
|
|
|
if ( nStyle & WB_FLATVALUESET )
|
|
|
|
{
|
|
|
|
if ( nStyle & WB_DOUBLEBORDER )
|
|
|
|
{
|
|
|
|
aRect.Left() += 2;
|
|
|
|
aRect.Top() += 2;
|
|
|
|
aRect.Right() -= 2;
|
|
|
|
aRect.Bottom() -= 2;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
aRect.Left()++;
|
|
|
|
aRect.Top()++;
|
|
|
|
aRect.Right()--;
|
|
|
|
aRect.Bottom()--;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
DecorationView aView( &maVirDev );
|
|
|
|
aRect = aView.DrawFrame( aRect, mnFrameStyle );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( pItem == mpNoneItem )
|
|
|
|
pItem->maText = GetText();
|
|
|
|
|
|
|
|
if ( (aRect.GetHeight() > 0) && (aRect.GetWidth() > 0) )
|
|
|
|
{
|
|
|
|
if ( pItem == mpNoneItem )
|
|
|
|
{
|
|
|
|
const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings();
|
|
|
|
maVirDev.SetFont( GetFont() );
|
2004-04-02 13:41:07 +00:00
|
|
|
maVirDev.SetTextColor( ( nStyle & WB_MENUSTYLEVALUESET ) ? rStyleSettings.GetMenuTextColor() : rStyleSettings.GetWindowTextColor() );
|
2000-09-18 16:07:07 +00:00
|
|
|
maVirDev.SetTextFillColor();
|
2004-04-02 13:41:07 +00:00
|
|
|
maVirDev.SetFillColor( ( nStyle & WB_MENUSTYLEVALUESET ) ? rStyleSettings.GetMenuColor() : rStyleSettings.GetWindowColor() );
|
2000-09-18 16:07:07 +00:00
|
|
|
maVirDev.DrawRect( aRect );
|
|
|
|
Point aTxtPos( aRect.Left()+2, aRect.Top() );
|
|
|
|
long nTxtWidth = GetTextWidth( pItem->maText );
|
|
|
|
if ( nStyle & WB_RADIOSEL )
|
|
|
|
{
|
|
|
|
aTxtPos.X() += 4;
|
|
|
|
aTxtPos.Y() += 4;
|
|
|
|
}
|
|
|
|
if ( (aTxtPos.X()+nTxtWidth) > aRect.Right() )
|
|
|
|
{
|
|
|
|
maVirDev.SetClipRegion( Region( aRect ) );
|
|
|
|
maVirDev.DrawText( aTxtPos, pItem->maText );
|
|
|
|
maVirDev.SetClipRegion();
|
|
|
|
}
|
|
|
|
else
|
|
|
|
maVirDev.DrawText( aTxtPos, pItem->maText );
|
|
|
|
}
|
|
|
|
else if ( pItem->meType == VALUESETITEM_COLOR )
|
|
|
|
{
|
|
|
|
maVirDev.SetFillColor( pItem->maColor );
|
|
|
|
maVirDev.DrawRect( aRect );
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2004-04-02 13:41:07 +00:00
|
|
|
const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings();
|
2000-09-18 16:07:07 +00:00
|
|
|
if ( IsColor() )
|
|
|
|
maVirDev.SetFillColor( maColor );
|
2004-08-02 16:56:55 +00:00
|
|
|
else if ( nStyle & WB_MENUSTYLEVALUESET )
|
|
|
|
maVirDev.SetFillColor( rStyleSettings.GetMenuColor() );
|
|
|
|
else if ( IsEnabled() )
|
|
|
|
maVirDev.SetFillColor( rStyleSettings.GetWindowColor() );
|
2000-09-18 16:07:07 +00:00
|
|
|
else
|
2004-08-02 16:56:55 +00:00
|
|
|
maVirDev.SetFillColor( rStyleSettings.GetFaceColor() );
|
2000-09-18 16:07:07 +00:00
|
|
|
maVirDev.DrawRect( aRect );
|
|
|
|
|
|
|
|
if ( pItem->meType == VALUESETITEM_USERDRAW )
|
|
|
|
{
|
|
|
|
UserDrawEvent aUDEvt( &maVirDev, aRect, pItem->mnId );
|
|
|
|
UserDraw( aUDEvt );
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
Size aImageSize = pItem->maImage.GetSizePixel();
|
|
|
|
Size aRectSize = aRect.GetSize();
|
|
|
|
Point aPos( aRect.Left(), aRect.Top() );
|
|
|
|
aPos.X() += (aRectSize.Width()-aImageSize.Width())/2;
|
|
|
|
aPos.Y() += (aRectSize.Height()-aImageSize.Height())/2;
|
2004-04-02 13:41:07 +00:00
|
|
|
|
2010-11-05 10:31:15 +08:00
|
|
|
sal_uInt16 nImageStyle = 0;
|
2004-08-02 16:56:55 +00:00
|
|
|
if( !IsEnabled() )
|
2004-04-02 13:41:07 +00:00
|
|
|
nImageStyle |= IMAGE_DRAW_DISABLE;
|
|
|
|
|
2000-09-18 16:07:07 +00:00
|
|
|
if ( (aImageSize.Width() > aRectSize.Width()) ||
|
|
|
|
(aImageSize.Height() > aRectSize.Height()) )
|
|
|
|
{
|
|
|
|
maVirDev.SetClipRegion( Region( aRect ) );
|
2004-04-02 13:41:07 +00:00
|
|
|
maVirDev.DrawImage( aPos, pItem->maImage, nImageStyle);
|
2000-09-18 16:07:07 +00:00
|
|
|
maVirDev.SetClipRegion();
|
|
|
|
}
|
|
|
|
else
|
2004-04-02 13:41:07 +00:00
|
|
|
maVirDev.DrawImage( aPos, pItem->maImage, nImageStyle );
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
2003-04-24 14:49:45 +00:00
|
|
|
::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible > ValueSet::CreateAccessible()
|
2002-02-25 15:39:54 +00:00
|
|
|
{
|
2007-05-22 18:33:21 +00:00
|
|
|
return new ValueSetAcc( this, mpImpl->mbIsTransientChildrenDisabled );
|
2002-02-25 15:39:54 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
2000-09-18 16:07:07 +00:00
|
|
|
void ValueSet::Format()
|
|
|
|
{
|
|
|
|
Size aWinSize = GetOutputSizePixel();
|
2010-11-05 10:31:15 +08:00
|
|
|
sal_uIntPtr nItemCount = mpImpl->mpItemList->Count();
|
2000-09-18 16:07:07 +00:00
|
|
|
WinBits nStyle = GetStyle();
|
|
|
|
long nTxtHeight = GetTextHeight();
|
|
|
|
long nOff;
|
|
|
|
long nSpace;
|
2000-11-16 18:18:50 +00:00
|
|
|
long nNoneHeight;
|
2000-09-18 16:07:07 +00:00
|
|
|
long nNoneSpace;
|
|
|
|
ScrollBar* pDelScrBar = NULL;
|
|
|
|
|
|
|
|
// Scrolling beruecksichtigen
|
|
|
|
if ( nStyle & WB_VSCROLL )
|
|
|
|
ImplInitScrollBar();
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if ( mpScrBar )
|
|
|
|
{
|
|
|
|
// ScrollBar erst spaeter zerstoeren, damit keine rekursiven
|
|
|
|
// Aufrufe entstehen koennen
|
|
|
|
pDelScrBar = mpScrBar;
|
|
|
|
mpScrBar = NULL;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Item-Offset berechnen
|
|
|
|
if ( nStyle & WB_ITEMBORDER )
|
|
|
|
{
|
|
|
|
if ( nStyle & WB_DOUBLEBORDER )
|
|
|
|
nOff = ITEM_OFFSET_DOUBLE;
|
|
|
|
else
|
|
|
|
nOff = ITEM_OFFSET;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
nOff = 0;
|
|
|
|
nSpace = mnSpacing;
|
|
|
|
|
|
|
|
// Groesse beruecksichtigen, wenn NameField vorhanden
|
|
|
|
if ( nStyle & WB_NAMEFIELD )
|
|
|
|
{
|
2000-11-16 18:18:50 +00:00
|
|
|
mnTextOffset = aWinSize.Height()-nTxtHeight-NAME_OFFSET;
|
|
|
|
aWinSize.Height() -= nTxtHeight+NAME_OFFSET;
|
|
|
|
|
|
|
|
if ( !(nStyle & WB_FLATVALUESET) )
|
|
|
|
{
|
|
|
|
mnTextOffset -= NAME_LINE_HEIGHT+NAME_LINE_OFF_Y;
|
|
|
|
aWinSize.Height() -= NAME_LINE_HEIGHT+NAME_LINE_OFF_Y;
|
|
|
|
}
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
else
|
2000-11-16 18:18:50 +00:00
|
|
|
mnTextOffset = 0;
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
// Offset und Groesse beruecksichtigen, wenn NoneField vorhanden
|
|
|
|
if ( nStyle & WB_NONEFIELD )
|
|
|
|
{
|
2000-11-16 18:18:50 +00:00
|
|
|
nNoneHeight = nTxtHeight+nOff;
|
2000-09-18 16:07:07 +00:00
|
|
|
nNoneSpace = nSpace;
|
|
|
|
if ( nStyle & WB_RADIOSEL )
|
2000-11-16 18:18:50 +00:00
|
|
|
nNoneHeight += 8;
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2000-11-16 18:18:50 +00:00
|
|
|
nNoneHeight = 0;
|
2000-09-18 16:07:07 +00:00
|
|
|
nNoneSpace = 0;
|
2000-11-16 18:18:50 +00:00
|
|
|
|
|
|
|
if ( mpNoneItem )
|
|
|
|
{
|
|
|
|
delete mpNoneItem;
|
|
|
|
mpNoneItem = NULL;
|
|
|
|
}
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// Breite vom ScrollBar berechnen
|
|
|
|
long nScrBarWidth = 0;
|
|
|
|
if ( mpScrBar )
|
|
|
|
nScrBarWidth = mpScrBar->GetSizePixel().Width()+SCRBAR_OFFSET;
|
|
|
|
|
|
|
|
// Spaltenanzahl berechnen
|
|
|
|
if ( !mnUserCols )
|
|
|
|
{
|
|
|
|
if ( mnUserItemWidth )
|
|
|
|
{
|
2010-11-05 10:31:15 +08:00
|
|
|
mnCols = (sal_uInt16)((aWinSize.Width()-nScrBarWidth+nSpace) / (mnUserItemWidth+nSpace));
|
2000-09-18 16:07:07 +00:00
|
|
|
if ( !mnCols )
|
|
|
|
mnCols = 1;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
mnCols = 1;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
mnCols = mnUserCols;
|
|
|
|
|
|
|
|
// Zeilenanzahl berechnen
|
2010-11-05 10:31:15 +08:00
|
|
|
mbScroll = sal_False;
|
2007-05-22 18:33:21 +00:00
|
|
|
mnLines = (long)mpImpl->mpItemList->Count() / mnCols;
|
|
|
|
if ( mpImpl->mpItemList->Count() % mnCols )
|
2000-09-18 16:07:07 +00:00
|
|
|
mnLines++;
|
|
|
|
else if ( !mnLines )
|
|
|
|
mnLines = 1;
|
|
|
|
|
2000-11-16 18:18:50 +00:00
|
|
|
long nCalcHeight = aWinSize.Height()-nNoneHeight;
|
2000-09-18 16:07:07 +00:00
|
|
|
if ( mnUserVisLines )
|
|
|
|
mnVisLines = mnUserVisLines;
|
|
|
|
else if ( mnUserItemHeight )
|
|
|
|
{
|
|
|
|
mnVisLines = (nCalcHeight-nNoneSpace+nSpace) / (mnUserItemHeight+nSpace);
|
|
|
|
if ( !mnVisLines )
|
|
|
|
mnVisLines = 1;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
mnVisLines = mnLines;
|
|
|
|
if ( mnLines > mnVisLines )
|
2010-11-05 10:31:15 +08:00
|
|
|
mbScroll = sal_True;
|
2000-09-18 16:07:07 +00:00
|
|
|
if ( mnLines <= mnVisLines )
|
|
|
|
mnFirstLine = 0;
|
|
|
|
else
|
|
|
|
{
|
2010-11-05 10:31:15 +08:00
|
|
|
if ( mnFirstLine > (sal_uInt16)(mnLines-mnVisLines) )
|
|
|
|
mnFirstLine = (sal_uInt16)(mnLines-mnVisLines);
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// Itemgroessen berechnen
|
|
|
|
long nColSpace = (mnCols-1)*nSpace;
|
|
|
|
long nLineSpace = ((mnVisLines-1)*nSpace)+nNoneSpace;
|
|
|
|
long nItemWidth;
|
|
|
|
long nItemHeight;
|
|
|
|
if ( mnUserItemWidth && !mnUserCols )
|
|
|
|
{
|
|
|
|
nItemWidth = mnUserItemWidth;
|
|
|
|
if ( nItemWidth > aWinSize.Width()-nScrBarWidth-nColSpace )
|
|
|
|
nItemWidth = aWinSize.Width()-nScrBarWidth-nColSpace;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
nItemWidth = (aWinSize.Width()-nScrBarWidth-nColSpace) / mnCols;
|
|
|
|
if ( mnUserItemHeight && !mnUserVisLines )
|
|
|
|
{
|
|
|
|
nItemHeight = mnUserItemHeight;
|
|
|
|
if ( nItemHeight > nCalcHeight-nNoneSpace )
|
|
|
|
nItemHeight = nCalcHeight-nNoneSpace;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
nCalcHeight -= nLineSpace;
|
|
|
|
nItemHeight = nCalcHeight / mnVisLines;
|
|
|
|
}
|
|
|
|
|
2000-11-16 18:18:50 +00:00
|
|
|
// Init VirDev
|
2000-09-18 16:07:07 +00:00
|
|
|
maVirDev.SetSettings( GetSettings() );
|
|
|
|
maVirDev.SetBackground( GetBackground() );
|
2010-11-05 10:31:15 +08:00
|
|
|
maVirDev.SetOutputSizePixel( aWinSize, sal_True );
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
// Bei zu kleinen Items machen wir nichts
|
|
|
|
long nMinHeight = 2;
|
|
|
|
if ( nStyle & WB_ITEMBORDER )
|
|
|
|
nMinHeight = 4;
|
|
|
|
if ( (nItemWidth <= 0) || (nItemHeight <= nMinHeight) || !nItemCount )
|
|
|
|
{
|
|
|
|
if ( nStyle & WB_NONEFIELD )
|
|
|
|
{
|
|
|
|
if ( mpNoneItem )
|
|
|
|
{
|
|
|
|
mpNoneItem->maRect.SetEmpty();
|
|
|
|
mpNoneItem->maText = GetText();
|
|
|
|
}
|
|
|
|
}
|
2000-11-16 18:18:50 +00:00
|
|
|
|
2010-11-05 10:31:15 +08:00
|
|
|
for ( sal_uIntPtr i = 0; i < nItemCount; i++ )
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
2007-05-22 18:33:21 +00:00
|
|
|
ValueSetItem* pItem = mpImpl->mpItemList->GetObject( i );
|
2000-11-16 18:18:50 +00:00
|
|
|
pItem->maRect.SetEmpty();
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if ( mpScrBar )
|
|
|
|
mpScrBar->Hide();
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
// Frame-Style ermitteln
|
|
|
|
if ( nStyle & WB_DOUBLEBORDER )
|
|
|
|
mnFrameStyle = FRAME_DRAW_DOUBLEIN;
|
|
|
|
else
|
|
|
|
mnFrameStyle = FRAME_DRAW_IN;
|
|
|
|
|
|
|
|
// Selektionsfarben und -breiten ermitteln
|
|
|
|
// Gegebenenfalls die Farben anpassen, damit man die Selektion besser
|
|
|
|
// erkennen kann
|
|
|
|
const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings();
|
|
|
|
Color aHighColor( rStyleSettings.GetHighlightColor() );
|
|
|
|
if ( ((aHighColor.GetRed() > 0x80) || (aHighColor.GetGreen() > 0x80) ||
|
|
|
|
(aHighColor.GetBlue() > 0x80)) ||
|
|
|
|
((aHighColor.GetRed() == 0x80) && (aHighColor.GetGreen() == 0x80) &&
|
|
|
|
(aHighColor.GetBlue() == 0x80)) )
|
2010-11-05 10:31:15 +08:00
|
|
|
mbBlackSel = sal_True;
|
2000-09-18 16:07:07 +00:00
|
|
|
else
|
2010-11-05 10:31:15 +08:00
|
|
|
mbBlackSel = sal_False;
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
// Wenn die Items groesser sind, dann die Selektion doppelt so breit
|
|
|
|
// zeichnen
|
|
|
|
if ( (nStyle & WB_DOUBLEBORDER) &&
|
|
|
|
((nItemWidth >= 25) && (nItemHeight >= 20)) )
|
2010-11-05 10:31:15 +08:00
|
|
|
mbDoubleSel = sal_True;
|
2000-09-18 16:07:07 +00:00
|
|
|
else
|
2010-11-05 10:31:15 +08:00
|
|
|
mbDoubleSel = sal_False;
|
2000-09-18 16:07:07 +00:00
|
|
|
|
2000-11-16 18:18:50 +00:00
|
|
|
// Calculate offsets
|
|
|
|
long nStartX;
|
|
|
|
long nStartY;
|
|
|
|
if ( mbFullMode )
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
2000-11-16 18:18:50 +00:00
|
|
|
long nAllItemWidth = (nItemWidth*mnCols)+nColSpace;
|
|
|
|
long nAllItemHeight = (nItemHeight*mnVisLines)+nNoneHeight+nLineSpace;
|
|
|
|
nStartX = (aWinSize.Width()-nScrBarWidth-nAllItemWidth)/2;
|
|
|
|
nStartY = (aWinSize.Height()-nAllItemHeight)/2;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
nStartX = 0;
|
|
|
|
nStartY = 0;
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// Items berechnen und zeichnen
|
|
|
|
maVirDev.SetLineColor();
|
|
|
|
long x = nStartX;
|
2000-11-16 18:18:50 +00:00
|
|
|
long y = nStartY;
|
|
|
|
|
|
|
|
// NoSelection-Field erzeugen und anzeigen
|
|
|
|
if ( nStyle & WB_NONEFIELD )
|
|
|
|
{
|
|
|
|
if ( !mpNoneItem )
|
2002-02-25 09:52:14 +00:00
|
|
|
mpNoneItem = new ValueSetItem( *this );
|
2000-11-16 18:18:50 +00:00
|
|
|
|
|
|
|
mpNoneItem->mnId = 0;
|
|
|
|
mpNoneItem->meType = VALUESETITEM_NONE;
|
|
|
|
mpNoneItem->maRect.Left() = x;
|
|
|
|
mpNoneItem->maRect.Top() = y;
|
|
|
|
mpNoneItem->maRect.Right() = mpNoneItem->maRect.Left()+aWinSize.Width()-x-1;
|
|
|
|
mpNoneItem->maRect.Bottom() = y+nNoneHeight-1;
|
|
|
|
|
|
|
|
ImplFormatItem( mpNoneItem );
|
|
|
|
|
|
|
|
y += nNoneHeight+nNoneSpace;
|
|
|
|
}
|
|
|
|
|
|
|
|
// draw items
|
2010-11-05 10:31:15 +08:00
|
|
|
sal_uIntPtr nFirstItem = mnFirstLine * mnCols;
|
|
|
|
sal_uIntPtr nLastItem = nFirstItem + (mnVisLines * mnCols);
|
2002-02-25 09:52:14 +00:00
|
|
|
|
2000-11-16 18:18:50 +00:00
|
|
|
if ( !mbFullMode )
|
|
|
|
{
|
|
|
|
// If want also draw parts of items in the last line,
|
|
|
|
// then we add one more line if parts of these line are
|
|
|
|
// visible
|
|
|
|
if ( y+(mnVisLines*(nItemHeight+nSpace)) < aWinSize.Height() )
|
|
|
|
nLastItem += mnCols;
|
|
|
|
}
|
2010-11-05 10:31:15 +08:00
|
|
|
for ( sal_uIntPtr i = 0; i < nItemCount; i++ )
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
2007-05-22 18:33:21 +00:00
|
|
|
ValueSetItem* pItem = mpImpl->mpItemList->GetObject( i );
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
if ( (i >= nFirstItem) && (i < nLastItem) )
|
|
|
|
{
|
2010-11-05 10:31:15 +08:00
|
|
|
const sal_Bool bWasEmpty = pItem->maRect.IsEmpty();
|
2002-02-25 09:52:14 +00:00
|
|
|
|
2000-09-18 16:07:07 +00:00
|
|
|
pItem->maRect.Left() = x;
|
|
|
|
pItem->maRect.Top() = y;
|
|
|
|
pItem->maRect.Right() = pItem->maRect.Left()+nItemWidth-1;
|
|
|
|
pItem->maRect.Bottom() = pItem->maRect.Top()+nItemHeight-1;
|
|
|
|
|
2002-02-25 09:52:14 +00:00
|
|
|
if( bWasEmpty && ImplHasAccessibleListeners() )
|
|
|
|
{
|
|
|
|
::com::sun::star::uno::Any aOldAny, aNewAny;
|
|
|
|
|
2007-05-22 18:33:21 +00:00
|
|
|
aNewAny <<= pItem->GetAccessible( mpImpl->mbIsTransientChildrenDisabled );
|
2003-04-24 14:49:45 +00:00
|
|
|
ImplFireAccessibleEvent( ::com::sun::star::accessibility::AccessibleEventId::CHILD, aOldAny, aNewAny );
|
2002-02-25 09:52:14 +00:00
|
|
|
}
|
|
|
|
|
2000-09-18 16:07:07 +00:00
|
|
|
ImplFormatItem( pItem );
|
|
|
|
|
|
|
|
if ( !((i+1) % mnCols) )
|
|
|
|
{
|
|
|
|
x = nStartX;
|
|
|
|
y += nItemHeight+nSpace;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
x += nItemWidth+nSpace;
|
|
|
|
}
|
|
|
|
else
|
2002-02-25 09:52:14 +00:00
|
|
|
{
|
|
|
|
if( !pItem->maRect.IsEmpty() && ImplHasAccessibleListeners() )
|
|
|
|
{
|
|
|
|
::com::sun::star::uno::Any aOldAny, aNewAny;
|
|
|
|
|
2007-05-22 18:33:21 +00:00
|
|
|
aOldAny <<= pItem->GetAccessible( mpImpl->mbIsTransientChildrenDisabled );
|
2003-04-24 14:49:45 +00:00
|
|
|
ImplFireAccessibleEvent( ::com::sun::star::accessibility::AccessibleEventId::CHILD, aOldAny, aNewAny );
|
2002-02-25 09:52:14 +00:00
|
|
|
}
|
|
|
|
|
2000-09-18 16:07:07 +00:00
|
|
|
pItem->maRect.SetEmpty();
|
2002-02-25 09:52:14 +00:00
|
|
|
}
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// ScrollBar anordnen, Werte setzen und anzeigen
|
|
|
|
if ( mpScrBar )
|
|
|
|
{
|
2000-11-16 18:18:50 +00:00
|
|
|
Point aPos( aWinSize.Width()-nScrBarWidth+SCRBAR_OFFSET, 0 );
|
|
|
|
Size aSize( nScrBarWidth-SCRBAR_OFFSET, aWinSize.Height() );
|
|
|
|
// If a none field is visible, then we center the scrollbar
|
|
|
|
if ( nStyle & WB_NONEFIELD )
|
|
|
|
{
|
|
|
|
aPos.Y() = nStartY+nNoneHeight+1;
|
|
|
|
aSize.Height() = ((nItemHeight+nSpace)*mnVisLines)-2-nSpace;
|
|
|
|
}
|
2000-09-18 16:07:07 +00:00
|
|
|
mpScrBar->SetPosSizePixel( aPos, aSize );
|
|
|
|
mpScrBar->SetRangeMax( mnLines );
|
|
|
|
mpScrBar->SetVisibleSize( mnVisLines );
|
|
|
|
mpScrBar->SetThumbPos( (long)mnFirstLine );
|
|
|
|
long nPageSize = mnVisLines;
|
|
|
|
if ( nPageSize < 1 )
|
|
|
|
nPageSize = 1;
|
|
|
|
mpScrBar->SetPageSize( nPageSize );
|
|
|
|
mpScrBar->Show();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Jetzt haben wir formatiert und warten auf das naechste
|
2010-11-05 10:31:15 +08:00
|
|
|
mbFormat = sal_False;
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
// ScrollBar loeschen
|
|
|
|
if ( pDelScrBar )
|
|
|
|
delete pDelScrBar;
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
void ValueSet::ImplDrawItemText( const XubString& rText )
|
|
|
|
{
|
|
|
|
if ( !(GetStyle() & WB_NAMEFIELD) )
|
|
|
|
return;
|
|
|
|
|
|
|
|
Size aWinSize = GetOutputSizePixel();
|
|
|
|
long nTxtWidth = GetTextWidth( rText );
|
2000-11-16 18:18:50 +00:00
|
|
|
long nTxtOffset = mnTextOffset;
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
// Rechteck loeschen und Text ausgeben
|
|
|
|
if ( GetStyle() & WB_FLATVALUESET )
|
|
|
|
{
|
|
|
|
const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings();
|
|
|
|
SetLineColor();
|
|
|
|
SetFillColor( rStyleSettings.GetFaceColor() );
|
2000-11-16 18:18:50 +00:00
|
|
|
DrawRect( Rectangle( Point( 0, nTxtOffset ), Point( aWinSize.Width(), aWinSize.Height() ) ) );
|
2000-09-18 16:07:07 +00:00
|
|
|
SetTextColor( rStyleSettings.GetButtonTextColor() );
|
|
|
|
}
|
|
|
|
else
|
2000-11-16 18:18:50 +00:00
|
|
|
{
|
|
|
|
nTxtOffset += NAME_LINE_HEIGHT+NAME_LINE_OFF_Y;
|
|
|
|
Erase( Rectangle( Point( 0, nTxtOffset ), Point( aWinSize.Width(), aWinSize.Height() ) ) );
|
|
|
|
}
|
|
|
|
DrawText( Point( (aWinSize.Width()-nTxtWidth) / 2, nTxtOffset+(NAME_OFFSET/2) ), rText );
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
void ValueSet::ImplDrawSelect()
|
|
|
|
{
|
|
|
|
if ( !IsReallyVisible() )
|
|
|
|
return;
|
|
|
|
|
2010-11-05 10:31:15 +08:00
|
|
|
sal_Bool bFocus = HasFocus();
|
|
|
|
sal_Bool bDrawSel;
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
if ( (mbNoSelection && !mbHighlight) || (!mbDrawSelection && mbHighlight) )
|
2010-11-05 10:31:15 +08:00
|
|
|
bDrawSel = sal_False;
|
2000-09-18 16:07:07 +00:00
|
|
|
else
|
2010-11-05 10:31:15 +08:00
|
|
|
bDrawSel = sal_True;
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
if ( !bFocus &&
|
|
|
|
((mbNoSelection && !mbHighlight) || (!mbDrawSelection && mbHighlight)) )
|
|
|
|
{
|
|
|
|
XubString aEmptyStr;
|
|
|
|
ImplDrawItemText( aEmptyStr );
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2010-11-05 10:31:15 +08:00
|
|
|
sal_uInt16 nItemId = mnSelItemId;
|
2000-09-18 16:07:07 +00:00
|
|
|
|
2004-04-02 13:41:07 +00:00
|
|
|
for( int stage = 0; stage < 2; stage++ )
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
2004-04-02 13:41:07 +00:00
|
|
|
if( stage == 1 )
|
|
|
|
{
|
|
|
|
if ( mbHighlight )
|
|
|
|
nItemId = mnHighItemId;
|
|
|
|
else
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
ValueSetItem* pItem;
|
|
|
|
if ( nItemId )
|
2007-05-22 18:33:21 +00:00
|
|
|
pItem = mpImpl->mpItemList->GetObject( GetItemPos( nItemId ) );
|
2000-09-18 16:07:07 +00:00
|
|
|
else
|
|
|
|
{
|
2004-04-02 13:41:07 +00:00
|
|
|
if ( mpNoneItem )
|
|
|
|
pItem = mpNoneItem;
|
|
|
|
else
|
|
|
|
{
|
|
|
|
pItem = ImplGetFirstItem();
|
|
|
|
if ( !bFocus || !pItem )
|
|
|
|
continue;
|
|
|
|
}
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
2004-04-02 13:41:07 +00:00
|
|
|
if ( pItem->maRect.IsEmpty() )
|
|
|
|
continue;
|
2000-09-18 16:07:07 +00:00
|
|
|
|
2004-04-02 13:41:07 +00:00
|
|
|
// Selection malen
|
|
|
|
const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings();
|
|
|
|
Rectangle aRect = pItem->maRect;
|
|
|
|
Control::SetFillColor();
|
2000-09-18 16:07:07 +00:00
|
|
|
|
2004-04-02 13:41:07 +00:00
|
|
|
Color aDoubleColor( rStyleSettings.GetHighlightColor() );
|
|
|
|
Color aSingleColor( rStyleSettings.GetHighlightTextColor() );
|
|
|
|
if( ! mbDoubleSel )
|
2002-06-05 10:18:22 +00:00
|
|
|
{
|
2004-04-02 13:41:07 +00:00
|
|
|
/*
|
|
|
|
* #99777# contrast enhancement for thin mode
|
|
|
|
*/
|
|
|
|
const Wallpaper& rWall = GetDisplayBackground();
|
|
|
|
if( ! rWall.IsBitmap() && ! rWall.IsGradient() )
|
2002-06-05 10:18:22 +00:00
|
|
|
{
|
2004-04-02 13:41:07 +00:00
|
|
|
const Color& rBack = rWall.GetColor();
|
|
|
|
if( rBack.IsDark() && ! aDoubleColor.IsBright() )
|
|
|
|
{
|
|
|
|
aDoubleColor = Color( COL_WHITE );
|
|
|
|
aSingleColor = Color( COL_BLACK );
|
|
|
|
}
|
|
|
|
else if( rBack.IsBright() && ! aDoubleColor.IsDark() )
|
|
|
|
{
|
|
|
|
aDoubleColor = Color( COL_BLACK );
|
|
|
|
aSingleColor = Color( COL_WHITE );
|
|
|
|
}
|
2002-06-05 10:18:22 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2004-04-02 13:41:07 +00:00
|
|
|
// Selectionsausgabe festlegen
|
|
|
|
WinBits nStyle = GetStyle();
|
|
|
|
if ( nStyle & WB_MENUSTYLEVALUESET )
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
2004-04-02 13:41:07 +00:00
|
|
|
if ( bFocus )
|
|
|
|
ShowFocus( aRect );
|
|
|
|
|
|
|
|
if ( bDrawSel )
|
|
|
|
{
|
|
|
|
if ( mbBlackSel )
|
|
|
|
SetLineColor( Color( COL_BLACK ) );
|
|
|
|
else
|
|
|
|
SetLineColor( aDoubleColor );
|
|
|
|
DrawRect( aRect );
|
|
|
|
}
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
2004-04-02 13:41:07 +00:00
|
|
|
else if ( nStyle & WB_RADIOSEL )
|
|
|
|
{
|
|
|
|
aRect.Left() += 3;
|
|
|
|
aRect.Top() += 3;
|
|
|
|
aRect.Right() -= 3;
|
|
|
|
aRect.Bottom() -= 3;
|
|
|
|
if ( nStyle & WB_DOUBLEBORDER )
|
|
|
|
{
|
|
|
|
aRect.Left()++;
|
|
|
|
aRect.Top()++;
|
|
|
|
aRect.Right()--;
|
|
|
|
aRect.Bottom()--;
|
|
|
|
}
|
2000-09-18 16:07:07 +00:00
|
|
|
|
2004-04-02 13:41:07 +00:00
|
|
|
if ( bFocus )
|
|
|
|
ShowFocus( aRect );
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
aRect.Left()++;
|
|
|
|
aRect.Top()++;
|
|
|
|
aRect.Right()--;
|
|
|
|
aRect.Bottom()--;
|
2004-04-02 13:41:07 +00:00
|
|
|
|
|
|
|
if ( bDrawSel )
|
|
|
|
{
|
2002-06-05 10:18:22 +00:00
|
|
|
SetLineColor( aDoubleColor );
|
2004-04-02 13:41:07 +00:00
|
|
|
aRect.Left()++;
|
|
|
|
aRect.Top()++;
|
|
|
|
aRect.Right()--;
|
|
|
|
aRect.Bottom()--;
|
|
|
|
DrawRect( aRect );
|
|
|
|
aRect.Left()++;
|
|
|
|
aRect.Top()++;
|
|
|
|
aRect.Right()--;
|
|
|
|
aRect.Bottom()--;
|
|
|
|
DrawRect( aRect );
|
|
|
|
}
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
2004-04-02 13:41:07 +00:00
|
|
|
else
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
2004-04-02 13:41:07 +00:00
|
|
|
if ( bDrawSel )
|
|
|
|
{
|
|
|
|
if ( mbBlackSel )
|
|
|
|
SetLineColor( Color( COL_BLACK ) );
|
|
|
|
else
|
|
|
|
SetLineColor( aDoubleColor );
|
|
|
|
DrawRect( aRect );
|
|
|
|
}
|
|
|
|
if ( mbDoubleSel )
|
|
|
|
{
|
|
|
|
aRect.Left()++;
|
|
|
|
aRect.Top()++;
|
|
|
|
aRect.Right()--;
|
|
|
|
aRect.Bottom()--;
|
|
|
|
if ( bDrawSel )
|
|
|
|
DrawRect( aRect );
|
|
|
|
}
|
2000-09-18 16:07:07 +00:00
|
|
|
aRect.Left()++;
|
|
|
|
aRect.Top()++;
|
|
|
|
aRect.Right()--;
|
|
|
|
aRect.Bottom()--;
|
2004-04-02 13:41:07 +00:00
|
|
|
Rectangle aRect2 = aRect;
|
2000-09-18 16:07:07 +00:00
|
|
|
aRect.Left()++;
|
|
|
|
aRect.Top()++;
|
|
|
|
aRect.Right()--;
|
|
|
|
aRect.Bottom()--;
|
|
|
|
if ( bDrawSel )
|
|
|
|
DrawRect( aRect );
|
2004-04-02 13:41:07 +00:00
|
|
|
if ( mbDoubleSel )
|
|
|
|
{
|
|
|
|
aRect.Left()++;
|
|
|
|
aRect.Top()++;
|
|
|
|
aRect.Right()--;
|
|
|
|
aRect.Bottom()--;
|
|
|
|
if ( bDrawSel )
|
|
|
|
DrawRect( aRect );
|
|
|
|
}
|
2000-09-18 16:07:07 +00:00
|
|
|
|
2004-04-02 13:41:07 +00:00
|
|
|
if ( bDrawSel )
|
|
|
|
{
|
|
|
|
if ( mbBlackSel )
|
|
|
|
SetLineColor( Color( COL_WHITE ) );
|
|
|
|
else
|
|
|
|
SetLineColor( aSingleColor );
|
|
|
|
}
|
2000-09-18 16:07:07 +00:00
|
|
|
else
|
2004-04-02 13:41:07 +00:00
|
|
|
SetLineColor( Color( COL_LIGHTGRAY ) );
|
|
|
|
DrawRect( aRect2 );
|
|
|
|
|
|
|
|
if ( bFocus )
|
|
|
|
ShowFocus( aRect2 );
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
2004-04-02 13:41:07 +00:00
|
|
|
ImplDrawItemText( pItem->maText );
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
2010-11-05 10:31:15 +08:00
|
|
|
void ValueSet::ImplHideSelect( sal_uInt16 nItemId )
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
Rectangle aRect;
|
|
|
|
|
2010-11-05 10:31:15 +08:00
|
|
|
sal_uInt16 nItemPos = GetItemPos( nItemId );
|
|
|
|
if ( nItemPos != sal::static_int_cast<sal_uInt16>(LIST_ENTRY_NOTFOUND) )
|
2007-05-22 18:33:21 +00:00
|
|
|
aRect = mpImpl->mpItemList->GetObject( nItemPos )->maRect;
|
2000-09-18 16:07:07 +00:00
|
|
|
else
|
|
|
|
{
|
|
|
|
if ( mpNoneItem )
|
|
|
|
aRect = mpNoneItem->maRect;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( !aRect.IsEmpty() )
|
|
|
|
{
|
|
|
|
HideFocus();
|
|
|
|
Point aPos = aRect.TopLeft();
|
|
|
|
Size aSize = aRect.GetSize();
|
|
|
|
DrawOutDev( aPos, aSize, aPos, aSize, maVirDev );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
2010-11-05 10:31:15 +08:00
|
|
|
void ValueSet::ImplHighlightItem( sal_uInt16 nItemId, sal_Bool bIsSelection )
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
if ( mnHighItemId != nItemId )
|
|
|
|
{
|
|
|
|
// Alten merken, um vorherige Selektion zu entfernen
|
2010-11-05 10:31:15 +08:00
|
|
|
sal_uInt16 nOldItem = mnHighItemId;
|
2000-09-18 16:07:07 +00:00
|
|
|
mnHighItemId = nItemId;
|
|
|
|
|
|
|
|
// Wenn keiner selektiert ist, dann Selektion nicht malen
|
|
|
|
if ( !bIsSelection && mbNoSelection )
|
2010-11-05 10:31:15 +08:00
|
|
|
mbDrawSelection = sal_False;
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
// Neu ausgeben und alte Selection wegnehmen
|
|
|
|
ImplHideSelect( nOldItem );
|
|
|
|
ImplDrawSelect();
|
2010-11-05 10:31:15 +08:00
|
|
|
mbDrawSelection = sal_True;
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
2010-11-05 10:31:15 +08:00
|
|
|
void ValueSet::ImplDrawDropPos( sal_Bool bShow )
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
2007-05-22 18:33:21 +00:00
|
|
|
if ( (mnDropPos != VALUESET_ITEM_NOTFOUND) && mpImpl->mpItemList->Count() )
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
2010-11-05 10:31:15 +08:00
|
|
|
sal_uInt16 nItemPos = mnDropPos;
|
|
|
|
sal_uInt16 nItemId1;
|
|
|
|
sal_uInt16 nItemId2 = 0;
|
|
|
|
sal_Bool bRight;
|
2007-05-22 18:33:21 +00:00
|
|
|
if ( nItemPos >= mpImpl->mpItemList->Count() )
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
2010-11-05 10:31:15 +08:00
|
|
|
nItemPos = (sal_uInt16)(mpImpl->mpItemList->Count()-1);
|
|
|
|
bRight = sal_True;
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
else
|
2010-11-05 10:31:15 +08:00
|
|
|
bRight = sal_False;
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
nItemId1 = GetItemId( nItemPos );
|
|
|
|
if ( (nItemId1 != mnSelItemId) && (nItemId1 != mnHighItemId) )
|
|
|
|
nItemId1 = 0;
|
2007-05-22 18:33:21 +00:00
|
|
|
Rectangle aRect2 = mpImpl->mpItemList->GetObject( nItemPos )->maRect;
|
2000-09-18 16:07:07 +00:00
|
|
|
Rectangle aRect1;
|
|
|
|
if ( bRight )
|
|
|
|
{
|
|
|
|
aRect1 = aRect2;
|
|
|
|
aRect2.SetEmpty();
|
|
|
|
}
|
|
|
|
else if ( nItemPos > 0 )
|
|
|
|
{
|
2007-05-22 18:33:21 +00:00
|
|
|
aRect1 = mpImpl->mpItemList->GetObject( nItemPos-1 )->maRect;
|
2000-09-18 16:07:07 +00:00
|
|
|
nItemId2 = GetItemId( nItemPos-1 );
|
|
|
|
if ( (nItemId2 != mnSelItemId) && (nItemId2 != mnHighItemId) )
|
|
|
|
nItemId2 = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Items ueberhaupt sichtbar (nur Erstes/Letztes)
|
|
|
|
if ( !aRect1.IsEmpty() || !aRect2.IsEmpty() )
|
|
|
|
{
|
|
|
|
if ( nItemId1 )
|
|
|
|
ImplHideSelect( nItemId1 );
|
|
|
|
if ( nItemId2 )
|
|
|
|
ImplHideSelect( nItemId2 );
|
|
|
|
|
|
|
|
if ( bShow )
|
|
|
|
{
|
|
|
|
const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings();
|
|
|
|
long nX;
|
|
|
|
long nY;
|
|
|
|
SetLineColor( rStyleSettings.GetButtonTextColor() );
|
|
|
|
if ( !aRect1.IsEmpty() )
|
|
|
|
{
|
|
|
|
Point aPos = aRect1.RightCenter();
|
|
|
|
nX = aPos.X()-2;
|
|
|
|
nY = aPos.Y();
|
2010-11-05 10:31:15 +08:00
|
|
|
for ( sal_uInt16 i = 0; i < 4; i++ )
|
2000-09-18 16:07:07 +00:00
|
|
|
DrawLine( Point( nX-i, nY-i ), Point( nX-i, nY+i ) );
|
|
|
|
}
|
|
|
|
if ( !aRect2.IsEmpty() )
|
|
|
|
{
|
|
|
|
Point aPos = aRect2.LeftCenter();
|
|
|
|
nX = aPos.X()+2;
|
|
|
|
nY = aPos.Y();
|
2010-11-05 10:31:15 +08:00
|
|
|
for ( sal_uInt16 i = 0; i < 4; i++ )
|
2000-09-18 16:07:07 +00:00
|
|
|
DrawLine( Point( nX+i, nY-i ), Point( nX+i, nY+i ) );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if ( !aRect1.IsEmpty() )
|
|
|
|
{
|
|
|
|
Point aPos = aRect1.TopLeft();
|
|
|
|
Size aSize = aRect1.GetSize();
|
|
|
|
DrawOutDev( aPos, aSize, aPos, aSize, maVirDev );
|
|
|
|
}
|
|
|
|
if ( !aRect2.IsEmpty() )
|
|
|
|
{
|
|
|
|
Point aPos = aRect2.TopLeft();
|
|
|
|
Size aSize = aRect2.GetSize();
|
|
|
|
DrawOutDev( aPos, aSize, aPos, aSize, maVirDev );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( nItemId1 || nItemId2 )
|
|
|
|
ImplDrawSelect();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
void ValueSet::ImplDraw()
|
|
|
|
{
|
|
|
|
if ( mbFormat )
|
|
|
|
Format();
|
|
|
|
|
|
|
|
HideFocus();
|
|
|
|
|
|
|
|
Point aDefPos;
|
|
|
|
Size aSize = maVirDev.GetOutputSizePixel();
|
|
|
|
|
2000-11-16 18:18:50 +00:00
|
|
|
if ( mpScrBar && mpScrBar->IsVisible() )
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
Point aScrPos = mpScrBar->GetPosPixel();
|
|
|
|
Size aScrSize = mpScrBar->GetSizePixel();
|
|
|
|
Point aTempPos( 0, aScrPos.Y() );
|
|
|
|
Size aTempSize( aSize.Width(), aScrPos.Y() );
|
|
|
|
|
|
|
|
DrawOutDev( aDefPos, aTempSize, aDefPos, aTempSize, maVirDev );
|
|
|
|
aTempSize.Width() = aScrPos.X()-1;
|
|
|
|
aTempSize.Height() = aScrSize.Height();
|
|
|
|
DrawOutDev( aTempPos, aTempSize, aTempPos, aTempSize, maVirDev );
|
|
|
|
aTempPos.Y() = aScrPos.Y()+aScrSize.Height();
|
|
|
|
aTempSize.Width() = aSize.Width();
|
|
|
|
aTempSize.Height() = aSize.Height()-aTempPos.Y();
|
|
|
|
DrawOutDev( aTempPos, aTempSize, aTempPos, aTempSize, maVirDev );
|
|
|
|
}
|
|
|
|
else
|
|
|
|
DrawOutDev( aDefPos, aSize, aDefPos, aSize, maVirDev );
|
|
|
|
|
2000-11-16 18:18:50 +00:00
|
|
|
// Trennlinie zum Namefield zeichnen
|
|
|
|
if ( GetStyle() & WB_NAMEFIELD )
|
|
|
|
{
|
|
|
|
if ( !(GetStyle() & WB_FLATVALUESET) )
|
|
|
|
{
|
|
|
|
const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings();
|
|
|
|
Size aWinSize = GetOutputSizePixel();
|
|
|
|
Point aPos1( NAME_LINE_OFF_X, mnTextOffset+NAME_LINE_OFF_Y );
|
|
|
|
Point aPos2( aWinSize.Width()-(NAME_LINE_OFF_X*2), mnTextOffset+NAME_LINE_OFF_Y );
|
|
|
|
if ( !(rStyleSettings.GetOptions() & STYLE_OPTION_MONO) )
|
|
|
|
{
|
|
|
|
SetLineColor( rStyleSettings.GetShadowColor() );
|
|
|
|
DrawLine( aPos1, aPos2 );
|
|
|
|
aPos1.Y()++;
|
|
|
|
aPos2.Y()++;
|
|
|
|
SetLineColor( rStyleSettings.GetLightColor() );
|
|
|
|
}
|
|
|
|
else
|
|
|
|
SetLineColor( rStyleSettings.GetWindowTextColor() );
|
|
|
|
DrawLine( aPos1, aPos2 );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2000-09-18 16:07:07 +00:00
|
|
|
ImplDrawSelect();
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
2010-11-05 10:31:15 +08:00
|
|
|
sal_Bool ValueSet::ImplScroll( const Point& rPos )
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
Size aOutSize = GetOutputSizePixel();
|
|
|
|
long nScrBarWidth;
|
|
|
|
|
|
|
|
if ( mpScrBar )
|
|
|
|
nScrBarWidth = mpScrBar->GetSizePixel().Width();
|
|
|
|
else
|
|
|
|
nScrBarWidth = 0;
|
|
|
|
|
|
|
|
if ( !mbScroll || (rPos.X() < 0) || (rPos.X() > aOutSize.Width()-nScrBarWidth) )
|
2010-11-05 10:31:15 +08:00
|
|
|
return sal_False;
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
long nScrollOffset;
|
2010-11-05 10:31:15 +08:00
|
|
|
sal_uInt16 nOldLine = mnFirstLine;
|
2007-05-22 18:33:21 +00:00
|
|
|
const Rectangle& rTopRect = mpImpl->mpItemList->GetObject( mnFirstLine*mnCols )->maRect;
|
2000-09-18 16:07:07 +00:00
|
|
|
if ( rTopRect.GetHeight() <= 16 )
|
|
|
|
nScrollOffset = VALUESET_SCROLL_OFFSET/2;
|
|
|
|
else
|
|
|
|
nScrollOffset = VALUESET_SCROLL_OFFSET;
|
|
|
|
if ( (mnFirstLine > 0) && (rPos.Y() >= 0) )
|
|
|
|
{
|
|
|
|
long nTopPos = rTopRect.Top();
|
|
|
|
if ( (rPos.Y() >= nTopPos) && (rPos.Y() <= nTopPos+nScrollOffset) )
|
|
|
|
mnFirstLine--;
|
|
|
|
}
|
|
|
|
if ( (mnFirstLine == nOldLine) &&
|
2010-11-05 10:31:15 +08:00
|
|
|
(mnFirstLine < (sal_uInt16)(mnLines-mnVisLines)) && (rPos.Y() < aOutSize.Height()) )
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
2007-05-22 18:33:21 +00:00
|
|
|
long nBottomPos = mpImpl->mpItemList->GetObject( (mnFirstLine+mnVisLines-1)*mnCols )->maRect.Bottom();
|
2000-09-18 16:07:07 +00:00
|
|
|
if ( (rPos.Y() >= nBottomPos-nScrollOffset) && (rPos.Y() <= nBottomPos) )
|
|
|
|
mnFirstLine++;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( mnFirstLine != nOldLine )
|
|
|
|
{
|
2010-11-05 10:31:15 +08:00
|
|
|
mbFormat = sal_True;
|
2000-09-18 16:07:07 +00:00
|
|
|
ImplDraw();
|
2010-11-05 10:31:15 +08:00
|
|
|
return sal_True;
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
else
|
2010-11-05 10:31:15 +08:00
|
|
|
return sal_False;
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
2010-11-05 10:31:15 +08:00
|
|
|
sal_uInt16 ValueSet::ImplGetItem( const Point& rPos, sal_Bool bMove ) const
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
if ( mpNoneItem )
|
|
|
|
{
|
|
|
|
if ( mpNoneItem->maRect.IsInside( rPos ) )
|
|
|
|
return VALUESET_ITEM_NONEITEM;
|
|
|
|
}
|
|
|
|
|
2000-11-16 18:18:50 +00:00
|
|
|
Point aDefPos;
|
|
|
|
Rectangle aWinRect( aDefPos, maVirDev.GetOutputSizePixel() );
|
|
|
|
|
2010-11-05 10:31:15 +08:00
|
|
|
sal_uIntPtr nItemCount = mpImpl->mpItemList->Count();
|
|
|
|
for ( sal_uIntPtr i = 0; i < nItemCount; i++ )
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
2007-05-22 18:33:21 +00:00
|
|
|
ValueSetItem* pItem = mpImpl->mpItemList->GetObject( i );
|
2000-09-18 16:07:07 +00:00
|
|
|
if ( pItem->maRect.IsInside( rPos ) )
|
2000-11-16 18:18:50 +00:00
|
|
|
{
|
|
|
|
if ( aWinRect.IsInside( rPos ) )
|
2010-11-05 10:31:15 +08:00
|
|
|
return (sal_uInt16)i;
|
2000-11-16 18:18:50 +00:00
|
|
|
else
|
|
|
|
return VALUESET_ITEM_NOTFOUND;
|
|
|
|
}
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// Wenn Spacing gesetzt ist, wird der vorher selektierte
|
|
|
|
// Eintrag zurueckgegeben, wenn die Maus noch nicht das Fenster
|
|
|
|
// verlassen hat
|
|
|
|
if ( bMove && mnSpacing && mnHighItemId )
|
|
|
|
{
|
|
|
|
if ( aWinRect.IsInside( rPos ) )
|
|
|
|
return GetItemPos( mnHighItemId );
|
|
|
|
}
|
|
|
|
|
|
|
|
return VALUESET_ITEM_NOTFOUND;
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
2010-11-05 10:31:15 +08:00
|
|
|
ValueSetItem* ValueSet::ImplGetItem( sal_uInt16 nPos )
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
if ( nPos == VALUESET_ITEM_NONEITEM )
|
|
|
|
return mpNoneItem;
|
|
|
|
else
|
2007-05-22 18:33:21 +00:00
|
|
|
return mpImpl->mpItemList->GetObject( nPos );
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
ValueSetItem* ValueSet::ImplGetFirstItem()
|
|
|
|
{
|
2010-11-05 10:31:15 +08:00
|
|
|
sal_uInt16 nItemCount = (sal_uInt16)mpImpl->mpItemList->Count();
|
|
|
|
sal_uInt16 i = 0;
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
while ( i < nItemCount )
|
|
|
|
{
|
2007-05-22 18:33:21 +00:00
|
|
|
ValueSetItem* pItem = mpImpl->mpItemList->GetObject( i );
|
2000-09-18 16:07:07 +00:00
|
|
|
if ( pItem->meType != VALUESETITEM_SPACE )
|
|
|
|
return pItem;
|
|
|
|
i++;
|
|
|
|
}
|
|
|
|
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
2010-11-05 10:31:15 +08:00
|
|
|
sal_uInt16 ValueSet::ImplGetVisibleItemCount() const
|
2002-02-25 09:52:14 +00:00
|
|
|
{
|
2010-11-05 10:31:15 +08:00
|
|
|
sal_uInt16 nRet = 0;
|
2002-02-25 09:52:14 +00:00
|
|
|
|
2007-05-22 18:33:21 +00:00
|
|
|
for( sal_Int32 n = 0, nItemCount = mpImpl->mpItemList->Count(); n < nItemCount; n++ )
|
2002-02-25 09:52:14 +00:00
|
|
|
{
|
2007-05-22 18:33:21 +00:00
|
|
|
ValueSetItem* pItem = mpImpl->mpItemList->GetObject( n );
|
2002-02-25 09:52:14 +00:00
|
|
|
|
|
|
|
if( pItem->meType != VALUESETITEM_SPACE && !pItem->maRect.IsEmpty() )
|
|
|
|
nRet++;
|
|
|
|
}
|
|
|
|
|
|
|
|
return nRet;
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
2010-11-05 10:31:15 +08:00
|
|
|
ValueSetItem* ValueSet::ImplGetVisibleItem( sal_uInt16 nVisiblePos )
|
2002-02-25 09:52:14 +00:00
|
|
|
{
|
|
|
|
ValueSetItem* pRet = NULL;
|
2010-11-05 10:31:15 +08:00
|
|
|
sal_uInt16 nFoundPos = 0;
|
2002-02-25 09:52:14 +00:00
|
|
|
|
2007-05-22 18:33:21 +00:00
|
|
|
for( sal_Int32 n = 0, nItemCount = mpImpl->mpItemList->Count(); ( n < nItemCount ) && !pRet; n++ )
|
2002-02-25 09:52:14 +00:00
|
|
|
{
|
2007-05-22 18:33:21 +00:00
|
|
|
ValueSetItem* pItem = mpImpl->mpItemList->GetObject( n );
|
2002-02-25 09:52:14 +00:00
|
|
|
|
|
|
|
if( ( pItem->meType != VALUESETITEM_SPACE ) && !pItem->maRect.IsEmpty() && ( nVisiblePos == nFoundPos++ ) )
|
|
|
|
pRet = pItem;
|
|
|
|
}
|
|
|
|
|
|
|
|
return pRet;
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
void ValueSet::ImplFireAccessibleEvent( short nEventId, const ::com::sun::star::uno::Any& rOldValue, const ::com::sun::star::uno::Any& rNewValue )
|
|
|
|
{
|
2010-11-05 10:31:15 +08:00
|
|
|
ValueSetAcc* pAcc = ValueSetAcc::getImplementation( GetAccessible( sal_False ) );
|
2002-02-25 09:52:14 +00:00
|
|
|
|
2002-02-25 15:39:54 +00:00
|
|
|
if( pAcc )
|
|
|
|
pAcc->FireAccessibleEvent( nEventId, rOldValue, rNewValue );
|
2002-02-25 09:52:14 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
2010-11-05 10:31:15 +08:00
|
|
|
sal_Bool ValueSet::ImplHasAccessibleListeners()
|
2002-02-25 09:52:14 +00:00
|
|
|
{
|
2010-11-05 10:31:15 +08:00
|
|
|
ValueSetAcc* pAcc = ValueSetAcc::getImplementation( GetAccessible( sal_False ) );
|
2002-02-25 15:39:54 +00:00
|
|
|
return( pAcc && pAcc->HasAccessibleListeners() );
|
2002-02-25 09:52:14 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
2000-09-18 16:07:07 +00:00
|
|
|
IMPL_LINK( ValueSet,ImplScrollHdl, ScrollBar*, pScrollBar )
|
|
|
|
{
|
2010-11-05 10:31:15 +08:00
|
|
|
sal_uInt16 nNewFirstLine = (sal_uInt16)pScrollBar->GetThumbPos();
|
2000-09-18 16:07:07 +00:00
|
|
|
if ( nNewFirstLine != mnFirstLine )
|
|
|
|
{
|
|
|
|
mnFirstLine = nNewFirstLine;
|
2010-11-05 10:31:15 +08:00
|
|
|
mbFormat = sal_True;
|
2000-09-18 16:07:07 +00:00
|
|
|
ImplDraw();
|
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
2006-06-19 19:58:33 +00:00
|
|
|
IMPL_LINK( ValueSet,ImplTimerHdl, Timer*, EMPTYARG )
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
2010-11-05 10:31:15 +08:00
|
|
|
ImplTracking( GetPointerPosPixel(), sal_True );
|
2000-09-18 16:07:07 +00:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
2010-11-05 10:31:15 +08:00
|
|
|
void ValueSet::ImplTracking( const Point& rPos, sal_Bool bRepeat )
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
if ( bRepeat || mbSelection )
|
|
|
|
{
|
|
|
|
if ( ImplScroll( rPos ) )
|
|
|
|
{
|
|
|
|
if ( mbSelection )
|
|
|
|
{
|
|
|
|
maTimer.SetTimeoutHdl( LINK( this, ValueSet, ImplTimerHdl ) );
|
|
|
|
maTimer.SetTimeout( GetSettings().GetMouseSettings().GetScrollRepeat() );
|
|
|
|
maTimer.Start();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
ValueSetItem* pItem = ImplGetItem( ImplGetItem( rPos ) );
|
|
|
|
if ( pItem && (pItem->meType != VALUESETITEM_SPACE) )
|
2004-04-02 13:41:07 +00:00
|
|
|
{
|
|
|
|
if( GetStyle() & WB_MENUSTYLEVALUESET )
|
2010-11-05 10:31:15 +08:00
|
|
|
mbHighlight = sal_True;
|
2004-04-02 13:41:07 +00:00
|
|
|
|
2000-09-18 16:07:07 +00:00
|
|
|
ImplHighlightItem( pItem->mnId );
|
2004-04-02 13:41:07 +00:00
|
|
|
}
|
2000-09-18 16:07:07 +00:00
|
|
|
else
|
2004-04-02 13:41:07 +00:00
|
|
|
{
|
|
|
|
if( GetStyle() & WB_MENUSTYLEVALUESET )
|
2010-11-05 10:31:15 +08:00
|
|
|
mbHighlight = sal_True;
|
2004-04-02 13:41:07 +00:00
|
|
|
|
2010-11-05 10:31:15 +08:00
|
|
|
ImplHighlightItem( mnSelItemId, sal_False );
|
2004-04-02 13:41:07 +00:00
|
|
|
}
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
2010-11-05 10:31:15 +08:00
|
|
|
void ValueSet::ImplEndTracking( const Point& rPos, sal_Bool bCancel )
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
ValueSetItem* pItem;
|
|
|
|
|
|
|
|
// Bei Abbruch, den alten Status wieder herstellen
|
|
|
|
if ( bCancel )
|
|
|
|
pItem = NULL;
|
|
|
|
else
|
|
|
|
pItem = ImplGetItem( ImplGetItem( rPos ) );
|
|
|
|
|
|
|
|
if ( pItem && (pItem->meType != VALUESETITEM_SPACE) )
|
|
|
|
{
|
|
|
|
SelectItem( pItem->mnId );
|
|
|
|
if ( !mbSelection && !(GetStyle() & WB_NOPOINTERFOCUS) )
|
|
|
|
GrabFocus();
|
2010-11-05 10:31:15 +08:00
|
|
|
mbHighlight = sal_False;
|
|
|
|
mbSelection = sal_False;
|
2000-09-18 16:07:07 +00:00
|
|
|
Select();
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2010-11-05 10:31:15 +08:00
|
|
|
ImplHighlightItem( mnSelItemId, sal_False );
|
|
|
|
mbHighlight = sal_False;
|
|
|
|
mbSelection = sal_False;
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
void ValueSet::MouseButtonDown( const MouseEvent& rMEvt )
|
|
|
|
{
|
|
|
|
if ( rMEvt.IsLeft() )
|
|
|
|
{
|
|
|
|
ValueSetItem* pItem = ImplGetItem( ImplGetItem( rMEvt.GetPosPixel() ) );
|
|
|
|
if ( mbSelection )
|
|
|
|
{
|
2010-11-05 10:31:15 +08:00
|
|
|
mbHighlight = sal_True;
|
2000-09-18 16:07:07 +00:00
|
|
|
if ( pItem && (pItem->meType != VALUESETITEM_SPACE) )
|
|
|
|
{
|
|
|
|
mnOldItemId = mnSelItemId;
|
|
|
|
mnHighItemId = mnSelItemId;
|
|
|
|
ImplHighlightItem( pItem->mnId );
|
|
|
|
}
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if ( pItem && (pItem->meType != VALUESETITEM_SPACE) && !rMEvt.IsMod2() )
|
|
|
|
{
|
|
|
|
if ( (pItem->mnBits & VIB_NODOUBLECLICK) || (rMEvt.GetClicks() == 1) )
|
|
|
|
{
|
|
|
|
mnOldItemId = mnSelItemId;
|
2010-11-05 10:31:15 +08:00
|
|
|
mbHighlight = sal_True;
|
2000-09-18 16:07:07 +00:00
|
|
|
mnHighItemId = mnSelItemId;
|
|
|
|
ImplHighlightItem( pItem->mnId );
|
|
|
|
StartTracking( STARTTRACK_SCROLLREPEAT );
|
|
|
|
}
|
|
|
|
else if ( rMEvt.GetClicks() == 2 )
|
|
|
|
DoubleClick();
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
Control::MouseButtonDown( rMEvt );
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
void ValueSet::MouseButtonUp( const MouseEvent& rMEvt )
|
|
|
|
{
|
|
|
|
// Wegen SelectionMode
|
|
|
|
if ( rMEvt.IsLeft() && mbSelection )
|
2010-11-05 10:31:15 +08:00
|
|
|
ImplEndTracking( rMEvt.GetPosPixel(), sal_False );
|
2000-09-18 16:07:07 +00:00
|
|
|
else
|
|
|
|
Control::MouseButtonUp( rMEvt );
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
void ValueSet::MouseMove( const MouseEvent& rMEvt )
|
|
|
|
{
|
|
|
|
// Wegen SelectionMode
|
2004-04-02 13:41:07 +00:00
|
|
|
if ( mbSelection || (GetStyle() & WB_MENUSTYLEVALUESET) )
|
2010-11-05 10:31:15 +08:00
|
|
|
ImplTracking( rMEvt.GetPosPixel(), sal_False );
|
2000-09-18 16:07:07 +00:00
|
|
|
Control::MouseMove( rMEvt );
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
void ValueSet::Tracking( const TrackingEvent& rTEvt )
|
|
|
|
{
|
|
|
|
Point aMousePos = rTEvt.GetMouseEvent().GetPosPixel();
|
|
|
|
|
|
|
|
if ( rTEvt.IsTrackingEnded() )
|
|
|
|
ImplEndTracking( aMousePos, rTEvt.IsTrackingCanceled() );
|
|
|
|
else
|
|
|
|
ImplTracking( aMousePos, rTEvt.IsTrackingRepeat() );
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
void ValueSet::KeyInput( const KeyEvent& rKEvt )
|
|
|
|
{
|
2010-11-05 10:31:15 +08:00
|
|
|
sal_uInt16 nLastItem = (sal_uInt16)mpImpl->mpItemList->Count();
|
|
|
|
sal_uInt16 nItemPos = VALUESET_ITEM_NOTFOUND;
|
|
|
|
sal_uInt16 nCurPos = VALUESET_ITEM_NONEITEM;
|
|
|
|
sal_uInt16 nCalcPos;
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
if ( !nLastItem || !ImplGetFirstItem() )
|
|
|
|
{
|
|
|
|
Control::KeyInput( rKEvt );
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
nLastItem--;
|
|
|
|
|
|
|
|
if ( mnSelItemId )
|
|
|
|
nCurPos = GetItemPos( mnSelItemId );
|
|
|
|
nCalcPos = nCurPos;
|
|
|
|
|
2002-05-28 11:31:25 +00:00
|
|
|
//switch off selection mode if key travelling is used
|
2010-11-05 10:31:15 +08:00
|
|
|
sal_Bool bDefault = sal_False;
|
2000-09-18 16:07:07 +00:00
|
|
|
switch ( rKEvt.GetKeyCode().GetCode() )
|
|
|
|
{
|
|
|
|
case KEY_HOME:
|
|
|
|
if ( mpNoneItem )
|
|
|
|
nItemPos = VALUESET_ITEM_NONEITEM;
|
|
|
|
else
|
|
|
|
{
|
|
|
|
nItemPos = 0;
|
|
|
|
while ( ImplGetItem( nItemPos )->meType == VALUESETITEM_SPACE )
|
|
|
|
nItemPos++;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case KEY_END:
|
|
|
|
nItemPos = nLastItem;
|
|
|
|
while ( ImplGetItem( nItemPos )->meType == VALUESETITEM_SPACE )
|
|
|
|
{
|
|
|
|
if ( nItemPos == 0 )
|
|
|
|
nItemPos = VALUESET_ITEM_NONEITEM;
|
|
|
|
else
|
|
|
|
nItemPos--;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case KEY_LEFT:
|
2003-03-27 13:40:07 +00:00
|
|
|
case KEY_RIGHT:
|
2003-04-17 14:23:15 +00:00
|
|
|
if ( rKEvt.GetKeyCode().GetCode()==KEY_LEFT )
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
2003-03-27 13:40:07 +00:00
|
|
|
do
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
2003-03-27 13:40:07 +00:00
|
|
|
if ( nCalcPos == VALUESET_ITEM_NONEITEM )
|
2000-09-18 16:07:07 +00:00
|
|
|
nItemPos = nLastItem;
|
2003-03-27 13:40:07 +00:00
|
|
|
else if ( !nCalcPos )
|
|
|
|
{
|
|
|
|
if ( mpNoneItem )
|
|
|
|
nItemPos = VALUESET_ITEM_NONEITEM;
|
|
|
|
else
|
|
|
|
nItemPos = nLastItem;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
nItemPos = nCalcPos-1;
|
|
|
|
nCalcPos = nItemPos;
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
2003-03-27 13:40:07 +00:00
|
|
|
while ( ImplGetItem( nItemPos )->meType == VALUESETITEM_SPACE );
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
2003-03-27 13:40:07 +00:00
|
|
|
else
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
2003-03-27 13:40:07 +00:00
|
|
|
do
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
2003-03-27 13:40:07 +00:00
|
|
|
if ( nCalcPos == VALUESET_ITEM_NONEITEM )
|
2000-09-18 16:07:07 +00:00
|
|
|
nItemPos = 0;
|
2003-03-27 13:40:07 +00:00
|
|
|
else if ( nCalcPos == nLastItem )
|
|
|
|
{
|
|
|
|
if ( mpNoneItem )
|
|
|
|
nItemPos = VALUESET_ITEM_NONEITEM;
|
|
|
|
else
|
|
|
|
nItemPos = 0;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
nItemPos = nCalcPos+1;
|
|
|
|
nCalcPos = nItemPos;
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
2003-03-27 13:40:07 +00:00
|
|
|
while ( ImplGetItem( nItemPos )->meType == VALUESETITEM_SPACE );
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case KEY_UP:
|
2002-04-03 12:37:39 +00:00
|
|
|
case KEY_PAGEUP:
|
|
|
|
{
|
2002-06-06 06:42:13 +00:00
|
|
|
if( rKEvt.GetKeyCode().GetCode() != KEY_PAGEUP ||
|
|
|
|
( !rKEvt.GetKeyCode().IsShift() && !rKEvt.GetKeyCode().IsMod1() && !rKEvt.GetKeyCode().IsMod2() ) )
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
2002-06-06 06:42:13 +00:00
|
|
|
const long nLineCount = ( ( KEY_UP == rKEvt.GetKeyCode().GetCode() ) ? 1 : mnVisLines );
|
|
|
|
do
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
2002-06-06 06:42:13 +00:00
|
|
|
if ( nCalcPos == VALUESET_ITEM_NONEITEM )
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
if ( nLastItem+1 <= mnCols )
|
2002-06-06 06:42:13 +00:00
|
|
|
nItemPos = mnCurCol;
|
2000-09-18 16:07:07 +00:00
|
|
|
else
|
|
|
|
{
|
2002-06-06 06:42:13 +00:00
|
|
|
nItemPos = ((((nLastItem+1)/mnCols)-1)*mnCols)+(mnCurCol%mnCols);
|
2000-09-18 16:07:07 +00:00
|
|
|
if ( nItemPos+mnCols <= nLastItem )
|
2006-10-12 14:13:29 +00:00
|
|
|
nItemPos = nItemPos + mnCols;
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
}
|
2002-06-06 06:42:13 +00:00
|
|
|
else if ( nCalcPos >= ( nLineCount * mnCols ) )
|
2010-11-05 10:31:15 +08:00
|
|
|
nItemPos = sal::static_int_cast< sal_uInt16 >(
|
2006-10-12 14:13:29 +00:00
|
|
|
nCalcPos - ( nLineCount * mnCols ));
|
2002-06-06 06:42:13 +00:00
|
|
|
else
|
|
|
|
{
|
2010-04-28 18:43:47 +02:00
|
|
|
if ( mpNoneItem )
|
2002-06-06 06:42:13 +00:00
|
|
|
{
|
2010-04-28 18:43:47 +02:00
|
|
|
mnCurCol = nCalcPos%mnCols;
|
|
|
|
nItemPos = VALUESET_ITEM_NONEITEM;
|
2002-06-06 06:42:13 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2010-04-28 18:43:47 +02:00
|
|
|
if ( nLastItem+1 <= mnCols )
|
|
|
|
nItemPos = nCalcPos;
|
2002-06-06 06:42:13 +00:00
|
|
|
else
|
|
|
|
{
|
2010-04-28 18:43:47 +02:00
|
|
|
nItemPos = ((((nLastItem+1)/mnCols)-1)*mnCols)+(nCalcPos%mnCols);
|
|
|
|
if ( nItemPos+mnCols <= nLastItem )
|
|
|
|
nItemPos = nItemPos + mnCols;
|
2002-06-06 06:42:13 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
nCalcPos = nItemPos;
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
2002-06-06 06:42:13 +00:00
|
|
|
while ( ImplGetItem( nItemPos )->meType == VALUESETITEM_SPACE );
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
2002-06-06 06:42:13 +00:00
|
|
|
else
|
|
|
|
Control::KeyInput( rKEvt );
|
2002-04-03 12:37:39 +00:00
|
|
|
}
|
|
|
|
break;
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
case KEY_DOWN:
|
2002-04-03 12:37:39 +00:00
|
|
|
case KEY_PAGEDOWN:
|
|
|
|
{
|
2002-06-06 06:42:13 +00:00
|
|
|
if( rKEvt.GetKeyCode().GetCode() != KEY_PAGEDOWN ||
|
|
|
|
( !rKEvt.GetKeyCode().IsShift() && !rKEvt.GetKeyCode().IsMod1() && !rKEvt.GetKeyCode().IsMod2() ) )
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
2002-06-06 06:42:13 +00:00
|
|
|
const long nLineCount = ( ( KEY_DOWN == rKEvt.GetKeyCode().GetCode() ) ? 1 : mnVisLines );
|
|
|
|
do
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
2002-06-06 06:42:13 +00:00
|
|
|
if ( nCalcPos == VALUESET_ITEM_NONEITEM )
|
|
|
|
nItemPos = mnCurCol;
|
|
|
|
else if ( nCalcPos + ( nLineCount * mnCols ) <= nLastItem )
|
2010-11-05 10:31:15 +08:00
|
|
|
nItemPos = sal::static_int_cast< sal_uInt16 >(
|
2006-10-12 14:13:29 +00:00
|
|
|
nCalcPos + ( nLineCount * mnCols ));
|
2002-06-06 06:42:13 +00:00
|
|
|
else
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
2010-03-11 18:18:08 +01:00
|
|
|
#if 0
|
2004-04-02 13:41:07 +00:00
|
|
|
if( (KEY_DOWN == rKEvt.GetKeyCode().GetCode() ) && (GetStyle() & WB_MENUSTYLEVALUESET) )
|
2002-06-06 06:42:13 +00:00
|
|
|
{
|
2004-04-02 13:41:07 +00:00
|
|
|
Window* pParent = GetParent();
|
|
|
|
pParent->GrabFocus();
|
|
|
|
pParent->KeyInput( rKEvt );
|
|
|
|
break;
|
2002-06-06 06:42:13 +00:00
|
|
|
}
|
|
|
|
else
|
2010-03-11 18:18:08 +01:00
|
|
|
#endif
|
2004-04-02 13:41:07 +00:00
|
|
|
{
|
|
|
|
if ( mpNoneItem )
|
|
|
|
{
|
|
|
|
mnCurCol = nCalcPos%mnCols;
|
|
|
|
nItemPos = VALUESET_ITEM_NONEITEM;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
nItemPos = nCalcPos%mnCols;
|
|
|
|
}
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
2002-06-06 06:42:13 +00:00
|
|
|
nCalcPos = nItemPos;
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
2002-06-06 06:42:13 +00:00
|
|
|
while ( ImplGetItem( nItemPos )->meType == VALUESETITEM_SPACE );
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
2002-06-06 06:42:13 +00:00
|
|
|
else
|
|
|
|
Control::KeyInput( rKEvt );
|
|
|
|
|
2002-04-03 12:37:39 +00:00
|
|
|
}
|
|
|
|
break;
|
2002-05-28 11:31:25 +00:00
|
|
|
case KEY_RETURN:
|
2002-06-20 09:15:13 +00:00
|
|
|
//enable default handling of KEY_RETURN in dialogs
|
|
|
|
if(0 != (GetStyle()&WB_NO_DIRECTSELECT))
|
|
|
|
{
|
|
|
|
Select();
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
//no break;
|
2000-09-18 16:07:07 +00:00
|
|
|
default:
|
|
|
|
Control::KeyInput( rKEvt );
|
2010-11-05 10:31:15 +08:00
|
|
|
bDefault = sal_True;
|
2000-09-18 16:07:07 +00:00
|
|
|
break;
|
|
|
|
}
|
2002-05-28 11:31:25 +00:00
|
|
|
if(!bDefault)
|
|
|
|
EndSelection();
|
2000-09-18 16:07:07 +00:00
|
|
|
if ( nItemPos != VALUESET_ITEM_NOTFOUND )
|
|
|
|
{
|
2010-11-05 10:31:15 +08:00
|
|
|
sal_uInt16 nItemId;
|
2000-09-18 16:07:07 +00:00
|
|
|
if ( nItemPos != VALUESET_ITEM_NONEITEM )
|
|
|
|
nItemId = GetItemId( nItemPos );
|
|
|
|
else
|
|
|
|
nItemId = 0;
|
2010-03-11 18:18:08 +01:00
|
|
|
|
2000-09-18 16:07:07 +00:00
|
|
|
if ( nItemId != mnSelItemId )
|
|
|
|
{
|
|
|
|
SelectItem( nItemId );
|
2002-05-28 11:31:25 +00:00
|
|
|
//select only if WB_NO_DIRECTSELECT is not set
|
|
|
|
if(0 == (GetStyle()&WB_NO_DIRECTSELECT))
|
|
|
|
Select();
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
void ValueSet::Command( const CommandEvent& rCEvt )
|
|
|
|
{
|
|
|
|
if ( (rCEvt.GetCommand() == COMMAND_WHEEL) ||
|
|
|
|
(rCEvt.GetCommand() == COMMAND_STARTAUTOSCROLL) ||
|
|
|
|
(rCEvt.GetCommand() == COMMAND_AUTOSCROLL) )
|
|
|
|
{
|
|
|
|
if ( HandleScrollCommand( rCEvt, NULL, mpScrBar ) )
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
Control::Command( rCEvt );
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
2006-06-19 19:58:33 +00:00
|
|
|
void ValueSet::Paint( const Rectangle& )
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
if ( GetStyle() & WB_FLATVALUESET )
|
|
|
|
{
|
|
|
|
const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings();
|
|
|
|
SetLineColor();
|
|
|
|
SetFillColor( rStyleSettings.GetFaceColor() );
|
|
|
|
long nOffY = maVirDev.GetOutputSizePixel().Height();
|
|
|
|
Size aWinSize = GetOutputSizePixel();
|
|
|
|
DrawRect( Rectangle( Point( 0, nOffY ), Point( aWinSize.Width(), aWinSize.Height() ) ) );
|
|
|
|
}
|
|
|
|
|
|
|
|
ImplDraw();
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
void ValueSet::GetFocus()
|
|
|
|
{
|
2003-03-27 13:40:07 +00:00
|
|
|
OSL_TRACE ("value set getting focus");
|
2000-09-18 16:07:07 +00:00
|
|
|
ImplDrawSelect();
|
|
|
|
Control::GetFocus();
|
2003-03-27 13:40:07 +00:00
|
|
|
|
2009-09-18 12:59:21 +00:00
|
|
|
// Tell the accessible object that we got the focus.
|
2010-11-05 10:31:15 +08:00
|
|
|
ValueSetAcc* pAcc = ValueSetAcc::getImplementation( GetAccessible( sal_False ) );
|
2009-09-18 12:59:21 +00:00
|
|
|
if( pAcc )
|
|
|
|
pAcc->GetFocus();
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
void ValueSet::LoseFocus()
|
|
|
|
{
|
2003-03-27 13:40:07 +00:00
|
|
|
OSL_TRACE ("value set losing focus");
|
2000-09-18 16:07:07 +00:00
|
|
|
if ( mbNoSelection && mnSelItemId )
|
|
|
|
ImplHideSelect( mnSelItemId );
|
|
|
|
else
|
|
|
|
HideFocus();
|
|
|
|
Control::LoseFocus();
|
2003-03-27 13:40:07 +00:00
|
|
|
|
2009-09-18 12:59:21 +00:00
|
|
|
// Tell the accessible object that we lost the focus.
|
2010-11-05 10:31:15 +08:00
|
|
|
ValueSetAcc* pAcc = ValueSetAcc::getImplementation( GetAccessible( sal_False ) );
|
2009-09-18 12:59:21 +00:00
|
|
|
if( pAcc )
|
|
|
|
pAcc->LoseFocus();
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
void ValueSet::Resize()
|
|
|
|
{
|
2010-11-05 10:31:15 +08:00
|
|
|
mbFormat = sal_True;
|
2000-09-18 16:07:07 +00:00
|
|
|
if ( IsReallyVisible() && IsUpdateMode() )
|
|
|
|
Invalidate();
|
|
|
|
Control::Resize();
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
void ValueSet::RequestHelp( const HelpEvent& rHEvt )
|
|
|
|
{
|
|
|
|
if ( (rHEvt.GetMode() & (HELPMODE_QUICK | HELPMODE_BALLOON)) == HELPMODE_QUICK )
|
|
|
|
{
|
|
|
|
Point aPos = ScreenToOutputPixel( rHEvt.GetMousePosPixel() );
|
2010-11-05 10:31:15 +08:00
|
|
|
sal_uInt16 nItemPos = ImplGetItem( aPos );
|
2000-11-16 18:18:50 +00:00
|
|
|
if ( nItemPos != VALUESET_ITEM_NOTFOUND )
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
2000-11-16 18:18:50 +00:00
|
|
|
ValueSetItem* pItem = ImplGetItem( nItemPos );
|
|
|
|
Rectangle aItemRect = pItem->maRect;
|
|
|
|
Point aPt = OutputToScreenPixel( aItemRect.TopLeft() );
|
|
|
|
aItemRect.Left() = aPt.X();
|
|
|
|
aItemRect.Top() = aPt.Y();
|
|
|
|
aPt = OutputToScreenPixel( aItemRect.BottomRight() );
|
|
|
|
aItemRect.Right() = aPt.X();
|
|
|
|
aItemRect.Bottom() = aPt.Y();
|
|
|
|
Help::ShowQuickHelp( this, aItemRect, GetItemText( pItem->mnId ) );
|
|
|
|
return;
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
Control::RequestHelp( rHEvt );
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
void ValueSet::StateChanged( StateChangedType nType )
|
|
|
|
{
|
|
|
|
Control::StateChanged( nType );
|
|
|
|
|
|
|
|
if ( nType == STATE_CHANGE_INITSHOW )
|
|
|
|
{
|
|
|
|
if ( mbFormat )
|
|
|
|
Format();
|
|
|
|
}
|
|
|
|
else if ( nType == STATE_CHANGE_UPDATEMODE )
|
|
|
|
{
|
|
|
|
if ( IsReallyVisible() && IsUpdateMode() )
|
|
|
|
Invalidate();
|
|
|
|
}
|
|
|
|
else if ( nType == STATE_CHANGE_TEXT )
|
|
|
|
{
|
|
|
|
if ( mpNoneItem && !mbFormat && IsReallyVisible() && IsUpdateMode() )
|
|
|
|
{
|
|
|
|
ImplFormatItem( mpNoneItem );
|
|
|
|
Invalidate( mpNoneItem->maRect );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else if ( (nType == STATE_CHANGE_ZOOM) ||
|
|
|
|
(nType == STATE_CHANGE_CONTROLFONT) )
|
|
|
|
{
|
2010-11-05 10:31:15 +08:00
|
|
|
ImplInitSettings( sal_True, sal_False, sal_False );
|
2000-09-18 16:07:07 +00:00
|
|
|
Invalidate();
|
|
|
|
}
|
|
|
|
else if ( nType == STATE_CHANGE_CONTROLFOREGROUND )
|
|
|
|
{
|
2010-11-05 10:31:15 +08:00
|
|
|
ImplInitSettings( sal_False, sal_True, sal_False );
|
2000-09-18 16:07:07 +00:00
|
|
|
Invalidate();
|
|
|
|
}
|
|
|
|
else if ( nType == STATE_CHANGE_CONTROLBACKGROUND )
|
|
|
|
{
|
2010-11-05 10:31:15 +08:00
|
|
|
ImplInitSettings( sal_False, sal_False, sal_True );
|
2000-09-18 16:07:07 +00:00
|
|
|
Invalidate();
|
|
|
|
}
|
2004-08-02 16:56:55 +00:00
|
|
|
else if ( (nType == STATE_CHANGE_STYLE) || (nType == STATE_CHANGE_ENABLE) )
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
2010-11-05 10:31:15 +08:00
|
|
|
mbFormat = sal_True;
|
|
|
|
ImplInitSettings( sal_False, sal_False, sal_True );
|
2000-09-18 16:07:07 +00:00
|
|
|
Invalidate();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
void ValueSet::DataChanged( const DataChangedEvent& rDCEvt )
|
|
|
|
{
|
|
|
|
Control::DataChanged( rDCEvt );
|
|
|
|
|
|
|
|
if ( (rDCEvt.GetType() == DATACHANGED_FONTS) ||
|
|
|
|
(rDCEvt.GetType() == DATACHANGED_DISPLAY) ||
|
|
|
|
(rDCEvt.GetType() == DATACHANGED_FONTSUBSTITUTION) ||
|
|
|
|
((rDCEvt.GetType() == DATACHANGED_SETTINGS) &&
|
|
|
|
(rDCEvt.GetFlags() & SETTINGS_STYLE)) )
|
|
|
|
{
|
2010-11-05 10:31:15 +08:00
|
|
|
mbFormat = sal_True;
|
|
|
|
ImplInitSettings( sal_True, sal_True, sal_True );
|
2000-09-18 16:07:07 +00:00
|
|
|
Invalidate();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
void ValueSet::Select()
|
|
|
|
{
|
|
|
|
maSelectHdl.Call( this );
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
void ValueSet::DoubleClick()
|
|
|
|
{
|
|
|
|
maDoubleClickHdl.Call( this );
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
void ValueSet::UserDraw( const UserDrawEvent& )
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
2010-11-05 10:31:15 +08:00
|
|
|
void ValueSet::InsertItem( sal_uInt16 nItemId, const Image& rImage, sal_uInt16 nPos )
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
DBG_ASSERT( nItemId, "ValueSet::InsertItem(): ItemId == 0" );
|
|
|
|
DBG_ASSERT( GetItemPos( nItemId ) == VALUESET_ITEM_NOTFOUND,
|
|
|
|
"ValueSet::InsertItem(): ItemId already exists" );
|
|
|
|
|
2002-02-25 09:52:14 +00:00
|
|
|
ValueSetItem* pItem = new ValueSetItem( *this );
|
2000-09-18 16:07:07 +00:00
|
|
|
pItem->mnId = nItemId;
|
|
|
|
pItem->meType = VALUESETITEM_IMAGE;
|
|
|
|
pItem->maImage = rImage;
|
2010-11-05 10:31:15 +08:00
|
|
|
mpImpl->mpItemList->Insert( pItem, (sal_uIntPtr)nPos );
|
2000-09-18 16:07:07 +00:00
|
|
|
|
2010-11-05 10:31:15 +08:00
|
|
|
mbFormat = sal_True;
|
2000-09-18 16:07:07 +00:00
|
|
|
if ( IsReallyVisible() && IsUpdateMode() )
|
|
|
|
Invalidate();
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
2010-11-05 10:31:15 +08:00
|
|
|
void ValueSet::InsertItem( sal_uInt16 nItemId, const Color& rColor, sal_uInt16 nPos )
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
DBG_ASSERT( nItemId, "ValueSet::InsertItem(): ItemId == 0" );
|
|
|
|
DBG_ASSERT( GetItemPos( nItemId ) == VALUESET_ITEM_NOTFOUND,
|
|
|
|
"ValueSet::InsertItem(): ItemId already exists" );
|
|
|
|
|
2002-02-25 09:52:14 +00:00
|
|
|
ValueSetItem* pItem = new ValueSetItem( *this );
|
2000-09-18 16:07:07 +00:00
|
|
|
pItem->mnId = nItemId;
|
|
|
|
pItem->meType = VALUESETITEM_COLOR;
|
|
|
|
pItem->maColor = rColor;
|
2010-11-05 10:31:15 +08:00
|
|
|
mpImpl->mpItemList->Insert( pItem, (sal_uIntPtr)nPos );
|
2000-09-18 16:07:07 +00:00
|
|
|
|
2010-11-05 10:31:15 +08:00
|
|
|
mbFormat = sal_True;
|
2000-09-18 16:07:07 +00:00
|
|
|
if ( IsReallyVisible() && IsUpdateMode() )
|
|
|
|
Invalidate();
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
2010-11-05 10:31:15 +08:00
|
|
|
void ValueSet::InsertItem( sal_uInt16 nItemId, const Image& rImage,
|
|
|
|
const XubString& rText, sal_uInt16 nPos )
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
DBG_ASSERT( nItemId, "ValueSet::InsertItem(): ItemId == 0" );
|
|
|
|
DBG_ASSERT( GetItemPos( nItemId ) == VALUESET_ITEM_NOTFOUND,
|
|
|
|
"ValueSet::InsertItem(): ItemId already exists" );
|
|
|
|
|
2002-02-25 09:52:14 +00:00
|
|
|
ValueSetItem* pItem = new ValueSetItem( *this );
|
2000-09-18 16:07:07 +00:00
|
|
|
pItem->mnId = nItemId;
|
|
|
|
pItem->meType = VALUESETITEM_IMAGE;
|
|
|
|
pItem->maImage = rImage;
|
|
|
|
pItem->maText = rText;
|
2010-11-05 10:31:15 +08:00
|
|
|
mpImpl->mpItemList->Insert( pItem, (sal_uIntPtr)nPos );
|
2000-09-18 16:07:07 +00:00
|
|
|
|
2010-11-05 10:31:15 +08:00
|
|
|
mbFormat = sal_True;
|
2000-09-18 16:07:07 +00:00
|
|
|
if ( IsReallyVisible() && IsUpdateMode() )
|
|
|
|
Invalidate();
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
2010-11-05 10:31:15 +08:00
|
|
|
void ValueSet::InsertItem( sal_uInt16 nItemId, const Color& rColor,
|
|
|
|
const XubString& rText, sal_uInt16 nPos )
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
DBG_ASSERT( nItemId, "ValueSet::InsertItem(): ItemId == 0" );
|
|
|
|
DBG_ASSERT( GetItemPos( nItemId ) == VALUESET_ITEM_NOTFOUND,
|
|
|
|
"ValueSet::InsertItem(): ItemId already exists" );
|
|
|
|
|
2002-02-25 09:52:14 +00:00
|
|
|
ValueSetItem* pItem = new ValueSetItem( *this );
|
2000-09-18 16:07:07 +00:00
|
|
|
pItem->mnId = nItemId;
|
|
|
|
pItem->meType = VALUESETITEM_COLOR;
|
|
|
|
pItem->maColor = rColor;
|
|
|
|
pItem->maText = rText;
|
2010-11-05 10:31:15 +08:00
|
|
|
mpImpl->mpItemList->Insert( pItem, (sal_uIntPtr)nPos );
|
2000-09-18 16:07:07 +00:00
|
|
|
|
2010-11-05 10:31:15 +08:00
|
|
|
mbFormat = sal_True;
|
2000-09-18 16:07:07 +00:00
|
|
|
if ( IsReallyVisible() && IsUpdateMode() )
|
|
|
|
Invalidate();
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
2010-11-05 10:31:15 +08:00
|
|
|
void ValueSet::InsertItem( sal_uInt16 nItemId, sal_uInt16 nPos )
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
DBG_ASSERT( nItemId, "ValueSet::InsertItem(): ItemId == 0" );
|
|
|
|
DBG_ASSERT( GetItemPos( nItemId ) == VALUESET_ITEM_NOTFOUND,
|
|
|
|
"ValueSet::InsertItem(): ItemId already exists" );
|
|
|
|
|
2002-02-25 09:52:14 +00:00
|
|
|
ValueSetItem* pItem = new ValueSetItem( *this );
|
2000-09-18 16:07:07 +00:00
|
|
|
pItem->mnId = nItemId;
|
|
|
|
pItem->meType = VALUESETITEM_USERDRAW;
|
2010-11-05 10:31:15 +08:00
|
|
|
mpImpl->mpItemList->Insert( pItem, (sal_uIntPtr)nPos );
|
2000-09-18 16:07:07 +00:00
|
|
|
|
2010-11-05 10:31:15 +08:00
|
|
|
mbFormat = sal_True;
|
2000-09-18 16:07:07 +00:00
|
|
|
if ( IsReallyVisible() && IsUpdateMode() )
|
|
|
|
Invalidate();
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
2010-11-05 10:31:15 +08:00
|
|
|
void ValueSet::InsertSpace( sal_uInt16 nItemId, sal_uInt16 nPos )
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
DBG_ASSERT( nItemId, "ValueSet::InsertSpace(): ItemId == 0" );
|
|
|
|
DBG_ASSERT( GetItemPos( nItemId ) == VALUESET_ITEM_NOTFOUND,
|
|
|
|
"ValueSet::InsertSpace(): ItemId already exists" );
|
|
|
|
|
2002-02-25 09:52:14 +00:00
|
|
|
ValueSetItem* pItem = new ValueSetItem( *this );
|
2000-09-18 16:07:07 +00:00
|
|
|
pItem->mnId = nItemId;
|
|
|
|
pItem->meType = VALUESETITEM_SPACE;
|
2010-11-05 10:31:15 +08:00
|
|
|
mpImpl->mpItemList->Insert( pItem, (sal_uIntPtr)nPos );
|
2000-09-18 16:07:07 +00:00
|
|
|
|
2010-11-05 10:31:15 +08:00
|
|
|
mbFormat = sal_True;
|
2000-09-18 16:07:07 +00:00
|
|
|
if ( IsReallyVisible() && IsUpdateMode() )
|
|
|
|
Invalidate();
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
2010-11-05 10:31:15 +08:00
|
|
|
void ValueSet::RemoveItem( sal_uInt16 nItemId )
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
2010-11-05 10:31:15 +08:00
|
|
|
sal_uInt16 nPos = GetItemPos( nItemId );
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
if ( nPos == VALUESET_ITEM_NOTFOUND )
|
|
|
|
return;
|
|
|
|
|
2007-05-22 18:33:21 +00:00
|
|
|
delete mpImpl->mpItemList->Remove( nPos );
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
// Variablen zuruecksetzen
|
|
|
|
if ( (mnHighItemId == nItemId) || (mnSelItemId == nItemId) )
|
|
|
|
{
|
|
|
|
mnCurCol = 0;
|
|
|
|
mnOldItemId = 0;
|
|
|
|
mnHighItemId = 0;
|
|
|
|
mnSelItemId = 0;
|
2010-11-05 10:31:15 +08:00
|
|
|
mbNoSelection = sal_True;
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
2010-11-05 10:31:15 +08:00
|
|
|
mbFormat = sal_True;
|
2000-09-18 16:07:07 +00:00
|
|
|
if ( IsReallyVisible() && IsUpdateMode() )
|
|
|
|
Invalidate();
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
void ValueSet::CopyItems( const ValueSet& rValueSet )
|
|
|
|
{
|
2002-02-25 09:52:14 +00:00
|
|
|
ImplDeleteItems();
|
2000-09-18 16:07:07 +00:00
|
|
|
|
2007-05-22 18:33:21 +00:00
|
|
|
ValueSetItem* pItem = rValueSet.mpImpl->mpItemList->First();
|
2000-09-18 16:07:07 +00:00
|
|
|
while ( pItem )
|
|
|
|
{
|
2002-02-25 09:52:14 +00:00
|
|
|
ValueSetItem* pNewItem = new ValueSetItem( *this );
|
|
|
|
|
|
|
|
pNewItem->mnId = pItem->mnId;
|
|
|
|
pNewItem->mnBits = pItem->mnBits;
|
|
|
|
pNewItem->meType = pItem->meType;
|
|
|
|
pNewItem->maImage = pItem->maImage;
|
|
|
|
pNewItem->maColor = pItem->maColor;
|
|
|
|
pNewItem->maText = pItem->maText;
|
|
|
|
pNewItem->mpData = pItem->mpData;
|
|
|
|
pNewItem->maRect = pItem->maRect;
|
|
|
|
pNewItem->mpxAcc = NULL;
|
|
|
|
|
2007-05-22 18:33:21 +00:00
|
|
|
mpImpl->mpItemList->Insert( pNewItem );
|
|
|
|
pItem = rValueSet.mpImpl->mpItemList->Next();
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// Variablen zuruecksetzen
|
|
|
|
mnFirstLine = 0;
|
|
|
|
mnCurCol = 0;
|
|
|
|
mnOldItemId = 0;
|
|
|
|
mnHighItemId = 0;
|
|
|
|
mnSelItemId = 0;
|
2010-11-05 10:31:15 +08:00
|
|
|
mbNoSelection = sal_True;
|
2000-09-18 16:07:07 +00:00
|
|
|
|
2010-11-05 10:31:15 +08:00
|
|
|
mbFormat = sal_True;
|
2000-09-18 16:07:07 +00:00
|
|
|
if ( IsReallyVisible() && IsUpdateMode() )
|
|
|
|
Invalidate();
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
void ValueSet::Clear()
|
|
|
|
{
|
2002-02-25 09:52:14 +00:00
|
|
|
ImplDeleteItems();
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
// Variablen zuruecksetzen
|
|
|
|
mnFirstLine = 0;
|
|
|
|
mnCurCol = 0;
|
|
|
|
mnOldItemId = 0;
|
|
|
|
mnHighItemId = 0;
|
|
|
|
mnSelItemId = 0;
|
2010-11-05 10:31:15 +08:00
|
|
|
mbNoSelection = sal_True;
|
2000-09-18 16:07:07 +00:00
|
|
|
|
2010-11-05 10:31:15 +08:00
|
|
|
mbFormat = sal_True;
|
2000-09-18 16:07:07 +00:00
|
|
|
if ( IsReallyVisible() && IsUpdateMode() )
|
|
|
|
Invalidate();
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
2010-11-05 10:31:15 +08:00
|
|
|
sal_uInt16 ValueSet::GetItemCount() const
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
2010-11-05 10:31:15 +08:00
|
|
|
return (sal_uInt16)mpImpl->mpItemList->Count();
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
2010-11-05 10:31:15 +08:00
|
|
|
sal_uInt16 ValueSet::GetItemPos( sal_uInt16 nItemId ) const
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
2007-05-22 18:33:21 +00:00
|
|
|
ValueSetItem* pItem = mpImpl->mpItemList->First();
|
2000-09-18 16:07:07 +00:00
|
|
|
while ( pItem )
|
|
|
|
{
|
|
|
|
if ( pItem->mnId == nItemId )
|
2010-11-05 10:31:15 +08:00
|
|
|
return (sal_uInt16)mpImpl->mpItemList->GetCurPos();
|
2007-05-22 18:33:21 +00:00
|
|
|
pItem = mpImpl->mpItemList->Next();
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return VALUESET_ITEM_NOTFOUND;
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
2010-11-05 10:31:15 +08:00
|
|
|
sal_uInt16 ValueSet::GetItemId( sal_uInt16 nPos ) const
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
2007-05-22 18:33:21 +00:00
|
|
|
ValueSetItem* pItem = mpImpl->mpItemList->GetObject( nPos );
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
if ( pItem )
|
|
|
|
return pItem->mnId;
|
|
|
|
else
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
2010-11-05 10:31:15 +08:00
|
|
|
sal_uInt16 ValueSet::GetItemId( const Point& rPos ) const
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
2010-11-05 10:31:15 +08:00
|
|
|
sal_uInt16 nItemPos = ImplGetItem( rPos );
|
2000-11-16 18:18:50 +00:00
|
|
|
if ( nItemPos != VALUESET_ITEM_NOTFOUND )
|
|
|
|
return GetItemId( nItemPos );
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
2010-11-05 10:31:15 +08:00
|
|
|
Rectangle ValueSet::GetItemRect( sal_uInt16 nItemId ) const
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
2010-11-05 10:31:15 +08:00
|
|
|
sal_uInt16 nPos = GetItemPos( nItemId );
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
if ( nPos != VALUESET_ITEM_NOTFOUND )
|
2007-05-22 18:33:21 +00:00
|
|
|
return mpImpl->mpItemList->GetObject( nPos )->maRect;
|
2000-09-18 16:07:07 +00:00
|
|
|
else
|
|
|
|
return Rectangle();
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
2010-11-05 10:31:15 +08:00
|
|
|
void ValueSet::EnableFullItemMode( sal_Bool bFullMode )
|
2000-11-17 09:26:14 +00:00
|
|
|
{
|
|
|
|
mbFullMode = bFullMode;
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
2010-11-05 10:31:15 +08:00
|
|
|
void ValueSet::SetColCount( sal_uInt16 nNewCols )
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
if ( mnUserCols != nNewCols )
|
|
|
|
{
|
|
|
|
mnUserCols = nNewCols;
|
2010-11-05 10:31:15 +08:00
|
|
|
mbFormat = sal_True;
|
2000-09-18 16:07:07 +00:00
|
|
|
if ( IsReallyVisible() && IsUpdateMode() )
|
|
|
|
Invalidate();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
2010-11-05 10:31:15 +08:00
|
|
|
void ValueSet::SetLineCount( sal_uInt16 nNewLines )
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
if ( mnUserVisLines != nNewLines )
|
|
|
|
{
|
|
|
|
mnUserVisLines = nNewLines;
|
2010-11-05 10:31:15 +08:00
|
|
|
mbFormat = sal_True;
|
2000-09-18 16:07:07 +00:00
|
|
|
if ( IsReallyVisible() && IsUpdateMode() )
|
|
|
|
Invalidate();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
void ValueSet::SetItemWidth( long nNewItemWidth )
|
|
|
|
{
|
|
|
|
if ( mnUserItemWidth != nNewItemWidth )
|
|
|
|
{
|
|
|
|
mnUserItemWidth = nNewItemWidth;
|
2010-11-05 10:31:15 +08:00
|
|
|
mbFormat = sal_True;
|
2000-09-18 16:07:07 +00:00
|
|
|
if ( IsReallyVisible() && IsUpdateMode() )
|
|
|
|
Invalidate();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
void ValueSet::SetItemHeight( long nNewItemHeight )
|
|
|
|
{
|
|
|
|
if ( mnUserItemHeight != nNewItemHeight )
|
|
|
|
{
|
|
|
|
mnUserItemHeight = nNewItemHeight;
|
2010-11-05 10:31:15 +08:00
|
|
|
mbFormat = sal_True;
|
2000-09-18 16:07:07 +00:00
|
|
|
if ( IsReallyVisible() && IsUpdateMode() )
|
|
|
|
Invalidate();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
2010-11-05 10:31:15 +08:00
|
|
|
void ValueSet::SetFirstLine( sal_uInt16 nNewLine )
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
if ( mnFirstLine != nNewLine )
|
|
|
|
{
|
|
|
|
mnFirstLine = nNewLine;
|
2010-11-05 10:31:15 +08:00
|
|
|
mbFormat = sal_True;
|
2000-09-18 16:07:07 +00:00
|
|
|
if ( IsReallyVisible() && IsUpdateMode() )
|
|
|
|
Invalidate();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
2010-11-05 10:31:15 +08:00
|
|
|
void ValueSet::SelectItem( sal_uInt16 nItemId )
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
2010-11-05 10:31:15 +08:00
|
|
|
sal_uInt16 nItemPos = 0;
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
if ( nItemId )
|
|
|
|
{
|
2006-06-19 19:58:33 +00:00
|
|
|
nItemPos = GetItemPos( nItemId );
|
|
|
|
if ( nItemPos == VALUESET_ITEM_NOTFOUND )
|
2000-09-18 16:07:07 +00:00
|
|
|
return;
|
2007-05-22 18:33:21 +00:00
|
|
|
if ( mpImpl->mpItemList->GetObject( nItemPos )->meType == VALUESETITEM_SPACE )
|
2000-09-18 16:07:07 +00:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( (mnSelItemId != nItemId) || mbNoSelection )
|
|
|
|
{
|
2010-11-05 10:31:15 +08:00
|
|
|
sal_uInt16 nOldItem = mnSelItemId ? mnSelItemId : 1;
|
2000-09-18 16:07:07 +00:00
|
|
|
mnSelItemId = nItemId;
|
2010-11-05 10:31:15 +08:00
|
|
|
mbNoSelection = sal_False;
|
2000-09-18 16:07:07 +00:00
|
|
|
|
2010-11-05 10:31:15 +08:00
|
|
|
sal_Bool bNewOut;
|
|
|
|
sal_Bool bNewLine;
|
2000-09-18 16:07:07 +00:00
|
|
|
if ( !mbFormat && IsReallyVisible() && IsUpdateMode() )
|
2010-11-05 10:31:15 +08:00
|
|
|
bNewOut = sal_True;
|
2000-09-18 16:07:07 +00:00
|
|
|
else
|
2010-11-05 10:31:15 +08:00
|
|
|
bNewOut = sal_False;
|
|
|
|
bNewLine = sal_False;
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
// Gegebenenfalls in den sichtbaren Bereich scrollen
|
|
|
|
if ( mbScroll && nItemId )
|
|
|
|
{
|
2010-11-05 10:31:15 +08:00
|
|
|
sal_uInt16 nNewLine = (sal_uInt16)(nItemPos / mnCols);
|
2000-09-18 16:07:07 +00:00
|
|
|
if ( nNewLine < mnFirstLine )
|
|
|
|
{
|
|
|
|
mnFirstLine = nNewLine;
|
2010-11-05 10:31:15 +08:00
|
|
|
bNewLine = sal_True;
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
2010-11-05 10:31:15 +08:00
|
|
|
else if ( nNewLine > (sal_uInt16)(mnFirstLine+mnVisLines-1) )
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
2010-11-05 10:31:15 +08:00
|
|
|
mnFirstLine = (sal_uInt16)(nNewLine-mnVisLines+1);
|
|
|
|
bNewLine = sal_True;
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( bNewOut )
|
|
|
|
{
|
|
|
|
if ( bNewLine )
|
|
|
|
{
|
|
|
|
// Falls sich der sichtbare Bereich geaendert hat,
|
|
|
|
// alles neu ausgeben
|
2010-11-05 10:31:15 +08:00
|
|
|
mbFormat = sal_True;
|
2000-09-18 16:07:07 +00:00
|
|
|
ImplDraw();
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
// alte Selection wegnehmen und neue ausgeben
|
|
|
|
ImplHideSelect( nOldItem );
|
|
|
|
ImplDrawSelect();
|
|
|
|
}
|
|
|
|
}
|
2002-02-25 09:52:14 +00:00
|
|
|
|
|
|
|
if( ImplHasAccessibleListeners() )
|
|
|
|
{
|
2002-06-06 06:42:13 +00:00
|
|
|
// focus event (deselect)
|
|
|
|
if( nOldItem )
|
|
|
|
{
|
2010-11-05 10:31:15 +08:00
|
|
|
const sal_uInt16 nPos = GetItemPos( nItemId );
|
2002-06-06 06:42:13 +00:00
|
|
|
|
|
|
|
if( nPos != VALUESET_ITEM_NOTFOUND )
|
|
|
|
{
|
2007-05-22 18:33:21 +00:00
|
|
|
ValueItemAcc* pItemAcc = ValueItemAcc::getImplementation(
|
|
|
|
mpImpl->mpItemList->GetObject( nPos )->GetAccessible( mpImpl->mbIsTransientChildrenDisabled ) );
|
2002-06-06 06:42:13 +00:00
|
|
|
|
|
|
|
if( pItemAcc )
|
|
|
|
{
|
|
|
|
::com::sun::star::uno::Any aOldAny, aNewAny;
|
2007-08-03 12:32:02 +00:00
|
|
|
if( !mpImpl->mbIsTransientChildrenDisabled)
|
|
|
|
{
|
|
|
|
aOldAny <<= ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >(
|
|
|
|
static_cast< ::cppu::OWeakObject* >( pItemAcc ));
|
|
|
|
ImplFireAccessibleEvent (::com::sun::star::accessibility::AccessibleEventId::ACTIVE_DESCENDANT_CHANGED, aOldAny, aNewAny );
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
aOldAny <<= ::com::sun::star::accessibility::AccessibleStateType::FOCUSED;
|
|
|
|
pItemAcc->FireAccessibleEvent( ::com::sun::star::accessibility::AccessibleEventId::STATE_CHANGED, aOldAny, aNewAny );
|
|
|
|
}
|
2002-06-06 06:42:13 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// focus event (select)
|
2010-11-05 10:31:15 +08:00
|
|
|
const sal_uInt16 nPos = GetItemPos( mnSelItemId );
|
2002-06-06 06:42:13 +00:00
|
|
|
|
2006-06-19 19:58:33 +00:00
|
|
|
ValueSetItem* pItem;
|
|
|
|
if( nPos != VALUESET_ITEM_NOTFOUND )
|
2007-05-22 18:33:21 +00:00
|
|
|
pItem = mpImpl->mpItemList->GetObject(nPos);
|
2006-06-19 19:58:33 +00:00
|
|
|
else
|
|
|
|
pItem = mpNoneItem;
|
2002-06-06 06:42:13 +00:00
|
|
|
|
2006-06-19 19:58:33 +00:00
|
|
|
ValueItemAcc* pItemAcc = NULL;
|
|
|
|
if (pItem != NULL)
|
2007-05-22 18:33:21 +00:00
|
|
|
pItemAcc = ValueItemAcc::getImplementation(pItem->GetAccessible( mpImpl->mbIsTransientChildrenDisabled ) );
|
2002-11-25 11:49:49 +00:00
|
|
|
|
2006-06-19 19:58:33 +00:00
|
|
|
if( pItemAcc )
|
|
|
|
{
|
|
|
|
::com::sun::star::uno::Any aOldAny, aNewAny;
|
2007-08-03 12:32:02 +00:00
|
|
|
if( !mpImpl->mbIsTransientChildrenDisabled)
|
|
|
|
{
|
|
|
|
aNewAny <<= ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >(
|
|
|
|
static_cast< ::cppu::OWeakObject* >( pItemAcc ));
|
|
|
|
ImplFireAccessibleEvent( ::com::sun::star::accessibility::AccessibleEventId::ACTIVE_DESCENDANT_CHANGED, aOldAny, aNewAny );
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
aNewAny <<= ::com::sun::star::accessibility::AccessibleStateType::FOCUSED;
|
|
|
|
pItemAcc->FireAccessibleEvent( ::com::sun::star::accessibility::AccessibleEventId::STATE_CHANGED, aOldAny, aNewAny );
|
|
|
|
}
|
2002-06-06 06:42:13 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// selection event
|
2002-02-25 09:52:14 +00:00
|
|
|
::com::sun::star::uno::Any aOldAny, aNewAny;
|
2003-04-24 14:49:45 +00:00
|
|
|
ImplFireAccessibleEvent( ::com::sun::star::accessibility::AccessibleEventId::SELECTION_CHANGED, aOldAny, aNewAny );
|
2002-02-25 09:52:14 +00:00
|
|
|
}
|
2010-04-28 18:43:47 +02:00
|
|
|
mpImpl->maHighlightHdl.Call(this);
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
void ValueSet::SetNoSelection()
|
|
|
|
{
|
2010-11-05 10:31:15 +08:00
|
|
|
mbNoSelection = sal_True;
|
|
|
|
mbHighlight = sal_False;
|
|
|
|
mbSelection = sal_False;
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
if ( IsReallyVisible() && IsUpdateMode() )
|
|
|
|
ImplDraw();
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
2010-11-05 10:31:15 +08:00
|
|
|
void ValueSet::SetItemBits( sal_uInt16 nItemId, sal_uInt16 nItemBits )
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
2010-11-05 10:31:15 +08:00
|
|
|
sal_uInt16 nPos = GetItemPos( nItemId );
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
if ( nPos != VALUESET_ITEM_NOTFOUND )
|
2007-05-22 18:33:21 +00:00
|
|
|
mpImpl->mpItemList->GetObject( nPos )->mnBits = nItemBits;
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
2010-11-05 10:31:15 +08:00
|
|
|
sal_uInt16 ValueSet::GetItemBits( sal_uInt16 nItemId ) const
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
2010-11-05 10:31:15 +08:00
|
|
|
sal_uInt16 nPos = GetItemPos( nItemId );
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
if ( nPos != VALUESET_ITEM_NOTFOUND )
|
2007-05-22 18:33:21 +00:00
|
|
|
return mpImpl->mpItemList->GetObject( nPos )->mnBits;
|
2000-09-18 16:07:07 +00:00
|
|
|
else
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
2010-11-05 10:31:15 +08:00
|
|
|
void ValueSet::SetItemImage( sal_uInt16 nItemId, const Image& rImage )
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
2010-11-05 10:31:15 +08:00
|
|
|
sal_uInt16 nPos = GetItemPos( nItemId );
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
if ( nPos == VALUESET_ITEM_NOTFOUND )
|
|
|
|
return;
|
|
|
|
|
2007-05-22 18:33:21 +00:00
|
|
|
ValueSetItem* pItem = mpImpl->mpItemList->GetObject( nPos );
|
2000-09-18 16:07:07 +00:00
|
|
|
pItem->meType = VALUESETITEM_IMAGE;
|
|
|
|
pItem->maImage = rImage;
|
|
|
|
|
|
|
|
if ( !mbFormat && IsReallyVisible() && IsUpdateMode() )
|
|
|
|
{
|
|
|
|
ImplFormatItem( pItem );
|
|
|
|
Invalidate( pItem->maRect );
|
|
|
|
}
|
|
|
|
else
|
2010-11-05 10:31:15 +08:00
|
|
|
mbFormat = sal_True;
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
2010-11-05 10:31:15 +08:00
|
|
|
Image ValueSet::GetItemImage( sal_uInt16 nItemId ) const
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
2010-11-05 10:31:15 +08:00
|
|
|
sal_uInt16 nPos = GetItemPos( nItemId );
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
if ( nPos != VALUESET_ITEM_NOTFOUND )
|
2007-05-22 18:33:21 +00:00
|
|
|
return mpImpl->mpItemList->GetObject( nPos )->maImage;
|
2000-09-18 16:07:07 +00:00
|
|
|
else
|
|
|
|
return Image();
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
2010-11-05 10:31:15 +08:00
|
|
|
void ValueSet::SetItemColor( sal_uInt16 nItemId, const Color& rColor )
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
2010-11-05 10:31:15 +08:00
|
|
|
sal_uInt16 nPos = GetItemPos( nItemId );
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
if ( nPos == VALUESET_ITEM_NOTFOUND )
|
|
|
|
return;
|
|
|
|
|
2007-05-22 18:33:21 +00:00
|
|
|
ValueSetItem* pItem = mpImpl->mpItemList->GetObject( nPos );
|
2000-09-18 16:07:07 +00:00
|
|
|
pItem->meType = VALUESETITEM_COLOR;
|
|
|
|
pItem->maColor = rColor;
|
|
|
|
|
|
|
|
if ( !mbFormat && IsReallyVisible() && IsUpdateMode() )
|
|
|
|
{
|
|
|
|
ImplFormatItem( pItem );
|
|
|
|
Invalidate( pItem->maRect );
|
|
|
|
}
|
|
|
|
else
|
2010-11-05 10:31:15 +08:00
|
|
|
mbFormat = sal_True;
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
2010-11-05 10:31:15 +08:00
|
|
|
Color ValueSet::GetItemColor( sal_uInt16 nItemId ) const
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
2010-11-05 10:31:15 +08:00
|
|
|
sal_uInt16 nPos = GetItemPos( nItemId );
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
if ( nPos != VALUESET_ITEM_NOTFOUND )
|
2007-05-22 18:33:21 +00:00
|
|
|
return mpImpl->mpItemList->GetObject( nPos )->maColor;
|
2000-09-18 16:07:07 +00:00
|
|
|
else
|
|
|
|
return Color();
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
2010-11-05 10:31:15 +08:00
|
|
|
void ValueSet::SetItemData( sal_uInt16 nItemId, void* pData )
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
2010-11-05 10:31:15 +08:00
|
|
|
sal_uInt16 nPos = GetItemPos( nItemId );
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
if ( nPos == VALUESET_ITEM_NOTFOUND )
|
|
|
|
return;
|
|
|
|
|
2007-05-22 18:33:21 +00:00
|
|
|
ValueSetItem* pItem = mpImpl->mpItemList->GetObject( nPos );
|
2000-09-18 16:07:07 +00:00
|
|
|
pItem->mpData = pData;
|
|
|
|
|
|
|
|
if ( pItem->meType == VALUESETITEM_USERDRAW )
|
|
|
|
{
|
|
|
|
if ( !mbFormat && IsReallyVisible() && IsUpdateMode() )
|
|
|
|
{
|
|
|
|
ImplFormatItem( pItem );
|
|
|
|
Invalidate( pItem->maRect );
|
|
|
|
}
|
|
|
|
else
|
2010-11-05 10:31:15 +08:00
|
|
|
mbFormat = sal_True;
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
2010-11-05 10:31:15 +08:00
|
|
|
void* ValueSet::GetItemData( sal_uInt16 nItemId ) const
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
2010-11-05 10:31:15 +08:00
|
|
|
sal_uInt16 nPos = GetItemPos( nItemId );
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
if ( nPos != VALUESET_ITEM_NOTFOUND )
|
2007-05-22 18:33:21 +00:00
|
|
|
return mpImpl->mpItemList->GetObject( nPos )->mpData;
|
2000-09-18 16:07:07 +00:00
|
|
|
else
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
2010-11-05 10:31:15 +08:00
|
|
|
void ValueSet::SetItemText( sal_uInt16 nItemId, const XubString& rText )
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
2010-11-05 10:31:15 +08:00
|
|
|
sal_uInt16 nPos = GetItemPos( nItemId );
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
if ( nPos == VALUESET_ITEM_NOTFOUND )
|
|
|
|
return;
|
|
|
|
|
2002-11-26 11:05:04 +00:00
|
|
|
|
2007-05-22 18:33:21 +00:00
|
|
|
ValueSetItem* pItem = mpImpl->mpItemList->GetObject( nPos );
|
2002-11-26 11:05:04 +00:00
|
|
|
|
|
|
|
// Remember old and new name for accessibility event.
|
|
|
|
::com::sun::star::uno::Any aOldName, aNewName;
|
|
|
|
::rtl::OUString sString (pItem->maText);
|
|
|
|
aOldName <<= sString;
|
|
|
|
sString = rText;
|
|
|
|
aNewName <<= sString;
|
|
|
|
|
2000-09-18 16:07:07 +00:00
|
|
|
pItem->maText = rText;
|
|
|
|
|
|
|
|
if ( !mbFormat && IsReallyVisible() && IsUpdateMode() )
|
|
|
|
{
|
2010-11-05 10:31:15 +08:00
|
|
|
sal_uInt16 nTempId = mnSelItemId;
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
if ( mbHighlight )
|
|
|
|
nTempId = mnHighItemId;
|
|
|
|
|
|
|
|
if ( nTempId == nItemId )
|
|
|
|
ImplDrawItemText( pItem->maText );
|
|
|
|
}
|
2002-11-26 11:05:04 +00:00
|
|
|
|
|
|
|
if (ImplHasAccessibleListeners())
|
|
|
|
{
|
|
|
|
::com::sun::star::uno::Reference<
|
2003-04-24 14:49:45 +00:00
|
|
|
::com::sun::star::accessibility::XAccessible> xAccessible (
|
2007-05-22 18:33:21 +00:00
|
|
|
pItem->GetAccessible( mpImpl->mbIsTransientChildrenDisabled ) );
|
2002-11-26 11:05:04 +00:00
|
|
|
static_cast<ValueItemAcc*>(xAccessible.get())->FireAccessibleEvent (
|
2003-04-24 14:49:45 +00:00
|
|
|
::com::sun::star::accessibility::AccessibleEventId::NAME_CHANGED,
|
2002-11-26 11:05:04 +00:00
|
|
|
aOldName, aNewName);
|
|
|
|
}
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
2010-11-05 10:31:15 +08:00
|
|
|
XubString ValueSet::GetItemText( sal_uInt16 nItemId ) const
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
2010-11-05 10:31:15 +08:00
|
|
|
sal_uInt16 nPos = GetItemPos( nItemId );
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
if ( nPos != VALUESET_ITEM_NOTFOUND )
|
2007-05-22 18:33:21 +00:00
|
|
|
return mpImpl->mpItemList->GetObject( nPos )->maText;
|
2000-09-18 16:07:07 +00:00
|
|
|
else
|
|
|
|
return XubString();
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
void ValueSet::SetColor( const Color& rColor )
|
|
|
|
{
|
|
|
|
maColor = rColor;
|
2010-11-05 10:31:15 +08:00
|
|
|
mbFormat = sal_True;
|
2000-09-18 16:07:07 +00:00
|
|
|
if ( IsReallyVisible() && IsUpdateMode() )
|
|
|
|
ImplDraw();
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
2010-11-05 10:31:15 +08:00
|
|
|
void ValueSet::SetExtraSpacing( sal_uInt16 nNewSpacing )
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
if ( GetStyle() & WB_ITEMBORDER )
|
|
|
|
{
|
|
|
|
mnSpacing = nNewSpacing;
|
|
|
|
|
2010-11-05 10:31:15 +08:00
|
|
|
mbFormat = sal_True;
|
2000-09-18 16:07:07 +00:00
|
|
|
if ( IsReallyVisible() && IsUpdateMode() )
|
|
|
|
Invalidate();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
void ValueSet::StartSelection()
|
|
|
|
{
|
|
|
|
mnOldItemId = mnSelItemId;
|
2010-11-05 10:31:15 +08:00
|
|
|
mbHighlight = sal_True;
|
|
|
|
mbSelection = sal_True;
|
2000-09-18 16:07:07 +00:00
|
|
|
mnHighItemId = mnSelItemId;
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
void ValueSet::EndSelection()
|
|
|
|
{
|
|
|
|
if ( mbHighlight )
|
|
|
|
{
|
|
|
|
if ( IsTracking() )
|
|
|
|
EndTracking( ENDTRACK_CANCEL );
|
|
|
|
|
|
|
|
ImplHighlightItem( mnSelItemId );
|
2010-11-05 10:31:15 +08:00
|
|
|
mbHighlight = sal_False;
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
2010-11-05 10:31:15 +08:00
|
|
|
mbSelection = sal_False;
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
2010-11-05 10:31:15 +08:00
|
|
|
sal_Bool ValueSet::StartDrag( const CommandEvent& rCEvt, Region& rRegion )
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
if ( rCEvt.GetCommand() != COMMAND_STARTDRAG )
|
2010-11-05 10:31:15 +08:00
|
|
|
return sal_False;
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
// Gegebenenfalls eine vorhandene Aktion abbrechen
|
|
|
|
EndSelection();
|
|
|
|
|
|
|
|
// Testen, ob angeklickte Seite selektiert ist. Falls dies nicht
|
|
|
|
// der Fall ist, setzen wir ihn als aktuellen Eintrag. Falls Drag and
|
|
|
|
// Drop auch mal ueber Tastatur ausgeloest werden kann, testen wir
|
|
|
|
// dies nur bei einer Mausaktion.
|
2010-11-05 10:31:15 +08:00
|
|
|
sal_uInt16 nSelId;
|
2000-09-18 16:07:07 +00:00
|
|
|
if ( rCEvt.IsMouseEvent() )
|
|
|
|
nSelId = GetItemId( rCEvt.GetMousePosPixel() );
|
|
|
|
else
|
|
|
|
nSelId = mnSelItemId;
|
|
|
|
|
|
|
|
// Falls kein Eintrag angeklickt wurde, starten wir kein Dragging
|
|
|
|
if ( !nSelId )
|
2010-11-05 10:31:15 +08:00
|
|
|
return sal_False;
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
// Testen, ob Seite selektiertiert ist. Falls nicht, als aktuelle
|
|
|
|
// Seite setzen und Select rufen.
|
|
|
|
if ( nSelId != mnSelItemId )
|
|
|
|
{
|
|
|
|
SelectItem( nSelId );
|
|
|
|
Update();
|
|
|
|
Select();
|
|
|
|
}
|
|
|
|
|
|
|
|
Region aRegion;
|
|
|
|
|
|
|
|
// Region zuweisen
|
|
|
|
rRegion = aRegion;
|
|
|
|
|
2010-11-05 10:31:15 +08:00
|
|
|
return sal_True;
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
2010-11-05 10:31:15 +08:00
|
|
|
Size ValueSet::CalcWindowSizePixel( const Size& rItemSize, sal_uInt16 nDesireCols,
|
|
|
|
sal_uInt16 nDesireLines )
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
long nCalcCols = (long)nDesireCols;
|
|
|
|
long nCalcLines = (long)nDesireLines;
|
|
|
|
|
|
|
|
if ( !nCalcCols )
|
|
|
|
{
|
|
|
|
if ( mnUserCols )
|
|
|
|
nCalcCols = (long)mnUserCols;
|
|
|
|
else
|
|
|
|
nCalcCols = 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( !nCalcLines )
|
|
|
|
{
|
|
|
|
nCalcLines = mnVisLines;
|
|
|
|
|
|
|
|
if ( mbFormat )
|
|
|
|
{
|
|
|
|
if ( mnUserVisLines )
|
|
|
|
nCalcLines = mnUserVisLines;
|
|
|
|
else
|
|
|
|
{
|
2007-05-22 18:33:21 +00:00
|
|
|
nCalcLines = (long)mpImpl->mpItemList->Count() / nCalcCols;
|
|
|
|
if ( mpImpl->mpItemList->Count() % nCalcCols )
|
2000-09-18 16:07:07 +00:00
|
|
|
nCalcLines++;
|
|
|
|
else if ( !nCalcLines )
|
|
|
|
nCalcLines = 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
Size aSize( rItemSize.Width()*nCalcCols, rItemSize.Height()*nCalcLines );
|
|
|
|
WinBits nStyle = GetStyle();
|
|
|
|
long nTxtHeight = GetTextHeight();
|
|
|
|
long nSpace;
|
|
|
|
long n;
|
|
|
|
|
|
|
|
if ( nStyle & WB_ITEMBORDER )
|
|
|
|
{
|
|
|
|
if ( nStyle & WB_DOUBLEBORDER )
|
|
|
|
n = ITEM_OFFSET_DOUBLE;
|
|
|
|
else
|
|
|
|
n = ITEM_OFFSET;
|
|
|
|
|
|
|
|
aSize.Width() += n*nCalcCols;
|
|
|
|
aSize.Height() += n*nCalcLines;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
n = 0;
|
|
|
|
|
|
|
|
if ( mnSpacing )
|
|
|
|
{
|
|
|
|
nSpace = mnSpacing;
|
|
|
|
aSize.Width() += mnSpacing*(nCalcCols-1);
|
|
|
|
aSize.Height() += mnSpacing*(nCalcLines-1);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
nSpace = 0;
|
|
|
|
|
|
|
|
if ( nStyle & WB_NAMEFIELD )
|
|
|
|
{
|
2000-11-16 18:18:50 +00:00
|
|
|
aSize.Height() += nTxtHeight + NAME_OFFSET;
|
|
|
|
if ( !(nStyle & WB_FLATVALUESET) )
|
|
|
|
aSize.Height() += NAME_LINE_HEIGHT+NAME_LINE_OFF_Y;
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if ( nStyle & WB_NONEFIELD )
|
|
|
|
{
|
|
|
|
aSize.Height() += nTxtHeight + n + nSpace;
|
|
|
|
if ( nStyle & WB_RADIOSEL )
|
|
|
|
aSize.Height() += 8;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Evt. ScrollBar-Breite aufaddieren
|
|
|
|
aSize.Width() += GetScrollWidth();
|
|
|
|
|
|
|
|
return aSize;
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
2010-11-05 10:31:15 +08:00
|
|
|
Size ValueSet::CalcItemSizePixel( const Size& rItemSize, sal_Bool bOut ) const
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
Size aSize = rItemSize;
|
|
|
|
|
|
|
|
WinBits nStyle = GetStyle();
|
|
|
|
if ( nStyle & WB_ITEMBORDER )
|
|
|
|
{
|
|
|
|
long n;
|
|
|
|
|
|
|
|
if ( nStyle & WB_DOUBLEBORDER )
|
|
|
|
n = ITEM_OFFSET_DOUBLE;
|
|
|
|
else
|
|
|
|
n = ITEM_OFFSET;
|
|
|
|
|
|
|
|
if ( bOut )
|
|
|
|
{
|
|
|
|
aSize.Width() += n;
|
|
|
|
aSize.Height() += n;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
aSize.Width() -= n;
|
|
|
|
aSize.Height() -= n;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return aSize;
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
long ValueSet::GetScrollWidth() const
|
|
|
|
{
|
|
|
|
if ( GetStyle() & WB_VSCROLL )
|
|
|
|
{
|
|
|
|
((ValueSet*)this)->ImplInitScrollBar();
|
|
|
|
return mpScrBar->GetSizePixel().Width()+SCRBAR_OFFSET;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
2010-11-05 10:31:15 +08:00
|
|
|
sal_uInt16 ValueSet::ShowDropPos( const Point& rPos )
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
2010-11-05 10:31:15 +08:00
|
|
|
mbDropPos = sal_True;
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
// Gegebenenfalls scrollen
|
|
|
|
ImplScroll( rPos );
|
|
|
|
|
|
|
|
// DropPosition ermitteln
|
2010-11-05 10:31:15 +08:00
|
|
|
sal_uInt16 nPos = ImplGetItem( rPos, sal_True );
|
2000-09-18 16:07:07 +00:00
|
|
|
if ( nPos == VALUESET_ITEM_NONEITEM )
|
|
|
|
nPos = 0;
|
|
|
|
else if ( nPos == VALUESET_ITEM_NOTFOUND )
|
|
|
|
{
|
|
|
|
Size aOutSize = GetOutputSizePixel();
|
|
|
|
if ( GetStyle() & WB_NAMEFIELD )
|
|
|
|
aOutSize.Height() = mnTextOffset;
|
|
|
|
if ( (rPos.X() >= 0) && (rPos.X() < aOutSize.Width()) &&
|
|
|
|
(rPos.Y() >= 0) && (rPos.Y() < aOutSize.Height()) )
|
2010-11-05 10:31:15 +08:00
|
|
|
nPos = (sal_uInt16)mpImpl->mpItemList->Count();
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
// Im letzten viertel, dann wird ein Item spaeter eingefuegt
|
2007-05-22 18:33:21 +00:00
|
|
|
Rectangle aRect = mpImpl->mpItemList->GetObject( nPos )->maRect;
|
2000-09-18 16:07:07 +00:00
|
|
|
if ( rPos.X() > aRect.Left()+aRect.GetWidth()-(aRect.GetWidth()/4) )
|
|
|
|
nPos++;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( nPos != mnDropPos )
|
|
|
|
{
|
2010-11-05 10:31:15 +08:00
|
|
|
ImplDrawDropPos( sal_False );
|
2000-09-18 16:07:07 +00:00
|
|
|
mnDropPos = nPos;
|
2010-11-05 10:31:15 +08:00
|
|
|
ImplDrawDropPos( sal_True );
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return mnDropPos;
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
void ValueSet::HideDropPos()
|
|
|
|
{
|
|
|
|
if ( mbDropPos )
|
|
|
|
{
|
2010-11-05 10:31:15 +08:00
|
|
|
ImplDrawDropPos( sal_False );
|
|
|
|
mbDropPos = sal_False;
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
}
|
2003-03-27 13:40:07 +00:00
|
|
|
|
2007-05-22 18:33:21 +00:00
|
|
|
// -----------------------------------------------------------------------
|
2003-03-27 13:40:07 +00:00
|
|
|
|
|
|
|
bool ValueSet::IsRTLActive (void)
|
|
|
|
{
|
2007-05-22 18:33:21 +00:00
|
|
|
return Application::GetSettings().GetLayoutRTL() && IsRTLEnabled();
|
2003-03-27 13:40:07 +00:00
|
|
|
}
|
2007-05-22 18:33:21 +00:00
|
|
|
|
2010-03-11 18:18:08 +01:00
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
void ValueSet::SetHighlightHdl( const Link& rLink )
|
|
|
|
{
|
|
|
|
mpImpl->maHighlightHdl = rLink;
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
const Link& ValueSet::GetHighlightHdl() const
|
|
|
|
{
|
|
|
|
return mpImpl->maHighlightHdl;
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|