|  | /************************************************************** | 
|  | * | 
|  | * 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 | 
|  | * | 
|  | * Unless required by applicable law or agreed to in writing, | 
|  | * software distributed under the License is distributed on an | 
|  | * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | 
|  | * KIND, either express or implied.  See the License for the | 
|  | * specific language governing permissions and limitations | 
|  | * under the License. | 
|  | * | 
|  | *************************************************************/ | 
|  |  | 
|  |  | 
|  |  | 
|  | #ifndef _BASIDE2_HXX | 
|  | #define _BASIDE2_HXX | 
|  |  | 
|  | #include <svheader.hxx> | 
|  |  | 
|  | #include <bastypes.hxx> | 
|  | #include <bastype3.hxx> | 
|  | #include <basidesh.hxx> | 
|  |  | 
|  | class ExtTextEngine; | 
|  | class ExtTextView; | 
|  | class SvxSearchItem; | 
|  | #include <svtools/svtabbx.hxx> | 
|  | #include <svtools/headbar.hxx> | 
|  |  | 
|  | #ifndef _SV_BUTTON_HXX //autogen | 
|  | #include <vcl/button.hxx> | 
|  | #endif | 
|  | #include <basic/sbmod.hxx> | 
|  | #include <vcl/split.hxx> | 
|  | #include "svl/lstner.hxx" | 
|  | #include <svtools/colorcfg.hxx> | 
|  |  | 
|  | #include <sfx2/progress.hxx> | 
|  | #include <svtools/syntaxhighlight.hxx> | 
|  |  | 
|  | DBG_NAMEEX( ModulWindow ) | 
|  |  | 
|  | #define MARKER_NOMARKER	0xFFFF | 
|  |  | 
|  | namespace utl | 
|  | { | 
|  | class SourceViewConfig; | 
|  | } | 
|  |  | 
|  | // #108672 Helper functions to get/set text in TextEngine | 
|  | // using the stream interface (get/setText() only supports | 
|  | // tools Strings limited to 64K). | 
|  | ::rtl::OUString getTextEngineText( ExtTextEngine* pEngine ); | 
|  | void setTextEngineText( ExtTextEngine* pEngine, const ::rtl::OUString aStr ); | 
|  |  | 
|  | class ProgressInfo : public SfxProgress | 
|  | { | 
|  | private: | 
|  | sal_uLong					nCurState; | 
|  |  | 
|  | public: | 
|  |  | 
|  | inline			ProgressInfo( SfxObjectShell* pObjSh, const String& rText, sal_uLong nRange ); | 
|  |  | 
|  | //	inline void		StartProgress( const String& rName, sal_uLong nStates ); | 
|  | //	inline void		EndProgress(); | 
|  | inline void		StepProgress(); | 
|  | }; | 
|  |  | 
|  | inline ProgressInfo::ProgressInfo( SfxObjectShell* pObjSh, const String& rText, sal_uLong nRange ) | 
|  | : SfxProgress( pObjSh, rText, nRange ) | 
|  | { | 
|  | nCurState = 0; | 
|  | } | 
|  |  | 
|  | // inline void ProgressInfo::StartProgress( const String& rName, sal_uLong nStates ) | 
|  | // { | 
|  | // 	nCurState = 0; | 
|  | // 	if ( pStbMgr ) | 
|  | // 		pStbMgr->StartProgressMode( rName, nStates ); | 
|  | // } | 
|  |  | 
|  | // inline void ProgressInfo::EndProgress() | 
|  | // { | 
|  | // 	if ( pStbMgr ) | 
|  | // 		pStbMgr->EndProgressMode(); | 
|  | //} | 
|  |  | 
|  | inline void ProgressInfo::StepProgress() | 
|  | { | 
|  | SetState( ++nCurState ); | 
|  | } | 
|  |  | 
|  |  | 
|  | namespace svt { | 
|  | class SourceViewConfig; | 
|  | } | 
|  |  | 
|  | class EditorWindow : public Window, public SfxListener, public utl::ConfigurationListener | 
|  | { | 
|  | private: | 
|  | ExtTextView*	pEditView; | 
|  | ExtTextEngine*	pEditEngine; | 
|  |  | 
|  | utl::SourceViewConfig* pSourceViewConfig; | 
|  |  | 
|  | long			nCurTextWidth; | 
|  |  | 
|  | SyntaxHighlighter	aHighlighter; | 
|  | Timer			aSyntaxIdleTimer; | 
|  | Table			aSyntaxLineTable; | 
|  | DECL_LINK( SyntaxTimerHdl, Timer * ); | 
|  | ProgressInfo*	pProgress; | 
|  | ModulWindow*	pModulWindow; | 
|  |  | 
|  | virtual void DataChanged(DataChangedEvent const & rDCEvt); | 
|  |  | 
|  | using			Window::Notify; | 
|  | virtual void	Notify( SfxBroadcaster& rBC, const SfxHint& rHint ); | 
|  |  | 
|  | void			ImpDoHighlight( sal_uLong nLineOff ); | 
|  | void            ImplSetFont(); | 
|  |  | 
|  | sal_Bool			bHighlightning; | 
|  | sal_Bool			bDoSyntaxHighlight; | 
|  | sal_Bool			bDelayHighlight; | 
|  |  | 
|  | virtual | 
|  | ::com::sun::star::uno::Reference< ::com::sun::star::awt::XWindowPeer > | 
|  | GetComponentInterface(sal_Bool bCreate = sal_True); | 
|  |  | 
|  | protected: | 
|  | virtual void	Paint( const Rectangle& ); | 
|  | virtual void	Resize(); | 
|  | virtual void	KeyInput( const KeyEvent& rKeyEvt ); | 
|  | virtual void	MouseMove( const MouseEvent& rMEvt ); | 
|  | virtual void	MouseButtonDown( const MouseEvent& rMEvt ); | 
|  | virtual void	MouseButtonUp( const MouseEvent& rMEvt ); | 
|  | virtual void	Command( const CommandEvent& rCEvt ); | 
|  | virtual void	LoseFocus(); | 
|  | virtual void	RequestHelp( const HelpEvent& rHEvt ); | 
|  | virtual void    ConfigurationChanged( utl::ConfigurationBroadcaster*, sal_uInt32 ); | 
|  |  | 
|  | void			DoSyntaxHighlight( sal_uLong nPara ); | 
|  | String			GetWordAtCursor(); | 
|  | sal_Bool			ImpCanModify(); | 
|  |  | 
|  | public: | 
|  | EditorWindow( Window* pParent ); | 
|  | ~EditorWindow(); | 
|  |  | 
|  | ExtTextEngine*	GetEditEngine()	const	{ return (ExtTextEngine*)pEditEngine; } | 
|  | ExtTextView*	GetEditView() const		{ return pEditView; } | 
|  | ProgressInfo*	GetProgress() const		{ return pProgress; } | 
|  |  | 
|  | void			CreateProgress( const String& rText, sal_uLong nRange ); | 
|  | void			DestroyProgress(); | 
|  |  | 
|  | void			ParagraphInsertedDeleted( sal_uLong nNewPara, sal_Bool bInserted ); | 
|  | void			DoDelayedSyntaxHighlight( sal_uLong nPara ); | 
|  |  | 
|  | void			CreateEditEngine(); | 
|  | void			SetScrollBarRanges(); | 
|  | void			InitScrollBars(); | 
|  | void			SetModulWindow( ModulWindow* pWin ) | 
|  | { pModulWindow = pWin; } | 
|  |  | 
|  | void			ForceSyntaxTimeout(); | 
|  | sal_Bool			SetSourceInBasic( sal_Bool bQuiet = sal_True ); | 
|  |  | 
|  | sal_Bool			CanModify() { return ImpCanModify(); } | 
|  | }; | 
|  |  | 
|  |  | 
|  | class BreakPointWindow : public Window | 
|  | { | 
|  | private: | 
|  | long			nCurYOffset; | 
|  | sal_uInt16			nMarkerPos; | 
|  | BreakPointList	aBreakPointList; | 
|  | ModulWindow*	pModulWindow; | 
|  | sal_Bool			bErrorMarker; | 
|  | bool m_bHighContrastMode; | 
|  |  | 
|  | virtual void DataChanged(DataChangedEvent const & rDCEvt); | 
|  |  | 
|  | void setBackgroundColor(Color aColor); | 
|  |  | 
|  | protected: | 
|  | virtual void	Paint( const Rectangle& ); | 
|  | virtual void	Resize(); | 
|  | BreakPoint* 	FindBreakPoint( const Point& rMousePos ); | 
|  | void			ShowMarker( sal_Bool bShow ); | 
|  | virtual void	MouseButtonDown( const MouseEvent& rMEvt ); | 
|  | virtual void	Command( const CommandEvent& rCEvt ); | 
|  |  | 
|  | sal_Bool			SyncYOffset(); | 
|  |  | 
|  | public: | 
|  | BreakPointWindow( Window* pParent ); | 
|  | ~BreakPointWindow(); | 
|  |  | 
|  | void			SetModulWindow( ModulWindow* pWin ) | 
|  | { pModulWindow = pWin; } | 
|  |  | 
|  | void			SetMarkerPos( sal_uInt16 nLine, sal_Bool bErrorMarker = sal_False ); | 
|  |  | 
|  | void			DoScroll( long nHorzScroll, long nVertScroll ); | 
|  | long&			GetCurYOffset() 		{ return nCurYOffset; } | 
|  | BreakPointList&	GetBreakPoints()		{ return aBreakPointList; } | 
|  | }; | 
|  |  | 
|  |  | 
|  | class WatchTreeListBox : public SvHeaderTabListBox | 
|  | { | 
|  | String aEditingRes; | 
|  |  | 
|  | protected: | 
|  | virtual sal_Bool	EditingEntry( SvLBoxEntry* pEntry, Selection& rSel  ); | 
|  | virtual sal_Bool	EditedEntry( SvLBoxEntry* pEntry, const String& rNewText ); | 
|  |  | 
|  | sal_Bool 			ImplBasicEntryEdited( SvLBoxEntry* pEntry, const String& rResult ); | 
|  | SbxBase*		ImplGetSBXForEntry( SvLBoxEntry* pEntry, bool& rbArrayElement ); | 
|  |  | 
|  | //	virtual DragDropMode	NotifyBeginDrag( SvLBoxEntry* ); | 
|  | //	virtual sal_Bool	NotifyQueryDrop( SvLBoxEntry* ); | 
|  |  | 
|  | //	virtual sal_Bool	NotifyMoving( SvLBoxEntry* pTarget, SvLBoxEntry* pEntry, | 
|  | //						SvLBoxEntry*& rpNewParent, sal_uLong& rNewChildPos ); | 
|  | //	virtual sal_Bool	NotifyCopying( SvLBoxEntry* pTarget, SvLBoxEntry* pEntry, | 
|  | //						SvLBoxEntry*& rpNewParent, sal_uLong& rNewChildPos ); | 
|  | //	sal_Bool			NotifyCopyingMoving( SvLBoxEntry* pTarget, SvLBoxEntry* pEntry, | 
|  | //						SvLBoxEntry*& rpNewParent, sal_uLong& rNewChildPos, sal_Bool bMove ); | 
|  |  | 
|  | public: | 
|  | WatchTreeListBox( Window* pParent, WinBits nWinBits ); | 
|  | ~WatchTreeListBox(); | 
|  |  | 
|  | void			RequestingChilds( SvLBoxEntry * pParent ); | 
|  | void			UpdateWatches( bool bBasicStopped = false ); | 
|  |  | 
|  | using			SvTabListBox::SetTabs; | 
|  | virtual void	SetTabs(); | 
|  | }; | 
|  |  | 
|  |  | 
|  |  | 
|  | class WatchWindow : public BasicDockingWindow | 
|  | { | 
|  | private: | 
|  | String				aWatchStr; | 
|  | ExtendedEdit		aXEdit; | 
|  | ImageButton 		aRemoveWatchButton; | 
|  | WatchTreeListBox	aTreeListBox; | 
|  | HeaderBar			aHeaderBar; | 
|  |  | 
|  | protected: | 
|  | virtual void	Resize(); | 
|  | virtual void	Paint( const Rectangle& rRect ); | 
|  |  | 
|  | DECL_LINK( ButtonHdl, ImageButton * ); | 
|  | DECL_LINK( TreeListHdl, SvTreeListBox * ); | 
|  | DECL_LINK( implEndDragHdl, HeaderBar * ); | 
|  | DECL_LINK( EditAccHdl, Accelerator * ); | 
|  |  | 
|  |  | 
|  | public: | 
|  | WatchWindow( Window* pParent ); | 
|  | ~WatchWindow(); | 
|  |  | 
|  | void			AddWatch( const String& rVName ); | 
|  | sal_Bool			RemoveSelectedWatch(); | 
|  | void			UpdateWatches( bool bBasicStopped = false ); | 
|  |  | 
|  | WatchTreeListBox&	GetWatchTreeListBox() { return aTreeListBox; } | 
|  | }; | 
|  |  | 
|  |  | 
|  | class StackWindow : public BasicDockingWindow | 
|  | { | 
|  | private: | 
|  | SvTreeListBox	aTreeListBox; | 
|  | ImageButton 	aGotoCallButton; | 
|  | String			aStackStr; | 
|  |  | 
|  | protected: | 
|  | virtual void	Resize(); | 
|  | virtual void	Paint( const Rectangle& rRect ); | 
|  | DECL_LINK( ButtonHdl, ImageButton * ); | 
|  |  | 
|  | public: | 
|  | StackWindow( Window* pParent ); | 
|  | ~StackWindow(); | 
|  |  | 
|  | void			UpdateCalls(); | 
|  | }; | 
|  |  | 
|  |  | 
|  | class ComplexEditorWindow : public Window | 
|  | { | 
|  | private: | 
|  | BreakPointWindow	aBrkWindow; | 
|  | EditorWindow		aEdtWindow; | 
|  | ScrollBar			aEWVScrollBar; | 
|  |  | 
|  | virtual void DataChanged(DataChangedEvent const & rDCEvt); | 
|  |  | 
|  | protected: | 
|  | virtual void		Resize(); | 
|  | DECL_LINK( ScrollHdl, ScrollBar * ); | 
|  |  | 
|  | public: | 
|  | ComplexEditorWindow( ModulWindow* pParent ); | 
|  |  | 
|  | BreakPointWindow&	GetBrkWindow() 		{ return aBrkWindow; } | 
|  | EditorWindow&		GetEdtWindow() 		{ return aEdtWindow; } | 
|  | ScrollBar&			GetEWVScrollBar() 	{ return aEWVScrollBar; } | 
|  | }; | 
|  |  | 
|  |  | 
|  | #define SYNTAX_COLOR_MAX	5 | 
|  |  | 
|  | class ModulWindow: public IDEBaseWindow | 
|  | { | 
|  | friend class BasicIDEShell; | 
|  |  | 
|  | private: | 
|  | StarBASICRef        xBasic; | 
|  | short				nValid; | 
|  | ComplexEditorWindow aXEditorWindow; | 
|  | BasicStatus 		aStatus; | 
|  | SbModuleRef 		xModule; | 
|  | ModulWindowLayout*	pLayout; | 
|  | String				aCurPath; | 
|  | ::rtl::OUString		m_aModule; | 
|  |  | 
|  | DECL_LINK( BasicErrorHdl, StarBASIC * ); | 
|  | long				BasicBreakHdl( StarBASIC* pBasic ); | 
|  |  | 
|  | void				CheckCompileBasic(); | 
|  | sal_Bool				BasicExecute(); | 
|  |  | 
|  | void				GoOnTop(); | 
|  | void				AssertValidEditEngine(); | 
|  |  | 
|  | sal_Int32           FormatAndPrint( Printer* pPrinter, sal_Int32 nPage = -1 ); | 
|  | SbModuleRef 		XModule(); | 
|  | protected: | 
|  | virtual void	Resize(); | 
|  | virtual void	GetFocus(); | 
|  | virtual void	Paint( const Rectangle& ); | 
|  | virtual void	Deactivating(); | 
|  | virtual void	DoInit(); | 
|  | virtual void	DoScroll( ScrollBar* pCurScrollBar ); | 
|  |  | 
|  | public: | 
|  | TYPEINFO(); | 
|  |  | 
|  | ModulWindow( ModulWindowLayout* pParent, const ScriptDocument& rDocument, String aLibName, | 
|  | String aName, ::rtl::OUString& aModule ); | 
|  |  | 
|  | ~ModulWindow(); | 
|  |  | 
|  | virtual void	ExecuteCommand( SfxRequest& rReq ); | 
|  | virtual void	GetState( SfxItemSet& ); | 
|  | virtual void	StoreData(); | 
|  | virtual void	UpdateData(); | 
|  | virtual sal_Bool 	CanClose(); | 
|  | // virtual void	PrintData( Printer* pPrinter ); | 
|  | // return number of pages to be printed | 
|  | virtual sal_Int32 countPages( Printer* pPrinter ); | 
|  | // print page | 
|  | virtual void printPage( sal_Int32 nPage, Printer* pPrinter ); | 
|  | virtual String	GetTitle(); | 
|  | virtual BasicEntryDescriptor CreateEntryDescriptor(); | 
|  | virtual sal_Bool	AllowUndo(); | 
|  | virtual void	SetReadOnly( sal_Bool bReadOnly ); | 
|  | virtual sal_Bool    IsReadOnly(); | 
|  |  | 
|  | StarBASIC*      GetBasic() { XModule(); return xBasic; } | 
|  |  | 
|  | SbModule*		GetSbModule() { return xModule; } | 
|  | void			SetSbModule( SbModule* pModule ) { xModule = pModule; } | 
|  | String			GetSbModuleName(); | 
|  |  | 
|  | sal_Bool			CompileBasic(); | 
|  | sal_Bool			BasicRun(); | 
|  | sal_Bool			BasicStepOver(); | 
|  | sal_Bool			BasicStepInto(); | 
|  | sal_Bool			BasicStepOut(); | 
|  | void			BasicStop(); | 
|  | sal_Bool			BasicToggleBreakPoint(); | 
|  | void			BasicToggleBreakPointEnabled(); | 
|  | void			ManageBreakPoints(); | 
|  | void			UpdateBreakPoint( const BreakPoint& rBrk ); | 
|  | void			BasicAddWatch(); | 
|  | void			BasicRemoveWatch(); | 
|  |  | 
|  | sal_Bool			LoadBasic(); | 
|  | sal_Bool			SaveBasicSource(); | 
|  | sal_Bool			ImportDialog(); | 
|  |  | 
|  | void			EditMacro( const String& rMacroName ); | 
|  |  | 
|  | //	void			InsertFromObjectCatalog( ObjectCatalog* pObjDlg ); | 
|  |  | 
|  | sal_Bool			ToggleBreakPoint( sal_uLong nLine ); | 
|  |  | 
|  | BasicStatus&	GetBasicStatus() { return aStatus; } | 
|  |  | 
|  | virtual sal_Bool	IsModified(); | 
|  | virtual sal_Bool    IsPasteAllowed(); | 
|  |  | 
|  | void			FrameWindowMoved(); | 
|  | void			ShowCursor( sal_Bool bOn ); | 
|  |  | 
|  | virtual sal_uInt16	GetSearchOptions(); | 
|  | sal_uInt16			StartSearchAndReplace( const SvxSearchItem& rSearchItem, sal_Bool bFromStart = sal_False ); | 
|  |  | 
|  | virtual Window* GetLayoutWindow(); | 
|  |  | 
|  | EditorWindow&		GetEditorWindow() 		{ return aXEditorWindow.GetEdtWindow(); } | 
|  | BreakPointWindow&	GetBreakPointWindow() 	{ return aXEditorWindow.GetBrkWindow(); } | 
|  | ScrollBar&			GetEditVScrollBar() 	{ return aXEditorWindow.GetEWVScrollBar(); } | 
|  | ExtTextEngine*		GetEditEngine() 		{ return GetEditorWindow().GetEditEngine(); } | 
|  | ExtTextView*		GetEditView() 			{ return GetEditorWindow().GetEditView(); } | 
|  | BreakPointList& 	GetBreakPoints()		{ return GetBreakPointWindow().GetBreakPoints(); } | 
|  | ModulWindowLayout*	GetLayout() const 		{ return pLayout; } | 
|  |  | 
|  | virtual void		BasicStarted(); | 
|  | virtual void		BasicStopped(); | 
|  |  | 
|  | virtual ::svl::IUndoManager* | 
|  | GetUndoManager(); | 
|  |  | 
|  | const ::rtl::OUString&	GetModule() const { return m_aModule; } | 
|  | void					SetModule( const ::rtl::OUString& aModule ) { m_aModule = aModule; } | 
|  | }; | 
|  |  | 
|  | class ModulWindowLayout: public Window, public utl::ConfigurationListener | 
|  | { | 
|  | private: | 
|  |  | 
|  | Splitter		aVSplitter; | 
|  | Splitter		aHSplitter; | 
|  |  | 
|  | WatchWindow 	aWatchWindow; | 
|  | StackWindow 	aStackWindow; | 
|  |  | 
|  | sal_Bool			bVSplitted; | 
|  | sal_Bool			bHSplitted; | 
|  |  | 
|  | ModulWindow * m_pModulWindow; | 
|  |  | 
|  | Color m_aSyntaxColors[TT_KEYWORDS + 1]; | 
|  | svtools::ColorConfig m_aColorConfig; | 
|  |  | 
|  | ImageList m_aImagesNormal; | 
|  | ImageList m_aImagesHighContrast; | 
|  |  | 
|  | virtual void DataChanged(DataChangedEvent const & rDCEvt); | 
|  |  | 
|  | virtual void ConfigurationChanged( utl::ConfigurationBroadcaster*, sal_uInt32 ); | 
|  |  | 
|  | void updateSyntaxHighlighting(); | 
|  |  | 
|  | DECL_LINK( SplitHdl, Splitter * ); | 
|  |  | 
|  | void            ArrangeWindows(); | 
|  |  | 
|  | protected: | 
|  | virtual void	Resize(); | 
|  | virtual void	Paint( const Rectangle& rRect ); | 
|  |  | 
|  | public: | 
|  | ModulWindowLayout( Window* pParent ); | 
|  | ~ModulWindowLayout(); | 
|  |  | 
|  | void			DockaWindow( DockingWindow* pDockingWin ); | 
|  | sal_Bool			IsToBeDocked( DockingWindow* pDockingWin, const Point& rPos, Rectangle& rRect ); | 
|  |  | 
|  | void			SetModulWindow( ModulWindow* pModWin ); | 
|  | ModulWindow*	GetModulWindow() const { return m_pModulWindow; } | 
|  |  | 
|  | WatchWindow& 	GetWatchWindow()	{ return aWatchWindow; } | 
|  | StackWindow& 	GetStackWindow()	{ return aStackWindow; } | 
|  |  | 
|  | Image getImage(sal_uInt16 nId, bool bHighContrastMode) const; | 
|  |  | 
|  | inline Color const & getSyntaxColor(TokenTypes eType) const | 
|  | { return m_aSyntaxColors[eType]; } | 
|  | }; | 
|  |  | 
|  | #endif	// _BASIDE2_HXX |