30#include <com/sun/star/awt/PosSize.hpp>
38#include <svx/svxids.hrc>
70 Any aReturn = UnoEditControl::queryAggregation( _rType );
72 if ( !aReturn.hasValue() )
82 void implAdjustTriStateFlag(
const Reference< XPropertySet >& _rxProps,
const OUString& _rPropertyName,
85 bool bFlagValue =
false;
86 if ( _rxProps->getPropertyValue( _rPropertyName ) >>= bFlagValue )
87 _rAllBits |= ( bFlagValue ? _nPositiveFlag : nNegativeFlag );
91 void implAdjustTwoStateFlag(
const Any& _rValue,
WinBits& _rAllBits,
WinBits _nFlag,
bool _bInvert )
93 bool bFlagValue =
false;
94 if ( _rValue >>= bFlagValue )
97 bFlagValue = !bFlagValue;
101 _rAllBits &= ~_nFlag;
106 void implAdjustTwoStateFlag(
const Reference< XPropertySet >& _rxProps,
const OUString& _rPropertyName,
109 implAdjustTwoStateFlag( _rxProps->getPropertyValue( _rPropertyName ), _rAllBits, _nFlag, _bInvert );
113 void adjustTwoStateWinBit(
vcl::Window* _pWindow,
const Any& _rValue,
WinBits _nFlag,
bool _bInvert =
false )
116 implAdjustTwoStateFlag( _rValue, nBits, _nFlag, _bInvert );
121 WinBits getWinBits(
const Reference< XControlModel >& _rxModel )
126 Reference< XPropertySet > xProps( _rxModel, UNO_QUERY );
134 implAdjustTriStateFlag( xProps,
PROPERTY_TABSTOP, nBits, WB_TABSTOP, WB_NOTABSTOP );
140 catch(
const Exception& )
151 bool bReallyActAsRichText =
false;
154 Reference< XPropertySet > xModelProps( getModel(), UNO_QUERY_THROW );
162 if ( !bReallyActAsRichText )
164 UnoEditControl::createPeer( _rToolkit, _rParentPeer );
173 mbCreatingPeer =
true;
177 if ( _rParentPeer.is() )
182 DBG_ASSERT( pParentWin,
"ORichTextControl::createPeer: could not obtain the VCL-level parent window!" );
186 Reference< XControlModel >
xModel( getModel() );
188 DBG_ASSERT( pPeer,
"ORichTextControl::createPeer: invalid peer returned!" );
197 Reference< XView > xPeerView( getPeer(), UNO_QUERY );
198 if ( xPeerView.is() )
200 xPeerView->setZoom( maComponentInfos.nZoomX, maComponentInfos.nZoomY );
201 xPeerView->setGraphics( mxGraphics );
205 setPosSize( maComponentInfos.nX, maComponentInfos.nY, maComponentInfos.nWidth, maComponentInfos.nHeight, PosSize::POSSIZE );
207 pPeer->setVisible ( maComponentInfos.bVisible && !mbDesignMode );
208 pPeer->setEnable ( maComponentInfos.bEnable );
209 pPeer->setDesignMode( mbDesignMode );
214 mbCreatingPeer =
false;
219 return "com.sun.star.comp.form.ORichTextControl";
224 return {
"com.sun.star.awt.UnoControl",
225 "com.sun.star.awt.UnoControlEdit",
231 Reference< XDispatch > aReturn;
232 Reference< XDispatchProvider > xTypedPeer( getPeer(), UNO_QUERY );
233 if ( xTypedPeer.is() )
235 aReturn = xTypedPeer->queryDispatch( _rURL, _rTargetFrameName, _nSearchFlags );
242 Reference<XDispatchProvider> xTypedPeer(getPeer(), UNO_QUERY);
244 return xTypedPeer->queryDispatches(_rRequests);
245 return Sequence<Reference<XDispatch>>();
260 OSL_ENSURE( pEngine,
"ORichTextPeer::Create: could not obtain the edit engine from the model!" );
271 pRichTextControl->SetComponentInterface( pPeer );
294 if ( pRichTextControl )
298 pRichTextControl->disableAttributeNotification(dispatcher.first);
299 dispatcher.second->dispose();
319 OSL_ENSURE( pTargetDevice !=
nullptr,
"ORichTextPeer::draw: no graphics -> no drawing!" );
320 if ( !pTargetDevice )
326 if ( eTargetUnit != MapUnit::MapPixel )
329 pControl->Draw( pTargetDevice, aPos, SystemTextColorFlags::NoControls );
346 if ( !_rValue.hasValue() )
348 pControl->SetBackgroundColor( );
354 pControl->SetBackgroundColor( nColor );
372 bool bReadOnly( pControl->IsReadOnly() );
379 dispatcher.second->invalidate();
385 bool bHide = pRichTextControl->GetHideInactiveSelection();
386 OSL_VERIFY( _rValue >>= bHide );
387 pRichTextControl->SetHideInactiveSelection( bHide );
420 switch ( _nIDFromPool )
423 nReturn = SID_SET_SUPER_SCRIPT;
426 nReturn = SID_SET_SUB_SCRIPT;
437 OSL_PRECOND( pRichTextControl,
"ORichTextPeer::implCreateDispatcher: invalid window!" );
438 if ( !pRichTextControl )
461 case SID_ATTR_PARA_LEFT_TO_RIGHT:
462 case SID_ATTR_PARA_RIGHT_TO_LEFT:
466 case SID_TEXTDIRECTION_TOP_TO_BOTTOM:
467 case SID_TEXTDIRECTION_LEFT_TO_RIGHT:
471 case SID_ATTR_PARA_HANGPUNCTUATION:
472 case SID_ATTR_PARA_FORBIDDEN_RULES:
473 case SID_ATTR_PARA_SCRIPTSPACE:
479 const SfxItemPool& rPool = *pRichTextControl->getView().GetEmptyItemSet().GetPool();
482 if ( !bSupportedSlot )
485 if ( bSupportedSlot )
488 bool bNeedParametrizedDispatcher =
true;
489 if ( ( _nSlotId == SID_ATTR_CHAR_POSTURE )
490 || ( _nSlotId == SID_ATTR_CHAR_CJK_POSTURE )
491 || ( _nSlotId == SID_ATTR_CHAR_CTL_POSTURE )
492 || ( _nSlotId == SID_ATTR_CHAR_LATIN_POSTURE )
493 || ( _nSlotId == SID_ATTR_CHAR_WEIGHT )
494 || ( _nSlotId == SID_ATTR_CHAR_CJK_WEIGHT )
495 || ( _nSlotId == SID_ATTR_CHAR_CTL_WEIGHT )
496 || ( _nSlotId == SID_ATTR_CHAR_LATIN_WEIGHT )
497 || ( _nSlotId == SID_ATTR_CHAR_LANGUAGE )
498 || ( _nSlotId == SID_ATTR_CHAR_CJK_LANGUAGE )
499 || ( _nSlotId == SID_ATTR_CHAR_CTL_LANGUAGE )
500 || ( _nSlotId == SID_ATTR_CHAR_LATIN_LANGUAGE )
501 || ( _nSlotId == SID_ATTR_CHAR_CONTOUR )
502 || ( _nSlotId == SID_ATTR_CHAR_SHADOWED )
503 || ( _nSlotId == SID_ATTR_CHAR_WORDLINEMODE )
504 || ( _nSlotId == SID_ATTR_CHAR_COLOR )
505 || ( _nSlotId == SID_ATTR_CHAR_RELIEF )
506 || ( _nSlotId == SID_ATTR_CHAR_KERNING )
507 || ( _nSlotId == SID_ATTR_CHAR_AUTOKERN )
508 || ( _nSlotId == SID_ATTR_CHAR_SCALEWIDTH )
511 bNeedParametrizedDispatcher =
true;
520 bNeedParametrizedDispatcher = ( pType->
nAttribs > 0 );
524 if ( bNeedParametrizedDispatcher )
530 pAttributeDispatcher =
new OAttributeDispatcher( pRichTextControl->getView(), _nSlotId, _rURL, pRichTextControl );
535 SAL_WARN(
"forms.richtext",
"ORichTextPeer::implCreateDispatcher: not creating dispatcher (unsupported slot) for "
543 if ( pAttributeDispatcher )
546 pRichTextControl->enableAttributeNotification( _nSlotId, pAttributeDispatcher.get() );
555 SfxSlotId lcl_getSlotFromUnoName(
SfxSlotPool const & _rSlotPool,
const OUString& _rUnoSlotName )
561 return lcl_translateConflictingSlot( pSlot->
GetSlotId() );
566 if ( _rUnoSlotName ==
"AllowHangingPunctuation" )
567 return SID_ATTR_PARA_HANGPUNCTUATION;
568 if ( _rUnoSlotName ==
"ApplyForbiddenCharacterRules" )
569 return SID_ATTR_PARA_FORBIDDEN_RULES;
570 if ( _rUnoSlotName ==
"UseScriptSpacing" )
571 return SID_ATTR_PARA_SCRIPTSPACE;
573 OSL_ENSURE( pSlot,
"lcl_getSlotFromUnoName: unknown UNO slot name!" );
581 Reference< XDispatch > xReturn;
584 OSL_FAIL(
"ORichTextPeer::queryDispatch: already disposed?" );
589 static constexpr std::u16string_view sUnoProtocolPrefix(
u".uno:" );
590 if ( _rURL.Complete.startsWith( sUnoProtocolPrefix ) )
592 OUString sUnoSlotName = _rURL.Complete.copy( sUnoProtocolPrefix.size() );
597 AttributeDispatchers::const_iterator aDispatcherPos =
m_aDispatchers.find( nSlotId );
601 if ( pDispatcher.is() )
603 aDispatcherPos =
m_aDispatchers.emplace( nSlotId, pDispatcher ).first;
608 xReturn = aDispatcherPos->second.get();
618 Sequence< Reference< XDispatch > > aReturn( _rRequests.getLength() );
619 Reference< XDispatch >* pReturn = aReturn.getArray();
621 const DispatchDescriptor* pRequest = _rRequests.getConstArray();
622 const DispatchDescriptor* pRequestEnd = pRequest + _rRequests.getLength();
623 for ( ; pRequest != pRequestEnd; ++pRequest, ++pReturn )
625 *pReturn =
queryDispatch( pRequest->FeatureURL, pRequest->FrameName, pRequest->SearchFlags );
633 AttributeDispatchers::iterator aDispatcherPos =
m_aDispatchers.find( SID_COPY );
635 aDispatcherPos->second->invalidate();
639 aDispatcherPos->second->invalidate();
645extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface*
647 css::uno::Sequence<css::uno::Any>
const &)
MapUnit GetMapUnit() const
SAL_WARN_UNUSED_RESULT Point PixelToLogic(const Point &rDevicePt) const
const MapMode & GetMapMode() const
sal_uInt16 GetWhich(sal_uInt16 nSlot, bool bDeep=true) const
bool IsInRange(sal_uInt16 nWhich) const
static SfxSlotPool & GetSlotPool(SfxViewFrame *pFrame=nullptr)
const SfxSlot * GetSlot(sal_uInt16 nId) const
const SfxSlot * GetUnoSlot(const OUString &rUnoName) const
sal_uInt16 GetSlotId() const
const SfxType * GetType() const
virtual bool requiresNewPeer(const OUString &_rPropertyName) const
static OutputDevice * GetOutputDevice(const css::uno::Reference< css::awt::XDevice > &rxDevice)
vcl::Window * GetWindow() const
css::uno::Reference< css::awt::XGraphics > SAL_CALL getGraphics() override
void SAL_CALL setProperty(const OUString &PropertyName, const css::uno::Any &Value) override
void SAL_CALL dispose() override
virtual css::uno::Any SAL_CALL queryInterface(css::uno::Type const &rType) SAL_OVERRIDE
virtual css::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames() override
virtual css::uno::Reference< css::frame::XDispatch > SAL_CALL queryDispatch(const css::util::URL &_rURL, const OUString &_rTargetFrameName, sal_Int32 _rSearchFlags) override
virtual void SAL_CALL createPeer(const css::uno::Reference< css::awt::XToolkit > &_rToolkit, const css::uno::Reference< css::awt::XWindowPeer > &_rParent) override
virtual OUString SAL_CALL getImplementationName() override
virtual ~ORichTextControl() override
virtual bool requiresNewPeer(const OUString &_rPropertyName) const override
virtual css::uno::Sequence< css::uno::Reference< css::frame::XDispatch > > SAL_CALL queryDispatches(const css::uno::Sequence< css::frame::DispatchDescriptor > &Requests) override
static RichTextEngine * getEditEngine(const css::uno::Reference< css::awt::XControlModel > &_rxModel)
virtual css::uno::Reference< css::frame::XDispatch > SAL_CALL queryDispatch(const css::util::URL &_rURL, const OUString &_rTargetFrameName, sal_Int32 _rSearchFlags) override
AttributeDispatchers m_aDispatchers
virtual void SAL_CALL dispose() override
virtual void onSelectionChanged() override
virtual void SAL_CALL setProperty(const OUString &_rPropertyName, const css::uno::Any &_rValue) override
rtl::Reference< ORichTextFeatureDispatcher > SingleAttributeDispatcher
virtual ~ORichTextPeer() override
SingleAttributeDispatcher implCreateDispatcher(SfxSlotId _nSlotId, const css::util::URL &_rURL)
virtual css::uno::Sequence< css::uno::Reference< css::frame::XDispatch > > SAL_CALL queryDispatches(const css::uno::Sequence< css::frame::DispatchDescriptor > &Requests) override
void SAL_CALL draw(sal_Int32 nX, sal_Int32 nY) override
::std::map< SfxSlotId, SingleAttributeDispatcher > AttributeDispatchers
static rtl::Reference< ORichTextPeer > Create(const css::uno::Reference< css::awt::XControlModel > &_rxModel, vcl::Window *_pParentWindow, WinBits _nStyle)
factory method
static bool isMappableSlot(SfxSlotId _nSlotId)
determines whether a given slot can be mapped to an aspect of an attribute of the EditEngine
void SetStyle(WinBits nStyle)
constexpr ::Color COL_TRANSPARENT(ColorTransparency, 0xFF, 0xFF, 0xFF, 0xFF)
#define DBG_ASSERT(sCon, aError)
#define DBG_TESTSOLARMUTEX()
#define DBG_UNHANDLED_EXCEPTION(...)
constexpr OUStringLiteral PROPERTY_READONLY
constexpr OUStringLiteral PROPERTY_BACKGROUNDCOLOR
constexpr OUStringLiteral PROPERTY_VSCROLL
constexpr OUStringLiteral PROPERTY_HSCROLL
constexpr OUStringLiteral PROPERTY_HARDLINEBREAKS
constexpr OUStringLiteral PROPERTY_TABSTOP
constexpr OUStringLiteral PROPERTY_HIDEINACTIVESELECTION
constexpr OUStringLiteral PROPERTY_RICH_TEXT
constexpr OUStringLiteral PROPERTY_BORDER
#define SAL_WARN(area, stream)
tools::Long const nBorder
ListBox is a bit confusing / different from other form components, so here are a few notes:
sal_uInt16 SfxSlotId
a SFX slot id
IMPLEMENT_FORWARD_XTYPEPROVIDER2(ChildWindowPane, ChildWindowPaneInterfaceBase, Pane)
IMPLEMENT_FORWARD_XINTERFACE2(ChildWindowPane, ChildWindowPaneInterfaceBase, Pane)
SAL_DLLPUBLIC_EXPORT css::uno::XInterface * com_sun_star_comp_form_ORichTextControl_get_implementation(css::uno::XComponentContext *, css::uno::Sequence< css::uno::Any > const &)
constexpr OUStringLiteral FRM_SUN_CONTROL_RICHTEXTCONTROL
Reference< XModel > xModel
WinBits const WB_WORDBREAK