| /************************************************************** |
| * |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| * |
| *************************************************************/ |
| |
| |
| |
| // MARKER(update_precomp.py): autogen include statement, do not remove |
| #include "precompiled_sfx2.hxx" |
| #include <sfx2/itemconnect.hxx> |
| |
| #include <boost/shared_ptr.hpp> |
| #include <list> |
| #include <svl/itempool.hxx> |
| |
| // ============================================================================ |
| |
| namespace sfx { |
| |
| // ============================================================================ |
| // Helpers |
| // ============================================================================ |
| |
| namespace { |
| |
| TriState lclConvertToTriState( bool bKnown, bool bIsKnownFlag, bool bIsUnknownFlag ) |
| { |
| return (bKnown && bIsKnownFlag) ? STATE_CHECK : ((!bKnown && bIsUnknownFlag) ? STATE_NOCHECK : STATE_DONTKNOW); |
| } |
| |
| } // namespace |
| |
| // ---------------------------------------------------------------------------- |
| |
| sal_uInt16 ItemWrapperHelper::GetWhichId( const SfxItemSet& rItemSet, sal_uInt16 nSlot ) |
| { |
| return rItemSet.GetPool()->GetWhich( nSlot ); |
| } |
| |
| bool ItemWrapperHelper::IsKnownItem( const SfxItemSet& rItemSet, sal_uInt16 nSlot ) |
| { |
| return rItemSet.GetItemState( GetWhichId( rItemSet, nSlot ), sal_True ) != SFX_ITEM_UNKNOWN; |
| } |
| |
| const SfxPoolItem* ItemWrapperHelper::GetUniqueItem( const SfxItemSet& rItemSet, sal_uInt16 nSlot ) |
| { |
| sal_uInt16 nWhich = GetWhichId( rItemSet, nSlot ); |
| return (rItemSet.GetItemState( nWhich, sal_True ) >= SFX_ITEM_DEFAULT) ? rItemSet.GetItem( nWhich, sal_True ) : 0; |
| } |
| |
| const SfxPoolItem& ItemWrapperHelper::GetDefaultItem( const SfxItemSet& rItemSet, sal_uInt16 nSlot ) |
| { |
| return rItemSet.GetPool()->GetDefaultItem( GetWhichId( rItemSet, nSlot ) ); |
| } |
| |
| void ItemWrapperHelper::RemoveDefaultItem( SfxItemSet& rDestSet, const SfxItemSet& rOldSet, sal_uInt16 nSlot ) |
| { |
| sal_uInt16 nWhich = GetWhichId( rDestSet, nSlot ); |
| if( rOldSet.GetItemState( nWhich, sal_False ) == SFX_ITEM_DEFAULT ) |
| rDestSet.ClearItem( nWhich ); |
| } |
| |
| // ============================================================================ |
| // Base control wrapper classes |
| // ============================================================================ |
| |
| ControlWrapperBase::~ControlWrapperBase() |
| { |
| } |
| |
| // ============================================================================ |
| // Single control wrappers |
| // ============================================================================ |
| |
| DummyWindowWrapper::DummyWindowWrapper( Window& rWindow ) : |
| SingleControlWrapperType( rWindow ) |
| { |
| } |
| |
| bool DummyWindowWrapper::IsControlDontKnow() const |
| { |
| return false; |
| } |
| |
| void DummyWindowWrapper::SetControlDontKnow( bool ) |
| { |
| } |
| |
| void* DummyWindowWrapper::GetControlValue() const |
| { |
| return 0; |
| } |
| |
| void DummyWindowWrapper::SetControlValue( void* ) |
| { |
| } |
| |
| // ---------------------------------------------------------------------------- |
| |
| CheckBoxWrapper::CheckBoxWrapper( CheckBox& rCheckBox ) : |
| SingleControlWrapperType( rCheckBox ) |
| { |
| } |
| |
| bool CheckBoxWrapper::IsControlDontKnow() const |
| { |
| return GetControl().GetState() == STATE_DONTKNOW; |
| } |
| |
| void CheckBoxWrapper::SetControlDontKnow( bool bSet ) |
| { |
| GetControl().EnableTriState( bSet ); |
| GetControl().SetState( bSet ? STATE_DONTKNOW : STATE_NOCHECK ); |
| } |
| |
| sal_Bool CheckBoxWrapper::GetControlValue() const |
| { |
| return GetControl().IsChecked(); |
| } |
| |
| void CheckBoxWrapper::SetControlValue( sal_Bool bValue ) |
| { |
| GetControl().Check( bValue ); |
| } |
| |
| // ---------------------------------------------------------------------------- |
| |
| EditWrapper::EditWrapper( Edit& rEdit ) : |
| SingleControlWrapperType( rEdit ) |
| { |
| } |
| |
| bool EditWrapper::IsControlDontKnow() const |
| { |
| // no "don't know" state - empty string is a valid value of an Edit |
| return false; |
| } |
| |
| void EditWrapper::SetControlDontKnow( bool bSet ) |
| { |
| if( bSet ) |
| GetControl().SetText( String() ); |
| } |
| |
| String EditWrapper::GetControlValue() const |
| { |
| return GetControl().GetText(); |
| } |
| |
| void EditWrapper::SetControlValue( String aValue ) |
| { |
| GetControl().SetText( aValue ); |
| } |
| |
| // ---------------------------------------------------------------------------- |
| |
| ColorListBoxWrapper::ColorListBoxWrapper(ColorListBox & rListBox): |
| SingleControlWrapper< ColorListBox, Color >(rListBox) |
| {} |
| |
| ColorListBoxWrapper::~ColorListBoxWrapper() |
| {} |
| |
| bool ColorListBoxWrapper::IsControlDontKnow() const |
| { |
| return GetControl().GetSelectEntryCount() == 0; |
| } |
| |
| void ColorListBoxWrapper::SetControlDontKnow( bool bSet ) |
| { |
| if( bSet ) GetControl().SetNoSelection(); |
| } |
| |
| Color ColorListBoxWrapper::GetControlValue() const |
| { |
| return GetControl().GetSelectEntryColor(); |
| } |
| |
| void ColorListBoxWrapper::SetControlValue( Color aColor ) |
| { |
| GetControl().SelectEntry( aColor ); |
| } |
| |
| // ============================================================================ |
| // Multi control wrappers |
| // ============================================================================ |
| |
| typedef std::vector< ControlWrapperBase* > ControlWrpVec; |
| typedef ControlWrpVec::iterator ControlWrpVecI; |
| typedef ControlWrpVec::const_iterator ControlWrpVecCI; |
| |
| struct MultiControlWrapperHelper_Impl |
| { |
| ControlWrpVec maVec; |
| }; |
| |
| MultiControlWrapperHelper::MultiControlWrapperHelper() : |
| mxImpl( new MultiControlWrapperHelper_Impl ) |
| { |
| } |
| |
| MultiControlWrapperHelper::~MultiControlWrapperHelper() |
| { |
| } |
| |
| void MultiControlWrapperHelper::RegisterControlWrapper( ControlWrapperBase& rWrapper ) |
| { |
| mxImpl->maVec.push_back( &rWrapper ); |
| } |
| |
| void MultiControlWrapperHelper::ModifyControl( TriState eEnable, TriState eShow ) |
| { |
| for( ControlWrpVecI aIt = mxImpl->maVec.begin(), aEnd = mxImpl->maVec.end(); aIt != aEnd; ++aIt ) |
| (*aIt)->ModifyControl( eEnable, eShow ); |
| } |
| |
| bool MultiControlWrapperHelper::IsControlDontKnow() const |
| { |
| bool bIs = !mxImpl->maVec.empty(); |
| for( ControlWrpVecCI aIt = mxImpl->maVec.begin(), aEnd = mxImpl->maVec.end(); bIs && (aIt != aEnd); ++aIt ) |
| bIs &= (*aIt)->IsControlDontKnow(); |
| return bIs; |
| } |
| |
| void MultiControlWrapperHelper::SetControlDontKnow( bool bSet ) |
| { |
| for( ControlWrpVecI aIt = mxImpl->maVec.begin(), aEnd = mxImpl->maVec.end(); aIt != aEnd; ++aIt ) |
| (*aIt)->SetControlDontKnow( bSet ); |
| } |
| |
| // ============================================================================ |
| // Base connection classes |
| // ============================================================================ |
| |
| ItemConnectionBase::ItemConnectionBase( ItemConnFlags nFlags ) : |
| mnFlags( nFlags ) |
| { |
| } |
| |
| ItemConnectionBase::~ItemConnectionBase() |
| { |
| } |
| |
| void ItemConnectionBase::Activate( bool bActive ) |
| { |
| if( bActive ) mnFlags &= ~ITEMCONN_INACTIVE; else mnFlags |= ITEMCONN_INACTIVE; |
| } |
| |
| bool ItemConnectionBase::IsActive() const |
| { |
| return !(mnFlags & ITEMCONN_INACTIVE); |
| } |
| |
| void ItemConnectionBase::DoApplyFlags( const SfxItemSet& rItemSet ) |
| { |
| if( IsActive() ) |
| ApplyFlags( rItemSet ); |
| } |
| |
| void ItemConnectionBase::DoReset( const SfxItemSet& rItemSet ) |
| { |
| if( IsActive() ) |
| Reset( rItemSet ); |
| } |
| |
| bool ItemConnectionBase::DoFillItemSet( SfxItemSet& rDestSet, const SfxItemSet& rOldSet ) |
| { |
| return IsActive() && FillItemSet( rDestSet, rOldSet ); |
| } |
| |
| TriState ItemConnectionBase::GetEnableState( bool bKnown ) const |
| { |
| return lclConvertToTriState( bKnown, mnFlags & ITEMCONN_ENABLE_KNOWN, mnFlags & ITEMCONN_DISABLE_UNKNOWN ); |
| } |
| |
| TriState ItemConnectionBase::GetShowState( bool bKnown ) const |
| { |
| return lclConvertToTriState( bKnown, mnFlags & ITEMCONN_SHOW_KNOWN, mnFlags & ITEMCONN_HIDE_UNKNOWN ); |
| } |
| |
| // ============================================================================ |
| // Standard connections |
| // ============================================================================ |
| |
| DummyItemConnection::DummyItemConnection( sal_uInt16 nSlot, Window& rWindow, ItemConnFlags nFlags ) : |
| ItemConnectionBase( nFlags ), |
| DummyWindowWrapper( rWindow ), |
| mnSlot( nSlot ) |
| { |
| } |
| |
| void DummyItemConnection::ApplyFlags( const SfxItemSet& rItemSet ) |
| { |
| bool bKnown = ItemWrapperHelper::IsKnownItem( rItemSet, mnSlot ); |
| ModifyControl( GetEnableState( bKnown ), GetShowState( bKnown ) ); |
| } |
| |
| void DummyItemConnection::Reset( const SfxItemSet& /*rItemSet*/ ) |
| { |
| } |
| |
| bool DummyItemConnection::FillItemSet( SfxItemSet& /*rDestSet*/, const SfxItemSet& /*rOldSet*/ ) |
| { |
| return false; // item set not changed |
| } |
| |
| // ============================================================================ |
| // Array of connections |
| // ============================================================================ |
| |
| class ItemConnectionArrayImpl |
| { |
| public: |
| void Append( ItemConnectionBase* pConnection ); |
| |
| void ApplyFlags( const SfxItemSet& rItemSet ); |
| void Reset( const SfxItemSet& rItemSet ); |
| bool FillItemSet( SfxItemSet& rDestSet, const SfxItemSet& rOldSet ); |
| |
| private: |
| typedef boost::shared_ptr< ItemConnectionBase > ItemConnectionRef; |
| typedef std::list< ItemConnectionRef > ItemConnectionList; |
| typedef ItemConnectionList::iterator ItemConnectionListIt; |
| |
| ItemConnectionList maList; |
| }; |
| |
| void ItemConnectionArrayImpl::Append( ItemConnectionBase* pConnection ) |
| { |
| if( pConnection ) |
| maList.push_back( ItemConnectionRef( pConnection ) ); |
| } |
| |
| void ItemConnectionArrayImpl::ApplyFlags( const SfxItemSet& rItemSet ) |
| { |
| for( ItemConnectionListIt aIt = maList.begin(), aEnd = maList.end(); aIt != aEnd; ++aIt ) |
| (*aIt)->DoApplyFlags( rItemSet ); |
| } |
| |
| void ItemConnectionArrayImpl::Reset( const SfxItemSet& rItemSet ) |
| { |
| for( ItemConnectionListIt aIt = maList.begin(), aEnd = maList.end(); aIt != aEnd; ++aIt ) |
| (*aIt)->DoReset( rItemSet ); |
| } |
| |
| bool ItemConnectionArrayImpl::FillItemSet( SfxItemSet& rDestSet, const SfxItemSet& rOldSet ) |
| { |
| bool bChanged = false; |
| for( ItemConnectionListIt aIt = maList.begin(), aEnd = maList.end(); aIt != aEnd; ++aIt ) |
| bChanged |= (*aIt)->DoFillItemSet( rDestSet, rOldSet ); |
| return bChanged; |
| } |
| |
| // ---------------------------------------------------------------------------- |
| |
| ItemConnectionArray::ItemConnectionArray() : |
| mxImpl( new ItemConnectionArrayImpl ) |
| { |
| } |
| |
| ItemConnectionArray::~ItemConnectionArray() |
| { |
| } |
| |
| void ItemConnectionArray::AddConnection( ItemConnectionBase* pConnection ) |
| { |
| mxImpl->Append( pConnection ); |
| } |
| |
| void ItemConnectionArray::ApplyFlags( const SfxItemSet& rItemSet ) |
| { |
| mxImpl->ApplyFlags( rItemSet ); |
| } |
| |
| void ItemConnectionArray::Reset( const SfxItemSet& rItemSet ) |
| { |
| mxImpl->Reset( rItemSet ); |
| } |
| |
| bool ItemConnectionArray::FillItemSet( SfxItemSet& rDestSet, const SfxItemSet& rOldSet ) |
| { |
| return mxImpl->FillItemSet( rDestSet, rOldSet ); |
| } |
| |
| // ============================================================================ |
| |
| } // namespace sfx |
| |