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