Put the VCL Window class in the vcl namespace. Avoids clash with the X11 Window typedef. Change-Id: Ib1beb7ab4ad75562a42aeb252732a073d25eff1a
366 lines
9.0 KiB
C++
366 lines
9.0 KiB
C++
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
|
/*
|
|
* This file is part of the LibreOffice project.
|
|
*
|
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
*
|
|
* This file incorporates work covered by the following license notice:
|
|
*
|
|
* 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 .
|
|
*/
|
|
|
|
#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) ? TRISTATE_TRUE : ((!bKnown && bIsUnknownFlag) ? TRISTATE_FALSE : TRISTATE_INDET);
|
|
}
|
|
|
|
} // 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 ), true ) != SfxItemState::UNKNOWN;
|
|
}
|
|
|
|
const SfxPoolItem* ItemWrapperHelper::GetUniqueItem( const SfxItemSet& rItemSet, sal_uInt16 nSlot )
|
|
{
|
|
sal_uInt16 nWhich = GetWhichId( rItemSet, nSlot );
|
|
return (rItemSet.GetItemState( nWhich, true ) >= SfxItemState::DEFAULT) ? rItemSet.GetItem( nWhich, 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, false ) == SfxItemState::DEFAULT )
|
|
rDestSet.ClearItem( nWhich );
|
|
}
|
|
|
|
|
|
// Base control wrapper classes
|
|
|
|
|
|
ControlWrapperBase::~ControlWrapperBase()
|
|
{
|
|
}
|
|
|
|
|
|
// Single control wrappers
|
|
|
|
|
|
DummyWindowWrapper::DummyWindowWrapper( vcl::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() == TRISTATE_INDET;
|
|
}
|
|
|
|
void CheckBoxWrapper::SetControlDontKnow( bool bSet )
|
|
{
|
|
GetControl().EnableTriState( bSet );
|
|
GetControl().SetState( bSet ? TRISTATE_INDET : TRISTATE_FALSE );
|
|
}
|
|
|
|
bool CheckBoxWrapper::GetControlValue() const
|
|
{
|
|
return GetControl().IsChecked();
|
|
}
|
|
|
|
void CheckBoxWrapper::SetControlValue( bool bValue )
|
|
{
|
|
GetControl().Check( bValue );
|
|
}
|
|
|
|
|
|
|
|
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()
|
|
{
|
|
}
|
|
|
|
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) != 0, (mnFlags & ITEMCONN_DISABLE_UNKNOWN) != 0 );
|
|
}
|
|
|
|
TriState ItemConnectionBase::GetShowState( bool bKnown ) const
|
|
{
|
|
return lclConvertToTriState( bKnown, (mnFlags & ITEMCONN_SHOW_KNOWN) != 0, (mnFlags & ITEMCONN_HIDE_UNKNOWN) != 0 );
|
|
}
|
|
|
|
|
|
// Standard connections
|
|
|
|
|
|
DummyItemConnection::DummyItemConnection( sal_uInt16 nSlot, vcl::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
|
|
|
|
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|