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
ProgressInfo(SfxObjectShell * pObjSh,const String & rText,sal_uLong nRange)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
StepProgress()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
GetEditEngine() const161 ExtTextEngine* GetEditEngine() const { return (ExtTextEngine*)pEditEngine; }
GetEditView() const162 ExtTextView* GetEditView() const { return pEditView; }
GetProgress() const163 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();
SetModulWindow(ModulWindow * pWin)174 void SetModulWindow( ModulWindow* pWin )
175 { pModulWindow = pWin; }
176
177 void ForceSyntaxTimeout();
178 sal_Bool SetSourceInBasic( sal_Bool bQuiet = sal_True );
179
CanModify()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
SetModulWindow(ModulWindow * pWin)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 );
GetCurYOffset()218 long& GetCurYOffset() { return nCurYOffset; }
GetBreakPoints()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
GetWatchTreeListBox()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
GetBrkWindow()324 BreakPointWindow& GetBrkWindow() { return aBrkWindow; }
GetEdtWindow()325 EditorWindow& GetEdtWindow() { return aEdtWindow; }
GetEWVScrollBar()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
GetBasic()389 StarBASIC* GetBasic() { XModule(); return xBasic; }
390
GetSbModule()391 SbModule* GetSbModule() { return xModule; }
SetSbModule(SbModule * pModule)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
GetBasicStatus()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
GetEditorWindow()431 EditorWindow& GetEditorWindow() { return aXEditorWindow.GetEdtWindow(); }
GetBreakPointWindow()432 BreakPointWindow& GetBreakPointWindow() { return aXEditorWindow.GetBrkWindow(); }
GetEditVScrollBar()433 ScrollBar& GetEditVScrollBar() { return aXEditorWindow.GetEWVScrollBar(); }
GetEditEngine()434 ExtTextEngine* GetEditEngine() { return GetEditorWindow().GetEditEngine(); }
GetEditView()435 ExtTextView* GetEditView() { return GetEditorWindow().GetEditView(); }
GetBreakPoints()436 BreakPointList& GetBreakPoints() { return GetBreakPointWindow().GetBreakPoints(); }
GetLayout() const437 ModulWindowLayout* GetLayout() const { return pLayout; }
438
439 virtual void BasicStarted();
440 virtual void BasicStopped();
441
442 virtual ::svl::IUndoManager*
443 GetUndoManager();
444
GetModule() const445 const ::rtl::OUString& GetModule() const { return m_aModule; }
SetModule(const::rtl::OUString & 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 );
GetModulWindow() const492 ModulWindow* GetModulWindow() const { return m_pModulWindow; }
493
GetWatchWindow()494 WatchWindow& GetWatchWindow() { return aWatchWindow; }
GetStackWindow()495 StackWindow& GetStackWindow() { return aStackWindow; }
496
497 Image getImage(sal_uInt16 nId, bool bHighContrastMode) const;
498
getSyntaxColor(TokenTypes eType) const499 inline Color const & getSyntaxColor(TokenTypes eType) const
500 { return m_aSyntaxColors[eType]; }
501 };
502
503 #endif // _BASIDE2_HXX
504