xref: /AOO41X/main/basctl/source/basicide/baside2.hxx (revision 96821c268eab8f5c0fa3bcb36189f0c1c257db85) !
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