Branch data Line data Source code
1 : : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : : /*************************************************************************
3 : : *
4 : : * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5 : : *
6 : : * Copyright 2000, 2010 Oracle and/or its affiliates.
7 : : *
8 : : * OpenOffice.org - a multi-platform office productivity suite
9 : : *
10 : : * This file is part of OpenOffice.org.
11 : : *
12 : : * OpenOffice.org is free software: you can redistribute it and/or modify
13 : : * it under the terms of the GNU Lesser General Public License version 3
14 : : * only, as published by the Free Software Foundation.
15 : : *
16 : : * OpenOffice.org is distributed in the hope that it will be useful,
17 : : * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 : : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 : : * GNU Lesser General Public License version 3 for more details
20 : : * (a copy is included in the LICENSE file that accompanied this code).
21 : : *
22 : : * You should have received a copy of the GNU Lesser General Public License
23 : : * version 3 along with OpenOffice.org. If not, see
24 : : * <http://www.openoffice.org/license.html>
25 : : * for a copy of the LGPLv3 License.
26 : : *
27 : : ************************************************************************/
28 : :
29 : : #include "sal/config.h"
30 : :
31 : : #include <hintids.hxx>
32 : : #include <cmdid.h>
33 : :
34 : : #include <com/sun/star/beans/XMultiPropertySet.hpp>
35 : : #include <com/sun/star/beans/XPropertiesChangeListener.hpp>
36 : : #include <cppuhelper/implbase1.hxx>
37 : : #include <officecfg/Office/Common.hxx>
38 : : #include <rtl/oustringostreaminserter.hxx>
39 : : #include <rtl/ustring.hxx>
40 : : #include <sal/log.hxx>
41 : : #include <vcl/textview.hxx>
42 : : #include <svx/svxids.hrc>
43 : : #include <vcl/scrbar.hxx>
44 : : #include <sfx2/dispatch.hxx>
45 : : #include <sfx2/app.hxx>
46 : : #include <svtools/htmltokn.h>
47 : : #include <vcl/txtattr.hxx>
48 : : #include <svtools/colorcfg.hxx>
49 : : #include <editeng/flstitem.hxx>
50 : : #include <vcl/metric.hxx>
51 : : #include <svtools/ctrltool.hxx>
52 : : #include <tools/time.hxx>
53 : : #include <swmodule.hxx>
54 : : #include <docsh.hxx>
55 : : #include <srcview.hxx>
56 : : #include <helpid.h>
57 : : #include <deque>
58 : :
59 : : namespace {
60 : :
61 : : namespace css = com::sun::star;
62 : :
63 : : }
64 : :
65 : : struct SwTextPortion
66 : : {
67 : : sal_uInt16 nLine;
68 : : sal_uInt16 nStart, nEnd;
69 : : svtools::ColorConfigEntry eType;
70 : : };
71 : :
72 : : #define MAX_SYNTAX_HIGHLIGHT 20
73 : : #define MAX_HIGHLIGHTTIME 200
74 : : #define SYNTAX_HIGHLIGHT_TIMEOUT 200
75 : :
76 : : typedef std::deque<SwTextPortion> SwTextPortions;
77 : :
78 : 0 : static void lcl_Highlight(const String& rSource, SwTextPortions& aPortionList)
79 : : {
80 : 0 : const sal_Unicode cOpenBracket = '<';
81 : 0 : const sal_Unicode cCloseBracket= '>';
82 : 0 : const sal_Unicode cSlash = '/';
83 : 0 : const sal_Unicode cExclamation = '!';
84 : 0 : const sal_Unicode cMinus = '-';
85 : 0 : const sal_Unicode cSpace = ' ';
86 : 0 : const sal_Unicode cTab = 0x09;
87 : 0 : const sal_Unicode cLF = 0x0a;
88 : 0 : const sal_Unicode cCR = 0x0d;
89 : :
90 : :
91 : 0 : const sal_uInt16 nStrLen = rSource.Len();
92 : 0 : sal_uInt16 nInsert = 0; // number of inserted portions
93 : 0 : sal_uInt16 nActPos = 0; // position, where '<' was found
94 : 0 : sal_uInt16 nOffset = 0; // Offset of nActPos to '<'
95 : 0 : sal_uInt16 nPortStart = USHRT_MAX; // for the TextPortion
96 : 0 : sal_uInt16 nPortEnd = 0; //
97 : : SwTextPortion aText;
98 [ # # ]: 0 : while(nActPos < nStrLen)
99 : : {
100 : 0 : svtools::ColorConfigEntry eFoundType = svtools::HTMLUNKNOWN;
101 [ # # ][ # # ]: 0 : if(rSource.GetChar(nActPos) == cOpenBracket && nActPos < nStrLen - 2 )
[ # # ]
102 : : {
103 : : // insert 'empty' portion
104 [ # # ]: 0 : if(nPortEnd < nActPos - 1 )
105 : : {
106 : 0 : aText.nLine = 0;
107 : : // don't move at the beginning
108 : 0 : aText.nStart = nPortEnd;
109 [ # # ]: 0 : if(nInsert)
110 : 0 : aText.nStart += 1;
111 : 0 : aText.nEnd = nActPos - 1;
112 : 0 : aText.eType = svtools::HTMLUNKNOWN;
113 [ # # ]: 0 : aPortionList.push_back( aText );
114 : 0 : nInsert++;
115 : : }
116 : 0 : sal_Unicode cFollowFirst = rSource.GetChar((xub_StrLen)(nActPos + 1));
117 : 0 : sal_Unicode cFollowNext = rSource.GetChar((xub_StrLen)(nActPos + 2));
118 [ # # ]: 0 : if(cExclamation == cFollowFirst)
119 : : {
120 : : // "<!" SGML or comment
121 [ # # ]: 0 : if(cMinus == cFollowNext &&
[ # # # # ]
[ # # ]
122 : 0 : nActPos < nStrLen - 3 && cMinus == rSource.GetChar((xub_StrLen)(nActPos + 3)))
123 : : {
124 : 0 : eFoundType = svtools::HTMLCOMMENT;
125 : : }
126 : : else
127 : 0 : eFoundType = svtools::HTMLSGML;
128 : 0 : nPortStart = nActPos;
129 : 0 : nPortEnd = nActPos + 1;
130 : : }
131 [ # # ]: 0 : else if(cSlash == cFollowFirst)
132 : : {
133 : : // "</" ignore slash
134 : 0 : nPortStart = nActPos;
135 : 0 : nActPos++;
136 : 0 : nOffset++;
137 : : }
138 [ # # ]: 0 : if(svtools::HTMLUNKNOWN == eFoundType)
139 : : {
140 : : // now here a keyword could follow
141 : 0 : sal_uInt16 nSrchPos = nActPos;
142 [ # # ]: 0 : while(++nSrchPos < nStrLen - 1)
143 : : {
144 : 0 : sal_Unicode cNext = rSource.GetChar(nSrchPos);
145 [ # # ][ # # ]: 0 : if( cNext == cSpace ||
[ # # ][ # # ]
146 : : cNext == cTab ||
147 : : cNext == cLF ||
148 : : cNext == cCR)
149 : 0 : break;
150 [ # # ]: 0 : else if(cNext == cCloseBracket)
151 : : {
152 : 0 : break;
153 : : }
154 : : }
155 [ # # ]: 0 : if(nSrchPos > nActPos + 1)
156 : : {
157 : : // some string was found
158 [ # # ]: 0 : String sToken = rSource.Copy(nActPos + 1, nSrchPos - nActPos - 1 );
159 [ # # ]: 0 : sToken.ToUpperAscii();
160 [ # # ]: 0 : int nToken = ::GetHTMLToken(sToken);
161 [ # # ]: 0 : if(nToken)
162 : : {
163 : : // Token was found
164 : 0 : eFoundType = svtools::HTMLKEYWORD;
165 : 0 : nPortEnd = nSrchPos;
166 : 0 : nPortStart = nActPos;
167 : : }
168 : : else
169 : : {
170 : : // what was that?
171 : : SAL_WARN(
172 : : "sw.level2",
173 : : "Token " << rtl::OUString(sToken)
174 : : << " not recognised!");
175 [ # # ]: 0 : }
176 : :
177 : : }
178 : : }
179 : : // now we still have to look for '>'
180 [ # # ]: 0 : if(svtools::HTMLUNKNOWN != eFoundType)
181 : : {
182 : 0 : sal_Bool bFound = sal_False;
183 [ # # ]: 0 : for(sal_uInt16 i = nPortEnd; i < nStrLen; i++)
184 [ # # ]: 0 : if(cCloseBracket == rSource.GetChar(i))
185 : : {
186 : 0 : bFound = sal_True;
187 : 0 : nPortEnd = i;
188 : 0 : break;
189 : : }
190 [ # # ][ # # ]: 0 : if(!bFound && (eFoundType == svtools::HTMLCOMMENT))
191 : : {
192 : : // comment without ending in this line
193 : 0 : bFound = sal_True;
194 : 0 : nPortEnd = nStrLen - 1;
195 : : }
196 : :
197 [ # # ][ # # ]: 0 : if(bFound ||(eFoundType == svtools::HTMLCOMMENT))
198 : : {
199 : : SwTextPortion aTextPortion;
200 : 0 : aTextPortion.nLine = 0;
201 : 0 : aTextPortion.nStart = nPortStart + 1;
202 : 0 : aTextPortion.nEnd = nPortEnd;
203 : 0 : aTextPortion.eType = eFoundType;
204 [ # # ]: 0 : aPortionList.push_back( aTextPortion );
205 : 0 : nInsert++;
206 : 0 : eFoundType = svtools::HTMLUNKNOWN;
207 : : }
208 : :
209 : : }
210 : : }
211 : 0 : nActPos++;
212 : : }
213 [ # # ][ # # ]: 0 : if(nInsert && nPortEnd < nActPos - 1)
214 : : {
215 : 0 : aText.nLine = 0;
216 : 0 : aText.nStart = nPortEnd + 1;
217 : 0 : aText.nEnd = nActPos - 1;
218 : 0 : aText.eType = svtools::HTMLUNKNOWN;
219 [ # # ]: 0 : aPortionList.push_back( aText );
220 : 0 : nInsert++;
221 : : }
222 : 0 : }
223 : :
224 : : class SwSrcEditWindow::ChangesListener:
225 : : public cppu::WeakImplHelper1< css::beans::XPropertiesChangeListener >
226 : : {
227 : : public:
228 : 0 : ChangesListener(SwSrcEditWindow & editor): editor_(editor) {}
229 : :
230 : : private:
231 [ # # ]: 0 : virtual ~ChangesListener() {}
232 : :
233 : 0 : virtual void SAL_CALL disposing(css::lang::EventObject const &)
234 : : throw (css::uno::RuntimeException)
235 : : {
236 [ # # ]: 0 : osl::MutexGuard g(editor_.mutex_);
237 [ # # ]: 0 : editor_.notifier_.clear();
238 : 0 : }
239 : :
240 : 0 : virtual void SAL_CALL propertiesChange(
241 : : css::uno::Sequence< css::beans::PropertyChangeEvent > const &)
242 : : throw (css::uno::RuntimeException)
243 : : {
244 [ # # ]: 0 : SolarMutexGuard g;
245 [ # # ][ # # ]: 0 : editor_.SetFont();
246 : 0 : }
247 : :
248 : : SwSrcEditWindow & editor_;
249 : : };
250 : :
251 : 0 : SwSrcEditWindow::SwSrcEditWindow( Window* pParent, SwSrcView* pParentView ) :
252 : : Window( pParent, WB_BORDER|WB_CLIPCHILDREN ),
253 : :
254 : : pTextEngine(0),
255 : :
256 : : pOutWin(0),
257 : : pHScrollbar(0),
258 : : pVScrollbar(0),
259 : :
260 : : pSrcView(pParentView),
261 : :
262 : : nCurTextWidth(0),
263 : : nStartLine(USHRT_MAX),
264 [ # # ]: 0 : eSourceEncoding(osl_getThreadTextEncoding()),
265 : : bDoSyntaxHighlight(sal_True),
266 [ # # ][ # # ]: 0 : bHighlighting(sal_False)
[ # # ][ # # ]
267 : : {
268 [ # # ]: 0 : SetHelpId(HID_SOURCE_EDITWIN);
269 [ # # ]: 0 : CreateTextEngine();
270 : :
271 : : // Using "this" in ctor is a little fishy, but should work here at least as
272 : : // long as there are no derivations:
273 [ # # ][ # # ]: 0 : listener_ = new ChangesListener(*this);
274 : : css::uno::Reference< css::beans::XMultiPropertySet > n(
275 : : officecfg::Office::Common::Font::SourceViewFont::get(),
276 [ # # ][ # # ]: 0 : css::uno::UNO_QUERY_THROW);
[ # # ]
277 : : {
278 [ # # ]: 0 : osl::MutexGuard g(mutex_);
279 [ # # ][ # # ]: 0 : notifier_ = n;
280 : : }
281 [ # # ]: 0 : css::uno::Sequence< rtl::OUString > s(2);
282 [ # # ][ # # ]: 0 : s[0] = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("FontHeight"));
283 [ # # ][ # # ]: 0 : s[1] = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("FontName"));
284 [ # # ][ # # ]: 0 : n->addPropertiesChangeListener(s, listener_.get());
[ # # ][ # # ]
[ # # ]
285 : 0 : }
286 : :
287 [ # # ][ # # ]: 0 : SwSrcEditWindow::~SwSrcEditWindow()
[ # # ]
288 : : {
289 : 0 : css::uno::Reference< css::beans::XMultiPropertySet > n;
290 : : {
291 [ # # ]: 0 : osl::MutexGuard g(mutex_);
292 [ # # ][ # # ]: 0 : n = notifier_;
293 : : }
294 [ # # ]: 0 : if (n.is()) {
295 [ # # ][ # # ]: 0 : n->removePropertiesChangeListener(listener_.get());
[ # # ][ # # ]
296 : : }
297 [ # # ]: 0 : aSyntaxIdleTimer.Stop();
298 [ # # ]: 0 : if ( pTextEngine )
299 : : {
300 [ # # ]: 0 : EndListening( *pTextEngine );
301 [ # # ]: 0 : pTextEngine->RemoveView( pTextView );
302 : :
303 [ # # ][ # # ]: 0 : delete pHScrollbar;
304 [ # # ][ # # ]: 0 : delete pVScrollbar;
305 : :
306 [ # # ][ # # ]: 0 : delete pTextView;
307 [ # # ][ # # ]: 0 : delete pTextEngine;
308 : : }
309 [ # # ][ # # ]: 0 : delete pOutWin;
310 [ # # ]: 0 : }
311 : :
312 : 0 : void SwSrcEditWindow::DataChanged( const DataChangedEvent& rDCEvt )
313 : : {
314 : 0 : Window::DataChanged( rDCEvt );
315 : :
316 [ # # ]: 0 : switch ( rDCEvt.GetType() )
317 : : {
318 : : case DATACHANGED_SETTINGS:
319 : : // newly rearrange ScrollBars or trigger Resize, because
320 : : // ScrollBar size could have changed. For this, in the
321 : : // Resize handler the size of ScrollBars has to be queried
322 : : // from the settings as well.
323 [ # # ]: 0 : if( rDCEvt.GetFlags() & SETTINGS_STYLE )
324 : 0 : Resize();
325 : 0 : break;
326 : : }
327 : 0 : }
328 : :
329 : 0 : void SwSrcEditWindow::Resize()
330 : : {
331 : : // ScrollBars, etc. happens in Adjust...
332 [ # # ]: 0 : if ( pTextView )
333 : : {
334 [ # # ]: 0 : long nVisY = pTextView->GetStartDocPos().Y();
335 [ # # ]: 0 : pTextView->ShowCursor();
336 : 0 : Size aOutSz( GetOutputSizePixel() );
337 [ # # ][ # # ]: 0 : long nMaxVisAreaStart = pTextView->GetTextEngine()->GetTextHeight() - aOutSz.Height();
338 [ # # ]: 0 : if ( nMaxVisAreaStart < 0 )
339 : 0 : nMaxVisAreaStart = 0;
340 [ # # ][ # # ]: 0 : if ( pTextView->GetStartDocPos().Y() > nMaxVisAreaStart )
341 : : {
342 [ # # ]: 0 : Point aStartDocPos( pTextView->GetStartDocPos() );
343 : 0 : aStartDocPos.Y() = nMaxVisAreaStart;
344 [ # # ]: 0 : pTextView->SetStartDocPos( aStartDocPos );
345 [ # # ]: 0 : pTextView->ShowCursor();
346 : : }
347 : 0 : long nScrollStd = GetSettings().GetStyleSettings().GetScrollBarSize();
348 : 0 : Size aScrollSz(aOutSz.Width() - nScrollStd, nScrollStd );
349 : 0 : Point aScrollPos(0, aOutSz.Height() - nScrollStd);
350 : :
351 [ # # ]: 0 : pHScrollbar->SetPosSizePixel( aScrollPos, aScrollSz);
352 : :
353 : 0 : aScrollSz.Width() = aScrollSz.Height();
354 : 0 : aScrollSz.Height() = aOutSz.Height();
355 : 0 : aScrollPos = Point(aOutSz.Width() - nScrollStd, 0);
356 : :
357 [ # # ]: 0 : pVScrollbar->SetPosSizePixel( aScrollPos, aScrollSz);
358 : 0 : aOutSz.Width() -= nScrollStd;
359 : 0 : aOutSz.Height() -= nScrollStd;
360 [ # # ]: 0 : pOutWin->SetOutputSizePixel(aOutSz);
361 [ # # ]: 0 : InitScrollBars();
362 : :
363 : : // set line in first Resize
364 [ # # ]: 0 : if(USHRT_MAX != nStartLine)
365 : : {
366 [ # # ][ # # ]: 0 : if(nStartLine < pTextEngine->GetParagraphCount())
367 : : {
368 [ # # ]: 0 : TextSelection aSel(TextPaM( nStartLine, 0 ), TextPaM( nStartLine, 0x0 ));
369 [ # # ]: 0 : pTextView->SetSelection(aSel);
370 [ # # ]: 0 : pTextView->ShowCursor();
371 : : }
372 : 0 : nStartLine = USHRT_MAX;
373 : : }
374 : :
375 [ # # ][ # # ]: 0 : if ( nVisY != pTextView->GetStartDocPos().Y() )
376 [ # # ]: 0 : Invalidate();
377 : : }
378 : :
379 : 0 : }
380 : :
381 : 0 : void TextViewOutWin::DataChanged( const DataChangedEvent& rDCEvt )
382 : : {
383 : 0 : Window::DataChanged( rDCEvt );
384 : :
385 [ # # ]: 0 : switch( rDCEvt.GetType() )
386 : : {
387 : : case DATACHANGED_SETTINGS:
388 : : // query settings
389 [ # # ]: 0 : if( rDCEvt.GetFlags() & SETTINGS_STYLE )
390 : : {
391 : 0 : const Color &rCol = GetSettings().GetStyleSettings().GetWindowColor();
392 [ # # ][ # # ]: 0 : SetBackground( rCol );
[ # # ]
393 [ # # ][ # # ]: 0 : Font aFont( pTextView->GetTextEngine()->GetFont() );
394 [ # # ]: 0 : aFont.SetFillColor( rCol );
395 [ # # ][ # # ]: 0 : pTextView->GetTextEngine()->SetFont( aFont );
[ # # ]
396 : : }
397 : 0 : break;
398 : : }
399 : 0 : }
400 : :
401 : 0 : void TextViewOutWin::MouseMove( const MouseEvent &rEvt )
402 : : {
403 [ # # ]: 0 : if ( pTextView )
404 : 0 : pTextView->MouseMove( rEvt );
405 : 0 : }
406 : :
407 : 0 : void TextViewOutWin::MouseButtonUp( const MouseEvent &rEvt )
408 : : {
409 [ # # ]: 0 : if ( pTextView )
410 : : {
411 : 0 : pTextView->MouseButtonUp( rEvt );
412 : 0 : SfxBindings& rBindings = ((SwSrcEditWindow*)GetParent())->GetSrcView()->GetViewFrame()->GetBindings();
413 : 0 : rBindings.Invalidate( SID_TABLE_CELL );
414 : 0 : rBindings.Invalidate( SID_CUT );
415 : 0 : rBindings.Invalidate( SID_COPY );
416 : : }
417 : 0 : }
418 : :
419 : 0 : void TextViewOutWin::MouseButtonDown( const MouseEvent &rEvt )
420 : : {
421 : 0 : GrabFocus();
422 [ # # ]: 0 : if ( pTextView )
423 : 0 : pTextView->MouseButtonDown( rEvt );
424 : 0 : }
425 : :
426 : 0 : void TextViewOutWin::Command( const CommandEvent& rCEvt )
427 : : {
428 [ # # # ]: 0 : switch(rCEvt.GetCommand())
429 : : {
430 : : case COMMAND_CONTEXTMENU:
431 : 0 : ((SwSrcEditWindow*)GetParent())->GetSrcView()->GetViewFrame()->
432 : 0 : GetDispatcher()->ExecutePopup();
433 : 0 : break;
434 : : case COMMAND_WHEEL:
435 : : case COMMAND_STARTAUTOSCROLL:
436 : : case COMMAND_AUTOSCROLL:
437 : : {
438 : 0 : const CommandWheelData* pWData = rCEvt.GetWheelData();
439 [ # # ][ # # ]: 0 : if( !pWData || COMMAND_WHEEL_ZOOM != pWData->GetMode() )
[ # # ]
440 : : {
441 : 0 : ((SwSrcEditWindow*)GetParent())->HandleWheelCommand( rCEvt );
442 : : }
443 : : }
444 : 0 : break;
445 : :
446 : : default:
447 [ # # ]: 0 : if ( pTextView )
448 : 0 : pTextView->Command( rCEvt );
449 : : else
450 : 0 : Window::Command(rCEvt);
451 : : }
452 : 0 : }
453 : :
454 : 0 : void TextViewOutWin::KeyInput( const KeyEvent& rKEvt )
455 : : {
456 : 0 : sal_Bool bDone = sal_False;
457 : 0 : SwSrcEditWindow* pSrcEditWin = (SwSrcEditWindow*)GetParent();
458 [ # # ][ # # ]: 0 : sal_Bool bChange = !pSrcEditWin->IsReadonly() || !TextEngine::DoesKeyChangeText( rKEvt );
459 [ # # ]: 0 : if(bChange)
460 : 0 : bDone = pTextView->KeyInput( rKEvt );
461 : :
462 : 0 : SfxBindings& rBindings = ((SwSrcEditWindow*)GetParent())->GetSrcView()->GetViewFrame()->GetBindings();
463 [ # # ]: 0 : if ( !bDone )
464 : : {
465 [ # # ]: 0 : if ( !SfxViewShell::Current()->KeyInput( rKEvt ) )
466 : 0 : Window::KeyInput( rKEvt );
467 : : }
468 : : else
469 : : {
470 : 0 : rBindings.Invalidate( SID_TABLE_CELL );
471 [ # # ]: 0 : if ( rKEvt.GetKeyCode().GetGroup() == KEYGROUP_CURSOR )
472 : 0 : rBindings.Update( SID_BASICIDE_STAT_POS );
473 [ # # ]: 0 : if (pSrcEditWin->GetTextEngine()->IsModified() )
474 : : {
475 : 0 : rBindings.Invalidate( SID_SAVEDOC );
476 : 0 : rBindings.Invalidate( SID_DOC_MODIFIED );
477 : : }
478 [ # # ]: 0 : if( rKEvt.GetKeyCode().GetCode() == KEY_INSERT )
479 : 0 : rBindings.Invalidate( SID_ATTR_INSERT );
480 : : }
481 : :
482 : 0 : rBindings.Invalidate( SID_CUT );
483 : 0 : rBindings.Invalidate( SID_COPY );
484 : :
485 : 0 : SwDocShell* pDocShell = pSrcEditWin->GetSrcView()->GetDocShell();
486 [ # # ]: 0 : if(pSrcEditWin->GetTextEngine()->IsModified())
487 : : {
488 : 0 : pDocShell->SetModified();
489 : : }
490 : 0 : }
491 : :
492 : 0 : void TextViewOutWin::Paint( const Rectangle& rRect )
493 : : {
494 : 0 : pTextView->Paint( rRect );
495 : 0 : }
496 : :
497 : 0 : void SwSrcEditWindow::CreateTextEngine()
498 : : {
499 : 0 : const Color &rCol = GetSettings().GetStyleSettings().GetWindowColor();
500 [ # # ][ # # ]: 0 : pOutWin = new TextViewOutWin(this, 0);
501 [ # # ][ # # ]: 0 : pOutWin->SetBackground(Wallpaper(rCol));
[ # # ]
502 [ # # ]: 0 : pOutWin->SetPointer(Pointer(POINTER_TEXT));
503 [ # # ]: 0 : pOutWin->Show();
504 : :
505 : : // create Scrollbars
506 [ # # ][ # # ]: 0 : pHScrollbar = new ScrollBar(this, WB_3DLOOK |WB_HSCROLL|WB_DRAG);
507 [ # # ]: 0 : pHScrollbar->EnableRTL( false ); // --- RTL --- no mirroring for scrollbars
508 [ # # ]: 0 : pHScrollbar->SetScrollHdl(LINK(this, SwSrcEditWindow, ScrollHdl));
509 [ # # ]: 0 : pHScrollbar->Show();
510 : :
511 [ # # ][ # # ]: 0 : pVScrollbar = new ScrollBar(this, WB_3DLOOK |WB_VSCROLL|WB_DRAG);
512 [ # # ]: 0 : pVScrollbar->EnableRTL( false ); // --- RTL --- no mirroring for scrollbars
513 [ # # ]: 0 : pVScrollbar->SetScrollHdl(LINK(this, SwSrcEditWindow, ScrollHdl));
514 : 0 : pHScrollbar->EnableDrag();
515 [ # # ]: 0 : pVScrollbar->Show();
516 : :
517 [ # # ][ # # ]: 0 : pTextEngine = new ExtTextEngine;
518 [ # # ][ # # ]: 0 : pTextView = new ExtTextView( pTextEngine, pOutWin );
519 [ # # ]: 0 : pTextView->SetAutoIndentMode(sal_True);
520 : 0 : pOutWin->SetTextView(pTextView);
521 : :
522 [ # # ]: 0 : pTextEngine->SetUpdateMode( sal_False );
523 [ # # ]: 0 : pTextEngine->InsertView( pTextView );
524 : :
525 [ # # ]: 0 : Font aFont;
526 [ # # ]: 0 : aFont.SetTransparent( sal_False );
527 [ # # ]: 0 : aFont.SetFillColor( rCol );
528 [ # # ]: 0 : SetPointFont( aFont );
529 [ # # ]: 0 : aFont = GetFont();
530 [ # # ]: 0 : aFont.SetFillColor( rCol );
531 [ # # ]: 0 : pOutWin->SetFont( aFont );
532 [ # # ]: 0 : pTextEngine->SetFont( aFont );
533 : :
534 [ # # ]: 0 : aSyntaxIdleTimer.SetTimeout( SYNTAX_HIGHLIGHT_TIMEOUT );
535 [ # # ]: 0 : aSyntaxIdleTimer.SetTimeoutHdl( LINK( this, SwSrcEditWindow, SyntaxTimerHdl ) );
536 : :
537 [ # # ]: 0 : pTextEngine->EnableUndo( sal_True );
538 [ # # ]: 0 : pTextEngine->SetUpdateMode( sal_True );
539 : :
540 [ # # ]: 0 : pTextView->ShowCursor( sal_True, sal_True );
541 [ # # ]: 0 : InitScrollBars();
542 [ # # ]: 0 : StartListening( *pTextEngine );
543 : :
544 : 0 : SfxBindings& rBind = GetSrcView()->GetViewFrame()->GetBindings();
545 [ # # ][ # # ]: 0 : rBind.Invalidate( SID_TABLE_CELL );
546 : 0 : }
547 : :
548 : 0 : void SwSrcEditWindow::SetScrollBarRanges()
549 : : {
550 : : // Extra method, not InitScrollBars, because also for TextEngine events.
551 : :
552 [ # # ]: 0 : pHScrollbar->SetRange( Range( 0, nCurTextWidth-1 ) );
553 [ # # ]: 0 : pVScrollbar->SetRange( Range(0, pTextEngine->GetTextHeight()-1) );
554 : 0 : }
555 : :
556 : 0 : void SwSrcEditWindow::InitScrollBars()
557 : : {
558 [ # # ]: 0 : SetScrollBarRanges();
559 : :
560 : 0 : Size aOutSz( pOutWin->GetOutputSizePixel() );
561 [ # # ]: 0 : pVScrollbar->SetVisibleSize( aOutSz.Height() );
562 : 0 : pVScrollbar->SetPageSize( aOutSz.Height() * 8 / 10 );
563 [ # # ]: 0 : pVScrollbar->SetLineSize( pOutWin->GetTextHeight() );
564 [ # # ][ # # ]: 0 : pVScrollbar->SetThumbPos( pTextView->GetStartDocPos().Y() );
565 [ # # ]: 0 : pHScrollbar->SetVisibleSize( aOutSz.Width() );
566 : 0 : pHScrollbar->SetPageSize( aOutSz.Width() * 8 / 10 );
567 [ # # ][ # # ]: 0 : pHScrollbar->SetLineSize( pOutWin->GetTextWidth(rtl::OUString('x')) );
[ # # ]
568 [ # # ][ # # ]: 0 : pHScrollbar->SetThumbPos( pTextView->GetStartDocPos().X() );
569 : :
570 : 0 : }
571 : :
572 : 0 : IMPL_LINK(SwSrcEditWindow, ScrollHdl, ScrollBar*, pScroll)
573 : : {
574 [ # # ]: 0 : if(pScroll == pVScrollbar)
575 : : {
576 : 0 : long nDiff = pTextView->GetStartDocPos().Y() - pScroll->GetThumbPos();
577 : 0 : GetTextView()->Scroll( 0, nDiff );
578 : 0 : pTextView->ShowCursor( sal_False, sal_True );
579 : 0 : pScroll->SetThumbPos( pTextView->GetStartDocPos().Y() );
580 : : }
581 : : else
582 : : {
583 : 0 : long nDiff = pTextView->GetStartDocPos().X() - pScroll->GetThumbPos();
584 : 0 : GetTextView()->Scroll( nDiff, 0 );
585 : 0 : pTextView->ShowCursor( sal_False, sal_True );
586 : 0 : pScroll->SetThumbPos( pTextView->GetStartDocPos().X() );
587 : : }
588 : 0 : GetSrcView()->GetViewFrame()->GetBindings().Invalidate( SID_TABLE_CELL );
589 : 0 : return 0;
590 : : }
591 : :
592 : 0 : IMPL_LINK( SwSrcEditWindow, SyntaxTimerHdl, Timer *, pTimer )
593 : : {
594 [ # # ]: 0 : Time aSyntaxCheckStart( Time::SYSTEM );
595 : : SAL_WARN_IF(pTextView == 0, "sw", "No View yet, but syntax highlighting?!");
596 : :
597 : 0 : bHighlighting = sal_True;
598 : 0 : sal_uInt16 nCount = 0;
599 : : // at first the region around the cursor is processed
600 [ # # ]: 0 : TextSelection aSel = pTextView->GetSelection();
601 : 0 : sal_uInt16 nCur = (sal_uInt16)aSel.GetStart().GetPara();
602 [ # # ]: 0 : if(nCur > 40)
603 : 0 : nCur -= 40;
604 : : else
605 : 0 : nCur = 0;
606 [ # # ]: 0 : if(!aSyntaxLineTable.empty())
607 [ # # ][ # # ]: 0 : for(sal_uInt16 i = 0; i < 80 && nCount < 40; i++, nCur++)
[ # # ]
608 : : {
609 [ # # ][ # # ]: 0 : if(aSyntaxLineTable.find(nCur) != aSyntaxLineTable.end())
[ # # ]
610 : : {
611 [ # # ]: 0 : DoSyntaxHighlight( nCur );
612 [ # # ]: 0 : aSyntaxLineTable.erase( nCur );
613 : 0 : nCount++;
614 [ # # ]: 0 : if(aSyntaxLineTable.empty())
615 : 0 : break;
616 [ # # ][ # # ]: 0 : if((Time( Time::SYSTEM ).GetTime() - aSyntaxCheckStart.GetTime()) > MAX_HIGHLIGHTTIME )
617 : : {
618 [ # # ]: 0 : pTimer->SetTimeout( 2 * SYNTAX_HIGHLIGHT_TIMEOUT );
619 : 0 : break;
620 : : }
621 : : }
622 : : }
623 : :
624 : : // when there is still anything left by then, go on from the beginning
625 [ # # ][ # # ]: 0 : while ( !aSyntaxLineTable.empty() && nCount < MAX_SYNTAX_HIGHLIGHT)
[ # # ]
626 : : {
627 [ # # ]: 0 : sal_uInt16 nLine = *aSyntaxLineTable.begin();
628 [ # # ]: 0 : DoSyntaxHighlight( nLine );
629 [ # # ]: 0 : aSyntaxLineTable.erase(nLine);
630 : 0 : nCount ++;
631 [ # # ][ # # ]: 0 : if(Time( Time::SYSTEM ).GetTime() - aSyntaxCheckStart.GetTime() > MAX_HIGHLIGHTTIME)
632 : : {
633 [ # # ]: 0 : pTimer->SetTimeout( 2 * SYNTAX_HIGHLIGHT_TIMEOUT );
634 : : break;
635 : : }
636 : : }
637 : :
638 [ # # ][ # # ]: 0 : if(!aSyntaxLineTable.empty() && !pTimer->IsActive())
[ # # ]
639 [ # # ]: 0 : pTimer->Start();
640 : : // SyntaxTimerHdl is called when text changed
641 : : // => good opportunity to determine text width!
642 : 0 : long nPrevTextWidth = nCurTextWidth;
643 [ # # ]: 0 : nCurTextWidth = pTextEngine->CalcTextWidth() + 25; // kleine Toleranz
644 [ # # ]: 0 : if ( nCurTextWidth != nPrevTextWidth )
645 [ # # ]: 0 : SetScrollBarRanges();
646 : 0 : bHighlighting = sal_False;
647 : :
648 : 0 : return 0;
649 : : }
650 : :
651 : 0 : void SwSrcEditWindow::DoSyntaxHighlight( sal_uInt16 nPara )
652 : : {
653 : : // Because of DelayedSyntaxHighlight it could happen,
654 : : // that the line doesn't exist anymore!
655 [ # # ]: 0 : if ( nPara < pTextEngine->GetParagraphCount() )
656 : : {
657 : 0 : sal_Bool bTempModified = IsModified();
658 [ # # ]: 0 : pTextEngine->RemoveAttribs( nPara, (sal_Bool)sal_True );
659 [ # # ]: 0 : String aSource( pTextEngine->GetText( nPara ) );
660 [ # # ]: 0 : pTextEngine->SetUpdateMode( sal_False );
661 [ # # ]: 0 : ImpDoHighlight( aSource, nPara );
662 [ # # ]: 0 : TextView* pTmp = pTextEngine->GetActiveView();
663 [ # # ]: 0 : pTmp->SetAutoScroll(sal_False);
664 [ # # ]: 0 : pTextEngine->SetActiveView(0);
665 [ # # ]: 0 : pTextEngine->SetUpdateMode( sal_True );
666 [ # # ]: 0 : pTextEngine->SetActiveView(pTmp);
667 [ # # ]: 0 : pTmp->SetAutoScroll(sal_True);
668 [ # # ]: 0 : pTmp->ShowCursor( sal_False/*pTmp->IsAutoScroll()*/ );
669 : :
670 [ # # ]: 0 : if(!bTempModified)
671 [ # # ]: 0 : ClearModifyFlag();
672 : : }
673 : 0 : }
674 : :
675 : 0 : void SwSrcEditWindow::DoDelayedSyntaxHighlight( sal_uInt16 nPara )
676 : : {
677 [ # # ][ # # ]: 0 : if ( !bHighlighting && bDoSyntaxHighlight )
678 : : {
679 : 0 : aSyntaxLineTable.insert( nPara );
680 : 0 : aSyntaxIdleTimer.Start();
681 : : }
682 : 0 : }
683 : :
684 : 0 : void SwSrcEditWindow::ImpDoHighlight( const String& rSource, sal_uInt16 nLineOff )
685 : : {
686 [ # # ]: 0 : SwTextPortions aPortionList;
687 [ # # ]: 0 : lcl_Highlight(rSource, aPortionList);
688 : :
689 : 0 : size_t nCount = aPortionList.size();
690 [ # # ]: 0 : if ( !nCount )
691 : : return;
692 : :
693 [ # # ]: 0 : SwTextPortion& rLast = aPortionList[nCount-1];
694 [ # # ]: 0 : if ( rLast.nStart > rLast.nEnd ) // Only until Bug from MD is resolved
695 : : {
696 : 0 : nCount--;
697 [ # # ]: 0 : aPortionList.pop_back();
698 [ # # ]: 0 : if ( !nCount )
699 : : return;
700 : : }
701 : :
702 : : // maybe optimize:
703 : : // If frequently the same color, blank without color in between,
704 : : // maybe summarize or at least the blank; for less attributes
705 : 0 : sal_Bool bOptimizeHighlight = sal_True; // war in der BasicIDE static
706 [ # # ]: 0 : if ( bOptimizeHighlight )
707 : : {
708 : : // Only blanks and tabs have to be attributed along.
709 : : // When two identical attributes are placed consecutively,
710 : : // it optimises the TextEngine.
711 : 0 : sal_uInt16 nLastEnd = 0;
712 : :
713 [ # # ]: 0 : for ( size_t i = 0; i < nCount; i++ )
714 : : {
715 [ # # ]: 0 : SwTextPortion& r = aPortionList[i];
716 : : SAL_WARN_IF(
717 : : r.nLine != aPortionList[0].nLine, "sw.level2",
718 : : "multiple lines after all?");
719 [ # # ]: 0 : if ( r.nStart > r.nEnd ) // only until Bug from MD is resolved
720 : 0 : continue;
721 : :
722 [ # # ]: 0 : if ( r.nStart > nLastEnd )
723 : : {
724 : : // Can I rely on the fact that all except blank and tab
725 : : // are being highlighted?!
726 : 0 : r.nStart = nLastEnd;
727 : : }
728 : 0 : nLastEnd = r.nEnd+1;
729 [ # # ][ # # ]: 0 : if ( ( i == (nCount-1) ) && ( r.nEnd < rSource.Len() ) )
[ # # ]
730 : 0 : r.nEnd = rSource.Len();
731 : : }
732 : : }
733 : :
734 [ # # ]: 0 : for ( size_t i = 0; i < aPortionList.size(); i++ )
735 : : {
736 [ # # ]: 0 : SwTextPortion& r = aPortionList[i];
737 [ # # ]: 0 : if ( r.nStart > r.nEnd ) // only until Bug from MD is resolved
738 : 0 : continue;
739 [ # # ][ # # ]: 0 : if(r.eType != svtools::HTMLSGML &&
[ # # ][ # # ]
740 : : r.eType != svtools::HTMLCOMMENT &&
741 : : r.eType != svtools::HTMLKEYWORD &&
742 : : r.eType != svtools::HTMLUNKNOWN)
743 : 0 : r.eType = svtools::HTMLUNKNOWN;
744 [ # # ][ # # ]: 0 : Color aColor((ColorData)SW_MOD()->GetColorConfig().GetColorValue((svtools::ColorConfigEntry)r.eType).nColor);
[ # # ]
745 : 0 : sal_uInt16 nLine = nLineOff+r.nLine; //
746 [ # # ][ # # ]: 0 : pTextEngine->SetAttrib( TextAttribFontColor( aColor ), nLine, r.nStart, r.nEnd+1, sal_True );
[ # # ]
747 [ # # ]: 0 : }
748 : : }
749 : :
750 : 0 : void SwSrcEditWindow::Notify( SfxBroadcaster& /*rBC*/, const SfxHint& rHint )
751 : : {
752 [ # # ]: 0 : if ( rHint.ISA( TextHint ) )
753 : : {
754 : 0 : const TextHint& rTextHint = (const TextHint&)rHint;
755 [ # # ]: 0 : if( rTextHint.GetId() == TEXT_HINT_VIEWSCROLLED )
756 : : {
757 : 0 : pHScrollbar->SetThumbPos( pTextView->GetStartDocPos().X() );
758 : 0 : pVScrollbar->SetThumbPos( pTextView->GetStartDocPos().Y() );
759 : : }
760 [ # # ]: 0 : else if( rTextHint.GetId() == TEXT_HINT_TEXTHEIGHTCHANGED )
761 : : {
762 [ # # ]: 0 : if ( (long)pTextEngine->GetTextHeight() < pOutWin->GetOutputSizePixel().Height() )
763 : 0 : pTextView->Scroll( 0, pTextView->GetStartDocPos().Y() );
764 : 0 : pVScrollbar->SetThumbPos( pTextView->GetStartDocPos().Y() );
765 : 0 : SetScrollBarRanges();
766 : : }
767 [ # # # # ]: 0 : else if( ( rTextHint.GetId() == TEXT_HINT_PARAINSERTED ) ||
[ # # ]
768 : 0 : ( rTextHint.GetId() == TEXT_HINT_PARACONTENTCHANGED ) )
769 : : {
770 : 0 : DoDelayedSyntaxHighlight( (sal_uInt16)rTextHint.GetValue() );
771 : : }
772 : : }
773 : 0 : }
774 : :
775 : 0 : void SwSrcEditWindow::Invalidate(sal_uInt16 )
776 : : {
777 : 0 : pOutWin->Invalidate();
778 : 0 : Window::Invalidate();
779 : :
780 : 0 : }
781 : :
782 : 0 : void SwSrcEditWindow::Command( const CommandEvent& rCEvt )
783 : : {
784 [ # # ]: 0 : switch(rCEvt.GetCommand())
785 : : {
786 : : case COMMAND_WHEEL:
787 : : case COMMAND_STARTAUTOSCROLL:
788 : : case COMMAND_AUTOSCROLL:
789 : : {
790 : 0 : const CommandWheelData* pWData = rCEvt.GetWheelData();
791 [ # # ][ # # ]: 0 : if( !pWData || COMMAND_WHEEL_ZOOM != pWData->GetMode() )
[ # # ]
792 : 0 : HandleScrollCommand( rCEvt, pHScrollbar, pVScrollbar );
793 : : }
794 : 0 : break;
795 : : default:
796 : 0 : Window::Command(rCEvt);
797 : : }
798 : 0 : }
799 : :
800 : 0 : void SwSrcEditWindow::HandleWheelCommand( const CommandEvent& rCEvt )
801 : : {
802 : 0 : pTextView->Command(rCEvt);
803 : 0 : HandleScrollCommand( rCEvt, pHScrollbar, pVScrollbar );
804 : 0 : }
805 : :
806 : 0 : void SwSrcEditWindow::GetFocus()
807 : : {
808 : 0 : pOutWin->GrabFocus();
809 : 0 : }
810 : :
811 : 0 : sal_Bool lcl_GetLanguagesForEncoding(rtl_TextEncoding eEnc, LanguageType aLanguages[])
812 : : {
813 [ # # # # : 0 : switch(eEnc)
# # # # #
# # # # #
# # # # #
# # # #
# ]
814 : : {
815 : : case RTL_TEXTENCODING_UTF7 :
816 : : case RTL_TEXTENCODING_UTF8 :
817 : : // don#t fill - all LANGUAGE_SYSTEM means unicode font has to be used
818 : 0 : break;
819 : :
820 : :
821 : : case RTL_TEXTENCODING_ISO_8859_3:
822 : : case RTL_TEXTENCODING_ISO_8859_1 :
823 : : case RTL_TEXTENCODING_MS_1252 :
824 : : case RTL_TEXTENCODING_APPLE_ROMAN :
825 : : case RTL_TEXTENCODING_IBM_850 :
826 : : case RTL_TEXTENCODING_ISO_8859_14 :
827 : : case RTL_TEXTENCODING_ISO_8859_15 :
828 : : //fill with western languages
829 : 0 : aLanguages[0] = LANGUAGE_GERMAN;
830 : 0 : aLanguages[1] = LANGUAGE_FRENCH;
831 : 0 : aLanguages[2] = LANGUAGE_ITALIAN;
832 : 0 : aLanguages[3] = LANGUAGE_SPANISH;
833 : 0 : break;
834 : :
835 : : case RTL_TEXTENCODING_IBM_865 :
836 : : //scandinavian
837 : 0 : aLanguages[0] = LANGUAGE_FINNISH;
838 : 0 : aLanguages[1] = LANGUAGE_NORWEGIAN;
839 : 0 : aLanguages[2] = LANGUAGE_SWEDISH;
840 : 0 : aLanguages[3] = LANGUAGE_DANISH;
841 : 0 : break;
842 : :
843 : : case RTL_TEXTENCODING_ISO_8859_10 :
844 : : case RTL_TEXTENCODING_ISO_8859_13 :
845 : : case RTL_TEXTENCODING_ISO_8859_2 :
846 : : case RTL_TEXTENCODING_IBM_852 :
847 : : case RTL_TEXTENCODING_MS_1250 :
848 : : case RTL_TEXTENCODING_APPLE_CENTEURO :
849 : 0 : aLanguages[0] = LANGUAGE_POLISH;
850 : 0 : aLanguages[1] = LANGUAGE_CZECH;
851 : 0 : aLanguages[2] = LANGUAGE_HUNGARIAN;
852 : 0 : aLanguages[3] = LANGUAGE_SLOVAK;
853 : 0 : break;
854 : :
855 : : case RTL_TEXTENCODING_ISO_8859_4 :
856 : : case RTL_TEXTENCODING_IBM_775 :
857 : : case RTL_TEXTENCODING_MS_1257 :
858 : 0 : aLanguages[0] = LANGUAGE_LATVIAN ;
859 : 0 : aLanguages[1] = LANGUAGE_LITHUANIAN;
860 : 0 : aLanguages[2] = LANGUAGE_ESTONIAN ;
861 : 0 : break;
862 : :
863 : 0 : case RTL_TEXTENCODING_IBM_863 : aLanguages[0] = LANGUAGE_FRENCH_CANADIAN; break;
864 : 0 : case RTL_TEXTENCODING_APPLE_FARSI : aLanguages[0] = LANGUAGE_FARSI; break;
865 : 0 : case RTL_TEXTENCODING_APPLE_ROMANIAN:aLanguages[0] = LANGUAGE_ROMANIAN; break;
866 : :
867 : : case RTL_TEXTENCODING_IBM_861 :
868 : : case RTL_TEXTENCODING_APPLE_ICELAND :
869 : 0 : aLanguages[0] = LANGUAGE_ICELANDIC;
870 : 0 : break;
871 : :
872 : 0 : case RTL_TEXTENCODING_APPLE_CROATIAN:aLanguages[0] = LANGUAGE_CROATIAN; break;
873 : :
874 : : case RTL_TEXTENCODING_IBM_437 :
875 : 0 : case RTL_TEXTENCODING_ASCII_US : aLanguages[0] = LANGUAGE_ENGLISH; break;
876 : :
877 : : case RTL_TEXTENCODING_IBM_862 :
878 : : case RTL_TEXTENCODING_MS_1255 :
879 : : case RTL_TEXTENCODING_APPLE_HEBREW :
880 : : case RTL_TEXTENCODING_ISO_8859_8 :
881 : 0 : aLanguages[0] = LANGUAGE_HEBREW;
882 : 0 : break;
883 : :
884 : : case RTL_TEXTENCODING_IBM_857 :
885 : : case RTL_TEXTENCODING_MS_1254 :
886 : : case RTL_TEXTENCODING_APPLE_TURKISH:
887 : : case RTL_TEXTENCODING_ISO_8859_9 :
888 : 0 : aLanguages[0] = LANGUAGE_TURKISH;
889 : 0 : break;
890 : :
891 : : case RTL_TEXTENCODING_IBM_860 :
892 : 0 : aLanguages[0] = LANGUAGE_PORTUGUESE;
893 : 0 : break;
894 : :
895 : : case RTL_TEXTENCODING_IBM_869 :
896 : : case RTL_TEXTENCODING_MS_1253 :
897 : : case RTL_TEXTENCODING_APPLE_GREEK :
898 : : case RTL_TEXTENCODING_ISO_8859_7 :
899 : : case RTL_TEXTENCODING_IBM_737 :
900 : 0 : aLanguages[0] = LANGUAGE_GREEK;
901 : 0 : break;
902 : :
903 : : case RTL_TEXTENCODING_KOI8_R :
904 : : case RTL_TEXTENCODING_ISO_8859_5 :
905 : : case RTL_TEXTENCODING_IBM_855 :
906 : : case RTL_TEXTENCODING_MS_1251 :
907 : : case RTL_TEXTENCODING_IBM_866 :
908 : : case RTL_TEXTENCODING_APPLE_CYRILLIC :
909 : 0 : aLanguages[0] = LANGUAGE_RUSSIAN;
910 : 0 : break;
911 : :
912 : : case RTL_TEXTENCODING_APPLE_UKRAINIAN:
913 : : case RTL_TEXTENCODING_KOI8_U:
914 : 0 : aLanguages[0] = LANGUAGE_UKRAINIAN;
915 : 0 : break;
916 : :
917 : : case RTL_TEXTENCODING_IBM_864 :
918 : : case RTL_TEXTENCODING_MS_1256 :
919 : : case RTL_TEXTENCODING_ISO_8859_6 :
920 : : case RTL_TEXTENCODING_APPLE_ARABIC :
921 : 0 : aLanguages[0] = LANGUAGE_ARABIC_SAUDI_ARABIA;
922 : 0 : break;
923 : :
924 : : case RTL_TEXTENCODING_APPLE_CHINTRAD :
925 : : case RTL_TEXTENCODING_MS_950 :
926 : : case RTL_TEXTENCODING_GBT_12345 :
927 : : case RTL_TEXTENCODING_BIG5 :
928 : : case RTL_TEXTENCODING_EUC_TW :
929 : : case RTL_TEXTENCODING_BIG5_HKSCS :
930 : 0 : aLanguages[0] = LANGUAGE_CHINESE_TRADITIONAL;
931 : 0 : break;
932 : :
933 : : case RTL_TEXTENCODING_EUC_JP :
934 : : case RTL_TEXTENCODING_ISO_2022_JP :
935 : : case RTL_TEXTENCODING_JIS_X_0201 :
936 : : case RTL_TEXTENCODING_JIS_X_0208 :
937 : : case RTL_TEXTENCODING_JIS_X_0212 :
938 : : case RTL_TEXTENCODING_APPLE_JAPANESE :
939 : : case RTL_TEXTENCODING_MS_932 :
940 : : case RTL_TEXTENCODING_SHIFT_JIS :
941 : 0 : aLanguages[0] = LANGUAGE_JAPANESE;
942 : 0 : break;
943 : :
944 : : case RTL_TEXTENCODING_GB_2312 :
945 : : case RTL_TEXTENCODING_MS_936 :
946 : : case RTL_TEXTENCODING_GBK :
947 : : case RTL_TEXTENCODING_GB_18030 :
948 : : case RTL_TEXTENCODING_APPLE_CHINSIMP :
949 : : case RTL_TEXTENCODING_EUC_CN :
950 : : case RTL_TEXTENCODING_ISO_2022_CN :
951 : 0 : aLanguages[0] = LANGUAGE_CHINESE_SIMPLIFIED;
952 : 0 : break;
953 : :
954 : : case RTL_TEXTENCODING_APPLE_KOREAN :
955 : : case RTL_TEXTENCODING_MS_949 :
956 : : case RTL_TEXTENCODING_EUC_KR :
957 : : case RTL_TEXTENCODING_ISO_2022_KR :
958 : : case RTL_TEXTENCODING_MS_1361 :
959 : 0 : aLanguages[0] = LANGUAGE_KOREAN;
960 : 0 : break;
961 : :
962 : : case RTL_TEXTENCODING_APPLE_THAI :
963 : : case RTL_TEXTENCODING_MS_874 :
964 : : case RTL_TEXTENCODING_TIS_620 :
965 : 0 : aLanguages[0] = LANGUAGE_THAI;
966 : 0 : break;
967 : 0 : default: aLanguages[0] = Application::GetSettings().GetUILanguage();
968 : : }
969 : 0 : return aLanguages[0] != LANGUAGE_SYSTEM;
970 : : }
971 : 0 : void SwSrcEditWindow::SetFont()
972 : : {
973 : : rtl::OUString sFontName(
974 : : officecfg::Office::Common::Font::SourceViewFont::FontName::get().
975 [ # # ][ # # ]: 0 : get_value_or(rtl::OUString()));
[ # # ][ # # ]
976 [ # # ]: 0 : if(sFontName.isEmpty())
977 : : {
978 : : LanguageType aLanguages[5] =
979 : : {
980 : : LANGUAGE_SYSTEM, LANGUAGE_SYSTEM, LANGUAGE_SYSTEM, LANGUAGE_SYSTEM, LANGUAGE_SYSTEM
981 : 0 : };
982 [ # # ]: 0 : Font aFont;
983 [ # # ][ # # ]: 0 : if(lcl_GetLanguagesForEncoding(eSourceEncoding, aLanguages))
984 : : {
985 : : //TODO: check for multiple languages
986 [ # # ][ # # ]: 0 : aFont = OutputDevice::GetDefaultFont(DEFAULTFONT_FIXED, aLanguages[0], 0, this);
[ # # ]
987 : : }
988 : : else
989 : : aFont = OutputDevice::GetDefaultFont(DEFAULTFONT_SANS_UNICODE,
990 [ # # ][ # # ]: 0 : Application::GetSettings().GetLanguage(), 0, this);
[ # # ][ # # ]
[ # # ]
991 [ # # ][ # # ]: 0 : sFontName = aFont.GetName();
[ # # ]
992 : : }
993 : : const SvxFontListItem* pFontListItem =
994 [ # # ][ # # ]: 0 : (const SvxFontListItem* )pSrcView->GetDocShell()->GetItem( SID_ATTR_CHAR_FONTLIST );
995 : 0 : const FontList* pList = pFontListItem->GetFontList();
996 [ # # ][ # # ]: 0 : FontInfo aInfo = pList->Get(sFontName,WEIGHT_NORMAL, ITALIC_NONE);
[ # # ]
997 : :
998 : 0 : const Font& rFont = GetTextEngine()->GetFont();
999 [ # # ]: 0 : Font aFont(aInfo);
1000 [ # # ]: 0 : Size aSize(rFont.GetSize());
1001 : : //font height is stored in point and set in twip
1002 : 0 : aSize.Height() =
1003 : 0 : officecfg::Office::Common::Font::SourceViewFont::FontHeight::get() * 20;
1004 [ # # ][ # # ]: 0 : aFont.SetSize(pOutWin->LogicToPixel(aSize, MAP_TWIP));
[ # # ][ # # ]
1005 [ # # ]: 0 : GetTextEngine()->SetFont( aFont );
1006 [ # # ][ # # ]: 0 : pOutWin->SetFont(aFont);
[ # # ]
1007 : 0 : }
1008 : :
1009 : 0 : void SwSrcEditWindow::SetTextEncoding(rtl_TextEncoding eEncoding)
1010 : : {
1011 : 0 : eSourceEncoding = eEncoding;
1012 : 0 : SetFont();
1013 : 0 : }
1014 : :
1015 : : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|