1*b1cdbd2cSJim Jagielski /************************************************************** 2*b1cdbd2cSJim Jagielski * 3*b1cdbd2cSJim Jagielski * Licensed to the Apache Software Foundation (ASF) under one 4*b1cdbd2cSJim Jagielski * or more contributor license agreements. See the NOTICE file 5*b1cdbd2cSJim Jagielski * distributed with this work for additional information 6*b1cdbd2cSJim Jagielski * regarding copyright ownership. The ASF licenses this file 7*b1cdbd2cSJim Jagielski * to you under the Apache License, Version 2.0 (the 8*b1cdbd2cSJim Jagielski * "License"); you may not use this file except in compliance 9*b1cdbd2cSJim Jagielski * with the License. You may obtain a copy of the License at 10*b1cdbd2cSJim Jagielski * 11*b1cdbd2cSJim Jagielski * http://www.apache.org/licenses/LICENSE-2.0 12*b1cdbd2cSJim Jagielski * 13*b1cdbd2cSJim Jagielski * Unless required by applicable law or agreed to in writing, 14*b1cdbd2cSJim Jagielski * software distributed under the License is distributed on an 15*b1cdbd2cSJim Jagielski * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*b1cdbd2cSJim Jagielski * KIND, either express or implied. See the License for the 17*b1cdbd2cSJim Jagielski * specific language governing permissions and limitations 18*b1cdbd2cSJim Jagielski * under the License. 19*b1cdbd2cSJim Jagielski * 20*b1cdbd2cSJim Jagielski *************************************************************/ 21*b1cdbd2cSJim Jagielski 22*b1cdbd2cSJim Jagielski 23*b1cdbd2cSJim Jagielski #ifndef FORMS_SOURCE_RICHTEXT_RICHTEXTIMPLCONTOL_HXX 24*b1cdbd2cSJim Jagielski #define FORMS_SOURCE_RICHTEXT_RICHTEXTIMPLCONTOL_HXX 25*b1cdbd2cSJim Jagielski 26*b1cdbd2cSJim Jagielski #include "rtattributehandler.hxx" 27*b1cdbd2cSJim Jagielski #include "richtextviewport.hxx" 28*b1cdbd2cSJim Jagielski #include "richtextengine.hxx" 29*b1cdbd2cSJim Jagielski #include <vcl/scrbar.hxx> 30*b1cdbd2cSJim Jagielski #include <editeng/editdata.hxx> 31*b1cdbd2cSJim Jagielski 32*b1cdbd2cSJim Jagielski #include <map> 33*b1cdbd2cSJim Jagielski 34*b1cdbd2cSJim Jagielski class EditView; 35*b1cdbd2cSJim Jagielski class EditStatus; 36*b1cdbd2cSJim Jagielski class Window; 37*b1cdbd2cSJim Jagielski class SvxScriptSetItem; 38*b1cdbd2cSJim Jagielski //........................................................................ 39*b1cdbd2cSJim Jagielski namespace frm 40*b1cdbd2cSJim Jagielski { 41*b1cdbd2cSJim Jagielski //........................................................................ 42*b1cdbd2cSJim Jagielski 43*b1cdbd2cSJim Jagielski class ITextAttributeListener; 44*b1cdbd2cSJim Jagielski class ITextSelectionListener; 45*b1cdbd2cSJim Jagielski class RichTextViewPort; 46*b1cdbd2cSJim Jagielski //==================================================================== 47*b1cdbd2cSJim Jagielski //= RichTextControlImpl 48*b1cdbd2cSJim Jagielski //==================================================================== 49*b1cdbd2cSJim Jagielski class RichTextControlImpl : public IEngineStatusListener 50*b1cdbd2cSJim Jagielski { 51*b1cdbd2cSJim Jagielski typedef ::std::map< AttributeId, AttributeState > StateCache; 52*b1cdbd2cSJim Jagielski typedef ::std::map< AttributeId, ::rtl::Reference< IAttributeHandler > > AttributeHandlerPool; 53*b1cdbd2cSJim Jagielski typedef ::std::map< AttributeId, ITextAttributeListener* > AttributeListenerPool; 54*b1cdbd2cSJim Jagielski 55*b1cdbd2cSJim Jagielski StateCache m_aLastKnownStates; 56*b1cdbd2cSJim Jagielski AttributeHandlerPool m_aAttributeHandlers; 57*b1cdbd2cSJim Jagielski AttributeListenerPool m_aAttributeListeners; 58*b1cdbd2cSJim Jagielski 59*b1cdbd2cSJim Jagielski ESelection m_aLastKnownSelection; 60*b1cdbd2cSJim Jagielski 61*b1cdbd2cSJim Jagielski Control* m_pAntiImpl; 62*b1cdbd2cSJim Jagielski RichTextViewPort* m_pViewport; 63*b1cdbd2cSJim Jagielski ScrollBar* m_pHScroll; 64*b1cdbd2cSJim Jagielski ScrollBar* m_pVScroll; 65*b1cdbd2cSJim Jagielski ScrollBarBox* m_pScrollCorner; 66*b1cdbd2cSJim Jagielski RichTextEngine* m_pEngine; 67*b1cdbd2cSJim Jagielski EditView* m_pView; 68*b1cdbd2cSJim Jagielski ITextAttributeListener* m_pTextAttrListener; 69*b1cdbd2cSJim Jagielski ITextSelectionListener* m_pSelectionListener; 70*b1cdbd2cSJim Jagielski bool m_bHasEverBeenShown; 71*b1cdbd2cSJim Jagielski 72*b1cdbd2cSJim Jagielski public: GrantAccessfrm::RichTextControlImpl::GrantAccess73*b1cdbd2cSJim Jagielski struct GrantAccess { friend class RichTextControl; private: GrantAccess() { } }; getView(const GrantAccess &) const74*b1cdbd2cSJim Jagielski inline EditView* getView( const GrantAccess& ) const { return m_pView; } getEngine(const GrantAccess &) const75*b1cdbd2cSJim Jagielski inline RichTextEngine* getEngine( const GrantAccess& ) const { return m_pEngine; } getViewport(const GrantAccess &) const76*b1cdbd2cSJim Jagielski inline Window* getViewport( const GrantAccess& ) const { return m_pViewport; } 77*b1cdbd2cSJim Jagielski 78*b1cdbd2cSJim Jagielski public: 79*b1cdbd2cSJim Jagielski RichTextControlImpl( Control* _pAntiImpl, RichTextEngine* _pEngine, 80*b1cdbd2cSJim Jagielski ITextAttributeListener* _pTextAttrListener, ITextSelectionListener* _pSelectionListener ); 81*b1cdbd2cSJim Jagielski virtual ~RichTextControlImpl(); 82*b1cdbd2cSJim Jagielski 83*b1cdbd2cSJim Jagielski /** updates the cache with the state of all attribute values from the given set, notifies 84*b1cdbd2cSJim Jagielski the listener if the state changed 85*b1cdbd2cSJim Jagielski */ 86*b1cdbd2cSJim Jagielski void updateAllAttributes( ); 87*b1cdbd2cSJim Jagielski 88*b1cdbd2cSJim Jagielski /** updates the cache with the state of the attribute given by which id, notifies 89*b1cdbd2cSJim Jagielski the listener if the state changed 90*b1cdbd2cSJim Jagielski */ 91*b1cdbd2cSJim Jagielski void updateAttribute( AttributeId _nAttribute ); 92*b1cdbd2cSJim Jagielski 93*b1cdbd2cSJim Jagielski /// enables the callback for a particular attribute 94*b1cdbd2cSJim Jagielski void enableAttributeNotification( AttributeId _nAttributeId, ITextAttributeListener* _pListener = NULL ); 95*b1cdbd2cSJim Jagielski 96*b1cdbd2cSJim Jagielski /// disables the change notifications for a particular attribute 97*b1cdbd2cSJim Jagielski void disableAttributeNotification( AttributeId _nAttributeId ); 98*b1cdbd2cSJim Jagielski 99*b1cdbd2cSJim Jagielski /// executes a toggle of the given attribute 100*b1cdbd2cSJim Jagielski bool executeAttribute( const SfxItemSet& _rCurrentAttribs, SfxItemSet& _rNewAttribs, AttributeId _nAttribute, const SfxPoolItem* _pArgument, ScriptType _nForScriptType ); 101*b1cdbd2cSJim Jagielski 102*b1cdbd2cSJim Jagielski /// retrieves the state of the given attribute from the cache 103*b1cdbd2cSJim Jagielski AttributeState getAttributeState( AttributeId _nAttributeId ) const; 104*b1cdbd2cSJim Jagielski 105*b1cdbd2cSJim Jagielski /** normalizes the given item so that the state of script dependent attributes 106*b1cdbd2cSJim Jagielski is correct considering the current script type 107*b1cdbd2cSJim Jagielski 108*b1cdbd2cSJim Jagielski There are some attributes which are script dependent, e.g. the CharPosture. This means 109*b1cdbd2cSJim Jagielski that in real, there are 3 attributes for this, one for every possible script type (latin, 110*b1cdbd2cSJim Jagielski asian, complex). However, to the out world, we behave as if there is only one attribute: 111*b1cdbd2cSJim Jagielski E.g., if the outter world asks for the state of the "CharPosture" attribute, we return 112*b1cdbd2cSJim Jagielski the state of either CharPostureLatin, CharPostureAsian, or CharPostureComplex, depending 113*b1cdbd2cSJim Jagielski on the script type of the current selection. (In real, it may be more complex since 114*b1cdbd2cSJim Jagielski the current selection may contain more than one script type.) 115*b1cdbd2cSJim Jagielski 116*b1cdbd2cSJim Jagielski This method normalizes a script dependent attribute, so that it's state takes into account 117*b1cdbd2cSJim Jagielski the currently selected script type. 118*b1cdbd2cSJim Jagielski */ 119*b1cdbd2cSJim Jagielski void normalizeScriptDependentAttribute( SvxScriptSetItem& _rScriptSetItem ); 120*b1cdbd2cSJim Jagielski 121*b1cdbd2cSJim Jagielski // gets the script type of the selection in our edit view (with fallback) 122*b1cdbd2cSJim Jagielski ScriptType getSelectedScriptType() const; 123*b1cdbd2cSJim Jagielski 124*b1cdbd2cSJim Jagielski /** re-arranges the view and the scrollbars 125*b1cdbd2cSJim Jagielski */ 126*b1cdbd2cSJim Jagielski void layoutWindow(); 127*b1cdbd2cSJim Jagielski 128*b1cdbd2cSJim Jagielski /** to be called when the style of our window changed 129*b1cdbd2cSJim Jagielski */ 130*b1cdbd2cSJim Jagielski void notifyStyleChanged(); 131*b1cdbd2cSJim Jagielski 132*b1cdbd2cSJim Jagielski /** to be called when the zoom of our window changed 133*b1cdbd2cSJim Jagielski */ 134*b1cdbd2cSJim Jagielski void notifyZoomChanged(); 135*b1cdbd2cSJim Jagielski 136*b1cdbd2cSJim Jagielski /** to be called when the STATE_CHANGE_INITSHOW event arrives 137*b1cdbd2cSJim Jagielski */ 138*b1cdbd2cSJim Jagielski void notifyInitShow(); 139*b1cdbd2cSJim Jagielski 140*b1cdbd2cSJim Jagielski // VCL "overrides" 141*b1cdbd2cSJim Jagielski void SetBackgroundColor( ); 142*b1cdbd2cSJim Jagielski void SetBackgroundColor( const Color& _rColor ); 143*b1cdbd2cSJim Jagielski 144*b1cdbd2cSJim Jagielski void SetReadOnly( bool _bReadOnly ); 145*b1cdbd2cSJim Jagielski bool IsReadOnly() const; 146*b1cdbd2cSJim Jagielski 147*b1cdbd2cSJim Jagielski void SetHideInactiveSelection( bool _bHide ); 148*b1cdbd2cSJim Jagielski bool GetHideInactiveSelection() const; 149*b1cdbd2cSJim Jagielski 150*b1cdbd2cSJim Jagielski /// draws the control onto a given output device 151*b1cdbd2cSJim Jagielski void Draw( OutputDevice* _pDev, const Point& _rPos, const Size& _rSize, sal_uLong _nFlags ); 152*b1cdbd2cSJim Jagielski 153*b1cdbd2cSJim Jagielski /// handles command events arrived at the anti-impl control 154*b1cdbd2cSJim Jagielski long HandleCommand( const CommandEvent& _rEvent ); 155*b1cdbd2cSJim Jagielski 156*b1cdbd2cSJim Jagielski private: 157*b1cdbd2cSJim Jagielski // updates the cache with the state provided by the given attribut handler 158*b1cdbd2cSJim Jagielski void implUpdateAttribute( AttributeHandlerPool::const_iterator _pHandler ); 159*b1cdbd2cSJim Jagielski 160*b1cdbd2cSJim Jagielski // updates the cache with the given state, and calls listeners (if necessary) 161*b1cdbd2cSJim Jagielski void implCheckUpdateCache( AttributeId _nAttribute, const AttributeState& _rState ); 162*b1cdbd2cSJim Jagielski 163*b1cdbd2cSJim Jagielski // updates range and position of our scrollbars 164*b1cdbd2cSJim Jagielski void updateScrollbars(); 165*b1cdbd2cSJim Jagielski 166*b1cdbd2cSJim Jagielski // determines whether automatic (soft) line breaks are ON 167*b1cdbd2cSJim Jagielski bool windowHasAutomaticLineBreak(); 168*b1cdbd2cSJim Jagielski 169*b1cdbd2cSJim Jagielski /// hides or shows our scrollbars, according to the current WinBits of the window 170*b1cdbd2cSJim Jagielski void ensureScrollbars(); 171*b1cdbd2cSJim Jagielski 172*b1cdbd2cSJim Jagielski /// ensures that our "automatic line break" setting matches the current WinBits of the window 173*b1cdbd2cSJim Jagielski void ensureLineBreakSetting(); 174*b1cdbd2cSJim Jagielski hasVScrollBar() const175*b1cdbd2cSJim Jagielski inline bool hasVScrollBar( ) const { return m_pVScroll != NULL; } hasHScrollBar() const176*b1cdbd2cSJim Jagielski inline bool hasHScrollBar( ) const { return m_pHScroll != NULL; } 177*b1cdbd2cSJim Jagielski 178*b1cdbd2cSJim Jagielski // IEngineStatusListener overridables 179*b1cdbd2cSJim Jagielski virtual void EditEngineStatusChanged( const EditStatus& _rStatus ); 180*b1cdbd2cSJim Jagielski 181*b1cdbd2cSJim Jagielski private: 182*b1cdbd2cSJim Jagielski DECL_LINK( OnInvalidateAllAttributes, void* ); 183*b1cdbd2cSJim Jagielski DECL_LINK( OnHScroll, ScrollBar* ); 184*b1cdbd2cSJim Jagielski DECL_LINK( OnVScroll, ScrollBar* ); 185*b1cdbd2cSJim Jagielski }; 186*b1cdbd2cSJim Jagielski 187*b1cdbd2cSJim Jagielski //........................................................................ 188*b1cdbd2cSJim Jagielski } // namespace frm 189*b1cdbd2cSJim Jagielski //........................................................................ 190*b1cdbd2cSJim Jagielski 191*b1cdbd2cSJim Jagielski #endif // FORMS_SOURCE_RICHTEXT_RICHTEXTIMPLCONTOL_HXX 192*b1cdbd2cSJim Jagielski 193