LCOV - code coverage report
Current view: top level - extensions/source/propctrlr - standardcontrol.cxx (source / functions) Hit Total Coverage
Test: commit c8344322a7af75b84dd3ca8f78b05543a976dfd5 Lines: 1 691 0.1 %
Date: 2015-06-13 12:38:46 Functions: 2 113 1.8 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
       2             : /*
       3             :  * This file is part of the LibreOffice project.
       4             :  *
       5             :  * This Source Code Form is subject to the terms of the Mozilla Public
       6             :  * License, v. 2.0. If a copy of the MPL was not distributed with this
       7             :  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
       8             :  *
       9             :  * This file incorporates work covered by the following license notice:
      10             :  *
      11             :  *   Licensed to the Apache Software Foundation (ASF) under one or more
      12             :  *   contributor license agreements. See the NOTICE file distributed
      13             :  *   with this work for additional information regarding copyright
      14             :  *   ownership. The ASF licenses this file to you under the Apache
      15             :  *   License, Version 2.0 (the "License"); you may not use this file
      16             :  *   except in compliance with the License. You may obtain a copy of
      17             :  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
      18             :  */
      19             : 
      20             : #include "standardcontrol.hxx"
      21             : #include "pcrcommon.hxx"
      22             : 
      23             : #include <com/sun/star/util/DateTime.hpp>
      24             : #include <com/sun/star/util/Date.hpp>
      25             : #include <com/sun/star/util/Time.hpp>
      26             : #include <com/sun/star/util/Color.hpp>
      27             : #include <com/sun/star/util/MeasureUnit.hpp>
      28             : #include <com/sun/star/inspection/PropertyControlType.hpp>
      29             : #include <comphelper/string.hxx>
      30             : #include <rtl/math.hxx>
      31             : #include <sfx2/objsh.hxx>
      32             : 
      33             : 
      34             : // ugly dependencies for the OColorControl
      35             : #include <svx/svxids.hrc>
      36             : #include <svx/drawitem.hxx>
      37             : #include <svx/xtable.hxx>
      38             : 
      39             : #include <vcl/floatwin.hxx>
      40             : #include <svtools/svmedit.hxx>
      41             : #include <svtools/colorcfg.hxx>
      42             : #include <unotools/syslocale.hxx>
      43             : #include <unotools/datetime.hxx>
      44             : #include <i18nlangtag/languagetag.hxx>
      45             : #include <vcl/button.hxx>
      46             : #include <vcl/svapp.hxx>
      47             : #include <vcl/settings.hxx>
      48             : 
      49             : #include <cstdlib>
      50             : #include <limits>
      51             : #include <boost/bind.hpp>
      52             : #include <boost/scoped_ptr.hpp>
      53             : 
      54             : 
      55             : namespace pcr
      56             : {
      57             : 
      58             : 
      59             :     using namespace ::com::sun::star;
      60             :     using namespace ::com::sun::star::uno;
      61             :     using namespace ::com::sun::star::awt;
      62             :     using namespace ::com::sun::star::lang;
      63             :     using namespace ::com::sun::star::util;
      64             :     using namespace ::com::sun::star::beans;
      65             :     using namespace ::com::sun::star::inspection;
      66             : 
      67             : 
      68             :     //= OTimeControl
      69             : 
      70             : 
      71           0 :     OTimeControl::OTimeControl( vcl::Window* pParent, WinBits nWinStyle )
      72           0 :         :OTimeControl_Base( PropertyControlType::TimeField, pParent, nWinStyle )
      73             :     {
      74           0 :         getTypedControlWindow()->SetStrictFormat( true );
      75           0 :         getTypedControlWindow()->SetFormat( TimeFieldFormat::F_SEC );
      76           0 :         getTypedControlWindow()->EnableEmptyFieldValue( true );
      77           0 :     }
      78             : 
      79             : 
      80           0 :     void SAL_CALL OTimeControl::setValue( const Any& _rValue ) throw (IllegalTypeException, RuntimeException, std::exception)
      81             :     {
      82           0 :         util::Time aUNOTime;
      83           0 :         if ( !( _rValue >>= aUNOTime ) )
      84             :         {
      85           0 :             getTypedControlWindow()->SetText( "" );
      86           0 :             getTypedControlWindow()->SetEmptyTime();
      87             :         }
      88             :         else
      89             :         {
      90           0 :             getTypedControlWindow()->SetTime( ::tools::Time(aUNOTime) );
      91             :         }
      92           0 :     }
      93             : 
      94             : 
      95           0 :     Any SAL_CALL OTimeControl::getValue() throw (RuntimeException, std::exception)
      96             :     {
      97           0 :         Any aPropValue;
      98           0 :         if ( !getTypedControlWindow()->GetText().isEmpty() )
      99             :         {
     100           0 :             aPropValue <<= getTypedControlWindow()->GetTime().GetUNOTime();
     101             :         }
     102           0 :         return aPropValue;
     103             :     }
     104             : 
     105             : 
     106           0 :     Type SAL_CALL OTimeControl::getValueType() throw (RuntimeException, std::exception)
     107             :     {
     108           0 :         return ::cppu::UnoType<util::Time>::get();
     109             :     }
     110             : 
     111             : 
     112             :     //= ODateControl
     113             : 
     114             : 
     115           0 :     ODateControl::ODateControl( vcl::Window* pParent, WinBits nWinStyle )
     116           0 :         :ODateControl_Base( PropertyControlType::DateField, pParent, nWinStyle | WB_DROPDOWN )
     117             :     {
     118           0 :         WindowType* pControlWindow = getTypedControlWindow();
     119           0 :         pControlWindow->SetStrictFormat(true);
     120             : 
     121           0 :         pControlWindow->SetMin( ::Date( 1,1,1600 ) );
     122           0 :         pControlWindow->SetFirst( ::Date( 1,1,1600 ) );
     123           0 :         pControlWindow->SetLast( ::Date( 1, 1, 9999 ) );
     124           0 :         pControlWindow->SetMax( ::Date( 1, 1, 9999 ) );
     125             : 
     126           0 :         pControlWindow->SetExtDateFormat( XTDATEF_SYSTEM_SHORT_YYYY );
     127           0 :         pControlWindow->EnableEmptyFieldValue( true );
     128           0 :     }
     129             : 
     130             : 
     131           0 :     void SAL_CALL ODateControl::setValue( const Any& _rValue ) throw (IllegalTypeException, RuntimeException, std::exception)
     132             :     {
     133           0 :         util::Date aUNODate;
     134           0 :         if ( !( _rValue >>= aUNODate ) )
     135             :         {
     136           0 :             getTypedControlWindow()->SetText( "" );
     137           0 :             getTypedControlWindow()->SetEmptyDate();
     138             :         }
     139             :         else
     140             :         {
     141           0 :             ::Date aDate( aUNODate.Day, aUNODate.Month, aUNODate.Year );
     142           0 :             getTypedControlWindow()->SetDate( aDate );
     143             :         }
     144           0 :     }
     145             : 
     146             : 
     147           0 :     Any SAL_CALL ODateControl::getValue() throw (RuntimeException, std::exception)
     148             :     {
     149           0 :         Any aPropValue;
     150           0 :         if ( !getTypedControlWindow()->GetText().isEmpty() )
     151             :         {
     152           0 :             ::Date aDate( getTypedControlWindow()->GetDate() );
     153           0 :             aPropValue <<= aDate.GetUNODate();
     154             :         }
     155           0 :         return aPropValue;
     156             :     }
     157             : 
     158             : 
     159           0 :     Type SAL_CALL ODateControl::getValueType() throw (RuntimeException, std::exception)
     160             :     {
     161           0 :         return ::cppu::UnoType<util::Date>::get();
     162             :     }
     163             : 
     164             : 
     165             :     //= OEditControl
     166             : 
     167             : 
     168           0 :     OEditControl::OEditControl(vcl::Window* _pParent, bool _bPW, WinBits _nWinStyle)
     169           0 :         :OEditControl_Base( _bPW ? PropertyControlType::CharacterField : PropertyControlType::TextField, _pParent, _nWinStyle )
     170             :     {
     171           0 :         m_bIsPassword = _bPW;
     172             : 
     173           0 :         if ( m_bIsPassword )
     174           0 :            getTypedControlWindow()->SetMaxTextLen( 1 );
     175           0 :     }
     176             : 
     177             : 
     178           0 :     void SAL_CALL OEditControl::setValue( const Any& _rValue ) throw (IllegalTypeException, RuntimeException, std::exception)
     179             :     {
     180           0 :         OUString sText;
     181           0 :         if ( m_bIsPassword )
     182             :         {
     183           0 :             sal_Int16 nValue = 0;
     184           0 :             _rValue >>= nValue;
     185           0 :             if ( nValue )
     186             :             {
     187           0 :                 sText = OUString(static_cast<sal_Unicode>(nValue));
     188             :             }
     189             :         }
     190             :         else
     191           0 :             _rValue >>= sText;
     192             : 
     193           0 :         getTypedControlWindow()->SetText( sText );
     194           0 :     }
     195             : 
     196             : 
     197           0 :     Any SAL_CALL OEditControl::getValue() throw (RuntimeException, std::exception)
     198             :     {
     199           0 :         Any aPropValue;
     200             : 
     201           0 :         OUString sText( getTypedControlWindow()->GetText() );
     202           0 :         if ( m_bIsPassword )
     203             :         {
     204           0 :             if ( !sText.isEmpty() )
     205           0 :                 aPropValue <<= (sal_Int16)sText[0];
     206             :         }
     207             :         else
     208           0 :             aPropValue <<= sText;
     209             : 
     210           0 :         return aPropValue;
     211             :     }
     212             : 
     213             : 
     214           0 :     Type SAL_CALL OEditControl::getValueType() throw (RuntimeException, std::exception)
     215             :     {
     216           0 :         return m_bIsPassword ? ::cppu::UnoType<sal_Int16>::get() : ::cppu::UnoType<OUString>::get();
     217             :     }
     218             : 
     219             : 
     220           0 :     void OEditControl::modified()
     221             :     {
     222           0 :         OEditControl_Base::modified();
     223             : 
     224             :         // for password controls, we fire a commit for every single change
     225           0 :         if ( m_bIsPassword )
     226           0 :             m_aImplControl.notifyModifiedValue();
     227           0 :     }
     228             : 
     229             : 
     230           0 :     static long ImplCalcLongValue( double nValue, sal_uInt16 nDigits )
     231             :     {
     232           0 :         double n = nValue;
     233           0 :         for ( sal_uInt16 d = 0; d < nDigits; ++d )
     234           0 :             n *= 10;
     235             : 
     236           0 :         if ( n > ::std::numeric_limits< long >::max() )
     237           0 :             return ::std::numeric_limits< long >::max();
     238           0 :         return (long)n;
     239             :     }
     240             : 
     241             : 
     242           0 :     static double ImplCalcDoubleValue( long nValue, sal_uInt16 nDigits )
     243             :     {
     244           0 :         double n = nValue;
     245           0 :         for ( sal_uInt16 d = 0; d < nDigits; ++d )
     246           0 :             n /= 10;
     247           0 :         return n;
     248             :     }
     249             : 
     250             : 
     251             :     // class ODateTimeControl
     252             : 
     253             : 
     254           0 :     ODateTimeControl::ODateTimeControl( vcl::Window* _pParent, WinBits _nWinStyle)
     255           0 :         :ODateTimeControl_Base( PropertyControlType::DateTimeField, _pParent, _nWinStyle )
     256             :     {
     257           0 :         getTypedControlWindow()->EnableEmptyField( true );
     258             : 
     259             :         // determine a default format
     260           0 :         LanguageType eSysLanguage = SvtSysLocale().GetLanguageTag().getLanguageType( false);
     261             : 
     262           0 :         getTypedControlWindow()->SetFormatter( getTypedControlWindow()->StandardFormatter() );
     263           0 :         SvNumberFormatter* pFormatter = getTypedControlWindow()->GetFormatter();
     264           0 :         sal_uLong nStandardDateTimeFormat = pFormatter->GetStandardFormat( css::util::NumberFormat::DATETIME, eSysLanguage );
     265             : 
     266           0 :         getTypedControlWindow()->SetFormatKey( nStandardDateTimeFormat );
     267           0 :     }
     268             : 
     269             : 
     270           0 :     void SAL_CALL ODateTimeControl::setValue( const Any& _rValue ) throw (IllegalTypeException, RuntimeException, std::exception)
     271             :     {
     272           0 :         if ( !_rValue.hasValue() )
     273             :         {
     274           0 :             getTypedControlWindow()->SetText( "" );
     275             :         }
     276             :         else
     277             :         {
     278           0 :             util::DateTime aUNODateTime;
     279           0 :             OSL_VERIFY( _rValue >>= aUNODateTime );
     280             : 
     281           0 :             ::DateTime aDateTime( ::DateTime::EMPTY );
     282           0 :             ::utl::typeConvert( aUNODateTime, aDateTime );
     283             : 
     284           0 :             double nValue = aDateTime - ::DateTime( *getTypedControlWindow()->GetFormatter()->GetNullDate() );
     285           0 :             getTypedControlWindow()->SetValue( nValue );
     286             :         }
     287           0 :     }
     288             : 
     289             : 
     290           0 :     Any SAL_CALL ODateTimeControl::getValue() throw (RuntimeException, std::exception)
     291             :     {
     292           0 :         Any aPropValue;
     293           0 :         if ( !getTypedControlWindow()->GetText().isEmpty() )
     294             :         {
     295           0 :             double nValue = getTypedControlWindow()->GetValue();
     296             : 
     297           0 :             ::DateTime aDateTime( *getTypedControlWindow()->GetFormatter()->GetNullDate() );
     298             : 
     299             :             // add the "days" part
     300           0 :             double nDays = floor( nValue );
     301           0 :             aDateTime += nDays;
     302             : 
     303             :             // add the "time" part
     304           0 :             double nTime = nValue - nDays;
     305           0 :             nTime = ::rtl::math::round( nTime * 86400.0 ) / 86400.0;
     306             :                 // we're not interested in 100th seconds, and this here prevents rounding errors
     307           0 :             aDateTime += nTime;
     308             : 
     309           0 :             util::DateTime aUNODateTime;
     310           0 :             ::utl::typeConvert( aDateTime, aUNODateTime );
     311             : 
     312           0 :             aPropValue <<= aUNODateTime;
     313             :         }
     314           0 :         return aPropValue;
     315             :     }
     316             : 
     317             : 
     318           0 :     Type SAL_CALL ODateTimeControl::getValueType() throw (RuntimeException, std::exception)
     319             :     {
     320           0 :         return ::cppu::UnoType<util::DateTime>::get();
     321             :     }
     322             : 
     323             : 
     324             :     //= HyperlinkInput
     325             : 
     326             : 
     327           0 :     HyperlinkInput::HyperlinkInput( vcl::Window* _pParent, WinBits _nWinStyle )
     328           0 :         :Edit( _pParent, _nWinStyle )
     329             :     {
     330           0 :         ::svtools::ColorConfig aColorConfig;
     331           0 :         ::svtools::ColorConfigValue aLinkColor( aColorConfig.GetColorValue( ::svtools::LINKS ) );
     332             : 
     333           0 :         AllSettings aAllSettings( GetSettings() );
     334           0 :         StyleSettings aStyleSettings( aAllSettings.GetStyleSettings() );
     335             : 
     336           0 :         vcl::Font aFieldFont( aStyleSettings.GetFieldFont() );
     337           0 :         aFieldFont.SetUnderline( UNDERLINE_SINGLE );
     338           0 :         aFieldFont.SetColor( aLinkColor.nColor );
     339           0 :         aStyleSettings.SetFieldFont( aFieldFont );
     340             : 
     341           0 :         aStyleSettings.SetFieldTextColor( aLinkColor.nColor );
     342             : 
     343           0 :         aAllSettings.SetStyleSettings( aStyleSettings );
     344           0 :         SetSettings( aAllSettings );
     345           0 :     }
     346             : 
     347             : 
     348           0 :     void HyperlinkInput::MouseMove( const ::MouseEvent& rMEvt )
     349             :     {
     350           0 :         Edit::MouseMove( rMEvt );
     351             : 
     352           0 :         PointerStyle ePointerStyle( PointerStyle::Text );
     353             : 
     354           0 :         if ( !rMEvt.IsLeaveWindow() )
     355             :         {
     356           0 :             if ( impl_textHitTest( rMEvt.GetPosPixel() ) )
     357           0 :                 ePointerStyle = PointerStyle::RefHand;
     358             :         }
     359             : 
     360           0 :         SetPointer( Pointer( ePointerStyle ) );
     361           0 :     }
     362             : 
     363             : 
     364           0 :     void HyperlinkInput::MouseButtonDown( const ::MouseEvent& rMEvt )
     365             :     {
     366           0 :         Edit::MouseButtonDown( rMEvt );
     367             : 
     368           0 :         if ( impl_textHitTest( rMEvt.GetPosPixel() ) )
     369           0 :             m_aMouseButtonDownPos = rMEvt.GetPosPixel();
     370             :         else
     371           0 :             m_aMouseButtonDownPos.X() = m_aMouseButtonDownPos.Y() = -1;
     372           0 :     }
     373             : 
     374             : 
     375           0 :     void HyperlinkInput::MouseButtonUp( const ::MouseEvent& rMEvt )
     376             :     {
     377           0 :         Edit::MouseButtonUp( rMEvt );
     378             : 
     379           0 :         impl_checkEndClick( rMEvt );
     380           0 :     }
     381             : 
     382             : 
     383           0 :     bool HyperlinkInput::impl_textHitTest( const ::Point& _rWindowPos )
     384             :     {
     385           0 :         sal_Int32 nPos = GetCharPos( _rWindowPos );
     386           0 :         return ( ( nPos != EDIT_NOLIMIT ) && ( nPos < GetText().getLength() ) );
     387             :     }
     388             : 
     389             : 
     390           0 :     void HyperlinkInput::impl_checkEndClick( const ::MouseEvent& rMEvt )
     391             :     {
     392           0 :         const MouseSettings& rMouseSettings( GetSettings().GetMouseSettings() );
     393           0 :         if  (   ( std::abs( rMEvt.GetPosPixel().X() - m_aMouseButtonDownPos.X() ) < rMouseSettings.GetStartDragWidth() )
     394           0 :             &&  ( std::abs( rMEvt.GetPosPixel().Y() - m_aMouseButtonDownPos.Y() ) < rMouseSettings.GetStartDragHeight() )
     395             :             )
     396           0 :             Application::PostUserEvent( m_aClickHandler );
     397           0 :     }
     398             : 
     399             : 
     400           0 :     void HyperlinkInput::Tracking( const TrackingEvent& rTEvt )
     401             :     {
     402           0 :         Edit::Tracking( rTEvt );
     403             : 
     404           0 :         if ( rTEvt.IsTrackingEnded() )
     405           0 :             impl_checkEndClick( rTEvt.GetMouseEvent() );
     406           0 :     }
     407             : 
     408             : 
     409             :     //= OHyperlinkControl
     410             : 
     411             : 
     412           0 :     OHyperlinkControl::OHyperlinkControl( vcl::Window* _pParent, WinBits _nWinStyle )
     413             :         :OHyperlinkControl_Base( PropertyControlType::HyperlinkField, _pParent, _nWinStyle )
     414           0 :         ,m_aActionListeners( m_aMutex )
     415             :     {
     416           0 :         getTypedControlWindow()->SetClickHdl( LINK( this, OHyperlinkControl, OnHyperlinkClicked ) );
     417           0 :     }
     418             : 
     419             : 
     420           0 :     Any SAL_CALL OHyperlinkControl::getValue() throw (RuntimeException, std::exception)
     421             :     {
     422           0 :         OUString sText = getTypedControlWindow()->GetText();
     423           0 :         return makeAny( sText );
     424             :     }
     425             : 
     426             : 
     427           0 :     void SAL_CALL OHyperlinkControl::setValue( const Any& _value ) throw (IllegalTypeException, RuntimeException, std::exception)
     428             :     {
     429           0 :         OUString sText;
     430           0 :         _value >>= sText;
     431           0 :         getTypedControlWindow()->SetText( sText );
     432           0 :     }
     433             : 
     434             : 
     435           0 :     Type SAL_CALL OHyperlinkControl::getValueType() throw (RuntimeException, std::exception)
     436             :     {
     437           0 :         return ::cppu::UnoType<OUString>::get();
     438             :     }
     439             : 
     440             : 
     441           0 :     void SAL_CALL OHyperlinkControl::addActionListener( const Reference< XActionListener >& listener ) throw (RuntimeException, std::exception)
     442             :     {
     443           0 :         if ( listener.is() )
     444           0 :             m_aActionListeners.addInterface( listener );
     445           0 :     }
     446             : 
     447             : 
     448           0 :     void SAL_CALL OHyperlinkControl::removeActionListener( const Reference< XActionListener >& listener ) throw (RuntimeException, std::exception)
     449             :     {
     450           0 :         m_aActionListeners.removeInterface( listener );
     451           0 :     }
     452             : 
     453             : 
     454           0 :     void SAL_CALL OHyperlinkControl::disposing()
     455             :     {
     456           0 :         OHyperlinkControl_Base::disposing();
     457             : 
     458           0 :         EventObject aEvent( *this );
     459           0 :         m_aActionListeners.disposeAndClear( aEvent );
     460           0 :     }
     461             : 
     462             : 
     463           0 :     IMPL_LINK_NOARG( OHyperlinkControl, OnHyperlinkClicked )
     464             :     {
     465           0 :         ActionEvent aEvent( *this, OUString( "clicked" ) );
     466             :         m_aActionListeners.forEach< XActionListener >(
     467             :             boost::bind(
     468             :                 &XActionListener::actionPerformed,
     469           0 :                 _1, boost::cref(aEvent) ) );
     470             : 
     471           0 :         return 0;
     472             :     }
     473             : 
     474             : 
     475             :     //= ONumericControl
     476             : 
     477             : 
     478           0 :     ONumericControl::ONumericControl( vcl::Window* _pParent, WinBits _nWinStyle )
     479             :         :ONumericControl_Base( PropertyControlType::NumericField, _pParent, _nWinStyle )
     480             :         ,m_eValueUnit( FUNIT_NONE )
     481           0 :         ,m_nFieldToUNOValueFactor( 1 )
     482             :     {
     483           0 :         MetricField::SetDefaultUnit( FUNIT_NONE );
     484             : 
     485           0 :         getTypedControlWindow()->EnableEmptyFieldValue( true );
     486           0 :         getTypedControlWindow()->SetStrictFormat( true );
     487           0 :         Optional< double > value( getMaxValue() );
     488           0 :         value.Value = -value.Value;
     489           0 :         setMinValue( value );
     490           0 :     }
     491             : 
     492             : 
     493           0 :     ::sal_Int16 SAL_CALL ONumericControl::getDecimalDigits() throw (RuntimeException, std::exception)
     494             :     {
     495           0 :         return getTypedControlWindow()->GetDecimalDigits();
     496             :     }
     497             : 
     498             : 
     499           0 :     void SAL_CALL ONumericControl::setDecimalDigits( ::sal_Int16 _decimaldigits ) throw (RuntimeException, std::exception)
     500             :     {
     501           0 :         getTypedControlWindow()->SetDecimalDigits( _decimaldigits );
     502           0 :     }
     503             : 
     504             : 
     505           0 :     Optional< double > SAL_CALL ONumericControl::getMinValue() throw (RuntimeException, std::exception)
     506             :     {
     507           0 :         Optional< double > aReturn( sal_True, 0 );
     508             : 
     509           0 :         sal_Int64 minValue = getTypedControlWindow()->GetMin();
     510           0 :         if ( minValue == ::std::numeric_limits< sal_Int64 >::min() )
     511           0 :             aReturn.IsPresent = sal_False;
     512             :         else
     513           0 :             aReturn.Value = (double)minValue;
     514             : 
     515           0 :         return aReturn;
     516             :     }
     517             : 
     518             : 
     519           0 :     void SAL_CALL ONumericControl::setMinValue( const Optional< double >& _minvalue ) throw (RuntimeException, std::exception)
     520             :     {
     521           0 :         if ( !_minvalue.IsPresent )
     522           0 :             getTypedControlWindow()->SetMin( ::std::numeric_limits< sal_Int64 >::min() );
     523             :         else
     524           0 :             getTypedControlWindow()->SetMin( impl_apiValueToFieldValue_nothrow( _minvalue.Value ) , m_eValueUnit);
     525           0 :     }
     526             : 
     527             : 
     528           0 :     Optional< double > SAL_CALL ONumericControl::getMaxValue() throw (RuntimeException, std::exception)
     529             :     {
     530           0 :         Optional< double > aReturn( sal_True, 0 );
     531             : 
     532           0 :         sal_Int64 maxValue = getTypedControlWindow()->GetMax();
     533           0 :         if ( maxValue == ::std::numeric_limits< sal_Int64 >::max() )
     534           0 :             aReturn.IsPresent = sal_False;
     535             :         else
     536           0 :             aReturn.Value = (double)maxValue;
     537             : 
     538           0 :         return aReturn;
     539             :     }
     540             : 
     541             : 
     542           0 :     void SAL_CALL ONumericControl::setMaxValue( const Optional< double >& _maxvalue ) throw (RuntimeException, std::exception)
     543             :     {
     544           0 :         if ( !_maxvalue.IsPresent )
     545           0 :             getTypedControlWindow()->SetMax( ::std::numeric_limits< sal_Int64 >::max() );
     546             :         else
     547           0 :             getTypedControlWindow()->SetMax( impl_apiValueToFieldValue_nothrow( _maxvalue.Value ), m_eValueUnit );
     548           0 :     }
     549             : 
     550             : 
     551           0 :     ::sal_Int16 SAL_CALL ONumericControl::getDisplayUnit() throw (RuntimeException, std::exception)
     552             :     {
     553           0 :         return VCLUnoHelper::ConvertToMeasurementUnit( getTypedControlWindow()->GetUnit(), 1 );
     554             :     }
     555             : 
     556             : 
     557           0 :     void SAL_CALL ONumericControl::setDisplayUnit( ::sal_Int16 _displayunit ) throw (IllegalArgumentException, RuntimeException, std::exception)
     558             :     {
     559           0 :         if ( ( _displayunit < MeasureUnit::MM_100TH ) || ( _displayunit > MeasureUnit::PERCENT ) )
     560           0 :             throw IllegalArgumentException();
     561           0 :         if  (   ( _displayunit == MeasureUnit::MM_100TH )
     562           0 :             ||  ( _displayunit == MeasureUnit::MM_10TH )
     563           0 :             ||  ( _displayunit == MeasureUnit::INCH_1000TH )
     564           0 :             ||  ( _displayunit == MeasureUnit::INCH_100TH )
     565           0 :             ||  ( _displayunit == MeasureUnit::INCH_10TH )
     566           0 :             ||  ( _displayunit == MeasureUnit::PERCENT )
     567             :             )
     568           0 :             throw IllegalArgumentException();
     569             : 
     570           0 :         sal_Int16 nDummyFactor = 1;
     571           0 :         FieldUnit eFieldUnit = VCLUnoHelper::ConvertToFieldUnit( _displayunit, nDummyFactor );
     572           0 :         if ( nDummyFactor != 1 )
     573             :             // everything which survived the checks above should result in a factor of 1, i.e.,
     574             :             // it should have a direct counterpart as FieldUnit
     575           0 :             throw RuntimeException();
     576           0 :         getTypedControlWindow()->MetricFormatter::SetUnit( eFieldUnit );
     577           0 :     }
     578             : 
     579             : 
     580           0 :     ::sal_Int16 SAL_CALL ONumericControl::getValueUnit() throw (RuntimeException, std::exception)
     581             :     {
     582           0 :         return VCLUnoHelper::ConvertToMeasurementUnit( m_eValueUnit, m_nFieldToUNOValueFactor );
     583             :     }
     584             : 
     585             : 
     586           0 :     void SAL_CALL ONumericControl::setValueUnit( ::sal_Int16 _valueunit ) throw (RuntimeException, std::exception)
     587             :     {
     588           0 :         if ( ( _valueunit < MeasureUnit::MM_100TH ) || ( _valueunit > MeasureUnit::PERCENT ) )
     589           0 :             throw IllegalArgumentException();
     590           0 :         m_eValueUnit = VCLUnoHelper::ConvertToFieldUnit( _valueunit, m_nFieldToUNOValueFactor );
     591           0 :     }
     592             : 
     593             : 
     594           0 :     void SAL_CALL ONumericControl::setValue( const Any& _rValue ) throw (IllegalTypeException, RuntimeException, std::exception)
     595             :     {
     596           0 :         if ( !_rValue.hasValue() )
     597             :         {
     598           0 :             getTypedControlWindow()->SetText( "" );
     599           0 :             getTypedControlWindow()->SetEmptyFieldValue();
     600             :         }
     601             :         else
     602             :         {
     603           0 :             double nValue( 0 );
     604           0 :             OSL_VERIFY( _rValue >>= nValue );
     605           0 :             long nControlValue = impl_apiValueToFieldValue_nothrow( nValue );
     606           0 :             getTypedControlWindow()->SetValue( nControlValue, m_eValueUnit );
     607             :         }
     608           0 :     }
     609             : 
     610             : 
     611           0 :     long ONumericControl::impl_apiValueToFieldValue_nothrow( double _nApiValue ) const
     612             :     {
     613           0 :         long nControlValue = ImplCalcLongValue( _nApiValue, getTypedControlWindow()->GetDecimalDigits() );
     614           0 :         nControlValue /= m_nFieldToUNOValueFactor;
     615           0 :         return nControlValue;
     616             :     }
     617             : 
     618             : 
     619           0 :     double ONumericControl::impl_fieldValueToApiValue_nothrow( sal_Int64 _nFieldValue ) const
     620             :     {
     621           0 :         double nApiValue = ImplCalcDoubleValue( (long)_nFieldValue, getTypedControlWindow()->GetDecimalDigits() );
     622           0 :         nApiValue *= m_nFieldToUNOValueFactor;
     623           0 :         return nApiValue;
     624             :     }
     625             : 
     626             : 
     627           0 :     Any SAL_CALL ONumericControl::getValue() throw (RuntimeException, std::exception)
     628             :     {
     629           0 :         Any aPropValue;
     630           0 :         if ( !getTypedControlWindow()->GetText().isEmpty() )
     631             :         {
     632           0 :             double nValue = impl_fieldValueToApiValue_nothrow( getTypedControlWindow()->GetValue( m_eValueUnit ) );
     633           0 :             aPropValue <<= nValue;
     634             :         }
     635           0 :         return aPropValue;
     636             :     }
     637             : 
     638             : 
     639           0 :     Type SAL_CALL ONumericControl::getValueType() throw (RuntimeException, std::exception)
     640             :     {
     641           0 :         return ::cppu::UnoType<double>::get();
     642             :     }
     643             : 
     644             : 
     645             :     //= OColorControl
     646             : 
     647             :     #define LB_DEFAULT_COUNT 20
     648             : 
     649           0 :     OUString MakeHexStr(sal_uInt32 nVal, sal_Int32 nLength)
     650             :     {
     651           0 :         OUStringBuffer aStr;
     652           0 :         while (nVal>0)
     653             :         {
     654           0 :             char c = char(nVal & 0x000F);
     655           0 :             nVal >>= 4;
     656           0 :             if (c<=9) c += '0';
     657           0 :             else c += 'A' - 10;
     658           0 :             aStr.insert(0, c);
     659             :         }
     660           0 :         while (aStr.getLength() < nLength) aStr.insert(0, '0');
     661           0 :         return aStr.makeStringAndClear();
     662             :     }
     663             : 
     664             : 
     665           0 :     OColorControl::OColorControl(vcl::Window* pParent, WinBits nWinStyle)
     666           0 :         :OColorControl_Base( PropertyControlType::ColorListBox, pParent, nWinStyle )
     667             :     {
     668             :         // initialize the color listbox
     669           0 :         XColorListRef pColorList;
     670           0 :         SfxObjectShell* pDocSh = SfxObjectShell::Current();
     671           0 :         const SfxPoolItem* pItem = pDocSh ? pDocSh->GetItem( SID_COLOR_TABLE ) : NULL;
     672           0 :         if ( pItem )
     673             :         {
     674             :             DBG_ASSERT(pItem->ISA(SvxColorListItem), "OColorControl::OColorControl: invalid color item!");
     675           0 :             pColorList = static_cast<const SvxColorListItem*>( pItem )->GetColorList();
     676             :         }
     677             : 
     678           0 :         if ( !pColorList.is() )
     679           0 :             pColorList = XColorList::GetStdColorList();
     680             : 
     681             : 
     682             :         DBG_ASSERT(pColorList.is(), "OColorControl::OColorControl: no color table!");
     683             : 
     684           0 :         if ( pColorList.is() )
     685             :         {
     686           0 :             for (long i = 0; i < pColorList->Count(); ++i)
     687             :             {
     688           0 :                 XColorEntry* pEntry = pColorList->GetColor( i );
     689           0 :                 getTypedControlWindow()->InsertEntry( pEntry->GetColor(), pEntry->GetName() );
     690             :             }
     691             :         }
     692             : 
     693           0 :         getTypedControlWindow()->SetDropDownLineCount( LB_DEFAULT_COUNT );
     694           0 :         if ( ( nWinStyle & WB_READONLY ) != 0 )
     695             :         {
     696           0 :             getTypedControlWindow()->SetReadOnly( true );
     697           0 :             getTypedControlWindow()->Enable( true );
     698           0 :         }
     699           0 :     }
     700             : 
     701             : 
     702           0 :     void SAL_CALL OColorControl::setValue( const Any& _rValue ) throw (IllegalTypeException, RuntimeException, std::exception)
     703             :     {
     704           0 :         if ( _rValue.hasValue() )
     705             :         {
     706           0 :             ::com::sun::star::util::Color nColor = COL_TRANSPARENT;
     707           0 :             if ( _rValue >>= nColor )
     708             :             {
     709           0 :                 ::Color aRgbCol((ColorData)nColor);
     710             : 
     711           0 :                 getTypedControlWindow()->SelectEntry( aRgbCol );
     712           0 :                 if ( !getTypedControlWindow()->IsEntrySelected( aRgbCol ) )
     713             :                 {   // the given color is not part of the list -> insert a new entry with the hex code of the color
     714           0 :                     OUString aStr("0x");
     715           0 :                     aStr += MakeHexStr(nColor,8);
     716           0 :                     getTypedControlWindow()->InsertEntry( aRgbCol, aStr );
     717           0 :                     getTypedControlWindow()->SelectEntry( aRgbCol );
     718             :                 }
     719             :             }
     720             :             else
     721             :             {
     722           0 :                 OUString sNonColorValue;
     723           0 :                 if ( !( _rValue >>= sNonColorValue ) )
     724           0 :                     throw IllegalTypeException();
     725           0 :                 getTypedControlWindow()->SelectEntry( sNonColorValue );
     726           0 :                 if ( !getTypedControlWindow()->IsEntrySelected( sNonColorValue ) )
     727           0 :                     getTypedControlWindow()->SetNoSelection();
     728             :             }
     729             :         }
     730             :         else
     731           0 :             getTypedControlWindow()->SetNoSelection();
     732           0 :     }
     733             : 
     734             : 
     735           0 :     Any SAL_CALL OColorControl::getValue() throw (RuntimeException, std::exception)
     736             :     {
     737           0 :         Any aPropValue;
     738           0 :         if ( getTypedControlWindow()->GetSelectEntryCount() > 0 )
     739             :         {
     740           0 :             OUString sSelectedEntry = getTypedControlWindow()->GetSelectEntry();
     741           0 :             if ( m_aNonColorEntries.find( sSelectedEntry ) != m_aNonColorEntries.end() )
     742           0 :                 aPropValue <<= sSelectedEntry;
     743             :             else
     744             :             {
     745           0 :                 ::Color aRgbCol = getTypedControlWindow()->GetSelectEntryColor();
     746           0 :                 aPropValue <<= (::com::sun::star::util::Color)aRgbCol.GetColor();
     747           0 :             }
     748             :         }
     749           0 :         return aPropValue;
     750             :     }
     751             : 
     752             : 
     753           0 :     Type SAL_CALL OColorControl::getValueType() throw (RuntimeException, std::exception)
     754             :     {
     755           0 :         return ::cppu::UnoType<sal_Int32>::get();
     756             :     }
     757             : 
     758             : 
     759           0 :     void SAL_CALL OColorControl::clearList() throw (RuntimeException, std::exception)
     760             :     {
     761           0 :         getTypedControlWindow()->Clear();
     762           0 :     }
     763             : 
     764             : 
     765           0 :     void SAL_CALL OColorControl::prependListEntry( const OUString& NewEntry ) throw (RuntimeException, std::exception)
     766             :     {
     767           0 :         getTypedControlWindow()->InsertEntry( NewEntry, 0 );
     768           0 :         m_aNonColorEntries.insert( NewEntry );
     769           0 :     }
     770             : 
     771             : 
     772           0 :     void SAL_CALL OColorControl::appendListEntry( const OUString& NewEntry ) throw (RuntimeException, std::exception)
     773             :     {
     774           0 :         getTypedControlWindow()->InsertEntry( NewEntry );
     775           0 :         m_aNonColorEntries.insert( NewEntry );
     776           0 :     }
     777             : 
     778           0 :     Sequence< OUString > SAL_CALL OColorControl::getListEntries(  ) throw (RuntimeException, std::exception)
     779             :     {
     780           0 :         if ( !m_aNonColorEntries.empty() )
     781           0 :             return Sequence< OUString >(&(*m_aNonColorEntries.begin()),m_aNonColorEntries.size());
     782           0 :         return Sequence< OUString >();
     783             :     }
     784             : 
     785             : 
     786           0 :     void OColorControl::modified()
     787             :     {
     788           0 :         OColorControl_Base::modified();
     789             : 
     790           0 :         if ( !getTypedControlWindow()->IsTravelSelect() )
     791             :             // fire a commit
     792           0 :             m_aImplControl.notifyModifiedValue();
     793           0 :     }
     794             : 
     795             : 
     796             :     //= OListboxControl
     797             : 
     798             : 
     799           0 :     OListboxControl::OListboxControl( vcl::Window* pParent, WinBits nWinStyle)
     800           0 :         :OListboxControl_Base( PropertyControlType::ListBox, pParent, nWinStyle )
     801             :     {
     802           0 :         getTypedControlWindow()->SetDropDownLineCount( LB_DEFAULT_COUNT );
     803           0 :         if ( ( nWinStyle & WB_READONLY ) != 0 )
     804             :         {
     805           0 :             getTypedControlWindow()->SetReadOnly( true );
     806           0 :             getTypedControlWindow()->Enable( true );
     807             :         }
     808           0 :     }
     809             : 
     810             : 
     811           0 :     Any SAL_CALL OListboxControl::getValue() throw (RuntimeException, std::exception)
     812             :     {
     813           0 :         OUString sControlValue( getTypedControlWindow()->GetSelectEntry() );
     814             : 
     815           0 :         Any aPropValue;
     816           0 :         if ( !sControlValue.isEmpty() )
     817           0 :             aPropValue <<= sControlValue;
     818           0 :         return aPropValue;
     819             :     }
     820             : 
     821             : 
     822           0 :     Type SAL_CALL OListboxControl::getValueType() throw (RuntimeException, std::exception)
     823             :     {
     824           0 :         return ::cppu::UnoType<OUString>::get();
     825             :     }
     826             : 
     827             : 
     828           0 :     void SAL_CALL OListboxControl::setValue( const Any& _rValue ) throw (IllegalTypeException, RuntimeException, std::exception)
     829             :     {
     830           0 :         if ( !_rValue.hasValue() )
     831           0 :             getTypedControlWindow()->SetNoSelection();
     832             :         else
     833             :         {
     834           0 :             OUString sSelection;
     835           0 :             _rValue >>= sSelection;
     836             : 
     837           0 :             if ( !sSelection.equals( getTypedControlWindow()->GetSelectEntry() ) )
     838           0 :                 getTypedControlWindow()->SelectEntry( sSelection );
     839             : 
     840           0 :             if ( !getTypedControlWindow()->IsEntrySelected( sSelection ) )
     841             :             {
     842           0 :                 getTypedControlWindow()->InsertEntry( sSelection, 0 );
     843           0 :                 getTypedControlWindow()->SelectEntry( sSelection );
     844           0 :             }
     845             :         }
     846           0 :     }
     847             : 
     848             : 
     849           0 :     void SAL_CALL OListboxControl::clearList() throw (RuntimeException, std::exception)
     850             :     {
     851           0 :         getTypedControlWindow()->Clear();
     852           0 :     }
     853             : 
     854             : 
     855           0 :     void SAL_CALL OListboxControl::prependListEntry( const OUString& NewEntry ) throw (RuntimeException, std::exception)
     856             :     {
     857           0 :         getTypedControlWindow()->InsertEntry( NewEntry, 0 );
     858           0 :     }
     859             : 
     860             : 
     861           0 :     void SAL_CALL OListboxControl::appendListEntry( const OUString& NewEntry ) throw (RuntimeException, std::exception)
     862             :     {
     863           0 :         getTypedControlWindow()->InsertEntry( NewEntry );
     864           0 :     }
     865             : 
     866           0 :     Sequence< OUString > SAL_CALL OListboxControl::getListEntries(  ) throw (RuntimeException, std::exception)
     867             :     {
     868           0 :         const sal_uInt16 nCount = getTypedControlWindow()->GetEntryCount();
     869           0 :         Sequence< OUString > aRet(nCount);
     870           0 :         OUString* pIter = aRet.getArray();
     871           0 :         for (sal_uInt16 i = 0; i < nCount ; ++i,++pIter)
     872           0 :             *pIter = getTypedControlWindow()->GetEntry(i);
     873             : 
     874           0 :         return aRet;
     875             :     }
     876             : 
     877             : 
     878           0 :     void OListboxControl::modified()
     879             :     {
     880           0 :         OListboxControl_Base::modified();
     881             : 
     882           0 :         if ( !getTypedControlWindow()->IsTravelSelect() )
     883             :             // fire a commit
     884           0 :             m_aImplControl.notifyModifiedValue();
     885           0 :     }
     886             : 
     887             : 
     888             :     //= OComboboxControl
     889             : 
     890             : 
     891           0 :     OComboboxControl::OComboboxControl( vcl::Window* pParent, WinBits nWinStyle)
     892           0 :         :OComboboxControl_Base( PropertyControlType::ComboBox, pParent, nWinStyle )
     893             :     {
     894           0 :         getTypedControlWindow()->SetDropDownLineCount( LB_DEFAULT_COUNT );
     895           0 :         getTypedControlWindow()->SetSelectHdl( LINK( this, OComboboxControl, OnEntrySelected ) );
     896           0 :     }
     897             : 
     898             : 
     899           0 :     void SAL_CALL OComboboxControl::setValue( const Any& _rValue ) throw (IllegalTypeException, RuntimeException, std::exception)
     900             :     {
     901           0 :         OUString sText;
     902           0 :         _rValue >>= sText;
     903           0 :         getTypedControlWindow()->SetText( sText );
     904           0 :     }
     905             : 
     906             : 
     907           0 :     Any SAL_CALL OComboboxControl::getValue() throw (RuntimeException, std::exception)
     908             :     {
     909           0 :         return makeAny( OUString( getTypedControlWindow()->GetText() ) );
     910             :     }
     911             : 
     912             : 
     913           0 :     Type SAL_CALL OComboboxControl::getValueType() throw (RuntimeException, std::exception)
     914             :     {
     915           0 :         return ::cppu::UnoType<OUString>::get();
     916             :     }
     917             : 
     918             : 
     919           0 :     void SAL_CALL OComboboxControl::clearList() throw (RuntimeException, std::exception)
     920             :     {
     921           0 :         getTypedControlWindow()->Clear();
     922           0 :     }
     923             : 
     924             : 
     925           0 :     void SAL_CALL OComboboxControl::prependListEntry( const OUString& NewEntry ) throw (RuntimeException, std::exception)
     926             :     {
     927           0 :         getTypedControlWindow()->InsertEntry( NewEntry, 0 );
     928           0 :     }
     929             : 
     930             : 
     931           0 :     void SAL_CALL OComboboxControl::appendListEntry( const OUString& NewEntry ) throw (RuntimeException, std::exception)
     932             :     {
     933           0 :         getTypedControlWindow()->InsertEntry( NewEntry );
     934           0 :     }
     935             : 
     936           0 :     Sequence< OUString > SAL_CALL OComboboxControl::getListEntries(  ) throw (RuntimeException, std::exception)
     937             :     {
     938           0 :         const sal_uInt16 nCount = getTypedControlWindow()->GetEntryCount();
     939           0 :         Sequence< OUString > aRet(nCount);
     940           0 :         OUString* pIter = aRet.getArray();
     941           0 :         for (sal_uInt16 i = 0; i < nCount ; ++i,++pIter)
     942           0 :             *pIter = getTypedControlWindow()->GetEntry(i);
     943             : 
     944           0 :         return aRet;
     945             :     }
     946             : 
     947             : 
     948           0 :     IMPL_LINK_NOARG( OComboboxControl, OnEntrySelected )
     949             :     {
     950           0 :         if ( !getTypedControlWindow()->IsTravelSelect() )
     951             :             // fire a commit
     952           0 :             m_aImplControl.notifyModifiedValue();
     953           0 :         return 0L;
     954             :     }
     955             : 
     956             : 
     957             :     //= OMultilineFloatingEdit
     958             : 
     959             :     class OMultilineFloatingEdit : public FloatingWindow
     960             :     {
     961             :     private:
     962             :         VclPtr<MultiLineEdit>   m_aImplEdit;
     963             : 
     964             :     protected:
     965             :         virtual void    Resize() SAL_OVERRIDE;
     966             : 
     967             :     public:
     968             :                         OMultilineFloatingEdit(vcl::Window* _pParen);
     969             :         virtual         ~OMultilineFloatingEdit();
     970             :         virtual void    dispose() SAL_OVERRIDE;
     971           0 :         MultiLineEdit&  getEdit() { return *m_aImplEdit.get(); }
     972             : 
     973             :     protected:
     974             :         virtual bool    PreNotify(NotifyEvent& _rNEvt) SAL_OVERRIDE;
     975             :     };
     976             : 
     977             : 
     978           0 :     OMultilineFloatingEdit::OMultilineFloatingEdit(vcl::Window* _pParent)
     979             :         :FloatingWindow(_pParent, WB_BORDER)
     980           0 :         ,m_aImplEdit(VclPtr<MultiLineEdit>::Create(this, WB_VSCROLL|WB_IGNORETAB|WB_NOBORDER))
     981             :     {
     982           0 :         m_aImplEdit->Show();
     983           0 :     }
     984             : 
     985           0 :     OMultilineFloatingEdit::~OMultilineFloatingEdit()
     986             :     {
     987           0 :         disposeOnce();
     988           0 :     }
     989             : 
     990           0 :     void OMultilineFloatingEdit::dispose()
     991             :     {
     992           0 :         m_aImplEdit.disposeAndClear();
     993           0 :         FloatingWindow::dispose();
     994           0 :     }
     995             : 
     996           0 :     void OMultilineFloatingEdit::Resize()
     997             :     {
     998           0 :         m_aImplEdit->SetSizePixel(GetOutputSizePixel());
     999           0 :     }
    1000             : 
    1001             : 
    1002           0 :     bool OMultilineFloatingEdit::PreNotify(NotifyEvent& _rNEvt)
    1003             :     {
    1004           0 :         bool nResult = true;
    1005             : 
    1006           0 :         MouseNotifyEvent nSwitch = _rNEvt.GetType();
    1007           0 :         if (MouseNotifyEvent::KEYINPUT == nSwitch)
    1008             :         {
    1009           0 :             const vcl::KeyCode& aKeyCode = _rNEvt.GetKeyEvent()->GetKeyCode();
    1010           0 :             sal_uInt16 nKey = aKeyCode.GetCode();
    1011             : 
    1012           0 :             if  (   (   (KEY_RETURN == nKey)
    1013           0 :                     && !aKeyCode.IsShift()
    1014             :                     )
    1015           0 :                 ||  (   (KEY_UP == nKey)
    1016           0 :                     &&  aKeyCode.IsMod2()
    1017             :                     )
    1018             :                 )
    1019             :             {
    1020           0 :                 EndPopupMode();
    1021             :             }
    1022             :             else
    1023           0 :                 nResult=FloatingWindow::PreNotify(_rNEvt);
    1024             :         }
    1025             :         else
    1026           0 :             nResult=FloatingWindow::PreNotify(_rNEvt);
    1027             : 
    1028           0 :         return nResult;
    1029             :     }
    1030             : 
    1031             : 
    1032             :     //= DropDownEditControl_Base
    1033             : 
    1034             : 
    1035           0 :     DropDownEditControl::DropDownEditControl( vcl::Window* _pParent, WinBits _nStyle )
    1036             :         :DropDownEditControl_Base( _pParent, _nStyle )
    1037             :         ,m_pFloatingEdit( NULL )
    1038             :         ,m_pDropdownButton( NULL )
    1039             :         ,m_nOperationMode( eStringList )
    1040           0 :         ,m_bDropdown( false )
    1041             :     {
    1042           0 :         SetCompoundControl( true );
    1043             : 
    1044           0 :         m_pImplEdit = VclPtr<MultiLineEdit>::Create( this, WB_TABSTOP | WB_IGNORETAB | WB_NOBORDER | (_nStyle & WB_READONLY) );
    1045           0 :         SetSubEdit( m_pImplEdit );
    1046           0 :         m_pImplEdit->Show();
    1047             : 
    1048           0 :         if ( _nStyle & WB_DROPDOWN )
    1049             :         {
    1050           0 :             m_pDropdownButton = VclPtr<PushButton>::Create( this, WB_NOLIGHTBORDER | WB_RECTSTYLE | WB_NOTABSTOP);
    1051           0 :             m_pDropdownButton->SetSymbol(SymbolType::SPIN_DOWN);
    1052           0 :             m_pDropdownButton->SetClickHdl( LINK( this, DropDownEditControl, DropDownHdl ) );
    1053           0 :             m_pDropdownButton->Show();
    1054             :         }
    1055             : 
    1056           0 :         m_pFloatingEdit = VclPtr<OMultilineFloatingEdit>::Create(this);
    1057             : 
    1058           0 :         m_pFloatingEdit->SetPopupModeEndHdl( LINK( this, DropDownEditControl, ReturnHdl ) );
    1059           0 :         m_pFloatingEdit->getEdit().SetReadOnly( ( _nStyle & WB_READONLY ) != 0 );
    1060           0 :     }
    1061             : 
    1062             : 
    1063           0 :     void DropDownEditControl::setControlHelper( ControlHelper& _rControlHelper )
    1064             :     {
    1065           0 :         DropDownEditControl_Base::setControlHelper( _rControlHelper );
    1066           0 :         m_pFloatingEdit->getEdit().SetModifyHdl( LINK( &_rControlHelper, ControlHelper, ModifiedHdl ) );
    1067           0 :         m_pImplEdit->SetGetFocusHdl( LINK( &_rControlHelper, ControlHelper, GetFocusHdl ) );
    1068           0 :         m_pImplEdit->SetModifyHdl( LINK( &_rControlHelper, ControlHelper, ModifiedHdl ) );
    1069           0 :         m_pImplEdit->SetLoseFocusHdl( LINK( &_rControlHelper, ControlHelper, LoseFocusHdl ) );
    1070           0 :     }
    1071             : 
    1072             : 
    1073           0 :     DropDownEditControl::~DropDownEditControl()
    1074             :     {
    1075           0 :         disposeOnce();
    1076           0 :     }
    1077             : 
    1078           0 :     void DropDownEditControl::dispose()
    1079             :     {
    1080           0 :         SetSubEdit(nullptr);
    1081           0 :         m_pImplEdit.disposeAndClear();
    1082           0 :         m_pFloatingEdit.disposeAndClear();
    1083           0 :         m_pDropdownButton.disposeAndClear();
    1084           0 :         DropDownEditControl_Base::dispose();
    1085           0 :     }
    1086             : 
    1087             : 
    1088           0 :     void DropDownEditControl::Resize()
    1089             :     {
    1090           0 :         ::Size aOutSz = GetOutputSizePixel();
    1091             : 
    1092           0 :         if (m_pDropdownButton!=nullptr)
    1093             :         {
    1094           0 :             long nSBWidth = GetSettings().GetStyleSettings().GetScrollBarSize();
    1095           0 :             nSBWidth = CalcZoom( nSBWidth );
    1096           0 :             m_pImplEdit->setPosSizePixel( 0, 1, aOutSz.Width() - nSBWidth, aOutSz.Height()-2 );
    1097           0 :             m_pDropdownButton->setPosSizePixel( aOutSz.Width() - nSBWidth, 0, nSBWidth, aOutSz.Height() );
    1098             :         }
    1099             :         else
    1100           0 :             m_pImplEdit->setPosSizePixel( 0, 1, aOutSz.Width(), aOutSz.Height()-2 );
    1101           0 :     }
    1102             : 
    1103             : 
    1104           0 :     bool DropDownEditControl::PreNotify( NotifyEvent& rNEvt )
    1105             :     {
    1106           0 :         bool nResult = true;
    1107             : 
    1108           0 :         if (rNEvt.GetType() == MouseNotifyEvent::KEYINPUT)
    1109             :         {
    1110           0 :             const vcl::KeyCode& aKeyCode = rNEvt.GetKeyEvent()->GetKeyCode();
    1111           0 :             sal_uInt16 nKey = aKeyCode.GetCode();
    1112             : 
    1113           0 :             if ( nKey == KEY_RETURN && !aKeyCode.IsShift() )
    1114             :             {
    1115           0 :                 if ( m_pHelper )
    1116             :                 {
    1117           0 :                     m_pHelper->LoseFocusHdl( m_pImplEdit.get() );
    1118           0 :                     m_pHelper->activateNextControl();
    1119             :                 }
    1120             :             }
    1121           0 :             else if ( nKey == KEY_DOWN && aKeyCode.IsMod2() )
    1122             :             {
    1123           0 :                 Invalidate();
    1124           0 :                 ShowDropDown( true );
    1125             :             }
    1126           0 :             else if (   KEYGROUP_CURSOR == aKeyCode.GetGroup()
    1127           0 :                     ||  nKey == KEY_HELP
    1128           0 :                     ||  KEYGROUP_FKEYS == aKeyCode.GetGroup()
    1129           0 :                     ||  m_nOperationMode == eMultiLineText
    1130             :                     )
    1131             :             {
    1132           0 :                 nResult = DropDownEditControl_Base::PreNotify( rNEvt );
    1133             :             }
    1134           0 :             else if ( m_nOperationMode == eStringList )
    1135             :             {
    1136           0 :                 Selection aSel = m_pImplEdit->GetSelection();
    1137           0 :                 if ( aSel.Min() != aSel.Max() )
    1138             :                 {
    1139           0 :                     aSel.Min() = FindPos( aSel.Min() );
    1140           0 :                     aSel.Max() = FindPos( aSel.Max() );
    1141             :                 }
    1142             :                 else
    1143             :                 {
    1144           0 :                     aSel.Min() = FindPos( aSel.Min() );
    1145           0 :                     aSel.Max() = aSel.Min();
    1146             :                 }
    1147           0 :                 Invalidate();
    1148           0 :                 ShowDropDown( true );
    1149           0 :                 m_pFloatingEdit->getEdit().GrabFocus();
    1150           0 :                 m_pFloatingEdit->getEdit().SetSelection( aSel );
    1151           0 :                 vcl::Window* pFocusWin = Application::GetFocusWindow();
    1152           0 :                 pFocusWin->KeyInput( *rNEvt.GetKeyEvent() );
    1153             :             }
    1154             :         }
    1155             :         else
    1156           0 :             nResult = DropDownEditControl_Base::PreNotify(rNEvt);
    1157             : 
    1158           0 :         return nResult;
    1159             :     }
    1160             : 
    1161             : 
    1162             :     namespace
    1163             :     {
    1164             : 
    1165           0 :         StlSyntaxSequence< OUString > lcl_convertMultiLineToList( const OUString& _rCompsedTextWithLineBreaks )
    1166             :         {
    1167           0 :             sal_Int32 nLines = comphelper::string::getTokenCount(_rCompsedTextWithLineBreaks, '\n');
    1168           0 :             StlSyntaxSequence< OUString > aStrings( nLines );
    1169           0 :             StlSyntaxSequence< OUString >::iterator stringItem = aStrings.begin();
    1170           0 :             for ( sal_Int32 token = 0; token < nLines; ++token, ++stringItem )
    1171           0 :                 *stringItem = _rCompsedTextWithLineBreaks.getToken( token, '\n' );
    1172           0 :             return aStrings;
    1173             :         }
    1174             : 
    1175           0 :         OUString lcl_convertListToMultiLine( const StlSyntaxSequence< OUString >& _rStrings )
    1176             :         {
    1177           0 :             OUString sMultiLineText;
    1178           0 :             for (   StlSyntaxSequence< OUString >::const_iterator item = _rStrings.begin();
    1179           0 :                     item != _rStrings.end();
    1180             :                 )
    1181             :             {
    1182           0 :                 sMultiLineText += *item;
    1183           0 :                 if ( ++item != _rStrings.end() )
    1184           0 :                     sMultiLineText += "\n";
    1185             :             }
    1186           0 :             return sMultiLineText;
    1187             :         }
    1188             : 
    1189             : 
    1190           0 :         OUString lcl_convertListToDisplayText( const StlSyntaxSequence< OUString >& _rStrings )
    1191             :         {
    1192           0 :             OUStringBuffer aComposed;
    1193           0 :             for (   StlSyntaxSequence< OUString >::const_iterator strings = _rStrings.begin();
    1194           0 :                     strings != _rStrings.end();
    1195             :                     ++strings
    1196             :                 )
    1197             :             {
    1198           0 :                 if ( strings != _rStrings.begin() )
    1199           0 :                     aComposed.append( ';' );
    1200           0 :                 aComposed.append( '\"' );
    1201           0 :                 aComposed.append( *strings );
    1202           0 :                 aComposed.append( '\"' );
    1203             :             }
    1204           0 :             return aComposed.makeStringAndClear();
    1205             :         }
    1206             :     }
    1207             : 
    1208             : 
    1209             :     #define STD_HEIGHT  100
    1210           0 :     bool DropDownEditControl::ShowDropDown( bool bShow )
    1211             :     {
    1212           0 :         if (bShow)
    1213             :         {
    1214           0 :             ::Point aMePos= GetPosPixel();
    1215           0 :             aMePos = GetParent()->OutputToScreenPixel( aMePos );
    1216           0 :             ::Size aSize=GetSizePixel();
    1217           0 :             ::Rectangle aRect(aMePos,aSize);
    1218           0 :             aSize.Height() = STD_HEIGHT;
    1219           0 :             m_pFloatingEdit->SetOutputSizePixel(aSize);
    1220           0 :             m_pFloatingEdit->StartPopupMode( aRect, FloatWinPopupFlags::Down );
    1221             : 
    1222           0 :             m_pFloatingEdit->Show();
    1223           0 :             m_pFloatingEdit->getEdit().GrabFocus();
    1224           0 :             m_pFloatingEdit->getEdit().SetSelection(Selection(m_pFloatingEdit->getEdit().GetText().getLength()));
    1225           0 :             m_bDropdown = true;
    1226           0 :             if ( m_nOperationMode == eMultiLineText )
    1227           0 :                 m_pFloatingEdit->getEdit().SetText( m_pImplEdit->GetText() );
    1228           0 :             m_pImplEdit->SetText("");
    1229             :         }
    1230             :         else
    1231             :         {
    1232           0 :             m_pFloatingEdit->Hide();
    1233           0 :             m_pFloatingEdit->Invalidate();
    1234           0 :             m_pFloatingEdit->Update();
    1235             : 
    1236             :             // transfer the text from the floating edit to our own edit
    1237           0 :             OUString sDisplayText( m_pFloatingEdit->getEdit().GetText() );
    1238           0 :             if ( m_nOperationMode == eStringList )
    1239           0 :                 sDisplayText = lcl_convertListToDisplayText( lcl_convertMultiLineToList( sDisplayText ) );
    1240             : 
    1241           0 :             m_pImplEdit->SetText( sDisplayText );
    1242           0 :             GetParent()->Invalidate( InvalidateFlags::Children );
    1243           0 :             m_bDropdown = false;
    1244           0 :             m_pImplEdit->GrabFocus();
    1245             :         }
    1246           0 :         return m_bDropdown;
    1247             : 
    1248             :     }
    1249             : 
    1250             : 
    1251           0 :     long DropDownEditControl::FindPos(long nSinglePos)
    1252             :     {
    1253           0 :         long nPos = 0;
    1254           0 :         OUString aOutput;
    1255           0 :         OUString aStr = m_pFloatingEdit->getEdit().GetText();
    1256           0 :         OUString aStr1 = GetText();
    1257             : 
    1258           0 :         if ((nSinglePos == 0) || (nSinglePos == aStr1.getLength()))
    1259             :         {
    1260           0 :             return nSinglePos;
    1261             :         }
    1262             : 
    1263           0 :         if (!aStr.isEmpty())
    1264             :         {
    1265           0 :             long nDiff=0;
    1266           0 :             sal_Int32 nCount = comphelper::string::getTokenCount(aStr, '\n');
    1267             : 
    1268           0 :             OUString aInput = aStr.getToken(0,'\n' );
    1269             : 
    1270           0 :             if (!aInput.isEmpty())
    1271             :             {
    1272           0 :                 aOutput += "\"";
    1273           0 :                 nDiff++;
    1274           0 :                 aOutput += aInput;
    1275           0 :                 aOutput += "\"";
    1276             :             }
    1277             : 
    1278           0 :             if (nSinglePos <= aOutput.getLength())
    1279             :             {
    1280           0 :                 nPos=nSinglePos-nDiff;
    1281             :             }
    1282             :             else
    1283             :             {
    1284           0 :                 for (sal_Int32 i=1; i<nCount; ++i)
    1285             :                 {
    1286           0 :                     aInput=aStr.getToken((sal_uInt16)i, '\n');
    1287           0 :                     if (!aInput.isEmpty())
    1288             :                     {
    1289           0 :                         aOutput += ";";
    1290           0 :                         aOutput += "\"";
    1291           0 :                         nDiff += 2;
    1292           0 :                         aOutput += aInput;
    1293           0 :                         aOutput += "\"";
    1294             : 
    1295           0 :                         if (nSinglePos <= aOutput.getLength())
    1296             :                         {
    1297           0 :                             nPos=nSinglePos-nDiff;
    1298           0 :                             break;
    1299             :                         }
    1300             :                     }
    1301             :                 }
    1302           0 :             }
    1303             :         }
    1304           0 :         return nPos;
    1305             :     }
    1306             : 
    1307             : 
    1308           0 :     IMPL_LINK( DropDownEditControl, ReturnHdl, OMultilineFloatingEdit*, /*pMEd*/)
    1309             :     {
    1310             : 
    1311           0 :         OUString aStr = m_pFloatingEdit->getEdit().GetText();
    1312           0 :         OUString aStr2 = GetText();
    1313           0 :         ShowDropDown(false);
    1314             : 
    1315           0 :         if (aStr!=aStr2 || ( m_nOperationMode == eStringList ) )
    1316             :         {
    1317           0 :             if ( m_pHelper )
    1318           0 :                 m_pHelper->notifyModifiedValue();
    1319             :         }
    1320             : 
    1321           0 :         return 0;
    1322             :     }
    1323             : 
    1324             : 
    1325           0 :     IMPL_LINK( DropDownEditControl, DropDownHdl, PushButton*, /*pPb*/ )
    1326             :     {
    1327           0 :         ShowDropDown(!m_bDropdown);
    1328           0 :         return 0;
    1329             :     }
    1330             : 
    1331             : 
    1332           0 :     void DropDownEditControl::SetStringListValue( const StlSyntaxSequence< OUString >& _rStrings )
    1333             :     {
    1334           0 :         SetText( lcl_convertListToDisplayText( _rStrings ) );
    1335           0 :         m_pFloatingEdit->getEdit().SetText( lcl_convertListToMultiLine( _rStrings ) );
    1336           0 :     }
    1337             : 
    1338             : 
    1339           0 :     StlSyntaxSequence< OUString > DropDownEditControl::GetStringListValue() const
    1340             :     {
    1341           0 :         return lcl_convertMultiLineToList( m_pFloatingEdit->getEdit().GetText() );
    1342             :     }
    1343             : 
    1344             : 
    1345           0 :     void DropDownEditControl::SetTextValue( const OUString& _rText )
    1346             :     {
    1347             :         OSL_PRECOND( m_nOperationMode == eMultiLineText, "DropDownEditControl::SetTextValue: illegal call!" );
    1348             : 
    1349           0 :         m_pFloatingEdit->getEdit().SetText( _rText );
    1350           0 :         SetText( _rText );
    1351           0 :     }
    1352             : 
    1353             : 
    1354           0 :     OUString DropDownEditControl::GetTextValue() const
    1355             :     {
    1356             :         OSL_PRECOND( m_nOperationMode == eMultiLineText, "DropDownEditControl::GetTextValue: illegal call!" );
    1357           0 :         return GetText();
    1358             :     }
    1359             : 
    1360             : 
    1361             :     //= OMultilineEditControl
    1362             : 
    1363             : 
    1364           0 :     OMultilineEditControl::OMultilineEditControl( vcl::Window* pParent, MultiLineOperationMode _eMode, WinBits nWinStyle )
    1365             :         :OMultilineEditControl_Base( _eMode == eMultiLineText ? PropertyControlType::MultiLineTextField : PropertyControlType::StringListField
    1366             :                                    , pParent
    1367             :                                    , ( nWinStyle | WB_DIALOGCONTROL ) & ( ~WB_READONLY | ~WB_DROPDOWN )
    1368           0 :                                    , false )
    1369             :     {
    1370           0 :         getTypedControlWindow()->setOperationMode( _eMode );
    1371           0 :     }
    1372             : 
    1373             : 
    1374           0 :     void SAL_CALL OMultilineEditControl::setValue( const Any& _rValue ) throw (IllegalTypeException, RuntimeException, std::exception)
    1375             :     {
    1376           0 :         impl_checkDisposed_throw();
    1377             : 
    1378           0 :         switch ( getTypedControlWindow()->getOperationMode() )
    1379             :         {
    1380             :         case eMultiLineText:
    1381             :         {
    1382           0 :             OUString sText;
    1383           0 :             if ( !( _rValue >>= sText ) && _rValue.hasValue() )
    1384           0 :                 throw IllegalTypeException();
    1385           0 :             getTypedControlWindow()->SetTextValue( sText );
    1386             :         }
    1387           0 :         break;
    1388             :         case eStringList:
    1389             :         {
    1390           0 :             Sequence< OUString > aStringLines;
    1391           0 :             if ( !( _rValue >>= aStringLines ) && _rValue.hasValue() )
    1392           0 :                 throw IllegalTypeException();
    1393           0 :             getTypedControlWindow()->SetStringListValue( aStringLines );
    1394             :         }
    1395           0 :         break;
    1396             :         }
    1397           0 :     }
    1398             : 
    1399             : 
    1400           0 :     Any SAL_CALL OMultilineEditControl::getValue() throw (RuntimeException, std::exception)
    1401             :     {
    1402           0 :         impl_checkDisposed_throw();
    1403             : 
    1404           0 :         Any aValue;
    1405           0 :         switch ( getTypedControlWindow()->getOperationMode() )
    1406             :         {
    1407             :         case eMultiLineText:
    1408           0 :             aValue <<= getTypedControlWindow()->GetTextValue();
    1409           0 :             break;
    1410             :         case eStringList:
    1411           0 :             aValue <<= getTypedControlWindow()->GetStringListValue();
    1412           0 :             break;
    1413             :         }
    1414           0 :         return aValue;
    1415             :     }
    1416             : 
    1417             : 
    1418           0 :     Type SAL_CALL OMultilineEditControl::getValueType() throw (RuntimeException, std::exception)
    1419             :     {
    1420           0 :         if ( getTypedControlWindow()->getOperationMode() == eMultiLineText )
    1421           0 :             return ::cppu::UnoType<OUString>::get();
    1422           0 :         return cppu::UnoType<Sequence< OUString >>::get();
    1423             :     }
    1424             : 
    1425             : 
    1426           6 : } // namespace pcr
    1427             : 
    1428             : 
    1429             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.11