diff options
Diffstat (limited to 'extensions/source/propctrlr/standardcontrol.cxx')
-rw-r--r-- | extensions/source/propctrlr/standardcontrol.cxx | 1440 |
1 files changed, 1440 insertions, 0 deletions
diff --git a/extensions/source/propctrlr/standardcontrol.cxx b/extensions/source/propctrlr/standardcontrol.cxx new file mode 100644 index 000000000000..c8217a734fae --- /dev/null +++ b/extensions/source/propctrlr/standardcontrol.cxx @@ -0,0 +1,1440 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_extensions.hxx" +#include "standardcontrol.hxx" +#include "pcrcommon.hxx" + +/** === begin UNO includes === **/ +#include <com/sun/star/util/DateTime.hpp> +#include <com/sun/star/util/Date.hpp> +#include <com/sun/star/util/Time.hpp> +#include <com/sun/star/util/Color.hpp> +#include <com/sun/star/util/MeasureUnit.hpp> +#include <com/sun/star/inspection/PropertyControlType.hpp> +/** === end UNO includes === **/ +#include <rtl/math.hxx> +#include <sfx2/objsh.hxx> + +//================================================================== +// ugly dependencies for the OColorControl +#include <svx/svxids.hrc> +#include <svx/drawitem.hxx> +#include <svx/xtable.hxx> +//================================================================== +#include <vcl/floatwin.hxx> +#include <svtools/svmedit.hxx> +#include <svtools/colorcfg.hxx> +#include <unotools/syslocale.hxx> +#include <unotools/datetime.hxx> +#include <i18npool/mslangid.hxx> +#include <vcl/button.hxx> +#include <vcl/svapp.hxx> +//================================================================== + +#include <memory> +#include <limits> +#include <boost/bind.hpp> + +//............................................................................ +namespace pcr +{ +//............................................................................ + + using namespace ::com::sun::star; + using namespace ::com::sun::star::uno; + using namespace ::com::sun::star::awt; + using namespace ::com::sun::star::lang; + using namespace ::com::sun::star::util; + using namespace ::com::sun::star::beans; + using namespace ::com::sun::star::inspection; + + //================================================================== + //= OTimeControl + //================================================================== + //------------------------------------------------------------------ + OTimeControl::OTimeControl( Window* pParent, WinBits nWinStyle ) + :OTimeControl_Base( PropertyControlType::TimeField, pParent, nWinStyle ) + { + getTypedControlWindow()->SetStrictFormat( sal_True ); + getTypedControlWindow()->SetFormat( TIMEF_SEC ); + getTypedControlWindow()->EnableEmptyFieldValue( sal_True ); + } + + //------------------------------------------------------------------ + void SAL_CALL OTimeControl::setValue( const Any& _rValue ) throw (IllegalTypeException, RuntimeException) + { + util::Time aUNOTime; + if ( !( _rValue >>= aUNOTime ) ) + { + getTypedControlWindow()->SetText( String() ); + getTypedControlWindow()->SetEmptyTime(); + } + else + { + ::Time aTime( aUNOTime.Hours, aUNOTime.Minutes, aUNOTime.Seconds, aUNOTime.HundredthSeconds ); + getTypedControlWindow()->SetTime( aTime ); + } + } + + //------------------------------------------------------------------ + Any SAL_CALL OTimeControl::getValue() throw (RuntimeException) + { + Any aPropValue; + if ( getTypedControlWindow()->GetText().Len()>0 ) + { + ::Time aTime( getTypedControlWindow()->GetTime() ); + util::Time aUNOTime( aTime.Get100Sec(), aTime.GetSec(), aTime.GetMin(), aTime.GetHour() ); + aPropValue <<= aUNOTime; + } + return aPropValue; + } + + //------------------------------------------------------------------ + Type SAL_CALL OTimeControl::getValueType() throw (RuntimeException) + { + return ::getCppuType( static_cast< util::Time* >( NULL ) ); + } + + //================================================================== + //= ODateControl + //================================================================== + //------------------------------------------------------------------ + ODateControl::ODateControl( Window* pParent, WinBits nWinStyle ) + :ODateControl_Base( PropertyControlType::DateField, pParent, nWinStyle | WB_DROPDOWN ) + { + WindowType* pControlWindow = getTypedControlWindow(); + pControlWindow->SetStrictFormat(sal_True); + + pControlWindow->SetMin( ::Date( 1,1,1600 ) ); + pControlWindow->SetFirst( ::Date( 1,1,1600 ) ); + pControlWindow->SetLast( ::Date( 1, 1, 9999 ) ); + pControlWindow->SetMax( ::Date( 1, 1, 9999 ) ); + + pControlWindow->SetExtDateFormat( XTDATEF_SYSTEM_SHORT_YYYY ); + pControlWindow->EnableEmptyFieldValue( sal_True ); + } + + //------------------------------------------------------------------ + void SAL_CALL ODateControl::setValue( const Any& _rValue ) throw (IllegalTypeException, RuntimeException) + { + util::Date aUNODate; + if ( !( _rValue >>= aUNODate ) ) + { + getTypedControlWindow()->SetText( String() ); + getTypedControlWindow()->SetEmptyDate(); + } + else + { + ::Date aDate( aUNODate.Day, aUNODate.Month, aUNODate.Year ); + getTypedControlWindow()->SetDate( aDate ); + } + } + + //------------------------------------------------------------------ + Any SAL_CALL ODateControl::getValue() throw (RuntimeException) + { + Any aPropValue; + if ( getTypedControlWindow()->GetText().Len() > 0 ) + { + ::Date aDate( getTypedControlWindow()->GetDate() ); + util::Date aUNODate( aDate.GetDay(), aDate.GetMonth(), aDate.GetYear() ); + aPropValue <<= aUNODate; + } + return aPropValue; + } + + //------------------------------------------------------------------ + Type SAL_CALL ODateControl::getValueType() throw (RuntimeException) + { + return ::getCppuType( static_cast< util::Date* >( NULL ) ); + } + + //================================================================== + //= OEditControl + //================================================================== + //------------------------------------------------------------------ + OEditControl::OEditControl(Window* _pParent, sal_Bool _bPW, WinBits _nWinStyle) + :OEditControl_Base( _bPW ? PropertyControlType::CharacterField : PropertyControlType::TextField, _pParent, _nWinStyle ) + { + m_bIsPassword = _bPW; + + if ( m_bIsPassword ) + getTypedControlWindow()->SetMaxTextLen( 1 ); + } + + //------------------------------------------------------------------ + void SAL_CALL OEditControl::setValue( const Any& _rValue ) throw (IllegalTypeException, RuntimeException) + { + ::rtl::OUString sText; + if ( m_bIsPassword ) + { + sal_Int16 nValue = 0; + _rValue >>= nValue; + if ( nValue ) + { + sal_Unicode nCharacter = nValue; + sText = String( &nCharacter, 1 ); + } + } + else + _rValue >>= sText; + + getTypedControlWindow()->SetText( sText ); + } + + //------------------------------------------------------------------ + Any SAL_CALL OEditControl::getValue() throw (RuntimeException) + { + Any aPropValue; + + ::rtl::OUString sText( getTypedControlWindow()->GetText() ); + if ( m_bIsPassword ) + { + if ( sText.getLength() ) + aPropValue <<= (sal_Int16)sText.getStr()[0]; + } + else + aPropValue <<= sText; + + return aPropValue; + } + + //------------------------------------------------------------------ + Type SAL_CALL OEditControl::getValueType() throw (RuntimeException) + { + return m_bIsPassword ? ::getCppuType( static_cast< sal_Int16* >( NULL ) ) : ::getCppuType( static_cast< ::rtl::OUString* >( NULL ) ); + } + + //------------------------------------------------------------------ + void OEditControl::modified() + { + OEditControl_Base::modified(); + + // for pasword controls, we fire a commit for every single change + if ( m_bIsPassword ) + m_aImplControl.notifyModifiedValue(); + } + + //------------------------------------------------------------------ + static long ImplCalcLongValue( double nValue, sal_uInt16 nDigits ) + { + double n = nValue; + for ( sal_uInt16 d = 0; d < nDigits; ++d ) + n *= 10; + + if ( n > ::std::numeric_limits< long >::max() ) + return ::std::numeric_limits< long >::max(); + return (long)n; + } + + //------------------------------------------------------------------ + static double ImplCalcDoubleValue( long nValue, sal_uInt16 nDigits ) + { + double n = nValue; + for ( sal_uInt16 d = 0; d < nDigits; ++d ) + n /= 10; + return n; + } + + //================================================================== + // class ODateTimeControl + //================================================================== + //------------------------------------------------------------------ + ODateTimeControl::ODateTimeControl( Window* _pParent, WinBits _nWinStyle) + :ODateTimeControl_Base( PropertyControlType::DateTimeField, _pParent, _nWinStyle ) + { + getTypedControlWindow()->EnableEmptyField( sal_True ); + + // determine a default format + Locale aSysLocale = SvtSysLocale().GetLocaleData().getLocale(); + LanguageType eSysLanguage = MsLangId::convertLocaleToLanguage( aSysLocale ); + + getTypedControlWindow()->SetFormatter( getTypedControlWindow()->StandardFormatter() ); + SvNumberFormatter* pFormatter = getTypedControlWindow()->GetFormatter(); + sal_uLong nStandardDateTimeFormat = pFormatter->GetStandardFormat( NUMBERFORMAT_DATETIME, eSysLanguage ); + + getTypedControlWindow()->SetFormatKey( nStandardDateTimeFormat ); + } + + //------------------------------------------------------------------ + void SAL_CALL ODateTimeControl::setValue( const Any& _rValue ) throw (IllegalTypeException, RuntimeException) + { + if ( !_rValue.hasValue() ) + { + getTypedControlWindow()->SetText( String() ); + } + else + { + util::DateTime aUNODateTime; + OSL_VERIFY( _rValue >>= aUNODateTime ); + + ::DateTime aDateTime; + ::utl::typeConvert( aUNODateTime, aDateTime ); + + double nValue = aDateTime - ::DateTime( *getTypedControlWindow()->GetFormatter()->GetNullDate() ); + getTypedControlWindow()->SetValue( nValue ); + } + } + + //------------------------------------------------------------------ + Any SAL_CALL ODateTimeControl::getValue() throw (RuntimeException) + { + Any aPropValue; + if ( getTypedControlWindow()->GetText().Len() ) + { + double nValue = getTypedControlWindow()->GetValue(); + + ::DateTime aDateTime( *getTypedControlWindow()->GetFormatter()->GetNullDate() ); + + // add the "days" part + double nDays = floor( nValue ); + aDateTime += nDays; + + // add the "time" part + double nTime = nValue - nDays; + nTime = ::rtl::math::round( nTime * 86400.0 ) / 86400.0; + // we're not interested in 100th seconds, and this here prevents rounding errors + aDateTime += nTime; + + util::DateTime aUNODateTime; + ::utl::typeConvert( aDateTime, aUNODateTime ); + + aPropValue <<= aUNODateTime; + } + return aPropValue; + } + + //------------------------------------------------------------------ + Type SAL_CALL ODateTimeControl::getValueType() throw (RuntimeException) + { + return ::getCppuType( static_cast< util::DateTime* >( NULL ) ); + } + + //======================================================================== + //= HyperlinkInput + //======================================================================== + //-------------------------------------------------------------------- + HyperlinkInput::HyperlinkInput( Window* _pParent, WinBits _nWinStyle ) + :Edit( _pParent, _nWinStyle ) + { + ::svtools::ColorConfig aColorConfig; + ::svtools::ColorConfigValue aLinkColor( aColorConfig.GetColorValue( ::svtools::LINKS ) ); + + AllSettings aAllSettings( GetSettings() ); + StyleSettings aStyleSettings( aAllSettings.GetStyleSettings() ); + + Font aFieldFont( aStyleSettings.GetFieldFont() ); + aFieldFont.SetUnderline( UNDERLINE_SINGLE ); + aFieldFont.SetColor( aLinkColor.nColor ); + aStyleSettings.SetFieldFont( aFieldFont ); + + aStyleSettings.SetFieldTextColor( aLinkColor.nColor ); + + aAllSettings.SetStyleSettings( aStyleSettings ); + SetSettings( aAllSettings ); + } + + //-------------------------------------------------------------------- + void HyperlinkInput::MouseMove( const ::MouseEvent& rMEvt ) + { + Edit::MouseMove( rMEvt ); + + PointerStyle ePointerStyle( POINTER_TEXT ); + + if ( !rMEvt.IsLeaveWindow() ) + { + if ( impl_textHitTest( rMEvt.GetPosPixel() ) ) + ePointerStyle = POINTER_REFHAND; + } + + SetPointer( Pointer( ePointerStyle ) ); + } + + //-------------------------------------------------------------------- + void HyperlinkInput::MouseButtonDown( const ::MouseEvent& rMEvt ) + { + Edit::MouseButtonDown( rMEvt ); + + if ( impl_textHitTest( rMEvt.GetPosPixel() ) ) + m_aMouseButtonDownPos = rMEvt.GetPosPixel(); + else + m_aMouseButtonDownPos.X() = m_aMouseButtonDownPos.Y() = -1; + } + + //-------------------------------------------------------------------- + void HyperlinkInput::MouseButtonUp( const ::MouseEvent& rMEvt ) + { + Edit::MouseButtonUp( rMEvt ); + + impl_checkEndClick( rMEvt ); + } + + //-------------------------------------------------------------------- + bool HyperlinkInput::impl_textHitTest( const ::Point& _rWindowPos ) + { + xub_StrLen nPos = GetCharPos( _rWindowPos ); + return ( ( nPos != STRING_LEN ) && ( nPos < GetText().Len() ) ); + } + + //-------------------------------------------------------------------- + void HyperlinkInput::impl_checkEndClick( const ::MouseEvent rMEvt ) + { + const MouseSettings& rMouseSettings( GetSettings().GetMouseSettings() ); + if ( ( abs( rMEvt.GetPosPixel().X() - m_aMouseButtonDownPos.X() ) < rMouseSettings.GetStartDragWidth() ) + && ( abs( rMEvt.GetPosPixel().Y() - m_aMouseButtonDownPos.Y() ) < rMouseSettings.GetStartDragHeight() ) + ) + Application::PostUserEvent( m_aClickHandler ); + } + + //-------------------------------------------------------------------- + void HyperlinkInput::Tracking( const TrackingEvent& rTEvt ) + { + Edit::Tracking( rTEvt ); + + if ( rTEvt.IsTrackingEnded() ) + impl_checkEndClick( rTEvt.GetMouseEvent() ); + } + + //======================================================================== + //= OHyperlinkControl + //======================================================================== + //-------------------------------------------------------------------- + OHyperlinkControl::OHyperlinkControl( Window* _pParent, WinBits _nWinStyle ) + :OHyperlinkControl_Base( PropertyControlType::HyperlinkField, _pParent, _nWinStyle ) + ,m_aActionListeners( m_aMutex ) + { + getTypedControlWindow()->SetClickHdl( LINK( this, OHyperlinkControl, OnHyperlinkClicked ) ); + } + + //-------------------------------------------------------------------- + Any SAL_CALL OHyperlinkControl::getValue() throw (RuntimeException) + { + ::rtl::OUString sText = getTypedControlWindow()->GetText(); + return makeAny( sText ); + } + + //-------------------------------------------------------------------- + void SAL_CALL OHyperlinkControl::setValue( const Any& _value ) throw (IllegalTypeException, RuntimeException) + { + ::rtl::OUString sText; + _value >>= sText; + getTypedControlWindow()->SetText( sText ); + } + + //-------------------------------------------------------------------- + Type SAL_CALL OHyperlinkControl::getValueType() throw (RuntimeException) + { + return ::getCppuType( static_cast< ::rtl::OUString* >( NULL ) ); + } + + //-------------------------------------------------------------------- + void SAL_CALL OHyperlinkControl::addActionListener( const Reference< XActionListener >& listener ) throw (RuntimeException) + { + if ( listener.is() ) + m_aActionListeners.addInterface( listener ); + } + + //-------------------------------------------------------------------- + void SAL_CALL OHyperlinkControl::removeActionListener( const Reference< XActionListener >& listener ) throw (RuntimeException) + { + m_aActionListeners.removeInterface( listener ); + } + + //------------------------------------------------------------------ + void SAL_CALL OHyperlinkControl::disposing() + { + OHyperlinkControl_Base::disposing(); + + EventObject aEvent( *this ); + m_aActionListeners.disposeAndClear( aEvent ); + } + + //------------------------------------------------------------------ + IMPL_LINK( OHyperlinkControl, OnHyperlinkClicked, void*, /*_NotInterestedIn*/ ) + { + ActionEvent aEvent( *this, ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "clicked" ) ) ); + m_aActionListeners.forEach< XActionListener >( + boost::bind( + &XActionListener::actionPerformed, + _1, boost::cref(aEvent) ) ); + + return 0; + } + + //================================================================== + //= ONumericControl + //================================================================== + //------------------------------------------------------------------ + ONumericControl::ONumericControl( Window* _pParent, WinBits _nWinStyle ) + :ONumericControl_Base( PropertyControlType::NumericField, _pParent, _nWinStyle ) + ,m_eValueUnit( FUNIT_NONE ) + ,m_nFieldToUNOValueFactor( 1 ) + { + getTypedControlWindow()->SetDefaultUnit( FUNIT_NONE ); + + getTypedControlWindow()->EnableEmptyFieldValue( sal_True ); + getTypedControlWindow()->SetStrictFormat( sal_True ); + Optional< double > value( getMaxValue() ); + value.Value = -value.Value; + setMinValue( value ); + } + + //-------------------------------------------------------------------- + ::sal_Int16 SAL_CALL ONumericControl::getDecimalDigits() throw (RuntimeException) + { + return getTypedControlWindow()->GetDecimalDigits(); + } + + //-------------------------------------------------------------------- + void SAL_CALL ONumericControl::setDecimalDigits( ::sal_Int16 _decimaldigits ) throw (RuntimeException) + { + getTypedControlWindow()->SetDecimalDigits( _decimaldigits ); + } + + //-------------------------------------------------------------------- + Optional< double > SAL_CALL ONumericControl::getMinValue() throw (RuntimeException) + { + Optional< double > aReturn( sal_True, 0 ); + + sal_Int64 minValue = getTypedControlWindow()->GetMin(); + if ( minValue == ::std::numeric_limits< sal_Int64 >::min() ) + aReturn.IsPresent = sal_False; + else + aReturn.Value = (double)minValue; + + return aReturn; + } + + //-------------------------------------------------------------------- + void SAL_CALL ONumericControl::setMinValue( const Optional< double >& _minvalue ) throw (RuntimeException) + { + if ( !_minvalue.IsPresent ) + getTypedControlWindow()->SetMin( ::std::numeric_limits< sal_Int64 >::min() ); + else + getTypedControlWindow()->SetMin( impl_apiValueToFieldValue_nothrow( _minvalue.Value ) , m_eValueUnit); + } + + //-------------------------------------------------------------------- + Optional< double > SAL_CALL ONumericControl::getMaxValue() throw (RuntimeException) + { + Optional< double > aReturn( sal_True, 0 ); + + sal_Int64 maxValue = getTypedControlWindow()->GetMax(); + if ( maxValue == ::std::numeric_limits< sal_Int64 >::max() ) + aReturn.IsPresent = sal_False; + else + aReturn.Value = (double)maxValue; + + return aReturn; + } + + //-------------------------------------------------------------------- + void SAL_CALL ONumericControl::setMaxValue( const Optional< double >& _maxvalue ) throw (RuntimeException) + { + if ( !_maxvalue.IsPresent ) + getTypedControlWindow()->SetMax( ::std::numeric_limits< sal_Int64 >::max() ); + else + getTypedControlWindow()->SetMax( impl_apiValueToFieldValue_nothrow( _maxvalue.Value ), m_eValueUnit ); + } + + //-------------------------------------------------------------------- + ::sal_Int16 SAL_CALL ONumericControl::getDisplayUnit() throw (RuntimeException) + { + return VCLUnoHelper::ConvertToMeasurementUnit( getTypedControlWindow()->GetUnit(), 1 ); + } + + //-------------------------------------------------------------------- + void SAL_CALL ONumericControl::setDisplayUnit( ::sal_Int16 _displayunit ) throw (IllegalArgumentException, RuntimeException) + { + if ( ( _displayunit < MeasureUnit::MM_100TH ) || ( _displayunit > MeasureUnit::PERCENT ) ) + throw IllegalArgumentException(); + if ( ( _displayunit == MeasureUnit::MM_100TH ) + || ( _displayunit == MeasureUnit::MM_10TH ) + || ( _displayunit == MeasureUnit::INCH_1000TH ) + || ( _displayunit == MeasureUnit::INCH_100TH ) + || ( _displayunit == MeasureUnit::INCH_10TH ) + || ( _displayunit == MeasureUnit::PERCENT ) + ) + throw IllegalArgumentException(); + + sal_Int16 nDummyFactor = 1; + FieldUnit eFieldUnit = VCLUnoHelper::ConvertToFieldUnit( _displayunit, nDummyFactor ); + if ( nDummyFactor != 1 ) + // everything which survived the checks above should result in a factor of 1, i.e., + // it should have a direct counterpart as FieldUnit + throw RuntimeException(); + getTypedControlWindow()->MetricFormatter::SetUnit( eFieldUnit ); + } + + //-------------------------------------------------------------------- + ::sal_Int16 SAL_CALL ONumericControl::getValueUnit() throw (RuntimeException) + { + return VCLUnoHelper::ConvertToMeasurementUnit( m_eValueUnit, m_nFieldToUNOValueFactor ); + } + + //-------------------------------------------------------------------- + void SAL_CALL ONumericControl::setValueUnit( ::sal_Int16 _valueunit ) throw (RuntimeException) + { + if ( ( _valueunit < MeasureUnit::MM_100TH ) || ( _valueunit > MeasureUnit::PERCENT ) ) + throw IllegalArgumentException(); + m_eValueUnit = VCLUnoHelper::ConvertToFieldUnit( _valueunit, m_nFieldToUNOValueFactor ); + } + + //-------------------------------------------------------------------- + void SAL_CALL ONumericControl::setValue( const Any& _rValue ) throw (IllegalTypeException, RuntimeException) + { + if ( !_rValue.hasValue() ) + { + getTypedControlWindow()->SetText( String() ); + getTypedControlWindow()->SetEmptyFieldValue(); + } + else + { + double nValue( 0 ); + OSL_VERIFY( _rValue >>= nValue ); + long nControlValue = impl_apiValueToFieldValue_nothrow( nValue ); + getTypedControlWindow()->SetValue( nControlValue, m_eValueUnit ); + } + } + + //------------------------------------------------------------------ + long ONumericControl::impl_apiValueToFieldValue_nothrow( double _nApiValue ) const + { + long nControlValue = ImplCalcLongValue( _nApiValue, getTypedControlWindow()->GetDecimalDigits() ); + nControlValue /= m_nFieldToUNOValueFactor; + return nControlValue; + } + + //------------------------------------------------------------------ + double ONumericControl::impl_fieldValueToApiValue_nothrow( sal_Int64 _nFieldValue ) const + { + double nApiValue = ImplCalcDoubleValue( (long)_nFieldValue, getTypedControlWindow()->GetDecimalDigits() ); + nApiValue *= m_nFieldToUNOValueFactor; + return nApiValue; + } + + //------------------------------------------------------------------ + Any SAL_CALL ONumericControl::getValue() throw (RuntimeException) + { + Any aPropValue; + if ( getTypedControlWindow()->GetText().Len() ) + { + double nValue = impl_fieldValueToApiValue_nothrow( getTypedControlWindow()->GetValue( m_eValueUnit ) ); + aPropValue <<= nValue; + } + return aPropValue; + } + + //------------------------------------------------------------------ + Type SAL_CALL ONumericControl::getValueType() throw (RuntimeException) + { + return ::getCppuType( static_cast< double* >( NULL ) ); + } + + //================================================================== + //= OColorControl + //================================================================== + #define LB_DEFAULT_COUNT 20 + //------------------------------------------------------------------ + String MakeHexStr(sal_uInt32 nVal, sal_uInt32 nLength) + { + String aStr; + while (nVal>0) + { + char c=char(nVal & 0x000F); + nVal>>=4; + if (c<=9) c+='0'; + else c+='A'-10; + aStr.Insert(c,0); + } + while (aStr.Len() < nLength) aStr.Insert('0',0); + return aStr; + } + + //------------------------------------------------------------------ + OColorControl::OColorControl(Window* pParent, WinBits nWinStyle) + :OColorControl_Base( PropertyControlType::ColorListBox, pParent, nWinStyle ) + { + // initialize the color listbox + XColorTable* pColorTable = NULL; + SfxObjectShell* pDocSh = SfxObjectShell::Current(); + const SfxPoolItem* pItem = pDocSh ? pDocSh->GetItem( SID_COLOR_TABLE ) : NULL; + if ( pItem ) + { + DBG_ASSERT(pItem->ISA(SvxColorTableItem), "OColorControl::OColorControl: invalid color item!"); + pColorTable = ( (SvxColorTableItem*)pItem )->GetColorTable(); + } + + if ( !pColorTable ) + { + pColorTable = XColorTable::GetStdColorTable(); + } + + + DBG_ASSERT(pColorTable, "OColorControl::OColorControl: no color table!"); + + if (pColorTable) + { + for (sal_uInt16 i = 0; i < pColorTable->Count(); ++i) + { + XColorEntry* pEntry = pColorTable->GetColor( i ); + getTypedControlWindow()->InsertEntry( pEntry->GetColor(), pEntry->GetName() ); + } + } + + getTypedControlWindow()->SetDropDownLineCount( LB_DEFAULT_COUNT ); + if ( ( nWinStyle & WB_READONLY ) != 0 ) + { + getTypedControlWindow()->SetReadOnly( sal_True ); + getTypedControlWindow()->Enable( sal_True ); + } + } + + //------------------------------------------------------------------ + void SAL_CALL OColorControl::setValue( const Any& _rValue ) throw (IllegalTypeException, RuntimeException) + { + if ( _rValue.hasValue() ) + { + ::com::sun::star::util::Color nColor = COL_TRANSPARENT; + if ( _rValue >>= nColor ) + { + ::Color aRgbCol((ColorData)nColor); + + getTypedControlWindow()->SelectEntry( aRgbCol ); + if ( !getTypedControlWindow()->IsEntrySelected( aRgbCol ) ) + { // the given color is not part of the list -> insert a new entry with the hex code of the color + String aStr = String::CreateFromAscii("0x"); + aStr += MakeHexStr(nColor,8); + getTypedControlWindow()->InsertEntry( aRgbCol, aStr ); + getTypedControlWindow()->SelectEntry( aRgbCol ); + } + } + else + { + ::rtl::OUString sNonColorValue; + if ( !( _rValue >>= sNonColorValue ) ) + throw IllegalTypeException(); + getTypedControlWindow()->SelectEntry( sNonColorValue ); + if ( !getTypedControlWindow()->IsEntrySelected( sNonColorValue ) ) + getTypedControlWindow()->SetNoSelection(); + } + } + else + getTypedControlWindow()->SetNoSelection(); + } + + //------------------------------------------------------------------ + Any SAL_CALL OColorControl::getValue() throw (RuntimeException) + { + Any aPropValue; + if ( getTypedControlWindow()->GetSelectEntryCount() > 0 ) + { + ::rtl::OUString sSelectedEntry = getTypedControlWindow()->GetSelectEntry(); + if ( m_aNonColorEntries.find( sSelectedEntry ) != m_aNonColorEntries.end() ) + aPropValue <<= sSelectedEntry; + else + { + ::Color aRgbCol = getTypedControlWindow()->GetSelectEntryColor(); + aPropValue <<= (::com::sun::star::util::Color)aRgbCol.GetColor(); + } + } + return aPropValue; + } + + //------------------------------------------------------------------ + Type SAL_CALL OColorControl::getValueType() throw (RuntimeException) + { + return ::getCppuType( static_cast< sal_Int32* >( NULL ) ); + } + + //------------------------------------------------------------------ + void SAL_CALL OColorControl::clearList() throw (RuntimeException) + { + getTypedControlWindow()->Clear(); + } + + //------------------------------------------------------------------ + void SAL_CALL OColorControl::prependListEntry( const ::rtl::OUString& NewEntry ) throw (RuntimeException) + { + getTypedControlWindow()->InsertEntry( NewEntry, 0 ); + m_aNonColorEntries.insert( NewEntry ); + } + + //------------------------------------------------------------------ + void SAL_CALL OColorControl::appendListEntry( const ::rtl::OUString& NewEntry ) throw (RuntimeException) + { + getTypedControlWindow()->InsertEntry( NewEntry ); + m_aNonColorEntries.insert( NewEntry ); + } + //------------------------------------------------------------------ + Sequence< ::rtl::OUString > SAL_CALL OColorControl::getListEntries( ) throw (RuntimeException) + { + if ( !m_aNonColorEntries.empty() ) + return Sequence< ::rtl::OUString >(&(*m_aNonColorEntries.begin()),m_aNonColorEntries.size()); + return Sequence< ::rtl::OUString >(); + } + + //------------------------------------------------------------------ + void OColorControl::modified() + { + OColorControl_Base::modified(); + + if ( !getTypedControlWindow()->IsTravelSelect() ) + // fire a commit + m_aImplControl.notifyModifiedValue(); + } + + //================================================================== + //= OListboxControl + //================================================================== + //------------------------------------------------------------------ + OListboxControl::OListboxControl( Window* pParent, WinBits nWinStyle) + :OListboxControl_Base( PropertyControlType::ListBox, pParent, nWinStyle ) + { + getTypedControlWindow()->SetDropDownLineCount( LB_DEFAULT_COUNT ); + if ( ( nWinStyle & WB_READONLY ) != 0 ) + { + getTypedControlWindow()->SetReadOnly( sal_True ); + getTypedControlWindow()->Enable( sal_True ); + } + } + + //------------------------------------------------------------------ + Any SAL_CALL OListboxControl::getValue() throw (RuntimeException) + { + ::rtl::OUString sControlValue( getTypedControlWindow()->GetSelectEntry() ); + + Any aPropValue; + if ( sControlValue.getLength() ) + aPropValue <<= sControlValue; + return aPropValue; + } + + //------------------------------------------------------------------ + Type SAL_CALL OListboxControl::getValueType() throw (RuntimeException) + { + return ::getCppuType( static_cast< ::rtl::OUString* >( NULL ) ); + } + + //------------------------------------------------------------------ + void SAL_CALL OListboxControl::setValue( const Any& _rValue ) throw (IllegalTypeException, RuntimeException) + { + if ( !_rValue.hasValue() ) + getTypedControlWindow()->SetNoSelection(); + else + { + ::rtl::OUString sSelection; + _rValue >>= sSelection; + + if ( !sSelection.equals( getTypedControlWindow()->GetSelectEntry() ) ) + getTypedControlWindow()->SelectEntry( sSelection ); + + if ( !getTypedControlWindow()->IsEntrySelected( sSelection ) ) + { + getTypedControlWindow()->InsertEntry( sSelection, 0 ); + getTypedControlWindow()->SelectEntry( sSelection ); + } + } + } + + //------------------------------------------------------------------ + void SAL_CALL OListboxControl::clearList() throw (RuntimeException) + { + getTypedControlWindow()->Clear(); + } + + //------------------------------------------------------------------ + void SAL_CALL OListboxControl::prependListEntry( const ::rtl::OUString& NewEntry ) throw (RuntimeException) + { + getTypedControlWindow()->InsertEntry( NewEntry, 0 ); + } + + //------------------------------------------------------------------ + void SAL_CALL OListboxControl::appendListEntry( const ::rtl::OUString& NewEntry ) throw (RuntimeException) + { + getTypedControlWindow()->InsertEntry( NewEntry ); + } + //------------------------------------------------------------------ + Sequence< ::rtl::OUString > SAL_CALL OListboxControl::getListEntries( ) throw (RuntimeException) + { + const sal_uInt16 nCount = getTypedControlWindow()->GetEntryCount(); + Sequence< ::rtl::OUString > aRet(nCount); + ::rtl::OUString* pIter = aRet.getArray(); + for (sal_uInt16 i = 0; i < nCount ; ++i,++pIter) + *pIter = getTypedControlWindow()->GetEntry(i); + + return aRet; + } + + //------------------------------------------------------------------ + void OListboxControl::modified() + { + OListboxControl_Base::modified(); + + if ( !getTypedControlWindow()->IsTravelSelect() ) + // fire a commit + m_aImplControl.notifyModifiedValue(); + } + + //================================================================== + //= OComboboxControl + //================================================================== + //------------------------------------------------------------------ + OComboboxControl::OComboboxControl( Window* pParent, WinBits nWinStyle) + :OComboboxControl_Base( PropertyControlType::ComboBox, pParent, nWinStyle ) + { + getTypedControlWindow()->SetDropDownLineCount( LB_DEFAULT_COUNT ); + getTypedControlWindow()->SetSelectHdl( LINK( this, OComboboxControl, OnEntrySelected ) ); + } + + //------------------------------------------------------------------ + void SAL_CALL OComboboxControl::setValue( const Any& _rValue ) throw (IllegalTypeException, RuntimeException) + { + ::rtl::OUString sText; + _rValue >>= sText; + getTypedControlWindow()->SetText( sText ); + } + + //------------------------------------------------------------------ + Any SAL_CALL OComboboxControl::getValue() throw (RuntimeException) + { + return makeAny( ::rtl::OUString( getTypedControlWindow()->GetText() ) ); + } + + //------------------------------------------------------------------ + Type SAL_CALL OComboboxControl::getValueType() throw (RuntimeException) + { + return ::getCppuType( static_cast< ::rtl::OUString* >( NULL ) ); + } + + //------------------------------------------------------------------ + void SAL_CALL OComboboxControl::clearList() throw (RuntimeException) + { + getTypedControlWindow()->Clear(); + } + + //------------------------------------------------------------------ + void SAL_CALL OComboboxControl::prependListEntry( const ::rtl::OUString& NewEntry ) throw (RuntimeException) + { + getTypedControlWindow()->InsertEntry( NewEntry, 0 ); + } + + //------------------------------------------------------------------ + void SAL_CALL OComboboxControl::appendListEntry( const ::rtl::OUString& NewEntry ) throw (RuntimeException) + { + getTypedControlWindow()->InsertEntry( NewEntry ); + } + //------------------------------------------------------------------ + Sequence< ::rtl::OUString > SAL_CALL OComboboxControl::getListEntries( ) throw (RuntimeException) + { + const sal_uInt16 nCount = getTypedControlWindow()->GetEntryCount(); + Sequence< ::rtl::OUString > aRet(nCount); + ::rtl::OUString* pIter = aRet.getArray(); + for (sal_uInt16 i = 0; i < nCount ; ++i,++pIter) + *pIter = getTypedControlWindow()->GetEntry(i); + + return aRet; + } + + //------------------------------------------------------------------ + IMPL_LINK( OComboboxControl, OnEntrySelected, void*, /*_pNothing*/ ) + { + if ( !getTypedControlWindow()->IsTravelSelect() ) + // fire a commit + m_aImplControl.notifyModifiedValue(); + return 0L; + } + + //================================================================== + //= OMultilineFloatingEdit + //================================================================== + class OMultilineFloatingEdit : public FloatingWindow + { + private: + MultiLineEdit m_aImplEdit; + + protected: + virtual void Resize(); + + public: + OMultilineFloatingEdit(Window* _pParen); + MultiLineEdit* getEdit() { return &m_aImplEdit; } + + protected: + virtual long PreNotify(NotifyEvent& _rNEvt); + }; + + //------------------------------------------------------------------ + OMultilineFloatingEdit::OMultilineFloatingEdit(Window* _pParent) + :FloatingWindow(_pParent, WB_BORDER) + ,m_aImplEdit(this, WB_VSCROLL|WB_IGNORETAB|WB_NOBORDER) + { + m_aImplEdit.Show(); + } + + //------------------------------------------------------------------ + void OMultilineFloatingEdit::Resize() + { + m_aImplEdit.SetSizePixel(GetOutputSizePixel()); + } + + //------------------------------------------------------------------ + long OMultilineFloatingEdit::PreNotify(NotifyEvent& _rNEvt) + { + long nResult = sal_True; + + sal_uInt16 nSwitch = _rNEvt.GetType(); + if (EVENT_KEYINPUT == nSwitch) + { + const KeyCode& aKeyCode = _rNEvt.GetKeyEvent()->GetKeyCode(); + sal_uInt16 nKey = aKeyCode.GetCode(); + + if ( ( (KEY_RETURN == nKey) + && !aKeyCode.IsShift() + ) + || ( (KEY_UP == nKey) + && aKeyCode.IsMod2() + ) + ) + { + EndPopupMode(); + } + else + nResult=FloatingWindow::PreNotify(_rNEvt); + } + else + nResult=FloatingWindow::PreNotify(_rNEvt); + + return nResult; + } + + //================================================================== + //= DropDownEditControl_Base + //================================================================== + //------------------------------------------------------------------ + DropDownEditControl::DropDownEditControl( Window* _pParent, WinBits _nStyle ) + :DropDownEditControl_Base( _pParent, _nStyle ) + ,m_pFloatingEdit( NULL ) + ,m_pImplEdit( NULL ) + ,m_pDropdownButton( NULL ) + ,m_nOperationMode( eStringList ) + ,m_bDropdown( sal_False ) + { + SetCompoundControl( sal_True ); + + m_pImplEdit = new MultiLineEdit( this, WB_TABSTOP | WB_IGNORETAB | WB_NOBORDER | (_nStyle & WB_READONLY) ); + SetSubEdit( m_pImplEdit ); + m_pImplEdit->Show(); + + if ( _nStyle & WB_DROPDOWN ) + { + m_pDropdownButton = new PushButton( this, WB_NOLIGHTBORDER | WB_RECTSTYLE | WB_NOTABSTOP); + m_pDropdownButton->SetSymbol(SYMBOL_SPIN_DOWN); + m_pDropdownButton->SetClickHdl( LINK( this, DropDownEditControl, DropDownHdl ) ); + m_pDropdownButton->Show(); + } + + m_pFloatingEdit = new OMultilineFloatingEdit(this); //FloatingWindow + + m_pFloatingEdit->SetPopupModeEndHdl( LINK( this, DropDownEditControl, ReturnHdl ) ); + m_pFloatingEdit->getEdit()->SetReadOnly( ( _nStyle & WB_READONLY ) != 0 ); + } + + //------------------------------------------------------------------ + void DropDownEditControl::setControlHelper( ControlHelper& _rControlHelper ) + { + DropDownEditControl_Base::setControlHelper( _rControlHelper ); + m_pFloatingEdit->getEdit()->SetModifyHdl( LINK( &_rControlHelper, ControlHelper, ModifiedHdl ) ); + m_pImplEdit->SetGetFocusHdl( LINK( &_rControlHelper, ControlHelper, GetFocusHdl ) ); + m_pImplEdit->SetModifyHdl( LINK( &_rControlHelper, ControlHelper, ModifiedHdl ) ); + m_pImplEdit->SetLoseFocusHdl( LINK( &_rControlHelper, ControlHelper, LoseFocusHdl ) ); + } + + //------------------------------------------------------------------ + DropDownEditControl::~DropDownEditControl() + { + { + ::std::auto_ptr<Window> aTemp(m_pFloatingEdit); + m_pFloatingEdit = NULL; + } + { + ::std::auto_ptr<Window> aTemp(m_pImplEdit); + SetSubEdit( NULL ); + m_pImplEdit = NULL; + } + { + ::std::auto_ptr<Window> aTemp(m_pDropdownButton); + m_pDropdownButton = NULL; + } + } + + //------------------------------------------------------------------ + void DropDownEditControl::Resize() + { + ::Size aOutSz = GetOutputSizePixel(); + + if (m_pDropdownButton!=NULL) + { + long nSBWidth = GetSettings().GetStyleSettings().GetScrollBarSize(); + nSBWidth = CalcZoom( nSBWidth ); + m_pImplEdit->SetPosSizePixel( 0, 1, aOutSz.Width() - nSBWidth, aOutSz.Height()-2 ); + m_pDropdownButton->SetPosSizePixel( aOutSz.Width() - nSBWidth, 0, nSBWidth, aOutSz.Height() ); + } + else + m_pImplEdit->SetPosSizePixel( 0, 1, aOutSz.Width(), aOutSz.Height()-2 ); + } + + //------------------------------------------------------------------ + long DropDownEditControl::PreNotify( NotifyEvent& rNEvt ) + { + long nResult = 1; + + if (rNEvt.GetType() == EVENT_KEYINPUT) + { + const KeyCode& aKeyCode = rNEvt.GetKeyEvent()->GetKeyCode(); + sal_uInt16 nKey = aKeyCode.GetCode(); + + if ( nKey == KEY_RETURN && !aKeyCode.IsShift() ) + { + if ( m_pHelper ) + { + m_pHelper->LoseFocusHdl( m_pImplEdit ); + m_pHelper->activateNextControl(); + } + } + else if ( nKey == KEY_DOWN && aKeyCode.IsMod2() ) + { + Invalidate(); + ShowDropDown( sal_True ); + } + else if ( KEYGROUP_CURSOR == aKeyCode.GetGroup() + || nKey == KEY_HELP + || KEYGROUP_FKEYS == aKeyCode.GetGroup() + || m_nOperationMode == eMultiLineText + ) + { + nResult = DropDownEditControl_Base::PreNotify( rNEvt ); + } + else if ( m_nOperationMode == eStringList ) + { + Selection aSel = m_pImplEdit->GetSelection(); + if ( aSel.Min() != aSel.Max() ) + { + aSel.Min() = FindPos( aSel.Min() ); + aSel.Max() = FindPos( aSel.Max() ); + } + else + { + aSel.Min() = FindPos( aSel.Min() ); + aSel.Max() = aSel.Min(); + } + Invalidate(); + ShowDropDown( sal_True ); + m_pFloatingEdit->getEdit()->GrabFocus(); + m_pFloatingEdit->getEdit()->SetSelection( aSel ); + Window* pFocusWin = Application::GetFocusWindow(); + pFocusWin->KeyInput( *rNEvt.GetKeyEvent() ); + } + } + else + nResult = DropDownEditControl_Base::PreNotify(rNEvt); + + return nResult; + } + + //------------------------------------------------------------------ + namespace + { + //.............................................................. + StlSyntaxSequence< ::rtl::OUString > lcl_convertMultiLineToList( const String& _rCompsedTextWithLineBreaks ) + { + xub_StrLen nLines( _rCompsedTextWithLineBreaks.GetTokenCount( '\n' ) ); + StlSyntaxSequence< ::rtl::OUString > aStrings( nLines ); + StlSyntaxSequence< ::rtl::OUString >::iterator stringItem = aStrings.begin(); + for ( xub_StrLen token = 0; token < nLines; ++token, ++stringItem ) + *stringItem = _rCompsedTextWithLineBreaks.GetToken( token, '\n' ); + return aStrings; + } + + String lcl_convertListToMultiLine( const StlSyntaxSequence< ::rtl::OUString >& _rStrings ) + { + String sMultiLineText; + for ( StlSyntaxSequence< ::rtl::OUString >::const_iterator item = _rStrings.begin(); + item != _rStrings.end(); + ) + { + sMultiLineText += String( *item ); + if ( ++item != _rStrings.end() ) + sMultiLineText += '\n'; + } + return sMultiLineText; + } + + //.............................................................. + String lcl_convertListToDisplayText( const StlSyntaxSequence< ::rtl::OUString >& _rStrings ) + { + ::rtl::OUStringBuffer aComposed; + for ( StlSyntaxSequence< ::rtl::OUString >::const_iterator strings = _rStrings.begin(); + strings != _rStrings.end(); + ++strings + ) + { + if ( strings != _rStrings.begin() ) + aComposed.append( (sal_Unicode)';' ); + aComposed.append( (sal_Unicode)'\"' ); + aComposed.append( *strings ); + aComposed.append( (sal_Unicode)'\"' ); + } + return aComposed.makeStringAndClear(); + } + } + + //------------------------------------------------------------------ + #define STD_HEIGHT 100 + sal_Bool DropDownEditControl::ShowDropDown( sal_Bool bShow ) + { + if (bShow) + { + ::Point aMePos= GetPosPixel(); + aMePos = GetParent()->OutputToScreenPixel( aMePos ); + ::Size aSize=GetSizePixel(); + ::Rectangle aRect(aMePos,aSize); + aSize.Height() = STD_HEIGHT; + m_pFloatingEdit->SetOutputSizePixel(aSize); + m_pFloatingEdit->StartPopupMode( aRect, FLOATWIN_POPUPMODE_DOWN ); + + m_pFloatingEdit->Show(); + m_pFloatingEdit->getEdit()->GrabFocus(); + m_pFloatingEdit->getEdit()->SetSelection(Selection(m_pFloatingEdit->getEdit()->GetText().Len())); + m_bDropdown=sal_True; + if ( m_nOperationMode == eMultiLineText ) + m_pFloatingEdit->getEdit()->SetText( m_pImplEdit->GetText() ); + m_pImplEdit->SetText(String()); + } + else + { + m_pFloatingEdit->Hide(); + m_pFloatingEdit->Invalidate(); + m_pFloatingEdit->Update(); + + // transfer the text from the floating edit to our own edit + String sDisplayText( m_pFloatingEdit->getEdit()->GetText() ); + if ( m_nOperationMode == eStringList ) + sDisplayText = lcl_convertListToDisplayText( lcl_convertMultiLineToList( sDisplayText ) ); + + m_pImplEdit->SetText( sDisplayText ); + GetParent()->Invalidate( INVALIDATE_CHILDREN ); + m_bDropdown = sal_False; + m_pImplEdit->GrabFocus(); + } + return m_bDropdown; + + } + + //------------------------------------------------------------------ + long DropDownEditControl::FindPos(long nSinglePos) + { + long nPos=0; + long nDiff=0; + String aOutput; + String aStr=m_pFloatingEdit->getEdit()->GetText(); + String aStr1 = GetText(); + + if ((nSinglePos == 0) || (nSinglePos == aStr1.Len())) + { + return nSinglePos; + } + + if (aStr.Len()>0) + { + sal_Int32 nCount = aStr.GetTokenCount('\n'); + + String aInput = aStr.GetToken(0,'\n' ); + + if (aInput.Len()>0) + { + aOutput+='\"'; + nDiff++; + aOutput+=aInput; + aOutput+='\"'; + } + + if (nSinglePos <= aOutput.Len()) + { + nPos=nSinglePos-nDiff; + } + else + { + for (sal_Int32 i=1; i<nCount; ++i) + { + aInput=aStr.GetToken((sal_uInt16)i, '\n'); + if (aInput.Len()>0) + { + aOutput += ';'; + aOutput += '\"'; + nDiff += 2; + aOutput += aInput; + aOutput += '\"'; + + if (nSinglePos <= aOutput.Len()) + { + nPos=nSinglePos-nDiff; + break; + } + } + } + } + } + return nPos; + } + + //------------------------------------------------------------------ + IMPL_LINK( DropDownEditControl, ReturnHdl, OMultilineFloatingEdit*, /*pMEd*/) + { + + String aStr = m_pFloatingEdit->getEdit()->GetText(); + String aStr2 = GetText(); + ShowDropDown(sal_False); + + if (aStr!=aStr2 || ( m_nOperationMode == eStringList ) ) + { + if ( m_pHelper ) + m_pHelper->notifyModifiedValue(); + } + + return 0; + } + + //------------------------------------------------------------------ + IMPL_LINK( DropDownEditControl, DropDownHdl, PushButton*, /*pPb*/ ) + { + ShowDropDown(!m_bDropdown); + return 0; + } + + //------------------------------------------------------------------ + void DropDownEditControl::SetStringListValue( const StlSyntaxSequence< ::rtl::OUString >& _rStrings ) + { + SetText( lcl_convertListToDisplayText( _rStrings ) ); + m_pFloatingEdit->getEdit()->SetText( lcl_convertListToMultiLine( _rStrings ) ); + } + + //------------------------------------------------------------------ + StlSyntaxSequence< ::rtl::OUString > DropDownEditControl::GetStringListValue() const + { + return lcl_convertMultiLineToList( m_pFloatingEdit->getEdit()->GetText() ); + } + + //------------------------------------------------------------------ + void DropDownEditControl::SetTextValue( const ::rtl::OUString& _rText ) + { + OSL_PRECOND( m_nOperationMode == eMultiLineText, "DropDownEditControl::SetTextValue: illegal call!" ); + + m_pFloatingEdit->getEdit()->SetText( _rText ); + SetText( _rText ); + } + + //------------------------------------------------------------------ + ::rtl::OUString DropDownEditControl::GetTextValue() const + { + OSL_PRECOND( m_nOperationMode == eMultiLineText, "DropDownEditControl::GetTextValue: illegal call!" ); + return GetText(); + } + + //================================================================== + //= OMultilineEditControl + //================================================================== + //------------------------------------------------------------------ + OMultilineEditControl::OMultilineEditControl( Window* pParent, MultiLineOperationMode _eMode, WinBits nWinStyle ) + :OMultilineEditControl_Base( _eMode == eMultiLineText ? PropertyControlType::MultiLineTextField : PropertyControlType::StringListField + , pParent + , ( nWinStyle | WB_DIALOGCONTROL ) & ( ~WB_READONLY | ~WB_DROPDOWN ) + , false ) + { + getTypedControlWindow()->setOperationMode( _eMode ); + } + + //------------------------------------------------------------------ + void SAL_CALL OMultilineEditControl::setValue( const Any& _rValue ) throw (IllegalTypeException, RuntimeException) + { + impl_checkDisposed_throw(); + + switch ( getTypedControlWindow()->getOperationMode() ) + { + case eMultiLineText: + { + ::rtl::OUString sText; + if ( !( _rValue >>= sText ) && _rValue.hasValue() ) + throw IllegalTypeException(); + getTypedControlWindow()->SetTextValue( sText ); + } + break; + case eStringList: + { + Sequence< ::rtl::OUString > aStringLines; + if ( !( _rValue >>= aStringLines ) && _rValue.hasValue() ) + throw IllegalTypeException(); + getTypedControlWindow()->SetStringListValue( aStringLines ); + } + break; + } + } + + //------------------------------------------------------------------ + Any SAL_CALL OMultilineEditControl::getValue() throw (RuntimeException) + { + impl_checkDisposed_throw(); + + Any aValue; + switch ( getTypedControlWindow()->getOperationMode() ) + { + case eMultiLineText: + aValue <<= getTypedControlWindow()->GetTextValue(); + break; + case eStringList: + aValue <<= getTypedControlWindow()->GetStringListValue(); + break; + } + return aValue; + } + + //------------------------------------------------------------------ + Type SAL_CALL OMultilineEditControl::getValueType() throw (RuntimeException) + { + if ( getTypedControlWindow()->getOperationMode() == eMultiLineText ) + return ::getCppuType( static_cast< ::rtl::OUString* >( NULL ) ); + return ::getCppuType( static_cast< Sequence< ::rtl::OUString >* >( NULL ) ); + } + +//............................................................................ +} // namespace pcr +//............................................................................ + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |