summaryrefslogtreecommitdiff
path: root/sfx2/source/dialog/itemconnect.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'sfx2/source/dialog/itemconnect.cxx')
-rw-r--r--sfx2/source/dialog/itemconnect.cxx408
1 files changed, 408 insertions, 0 deletions
diff --git a/sfx2/source/dialog/itemconnect.cxx b/sfx2/source/dialog/itemconnect.cxx
new file mode 100644
index 000000000000..51ed3bc5304a
--- /dev/null
+++ b/sfx2/source/dialog/itemconnect.cxx
@@ -0,0 +1,408 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_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
+
+// ----------------------------------------------------------------------------
+
+USHORT ItemWrapperHelper::GetWhichId( const SfxItemSet& rItemSet, USHORT nSlot )
+{
+ return rItemSet.GetPool()->GetWhich( nSlot );
+}
+
+bool ItemWrapperHelper::IsKnownItem( const SfxItemSet& rItemSet, USHORT nSlot )
+{
+ return rItemSet.GetItemState( GetWhichId( rItemSet, nSlot ), TRUE ) != SFX_ITEM_UNKNOWN;
+}
+
+const SfxPoolItem* ItemWrapperHelper::GetUniqueItem( const SfxItemSet& rItemSet, USHORT nSlot )
+{
+ USHORT nWhich = GetWhichId( rItemSet, nSlot );
+ return (rItemSet.GetItemState( nWhich, TRUE ) >= SFX_ITEM_DEFAULT) ? rItemSet.GetItem( nWhich, TRUE ) : 0;
+}
+
+const SfxPoolItem& ItemWrapperHelper::GetDefaultItem( const SfxItemSet& rItemSet, USHORT nSlot )
+{
+ return rItemSet.GetPool()->GetDefaultItem( GetWhichId( rItemSet, nSlot ) );
+}
+
+void ItemWrapperHelper::RemoveDefaultItem( SfxItemSet& rDestSet, const SfxItemSet& rOldSet, USHORT nSlot )
+{
+ USHORT nWhich = GetWhichId( rDestSet, nSlot );
+ if( rOldSet.GetItemState( nWhich, 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 );
+}
+
+BOOL CheckBoxWrapper::GetControlValue() const
+{
+ return GetControl().IsChecked();
+}
+
+void CheckBoxWrapper::SetControlValue( 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( USHORT 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
+