/************************************************************************** * * @@@BUILDINFO@@@ 22breakpoints-2.jsx 2.0.1.65 24-April-2007 * Copyright 2006-2007 Adobe Systems Incorporated * All Rights Reserved. * * NOTICE: All information contained herein is, and remains the property of * Adobe Systems Incorporated and its suppliers, if any. The intellectual * and technical concepts contained herein are proprietary to Adobe Systems * Incorporated and its suppliers and may be covered by U.S. and Foreign * Patents,patents in process,and are protected by trade secret or copyright * law. Dissemination of this information or reproduction of this material * is strictly forbidden unless prior written permission is obtained from * Adobe Systems Incorporated. **************************************************************************/ breakpoints = null; /* Breakpoints are kept as XML. This XML has the same format as the XML understood by the ESTK debugging backend in the target: [cond] ... - engine is the target engine. - flags are the debug flags (especially 1024 - don't stop on guarded exceptions). - enabled is true or false, and optional (default: true). - hits is the hit count. - count is the real hit count. If not supplied when setting (or < 0), keep the real hit count. - cond is the optional condition. Just send this table over to the target to set breakpoints. No response is expected. When getting breakpoints, use a body of . The returned data is again the same list as above. There is no way to detect invalid breakpoints. */ //----------------------------------------------------------------------------- // // app.createBreakpoints(...) // // Purpose: Create and setup breakpoints palette // //----------------------------------------------------------------------------- app.createBreakpoints = function (where) { // // create breakpoints palette window // breakpoints = new Window( "dockpalette { \ text:'$$$/ESToolkit/Panes/Breakpoints/Title=Breakpoints', \ properties: { \ name:'breakpoints', \ defaultVisibility : true, \ flyoutmenu: true, \ icon : '#PBreakpoints_N', \ rollover : '#PBreakpoints_R'," + where + "}, \ preferredSize: [100, 100], \ margins : 2, \ spacing : 2, \ list: ListBox { \ preferredSize: [10, 20], \ alignment: ['fill', 'fill' ] } \ infogrp : Group \ { \ orientation : 'row', \ margins : 0, \ spacing : 0, \ alignment : ['fill','bottom'], \ targetField: EditText \ { \ properties : { readonly: true }, \ alignment : ['fill','bottom'], \ characters : 40 \ }, \ sizeBoxSpacer : Group \ { \ alignment : ['right','bottom'], \ preferredSize : [14,1] \ } \ } \ }"); breakpoints.id = "breakpoints"; breakpoints.menuText = localize ("$$$/ESToolkit/Menu/Window/Breakpoints/Title=&Breakpoints"); breakpoints.onNotify = function( reason ) { switch( reason ) { case 'shutdown': this.list.removeAll(); globalBroadcaster.unregisterClient( this ); break; case 'activeDocChanged': { this.update(); if( document ) this.infogrp.targetField.textselection = document.paneTitle; else this.infogrp.targetField.text = ''; } break; } } globalBroadcaster.registerClient( breakpoints ); targetMgr.registerClient( breakpoints ); // Double click handler breakpoints.list.onDoubleClick = function() { if (this.selection) breakpoints.breakpointDialog (this.selection.breakpoint, false); } // // add flyout menu // var itemAdd = new MenuElement( 'command', '$$$/ESToolkit/Panes/Breakpoints/Flyout/Add=Add', "at the end of breakpoints/flyout", "breakpoints/flyout/add" ); var itemMod = new MenuElement( 'command', '$$$/ESToolkit/Panes/Breakpoints/Flyout/Modify=Modify', "at the end of breakpoints/flyout", "breakpoints/flyout/modify" ); var itemRem = new MenuElement( 'command', '$$$/ESToolkit/Panes/Breakpoints/Flyout/Remove=Remove', "at the end of breakpoints/flyout", "breakpoints/flyout/remove" ); // // show palette // breakpoints.show(); panes.push (breakpoints); /////////////////////////////////////////////////////////////////////////////// // // methods // //----------------------------------------------------------------------------- // // itemMod.onDisplay(...) // itemRem.onDisplay(...) // // Purpose: Enabled state of flyout menu items // //----------------------------------------------------------------------------- itemMod.onDisplay = itemRem.onDisplay = function() { this.enabled = ( breakpoints.list.selection != null && breakpoints.enabled ); } itemAdd.onDisplay = function() { this.enabled = breakpoints.enabled; } //----------------------------------------------------------------------------- // // itemAdd.onSelect(...) // itemMod.onSelect(...) // // Purpose: Flyout menu item add/modify clicked // //----------------------------------------------------------------------------- itemAdd.onSelect = itemMod.onSelect = function() { if( document ) { var bp = null; var add = false; if( this == itemMod && breakpoints.list.selection != null ) bp = breakpoints.list.selection.breakpoint; else add = true, bp = new XML( '' ); breakpoints.breakpointDialog (bp, add); } } //----------------------------------------------------------------------------- // // itemRem.onSelect(...) // // Purpose: Flyout menu item remove clicked. // //----------------------------------------------------------------------------- itemRem.onSelect = function() { if( breakpoints.list.selection != null && document ) { var selIndex = breakpoints.list.selection.index; var line = parseInt( breakpoints.list.selection.breakpoint.@line ) - 1; if( isNaN( line ) ) line = 0; document.removeBreakpoint( line ); targetMgr.sendBreakpoints(); breakpoints.update(); if( breakpoints.list.items.length > selIndex ) breakpoints.list.selection = selIndex; else breakpoints.list.selection = null; } } //----------------------------------------------------------------------------- // // breakpoints.onResize(...) // breakpoints.onResizing(...) // // Purpose: Palette resizing/resized // //----------------------------------------------------------------------------- breakpoints.onResize = breakpoints.onResizing = function () { this.layout.resize(); } //----------------------------------------------------------------------------- // // breakpoints.breakpointDialog(...) // // Purpose: Create and execute breakpoint dialog // //----------------------------------------------------------------------------- breakpoints.breakpointDialog = function( bp, add ) { if (!document) return; var title = '$$$/ESToolkit/Dialogs/Breakpoint/Title=Add Breakpoint'; // var title = add ? '$$$/ESToolkit/Dialogs/Breakpoint/Title=Add Breakpoint' // : '$$$/ESToolkit/Dialogs/Breakpoint/TitleModify=Modify Breakpoint'; var dlg = new Window( "prefdialog { \ text : '" + title + "', \ properties : \ { \ name : 'breakpoint' \ }, \ \ groupAll : Group \ { \ orientation : 'column', \ alignChildren : 'right', \ \ groupLine : Group \ { \ orientation : 'row', \ \ staticLine : StaticText \ { \ text : '$$$/ESToolkit/Dialogs/Breakpoint/Line=Line:' \ }, \ \ editLine : EditText \ { \ preferredSize : [60, 20], \ helpTip : '$$$/ESToolkit/Dialogs/Breakpoint/htLine=The line number in the source code for the breakpoint.' \ }, \ \ checkActive : Checkbox \ { \ text : '$$$/ESToolkit/Dialogs/Breakpoint/Checkbox=Active', \ preferredSize : [230, 20], \ helpTip : '$$$/ESToolkit/Dialogs/Breakpoint/htActive=Check this box to activate the breakpoint.' \ } \ }, \ \ groupCond : Group \ { \ orientation : 'row', \ \ staticCond : StaticText \ { \ text : '$$$/ESToolkit/Dialogs/Breakpoint/Condition=Condition:' \ }, \ \ editCond : EditText \ { \ preferredSize : [300, 40], \ multiline: true, \ helpTip : '$$$/ESToolkit/Dialogs/Breakpoint/htCondition=Condition when the breakpoint should be hit.' \ } \ }, \ \ groupHit : Group \ { \ orientation : 'row', \ \ staticCond : StaticText \ { \ text : '$$$/ESToolkit/Dialogs/Breakpoint/HitCount=Hit count:' \ }, \ \ editHit : EditText \ { \ text : '1', \ preferredSize : [50, 20] \ } \ }, \ \ groupButtons : Group \ { \ orientation : 'row', \ \ buttonRemove : Button \ { \ text : '$$$/ESToolkit/Dialogs/Breakpoint/buttonRemove=Remove', \ visible : " + ( bp.line > -1 ? "true" : "false" ) + " \ }, \ \ okBtn : Button \ { \ text : '$$$/CT/ExtendScript/UI/OK=&OK', \ properties : { \ name :'ok' \ } \ }, \ cancelBtn : Button \ { \ text : '$$$/CT/ExtendScript/UI/Cancel=&Cancel', \ properties : { \ name : 'cancel' \ } \ } \ } \ } \ } " ); dlg.buttonOK = dlg.groupAll.groupButtons.okBtn; dlg.buttonRemove = dlg.groupAll.groupButtons.buttonRemove; dlg.editCond = dlg.groupAll.groupCond.editCond; dlg.editLine = dlg.groupAll.groupLine.editLine; dlg.checkActive = dlg.groupAll.groupLine.checkActive; dlg.editHit = dlg.groupAll.groupHit.editHit; // save the document (Mac loses the document during a modal dialog) dlg.document = document; // // handle buttons // dlg.buttonOK.onClick = function() { var result = app.checkSyntax( dlg.editCond.text ); if (result.error) { errorBox (result.error); dlg.editCond.active = true; return; } result = Number (dlg.editLine.text); if (isNaN (result) || result < 1 || result > dlg.document.lines.length) { app.beep(); dlg.editLine.active = true; return; } dlg.close(1); } dlg.buttonRemove.onClick = function() { var line = Number (dlg.editLine.text); if (isNaN (line) || line < 1 || line > dlg.document.lines.length) { app.beep(); dlg.editLine.active = true; return; } dlg.document.removeBreakpoint( line-1 ); targetMgr.sendBreakpoints(); breakpoints.update(); dlg.close(0); } // // fill controls with existing values // var line = parseInt( bp.@line ); var hits = parseInt( bp.@hits ); var enabled = ( bp.@enabled == 'true' ? true : false ); if( isNaN( line ) ) line = 1; if( isNaN( hits ) ) hits = 0; dlg.editLine.text = line; dlg.editCond.text = bp.toString(); dlg.checkActive.value = enabled; dlg.editHit.text = hits; // // display dialog // dlg.center(); var ret = ( dlg.show() == 1 && dlg.editLine.text.length > 0 ); // // switch focus back to the document // dlg.document.active = true; // // get values from dialog if closed with ok // if( ret ) { bp.@line = parseInt( dlg.editLine.text ); bp.setChildren( dlg.editCond.text ); bp.@enabled = dlg.checkActive.value; bp.@hits = parseInt( dlg.editHit.text ); var newLine = parseInt( bp.@line ) - 1; var newHits = parseInt( bp.@hits ); var newEnabled = ( bp.@enabled == 'true' ? 1 : 0 ); if( isNaN( newLine ) || newLine < 0 ) newLine = 0, bp.@line = 1; if( isNaN( newHits ) ) newHits = 0, bp.@hits = 0; if( !add && line-1 != newLine ) document.removeBreakpoint( line-1 ); document.setBreakpoint( newLine, newEnabled, newHits, bp.toString(), 0 ); targetMgr.sendBreakpoints(); breakpoints.update(); } return ret; } //----------------------------------------------------------------------------- // // breakpoints.update(...) // // Purpose: Update breakpoints list in palette // //----------------------------------------------------------------------------- breakpoints.update = function() { if( document ) { /* pwollek 02/04/2007 We wanna show the breakpoints of the current document, not of the related target/engine! var targetName = document.getCurrentTargetName(); var engineName = document.getCurrentEngineName(); if( targetMgr.getConnected( targetName, true ) ) this.updateFromTarget( targetName, engineName ); else */ this.updateFromDoc( document ); } else this.list.removeAll(); } breakpoints.updateFromTarget = function( targetName, engineName ) { var bt = BridgeTalk.create( targetName ); bt.body = ''; bt.pane = this; bt.onOwnError = function (bt) { if( document ) this.pane.updateFromDoc( document ); } bt.onOwnResult = function (bt) { var bps = new XML( bt.body ); if( bps.child(0).toXMLString().length > 0 ) this.pane.doUpdate( bps ); else if( document ) this.pane.updateFromDoc( document ); } bt.safeSend(); } breakpoints.updateFromDoc = function( doc ) { if( doc ) this.doUpdate( doc.getAllBreakpoints() ); } breakpoints.doUpdate = function( breakpoints ) { this.list.removeAll(); if( breakpoints ) { var bp = null; var i = 0; do { bp = breakpoints.child(i); i++; if( bp.toXMLString().length > 0 ) { var cond = bp.toString(); var hitcount = parseInt( bp.@hits ); var text = localize( '$$$/ESToolkit/Panes/Breakpoints/Line=Line' ) + ' ' + ( parseInt( bp.@line ) ); if( cond.length > 0 ) text += ' ' + localize( '$$$/ESToolkit/Panes/Breakpoints/Cond=when' ) + ' ' + cond; if( !isNaN( hitcount ) && hitcount > 1 ) { if( cond.length > 0 ) text += ' ,'; text += ' '; text += localize( '$$$/ESToolkit/Panes/Breakpoints/hitcount=Hitcount' ) + ' == ' + hitcount; text += ' (' + localize( '$$$/ESToolkit/Panes/Breakpoints/cHitcount=Current' ) + ' == ' + bp.@count + ' )'; } var item = this.list.add( 'item', text ); item.breakpoint = bp; var enabled = ( item.breakpoint.@enabled == 'true' ? true : false ); if( cond.length ) item.icon = ( enabled ? '#BreakpointEnabledCond' : '#BreakpointDisabledCond' ); else item.icon = ( enabled ? '#BreakpointEnabled' : '#BreakpointDisabled' ); } } while( bp.toXMLString().length > 0 ) } } }