/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ /* * This file is part of the LibreOffice project. * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. * * This file incorporates work covered by the following license notice: * * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed * with this work for additional information regarding copyright * ownership. The ASF licenses this file to you under the Apache * License, Version 2.0 (the "License"); you may not use this file * except in compliance with the License. You may obtain a copy of * the License at http://www.apache.org/licenses/LICENSE-2.0 .
*/
// Using "this" in ctor is a little fishy, but should work here at least as // long as there are no derivations:
m_xListener = new ChangesListener(*this);
css::uno::Reference< css::beans::XMultiPropertySet > n(
officecfg::Office::Common::Font::SourceViewFont::get(),
css::uno::UNO_QUERY_THROW);
{
std::unique_lock g(mutex_);
m_xNotifier = n;
}
n->addPropertiesChangeListener({ u"FontHeight"_ustr, u"FontName"_ustr }, m_xListener);
}
switch ( rDCEvt.GetType() )
{ case DataChangedEventType::SETTINGS: // newly rearrange ScrollBars or trigger Resize, because // ScrollBar size could have changed. For this, in the // Resize handler the size of ScrollBars has to be queried // from the settings as well. if( rDCEvt.GetFlags() & AllSettingsFlags::STYLE )
Resize(); break; default: break;
}
}
void SwSrcEditWindow::Resize()
{ // ScrollBars, etc. happens in Adjust... if ( !m_pTextView ) return;
m_bHighlighting = true;
sal_uInt16 nCount = 0; // at first the region around the cursor is processed
TextSelection aSel = m_pTextView->GetSelection();
sal_uInt16 nCur = o3tl::narrowing<sal_uInt16>(aSel.GetStart().GetPara()); if(nCur > 40)
nCur -= 40; else
nCur = 0; if(!m_aSyntaxLineTable.empty()) for(sal_uInt16 i = 0; i < 80 && nCount < 40; i++, nCur++)
{ if(m_aSyntaxLineTable.find(nCur) != m_aSyntaxLineTable.end())
{
DoSyntaxHighlight( nCur );
m_aSyntaxLineTable.erase( nCur );
nCount++; if(m_aSyntaxLineTable.empty()) break; if((tools::Time( tools::Time::SYSTEM ).GetTime() - aSyntaxCheckStart.GetTime()) > MAX_HIGHLIGHTTIME )
{ break;
}
}
}
// when there is still anything left by then, go on from the beginning while ( !m_aSyntaxLineTable.empty() && nCount < MAX_SYNTAX_HIGHLIGHT)
{
sal_uInt16 nLine = *m_aSyntaxLineTable.begin();
DoSyntaxHighlight( nLine );
m_aSyntaxLineTable.erase(nLine);
nCount ++; if(tools::Time( tools::Time::SYSTEM ).GetTime() - aSyntaxCheckStart.GetTime() > MAX_HIGHLIGHTTIME)
{ break;
}
}
if(!m_aSyntaxLineTable.empty() && !pIdle->IsActive())
pIdle->Start(); // SyntaxTimerHdl is called when text changed // => good opportunity to determine text width!
tools::Long nPrevTextWidth = m_nCurTextWidth;
m_nCurTextWidth = m_pTextEngine->CalcTextWidth() + 25; // small tolerance if ( m_nCurTextWidth != nPrevTextWidth )
SetScrollBarRanges();
m_bHighlighting = false;
}
void SwSrcEditWindow::DoSyntaxHighlight( sal_uInt16 nPara )
{ // Because of DelayedSyntaxHighlight it could happen, // that the line doesn't exist anymore! if ( nPara >= m_pTextEngine->GetParagraphCount() ) return;
size_t nCount = aPortionList.size(); if ( !nCount ) return;
TextPortion& rLast = aPortionList[nCount-1]; if ( rLast.nStart > rLast.nEnd ) // Only until Bug from MD is resolved
{
nCount--;
aPortionList.pop_back(); if ( !nCount ) return;
}
{ // Only blanks and tabs have to be attributed along. // When two identical attributes are placed consecutively, // it optimises the TextEngine.
sal_uInt16 nLastEnd = 0;
for ( size_t i = 0; i < nCount; i++ )
{
TextPortion& r = aPortionList[i]; if ( r.nStart > r.nEnd ) // only until Bug from MD is resolved continue;
if ( r.nStart > nLastEnd )
{ // Can I rely on the fact that all except blank and tab // are being highlighted?!
r.nStart = nLastEnd;
}
nLastEnd = r.nEnd+1; if ( ( i == (nCount-1) ) && ( r.nEnd < aSource.size() ) )
r.nEnd = aSource.size();
}
}
for (TextPortion & r : aPortionList)
{ if ( r.nStart > r.nEnd ) // only until Bug from MD is resolved continue; if(r.eType != svtools::HTMLSGML &&
r.eType != svtools::HTMLCOMMENT &&
r.eType != svtools::HTMLKEYWORD &&
r.eType != svtools::HTMLUNKNOWN)
r.eType = svtools::HTMLUNKNOWN;
Color aColor(SwModule::get()->GetColorConfig().GetColorValue(r.eType).nColor);
m_pTextEngine->SetAttrib( TextAttribFontColor( aColor ), nLineOff, r.nStart, r.nEnd+1 );
}
}
void SwSrcEditWindow::GetFocus()
{ if (m_pOutWin)
m_pOutWin->GrabFocus();
}
staticbool lcl_GetLanguagesForEncoding(rtl_TextEncoding eEnc, LanguageType aLanguages[])
{ switch(eEnc)
{ case RTL_TEXTENCODING_UTF7 : case RTL_TEXTENCODING_UTF8 : // don#t fill - all LANGUAGE_SYSTEM means unicode font has to be used break;
case RTL_TEXTENCODING_ISO_8859_3: case RTL_TEXTENCODING_ISO_8859_1 : case RTL_TEXTENCODING_MS_1252 : case RTL_TEXTENCODING_APPLE_ROMAN : case RTL_TEXTENCODING_IBM_850 : case RTL_TEXTENCODING_ISO_8859_14 : case RTL_TEXTENCODING_ISO_8859_15 : //fill with western languages
aLanguages[0] = LANGUAGE_GERMAN;
aLanguages[1] = LANGUAGE_FRENCH;
aLanguages[2] = LANGUAGE_ITALIAN;
aLanguages[3] = LANGUAGE_SPANISH; break;
case RTL_TEXTENCODING_ISO_8859_10 : case RTL_TEXTENCODING_ISO_8859_13 : case RTL_TEXTENCODING_ISO_8859_2 : case RTL_TEXTENCODING_IBM_852 : case RTL_TEXTENCODING_MS_1250 : case RTL_TEXTENCODING_APPLE_CENTEURO :
aLanguages[0] = LANGUAGE_POLISH;
aLanguages[1] = LANGUAGE_CZECH;
aLanguages[2] = LANGUAGE_HUNGARIAN;
aLanguages[3] = LANGUAGE_SLOVAK; break;
case RTL_TEXTENCODING_ISO_8859_4 : case RTL_TEXTENCODING_IBM_775 : case RTL_TEXTENCODING_MS_1257 :
aLanguages[0] = LANGUAGE_LATVIAN ;
aLanguages[1] = LANGUAGE_LITHUANIAN;
aLanguages[2] = LANGUAGE_ESTONIAN ; break;
case RTL_TEXTENCODING_IBM_863 : aLanguages[0] = LANGUAGE_FRENCH_CANADIAN; break; case RTL_TEXTENCODING_APPLE_FARSI : aLanguages[0] = LANGUAGE_FARSI; break; case RTL_TEXTENCODING_APPLE_ROMANIAN:aLanguages[0] = LANGUAGE_ROMANIAN; break;
case RTL_TEXTENCODING_IBM_861 : case RTL_TEXTENCODING_APPLE_ICELAND :
aLanguages[0] = LANGUAGE_ICELANDIC; break;
case RTL_TEXTENCODING_APPLE_CROATIAN:aLanguages[0] = LANGUAGE_CROATIAN; break;
case RTL_TEXTENCODING_IBM_437 : case RTL_TEXTENCODING_ASCII_US : aLanguages[0] = LANGUAGE_ENGLISH; break;
case RTL_TEXTENCODING_IBM_862 : case RTL_TEXTENCODING_MS_1255 : case RTL_TEXTENCODING_APPLE_HEBREW : case RTL_TEXTENCODING_ISO_8859_8 :
aLanguages[0] = LANGUAGE_HEBREW; break;
case RTL_TEXTENCODING_IBM_857 : case RTL_TEXTENCODING_MS_1254 : case RTL_TEXTENCODING_APPLE_TURKISH: case RTL_TEXTENCODING_ISO_8859_9 :
aLanguages[0] = LANGUAGE_TURKISH; break;
case RTL_TEXTENCODING_IBM_860 :
aLanguages[0] = LANGUAGE_PORTUGUESE; break;
case RTL_TEXTENCODING_IBM_869 : case RTL_TEXTENCODING_MS_1253 : case RTL_TEXTENCODING_APPLE_GREEK : case RTL_TEXTENCODING_ISO_8859_7 : case RTL_TEXTENCODING_IBM_737 :
aLanguages[0] = LANGUAGE_GREEK; break;
case RTL_TEXTENCODING_KOI8_R : case RTL_TEXTENCODING_ISO_8859_5 : case RTL_TEXTENCODING_IBM_855 : case RTL_TEXTENCODING_MS_1251 : case RTL_TEXTENCODING_IBM_866 : case RTL_TEXTENCODING_APPLE_CYRILLIC :
aLanguages[0] = LANGUAGE_RUSSIAN; break;
case RTL_TEXTENCODING_APPLE_UKRAINIAN: case RTL_TEXTENCODING_KOI8_U:
aLanguages[0] = LANGUAGE_UKRAINIAN; break;
case RTL_TEXTENCODING_IBM_864 : case RTL_TEXTENCODING_MS_1256 : case RTL_TEXTENCODING_ISO_8859_6 : case RTL_TEXTENCODING_APPLE_ARABIC :
aLanguages[0] = LANGUAGE_ARABIC_SAUDI_ARABIA; break;
case RTL_TEXTENCODING_APPLE_CHINTRAD : case RTL_TEXTENCODING_MS_950 : case RTL_TEXTENCODING_GBT_12345 : case RTL_TEXTENCODING_BIG5 : case RTL_TEXTENCODING_EUC_TW : case RTL_TEXTENCODING_BIG5_HKSCS :
aLanguages[0] = LANGUAGE_CHINESE_TRADITIONAL; break;
case RTL_TEXTENCODING_EUC_JP : case RTL_TEXTENCODING_ISO_2022_JP : case RTL_TEXTENCODING_JIS_X_0201 : case RTL_TEXTENCODING_JIS_X_0208 : case RTL_TEXTENCODING_JIS_X_0212 : case RTL_TEXTENCODING_APPLE_JAPANESE : case RTL_TEXTENCODING_MS_932 : case RTL_TEXTENCODING_SHIFT_JIS :
aLanguages[0] = LANGUAGE_JAPANESE; break;
case RTL_TEXTENCODING_GB_2312 : case RTL_TEXTENCODING_MS_936 : case RTL_TEXTENCODING_GBK : case RTL_TEXTENCODING_GB_18030 : case RTL_TEXTENCODING_APPLE_CHINSIMP : case RTL_TEXTENCODING_EUC_CN : case RTL_TEXTENCODING_ISO_2022_CN :
aLanguages[0] = LANGUAGE_CHINESE_SIMPLIFIED; break;
case RTL_TEXTENCODING_APPLE_KOREAN : case RTL_TEXTENCODING_MS_949 : case RTL_TEXTENCODING_EUC_KR : case RTL_TEXTENCODING_ISO_2022_KR : case RTL_TEXTENCODING_MS_1361 :
aLanguages[0] = LANGUAGE_KOREAN; break;
const vcl::Font& rFont = GetTextEngine()->GetFont();
Size aSize(rFont.GetFontSize()); //font height is stored in point and set in twip
aSize.setHeight(
officecfg::Office::Common::Font::SourceViewFont::FontHeight::get() * 20 );
aFont.SetFontSize(m_pOutWin->LogicToPixel(aSize, MapMode(MapUnit::MapTwip)));
GetTextEngine()->SetFont( aFont );
m_pOutWin->SetFont(aFont);
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.