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