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