1*24acc546SAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3*24acc546SAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*24acc546SAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*24acc546SAndrew Rist  * distributed with this work for additional information
6*24acc546SAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*24acc546SAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*24acc546SAndrew Rist  * "License"); you may not use this file except in compliance
9*24acc546SAndrew Rist  * with the License.  You may obtain a copy of the License at
10*24acc546SAndrew Rist  *
11*24acc546SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12*24acc546SAndrew Rist  *
13*24acc546SAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*24acc546SAndrew Rist  * software distributed under the License is distributed on an
15*24acc546SAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*24acc546SAndrew Rist  * KIND, either express or implied.  See the License for the
17*24acc546SAndrew Rist  * specific language governing permissions and limitations
18*24acc546SAndrew Rist  * under the License.
19*24acc546SAndrew Rist  *
20*24acc546SAndrew Rist  *************************************************************/
21*24acc546SAndrew Rist 
22*24acc546SAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_forms.hxx"
26cdf0e10cSrcweir #include "richtextengine.hxx"
27cdf0e10cSrcweir #include <svl/itempool.hxx>
28cdf0e10cSrcweir #include <editeng/eeitem.hxx>
29cdf0e10cSrcweir #include <editeng/editobj.hxx>
30cdf0e10cSrcweir #define ITEMID_FONTHEIGHT   EE_CHAR_FONTHEIGHT
31cdf0e10cSrcweir #include <editeng/fhgtitem.hxx>
32cdf0e10cSrcweir #define ITEMID_FONT         EE_CHAR_FONTHEIGHT
33cdf0e10cSrcweir #include <editeng/fontitem.hxx>
34cdf0e10cSrcweir #define ITEMID_LANGUAGE     EE_CHAR_LANGUAGE
35cdf0e10cSrcweir #include <editeng/langitem.hxx>
36cdf0e10cSrcweir #include <vcl/svapp.hxx>
37cdf0e10cSrcweir #include <tools/mapunit.hxx>
38cdf0e10cSrcweir #include <vcl/mapmod.hxx>
39cdf0e10cSrcweir #include <vcl/outdev.hxx>
40cdf0e10cSrcweir #include <unotools/lingucfg.hxx>
41cdf0e10cSrcweir #include <svl/undo.hxx>
42cdf0e10cSrcweir #include <vos/mutex.hxx>
43cdf0e10cSrcweir 
44cdf0e10cSrcweir #include <algorithm>
45cdf0e10cSrcweir #include <functional>
46cdf0e10cSrcweir 
47cdf0e10cSrcweir //........................................................................
48cdf0e10cSrcweir namespace frm
49cdf0e10cSrcweir {
50cdf0e10cSrcweir //........................................................................
51cdf0e10cSrcweir 
52cdf0e10cSrcweir 	//====================================================================
53cdf0e10cSrcweir 	//= RichTextEngine
54cdf0e10cSrcweir 	//====================================================================
55cdf0e10cSrcweir 	//--------------------------------------------------------------------
Create()56cdf0e10cSrcweir     RichTextEngine* RichTextEngine::Create()
57cdf0e10cSrcweir     {
58cdf0e10cSrcweir         SfxItemPool* pPool = EditEngine::CreatePool();
59cdf0e10cSrcweir 	    pPool->FreezeIdRanges();
60cdf0e10cSrcweir 
61cdf0e10cSrcweir         RichTextEngine* pReturn = new RichTextEngine( pPool );
62cdf0e10cSrcweir         OutputDevice* pOutputDevice = pReturn->GetRefDevice();
63cdf0e10cSrcweir 	    MapMode aDeviceMapMode( pOutputDevice->GetMapMode() );
64cdf0e10cSrcweir 
65cdf0e10cSrcweir         pReturn->SetStatusEventHdl( LINK( pReturn, RichTextEngine, EditEngineStatusChanged ) );
66cdf0e10cSrcweir 
67cdf0e10cSrcweir 	    pPool->SetDefaultMetric(  (SfxMapUnit)( aDeviceMapMode.GetMapUnit() ) );
68cdf0e10cSrcweir 
69cdf0e10cSrcweir         // defaults
70cdf0e10cSrcweir         Font aFont = Application::GetSettings().GetStyleSettings().GetAppFont();
71cdf0e10cSrcweir 	    aFont.SetName( String( RTL_CONSTASCII_USTRINGPARAM( "Times New Roman" ) ) );
72cdf0e10cSrcweir 	    pPool->SetPoolDefaultItem( SvxFontItem( aFont.GetFamily(), aFont.GetName(), String(), aFont.GetPitch(), aFont.GetCharSet(), EE_CHAR_FONTINFO ) );
73cdf0e10cSrcweir 
74cdf0e10cSrcweir         // 12 pt font size
75cdf0e10cSrcweir 	    MapMode aPointMapMode( MAP_POINT );
76cdf0e10cSrcweir         Size a12PointSize( OutputDevice::LogicToLogic( Size( 12, 0 ), aPointMapMode, aDeviceMapMode ) );
77cdf0e10cSrcweir 	    pPool->SetPoolDefaultItem( SvxFontHeightItem( a12PointSize.Width(), 100, EE_CHAR_FONTHEIGHT ) );
78cdf0e10cSrcweir 
79cdf0e10cSrcweir         // font languages
80cdf0e10cSrcweir         SvtLinguOptions aLinguOpt;
81cdf0e10cSrcweir 	    pPool->SetPoolDefaultItem( SvxLanguageItem( aLinguOpt.nDefaultLanguage, EE_CHAR_LANGUAGE ) );
82cdf0e10cSrcweir         pPool->SetPoolDefaultItem( SvxLanguageItem( aLinguOpt.nDefaultLanguage_CJK, EE_CHAR_LANGUAGE_CJK ) );
83cdf0e10cSrcweir         pPool->SetPoolDefaultItem( SvxLanguageItem( aLinguOpt.nDefaultLanguage_CTL, EE_CHAR_LANGUAGE_CTL ) );
84cdf0e10cSrcweir 
85cdf0e10cSrcweir         return pReturn;
86cdf0e10cSrcweir     }
87cdf0e10cSrcweir 
88cdf0e10cSrcweir 	//--------------------------------------------------------------------
Clone()89cdf0e10cSrcweir     RichTextEngine* RichTextEngine::Clone()
90cdf0e10cSrcweir     {
91cdf0e10cSrcweir         RichTextEngine* pClone( NULL );
92cdf0e10cSrcweir         {
93cdf0e10cSrcweir             ::vos::OGuard aGuard( Application::GetSolarMutex() );
94cdf0e10cSrcweir             EditTextObject* pMyText = CreateTextObject();
95cdf0e10cSrcweir             OSL_ENSURE( pMyText, "RichTextEngine::Clone: CreateTextObject returned nonsense!" );
96cdf0e10cSrcweir 
97cdf0e10cSrcweir             pClone = Create();
98cdf0e10cSrcweir 
99cdf0e10cSrcweir             if ( pMyText )
100cdf0e10cSrcweir                 pClone->SetText( *pMyText );
101cdf0e10cSrcweir             delete pMyText;
102cdf0e10cSrcweir         }
103cdf0e10cSrcweir 
104cdf0e10cSrcweir         return pClone;
105cdf0e10cSrcweir     }
106cdf0e10cSrcweir 
DBG_NAME(RichTextEngine)107cdf0e10cSrcweir     DBG_NAME(RichTextEngine)
108cdf0e10cSrcweir 	//--------------------------------------------------------------------
109cdf0e10cSrcweir     RichTextEngine::RichTextEngine( SfxItemPool* _pPool )
110cdf0e10cSrcweir         :EditEngine( _pPool )
111cdf0e10cSrcweir         ,m_pEnginePool( _pPool )
112cdf0e10cSrcweir     {
113cdf0e10cSrcweir         DBG_CTOR(RichTextEngine,NULL);
114cdf0e10cSrcweir     }
115cdf0e10cSrcweir 
116cdf0e10cSrcweir 	//--------------------------------------------------------------------
~RichTextEngine()117cdf0e10cSrcweir     RichTextEngine::~RichTextEngine( )
118cdf0e10cSrcweir     {
119cdf0e10cSrcweir         //delete m_pEnginePool; // must be done after the RichTextEngine was deleted
120cdf0e10cSrcweir         DBG_DTOR(RichTextEngine,NULL);
121cdf0e10cSrcweir     }
122cdf0e10cSrcweir 
123cdf0e10cSrcweir 	//--------------------------------------------------------------------
registerEngineStatusListener(IEngineStatusListener * _pListener)124cdf0e10cSrcweir     void RichTextEngine::registerEngineStatusListener( IEngineStatusListener* _pListener )
125cdf0e10cSrcweir     {
126cdf0e10cSrcweir         OSL_ENSURE( _pListener, "RichTextEngine::registerEngineStatusListener: invalid listener!" );
127cdf0e10cSrcweir         if ( _pListener )
128cdf0e10cSrcweir             m_aStatusListeners.push_back( _pListener );
129cdf0e10cSrcweir     }
130cdf0e10cSrcweir 
131cdf0e10cSrcweir 	//--------------------------------------------------------------------
revokeEngineStatusListener(IEngineStatusListener * _pListener)132cdf0e10cSrcweir     void RichTextEngine::revokeEngineStatusListener( IEngineStatusListener* _pListener )
133cdf0e10cSrcweir     {
134cdf0e10cSrcweir         ::std::vector< IEngineStatusListener* >::iterator aPos = ::std::find_if(
135cdf0e10cSrcweir             m_aStatusListeners.begin(),
136cdf0e10cSrcweir             m_aStatusListeners.end(),
137cdf0e10cSrcweir             ::std::bind2nd( ::std::equal_to< IEngineStatusListener* >( ), _pListener )
138cdf0e10cSrcweir         );
139cdf0e10cSrcweir         OSL_ENSURE( aPos != m_aStatusListeners.end(), "RichTextEngine::revokeEngineStatusListener: listener not registered!" );
140cdf0e10cSrcweir         if ( aPos != m_aStatusListeners.end() )
141cdf0e10cSrcweir             m_aStatusListeners.erase( aPos );
142cdf0e10cSrcweir     }
143cdf0e10cSrcweir 
144cdf0e10cSrcweir     //--------------------------------------------------------------------
IMPL_LINK(RichTextEngine,EditEngineStatusChanged,EditStatus *,_pStatus)145cdf0e10cSrcweir     IMPL_LINK( RichTextEngine, EditEngineStatusChanged, EditStatus*, _pStatus )
146cdf0e10cSrcweir     {
147cdf0e10cSrcweir         for ( ::std::vector< IEngineStatusListener* >::const_iterator aLoop = m_aStatusListeners.begin();
148cdf0e10cSrcweir               aLoop != m_aStatusListeners.end();
149cdf0e10cSrcweir               ++aLoop
150cdf0e10cSrcweir             )
151cdf0e10cSrcweir             (*aLoop)->EditEngineStatusChanged( *_pStatus );
152cdf0e10cSrcweir         return 0L;
153cdf0e10cSrcweir     }
154cdf0e10cSrcweir 
155cdf0e10cSrcweir //........................................................................
156cdf0e10cSrcweir }   // namespace frm
157cdf0e10cSrcweir //........................................................................
158cdf0e10cSrcweir 
159