summaryrefslogtreecommitdiffstats
path: root/basctl/source/basicide/baside2.hxx
diff options
context:
space:
mode:
Diffstat (limited to 'basctl/source/basicide/baside2.hxx')
-rw-r--r--basctl/source/basicide/baside2.hxx526
1 files changed, 526 insertions, 0 deletions
diff --git a/basctl/source/basicide/baside2.hxx b/basctl/source/basicide/baside2.hxx
new file mode 100644
index 0000000000..116dab2bb9
--- /dev/null
+++ b/basctl/source/basicide/baside2.hxx
@@ -0,0 +1,526 @@
+/* -*- 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 .
+ */
+
+#pragma once
+
+#include <memory>
+#include <mutex>
+#include <layout.hxx>
+#include "breakpoint.hxx"
+#include "linenumberwindow.hxx"
+
+#include <basic/sbmod.hxx>
+#include <basic/sbstar.hxx>
+#include <vcl/InterimItemWindow.hxx>
+#include <vcl/idle.hxx>
+#include <vcl/weld.hxx>
+
+#include <svtools/colorcfg.hxx>
+#include <svtools/scrolladaptor.hxx>
+#include <o3tl/enumarray.hxx>
+#include <rtl/ustrbuf.hxx>
+
+#include <set>
+#include <string_view>
+
+#include <vcl/textdata.hxx>
+#include <basic/codecompletecache.hxx>
+#include <com/sun/star/reflection/XIdlClass.hpp>
+#include <comphelper/syntaxhighlight.hxx>
+
+class ExtTextEngine;
+class TextView;
+class SvxSearchItem;
+namespace com::sun::star::beans { class XMultiPropertySet; }
+
+namespace basctl
+{
+
+class ObjectCatalog;
+class CodeCompleteWindow;
+class ModulWindowLayout;
+
+// #108672 Helper functions to get/set text in TextEngine
+// using the stream interface (get/setText() only supports
+// tools Strings limited to 64K).
+// defined in baside2b.cxx
+OUString getTextEngineText (ExtTextEngine&);
+void setTextEngineText (ExtTextEngine&, std::u16string_view);
+
+class EditorWindow final : public vcl::Window, public SfxListener
+{
+friend class CodeCompleteWindow;
+friend class EditorWindowUIObject;
+private:
+ class ChangesListener;
+
+ std::unique_ptr<TextView> pEditView;
+ std::unique_ptr<ExtTextEngine> pEditEngine;
+ ModulWindow& rModulWindow;
+
+ rtl::Reference< ChangesListener > listener_;
+ std::mutex mutex_;
+ css::uno::Reference< css::beans::XMultiPropertySet >
+ notifier_;
+
+ tools::Long nCurTextWidth;
+
+ ImplSVEvent* m_nSetSourceInBasicId;
+
+ SyntaxHighlighter aHighlighter;
+ Idle aSyntaxIdle;
+ std::set<sal_uInt16> aSyntaxLineTable;
+ DECL_LINK(SyntaxTimerHdl, Timer *, void);
+ DECL_LINK(SetSourceInBasicHdl, void*, void);
+
+ // progress bar
+ class ProgressInfo;
+ std::unique_ptr<ProgressInfo> pProgress;
+
+ virtual void Notify( SfxBroadcaster& rBC, const SfxHint& rHint ) override;
+
+ void ImpDoHighlight( sal_uInt32 nLineOff );
+ void ImplSetFont();
+ sal_uInt16 nCurrentZoomLevel;
+
+ bool bHighlighting;
+ bool bDoSyntaxHighlight;
+ bool bDelayHighlight;
+
+ virtual css::uno::Reference< css::awt::XVclWindowPeer > GetComponentInterface(bool bCreate = true) override;
+ CodeCompleteDataCache aCodeCompleteCache;
+ VclPtr<CodeCompleteWindow> pCodeCompleteWnd;
+ OUString GetActualSubName( sal_uInt32 nLine ); // gets the actual subroutine name according to line number
+ void SetupAndShowCodeCompleteWnd(const std::vector< OUString >& aEntryVect, TextSelection aSel );
+ void HandleAutoCorrect();
+ void HandleAutoCloseParen();
+ void HandleAutoCloseDoubleQuotes();
+ void HandleCodeCompletion();
+ void HandleProcedureCompletion();
+ TextSelection GetLastHighlightPortionTextSelection() const;
+
+ virtual void Paint( vcl::RenderContext& rRenderContext, const tools::Rectangle& ) override;
+ virtual void Resize() override;
+ virtual void KeyInput( const KeyEvent& rKeyEvt ) override;
+ virtual void MouseMove( const MouseEvent& rMEvt ) override;
+ virtual void MouseButtonDown( const MouseEvent& rMEvt ) override;
+ virtual void MouseButtonUp( const MouseEvent& rMEvt ) override;
+ virtual void Command( const CommandEvent& rCEvt ) override;
+ virtual void LoseFocus() override;
+ virtual void RequestHelp( const HelpEvent& rHEvt ) override;
+
+ void DoSyntaxHighlight( sal_uInt32 nPara );
+ OUString GetWordAtCursor();
+ bool ImpCanModify();
+
+public:
+ EditorWindow (vcl::Window* pParent, ModulWindow*);
+ virtual ~EditorWindow() override;
+ virtual void dispose() override;
+
+ ExtTextEngine* GetEditEngine() const { return pEditEngine.get(); }
+ TextView* GetEditView() const { return pEditView.get(); }
+
+ void CreateProgress( const OUString& rText, sal_uInt32 nRange );
+ void DestroyProgress();
+
+ void ParagraphInsertedDeleted( sal_uInt32 nNewPara, bool bInserted );
+ void DoDelayedSyntaxHighlight( sal_uInt32 nPara );
+
+ void CreateEditEngine();
+ void SetScrollBarRanges();
+ void InitScrollBars();
+
+ void ForceSyntaxTimeout();
+ void SetSourceInBasic();
+
+ bool CanModify() { return ImpCanModify(); }
+
+ void ChangeFontColor( Color aColor );
+ void UpdateSyntaxHighlighting ();
+
+ void SetEditorZoomLevel(sal_uInt16 nNewZoomLevel);
+ sal_uInt16 GetCurrentZoom() { return nCurrentZoomLevel; }
+
+ bool GetProcedureName(std::u16string_view rLine, OUString& rProcType, OUString& rProcName) const;
+
+ FactoryFunction GetUITestFactory() const override;
+};
+
+class BreakPointWindow final : public vcl::Window
+{
+ ModulWindow& rModulWindow;
+ tools::Long nCurYOffset;
+ sal_uInt16 nMarkerPos;
+ BreakPointList aBreakPointList;
+ bool bErrorMarker;
+
+ virtual void DataChanged(DataChangedEvent const & rDCEvt) override;
+
+ void setBackgroundColor(Color aColor);
+
+ virtual void Paint(vcl::RenderContext& rRenderContext, const tools::Rectangle&) override;
+ BreakPoint* FindBreakPoint( const Point& rMousePos );
+ void ShowMarker(vcl::RenderContext& rRenderContext);
+ virtual void MouseButtonDown( const MouseEvent& rMEvt ) override;
+ virtual void Command( const CommandEvent& rCEvt ) override;
+
+ bool SyncYOffset();
+
+public:
+ BreakPointWindow (vcl::Window* pParent, ModulWindow*);
+
+ void SetMarkerPos( sal_uInt16 nLine, bool bErrorMarker = false );
+ void SetNoMarker ();
+
+ void DoScroll( tools::Long nVertScroll );
+ tools::Long& GetCurYOffset() { return nCurYOffset; }
+ BreakPointList& GetBreakPoints() { return aBreakPointList; }
+};
+
+class WatchWindow final : public DockingWindow
+{
+private:
+ std::unique_ptr<weld::Container> m_xTitleArea;
+ std::unique_ptr<weld::Label> m_xTitle;
+ std::unique_ptr<weld::Entry> m_xEdit;
+ std::unique_ptr<weld::Button> m_xRemoveWatchButton;
+ std::unique_ptr<weld::TreeView> m_xTreeListBox;
+
+ ImplSVEvent* m_nUpdateWatchesId;
+ OUString aEditingRes;
+
+ virtual void Resize() override;
+ virtual void Paint( vcl::RenderContext& rRenderContext, const tools::Rectangle& rRect ) override;
+
+ SbxBase* ImplGetSBXForEntry(const weld::TreeIter& rEntry, bool& rbArrayElement);
+
+ void implEnableChildren(const weld::TreeIter& rEntry, bool bEnable);
+
+ DECL_STATIC_LINK(WatchWindow, ButtonHdl, weld::Button&, void);
+ DECL_LINK(TreeListHdl, weld::TreeView&, void);
+ DECL_LINK(RequestingChildrenHdl, const weld::TreeIter&, bool);
+ DECL_LINK(ActivateHdl, weld::Entry&, bool);
+ DECL_LINK(KeyInputHdl, const KeyEvent&, bool);
+ DECL_LINK(EditingEntryHdl, const weld::TreeIter&, bool);
+ typedef std::pair<const weld::TreeIter&, OUString> IterString;
+ DECL_LINK(EditedEntryHdl, const IterString&, bool);
+ DECL_LINK(ExecuteUpdateWatches, void*, void);
+
+public:
+ explicit WatchWindow (Layout* pParent);
+ virtual ~WatchWindow() override;
+ virtual void dispose() override;
+
+ void AddWatch( const OUString& rVName );
+ void RemoveSelectedWatch();
+ void UpdateWatches(bool bBasicStopped = false);
+};
+
+class StackWindow : public DockingWindow
+{
+private:
+ std::unique_ptr<weld::Label> m_xTitle;
+ std::unique_ptr<weld::TreeView> m_xTreeListBox;
+
+protected:
+ virtual void Resize() override;
+ virtual void Paint( vcl::RenderContext& rRenderContext, const tools::Rectangle& rRect ) override;
+
+public:
+ explicit StackWindow (Layout* pParent);
+ virtual ~StackWindow() override;
+ virtual void dispose() override;
+
+ void UpdateCalls();
+};
+
+
+class ComplexEditorWindow final : public vcl::Window
+{
+private:
+ VclPtr<BreakPointWindow> aBrkWindow;
+ VclPtr<LineNumberWindow> aLineNumberWindow;
+ VclPtr<EditorWindow> aEdtWindow;
+ VclPtr<ScrollAdaptor> aEWVScrollBar;
+ VclPtr<ScrollAdaptor> aEWHScrollBar;
+
+ virtual void DataChanged(DataChangedEvent const & rDCEvt) override;
+
+ virtual void Resize() override;
+ DECL_LINK(ScrollHdl, weld::Scrollbar&, void);
+
+public:
+ explicit ComplexEditorWindow( ModulWindow* pParent );
+ virtual ~ComplexEditorWindow() override;
+ virtual void dispose() override;
+ BreakPointWindow& GetBrkWindow() { return *aBrkWindow; }
+ LineNumberWindow& GetLineNumberWindow() { return *aLineNumberWindow; }
+ EditorWindow& GetEdtWindow() { return *aEdtWindow; }
+ ScrollAdaptor& GetEWVScrollBar() { return *aEWVScrollBar; }
+ ScrollAdaptor& GetEWHScrollBar() { return *aEWHScrollBar; }
+
+ void SetLineNumberDisplay(bool b);
+};
+
+
+class ModulWindow: public BaseWindow
+{
+private:
+ ModulWindowLayout& m_rLayout;
+ StarBASICRef m_xBasic;
+ short m_nValid;
+ VclPtr<ComplexEditorWindow> m_aXEditorWindow;
+ BasicStatus m_aStatus;
+ SbModuleRef m_xModule;
+ OUString m_aModule;
+
+ void CheckCompileBasic();
+ void BasicExecute();
+
+ sal_Int32 FormatAndPrint( Printer* pPrinter, sal_Int32 nPage );
+ SbModuleRef const & XModule();
+protected:
+ virtual void Resize() override;
+ virtual void GetFocus() override;
+ virtual void Paint( vcl::RenderContext& rRenderContext, const tools::Rectangle& ) override;
+ virtual void DoInit() override;
+ virtual void DoScroll(Scrollable* pCurScrollBar) override;
+
+public:
+ ModulWindow( ModulWindowLayout* pParent, const ScriptDocument& rDocument, const OUString& aLibName, const OUString& aName, OUString aModule );
+
+ virtual ~ModulWindow() override;
+ virtual void dispose() override;
+
+ virtual void ExecuteCommand (SfxRequest& rReq) override;
+ virtual void ExecuteGlobal (SfxRequest& rReq) override;
+ virtual void GetState( SfxItemSet& ) override;
+ virtual void StoreData() override;
+ virtual void UpdateData() override;
+ // return number of pages to be printed
+ virtual sal_Int32 countPages( Printer* pPrinter ) override;
+ // print page
+ virtual void printPage( sal_Int32 nPage, Printer* pPrinter ) override;
+ virtual OUString GetTitle() override;
+ virtual EntryDescriptor CreateEntryDescriptor() override;
+ virtual bool AllowUndo() override;
+ virtual void SetReadOnly (bool bReadOnly) override;
+ virtual bool IsReadOnly() override;
+
+ StarBASIC* GetBasic() { XModule(); return m_xBasic.get(); }
+
+ SbModule* GetSbModule() { return m_xModule.get(); }
+ void SetSbModule( SbModule* pModule ) { m_xModule = pModule; }
+ OUString GetSbModuleName();
+
+ void CompileBasic();
+ void BasicRun();
+ void BasicStepOver();
+ void BasicStepInto();
+ void BasicStepOut();
+ void BasicStop();
+ void BasicToggleBreakPoint();
+ void BasicToggleBreakPointEnabled();
+ void ManageBreakPoints();
+ void UpdateBreakPoint( const BreakPoint& rBrk );
+ void BasicAddWatch();
+
+ void BasicErrorHdl( StarBASIC const * pBasic );
+ BasicDebugFlags BasicBreakHdl();
+ void AssertValidEditEngine();
+
+ void LoadBasic();
+ void SaveBasicSource();
+ void ImportDialog();
+
+ void EditMacro( const OUString& rMacroName );
+
+ void ToggleBreakPoint( sal_uInt16 nLine );
+
+ BasicStatus& GetBasicStatus() { return m_aStatus; }
+
+ virtual bool IsModified () override;
+ bool IsPasteAllowed ();
+
+ void ShowCursor( bool bOn );
+
+ virtual SearchOptionFlags GetSearchOptions() override;
+ virtual sal_uInt16 StartSearchAndReplace (SvxSearchItem const&, bool bFromStart = false) override;
+
+ EditorWindow& GetEditorWindow() { return m_aXEditorWindow->GetEdtWindow(); }
+ BreakPointWindow& GetBreakPointWindow() { return m_aXEditorWindow->GetBrkWindow(); }
+ LineNumberWindow& GetLineNumberWindow() { return m_aXEditorWindow->GetLineNumberWindow(); }
+ ScrollAdaptor& GetEditVScrollBar() { return m_aXEditorWindow->GetEWVScrollBar(); }
+ ScrollAdaptor& GetEditHScrollBar() { return m_aXEditorWindow->GetEWHScrollBar(); }
+ ExtTextEngine* GetEditEngine() { return GetEditorWindow().GetEditEngine(); }
+ TextView* GetEditView() { return GetEditorWindow().GetEditView(); }
+ BreakPointList& GetBreakPoints() { return GetBreakPointWindow().GetBreakPoints(); }
+ ModulWindowLayout& GetLayout () { return m_rLayout; }
+
+ virtual void BasicStarted() override;
+ virtual void BasicStopped() override;
+
+ virtual SfxUndoManager*
+ GetUndoManager() override;
+
+ const OUString& GetModule() const { return m_aModule; }
+ void SetModule( const OUString& aModule ) { m_aModule = aModule; }
+
+ virtual void Activating () override;
+ virtual void Deactivating () override;
+
+ virtual void OnNewDocument () override;
+ virtual OUString GetHid () const override;
+ virtual ItemType GetType () const override;
+ virtual bool HasActiveEditor () const override;
+
+ void UpdateModule ();
+};
+
+class ModulWindowLayout: public Layout
+{
+public:
+ ModulWindowLayout (vcl::Window* pParent, ObjectCatalog&);
+ virtual ~ModulWindowLayout() override;
+ virtual void dispose() override;
+public:
+ // Layout:
+ virtual void Activating (BaseWindow&) override;
+ virtual void Deactivating () override;
+ virtual void GetState (SfxItemSet&, unsigned nWhich) override;
+ virtual void UpdateDebug (bool bBasicStopped) override;
+public:
+ void BasicAddWatch (OUString const&);
+ void BasicRemoveWatch ();
+ void ShowWatchWindow(bool bVisible);
+ void ShowStackWindow(bool bVisible);
+ bool IsWatchWindowVisible() { return aWatchWindow->IsVisible(); }
+ bool IsStackWindowVisible() { return aStackWindow->IsVisible(); }
+ Color const & GetSyntaxBackgroundColor () const { return aSyntaxColors.GetBackgroundColor(); }
+ Color const & GetFontColor () const { return aSyntaxColors.GetFontColor(); }
+ Color const & GetSyntaxColor (TokenType eType) const { return aSyntaxColors.GetColor(eType); }
+
+protected:
+ // Window:
+ virtual void Paint (vcl::RenderContext& rRenderContext, const tools::Rectangle& rRect) override;
+ // Layout:
+ virtual void OnFirstSize (tools::Long nWidth, tools::Long nHeight) override;
+
+private:
+ // main child window
+ VclPtr<ModulWindow> pChild;
+ // dockable windows
+ VclPtr<WatchWindow> aWatchWindow;
+ VclPtr<StackWindow> aStackWindow;
+ ObjectCatalog& rObjectCatalog;
+
+ // SyntaxColors -- stores Basic syntax highlighting colors
+ class SyntaxColors : public utl::ConfigurationListener
+ {
+ public:
+ SyntaxColors ();
+ virtual ~SyntaxColors () override;
+ public:
+ void SetActiveEditor (EditorWindow* pEditor_) { pEditor = pEditor_; }
+ public:
+ Color const & GetBackgroundColor () const { return m_aBackgroundColor; };
+ Color const & GetFontColor () const { return m_aFontColor; }
+ Color const & GetColor(TokenType eType) const { return aColors[eType]; }
+
+ private:
+ virtual void ConfigurationChanged (utl::ConfigurationBroadcaster*, ConfigurationHints) override;
+ void NewConfig (bool bFirst);
+
+ private:
+ Color m_aBackgroundColor;
+ Color m_aFontColor;
+ // the color values (the indexes are TokenType, see comphelper/syntaxhighlight.hxx)
+ o3tl::enumarray<TokenType, Color> aColors;
+ // the configuration
+ svtools::ColorConfig aConfig;
+ // the active editor
+ VclPtr<EditorWindow> pEditor;
+
+ } aSyntaxColors;
+};
+
+class CodeCompleteWindow final : public InterimItemWindow
+{
+private:
+ VclPtr<EditorWindow> pParent; // parent window
+ TextSelection m_aTextSelection;
+ std::unique_ptr<weld::TreeView> m_xListBox;
+
+ /* a buffer to build up function name when typing
+ * a function name, used for showing/hiding listbox values
+ * */
+ OUStringBuffer aFuncBuffer;
+
+ void InsertSelectedEntry(); // insert the selected entry
+ void SetMatchingEntries(); // sets the visible entries based on aFuncBuffer variable
+ TextView* GetParentEditView();
+
+ DECL_LINK(ImplDoubleClickHdl, weld::TreeView&, bool);
+ DECL_LINK(ImplSelectHdl, weld::TreeView&, void);
+ DECL_LINK(KeyInputHdl, const KeyEvent&, bool);
+
+public:
+ explicit CodeCompleteWindow( EditorWindow* pPar );
+ virtual ~CodeCompleteWindow() override;
+ virtual void dispose() override;
+
+ void InsertEntry( const OUString& aStr );
+ void ClearListBox();
+ void SetTextSelection( const TextSelection& aSel );
+ const TextSelection& GetTextSelection() const { return m_aTextSelection;}
+ void ResizeAndPositionListBox();
+ void SelectFirstEntry(); //selects first entry in ListBox
+
+ /*
+ * clears if typed anything, then hides
+ * the window, clear internal variables
+ * */
+ void ClearAndHide();
+ void HideAndRestoreFocus();
+
+ bool HandleKeyInput(const KeyEvent& rKeyEvt);
+};
+
+class UnoTypeCodeCompletetor
+{
+private:
+ css::uno::Reference< css::reflection::XIdlClass > xClass;
+ bool bCanComplete;
+
+ bool CheckField( const OUString& sFieldName );
+ bool CheckMethod( const OUString& sMethName );
+
+public:
+ UnoTypeCodeCompletetor( const std::vector< OUString >& aVect, const OUString& sVarType );
+
+ std::vector< OUString > GetXIdlClassMethods() const;
+ std::vector< OUString > GetXIdlClassFields() const;
+
+ bool CanCodeComplete() const { return bCanComplete;}
+};
+
+} // namespace basctl
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */