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_filter.hxx"
26*b1cdbd2cSJim Jagielski #include <com/sun/star/xml/sax/XDocumentHandler.hpp>
27*b1cdbd2cSJim Jagielski #include <com/sun/star/xml/sax/XErrorHandler.hpp>
28*b1cdbd2cSJim Jagielski #include <com/sun/star/xml/sax/SAXParseException.hpp>
29*b1cdbd2cSJim Jagielski #include <com/sun/star/xml/XImportFilter.hpp>
30*b1cdbd2cSJim Jagielski #include <com/sun/star/io/XActiveDataSource.hpp>
31*b1cdbd2cSJim Jagielski #include <comphelper/oslfile2streamwrap.hxx>
32*b1cdbd2cSJim Jagielski 
33*b1cdbd2cSJim Jagielski #include <rtl/tencinfo.h>
34*b1cdbd2cSJim Jagielski #include <vcl/svapp.hxx>
35*b1cdbd2cSJim Jagielski #include <vos/mutex.hxx>
36*b1cdbd2cSJim Jagielski #include <svtools/textview.hxx>
37*b1cdbd2cSJim Jagielski #ifndef _SCRBAR_HXX //autogen
38*b1cdbd2cSJim Jagielski #include <vcl/scrbar.hxx>
39*b1cdbd2cSJim Jagielski #endif
40*b1cdbd2cSJim Jagielski #include <tools/stream.hxx>
41*b1cdbd2cSJim Jagielski #include <tools/time.hxx>
42*b1cdbd2cSJim Jagielski #include <osl/file.hxx>
43*b1cdbd2cSJim Jagielski #include <vcl/msgbox.hxx>
44*b1cdbd2cSJim Jagielski #include <svtools/colorcfg.hxx>
45*b1cdbd2cSJim Jagielski #include <svtools/htmltokn.h>
46*b1cdbd2cSJim Jagielski #include <svtools/txtattr.hxx>
47*b1cdbd2cSJim Jagielski 
48*b1cdbd2cSJim Jagielski #include "xmlfilterdialogstrings.hrc"
49*b1cdbd2cSJim Jagielski #include "xmlfiltersettingsdialog.hxx"
50*b1cdbd2cSJim Jagielski #include "xmlfileview.hxx"
51*b1cdbd2cSJim Jagielski #include "xmlfileview.hrc"
52*b1cdbd2cSJim Jagielski #include "xmlfilterhelpids.hrc"
53*b1cdbd2cSJim Jagielski 
54*b1cdbd2cSJim Jagielski #include <deque>
55*b1cdbd2cSJim Jagielski 
56*b1cdbd2cSJim Jagielski using namespace rtl;
57*b1cdbd2cSJim Jagielski using namespace osl;
58*b1cdbd2cSJim Jagielski using namespace com::sun::star::lang;
59*b1cdbd2cSJim Jagielski using namespace com::sun::star::beans;
60*b1cdbd2cSJim Jagielski using namespace com::sun::star::uno;
61*b1cdbd2cSJim Jagielski using namespace com::sun::star::io;
62*b1cdbd2cSJim Jagielski using namespace com::sun::star::xml;
63*b1cdbd2cSJim Jagielski using namespace com::sun::star::xml::sax;
64*b1cdbd2cSJim Jagielski 
65*b1cdbd2cSJim Jagielski 
66*b1cdbd2cSJim Jagielski #define MAX_SYNTAX_HIGHLIGHT 20
67*b1cdbd2cSJim Jagielski #define MAX_HIGHLIGHTTIME 200
68*b1cdbd2cSJim Jagielski #define SYNTAX_HIGHLIGHT_TIMEOUT 200
69*b1cdbd2cSJim Jagielski 
70*b1cdbd2cSJim Jagielski 
71*b1cdbd2cSJim Jagielski struct SwTextPortion
72*b1cdbd2cSJim Jagielski {
73*b1cdbd2cSJim Jagielski 	sal_uInt16 nLine;
74*b1cdbd2cSJim Jagielski 	sal_uInt16 nStart, nEnd;
75*b1cdbd2cSJim Jagielski 	svtools::ColorConfigEntry eType;
76*b1cdbd2cSJim Jagielski };
77*b1cdbd2cSJim Jagielski 
78*b1cdbd2cSJim Jagielski typedef std::deque<SwTextPortion> SwTextPortions;
79*b1cdbd2cSJim Jagielski 
80*b1cdbd2cSJim Jagielski class XMLErrorHandler : public ::cppu::WeakImplHelper1< XErrorHandler >
81*b1cdbd2cSJim Jagielski {
82*b1cdbd2cSJim Jagielski public:
83*b1cdbd2cSJim Jagielski 	XMLErrorHandler( XMLSourceFileDialog* pParent, ListBox& rListBox );
84*b1cdbd2cSJim Jagielski 
85*b1cdbd2cSJim Jagielski     // Methods
86*b1cdbd2cSJim Jagielski     virtual void SAL_CALL error( const Any& aSAXParseException ) throw (SAXException, RuntimeException);
87*b1cdbd2cSJim Jagielski     virtual void SAL_CALL fatalError( const Any& aSAXParseException ) throw (SAXException, RuntimeException);
88*b1cdbd2cSJim Jagielski     virtual void SAL_CALL warning( const Any& aSAXParseException ) throw (SAXException, RuntimeException);
89*b1cdbd2cSJim Jagielski 
90*b1cdbd2cSJim Jagielski private:
91*b1cdbd2cSJim Jagielski 	XMLSourceFileDialog*	mpParent;
92*b1cdbd2cSJim Jagielski 	ListBox&	mrListBox;
93*b1cdbd2cSJim Jagielski };
94*b1cdbd2cSJim Jagielski 
XMLErrorHandler(XMLSourceFileDialog * pParent,ListBox & rListBox)95*b1cdbd2cSJim Jagielski XMLErrorHandler::XMLErrorHandler( XMLSourceFileDialog* pParent, ListBox& rListBox )
96*b1cdbd2cSJim Jagielski :	mpParent( pParent ),
97*b1cdbd2cSJim Jagielski 	mrListBox( rListBox )
98*b1cdbd2cSJim Jagielski {
99*b1cdbd2cSJim Jagielski }
100*b1cdbd2cSJim Jagielski 
101*b1cdbd2cSJim Jagielski // XMLErrorHandler
error(const Any & aSAXParseException)102*b1cdbd2cSJim Jagielski void SAL_CALL XMLErrorHandler::error( const Any& aSAXParseException ) throw (SAXException, RuntimeException)
103*b1cdbd2cSJim Jagielski {
104*b1cdbd2cSJim Jagielski 	vos::OGuard aGuard( Application::GetSolarMutex() );
105*b1cdbd2cSJim Jagielski 
106*b1cdbd2cSJim Jagielski 	SAXParseException e;
107*b1cdbd2cSJim Jagielski 	if( aSAXParseException >>= e )
108*b1cdbd2cSJim Jagielski 	{
109*b1cdbd2cSJim Jagielski 		String sErr( String::CreateFromInt32( e.LineNumber ) );
110*b1cdbd2cSJim Jagielski 		sErr += String( RTL_CONSTASCII_USTRINGPARAM( " : " ) );
111*b1cdbd2cSJim Jagielski 		sErr += String( e.Message );
112*b1cdbd2cSJim Jagielski 		sal_uInt16 nEntry = mrListBox.InsertEntry( sErr );
113*b1cdbd2cSJim Jagielski 		mrListBox.SetEntryData( nEntry, (void*)e.LineNumber );
114*b1cdbd2cSJim Jagielski 	}
115*b1cdbd2cSJim Jagielski }
116*b1cdbd2cSJim Jagielski 
fatalError(const Any & aSAXParseException)117*b1cdbd2cSJim Jagielski void SAL_CALL XMLErrorHandler::fatalError( const Any& aSAXParseException ) throw (SAXException, RuntimeException)
118*b1cdbd2cSJim Jagielski {
119*b1cdbd2cSJim Jagielski 	vos::OGuard aGuard( Application::GetSolarMutex() );
120*b1cdbd2cSJim Jagielski 
121*b1cdbd2cSJim Jagielski 	SAXParseException e;
122*b1cdbd2cSJim Jagielski 	if( aSAXParseException >>= e )
123*b1cdbd2cSJim Jagielski 	{
124*b1cdbd2cSJim Jagielski 		String sErr( String::CreateFromInt32( e.LineNumber ) );
125*b1cdbd2cSJim Jagielski 		sErr += String( RTL_CONSTASCII_USTRINGPARAM( " : " ) );
126*b1cdbd2cSJim Jagielski 		sErr += String( e.Message );
127*b1cdbd2cSJim Jagielski 		sal_uInt16 nEntry = mrListBox.InsertEntry( sErr );
128*b1cdbd2cSJim Jagielski 		mrListBox.SetEntryData( nEntry, (void*)e.LineNumber );
129*b1cdbd2cSJim Jagielski 	}
130*b1cdbd2cSJim Jagielski }
131*b1cdbd2cSJim Jagielski 
warning(const Any &)132*b1cdbd2cSJim Jagielski void SAL_CALL XMLErrorHandler::warning( const Any& /* aSAXParseException */ ) throw (SAXException, RuntimeException)
133*b1cdbd2cSJim Jagielski {
134*b1cdbd2cSJim Jagielski /*
135*b1cdbd2cSJim Jagielski 	SAXParseException e;
136*b1cdbd2cSJim Jagielski 	if( aSAXParseException >>= e )
137*b1cdbd2cSJim Jagielski 	{
138*b1cdbd2cSJim Jagielski 		String sErr( String::CreateFromInt32( e.LineNumber ) );
139*b1cdbd2cSJim Jagielski 		sErr += String( RTL_CONSTASCII_USTRINGPARAM( " : " ) );
140*b1cdbd2cSJim Jagielski 		sErr += String( e.Message );
141*b1cdbd2cSJim Jagielski 		sal_uInt16 nEntry = mrListBox.InsertEntry( sErr );
142*b1cdbd2cSJim Jagielski 		mrListBox.SetEntryData( nEntry, (void*)e.LineNumber );
143*b1cdbd2cSJim Jagielski 	}
144*b1cdbd2cSJim Jagielski */
145*b1cdbd2cSJim Jagielski }
146*b1cdbd2cSJim Jagielski 
147*b1cdbd2cSJim Jagielski 
XMLFileWindow(Window * pParent)148*b1cdbd2cSJim Jagielski XMLFileWindow::XMLFileWindow( Window* pParent ) :
149*b1cdbd2cSJim Jagielski 	Window( pParent, WB_BORDER|WB_CLIPCHILDREN ),
150*b1cdbd2cSJim Jagielski 	pTextEngine(0),
151*b1cdbd2cSJim Jagielski 	pOutWin(0),
152*b1cdbd2cSJim Jagielski 	pHScrollbar(0),
153*b1cdbd2cSJim Jagielski 	pVScrollbar(0),
154*b1cdbd2cSJim Jagielski 	nCurTextWidth(0),
155*b1cdbd2cSJim Jagielski     nStartLine(USHRT_MAX),
156*b1cdbd2cSJim Jagielski     eSourceEncoding(gsl_getSystemTextEncoding()),
157*b1cdbd2cSJim Jagielski 	bHighlighting(false)
158*b1cdbd2cSJim Jagielski {
159*b1cdbd2cSJim Jagielski 	CreateTextEngine();
160*b1cdbd2cSJim Jagielski }
161*b1cdbd2cSJim Jagielski 
~XMLFileWindow()162*b1cdbd2cSJim Jagielski XMLFileWindow::~XMLFileWindow()
163*b1cdbd2cSJim Jagielski {
164*b1cdbd2cSJim Jagielski 	if ( pTextEngine )
165*b1cdbd2cSJim Jagielski 	{
166*b1cdbd2cSJim Jagielski 		EndListening( *pTextEngine );
167*b1cdbd2cSJim Jagielski 		pTextEngine->RemoveView( pTextView );
168*b1cdbd2cSJim Jagielski 
169*b1cdbd2cSJim Jagielski 		delete pHScrollbar;
170*b1cdbd2cSJim Jagielski 		delete pVScrollbar;
171*b1cdbd2cSJim Jagielski 
172*b1cdbd2cSJim Jagielski 		delete pTextView;
173*b1cdbd2cSJim Jagielski 		delete pTextEngine;
174*b1cdbd2cSJim Jagielski 	}
175*b1cdbd2cSJim Jagielski 	delete pOutWin;
176*b1cdbd2cSJim Jagielski }
177*b1cdbd2cSJim Jagielski 
DataChanged(const DataChangedEvent & rDCEvt)178*b1cdbd2cSJim Jagielski void XMLFileWindow::DataChanged( const DataChangedEvent& rDCEvt )
179*b1cdbd2cSJim Jagielski {
180*b1cdbd2cSJim Jagielski 	Window::DataChanged( rDCEvt );
181*b1cdbd2cSJim Jagielski 
182*b1cdbd2cSJim Jagielski 	switch ( rDCEvt.GetType() )
183*b1cdbd2cSJim Jagielski 	{
184*b1cdbd2cSJim Jagielski 	case DATACHANGED_SETTINGS:
185*b1cdbd2cSJim Jagielski 		// ScrollBars neu anordnen bzw. Resize ausloesen, da sich
186*b1cdbd2cSJim Jagielski 		// ScrollBar-Groesse geaendert haben kann. Dazu muss dann im
187*b1cdbd2cSJim Jagielski 		// Resize-Handler aber auch die Groesse der ScrollBars aus
188*b1cdbd2cSJim Jagielski 		// den Settings abgefragt werden.
189*b1cdbd2cSJim Jagielski 		if( rDCEvt.GetFlags() & SETTINGS_STYLE )
190*b1cdbd2cSJim Jagielski 			Resize();
191*b1cdbd2cSJim Jagielski 		break;
192*b1cdbd2cSJim Jagielski 	}
193*b1cdbd2cSJim Jagielski }
194*b1cdbd2cSJim Jagielski 
Resize()195*b1cdbd2cSJim Jagielski void XMLFileWindow::Resize()
196*b1cdbd2cSJim Jagielski {
197*b1cdbd2cSJim Jagielski 	// ScrollBars, etc. passiert in Adjust...
198*b1cdbd2cSJim Jagielski 	if ( pTextView )
199*b1cdbd2cSJim Jagielski 	{
200*b1cdbd2cSJim Jagielski 		long nVisY = pTextView->GetStartDocPos().Y();
201*b1cdbd2cSJim Jagielski 		pTextView->ShowCursor();
202*b1cdbd2cSJim Jagielski 		Size aOutSz( GetOutputSizePixel() );
203*b1cdbd2cSJim Jagielski 		long nMaxVisAreaStart = pTextView->GetTextEngine()->GetTextHeight() - aOutSz.Height();
204*b1cdbd2cSJim Jagielski 		if ( nMaxVisAreaStart < 0 )
205*b1cdbd2cSJim Jagielski 			nMaxVisAreaStart = 0;
206*b1cdbd2cSJim Jagielski 		if ( pTextView->GetStartDocPos().Y() > nMaxVisAreaStart )
207*b1cdbd2cSJim Jagielski 		{
208*b1cdbd2cSJim Jagielski 			Point aStartDocPos( pTextView->GetStartDocPos() );
209*b1cdbd2cSJim Jagielski 			aStartDocPos.Y() = nMaxVisAreaStart;
210*b1cdbd2cSJim Jagielski 			pTextView->SetStartDocPos( aStartDocPos );
211*b1cdbd2cSJim Jagielski 			pTextView->ShowCursor();
212*b1cdbd2cSJim Jagielski 		}
213*b1cdbd2cSJim Jagielski         long nScrollStd = GetSettings().GetStyleSettings().GetScrollBarSize();
214*b1cdbd2cSJim Jagielski 		Size aScrollSz(aOutSz.Width() - nScrollStd, nScrollStd );
215*b1cdbd2cSJim Jagielski 		Point aScrollPos(0, aOutSz.Height() - nScrollStd);
216*b1cdbd2cSJim Jagielski 
217*b1cdbd2cSJim Jagielski 		pHScrollbar->SetPosSizePixel( aScrollPos, aScrollSz);
218*b1cdbd2cSJim Jagielski 
219*b1cdbd2cSJim Jagielski 		aScrollSz.Width() = aScrollSz.Height();
220*b1cdbd2cSJim Jagielski 		aScrollSz.Height() = aOutSz.Height() - aScrollSz.Height();
221*b1cdbd2cSJim Jagielski 		aScrollPos = Point(aOutSz.Width() - nScrollStd, 0);
222*b1cdbd2cSJim Jagielski 
223*b1cdbd2cSJim Jagielski 		pVScrollbar->SetPosSizePixel( aScrollPos, aScrollSz);
224*b1cdbd2cSJim Jagielski 		aOutSz.Width() 	-= nScrollStd;
225*b1cdbd2cSJim Jagielski 		aOutSz.Height() 	-= nScrollStd;
226*b1cdbd2cSJim Jagielski 		pOutWin->SetOutputSizePixel(aOutSz);
227*b1cdbd2cSJim Jagielski         InitScrollBars();
228*b1cdbd2cSJim Jagielski 
229*b1cdbd2cSJim Jagielski         // Zeile im ersten Resize setzen
230*b1cdbd2cSJim Jagielski 		if(USHRT_MAX != nStartLine)
231*b1cdbd2cSJim Jagielski 		{
232*b1cdbd2cSJim Jagielski 			if(nStartLine < pTextEngine->GetParagraphCount())
233*b1cdbd2cSJim Jagielski 			{
234*b1cdbd2cSJim Jagielski 				TextSelection aSel(TextPaM( nStartLine, 0 ), TextPaM( nStartLine, 0x0 ));
235*b1cdbd2cSJim Jagielski 				pTextView->SetSelection(aSel);
236*b1cdbd2cSJim Jagielski 				pTextView->ShowCursor();
237*b1cdbd2cSJim Jagielski 			}
238*b1cdbd2cSJim Jagielski 			nStartLine = USHRT_MAX;
239*b1cdbd2cSJim Jagielski 		}
240*b1cdbd2cSJim Jagielski 
241*b1cdbd2cSJim Jagielski 		if ( nVisY != pTextView->GetStartDocPos().Y() )
242*b1cdbd2cSJim Jagielski 			InvalidateWindow();
243*b1cdbd2cSJim Jagielski 	}
244*b1cdbd2cSJim Jagielski 
245*b1cdbd2cSJim Jagielski }
246*b1cdbd2cSJim Jagielski 
DataChanged(const DataChangedEvent & rDCEvt)247*b1cdbd2cSJim Jagielski void TextViewOutWin::DataChanged( const DataChangedEvent& rDCEvt )
248*b1cdbd2cSJim Jagielski {
249*b1cdbd2cSJim Jagielski 	Window::DataChanged( rDCEvt );
250*b1cdbd2cSJim Jagielski 
251*b1cdbd2cSJim Jagielski 	switch( rDCEvt.GetType() )
252*b1cdbd2cSJim Jagielski 	{
253*b1cdbd2cSJim Jagielski 	case DATACHANGED_SETTINGS:
254*b1cdbd2cSJim Jagielski 		// den Settings abgefragt werden.
255*b1cdbd2cSJim Jagielski 		if( rDCEvt.GetFlags() & SETTINGS_STYLE )
256*b1cdbd2cSJim Jagielski 		{
257*b1cdbd2cSJim Jagielski 			const Color &rCol = GetSettings().GetStyleSettings().GetWindowColor();
258*b1cdbd2cSJim Jagielski 			SetBackground( rCol );
259*b1cdbd2cSJim Jagielski 			Font aFont( pTextView->GetTextEngine()->GetFont() );
260*b1cdbd2cSJim Jagielski 			aFont.SetFillColor( rCol );
261*b1cdbd2cSJim Jagielski 			pTextView->GetTextEngine()->SetFont( aFont );
262*b1cdbd2cSJim Jagielski 		}
263*b1cdbd2cSJim Jagielski 		break;
264*b1cdbd2cSJim Jagielski 	}
265*b1cdbd2cSJim Jagielski }
266*b1cdbd2cSJim Jagielski 
MouseMove(const MouseEvent & rEvt)267*b1cdbd2cSJim Jagielski void TextViewOutWin::MouseMove( const MouseEvent &rEvt )
268*b1cdbd2cSJim Jagielski {
269*b1cdbd2cSJim Jagielski 	if ( pTextView )
270*b1cdbd2cSJim Jagielski 		pTextView->MouseMove( rEvt );
271*b1cdbd2cSJim Jagielski }
272*b1cdbd2cSJim Jagielski 
MouseButtonUp(const MouseEvent & rEvt)273*b1cdbd2cSJim Jagielski void TextViewOutWin::MouseButtonUp( const MouseEvent &rEvt )
274*b1cdbd2cSJim Jagielski {
275*b1cdbd2cSJim Jagielski 	if ( pTextView )
276*b1cdbd2cSJim Jagielski 		pTextView->MouseButtonUp( rEvt );
277*b1cdbd2cSJim Jagielski }
278*b1cdbd2cSJim Jagielski 
MouseButtonDown(const MouseEvent & rEvt)279*b1cdbd2cSJim Jagielski void TextViewOutWin::MouseButtonDown( const MouseEvent &rEvt )
280*b1cdbd2cSJim Jagielski {
281*b1cdbd2cSJim Jagielski 	GrabFocus();
282*b1cdbd2cSJim Jagielski 	if ( pTextView )
283*b1cdbd2cSJim Jagielski 		pTextView->MouseButtonDown( rEvt );
284*b1cdbd2cSJim Jagielski }
285*b1cdbd2cSJim Jagielski 
Command(const CommandEvent & rCEvt)286*b1cdbd2cSJim Jagielski void TextViewOutWin::Command( const CommandEvent& rCEvt )
287*b1cdbd2cSJim Jagielski {
288*b1cdbd2cSJim Jagielski 	switch(rCEvt.GetCommand())
289*b1cdbd2cSJim Jagielski 	{
290*b1cdbd2cSJim Jagielski 		case COMMAND_CONTEXTMENU:
291*b1cdbd2cSJim Jagielski 		break;
292*b1cdbd2cSJim Jagielski 		case COMMAND_WHEEL:
293*b1cdbd2cSJim Jagielski 		case COMMAND_STARTAUTOSCROLL:
294*b1cdbd2cSJim Jagielski 		case COMMAND_AUTOSCROLL:
295*b1cdbd2cSJim Jagielski 		{
296*b1cdbd2cSJim Jagielski 			const CommandWheelData* pWData = rCEvt.GetWheelData();
297*b1cdbd2cSJim Jagielski 			if( !pWData || COMMAND_WHEEL_ZOOM != pWData->GetMode() )
298*b1cdbd2cSJim Jagielski 			{
299*b1cdbd2cSJim Jagielski 				((XMLFileWindow*)GetParent())->HandleWheelCommand( rCEvt );
300*b1cdbd2cSJim Jagielski 			}
301*b1cdbd2cSJim Jagielski 		}
302*b1cdbd2cSJim Jagielski 		break;
303*b1cdbd2cSJim Jagielski 
304*b1cdbd2cSJim Jagielski 		default:
305*b1cdbd2cSJim Jagielski 			if ( pTextView )
306*b1cdbd2cSJim Jagielski 				pTextView->Command( rCEvt );
307*b1cdbd2cSJim Jagielski 		else
308*b1cdbd2cSJim Jagielski 			Window::Command(rCEvt);
309*b1cdbd2cSJim Jagielski 	}
310*b1cdbd2cSJim Jagielski }
311*b1cdbd2cSJim Jagielski 
KeyInput(const KeyEvent & rKEvt)312*b1cdbd2cSJim Jagielski void TextViewOutWin::KeyInput( const KeyEvent& rKEvt )
313*b1cdbd2cSJim Jagielski {
314*b1cdbd2cSJim Jagielski 	if(!TextEngine::DoesKeyChangeText( rKEvt ))
315*b1cdbd2cSJim Jagielski 		pTextView->KeyInput( rKEvt );
316*b1cdbd2cSJim Jagielski }
317*b1cdbd2cSJim Jagielski 
Paint(const Rectangle & rRect)318*b1cdbd2cSJim Jagielski void  TextViewOutWin::Paint( const Rectangle& rRect )
319*b1cdbd2cSJim Jagielski {
320*b1cdbd2cSJim Jagielski 	pTextView->Paint( rRect );
321*b1cdbd2cSJim Jagielski }
322*b1cdbd2cSJim Jagielski 
CreateTextEngine()323*b1cdbd2cSJim Jagielski void XMLFileWindow::CreateTextEngine()
324*b1cdbd2cSJim Jagielski {
325*b1cdbd2cSJim Jagielski 	const Color &rCol = GetSettings().GetStyleSettings().GetWindowColor();
326*b1cdbd2cSJim Jagielski 	pOutWin = new TextViewOutWin(this, 0);
327*b1cdbd2cSJim Jagielski 	pOutWin->SetBackground(Wallpaper(rCol));
328*b1cdbd2cSJim Jagielski 	pOutWin->SetPointer(Pointer(POINTER_TEXT));
329*b1cdbd2cSJim Jagielski 	pOutWin->Show();
330*b1cdbd2cSJim Jagielski 
331*b1cdbd2cSJim Jagielski 	//Scrollbars anlegen
332*b1cdbd2cSJim Jagielski 	pHScrollbar = new ScrollBar(this, WB_3DLOOK |WB_HSCROLL|WB_DRAG);
333*b1cdbd2cSJim Jagielski 	pHScrollbar->SetScrollHdl(LINK(this, XMLFileWindow, ScrollHdl));
334*b1cdbd2cSJim Jagielski 	pHScrollbar->Show();
335*b1cdbd2cSJim Jagielski 
336*b1cdbd2cSJim Jagielski 	pVScrollbar = new ScrollBar(this, WB_3DLOOK |WB_VSCROLL|WB_DRAG);
337*b1cdbd2cSJim Jagielski 	pVScrollbar->SetScrollHdl(LINK(this, XMLFileWindow, ScrollHdl));
338*b1cdbd2cSJim Jagielski 	pHScrollbar->EnableDrag();
339*b1cdbd2cSJim Jagielski 	pVScrollbar->Show();
340*b1cdbd2cSJim Jagielski 
341*b1cdbd2cSJim Jagielski 	pTextEngine = new TextEngine;
342*b1cdbd2cSJim Jagielski 	pTextView = new TextView( pTextEngine, pOutWin );
343*b1cdbd2cSJim Jagielski 	pTextView->SetAutoIndentMode(sal_True);
344*b1cdbd2cSJim Jagielski 	pOutWin->SetTextView(pTextView);
345*b1cdbd2cSJim Jagielski 
346*b1cdbd2cSJim Jagielski 	pTextEngine->SetUpdateMode( sal_False );
347*b1cdbd2cSJim Jagielski 	pTextEngine->InsertView( pTextView );
348*b1cdbd2cSJim Jagielski 
349*b1cdbd2cSJim Jagielski 	Font aFont;
350*b1cdbd2cSJim Jagielski 	aFont.SetTransparent( sal_False );
351*b1cdbd2cSJim Jagielski 	aFont.SetFillColor( rCol );
352*b1cdbd2cSJim Jagielski 	SetPointFont( aFont );
353*b1cdbd2cSJim Jagielski 	aFont = GetFont();
354*b1cdbd2cSJim Jagielski 	aFont.SetFillColor( rCol );
355*b1cdbd2cSJim Jagielski 	pOutWin->SetFont( aFont );
356*b1cdbd2cSJim Jagielski 	pTextEngine->SetFont( aFont );
357*b1cdbd2cSJim Jagielski 
358*b1cdbd2cSJim Jagielski     aSyntaxIdleTimer.SetTimeout( SYNTAX_HIGHLIGHT_TIMEOUT );
359*b1cdbd2cSJim Jagielski 	aSyntaxIdleTimer.SetTimeoutHdl( LINK( this, XMLFileWindow, SyntaxTimerHdl ) );
360*b1cdbd2cSJim Jagielski 
361*b1cdbd2cSJim Jagielski 	pTextEngine->EnableUndo( sal_False );
362*b1cdbd2cSJim Jagielski 	pTextEngine->SetUpdateMode( sal_True );
363*b1cdbd2cSJim Jagielski 
364*b1cdbd2cSJim Jagielski //	pTextView->ShowCursor( sal_True, sal_True );
365*b1cdbd2cSJim Jagielski 	pTextView->HideCursor();
366*b1cdbd2cSJim Jagielski 
367*b1cdbd2cSJim Jagielski 	InitScrollBars();
368*b1cdbd2cSJim Jagielski 	StartListening( *pTextEngine );
369*b1cdbd2cSJim Jagielski }
370*b1cdbd2cSJim Jagielski 
SetScrollBarRanges()371*b1cdbd2cSJim Jagielski void XMLFileWindow::SetScrollBarRanges()
372*b1cdbd2cSJim Jagielski {
373*b1cdbd2cSJim Jagielski 	pHScrollbar->SetRange( Range( 0, nCurTextWidth-1 ) );
374*b1cdbd2cSJim Jagielski 	pVScrollbar->SetRange( Range(0, pTextEngine->GetTextHeight()-1) );
375*b1cdbd2cSJim Jagielski }
376*b1cdbd2cSJim Jagielski 
InitScrollBars()377*b1cdbd2cSJim Jagielski void XMLFileWindow::InitScrollBars()
378*b1cdbd2cSJim Jagielski {
379*b1cdbd2cSJim Jagielski 	SetScrollBarRanges();
380*b1cdbd2cSJim Jagielski 
381*b1cdbd2cSJim Jagielski     Size aOutSz( pOutWin->GetOutputSizePixel() );
382*b1cdbd2cSJim Jagielski     pVScrollbar->SetVisibleSize( aOutSz.Height() );
383*b1cdbd2cSJim Jagielski 	pVScrollbar->SetPageSize(  aOutSz.Height() * 8 / 10 );
384*b1cdbd2cSJim Jagielski 	pVScrollbar->SetLineSize( pOutWin->GetTextHeight() );
385*b1cdbd2cSJim Jagielski 	pVScrollbar->SetThumbPos( pTextView->GetStartDocPos().Y() );
386*b1cdbd2cSJim Jagielski 	pHScrollbar->SetVisibleSize( aOutSz.Width() );
387*b1cdbd2cSJim Jagielski 	pHScrollbar->SetPageSize( aOutSz.Width() * 8 / 10 );
388*b1cdbd2cSJim Jagielski 	pHScrollbar->SetLineSize( pOutWin->GetTextWidth( 'x' ) );
389*b1cdbd2cSJim Jagielski 	pHScrollbar->SetThumbPos( pTextView->GetStartDocPos().X() );
390*b1cdbd2cSJim Jagielski 
391*b1cdbd2cSJim Jagielski }
392*b1cdbd2cSJim Jagielski 
IMPL_LINK(XMLFileWindow,ScrollHdl,ScrollBar *,pScroll)393*b1cdbd2cSJim Jagielski IMPL_LINK(XMLFileWindow, ScrollHdl, ScrollBar*, pScroll)
394*b1cdbd2cSJim Jagielski {
395*b1cdbd2cSJim Jagielski 	if(pScroll == pVScrollbar)
396*b1cdbd2cSJim Jagielski 	{
397*b1cdbd2cSJim Jagielski 		long nDiff = pTextView->GetStartDocPos().Y() - pScroll->GetThumbPos();
398*b1cdbd2cSJim Jagielski 		GetTextView()->Scroll( 0, nDiff );
399*b1cdbd2cSJim Jagielski 		pTextView->ShowCursor( sal_False, sal_True );
400*b1cdbd2cSJim Jagielski 		pScroll->SetThumbPos( pTextView->GetStartDocPos().Y() );
401*b1cdbd2cSJim Jagielski 	}
402*b1cdbd2cSJim Jagielski 	else
403*b1cdbd2cSJim Jagielski 	{
404*b1cdbd2cSJim Jagielski 		long nDiff = pTextView->GetStartDocPos().X() - pScroll->GetThumbPos();
405*b1cdbd2cSJim Jagielski 		GetTextView()->Scroll( nDiff, 0 );
406*b1cdbd2cSJim Jagielski 		pTextView->ShowCursor( sal_False, sal_True );
407*b1cdbd2cSJim Jagielski 		pScroll->SetThumbPos( pTextView->GetStartDocPos().X() );
408*b1cdbd2cSJim Jagielski 	}
409*b1cdbd2cSJim Jagielski 	return 0;
410*b1cdbd2cSJim Jagielski }
411*b1cdbd2cSJim Jagielski 
Notify(SfxBroadcaster &,const SfxHint & rHint)412*b1cdbd2cSJim Jagielski void XMLFileWindow::Notify( SfxBroadcaster& /* rBC */, const SfxHint& rHint )
413*b1cdbd2cSJim Jagielski {
414*b1cdbd2cSJim Jagielski 	if ( rHint.ISA( TextHint ) )
415*b1cdbd2cSJim Jagielski 	{
416*b1cdbd2cSJim Jagielski 		const TextHint& rTextHint = (const TextHint&)rHint;
417*b1cdbd2cSJim Jagielski 		if( rTextHint.GetId() == TEXT_HINT_VIEWSCROLLED )
418*b1cdbd2cSJim Jagielski 		{
419*b1cdbd2cSJim Jagielski 			pHScrollbar->SetThumbPos( pTextView->GetStartDocPos().X() );
420*b1cdbd2cSJim Jagielski 			pVScrollbar->SetThumbPos( pTextView->GetStartDocPos().Y() );
421*b1cdbd2cSJim Jagielski 		}
422*b1cdbd2cSJim Jagielski 		else if( rTextHint.GetId() == TEXT_HINT_TEXTHEIGHTCHANGED )
423*b1cdbd2cSJim Jagielski 		{
424*b1cdbd2cSJim Jagielski 			if ( (long)pTextEngine->GetTextHeight() < pOutWin->GetOutputSizePixel().Height() )
425*b1cdbd2cSJim Jagielski 				pTextView->Scroll( 0, pTextView->GetStartDocPos().Y() );
426*b1cdbd2cSJim Jagielski 			pVScrollbar->SetThumbPos( pTextView->GetStartDocPos().Y() );
427*b1cdbd2cSJim Jagielski 			SetScrollBarRanges();
428*b1cdbd2cSJim Jagielski 		}
429*b1cdbd2cSJim Jagielski 		else if( rTextHint.GetId() == TEXT_HINT_FORMATPARA )
430*b1cdbd2cSJim Jagielski 		{
431*b1cdbd2cSJim Jagielski             DoDelayedSyntaxHighlight( (sal_uInt16)rTextHint.GetValue() );
432*b1cdbd2cSJim Jagielski 		}
433*b1cdbd2cSJim Jagielski 	}
434*b1cdbd2cSJim Jagielski }
435*b1cdbd2cSJim Jagielski 
InvalidateWindow()436*b1cdbd2cSJim Jagielski void XMLFileWindow::InvalidateWindow()
437*b1cdbd2cSJim Jagielski {
438*b1cdbd2cSJim Jagielski 	pOutWin->Invalidate();
439*b1cdbd2cSJim Jagielski 	Window::Invalidate();
440*b1cdbd2cSJim Jagielski 
441*b1cdbd2cSJim Jagielski }
442*b1cdbd2cSJim Jagielski 
Command(const CommandEvent & rCEvt)443*b1cdbd2cSJim Jagielski void XMLFileWindow::Command( const CommandEvent& rCEvt )
444*b1cdbd2cSJim Jagielski {
445*b1cdbd2cSJim Jagielski 	switch(rCEvt.GetCommand())
446*b1cdbd2cSJim Jagielski 	{
447*b1cdbd2cSJim Jagielski 		case COMMAND_WHEEL:
448*b1cdbd2cSJim Jagielski 		case COMMAND_STARTAUTOSCROLL:
449*b1cdbd2cSJim Jagielski 		case COMMAND_AUTOSCROLL:
450*b1cdbd2cSJim Jagielski 		{
451*b1cdbd2cSJim Jagielski 			const CommandWheelData* pWData = rCEvt.GetWheelData();
452*b1cdbd2cSJim Jagielski 			if( !pWData || COMMAND_WHEEL_ZOOM != pWData->GetMode() )
453*b1cdbd2cSJim Jagielski 				HandleScrollCommand( rCEvt, pHScrollbar, pVScrollbar );
454*b1cdbd2cSJim Jagielski 		}
455*b1cdbd2cSJim Jagielski 		break;
456*b1cdbd2cSJim Jagielski 		default:
457*b1cdbd2cSJim Jagielski 			Window::Command(rCEvt);
458*b1cdbd2cSJim Jagielski 	}
459*b1cdbd2cSJim Jagielski }
460*b1cdbd2cSJim Jagielski 
HandleWheelCommand(const CommandEvent & rCEvt)461*b1cdbd2cSJim Jagielski void XMLFileWindow::HandleWheelCommand( const CommandEvent& rCEvt )
462*b1cdbd2cSJim Jagielski {
463*b1cdbd2cSJim Jagielski 	pTextView->Command(rCEvt);
464*b1cdbd2cSJim Jagielski 	HandleScrollCommand( rCEvt, pHScrollbar, pVScrollbar );
465*b1cdbd2cSJim Jagielski }
466*b1cdbd2cSJim Jagielski 
GetFocus()467*b1cdbd2cSJim Jagielski void XMLFileWindow::GetFocus()
468*b1cdbd2cSJim Jagielski {
469*b1cdbd2cSJim Jagielski 	pOutWin->GrabFocus();
470*b1cdbd2cSJim Jagielski }
471*b1cdbd2cSJim Jagielski 
ShowWindow(const rtl::OUString & rFileName)472*b1cdbd2cSJim Jagielski void XMLFileWindow::ShowWindow( const rtl::OUString& rFileName )
473*b1cdbd2cSJim Jagielski {
474*b1cdbd2cSJim Jagielski 	String aFileName( rFileName );
475*b1cdbd2cSJim Jagielski 	SvFileStream aStream( aFileName, STREAM_READ );
476*b1cdbd2cSJim Jagielski 
477*b1cdbd2cSJim Jagielski 	// since the xml files we load are utf-8 encoded, we need to set
478*b1cdbd2cSJim Jagielski 	// this encoding at the SvFileStream, else the TextEngine will
479*b1cdbd2cSJim Jagielski 	// use its default encoding which is not UTF8
480*b1cdbd2cSJim Jagielski 	const sal_Char *pCharSet = rtl_getBestMimeCharsetFromTextEncoding( RTL_TEXTENCODING_UTF8 );
481*b1cdbd2cSJim Jagielski 	rtl_TextEncoding eDestEnc = rtl_getTextEncodingFromMimeCharset( pCharSet );
482*b1cdbd2cSJim Jagielski 	aStream.SetStreamCharSet( eDestEnc );
483*b1cdbd2cSJim Jagielski 
484*b1cdbd2cSJim Jagielski 	if( Read( aStream ) )
485*b1cdbd2cSJim Jagielski 	{
486*b1cdbd2cSJim Jagielski 		long nPrevTextWidth = nCurTextWidth;
487*b1cdbd2cSJim Jagielski 		nCurTextWidth = pTextEngine->CalcTextWidth() + 25;	// kleine Toleranz
488*b1cdbd2cSJim Jagielski 		if ( nCurTextWidth != nPrevTextWidth )
489*b1cdbd2cSJim Jagielski 			SetScrollBarRanges();
490*b1cdbd2cSJim Jagielski 
491*b1cdbd2cSJim Jagielski 		TextPaM aPaM( pTextView->CursorStartOfDoc() );
492*b1cdbd2cSJim Jagielski 		TextSelection aSelection( aPaM, aPaM );
493*b1cdbd2cSJim Jagielski 		pTextView->SetSelection( aSelection, true );
494*b1cdbd2cSJim Jagielski 
495*b1cdbd2cSJim Jagielski 		Window::Show();
496*b1cdbd2cSJim Jagielski 	}
497*b1cdbd2cSJim Jagielski }
498*b1cdbd2cSJim Jagielski 
showLine(sal_Int32 nLine)499*b1cdbd2cSJim Jagielski void XMLFileWindow::showLine( sal_Int32 nLine )
500*b1cdbd2cSJim Jagielski {
501*b1cdbd2cSJim Jagielski 	TextPaM aPaM( pTextView->CursorStartOfDoc() );
502*b1cdbd2cSJim Jagielski 	while( nLine-- )
503*b1cdbd2cSJim Jagielski 		aPaM = pTextView->CursorDown( aPaM );
504*b1cdbd2cSJim Jagielski 
505*b1cdbd2cSJim Jagielski 	TextSelection aSelection( pTextView->CursorEndOfLine( aPaM ), aPaM );
506*b1cdbd2cSJim Jagielski 	pTextView->SetSelection( aSelection, true );
507*b1cdbd2cSJim Jagielski }
508*b1cdbd2cSJim Jagielski 
509*b1cdbd2cSJim Jagielski 
XMLSourceFileDialog(Window * pParent,ResMgr & rResMgr,const com::sun::star::uno::Reference<com::sun::star::lang::XMultiServiceFactory> & rxMSF)510*b1cdbd2cSJim Jagielski XMLSourceFileDialog::XMLSourceFileDialog( Window* pParent, ResMgr& rResMgr, const com::sun::star::uno::Reference< com::sun::star::lang::XMultiServiceFactory >& rxMSF  )
511*b1cdbd2cSJim Jagielski :	WorkWindow( pParent, ResId( DLG_XML_SOURCE_FILE_DIALOG, rResMgr ) ),
512*b1cdbd2cSJim Jagielski 	mnOutputHeight( LogicToPixel( Size( 80, 80 ), MAP_APPFONT ).Height() ),
513*b1cdbd2cSJim Jagielski 	mxMSF( rxMSF ),
514*b1cdbd2cSJim Jagielski 	mrResMgr( rResMgr ),
515*b1cdbd2cSJim Jagielski 	maLBOutput( this ),
516*b1cdbd2cSJim Jagielski 	maPBValidate( this, ResId( PB_VALIDATE, rResMgr ) )
517*b1cdbd2cSJim Jagielski {
518*b1cdbd2cSJim Jagielski 
519*b1cdbd2cSJim Jagielski 	FreeResource();
520*b1cdbd2cSJim Jagielski 
521*b1cdbd2cSJim Jagielski 	maPBValidate.SetClickHdl(LINK( this, XMLSourceFileDialog, ClickHdl_Impl ) );
522*b1cdbd2cSJim Jagielski 	maLBOutput.SetSelectHdl(LINK(this, XMLSourceFileDialog, SelectHdl_Impl ) );
523*b1cdbd2cSJim Jagielski 	mpTextWindow = new XMLFileWindow( this );
524*b1cdbd2cSJim Jagielski 	mpTextWindow->SetHelpId( HID_XML_FILTER_OUTPUT_WINDOW );
525*b1cdbd2cSJim Jagielski 	maLBOutput.SetHelpId( HID_XML_FILTER_TEST_VALIDATE_OUPUT );
526*b1cdbd2cSJim Jagielski 
527*b1cdbd2cSJim Jagielski 	Resize();
528*b1cdbd2cSJim Jagielski }
529*b1cdbd2cSJim Jagielski 
~XMLSourceFileDialog()530*b1cdbd2cSJim Jagielski XMLSourceFileDialog::~XMLSourceFileDialog()
531*b1cdbd2cSJim Jagielski {
532*b1cdbd2cSJim Jagielski 	if( maFileURL.getLength() )
533*b1cdbd2cSJim Jagielski 		osl::File::remove( maFileURL );
534*b1cdbd2cSJim Jagielski 
535*b1cdbd2cSJim Jagielski 	delete mpTextWindow;
536*b1cdbd2cSJim Jagielski }
537*b1cdbd2cSJim Jagielski 
ShowWindow(const rtl::OUString & rFileName,const filter_info_impl * pFilterInfo)538*b1cdbd2cSJim Jagielski void XMLSourceFileDialog::ShowWindow( const rtl::OUString& rFileName, const filter_info_impl* pFilterInfo )
539*b1cdbd2cSJim Jagielski {
540*b1cdbd2cSJim Jagielski 	EnterWait();
541*b1cdbd2cSJim Jagielski 	if( maFileURL.getLength() )
542*b1cdbd2cSJim Jagielski 	{
543*b1cdbd2cSJim Jagielski 		osl::File::remove( maFileURL );
544*b1cdbd2cSJim Jagielski 		delete mpTextWindow;
545*b1cdbd2cSJim Jagielski 		mpTextWindow = new XMLFileWindow( this );
546*b1cdbd2cSJim Jagielski 		maLBOutput.Hide();
547*b1cdbd2cSJim Jagielski 		maLBOutput.Clear();
548*b1cdbd2cSJim Jagielski 		maPBValidate.Enable(sal_True);
549*b1cdbd2cSJim Jagielski 		Resize();
550*b1cdbd2cSJim Jagielski 	}
551*b1cdbd2cSJim Jagielski 
552*b1cdbd2cSJim Jagielski 	mpFilterInfo = pFilterInfo;
553*b1cdbd2cSJim Jagielski 	maFileURL = rFileName;
554*b1cdbd2cSJim Jagielski 	mpTextWindow->ShowWindow( rFileName );
555*b1cdbd2cSJim Jagielski 	WorkWindow::Show();
556*b1cdbd2cSJim Jagielski 	LeaveWait();
557*b1cdbd2cSJim Jagielski }
558*b1cdbd2cSJim Jagielski 
Resize()559*b1cdbd2cSJim Jagielski void XMLSourceFileDialog::Resize()
560*b1cdbd2cSJim Jagielski {
561*b1cdbd2cSJim Jagielski 	bool bOutputVisible = maLBOutput.IsVisible() != 0;
562*b1cdbd2cSJim Jagielski 
563*b1cdbd2cSJim Jagielski 	Point aSpacing( LogicToPixel( Point( 6, 6 ), MAP_APPFONT ) );
564*b1cdbd2cSJim Jagielski 	Size aButton( maPBValidate.GetSizePixel() );
565*b1cdbd2cSJim Jagielski 
566*b1cdbd2cSJim Jagielski 	Size aDialogSize( GetOutputSizePixel() );
567*b1cdbd2cSJim Jagielski 
568*b1cdbd2cSJim Jagielski //	Point aButtonPos( aSpacing.X(), aSpacing.Y() );
569*b1cdbd2cSJim Jagielski //	maPBValidate.SetPosSizePixel( aButtonPos, aButton );
570*b1cdbd2cSJim Jagielski 
571*b1cdbd2cSJim Jagielski 	Size aOutputSize( aDialogSize.Width(), bOutputVisible ? mnOutputHeight : 0 );
572*b1cdbd2cSJim Jagielski 
573*b1cdbd2cSJim Jagielski 	Point aTextWindowPos( 0, 2* aSpacing.Y() + aButton.Height() );
574*b1cdbd2cSJim Jagielski 	Size aTextWindowSize( aDialogSize.Width(), aDialogSize.Height() - aTextWindowPos.Y() - aOutputSize.Height()  );
575*b1cdbd2cSJim Jagielski 
576*b1cdbd2cSJim Jagielski 	mpTextWindow->SetPosSizePixel( aTextWindowPos, aTextWindowSize );
577*b1cdbd2cSJim Jagielski 
578*b1cdbd2cSJim Jagielski 	if( bOutputVisible )
579*b1cdbd2cSJim Jagielski 	{
580*b1cdbd2cSJim Jagielski 		Point aOutputPos( 0, aTextWindowPos.Y() + aTextWindowSize.Height() );
581*b1cdbd2cSJim Jagielski 		maLBOutput.SetPosSizePixel( aOutputPos, aOutputSize );
582*b1cdbd2cSJim Jagielski 	}
583*b1cdbd2cSJim Jagielski }
584*b1cdbd2cSJim Jagielski 
585*b1cdbd2cSJim Jagielski 
IMPL_LINK(XMLSourceFileDialog,SelectHdl_Impl,ListBox *,pListBox)586*b1cdbd2cSJim Jagielski IMPL_LINK(XMLSourceFileDialog, SelectHdl_Impl, ListBox *, pListBox )
587*b1cdbd2cSJim Jagielski {
588*b1cdbd2cSJim Jagielski 	sal_uInt16 nEntry = pListBox->GetSelectEntryPos();
589*b1cdbd2cSJim Jagielski 	if( LISTBOX_ENTRY_NOTFOUND != nEntry )
590*b1cdbd2cSJim Jagielski 	{
591*b1cdbd2cSJim Jagielski 		int nLine = (int)(sal_IntPtr)pListBox->GetEntryData(nEntry);
592*b1cdbd2cSJim Jagielski 		if( -1 != nLine )
593*b1cdbd2cSJim Jagielski 		{
594*b1cdbd2cSJim Jagielski 			if( nLine > 0 )
595*b1cdbd2cSJim Jagielski 				nLine--;
596*b1cdbd2cSJim Jagielski 
597*b1cdbd2cSJim Jagielski 			showLine( nLine );
598*b1cdbd2cSJim Jagielski 		}
599*b1cdbd2cSJim Jagielski 	}
600*b1cdbd2cSJim Jagielski 	return 0;
601*b1cdbd2cSJim Jagielski }
602*b1cdbd2cSJim Jagielski 
603*b1cdbd2cSJim Jagielski IMPL_LINK(XMLSourceFileDialog, ClickHdl_Impl, PushButton *, /* pButton */ )
604*b1cdbd2cSJim Jagielski {
605*b1cdbd2cSJim Jagielski 	onValidate();
606*b1cdbd2cSJim Jagielski 	return 0;
607*b1cdbd2cSJim Jagielski }
608*b1cdbd2cSJim Jagielski 
onValidate()609*b1cdbd2cSJim Jagielski void XMLSourceFileDialog::onValidate()
610*b1cdbd2cSJim Jagielski {
611*b1cdbd2cSJim Jagielski 	EnterWait();
612*b1cdbd2cSJim Jagielski 
613*b1cdbd2cSJim Jagielski 	maLBOutput.Show();
614*b1cdbd2cSJim Jagielski 	maPBValidate.Enable(sal_False);
615*b1cdbd2cSJim Jagielski 	Resize();
616*b1cdbd2cSJim Jagielski 
617*b1cdbd2cSJim Jagielski 	try
618*b1cdbd2cSJim Jagielski 	{
619*b1cdbd2cSJim Jagielski 		Reference< XImportFilter > xImporter( mxMSF->createInstance( OUString::createFromAscii( "com.sun.star.documentconversion.XSLTValidate" ) ), UNO_QUERY );
620*b1cdbd2cSJim Jagielski 		if( xImporter.is() )
621*b1cdbd2cSJim Jagielski 		{
622*b1cdbd2cSJim Jagielski 			osl::File aInputFile( maFileURL );
623*b1cdbd2cSJim Jagielski 			/* osl::File::RC rc = */ aInputFile.open( OpenFlag_Read );
624*b1cdbd2cSJim Jagielski 
625*b1cdbd2cSJim Jagielski 			Reference< XInputStream > xIS( new comphelper::OSLInputStreamWrapper( aInputFile ) );
626*b1cdbd2cSJim Jagielski 
627*b1cdbd2cSJim Jagielski 			Sequence< PropertyValue > aSourceData(3);
628*b1cdbd2cSJim Jagielski 			aSourceData[0].Name = OUString( RTL_CONSTASCII_USTRINGPARAM( "InputStream" ) );
629*b1cdbd2cSJim Jagielski 			aSourceData[0].Value <<= xIS;
630*b1cdbd2cSJim Jagielski 
631*b1cdbd2cSJim Jagielski 			aSourceData[1].Name = OUString( RTL_CONSTASCII_USTRINGPARAM( "FileName" ) );
632*b1cdbd2cSJim Jagielski 			aSourceData[1].Value <<= maFileURL;
633*b1cdbd2cSJim Jagielski 
634*b1cdbd2cSJim Jagielski 			aSourceData[2].Name = OUString( RTL_CONSTASCII_USTRINGPARAM( "ErrorHandler" ) );
635*b1cdbd2cSJim Jagielski 			Reference< XErrorHandler > xHandle( new XMLErrorHandler( this, maLBOutput ) );
636*b1cdbd2cSJim Jagielski 			aSourceData[2].Value <<= xHandle;
637*b1cdbd2cSJim Jagielski 
638*b1cdbd2cSJim Jagielski 			Reference< XDocumentHandler > xWriter( mxMSF->createInstance( OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.xml.sax.Writer" ) ) ), UNO_QUERY );
639*b1cdbd2cSJim Jagielski 			Reference< XOutputStream > xOS( mxMSF->createInstance( OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.io.Pipe" ) ) ), UNO_QUERY );
640*b1cdbd2cSJim Jagielski 			Reference< XActiveDataSource > xDocSrc( xWriter, UNO_QUERY );
641*b1cdbd2cSJim Jagielski 			xDocSrc->setOutputStream( xOS );
642*b1cdbd2cSJim Jagielski 
643*b1cdbd2cSJim Jagielski 			Sequence< OUString > aFilterUserData( mpFilterInfo->getFilterUserData() );
644*b1cdbd2cSJim Jagielski 			xImporter->importer( aSourceData, xWriter, aFilterUserData );
645*b1cdbd2cSJim Jagielski 		}
646*b1cdbd2cSJim Jagielski 	}
647*b1cdbd2cSJim Jagielski 	catch(Exception& e)
648*b1cdbd2cSJim Jagielski 	{
649*b1cdbd2cSJim Jagielski 		String sErr( e.Message );
650*b1cdbd2cSJim Jagielski 		sal_uInt16 nEntry = maLBOutput.InsertEntry( sErr );
651*b1cdbd2cSJim Jagielski 		maLBOutput.SetEntryData( nEntry, (void*)-1 );
652*b1cdbd2cSJim Jagielski 	}
653*b1cdbd2cSJim Jagielski 
654*b1cdbd2cSJim Jagielski 	if( 0 == maLBOutput.GetEntryCount() )
655*b1cdbd2cSJim Jagielski 	{
656*b1cdbd2cSJim Jagielski 		String sErr( RESID( STR_NO_ERRORS_FOUND ) );
657*b1cdbd2cSJim Jagielski 		sal_uInt16 nEntry = maLBOutput.InsertEntry( sErr );
658*b1cdbd2cSJim Jagielski 		maLBOutput.SetEntryData( nEntry, (void*)-1 );
659*b1cdbd2cSJim Jagielski 	}
660*b1cdbd2cSJim Jagielski 
661*b1cdbd2cSJim Jagielski 	LeaveWait();
662*b1cdbd2cSJim Jagielski }
663*b1cdbd2cSJim Jagielski 
showLine(sal_Int32 nLine)664*b1cdbd2cSJim Jagielski void XMLSourceFileDialog::showLine( sal_Int32 nLine )
665*b1cdbd2cSJim Jagielski {
666*b1cdbd2cSJim Jagielski 	mpTextWindow->showLine( nLine );
667*b1cdbd2cSJim Jagielski }
668*b1cdbd2cSJim Jagielski 
669*b1cdbd2cSJim Jagielski 
670*b1cdbd2cSJim Jagielski ///////////////////////////////////////////////////////////////////////
671*b1cdbd2cSJim Jagielski 
lcl_Highlight(const String & rSource,SwTextPortions & aPortionList)672*b1cdbd2cSJim Jagielski void lcl_Highlight(const String& rSource, SwTextPortions& aPortionList)
673*b1cdbd2cSJim Jagielski {
674*b1cdbd2cSJim Jagielski 	const sal_Unicode cOpenBracket = '<';
675*b1cdbd2cSJim Jagielski 	const sal_Unicode cCloseBracket= '>';
676*b1cdbd2cSJim Jagielski 	const sal_Unicode cSlash		= '/';
677*b1cdbd2cSJim Jagielski 	const sal_Unicode cExclamation = '!';
678*b1cdbd2cSJim Jagielski //	const sal_Unicode cQuote		= '"';
679*b1cdbd2cSJim Jagielski //	const sal_Unicode cSQuote      = '\'';
680*b1cdbd2cSJim Jagielski 	const sal_Unicode cMinus		= '-';
681*b1cdbd2cSJim Jagielski 	const sal_Unicode cSpace		= ' ';
682*b1cdbd2cSJim Jagielski 	const sal_Unicode cTab			= 0x09;
683*b1cdbd2cSJim Jagielski 	const sal_Unicode cLF          = 0x0a;
684*b1cdbd2cSJim Jagielski 	const sal_Unicode cCR          = 0x0d;
685*b1cdbd2cSJim Jagielski 
686*b1cdbd2cSJim Jagielski 
687*b1cdbd2cSJim Jagielski 	const sal_uInt16 nStrLen = rSource.Len();
688*b1cdbd2cSJim Jagielski 	sal_uInt16 nInsert = 0;			// Number of inserted Portions
689*b1cdbd2cSJim Jagielski 	sal_uInt16 nActPos = 0;			// Position, at the '<' was found
690*b1cdbd2cSJim Jagielski 	sal_uInt16 nOffset = 0; 		// Offset of nActPos for '<'
691*b1cdbd2cSJim Jagielski 	sal_uInt16 nPortStart = USHRT_MAX; 	// For the TextPortion
692*b1cdbd2cSJim Jagielski 	sal_uInt16 nPortEnd  = 	0;  //
693*b1cdbd2cSJim Jagielski 	SwTextPortion aText;
694*b1cdbd2cSJim Jagielski 	while(nActPos < nStrLen)
695*b1cdbd2cSJim Jagielski 	{
696*b1cdbd2cSJim Jagielski 		svtools::ColorConfigEntry eFoundType = svtools::HTMLUNKNOWN;
697*b1cdbd2cSJim Jagielski 		if(rSource.GetChar(nActPos) == cOpenBracket && nActPos < nStrLen - 2 )
698*b1cdbd2cSJim Jagielski 		{
699*b1cdbd2cSJim Jagielski 			// 'leere' Portion einfuegen
700*b1cdbd2cSJim Jagielski 			if(nPortEnd < nActPos - 1 )
701*b1cdbd2cSJim Jagielski 			{
702*b1cdbd2cSJim Jagielski 				aText.nLine = 0;
703*b1cdbd2cSJim Jagielski 				// am Anfang nicht verschieben
704*b1cdbd2cSJim Jagielski 				aText.nStart = nPortEnd;
705*b1cdbd2cSJim Jagielski 				if(nInsert)
706*b1cdbd2cSJim Jagielski 					aText.nStart += 1;
707*b1cdbd2cSJim Jagielski 				aText.nEnd = nActPos - 1;
708*b1cdbd2cSJim Jagielski 				aText.eType = svtools::HTMLUNKNOWN;
709*b1cdbd2cSJim Jagielski 				aPortionList.push_back( aText );
710*b1cdbd2cSJim Jagielski 				nInsert++;
711*b1cdbd2cSJim Jagielski 			}
712*b1cdbd2cSJim Jagielski 			sal_Unicode cFollowFirst = rSource.GetChar((xub_StrLen)(nActPos + 1));
713*b1cdbd2cSJim Jagielski 			sal_Unicode cFollowNext = rSource.GetChar((xub_StrLen)(nActPos + 2));
714*b1cdbd2cSJim Jagielski 			if(cExclamation == cFollowFirst)
715*b1cdbd2cSJim Jagielski 			{
716*b1cdbd2cSJim Jagielski 				// "<!" SGML oder Kommentar
717*b1cdbd2cSJim Jagielski 				if(cMinus == cFollowNext &&
718*b1cdbd2cSJim Jagielski 					nActPos < nStrLen - 3 && cMinus == rSource.GetChar((xub_StrLen)(nActPos + 3)))
719*b1cdbd2cSJim Jagielski 				{
720*b1cdbd2cSJim Jagielski 					eFoundType = svtools::HTMLCOMMENT;
721*b1cdbd2cSJim Jagielski 				}
722*b1cdbd2cSJim Jagielski 				else
723*b1cdbd2cSJim Jagielski 					eFoundType = svtools::HTMLSGML;
724*b1cdbd2cSJim Jagielski 				nPortStart = nActPos;
725*b1cdbd2cSJim Jagielski 				nPortEnd = nActPos + 1;
726*b1cdbd2cSJim Jagielski 			}
727*b1cdbd2cSJim Jagielski 			else if(cSlash == cFollowFirst)
728*b1cdbd2cSJim Jagielski 			{
729*b1cdbd2cSJim Jagielski 				// "</" Slash ignorieren
730*b1cdbd2cSJim Jagielski 				nPortStart = nActPos;
731*b1cdbd2cSJim Jagielski 				nActPos++;
732*b1cdbd2cSJim Jagielski 				nOffset++;
733*b1cdbd2cSJim Jagielski 			}
734*b1cdbd2cSJim Jagielski 			if(svtools::HTMLUNKNOWN == eFoundType)
735*b1cdbd2cSJim Jagielski 			{
736*b1cdbd2cSJim Jagielski 				//jetzt koennte hier ein keyword folgen
737*b1cdbd2cSJim Jagielski 				sal_uInt16 nSrchPos = nActPos;
738*b1cdbd2cSJim Jagielski 				while(++nSrchPos < nStrLen - 1)
739*b1cdbd2cSJim Jagielski 				{
740*b1cdbd2cSJim Jagielski 					sal_Unicode cNext = rSource.GetChar(nSrchPos);
741*b1cdbd2cSJim Jagielski 					if( cNext == cSpace	||
742*b1cdbd2cSJim Jagielski 						cNext == cTab 	||
743*b1cdbd2cSJim Jagielski 						cNext == cLF 	||
744*b1cdbd2cSJim Jagielski 						cNext == cCR)
745*b1cdbd2cSJim Jagielski 						break;
746*b1cdbd2cSJim Jagielski 					else if(cNext == cCloseBracket)
747*b1cdbd2cSJim Jagielski 					{
748*b1cdbd2cSJim Jagielski 						break;
749*b1cdbd2cSJim Jagielski 					}
750*b1cdbd2cSJim Jagielski 				}
751*b1cdbd2cSJim Jagielski 				if(nSrchPos > nActPos + 1)
752*b1cdbd2cSJim Jagielski 				{
753*b1cdbd2cSJim Jagielski 					//irgend ein String wurde gefunden
754*b1cdbd2cSJim Jagielski 					String sToken = rSource.Copy(nActPos + 1, nSrchPos - nActPos - 1 );
755*b1cdbd2cSJim Jagielski 					sToken.ToUpperAscii();
756*b1cdbd2cSJim Jagielski //					int nToken = ::GetHTMLToken(sToken);
757*b1cdbd2cSJim Jagielski //					if(nToken)
758*b1cdbd2cSJim Jagielski 					{
759*b1cdbd2cSJim Jagielski 						//Token gefunden
760*b1cdbd2cSJim Jagielski 						eFoundType = svtools::HTMLKEYWORD;
761*b1cdbd2cSJim Jagielski 						nPortEnd = nSrchPos;
762*b1cdbd2cSJim Jagielski 						nPortStart = nActPos;
763*b1cdbd2cSJim Jagielski 					}
764*b1cdbd2cSJim Jagielski /*
765*b1cdbd2cSJim Jagielski 					else
766*b1cdbd2cSJim Jagielski 					{
767*b1cdbd2cSJim Jagielski 						//was war das denn?
768*b1cdbd2cSJim Jagielski #ifdef DEBUG
769*b1cdbd2cSJim Jagielski 						DBG_ERROR("Token nicht erkannt!")
770*b1cdbd2cSJim Jagielski 						DBG_ERROR(ByteString(sToken, gsl_getSystemTextEncoding()).GetBuffer())
771*b1cdbd2cSJim Jagielski #endif
772*b1cdbd2cSJim Jagielski 					}
773*b1cdbd2cSJim Jagielski */
774*b1cdbd2cSJim Jagielski 
775*b1cdbd2cSJim Jagielski 				}
776*b1cdbd2cSJim Jagielski 			}
777*b1cdbd2cSJim Jagielski 			// jetzt muss noch '>' gesucht werden
778*b1cdbd2cSJim Jagielski 			if(svtools::HTMLUNKNOWN != eFoundType)
779*b1cdbd2cSJim Jagielski 			{
780*b1cdbd2cSJim Jagielski 				sal_Bool bFound = sal_False;
781*b1cdbd2cSJim Jagielski 				for(sal_uInt16 i = nPortEnd; i < nStrLen; i++)
782*b1cdbd2cSJim Jagielski 					if(cCloseBracket == rSource.GetChar(i))
783*b1cdbd2cSJim Jagielski 					{
784*b1cdbd2cSJim Jagielski 						bFound = sal_True;
785*b1cdbd2cSJim Jagielski 						nPortEnd = i;
786*b1cdbd2cSJim Jagielski 						break;
787*b1cdbd2cSJim Jagielski 					}
788*b1cdbd2cSJim Jagielski 				if(!bFound && (eFoundType == svtools::HTMLCOMMENT))
789*b1cdbd2cSJim Jagielski 				{
790*b1cdbd2cSJim Jagielski 					// Kommentar ohne Ende in dieser Zeile
791*b1cdbd2cSJim Jagielski 					bFound  = sal_True;
792*b1cdbd2cSJim Jagielski 					nPortEnd = nStrLen - 1;
793*b1cdbd2cSJim Jagielski 				}
794*b1cdbd2cSJim Jagielski 
795*b1cdbd2cSJim Jagielski 				if(bFound ||(eFoundType == svtools::HTMLCOMMENT))
796*b1cdbd2cSJim Jagielski 				{
797*b1cdbd2cSJim Jagielski 					SwTextPortion aText2;
798*b1cdbd2cSJim Jagielski 					aText2.nLine = 0;
799*b1cdbd2cSJim Jagielski 					aText2.nStart = nPortStart + 1;
800*b1cdbd2cSJim Jagielski 					aText2.nEnd = nPortEnd;
801*b1cdbd2cSJim Jagielski 					aText2.eType = eFoundType;
802*b1cdbd2cSJim Jagielski 					aPortionList.push_back( aText2 );
803*b1cdbd2cSJim Jagielski 					nInsert++;
804*b1cdbd2cSJim Jagielski 					eFoundType = svtools::HTMLUNKNOWN;
805*b1cdbd2cSJim Jagielski 				}
806*b1cdbd2cSJim Jagielski 
807*b1cdbd2cSJim Jagielski 			}
808*b1cdbd2cSJim Jagielski 		}
809*b1cdbd2cSJim Jagielski 		nActPos++;
810*b1cdbd2cSJim Jagielski 	}
811*b1cdbd2cSJim Jagielski 	if(nInsert && nPortEnd < nActPos - 1)
812*b1cdbd2cSJim Jagielski 	{
813*b1cdbd2cSJim Jagielski 		aText.nLine = 0;
814*b1cdbd2cSJim Jagielski 		aText.nStart = nPortEnd + 1;
815*b1cdbd2cSJim Jagielski 		aText.nEnd = nActPos - 1;
816*b1cdbd2cSJim Jagielski 		aText.eType = svtools::HTMLUNKNOWN;
817*b1cdbd2cSJim Jagielski 		aPortionList.push_back( aText );
818*b1cdbd2cSJim Jagielski 		nInsert++;
819*b1cdbd2cSJim Jagielski 	}
820*b1cdbd2cSJim Jagielski }
821*b1cdbd2cSJim Jagielski 
DoDelayedSyntaxHighlight(sal_uInt16 nPara)822*b1cdbd2cSJim Jagielski void XMLFileWindow::DoDelayedSyntaxHighlight( sal_uInt16 nPara )
823*b1cdbd2cSJim Jagielski {
824*b1cdbd2cSJim Jagielski 	if ( !bHighlighting )
825*b1cdbd2cSJim Jagielski 	{
826*b1cdbd2cSJim Jagielski 		aSyntaxLineTable.Insert( nPara, (void*)(sal_uInt16)1 );
827*b1cdbd2cSJim Jagielski 		aSyntaxIdleTimer.Start();
828*b1cdbd2cSJim Jagielski 	}
829*b1cdbd2cSJim Jagielski }
830*b1cdbd2cSJim Jagielski 
ImpDoHighlight(const String & rSource,sal_uInt16 nLineOff)831*b1cdbd2cSJim Jagielski void XMLFileWindow::ImpDoHighlight( const String& rSource, sal_uInt16 nLineOff )
832*b1cdbd2cSJim Jagielski {
833*b1cdbd2cSJim Jagielski 	SwTextPortions aPortionList;
834*b1cdbd2cSJim Jagielski 	lcl_Highlight(rSource, aPortionList);
835*b1cdbd2cSJim Jagielski 
836*b1cdbd2cSJim Jagielski 	size_t nCount = aPortionList.size();
837*b1cdbd2cSJim Jagielski 	if ( !nCount )
838*b1cdbd2cSJim Jagielski 		return;
839*b1cdbd2cSJim Jagielski 
840*b1cdbd2cSJim Jagielski 	SwTextPortion& rLast = aPortionList[nCount-1];
841*b1cdbd2cSJim Jagielski 	if ( rLast.nStart > rLast.nEnd ) 	// Nur bis Bug von MD behoeben
842*b1cdbd2cSJim Jagielski 	{
843*b1cdbd2cSJim Jagielski 		nCount--;
844*b1cdbd2cSJim Jagielski 		aPortionList.pop_back();
845*b1cdbd2cSJim Jagielski 		if ( !nCount )
846*b1cdbd2cSJim Jagielski 			return;
847*b1cdbd2cSJim Jagielski 	}
848*b1cdbd2cSJim Jagielski 
849*b1cdbd2cSJim Jagielski 	// Evtl. Optimieren:
850*b1cdbd2cSJim Jagielski 	// Wenn haufig gleiche Farbe, dazwischen Blank ohne Farbe,
851*b1cdbd2cSJim Jagielski 	// ggf. zusammenfassen, oder zumindest das Blank,
852*b1cdbd2cSJim Jagielski 	// damit weniger Attribute
853*b1cdbd2cSJim Jagielski 	sal_Bool bOptimizeHighlight = sal_True; // war in der BasicIDE static
854*b1cdbd2cSJim Jagielski 	if ( bOptimizeHighlight )
855*b1cdbd2cSJim Jagielski 	{
856*b1cdbd2cSJim Jagielski 		// Es muessen nur die Blanks und Tabs mit attributiert werden.
857*b1cdbd2cSJim Jagielski 		// Wenn zwei gleiche Attribute hintereinander eingestellt werden,
858*b1cdbd2cSJim Jagielski 		// optimiert das die TextEngine.
859*b1cdbd2cSJim Jagielski 		sal_uInt16 nLastEnd = 0;
860*b1cdbd2cSJim Jagielski 		for ( size_t i = 0; i < nCount; i++ )
861*b1cdbd2cSJim Jagielski 		{
862*b1cdbd2cSJim Jagielski 			SwTextPortion& r = aPortionList[i];
863*b1cdbd2cSJim Jagielski 			DBG_ASSERT( r.nLine == aPortionList[0].nLine, "doch mehrere Zeilen ?" );
864*b1cdbd2cSJim Jagielski 			if ( r.nStart > r.nEnd ) 	// Nur bis Bug von MD behoeben
865*b1cdbd2cSJim Jagielski 				continue;
866*b1cdbd2cSJim Jagielski 
867*b1cdbd2cSJim Jagielski 			if ( r.nStart > nLastEnd )
868*b1cdbd2cSJim Jagielski 			{
869*b1cdbd2cSJim Jagielski 				// Kann ich mich drauf verlassen, dass alle ausser
870*b1cdbd2cSJim Jagielski 				// Blank und Tab gehighlightet wird ?!
871*b1cdbd2cSJim Jagielski 				r.nStart = nLastEnd;
872*b1cdbd2cSJim Jagielski 			}
873*b1cdbd2cSJim Jagielski 			nLastEnd = r.nEnd+1;
874*b1cdbd2cSJim Jagielski 			if ( ( i == (nCount-1) ) && ( r.nEnd < rSource.Len() ) )
875*b1cdbd2cSJim Jagielski 				r.nEnd = rSource.Len();
876*b1cdbd2cSJim Jagielski 		}
877*b1cdbd2cSJim Jagielski 	}
878*b1cdbd2cSJim Jagielski 
879*b1cdbd2cSJim Jagielski 	svtools::ColorConfig aConfig;
880*b1cdbd2cSJim Jagielski 	for ( size_t i = 0; i < aPortionList.size(); i++ )
881*b1cdbd2cSJim Jagielski 	{
882*b1cdbd2cSJim Jagielski 		SwTextPortion& r = aPortionList[i];
883*b1cdbd2cSJim Jagielski 		if ( r.nStart > r.nEnd ) 	// Nur bis Bug von MD behoeben
884*b1cdbd2cSJim Jagielski 			continue;
885*b1cdbd2cSJim Jagielski //		sal_uInt16 nCol = r.eType;
886*b1cdbd2cSJim Jagielski         if(r.eType !=  svtools::HTMLSGML    &&
887*b1cdbd2cSJim Jagielski             r.eType != svtools::HTMLCOMMENT &&
888*b1cdbd2cSJim Jagielski             r.eType != svtools::HTMLKEYWORD &&
889*b1cdbd2cSJim Jagielski             r.eType != svtools::HTMLUNKNOWN)
890*b1cdbd2cSJim Jagielski                 r.eType = (svtools::ColorConfigEntry)svtools::HTMLUNKNOWN;
891*b1cdbd2cSJim Jagielski         Color aColor((ColorData)aConfig.GetColorValue((svtools::ColorConfigEntry)r.eType).nColor);
892*b1cdbd2cSJim Jagielski         sal_uInt16 nLine = nLineOff+r.nLine; //
893*b1cdbd2cSJim Jagielski         pTextEngine->SetAttrib( TextAttribFontColor( aColor ), nLine, r.nStart, r.nEnd+1 );
894*b1cdbd2cSJim Jagielski 	}
895*b1cdbd2cSJim Jagielski }
896*b1cdbd2cSJim Jagielski 
IMPL_LINK(XMLFileWindow,SyntaxTimerHdl,Timer *,pTimer)897*b1cdbd2cSJim Jagielski IMPL_LINK( XMLFileWindow, SyntaxTimerHdl, Timer *, pTimer )
898*b1cdbd2cSJim Jagielski {
899*b1cdbd2cSJim Jagielski     Time aSyntaxCheckStart;
900*b1cdbd2cSJim Jagielski     DBG_ASSERT( pTextView, "Noch keine View, aber Syntax-Highlight ?!" );
901*b1cdbd2cSJim Jagielski 	pTextEngine->SetUpdateMode( sal_False );
902*b1cdbd2cSJim Jagielski 
903*b1cdbd2cSJim Jagielski 	bHighlighting = sal_True;
904*b1cdbd2cSJim Jagielski 	sal_uInt16 nLine;
905*b1cdbd2cSJim Jagielski 	sal_uInt16 nCount  = 0;
906*b1cdbd2cSJim Jagielski 	// zuerst wird der Bereich um dem Cursor bearbeitet
907*b1cdbd2cSJim Jagielski 	TextSelection aSel = pTextView->GetSelection();
908*b1cdbd2cSJim Jagielski     sal_uInt16 nCur = (sal_uInt16)aSel.GetStart().GetPara();
909*b1cdbd2cSJim Jagielski 	if(nCur > 40)
910*b1cdbd2cSJim Jagielski 		nCur -= 40;
911*b1cdbd2cSJim Jagielski 	else
912*b1cdbd2cSJim Jagielski 		nCur = 0;
913*b1cdbd2cSJim Jagielski 	if(aSyntaxLineTable.Count())
914*b1cdbd2cSJim Jagielski 		for(sal_uInt16 i = 0; i < 80 && nCount < 40; i++, nCur++)
915*b1cdbd2cSJim Jagielski 		{
916*b1cdbd2cSJim Jagielski 			void * p = aSyntaxLineTable.Get(nCur);
917*b1cdbd2cSJim Jagielski 			if(p)
918*b1cdbd2cSJim Jagielski 			{
919*b1cdbd2cSJim Jagielski 				DoSyntaxHighlight( nCur );
920*b1cdbd2cSJim Jagielski 				aSyntaxLineTable.Remove( nCur );
921*b1cdbd2cSJim Jagielski 				nCount++;
922*b1cdbd2cSJim Jagielski                 if(!aSyntaxLineTable.Count())
923*b1cdbd2cSJim Jagielski                     break;
924*b1cdbd2cSJim Jagielski                 if((Time().GetTime() - aSyntaxCheckStart.GetTime()) > MAX_HIGHLIGHTTIME )
925*b1cdbd2cSJim Jagielski                 {
926*b1cdbd2cSJim Jagielski                     pTimer->SetTimeout( 2 * SYNTAX_HIGHLIGHT_TIMEOUT );
927*b1cdbd2cSJim Jagielski                     break;
928*b1cdbd2cSJim Jagielski                 }
929*b1cdbd2cSJim Jagielski             }
930*b1cdbd2cSJim Jagielski 		}
931*b1cdbd2cSJim Jagielski 
932*b1cdbd2cSJim Jagielski 	// wenn dann noch etwas frei ist, wird von Beginn an weitergearbeitet
933*b1cdbd2cSJim Jagielski 	void* p = aSyntaxLineTable.First();
934*b1cdbd2cSJim Jagielski 	while ( p && nCount < MAX_SYNTAX_HIGHLIGHT)
935*b1cdbd2cSJim Jagielski 	{
936*b1cdbd2cSJim Jagielski 		nLine = (sal_uInt16)aSyntaxLineTable.GetCurKey();
937*b1cdbd2cSJim Jagielski 		DoSyntaxHighlight( nLine );
938*b1cdbd2cSJim Jagielski 		sal_uInt16 nC = (sal_uInt16)aSyntaxLineTable.GetCurKey();
939*b1cdbd2cSJim Jagielski 		p = aSyntaxLineTable.Next();
940*b1cdbd2cSJim Jagielski 		aSyntaxLineTable.Remove(nC);
941*b1cdbd2cSJim Jagielski 		nCount ++;
942*b1cdbd2cSJim Jagielski         if(Time().GetTime() - aSyntaxCheckStart.GetTime() > MAX_HIGHLIGHTTIME)
943*b1cdbd2cSJim Jagielski         {
944*b1cdbd2cSJim Jagielski             pTimer->SetTimeout( 2 * SYNTAX_HIGHLIGHT_TIMEOUT );
945*b1cdbd2cSJim Jagielski             break;
946*b1cdbd2cSJim Jagielski         }
947*b1cdbd2cSJim Jagielski 	}
948*b1cdbd2cSJim Jagielski 	// os: #43050# hier wird ein TextView-Problem umpopelt:
949*b1cdbd2cSJim Jagielski 	// waehrend des Highlightings funktionierte das Scrolling nicht
950*b1cdbd2cSJim Jagielski 	TextView* pTmp = pTextEngine->GetActiveView();
951*b1cdbd2cSJim Jagielski 	pTextEngine->SetActiveView(0);
952*b1cdbd2cSJim Jagielski 	pTextEngine->SetUpdateMode( sal_True );
953*b1cdbd2cSJim Jagielski 	pTextEngine->SetActiveView(pTmp);
954*b1cdbd2cSJim Jagielski 	pTextView->ShowCursor(sal_False, sal_False);
955*b1cdbd2cSJim Jagielski 
956*b1cdbd2cSJim Jagielski 	if(aSyntaxLineTable.Count() && !pTimer->IsActive())
957*b1cdbd2cSJim Jagielski 		pTimer->Start();
958*b1cdbd2cSJim Jagielski 	// SyntaxTimerHdl wird gerufen, wenn Text-Aenderung
959*b1cdbd2cSJim Jagielski 	// => gute Gelegenheit, Textbreite zu ermitteln!
960*b1cdbd2cSJim Jagielski 	long nPrevTextWidth = nCurTextWidth;
961*b1cdbd2cSJim Jagielski 	nCurTextWidth = pTextEngine->CalcTextWidth() + 25;	// kleine Toleranz
962*b1cdbd2cSJim Jagielski 	if ( nCurTextWidth != nPrevTextWidth )
963*b1cdbd2cSJim Jagielski 		SetScrollBarRanges();
964*b1cdbd2cSJim Jagielski 	bHighlighting = sal_False;
965*b1cdbd2cSJim Jagielski 
966*b1cdbd2cSJim Jagielski     return 0;
967*b1cdbd2cSJim Jagielski }
968*b1cdbd2cSJim Jagielski 
DoSyntaxHighlight(sal_uInt16 nPara)969*b1cdbd2cSJim Jagielski void XMLFileWindow::DoSyntaxHighlight( sal_uInt16 nPara )
970*b1cdbd2cSJim Jagielski {
971*b1cdbd2cSJim Jagielski 	// Durch das DelayedSyntaxHighlight kann es passieren,
972*b1cdbd2cSJim Jagielski 	// dass die Zeile nicht mehr existiert!
973*b1cdbd2cSJim Jagielski 	if ( nPara < pTextEngine->GetParagraphCount() )
974*b1cdbd2cSJim Jagielski 	{
975*b1cdbd2cSJim Jagielski 		pTextEngine->RemoveAttribs( nPara );
976*b1cdbd2cSJim Jagielski 		String aSource( pTextEngine->GetText( nPara ) );
977*b1cdbd2cSJim Jagielski 		pTextEngine->SetUpdateMode( sal_False );
978*b1cdbd2cSJim Jagielski 		ImpDoHighlight( aSource, nPara );
979*b1cdbd2cSJim Jagielski 		// os: #43050# hier wird ein TextView-Problem umpopelt:
980*b1cdbd2cSJim Jagielski 		// waehrend des Highlightings funktionierte das Scrolling nicht
981*b1cdbd2cSJim Jagielski 		TextView* pTmp = pTextEngine->GetActiveView();
982*b1cdbd2cSJim Jagielski 		pTmp->SetAutoScroll(sal_False);
983*b1cdbd2cSJim Jagielski 		pTextEngine->SetActiveView(0);
984*b1cdbd2cSJim Jagielski 		pTextEngine->SetUpdateMode( sal_True );
985*b1cdbd2cSJim Jagielski 		pTextEngine->SetActiveView(pTmp);
986*b1cdbd2cSJim Jagielski 		// Bug 72887 show the cursor
987*b1cdbd2cSJim Jagielski 		pTmp->SetAutoScroll(sal_True);
988*b1cdbd2cSJim Jagielski 		pTmp->ShowCursor( sal_False/*pTmp->IsAutoScroll()*/ );
989*b1cdbd2cSJim Jagielski 	}
990*b1cdbd2cSJim Jagielski }
991