xref: /aoo42x/main/basctl/source/basicide/brkdlg.cxx (revision cdf0e10c)
1*cdf0e10cSrcweir /*************************************************************************
2*cdf0e10cSrcweir  *
3*cdf0e10cSrcweir  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4*cdf0e10cSrcweir  *
5*cdf0e10cSrcweir  * Copyright 2000, 2010 Oracle and/or its affiliates.
6*cdf0e10cSrcweir  *
7*cdf0e10cSrcweir  * OpenOffice.org - a multi-platform office productivity suite
8*cdf0e10cSrcweir  *
9*cdf0e10cSrcweir  * This file is part of OpenOffice.org.
10*cdf0e10cSrcweir  *
11*cdf0e10cSrcweir  * OpenOffice.org is free software: you can redistribute it and/or modify
12*cdf0e10cSrcweir  * it under the terms of the GNU Lesser General Public License version 3
13*cdf0e10cSrcweir  * only, as published by the Free Software Foundation.
14*cdf0e10cSrcweir  *
15*cdf0e10cSrcweir  * OpenOffice.org is distributed in the hope that it will be useful,
16*cdf0e10cSrcweir  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17*cdf0e10cSrcweir  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18*cdf0e10cSrcweir  * GNU Lesser General Public License version 3 for more details
19*cdf0e10cSrcweir  * (a copy is included in the LICENSE file that accompanied this code).
20*cdf0e10cSrcweir  *
21*cdf0e10cSrcweir  * You should have received a copy of the GNU Lesser General Public License
22*cdf0e10cSrcweir  * version 3 along with OpenOffice.org.  If not, see
23*cdf0e10cSrcweir  * <http://www.openoffice.org/license.html>
24*cdf0e10cSrcweir  * for a copy of the LGPLv3 License.
25*cdf0e10cSrcweir  *
26*cdf0e10cSrcweir  ************************************************************************/
27*cdf0e10cSrcweir 
28*cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
29*cdf0e10cSrcweir #include "precompiled_basctl.hxx"
30*cdf0e10cSrcweir 
31*cdf0e10cSrcweir #include <limits>
32*cdf0e10cSrcweir 
33*cdf0e10cSrcweir #include <vcl/sound.hxx>
34*cdf0e10cSrcweir 
35*cdf0e10cSrcweir // #define ITEMID_SEARCH SID_SEARCH_ITEM
36*cdf0e10cSrcweir #define _SVX_NOIDERESIDS
37*cdf0e10cSrcweir #include <brkdlg.hxx>
38*cdf0e10cSrcweir #include <brkdlg.hrc>
39*cdf0e10cSrcweir #include <basidesh.hxx>
40*cdf0e10cSrcweir #include <basidesh.hrc>
41*cdf0e10cSrcweir #include <iderdll.hxx>
42*cdf0e10cSrcweir #include <sfx2/dispatch.hxx>
43*cdf0e10cSrcweir #include <sfx2/viewfrm.hxx>
44*cdf0e10cSrcweir 
45*cdf0e10cSrcweir // FIXME  Why does BreakPointDialog allow only sal_uInt16 for break-point line
46*cdf0e10cSrcweir // numbers, whereas BreakPoint supports sal_uLong?
47*cdf0e10cSrcweir 
48*cdf0e10cSrcweir bool lcl_ParseText( String aText, sal_uInt16& rLineNr )
49*cdf0e10cSrcweir {
50*cdf0e10cSrcweir     // aText should look like "# n" where
51*cdf0e10cSrcweir     // n > 0 && n < std::numeric_limits< sal_uInt16 >::max().
52*cdf0e10cSrcweir     // All spaces are ignored, so there can even be spaces within the
53*cdf0e10cSrcweir     // number n.  (Maybe it would be better to ignore all whitespace instead
54*cdf0e10cSrcweir     // of just spaces.)
55*cdf0e10cSrcweir     aText.EraseAllChars(' ');
56*cdf0e10cSrcweir     sal_Unicode cFirst = aText.GetChar(0);
57*cdf0e10cSrcweir     if (cFirst != '#' && !(cFirst >= '0' && cFirst <= '9'))
58*cdf0e10cSrcweir         return false;
59*cdf0e10cSrcweir     if (cFirst == '#')
60*cdf0e10cSrcweir         aText.Erase(0, 1);
61*cdf0e10cSrcweir     // XXX Assumes that sal_uInt16 is contained within sal_Int32:
62*cdf0e10cSrcweir     sal_Int32 n = aText.ToInt32();
63*cdf0e10cSrcweir     if (n <= 0 || n > std::numeric_limits< sal_uInt16 >::max())
64*cdf0e10cSrcweir         return false;
65*cdf0e10cSrcweir     rLineNr = static_cast< sal_uInt16 >(n);
66*cdf0e10cSrcweir     return true;
67*cdf0e10cSrcweir }
68*cdf0e10cSrcweir 
69*cdf0e10cSrcweir BreakPointDialog::BreakPointDialog( Window* pParent, BreakPointList& rBrkPntList ) :
70*cdf0e10cSrcweir 		ModalDialog( pParent, IDEResId( RID_BASICIDE_BREAKPOINTDLG ) ),
71*cdf0e10cSrcweir 		aComboBox( 		this, IDEResId( RID_CB_BRKPOINTS ) ),
72*cdf0e10cSrcweir 		aOKButton( 		this, IDEResId( RID_PB_OK ) ),
73*cdf0e10cSrcweir 		aCancelButton(	this, IDEResId( RID_PB_CANCEL ) ),
74*cdf0e10cSrcweir 		aNewButton(		this, IDEResId( RID_PB_NEW ) ),
75*cdf0e10cSrcweir 		aDelButton( 	this, IDEResId( RID_PB_DEL ) ),
76*cdf0e10cSrcweir 		aCheckBox( 		this, IDEResId( RID_CHKB_ACTIVE ) ),
77*cdf0e10cSrcweir 		aBrkText( 		this, IDEResId( RID_FT_BRKPOINTS ) ),
78*cdf0e10cSrcweir 		aPassText( 		this, IDEResId( RID_FT_PASS ) ),
79*cdf0e10cSrcweir 		aNumericField( 	this, IDEResId( RID_FLD_PASS ) ),
80*cdf0e10cSrcweir         m_rOriginalBreakPointList(rBrkPntList),
81*cdf0e10cSrcweir         m_aModifiedBreakPointList(rBrkPntList)
82*cdf0e10cSrcweir {
83*cdf0e10cSrcweir 	FreeResource();
84*cdf0e10cSrcweir 
85*cdf0e10cSrcweir 	aComboBox.SetUpdateMode( sal_False );
86*cdf0e10cSrcweir 	BreakPoint* pBrk = m_aModifiedBreakPointList.First();
87*cdf0e10cSrcweir 	BreakPoint* pFirstBrk = pBrk;
88*cdf0e10cSrcweir 	while ( pBrk )
89*cdf0e10cSrcweir 	{
90*cdf0e10cSrcweir 		String aEntryStr( RTL_CONSTASCII_USTRINGPARAM( "# " ) );
91*cdf0e10cSrcweir 		aEntryStr += String::CreateFromInt32( pBrk->nLine );
92*cdf0e10cSrcweir 		aComboBox.InsertEntry( aEntryStr, COMBOBOX_APPEND );
93*cdf0e10cSrcweir 		pBrk = m_aModifiedBreakPointList.Next();
94*cdf0e10cSrcweir 	}
95*cdf0e10cSrcweir 	aComboBox.SetUpdateMode( sal_True );
96*cdf0e10cSrcweir 
97*cdf0e10cSrcweir 	aOKButton.SetClickHdl( LINK( this, BreakPointDialog, ButtonHdl ) );
98*cdf0e10cSrcweir 	aNewButton.SetClickHdl( LINK( this, BreakPointDialog, ButtonHdl ) );
99*cdf0e10cSrcweir 	aDelButton.SetClickHdl( LINK( this, BreakPointDialog, ButtonHdl ) );
100*cdf0e10cSrcweir //	aShowButton.SetClickHdl( LINK( this, BreakPointDialog, ButtonHdl ) );
101*cdf0e10cSrcweir 
102*cdf0e10cSrcweir 	aCheckBox.SetClickHdl( LINK( this, BreakPointDialog, CheckBoxHdl ) );
103*cdf0e10cSrcweir 	aComboBox.SetSelectHdl( LINK( this, BreakPointDialog, ComboBoxHighlightHdl ) );
104*cdf0e10cSrcweir 	aComboBox.SetModifyHdl( LINK( this, BreakPointDialog, EditModifyHdl ) );
105*cdf0e10cSrcweir 	aComboBox.GrabFocus();
106*cdf0e10cSrcweir 
107*cdf0e10cSrcweir 	aNumericField.SetMin( 0 );
108*cdf0e10cSrcweir 	aNumericField.SetMax( 0x7FFFFFFF );
109*cdf0e10cSrcweir 	aNumericField.SetSpinSize( 1 );
110*cdf0e10cSrcweir 	aNumericField.SetStrictFormat( sal_True );
111*cdf0e10cSrcweir 	aNumericField.SetModifyHdl( LINK( this, BreakPointDialog, EditModifyHdl ) );
112*cdf0e10cSrcweir 
113*cdf0e10cSrcweir 	aComboBox.SetText( aComboBox.GetEntry( 0 ) );
114*cdf0e10cSrcweir 	UpdateFields( pFirstBrk );
115*cdf0e10cSrcweir 
116*cdf0e10cSrcweir 	CheckButtons();
117*cdf0e10cSrcweir }
118*cdf0e10cSrcweir 
119*cdf0e10cSrcweir void BreakPointDialog::SetCurrentBreakPoint( BreakPoint* pBrk )
120*cdf0e10cSrcweir {
121*cdf0e10cSrcweir 	String aStr( RTL_CONSTASCII_USTRINGPARAM( "# " ) );
122*cdf0e10cSrcweir 	aStr += String::CreateFromInt32( pBrk->nLine );
123*cdf0e10cSrcweir     aComboBox.SetText( aStr );
124*cdf0e10cSrcweir     UpdateFields( pBrk );
125*cdf0e10cSrcweir }
126*cdf0e10cSrcweir 
127*cdf0e10cSrcweir void BreakPointDialog::CheckButtons()
128*cdf0e10cSrcweir {
129*cdf0e10cSrcweir     // "New" button is enabled if the combo box edit contains a valid line
130*cdf0e10cSrcweir     // number that is not already present in the combo box list; otherwise
131*cdf0e10cSrcweir     // "OK" and "Delete" buttons are enabled:
132*cdf0e10cSrcweir     sal_uInt16 nLine;
133*cdf0e10cSrcweir     if (lcl_ParseText(aComboBox.GetText(), nLine)
134*cdf0e10cSrcweir         && m_aModifiedBreakPointList.FindBreakPoint(nLine) == 0)
135*cdf0e10cSrcweir     {
136*cdf0e10cSrcweir         aNewButton.Enable();
137*cdf0e10cSrcweir         aOKButton.Disable();
138*cdf0e10cSrcweir         aDelButton.Disable();
139*cdf0e10cSrcweir     }
140*cdf0e10cSrcweir     else
141*cdf0e10cSrcweir     {
142*cdf0e10cSrcweir         aNewButton.Disable();
143*cdf0e10cSrcweir         aOKButton.Enable();
144*cdf0e10cSrcweir         aDelButton.Enable();
145*cdf0e10cSrcweir     }
146*cdf0e10cSrcweir }
147*cdf0e10cSrcweir 
148*cdf0e10cSrcweir IMPL_LINK_INLINE_START( BreakPointDialog, CheckBoxHdl, CheckBox *, pChkBx )
149*cdf0e10cSrcweir {
150*cdf0e10cSrcweir 	BreakPoint* pBrk = GetSelectedBreakPoint();
151*cdf0e10cSrcweir 	if ( pBrk )
152*cdf0e10cSrcweir 		pBrk->bEnabled = pChkBx->IsChecked();
153*cdf0e10cSrcweir 
154*cdf0e10cSrcweir 	return 0;
155*cdf0e10cSrcweir }
156*cdf0e10cSrcweir IMPL_LINK_INLINE_END( BreakPointDialog, CheckBoxHdl, CheckBox *, pChkBx )
157*cdf0e10cSrcweir 
158*cdf0e10cSrcweir 
159*cdf0e10cSrcweir 
160*cdf0e10cSrcweir IMPL_LINK( BreakPointDialog, ComboBoxHighlightHdl, ComboBox *, pBox )
161*cdf0e10cSrcweir {
162*cdf0e10cSrcweir 	aNewButton.Disable();
163*cdf0e10cSrcweir 	aOKButton.Enable();
164*cdf0e10cSrcweir 	aDelButton.Enable();
165*cdf0e10cSrcweir 
166*cdf0e10cSrcweir 	sal_uInt16 nEntry = pBox->GetEntryPos( pBox->GetText() );
167*cdf0e10cSrcweir 	BreakPoint* pBrk = m_aModifiedBreakPointList.GetObject( nEntry );
168*cdf0e10cSrcweir 	DBG_ASSERT( pBrk, "Kein passender Breakpoint zur Liste ?" );
169*cdf0e10cSrcweir 	UpdateFields( pBrk );
170*cdf0e10cSrcweir 
171*cdf0e10cSrcweir 	return 0;
172*cdf0e10cSrcweir }
173*cdf0e10cSrcweir 
174*cdf0e10cSrcweir 
175*cdf0e10cSrcweir 
176*cdf0e10cSrcweir IMPL_LINK( BreakPointDialog, EditModifyHdl, Edit *, pEdit )
177*cdf0e10cSrcweir {
178*cdf0e10cSrcweir 	if ( pEdit == &aComboBox )
179*cdf0e10cSrcweir 		CheckButtons();
180*cdf0e10cSrcweir 	else if ( pEdit == &aNumericField )
181*cdf0e10cSrcweir 	{
182*cdf0e10cSrcweir 		BreakPoint* pBrk = GetSelectedBreakPoint();
183*cdf0e10cSrcweir 		if ( pBrk )
184*cdf0e10cSrcweir 			pBrk->nStopAfter = pEdit->GetText().ToInt32();
185*cdf0e10cSrcweir 	}
186*cdf0e10cSrcweir 	return 0;
187*cdf0e10cSrcweir }
188*cdf0e10cSrcweir 
189*cdf0e10cSrcweir 
190*cdf0e10cSrcweir 
191*cdf0e10cSrcweir IMPL_LINK( BreakPointDialog, ButtonHdl, Button *, pButton )
192*cdf0e10cSrcweir {
193*cdf0e10cSrcweir 	if ( pButton == &aOKButton )
194*cdf0e10cSrcweir     {
195*cdf0e10cSrcweir         m_rOriginalBreakPointList.transfer(m_aModifiedBreakPointList);
196*cdf0e10cSrcweir 		EndDialog( 1 );
197*cdf0e10cSrcweir     }
198*cdf0e10cSrcweir 	else if ( pButton == &aNewButton )
199*cdf0e10cSrcweir 	{
200*cdf0e10cSrcweir 		// Checkbox beruecksichtigen!
201*cdf0e10cSrcweir 		String aText( aComboBox.GetText() );
202*cdf0e10cSrcweir 		sal_uInt16 nLine;
203*cdf0e10cSrcweir 		sal_Bool bValid = lcl_ParseText( aText, nLine );
204*cdf0e10cSrcweir 		if ( bValid )
205*cdf0e10cSrcweir 		{
206*cdf0e10cSrcweir 			BreakPoint* pBrk = new BreakPoint( nLine );
207*cdf0e10cSrcweir 			pBrk->bEnabled = aCheckBox.IsChecked();
208*cdf0e10cSrcweir 			pBrk->nStopAfter = (sal_uLong) aNumericField.GetValue();
209*cdf0e10cSrcweir 			m_aModifiedBreakPointList.InsertSorted( pBrk );
210*cdf0e10cSrcweir 			String aEntryStr( RTL_CONSTASCII_USTRINGPARAM( "# " ) );
211*cdf0e10cSrcweir 			aEntryStr += String::CreateFromInt32( pBrk->nLine );
212*cdf0e10cSrcweir 			aComboBox.InsertEntry( aEntryStr, COMBOBOX_APPEND );
213*cdf0e10cSrcweir             BasicIDEShell* pIDEShell = IDE_DLL()->GetShell();
214*cdf0e10cSrcweir             SfxViewFrame* pViewFrame = pIDEShell ? pIDEShell->GetViewFrame() : NULL;
215*cdf0e10cSrcweir 	        SfxDispatcher* pDispatcher = pViewFrame ? pViewFrame->GetDispatcher() : NULL;
216*cdf0e10cSrcweir 			if( pDispatcher )
217*cdf0e10cSrcweir 			{
218*cdf0e10cSrcweir 				pDispatcher->Execute( SID_BASICIDE_BRKPNTSCHANGED );
219*cdf0e10cSrcweir 			}
220*cdf0e10cSrcweir 		}
221*cdf0e10cSrcweir 		else
222*cdf0e10cSrcweir 		{
223*cdf0e10cSrcweir 			aComboBox.SetText( aText );
224*cdf0e10cSrcweir 			aComboBox.GrabFocus();
225*cdf0e10cSrcweir 			Sound::Beep();
226*cdf0e10cSrcweir 		}
227*cdf0e10cSrcweir 		CheckButtons();
228*cdf0e10cSrcweir 	}
229*cdf0e10cSrcweir 	else if ( pButton == &aDelButton )
230*cdf0e10cSrcweir 	{
231*cdf0e10cSrcweir 		sal_uInt16 nEntry = aComboBox.GetEntryPos( aComboBox.GetText() );
232*cdf0e10cSrcweir 		BreakPoint* pBrk = m_aModifiedBreakPointList.GetObject( nEntry );
233*cdf0e10cSrcweir 		if ( pBrk )
234*cdf0e10cSrcweir 		{
235*cdf0e10cSrcweir 			delete m_aModifiedBreakPointList.Remove( pBrk );
236*cdf0e10cSrcweir 			aComboBox.RemoveEntry( nEntry );
237*cdf0e10cSrcweir 			if ( nEntry && !( nEntry < aComboBox.GetEntryCount() ) )
238*cdf0e10cSrcweir 				nEntry--;
239*cdf0e10cSrcweir 			aComboBox.SetText( aComboBox.GetEntry( nEntry ) );
240*cdf0e10cSrcweir             BasicIDEShell* pIDEShell = IDE_DLL()->GetShell();
241*cdf0e10cSrcweir             SfxViewFrame* pViewFrame = pIDEShell ? pIDEShell->GetViewFrame() : NULL;
242*cdf0e10cSrcweir 	        SfxDispatcher* pDispatcher = pViewFrame ? pViewFrame->GetDispatcher() : NULL;
243*cdf0e10cSrcweir 
244*cdf0e10cSrcweir             if( pDispatcher )
245*cdf0e10cSrcweir 			{
246*cdf0e10cSrcweir 				pDispatcher->Execute( SID_BASICIDE_BRKPNTSCHANGED );
247*cdf0e10cSrcweir 			}
248*cdf0e10cSrcweir 		}
249*cdf0e10cSrcweir 		CheckButtons();
250*cdf0e10cSrcweir 	}
251*cdf0e10cSrcweir //	else if ( pButton == &aShowButton )
252*cdf0e10cSrcweir //	{
253*cdf0e10cSrcweir //		;
254*cdf0e10cSrcweir //	}
255*cdf0e10cSrcweir 
256*cdf0e10cSrcweir 	return 0;
257*cdf0e10cSrcweir }
258*cdf0e10cSrcweir 
259*cdf0e10cSrcweir 
260*cdf0e10cSrcweir 
261*cdf0e10cSrcweir void BreakPointDialog::UpdateFields( BreakPoint* pBrk )
262*cdf0e10cSrcweir {
263*cdf0e10cSrcweir 	if ( pBrk )
264*cdf0e10cSrcweir 	{
265*cdf0e10cSrcweir 		aCheckBox.Check( pBrk->bEnabled );
266*cdf0e10cSrcweir 		aNumericField.SetValue( pBrk->nStopAfter );
267*cdf0e10cSrcweir 	}
268*cdf0e10cSrcweir }
269*cdf0e10cSrcweir 
270*cdf0e10cSrcweir 
271*cdf0e10cSrcweir 
272*cdf0e10cSrcweir BreakPoint* BreakPointDialog::GetSelectedBreakPoint()
273*cdf0e10cSrcweir {
274*cdf0e10cSrcweir 	sal_uInt16 nEntry = aComboBox.GetEntryPos( aComboBox.GetText() );
275*cdf0e10cSrcweir 	BreakPoint* pBrk = m_aModifiedBreakPointList.GetObject( nEntry );
276*cdf0e10cSrcweir 	return pBrk;
277*cdf0e10cSrcweir }
278*cdf0e10cSrcweir 
279*cdf0e10cSrcweir 
280*cdf0e10cSrcweir 
281