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