25 #include <com/sun/star/beans/XMultiPropertySet.hpp>
26 #include <com/sun/star/beans/XPropertiesChangeListener.hpp>
27 #include <com/sun/star/container/XHierarchicalNameAccess.hpp>
29 #include <officecfg/Office/Common.hxx>
30 #include <rtl/ustring.hxx>
59 sal_uInt16 nStart, nEnd;
65 #define MAX_SYNTAX_HIGHLIGHT 20
66 #define MAX_HIGHLIGHTTIME 200
82 const sal_uInt16 nStrLen = rSource.getLength();
83 sal_uInt16 nInsert = 0;
84 sal_uInt16 nActPos = 0;
85 sal_uInt16 nPortStart = USHRT_MAX;
86 sal_uInt16 nPortEnd = 0;
88 while(nActPos < nStrLen)
90 if((nActPos < nStrLen - 2) && (rSource[nActPos] == cOpenBracket))
94 if(nPortEnd < nActPos - 1 )
97 aText.nStart = nPortEnd;
100 aText.nEnd = nActPos - 1;
102 aPortionList.push_back( aText );
107 if(cExclamation == cFollowFirst)
110 if(cMinus == cFollowNext &&
111 nActPos < nStrLen - 3 && cMinus == rSource[nActPos + 3])
117 nPortStart = nActPos;
118 nPortEnd = nActPos + 1;
120 else if(cSlash == cFollowFirst)
123 nPortStart = nActPos;
129 sal_uInt16 nSrchPos = nActPos;
130 while(++nSrchPos < nStrLen - 1)
133 if( cNext == cSpace ||
138 else if(cNext == cCloseBracket)
143 if(nSrchPos > nActPos + 1)
146 OUString sToken = rSource.copy(nActPos + 1, nSrchPos - nActPos - 1 );
147 sToken = sToken.toAsciiUpperCase();
149 if(nToken != HtmlTokenId::NONE)
153 nPortStart = nActPos;
156 SAL_WARN(
"sw",
"HTML token " << sToken <<
" not recognised!");
163 for(sal_uInt16
i = nPortEnd;
i < nStrLen;
i++)
164 if(cCloseBracket == rSource[
i])
174 nPortEnd = nStrLen - 1;
180 aTextPortion.nStart = nPortStart + 1;
181 aTextPortion.nEnd = nPortEnd;
182 aTextPortion.eType = eFoundType;
183 aPortionList.push_back( aTextPortion );
191 if(nInsert && nPortEnd < nActPos - 1)
193 aText.nStart = nPortEnd + 1;
194 aText.nEnd = nActPos - 1;
196 aPortionList.push_back( aText );
202 public cppu::WeakImplHelper< css::beans::XPropertiesChangeListener >
210 virtual void SAL_CALL
disposing(css::lang::EventObject
const &)
override
217 css::uno::Sequence< css::beans::PropertyChangeEvent >
const &)
override
230 m_pHScrollbar(nullptr),
231 m_pVScrollbar(nullptr),
233 m_pSrcView(pParentView),
236 m_nStartLine(USHRT_MAX),
237 m_eSourceEncoding(osl_getThreadTextEncoding()),
239 m_bHighlighting(
false),
240 m_aSyntaxIdle(
"sw uibase SwSrcEditWindow Syntax")
248 css::uno::Reference< css::beans::XMultiPropertySet >
n(
250 css::uno::UNO_QUERY_THROW);
252 std::unique_lock g(
mutex_);
255 n->addPropertiesChangeListener({
"FontHeight",
"FontName" },
m_xListener);
265 css::uno::Reference< css::beans::XMultiPropertySet >
n;
267 std::unique_lock g(
mutex_);
293 Window::DataChanged( rDCEvt );
297 case DataChangedEventType::SETTINGS:
302 if( rDCEvt.
GetFlags() & AllSettingsFlags::STYLE )
319 if ( nMaxVisAreaStart < 0 )
320 nMaxVisAreaStart = 0;
321 if (
m_pTextView->GetStartDocPos().Y() > nMaxVisAreaStart )
324 aStartDocPos.setY( nMaxVisAreaStart );
329 Size aScrollSz(aOutSz.
Width() - nScrollStd, nScrollStd );
334 aScrollSz.setWidth( aScrollSz.Height() );
335 aScrollSz.setHeight( aOutSz.
Height() );
336 aScrollPos =
Point(aOutSz.
Width() - nScrollStd, 0);
347 if(m_nStartLine < m_pTextEngine->GetParagraphCount())
364 Window::DataChanged( rDCEvt );
368 case DataChangedEventType::SETTINGS:
370 if( rDCEvt.
GetFlags() & AllSettingsFlags::STYLE )
416 case CommandEventId::ContextMenu:
419 case CommandEventId::Wheel:
420 case CommandEventId::StartAutoScroll:
421 case CommandEventId::AutoScroll:
424 if( !pWData || CommandWheelMode::ZOOM != pWData->
GetMode() )
435 Window::Command(rCEvt);
451 Window::KeyInput( rKEvt );
457 rBindings.
Update( SID_BASICIDE_STAT_POS );
560 if(pScroll == m_pVScrollbar)
562 tools::Long nDiff = m_pTextView->GetStartDocPos().Y() - pScroll->GetThumbPos();
563 GetTextView()->Scroll( 0, nDiff );
564 m_pTextView->ShowCursor(
false );
565 pScroll->SetThumbPos( m_pTextView->GetStartDocPos().Y() );
569 tools::Long nDiff = m_pTextView->GetStartDocPos().X() - pScroll->GetThumbPos();
570 GetTextView()->Scroll( nDiff, 0 );
571 m_pTextView->ShowCursor(
false );
572 pScroll->SetThumbPos( m_pTextView->GetStartDocPos().X() );
574 GetSrcView()->GetViewFrame()->GetBindings().Invalidate( SID_TABLE_CELL );
580 SAL_WARN_IF(m_pTextView ==
nullptr,
"sw",
"No View yet, but syntax highlighting?!");
582 m_bHighlighting =
true;
586 sal_uInt16 nCur = o3tl::narrowing<sal_uInt16>(aSel.
GetStart().
GetPara());
591 if(!m_aSyntaxLineTable.empty())
592 for(sal_uInt16
i = 0;
i < 80 && nCount < 40;
i++, nCur++)
594 if(m_aSyntaxLineTable.find(nCur) != m_aSyntaxLineTable.end())
596 DoSyntaxHighlight( nCur );
597 m_aSyntaxLineTable.erase( nCur );
599 if(m_aSyntaxLineTable.empty())
611 sal_uInt16 nLine = *m_aSyntaxLineTable.begin();
612 DoSyntaxHighlight( nLine );
613 m_aSyntaxLineTable.erase(nLine);
621 if(!m_aSyntaxLineTable.empty() && !pIdle->IsActive())
626 m_nCurTextWidth = m_pTextEngine->CalcTextWidth() + 25;
627 if ( m_nCurTextWidth != nPrevTextWidth )
628 SetScrollBarRanges();
629 m_bHighlighting =
false;
662 size_t nCount = aPortionList.size();
667 if ( rLast.nStart > rLast.nEnd )
670 aPortionList.pop_back();
679 sal_uInt16 nLastEnd = 0;
681 for (
size_t i = 0;
i < nCount;
i++ )
684 if ( r.nStart > r.nEnd )
687 if ( r.nStart > nLastEnd )
694 if ( (
i == (nCount-1) ) && ( r.nEnd < rSource.getLength() ) )
695 r.nEnd = rSource.getLength();
701 if ( r.nStart > r.nEnd )
708 Color aColor(
SW_MOD()->GetColorConfig().GetColorValue(r.eType).nColor);
719 switch (pTextHint->GetId())
721 case SfxHintId::TextViewScrolled:
726 case SfxHintId::TextHeightChanged:
733 case SfxHintId::TextParaInserted:
734 case SfxHintId::TextParaContentChanged:
748 Window::Invalidate();
755 case CommandEventId::Wheel:
756 case CommandEventId::StartAutoScroll:
757 case CommandEventId::AutoScroll:
760 if( !pWData || CommandWheelMode::ZOOM != pWData->
GetMode() )
765 Window::Command(rCEvt);
785 case RTL_TEXTENCODING_UTF7 :
786 case RTL_TEXTENCODING_UTF8 :
790 case RTL_TEXTENCODING_ISO_8859_3:
791 case RTL_TEXTENCODING_ISO_8859_1 :
792 case RTL_TEXTENCODING_MS_1252 :
793 case RTL_TEXTENCODING_APPLE_ROMAN :
794 case RTL_TEXTENCODING_IBM_850 :
795 case RTL_TEXTENCODING_ISO_8859_14 :
796 case RTL_TEXTENCODING_ISO_8859_15 :
804 case RTL_TEXTENCODING_IBM_865 :
812 case RTL_TEXTENCODING_ISO_8859_10 :
813 case RTL_TEXTENCODING_ISO_8859_13 :
814 case RTL_TEXTENCODING_ISO_8859_2 :
815 case RTL_TEXTENCODING_IBM_852 :
816 case RTL_TEXTENCODING_MS_1250 :
817 case RTL_TEXTENCODING_APPLE_CENTEURO :
824 case RTL_TEXTENCODING_ISO_8859_4 :
825 case RTL_TEXTENCODING_IBM_775 :
826 case RTL_TEXTENCODING_MS_1257 :
833 case RTL_TEXTENCODING_APPLE_FARSI : aLanguages[0] =
LANGUAGE_FARSI;
break;
836 case RTL_TEXTENCODING_IBM_861 :
837 case RTL_TEXTENCODING_APPLE_ICELAND :
843 case RTL_TEXTENCODING_IBM_437 :
846 case RTL_TEXTENCODING_IBM_862 :
847 case RTL_TEXTENCODING_MS_1255 :
848 case RTL_TEXTENCODING_APPLE_HEBREW :
849 case RTL_TEXTENCODING_ISO_8859_8 :
853 case RTL_TEXTENCODING_IBM_857 :
854 case RTL_TEXTENCODING_MS_1254 :
855 case RTL_TEXTENCODING_APPLE_TURKISH:
856 case RTL_TEXTENCODING_ISO_8859_9 :
860 case RTL_TEXTENCODING_IBM_860 :
864 case RTL_TEXTENCODING_IBM_869 :
865 case RTL_TEXTENCODING_MS_1253 :
866 case RTL_TEXTENCODING_APPLE_GREEK :
867 case RTL_TEXTENCODING_ISO_8859_7 :
868 case RTL_TEXTENCODING_IBM_737 :
872 case RTL_TEXTENCODING_KOI8_R :
873 case RTL_TEXTENCODING_ISO_8859_5 :
874 case RTL_TEXTENCODING_IBM_855 :
875 case RTL_TEXTENCODING_MS_1251 :
876 case RTL_TEXTENCODING_IBM_866 :
877 case RTL_TEXTENCODING_APPLE_CYRILLIC :
881 case RTL_TEXTENCODING_APPLE_UKRAINIAN:
882 case RTL_TEXTENCODING_KOI8_U:
886 case RTL_TEXTENCODING_IBM_864 :
887 case RTL_TEXTENCODING_MS_1256 :
888 case RTL_TEXTENCODING_ISO_8859_6 :
889 case RTL_TEXTENCODING_APPLE_ARABIC :
893 case RTL_TEXTENCODING_APPLE_CHINTRAD :
894 case RTL_TEXTENCODING_MS_950 :
895 case RTL_TEXTENCODING_GBT_12345 :
896 case RTL_TEXTENCODING_BIG5 :
897 case RTL_TEXTENCODING_EUC_TW :
898 case RTL_TEXTENCODING_BIG5_HKSCS :
902 case RTL_TEXTENCODING_EUC_JP :
903 case RTL_TEXTENCODING_ISO_2022_JP :
904 case RTL_TEXTENCODING_JIS_X_0201 :
905 case RTL_TEXTENCODING_JIS_X_0208 :
906 case RTL_TEXTENCODING_JIS_X_0212 :
907 case RTL_TEXTENCODING_APPLE_JAPANESE :
908 case RTL_TEXTENCODING_MS_932 :
909 case RTL_TEXTENCODING_SHIFT_JIS :
913 case RTL_TEXTENCODING_GB_2312 :
914 case RTL_TEXTENCODING_MS_936 :
915 case RTL_TEXTENCODING_GBK :
916 case RTL_TEXTENCODING_GB_18030 :
917 case RTL_TEXTENCODING_APPLE_CHINSIMP :
918 case RTL_TEXTENCODING_EUC_CN :
919 case RTL_TEXTENCODING_ISO_2022_CN :
923 case RTL_TEXTENCODING_APPLE_KOREAN :
924 case RTL_TEXTENCODING_MS_949 :
925 case RTL_TEXTENCODING_EUC_KR :
926 case RTL_TEXTENCODING_ISO_2022_KR :
927 case RTL_TEXTENCODING_MS_1361 :
931 case RTL_TEXTENCODING_APPLE_THAI :
932 case RTL_TEXTENCODING_MS_874 :
933 case RTL_TEXTENCODING_TIS_620 :
944 value_or(OUString()));
945 if(sFontName.isEmpty())
css::uno::Reference< css::linguistic2::XProofreadingIterator > get(css::uno::Reference< css::uno::XComponentContext > const &context)
SfxViewFrame * GetViewFrame() const
#define LINK(Instance, Class, Member)
tools::Long GetTextHeight() const
virtual void EnableRTL(bool bEnable=true) override
void SetFillColor(const Color &)
static vcl::Font GetDefaultFont(DefaultFontType nType, LanguageType eLang, GetDefaultFontFlags nFlags, const OutputDevice *pOutDev=nullptr)
TextEngine * GetTextEngine()
const vcl::Font & GetFont() const
std::vector< TextPortion > TextPortions
virtual void SetModified(bool=true) override
void SetFontSize(const Size &)
SwSrcEditWindow & m_Editor
virtual void Command(const CommandEvent &rCEvt) override
const OUString & GetFamilyName() const
#define LANGUAGE_ARABIC_SAUDI_ARABIA
void MouseButtonUp(const MouseEvent &rMouseEvent)
void SetFont(const vcl::Font &rFont)
#define LANGUAGE_ICELANDIC
friend class ChangesListener
void MouseMove(const MouseEvent &rMouseEvent)
const LanguageTag & GetUILanguageTag() const
virtual void KeyInput(const KeyEvent &rKeyEvt) override
void HandleWheelCommand(const CommandEvent &rCEvt)
#define MAX_HIGHLIGHTTIME
LanguageType getLanguageType(bool bResolveSystem=true) const
sal_Int32 GetValue() const
virtual void MouseMove(const MouseEvent &rMEvt) override
#define LANGUAGE_LITHUANIAN
const StyleSettings & GetStyleSettings() const
static const AllSettings & GetSettings()
Any GetTime(const OUString &val)
VclPtr< ScrollBar > m_pVScrollbar
sal_uInt16 GetGroup() const
sal_uInt16 GetCode() const
#define LANGUAGE_UKRAINIAN
DataChangedEventType GetType() const
void SetHelpId(const OString &)
const CommandWheelData * GetWheelData() const
rtl::Reference< ChangesListener > m_xListener
void Invalidate(sal_uInt16 nId)
virtual void dispose() override
virtual void DataChanged(const DataChangedEvent &) override
#define LANGUAGE_FRENCH_CANADIAN
static bool lcl_GetLanguagesForEncoding(rtl_TextEncoding eEnc, LanguageType aLanguages[])
bool HandleScrollCommand(const CommandEvent &rCmd, ScrollBar *pHScrl, ScrollBar *pVScrl)
void ExecutePopup(const OUString &rResName, vcl::Window *pWin=nullptr, const Point *pPos=nullptr)
VclPtr< ScrollBar > m_pHScrollbar
static void lcl_Highlight(const OUString &rSource, TextPortions &aPortionList)
#define LANGUAGE_HUNGARIAN
constexpr tools::Long Width() const
virtual void MouseButtonDown(const MouseEvent &rMEvt) override
#define LANGUAGE_PORTUGUESE
virtual void MouseButtonUp(const MouseEvent &rMEvt) override
virtual void SAL_CALL propertiesChange(css::uno::Sequence< css::beans::PropertyChangeEvent > const &) override
std::unique_ptr< ExtTextEngine > m_pTextEngine
static bool DoesKeyChangeText(const KeyEvent &rKeyEvent)
VclPtr< TextViewOutWin > m_pOutWin
AllSettingsFlags GetFlags() const
static SfxViewShell * Current()
void SetTextEncoding(rtl_TextEncoding eEncoding)
FontMetric Get(const OUString &rName, const OUString &rStyleName) const
void DoSyntaxHighlight(sal_uInt16 nPara)
virtual void SetOutputSizePixel(const Size &rNewSize)
constexpr sal_uInt16 KEYGROUP_CURSOR
virtual void Invalidate(InvalidateFlags nFlags=InvalidateFlags::NONE) override
#define LANGUAGE_ROMANIAN
constexpr OStringLiteral HID_SOURCE_EDITWIN
#define LANGUAGE_NORWEGIAN
#define LANGUAGE_CROATIAN
virtual void Notify(SfxBroadcaster &rBC, const SfxHint &rHint) override
void ShowCursor(bool bGotoCursor=true, bool bForceVisCursor=true)
TextEngine * GetTextEngine() const
const SfxPoolItem * GetItem(sal_uInt16 nSlotId) const
virtual void Resize() override
bool KeyInput(const KeyEvent &rKeyEvent)
void ImpDoHighlight(const OUString &rSource, sal_uInt16 nLineOff)
sal_Int32 GetScrollBarSize() const
void SetAutoScroll(bool bAutoScroll)
Point LogicToPixel(const Point &rLogicPt) const
virtual void SAL_CALL disposing(css::lang::EventObject const &) override
SfxBindings & GetBindings()
CommandWheelMode GetMode() const
virtual void Invalidate(InvalidateFlags nFlags=InvalidateFlags::NONE)
const AllSettings & GetSettings() const
CommandEventId GetCommand() const
#define LANGUAGE_ESTONIAN
virtual void DataChanged(const DataChangedEvent &) override
virtual void Command(const CommandEvent &rCEvt) override
const TextPaM & GetStart() const
const Size & GetFontSize() const
#define LANGUAGE_CHINESE_SIMPLIFIED
void StartListening(SfxBroadcaster &rBroadcaster, DuplicateHandling eDuplicateHanding=DuplicateHandling::Unexpected)
vcl::Window * GetParent() const
IMPL_LINK(SwSrcEditWindow, ScrollHdl, ScrollBar *, pScroll, void)
void MouseButtonDown(const MouseEvent &rMouseEvent)
virtual void SetPosSizePixel(const Point &rNewPos, const Size &rNewSize)
void SetScrollBarRanges()
virtual void Paint(vcl::RenderContext &rRenderContext, const tools::Rectangle &) override
css::uno::Reference< css::beans::XMultiPropertySet > m_xNotifier
void SetPointFont(vcl::RenderContext &rRenderContext, const vcl::Font &rFont)
void Update(sal_uInt16 nId)
rtl_TextEncoding m_eSourceEncoding
void Paint(vcl::RenderContext &rRenderContext, const tools::Rectangle &rRect)
void SetPointer(PointerStyle)
const vcl::KeyCode & GetKeyCode() const
void SetTextView(TextView *pView)
#define SAL_WARN_IF(condition, area, stream)
constexpr tools::Long Height() const
std::set< sal_uInt16 > m_aSyntaxLineTable
void SetTransparent(bool bTransparent)
virtual ~SwSrcEditWindow() override
#define MAX_SYNTAX_HIGHLIGHT
::OutputDevice const * GetOutDev() const
tools::Long AdjustWidth(tools::Long n)
std::unique_ptr< TextView > m_pTextView
static VclPtr< reference_type > Create(Arg &&...arg)
void EndListening(SfxBroadcaster &rBroadcaster, bool bRemoveAllDuplicates=false)
virtual void GetFocus() override
void SetInvokeHandler(const Link< Timer *, void > &rLink)
virtual ~ChangesListener() override
const Color & GetWindowColor() const
const vcl::Font & GetFont() const
tools::Long AdjustHeight(tools::Long n)
ChangesListener(SwSrcEditWindow &editor)
Size GetOutputSizePixel() const
void setHeight(tools::Long nHeight)
virtual void Start(bool bStartTimer=true) override
tools::Long GetTextWidth(const OUString &rStr, sal_Int32 nIndex=0, sal_Int32 nLen=-1, vcl::text::TextLayoutCache const *=nullptr, SalLayoutGlyphs const *const pLayoutCache=nullptr) const
#define SAL_WARN(area, stream)
#define LANGUAGE_CHINESE_TRADITIONAL
void SetFont(const vcl::Font &rNewFont)
tools::Long m_nCurTextWidth
SwSrcEditWindow(vcl::Window *pParent, SwSrcView *pParentView)
const FontList * GetFontList() const
constexpr sal_uInt16 KEY_INSERT
#define LANGUAGE_JAPANESE
virtual void dispose() override
WinBits const WB_CLIPCHILDREN
void Command(const CommandEvent &rCEvt)
sal_uInt32 GetPara() const
bool m_bDetectedRangeSegmentation false
void Show(bool bVisible=true, ShowFlags nFlags=ShowFlags::NONE)
SwDocShell * GetDocShell()