Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 : #include "baside2.hxx"
21 : #include "baside3.hxx"
22 : #include "brkdlg.hxx"
23 : #include "iderdll.hxx"
24 : #include "moduldlg.hxx"
25 : #include "docsignature.hxx"
26 :
27 : #include "helpid.hrc"
28 : #include "baside2.hrc"
29 :
30 : #include <basic/basmgr.hxx>
31 : #include <basic/basrdll.hxx>
32 : #include <basic/sbmeth.hxx>
33 : #include <com/sun/star/script/ModuleType.hpp>
34 : #include <com/sun/star/ui/dialogs/ExtendedFilePickerElementIds.hpp>
35 : #include <com/sun/star/ui/dialogs/TemplateDescription.hpp>
36 : #include <com/sun/star/ui/dialogs/FilePicker.hpp>
37 : #include <com/sun/star/ui/dialogs/XFilePickerControlAccess.hpp>
38 : #include <comphelper/string.hxx>
39 : #include <sfx2/dinfdlg.hxx>
40 : #include <sfx2/dispatch.hxx>
41 : #include <sfx2/docfile.hxx>
42 : #include <sfx2/printer.hxx>
43 : #include <sfx2/request.hxx>
44 : #include <sot/exchange.hxx>
45 : #include <svl/aeitem.hxx>
46 : #include <svl/srchitem.hxx>
47 : #include <svl/visitem.hxx>
48 : #include <svl/whiter.hxx>
49 : #include <vcl/xtextedt.hxx>
50 : #include <vcl/settings.hxx>
51 : #include <toolkit/helper/vclunohelper.hxx>
52 :
53 : namespace basctl
54 : {
55 :
56 : namespace
57 : {
58 :
59 : namespace Print
60 : {
61 : long const nLeftMargin = 1700;
62 : long const nRightMargin = 900;
63 : long const nTopMargin = 2000;
64 : long const nBottomMargin = 1000;
65 : long const nBorder = 300;
66 : }
67 :
68 : short const ValidWindow = 0x1234;
69 :
70 : // What (who) are OW and MTF? Compare to baside3.cxx where an
71 : // identically named variable, used in the same way, has the value
72 : // "*.*" on Windows, "*" otherwise. Is that what should be done here,
73 : // too?
74 :
75 : #if defined(OW) || defined(MTF)
76 : char const FilterMask_All[] = "*";
77 : #else
78 : char const FilterMask_All[] = "*.*";
79 : #endif
80 :
81 : } // end anonymous namespace
82 :
83 : using namespace ::com::sun::star;
84 : using namespace ::com::sun::star::uno;
85 : using namespace ::com::sun::star::ui::dialogs;
86 : using namespace utl;
87 : using namespace comphelper;
88 :
89 0 : TYPEINIT1( ModulWindow , BaseWindow );
90 :
91 : namespace
92 : {
93 :
94 0 : void lcl_PrintHeader( Printer* pPrinter, sal_uInt16 nPages, sal_uInt16 nCurPage, const OUString& rTitle, bool bOutput )
95 : {
96 0 : Size const aSz = pPrinter->GetOutputSize();
97 :
98 0 : const Color aOldLineColor( pPrinter->GetLineColor() );
99 0 : const Color aOldFillColor( pPrinter->GetFillColor() );
100 0 : const vcl::Font aOldFont( pPrinter->GetFont() );
101 :
102 0 : pPrinter->SetLineColor( Color( COL_BLACK ) );
103 0 : pPrinter->SetFillColor();
104 :
105 0 : vcl::Font aFont( aOldFont );
106 0 : aFont.SetWeight( WEIGHT_BOLD );
107 0 : aFont.SetAlign( ALIGN_BOTTOM );
108 0 : pPrinter->SetFont( aFont );
109 :
110 0 : long nFontHeight = pPrinter->GetTextHeight();
111 :
112 : // 1st Border => line, 2+3 Border = free space
113 0 : long nYTop = Print::nTopMargin - 3*Print::nBorder - nFontHeight;
114 :
115 0 : long nXLeft = Print::nLeftMargin - Print::nBorder;
116 0 : long nXRight = aSz.Width() - Print::nRightMargin + Print::nBorder;
117 :
118 0 : if( bOutput )
119 : pPrinter->DrawRect(Rectangle(
120 : Point(nXLeft, nYTop),
121 0 : Size(nXRight - nXLeft, aSz.Height() - nYTop - Print::nBottomMargin + Print::nBorder)
122 0 : ));
123 :
124 :
125 0 : long nY = Print::nTopMargin - 2*Print::nBorder;
126 0 : Point aPos(Print::nLeftMargin, nY);
127 0 : if( bOutput )
128 0 : pPrinter->DrawText( aPos, rTitle );
129 0 : if ( nPages != 1 )
130 : {
131 0 : aFont.SetWeight( WEIGHT_NORMAL );
132 0 : pPrinter->SetFont( aFont );
133 0 : aPos.X() += pPrinter->GetTextWidth( rTitle );
134 :
135 0 : if( bOutput )
136 : {
137 0 : OUString aPageStr = " [" + IDE_RESSTR(RID_STR_PAGE) + " " + OUString::number( nCurPage ) + "]";
138 0 : pPrinter->DrawText( aPos, aPageStr );
139 : }
140 : }
141 :
142 0 : nY = Print::nTopMargin - Print::nBorder;
143 :
144 0 : if( bOutput )
145 0 : pPrinter->DrawLine( Point( nXLeft, nY ), Point( nXRight, nY ) );
146 :
147 0 : pPrinter->SetFont( aOldFont );
148 0 : pPrinter->SetFillColor( aOldFillColor );
149 0 : pPrinter->SetLineColor( aOldLineColor );
150 0 : }
151 :
152 0 : void lcl_ConvertTabsToSpaces( OUString& rLine )
153 : {
154 0 : if ( !rLine.isEmpty() )
155 : {
156 0 : OUStringBuffer aResult( rLine );
157 0 : sal_Int32 nPos = 0;
158 0 : sal_Int32 nMax = aResult.getLength();
159 0 : while ( nPos < nMax )
160 : {
161 0 : if ( aResult[nPos] == '\t' )
162 : {
163 : // not 4 Blanks, but at 4 TabPos:
164 0 : OUStringBuffer aBlanker;
165 0 : string::padToLength(aBlanker, ( 4 - ( nPos % 4 ) ), ' ');
166 0 : aResult.remove( nPos, 1 );
167 0 : aResult.insert( nPos, aBlanker.makeStringAndClear() );
168 0 : nMax = aResult.getLength();
169 : }
170 0 : ++nPos;
171 : }
172 0 : rLine = aResult.makeStringAndClear();
173 : }
174 0 : }
175 :
176 : // until we have some configuration lets just keep
177 : // persist this value for the process lifetime
178 : bool bSourceLinesEnabled = false;
179 :
180 : } // namespace
181 :
182 0 : ModulWindow::ModulWindow (ModulWindowLayout* pParent, ScriptDocument const& rDocument,
183 : const OUString& aLibName, const OUString& aName, OUString& aModule)
184 : : BaseWindow(pParent, rDocument, aLibName, aName)
185 : , rLayout(*pParent)
186 : , nValid(ValidWindow)
187 : , aXEditorWindow(VclPtr<ComplexEditorWindow>::Create(this))
188 0 : , m_aModule(aModule)
189 : {
190 0 : aXEditorWindow->Show();
191 0 : SetBackground();
192 0 : }
193 :
194 0 : SbModuleRef ModulWindow::XModule()
195 : {
196 : // ModuleWindows can now be created as a result of the
197 : // modules getting created via the api. This is a result of an
198 : // elementInserted event from the BasicLibrary container.
199 : // However the SbModule is also created from a different listener to
200 : // the same event ( in basmgr ) Therefore it is possible when we look
201 : // for xModule it may not yet be available, here we keep tring to access
202 : // the module until such time as it exists
203 :
204 0 : if ( !xModule.Is() )
205 : {
206 0 : BasicManager* pBasMgr = GetDocument().getBasicManager();
207 0 : if ( pBasMgr )
208 : {
209 0 : StarBASIC* pBasic = pBasMgr->GetLib( GetLibName() );
210 0 : if ( pBasic )
211 : {
212 0 : xBasic = pBasic;
213 0 : xModule = pBasic->FindModule( GetName() );
214 : }
215 : }
216 : }
217 0 : return xModule;
218 : }
219 :
220 0 : ModulWindow::~ModulWindow()
221 : {
222 0 : disposeOnce();
223 0 : }
224 :
225 0 : void ModulWindow::dispose()
226 : {
227 0 : nValid = 0;
228 0 : StarBASIC::Stop();
229 0 : aXEditorWindow.disposeAndClear();
230 0 : BaseWindow::dispose();
231 0 : }
232 :
233 :
234 0 : void ModulWindow::GetFocus()
235 : {
236 0 : if (nValid != ValidWindow)
237 0 : return;
238 0 : aXEditorWindow->GetEdtWindow().GrabFocus();
239 : // don't call basic calls because focus is somewhere else...
240 : }
241 :
242 0 : void ModulWindow::DoInit()
243 : {
244 0 : if (GetVScrollBar())
245 0 : GetVScrollBar()->Hide();
246 0 : GetHScrollBar()->Show();
247 0 : GetEditorWindow().InitScrollBars();
248 0 : }
249 :
250 0 : void ModulWindow::Paint(vcl::RenderContext& /*rRenderContext*/, const Rectangle&)
251 : {
252 0 : }
253 :
254 0 : void ModulWindow::Resize()
255 : {
256 0 : aXEditorWindow->SetPosSizePixel( Point( 0, 0 ),
257 0 : Size( GetOutputSizePixel() ) );
258 0 : }
259 :
260 0 : void ModulWindow::CheckCompileBasic()
261 : {
262 0 : if ( XModule().Is() )
263 : {
264 : // never compile while running!
265 0 : bool const bRunning = StarBASIC::IsRunning();
266 0 : bool const bModified = ( !xModule->IsCompiled() ||
267 0 : ( GetEditEngine() && GetEditEngine()->IsModified() ) );
268 :
269 0 : if ( !bRunning && bModified )
270 : {
271 0 : bool bDone = false;
272 :
273 0 : GetShell()->GetViewFrame()->GetWindow().EnterWait();
274 :
275 0 : if( bModified )
276 : {
277 0 : AssertValidEditEngine();
278 0 : GetEditorWindow().SetSourceInBasic();
279 : }
280 :
281 0 : bool bWasModified = GetBasic()->IsModified();
282 :
283 0 : bDone = StarBASIC::Compile( xModule );
284 0 : if ( !bWasModified )
285 0 : GetBasic()->SetModified(false);
286 :
287 0 : if ( bDone )
288 : {
289 0 : GetBreakPoints().SetBreakPointsInBasic( xModule );
290 : }
291 :
292 0 : GetShell()->GetViewFrame()->GetWindow().LeaveWait();
293 :
294 0 : aStatus.bError = !bDone;
295 0 : aStatus.bIsRunning = false;
296 : }
297 : }
298 0 : }
299 :
300 0 : bool ModulWindow::BasicExecute()
301 : {
302 : // #116444# check security settings before macro execution
303 0 : ScriptDocument aDocument( GetDocument() );
304 0 : if ( aDocument.isDocument() )
305 : {
306 0 : if ( !aDocument.allowMacros() )
307 : {
308 0 : ScopedVclPtrInstance<MessageDialog>::Create(this, IDE_RESSTR(RID_STR_CANNOTRUNMACRO), VCL_MESSAGE_WARNING)->Execute();
309 0 : return false;
310 : }
311 : }
312 :
313 0 : CheckCompileBasic();
314 :
315 0 : if ( XModule().Is() && xModule->IsCompiled() && !aStatus.bError )
316 : {
317 0 : if ( GetBreakPoints().size() )
318 0 : aStatus.nBasicFlags = aStatus.nBasicFlags | SbDEBUG_BREAK;
319 :
320 0 : if ( !aStatus.bIsRunning )
321 : {
322 : DBG_ASSERT( xModule.Is(), "Kein Modul!" );
323 0 : AddStatus( BASWIN_RUNNINGBASIC );
324 0 : sal_uInt16 nStart, nEnd, nCurMethodStart = 0;
325 0 : TextSelection aSel = GetEditView()->GetSelection();
326 : // Init cursor to top
327 0 : nCurMethodStart = ( aSel.GetStart().GetPara() + 1 );
328 0 : SbMethod* pMethod = 0;
329 : // first Macro, else blind "Main" (ExtSearch?)
330 0 : for ( sal_uInt16 nMacro = 0; nMacro < xModule->GetMethods()->Count(); nMacro++ )
331 : {
332 0 : SbMethod* pM = static_cast<SbMethod*>(xModule->GetMethods()->Get( nMacro ));
333 : DBG_ASSERT( pM, "Method?" );
334 0 : pM->GetLineRange( nStart, nEnd );
335 0 : if ( nCurMethodStart >= nStart && nCurMethodStart <= nEnd )
336 : {
337 : // matched a method to the cursor position
338 0 : pMethod = pM;
339 0 : break;
340 : }
341 : }
342 0 : if ( !pMethod )
343 : {
344 : // If not in a method then prompt the user
345 0 : return ( !ChooseMacro( uno::Reference< frame::XModel >(), false, OUString() ).isEmpty() );
346 : }
347 0 : if ( pMethod )
348 : {
349 0 : pMethod->SetDebugFlags( aStatus.nBasicFlags );
350 0 : BasicDLL::SetDebugMode( true );
351 0 : RunMethod( pMethod );
352 0 : BasicDLL::SetDebugMode( false );
353 : // if cancelled during Interactive=false
354 0 : BasicDLL::EnableBreak( true );
355 : }
356 0 : ClearStatus( BASWIN_RUNNINGBASIC );
357 : }
358 : else
359 0 : aStatus.bIsRunning = false; // cancel of Reschedule()
360 : }
361 :
362 0 : bool bDone = !aStatus.bError;
363 :
364 0 : return bDone;
365 : }
366 :
367 0 : bool ModulWindow::CompileBasic()
368 : {
369 0 : CheckCompileBasic();
370 :
371 0 : return XModule().Is() && xModule->IsCompiled();
372 : }
373 :
374 0 : bool ModulWindow::BasicRun()
375 : {
376 0 : aStatus.nBasicFlags = 0;
377 0 : return BasicExecute();
378 : }
379 :
380 0 : bool ModulWindow::BasicStepOver()
381 : {
382 0 : aStatus.nBasicFlags = SbDEBUG_STEPINTO | SbDEBUG_STEPOVER;
383 0 : return BasicExecute();
384 : }
385 :
386 :
387 0 : bool ModulWindow::BasicStepInto()
388 : {
389 0 : aStatus.nBasicFlags = SbDEBUG_STEPINTO;
390 0 : return BasicExecute();
391 : }
392 :
393 0 : bool ModulWindow::BasicStepOut()
394 : {
395 0 : aStatus.nBasicFlags = SbDEBUG_STEPOUT;
396 0 : return BasicExecute();
397 : }
398 :
399 :
400 :
401 0 : void ModulWindow::BasicStop()
402 : {
403 0 : StarBASIC::Stop();
404 0 : aStatus.bIsRunning = false;
405 0 : }
406 :
407 0 : bool ModulWindow::LoadBasic()
408 : {
409 0 : bool bDone = false;
410 :
411 0 : Reference< uno::XComponentContext > xContext( ::comphelper::getProcessComponentContext() );
412 0 : Reference < XFilePicker3 > xFP = FilePicker::createWithMode(xContext, TemplateDescription::FILEOPEN_SIMPLE);
413 :
414 0 : if ( !aCurPath.isEmpty() )
415 0 : xFP->setDisplayDirectory ( aCurPath );
416 :
417 0 : xFP->appendFilter( "BASIC" , "*.bas" );
418 0 : xFP->appendFilter( IDE_RESSTR(RID_STR_FILTER_ALLFILES), OUString( FilterMask_All ) );
419 0 : xFP->setCurrentFilter( "BASIC" );
420 :
421 0 : if( xFP->execute() == RET_OK )
422 : {
423 0 : Sequence< OUString > aPaths = xFP->getFiles();
424 0 : aCurPath = aPaths[0];
425 0 : SfxMedium aMedium( aCurPath, StreamMode::READ | StreamMode::SHARE_DENYWRITE | StreamMode::NOCREATE );
426 0 : SvStream* pStream = aMedium.GetInStream();
427 0 : if ( pStream )
428 : {
429 0 : AssertValidEditEngine();
430 0 : sal_uLong nLines = CalcLineCount( *pStream );
431 : // nLines*4: ReadText/Formatting/Highlighting/Formatting
432 0 : GetEditorWindow().CreateProgress( IDEResId(RID_STR_GENERATESOURCE).toString(), nLines*4 );
433 0 : GetEditEngine()->SetUpdateMode( false );
434 0 : GetEditView()->Read( *pStream );
435 0 : GetEditEngine()->SetUpdateMode( true );
436 0 : GetEditorWindow().Update();
437 0 : GetEditorWindow().ForceSyntaxTimeout();
438 0 : GetEditorWindow().DestroyProgress();
439 0 : sal_uLong nError = aMedium.GetError();
440 0 : if ( nError )
441 0 : ErrorHandler::HandleError( nError );
442 : else
443 0 : bDone = true;
444 : }
445 : else
446 0 : ScopedVclPtrInstance<MessageDialog>::Create(this, IDE_RESSTR(RID_STR_COULDNTREAD))->Execute();
447 : }
448 0 : return bDone;
449 : }
450 :
451 :
452 0 : bool ModulWindow::SaveBasicSource()
453 : {
454 0 : bool bDone = false;
455 :
456 0 : Reference< uno::XComponentContext > xContext( ::comphelper::getProcessComponentContext() );
457 0 : Reference < XFilePicker3 > xFP = FilePicker::createWithMode(xContext, TemplateDescription::FILESAVE_AUTOEXTENSION_PASSWORD);
458 :
459 0 : Reference< XFilePickerControlAccess > xFPControl(xFP, UNO_QUERY);
460 0 : xFPControl->enableControl(ExtendedFilePickerElementIds::CHECKBOX_PASSWORD, false);
461 0 : Any aValue;
462 0 : aValue <<= true;
463 0 : xFPControl->setValue(ExtendedFilePickerElementIds::CHECKBOX_AUTOEXTENSION, 0, aValue);
464 :
465 0 : if ( !aCurPath.isEmpty() )
466 0 : xFP->setDisplayDirectory ( aCurPath );
467 :
468 0 : xFP->appendFilter( "BASIC", "*.bas" );
469 0 : xFP->appendFilter( IDE_RESSTR(RID_STR_FILTER_ALLFILES), OUString( FilterMask_All ) );
470 0 : xFP->setCurrentFilter( "BASIC" );
471 :
472 0 : if( xFP->execute() == RET_OK )
473 : {
474 0 : Sequence< OUString > aPaths = xFP->getFiles();
475 0 : aCurPath = aPaths[0];
476 0 : SfxMedium aMedium( aCurPath, StreamMode::WRITE | StreamMode::SHARE_DENYWRITE | StreamMode::TRUNC );
477 0 : SvStream* pStream = aMedium.GetOutStream();
478 0 : if ( pStream )
479 : {
480 0 : EnterWait();
481 0 : AssertValidEditEngine();
482 0 : GetEditEngine()->Write( *pStream );
483 0 : aMedium.Commit();
484 0 : LeaveWait();
485 0 : sal_uLong nError = aMedium.GetError();
486 0 : if ( nError )
487 0 : ErrorHandler::HandleError( nError );
488 : else
489 0 : bDone = true;
490 : }
491 : else
492 0 : ScopedVclPtrInstance<MessageDialog>::Create(this, IDEResId(RID_STR_COULDNTWRITE))->Execute();
493 : }
494 :
495 0 : return bDone;
496 : }
497 :
498 0 : bool ModulWindow::ImportDialog()
499 : {
500 0 : const ScriptDocument& rDocument = GetDocument();
501 0 : OUString aLibName = GetLibName();
502 0 : return implImportDialog( this, aCurPath, rDocument, aLibName );
503 : }
504 :
505 0 : bool ModulWindow::ToggleBreakPoint( sal_uLong nLine )
506 : {
507 : DBG_ASSERT( XModule().Is(), "Kein Modul!" );
508 :
509 0 : bool bNewBreakPoint = false;
510 :
511 0 : if ( XModule().Is() )
512 : {
513 0 : CheckCompileBasic();
514 0 : if ( aStatus.bError )
515 : {
516 0 : return false;
517 : }
518 :
519 0 : BreakPoint* pBrk = GetBreakPoints().FindBreakPoint( nLine );
520 0 : if ( pBrk ) // remove
521 : {
522 0 : xModule->ClearBP( (sal_uInt16)nLine );
523 0 : delete GetBreakPoints().remove( pBrk );
524 : }
525 : else // create one
526 : {
527 0 : if ( xModule->SetBP( (sal_uInt16)nLine) )
528 : {
529 0 : GetBreakPoints().InsertSorted( new BreakPoint( nLine ) );
530 0 : bNewBreakPoint = true;
531 0 : if ( StarBASIC::IsRunning() )
532 : {
533 0 : for ( sal_uInt16 nMethod = 0; nMethod < xModule->GetMethods()->Count(); nMethod++ )
534 : {
535 0 : SbMethod* pMethod = static_cast<SbMethod*>(xModule->GetMethods()->Get( nMethod ));
536 : DBG_ASSERT( pMethod, "Methode nicht gefunden! (NULL)" );
537 0 : pMethod->SetDebugFlags( pMethod->GetDebugFlags() | SbDEBUG_BREAK );
538 : }
539 : }
540 : }
541 : }
542 : }
543 :
544 0 : return bNewBreakPoint;
545 : }
546 :
547 0 : void ModulWindow::UpdateBreakPoint( const BreakPoint& rBrk )
548 : {
549 : DBG_ASSERT( XModule().Is(), "Kein Modul!" );
550 :
551 0 : if ( XModule().Is() )
552 : {
553 0 : CheckCompileBasic();
554 :
555 0 : if ( rBrk.bEnabled )
556 0 : xModule->SetBP( (sal_uInt16)rBrk.nLine );
557 : else
558 0 : xModule->ClearBP( (sal_uInt16)rBrk.nLine );
559 : }
560 0 : }
561 :
562 :
563 0 : bool ModulWindow::BasicToggleBreakPoint()
564 : {
565 0 : AssertValidEditEngine();
566 :
567 0 : TextSelection aSel = GetEditView()->GetSelection();
568 0 : aSel.GetStart().GetPara()++; // Basic lines start at 1!
569 0 : aSel.GetEnd().GetPara()++;
570 :
571 0 : bool bNewBreakPoint = false;
572 :
573 0 : for ( sal_uLong nLine = aSel.GetStart().GetPara(); nLine <= aSel.GetEnd().GetPara(); nLine++ )
574 : {
575 0 : if ( ToggleBreakPoint( nLine ) )
576 0 : bNewBreakPoint = true;
577 : }
578 :
579 0 : aXEditorWindow->GetBrkWindow().Invalidate();
580 0 : return bNewBreakPoint;
581 : }
582 :
583 :
584 0 : void ModulWindow::BasicToggleBreakPointEnabled()
585 : {
586 0 : AssertValidEditEngine();
587 :
588 0 : ExtTextView* pView = GetEditView();
589 0 : if ( pView )
590 : {
591 0 : TextSelection aSel = pView->GetSelection();
592 0 : BreakPointList& rList = GetBreakPoints();
593 :
594 0 : for ( sal_uLong nLine = ++aSel.GetStart().GetPara(), nEnd = ++aSel.GetEnd().GetPara(); nLine <= nEnd; ++nLine )
595 : {
596 0 : BreakPoint* pBrk = rList.FindBreakPoint( nLine );
597 0 : if ( pBrk )
598 : {
599 0 : pBrk->bEnabled = !pBrk->bEnabled;
600 0 : UpdateBreakPoint( *pBrk );
601 : }
602 : }
603 :
604 0 : GetBreakPointWindow().Invalidate();
605 : }
606 0 : }
607 :
608 :
609 0 : void ModulWindow::ManageBreakPoints()
610 : {
611 0 : BreakPointWindow& rBrkWin = GetBreakPointWindow();
612 0 : ScopedVclPtrInstance< BreakPointDialog > aBrkDlg( &rBrkWin, GetBreakPoints() );
613 0 : aBrkDlg->Execute();
614 0 : rBrkWin.Invalidate();
615 0 : }
616 :
617 :
618 0 : bool ModulWindow::BasicErrorHdl( StarBASIC * pBasic )
619 : {
620 0 : GoOnTop();
621 :
622 : // ReturnWert: BOOL
623 : // FALSE: cancel
624 : // TRUE: go on....
625 0 : sal_uInt16 nErrorLine = StarBASIC::GetLine() - 1;
626 0 : sal_uInt16 nErrCol1 = StarBASIC::GetCol1();
627 0 : sal_uInt16 nErrCol2 = StarBASIC::GetCol2();
628 0 : if ( nErrCol2 != 0xFFFF )
629 0 : nErrCol2++;
630 :
631 0 : AssertValidEditEngine();
632 0 : GetEditView()->SetSelection( TextSelection( TextPaM( nErrorLine, nErrCol1 ), TextPaM( nErrorLine, nErrCol2 ) ) );
633 :
634 : // if other basic, the IDE should try to display the correct module
635 0 : bool const bMarkError = pBasic == GetBasic();
636 0 : if ( bMarkError )
637 0 : aXEditorWindow->GetBrkWindow().SetMarkerPos(nErrorLine, true);
638 :
639 : // #i47002#
640 0 : Reference< awt::XWindow > xWindow = VCLUnoHelper::GetInterface( this );
641 :
642 0 : ErrorHandler::HandleError( StarBASIC::GetErrorCode() );
643 :
644 : // #i47002#
645 0 : vcl::Window* pWindow = VCLUnoHelper::GetWindow( xWindow );
646 0 : if ( !pWindow )
647 0 : return false;
648 :
649 0 : if ( bMarkError )
650 0 : aXEditorWindow->GetBrkWindow().SetNoMarker();
651 0 : return false;
652 : }
653 :
654 0 : long ModulWindow::BasicBreakHdl( StarBASIC* pBasic )
655 : {
656 : // #i69280 Required in Window despite normal usage in next command!
657 : (void)pBasic;
658 :
659 : // Return value: sal_uInt16 => see SB-Debug-Flags
660 0 : sal_uInt16 nErrorLine = StarBASIC::GetLine();
661 :
662 :
663 0 : BreakPoint* pBrk = GetBreakPoints().FindBreakPoint( nErrorLine );
664 0 : if ( pBrk )
665 : {
666 0 : pBrk->nHitCount++;
667 0 : if ( pBrk->nHitCount <= pBrk->nStopAfter && GetBasic()->IsBreak() )
668 0 : return aStatus.nBasicFlags; // go on...
669 : }
670 :
671 0 : nErrorLine--; // EditEngine starts at 0, Basic at 1
672 :
673 0 : AssertValidEditEngine();
674 0 : GetEditView()->SetSelection( TextSelection( TextPaM( nErrorLine, 0 ), TextPaM( nErrorLine, 0 ) ) );
675 0 : aXEditorWindow->GetBrkWindow().SetMarkerPos( nErrorLine );
676 :
677 0 : rLayout.UpdateDebug(false);
678 :
679 0 : aStatus.bIsInReschedule = true;
680 0 : aStatus.bIsRunning = true;
681 :
682 0 : AddStatus( BASWIN_INRESCHEDULE );
683 :
684 0 : InvalidateDebuggerSlots();
685 :
686 0 : while( aStatus.bIsRunning )
687 0 : Application::Yield();
688 :
689 0 : aStatus.bIsInReschedule = false;
690 0 : aXEditorWindow->GetBrkWindow().SetNoMarker();
691 :
692 0 : ClearStatus( BASWIN_INRESCHEDULE );
693 :
694 0 : return aStatus.nBasicFlags;
695 : }
696 :
697 0 : void ModulWindow::BasicAddWatch()
698 : {
699 0 : AssertValidEditEngine();
700 0 : bool bAdd = true;
701 0 : if ( !GetEditView()->HasSelection() )
702 : {
703 0 : TextPaM aWordStart;
704 0 : OUString aWord = GetEditEngine()->GetWord( GetEditView()->GetSelection().GetEnd(), &aWordStart );
705 0 : if ( !aWord.isEmpty() )
706 : {
707 0 : TextSelection aSel( aWordStart );
708 0 : sal_uInt16& rIndex = aSel.GetEnd().GetIndex();
709 0 : rIndex = rIndex + aWord.getLength();
710 0 : GetEditView()->SetSelection( aSel );
711 0 : bAdd = true;
712 0 : }
713 : }
714 0 : if ( bAdd )
715 : {
716 0 : TextSelection aSel = GetEditView()->GetSelection();
717 0 : if ( aSel.GetStart().GetPara() == aSel.GetEnd().GetPara() ) // single line selection
718 0 : rLayout.BasicAddWatch(GetEditView()->GetSelected());
719 : }
720 0 : }
721 :
722 :
723 :
724 0 : void ModulWindow::EditMacro( const OUString& rMacroName )
725 : {
726 : DBG_ASSERT( XModule().Is(), "Kein Modul!" );
727 :
728 0 : if ( XModule().Is() )
729 : {
730 0 : CheckCompileBasic();
731 :
732 0 : if ( !aStatus.bError )
733 : {
734 : sal_uInt16 nStart, nEnd;
735 0 : SbMethod* pMethod = static_cast<SbMethod*>(xModule->Find( rMacroName, SbxCLASS_METHOD ));
736 0 : if ( pMethod )
737 : {
738 0 : pMethod->GetLineRange( nStart, nEnd );
739 0 : if ( nStart )
740 : {
741 0 : nStart--;
742 0 : nEnd--;
743 : }
744 0 : TextSelection aSel( TextPaM( nStart, 0 ), TextPaM( nStart, 0 ) );
745 0 : AssertValidEditEngine();
746 0 : TextView * pView = GetEditView();
747 : // scroll if applicabel so that first line is at the top
748 0 : long nVisHeight = GetOutputSizePixel().Height();
749 0 : if ( (long)pView->GetTextEngine()->GetTextHeight() > nVisHeight )
750 : {
751 0 : long nMaxY = (long)pView->GetTextEngine()->GetTextHeight() - nVisHeight;
752 0 : long nOldStartY = pView->GetStartDocPos().Y();
753 0 : long nNewStartY = (long)nStart * (long)pView->GetTextEngine()->GetCharHeight();
754 0 : nNewStartY = std::min( nNewStartY, nMaxY );
755 0 : pView->Scroll( 0, -(nNewStartY-nOldStartY) );
756 0 : pView->ShowCursor( false, true );
757 0 : GetEditVScrollBar().SetThumbPos( pView->GetStartDocPos().Y() );
758 : }
759 0 : pView->SetSelection( aSel );
760 0 : pView->ShowCursor();
761 0 : pView->GetWindow()->GrabFocus();
762 : }
763 : }
764 : }
765 0 : }
766 :
767 0 : void ModulWindow::StoreData()
768 : {
769 : // StoreData is called when the BasicManager is destroyed or
770 : // this window is closed.
771 : // => interrupts undesired!
772 0 : GetEditorWindow().SetSourceInBasic();
773 0 : }
774 :
775 0 : bool ModulWindow::CanClose()
776 : {
777 0 : return true;
778 : }
779 :
780 0 : bool ModulWindow::AllowUndo()
781 : {
782 0 : return GetEditorWindow().CanModify();
783 : }
784 :
785 0 : void ModulWindow::UpdateData()
786 : {
787 : DBG_ASSERT( XModule().Is(), "Kein Modul!" );
788 : // UpdateData is called when the source has changed from outside
789 : // => interrupts undesired!
790 :
791 0 : if ( XModule().Is() )
792 : {
793 0 : SetModule( xModule->GetSource32() );
794 :
795 0 : if ( GetEditView() )
796 : {
797 0 : TextSelection aSel = GetEditView()->GetSelection();
798 0 : setTextEngineText(*GetEditEngine(), xModule->GetSource32());
799 0 : GetEditView()->SetSelection( aSel );
800 0 : GetEditEngine()->SetModified( false );
801 0 : MarkDocumentModified( GetDocument() );
802 : }
803 : }
804 0 : }
805 :
806 0 : sal_Int32 ModulWindow::countPages( Printer* pPrinter )
807 : {
808 0 : return FormatAndPrint( pPrinter, -1 );
809 : }
810 :
811 0 : void ModulWindow::printPage( sal_Int32 nPage, Printer* pPrinter )
812 : {
813 0 : FormatAndPrint( pPrinter, nPage );
814 0 : }
815 :
816 : /* implementation note: this is totally inefficient for the XRenderable interface
817 : usage since the whole "document" will be format for every page. Should this ever
818 : become a problem we should
819 : - format only once for every new printer
820 : - keep an index list for each page which is the starting paragraph
821 : */
822 0 : sal_Int32 ModulWindow::FormatAndPrint( Printer* pPrinter, sal_Int32 nPrintPage )
823 : {
824 0 : AssertValidEditEngine();
825 :
826 0 : MapMode eOldMapMode( pPrinter->GetMapMode() );
827 0 : vcl::Font aOldFont( pPrinter->GetFont() );
828 :
829 0 : vcl::Font aFont( GetEditEngine()->GetFont() );
830 0 : aFont.SetAlign( ALIGN_BOTTOM );
831 0 : aFont.SetTransparent( true );
832 0 : aFont.SetSize( Size( 0, 360 ) );
833 0 : pPrinter->SetFont( aFont );
834 0 : pPrinter->SetMapMode( MAP_100TH_MM );
835 :
836 0 : OUString aTitle( CreateQualifiedName() );
837 :
838 0 : sal_Int32 nLineHeight = pPrinter->GetTextHeight();
839 0 : if(nLineHeight == 0)
840 : {
841 0 : nLineHeight = 1;
842 : }
843 0 : sal_Int32 nParaSpace = 10;
844 :
845 0 : Size aPaperSz = pPrinter->GetOutputSize();
846 0 : aPaperSz.Width() -= (Print::nLeftMargin + Print::nRightMargin);
847 0 : aPaperSz.Height() -= (Print::nTopMargin + Print::nBottomMargin);
848 :
849 : // nLinepPage is not correct if there's a line break
850 0 : sal_Int32 nLinespPage = aPaperSz.Height()/nLineHeight;
851 0 : long nXTextWidth = pPrinter->approximate_char_width();
852 :
853 0 : sal_Int32 nCharspLine = aPaperSz.Width() / (nXTextWidth > 1 ? nXTextWidth : 1);
854 0 : sal_uLong nParas = GetEditEngine()->GetParagraphCount();
855 :
856 0 : sal_Int32 nPages = nParas/nLinespPage+1;
857 0 : sal_Int32 nCurPage = 1;
858 :
859 0 : lcl_PrintHeader( pPrinter, nPages, nCurPage, aTitle, nPrintPage == 0 );
860 0 : Point aPos( Print::nLeftMargin, Print::nTopMargin );
861 0 : for ( sal_uLong nPara = 0; nPara < nParas; nPara++ )
862 : {
863 0 : OUString aLine( GetEditEngine()->GetText( nPara ) );
864 0 : lcl_ConvertTabsToSpaces( aLine );
865 0 : sal_Int32 nLines = aLine.getLength()/nCharspLine+1;
866 0 : for (sal_Int32 nLine = 0; nLine < nLines; ++nLine)
867 : {
868 0 : sal_Int32 nBeginIndex = nLine*nCharspLine;
869 0 : sal_Int32 nCopyCount = std::min<sal_Int32>(nCharspLine, aLine.getLength()-nBeginIndex);
870 0 : OUString aTmpLine = aLine.copy(nBeginIndex, nCopyCount);
871 0 : aPos.Y() += nLineHeight;
872 0 : if ( aPos.Y() > ( aPaperSz.Height() + Print::nTopMargin ) )
873 : {
874 0 : nCurPage++;
875 0 : lcl_PrintHeader( pPrinter, nPages, nCurPage, aTitle, nCurPage-1 == nPrintPage );
876 0 : aPos = Point(Print::nLeftMargin, Print::nTopMargin + nLineHeight);
877 : }
878 0 : if( nCurPage-1 == nPrintPage )
879 0 : pPrinter->DrawText( aPos, aTmpLine );
880 0 : }
881 0 : aPos.Y() += nParaSpace;
882 0 : }
883 :
884 0 : pPrinter->SetFont( aOldFont );
885 0 : pPrinter->SetMapMode( eOldMapMode );
886 :
887 0 : return nCurPage;
888 : }
889 :
890 0 : void ModulWindow::ExecuteCommand (SfxRequest& rReq)
891 : {
892 0 : AssertValidEditEngine();
893 0 : switch (rReq.GetSlot())
894 : {
895 : case SID_DELETE:
896 : {
897 0 : KeyEvent aFakeDelete( 0, KEY_DELETE );
898 0 : bool bDone = GetEditView()->KeyInput( aFakeDelete );
899 0 : if (!bDone)
900 : {
901 0 : BaseWindow::KeyInput(aFakeDelete);
902 : }
903 0 : break;
904 : }
905 : case SID_SELECTALL:
906 : {
907 0 : TextSelection aSel( TextPaM( 0, 0 ), TextPaM( TEXT_PARA_ALL, 0xFFFF ) );
908 0 : TextView * pView = GetEditView();
909 0 : pView->SetSelection( aSel );
910 0 : pView->GetWindow()->GrabFocus();
911 0 : break;
912 : }
913 : case SID_BASICRUN:
914 : {
915 0 : BasicRun();
916 : }
917 0 : break;
918 : case SID_BASICCOMPILE:
919 : {
920 0 : CompileBasic();
921 : }
922 0 : break;
923 : case SID_BASICSTEPOVER:
924 : {
925 0 : BasicStepOver();
926 : }
927 0 : break;
928 : case SID_BASICSTEPINTO:
929 : {
930 0 : BasicStepInto();
931 : }
932 0 : break;
933 : case SID_BASICSTEPOUT:
934 : {
935 0 : BasicStepOut();
936 : }
937 0 : break;
938 : case SID_BASICLOAD:
939 : {
940 0 : LoadBasic();
941 : }
942 0 : break;
943 : case SID_BASICSAVEAS:
944 : {
945 0 : SaveBasicSource();
946 : }
947 0 : break;
948 : case SID_IMPORT_DIALOG:
949 : {
950 0 : ImportDialog();
951 : }
952 0 : break;
953 : case SID_BASICIDE_MATCHGROUP:
954 : {
955 0 : GetEditView()->MatchGroup();
956 : }
957 0 : break;
958 : case SID_BASICIDE_TOGGLEBRKPNT:
959 : {
960 0 : BasicToggleBreakPoint();
961 : }
962 0 : break;
963 : case SID_BASICIDE_MANAGEBRKPNTS:
964 : {
965 0 : ManageBreakPoints();
966 : }
967 0 : break;
968 : case SID_BASICIDE_TOGGLEBRKPNTENABLED:
969 : {
970 0 : BasicToggleBreakPointEnabled();
971 : }
972 0 : break;
973 : case SID_BASICIDE_ADDWATCH:
974 : {
975 0 : BasicAddWatch();
976 : }
977 0 : break;
978 : case SID_BASICIDE_REMOVEWATCH:
979 : {
980 0 : rLayout.BasicRemoveWatch();
981 : }
982 0 : break;
983 : case SID_CUT:
984 : {
985 0 : if ( !IsReadOnly() )
986 : {
987 0 : GetEditView()->Cut();
988 0 : if (SfxBindings* pBindings = GetBindingsPtr())
989 0 : pBindings->Invalidate( SID_DOC_MODIFIED );
990 : }
991 : }
992 0 : break;
993 : case SID_COPY:
994 : {
995 0 : GetEditView()->Copy();
996 : }
997 0 : break;
998 : case SID_PASTE:
999 : {
1000 0 : if ( !IsReadOnly() )
1001 : {
1002 0 : GetEditView()->Paste();
1003 0 : if (SfxBindings* pBindings = GetBindingsPtr())
1004 0 : pBindings->Invalidate( SID_DOC_MODIFIED );
1005 : }
1006 : }
1007 0 : break;
1008 : case SID_BASICIDE_BRKPNTSCHANGED:
1009 : {
1010 0 : GetBreakPointWindow().Invalidate();
1011 : }
1012 0 : break;
1013 : case SID_SHOWLINES:
1014 : {
1015 0 : SFX_REQUEST_ARG(rReq, pItem, SfxBoolItem, rReq.GetSlot(), false);
1016 0 : bSourceLinesEnabled = pItem && pItem->GetValue();
1017 0 : aXEditorWindow->SetLineNumberDisplay(bSourceLinesEnabled);
1018 : }
1019 0 : break;
1020 : case SID_BASICIDE_DELETECURRENT:
1021 : {
1022 0 : if (QueryDelModule(m_aName, this))
1023 0 : if (m_aDocument.removeModule(m_aLibName, m_aName))
1024 0 : MarkDocumentModified(m_aDocument);
1025 : }
1026 0 : break;
1027 : case FID_SEARCH_OFF:
1028 0 : GrabFocus();
1029 0 : break;
1030 : case SID_GOTOLINE:
1031 : {
1032 0 : ScopedVclPtrInstance< GotoLineDialog > aGotoDlg(this);
1033 0 : if (aGotoDlg->Execute())
1034 0 : if (sal_Int32 const nLine = aGotoDlg->GetLineNumber())
1035 : {
1036 0 : TextSelection const aSel(TextPaM(nLine - 1, 0), TextPaM(nLine - 1, 0));
1037 0 : GetEditView()->SetSelection(aSel);
1038 : }
1039 0 : break;
1040 : }
1041 : }
1042 0 : }
1043 :
1044 0 : void ModulWindow::ExecuteGlobal (SfxRequest& rReq)
1045 : {
1046 0 : switch (rReq.GetSlot())
1047 : {
1048 : case SID_SIGNATURE:
1049 : {
1050 0 : DocumentSignature aSignature(m_aDocument);
1051 0 : if (aSignature.supportsSignatures())
1052 : {
1053 0 : aSignature.signScriptingContent();
1054 0 : if (SfxBindings* pBindings = GetBindingsPtr())
1055 0 : pBindings->Invalidate(SID_SIGNATURE);
1056 0 : }
1057 : }
1058 0 : break;
1059 : }
1060 0 : }
1061 :
1062 :
1063 :
1064 0 : void ModulWindow::GetState( SfxItemSet &rSet )
1065 : {
1066 0 : SfxWhichIter aIter(rSet);
1067 0 : for ( sal_uInt16 nWh = aIter.FirstWhich(); 0 != nWh; nWh = aIter.NextWhich() )
1068 : {
1069 0 : switch ( nWh )
1070 : {
1071 : case SID_CUT:
1072 : {
1073 0 : if ( !GetEditView() || !GetEditView()->HasSelection() )
1074 0 : rSet.DisableItem( nWh );
1075 :
1076 0 : if ( IsReadOnly() )
1077 0 : rSet.DisableItem( nWh );
1078 : }
1079 0 : break;
1080 : case SID_COPY:
1081 : {
1082 0 : if ( !GetEditView() || !GetEditView()->HasSelection() )
1083 0 : rSet.DisableItem( nWh );
1084 : }
1085 0 : break;
1086 : case SID_PASTE:
1087 : {
1088 0 : if ( !IsPasteAllowed() )
1089 0 : rSet.DisableItem( nWh );
1090 :
1091 0 : if ( IsReadOnly() )
1092 0 : rSet.DisableItem( nWh );
1093 : }
1094 0 : break;
1095 : case SID_BASICIDE_STAT_POS:
1096 : {
1097 0 : TextView* pView = GetEditView();
1098 0 : if ( pView )
1099 : {
1100 0 : TextSelection aSel = pView->GetSelection();
1101 0 : OUString aPos = OUString( IDEResId( RID_STR_LINE ) ) +
1102 0 : " " +
1103 0 : OUString::number(aSel.GetEnd().GetPara()+1) +
1104 0 : ", " +
1105 0 : OUString( IDEResId( RID_STR_COLUMN ) ) +
1106 0 : " " +
1107 0 : OUString::number(aSel.GetEnd().GetIndex()+1);
1108 0 : SfxStringItem aItem( SID_BASICIDE_STAT_POS, aPos );
1109 0 : rSet.Put( aItem );
1110 : }
1111 : }
1112 0 : break;
1113 : case SID_BASICIDE_STAT_TITLE:
1114 : {
1115 : // search for current procedure name (Sub or Function)
1116 0 : TextView* pView = GetEditView();
1117 0 : if ( pView )
1118 : {
1119 :
1120 0 : OUString sProcName;
1121 0 : bool bFound = false;
1122 :
1123 0 : TextSelection aSel = pView->GetSelection();
1124 0 : long nLine = aSel.GetStart().GetPara();
1125 :
1126 0 : for (long i = nLine; i >= 0 && !bFound; --i)
1127 : {
1128 0 : OUString aCurrLine = GetEditEngine()->GetText( i );
1129 0 : OUString sProcType;
1130 0 : bFound = GetEditorWindow().GetProcedureName(aCurrLine, sProcType, sProcName);
1131 0 : }
1132 :
1133 0 : OUString aTitle = CreateQualifiedName();
1134 0 : if (!sProcName.isEmpty())
1135 0 : aTitle += "." + sProcName;
1136 :
1137 0 : SfxStringItem aTitleItem( SID_BASICIDE_STAT_TITLE, aTitle );
1138 0 : rSet.Put( aTitleItem );
1139 : }
1140 : }
1141 0 : break;
1142 : case SID_ATTR_INSERT:
1143 : {
1144 0 : TextView* pView = GetEditView();
1145 0 : if ( pView )
1146 : {
1147 0 : SfxBoolItem aItem( SID_ATTR_INSERT, pView->IsInsertMode() );
1148 0 : rSet.Put( aItem );
1149 : }
1150 : }
1151 0 : break;
1152 : case SID_SHOWLINES:
1153 : {
1154 0 : rSet.Put(SfxBoolItem(nWh, bSourceLinesEnabled));
1155 0 : break;
1156 : }
1157 : case SID_SELECTALL:
1158 : {
1159 0 : if ( !GetEditView() )
1160 0 : rSet.DisableItem( nWh );
1161 : }
1162 0 : break;
1163 : }
1164 0 : }
1165 0 : }
1166 :
1167 0 : void ModulWindow::DoScroll( ScrollBar* pCurScrollBar )
1168 : {
1169 0 : if ( ( pCurScrollBar == GetHScrollBar() ) && GetEditView() )
1170 : {
1171 : // don't scroll with the value but rather use the Thumb-Pos for the VisArea:
1172 0 : long nDiff = GetEditView()->GetStartDocPos().X() - pCurScrollBar->GetThumbPos();
1173 0 : GetEditView()->Scroll( nDiff, 0 );
1174 0 : GetEditView()->ShowCursor( false, true );
1175 0 : pCurScrollBar->SetThumbPos( GetEditView()->GetStartDocPos().X() );
1176 :
1177 : }
1178 0 : }
1179 :
1180 0 : bool ModulWindow::IsModified()
1181 : {
1182 0 : return GetEditEngine() && GetEditEngine()->IsModified();
1183 : }
1184 :
1185 0 : void ModulWindow::GoOnTop()
1186 : {
1187 0 : GetShell()->GetViewFrame()->ToTop();
1188 0 : }
1189 :
1190 0 : OUString ModulWindow::GetSbModuleName()
1191 : {
1192 0 : OUString aModuleName;
1193 0 : if ( XModule().Is() )
1194 0 : aModuleName = xModule->GetName();
1195 0 : return aModuleName;
1196 : }
1197 :
1198 0 : OUString ModulWindow::GetTitle()
1199 : {
1200 0 : return GetSbModuleName();
1201 : }
1202 :
1203 0 : void ModulWindow::ShowCursor( bool bOn )
1204 : {
1205 0 : if ( GetEditEngine() )
1206 : {
1207 0 : TextView* pView = GetEditEngine()->GetActiveView();
1208 0 : if ( pView )
1209 : {
1210 0 : if ( bOn )
1211 0 : pView->ShowCursor();
1212 : else
1213 0 : pView->HideCursor();
1214 : }
1215 : }
1216 0 : }
1217 :
1218 0 : void ModulWindow::AssertValidEditEngine()
1219 : {
1220 0 : if ( !GetEditEngine() )
1221 0 : GetEditorWindow().CreateEditEngine();
1222 0 : }
1223 :
1224 0 : void ModulWindow::Activating ()
1225 : {
1226 0 : aXEditorWindow->SetLineNumberDisplay(bSourceLinesEnabled);
1227 0 : Show();
1228 0 : }
1229 :
1230 0 : void ModulWindow::Deactivating()
1231 : {
1232 0 : Hide();
1233 0 : if ( GetEditView() )
1234 0 : GetEditView()->EraseVirtualDevice();
1235 0 : }
1236 :
1237 0 : sal_uInt16 ModulWindow::StartSearchAndReplace( const SvxSearchItem& rSearchItem, bool bFromStart )
1238 : {
1239 0 : if (IsSuspended())
1240 0 : return 0;
1241 :
1242 : // one could also relinquish syntaxhighlighting/formatting instead of the stupid replace-everything...
1243 0 : AssertValidEditEngine();
1244 0 : ExtTextView* pView = GetEditView();
1245 0 : TextSelection aSel;
1246 0 : if ( bFromStart )
1247 : {
1248 0 : aSel = pView->GetSelection();
1249 0 : if ( !rSearchItem.GetBackward() )
1250 0 : pView->SetSelection( TextSelection() );
1251 : else
1252 0 : pView->SetSelection( TextSelection( TextPaM( 0xFFFFFFFF, 0xFFFF ), TextPaM( 0xFFFFFFFF, 0xFFFF ) ) );
1253 : }
1254 :
1255 0 : bool const bForward = !rSearchItem.GetBackward();
1256 0 : sal_uInt16 nFound = 0;
1257 0 : if ( ( rSearchItem.GetCommand() == SvxSearchCmd::FIND ) ||
1258 0 : ( rSearchItem.GetCommand() == SvxSearchCmd::FIND_ALL ) )
1259 : {
1260 0 : nFound = pView->Search( rSearchItem.GetSearchOptions() , bForward ) ? 1 : 0;
1261 : }
1262 0 : else if ( ( rSearchItem.GetCommand() == SvxSearchCmd::REPLACE ) ||
1263 0 : ( rSearchItem.GetCommand() == SvxSearchCmd::REPLACE_ALL ) )
1264 : {
1265 0 : if ( !IsReadOnly() )
1266 : {
1267 0 : bool const bAll = rSearchItem.GetCommand() == SvxSearchCmd::REPLACE_ALL;
1268 0 : nFound = pView->Replace( rSearchItem.GetSearchOptions() , bAll , bForward );
1269 : }
1270 : }
1271 :
1272 0 : if ( bFromStart && !nFound )
1273 0 : pView->SetSelection( aSel );
1274 :
1275 0 : return nFound;
1276 : }
1277 :
1278 0 : svl::IUndoManager* ModulWindow::GetUndoManager()
1279 : {
1280 0 : if ( GetEditEngine() )
1281 0 : return &GetEditEngine()->GetUndoManager();
1282 0 : return NULL;
1283 : }
1284 :
1285 0 : SearchOptionFlags ModulWindow::GetSearchOptions()
1286 : {
1287 : SearchOptionFlags nOptions = SearchOptionFlags::SEARCH |
1288 : SearchOptionFlags::WHOLE_WORDS |
1289 : SearchOptionFlags::BACKWARDS |
1290 : SearchOptionFlags::REG_EXP |
1291 : SearchOptionFlags::EXACT |
1292 0 : SearchOptionFlags::SELECTION |
1293 0 : SearchOptionFlags::SIMILARITY;
1294 :
1295 0 : if ( !IsReadOnly() )
1296 : {
1297 0 : nOptions |= SearchOptionFlags::REPLACE;
1298 0 : nOptions |= SearchOptionFlags::REPLACE_ALL;
1299 : }
1300 :
1301 0 : return nOptions;
1302 : }
1303 :
1304 0 : void ModulWindow::BasicStarted()
1305 : {
1306 0 : if ( XModule().Is() )
1307 : {
1308 0 : aStatus.bIsRunning = true;
1309 0 : BreakPointList& rList = GetBreakPoints();
1310 0 : if ( rList.size() )
1311 : {
1312 0 : rList.ResetHitCount();
1313 0 : rList.SetBreakPointsInBasic( xModule );
1314 0 : for ( sal_uInt16 nMethod = 0; nMethod < xModule->GetMethods()->Count(); nMethod++ )
1315 : {
1316 0 : SbMethod* pMethod = static_cast<SbMethod*>(xModule->GetMethods()->Get( nMethod ));
1317 : DBG_ASSERT( pMethod, "Methode nicht gefunden! (NULL)" );
1318 0 : pMethod->SetDebugFlags( pMethod->GetDebugFlags() | SbDEBUG_BREAK );
1319 : }
1320 : }
1321 : }
1322 0 : }
1323 :
1324 0 : void ModulWindow::BasicStopped()
1325 : {
1326 0 : aStatus.bIsRunning = false;
1327 0 : GetBreakPointWindow().SetNoMarker();
1328 0 : }
1329 :
1330 0 : EntryDescriptor ModulWindow::CreateEntryDescriptor()
1331 : {
1332 0 : ScriptDocument aDocument( GetDocument() );
1333 0 : OUString aLibName( GetLibName() );
1334 0 : LibraryLocation eLocation = aDocument.getLibraryLocation( aLibName );
1335 0 : OUString aModName( GetName() );
1336 0 : OUString aLibSubName;
1337 0 : if( xBasic.Is() && aDocument.isInVBAMode() && XModule().Is() )
1338 : {
1339 0 : switch( xModule->GetModuleType() )
1340 : {
1341 : case script::ModuleType::DOCUMENT:
1342 : {
1343 0 : aLibSubName = OUString( IDEResId( RID_STR_DOCUMENT_OBJECTS ) );
1344 0 : uno::Reference< container::XNameContainer > xLib = aDocument.getOrCreateLibrary( E_SCRIPTS, aLibName );
1345 0 : if( xLib.is() )
1346 : {
1347 0 : OUString sObjName;
1348 0 : ModuleInfoHelper::getObjectName( xLib, aModName, sObjName );
1349 0 : if( !sObjName.isEmpty() )
1350 : {
1351 0 : aModName += " (" + sObjName + ")";
1352 0 : }
1353 : }
1354 0 : break;
1355 : }
1356 : case script::ModuleType::FORM:
1357 0 : aLibSubName = OUString( IDEResId( RID_STR_USERFORMS ) );
1358 0 : break;
1359 : case script::ModuleType::NORMAL:
1360 0 : aLibSubName = OUString( IDEResId( RID_STR_NORMAL_MODULES ) );
1361 0 : break;
1362 : case script::ModuleType::CLASS:
1363 0 : aLibSubName = OUString( IDEResId( RID_STR_CLASS_MODULES ) );
1364 0 : break;
1365 : }
1366 : }
1367 0 : return EntryDescriptor( aDocument, eLocation, aLibName, aLibSubName, aModName, OBJ_TYPE_MODULE );
1368 : }
1369 :
1370 0 : void ModulWindow::SetReadOnly (bool b)
1371 : {
1372 0 : if ( GetEditView() )
1373 0 : GetEditView()->SetReadOnly( b );
1374 0 : }
1375 :
1376 0 : bool ModulWindow::IsReadOnly()
1377 : {
1378 0 : return GetEditView() && GetEditView()->IsReadOnly();
1379 : }
1380 :
1381 0 : bool ModulWindow::IsPasteAllowed()
1382 : {
1383 0 : bool bPaste = false;
1384 :
1385 : // get clipboard
1386 0 : Reference< datatransfer::clipboard::XClipboard > xClipboard = GetClipboard();
1387 0 : if ( xClipboard.is() )
1388 : {
1389 :
1390 0 : Reference< datatransfer::XTransferable > xTransf;
1391 : {
1392 0 : SolarMutexReleaser aReleaser;
1393 : // get clipboard content
1394 0 : xTransf = xClipboard->getContents();
1395 : }
1396 0 : if ( xTransf.is() )
1397 : {
1398 0 : datatransfer::DataFlavor aFlavor;
1399 0 : SotExchange::GetFormatDataFlavor( SotClipboardFormatId::STRING, aFlavor );
1400 0 : if ( xTransf->isDataFlavorSupported( aFlavor ) )
1401 0 : bPaste = true;
1402 0 : }
1403 : }
1404 :
1405 0 : return bPaste;
1406 : }
1407 :
1408 0 : void ModulWindow::OnNewDocument ()
1409 : {
1410 0 : aXEditorWindow->SetLineNumberDisplay(bSourceLinesEnabled);
1411 0 : }
1412 :
1413 0 : char const* ModulWindow::GetHid () const
1414 : {
1415 0 : return HID_BASICIDE_MODULWINDOW;
1416 : }
1417 0 : ItemType ModulWindow::GetType () const
1418 : {
1419 0 : return TYPE_MODULE;
1420 : }
1421 :
1422 0 : bool ModulWindow::HasActiveEditor () const
1423 : {
1424 0 : return !IsSuspended();
1425 : }
1426 :
1427 :
1428 0 : void ModulWindow::UpdateModule ()
1429 : {
1430 0 : OUString const aModule = getTextEngineText(*GetEditEngine());
1431 :
1432 : // update module in basic
1433 : assert(xModule);
1434 :
1435 : // update module in module window
1436 0 : SetModule(aModule);
1437 :
1438 : // update module in library
1439 0 : OSL_VERIFY(m_aDocument.updateModule(m_aLibName, m_aName, aModule));
1440 :
1441 0 : GetEditEngine()->SetModified(false);
1442 0 : MarkDocumentModified(m_aDocument);
1443 0 : }
1444 :
1445 0 : ModulWindowLayout::ModulWindowLayout (vcl::Window* pParent, ObjectCatalog& rObjectCatalog_) :
1446 : Layout(pParent),
1447 : pChild(0),
1448 : aWatchWindow(VclPtr<WatchWindow>::Create(this)),
1449 : aStackWindow(VclPtr<StackWindow>::Create(this)),
1450 0 : rObjectCatalog(rObjectCatalog_)
1451 0 : { }
1452 :
1453 0 : ModulWindowLayout::~ModulWindowLayout()
1454 : {
1455 0 : disposeOnce();
1456 0 : }
1457 :
1458 0 : void ModulWindowLayout::dispose()
1459 : {
1460 0 : aWatchWindow.disposeAndClear();
1461 0 : aStackWindow.disposeAndClear();
1462 0 : pChild.clear();
1463 0 : Layout::dispose();
1464 0 : }
1465 :
1466 0 : void ModulWindowLayout::UpdateDebug (bool bBasicStopped)
1467 : {
1468 0 : aWatchWindow->UpdateWatches(bBasicStopped);
1469 0 : aStackWindow->UpdateCalls();
1470 0 : }
1471 :
1472 0 : void ModulWindowLayout::Paint (vcl::RenderContext& rRenderContext, Rectangle const&)
1473 : {
1474 0 : rRenderContext.DrawText(Point(), IDEResId(RID_STR_NOMODULE).toString());
1475 0 : }
1476 :
1477 : // virtual
1478 0 : void ModulWindowLayout::DataChanged (DataChangedEvent const& rDCEvt)
1479 : {
1480 0 : Layout::DataChanged(rDCEvt);
1481 0 : if (rDCEvt.GetType() == DataChangedEventType::SETTINGS && (rDCEvt.GetFlags() & AllSettingsFlags::STYLE))
1482 0 : aSyntaxColors.SettingsChanged();
1483 0 : }
1484 :
1485 0 : void ModulWindowLayout::Activating (BaseWindow& rChild)
1486 : {
1487 : assert(dynamic_cast<ModulWindow*>(&rChild));
1488 0 : pChild = &static_cast<ModulWindow&>(rChild);
1489 0 : aWatchWindow->Show();
1490 0 : aStackWindow->Show();
1491 0 : rObjectCatalog.Show();
1492 0 : rObjectCatalog.SetLayoutWindow(this);
1493 0 : rObjectCatalog.UpdateEntries();
1494 0 : Layout::Activating(rChild);
1495 0 : aSyntaxColors.SetActiveEditor(&pChild->GetEditorWindow());
1496 0 : }
1497 :
1498 0 : void ModulWindowLayout::Deactivating ()
1499 : {
1500 0 : aSyntaxColors.SetActiveEditor(0);
1501 0 : Layout::Deactivating();
1502 0 : aWatchWindow->Hide();
1503 0 : aStackWindow->Hide();
1504 0 : rObjectCatalog.Hide();
1505 0 : pChild = 0;
1506 0 : }
1507 :
1508 0 : void ModulWindowLayout::GetState (SfxItemSet &rSet, unsigned nWhich)
1509 : {
1510 0 : switch (nWhich)
1511 : {
1512 : case SID_SHOW_PROPERTYBROWSER:
1513 0 : rSet.Put(SfxVisibilityItem(nWhich, false));
1514 0 : break;
1515 :
1516 : case SID_BASICIDE_CHOOSEMACRO:
1517 0 : rSet.Put(SfxVisibilityItem(nWhich, true));
1518 0 : break;
1519 : }
1520 0 : }
1521 :
1522 0 : void ModulWindowLayout::BasicAddWatch (OUString const& rWatchStr)
1523 : {
1524 0 : aWatchWindow->AddWatch(rWatchStr);
1525 0 : }
1526 :
1527 0 : void ModulWindowLayout::BasicRemoveWatch ()
1528 : {
1529 0 : aWatchWindow->RemoveSelectedWatch();
1530 0 : }
1531 :
1532 0 : void ModulWindowLayout::OnFirstSize (long const nWidth, long const nHeight)
1533 : {
1534 0 : AddToLeft(&rObjectCatalog, Size(nWidth * 0.20, nHeight * 0.75));
1535 0 : AddToBottom(aWatchWindow.get(), Size(nWidth * 0.67, nHeight * 0.25));
1536 0 : AddToBottom(aStackWindow.get(), Size(nWidth * 0.33, nHeight * 0.25));
1537 0 : }
1538 :
1539 0 : ModulWindowLayout::SyntaxColors::SyntaxColors () :
1540 0 : pEditor(0)
1541 : {
1542 0 : aConfig.AddListener(this);
1543 :
1544 : aColors[TT_UNKNOWN] =
1545 : aColors[TT_WHITESPACE] =
1546 : aColors[TT_EOL] =
1547 0 : Application::GetSettings().GetStyleSettings().GetFieldTextColor();
1548 :
1549 0 : NewConfig(true);
1550 0 : }
1551 :
1552 0 : ModulWindowLayout::SyntaxColors::~SyntaxColors ()
1553 : {
1554 0 : aConfig.RemoveListener(this);
1555 0 : }
1556 :
1557 0 : void ModulWindowLayout::SyntaxColors::SettingsChanged ()
1558 : {
1559 0 : Color const aColor = Application::GetSettings().GetStyleSettings().GetFieldTextColor();
1560 0 : if (aColor != aColors[TT_UNKNOWN])
1561 : {
1562 : aColors[TT_UNKNOWN] =
1563 : aColors[TT_WHITESPACE] =
1564 : aColors[TT_EOL] =
1565 0 : aColor;
1566 0 : if (pEditor)
1567 0 : pEditor->UpdateSyntaxHighlighting();
1568 : }
1569 0 : }
1570 :
1571 : // virtual
1572 0 : void ModulWindowLayout::SyntaxColors::ConfigurationChanged (utl::ConfigurationBroadcaster*, sal_uInt32)
1573 : {
1574 0 : NewConfig(false);
1575 0 : }
1576 :
1577 : // when a new configuration has to be set
1578 0 : void ModulWindowLayout::SyntaxColors::NewConfig (bool bFirst)
1579 : {
1580 : static struct
1581 : {
1582 : TokenTypes eTokenType;
1583 : svtools::ColorConfigEntry eEntry;
1584 : }
1585 : const vIds[] =
1586 : {
1587 : { TT_IDENTIFIER, svtools::BASICIDENTIFIER },
1588 : { TT_NUMBER, svtools::BASICNUMBER },
1589 : { TT_STRING, svtools::BASICSTRING },
1590 : { TT_COMMENT, svtools::BASICCOMMENT },
1591 : { TT_ERROR, svtools::BASICERROR },
1592 : { TT_OPERATOR, svtools::BASICOPERATOR },
1593 : { TT_KEYWORDS, svtools::BASICKEYWORD },
1594 : };
1595 :
1596 0 : bool bChanged = false;
1597 0 : for (unsigned i = 0; i != sizeof vIds / sizeof vIds[0]; ++i)
1598 : {
1599 0 : Color const aColor = aConfig.GetColorValue(vIds[i].eEntry).nColor;
1600 0 : Color& rMyColor = aColors[vIds[i].eTokenType];
1601 0 : if (bFirst || aColor != rMyColor)
1602 : {
1603 0 : rMyColor = aColor;
1604 0 : bChanged = true;
1605 : }
1606 : }
1607 0 : if (bChanged && !bFirst && pEditor)
1608 0 : pEditor->UpdateSyntaxHighlighting();
1609 0 : }
1610 :
1611 :
1612 0 : } // namespace basctl
1613 :
1614 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|