1 /************************************************************************* 2 * 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * Copyright 2000, 2010 Oracle and/or its affiliates. 6 * 7 * OpenOffice.org - a multi-platform office productivity suite 8 * 9 * This file is part of OpenOffice.org. 10 * 11 * OpenOffice.org is free software: you can redistribute it and/or modify 12 * it under the terms of the GNU Lesser General Public License version 3 13 * only, as published by the Free Software Foundation. 14 * 15 * OpenOffice.org is distributed in the hope that it will be useful, 16 * but WITHOUT ANY WARRANTY; without even the implied warranty of 17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18 * GNU Lesser General Public License version 3 for more details 19 * (a copy is included in the LICENSE file that accompanied this code). 20 * 21 * You should have received a copy of the GNU Lesser General Public License 22 * version 3 along with OpenOffice.org. If not, see 23 * <http://www.openoffice.org/license.html> 24 * for a copy of the LGPLv3 License. 25 * 26 ************************************************************************/ 27 28 #ifndef _BASIDE2_HXX 29 #define _BASIDE2_HXX 30 31 #include <svheader.hxx> 32 33 #include <bastypes.hxx> 34 #include <bastype3.hxx> 35 #include <basidesh.hxx> 36 37 class ExtTextEngine; 38 class ExtTextView; 39 class SvxSearchItem; 40 #include <svtools/svtabbx.hxx> 41 #include <svtools/headbar.hxx> 42 43 #ifndef _SV_BUTTON_HXX //autogen 44 #include <vcl/button.hxx> 45 #endif 46 #include <basic/sbmod.hxx> 47 #include <vcl/split.hxx> 48 #include "svl/lstner.hxx" 49 #include <svtools/colorcfg.hxx> 50 51 #include <sfx2/progress.hxx> 52 #include <svtools/syntaxhighlight.hxx> 53 54 DBG_NAMEEX( ModulWindow ) 55 56 #define MARKER_NOMARKER 0xFFFF 57 58 namespace utl 59 { 60 class SourceViewConfig; 61 } 62 63 // #108672 Helper functions to get/set text in TextEngine 64 // using the stream interface (get/setText() only supports 65 // tools Strings limited to 64K). 66 ::rtl::OUString getTextEngineText( ExtTextEngine* pEngine ); 67 void setTextEngineText( ExtTextEngine* pEngine, const ::rtl::OUString aStr ); 68 69 class ProgressInfo : public SfxProgress 70 { 71 private: 72 sal_uLong nCurState; 73 74 public: 75 76 inline ProgressInfo( SfxObjectShell* pObjSh, const String& rText, sal_uLong nRange ); 77 78 // inline void StartProgress( const String& rName, sal_uLong nStates ); 79 // inline void EndProgress(); 80 inline void StepProgress(); 81 }; 82 83 inline ProgressInfo::ProgressInfo( SfxObjectShell* pObjSh, const String& rText, sal_uLong nRange ) 84 : SfxProgress( pObjSh, rText, nRange ) 85 { 86 nCurState = 0; 87 } 88 89 // inline void ProgressInfo::StartProgress( const String& rName, sal_uLong nStates ) 90 // { 91 // nCurState = 0; 92 // if ( pStbMgr ) 93 // pStbMgr->StartProgressMode( rName, nStates ); 94 // } 95 96 // inline void ProgressInfo::EndProgress() 97 // { 98 // if ( pStbMgr ) 99 // pStbMgr->EndProgressMode(); 100 //} 101 102 inline void ProgressInfo::StepProgress() 103 { 104 SetState( ++nCurState ); 105 } 106 107 108 namespace svt { 109 class SourceViewConfig; 110 } 111 112 class EditorWindow : public Window, public SfxListener, public utl::ConfigurationListener 113 { 114 private: 115 ExtTextView* pEditView; 116 ExtTextEngine* pEditEngine; 117 118 utl::SourceViewConfig* pSourceViewConfig; 119 120 long nCurTextWidth; 121 122 SyntaxHighlighter aHighlighter; 123 Timer aSyntaxIdleTimer; 124 Table aSyntaxLineTable; 125 DECL_LINK( SyntaxTimerHdl, Timer * ); 126 ProgressInfo* pProgress; 127 ModulWindow* pModulWindow; 128 129 virtual void DataChanged(DataChangedEvent const & rDCEvt); 130 131 using Window::Notify; 132 virtual void Notify( SfxBroadcaster& rBC, const SfxHint& rHint ); 133 134 void ImpDoHighlight( sal_uLong nLineOff ); 135 void ImplSetFont(); 136 137 sal_Bool bHighlightning; 138 sal_Bool bDoSyntaxHighlight; 139 sal_Bool bDelayHighlight; 140 141 virtual 142 ::com::sun::star::uno::Reference< ::com::sun::star::awt::XWindowPeer > 143 GetComponentInterface(sal_Bool bCreate = sal_True); 144 145 protected: 146 virtual void Paint( const Rectangle& ); 147 virtual void Resize(); 148 virtual void KeyInput( const KeyEvent& rKeyEvt ); 149 virtual void MouseMove( const MouseEvent& rMEvt ); 150 virtual void MouseButtonDown( const MouseEvent& rMEvt ); 151 virtual void MouseButtonUp( const MouseEvent& rMEvt ); 152 virtual void Command( const CommandEvent& rCEvt ); 153 virtual void LoseFocus(); 154 virtual void RequestHelp( const HelpEvent& rHEvt ); 155 virtual void ConfigurationChanged( utl::ConfigurationBroadcaster*, sal_uInt32 ); 156 157 void DoSyntaxHighlight( sal_uLong nPara ); 158 String GetWordAtCursor(); 159 sal_Bool ImpCanModify(); 160 161 public: 162 EditorWindow( Window* pParent ); 163 ~EditorWindow(); 164 165 ExtTextEngine* GetEditEngine() const { return (ExtTextEngine*)pEditEngine; } 166 ExtTextView* GetEditView() const { return pEditView; } 167 ProgressInfo* GetProgress() const { return pProgress; } 168 169 void CreateProgress( const String& rText, sal_uLong nRange ); 170 void DestroyProgress(); 171 172 void ParagraphInsertedDeleted( sal_uLong nNewPara, sal_Bool bInserted ); 173 void DoDelayedSyntaxHighlight( sal_uLong nPara ); 174 175 void CreateEditEngine(); 176 void SetScrollBarRanges(); 177 void InitScrollBars(); 178 void SetModulWindow( ModulWindow* pWin ) 179 { pModulWindow = pWin; } 180 181 void ForceSyntaxTimeout(); 182 sal_Bool SetSourceInBasic( sal_Bool bQuiet = sal_True ); 183 184 sal_Bool CanModify() { return ImpCanModify(); } 185 }; 186 187 188 class BreakPointWindow : public Window 189 { 190 private: 191 long nCurYOffset; 192 sal_uInt16 nMarkerPos; 193 BreakPointList aBreakPointList; 194 ModulWindow* pModulWindow; 195 sal_Bool bErrorMarker; 196 bool m_bHighContrastMode; 197 198 virtual void DataChanged(DataChangedEvent const & rDCEvt); 199 200 void setBackgroundColor(Color aColor); 201 202 protected: 203 virtual void Paint( const Rectangle& ); 204 virtual void Resize(); 205 BreakPoint* FindBreakPoint( const Point& rMousePos ); 206 void ShowMarker( sal_Bool bShow ); 207 virtual void MouseButtonDown( const MouseEvent& rMEvt ); 208 virtual void Command( const CommandEvent& rCEvt ); 209 210 sal_Bool SyncYOffset(); 211 212 public: 213 BreakPointWindow( Window* pParent ); 214 ~BreakPointWindow(); 215 216 void SetModulWindow( ModulWindow* pWin ) 217 { pModulWindow = pWin; } 218 219 void SetMarkerPos( sal_uInt16 nLine, sal_Bool bErrorMarker = sal_False ); 220 221 void DoScroll( long nHorzScroll, long nVertScroll ); 222 long& GetCurYOffset() { return nCurYOffset; } 223 BreakPointList& GetBreakPoints() { return aBreakPointList; } 224 }; 225 226 227 class WatchTreeListBox : public SvHeaderTabListBox 228 { 229 String aEditingRes; 230 231 protected: 232 virtual sal_Bool EditingEntry( SvLBoxEntry* pEntry, Selection& rSel ); 233 virtual sal_Bool EditedEntry( SvLBoxEntry* pEntry, const String& rNewText ); 234 235 sal_Bool ImplBasicEntryEdited( SvLBoxEntry* pEntry, const String& rResult ); 236 SbxBase* ImplGetSBXForEntry( SvLBoxEntry* pEntry, bool& rbArrayElement ); 237 238 // virtual DragDropMode NotifyBeginDrag( SvLBoxEntry* ); 239 // virtual sal_Bool NotifyQueryDrop( SvLBoxEntry* ); 240 241 // virtual sal_Bool NotifyMoving( SvLBoxEntry* pTarget, SvLBoxEntry* pEntry, 242 // SvLBoxEntry*& rpNewParent, sal_uLong& rNewChildPos ); 243 // virtual sal_Bool NotifyCopying( SvLBoxEntry* pTarget, SvLBoxEntry* pEntry, 244 // SvLBoxEntry*& rpNewParent, sal_uLong& rNewChildPos ); 245 // sal_Bool NotifyCopyingMoving( SvLBoxEntry* pTarget, SvLBoxEntry* pEntry, 246 // SvLBoxEntry*& rpNewParent, sal_uLong& rNewChildPos, sal_Bool bMove ); 247 248 public: 249 WatchTreeListBox( Window* pParent, WinBits nWinBits ); 250 ~WatchTreeListBox(); 251 252 void RequestingChilds( SvLBoxEntry * pParent ); 253 void UpdateWatches( bool bBasicStopped = false ); 254 255 using SvTabListBox::SetTabs; 256 virtual void SetTabs(); 257 }; 258 259 260 261 class WatchWindow : public BasicDockingWindow 262 { 263 private: 264 String aWatchStr; 265 ExtendedEdit aXEdit; 266 ImageButton aRemoveWatchButton; 267 WatchTreeListBox aTreeListBox; 268 HeaderBar aHeaderBar; 269 270 protected: 271 virtual void Resize(); 272 virtual void Paint( const Rectangle& rRect ); 273 274 DECL_LINK( ButtonHdl, ImageButton * ); 275 DECL_LINK( TreeListHdl, SvTreeListBox * ); 276 DECL_LINK( implEndDragHdl, HeaderBar * ); 277 DECL_LINK( EditAccHdl, Accelerator * ); 278 279 280 public: 281 WatchWindow( Window* pParent ); 282 ~WatchWindow(); 283 284 void AddWatch( const String& rVName ); 285 sal_Bool RemoveSelectedWatch(); 286 void UpdateWatches( bool bBasicStopped = false ); 287 288 WatchTreeListBox& GetWatchTreeListBox() { return aTreeListBox; } 289 }; 290 291 292 class StackWindow : public BasicDockingWindow 293 { 294 private: 295 SvTreeListBox aTreeListBox; 296 ImageButton aGotoCallButton; 297 String aStackStr; 298 299 protected: 300 virtual void Resize(); 301 virtual void Paint( const Rectangle& rRect ); 302 DECL_LINK( ButtonHdl, ImageButton * ); 303 304 public: 305 StackWindow( Window* pParent ); 306 ~StackWindow(); 307 308 void UpdateCalls(); 309 }; 310 311 312 class ComplexEditorWindow : public Window 313 { 314 private: 315 BreakPointWindow aBrkWindow; 316 EditorWindow aEdtWindow; 317 ScrollBar aEWVScrollBar; 318 319 virtual void DataChanged(DataChangedEvent const & rDCEvt); 320 321 protected: 322 virtual void Resize(); 323 DECL_LINK( ScrollHdl, ScrollBar * ); 324 325 public: 326 ComplexEditorWindow( ModulWindow* pParent ); 327 328 BreakPointWindow& GetBrkWindow() { return aBrkWindow; } 329 EditorWindow& GetEdtWindow() { return aEdtWindow; } 330 ScrollBar& GetEWVScrollBar() { return aEWVScrollBar; } 331 }; 332 333 334 #define SYNTAX_COLOR_MAX 5 335 336 class ModulWindow: public IDEBaseWindow 337 { 338 friend class BasicIDEShell; 339 340 private: 341 StarBASICRef xBasic; 342 short nValid; 343 ComplexEditorWindow aXEditorWindow; 344 BasicStatus aStatus; 345 SbModuleRef xModule; 346 ModulWindowLayout* pLayout; 347 String aCurPath; 348 ::rtl::OUString m_aModule; 349 350 DECL_LINK( BasicErrorHdl, StarBASIC * ); 351 long BasicBreakHdl( StarBASIC* pBasic ); 352 353 void CheckCompileBasic(); 354 sal_Bool BasicExecute(); 355 356 void GoOnTop(); 357 void AssertValidEditEngine(); 358 359 sal_Int32 FormatAndPrint( Printer* pPrinter, sal_Int32 nPage = -1 ); 360 SbModuleRef XModule(); 361 protected: 362 virtual void Resize(); 363 virtual void GetFocus(); 364 virtual void Paint( const Rectangle& ); 365 virtual void Deactivating(); 366 virtual void DoInit(); 367 virtual void DoScroll( ScrollBar* pCurScrollBar ); 368 369 public: 370 TYPEINFO(); 371 372 ModulWindow( ModulWindowLayout* pParent, const ScriptDocument& rDocument, String aLibName, 373 String aName, ::rtl::OUString& aModule ); 374 375 ~ModulWindow(); 376 377 virtual void ExecuteCommand( SfxRequest& rReq ); 378 virtual void GetState( SfxItemSet& ); 379 virtual void StoreData(); 380 virtual void UpdateData(); 381 virtual sal_Bool CanClose(); 382 // virtual void PrintData( Printer* pPrinter ); 383 // return number of pages to be printed 384 virtual sal_Int32 countPages( Printer* pPrinter ); 385 // print page 386 virtual void printPage( sal_Int32 nPage, Printer* pPrinter ); 387 virtual String GetTitle(); 388 virtual BasicEntryDescriptor CreateEntryDescriptor(); 389 virtual sal_Bool AllowUndo(); 390 virtual void SetReadOnly( sal_Bool bReadOnly ); 391 virtual sal_Bool IsReadOnly(); 392 393 StarBASIC* GetBasic() { XModule(); return xBasic; } 394 395 SbModule* GetSbModule() { return xModule; } 396 void SetSbModule( SbModule* pModule ) { xModule = pModule; } 397 String GetSbModuleName(); 398 399 sal_Bool CompileBasic(); 400 sal_Bool BasicRun(); 401 sal_Bool BasicStepOver(); 402 sal_Bool BasicStepInto(); 403 sal_Bool BasicStepOut(); 404 void BasicStop(); 405 sal_Bool BasicToggleBreakPoint(); 406 void BasicToggleBreakPointEnabled(); 407 void ManageBreakPoints(); 408 void UpdateBreakPoint( const BreakPoint& rBrk ); 409 void BasicAddWatch(); 410 void BasicRemoveWatch(); 411 412 sal_Bool LoadBasic(); 413 sal_Bool SaveBasicSource(); 414 sal_Bool ImportDialog(); 415 416 void EditMacro( const String& rMacroName ); 417 418 // void InsertFromObjectCatalog( ObjectCatalog* pObjDlg ); 419 420 sal_Bool ToggleBreakPoint( sal_uLong nLine ); 421 422 BasicStatus& GetBasicStatus() { return aStatus; } 423 424 virtual sal_Bool IsModified(); 425 virtual sal_Bool IsPasteAllowed(); 426 427 void FrameWindowMoved(); 428 void ShowCursor( sal_Bool bOn ); 429 430 virtual sal_uInt16 GetSearchOptions(); 431 sal_uInt16 StartSearchAndReplace( const SvxSearchItem& rSearchItem, sal_Bool bFromStart = sal_False ); 432 433 virtual Window* GetLayoutWindow(); 434 435 EditorWindow& GetEditorWindow() { return aXEditorWindow.GetEdtWindow(); } 436 BreakPointWindow& GetBreakPointWindow() { return aXEditorWindow.GetBrkWindow(); } 437 ScrollBar& GetEditVScrollBar() { return aXEditorWindow.GetEWVScrollBar(); } 438 ExtTextEngine* GetEditEngine() { return GetEditorWindow().GetEditEngine(); } 439 ExtTextView* GetEditView() { return GetEditorWindow().GetEditView(); } 440 BreakPointList& GetBreakPoints() { return GetBreakPointWindow().GetBreakPoints(); } 441 ModulWindowLayout* GetLayout() const { return pLayout; } 442 443 virtual void BasicStarted(); 444 virtual void BasicStopped(); 445 446 virtual ::svl::IUndoManager* 447 GetUndoManager(); 448 449 const ::rtl::OUString& GetModule() const { return m_aModule; } 450 void SetModule( const ::rtl::OUString& aModule ) { m_aModule = aModule; } 451 }; 452 453 class ModulWindowLayout: public Window, public utl::ConfigurationListener 454 { 455 private: 456 457 Splitter aVSplitter; 458 Splitter aHSplitter; 459 460 WatchWindow aWatchWindow; 461 StackWindow aStackWindow; 462 463 sal_Bool bVSplitted; 464 sal_Bool bHSplitted; 465 466 ModulWindow * m_pModulWindow; 467 468 Color m_aSyntaxColors[TT_KEYWORDS + 1]; 469 svtools::ColorConfig m_aColorConfig; 470 471 ImageList m_aImagesNormal; 472 ImageList m_aImagesHighContrast; 473 474 virtual void DataChanged(DataChangedEvent const & rDCEvt); 475 476 virtual void ConfigurationChanged( utl::ConfigurationBroadcaster*, sal_uInt32 ); 477 478 void updateSyntaxHighlighting(); 479 480 DECL_LINK( SplitHdl, Splitter * ); 481 482 void ArrangeWindows(); 483 484 protected: 485 virtual void Resize(); 486 virtual void Paint( const Rectangle& rRect ); 487 488 public: 489 ModulWindowLayout( Window* pParent ); 490 ~ModulWindowLayout(); 491 492 void DockaWindow( DockingWindow* pDockingWin ); 493 sal_Bool IsToBeDocked( DockingWindow* pDockingWin, const Point& rPos, Rectangle& rRect ); 494 495 void SetModulWindow( ModulWindow* pModWin ); 496 ModulWindow* GetModulWindow() const { return m_pModulWindow; } 497 498 WatchWindow& GetWatchWindow() { return aWatchWindow; } 499 StackWindow& GetStackWindow() { return aStackWindow; } 500 501 Image getImage(sal_uInt16 nId, bool bHighContrastMode) const; 502 503 inline Color const & getSyntaxColor(TokenTypes eType) const 504 { return m_aSyntaxColors[eType]; } 505 }; 506 507 #endif // _BASIDE2_HXX 508