xref: /aoo4110/main/sw/source/ui/docvw/srcedtw.cxx (revision b1cdbd2c)
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 
24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_sw.hxx"
26*b1cdbd2cSJim Jagielski 
27*b1cdbd2cSJim Jagielski 
28*b1cdbd2cSJim Jagielski #include <hintids.hxx>
29*b1cdbd2cSJim Jagielski #ifndef _CMDID_H
30*b1cdbd2cSJim Jagielski #include <cmdid.h>
31*b1cdbd2cSJim Jagielski #endif
32*b1cdbd2cSJim Jagielski 
33*b1cdbd2cSJim Jagielski 
34*b1cdbd2cSJim Jagielski #include <svtools/textview.hxx>
35*b1cdbd2cSJim Jagielski #ifndef _SVX_SVXIDS_HRC
36*b1cdbd2cSJim Jagielski #include <svx/svxids.hrc>
37*b1cdbd2cSJim Jagielski #endif
38*b1cdbd2cSJim Jagielski #ifndef _SCRBAR_HXX //autogen
39*b1cdbd2cSJim Jagielski #include <vcl/scrbar.hxx>
40*b1cdbd2cSJim Jagielski #endif
41*b1cdbd2cSJim Jagielski #include <sfx2/dispatch.hxx>
42*b1cdbd2cSJim Jagielski #include <sfx2/app.hxx>
43*b1cdbd2cSJim Jagielski #include <svtools/htmltokn.h>
44*b1cdbd2cSJim Jagielski #include <svtools/txtattr.hxx>
45*b1cdbd2cSJim Jagielski #include <unotools/sourceviewconfig.hxx>
46*b1cdbd2cSJim Jagielski #include <svtools/colorcfg.hxx>
47*b1cdbd2cSJim Jagielski #include <editeng/flstitem.hxx>
48*b1cdbd2cSJim Jagielski #include <vcl/metric.hxx>
49*b1cdbd2cSJim Jagielski #include <svtools/ctrltool.hxx>
50*b1cdbd2cSJim Jagielski #include <tools/time.hxx>
51*b1cdbd2cSJim Jagielski #include <swmodule.hxx>
52*b1cdbd2cSJim Jagielski #ifndef _DOCSH_HXX
53*b1cdbd2cSJim Jagielski #include <docsh.hxx>
54*b1cdbd2cSJim Jagielski #endif
55*b1cdbd2cSJim Jagielski #ifndef _SRCVIEW_HXX
56*b1cdbd2cSJim Jagielski #include <srcview.hxx>
57*b1cdbd2cSJim Jagielski #endif
58*b1cdbd2cSJim Jagielski #ifndef _HELPID_H
59*b1cdbd2cSJim Jagielski #include <helpid.h>
60*b1cdbd2cSJim Jagielski #endif
61*b1cdbd2cSJim Jagielski #include <deque>
62*b1cdbd2cSJim Jagielski 
63*b1cdbd2cSJim Jagielski 
64*b1cdbd2cSJim Jagielski 
65*b1cdbd2cSJim Jagielski struct SwTextPortion
66*b1cdbd2cSJim Jagielski {
67*b1cdbd2cSJim Jagielski 	sal_uInt16 nLine;
68*b1cdbd2cSJim Jagielski 	sal_uInt16 nStart, nEnd;
69*b1cdbd2cSJim Jagielski     svtools::ColorConfigEntry eType;
70*b1cdbd2cSJim Jagielski };
71*b1cdbd2cSJim Jagielski 
72*b1cdbd2cSJim Jagielski #define MAX_SYNTAX_HIGHLIGHT 20
73*b1cdbd2cSJim Jagielski #define MAX_HIGHLIGHTTIME 200
74*b1cdbd2cSJim Jagielski #define SYNTAX_HIGHLIGHT_TIMEOUT 200
75*b1cdbd2cSJim Jagielski 
76*b1cdbd2cSJim Jagielski typedef std::deque<SwTextPortion> SwTextPortions;
77*b1cdbd2cSJim Jagielski 
78*b1cdbd2cSJim Jagielski 
lcl_Highlight(const String & rSource,SwTextPortions & aPortionList)79*b1cdbd2cSJim Jagielski static void lcl_Highlight(const String& rSource, SwTextPortions& aPortionList)
80*b1cdbd2cSJim Jagielski {
81*b1cdbd2cSJim Jagielski 	const sal_Unicode cOpenBracket = '<';
82*b1cdbd2cSJim Jagielski 	const sal_Unicode cCloseBracket= '>';
83*b1cdbd2cSJim Jagielski 	const sal_Unicode cSlash		= '/';
84*b1cdbd2cSJim Jagielski 	const sal_Unicode cExclamation = '!';
85*b1cdbd2cSJim Jagielski 	const sal_Unicode cMinus		= '-';
86*b1cdbd2cSJim Jagielski 	const sal_Unicode cSpace		= ' ';
87*b1cdbd2cSJim Jagielski 	const sal_Unicode cTab			= 0x09;
88*b1cdbd2cSJim Jagielski 	const sal_Unicode cLF          = 0x0a;
89*b1cdbd2cSJim Jagielski 	const sal_Unicode cCR          = 0x0d;
90*b1cdbd2cSJim Jagielski 
91*b1cdbd2cSJim Jagielski 
92*b1cdbd2cSJim Jagielski 	const sal_uInt16 nStrLen = rSource.Len();
93*b1cdbd2cSJim Jagielski 	sal_uInt16 nInsert = 0;				// Number of inserted Portions
94*b1cdbd2cSJim Jagielski 	sal_uInt16 nActPos = 0;				// Position, at the '<' was found
95*b1cdbd2cSJim Jagielski 	sal_uInt16 nOffset = 0; 			// Offset of nActPos for '<'
96*b1cdbd2cSJim Jagielski 	sal_uInt16 nPortStart = USHRT_MAX; 	// For the TextPortion
97*b1cdbd2cSJim Jagielski 	sal_uInt16 nPortEnd  = 	0;  		//
98*b1cdbd2cSJim Jagielski 	SwTextPortion aText;
99*b1cdbd2cSJim Jagielski 	while(nActPos < nStrLen)
100*b1cdbd2cSJim Jagielski 	{
101*b1cdbd2cSJim Jagielski         svtools::ColorConfigEntry eFoundType = svtools::HTMLUNKNOWN;
102*b1cdbd2cSJim Jagielski 		if(rSource.GetChar(nActPos) == cOpenBracket && nActPos < nStrLen - 2 )
103*b1cdbd2cSJim Jagielski 		{
104*b1cdbd2cSJim Jagielski 			// 'leere' Portion einfuegen
105*b1cdbd2cSJim Jagielski 			if(nPortEnd < nActPos - 1 )
106*b1cdbd2cSJim Jagielski 			{
107*b1cdbd2cSJim Jagielski 				aText.nLine = 0;
108*b1cdbd2cSJim Jagielski 				// am Anfang nicht verschieben
109*b1cdbd2cSJim Jagielski 				aText.nStart = nPortEnd;
110*b1cdbd2cSJim Jagielski 				if(nInsert)
111*b1cdbd2cSJim Jagielski 					aText.nStart += 1;
112*b1cdbd2cSJim Jagielski 				aText.nEnd = nActPos - 1;
113*b1cdbd2cSJim Jagielski                 aText.eType = svtools::HTMLUNKNOWN;
114*b1cdbd2cSJim Jagielski 				aPortionList.push_back( aText );
115*b1cdbd2cSJim Jagielski                 nInsert++;
116*b1cdbd2cSJim Jagielski 			}
117*b1cdbd2cSJim Jagielski 			sal_Unicode cFollowFirst = rSource.GetChar((xub_StrLen)(nActPos + 1));
118*b1cdbd2cSJim Jagielski 			sal_Unicode cFollowNext = rSource.GetChar((xub_StrLen)(nActPos + 2));
119*b1cdbd2cSJim Jagielski 			if(cExclamation == cFollowFirst)
120*b1cdbd2cSJim Jagielski 			{
121*b1cdbd2cSJim Jagielski 				// "<!" SGML oder Kommentar
122*b1cdbd2cSJim Jagielski 				if(cMinus == cFollowNext &&
123*b1cdbd2cSJim Jagielski 					nActPos < nStrLen - 3 && cMinus == rSource.GetChar((xub_StrLen)(nActPos + 3)))
124*b1cdbd2cSJim Jagielski 				{
125*b1cdbd2cSJim Jagielski                     eFoundType = svtools::HTMLCOMMENT;
126*b1cdbd2cSJim Jagielski 				}
127*b1cdbd2cSJim Jagielski 				else
128*b1cdbd2cSJim Jagielski                     eFoundType = svtools::HTMLSGML;
129*b1cdbd2cSJim Jagielski 				nPortStart = nActPos;
130*b1cdbd2cSJim Jagielski 				nPortEnd = nActPos + 1;
131*b1cdbd2cSJim Jagielski 			}
132*b1cdbd2cSJim Jagielski 			else if(cSlash == cFollowFirst)
133*b1cdbd2cSJim Jagielski 			{
134*b1cdbd2cSJim Jagielski 				// "</" Slash ignorieren
135*b1cdbd2cSJim Jagielski 				nPortStart = nActPos;
136*b1cdbd2cSJim Jagielski 				nActPos++;
137*b1cdbd2cSJim Jagielski 				nOffset++;
138*b1cdbd2cSJim Jagielski 			}
139*b1cdbd2cSJim Jagielski             if(svtools::HTMLUNKNOWN == eFoundType)
140*b1cdbd2cSJim Jagielski 			{
141*b1cdbd2cSJim Jagielski 				//jetzt koennte hier ein keyword folgen
142*b1cdbd2cSJim Jagielski 				sal_uInt16 nSrchPos = nActPos;
143*b1cdbd2cSJim Jagielski 				while(++nSrchPos < nStrLen - 1)
144*b1cdbd2cSJim Jagielski 				{
145*b1cdbd2cSJim Jagielski 					sal_Unicode cNext = rSource.GetChar(nSrchPos);
146*b1cdbd2cSJim Jagielski 					if( cNext == cSpace	||
147*b1cdbd2cSJim Jagielski 						cNext == cTab 	||
148*b1cdbd2cSJim Jagielski 						cNext == cLF 	||
149*b1cdbd2cSJim Jagielski 						cNext == cCR)
150*b1cdbd2cSJim Jagielski 						break;
151*b1cdbd2cSJim Jagielski 					else if(cNext == cCloseBracket)
152*b1cdbd2cSJim Jagielski 					{
153*b1cdbd2cSJim Jagielski 						break;
154*b1cdbd2cSJim Jagielski 					}
155*b1cdbd2cSJim Jagielski 				}
156*b1cdbd2cSJim Jagielski 				if(nSrchPos > nActPos + 1)
157*b1cdbd2cSJim Jagielski 				{
158*b1cdbd2cSJim Jagielski 					//irgend ein String wurde gefunden
159*b1cdbd2cSJim Jagielski 					String sToken = rSource.Copy(nActPos + 1, nSrchPos - nActPos - 1 );
160*b1cdbd2cSJim Jagielski 					sToken.ToUpperAscii();
161*b1cdbd2cSJim Jagielski 					int nToken = ::GetHTMLToken(sToken);
162*b1cdbd2cSJim Jagielski 					if(nToken)
163*b1cdbd2cSJim Jagielski 					{
164*b1cdbd2cSJim Jagielski 						//Token gefunden
165*b1cdbd2cSJim Jagielski                         eFoundType = svtools::HTMLKEYWORD;
166*b1cdbd2cSJim Jagielski 						nPortEnd = nSrchPos;
167*b1cdbd2cSJim Jagielski 						nPortStart = nActPos;
168*b1cdbd2cSJim Jagielski 					}
169*b1cdbd2cSJim Jagielski 					else
170*b1cdbd2cSJim Jagielski 					{
171*b1cdbd2cSJim Jagielski 						//was war das denn?
172*b1cdbd2cSJim Jagielski #if OSL_DEBUG_LEVEL > 1
173*b1cdbd2cSJim Jagielski                         DBG_ERROR("Token nicht erkannt!");
174*b1cdbd2cSJim Jagielski                         DBG_ERROR(ByteString(sToken, gsl_getSystemTextEncoding()).GetBuffer());
175*b1cdbd2cSJim Jagielski #endif
176*b1cdbd2cSJim Jagielski 					}
177*b1cdbd2cSJim Jagielski 
178*b1cdbd2cSJim Jagielski 				}
179*b1cdbd2cSJim Jagielski 			}
180*b1cdbd2cSJim Jagielski 			// jetzt muss noch '>' gesucht werden
181*b1cdbd2cSJim Jagielski             if(svtools::HTMLUNKNOWN != eFoundType)
182*b1cdbd2cSJim Jagielski 			{
183*b1cdbd2cSJim Jagielski 				sal_Bool bFound = sal_False;
184*b1cdbd2cSJim Jagielski 				for(sal_uInt16 i = nPortEnd; i < nStrLen; i++)
185*b1cdbd2cSJim Jagielski 					if(cCloseBracket == rSource.GetChar(i))
186*b1cdbd2cSJim Jagielski 					{
187*b1cdbd2cSJim Jagielski 						bFound = sal_True;
188*b1cdbd2cSJim Jagielski 						nPortEnd = i;
189*b1cdbd2cSJim Jagielski 						break;
190*b1cdbd2cSJim Jagielski 					}
191*b1cdbd2cSJim Jagielski                 if(!bFound && (eFoundType == svtools::HTMLCOMMENT))
192*b1cdbd2cSJim Jagielski 				{
193*b1cdbd2cSJim Jagielski 					// Kommentar ohne Ende in dieser Zeile
194*b1cdbd2cSJim Jagielski 					bFound  = sal_True;
195*b1cdbd2cSJim Jagielski 					nPortEnd = nStrLen - 1;
196*b1cdbd2cSJim Jagielski 				}
197*b1cdbd2cSJim Jagielski 
198*b1cdbd2cSJim Jagielski                 if(bFound ||(eFoundType == svtools::HTMLCOMMENT))
199*b1cdbd2cSJim Jagielski 				{
200*b1cdbd2cSJim Jagielski                     SwTextPortion aTextPortion;
201*b1cdbd2cSJim Jagielski                     aTextPortion.nLine = 0;
202*b1cdbd2cSJim Jagielski                     aTextPortion.nStart = nPortStart + 1;
203*b1cdbd2cSJim Jagielski                     aTextPortion.nEnd = nPortEnd;
204*b1cdbd2cSJim Jagielski                     aTextPortion.eType = eFoundType;
205*b1cdbd2cSJim Jagielski                     aPortionList.push_back( aTextPortion );
206*b1cdbd2cSJim Jagielski                     nInsert++;
207*b1cdbd2cSJim Jagielski                     eFoundType = svtools::HTMLUNKNOWN;
208*b1cdbd2cSJim Jagielski 				}
209*b1cdbd2cSJim Jagielski 
210*b1cdbd2cSJim Jagielski 			}
211*b1cdbd2cSJim Jagielski 		}
212*b1cdbd2cSJim Jagielski 		nActPos++;
213*b1cdbd2cSJim Jagielski 	}
214*b1cdbd2cSJim Jagielski 	if(nInsert && nPortEnd < nActPos - 1)
215*b1cdbd2cSJim Jagielski 	{
216*b1cdbd2cSJim Jagielski 		aText.nLine = 0;
217*b1cdbd2cSJim Jagielski 		aText.nStart = nPortEnd + 1;
218*b1cdbd2cSJim Jagielski 		aText.nEnd = nActPos - 1;
219*b1cdbd2cSJim Jagielski         aText.eType = svtools::HTMLUNKNOWN;
220*b1cdbd2cSJim Jagielski 		aPortionList.push_back( aText );
221*b1cdbd2cSJim Jagielski         nInsert++;
222*b1cdbd2cSJim Jagielski 	}
223*b1cdbd2cSJim Jagielski }
224*b1cdbd2cSJim Jagielski 
225*b1cdbd2cSJim Jagielski /*--------------------------------------------------------------------
226*b1cdbd2cSJim Jagielski 	Beschreibung:
227*b1cdbd2cSJim Jagielski  --------------------------------------------------------------------*/
228*b1cdbd2cSJim Jagielski 
229*b1cdbd2cSJim Jagielski 
SwSrcEditWindow(Window * pParent,SwSrcView * pParentView)230*b1cdbd2cSJim Jagielski SwSrcEditWindow::SwSrcEditWindow( Window* pParent, SwSrcView* pParentView ) :
231*b1cdbd2cSJim Jagielski 	Window( pParent, WB_BORDER|WB_CLIPCHILDREN ),
232*b1cdbd2cSJim Jagielski 
233*b1cdbd2cSJim Jagielski     pTextEngine(0),
234*b1cdbd2cSJim Jagielski 
235*b1cdbd2cSJim Jagielski     pOutWin(0),
236*b1cdbd2cSJim Jagielski     pHScrollbar(0),
237*b1cdbd2cSJim Jagielski 	pVScrollbar(0),
238*b1cdbd2cSJim Jagielski 
239*b1cdbd2cSJim Jagielski     pSrcView(pParentView),
240*b1cdbd2cSJim Jagielski     pSourceViewConfig(new utl::SourceViewConfig),
241*b1cdbd2cSJim Jagielski 
242*b1cdbd2cSJim Jagielski 	nCurTextWidth(0),
243*b1cdbd2cSJim Jagielski     nStartLine(USHRT_MAX),
244*b1cdbd2cSJim Jagielski     eSourceEncoding(gsl_getSystemTextEncoding()),
245*b1cdbd2cSJim Jagielski 	bDoSyntaxHighlight(sal_True),
246*b1cdbd2cSJim Jagielski     bHighlighting(sal_False)
247*b1cdbd2cSJim Jagielski {
248*b1cdbd2cSJim Jagielski 	SetHelpId(HID_SOURCE_EDITWIN);
249*b1cdbd2cSJim Jagielski 	CreateTextEngine();
250*b1cdbd2cSJim Jagielski     pSourceViewConfig->AddListener(this);
251*b1cdbd2cSJim Jagielski }
252*b1cdbd2cSJim Jagielski /*--------------------------------------------------------------------
253*b1cdbd2cSJim Jagielski 	Beschreibung:
254*b1cdbd2cSJim Jagielski  --------------------------------------------------------------------*/
~SwSrcEditWindow()255*b1cdbd2cSJim Jagielski  SwSrcEditWindow::~SwSrcEditWindow()
256*b1cdbd2cSJim Jagielski {
257*b1cdbd2cSJim Jagielski     pSourceViewConfig->RemoveListener(this);
258*b1cdbd2cSJim Jagielski     delete pSourceViewConfig;
259*b1cdbd2cSJim Jagielski     aSyntaxIdleTimer.Stop();
260*b1cdbd2cSJim Jagielski 	if ( pTextEngine )
261*b1cdbd2cSJim Jagielski 	{
262*b1cdbd2cSJim Jagielski 		EndListening( *pTextEngine );
263*b1cdbd2cSJim Jagielski 		pTextEngine->RemoveView( pTextView );
264*b1cdbd2cSJim Jagielski 
265*b1cdbd2cSJim Jagielski 		delete pHScrollbar;
266*b1cdbd2cSJim Jagielski 		delete pVScrollbar;
267*b1cdbd2cSJim Jagielski 
268*b1cdbd2cSJim Jagielski 		delete pTextView;
269*b1cdbd2cSJim Jagielski 		delete pTextEngine;
270*b1cdbd2cSJim Jagielski 	}
271*b1cdbd2cSJim Jagielski 	delete pOutWin;
272*b1cdbd2cSJim Jagielski }
273*b1cdbd2cSJim Jagielski 
274*b1cdbd2cSJim Jagielski /*--------------------------------------------------------------------
275*b1cdbd2cSJim Jagielski 	Beschreibung:
276*b1cdbd2cSJim Jagielski  --------------------------------------------------------------------*/
277*b1cdbd2cSJim Jagielski 
DataChanged(const DataChangedEvent & rDCEvt)278*b1cdbd2cSJim Jagielski void SwSrcEditWindow::DataChanged( const DataChangedEvent& rDCEvt )
279*b1cdbd2cSJim Jagielski {
280*b1cdbd2cSJim Jagielski 	Window::DataChanged( rDCEvt );
281*b1cdbd2cSJim Jagielski 
282*b1cdbd2cSJim Jagielski 	switch ( rDCEvt.GetType() )
283*b1cdbd2cSJim Jagielski 	{
284*b1cdbd2cSJim Jagielski 	case DATACHANGED_SETTINGS:
285*b1cdbd2cSJim Jagielski 		// ScrollBars neu anordnen bzw. Resize ausloesen, da sich
286*b1cdbd2cSJim Jagielski 		// ScrollBar-Groesse geaendert haben kann. Dazu muss dann im
287*b1cdbd2cSJim Jagielski 		// Resize-Handler aber auch die Groesse der ScrollBars aus
288*b1cdbd2cSJim Jagielski 		// den Settings abgefragt werden.
289*b1cdbd2cSJim Jagielski 		if( rDCEvt.GetFlags() & SETTINGS_STYLE )
290*b1cdbd2cSJim Jagielski 			Resize();
291*b1cdbd2cSJim Jagielski 		break;
292*b1cdbd2cSJim Jagielski 	}
293*b1cdbd2cSJim Jagielski }
294*b1cdbd2cSJim Jagielski 
Resize()295*b1cdbd2cSJim Jagielski void  SwSrcEditWindow::Resize()
296*b1cdbd2cSJim Jagielski {
297*b1cdbd2cSJim Jagielski 	// ScrollBars, etc. passiert in Adjust...
298*b1cdbd2cSJim Jagielski 	if ( pTextView )
299*b1cdbd2cSJim Jagielski 	{
300*b1cdbd2cSJim Jagielski 		long nVisY = pTextView->GetStartDocPos().Y();
301*b1cdbd2cSJim Jagielski 		pTextView->ShowCursor();
302*b1cdbd2cSJim Jagielski 		Size aOutSz( GetOutputSizePixel() );
303*b1cdbd2cSJim Jagielski 		long nMaxVisAreaStart = pTextView->GetTextEngine()->GetTextHeight() - aOutSz.Height();
304*b1cdbd2cSJim Jagielski 		if ( nMaxVisAreaStart < 0 )
305*b1cdbd2cSJim Jagielski 			nMaxVisAreaStart = 0;
306*b1cdbd2cSJim Jagielski 		if ( pTextView->GetStartDocPos().Y() > nMaxVisAreaStart )
307*b1cdbd2cSJim Jagielski 		{
308*b1cdbd2cSJim Jagielski 			Point aStartDocPos( pTextView->GetStartDocPos() );
309*b1cdbd2cSJim Jagielski 			aStartDocPos.Y() = nMaxVisAreaStart;
310*b1cdbd2cSJim Jagielski 			pTextView->SetStartDocPos( aStartDocPos );
311*b1cdbd2cSJim Jagielski 			pTextView->ShowCursor();
312*b1cdbd2cSJim Jagielski 		}
313*b1cdbd2cSJim Jagielski         long nScrollStd = GetSettings().GetStyleSettings().GetScrollBarSize();
314*b1cdbd2cSJim Jagielski 		Size aScrollSz(aOutSz.Width() - nScrollStd, nScrollStd );
315*b1cdbd2cSJim Jagielski 		Point aScrollPos(0, aOutSz.Height() - nScrollStd);
316*b1cdbd2cSJim Jagielski 
317*b1cdbd2cSJim Jagielski 		pHScrollbar->SetPosSizePixel( aScrollPos, aScrollSz);
318*b1cdbd2cSJim Jagielski 
319*b1cdbd2cSJim Jagielski 		aScrollSz.Width() = aScrollSz.Height();
320*b1cdbd2cSJim Jagielski 		aScrollSz.Height() = aOutSz.Height();
321*b1cdbd2cSJim Jagielski 		aScrollPos = Point(aOutSz.Width() - nScrollStd, 0);
322*b1cdbd2cSJim Jagielski 
323*b1cdbd2cSJim Jagielski 		pVScrollbar->SetPosSizePixel( aScrollPos, aScrollSz);
324*b1cdbd2cSJim Jagielski 		aOutSz.Width() 	-= nScrollStd;
325*b1cdbd2cSJim Jagielski 		aOutSz.Height() 	-= nScrollStd;
326*b1cdbd2cSJim Jagielski 		pOutWin->SetOutputSizePixel(aOutSz);
327*b1cdbd2cSJim Jagielski         InitScrollBars();
328*b1cdbd2cSJim Jagielski 
329*b1cdbd2cSJim Jagielski         // Zeile im ersten Resize setzen
330*b1cdbd2cSJim Jagielski 		if(USHRT_MAX != nStartLine)
331*b1cdbd2cSJim Jagielski 		{
332*b1cdbd2cSJim Jagielski 			if(nStartLine < pTextEngine->GetParagraphCount())
333*b1cdbd2cSJim Jagielski 			{
334*b1cdbd2cSJim Jagielski 				TextSelection aSel(TextPaM( nStartLine, 0 ), TextPaM( nStartLine, 0x0 ));
335*b1cdbd2cSJim Jagielski 				pTextView->SetSelection(aSel);
336*b1cdbd2cSJim Jagielski 				pTextView->ShowCursor();
337*b1cdbd2cSJim Jagielski 			}
338*b1cdbd2cSJim Jagielski 			nStartLine = USHRT_MAX;
339*b1cdbd2cSJim Jagielski 		}
340*b1cdbd2cSJim Jagielski 
341*b1cdbd2cSJim Jagielski 		if ( nVisY != pTextView->GetStartDocPos().Y() )
342*b1cdbd2cSJim Jagielski 			Invalidate();
343*b1cdbd2cSJim Jagielski 	}
344*b1cdbd2cSJim Jagielski 
345*b1cdbd2cSJim Jagielski }
346*b1cdbd2cSJim Jagielski 
347*b1cdbd2cSJim Jagielski /*--------------------------------------------------------------------
348*b1cdbd2cSJim Jagielski 	Beschreibung:
349*b1cdbd2cSJim Jagielski  --------------------------------------------------------------------*/
350*b1cdbd2cSJim Jagielski 
DataChanged(const DataChangedEvent & rDCEvt)351*b1cdbd2cSJim Jagielski void TextViewOutWin::DataChanged( const DataChangedEvent& rDCEvt )
352*b1cdbd2cSJim Jagielski {
353*b1cdbd2cSJim Jagielski 	Window::DataChanged( rDCEvt );
354*b1cdbd2cSJim Jagielski 
355*b1cdbd2cSJim Jagielski 	switch( rDCEvt.GetType() )
356*b1cdbd2cSJim Jagielski 	{
357*b1cdbd2cSJim Jagielski 	case DATACHANGED_SETTINGS:
358*b1cdbd2cSJim Jagielski 		// den Settings abgefragt werden.
359*b1cdbd2cSJim Jagielski 		if( rDCEvt.GetFlags() & SETTINGS_STYLE )
360*b1cdbd2cSJim Jagielski 		{
361*b1cdbd2cSJim Jagielski 			const Color &rCol = GetSettings().GetStyleSettings().GetWindowColor();
362*b1cdbd2cSJim Jagielski 			SetBackground( rCol );
363*b1cdbd2cSJim Jagielski 			Font aFont( pTextView->GetTextEngine()->GetFont() );
364*b1cdbd2cSJim Jagielski 			aFont.SetFillColor( rCol );
365*b1cdbd2cSJim Jagielski 			pTextView->GetTextEngine()->SetFont( aFont );
366*b1cdbd2cSJim Jagielski 		}
367*b1cdbd2cSJim Jagielski 		break;
368*b1cdbd2cSJim Jagielski 	}
369*b1cdbd2cSJim Jagielski }
370*b1cdbd2cSJim Jagielski 
MouseMove(const MouseEvent & rEvt)371*b1cdbd2cSJim Jagielski void  TextViewOutWin::MouseMove( const MouseEvent &rEvt )
372*b1cdbd2cSJim Jagielski {
373*b1cdbd2cSJim Jagielski 	if ( pTextView )
374*b1cdbd2cSJim Jagielski 		pTextView->MouseMove( rEvt );
375*b1cdbd2cSJim Jagielski }
376*b1cdbd2cSJim Jagielski 
377*b1cdbd2cSJim Jagielski /*--------------------------------------------------------------------
378*b1cdbd2cSJim Jagielski 	Beschreibung:
379*b1cdbd2cSJim Jagielski  --------------------------------------------------------------------*/
380*b1cdbd2cSJim Jagielski 
381*b1cdbd2cSJim Jagielski 
MouseButtonUp(const MouseEvent & rEvt)382*b1cdbd2cSJim Jagielski void  TextViewOutWin::MouseButtonUp( const MouseEvent &rEvt )
383*b1cdbd2cSJim Jagielski {
384*b1cdbd2cSJim Jagielski 	if ( pTextView )
385*b1cdbd2cSJim Jagielski 	{
386*b1cdbd2cSJim Jagielski 		pTextView->MouseButtonUp( rEvt );
387*b1cdbd2cSJim Jagielski 		SfxBindings& rBindings = ((SwSrcEditWindow*)GetParent())->GetSrcView()->GetViewFrame()->GetBindings();
388*b1cdbd2cSJim Jagielski 		rBindings.Invalidate( SID_TABLE_CELL );
389*b1cdbd2cSJim Jagielski 		rBindings.Invalidate( SID_CUT );
390*b1cdbd2cSJim Jagielski 		rBindings.Invalidate( SID_COPY );
391*b1cdbd2cSJim Jagielski 	}
392*b1cdbd2cSJim Jagielski }
393*b1cdbd2cSJim Jagielski 
394*b1cdbd2cSJim Jagielski /*--------------------------------------------------------------------
395*b1cdbd2cSJim Jagielski 	Beschreibung:
396*b1cdbd2cSJim Jagielski  --------------------------------------------------------------------*/
397*b1cdbd2cSJim Jagielski 
398*b1cdbd2cSJim Jagielski 
MouseButtonDown(const MouseEvent & rEvt)399*b1cdbd2cSJim Jagielski void  TextViewOutWin::MouseButtonDown( const MouseEvent &rEvt )
400*b1cdbd2cSJim Jagielski {
401*b1cdbd2cSJim Jagielski 	GrabFocus();
402*b1cdbd2cSJim Jagielski 	if ( pTextView )
403*b1cdbd2cSJim Jagielski 		pTextView->MouseButtonDown( rEvt );
404*b1cdbd2cSJim Jagielski }
405*b1cdbd2cSJim Jagielski 
406*b1cdbd2cSJim Jagielski /*--------------------------------------------------------------------
407*b1cdbd2cSJim Jagielski 	Beschreibung:
408*b1cdbd2cSJim Jagielski  --------------------------------------------------------------------*/
409*b1cdbd2cSJim Jagielski 
410*b1cdbd2cSJim Jagielski 
Command(const CommandEvent & rCEvt)411*b1cdbd2cSJim Jagielski void  TextViewOutWin::Command( const CommandEvent& rCEvt )
412*b1cdbd2cSJim Jagielski {
413*b1cdbd2cSJim Jagielski 	switch(rCEvt.GetCommand())
414*b1cdbd2cSJim Jagielski 	{
415*b1cdbd2cSJim Jagielski 		case COMMAND_CONTEXTMENU:
416*b1cdbd2cSJim Jagielski 			((SwSrcEditWindow*)GetParent())->GetSrcView()->GetViewFrame()->
417*b1cdbd2cSJim Jagielski 				GetDispatcher()->ExecutePopup();
418*b1cdbd2cSJim Jagielski 		break;
419*b1cdbd2cSJim Jagielski 		case COMMAND_WHEEL:
420*b1cdbd2cSJim Jagielski 		case COMMAND_STARTAUTOSCROLL:
421*b1cdbd2cSJim Jagielski 		case COMMAND_AUTOSCROLL:
422*b1cdbd2cSJim Jagielski 		{
423*b1cdbd2cSJim Jagielski 			const CommandWheelData* pWData = rCEvt.GetWheelData();
424*b1cdbd2cSJim Jagielski 			if( !pWData || COMMAND_WHEEL_ZOOM != pWData->GetMode() )
425*b1cdbd2cSJim Jagielski 			{
426*b1cdbd2cSJim Jagielski 				((SwSrcEditWindow*)GetParent())->HandleWheelCommand( rCEvt );
427*b1cdbd2cSJim Jagielski 			}
428*b1cdbd2cSJim Jagielski 		}
429*b1cdbd2cSJim Jagielski 		break;
430*b1cdbd2cSJim Jagielski 
431*b1cdbd2cSJim Jagielski 		default:
432*b1cdbd2cSJim Jagielski 			if ( pTextView )
433*b1cdbd2cSJim Jagielski 			pTextView->Command( rCEvt );
434*b1cdbd2cSJim Jagielski 		else
435*b1cdbd2cSJim Jagielski 			Window::Command(rCEvt);
436*b1cdbd2cSJim Jagielski 	}
437*b1cdbd2cSJim Jagielski }
438*b1cdbd2cSJim Jagielski 
439*b1cdbd2cSJim Jagielski 
440*b1cdbd2cSJim Jagielski /*--------------------------------------------------------------------
441*b1cdbd2cSJim Jagielski 	Beschreibung:
442*b1cdbd2cSJim Jagielski  --------------------------------------------------------------------*/
443*b1cdbd2cSJim Jagielski 
444*b1cdbd2cSJim Jagielski 
KeyInput(const KeyEvent & rKEvt)445*b1cdbd2cSJim Jagielski void  TextViewOutWin::KeyInput( const KeyEvent& rKEvt )
446*b1cdbd2cSJim Jagielski {
447*b1cdbd2cSJim Jagielski 	sal_Bool bDone = sal_False;
448*b1cdbd2cSJim Jagielski 	SwSrcEditWindow* pSrcEditWin = (SwSrcEditWindow*)GetParent();
449*b1cdbd2cSJim Jagielski 	sal_Bool bChange = !pSrcEditWin->IsReadonly() || !TextEngine::DoesKeyChangeText( rKEvt );
450*b1cdbd2cSJim Jagielski 	if(bChange)
451*b1cdbd2cSJim Jagielski 		bDone = pTextView->KeyInput( rKEvt );
452*b1cdbd2cSJim Jagielski 
453*b1cdbd2cSJim Jagielski 	SfxBindings& rBindings = ((SwSrcEditWindow*)GetParent())->GetSrcView()->GetViewFrame()->GetBindings();
454*b1cdbd2cSJim Jagielski 	if ( !bDone )
455*b1cdbd2cSJim Jagielski 	{
456*b1cdbd2cSJim Jagielski 		if ( !SfxViewShell::Current()->KeyInput( rKEvt ) )
457*b1cdbd2cSJim Jagielski 			Window::KeyInput( rKEvt );
458*b1cdbd2cSJim Jagielski 	}
459*b1cdbd2cSJim Jagielski 	else
460*b1cdbd2cSJim Jagielski 	{
461*b1cdbd2cSJim Jagielski 		rBindings.Invalidate( SID_TABLE_CELL );
462*b1cdbd2cSJim Jagielski 		if ( rKEvt.GetKeyCode().GetGroup() == KEYGROUP_CURSOR )
463*b1cdbd2cSJim Jagielski 			rBindings.Update( SID_BASICIDE_STAT_POS );
464*b1cdbd2cSJim Jagielski 		if (pSrcEditWin->GetTextEngine()->IsModified() )
465*b1cdbd2cSJim Jagielski 		{
466*b1cdbd2cSJim Jagielski 			rBindings.Invalidate( SID_SAVEDOC );
467*b1cdbd2cSJim Jagielski 			rBindings.Invalidate( SID_DOC_MODIFIED );
468*b1cdbd2cSJim Jagielski 		}
469*b1cdbd2cSJim Jagielski 		if( rKEvt.GetKeyCode().GetCode() == KEY_INSERT )
470*b1cdbd2cSJim Jagielski 			rBindings.Invalidate( SID_ATTR_INSERT );
471*b1cdbd2cSJim Jagielski 	}
472*b1cdbd2cSJim Jagielski 
473*b1cdbd2cSJim Jagielski 	rBindings.Invalidate( SID_CUT );
474*b1cdbd2cSJim Jagielski 	rBindings.Invalidate( SID_COPY );
475*b1cdbd2cSJim Jagielski 
476*b1cdbd2cSJim Jagielski 	SwDocShell* pDocShell = pSrcEditWin->GetSrcView()->GetDocShell();
477*b1cdbd2cSJim Jagielski 	if(pSrcEditWin->GetTextEngine()->IsModified())
478*b1cdbd2cSJim Jagielski 	{
479*b1cdbd2cSJim Jagielski 		pDocShell->SetModified();
480*b1cdbd2cSJim Jagielski 	}
481*b1cdbd2cSJim Jagielski }
482*b1cdbd2cSJim Jagielski 
483*b1cdbd2cSJim Jagielski /*--------------------------------------------------------------------
484*b1cdbd2cSJim Jagielski 	Beschreibung:
485*b1cdbd2cSJim Jagielski  --------------------------------------------------------------------*/
486*b1cdbd2cSJim Jagielski 
487*b1cdbd2cSJim Jagielski 
Paint(const Rectangle & rRect)488*b1cdbd2cSJim Jagielski void  TextViewOutWin::Paint( const Rectangle& rRect )
489*b1cdbd2cSJim Jagielski {
490*b1cdbd2cSJim Jagielski 	pTextView->Paint( rRect );
491*b1cdbd2cSJim Jagielski }
492*b1cdbd2cSJim Jagielski 
493*b1cdbd2cSJim Jagielski /*--------------------------------------------------------------------
494*b1cdbd2cSJim Jagielski 	Beschreibung:
495*b1cdbd2cSJim Jagielski  --------------------------------------------------------------------*/
496*b1cdbd2cSJim Jagielski 
497*b1cdbd2cSJim Jagielski 
CreateTextEngine()498*b1cdbd2cSJim Jagielski void SwSrcEditWindow::CreateTextEngine()
499*b1cdbd2cSJim Jagielski {
500*b1cdbd2cSJim Jagielski 	const Color &rCol = GetSettings().GetStyleSettings().GetWindowColor();
501*b1cdbd2cSJim Jagielski 	pOutWin = new TextViewOutWin(this, 0);
502*b1cdbd2cSJim Jagielski 	pOutWin->SetBackground(Wallpaper(rCol));
503*b1cdbd2cSJim Jagielski 	pOutWin->SetPointer(Pointer(POINTER_TEXT));
504*b1cdbd2cSJim Jagielski 	pOutWin->Show();
505*b1cdbd2cSJim Jagielski 
506*b1cdbd2cSJim Jagielski 	//Scrollbars anlegen
507*b1cdbd2cSJim Jagielski 	pHScrollbar = new ScrollBar(this, WB_3DLOOK |WB_HSCROLL|WB_DRAG);
508*b1cdbd2cSJim Jagielski         pHScrollbar->EnableRTL( false ); // #107300# --- RTL --- no mirroring for scrollbars
509*b1cdbd2cSJim Jagielski 	pHScrollbar->SetScrollHdl(LINK(this, SwSrcEditWindow, ScrollHdl));
510*b1cdbd2cSJim Jagielski 	pHScrollbar->Show();
511*b1cdbd2cSJim Jagielski 
512*b1cdbd2cSJim Jagielski 	pVScrollbar = new ScrollBar(this, WB_3DLOOK |WB_VSCROLL|WB_DRAG);
513*b1cdbd2cSJim Jagielski         pVScrollbar->EnableRTL( false ); // #107300# --- RTL --- no mirroring for scrollbars
514*b1cdbd2cSJim Jagielski 	pVScrollbar->SetScrollHdl(LINK(this, SwSrcEditWindow, ScrollHdl));
515*b1cdbd2cSJim Jagielski 	pHScrollbar->EnableDrag();
516*b1cdbd2cSJim Jagielski 	pVScrollbar->Show();
517*b1cdbd2cSJim Jagielski 
518*b1cdbd2cSJim Jagielski 	pTextEngine = new ExtTextEngine;
519*b1cdbd2cSJim Jagielski 	pTextView = new ExtTextView( pTextEngine, pOutWin );
520*b1cdbd2cSJim Jagielski 	pTextView->SetAutoIndentMode(sal_True);
521*b1cdbd2cSJim Jagielski 	pOutWin->SetTextView(pTextView);
522*b1cdbd2cSJim Jagielski 
523*b1cdbd2cSJim Jagielski 	pTextEngine->SetUpdateMode( sal_False );
524*b1cdbd2cSJim Jagielski 	pTextEngine->InsertView( pTextView );
525*b1cdbd2cSJim Jagielski 
526*b1cdbd2cSJim Jagielski 	Font aFont;
527*b1cdbd2cSJim Jagielski 	aFont.SetTransparent( sal_False );
528*b1cdbd2cSJim Jagielski 	aFont.SetFillColor( rCol );
529*b1cdbd2cSJim Jagielski 	SetPointFont( aFont );
530*b1cdbd2cSJim Jagielski 	aFont = GetFont();
531*b1cdbd2cSJim Jagielski 	aFont.SetFillColor( rCol );
532*b1cdbd2cSJim Jagielski 	pOutWin->SetFont( aFont );
533*b1cdbd2cSJim Jagielski 	pTextEngine->SetFont( aFont );
534*b1cdbd2cSJim Jagielski 
535*b1cdbd2cSJim Jagielski     aSyntaxIdleTimer.SetTimeout( SYNTAX_HIGHLIGHT_TIMEOUT );
536*b1cdbd2cSJim Jagielski 	aSyntaxIdleTimer.SetTimeoutHdl( LINK( this, SwSrcEditWindow, SyntaxTimerHdl ) );
537*b1cdbd2cSJim Jagielski 
538*b1cdbd2cSJim Jagielski 	pTextEngine->EnableUndo( sal_True );
539*b1cdbd2cSJim Jagielski 	pTextEngine->SetUpdateMode( sal_True );
540*b1cdbd2cSJim Jagielski 
541*b1cdbd2cSJim Jagielski 	pTextView->ShowCursor( sal_True, sal_True );
542*b1cdbd2cSJim Jagielski 	InitScrollBars();
543*b1cdbd2cSJim Jagielski 	StartListening( *pTextEngine );
544*b1cdbd2cSJim Jagielski 
545*b1cdbd2cSJim Jagielski 	SfxBindings& rBind = GetSrcView()->GetViewFrame()->GetBindings();
546*b1cdbd2cSJim Jagielski 	rBind.Invalidate( SID_TABLE_CELL );
547*b1cdbd2cSJim Jagielski //	rBind.Invalidate( SID_ATTR_CHAR_FONTHEIGHT );
548*b1cdbd2cSJim Jagielski }
549*b1cdbd2cSJim Jagielski 
550*b1cdbd2cSJim Jagielski /*--------------------------------------------------------------------
551*b1cdbd2cSJim Jagielski 	Beschreibung:
552*b1cdbd2cSJim Jagielski  --------------------------------------------------------------------*/
553*b1cdbd2cSJim Jagielski 
554*b1cdbd2cSJim Jagielski /*--------------------------------------------------------------------
555*b1cdbd2cSJim Jagielski 	Beschreibung:
556*b1cdbd2cSJim Jagielski  --------------------------------------------------------------------*/
557*b1cdbd2cSJim Jagielski 
558*b1cdbd2cSJim Jagielski 
SetScrollBarRanges()559*b1cdbd2cSJim Jagielski void SwSrcEditWindow::SetScrollBarRanges()
560*b1cdbd2cSJim Jagielski {
561*b1cdbd2cSJim Jagielski 	// Extra-Methode, nicht InitScrollBars, da auch fuer TextEngine-Events.
562*b1cdbd2cSJim Jagielski 
563*b1cdbd2cSJim Jagielski 	pHScrollbar->SetRange( Range( 0, nCurTextWidth-1 ) );
564*b1cdbd2cSJim Jagielski 	pVScrollbar->SetRange( Range(0, pTextEngine->GetTextHeight()-1) );
565*b1cdbd2cSJim Jagielski }
566*b1cdbd2cSJim Jagielski 
567*b1cdbd2cSJim Jagielski /*--------------------------------------------------------------------
568*b1cdbd2cSJim Jagielski 	Beschreibung:
569*b1cdbd2cSJim Jagielski  --------------------------------------------------------------------*/
570*b1cdbd2cSJim Jagielski 
571*b1cdbd2cSJim Jagielski 
InitScrollBars()572*b1cdbd2cSJim Jagielski void SwSrcEditWindow::InitScrollBars()
573*b1cdbd2cSJim Jagielski {
574*b1cdbd2cSJim Jagielski 	SetScrollBarRanges();
575*b1cdbd2cSJim Jagielski 
576*b1cdbd2cSJim Jagielski     Size aOutSz( pOutWin->GetOutputSizePixel() );
577*b1cdbd2cSJim Jagielski     pVScrollbar->SetVisibleSize( aOutSz.Height() );
578*b1cdbd2cSJim Jagielski 	pVScrollbar->SetPageSize(  aOutSz.Height() * 8 / 10 );
579*b1cdbd2cSJim Jagielski 	pVScrollbar->SetLineSize( pOutWin->GetTextHeight() );
580*b1cdbd2cSJim Jagielski 	pVScrollbar->SetThumbPos( pTextView->GetStartDocPos().Y() );
581*b1cdbd2cSJim Jagielski 	pHScrollbar->SetVisibleSize( aOutSz.Width() );
582*b1cdbd2cSJim Jagielski 	pHScrollbar->SetPageSize( aOutSz.Width() * 8 / 10 );
583*b1cdbd2cSJim Jagielski 	pHScrollbar->SetLineSize( pOutWin->GetTextWidth( 'x' ) );
584*b1cdbd2cSJim Jagielski 	pHScrollbar->SetThumbPos( pTextView->GetStartDocPos().X() );
585*b1cdbd2cSJim Jagielski 
586*b1cdbd2cSJim Jagielski }
587*b1cdbd2cSJim Jagielski 
588*b1cdbd2cSJim Jagielski /*--------------------------------------------------------------------
589*b1cdbd2cSJim Jagielski 	Beschreibung:
590*b1cdbd2cSJim Jagielski  --------------------------------------------------------------------*/
591*b1cdbd2cSJim Jagielski 
592*b1cdbd2cSJim Jagielski 
IMPL_LINK(SwSrcEditWindow,ScrollHdl,ScrollBar *,pScroll)593*b1cdbd2cSJim Jagielski IMPL_LINK(SwSrcEditWindow, ScrollHdl, ScrollBar*, pScroll)
594*b1cdbd2cSJim Jagielski {
595*b1cdbd2cSJim Jagielski 	if(pScroll == pVScrollbar)
596*b1cdbd2cSJim Jagielski 	{
597*b1cdbd2cSJim Jagielski 		long nDiff = pTextView->GetStartDocPos().Y() - pScroll->GetThumbPos();
598*b1cdbd2cSJim Jagielski 		GetTextView()->Scroll( 0, nDiff );
599*b1cdbd2cSJim Jagielski 		pTextView->ShowCursor( sal_False, sal_True );
600*b1cdbd2cSJim Jagielski 		pScroll->SetThumbPos( pTextView->GetStartDocPos().Y() );
601*b1cdbd2cSJim Jagielski 	}
602*b1cdbd2cSJim Jagielski 	else
603*b1cdbd2cSJim Jagielski 	{
604*b1cdbd2cSJim Jagielski 		long nDiff = pTextView->GetStartDocPos().X() - pScroll->GetThumbPos();
605*b1cdbd2cSJim Jagielski 		GetTextView()->Scroll( nDiff, 0 );
606*b1cdbd2cSJim Jagielski 		pTextView->ShowCursor( sal_False, sal_True );
607*b1cdbd2cSJim Jagielski 		pScroll->SetThumbPos( pTextView->GetStartDocPos().X() );
608*b1cdbd2cSJim Jagielski 	}
609*b1cdbd2cSJim Jagielski 	GetSrcView()->GetViewFrame()->GetBindings().Invalidate( SID_TABLE_CELL );
610*b1cdbd2cSJim Jagielski 	return 0;
611*b1cdbd2cSJim Jagielski }
612*b1cdbd2cSJim Jagielski 
613*b1cdbd2cSJim Jagielski /*-----------------15.01.97 09.22-------------------
614*b1cdbd2cSJim Jagielski 
615*b1cdbd2cSJim Jagielski --------------------------------------------------*/
616*b1cdbd2cSJim Jagielski 
IMPL_LINK(SwSrcEditWindow,SyntaxTimerHdl,Timer *,pTimer)617*b1cdbd2cSJim Jagielski IMPL_LINK( SwSrcEditWindow, SyntaxTimerHdl, Timer *, pTimer )
618*b1cdbd2cSJim Jagielski {
619*b1cdbd2cSJim Jagielski     Time aSyntaxCheckStart;
620*b1cdbd2cSJim Jagielski     DBG_ASSERT( pTextView, "Noch keine View, aber Syntax-Highlight ?!" );
621*b1cdbd2cSJim Jagielski 	// pTextEngine->SetUpdateMode( sal_False );
622*b1cdbd2cSJim Jagielski 
623*b1cdbd2cSJim Jagielski 	bHighlighting = sal_True;
624*b1cdbd2cSJim Jagielski 	sal_uInt16 nLine;
625*b1cdbd2cSJim Jagielski 	sal_uInt16 nCount  = 0;
626*b1cdbd2cSJim Jagielski 	// zuerst wird der Bereich um dem Cursor bearbeitet
627*b1cdbd2cSJim Jagielski 	TextSelection aSel = pTextView->GetSelection();
628*b1cdbd2cSJim Jagielski     sal_uInt16 nCur = (sal_uInt16)aSel.GetStart().GetPara();
629*b1cdbd2cSJim Jagielski 	if(nCur > 40)
630*b1cdbd2cSJim Jagielski 		nCur -= 40;
631*b1cdbd2cSJim Jagielski 	else
632*b1cdbd2cSJim Jagielski 		nCur = 0;
633*b1cdbd2cSJim Jagielski 	if(aSyntaxLineTable.Count())
634*b1cdbd2cSJim Jagielski 		for(sal_uInt16 i = 0; i < 80 && nCount < 40; i++, nCur++)
635*b1cdbd2cSJim Jagielski 		{
636*b1cdbd2cSJim Jagielski 			void * p = aSyntaxLineTable.Get(nCur);
637*b1cdbd2cSJim Jagielski 			if(p)
638*b1cdbd2cSJim Jagielski 			{
639*b1cdbd2cSJim Jagielski 				DoSyntaxHighlight( nCur );
640*b1cdbd2cSJim Jagielski 				aSyntaxLineTable.Remove( nCur );
641*b1cdbd2cSJim Jagielski 				nCount++;
642*b1cdbd2cSJim Jagielski                 if(!aSyntaxLineTable.Count())
643*b1cdbd2cSJim Jagielski                     break;
644*b1cdbd2cSJim Jagielski                 if((Time().GetTime() - aSyntaxCheckStart.GetTime()) > MAX_HIGHLIGHTTIME )
645*b1cdbd2cSJim Jagielski                 {
646*b1cdbd2cSJim Jagielski                     pTimer->SetTimeout( 2 * SYNTAX_HIGHLIGHT_TIMEOUT );
647*b1cdbd2cSJim Jagielski                     break;
648*b1cdbd2cSJim Jagielski                 }
649*b1cdbd2cSJim Jagielski             }
650*b1cdbd2cSJim Jagielski 		}
651*b1cdbd2cSJim Jagielski 
652*b1cdbd2cSJim Jagielski 	// wenn dann noch etwas frei ist, wird von Beginn an weitergearbeitet
653*b1cdbd2cSJim Jagielski 	void* p = aSyntaxLineTable.First();
654*b1cdbd2cSJim Jagielski 	while ( p && nCount < MAX_SYNTAX_HIGHLIGHT)
655*b1cdbd2cSJim Jagielski 	{
656*b1cdbd2cSJim Jagielski 		nLine = (sal_uInt16)aSyntaxLineTable.GetCurKey();
657*b1cdbd2cSJim Jagielski 		DoSyntaxHighlight( nLine );
658*b1cdbd2cSJim Jagielski         sal_uInt16 nCurKey = (sal_uInt16)aSyntaxLineTable.GetCurKey();
659*b1cdbd2cSJim Jagielski 		p = aSyntaxLineTable.Next();
660*b1cdbd2cSJim Jagielski         aSyntaxLineTable.Remove(nCurKey);
661*b1cdbd2cSJim Jagielski 		nCount ++;
662*b1cdbd2cSJim Jagielski         if(Time().GetTime() - aSyntaxCheckStart.GetTime() > MAX_HIGHLIGHTTIME)
663*b1cdbd2cSJim Jagielski         {
664*b1cdbd2cSJim Jagielski             pTimer->SetTimeout( 2 * SYNTAX_HIGHLIGHT_TIMEOUT );
665*b1cdbd2cSJim Jagielski             break;
666*b1cdbd2cSJim Jagielski         }
667*b1cdbd2cSJim Jagielski 	}
668*b1cdbd2cSJim Jagielski 	// os: #43050# hier wird ein TextView-Problem umpopelt:
669*b1cdbd2cSJim Jagielski 	// waehrend des Highlightings funktionierte das Scrolling nicht
670*b1cdbd2cSJim Jagielski 	/* MT: Shouldn't be a oproblem any more, using IdeFormatter in Insert/RemoveAttrib now.
671*b1cdbd2cSJim Jagielski 
672*b1cdbd2cSJim Jagielski     	TextView* pTmp = pTextEngine->GetActiveView();
673*b1cdbd2cSJim Jagielski     	pTextEngine->SetActiveView(0);
674*b1cdbd2cSJim Jagielski     	// pTextEngine->SetUpdateMode( sal_True );
675*b1cdbd2cSJim Jagielski     	pTextEngine->SetActiveView(pTmp);
676*b1cdbd2cSJim Jagielski     	pTextView->ShowCursor(sal_False, sal_False);
677*b1cdbd2cSJim Jagielski     */
678*b1cdbd2cSJim Jagielski 
679*b1cdbd2cSJim Jagielski 	if(aSyntaxLineTable.Count() && !pTimer->IsActive())
680*b1cdbd2cSJim Jagielski 		pTimer->Start();
681*b1cdbd2cSJim Jagielski 	// SyntaxTimerHdl wird gerufen, wenn Text-Aenderung
682*b1cdbd2cSJim Jagielski 	// => gute Gelegenheit, Textbreite zu ermitteln!
683*b1cdbd2cSJim Jagielski 	long nPrevTextWidth = nCurTextWidth;
684*b1cdbd2cSJim Jagielski 	nCurTextWidth = pTextEngine->CalcTextWidth() + 25;	// kleine Toleranz
685*b1cdbd2cSJim Jagielski 	if ( nCurTextWidth != nPrevTextWidth )
686*b1cdbd2cSJim Jagielski 		SetScrollBarRanges();
687*b1cdbd2cSJim Jagielski 	bHighlighting = sal_False;
688*b1cdbd2cSJim Jagielski 
689*b1cdbd2cSJim Jagielski     return 0;
690*b1cdbd2cSJim Jagielski }
691*b1cdbd2cSJim Jagielski /*-----------------15.01.97 10.01-------------------
692*b1cdbd2cSJim Jagielski 
693*b1cdbd2cSJim Jagielski --------------------------------------------------*/
694*b1cdbd2cSJim Jagielski 
DoSyntaxHighlight(sal_uInt16 nPara)695*b1cdbd2cSJim Jagielski void SwSrcEditWindow::DoSyntaxHighlight( sal_uInt16 nPara )
696*b1cdbd2cSJim Jagielski {
697*b1cdbd2cSJim Jagielski 	// Durch das DelayedSyntaxHighlight kann es passieren,
698*b1cdbd2cSJim Jagielski 	// dass die Zeile nicht mehr existiert!
699*b1cdbd2cSJim Jagielski 	if ( nPara < pTextEngine->GetParagraphCount() )
700*b1cdbd2cSJim Jagielski 	{
701*b1cdbd2cSJim Jagielski 		sal_Bool bTempModified = IsModified();
702*b1cdbd2cSJim Jagielski 		pTextEngine->RemoveAttribs( nPara, (sal_Bool)sal_True );
703*b1cdbd2cSJim Jagielski 		String aSource( pTextEngine->GetText( nPara ) );
704*b1cdbd2cSJim Jagielski 		pTextEngine->SetUpdateMode( sal_False );
705*b1cdbd2cSJim Jagielski 		ImpDoHighlight( aSource, nPara );
706*b1cdbd2cSJim Jagielski 		// os: #43050# hier wird ein TextView-Problem umpopelt:
707*b1cdbd2cSJim Jagielski 		// waehrend des Highlightings funktionierte das Scrolling nicht
708*b1cdbd2cSJim Jagielski 		TextView* pTmp = pTextEngine->GetActiveView();
709*b1cdbd2cSJim Jagielski 		pTmp->SetAutoScroll(sal_False);
710*b1cdbd2cSJim Jagielski 		pTextEngine->SetActiveView(0);
711*b1cdbd2cSJim Jagielski 		pTextEngine->SetUpdateMode( sal_True );
712*b1cdbd2cSJim Jagielski 		pTextEngine->SetActiveView(pTmp);
713*b1cdbd2cSJim Jagielski 		// Bug 72887 show the cursor
714*b1cdbd2cSJim Jagielski 		pTmp->SetAutoScroll(sal_True);
715*b1cdbd2cSJim Jagielski 		pTmp->ShowCursor( sal_False/*pTmp->IsAutoScroll()*/ );
716*b1cdbd2cSJim Jagielski 
717*b1cdbd2cSJim Jagielski 		if(!bTempModified)
718*b1cdbd2cSJim Jagielski 			ClearModifyFlag();
719*b1cdbd2cSJim Jagielski 	}
720*b1cdbd2cSJim Jagielski }
721*b1cdbd2cSJim Jagielski 
722*b1cdbd2cSJim Jagielski /*-----------------15.01.97 09.49-------------------
723*b1cdbd2cSJim Jagielski 
724*b1cdbd2cSJim Jagielski --------------------------------------------------*/
725*b1cdbd2cSJim Jagielski 
DoDelayedSyntaxHighlight(sal_uInt16 nPara)726*b1cdbd2cSJim Jagielski void SwSrcEditWindow::DoDelayedSyntaxHighlight( sal_uInt16 nPara )
727*b1cdbd2cSJim Jagielski {
728*b1cdbd2cSJim Jagielski 	if ( !bHighlighting && bDoSyntaxHighlight )
729*b1cdbd2cSJim Jagielski 	{
730*b1cdbd2cSJim Jagielski 		aSyntaxLineTable.Insert( nPara, (void*)(sal_uInt16)1 );
731*b1cdbd2cSJim Jagielski 		aSyntaxIdleTimer.Start();
732*b1cdbd2cSJim Jagielski 	}
733*b1cdbd2cSJim Jagielski }
734*b1cdbd2cSJim Jagielski 
735*b1cdbd2cSJim Jagielski /*-----------------15.01.97 11.32-------------------
736*b1cdbd2cSJim Jagielski 
737*b1cdbd2cSJim Jagielski --------------------------------------------------*/
738*b1cdbd2cSJim Jagielski 
ImpDoHighlight(const String & rSource,sal_uInt16 nLineOff)739*b1cdbd2cSJim Jagielski void SwSrcEditWindow::ImpDoHighlight( const String& rSource, sal_uInt16 nLineOff )
740*b1cdbd2cSJim Jagielski {
741*b1cdbd2cSJim Jagielski 	SwTextPortions aPortionList;
742*b1cdbd2cSJim Jagielski 	lcl_Highlight(rSource, aPortionList);
743*b1cdbd2cSJim Jagielski 
744*b1cdbd2cSJim Jagielski 	size_t nCount = aPortionList.size();
745*b1cdbd2cSJim Jagielski 	if ( !nCount )
746*b1cdbd2cSJim Jagielski 		return;
747*b1cdbd2cSJim Jagielski 
748*b1cdbd2cSJim Jagielski 	SwTextPortion& rLast = aPortionList[nCount-1];
749*b1cdbd2cSJim Jagielski 	if ( rLast.nStart > rLast.nEnd ) 	// Nur bis Bug von MD behoeben
750*b1cdbd2cSJim Jagielski 	{
751*b1cdbd2cSJim Jagielski 		nCount--;
752*b1cdbd2cSJim Jagielski 		aPortionList.pop_back();
753*b1cdbd2cSJim Jagielski 		if ( !nCount )
754*b1cdbd2cSJim Jagielski 			return;
755*b1cdbd2cSJim Jagielski 	}
756*b1cdbd2cSJim Jagielski 
757*b1cdbd2cSJim Jagielski 	// Evtl. Optimieren:
758*b1cdbd2cSJim Jagielski 	// Wenn haufig gleiche Farbe, dazwischen Blank ohne Farbe,
759*b1cdbd2cSJim Jagielski 	// ggf. zusammenfassen, oder zumindest das Blank,
760*b1cdbd2cSJim Jagielski 	// damit weniger Attribute
761*b1cdbd2cSJim Jagielski 	sal_Bool bOptimizeHighlight = sal_True; // war in der BasicIDE static
762*b1cdbd2cSJim Jagielski 	if ( bOptimizeHighlight )
763*b1cdbd2cSJim Jagielski 	{
764*b1cdbd2cSJim Jagielski 		// Es muessen nur die Blanks und Tabs mit attributiert werden.
765*b1cdbd2cSJim Jagielski 		// Wenn zwei gleiche Attribute hintereinander eingestellt werden,
766*b1cdbd2cSJim Jagielski 		// optimiert das die TextEngine.
767*b1cdbd2cSJim Jagielski 		sal_uInt16 nLastEnd = 0;
768*b1cdbd2cSJim Jagielski 
769*b1cdbd2cSJim Jagielski #ifdef DBG_UTIL
770*b1cdbd2cSJim Jagielski         sal_uInt16 nLine = aPortionList[0].nLine;
771*b1cdbd2cSJim Jagielski #endif
772*b1cdbd2cSJim Jagielski 		for ( size_t i = 0; i < nCount; i++ )
773*b1cdbd2cSJim Jagielski 		{
774*b1cdbd2cSJim Jagielski 			SwTextPortion& r = aPortionList[i];
775*b1cdbd2cSJim Jagielski 			DBG_ASSERT( r.nLine == nLine, "doch mehrere Zeilen ?" );
776*b1cdbd2cSJim Jagielski 			if ( r.nStart > r.nEnd ) 	// Nur bis Bug von MD behoeben
777*b1cdbd2cSJim Jagielski 				continue;
778*b1cdbd2cSJim Jagielski 
779*b1cdbd2cSJim Jagielski 			if ( r.nStart > nLastEnd )
780*b1cdbd2cSJim Jagielski 			{
781*b1cdbd2cSJim Jagielski 				// Kann ich mich drauf verlassen, dass alle ausser
782*b1cdbd2cSJim Jagielski 				// Blank und Tab gehighlightet wird ?!
783*b1cdbd2cSJim Jagielski 				r.nStart = nLastEnd;
784*b1cdbd2cSJim Jagielski 			}
785*b1cdbd2cSJim Jagielski 			nLastEnd = r.nEnd+1;
786*b1cdbd2cSJim Jagielski 			if ( ( i == (nCount-1) ) && ( r.nEnd < rSource.Len() ) )
787*b1cdbd2cSJim Jagielski 				r.nEnd = rSource.Len();
788*b1cdbd2cSJim Jagielski 		}
789*b1cdbd2cSJim Jagielski 	}
790*b1cdbd2cSJim Jagielski 
791*b1cdbd2cSJim Jagielski 	for ( size_t i = 0; i < aPortionList.size(); i++ )
792*b1cdbd2cSJim Jagielski 	{
793*b1cdbd2cSJim Jagielski 		SwTextPortion& r = aPortionList[i];
794*b1cdbd2cSJim Jagielski 		if ( r.nStart > r.nEnd ) 	// Nur bis Bug von MD behoeben
795*b1cdbd2cSJim Jagielski 			continue;
796*b1cdbd2cSJim Jagielski         if(r.eType !=  svtools::HTMLSGML    &&
797*b1cdbd2cSJim Jagielski             r.eType != svtools::HTMLCOMMENT &&
798*b1cdbd2cSJim Jagielski             r.eType != svtools::HTMLKEYWORD &&
799*b1cdbd2cSJim Jagielski             r.eType != svtools::HTMLUNKNOWN)
800*b1cdbd2cSJim Jagielski                 r.eType = svtools::HTMLUNKNOWN;
801*b1cdbd2cSJim Jagielski         Color aColor((ColorData)SW_MOD()->GetColorConfig().GetColorValue((svtools::ColorConfigEntry)r.eType).nColor);
802*b1cdbd2cSJim Jagielski         sal_uInt16 nLine = nLineOff+r.nLine; //
803*b1cdbd2cSJim Jagielski         pTextEngine->SetAttrib( TextAttribFontColor( aColor ), nLine, r.nStart, r.nEnd+1, sal_True );
804*b1cdbd2cSJim Jagielski 	}
805*b1cdbd2cSJim Jagielski }
806*b1cdbd2cSJim Jagielski 
807*b1cdbd2cSJim Jagielski /*-----------------30.06.97 09:12-------------------
808*b1cdbd2cSJim Jagielski 
809*b1cdbd2cSJim Jagielski --------------------------------------------------*/
810*b1cdbd2cSJim Jagielski 
Notify(SfxBroadcaster &,const SfxHint & rHint)811*b1cdbd2cSJim Jagielski void SwSrcEditWindow::Notify( SfxBroadcaster& /*rBC*/, const SfxHint& rHint )
812*b1cdbd2cSJim Jagielski {
813*b1cdbd2cSJim Jagielski 	if ( rHint.ISA( TextHint ) )
814*b1cdbd2cSJim Jagielski 	{
815*b1cdbd2cSJim Jagielski 		const TextHint& rTextHint = (const TextHint&)rHint;
816*b1cdbd2cSJim Jagielski 		if( rTextHint.GetId() == TEXT_HINT_VIEWSCROLLED )
817*b1cdbd2cSJim Jagielski 		{
818*b1cdbd2cSJim Jagielski 			pHScrollbar->SetThumbPos( pTextView->GetStartDocPos().X() );
819*b1cdbd2cSJim Jagielski 			pVScrollbar->SetThumbPos( pTextView->GetStartDocPos().Y() );
820*b1cdbd2cSJim Jagielski 		}
821*b1cdbd2cSJim Jagielski 		else if( rTextHint.GetId() == TEXT_HINT_TEXTHEIGHTCHANGED )
822*b1cdbd2cSJim Jagielski 		{
823*b1cdbd2cSJim Jagielski 			if ( (long)pTextEngine->GetTextHeight() < pOutWin->GetOutputSizePixel().Height() )
824*b1cdbd2cSJim Jagielski 				pTextView->Scroll( 0, pTextView->GetStartDocPos().Y() );
825*b1cdbd2cSJim Jagielski 			pVScrollbar->SetThumbPos( pTextView->GetStartDocPos().Y() );
826*b1cdbd2cSJim Jagielski 			SetScrollBarRanges();
827*b1cdbd2cSJim Jagielski 		}
828*b1cdbd2cSJim Jagielski 		else if( ( rTextHint.GetId() == TEXT_HINT_PARAINSERTED ) ||
829*b1cdbd2cSJim Jagielski 		         ( rTextHint.GetId() == TEXT_HINT_PARACONTENTCHANGED ) )
830*b1cdbd2cSJim Jagielski 		{
831*b1cdbd2cSJim Jagielski             DoDelayedSyntaxHighlight( (sal_uInt16)rTextHint.GetValue() );
832*b1cdbd2cSJim Jagielski 		}
833*b1cdbd2cSJim Jagielski 	}
834*b1cdbd2cSJim Jagielski }
835*b1cdbd2cSJim Jagielski 
ConfigurationChanged(utl::ConfigurationBroadcaster * pBrdCst,sal_uInt32)836*b1cdbd2cSJim Jagielski void SwSrcEditWindow::ConfigurationChanged( utl::ConfigurationBroadcaster* pBrdCst, sal_uInt32 )
837*b1cdbd2cSJim Jagielski {
838*b1cdbd2cSJim Jagielski     if( pBrdCst == pSourceViewConfig)
839*b1cdbd2cSJim Jagielski         SetFont();
840*b1cdbd2cSJim Jagielski }
841*b1cdbd2cSJim Jagielski 
842*b1cdbd2cSJim Jagielski /*-----------------30.06.97 13:22-------------------
843*b1cdbd2cSJim Jagielski 
844*b1cdbd2cSJim Jagielski --------------------------------------------------*/
845*b1cdbd2cSJim Jagielski 
Invalidate(sal_uInt16)846*b1cdbd2cSJim Jagielski void    SwSrcEditWindow::Invalidate(sal_uInt16 )
847*b1cdbd2cSJim Jagielski {
848*b1cdbd2cSJim Jagielski 	pOutWin->Invalidate();
849*b1cdbd2cSJim Jagielski 	Window::Invalidate();
850*b1cdbd2cSJim Jagielski 
851*b1cdbd2cSJim Jagielski }
852*b1cdbd2cSJim Jagielski 
Command(const CommandEvent & rCEvt)853*b1cdbd2cSJim Jagielski void SwSrcEditWindow::Command( const CommandEvent& rCEvt )
854*b1cdbd2cSJim Jagielski {
855*b1cdbd2cSJim Jagielski 	switch(rCEvt.GetCommand())
856*b1cdbd2cSJim Jagielski 	{
857*b1cdbd2cSJim Jagielski 		case COMMAND_WHEEL:
858*b1cdbd2cSJim Jagielski 		case COMMAND_STARTAUTOSCROLL:
859*b1cdbd2cSJim Jagielski 		case COMMAND_AUTOSCROLL:
860*b1cdbd2cSJim Jagielski 		{
861*b1cdbd2cSJim Jagielski 			const CommandWheelData* pWData = rCEvt.GetWheelData();
862*b1cdbd2cSJim Jagielski 			if( !pWData || COMMAND_WHEEL_ZOOM != pWData->GetMode() )
863*b1cdbd2cSJim Jagielski 				HandleScrollCommand( rCEvt, pHScrollbar, pVScrollbar );
864*b1cdbd2cSJim Jagielski 		}
865*b1cdbd2cSJim Jagielski 		break;
866*b1cdbd2cSJim Jagielski 		default:
867*b1cdbd2cSJim Jagielski 			Window::Command(rCEvt);
868*b1cdbd2cSJim Jagielski 	}
869*b1cdbd2cSJim Jagielski }
870*b1cdbd2cSJim Jagielski 
HandleWheelCommand(const CommandEvent & rCEvt)871*b1cdbd2cSJim Jagielski void SwSrcEditWindow::HandleWheelCommand( const CommandEvent& rCEvt )
872*b1cdbd2cSJim Jagielski {
873*b1cdbd2cSJim Jagielski 	pTextView->Command(rCEvt);
874*b1cdbd2cSJim Jagielski 	HandleScrollCommand( rCEvt, pHScrollbar, pVScrollbar );
875*b1cdbd2cSJim Jagielski }
876*b1cdbd2cSJim Jagielski 
GetFocus()877*b1cdbd2cSJim Jagielski void SwSrcEditWindow::GetFocus()
878*b1cdbd2cSJim Jagielski {
879*b1cdbd2cSJim Jagielski 	pOutWin->GrabFocus();
880*b1cdbd2cSJim Jagielski }
881*b1cdbd2cSJim Jagielski 
882*b1cdbd2cSJim Jagielski /*void SwSrcEditWindow::LoseFocus()
883*b1cdbd2cSJim Jagielski {
884*b1cdbd2cSJim Jagielski 	Window::LoseFocus();
885*b1cdbd2cSJim Jagielski //	pOutWin->LoseFocus();
886*b1cdbd2cSJim Jagielski //	rView.LostFocus();
887*b1cdbd2cSJim Jagielski } */
888*b1cdbd2cSJim Jagielski /* -----------------------------29.08.2002 13:21------------------------------
889*b1cdbd2cSJim Jagielski 
890*b1cdbd2cSJim Jagielski  ---------------------------------------------------------------------------*/
lcl_GetLanguagesForEncoding(rtl_TextEncoding eEnc,LanguageType aLanguages[])891*b1cdbd2cSJim Jagielski sal_Bool  lcl_GetLanguagesForEncoding(rtl_TextEncoding eEnc, LanguageType aLanguages[])
892*b1cdbd2cSJim Jagielski {
893*b1cdbd2cSJim Jagielski     switch(eEnc)
894*b1cdbd2cSJim Jagielski     {
895*b1cdbd2cSJim Jagielski         case RTL_TEXTENCODING_UTF7             :
896*b1cdbd2cSJim Jagielski         case RTL_TEXTENCODING_UTF8             :
897*b1cdbd2cSJim Jagielski             // don#t fill - all LANGUAGE_SYSTEM means unicode font has to be used
898*b1cdbd2cSJim Jagielski         break;
899*b1cdbd2cSJim Jagielski 
900*b1cdbd2cSJim Jagielski 
901*b1cdbd2cSJim Jagielski         case RTL_TEXTENCODING_ISO_8859_3:
902*b1cdbd2cSJim Jagielski         case RTL_TEXTENCODING_ISO_8859_1  :
903*b1cdbd2cSJim Jagielski         case RTL_TEXTENCODING_MS_1252     :
904*b1cdbd2cSJim Jagielski         case RTL_TEXTENCODING_APPLE_ROMAN :
905*b1cdbd2cSJim Jagielski         case RTL_TEXTENCODING_IBM_850     :
906*b1cdbd2cSJim Jagielski         case RTL_TEXTENCODING_ISO_8859_14 :
907*b1cdbd2cSJim Jagielski         case RTL_TEXTENCODING_ISO_8859_15 :
908*b1cdbd2cSJim Jagielski             //fill with western languages
909*b1cdbd2cSJim Jagielski             aLanguages[0] = LANGUAGE_GERMAN;
910*b1cdbd2cSJim Jagielski             aLanguages[1] = LANGUAGE_FRENCH;
911*b1cdbd2cSJim Jagielski             aLanguages[2] = LANGUAGE_ITALIAN;
912*b1cdbd2cSJim Jagielski             aLanguages[3] = LANGUAGE_SPANISH;
913*b1cdbd2cSJim Jagielski         break;
914*b1cdbd2cSJim Jagielski 
915*b1cdbd2cSJim Jagielski         case RTL_TEXTENCODING_IBM_865     :
916*b1cdbd2cSJim Jagielski             //scandinavian
917*b1cdbd2cSJim Jagielski             aLanguages[0] = LANGUAGE_FINNISH;
918*b1cdbd2cSJim Jagielski             aLanguages[1] = LANGUAGE_NORWEGIAN;
919*b1cdbd2cSJim Jagielski             aLanguages[2] = LANGUAGE_SWEDISH;
920*b1cdbd2cSJim Jagielski             aLanguages[3] = LANGUAGE_DANISH;
921*b1cdbd2cSJim Jagielski         break;
922*b1cdbd2cSJim Jagielski 
923*b1cdbd2cSJim Jagielski         case RTL_TEXTENCODING_ISO_8859_10      :
924*b1cdbd2cSJim Jagielski         case RTL_TEXTENCODING_ISO_8859_13      :
925*b1cdbd2cSJim Jagielski         case RTL_TEXTENCODING_ISO_8859_2  :
926*b1cdbd2cSJim Jagielski         case RTL_TEXTENCODING_IBM_852     :
927*b1cdbd2cSJim Jagielski         case RTL_TEXTENCODING_MS_1250     :
928*b1cdbd2cSJim Jagielski         case RTL_TEXTENCODING_APPLE_CENTEURO   :
929*b1cdbd2cSJim Jagielski             aLanguages[0] = LANGUAGE_POLISH;
930*b1cdbd2cSJim Jagielski             aLanguages[1] = LANGUAGE_CZECH;
931*b1cdbd2cSJim Jagielski             aLanguages[2] = LANGUAGE_HUNGARIAN;
932*b1cdbd2cSJim Jagielski             aLanguages[3] = LANGUAGE_SLOVAK;
933*b1cdbd2cSJim Jagielski         break;
934*b1cdbd2cSJim Jagielski 
935*b1cdbd2cSJim Jagielski         case RTL_TEXTENCODING_ISO_8859_4  :
936*b1cdbd2cSJim Jagielski         case RTL_TEXTENCODING_IBM_775     :
937*b1cdbd2cSJim Jagielski         case RTL_TEXTENCODING_MS_1257          :
938*b1cdbd2cSJim Jagielski             aLanguages[0] = LANGUAGE_LATVIAN   ;
939*b1cdbd2cSJim Jagielski             aLanguages[1] = LANGUAGE_LITHUANIAN;
940*b1cdbd2cSJim Jagielski             aLanguages[2] = LANGUAGE_ESTONIAN  ;
941*b1cdbd2cSJim Jagielski         break;
942*b1cdbd2cSJim Jagielski 
943*b1cdbd2cSJim Jagielski         case RTL_TEXTENCODING_IBM_863       : aLanguages[0] = LANGUAGE_FRENCH_CANADIAN; break;
944*b1cdbd2cSJim Jagielski         case RTL_TEXTENCODING_APPLE_FARSI   : aLanguages[0] = LANGUAGE_FARSI; break;
945*b1cdbd2cSJim Jagielski         case RTL_TEXTENCODING_APPLE_ROMANIAN:aLanguages[0] = LANGUAGE_ROMANIAN; break;
946*b1cdbd2cSJim Jagielski 
947*b1cdbd2cSJim Jagielski         case RTL_TEXTENCODING_IBM_861     :
948*b1cdbd2cSJim Jagielski         case RTL_TEXTENCODING_APPLE_ICELAND    :
949*b1cdbd2cSJim Jagielski             aLanguages[0] = LANGUAGE_ICELANDIC;
950*b1cdbd2cSJim Jagielski         break;
951*b1cdbd2cSJim Jagielski 
952*b1cdbd2cSJim Jagielski         case RTL_TEXTENCODING_APPLE_CROATIAN:aLanguages[0] = LANGUAGE_CROATIAN; break;
953*b1cdbd2cSJim Jagielski 
954*b1cdbd2cSJim Jagielski         case RTL_TEXTENCODING_IBM_437     :
955*b1cdbd2cSJim Jagielski         case RTL_TEXTENCODING_ASCII_US    : aLanguages[0] = LANGUAGE_ENGLISH; break;
956*b1cdbd2cSJim Jagielski 
957*b1cdbd2cSJim Jagielski         case RTL_TEXTENCODING_IBM_862     :
958*b1cdbd2cSJim Jagielski         case RTL_TEXTENCODING_MS_1255     :
959*b1cdbd2cSJim Jagielski         case RTL_TEXTENCODING_APPLE_HEBREW     :
960*b1cdbd2cSJim Jagielski         case RTL_TEXTENCODING_ISO_8859_8  :
961*b1cdbd2cSJim Jagielski             aLanguages[0] = LANGUAGE_HEBREW;
962*b1cdbd2cSJim Jagielski         break;
963*b1cdbd2cSJim Jagielski 
964*b1cdbd2cSJim Jagielski         case RTL_TEXTENCODING_IBM_857     :
965*b1cdbd2cSJim Jagielski         case RTL_TEXTENCODING_MS_1254     :
966*b1cdbd2cSJim Jagielski         case RTL_TEXTENCODING_APPLE_TURKISH:
967*b1cdbd2cSJim Jagielski         case RTL_TEXTENCODING_ISO_8859_9  :
968*b1cdbd2cSJim Jagielski             aLanguages[0] = LANGUAGE_TURKISH;
969*b1cdbd2cSJim Jagielski         break;
970*b1cdbd2cSJim Jagielski 
971*b1cdbd2cSJim Jagielski         case RTL_TEXTENCODING_IBM_860     :
972*b1cdbd2cSJim Jagielski             aLanguages[0] = LANGUAGE_PORTUGUESE;
973*b1cdbd2cSJim Jagielski         break;
974*b1cdbd2cSJim Jagielski 
975*b1cdbd2cSJim Jagielski         case RTL_TEXTENCODING_IBM_869     :
976*b1cdbd2cSJim Jagielski         case RTL_TEXTENCODING_MS_1253     :
977*b1cdbd2cSJim Jagielski         case RTL_TEXTENCODING_APPLE_GREEK :
978*b1cdbd2cSJim Jagielski         case RTL_TEXTENCODING_ISO_8859_7  :
979*b1cdbd2cSJim Jagielski         case RTL_TEXTENCODING_IBM_737     :
980*b1cdbd2cSJim Jagielski             aLanguages[0] = LANGUAGE_GREEK;
981*b1cdbd2cSJim Jagielski         break;
982*b1cdbd2cSJim Jagielski 
983*b1cdbd2cSJim Jagielski         case RTL_TEXTENCODING_KOI8_R      :
984*b1cdbd2cSJim Jagielski         case RTL_TEXTENCODING_ISO_8859_5  :
985*b1cdbd2cSJim Jagielski         case RTL_TEXTENCODING_IBM_855     :
986*b1cdbd2cSJim Jagielski         case RTL_TEXTENCODING_MS_1251     :
987*b1cdbd2cSJim Jagielski         case RTL_TEXTENCODING_IBM_866     :
988*b1cdbd2cSJim Jagielski         case RTL_TEXTENCODING_APPLE_CYRILLIC   :
989*b1cdbd2cSJim Jagielski             aLanguages[0] = LANGUAGE_RUSSIAN;
990*b1cdbd2cSJim Jagielski         break;
991*b1cdbd2cSJim Jagielski 
992*b1cdbd2cSJim Jagielski         case RTL_TEXTENCODING_APPLE_UKRAINIAN:
993*b1cdbd2cSJim Jagielski         case RTL_TEXTENCODING_KOI8_U:
994*b1cdbd2cSJim Jagielski             aLanguages[0] = LANGUAGE_UKRAINIAN;
995*b1cdbd2cSJim Jagielski             break;
996*b1cdbd2cSJim Jagielski 
997*b1cdbd2cSJim Jagielski         case RTL_TEXTENCODING_IBM_864     :
998*b1cdbd2cSJim Jagielski         case RTL_TEXTENCODING_MS_1256          :
999*b1cdbd2cSJim Jagielski         case RTL_TEXTENCODING_ISO_8859_6  :
1000*b1cdbd2cSJim Jagielski         case RTL_TEXTENCODING_APPLE_ARABIC :
1001*b1cdbd2cSJim Jagielski             aLanguages[0] = LANGUAGE_ARABIC_SAUDI_ARABIA;
1002*b1cdbd2cSJim Jagielski          break;
1003*b1cdbd2cSJim Jagielski 
1004*b1cdbd2cSJim Jagielski         case RTL_TEXTENCODING_APPLE_CHINTRAD   :
1005*b1cdbd2cSJim Jagielski         case RTL_TEXTENCODING_MS_950           :
1006*b1cdbd2cSJim Jagielski         case RTL_TEXTENCODING_GBT_12345        :
1007*b1cdbd2cSJim Jagielski         case RTL_TEXTENCODING_BIG5             :
1008*b1cdbd2cSJim Jagielski         case RTL_TEXTENCODING_EUC_TW           :
1009*b1cdbd2cSJim Jagielski         case RTL_TEXTENCODING_BIG5_HKSCS       :
1010*b1cdbd2cSJim Jagielski             aLanguages[0] = LANGUAGE_CHINESE_TRADITIONAL;
1011*b1cdbd2cSJim Jagielski         break;
1012*b1cdbd2cSJim Jagielski 
1013*b1cdbd2cSJim Jagielski         case RTL_TEXTENCODING_EUC_JP           :
1014*b1cdbd2cSJim Jagielski         case RTL_TEXTENCODING_ISO_2022_JP      :
1015*b1cdbd2cSJim Jagielski         case RTL_TEXTENCODING_JIS_X_0201       :
1016*b1cdbd2cSJim Jagielski         case RTL_TEXTENCODING_JIS_X_0208       :
1017*b1cdbd2cSJim Jagielski         case RTL_TEXTENCODING_JIS_X_0212       :
1018*b1cdbd2cSJim Jagielski         case RTL_TEXTENCODING_APPLE_JAPANESE   :
1019*b1cdbd2cSJim Jagielski         case RTL_TEXTENCODING_MS_932           :
1020*b1cdbd2cSJim Jagielski         case RTL_TEXTENCODING_SHIFT_JIS        :
1021*b1cdbd2cSJim Jagielski             aLanguages[0] = LANGUAGE_JAPANESE;
1022*b1cdbd2cSJim Jagielski         break;
1023*b1cdbd2cSJim Jagielski 
1024*b1cdbd2cSJim Jagielski         case RTL_TEXTENCODING_GB_2312          :
1025*b1cdbd2cSJim Jagielski         case RTL_TEXTENCODING_MS_936           :
1026*b1cdbd2cSJim Jagielski         case RTL_TEXTENCODING_GBK              :
1027*b1cdbd2cSJim Jagielski         case RTL_TEXTENCODING_GB_18030         :
1028*b1cdbd2cSJim Jagielski         case RTL_TEXTENCODING_APPLE_CHINSIMP   :
1029*b1cdbd2cSJim Jagielski         case RTL_TEXTENCODING_EUC_CN           :
1030*b1cdbd2cSJim Jagielski         case RTL_TEXTENCODING_ISO_2022_CN      :
1031*b1cdbd2cSJim Jagielski             aLanguages[0] = LANGUAGE_CHINESE_SIMPLIFIED;
1032*b1cdbd2cSJim Jagielski         break;
1033*b1cdbd2cSJim Jagielski 
1034*b1cdbd2cSJim Jagielski         case RTL_TEXTENCODING_APPLE_KOREAN     :
1035*b1cdbd2cSJim Jagielski         case RTL_TEXTENCODING_MS_949           :
1036*b1cdbd2cSJim Jagielski         case RTL_TEXTENCODING_EUC_KR           :
1037*b1cdbd2cSJim Jagielski         case RTL_TEXTENCODING_ISO_2022_KR      :
1038*b1cdbd2cSJim Jagielski         case RTL_TEXTENCODING_MS_1361          :
1039*b1cdbd2cSJim Jagielski             aLanguages[0] = LANGUAGE_KOREAN;
1040*b1cdbd2cSJim Jagielski         break;
1041*b1cdbd2cSJim Jagielski 
1042*b1cdbd2cSJim Jagielski         case RTL_TEXTENCODING_APPLE_THAI       :
1043*b1cdbd2cSJim Jagielski         case RTL_TEXTENCODING_MS_874      :
1044*b1cdbd2cSJim Jagielski         case RTL_TEXTENCODING_TIS_620          :
1045*b1cdbd2cSJim Jagielski             aLanguages[0] = LANGUAGE_THAI;
1046*b1cdbd2cSJim Jagielski         break;
1047*b1cdbd2cSJim Jagielski //        case RTL_TEXTENCODING_SYMBOL      :
1048*b1cdbd2cSJim Jagielski //        case RTL_TEXTENCODING_DONTKNOW:        :
1049*b1cdbd2cSJim Jagielski         default: aLanguages[0] = Application::GetSettings().GetUILanguage();
1050*b1cdbd2cSJim Jagielski     }
1051*b1cdbd2cSJim Jagielski     return aLanguages[0] != LANGUAGE_SYSTEM;
1052*b1cdbd2cSJim Jagielski }
SetFont()1053*b1cdbd2cSJim Jagielski void SwSrcEditWindow::SetFont()
1054*b1cdbd2cSJim Jagielski {
1055*b1cdbd2cSJim Jagielski     String sFontName = pSourceViewConfig->GetFontName();
1056*b1cdbd2cSJim Jagielski     if(!sFontName.Len())
1057*b1cdbd2cSJim Jagielski     {
1058*b1cdbd2cSJim Jagielski         LanguageType aLanguages[5] =
1059*b1cdbd2cSJim Jagielski         {
1060*b1cdbd2cSJim Jagielski             LANGUAGE_SYSTEM, LANGUAGE_SYSTEM, LANGUAGE_SYSTEM, LANGUAGE_SYSTEM, LANGUAGE_SYSTEM
1061*b1cdbd2cSJim Jagielski         };
1062*b1cdbd2cSJim Jagielski         Font aFont;
1063*b1cdbd2cSJim Jagielski         if(lcl_GetLanguagesForEncoding(eSourceEncoding, aLanguages))
1064*b1cdbd2cSJim Jagielski         {
1065*b1cdbd2cSJim Jagielski             //TODO: check for multiple languages
1066*b1cdbd2cSJim Jagielski             aFont = OutputDevice::GetDefaultFont(DEFAULTFONT_FIXED, aLanguages[0], 0, this);
1067*b1cdbd2cSJim Jagielski         }
1068*b1cdbd2cSJim Jagielski         else
1069*b1cdbd2cSJim Jagielski             aFont = OutputDevice::GetDefaultFont(DEFAULTFONT_SANS_UNICODE,
1070*b1cdbd2cSJim Jagielski                         Application::GetSettings().GetLanguage(), 0, this);
1071*b1cdbd2cSJim Jagielski         sFontName = aFont.GetName();
1072*b1cdbd2cSJim Jagielski     }
1073*b1cdbd2cSJim Jagielski     const SvxFontListItem* pFontListItem =
1074*b1cdbd2cSJim Jagielski         (const SvxFontListItem* )pSrcView->GetDocShell()->GetItem( SID_ATTR_CHAR_FONTLIST );
1075*b1cdbd2cSJim Jagielski 	const FontList*	 pList = pFontListItem->GetFontList();
1076*b1cdbd2cSJim Jagielski     FontInfo aInfo = pList->Get(sFontName,WEIGHT_NORMAL, ITALIC_NONE);
1077*b1cdbd2cSJim Jagielski 
1078*b1cdbd2cSJim Jagielski     const Font& rFont = GetTextEngine()->GetFont();
1079*b1cdbd2cSJim Jagielski 	Font aFont(aInfo);
1080*b1cdbd2cSJim Jagielski     Size aSize(rFont.GetSize());
1081*b1cdbd2cSJim Jagielski     //font height is stored in point and set in twip
1082*b1cdbd2cSJim Jagielski     aSize.Height() = pSourceViewConfig->GetFontHeight() * 20;
1083*b1cdbd2cSJim Jagielski     aFont.SetSize(pOutWin->LogicToPixel(aSize, MAP_TWIP));
1084*b1cdbd2cSJim Jagielski     GetTextEngine()->SetFont( aFont );
1085*b1cdbd2cSJim Jagielski     pOutWin->SetFont(aFont);
1086*b1cdbd2cSJim Jagielski }
1087*b1cdbd2cSJim Jagielski /* -----------------------------29.08.2002 13:47------------------------------
1088*b1cdbd2cSJim Jagielski 
1089*b1cdbd2cSJim Jagielski  ---------------------------------------------------------------------------*/
SetTextEncoding(rtl_TextEncoding eEncoding)1090*b1cdbd2cSJim Jagielski void SwSrcEditWindow::SetTextEncoding(rtl_TextEncoding eEncoding)
1091*b1cdbd2cSJim Jagielski {
1092*b1cdbd2cSJim Jagielski     eSourceEncoding = eEncoding;
1093*b1cdbd2cSJim Jagielski     SetFont();
1094*b1cdbd2cSJim Jagielski }
1095*b1cdbd2cSJim Jagielski 
1096