diff options
Diffstat (limited to 'extensions/source/propctrlr/standardcontrol.cxx')
-rw-r--r-- | extensions/source/propctrlr/standardcontrol.cxx | 109 |
1 files changed, 100 insertions, 9 deletions
diff --git a/extensions/source/propctrlr/standardcontrol.cxx b/extensions/source/propctrlr/standardcontrol.cxx index 7d422966aff4..ca2412f9dbad 100644 --- a/extensions/source/propctrlr/standardcontrol.cxx +++ b/extensions/source/propctrlr/standardcontrol.cxx @@ -657,50 +657,141 @@ namespace pcr return aStr.makeStringAndClear(); } + OColorControl::OColorControl(vcl::Window* pParent, WinBits nWinStyle) - : OColorControl_Base(PropertyControlType::ColorListBox, pParent, nWinStyle) + :OColorControl_Base( PropertyControlType::ColorListBox, pParent, nWinStyle ) { + // initialize the color listbox + XColorListRef pColorList; + SfxObjectShell* pDocSh = SfxObjectShell::Current(); + const SfxPoolItem* pItem = pDocSh ? pDocSh->GetItem( SID_COLOR_TABLE ) : nullptr; + if ( pItem ) + { + DBG_ASSERT(dynamic_cast< const SvxColorListItem* >(pItem) != nullptr, "OColorControl::OColorControl: invalid color item!"); + pColorList = static_cast<const SvxColorListItem*>( pItem )->GetColorList(); + } + + if ( !pColorList.is() ) + pColorList = XColorList::GetStdColorList(); + + + DBG_ASSERT(pColorList.is(), "OColorControl::OColorControl: no color table!"); + + if ( pColorList.is() ) + { + for (long i = 0; i < pColorList->Count(); ++i) + { + const XColorEntry* pEntry = pColorList->GetColor(i); + getTypedControlWindow()->InsertEntry( pEntry->GetColor(), pEntry->GetName() ); + } + } + + getTypedControlWindow()->SetDropDownLineCount( LB_DEFAULT_COUNT ); + if ( ( nWinStyle & WB_READONLY ) != 0 ) + { + getTypedControlWindow()->SetReadOnly(); + getTypedControlWindow()->Enable(); + } } + void SAL_CALL OColorControl::setValue( const Any& _rValue ) throw (IllegalTypeException, RuntimeException, std::exception) { if ( _rValue.hasValue() ) { css::util::Color nColor = COL_TRANSPARENT; - _rValue >>= nColor; - ::Color aRgbCol((ColorData)nColor); - getTypedControlWindow()->SelectEntry(std::make_pair(aRgbCol, MakeHexStr(nColor, 8))); + 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 + OUString aStr("0x"); + aStr += MakeHexStr(nColor,8); + getTypedControlWindow()->InsertEntry( aRgbCol, aStr ); + getTypedControlWindow()->SelectEntry( aRgbCol ); + } + } + else + { + 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, std::exception) { Any aPropValue; - if (!getTypedControlWindow()->IsNoSelection()) + if ( getTypedControlWindow()->GetSelectEntryCount() > 0 ) { - ::Color aRgbCol = getTypedControlWindow()->GetSelectEntryColor(); - aPropValue <<= (css::util::Color)aRgbCol.GetColor(); + OUString sSelectedEntry = getTypedControlWindow()->GetSelectEntry(); + if ( m_aNonColorEntries.find( sSelectedEntry ) != m_aNonColorEntries.end() ) + aPropValue <<= sSelectedEntry; + else + { + ::Color aRgbCol = getTypedControlWindow()->GetSelectEntryColor(); + aPropValue <<= (css::util::Color)aRgbCol.GetColor(); + } } return aPropValue; } + Type SAL_CALL OColorControl::getValueType() throw (RuntimeException, std::exception) { return ::cppu::UnoType<sal_Int32>::get(); } + + void SAL_CALL OColorControl::clearList() throw (RuntimeException, std::exception) + { + getTypedControlWindow()->Clear(); + } + + + void SAL_CALL OColorControl::prependListEntry( const OUString& NewEntry ) throw (RuntimeException, std::exception) + { + getTypedControlWindow()->InsertEntry( NewEntry, 0 ); + m_aNonColorEntries.insert( NewEntry ); + } + + + void SAL_CALL OColorControl::appendListEntry( const OUString& NewEntry ) throw (RuntimeException, std::exception) + { + getTypedControlWindow()->InsertEntry( NewEntry ); + m_aNonColorEntries.insert( NewEntry ); + } + + Sequence< OUString > SAL_CALL OColorControl::getListEntries( ) throw (RuntimeException, std::exception) + { + if ( !m_aNonColorEntries.empty() ) + return Sequence< OUString >(&(*m_aNonColorEntries.begin()),m_aNonColorEntries.size()); + return Sequence< OUString >(); + } + + void OColorControl::setModified() { OColorControl_Base::setModified(); - // fire a commit - notifyModifiedValue(); + if ( !getTypedControlWindow()->IsTravelSelect() ) + // fire a commit + notifyModifiedValue(); } + //= OListboxControl + OListboxControl::OListboxControl( vcl::Window* pParent, WinBits nWinStyle) :OListboxControl_Base( PropertyControlType::ListBox, pParent, nWinStyle ) { |