From VisualWorks®, 7.6 of February 8, 2008 on March 3, 2008 at 9:44:05 pm (Dialog confirm: 'You are filing-in a Parcel source file!\\While this is possible it will not have\the same effect as loading the parcel.\None of the Parcel''s prerequisites will\be loaded and none of its load actions\will be performed.\\Are you sure you want to file-in?' withCRs) ifFalse: [self error: 'Parcel file-in abandoned. Choose terminate or close.'] <class> <name>ServerContextPatternSpec</name> <environment>CraftedSmalltalk</environment> <super>Core.Object</super> <private>false</private> none pattern name <imports></imports> <category>Tools-Programming</category> <attributes> <package>Debugger-UI</package> </attributes> </class> <comment> CraftedSmalltalk.ServerContextPatternSpec
ServerContextPatternSpec is a support class used by the ContextListPolicy Instance Variables: name <String> The name of the pattern pattern <String | RxMatcher> The pattern used to match a context printString
</comment> <class> <name>DebugProbeInserter</name> <environment>CraftedSmalltalk</environment> <super>Core.Object</super> <private>false</private> none probedMethod contextHomeMethod origPermMethod probeSpec homeContext probeRecord probe tempMethod tempProbe debugger exitBlock addToTempMethods <imports></imports> <category>CraftedSt-Dbgr support</category> <attributes> <package>Debugger-UI</package> </attributes> </class> <comment> CraftedSmalltalk.DebugProbeInserter
This DebugProbeInserter is used by the debugger to insert a probe into a method. It used to be a single method in the debugger but allowing the insertion operation to be restarted would have made the method too messy. This occurs if the inserter determines that the method needs to be converted to a full block method and the context has not been stepped, i.e. it is at the beginning of the method. Because we can insert temporary probes into the compiled method residing in the method dictionary, we must provide a temporary method (unbound). Furthermore, permanent probes must appear in the temporary method and permanent method so when the user modifies the probe, the change is reflected in both places. However, the probe cannot be identical be cause it may not occupy the same pc position in each method. To accomplish this, each permanent probe in a temporary method is a ProbeClone of the probe in the permanent method. Instance Variables: addToTempMethods <Boolean> This variable indicates that the temp method must be added to the debugger's temp methods, i.e. it is a new temp method. debugger <DebuggerService> The debugger. exitBlock <BlockClosure> This block is used to provide a non-local return so an immediate exit from the probe insertion operation can be done from any method. homeContext <MethodContext> The home context of the selected method. origPermMethod <CompiledMethod | ProbedCompiledMethod> This is the method in the method dictionary before the probe is inserted. probe <CodeProbe> The probe inserted into the probedMethod. probedMethod <ProbedCompiledMethod> This method will have a probe inserted, and then it will be put into the method dictionary if the probe is a permanent probe. probeRecord <ProbeRecord> probeSpec <ProbeSpec> tempMethod <ProbedCompiledMethod> This method will have a probe inserted, but it will exist only until the home context exits. tempProbe <CodeProbe> The probe inserted into the tempMethod.
</comment> <class> <name>ClientContextPatternSpec</name> <environment>CraftedSmalltalk</environment> <super>CraftedSmalltalk.ServerContextPatternSpec</super> <private>false</private> none color <imports></imports> <category>Tools-Programming</category> <attributes> <package>Debugger-UI</package> </attributes> </class> <comment> CraftedSmalltalk.ClientContextPatternSpec
ClientContextPatternSpec contains the pattern matching information used to filter and color the debugger context list. Instance Variables: name <String | Text> The name of the pattern pattern <String> The pattern used to match a context printString color <ColorValue> The emphasis color for the context items that match the pattern.
</comment> <class> <name>RestartSignal</name> <environment>CraftedSmalltalk</environment> <super>Core.Notification</super> <private>false</private> none <imports></imports> <category>CraftedSt-Dbgr support</category> <attributes> <package>Debugger-UI</package> </attributes> </class> <comment> CraftedSmalltalk.RestartSignal
The RestartSignal is used by the DebugProbeInserter. Raising this signal causes a probe insertion operation to be restarted. This happens if the selected method was changed to a full block method.
</comment> <class> <name>StepIntoBlockNotification</name> <environment>CraftedSmalltalk</environment> <super>Core.ControlInterrupt</super> <private>false</private> none <imports></imports> <category>CraftedSt-Dbgr support</category> <attributes> <package>Debugger-UI</package> </attributes> </class> <comment> CraftedSmalltalk.StepIntoBlockNotification
The StepIntoBlockNotification is used by the debugger when stepping into a block, see the class references for the actual usage.
</comment> <class> <name>DebugTempProbeInserter</name> <environment>CraftedSmalltalk</environment> <super>CraftedSmalltalk.DebugProbeInserter</super> <private>false</private> none <imports></imports> <category>CraftedSt-Dbgr support</category> <attributes> <package>Debugger-UI</package> </attributes> </class> <comment> CraftedSmalltalk.DebugTempProbeInserter
DebugTempProbeInserter is used to insert temp probes into a method. Temp probes are only available in the debugger.
</comment> <class> <name>ContextListPolicyEditor</name> <environment>CraftedSmalltalk</environment> <super>UI.ApplicationModel</super> <private>false</private> none patternList matchSelector conversionSelector selection colorHolder displayAllLimit buffer undoBuffer <imports></imports> <category>Tools-Programming</category> <attributes> <package>Debugger-UI</package> </attributes> </class> <comment> CraftedSmalltalk.ContextListPolicyEditor
ContextListPolicyEditor is used to manage the context filter patterns. A description of the operation of the editor is found on the editor help page. Instance Variables: buffer <ClientContextPatternSpec> Copy/Paste buffer used to copy and paste pattern specs. colorHolder <PluggableAdaptor on: "selection"> Used to pass the color to/from the ColorSelectionDialog. conversionSelector <ValueHolder on: ByteSymbol> The selector used to convert pattern strings. displayAllLimit <ValueHolder on: Integer> The size of the unfiltered stack. matchSelector <ValueHolder on: ByteSymbol> The selector used to match patterns. patternList <SelectionInList> A list of context pattern specs selection <ValueHolder on: ClientContextPatterSpec> The currently selected context pattern spec undoBuffer <IdentityDictionary> Used to undo operations
</comment> <class> <name>ContextListPolicy</name> <environment>CraftedSmalltalk</environment> <super>Core.Object</super> <private>false</private> none debugger stackLimit stack filteredStack displayAllLimit patterns conversionSymbol matchSymbol <imports></imports> <category>Tools-Programming</category> <attributes> <package>Debugger-UI</package> </attributes> </class> <comment> CraftedSmalltalk.ContextListPolicy
The ContextListPolicy performs filtering and emphasis mapping for a process stack. To fully understand what it does you should first read the help page of the ContextListPolicyEditor. Instance Variables: conversionSymbol <ByteSymbol> Message sent to a pattern string that produces a pattern object. VW patterns use #yourself, regex uses #asRegex. debugger <DebuggerService> The debugger that uses this policy. displayAllLimit <Integer> The number of contexts at the top of the stack that are not subject to filtering. filteredStack <(Collection of: Array)> The filtered stack is a collection of arrays. Each array contains; Element 1 A context printString. Element 2 The unfiltered index of the context. Element 3 The name of the emphasis that should be applied to the context printString. matchSymbol <ByteSymbol> Message sent to a pattern used to match a context printString. VW patterns use #match:, regex uses #matches: patterns <(Collection of: ServerContextPatternSpec)> The patterns used to filter the context stack. stack <(SequenceableCollection of: Context)> The unfiltered context stack. stackLimit <Integer> Max depth of the viewable context stack.
</comment> <class> <name>ContextDumpPolicy</name> <environment>CraftedSmalltalk</environment> <super>Core.Object</super> <private>false</private> none stack stream numberToDump errorMessage <imports></imports> <category>Tools-Programming</category> <attributes> <package>Debugger-UI</package> </attributes> </class> <comment> CraftedSmalltalk.ContextDumpPolicy
The ContextDumpPolicy provides different formats of a stack dump, see the 'printing' protocol. Instance Variables: errorMessage <String | UserMessage> The error message. numberToDump <Integer> Maximum stack depth to dump stack <(Array of: Context)> The context stack to dump. stream <WriteStream | FileStream> The output write stream used to create the dump.
</comment> <class> <name>DebuggerClient</name> <environment>CraftedSmalltalk</environment> <super>UI.ApplicationModel</super> <private>false</private> none service contextIndex busy text parsedSource parseTree stackList stackEmphases enableStackFiltering shortClassNames closeAction terminated menuHolder <imports> Refactory.Browser.BrowserEnvironment Refactory.Browser.RefactoringBrowser Refactory.Browser.RBParser </imports> <category>Tools-Programming</category> <attributes> <package>Debugger-UI</package> </attributes> </class> <comment> CraftedSmalltalk.DebuggerClient
The client portion of the debugger. The debugger is composed of two primary components, a DebuggerClient, and a DebuggerService. The two execute in separate processes, which facilitates remote debugging and allows the client to receive input events while the service is performing an operation. Keeping the client active while performing a debug operation enables it to abort a hung operation. Instance Variables: busy <Boolean> Indicates if the client is waiting for the service to complete an operation. closeAction <ByteSymbol> The action the debugger service is to perform upon closure of the debug window. This is needed because of the way responsibilities are divided between the client and the service and that they execute in different processes. contextIndex <Integer> The index in the context list of the currently selected context. enableStackFiltering <Boolean> Specifies if stack filtering is enabled. parsedSource <String or Text> The source code of the selected context. Used for rb compatibility parseTree <RBProgramNode> Used for rb compatibility service <DebuggerService> shortClassNames <Boolean> Specifies if short class names should be used in the context list. stackEmphases <Dictionary> Emphases used to color the context stack elements. stackList <SelectionInList> The context list. terminated <Boolean> Indicates if the process being debugged has terminated. text <ValueModel> The value holder used to hold the text of the debugger text pane.
</comment> <name>MaxSelectorSubMenuEntries</name> <environment>CraftedSmalltalk.DebuggerClient</environment> <private>false</private> <constant>false</constant> <category>settings</category> <initializer>30</initializer> <attributes> <package>Debugger-UI</package> </attributes> <name>PlaceToolbarBelowContexts</name> <environment>CraftedSmalltalk.DebuggerClient</environment> <private>false</private> <constant>false</constant> <category>settings</category> <initializer>false</initializer> <attributes> <package>Debugger-UI</package> </attributes> <name>MaxMenuEntryWidth</name> <environment>CraftedSmalltalk.DebuggerClient</environment> <private>false</private> <constant>false</constant> <category>settings</category> <initializer>50</initializer> <attributes> <package>Debugger-UI</package> </attributes> <name>ConversionSelector</name> <environment>CraftedSmalltalk.ContextListPolicyEditor</environment> <private>false</private> <constant>false</constant> <category>variables</category> <initializer>#yourself</initializer> <attributes> <package>Debugger-UI</package> </attributes> <name>HelpText</name> <environment>CraftedSmalltalk.ContextListPolicyEditor</environment> <private>false</private> <constant>false</constant> <category>variables</category> <initializer>(Text string: 'The ContextListPolicyEditor is used to create and modify the context list policy. To understand how this editor works it one should first understand how the context list policy works. Context list policy The basic concept is that the context list policy matches each context against a sequence of patterns. If a pattern match is found, the context is displayed in the color associated with the pattern. If no match is found then the context is filtered from the list. If there is more than one pattern that will match, it is the first one in the list that is used. More specifically however, the filtering process begins after the number of contexts specified by "Display all limit" have been collected. This means that the most recent message sends will always be displayed. If a context is before the Display All Limit and is not matched, it will be displayed in the normal default color for text. When matching a context the policy creates a string to represent the context using the following template: $P$package or parcel name$C$class name$S$selector For example, if you want to display every message send in one of the Collection packages the pattern would be. $P$*Collections* The "class name" is the absolute class name so it contains the namespace path from Smalltalk. In addition the policy has hooks to allow a pattern matcher other than the VW builtin string patterns to be used. This is done by specifying the "Conversion selector" and the "Match selector". For example, if the Regex11 parcel is loaded the "Conversion selector" would be #asRegex and the "Match selector" would be #matches:. A useful setup that would display all contexts but emphasize the more interesting ones would be; MyStuff - *$C$MyNamespace.* - ColorValue red AllElse - * - ColorValue darkGray ContextListPolicyEditor Patterns This is the list of patterns. Each pattern has a name which is used for two purposes. First, for the user to identify the pattern. Second, this is associates the pattern to its color. If there is more than one pattern with the same name then the contexts that match these patterns will be displayed using the color of the last duplicate name in the list. Reordering The list can be reordered by simply dragging the list item to the desired location. Menu commands New - This command will create a new pattern and insert it after the selected pattern. If no pattern is selected then it will be inserted at the beginning of the list. Remove - Removes the selected pattern from the list. Undo - This command will undo last command performed on the selected pattern. There is no limit to the undo buffer. Copy - This command makes a copy of the selected pattern in a buffer. Paste -This command will insert a copy of buffer after the selected pattern. Buttons and fields New See Menu commands - New. Remove See Menu commands - Remove. Name Entry field for the pattern name Pick color Opens a color picker for changing the color of the selected pattern. Pattern string The actual pattern string. Match selector This field specifies the selector to be sent to the converted string for matching. Conversion selector This field specifies the selector to send to the pattern string to compile into a pattern object. This is needed for regex patterns. Display all limit This field specifies the limit where all contexts are displayed.' runs: (Core.RunArray runs: #(186 19 816 22 3 10 3 8 440 7 287 23 10 361 10 87 14 1 3 167 6 48 4 114 4 67 5 73 18 2 3 28 6 31 4 36 10 73 14 30 14 86 19 137 17 66) values: #(nil #bold nil #italic nil #italic nil #italic nil #bold nil #bold #underline nil #underline nil #italic nil #(#underline #italic) nil #(#underline #italic) nil #(#underline #italic) nil #(#underline #italic) nil #(#underline #italic) nil #italic nil #underline nil #underline nil #underline nil #underline nil #underline nil #underline nil #underline nil #underline nil))) asValue</initializer> <attributes> <package>Debugger-UI</package> </attributes> <name>MatchSelector</name> <environment>CraftedSmalltalk.ContextListPolicyEditor</environment> <private>false</private> <constant>false</constant> <category>variables</category> <initializer>#match:</initializer> <attributes> <package>Debugger-UI</package> </attributes> <name>DisplayAllLimit</name> <environment>CraftedSmalltalk.ContextListPolicyEditor</environment> <private>false</private> <constant>false</constant> <category>variables</category> <initializer>5</initializer> <attributes> <package>Debugger-UI</package> </attributes> <name>Patterns</name> <environment>CraftedSmalltalk.ContextListPolicyEditor</environment> <private>false</private> <constant>false</constant> <category>variables</category> <initializer>Array new.</initializer> <attributes> <package>Debugger-UI</package> </attributes> <methods> CraftedSmalltalk.ServerContextPatternSpec <category>initialize-release</category>
initialize name := ''. pattern := ''
</methods> <methods> CraftedSmalltalk.ServerContextPatternSpec <category>accessing</category>
name ^name
name: aString name := aString
pattern ^pattern
pattern: aString pattern := aString
</methods> <methods> CraftedSmalltalk.ServerContextPatternSpec class <category>instance creation</category>
new ^super new initialize
</methods> <methods> CraftedSmalltalk.DebugProbeInserter <category>inserting</category>
addProbe: aProbeSpec using: aProbeRecord for: aDebugger debugger := aDebugger. probeSpec := aProbeSpec. probeRecord := aProbeRecord. exitBlock := [:str | ^false -> str]. "non-local exit" [self basicAddProbe] on: RestartSignal do: [:ex | ex restart]. ^true -> probe
</methods> <methods> CraftedSmalltalk.DebugProbeInserter <category>private</category>
basicAddProbe self verifyTextUnchanged. self getAndVerifyHomeContext. self initializeMethods. self getProbeRecord. self verifyProbeSpec. self verifyFullBlocks. self makeProbe. self insertProbeAndFixContext. self installProbedMethod.
findMapIndexFor: aPC inMap: aMap "This method does a binary search to find the index of a map entry corresponding to aPC." | index low high | low := 1. high := aMap size. [index := high + low // 2. low > high] whileFalse: [((aMap at: index) key < aPC) ifTrue: [low := index + 1] ifFalse: [high := index - 1]]. [(aMap at: low) key > aPC] whileTrue: [low := low - 1]. (aMap at: low) key = aPC ifFalse: [low := low + 1]. ^low
flushMethodCacheFor: methods " | meth | meth := methods detect: [:m | true]. meth isNil ifTrue: [^self]. meth := meth homeMethod. meth mclass flushVMmethodCacheEntriesFor: meth selector. ObjectMemory compactingGC " methods do: [:m | m flushCachedVMCode].
getAndVerifyHomeContext homeContext := debugger context home. homeContext notNil ifTrue: [^self]. (probeSpec isNil or: [probeSpec isPermanent not]) ifTrue: [self changeClassTo: DebugTempProbeInserter. ^RestartSignal raise]. exitBlock value: (#PermProbeCannonBeInserted << #pdp >> ' A permanent probe cannot be inserted. All block closures from the current context to the home method must be full closures. You can either insert a temporary probe or use the "make full blocks" command on the edit menu.').
getProbeRecord | insertionRange | insertionRange := probeRecord isNil ifTrue: [debugger selectionRange] ifFalse: [probeRecord insertionRange]. probeRecord := tempMethod probeRecordFor: insertionRange.
initializeMethods tempMethod := debugger tempMethods at: homeContext ifAbsent: []. contextHomeMethod := homeContext method. origPermMethod := tempMethod isNil ifTrue: [contextHomeMethod] ifFalse: [tempMethod permanentMethod]. origPermMethod isProbeable ifFalse: [exitBlock value: (#CannotInsertProbeIntoThisMethodType << #pdp >> 'Sorry, probes cannot be inserted into this method type.')]. (addToTempMethods := tempMethod isNil) ifTrue: [tempMethod := contextHomeMethod newTempProbedMethod]. contextHomeMethod isPartiallyBound ifFalse: [self changeClassTo: DebugTempProbeInserter]
insertProbeAndFixContext | oldPCMap | "Preserve a copy of the pc map before inserting the probe. The difference between the old map and the map after the probe is inserted will be used to adjust the context pc." oldPCMap := (tempMethod sourceMapAt: probeRecord blockMethodIndex) dcopy. [tempMethod addProbe: tempProbe] on: BranchLimit do: [:ex | exitBlock value: (#CannotInsertProbeBranchLimitExceeded << #pdp >> 'The probe could not be entered because a branch limit in the method was exceeded.').]. addToTempMethods ifTrue: [debugger tempMethods at: homeContext put: tempMethod]. self adjustDynamicsReplacing: origPermMethod with: tempMethod from: probeRecord blockMethodIndex atPC: probeRecord insertionPC addProbe: true originalPCMap: oldPCMap.
installProbedMethod | topView mclass | mclass := tempMethod mclass. (probe isKindOf: DisplayProbe) | probeSpec isConditional ifFalse: [probe finishSetup. probeSpec isPermanent ifTrue: [mclass addSelector: debugger selector withMethod: probedMethod]. ^self]. topView := probe createEditorOn: probedMethod. topView model closeAction: [probeSpec isPermanent ifTrue: [mclass addSelector: debugger selector withMethod: probedMethod]]. topView open. ^self
makeFullBlocks | stack ctx | "We can make a full method because we know that no messages have been sent. That also means we can copy the stack and replace it after the method has been recreated. We do this for insurance, just in case the user manually put something on the stack and then inserted a probe. However, we do not copy a block closure because its method is changed to a ProbedCompiledBlock." ctx := debugger context. stack := Array new: ctx stackP. 1 to: stack size do: [:i | stack at: i put: (ctx localAt: i)]. debugger basicMakeFullMethod. ctx := debugger context. 1 to: stack size do: [:i | | obj | ((obj := stack at: i) isKindOf: BlockClosure) ifFalse: [ctx localAt: i put: obj]]. RestartSignal raiseSignal.
makeProbe probe := debugger makeProbeTyped: probeSpec probeClass using: probeRecord at: nil method: tempMethod. probe isNil ifTrue: [exitBlock value: nil]. "exit if no probe" probeSpec isConditional ifTrue: [probe setNoAction] ifFalse: [probe setAction]. probeSpec isAutoProbe ifTrue: [probe setAlwaysAction]. "If a permanent probe is being inserted we must create a new method to put into the method dictionary." probeSpec isPermanent ifTrue: [probedMethod := (tempMethod mclass compiledMethodAt: debugger selector) newFullProbedMethod. "A new record must be obtained because there may be more probes in the temp method than in the perm method which would result in different insertion pcs." probe record: (probedMethod probeRecordFor: probeRecord insertionRange). probedMethod addProbe: probe. tempProbe := ProbeClone parent: probe. "Set the temp probe's record back to the record from the temp method." tempProbe record: probeRecord] ifFalse: [probe setTemporary. tempProbe := probe. probedMethod := tempMethod].
verifyFullBlocks "Make sure that all closures will be full closures." (tempMethod blockAt: probeRecord blockMethodIndex) isFullBlockChain ifTrue: [^self]. debugger hasHomeContextStepped ifFalse: [^self makeFullBlocks]. probeSpec isPermanent ifTrue: [exitBlock value: (#PermProbeCannonBeInserted2 << #pdp >> ' A permanent probe cannot be inserted. All block closures from the selected block to the compiled method must be full block closures. You can either insert a temporary probe or use the "make full blocks" command on the edit menu.').]. self changeClassTo: DebugTempProbeInserter. RestartSignal raise.
verifyProbeSpec probeSpec notNil ifTrue: [^self]. "Prompt user for probe selection." probeSpec := CodeProbe selectDebuggerProbeTypeAsTemp: false. probeSpec isNil "Exit if user canceled." ifTrue: [exitBlock value: nil].
verifyTextUnchanged debugger changeRequest ifFalse: [exitBlock value: (#CannotInsertProbeSourceChanged << #pdp >> 'A probe cannot be inserted because the source code has changed.')].
</methods> <methods> CraftedSmalltalk.DebugProbeInserter <category>removing</category>
basicRemoveProbe: aProbe | replacementMethod | self removeProbe: aProbe fromContextMethod: debugger context. aProbe isTemporary ifTrue: [^self]. "Now remove the probe from the stored compiled method." probedMethod := debugger context mclass compiledMethodAt: aProbe selector. "Make sure the method actually contains the probe." (probedMethod isProbed and: [probedMethod includesProbe: aProbe]) ifFalse: [^self]. "If we removed the last probe then revert back to the unprobed compiled method." probedMethod totalProbes = 1 ifTrue: [replacementMethod := probedMethod originalMethod] ifFalse: [replacementMethod := probedMethod newNormalProbedMethod. replacementMethod removeProbe: aProbe]. probedMethod mclass addSelector: aProbe selector withMethod: replacementMethod.
basicRemoveProbe: aProbe fromExistingTemp: aMethod "This method removes a probe from a temp method and adjusts the context pc if the probe is a temp probe." | aCtx breakMethod | breakMethod := aMethod blockAt: aProbe blockMethodIndex. breakMethod basicRemoveProbe: aProbe. aProbe isTemporary ifFalse: [^self]. aCtx := debugger topContext. [aCtx == nil] whileFalse: [aCtx method == breakMethod & (aCtx pc > aProbe insertionPC) ifTrue: [aCtx jump: 0 - aProbe probeRecord bytesInBytecodes]. aCtx := aCtx sender]. self flushMethodCacheFor: (Array with: breakMethod).
removeAllProbes: probes from: aContext (probes asSortedCollection: [:a1 :a2 | a1 insertionPC > a2 insertionPC]) do: [:p | self removeProbe: p fromContextMethod: aContext].
removeProbe: aProbe fromContextMethod: aContext | methodIsTemp oldPCMap | homeContext := aContext supposedHome. probedMethod := aContext method homeMethod. oldPCMap := (probedMethod sourceMapAt: aProbe blockMethodIndex) dcopy. methodIsTemp := debugger tempMethods includesKey: homeContext. methodIsTemp ifTrue: [self basicRemoveProbe: aProbe fromExistingTemp: probedMethod. aProbe isTemporary ifTrue: [^self]. tempMethod := probedMethod. probedMethod := probedMethod originalMethod] ifFalse: [tempMethod := probedMethod newTempProbedMethod. tempMethod removeProbe: aProbe. debugger tempMethods at: homeContext put: tempMethod]. self adjustDynamicsReplacing: probedMethod with: tempMethod from: aProbe blockMethodIndex atPC: aProbe insertionPC addProbe: false originalPCMap: oldPCMap
removeProbe: aProbe fromExistingTemp: aMethod "This method removes a probe from a temp method and adjusts the context pc if the probe is a temp probe. It also flushes the method cache." self basicRemoveProbe: aProbe fromExistingTemp: aMethod.
removeStepProbes: probes probes do: [:ac | self removeProbe: ac key fromExistingTemp: ac value method].
</methods> <methods> CraftedSmalltalk.DebugProbeInserter <category>initialize-release</category>
for: aDebugger debugger := aDebugger
</methods> <methods> CraftedSmalltalk.DebugProbeInserter <category>private - adjusting</category>
adjustDynamicsReplacing: origMethod with: nuMethod from: blkIndex atPC: aPC addProbe: addProbe originalPCMap: oldPCMap "This method attempts to 'fix' all the contexts and block closures. However, it cannot fix closures that are not full closures. Furthermore, if a closure has been instantiated and does not have an active context then its method will not be changed to a probed method. We could find them by sending allOwnersWeakly: to every block in the method but it could be very time consuming and not finding them does not appear to create a problem. We do check two branches; the branch the current context is in, and the branch containing the block where the probe is to be inserted." | nuSelectedBlock origBlock nuBlock methodMap methodsToCheck closuresToFix ctxs ctx depthLimit nuPCMap jumpAmount nuBlocks origBlocks | homeContext := debugger context supposedHome. "Construct map to map original blocks to probed blocks." nuSelectedBlock := nuMethod blockAt: blkIndex. origBlock := origMethod blockAt: blkIndex. depthLimit := nuSelectedBlock frameSize. oldPCMap == nil ifTrue: [self error: 'Must be a non-nil pc map'] ifFalse: [nuPCMap := nuMethod sourceMapAt: blkIndex]. "Map blocks to new blocks." methodMap := IdentityDictionary new. nuBlocks := nuMethod withAllBlockMethods. origBlocks := origMethod withAllBlockMethods. 1 to: nuBlocks size do: [:i | methodMap at: (origBlocks at: i) put: (nuBlock := nuBlocks at: i). methodMap at: nuBlock put: nuBlock]. "Create list of blocks to check for exisiting closures." methodsToCheck := IdentitySet new. [origBlock ~~ origMethod] whileTrue: [methodsToCheck add: origBlock. origBlock := origBlock outerMethod]. "Get list of active contexts that have homeContext as sender." closuresToFix := IdentitySet new. ctxs := IdentitySet with: homeContext. ctx := debugger topContext. [ctx == nil or: [ctx == homeContext]] whileFalse: [ctx supposedHome == homeContext ifTrue: [ctxs add: ctx. closuresToFix add: ctx receiver]. ctx := ctx sender]. "The following is executed unpreemptively because it attempts to find and correct all block contexts whose method is being changed. This includes block contexts that are in other processes!!" [ "Replace method in closures and block contexts that have homeContext as home context." methodsToCheck do: [:aMethod | (aMethod allOwnersWeakly: false) do: [:obj | (obj class == BlockClosure and: [obj home == homeContext]) ifTrue: [closuresToFix add: obj]. (obj isBlockContext and: [obj home == homeContext]) ifTrue: [ctxs add: obj]]]. closuresToFix do: [:bc | bc method: (methodMap at: bc method)]. "replace method in block contexts" ctxs do: [:aCtx | aCtx probeMethod: (methodMap at: aCtx method ifAbsent: [aCtx method])]. self flushMethodCacheFor: methodsToCheck. ctxs := OrderedCollection new. blkIndex = 1 ifTrue: [ctxs add: homeContext] ifFalse: [(nuSelectedBlock allOwnersWeakly: false) do: [:obj | (obj isBlockContext and: [obj sender notNil and: [obj method == nuSelectedBlock]]) ifTrue: [ctxs add: obj]]]. ctxs do: [:aCtx | | i | (depthLimit > aCtx size) ifTrue: [aCtx growBy: 3]. i := self findMapIndexFor: aCtx pc inMap: oldPCMap. jumpAmount := (nuPCMap at: i) key - (oldPCMap at: i) key. aCtx jump: jumpAmount] ] valueUnpreemptively.
</methods> <methods> CraftedSmalltalk.DebugProbeInserter class <category>instance creation</category>
addProbe: aProbeSpec using: aProbeRecord for: aDebugger ^self new addProbe: aProbeSpec using: aProbeRecord for: aDebugger "Smalltalk Professional Debug Package Version 1.6 (c) 1998 Crafted Smalltalk"
for: aDebugger ^self new for: aDebugger
</methods> <methods> CraftedSmalltalk.ClientContextPatternSpec <category>accessing</category>
color ^color
color: aColorValue color := aColorValue
</methods> <methods> CraftedSmalltalk.ClientContextPatternSpec <category>copying</category>
copyWithoutText | cpy | cpy := self shallowCopy. cpy removeText. ^cpy
copyWithText | cpy | cpy := self shallowCopy. cpy emphasize. ^cpy
</methods> <methods> CraftedSmalltalk.ClientContextPatternSpec <category>emphasis</category>
emphasize name := name string asText. color isNil ifTrue: [^self]. name emphasizeAllWith: #color -> color.
removeText name := name string
</methods> <methods> CraftedSmalltalk.ClientContextPatternSpec <category>initialize-release</category>
initialize super initialize. color := ColorValue black.
</methods> <methods> CraftedSmalltalk.RestartSignal class <category>class initialization</category>
initialize notifierString := (#RestartProbeInsertion << #pdp >> 'Restart probe insertion') asString
</methods> <methods> CraftedSmalltalk.DebugTempProbeInserter <category>private</category>
getAndVerifyHomeContext homeContext := debugger context supposedHome. homeContext isNil ifTrue: [exitBlock value: (#CannotInsertProbeHomeNotInProcess << #pdp >> ' A probe cannot be inserted. The home context is not in the process').].
verifyFullBlocks "Make full block closures if we can." debugger hasHomeContextStepped ifTrue: [^self]. "Cannot make full closure." probeSpec isPermanent ifTrue: [self changeClassTo: DebugProbeInserter]. self makeFullBlocks.
verifyProbeSpec probeSpec notNil ifTrue: [^self]. "Prompt user for probe selection." probeSpec := CodeProbe selectDebuggerProbeTypeAsTemp: true. probeSpec isNil "Exit if user canceled." ifTrue: [exitBlock value: nil].
</methods> <methods> CraftedSmalltalk.DebugTempProbeInserter <category>private - adjusting</category>
adjustDynamicsReplacing: origMethod with: nuMethod from: blkIndex atPC: aPC addProbe: addProbe originalPCMap: oldPCMap "This method attempts to 'fix' all the contexts and block closures. We do check two branches; the branch the current context is in, and the branch containing the block where the probe is to be inserted." | nuSelectedBlock methodMap ctxs ctx depthLimit nuPCMap jumpAmount nuBlocks origBlocks homeMethod closureMap done methodsToFlush | homeContext := debugger context supposedHome. homeMethod := homeContext method. "Construct map to map original blocks to probed blocks." nuSelectedBlock := nuMethod blockAt: blkIndex. depthLimit := nuSelectedBlock frameSize. oldPCMap == nil ifTrue: [self error: 'Must be a non-nil pc map'] ifFalse: [nuPCMap := nuMethod sourceMapAt: blkIndex]. "Map blocks to new blocks and clean closures to new clean closures." methodMap := IdentityDictionary new. closureMap := IdentityDictionary new. nuBlocks := nuMethod withAllBlockMethods. origBlocks := origMethod withAllBlockMethods. 1 to: nuBlocks size do: [:i | | oldBlock nuBlock | methodMap at: (oldBlock := origBlocks at: i) put: (nuBlock := nuBlocks at: i). methodMap at: nuBlock put: nuBlock. 1 to: oldBlock numLiterals do: [:j | | lit | lit := oldBlock basicAt: j. lit class == BlockClosure ifTrue: [closureMap at: lit put: (nuBlock basicAt: j)]]]. "The following is executed unpreemptively because it attempts to find and correct all block contexts whose method is being changed." ctx := debugger topContext. ctxs := OrderedCollection new. methodsToFlush := IdentitySet new. done := false. [ [ctx == nil or: [done]] whileFalse: [done := ctx == homeContext. ctx method homeMethod == homeMethod ifTrue: [methodsToFlush add: ctx method. ctx probeMethod: (methodMap at: ctx method ifAbsent: [ctx method]). ctx method == nuSelectedBlock ifTrue: [ctxs add: ctx]. 1 to: ctx stackP do: [:i | | obj vals | obj := ctx localAt: i. (obj class == BlockClosure and: [obj method homeMethod == homeMethod]) ifTrue: [methodsToFlush add: obj method. obj isClean ifTrue: [ctx localAt: i put: (closureMap at: obj ifAbsent: [obj])] ifFalse: [vals := obj copiedValues. obj method numCopiedValues = 1 ifTrue: [vals := Array with: vals]. obj method: (methodMap at: obj method). 1 to: vals size do: [:j | | val | (val := vals at: j) class == BlockClosure ifTrue: [(val isClean and: [val method homeMethod == homeMethod]) ifTrue: [methodsToFlush add: val method. vals at: j put: (closureMap at: val ifAbsent: [val])]] ifFalse: [val class == Array ifTrue: [1 to: val size do: [:k | | aVal | aVal := val at: k. (aVal class == BlockClosure and: [aVal isClean and: [aVal method homeMethod == homeMethod]]) ifTrue: [methodsToFlush add: val method. val at: k put: (closureMap at: aVal ifAbsent: [aVal])]]]]]]]]]. ctx := ctx sender]. self flushMethodCacheFor: methodsToFlush. ctxs do: [:aCtx | | i | (depthLimit > aCtx size) ifTrue: [aCtx growBy: 3]. i := self findMapIndexFor: aCtx pc inMap: oldPCMap. jumpAmount := (nuPCMap at: i) key - (oldPCMap at: i) key. aCtx jump: jumpAmount] ] valueUnpreemptively.
</methods> <methods> CraftedSmalltalk.ContextListPolicyEditor <category>commands</category>
accept Patterns := OrderedCollection new: patternList size. patternList list do: [:ps | ps name isEmpty ifFalse: [Patterns add: ps copyWithoutText]]. MatchSelector := matchSelector value asSymbol. ConversionSelector := conversionSelector value asSymbol. DisplayAllLimit := displayAllLimit value truncated. self closeRequest.
cancel self closeRequest.
copy buffer := selection value copy.
help | mod aBuilder spec | aBuilder := UIBuilder new. aBuilder aspectAt: #helpText put: HelpText. mod := ApplicationModel new. mod builder: aBuilder. aBuilder source: mod. spec := self class interfaceSpecFor: #helpSpec. mod hookUpWindow: nil spec: spec builder: aBuilder. aBuilder add: spec. aBuilder window model: mod. aBuilder bindings at: #__specName put: #helpSpec. aBuilder openFromWindowSpec: spec window. aBuilder window displayPendingInvalidation. ^aBuilder
newPattern | idx | idx := patternList selectionIndex + 1. patternList list add: self emptyPattern beforeIndex: idx. patternList selectionIndex: idx.
paste patternList list add: buffer copy beforeIndex: patternList selectionIndex + 1.
removePattern patternList list remove: selection value ifAbsent: [].
selectColor | dialog color | dialog := ColorSelectionDialog new. dialog selection: colorHolder value. dialog open. dialog accept value ifFalse: [^self]. color := dialog selection. colorHolder value: color. self refreshColorButton.
undo | pattern uBuff command | pattern := selection value. uBuff := undoBuffer at: pattern ifAbsent: [^self]. command := uBuff removeLast. uBuff isEmpty ifTrue: [undoBuffer removeKey: pattern]. pattern perform: command key with: command value. command key == #pattern: ifFalse: [pattern emphasize]. command key == #color: ifTrue: [self refreshColorButton]. self refreshList. selection changed: #value.
</methods> <methods> CraftedSmalltalk.ContextListPolicyEditor <category>private</category>
addUndoCommand: symbol oldValue: obj | uBuffer | uBuffer := undoBuffer at: selection value ifAbsentPut: [OrderedCollection new]. uBuffer add: symbol -> obj.
emptyPattern ^(ClientContextPatternSpec new) name: (#Everything << #pdp >> 'Everything') asString; pattern: '*'; color: ColorValue black; yourself.
patternColorHolder | pa | pa := (PluggableAdaptor on: selection) getBlock: [:m | m value color] putBlock: [:m :v | self addUndoCommand: #color: oldValue: m value color. (m value) color: v; emphasize] updateBlock: [:m :a :p | a == #value]. pa onChangeSend: #refreshList to: self. ^pa
refreshColorButton (self widgetAt: #colorButton) widgetState colors: ((self widgetAt: #colorButton) lookPreferences setForegroundColor: selection value color). (self widgetAt: #colorButton) invalidate.
refreshList (self widgetAt: #patternList) invalidate.
</methods> <methods> CraftedSmalltalk.ContextListPolicyEditor <category>accessing</category>
buttonEnablement | enable | enable := self patternIsSelected. (builder componentAt: #removeButton) isEnabled: enable. (builder componentAt: #colorButton) isEnabled: enable.
conversionSelector ^conversionSelector
displayAllLimit ^displayAllLimit
matchSelector ^matchSelector
patternList ^patternList
</methods> <methods> CraftedSmalltalk.ContextListPolicyEditor <category>aspects</category>
canPaste ^buffer notNil
canUndo ^undoBuffer includesKey: selection value
patternIsSelected ^patternList selection notNil
patternName | pa | pa := (PluggableAdaptor on: selection) getBlock: [:m | m value name string] putBlock: [:m :v | self addUndoCommand: #name: oldValue: m value name. (m value) name: v; emphasize] updateBlock: [:m :a :p | a == #value]. pa onChangeSend: #refreshList to: self. ^pa
patternString | pa | pa := (PluggableAdaptor on: selection) getBlock: [:m | m value pattern] putBlock: [:m :v | self addUndoCommand: #pattern: oldValue: m value pattern. m value pattern: v string] updateBlock: [:m :a :p | a == #value]. pa onChangeSend: #refreshList to: self. ^pa
selectionChanged | pat | pat := patternList selection. pat isNil ifTrue: [pat := ClientContextPatternSpec new]. selection value: pat. self refreshColorButton. self buttonEnablement.
</methods> <methods> CraftedSmalltalk.ContextListPolicyEditor <category>drag & drop</category>
doDrag: aController "Drag the currently selected change. Include all available information so that the drop target can use whatever it needs." | data | data := DragDropData new. data key: #ContextPatternSpec. data contextWindow: self builder window. data contextWidget: aController. data contextApplication: self; contextApplicationType: #ContextListPolicyEditor. data clientData: patternList selection. (DragDropManager withDropSource: DropSource new withData: data) doDragDrop.
dragEnter: aDragContext "A drag has entered the class list of a change browser. If the receiver is happy to accept a drag from the target the fill-in the appropriate data and answer that dragging should continue." self == aDragContext data contextApplication ifFalse: [^#dropEffectNone]. aDragContext dropTarget clientData: self initialDropState. ^#dropEffectMove
dragLeave: aDragContext "A drag has left the change list of a change browser. If the drag contains a change, we must restore the state of the list." self == aDragContext data contextApplication ifTrue: [self restoreListStateFrom: aDragContext dropTarget clientData. aDragContext dropTarget clientData: nil]. ^#dropEffectNone
dragOver: aDragContext ^self == aDragContext data contextApplication ifTrue: [ (self builder componentAt: #patternList) widget showDropFeedbackIn: aDragContext allowScrolling: true. #dropEffectMove] ifFalse: [#dropEffectNone]
drop: aDragContext | view patternSpec list effectiveTargetIndex sourceIndex destIndex | self == aDragContext data contextApplication ifFalse: [^#dropEffectNone]. patternSpec := aDragContext data clientData. list := patternList list. view := (self builder componentAt: #patternList) widget. effectiveTargetIndex := view elementIndexFor: view controller sensor cursorPoint. destIndex := (effectiveTargetIndex min: list size) max: 1. sourceIndex := list indexOf: patternSpec. list removeAtIndex: sourceIndex. destIndex >= sourceIndex ifTrue: [destIndex > list size ifTrue: [list addLast: patternSpec] ifFalse: [list add: patternSpec beforeIndex: destIndex]] ifFalse: [list add: patternSpec beforeIndex: destIndex]. patternList selection: patternSpec. ^#dropEffectNone
initialDropState "Answer the initial state of the list when a drag has begun within its bounds. The state will be used to re-establish the appearance of the list when a drag leaves." | dict view ctrl | ctrl := (view := (self builder componentAt: #patternList) widget) controller. dict := IdentityDictionary new. dict at: #ctrl put: ctrl. dict at: #targetIndex put: view targetIndex. dict at: #effectiveTargetIndex put: (view elementIndexFor: ctrl sensor cursorPoint). dict at: #hasFocus put: ctrl view hasFocus. ctrl view hasFocus: true. ^dict
restoreListStateFrom: aDictionary "Reset the state of the list when a drag has left its bounds." | ctrl | ctrl := aDictionary at: #ctrl. ctrl view targetIndex: (aDictionary at: #targetIndex). ctrl view hasFocus: (aDictionary at: #hasFocus)
wantToDrag: listController "Answer true if the receiver wants to initiate a drag." ^patternList list size > 1 and: [patternList selectionIndex > 0]
</methods> <methods> CraftedSmalltalk.ContextListPolicyEditor <category>initialize-release</category>
initialize patternList := SelectionInList new. patternList list: self initialList. patternList selectionIndexHolder onChangeSend: #selectionChanged to: self. conversionSelector := ConversionSelector asValue. matchSelector := MatchSelector asValue. selection := ClientContextPatternSpec new asValue. colorHolder := self patternColorHolder. displayAllLimit := DisplayAllLimit asValue. undoBuffer := IdentityDictionary new.
initialList | list | list := List new. Patterns do: [:a | list add: a copyWithText]. ^list
</methods> <methods> CraftedSmalltalk.ContextListPolicyEditor <category>interface opening</category>
postBuildWith: aBuilder (self widgetAt: #patternList) displayStringSelector: #name
postOpenWith: aBuilder self buttonEnablement.
</methods> <methods> CraftedSmalltalk.ContextListPolicyEditor class <category>variables</category>
ConversionSelector ^ConversionSelector
DisplayAllLimit ^DisplayAllLimit
MatchSelector ^MatchSelector
Patterns ^Patterns
</methods> <methods> CraftedSmalltalk.ContextListPolicy <category>list management</category>
componentStringFor: aMethod | strm sel pkgs prcls | strm := WriteStream on: (String new: 64). sel := aMethod selector. #{Store.Registry} ifDefinedDo: [:reg | pkgs := reg allContainingPackagesForSelector: sel class: aMethod mclass. pkgs isEmpty ifFalse: [strm nextPutAll: '$P$'; nextPutAll: pkgs last printString]]. pkgs isNil "store not loaded" ifTrue: [prcls := Parcel parcelsDefiningSelector: sel inClass: aMethod mclass. prcls isEmpty ifFalse: [strm nextPutAll: '$P$'; nextPutAll: (prcls detect: [:p | true]) name]]. strm nextPutAll: '$C$'; nextPutAll: aMethod mclass absoluteName. strm nextPutAll: '$S$'; nextPutAll: sel. ^strm contents
computeContextList | stk ctx n includesSelectedCtx selectedContext | selectedContext := debugger context. includesSelectedCtx := selectedContext isNil. stk := WriteStream on: (Array new: stackLimit). ctx := debugger topContext. n := 0. [ctx == nil or: [(includesSelectedCtx or: [includesSelectedCtx := ctx == selectedContext]) and: [(n := n+1) > stackLimit]]] whileFalse: [stk nextPut: ctx. ctx := ctx sender]. stackLimit := n max: stackLimit. stack := stk contents. filteredStack := nil.
filterStack filteredStack := OrderedCollection new. patterns isEmpty ifTrue: [1 to: stack size do: [:i | filteredStack add: (Array with: (stack at: i) printString with: i with: nil).]. ^filteredStack]. 1 to: stack size do: [:i | | context componentString match id | context := stack at: i. componentString := self componentStringFor: context method homeMethod. context isBlockContext ifTrue: [componentString := '$B$', componentString]. match := patterns detect: [:pat | pat pattern perform: matchSymbol with: componentString] ifNone: [nil]. id := match notNil ifTrue: [match name] ifFalse: [nil]. (id notNil or: [i <= displayAllLimit]) ifTrue: [filteredStack add: (Array with: context printString with: i with: id)]]. ^filteredStack
moreStack self isFullStack ifTrue: [^false]. stackLimit := stackLimit * 2. ^true
</methods> <methods> CraftedSmalltalk.ContextListPolicy <category>accessing</category>
contextList ^stack
contextSelectedAt: anIndex anIndex < 1 ifTrue: [^nil]. (anIndex <= displayAllLimit and: [stack size >= anIndex]) ifTrue: [^stack at: anIndex]. filteredStack size < anIndex ifTrue: [^nil]. ^stack at: ((filteredStack at: anIndex) at: 2)
conversionSymbol: aSymbol conversionSymbol := aSymbol. self convertPatterns.
debugger: aDebuggerService debugger := aDebuggerService
displayAllLimit: anInteger displayAllLimit := anInteger. filteredStack := nil.
filteredStack filteredStack isNil ifTrue: [self filterStack]. ^filteredStack
indexOfCurrentContext | idx | debugger context isNil ifTrue: [^0]. idx := stack indexOf: debugger context. 1 to: self filteredStack size do: [:i | idx = ((filteredStack at: i) at: 2) ifTrue: [^i]]. ^0
matchSymbol: aSymbol matchSymbol := aSymbol. filteredStack := nil.
patterns: anOrderedCollection patterns := anOrderedCollection. self convertPatterns.
stackLimit: anInteger stackLimit := anInteger
</methods> <methods> CraftedSmalltalk.ContextListPolicy <category>private</category>
convertPatterns | nuPatterns | filteredStack := nil. (patterns isEmpty or: [conversionSymbol isNil]) ifTrue: [^self]. nuPatterns := OrderedCollection new. patterns do: [:ps | [nuPatterns add: ((ServerContextPatternSpec new) pattern: (ps pattern perform: conversionSymbol); name: ps name; yourself)] on: Error do: [:ex | Dialog warn: (#ErrorConvertingPattern << #pdp >> 'Error converting pattern'). ex inspect. ps inspect. patterns := nil. ^self]]. patterns := nuPatterns
</methods> <methods> CraftedSmalltalk.ContextListPolicy <category>testing</category>
isFullStack ^stack isEmpty or: [stack last sender isNil]
</methods> <methods> CraftedSmalltalk.ContextListPolicy <category>initialize-release</category>
initialize displayAllLimit := 5. stackLimit := ObjectMemory current availableFreeOldSpaceBytes > 500000 ifTrue: [500] ifFalse: [16]. conversionSymbol := #yourself. patterns := #().
</methods> <methods> CraftedSmalltalk.ContextListPolicy class <category>instance creation</category>
debugger: aDebuggerService ^self new initialize debugger: aDebuggerService
</methods> <methods> CraftedSmalltalk.ContextDumpPolicy <category>accessing</category>
actualNumberToDump ^numberToDump isNil ifTrue: [stack size] ifFalse: [numberToDump min: stack size]
errorMessage: aString errorMessage := aString
numberToDump: anInteger numberToDump := anInteger
printedString ^stream contents
stack: aCollection stack := aCollection
stream ^stream
stream: aStream stream := aStream.
</methods> <methods> CraftedSmalltalk.ContextDumpPolicy <category>private printing</category>
basicPrintObject: anObject stream nextPutAll: (((self _objectClass: anObject) name at: 1) isVowel ifTrue: ['an '] ifFalse: ['a ']). stream print: (self _objectClass: anObject).
basicPrintVarName: aString value: anObject stream nextPutAll: aString. stream nextPutAll: ' = '. [anObject forStackDumpPrintUsing: self] on: Error do: [:ex1 | [self basicPrintObject: anObject] on: Error do: [:ex2 | stream nextPutAll: (#ErrorInPrintingObject << #pdp >> 'Error in printing object') asString]].
printContextParmsAndTemps: aContext | nArgs | nArgs := aContext method numArgs. nArgs > 0 ifTrue: [stream nextPutAll: (#ArgumentsC << #pdp >> 'Arguments:') asString; cr]. aContext pdpSlotAccessors do: [:sa | nArgs = 0 ifTrue: [stream nextPutAll: (#TemporariesC << #pdp >> 'Temporaries:') asString; cr]. nArgs := nArgs - 1. stream tab. self basicPrintVarName: (sa at: 1) value: (aContext getTempVar: (sa at: 2)). stream cr].
printContextReceiver: aContext stream nextPutAll: (#ReceiverC << #pdp >> 'Receiver:') asString; crtab. self basicPrintObject: aContext homeReceiver. stream cr.
printContextReceiverInstVars: aContext | instVarNames theClass | instVarNames := OrderedCollection new. theClass := aContext _objectClass: aContext homeReceiver. theClass accumulateInstVarNames: instVarNames. instVarNames isEmpty ifTrue: [^self]. stream nextPutAll: (#InstanceVariablesC << #pdp >> 'Instance Variables:') asString; cr. instVarNames keysAndValuesDo: [:index :each | stream tab. self basicPrintVarName: each value: (aContext _object: aContext homeReceiver instVarAt: index). stream cr]
printContextVerbosely: aContext stream cr; nextPutAll: (#Dashes << #pdp >> '----------------------------------------------------------------------') asString; cr. aContext printOn: stream. stream cr. self printContextReceiver: aContext. self printContextReceiverInstVars: aContext. self printContextParmsAndTemps: aContext. stream nextPutAll: (#ContextPCEq << #pdp >> 'Context PC = ') asString. aContext pc printOn: stream
printErrorMessage | errorString | (errorMessage isNil or: [(errorString := errorMessage asString) isEmpty]) ifTrue: [^self]. stream nextPutAll: errorString; cr
printHeader
</methods> <methods> CraftedSmalltalk.ContextDumpPolicy <category>printing</category>
copyStackString self printErrorMessage. self printSimpleStack. self printVerboseStack. ^self printedString
printSimple self printHeader. self printErrorMessage. self printSimpleStack.
printSimpleStack [1 to: self actualNumberToDump do: [:i | (stack at: i) printOn: stream. stream cr]. ] on: Object errorSignal do: [:ex | ex inspect. ex return].
printVerbose self printHeader. self printErrorMessage. self printVerboseStack.
printVerboseStack [1 to: self actualNumberToDump do: [:i | self printContextVerbosely: (stack at: i). stream cr]. ] on: Object errorSignal do: [:ex | ex inspect. ex return].
</methods> <methods> CraftedSmalltalk.ContextDumpPolicy <category>initialize-release</category>
initialize stack := Array new. stream := WriteStream on: (String new: 500).
</methods> <methods> CraftedSmalltalk.ContextDumpPolicy <category>visitor printing</category>
printCollection: aCollection self basicPrintObject: aCollection. stream nextPut: $[. aCollection size printOn: stream. stream nextPut: $].
printObject: anObject "Default printing" ^anObject printOn: stream
printString: anObject (anObject contractTo: 60) printOn: stream.
</methods> <methods> CraftedSmalltalk.ContextDumpPolicy <category>private-reflection protocol</category>
_objectClass: anObject "Answer the object which is the argument's class.." <primitive: 211> ^self primitiveFailed
</methods> <methods> CraftedSmalltalk.ContextDumpPolicy class <category>instance creation</category>
new ^super new initialize
</methods> <methods> CraftedSmalltalk.DebuggerClient <category>accessing</category>
abortDebugging self abortDebugOperation.
contextChanged contextIndex := stackList selectionIndex. service selectContextAt: contextIndex. self buttonEnablement.
ctrlyAbort "ignore, done by service"
isBusy ^busy
service: aDebuggerService service := aDebuggerService. service addDependent: self
shortClassNames ^shortClassNames
stackFilteringEnabled ^enableStackFiltering
toolbarView | lookPolicy | lookPolicy := LookPreferences widgetPolicy lookPolicyClass new. ^lookPolicy toolBarClass menu: self class toolbarMenu performer: self
</methods> <methods> CraftedSmalltalk.DebuggerClient <category>actions</category>
abortDebugOperation busy ifFalse: [^self]. service abortDebugOperation
abortDebugOperationInProcess: proc busy ifFalse: [^proc debug]. service abortDebugOperation
continue "Continue execution from the interrupted state of the top context." service hasSuspendedOperations ifTrue: [^Dialog warn: (#YouMustCompleteOperationBeforeContinuing << #pdp >> 'You must complete the suspended debugger operations before continuing process execution.')]. closeAction := #continue. self closeRequest.
copyStack ParagraphEditor currentSelection: service stackForCopy
correctSpelling "Attempt to correct the spelling of the not-understood message" | selectors guess nArgs | selectors := service possibleDNUCorrections. selectors isEmpty ifTrue: [nArgs := service dnuSelector numArgs. [guess := (Dialog request: (#CouldNotCorrectEnterNewSelectorC << #pdp >> 'Could not correct. Enter new selector:')) asSymbol. nArgs = guess numArgs] whileFalse: [(Dialog confirm: (#NumArgsMustNotChangeRetryQ << #pdp >> 'The number of arguments must not change. Retry?')) ifFalse: [^self]]] ifFalse: [selectors := selectors asArray. guess := Dialog choose: (#CorrectToC << #pdp >> 'Correct to:') fromList: selectors values: selectors lines: 8 cancel: [^''] for: nil.]. (Dialog confirm: ((#RetryWithSelectorCnt1s << #pdp >> 'Retry with Selector:<nt><1s>') expandMacrosWith: guess) for: self interfaceWindow) ifFalse: [^self]. self performDebugOperation: #correctDNUWith: with: guess.
defineMethod self changeRequest ifFalse: [^Dialog warn: (#CannotPerformOperationSrcChanged << #pdp >> 'The operation cannot be performed because the source code has changed.')]. self performDebugOperation: #defineMethod.
firstLoop self changeRequest ifFalse: [^Dialog warn: (#CannotPerformOperationSrcChanged << #pdp >> 'The operation cannot be performed because the source code has changed.')]. self performDebugOperation: #firstLoop.
inspectContext service inspectCurrentContext
jumpToCaret "Finds the closest proper point before the caret and causes the context to jump to it, then completely pops the context stack. Proper jump points cannot be inside a loop, or cannot be after loop preperation, and must have a stack depth of 0. Also, jumps into or out of blocks are not permitted." self changeRequest ifFalse: [^Dialog warn: (#CannotPerformOperationSrcChanged << #pdp >> 'The operation cannot be performed because the source code has changed.')]. self performDebugOperation: #jumpToCaretAt: with: self textController selectionRange.
makeFullMethod service isMethodContextSelected ifFalse: [^Dialog warn: (#ContextIsNotForMethodSelectAnother << #pdp >> 'The selected context is not a method context.<n>Please select the method context and reissue this command.') expandMacros]. (Dialog choose: (#WillCutStackAndReenter << #pdp >> 'This command will cut the context stack back to the selected context<n>and re-enter the method.') expandMacros labels: (Array with: (#Proceed << #pdp >> 'Proceed') with: (#Cancel << #pdp >> 'Cancel')) values: #(true false) default: false) ifFalse: [^self]. self performDebugOperation: #makeFullMethod.
moreStack self canShowMore ifTrue: [service moreStack]
nextLoop self changeRequest ifFalse: [^Dialog warn: (#CannotPerformOperationSrcChanged << #pdp >> 'The operation cannot be performed because the source code has changed.')]. self performDebugOperation: #nextLoop.
pause "Places the process back into the paused state and closes the debugger." service hasSuspendedOperations ifTrue: [^Dialog warn: (#YouMustCompleteOperationBeforeContinuing << #pdp >> 'You must complete the suspended debugger operations before continuing process execution.')]. self performDebugOperation: #pause.
proceed "Proceed from the interrupted state of the currently selected context. Instructions pending execution in methods entered after the selected context are not executed." service hasSuspendedOperations ifTrue: [^Dialog warn: (#YouMustCompleteOperationBeforeContinuing << #pdp >> 'You must complete the suspended debugger operations before continuing process execution.')]. self performDebugOperation: #proceed.
reenter "Reset to the initial state of the currently selected context, i.e. as if the context had just been entered." self performDebugOperation: #reenter.
restart "Proceed from the initial state of the currently selected context. The argument is a controller on a view of the receiver. That view is closed." service hasSuspendedOperations ifTrue: [^Dialog warn: (#YouMustCompleteOperationBeforeContinuing << #pdp >> 'You must complete the suspended debugger operations before continuing process execution.')]. self performDebugOperation: #restart.
return self hasValidContext ifFalse: [^self]. service isMethodContextSelected ifTrue: [self returnFromMethodContext] ifFalse: [self returnFromBlockContext].
revert self changeRequest ifFalse: [^self]. (Dialog confirm: (#RevertToLastPublishedVersionQ << #pdp >> 'Revert this method to the last published version?')) ifFalse: [^self]. ^service revert
selectHomeContext self changeRequest ifFalse: [^self]. service selectHomeContext
send self changeRequest ifFalse: [^Dialog warn: (#CannotPerformOperationSrcChanged << #pdp >> 'The operation cannot be performed because the source code has changed.')]. self performDebugOperation: #send.
skipToCaret self changeRequest ifFalse: [^Dialog warn: (#CannotPerformOperationSrcChanged << #pdp >> 'The operation cannot be performed because the source code has changed.')]. self performDebugOperation: #skipToCaretAt: with: self textController selectionRange.
step self changeRequest ifFalse: [^Dialog warn: (#CannotPerformOperationSrcChanged << #pdp >> 'The operation cannot be performed because the source code has changed.')]. self performDebugOperation: #step.
stepIntoBlock self changeRequest ifFalse: [^Dialog warn: (#CannotPerformOperationSrcChanged << #pdp >> 'The operation cannot be performed because the source code has changed.')]. self performDebugOperation: #stepIntoBlock.
toggleShortClassNames shortClassNames := shortClassNames not. self refreshContextList.
toggleStackFiltering enableStackFiltering ifTrue: [self disableStackFiltering] ifFalse: [self enableStackFiltering]. self refreshAll.
</methods> <methods> CraftedSmalltalk.DebuggerClient <category>menus</category>
addBookmarkItemsTo: aMenu | serviceTags | serviceTags := service tagMenuList. serviceTags isEmpty ifFalse: [aMenu addLine]. serviceTags keysAndValuesDo: [:index :each | | item | item := index < 10 ifTrue: [MenuItem labeled: ('&<1p>. <2s>' expandMacrosWith: index with: each)] ifFalse: [MenuItem labeled: each]. item value: [service selectTag: each]. aMenu addItem: item]
bookmarkMenu | menu | menu := self class bookmarkMenu. self addBookmarkItemsTo: menu. (menu atNameKey: #addTag) enabled: self canAddTag. (menu atNameKey: #removeTag) enabled: self canRemoveTag. ^menu
contextMenu | mainMenu | mainMenu := self class contextMenu. self setQuerySubmenuBlocksIn: mainMenu. self setVisibilityForStoreCommandsIn: mainMenu. (mainMenu atNameKey: #bookmarkMenu) submenu: [self bookmarkMenu]. ^mainMenu
editMenu "Evaluation and clipboard actions shortcuts need to be made display-only to not steal keystrokes from the widget. The value also has to be changed to make the widget performs it when the item is selected using the mouse, because the application does not understand these actions." | menu | menu := self textMenu. #(cut copySelection paste accept find replace hardcopy) do: [:each | | item | item := menu menuItemWithValue: each. item value: [self textController perform: each]; makeShortcutDisplayOnly]. ^menu
executeMenu ^self class executeMenu
setQuerySubmenuBlocksIn: aMenu (aMenu atNameKey: #allSenders) submenu: [self querySubmenuSending: #browseAllReferences:]. (aMenu atNameKey: #allImplementors) submenu: [self querySubmenuSending: #browseAllImplementors:]. (aMenu atNameKey: #localSenders) submenu: [self querySubmenuSending: #browseLocalReferences:]. (aMenu atNameKey: #localImplementors) submenu: [self querySubmenuSending: #browseLocalImplementors:].
setupMenuBarMenu: aMenu (aMenu atNameKey: #stackMenu) submenu: [self stackMenu]. (aMenu atNameKey: #editMenu) submenu: self editMenu. (aMenu atNameKey: #executeMenu) submenu: [self executeMenu]. self setQuerySubmenuBlocksIn: aMenu. self setVisibilityForStoreCommandsIn: aMenu.
setVisibilityForStoreCommandsIn: aMenu | storeNotLoaded mi | storeNotLoaded := service isStoreLoaded not. (mi := aMenu atNameKey: #revert) notNil ifTrue: [mi hidden: storeNotLoaded]. (aMenu atNameKey: #browseVersions) ifNotNil: [:item | item hidden: storeNotLoaded].
stackMenu | menu | menu := self class stackMenu. self addBookmarkItemsTo: menu. (menu atNameKey: #filterStack) indication: self stackFilteringEnabled. (menu atNameKey: #toggleShortClassNames) indication: self shortClassNames. (menu atNameKey: #newTag) enablement: self canIssueContextCommand. (menu atNameKey: #removeTag) enablement: self canIssueContextCommand. ^menu
textMenu | pdpMenu | pdpMenu := self class pdpTextMenuAdditions. self validateTextProbeMenuItemsInMenu: pdpMenu. ^Menu new addPart: self class acceptGroup; addPart: (self withDisabledItemsHidden: self class browseGroup); addPart: pdpMenu; addPart: self class evaluateGroup; addPart: self class editGroup; addPart: self class hardcopyGroup; addPart: self class cancelGroup; yourself
</methods> <methods> CraftedSmalltalk.DebuggerClient <category>probes</category>
addBreakpoint self changeRequest ifFalse: [^Dialog warn: (#CannotInsertBreakSourceChanged << #pdp >> 'A breakpoint cannot be inserted because the source code has changed.')]. PDPManager debugActive ifFalse: [PDPTransientWarning on: (#ProbesAreDisabled << #pdp >> 'Probes are disabled')]. service addBreakpointAt: self textController selectionRange.
addProbe self changeRequest ifFalse: [^Dialog warn: (#CannotInsertProbeSourceChanged << #pdp >> 'A probe cannot be inserted because the source code has changed.')]. PDPManager debugActive ifFalse: [PDPTransientWarning on: (#ProbesAreDisabled << #pdp >> 'Probes are disabled')]. service addProbeAt: self textController selectionRange.
areTextProbeCommandsLegal ^self canIssueContextCommand
modifyProbe | aController | aController := self textController. service isProbedMethod ifFalse: [^aController view invalidate]. service modifyProbeAt: aController selectionRange from: aController text.
removeAllProbes "Removes all the probes from the selected method." self textController textHasChanged ifTrue: [(Dialog choose: (#RemovingProbesWillLoseChanges << #pdp >> 'Removing the probes will result in losing your changes.<n>What do you want do?') expandMacros labels: (Array with: (#RemoveProbes << #pdp >> 'Remove Probes') with: (#Cancel << #pdp >> 'Cancel')) values: #(true false) default: false) ifFalse: [^self]]. service isProbedMethod ifFalse: [^self textController view invalidate]. service removeAllProbes.
removeProbe | aController | aController := self textController. aController textHasChanged ifTrue: [(Dialog choose: (#RemovingProbesWillLoseChanges << #pdp >> 'Removing the probes will result in losing your changes.<n>What do you want do?') expandMacros labels: (Array with: (#Remove << #pdp >> 'Remove') with: (#Cancel << #pdp >> 'Cancel')) values: #(true false) default: false) ifFalse: [^self]]. service isProbedMethod ifFalse: [^aController view invalidate]. service removeProbeAt: aController selectionRange from: aController text.
validateTextProbeMenuItemsInMenu: aMenu #(insertBreakpoint insertProbe modifyProbe removeSelectedProbe removeAllProbes) do: [:each | (aMenu atNameKey: each) enablementSelector: #areTextProbeCommandsLegal]
</methods> <methods> CraftedSmalltalk.DebuggerClient <category>tags</category>
addTag service addTag. self refreshContextList
removeTag service removeTag. self refreshContextList
</methods> <methods> CraftedSmalltalk.DebuggerClient <category>actions-browsing</category>
browseAllImplementors self browseAllImplementors: service selector
browseAllImplementors: aSelector | realSelector mc | realSelector := aSelector == nil ifTrue: [self chooseSelector: (#ViewImplementorsnofWhichSelector << #pdp >> 'View implementors<n>of which selector?')] ifFalse: [aSelector]. realSelector == nil ifTrue: [^self]. mc := self methodCollector. ^mc browseSelect: (mc implementorsOf: realSelector)
browseAllReferences: aSelector | realSelector mc | realSelector := aSelector == nil ifTrue: [self chooseSelector: (#ViewSendersnofWhichSelector << #pdp >> 'View senders<n>of which selector?')] ifFalse: [aSelector]. realSelector == nil ifTrue: [^self]. mc := self methodCollector. ^mc browseSelect: (mc referencesTo: realSelector)
browseAllSenders self browseAllReferences: service selector.
browseClass service browseClass
browseClassFromSourceView | binding | binding := self selectedVariableBinding. binding isNil ifTrue: [^self]. RefactoringBrowser open navigator setBinding: binding; changed
browseClassReferencesFromSourceView | binding | binding := self selectedVariableBinding. binding isNil ifTrue: [^self]. Cursor wait showWhile: [(BrowserEnvironment new referencesTo: binding) openEditor]
browseImplementorsFromSourceView | node | node := self findNode. (node isNil or: [node isMessage not]) ifTrue: [^self]. (BrowserEnvironment new implementorsOf: node selector) openEditor
browseInstanceVariableReaders self selectedVariableName ifNotNil: [:name | Cursor wait showWhile: [(BrowserEnvironment new instVarReadersTo: name in: service selectedClass) openEditor]]
browseInstanceVariableReferences self selectedVariableName ifNotNil: [:name | Cursor wait showWhile: [(BrowserEnvironment new instVarRefsTo: name in: service selectedClass) openEditor]]
browseInstanceVariableWriters self selectedVariableName ifNotNil: [:name | Cursor wait showWhile: [(BrowserEnvironment new instVarWritersTo: name in: service selectedClass) openEditor]]
browseLocalImplementors self browseLocalImplementors: service selector
browseLocalImplementors: aSelector | realSelector mc | realSelector := aSelector == nil ifTrue: [self chooseSelector: (#ViewLocalImplementorsOfWhichQ << #pdp >> 'View local implementors<n>of which selector?')] ifFalse: [aSelector]. realSelector == nil ifTrue: [^self]. mc := self methodCollector. ^mc browseSelect: (mc searchClassHierarchy: service selectedClass) & (mc implementorsOf: realSelector)
browseLocalReferences: aSelector | realSelector mc | realSelector := aSelector == nil ifTrue: [self chooseSelector: (#ViewLocalSendersnofWhichSelector << #pdp >> 'View local senders<n>of which selector?')] ifFalse: [aSelector]. realSelector == nil ifTrue: [^self]. mc := self methodCollector. ^mc browseSelect: (mc searchClassHierarchy: service selectedClass) & (mc referencesTo: realSelector)
browseLocalSenders self browseLocalReferences: service selector
browseMethod service browseMethod
browseSendersFromSourceView | node | node := self findNode. (node isNil or: [node isMessage not]) ifTrue: [^self]. (BrowserEnvironment new referencesTo: node selector) openEditor
browseVersions Store.DbRegistry doIfOnlineImage: [ TabApplicationSystemBrowser browseVersionsOfMethodNamed: service selector in: service selectedClass ].
chooseSelector: label | msgs | msgs := service selectedMethod allSymbolLiterals asSortedCollection. ^Dialog choose: label expandMacros fromList: msgs values: msgs lines: 20 cancel: [] for: self interfaceWindow
chooseSelector: label from: def | msgs | msgs := def method allSymbolLiterals asSortedCollection. ^Dialog choose: label expandMacros fromList: msgs values: msgs lines: 20 cancel: [] for: self interfaceWindow
containingPackage | pkgs | pkgs := Store.Registry allContainingPackagesForSelector: service selector class: service selectedClass. self showPackageList: pkgs loaded:true.
querySubmenuSending: aSymbol | selectors displayedSelectors submenu item methodSelector | self hasValidContext ifFalse: [^nil]. selectors := service context method homeMethod allSymbolLiterals. methodSelector := service selector. selectors remove: methodSelector ifAbsent: []. submenu := Menu new. methodSelector notNil ifTrue: [item := MenuItem labeled: (methodSelector contractTo: MaxMenuEntryWidth). item value: [self perform: aSymbol with: methodSelector]. submenu addItem: item; addLine]. selectors isEmpty ifTrue: [^submenu]. selectors := selectors asSortedCollection. displayedSelectors := selectors copyFrom: 1 to: (selectors size min: MaxSelectorSubMenuEntries). displayedSelectors do: [:each | item := MenuItem labeled: (each contractTo: MaxMenuEntryWidth). item value: [self perform: aSymbol with: each]. submenu addItem: item]. displayedSelectors size ~= selectors size ifTrue: [submenu addLine. item := MenuItem labeled: (#MoreSelectorsDots << #pdp >> 'More selectors...'). item value: [self perform: aSymbol with: nil]. submenu addItem: item]. ^submenu
showPackageList: packages loaded: aBoolean "Show a message box with packages - separating overrides if appropiate." | str | packages isEmpty ifTrue: [ ^Dialog warn: (#NotYetAssignedToAPackage << #pdp >> 'Not yet assigned to a package') ]. str := ( String new: 50 ) writeStream. str nextPutAll: packages first itemString; cr. packages size > 1 ifTrue: [ aBoolean ifTrue: [ str nextPutAll: ( String new: packages first itemString size withAll: $_ ) ; cr ]. 2 to: packages size do: [ :index | | pkg | pkg := packages at: index. str nextPutAll: pkg itemString; cr ]. ]. Dialog warn: str contents.
</methods> <methods> CraftedSmalltalk.DebuggerClient <category>private</category>
buttonEnablement | container edc priority notTerminated canIssueContextCommand | builder == nil ifTrue: [^self]. container := self isToolbarBelowContexts ifTrue: [(builder componentAt: #toolbarHolder) widget] ifFalse: [builder componentAt: #toolbarMenu]. edc := self enableDebugCommand. notTerminated := self isTerminated not. canIssueContextCommand := self canIssueContextCommand. (container componentAt: #step) ifNotNil: [:c | c isEnabled: canIssueContextCommand]. (container componentAt: #send) ifNotNil: [:c | c isEnabled: canIssueContextCommand & (contextIndex = 1)]. (container componentAt: #stepIntoBlock) ifNotNil: [:c | c isEnabled: canIssueContextCommand & (contextIndex = 1)]. (container componentAt: #skip) ifNotNil: [:c | c isEnabled: canIssueContextCommand]. (container componentAt: #return) ifNotNil: [:c | c isEnabled: canIssueContextCommand]. (container componentAt: #reenter) ifNotNil: [:c | c isEnabled: canIssueContextCommand]. (container componentAt: #jumpToCaret) ifNotNil: [:c | c isEnabled: canIssueContextCommand]. (container componentAt: #firstLoop) ifNotNil: [:c | c isEnabled: canIssueContextCommand]. (container componentAt: #nextLoop) ifNotNil: [:c | c isEnabled: (canIssueContextCommand and: [service hasLoopControlContext])]. (container componentAt: #selectHome) ifNotNil: [:c | c isEnabled: (canIssueContextCommand and: [service isMethodContextSelected not])]. (container componentAt: #continue) ifNotNil: [:c | c isEnabled: notTerminated & busy not]. (builder componentAt: #stackList) ifNotNil: [:c | c isEnabled: busy not]. (container componentAt: #inspectContext) ifNotNil: [:c | c isEnabled: edc]. (container componentAt: #abort) ifNotNil: [:c | c isEnabled: busy]. self textWidget isEnabled: edc. priority := self notBusy ifTrue: [Processor userSchedulingPriority] ifFalse: [Processor lowIOPriority -1]. builder window windowProcess priority: priority.
canContextChange: aController ^self changeRequest
changeRequest | wrapper editor choice | builder isNil ifTrue: [^true]. wrapper := builder componentAt: #text. (wrapper isNil or: [(editor := wrapper widget controller) updateRequest]) ifTrue: [^true]. choice := Dialog choose: ((#AcceptUnsavedTextChanges << #dialogs >> 'Accept unsaved text changes?') expandMacros) labels: (Array with: #Yes << #labels >> 'Yes' with: #No << #labels >> 'No' with: #Cancel << #labels >> 'Cancel') values: #(#yes #no #cancel) default: #yes. choice = #cancel ifTrue: [^false]. choice = #yes ifTrue: [self textAccepted: editor] ifFalse: [editor cancel]. ^true
disableStackFiltering enableStackFiltering := false. service stackFilterPatterns: #() convertSelector: ContextListPolicyEditor ConversionSelector matchSelector: ContextListPolicyEditor MatchSelector displayAllLimit: ContextListPolicyEditor DisplayAllLimit.
enableStackFiltering | pats | enableStackFiltering := true. stackEmphases := Dictionary new. pats := ContextListPolicyEditor Patterns collect: [:p | stackEmphases at: p name put: p color. (ServerContextPatternSpec new) pattern: p pattern; name: p name; yourself]. service stackFilterPatterns: pats convertSelector: ContextListPolicyEditor ConversionSelector matchSelector: ContextListPolicyEditor MatchSelector displayAllLimit: ContextListPolicyEditor DisplayAllLimit.
findNode | tree node interval source | interval := self selectedInterval. interval isEmpty ifTrue: [| cursorPosition | cursorPosition := self selectionIndex. cursorPosition = 1 ifTrue: [^nil]. interval := cursorPosition to: cursorPosition]. source := self text asString. source size > 10000 ifTrue: [^nil]. tree := self parseSource: source. tree isNil ifTrue: [^self parseSelection]. node := tree whichNodeIsContainedBy: interval. node isNil ifTrue: [node := tree bestNodeFor: interval]. ^node
interfaceWindow ^builder window
maybeSelectLineAndIfSelected: oneArgumentBlockClosure |textController| textController := self textController. textController maybeSelectCurrentLine. textController hasRangeSelection ifTrue: [oneArgumentBlockClosure value: textController]
methodCollector ^MethodCollector new browser: self
parseSelection ^RBParser parseExpression: self selectedText onError: [:str :pos | ^nil]
parseSource: aString parsedSource = aString ifTrue: [^parseTree]. parsedSource := aString. parseTree := nil. ^parseTree := service selector = #unboundMethod ifTrue: [RBParser parseExpression: aString onError: [:str :error | ^nil]] ifFalse: [RBParser parseMethod: aString onError: [:str :err | ^nil]]
performDebugOperation: actionSym busy := true. self buttonEnablement. service perform: actionSym
performDebugOperation: actionSym with: anObject ^self performDebugOperation: actionSym withArgs: (Array with: anObject)
performDebugOperation: actionSym withArgs: anArray busy := true. self buttonEnablement. service perform: actionSym withArguments: anArray.
requestComplete busy := false. self isTerminated. self buttonEnablement.
selectedInterval | controller | controller := self textController. controller isNil ifTrue: [^1 to: 0]. ^controller selectionStartIndex to: controller selectionStopIndex - 1
selectedText | interval | interval := self selectedInterval. interval isEmpty ifTrue: [^'']. ^self textController text asString copyFrom: interval first to: interval last
selectedVariableBinding | name | name := self selectedVariableName. name isNil ifTrue: [^nil]. ^(name includes: $.) ifTrue: [name asQualifiedReference bindingOrNil] ifFalse: [service selectedClass environment bindingFor: name asSymbol]
selectedVariableName | node | node := self findNode. ^(node notNil and: [node isVariable]) ifTrue: [node name] ifFalse: [nil]
selectionIndex | controller | controller := self textController. controller isNil ifTrue: [^1]. ^controller selectionStartIndex
shortenClassNameFor: str | strm parts classParts | strm := WriteStream on: (String new: str size). parts := str tokensBasedOn: $>. classParts := (parts at: 1) tokensBasedOn: $(. strm nextPutAll: ((classParts at: 1) tokensBasedOn: $.) last. classParts size > 1 ifTrue: [strm nextPut: $(; nextPutAll: ((classParts at: 2) tokensBasedOn: $.) last]. strm nextPutAll: '>>'; nextPutAll: parts last. ^strm contents
stackView ^(builder componentAt: #stackList) widget
textController ^self textWidget controller
textEditor: aTextController keyPress: aKeyPressedEvent ^aKeyPressedEvent keyValue = Graphics.TextConstants.Ctrlo ifTrue: [self format. nil] ifFalse: [aKeyPressedEvent]
textWidget ^(builder componentAt: #text) widget
withDisabledItemsHidden: aMenu aMenu menuItems do: [:each | each hidden: [each isEnabled not]]. ^aMenu
</methods> <methods> CraftedSmalltalk.DebuggerClient <category>testing</category>
canAddTag ^self canIssueContextCommand and: [service isCurrentContextTagged not]
canCorrectSpelling ^self canIssueContextCommand and: [service canCorrectSpelling]
canDefineMethod ^self canIssueContextCommand and: [service canDefineMethod]
canDoNextLoop ^self canIssueContextCommand and: [service hasLoopControlContext]
canIssueContextCommand ^self hasValidContext and: [self notBusy and: [self isTerminated not]]
canRemoveTag ^self canIssueContextCommand and: [service isCurrentContextTagged]
canRun ^self notBusy and: [self isTerminated not]
canSelectHome ^self canIssueContextCommand and: [service isMethodContextSelected not]
canShowMore ^self isTerminated not
enableDebugCommand ^self hasValidContext & self notBusy
enableSendCommand ^(contextIndex = 1) and: [self canIssueContextCommand]
hasClassSelected | node | node := self findNode. (node isNil or: [node isVariable not]) ifTrue: [^false]. ^node name asQualifiedReference bindingOrNil ifNil: [false] ifNotNil: [:b | b isForClass]
hasInstanceVariableSelected | class name | class := service selectedClass. name := self selectedVariableName. ^class notNil and: [name notNil and: [(class allInstVarNames indexOf: name) > 0]]
hasMessageNodeSelected | node | node := self findNode. ^node notNil and: [node isMessage]
hasValidContext ^contextIndex > 0
isDebugger ^true
isTerminated terminated ifFalse: [terminated := service isTerminated. terminated ifTrue: [self changed: #windowLabel with: service label]]. ^terminated
isToolbarBelowContexts ^(builder componentAt: #toolbarHolder) notNil
notBusy ^busy not
</methods> <methods> CraftedSmalltalk.DebuggerClient <category>updating</category>
changeWindowLabelTo: aString ^self changed: #windowLabel with: aString
highlightRange: range | tv | builder isNil ifTrue: [^self]. tv := self textWidget. tv isOpen ifFalse: [^self]. tv deselect. tv controller selectAndScrollFrom: range value first to: range value last. tv displaySelection: true.
redisplayText self textHolder setValue: self text. builder isNil ifTrue: [^self]. self textWidget updateTheDisplay.
refreshAll self changed: #windowLabel with: service label. self updateContextList: service indexOfCurrentContext. self redisplayText. self highlightRange: service pcRange. self buttonEnablement.
refreshContextList self updateContextList: service indexOfCurrentContext.
showMessage: anObject Dialog warn: anObject
update: aSymbol with: anObject aSymbol = #pcRange ifTrue: [^ [(Delay forMilliseconds: 20) wait. builder window send: #highlightRange: to: self with: (Array with: anObject)] fork]. aSymbol = #showMessage ifTrue: [^builder window send: #showMessage: to: self with: (Array with: anObject)]. aSymbol = #contextList ifTrue: [^builder window send: #updateContextList: to: self with: (Array with: anObject)]. aSymbol = #contextSelection ifTrue: [^builder window send: #updateContextSelection: to: self with: (Array with: anObject)]. aSymbol = #text ifTrue: [^builder window send: #redisplayText to: self]. aSymbol = #requestComplete ifTrue: [^builder window send: #requestComplete to: self]. aSymbol = #windowLabel ifTrue: [^builder window send: #changeWindowLabelTo: to: self with: (Array with: anObject)]. aSymbol = #closeDebugger ifTrue: [^builder window send: #closeRequest to: self]. aSymbol = #debuggerSelectedTopContext ifTrue: [^builder window send: #debuggerSelectedTopContext to: self]. aSymbol = #evaluationResult ifTrue: [^builder window send: (anObject at: 1) to: self with: (Array with: (anObject at: 2))]
updateContextList: contextIdx | scrollPosition nLines sv | nLines := stackList list size. sv := self stackView. scrollPosition := sv scrollOffsetHolder value. sv scrollOffsetHolder retractInterestIn: #value for: self. stackList selectionIndexHolder retractInterestsFor: self. stackList list: self contextList. contextIndex := contextIdx. stackList selectionIndex: contextIndex. stackList list size >= nLines ifTrue: [sv scrollTo: scrollPosition]. service isFullStack ifFalse: [sv scrollOffsetHolder expressInterestIn: #value for: self sendBack: #listScrolled]. stackList selectionIndexHolder onChangeSend: #contextChanged to: self
updateContextSelection: contextIdx stackList selectionIndexHolder retractInterestsFor: self. contextIndex := contextIdx. stackList selectionIndex: contextIndex. stackList selectionIndexHolder onChangeSend: #contextChanged to: self
</methods> <methods> CraftedSmalltalk.DebuggerClient <category>aspects</category>
contextInspector ^service contextInspector
contextList ^service contextListForUI collect: [:a | | emp txt str | str := a at: 1. shortClassNames ifTrue: [str := self shortenClassNameFor: str]. txt := str asText. (service isTagged: (a at: 1)) ifTrue: [txt := txt allBold]. emp := a at: 3. emp notNil ifTrue: [txt emphasizeAllWith: (#color -> (stackEmphases at: emp))]. txt]
listScrolled | sv | sv := self stackView. (sv scrollOffsetHolder value - sv visibleExtent + sv scrollableExtent) y < 10 ifTrue: [self moreStack]
receiverInspector ^service receiverInspector
stackInspector ^service stackInspector
stackList ^stackList
text ^service text
textHolder ^text
</methods> <methods> CraftedSmalltalk.DebuggerClient <category>doIt/accept/explain</category>
debugit self maybeSelectLineAndIfSelected: [:textController| service debugFrom: self textController]
doit self maybeSelectLineAndIfSelected: [:textController| self performDebugOperation: #evaluateTextFrom:action: withArgs: (Array with: textController with: #doItCompleted:)]
doItCompleted: result
doItContext "Answer the context in which a text selection can be evaluated." ^service doItContext
doItEnvironment "Answer the object that should be informed of the result of evaluating a text selection." ^service doItEnvironment
doItReceiver "Answer the object that should be informed of the result of evaluating a text selection." ^service doItReceiver
doItValue: anObject "Set the value to be returned when the interrupted process proceeds." ^service doItValue: anObject
explain service explainFor: self textController
format service formatFor: self textController
inspectit self maybeSelectLineAndIfSelected: [:textController| self performDebugOperation: #evaluateTextFrom:action: withArgs: (Array with: textController with: #inspectItCompleted:)]
inspectItCompleted: result result inspect
printit self maybeSelectLineAndIfSelected: [:textController| self performDebugOperation: #evaluateTextFrom:action: withArgs: (Array with: textController with: #printItCompleted:)]
printItCompleted: result | tc | tc := self textController. tc insertAndSelect: (' ' , result printString) at: tc selectionStopIndex
textAccepted: textController "Recompile the method of the selected context." service isInstalledMethodSourceOutOfSync ifTrue: [(Dialog choose: (#SourcesOutOfSyncWhatToDo << #pdp >> 'Installed method source and selected context original source are out of sync. Accepting new source may result in losing prior changes.') labels: (Array with: (#AcceptSource << #pdp >> 'Accept Source') with: (#Cancel << #pdp >> 'Cancel')) values: #(true false) default: false) ifFalse: [^false]]. ^service acceptTextFrom: textController.
</methods> <methods> CraftedSmalltalk.DebuggerClient <category>private-return</category>
hookupMethodReturnFor: dialog | aBuilder result accept pa | aBuilder := dialog builder. accept := dialog accept. result := ValueHolder with: nil. pa := PluggableAdaptor on: result. pa getBlock: [:m | m] putBlock: [:m :v | ] updateBlock: [:m :a :p | a == #value ifTrue: [accept value: true]. true]. result addDependent: pa. aBuilder aspectAt: #returnSelf put: [result value: #returnSelf:]. aBuilder aspectAt: #returnTOS put: [result value: #returnTOS:]. aBuilder aspectAt: #returnLastDoIt put: [result value: #returnLastDoIt:]. aBuilder aspectAt: #returnNewExpr put: [result value: #returnNewExpr:]. accept onChangeSend: #close to: dialog. dialog cancel onChangeSend: #close to: dialog. ^result
returnFromBlockContext | windoe dialog aBuilder result returnType | windoe := builder window. dialog := SimpleDialog new. dialog initializeBuilderFor: windoe. aBuilder := dialog builder. aBuilder source: self. result := self hookupMethodReturnFor: dialog. returnType := ValueHolder with: #return:. aBuilder aspectAt: #returnType put: returnType. aBuilder add: (UISpecification from: self class blockReturnSpec). dialog initializeWindowFor: windoe. service doesContextHaveInterimValues ifFalse: [(aBuilder componentAt: #returnTOS) disable]. service contextHasHome ifFalse: [(aBuilder componentAt: #methodReturn) disable. (aBuilder componentAt: #blockReturn) disable]. dialog preOpen. aBuilder openDialogWithExtent: aBuilder window displayBox extent. result value isNil ifTrue: [^nil]. self perform: result value with: returnType value.
returnFromMethodContext | windoe dialog aBuilder result | windoe := builder window. dialog := SimpleDialog new. dialog initializeBuilderFor: windoe. aBuilder := dialog builder. aBuilder source: self. result := self hookupMethodReturnFor: dialog. aBuilder add: (UISpecification from: self class methodReturnSpec). dialog initializeWindowFor: windoe. service doesContextHaveInterimValues ifFalse: [(aBuilder componentAt: #returnTOS) disable]. dialog preOpen. aBuilder openDialogWithExtent: aBuilder window displayBox extent. result value isNil ifTrue: [^nil]. self perform: result value with: #return:.
returnLastDoIt: rtnMsg self performDebugOperation: #returnLastDoIt: with: rtnMsg.
returnNewExpr: rtnMsg | string retry result | [string := Dialog request: (#EnterExpressionC << #pdp >> 'Enter expression:') initialAnswer: 'nil'. string isEmpty ifTrue: [^self]. result := service evaluateExpressionInReceiver: string. result key ifTrue: [retry := false] ifFalse: [retry := Dialog confirm: (#ExprInvalidRetryQ << #pdp >> 'The expression is invalid. Retry?') initialAnswer: true. retry ifFalse: [^self]]. retry] whileTrue. self performDebugOperation: #returnNewExpr:with: withArgs: (Array with: rtnMsg with: result value).
returnSelf: rtnMsg self performDebugOperation: #returnSelf: with: rtnMsg.
returnTOS: rtnMsg self performDebugOperation: #returnTOS: with: rtnMsg.
</methods> <methods> CraftedSmalltalk.DebuggerClient <category>initialize - release</category>
initialize super initialize. shortClassNames := busy := false. terminated := false. text := String new asValue. contextIndex := 0. stackList := SelectionInList new. stackList list: List new. stackList selectionIndexHolder onChangeSend: #contextChanged to: self. stackEmphases := Dictionary new. ContextListPolicyEditor Patterns do: [:ps | stackEmphases at: ps name put: ps color]. closeAction := #terminate
windowClosed service perform: closeAction.
</methods> <methods> CraftedSmalltalk.DebuggerClient <category>interface opening</category>
debuggerSelectedTopContext service selectContextAt: 1. self refreshAll.
postBuildWith: aBuilder self enableStackFiltering. self textController autoAccept: false; doNotHandleLocally: #explain; keyboardHook: [:e :c | self textEditor: c keyPress: e]. self setupMenuBarMenu: (aBuilder menuAt: #menuBarMenu). self stackView scrollOffsetHolder expressInterestIn: #value for: self sendBack: #listScrolled.
postOpenWith: aBuilder | windowProcess | windowProcess := aBuilder window windowProcess. windowProcess debugger: self. windowProcess environmentAt: #WindowManagerUsagePolicy put: MakeNewWindowManagerUsagePolicy new. aBuilder window when: #closed send: #windowClosed to: self. service prepareTopContext.
</methods> <methods> CraftedSmalltalk.DebuggerClient <category>interface closing</category>
noticeOfWindowClose: aWindow EventQueue allInstancesDo: [:each | each restoreReadSynchSignals]. service removeAllDependents. aWindow windowManager sendTerminate.
</methods> <methods> CraftedSmalltalk.DebuggerClient class <category>resources</category>
executeMenu menuHolder isNil ifTrue: [self initializeMenu]. ^menuHolder value decodeAsLiteralArray
</methods> <methods> CraftedSmalltalk.DebuggerClient class <category>interface specs</category>
windowSpec ^PlaceToolbarBelowContexts ifTrue: [self toolbarInTheMiddleWindowSpec] ifFalse: [self toolbarOnTopWindowSpec]
</methods> <methods> CraftedSmalltalk.DebuggerClient class <category>private</category>
classMethodsChanged menuHolder := nil
initializeMenu "self initializeMenu" self menuHolder value: self executeMenuDefault literalArrayEncoding
menuHolder ^menuHolder ifNil: [menuHolder := self executeMenuDefault literalArrayEncoding asValue]
</methods> <methods> CraftedSmalltalk.DebuggerClient class <category>instance creation</category>
openFullViewOn: aDebuggerService label: aString [| win | win := (self service: aDebuggerService) open window. win label: aString. win windowProcess name: aString.] on: GetWindowManagerUsagePolicy do: [:ex | ex resume: MakeNewWindowManagerUsagePolicy new] "Smalltalk Professional Debug Package Version 3.1 (c) 2002 Crafted Smalltalk"
openFullViewOn: aDebuggerService label: aString clientInto: aBlock [| client win | client := self service: aDebuggerService. aBlock value: client. win := client open window. win label: aString. win windowProcess name: aString.] on: GetWindowManagerUsagePolicy do: [:ex | ex resume: MakeNewWindowManagerUsagePolicy new]
service: aDebuggerService ^self new service: aDebuggerService "Smalltalk Professional Debug Package Version 3.0 (c) 2001 Crafted Smalltalk"
</methods> <methods> CraftedSmalltalk.DebuggerClient class <category>support</category>
iconImportExpressions " ImageReader iconFromFile: '/Users/vb/Work/VisualWorks/Graphics/Debugger/step.gif' toClass: ToolbarIconLibrary selector: #debugStep20x20. ImageReader iconFromFile: '/Users/vb/Work/VisualWorks/Graphics/Debugger/stepInto.gif' toClass: ToolbarIconLibrary selector: #debugStepInto20x20. ImageReader iconFromFile: '/Users/vb/Work/VisualWorks/Graphics/Debugger/stepOverBlock.gif' toClass: ToolbarIconLibrary selector: #debugStepOver20x20. ImageReader iconFromFile: '/Users/vb/Work/VisualWorks/Graphics/Debugger/run.gif' toClass: ToolbarIconLibrary selector: #debugRun20x20. ImageReader iconFromFile: '/Users/vb/Work/VisualWorks/Graphics/Debugger/return.gif' toClass: ToolbarIconLibrary selector: #debugReturn20x20. ImageReader iconFromFile: '/Users/vb/Work/VisualWorks/Graphics/Debugger/terminate.gif' toClass: ToolbarIconLibrary selector: #debugTerminate20x20. ImageReader iconFromFile: '/Users/vb/Work/VisualWorks/Graphics/Debugger/restart.gif' toClass: ToolbarIconLibrary selector: #debugRestart20x20. ImageReader iconFromFile: '/Users/vb/Work/VisualWorks/Graphics/Debugger/jumpToCaret.gif' toClass: ToolbarIconLibrary selector: #debugJumpToCaret20x20. ImageReader iconFromFile: '/Users/vb/Work/VisualWorks/Graphics/Debugger/runToCaret.gif' toClass: ToolbarIconLibrary selector: #debugRunToCaret20x20. ImageReader iconFromFile: '/Users/vb/Work/VisualWorks/Graphics/Debugger/runWithBreak.gif' toClass: ToolbarIconLibrary selector: #debugFirstLoop20x20. ImageReader iconFromFile: '/Users/vb/Work/VisualWorks/Graphics/Debugger/runWithBreakNext.gif' toClass: ToolbarIconLibrary selector: #debugNextLoop20x20. " self commentOnly
</methods> <methods> CraftedSmalltalk.DebuggerClient class <category>class initialization</category>
initialize "self initialize" #{PlaceToolbarBelowContexts} initialize. #{MaxMenuEntryWidth} initialize. #{MaxSelectorSubMenuEntries} initialize. self initializeMenu
</methods> <methods> UI.EventSensor <category>event processing</category>
keyAt: keyNumber character: aCharacter alternative: alternativeCharacter down: isDownTransition "A keyboard key has been pressed or released; take appropriate action" | keyboardEvent | (self state isModifierKey: aCharacter) ifTrue: [^self]. (self allProcessInterruptMatchesCharacter: aCharacter inTransition: isDownTransition) ifTrue: [(#{CraftedSmalltalk.DebuggerService} valueOrDo: [^self]) interruptAllUserProcesses]. (self warpToLauncherMatchesCharacter: aCharacter inTransition: isDownTransition) ifTrue: [^#{VisualLauncher} ifDefinedDo: [:launcherClass | launcherClass raiseOrOpen]]. (aCharacter = self state class interruptKeyValue and: [isDownTransition]) ifTrue: [(self state shiftDown or: [(keyNumber bitAnd: 256) ~= 0]) ifTrue: [[EmergencyWindow open] fork] ifFalse: [(#{CraftedSmalltalk.DebuggerService} valueOrDo: [^self]) interruptActiveUserProcess]] ifFalse: [isDownTransition ifTrue: [keyboardEvent := KeyPressedEvent new] ifFalse: [keyboardEvent := KeyReleasedEvent new]. keyboardEvent := keyboardEvent code: aCharacter meta: (self state metaState bitOr: (keyNumber bitShift: -8)) alternative: alternativeCharacter. self addMetaInput: (keyboardEvent window: window)]
</methods> <methods> Tools.Notifier class <category>class initialization</category>
beDevelopment "Initialize the current instance variable with a DevelopmentNotifier." current := self developmentNotifier.
</methods> <methods> Tools.Notifier class <category>accessing</category>
developmentNotifier ^DebuggerService
</methods> <methods> Tools.Notifier class <category>testing</category>
isDevelopment "Answer true if the current notifier is for a development image." ^current == self developmentNotifier
</methods> <methods> Core.SystemNotification <category>private - actions</category>
defaultAction self aboutToDebug. ^Notifier openException: self.
</methods> <methods> UI.ScrollingView <category>scrolling</category>
scrollOffsetHolder ^scrollOffset
</methods> <methods> CraftedSmalltalk.ContextListPolicyEditor class <category>interface specs</category>
helpSpec "UIPainter new openOnClass: self andSelector: #helpSpec" <resource: #canvas> ^#(#{UI.FullSpec} #window: #(#{UI.WindowSpec} #label: #(#{Kernel.UserMessage} #key: #Help #defaultString: 'Help' #catalogID: #pdp) #min: #(#{Core.Point} 20 20 ) #max: #(#{Core.Point} 1024 768 ) #bounds: #(#{Graphics.Rectangle} 640 512 1140 912 ) ) #component: #(#{UI.SpecCollection} #collection: #( #(#{UI.TextEditorSpec} #layout: #(#{Graphics.LayoutFrame} 0 0 0 0 0 1 0 1 ) #name: #TextEditor #model: #helpText #isReadOnly: false #tabRequiresControl: true ) ) ) )
windowSpec "UIPainter new openOnClass: self andSelector: #windowSpec" <resource: #canvas> ^#(#{UI.FullSpec} #window: #(#{UI.WindowSpec} #label: #(#{Kernel.UserMessage} #key: #ContextListPolicyEditor #defaultString: 'Context list policy editor' #catalogID: #pdp) #min: #(#{Core.Point} 528 401 ) #max: #(#{Core.Point} 1024 768 ) #bounds: #(#{Graphics.Rectangle} 592 427 1120 828 ) #flags: 4 #menu: #menuBar ) #component: #(#{UI.SpecCollection} #collection: #( #(#{UI.LabelSpec} #layout: #(#{UI.AlignmentOrigin} 0 0.175 5 0 0.5 0 ) #name: #PatternListLabel #label: #(#{Kernel.UserMessage} #key: #Patterns #defaultString: 'Patterns' #catalogID: #pdp) ) #(#{UI.SequenceViewSpec} #properties: #(#{UI.PropertyListDictionary} #dragOkSelector #wantToDrag: #dragEnterSelector #dragEnter: #dragOverSelector #dragOver: #dragStartSelector #doDrag: #dropSelector #drop: #dragExitSelector #dragLeave: ) #layout: #(#{Graphics.LayoutFrame} 2 0 30 0 0 0.35 -60 1 ) #name: #patternList #model: #patternList #menu: #menu #useModifierKeys: true #selectionType: #highlight ) #(#{UI.ActionButtonSpec} #layout: #(#{Graphics.LayoutFrame} 25 0.35 30 0 90 0.35 53 0 ) #name: #newButton #model: #newPattern #label: #(#{Kernel.UserMessage} #key: #New #defaultString: 'New' #catalogID: #pdp) #defaultable: true ) #(#{UI.ActionButtonSpec} #layout: #(#{Graphics.LayoutFrame} 115 0.35 30 0 180 0.35 53 0 ) #name: #removeButton #model: #removePattern #label: #(#{Kernel.UserMessage} #key: #Remove #defaultString: 'Remove' #catalogID: #pdp) #defaultable: true ) #(#{UI.InputFieldSpec} #layout: #(#{Graphics.LayoutFrame} 13 0.35 105 0 -9 0.75 128 0 ) #name: #patternNameInput #model: #patternName ) #(#{UI.ActionButtonSpec} #layout: #(#{Graphics.LayoutFrame} 8 0.75 105 0 87 0.75 128 0 ) #name: #colorButton #model: #selectColor #label: #(#{Kernel.UserMessage} #key: #PickColor #defaultString: 'Pick Color' #catalogID: #pdp) #defaultable: true ) #(#{UI.TextEditorSpec} #layout: #(#{Graphics.LayoutFrame} 13 0.35 160 0 -8 1 -155 1 ) #name: #TextEditor1 #model: #patternString #tabRequiresControl: true ) #(#{UI.LabelSpec} #layout: #(#{Graphics.LayoutOrigin} 13 0.35 85 0 ) #name: #Label1 #label: #(#{Kernel.UserMessage} #key: #Name #defaultString: 'Name' #catalogID: #pdp) ) #(#{UI.LabelSpec} #layout: #(#{UI.AlignmentOrigin} 0 0.675 137 0 0.5 0 ) #name: #Label3 #label: #(#{Kernel.UserMessage} #key: #PatternString #defaultString: 'Pattern String' #catalogID: #pdp) ) #(#{UI.GroupBoxSpec} #layout: #(#{Graphics.LayoutFrame} 6 0.35 65 0 -2 1 -145 1 ) #name: #GroupBox1 #label: #(#{Kernel.UserMessage} #key: #Pattern #defaultString: 'Pattern' #catalogID: #pdp) ) #(#{UI.InputFieldSpec} #layout: #(#{Graphics.LayoutFrame} 12 0.35 -118 1 0 0.679924 -92 1 ) #name: #matchSelectorInputField #model: #matchSelector #type: #symbol ) #(#{UI.InputFieldSpec} #layout: #(#{Graphics.LayoutFrame} 6 0.68 -118 1 -8 1 -92 1 ) #name: #conversionSelectorInputField #model: #conversionSelector #type: #symbol ) #(#{UI.LabelSpec} #layout: #(#{Graphics.LayoutOrigin} 12 0.35 -137 1 ) #name: #Label4 #label: #(#{Kernel.UserMessage} #key: #MatchSelector #defaultString: 'Match Selector' #catalogID: #pdp) ) #(#{UI.LabelSpec} #layout: #(#{Graphics.LayoutOrigin} 6 0.68 -137 1 ) #name: #Label5 #label: #(#{Kernel.UserMessage} #key: #ConversionSelector #defaultString: 'Conversion Selector' #catalogID: #pdp) ) #(#{UI.ActionButtonSpec} #layout: #(#{Graphics.LayoutSizedOrigin} -100 0.5 -33 1 80 23 ) #name: #okButton #model: #accept #label: #(#{Kernel.UserMessage} #key: #Ok #defaultString: 'Ok' #catalogID: #pdp) #defaultable: true ) #(#{UI.ActionButtonSpec} #layout: #(#{Graphics.LayoutSizedOrigin} 20 0.5 -33 1 81 23 ) #name: #cancelButton #model: #cancel #label: #(#{Kernel.UserMessage} #key: #Cancel #defaultString: 'Cancel' #catalogID: #pdp) #defaultable: true ) #(#{UI.LabelSpec} #layout: #(#{Graphics.LayoutOrigin} 12 0.35 -82 1 ) #name: #Label2 #label: #(#{Kernel.UserMessage} #key: #DisplayAllLimit #defaultString: 'Display all limit' #catalogID: #pdp) ) #(#{UI.SpinButtonSpec} #layout: #(#{Graphics.LayoutFrame} 90 0.35 -83 1 150 0.35 -60 1 ) #name: #displayAllLimitField #model: #displayAllLimit #type: #number #formatString: '0' #low: 1 #high: 100 #interval: 1 ) #(#{UI.ActionButtonSpec} #layout: #(#{UI.AlignmentOrigin} -10 1 -10 1 1 1 ) #name: #HelpButton #model: #help #label: #(#{Kernel.UserMessage} #key: #Help #defaultString: 'Help' #catalogID: #pdp) #defaultable: true ) #(#{UI.DividerSpec} #layout: #(#{Graphics.LayoutFrame} 0 0 -48 1 0 1 -44 1 ) #name: #Divider1 ) ) ) )
</methods> <methods> CraftedSmalltalk.ContextListPolicyEditor class <category>resources</category>
menu "MenuEditor new openOnClass: self andSelector: #menu" <resource: #menu> ^#(#{UI.Menu} #( #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #New #defaultString: 'New' #catalogID: #pdp) #value: #newPattern ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #Remove #defaultString: 'Remove' #catalogID: #pdp) #value: #removePattern #enablementSelector: #patternIsSelected ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #Undo #defaultString: 'Undo' #catalogID: #pdp) #nameKey: #undo #value: #undo #enablementSelector: #canUndo ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #Copy #defaultString: 'Copy' #catalogID: #pdp) #value: #copy #enablementSelector: #patternIsSelected ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #Paste #defaultString: 'Paste' #catalogID: #pdp) #value: #paste #enablementSelector: #canPaste ) ) #(2 1 2 ) nil ) decodeAsLiteralArray
menuBar "MenuEditor new openOnClass: self andSelector: #menuBar" <resource: #menu> ^#(#{UI.Menu} #( #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #Edit #defaultString: 'Edit' #catalogID: #pdp) #submenu: #(#{UI.Menu} #( #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #New #defaultString: 'New' #catalogID: #pdp) #value: #newPattern ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #Remove #defaultString: 'Remove' #catalogID: #pdp) #value: #removePattern #enablementSelector: #patternIsSelected ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #Undo #defaultString: 'Undo' #catalogID: #pdp) #nameKey: #undo #value: #undo #enablementSelector: #canUndo ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #Copy #defaultString: 'Copy' #catalogID: #pdp) #value: #copy #enablementSelector: #patternIsSelected ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #Paste #defaultString: 'Paste' #catalogID: #pdp) #value: #paste #enablementSelector: #canPaste ) ) #(2 1 2 ) nil ) ) ) #(1 ) nil ) decodeAsLiteralArray
</methods> <methods> CraftedSmalltalk.DebuggerClient class <category>resources</category>
acceptGroup "Tools.MenuEditor new openOnClass: self andSelector: #acceptGroup" <resource: #menu> ^#(#{UI.Menu} #( #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #_Accept #defaultString: '&Accept' #catalogID: #menus ) #value: #accept #shortcutKeyCharacter: $s #shortcutModifiers: 2 ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #_Format #defaultString: '&Format' #catalogID: #menus ) #value: #format #shortcutKeyCharacter: $O #shortcutModifiers: 2 ) ) #(2 ) nil ) decodeAsLiteralArray
bookmarkMenu "Tools.MenuEditor new openOnClass: self andSelector: #bookmarkMenu" <resource: #menu> ^#(#{UI.Menu} #( #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #_Set #defaultString: '&Set' #catalogID: #pdp) #nameKey: #addTag #value: #addTag #enablementSelector: #canAddTag ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #_Clear #defaultString: '&Clear' #catalogID: #pdp) #nameKey: #removeTag #value: #removeTag #enablementSelector: #canRemoveTag ) ) #(2 ) nil ) decodeAsLiteralArray
browseGroup "Tools.MenuEditor new openOnClass: self andSelector: #browseGroup" <resource: #menu> ^#(#{UI.Menu} #( #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #BrowseClass #defaultString: 'Browse Class' #catalogID: #pdp ) #value: #browseClassFromSourceView #enablementSelector: #hasClassSelected #shortcutKeyCharacter: #F12 #shortcutModifiers: 2 ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #BrowseReferencesToClass #defaultString: 'Browse References to Class' #catalogID: #pdp ) #value: #browseClassReferencesFromSourceView #enablementSelector: #hasClassSelected #shortcutKeyCharacter: #F11 #shortcutModifiers: 2 ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #BrowseVariableReferences #defaultString: 'Browse Variable References' #catalogID: #pdp ) #value: #browseInstanceVariableReferences #enablementSelector: #hasInstanceVariableSelected #shortcutKeyCharacter: #F11 #shortcutModifiers: 2 ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #BrowseVariableReaders #defaultString: 'Browse Variable Readers' #catalogID: #pdp ) #value: #browseInstanceVariableReaders #enablementSelector: #hasInstanceVariableSelected ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #BrowseVariableWriters #defaultString: 'Browse Variable Writers' #catalogID: #pdp ) #value: #browseInstanceVariableWriters #enablementSelector: #hasInstanceVariableSelected ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #BrowseSendersOfSelector #defaultString: 'Browse Senders of Selector' #catalogID: #pdp ) #value: #browseSendersFromSourceView #enablementSelector: #hasMessageNodeSelected #shortcutKeyCharacter: #F11 #shortcutModifiers: 2 ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #BrowseImplementorsOfSelector #defaultString: 'Browse Implementors of Selector' #catalogID: #pdp ) #value: #browseImplementorsFromSourceView #enablementSelector: #hasMessageNodeSelected #shortcutKeyCharacter: #F12 #shortcutModifiers: 2 ) ) #(7 ) nil ) decodeAsLiteralArray
cancelGroup "Tools.MenuEditor new openOnClass: self andSelector: #cancelGroup" <resource: #menu> ^#(#{UI.Menu} #( #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #_Cancel #defaultString: '&Cancel' #catalogID: #menus ) #value: #redisplayText ) ) #(1 ) nil ) decodeAsLiteralArray
contextMenu "Tools.MenuEditor new openOnClass: self andSelector: #contextMenu" <resource: #menu> ^#(#{UI.Menu} #( #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #_Browse #defaultString: '&Browse' #catalogID: #pdp ) #nameKey: #browseClass #value: #browseClass #enablementSelector: #hasValidContext ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #_Senders #defaultString: '&Senders' #catalogID: #pdp ) #nameKey: #allSenders #value: #browseAllSenders #enablementSelector: #hasValidContext ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #I_mplementors #defaultString: 'I&mplementors' #catalogID: #pdp ) #nameKey: #allImplementors #value: #browseAllImplementors #enablementSelector: #hasValidContext ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #HierarchySe_nders #defaultString: 'Hierarchy Se&nders' #catalogID: #pdp ) #nameKey: #localSenders #value: #browseLocalSenders #enablementSelector: #hasValidContext ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #HierarchyIm_plementors #defaultString: 'Hierarchy Im&plementors' #catalogID: #pdp ) #nameKey: #localImplementors #value: #browseLocalImplementors #enablementSelector: #hasValidContext ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #Select_HomeContext #defaultString: 'Select &Home Context' #catalogID: #pdp ) #value: #selectHomeContext #enablementSelector: #canSelectHome #labelImage: #(#{UI.ResourceRetriever} #{Tools.ToolbarIconLibrary} #home ) ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #_CorrectSelector #defaultString: '&Correct Selector' #catalogID: #pdp ) #nameKey: #correctSpelling #value: #correctSpelling #enablementSelector: #canCorrectSpelling ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #_DefineMethod #defaultString: '&Define Method' #catalogID: #pdp ) #nameKey: #defineMethod #value: #defineMethod #enablementSelector: #canDefineMethod ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #_Inspect #defaultString: '&Inspect' #catalogID: #pdp ) #nameKey: #inspectContext #value: #inspectContext #enablementSelector: #hasValidContext #labelImage: #(#{UI.ResourceRetriever} #{Tools.ToolbarIconLibrary} #inspect ) ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #Browse_Versions #defaultString: 'Browse &Versions' #catalogID: #pdp ) #nameKey: #browseVersions #value: #browseVersions #enablementSelector: #hasValidContext ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #Re_vertDots #defaultString: 'Re&vert...' #catalogID: #pdp ) #nameKey: #revert #value: #revert #enablementSelector: #enableDebugCommand ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #_Bookmark #defaultString: '&Bookmark' #catalogID: #pdp ) #nameKey: #bookmarkMenu ) ) #(1 2 2 4 2 1 ) nil ) decodeAsLiteralArray
editGroup "Tools.MenuEditor new openOnClass: self andSelector: #editGroup" <resource: #menu> ^#(#{UI.Menu} #( #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #Cu_t #defaultString: 'Cu&t' #catalogID: #menus ) #value: #cut #labelImage: #(#{UI.ResourceRetriever} #{Tools.ToolbarIconLibrary} #cut ) ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #_Copy #defaultString: '&Copy' #catalogID: #menus ) #value: #copySelection #labelImage: #(#{UI.ResourceRetriever} #{Tools.ToolbarIconLibrary} #copy ) ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #_Paste #defaultString: '&Paste' #catalogID: #menus ) #value: #paste #labelImage: #(#{UI.ResourceRetriever} #{Tools.ToolbarIconLibrary} #paste ) ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #_FindDot #defaultString: '&Find...' #catalogID: #menus ) #value: #find ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #_ReplaceDot #defaultString: '&Replace...' #catalogID: #menus ) #value: #replace ) ) #(3 2 ) nil ) decodeAsLiteralArray
evaluateGroup "Tools.MenuEditor new openOnClass: self andSelector: #evaluateGroup" <resource: #menu> ^#(#{UI.Menu} #( #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #_DoIt #defaultString: '&Do it' #catalogID: #menus ) #value: #doit #shortcutKeyCharacter: $d #shortcutModifiers: 2 #labelImage: #(#{UI.ResourceRetriever} #{Tools.ToolbarIconLibrary} #doIt ) ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #_PrintIt #defaultString: '&Print it' #catalogID: #menus ) #value: #printit #shortcutKeyCharacter: $p #shortcutModifiers: 2 #labelImage: #(#{UI.ResourceRetriever} #{Tools.ToolbarIconLibrary} #printIt ) ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #_InspectIt #defaultString: '&Inspect it' #catalogID: #menus ) #value: #inspectit #shortcutKeyCharacter: $q #shortcutModifiers: 2 #labelImage: #(#{UI.ResourceRetriever} #{Tools.ToolbarIconLibrary} #inspectIt ) ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #De_bugIt #defaultString: 'De&bug it' #catalogID: #menus ) #value: #debugit #shortcutKeyCharacter: $B #shortcutModifiers: 2 #labelImage: #(#{UI.ResourceRetriever} #{Tools.ToolbarIconLibrary} #debugIt ) ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #_Explain #defaultString: 'Explain' #catalogID: #menus ) #value: #explain #shortcutKeyCharacter: $E #shortcutModifiers: 2 ) ) #(4 1) nil ) decodeAsLiteralArray
executeMenuDefault "Tools.MenuEditor new openOnClass: self andSelector: #executeMenuDefault" <resource: #menu> ^#(#{UI.Menu} #( #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #Step_Into #defaultString: 'Step &Into' #catalogID: #pdp ) #nameKey: #send #value: #send #enablementSelector: #enableSendCommand #shortcutKeyCharacter: #F5 #shortcutModifiers: 0 #labelImage: #(#{UI.ResourceRetriever} #{Tools.ToolbarIconLibrary} #debugStepInto ) ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #_Step #defaultString: '&Step' #catalogID: #pdp ) #nameKey: #stepIntoBlock #value: #stepIntoBlock #enablementSelector: #enableSendCommand #shortcutKeyCharacter: #F6 #shortcutModifiers: 0 #labelImage: #(#{UI.ResourceRetriever} #{Tools.ToolbarIconLibrary} #debugStep ) ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #Step_Over #defaultString: 'Step &Over' #catalogID: #pdp ) #nameKey: #step #value: #step #enablementSelector: #canIssueContextCommand #shortcutKeyCharacter: #F7 #shortcutModifiers: 0 #labelImage: #(#{UI.ResourceRetriever} #{Tools.ToolbarIconLibrary} #debugStepOver ) ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #_Run #defaultString: '&Run' #catalogID: #pdp ) #nameKey: #continue #value: #continue #enablementSelector: #canRun #shortcutKeyCharacter: #F9 #shortcutModifiers: 0 #labelImage: #(#{UI.ResourceRetriever} #{Tools.ToolbarIconLibrary} #debugRun ) ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #_Terminate #defaultString: '&Terminate' #catalogID: #pdp ) #value: #closeRequest #labelImage: #(#{UI.ResourceRetriever} #{ToolbarIconLibrary} #delete ) ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #Ret_urnDots #defaultString: 'Ret&urn...' #catalogID: #pdp ) #nameKey: #return #value: #return #enablementSelector: #canIssueContextCommand #labelImage: #(#{UI.ResourceRetriever} #{Tools.ToolbarIconLibrary} #debugReturn ) ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #RunTo_Caret #defaultString: 'Run to &Caret' #catalogID: #pdp ) #nameKey: #skip #value: #skipToCaret #enablementSelector: #canIssueContextCommand #labelImage: #(#{UI.ResourceRetriever} #{Tools.ToolbarIconLibrary} #debugRunToCaret ) ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #R_estart #defaultString: 'R&estart' #catalogID: #pdp ) #nameKey: #reenter #value: #reenter #enablementSelector: #canIssueContextCommand #labelImage: #(#{UI.ResourceRetriever} #{Tools.ToolbarIconLibrary} #debugRestart ) ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #_JumpToCaret #defaultString: '&Jump to Caret' #catalogID: #pdp ) #nameKey: #jump #value: #jumpToCaret #enablementSelector: #canIssueContextCommand #labelImage: #(#{UI.ResourceRetriever} #{ToolbarIconLibrary} #debugJumpToCaret ) ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #RunWith_BreakOnReturn #defaultString: 'Run with &Break on Return' #catalogID: #pdp ) #nameKey: #firstLoop #value: #firstLoop #enablementSelector: #canIssueContextCommand #labelImage: #(#{UI.ResourceRetriever} #{ToolbarIconLibrary} #debugFirstLoop ) ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #RunWithBrea_kAgain #defaultString: 'Run with Brea&k Again' #catalogID: #pdp ) #nameKey: #nextLoop #value: #nextLoop #enablementSelector: #canDoNextLoop #labelImage: #(#{UI.ResourceRetriever} #{ToolbarIconLibrary} #debugNextLoop ) ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #Sto_p #defaultString: 'Sto&p' #catalogID: #pdp ) #nameKey: #abortDebugOperation #value: #abortDebugOperation #enablementSelector: #isBusy #labelImage: #(#{UI.ResourceRetriever} #{Tools.ToolbarIconLibrary} #abort ) ) ) #(3 1 1 4 2 1 ) nil ) decodeAsLiteralArray
hardcopyGroup "MenuEditor new openOnClass: self andSelector: #hardcopyGroup" <resource: #menu> ^#(#{UI.Menu} #( #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #_Hardcopy #defaultString: '&Hardcopy' #catalogID: #menus ) #value: #hardcopy ) ) #(1 ) nil ) decodeAsLiteralArray
menuBarMenu "Tools.MenuEditor new openOnClass: self andSelector: #menuBarMenu" <resource: #menu> ^#(#{UI.Menu} #( #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #_Stack #defaultString: '&Stack' #catalogID: #pdp ) #nameKey: #stackMenu ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #_Method #defaultString: '&Method' #catalogID: #pdp ) #submenu: #(#{UI.Menu} #( #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #_Browse #defaultString: '&Browse' #catalogID: #pdp ) #nameKey: #browseClass #value: #browseClass #enablementSelector: #hasValidContext ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #_Senders #defaultString: '&Senders' #catalogID: #pdp ) #nameKey: #allSenders #value: #browseAllSenders #enablementSelector: #hasValidContext ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #_Implementors #defaultString: '&Implementors' #catalogID: #pdp ) #nameKey: #allImplementors #value: #browseAllImplementors #enablementSelector: #hasValidContext ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #HierarchySe_nders #defaultString: 'Hierarchy Se&nders' #catalogID: #pdp ) #nameKey: #localSenders #value: #browseLocalSenders #enablementSelector: #hasValidContext ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #HierarchyI_mplementors #defaultString: 'Hierarchy I&mplementors' #catalogID: #pdp ) #nameKey: #localImplementors #value: #browseLocalImplementors #enablementSelector: #hasValidContext ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #Re_vertDots #defaultString: 'Re&vert...' #catalogID: #pdp ) #nameKey: #revert #value: #revert #enablementSelector: #enableDebugCommand ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #Browse_Versions #defaultString: 'Browse &Versions' #catalogID: #pdp ) #nameKey: #browseVersions #value: #browseVersions #enablementSelector: #hasValidContext ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #ShowContaining_PackageDots #defaultString: 'Show Containing &Package...' #catalogID: #pdp ) #nameKey: #containingPackage #value: #containingPackage #enablementSelector: #hasValidContext ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #_RecompileWithFullBlocks #defaultString: '&Recompile with Full Blocks' #catalogID: #pdp ) #nameKey: #makeFullMethod #value: #makeFullMethod #enablementSelector: #canIssueContextCommand ) ) #(1 2 2 3 1 ) nil ) ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #_Edit #defaultString: '&Edit' #catalogID: #pdp ) #nameKey: #editMenu ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #E_xecute #defaultString: 'E&xecute' #catalogID: #pdp ) #nameKey: #executeMenu ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #_Correct #defaultString: '&Correct' #catalogID: #pdp ) #submenu: #(#{UI.Menu} #( #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #_DefineMethod #defaultString: '&Define Method' #catalogID: #pdp ) #nameKey: #defineMethod #value: #defineMethod #enablementSelector: #canDefineMethod #shortcutKeyCharacter: #F4 #shortcutModifiers: 0 ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #_CorrectSelector #defaultString: '&Correct Selector' #catalogID: #pdp ) #nameKey: #correctSpelling #value: #correctSpelling #enablementSelector: #canCorrectSpelling #shortcutKeyCharacter: #F4 #shortcutModifiers: 2 ) ) #(2 ) nil ) ) ) #(5 ) nil ) decodeAsLiteralArray
pdpTextMenuAdditions "Tools.MenuEditor new openOnClass: self andSelector: #pdpTextMenuAdditions" <resource: #menu> ^#(#{UI.Menu} #( #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #InsertBreakpoint #defaultString: 'Insert Breakpoint' #catalogID: #pdp ) #nameKey: #insertBreakpoint #value: #addBreakpoint ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #InsertProbeDots #defaultString: 'Insert Probe...' #catalogID: #pdp ) #nameKey: #insertProbe #value: #addProbe ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #EditProbeDots #defaultString: 'Edit Probe...' #catalogID: #pdp ) #nameKey: #modifyProbe #value: #modifyProbe ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #RemoveThisProbe #defaultString: 'Remove This Probe' #catalogID: #pdp ) #nameKey: #removeSelectedProbe #value: #removeProbe ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #RemoveAllProbes #defaultString: 'Remove All Probes' #catalogID: #pdp ) #nameKey: #removeAllProbes #value: #removeAllProbes ) ) #(5 ) nil ) decodeAsLiteralArray
stackMenu "Tools.MenuEditor new openOnClass: self andSelector: #stackMenu" <resource: #menu> ^#(#{UI.Menu} #( #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #_CopyStackReport #defaultString: '&Copy Stack Report' #catalogID: #pdp) #nameKey: #copyStack #value: #copyStack #labelImage: #(#{UI.ResourceRetriever} #{Tools.ToolbarIconLibrary} #copy ) ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #Show_More #defaultString: 'Show &More' #catalogID: #pdp) #nameKey: #moreStack #value: #moreStack #enablementSelector: #canShowMore ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #_FilterStack #defaultString: '&Filter Stack' #catalogID: #pdp) #nameKey: #filterStack #value: #toggleStackFiltering ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #UseShortClass_Names #defaultString: 'Use Short Class &Names' #catalogID: #pdp) #nameKey: #toggleShortClassNames #value: #toggleShortClassNames ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #Select_HomeContext #defaultString: 'Select &Home Context' #catalogID: #pdp) #nameKey: #selectHomeContext #value: #selectHomeContext #enablementSelector: #canSelectHome #labelImage: #(#{UI.ResourceRetriever} #{Tools.ToolbarIconLibrary} #home ) ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #_InspectContext #defaultString: '&Inspect Context' #catalogID: #pdp) #nameKey: #inspectContext #value: #inspectContext #enablementSelector: #hasValidContext #labelImage: #(#{UI.ResourceRetriever} #{Tools.ToolbarIconLibrary} #inspect ) ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #_BookmarkContext #defaultString: '&Bookmark Context' #catalogID: #pdp) #nameKey: #newTag #value: #addTag #enablementSelector: #canAddTag #shortcutKeyCharacter: #F2 #shortcutModifiers: 0 ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #Clear_Bookmark #defaultString: 'Clear &Bookmark' #catalogID: #pdp) #nameKey: #removeTag #value: #removeTag #enablementSelector: #canRemoveTag ) ) #(2 2 4 ) nil ) decodeAsLiteralArray
textMenuExtras "Tools.MenuEditor new openOnClass: self andSelector: #textMenuExtras" <resource: #menu> ^#(#{UI.Menu} #( #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #_Format #defaultString: '&Format' #catalogID: #menus ) #nameKey: #Format #value: #format #shortcutKeyCharacter: $o #shortcutModifiers: 2 ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #_Explain #defaultString: '&Explain' #catalogID: #menus ) #value: #explain ) ) #(2 ) nil ) decodeAsLiteralArray
toolbarMenu "Tools.MenuEditor new openOnClass: self andSelector: #toolbarMenu" <resource: #menu> ^#(#{UI.Menu} #( #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #StepInto #defaultString: 'Step Into' #catalogID: #pdp ) #nameKey: #send #value: #send #labelImage: #(#{UI.ResourceRetriever} #{Tools.ToolbarIconLibrary} #debugStepInto ) #helpText: #(#{Kernel.UserMessage} #key: #StepIntoButtonHelp #defaultString: 'Step, stepping into message sends' #catalogID: #pdp ) ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #Step #defaultString: 'Step' #catalogID: #pdp ) #nameKey: #stepIntoBlock #value: #stepIntoBlock #labelImage: #(#{UI.ResourceRetriever} #{Tools.ToolbarIconLibrary} #debugStep ) #helpText: #(#{Kernel.UserMessage} #key: #StepButtonHelp #defaultString: 'Step' #catalogID: #pdp ) ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #StepOver #defaultString: 'Step Over' #catalogID: #pdp ) #nameKey: #step #value: #step #labelImage: #(#{UI.ResourceRetriever} #{Tools.ToolbarIconLibrary} #debugStepOver ) #helpText: #(#{Kernel.UserMessage} #key: #StepOverButtonHelp #defaultString: 'Step, stepping over blocks' #catalogID: #pdp ) ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #Run #defaultString: 'Run' #catalogID: #pdp ) #nameKey: #continue #value: #continue #labelImage: #(#{UI.ResourceRetriever} #{Tools.ToolbarIconLibrary} #debugRun ) #helpText: #(#{Kernel.UserMessage} #key: #RunButtonHelp #defaultString: 'Run' #catalogID: #pdp ) ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #Terminate #defaultString: 'Terminate' #catalogID: #pdp ) #value: #closeRequest #labelImage: #(#{UI.ResourceRetriever} #{ToolbarIconLibrary} #debugTerminate ) #helpText: #(#{Kernel.UserMessage} #key: #TerminateButtonHelp #defaultString: 'Terminate this process and close the debugger' #catalogID: #pdp ) ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #Return #defaultString: 'Return' #catalogID: #pdp ) #nameKey: #return #value: #return #labelImage: #(#{UI.ResourceRetriever} #{Tools.ToolbarIconLibrary} #debugReturn ) #helpText: #(#{Kernel.UserMessage} #key: #ReturnButtonHelp #defaultString: 'Return from this context' #catalogID: #pdp ) ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #RunToCaret #defaultString: 'Run to Caret' #catalogID: #pdp ) #nameKey: #skip #value: #skipToCaret #labelImage: #(#{UI.ResourceRetriever} #{Tools.ToolbarIconLibrary} #debugRunToCaret ) #helpText: #(#{Kernel.UserMessage} #key: #RunToCaretButtonHelp #defaultString: 'Run to caret' #catalogID: #pdp ) ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #Restart #defaultString: 'Restart' #catalogID: #pdp ) #nameKey: #reenter #value: #reenter #labelImage: #(#{UI.ResourceRetriever} #{Tools.ToolbarIconLibrary} #debugRestart ) #helpText: #(#{Kernel.UserMessage} #key: #RestartButtonHelp #defaultString: 'Restart execution from the beginning of this context' #catalogID: #pdp ) ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #JumpToCaret #defaultString: 'Jump to Caret' #catalogID: #pdp ) #nameKey: #jumpToCaret #value: #jumpToCaret #labelImage: #(#{UI.ResourceRetriever} #{ToolbarIconLibrary} #debugJumpToCaret ) #helpText: #(#{Kernel.UserMessage} #key: #JumpToCaretButtonHelp #defaultString: 'Jump to caret without executing any code' #catalogID: #pdp ) ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #RunWithBreakOnReturn #defaultString: 'Run with Break on Return' #catalogID: #pdp ) #nameKey: #firstLoop #value: #firstLoop #labelImage: #(#{UI.ResourceRetriever} #{ToolbarIconLibrary} #debugFirstLoop ) #helpText: #(#{Kernel.UserMessage} #key: #RunWithBreakOnReturnButtonHelp #defaultString: 'Run with break on return' #catalogID: #pdp ) ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #RunWithBreakAgain #defaultString: 'Run with Break Again' #catalogID: #pdp ) #nameKey: #nextLoop #value: #nextLoop #labelImage: #(#{UI.ResourceRetriever} #{ToolbarIconLibrary} #debugNextLoop ) #helpText: #(#{Kernel.UserMessage} #key: #RunWithBreakAgainButtonHelp #defaultString: 'Run with break on return again' #catalogID: #pdp ) ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #SelectHome #defaultString: 'Select Home' #catalogID: #pdp ) #nameKey: #selectHome #value: #selectHomeContext #labelImage: #(#{UI.ResourceRetriever} #{ToolbarIconLibrary} #home ) #helpText: #(#{Kernel.UserMessage} #key: #SelectHomeButtonHelp #defaultString: 'Select the home of this context' #catalogID: #pdp ) ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #InspectContext #defaultString: 'Inspect Context' #catalogID: #pdp ) #nameKey: #inspectContext #value: #inspectContext #labelImage: #(#{UI.ResourceRetriever} #{ToolbarIconLibrary} #inspect ) #helpText: #(#{Kernel.UserMessage} #key: #InspectThisContextButtonHelp #defaultString: 'Inspect this context' #catalogID: #pdp ) ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #Abort #defaultString: 'Abort' #catalogID: #pdp ) #nameKey: #abort #value: #abortDebugOperation #labelImage: #(#{UI.ResourceRetriever} #{Tools.ToolbarIconLibrary} #abort ) #helpText: #(#{Kernel.UserMessage} #key: #AbortButtonHelp #defaultString: 'Abort current debug operation' #catalogID: #pdp ) ) ) #(3 1 1 4 2 2 1 ) nil ) decodeAsLiteralArray
</methods> <methods> CraftedSmalltalk.DebuggerClient class <category>interface specs</category>
blockReturnSpec "UIPainter new openOnClass: self andSelector: #blockReturnSpec" <resource: #canvas> ^#(#{UI.FullSpec} #window: #(#{UI.WindowSpec} #label: #(#{Kernel.UserMessage} #key: #ReturnFromBlock #defaultString: 'Return from block' #catalogID: #pdp) #bounds: #(#{Graphics.Rectangle} 640 512 979 758 ) ) #component: #(#{UI.SpecCollection} #collection: #( #(#{UI.RadioButtonSpec} #layout: #(#{Core.Point} 204 42 ) #name: #methodReturn #model: #returnType #label: #(#{Kernel.UserMessage} #key: #MethodReturn #defaultString: 'Method Return' #catalogID: #pdp) #select: #methodReturn: ) #(#{UI.RadioButtonSpec} #layout: #(#{Core.Point} 204 74 ) #name: #blockReturn #model: #returnType #label: #(#{Kernel.UserMessage} #key: #BlockReturn #defaultString: 'Block Return' #catalogID: #pdp) #select: #return: ) #(#{UI.SubCanvasSpec} #layout: #(#{Graphics.Rectangle} 0 0 206 237 ) #flags: 0 #majorKey: #{CraftedSmalltalk.DebuggerClient} #minorKey: #methodReturnSpec ) ) ) )
methodReturnSpec "UIPainter new openOnClass: self andSelector: #methodReturnSpec" <resource: #canvas> ^#(#FullSpec #window: #(#WindowSpec #label: #(#{Kernel.UserMessage} #key: #MethodReturn #defaultString: 'Method Return' #catalogID: #pdp) #min: #(#Point 200 246 ) #max: #(#Point 200 246 ) #bounds: #(#Rectangle 614 301 814 547 ) ) #component: #(#SpecCollection #collection: #( #(#LabelSpec #layout: #(#Point 35 9 ) #label: #(#{Kernel.UserMessage} #key: #SelectReturnValue #defaultString: 'Select Return Value' #catalogID: #pdp) ) #(#ActionButtonSpec #layout: #(#Rectangle 20 39 177 65 ) #model: #returnSelf #label: #(#{Kernel.UserMessage} #key: #self #defaultString: 'self' #catalogID: #pdp) #defaultable: true ) #(#ActionButtonSpec #layout: #(#Rectangle 20 72 177 98 ) #name: #returnTOS #model: #returnTOS #label: #(#{Kernel.UserMessage} #key: #TopOfStack #defaultString: 'Top of Stack' #catalogID: #pdp) #defaultable: true ) #(#ActionButtonSpec #layout: #(#Rectangle 20 106 177 132 ) #model: #returnLastDoIt #label: #(#{Kernel.UserMessage} #key: #ResultOfLastDoIt #defaultString: 'Result of last DoIt' #catalogID: #pdp) #defaultable: true ) #(#ActionButtonSpec #layout: #(#Rectangle 20 140 177 166 ) #model: #returnNewExpr #label: #(#{Kernel.UserMessage} #key: #EvaluateExpression #defaultString: 'Evaluate Expression' #catalogID: #pdp) #defaultable: true ) #(#ActionButtonSpec #layout: #(#Rectangle 20 191 177 217 ) #model: #cancel #label: #(#{Kernel.UserMessage} #key: #Cancel #defaultString: 'Cancel' #catalogID: #pdp) #defaultable: true ) ) ) )
toolbarInTheMiddleWindowSpec "Tools.UIPainter new openOnClass: self andSelector: #toolbarInTheMiddleWindowSpec" <resource: #canvas> ^#(#{UI.FullSpec} #window: #(#{UI.WindowSpec} #label: ' ' #min: #(#{Core.Point} 40 20 ) #bounds: #(#{Graphics.Rectangle} 720 312 1301 900 ) #flags: 4 #menu: #menuBarMenu ) #component: #(#{UI.SpecCollection} #collection: #( #(#{UI.TextEditorSpec} #layout: #(#{Graphics.LayoutFrame} 0 0 2 0.3 0 1 -2 0.8 ) #name: #text #model: #textHolder #callbacksSpec: #(#{UI.UIEventCallbackSubSpec} #valueChangeSelector: #textAccepted: ) #tabable: true #menu: #textMenu #tabRequiresControl: true ) #(#{UI.SubCanvasSpec} #layout: #(#{Graphics.LayoutFrame} 0 0 2 0.8 -2 0.5 0 1 ) #name: #receiverInspector #flags: 0 #majorKey: #{Tools.Inspector} #minorKey: #windowSpec #clientKey: #receiverInspector ) #(#{UI.SubCanvasSpec} #layout: #(#{Graphics.LayoutFrame} 2 0.5 2 0.8 0 1 0 1 ) #name: #contextInspector #flags: 0 #majorKey: #{Tools.Inspector} #minorKey: #windowSpec #clientKey: #contextInspector ) #(#{UI.ResizingSplitterSpec} #layout: #(#{Graphics.LayoutFrame} 0 0 -2 0.8 0 1 2 0.8 ) #name: #BottomResizer #horizontal: true #minAboveSize: 60 #minBelowSize: 60 #aboveWidgets: '#text' #belowWidgets: '#receiverInspector #contextInspector #BotInspectResizer' ) #(#{UI.ResizingSplitterSpec} #layout: #(#{Graphics.LayoutFrame} 0 0 -2 0.3 0 1 2 0.3 ) #name: #TopResizer #horizontal: true #minAboveSize: 60 #minBelowSize: 60 #aboveWidgets: 'TopComposite' #belowWidgets: 'text' ) #(#{UI.ResizingSplitterSpec} #layout: #(#{Graphics.LayoutFrame} -2 0.5 0 0.8 2 0.5 0 1 ) #name: #BotInspectResizer #horizontal: false #minAboveSize: 60 #minBelowSize: 60 #aboveWidgets: '#receiverInspector' #belowWidgets: 'contextInspector' ) #(#{UI.CompositeSpecCollection} #collection: #( #(#{UI.SequenceViewSpec} #layout: #(#{Graphics.LayoutFrame} 0 0 0 0 -2 0.6 -28 1 ) #name: #stackList #model: #stackList #callbacksSpec: #(#{UI.UIEventCallbackSubSpec} #doubleClickSelector: #browseMethod #requestValueChangeSelector: #canContextChange: ) #menu: #contextMenu #useModifierKeys: true #selectionType: #highlight ) #(#{UI.SubCanvasSpec} #layout: #(#{Graphics.LayoutFrame} 2 0.6 0 0 0 1 -28 1 ) #name: #stackInspector #flags: 0 #majorKey: #{CraftedSmalltalk.StackInspector} #minorKey: #windowSpec #clientKey: #stackInspector ) #(#{UI.ResizingSplitterSpec} #layout: #(#{Graphics.LayoutFrame} -2 0.6 0 0 2 0.6 -28 1 ) #name: #ResizingSplitter1 #horizontal: false #minAboveSize: 60 #minBelowSize: 60 #aboveWidgets: '#stackList' #belowWidgets: '#stackInspector' ) #(#{UI.ArbitraryComponentSpec} #layout: #(#{Graphics.LayoutFrame} 0 0 -28 1 0 1 0 1 ) #name: #toolbarHolder #flags: 0 #component: #toolbarView ) ) #compositeSpec: #(#{UI.CompositeSpec} #layout: #(#{Graphics.LayoutFrame} 0 0 0 0 0 1 -2 0.3 ) #name: #TopComposite ) ) ) ) )
toolbarOnTopWindowSpec "Tools.UIPainter new openOnClass: self andSelector: #toolbarOnTopWindowSpec" <resource: #canvas> ^#(#{UI.FullSpec} #window: #(#{UI.WindowSpec} #label: ' ' #min: #(#{Core.Point} 40 20 ) #bounds: #(#{Graphics.Rectangle} 720 312 1301 900 ) #flags: 4 #menu: #menuBarMenu #toolBar: #toolbarMenu ) #component: #(#{UI.SpecCollection} #collection: #( #(#{UI.TextEditorSpec} #layout: #(#{Graphics.LayoutFrame} 0 0 2 0.3 0 1 -2 0.8 ) #name: #text #model: #textHolder #callbacksSpec: #(#{UI.UIEventCallbackSubSpec} #valueChangeSelector: #textAccepted: ) #tabable: true #menu: #textMenu #tabRequiresControl: true ) #(#{UI.SubCanvasSpec} #layout: #(#{Graphics.LayoutFrame} 0 0 2 0.8 -2 0.5 0 1 ) #name: #receiverInspector #flags: 0 #majorKey: #{Tools.Inspector} #minorKey: #windowSpec #clientKey: #receiverInspector ) #(#{UI.SubCanvasSpec} #layout: #(#{Graphics.LayoutFrame} 2 0.5 2 0.8 0 1 0 1 ) #name: #contextInspector #flags: 0 #majorKey: #{Tools.Inspector} #minorKey: #windowSpec #clientKey: #contextInspector ) #(#{UI.ResizingSplitterSpec} #layout: #(#{Graphics.LayoutFrame} 0 0 -2 0.8 0 1 2 0.8 ) #name: #BottomResizer #horizontal: true #minAboveSize: 30 #minBelowSize: 30 #aboveWidgets: '#text' #belowWidgets: '#receiverInspector #contextInspector #BotInspectResizer' ) #(#{UI.ResizingSplitterSpec} #layout: #(#{Graphics.LayoutFrame} 0 0 -2 0.3 0 1 2 0.3 ) #name: #TopResizer #horizontal: true #minAboveSize: 30 #minBelowSize: 30 #aboveWidgets: 'TopComposite' #belowWidgets: 'text' ) #(#{UI.CompositeSpecCollection} #collection: #( #(#{UI.SubCanvasSpec} #layout: #(#{Graphics.LayoutFrame} 2 0.6 0 0 0 1 0 1 ) #name: #stackInspector #flags: 0 #majorKey: #{CraftedSmalltalk.StackInspector} #minorKey: #windowSpec #clientKey: #stackInspector ) #(#{UI.SequenceViewSpec} #layout: #(#{Graphics.LayoutFrame} 0 0 0 0 -2 0.6 0 1 ) #name: #stackList #model: #stackList #callbacksSpec: #(#{UI.UIEventCallbackSubSpec} #doubleClickSelector: #browseMethod #requestValueChangeSelector: #canContextChange: ) #menu: #contextMenu #useModifierKeys: true #selectionType: #highlight ) #(#{UI.ResizingSplitterSpec} #layout: #(#{Graphics.LayoutFrame} 0 0.6 -2 0 2 0.6 0 1 ) #name: #ResizingSplitter1 #horizontal: false #minAboveSize: 30 #minBelowSize: 30 #aboveWidgets: '#stackList' #belowWidgets: '#stackInspector' ) ) #compositeSpec: #(#{UI.CompositeSpec} #layout: #(#{Graphics.LayoutFrame} 0 0 0 0 0 1 -2 0.3 ) #name: #TopComposite ) ) #(#{UI.ResizingSplitterSpec} #layout: #(#{Graphics.LayoutFrame} -2 0.5 0 0.8 2 0.5 0 1 ) #name: #BotInspectResizer #horizontal: false #minAboveSize: 30 #minBelowSize: 30 #aboveWidgets: '#receiverInspector' #belowWidgets: 'contextInspector' ) ) ) )
</methods> <methods> Tools.ToolbarIconLibrary class <category>resources</category>
debugFirstLoop20x20 "UIMaskEditor new openOnClass: self andSelector: #debugFirstLoop20x20" <resource: #image> ^CachedImage on: (Image extent: 20@20 depth: 6 bitsPerPixel: 8 palette: (Graphics.MappedPalette withColors: (#(#(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(4593 64 321)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(7163 7163 7163)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(4658 578 771)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(8191 8191 8191)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(5878 7388 5621)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(2795 2795 2795)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(3501 0 225)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(7773 7773 7773)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(3244 3244 3244)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(6039 7581 5750)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(4593 578 771)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(5718 7163 5461)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(2955 2955 2955)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(3822 0 225)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(3951 0 257)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(6746 6746 6746)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(7934 7934 7934)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(3405 3405 3405)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(4465 1767 1767)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(5364 6746 5139)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(4465 64 321)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(8095 8095 8095)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(6938 6938 6938)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(5653 2249 2249)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(4208 0 257)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(3148 3148 3148)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(7388 7388 7388)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(4786 1895 1895)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(4658 0 289)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(3309 3309 3309)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(6199 7773 5910)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(2730 2730 2730)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(6232 6232 6232)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(4304 0 257)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(6392 6392 6392)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(3533 450 578)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(3437 32 225)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(2891 2891 2891)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(3565 32 257)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(5975 2377 2377)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(5525 6938 5300)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(6553 6553 6553)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(5204 6553 4979)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(4079 0 257)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(3052 3052 3052)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(7581 7581 7581)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(3501 418 578)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(6135 6135 6135)) ) collect: [:each | (each at: 1) value perform: (each at: 2) withArguments: (each at: 3)])) usingBits: (ByteArray fromPackedString: '@0LC@0LC@0LC@0LC@0LC@0LC@0LC@0LC@0LC@0LC@0LC@0LC@0LC@0LC@0LC@0LCGA0\GA0C@0LC@0LC@0LC@0LC@B\C@0LC@2\@@0LC@0LC@0LC@0HC@0LC@0LC@0LB@0LC@0LC@0LJEQTUEQTUEQTUEQTJ@0LC@0LCEA@PDA4]DA@PDA@PDA@T@0LC@0LWA0\GGQ8]GP\GA0\GA1\C@0LCHR4-KR4HBP$IB@ -KR4-KRDC@0LXF!(ZF"0DA@PDAB0,F!(ZF@LC@2,A@PDAK@,KB0,KB0,,@PD+@0LCC!XVE!XLJB (JB LCAXVE 8C@0LMC0<OC0TSD1LEAP<OC0<OCPLC@0L[JR$)AR(EAR$)JR$)JQ,C@0LC@2X"H"H_G2H"H"H"H"H"I LC@0LC@2L/K2</K2</K2</K2LC@0LC@0LC@28/K2</K2</K2<.@0LC@0LC@0LC@2PRK2</K2<RI@LC@0LC@0LC@0LC@0LFA XFA LC@0LC@0LC@0LC@0LC@0LC@0LC@0LC@0LC@0@a'))
debugFirstLoop20x20bw "Tools.UIMaskEditor new openOnClass: self andSelector: #debugFirstLoop20x20bw" <resource: #image> ^CachedImage on: (Image extent: 20@20 depth: 1 bitsPerPixel: 1 palette: CoveragePalette monoMaskPalette usingBits: #[0 0 0 0 0 0 0 0 0 248 0 0 3 6 0 0 4 1 0 0 8 0 128 0 17 128 64 0 17 96 64 0 33 24 32 0 33 6 32 0 33 1 32 0 33 6 32 0 33 24 32 0 17 96 64 0 17 128 64 0 8 0 128 0 4 1 0 0 3 6 0 0 0 248 0 0 0 0 0 0])
debugFirstLoop20x20mask "UIMaskEditor new openOnClass: self andSelector: #debugFirstLoop20x20mask" <resource: #image> ^CachedImage on: (Image extent: 20@20 depth: 1 bitsPerPixel: 1 palette: CoveragePalette monoMaskPalette usingBits: #[0 0 0 0 0 0 0 0 0 248 0 0 3 254 0 0 7 255 0 0 15 255 128 0 31 255 192 0 31 255 192 0 63 255 224 0 63 255 224 0 63 255 224 0 63 255 224 0 63 255 224 0 31 255 192 0 31 255 192 0 15 255 128 0 7 255 0 0 3 254 0 0 0 248 0 0 0 0 0 0])
debugJumpToCaret20x20 "UIMaskEditor new openOnClass: self andSelector: #debugJumpToCaret20x20" <resource: #image> ^CachedImage on: (Image extent: 20@20 depth: 2 bitsPerPixel: 2 palette: (Graphics.MappedPalette withColors: (#(#(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(0 0 0)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(1349 161 4272)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(8191 8191 8191)) ) collect: [:each | (each at: 1) value perform: (each at: 2) withArguments: (each at: 3)])) usingBits: #[170 170 170 170 170 0 0 0 170 170 170 170 170 0 0 0 170 168 32 170 170 0 0 0 170 170 138 170 170 0 0 0 170 170 138 170 170 0 0 0 170 170 138 170 170 0 0 0 170 170 138 170 170 0 0 0 170 154 138 154 170 0 0 0 170 150 138 90 170 0 0 0 165 85 137 85 106 0 0 0 170 150 138 90 170 0 0 0 170 154 138 154 170 0 0 0 170 170 138 170 170 0 0 0 170 170 138 170 170 0 0 0 170 170 138 170 170 0 0 0 170 170 138 170 170 0 0 0 170 168 32 170 170 0 0 0 170 170 170 170 170 0 0 0 170 170 170 170 170 0 0 0 170 170 170 170 170 0 0 0])
debugJumpToCaret20x20mask "UIMaskEditor new openOnClass: self andSelector: #debugJumpToCaret20x20mask" <resource: #image> ^CachedImage on: (Image extent: 20@20 depth: 1 bitsPerPixel: 1 palette: CoveragePalette monoMaskPalette usingBits: #[0 0 0 0 0 0 0 0 1 176 0 0 0 64 0 0 0 64 0 0 0 64 0 0 0 64 0 0 4 68 0 0 6 76 0 0 63 95 128 0 6 76 0 0 4 68 0 0 0 64 0 0 0 64 0 0 0 64 0 0 0 64 0 0 1 176 0 0 0 0 0 0 0 0 0 0 0 0 0 0])
debugNextLoop20x20 "UIMaskEditor new openOnClass: self andSelector: #debugNextLoop20x20" <resource: #image> ^CachedImage on: (Image extent: 20@20 depth: 6 bitsPerPixel: 8 palette: (Graphics.MappedPalette withColors: (#(#(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(4593 64 321)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(7163 7163 7163)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(4658 578 771)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(8191 8191 8191)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(5878 7388 5621)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(2795 2795 2795)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(3501 0 225)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(7773 7773 7773)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(3244 3244 3244)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(1349 161 4272)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(6039 7581 5750)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(4593 578 771)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(5718 7163 5461)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(2955 2955 2955)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(3951 0 257)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(3822 0 225)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(7934 7934 7934)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(3405 3405 3405)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(6746 6746 6746)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(4465 1767 1767)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(5364 6746 5139)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(4465 64 321)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(8095 8095 8095)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(6938 6938 6938)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(5653 2249 2249)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(4208 0 257)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(3148 3148 3148)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(7388 7388 7388)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(4786 1895 1895)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(4658 0 289)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(3309 3309 3309)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(6199 7773 5910)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(2730 2730 2730)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(6232 6232 6232)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(4304 0 257)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(6392 6392 6392)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(3533 450 578)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(3437 32 225)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(2891 2891 2891)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(3565 32 257)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(5975 2377 2377)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(5525 6938 5300)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(6553 6553 6553)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(5204 6553 4979)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(4079 0 257)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(3052 3052 3052)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(7581 7581 7581)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(3501 418 578)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(6135 6135 6135)) ) collect: [:each | (each at: 1) value perform: (each at: 2) withArguments: (each at: 3)])) usingBits: (ByteArray fromPackedString: '@0LC@0LC@0LC@0LC@0LC@0LC@0LC@0LC@0LC@0LC@0LC@0LIBPLC@0LC@0LC@0LCGQ4]GPLC@0$I@0LC@0LC@0LC@B C@0LC@0$IBP$IBPLC@0LC@0HC@0LC@0LCBP$IBP$I@0LC@0LKE!XVE!XVE LV@0$I@0LC@0LCEQ@PDA8^DA@PD@LCBP$C@0LC@0LXA0\GG!<^G \GA0LC@0LC@0LCH"8.K"8HB (JB@ .K"8.K"HC@0LYF1,[F24DA@PDAB4-F1,[FPLC@20A@PDAKP0LC@0LC@0-@PD,@0LCC!\WE1\MJR$)JR$MCQ\WE08C@0LOD!HRD TTEAPEAQHRD!HRC0LC@0L\J"(*AR,EAR(*J"(*J!0C@0LC@2\#H2L HBL#H2L#H2L#I0LC@0LC@2P0LC@0LC@0LC@0LBPC@0LC@0LC@2<0LC@0LC@0LC@/@0LC@0LC@0LC@2TSLC@0LC@SIPLC@0LC@0LC@0LC@0LFA XFA LC@0LC@0LC@0LC@0LC@0LC@0LC@0LC@0LC@0@a'))
debugNextLoop20x20bw "Tools.UIMaskEditor new openOnClass: self andSelector: #debugNextLoop20x20bw" <resource: #image> ^CachedImage on: (Image extent: 20@20 depth: 1 bitsPerPixel: 1 palette: CoveragePalette monoMaskPalette usingBits: #[0 0 0 0 0 1 128 0 0 241 128 0 3 7 224 0 4 7 224 0 8 1 128 0 17 129 128 0 17 96 0 0 33 24 32 0 33 6 32 0 33 1 32 0 33 6 32 0 33 24 32 0 17 96 64 0 17 128 64 0 8 0 128 0 4 1 0 0 3 6 0 0 0 248 0 0 0 0 0 0])
debugNextLoop20x20mask "UIMaskEditor new openOnClass: self andSelector: #debugNextLoop20x20mask" <resource: #image> ^CachedImage on: (Image extent: 20@20 depth: 1 bitsPerPixel: 1 palette: CoveragePalette monoMaskPalette usingBits: #[0 3 192 0 0 3 192 0 0 255 240 0 3 255 240 0 7 255 240 0 15 255 240 0 31 255 224 0 31 255 192 0 63 255 224 0 63 255 224 0 63 255 224 0 63 255 224 0 63 255 224 0 31 255 192 0 31 255 192 0 15 255 128 0 7 255 0 0 3 254 0 0 0 248 0 0 0 0 0 0])
debugRestart20x20 "UIMaskEditor new openOnClass: self andSelector: #debugRestart20x20" <resource: #image> ^CachedImage on: (Image extent: 20@20 depth: 4 bitsPerPixel: 4 palette: (Graphics.MappedPalette withColors: (#(#(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(8191 8191 8191)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(3148 3148 3148)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(1349 161 4272)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(5846 5846 4529)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(6874 6874 4658)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(3373 3373 3373)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(7870 7870 5332)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(2955 2955 2955)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(2795 2795 2795)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(7388 7388 5011)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(3501 3501 3501)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(8191 8191 5557)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(4915 4915 3822)) ) collect: [:each | (each at: 1) value perform: (each at: 2) withArguments: (each at: 3)])) usingBits: (ByteArray fromPackedString: '@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@BH"@@@@@@@@@@@@H @@H @@@@@@@@@B@@@@@B@@@@@@@@@B@J**@B@@@@@@@@@ B#.3(@H@@@@@@@@ AVY&T@H@@@@@@@@ @Y&YD@H@@@@@@@@ A<QL\@H@@@@@@@@B@H"H@@@@@@@@@@@B@@@ @@@@@@@@@@@@H @"@@@@@@@@@@@@@BH"H@@@@@@@@@@@@@@"@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@'))
debugRestart20x20mask "UIMaskEditor new openOnClass: self andSelector: #debugRestart20x20mask" <resource: #image> ^CachedImage on: (Image extent: 20@20 depth: 1 bitsPerPixel: 1 palette: CoveragePalette monoMaskPalette usingBits: #[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 240 0 0 3 12 0 0 4 2 0 0 4 242 0 0 9 249 0 0 9 249 0 0 9 249 0 0 9 249 0 0 4 240 0 0 4 32 0 0 3 48 0 0 0 248 0 0 0 48 0 0 0 32 0 0 0 0 0 0 0 0 0 0])
debugReturn20x20 "UIMaskEditor new openOnClass: self andSelector: #debugReturn20x20" <resource: #image> ^CachedImage on: (Image extent: 20@20 depth: 5 bitsPerPixel: 8 palette: (Graphics.MappedPalette withColors: (#(#(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(2281 2281 2281)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(6553 6553 4433)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(2505 2505 2505)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(8191 8191 8191)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(2345 2345 2345)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(2827 2827 2827)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(5653 7131 5429)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(2409 2409 2409)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(6424 8063 6135)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(2730 2730 2730)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(2570 2570 2570)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(5878 7388 5621)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(6264 7870 5975)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(2313 2313 2313)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(2634 2634 2634)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(2795 2795 2795)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(2698 2698 2698)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(5493 6874 5236)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(2859 2859 2859)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(5332 6681 5075)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(6746 6746 4593)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(6649 6649 4497)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(6071 7613 5814)) ) collect: [:each | (each at: 1) value perform: (each at: 2) withArguments: (each at: 3)])) usingBits: (ByteArray fromPackedString: '@0LC@0LC@0LC@0LC@0LC@0LC@0LC@0LC@0LC@0LC@0LC@0LC@0LC@0LC@0LC@0LC@0LO@0LC@0LC@0LC@0LC@0LC@0LCC0 O@0LC@0LC@0LC@0LC@0LC@0LOC@<C@0LC@0LC@0LC@0LC@0LCC1XVE <C@0LC@0LC@0LC@0LC@0LIB0,KBPLC@0LC@0LC@0LC@0LCD@XFA XFD@LC@0LC@0LC@0LC@0LBDQDQDQDB@0LC@0LC@0LC@0LC@!LSD1LSD1LB@0LC@0LC@0LC@0LB@ HB@ HB@ HC@0LC@0LC@0LC@0LC@0LC@0LC@0LC@0LC@0LC@0LC@0LC@@@@@0LC@0LC@0LC@0LC@0LC@0@TEAP@@0LC@0LC@0LC@0LC@0LC@ATUEP@C@0LC@0LC@0LC@0LC@0L@@PDA@@LC@0LC@0LC@0LC@0LC@0L@@@@C@0LC@0LC@0LC@0LC@0LC@0LC@0LC@0LC@0LC@0LC@0LC@0LC@0LC@0LC@0LC@0LC@0LC@0LC@0LC@0LC@0LC@0LC@0@a'))
debugReturn20x20mask "UIMaskEditor new openOnClass: self andSelector: #debugReturn20x20mask" <resource: #image> ^CachedImage on: (Image extent: 20@20 depth: 1 bitsPerPixel: 1 palette: CoveragePalette monoMaskPalette usingBits: #[0 0 0 0 0 0 0 0 0 32 0 0 0 112 0 0 0 112 0 0 0 248 0 0 0 248 0 0 1 252 0 0 1 252 0 0 3 254 0 0 3 254 0 0 0 0 0 0 0 112 0 0 0 248 0 0 0 248 0 0 0 248 0 0 0 112 0 0 0 0 0 0 0 0 0 0 0 0 0 0])
debugRun20x20 "UIMaskEditor new openOnClass: self andSelector: #debugRun20x20" <resource: #image> ^CachedImage on: (Image extent: 20@20 depth: 5 bitsPerPixel: 8 palette: (Graphics.MappedPalette withColors: (#(#(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(5621 7035 5364)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(6521 8191 6232)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(2505 2505 2505)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(8191 8191 8191)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(6135 7709 5846)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(6360 7998 6071)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(2827 2827 2827)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(2345 2345 2345)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(5364 6746 5139)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(2409 2409 2409)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(2730 2730 2730)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(2570 2570 2570)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(5268 6649 5043)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(5878 7388 5621)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(6264 7870 5975)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(5718 7195 5493)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(2473 2473 2473)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(2634 2634 2634)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(2313 2313 2313)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(2795 2795 2795)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(2698 2698 2698)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(6007 7549 5750)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(2859 2859 2859)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(5493 6874 5236)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(6456 8095 6167)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(2281 2281 2281)) ) collect: [:each | (each at: 1) value perform: (each at: 2) withArguments: (each at: 3)])) usingBits: (ByteArray fromPackedString: '@0LC@0LC@0LC@0LC@0LC@0LC@0LC@0LC@0LC@0LC@0LC@0LC@0LC@0LC@0LC@0LC@0LC@0LC@0LC@0LC@0LC@1LS@0LC@0LC@0LC@0LC@0LC@0LCD0DSD0LC@0LC@0LC@0LC@0LC@0LSFA XD1LC@0LC@0LC@0LC@0LC@1LEAPTEAQLS@0LC@0LC@0LC@0LCB 8NC 8NC 8JB LC@0LC@0LC@0LTA@PDA@PDA@PDEAPC@0LC@0LC@0HUEQTUEQTUEQTUEPHC@0LC@0LC@ 4MCP4MCP4MCP4M@ LC@0LC@0LBC0<OC0<OC0<O@ HC@0LC@0LC@1@@@@@@@@@@DA@C@0LC@0LC@0LCFQ\WE1\WFQ$C@0LC@0LC@0LC@0LYB@ HFQ$C@0LC@0LC@0LC@0LC@1$LFQ$C@0LC@0LC@0LC@0LC@0LCFQ$C@0LC@0LC@0LC@0LC@0LC@0LC@0LC@0LC@0LC@0LC@0LC@0LC@0LC@0LC@0LC@0LC@0LC@0LC@0LC@0LC@0LC@0LC@0LC@0LC@0@a'))
debugRun20x20bw "Tools.UIMaskEditor new openOnClass: self andSelector: #debugRun20x20bw" <resource: #image> ^CachedImage on: (Image extent: 20@20 depth: 1 bitsPerPixel: 1 palette: CoveragePalette monoMaskPalette usingBits: #[0 0 0 0 0 0 0 0 0 0 0 0 12 0 0 0 15 0 0 0 15 192 0 0 15 240 0 0 15 252 0 0 15 255 0 0 15 255 128 0 15 255 128 0 15 255 0 0 15 252 0 0 15 240 0 0 15 192 0 0 15 0 0 0 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0])
debugRun20x20mask "UIMaskEditor new openOnClass: self andSelector: #debugRun20x20mask" <resource: #image> ^CachedImage on: (Image extent: 20@20 depth: 1 bitsPerPixel: 1 palette: CoveragePalette monoMaskPalette usingBits: #[0 0 0 0 0 0 0 0 0 0 0 0 12 0 0 0 15 0 0 0 15 192 0 0 15 240 0 0 15 252 0 0 15 255 0 0 15 255 128 0 15 255 128 0 15 255 0 0 15 252 0 0 15 240 0 0 15 192 0 0 15 0 0 0 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0])
debugRunToCaret20x20 "UIMaskEditor new openOnClass: self andSelector: #debugRunToCaret20x20" <resource: #image> ^CachedImage on: (Image extent: 20@20 depth: 4 bitsPerPixel: 4 palette: (Graphics.MappedPalette withColors: (#(#(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(0 0 0)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(4915 6199 4722)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(6521 8191 6232)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(6296 7902 6007)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(4690 5910 4497)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(8191 8191 8191)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(5975 7516 5718)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(2827 2827 2827)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(3212 3212 3212)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(3373 3373 3373)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(2634 2634 2634)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(3019 3019 3019)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(2538 2538 2538)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(3501 3501 3501)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(5621 7067 5364)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(5236 6585 5011)) ) collect: [:each | (each at: 1) value perform: (each at: 2) withArguments: (each at: 3)])) usingBits: (ByteArray fromPackedString: 'UUUUUUUUUUUUUP@@UUUUUUUUUUUUUP@@UUUUUUUU@E@EUP@@UUUUUUUUUPUUUP@@UUUUUUUUUPUUUP@@UUW]UUUUUPUUUP@@UUWR7UUUUPUUUP@@UUVSL9%UUPUUUP@@UUVFY&ZHUPUUUP@@UUV>;.;.-PUUUP@@UUU???=7UPUUUP@@UUWAD\1UUPUUUP@@UUWD3EUUUPUUUP@@UUWLUUUUUPUUUP@@UUUUUUUUUPUUUP@@UUUUUUUUUPUUUP@@UUUUUUUU@E@EUP@@UUUUUUUUUUUUUP@@UUUUUUUUUUUUUP@@UUUUUUUUUUUUUP@@'))
debugRunToCaret20x20mask "UIMaskEditor new openOnClass: self andSelector: #debugRunToCaret20x20mask" <resource: #image> ^CachedImage on: (Image extent: 20@20 depth: 1 bitsPerPixel: 1 palette: CoveragePalette monoMaskPalette usingBits: #[0 0 0 0 0 0 0 0 0 13 128 0 0 2 0 0 0 2 0 0 12 2 0 0 15 2 0 0 15 194 0 0 15 242 0 0 15 250 0 0 15 242 0 0 15 194 0 0 15 2 0 0 12 2 0 0 0 2 0 0 0 2 0 0 0 13 128 0 0 0 0 0 0 0 0 0 0 0 0 0])
debugStep20x20 "UIMaskEditor new openOnClass: self andSelector: #debugStep20x20" <resource: #image> ^CachedImage on: (Image extent: 20@20 depth: 5 bitsPerPixel: 8 palette: (Graphics.MappedPalette withColors: (#(#(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(1702 2538 4047)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(2762 3630 5043)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(3212 3630 4336)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(2409 3276 4754)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(8191 8191 8191)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(1413 2184 3662)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(3758 4369 5493)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(4658 5139 5975)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(1959 2377 3116)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(2987 3855 5236)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(4561 5172 6199)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(2762 3052 3533)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(4047 4722 5942)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(3758 4079 4658)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(2216 2602 3276)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(1992 2891 4433)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(2955 3180 3662)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(2505 3052 3983)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(5043 5557 6456)) ) collect: [:each | (each at: 1) value perform: (each at: 2) withArguments: (each at: 3)])) usingBits: (ByteArray fromPackedString: 'A@PDA@PDA@PDA@PDA@PDA@PDA@PDA@PDA@PDA@PDA@PDA@PDA@PDA@PDA@PDA@PDA@PDA@PDA@PDA@PDA@PDA@PDA@$IBP$IA@PDA@PDA@PDA@PDA@PAA@PDA@PAA@PDA@PDA@PDA@PD@0PDA@PDA@PCA@PDA@PDA@PDA@POA@PDA@POC0<OC0PDA@PDA@PDA@@DA@PDA@P@@@@DA@PDA@PDA@PDA@PDA@PDA@PEA@PDA@PDA@PDA@PDA@PDA@PDA@PDA@PDA@PDA@PDD@4PA@PDA@PPCQ@DA@PDA@PDA@,GD \KA@PDB0\RA0,DA@PDA@PD@ (JB HDA@PBB (J@ PDA@PDA@PNA 0FC PDA@8FC@XNA@PDA@PDA@PHDP DA@PDA@ QB@PDA@PDA@PDA@PDA@PDA@PDA@PDA@PDA@PDA@PDA@PDA@PDA@PDA@PDA@PDA@PDA@PDA@PDA@PDA@PDA@PDA@PDA@PDA@PDA@PDA@PDA@PDA@PDA@PDA@PDA@PDA@PDA@PDA@PDA@PDA@@a'))
debugStep20x20bw "Tools.UIMaskEditor new openOnClass: self andSelector: #debugStep20x20bw" <resource: #image> ^CachedImage on: (Image extent: 20@20 depth: 1 bitsPerPixel: 1 palette: CoveragePalette monoMaskPalette usingBits: #[0 0 0 0 0 0 0 0 0 0 0 0 1 240 0 0 2 8 0 0 4 4 0 0 4 31 0 0 4 14 0 0 0 4 0 0 0 0 0 0 14 14 0 0 17 17 0 0 17 17 0 0 17 17 0 0 14 14 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0])
debugStep20x20mask "UIMaskEditor new openOnClass: self andSelector: #debugStep20x20mask" <resource: #image> ^CachedImage on: (Image extent: 20@20 depth: 1 bitsPerPixel: 1 palette: CoveragePalette monoMaskPalette usingBits: #[0 0 0 0 0 0 0 0 0 0 0 0 1 240 0 0 2 8 0 0 4 4 0 0 4 31 0 0 4 14 0 0 0 4 0 0 0 0 0 0 14 14 0 0 31 31 0 0 31 31 0 0 31 31 0 0 14 14 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0])
debugStepInto20x20 "UIMaskEditor new openOnClass: self andSelector: #debugStepInto20x20" <resource: #image> ^CachedImage on: (Image extent: 20@20 depth: 5 bitsPerPixel: 8 palette: (Graphics.MappedPalette withColors: (#(#(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(1638 2473 3983)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(1510 2313 3790)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(1317 2056 3533)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(3212 3630 4336)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(8191 8191 8191)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(3758 4369 5493)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(1413 2184 3662)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(4658 5139 5975)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(1959 2377 3116)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(2987 3855 5236)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(2473 3341 4786)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(2891 3758 5139)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(2281 3148 4658)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(2634 3501 4915)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(2762 3052 3533)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(3758 4079 4658)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(4561 5172 6199)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(2088 2987 4497)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(2955 3180 3662)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(2216 2602 3276)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(4047 4722 5942)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(1927 2795 4336)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(2505 3052 3983)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(1799 2634 4144)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(2795 3630 5043)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(5043 5557 6456)) ) collect: [:each | (each at: 1) value perform: (each at: 2) withArguments: (each at: 3)])) usingBits: (ByteArray fromPackedString: 'A@PDA@PDA@PDA@PDA@PDA@PDA@PDA@PDA@PDA@PDA@PDA@PDA@PDA@PDA@PDA@PDA@PDA@PDA@PDA@PDA@PDA@PDA@PDA@PDA@PDA@PDA@PDA@PDA@$IBP$DA@PDA@PDA@PDA@PDA@PKA@PDA@,DA@PDA@PDA@PDA@PDAA DA@PDF@PDA@PDA@PDA@PDA@PDA@PDA@PMA@PDA@PDA@PDA@PDAAHOD PDA@(DA@PRC1HDA@PDA@PNA1$GC PDC@PDC \YA08DA@PDA@LPDA@CA@PQA@PCDA@P@0PDA@PDD0TTAQLDAATDAALEE@TSA@PDA@PDBAXHA@PDE0PDA@ VB@PDA@PDA@PDA@PDA@P@A@PDA@PDA@PDA@PDA@PDA@PA@PDA@PPDA@PDA@PDA@PDA@PDA@PFA XDA@PDA@PDA@PDA@PDA@PDA@PBA@PDA@PDA@PDA@PDA@PDA@PDA@PDA@PDA@PDA@PDA@PDA@PDA@PDA@PDA@PDA@PDA@PDA@PDA@PDA@PDA@PDA@PDA@PDA@@a'))
debugStepInto20x20bw "Tools.UIMaskEditor new openOnClass: self andSelector: #debugStepInto20x20bw" <resource: #image> ^CachedImage on: (Image extent: 20@20 depth: 1 bitsPerPixel: 1 palette: CoveragePalette monoMaskPalette usingBits: #[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 128 0 0 8 64 0 0 8 64 0 0 0 64 0 0 28 71 0 0 34 72 128 0 34 72 128 0 34 72 128 0 28 71 0 0 0 64 0 0 1 240 0 0 0 224 0 0 0 64 0 0 0 0 0 0 0 0 0 0 0 0 0 0])
debugStepInto20x20mask "UIMaskEditor new openOnClass: self andSelector: #debugStepInto20x20mask" <resource: #image> ^CachedImage on: (Image extent: 20@20 depth: 1 bitsPerPixel: 1 palette: CoveragePalette monoMaskPalette usingBits: #[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 128 0 0 8 64 0 0 8 64 0 0 0 64 0 0 28 71 0 0 62 79 128 0 62 79 128 0 62 79 128 0 28 71 0 0 0 64 0 0 1 240 0 0 0 224 0 0 0 64 0 0 0 0 0 0 0 0 0 0 0 0 0 0])
debugStepOver20x20 "UIMaskEditor new openOnClass: self andSelector: #debugStepOver20x20" <resource: #image> ^CachedImage on: (Image extent: 20@20 depth: 5 bitsPerPixel: 8 palette: (Graphics.MappedPalette withColors: (#(#(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(0 0 0)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(1413 2024 3116)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(8191 8191 8191)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(899 1285 1927)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(3212 3630 4336)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(3758 4369 5493)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(4658 5139 5975)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(707 1028 1606)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(1702 2473 3758)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(1959 2377 3116)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(1124 1606 2505)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(642 932 1478)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(803 1156 1799)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(4561 5172 6199)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(1028 1478 2216)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(2762 3052 3533)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(4047 4722 5942)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(803 1156 1767)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(3758 4079 4658)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(1028 1478 2184)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(2955 3180 3662)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(964 1381 2088)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(1060 1542 2313)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(1510 2184 3405)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(2216 2602 3276)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(2505 3052 3983)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(5043 5557 6456)) ) collect: [:each | (each at: 1) value perform: (each at: 2) withArguments: (each at: 3)])) usingBits: (ByteArray fromPackedString: '@ HB@ HB@ HB@ HB@ HB@ HB@ HB@ HB@ HB@ HB@ HB@ HB@ HB@ HB@ HB@ HB@ HB@ HB@ HB@ HB@ HB@ HSC 8NC 8NC!LB@ HB@ HB@ HBEPHB@ HB@ HB@!TB@ HB@ HB@ LB@ HB@ HB@ HB@!XB@ HB@ HBC@HB@ HB@ HB@!DAB@DQ@ HB@ HG@ HB@ HB@ HB@ (WB HB@ HB@ HB@ HB@ HB@ HB@ ,B@ HB@ HB@ HB@ @@@ @@@ HB@ HB@ HB@!PRE@HB@@HB@ @B@!PRE@HB@ HOA!(FC0H@@ HB@@HOA!(FC0HB@ PMCP4D@ @B@ H@@ PMCP4D@ HBF@TPAQ B@@HB@ @BF@TPAQ B@ HBBQ$I@ H@@ HB@@HBBQ$I@ HB@ HB@ HB@ @@@ @@@ HB@ HB@ HB@ HB@ HB@ HB@ HB@ HB@ HB@ HB@ HB@ HB@ HB@ HB@ HB@ HB@ HB@ HB@ HB@ HB@ HB@ HB@ HB@ HB@ HB@ HB@ HB@ HB@ HB@ @a'))
debugStepOver20x20bw "Tools.UIMaskEditor new openOnClass: self andSelector: #debugStepOver20x20bw" <resource: #image> ^CachedImage on: (Image extent: 20@20 depth: 1 bitsPerPixel: 1 palette: CoveragePalette monoMaskPalette usingBits: #[0 0 0 0 0 0 0 0 0 0 0 0 7 252 0 0 8 2 0 0 16 1 0 0 16 7 192 0 16 3 128 0 0 1 0 0 1 176 0 0 57 19 128 0 69 20 64 0 69 20 64 0 69 20 64 0 57 19 128 0 1 176 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0])
debugStepOver20x20mask "UIMaskEditor new openOnClass: self andSelector: #debugStepOver20x20mask" <resource: #image> ^CachedImage on: (Image extent: 20@20 depth: 1 bitsPerPixel: 1 palette: CoveragePalette monoMaskPalette usingBits: #[0 0 0 0 0 0 0 0 0 0 0 0 7 252 0 0 8 2 0 0 16 1 0 0 16 7 192 0 16 3 128 0 0 1 0 0 1 176 0 0 57 19 128 0 125 23 192 0 125 23 192 0 125 23 192 0 57 19 128 0 1 176 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0])
debugTerminate20x20 "UIMaskEditor new openOnClass: self andSelector: #debugTerminate20x20" <resource: #image> ^CachedImage on: (Image extent: 20@20 depth: 5 bitsPerPixel: 8 palette: (Graphics.MappedPalette withColors: (#(#(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(7195 3244 2281)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(8191 8191 8191)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(2345 2345 2345)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(3373 3373 3373)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(2505 2505 2505)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(7292 3565 2505)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(7131 3052 2152)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(6970 2538 1799)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(2955 2955 2955)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(2666 2666 2666)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(2377 2377 2377)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(7067 2859 2024)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(3116 3116 3116)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(6970 2602 1831)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(7003 2666 1895)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(3276 3276 3276)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(7227 3341 2345)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(7163 3148 2216)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(2859 2859 2859)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(7099 2955 2088)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(2441 2441 2441)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(2602 2602 2602)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(7035 2762 1959)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(3341 3341 3341)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(7259 3437 2409)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(3052 3052 3052)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(2762 2762 2762)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(7292 3501 2473)) #(#{Graphics.ColorValue} #scaledRed:scaledGreen:scaledBlue: #(3212 3212 3212)) ) collect: [:each | (each at: 1) value perform: (each at: 2) withArguments: (each at: 3)])) usingBits: (ByteArray fromPackedString: '@PDA@PDA@PDA@PDA@PDA@PDA@PDA@PDA@PDA@PDA@PDA@PDA@PDA@PDA@PDO@PDA@PDA@PDAC0DA@PDA@PDAC0TO@PDA@PDA@P<EC0DA@PDA@P<[F1,O@PDA@PDOF1,[C0DA@PDA@Q0XFA \@PDAGA XFA0A@PDA@PDA@Q$PDA@Y@Q$PDA@Y@PDA@PDA@PDA@Q$@@@@Y@@@@FPDA@PDA@PDA@PDA@P @@@@@@@ A@PDA@PDA@PDA@PDA@Q(FA XZ@PDA@PDA@PDA@PDA@PDZD1LSD1LZ@PDA@PDA@PDA@PDAA@,KB0PKB0,D@PDA@PDA@PDA@PPVE!XD@PPVE!XD@PDA@PDA@PDDC 8NA@DA@PPNC 8D@PDA@PDAE@4MCQPA@PDA@QPMCP4T@PDA@PDAB \J@PDA@PDA@P(GB DA@PDA@PDA@ DA@PDA@PDA@PHA@PDA@PDA@PDA@PDA@PDA@PDA@PDA@PDA@PDA@PDA@PDA@PDA@PDA@PDA@PDA@PDA@PDA@PDA@PDA@PDA@PDA@P@a'))
debugTerminate20x20mask "UIMaskEditor new openOnClass: self andSelector: #debugTerminate20x20mask" <resource: #image> ^CachedImage on: (Image extent: 20@20 depth: 1 bitsPerPixel: 1 palette: CoveragePalette monoMaskPalette usingBits: #[0 0 0 0 0 0 0 0 8 2 0 0 28 7 0 0 62 15 128 0 31 31 0 0 15 190 0 0 7 252 0 0 3 248 0 0 1 240 0 0 3 248 0 0 7 252 0 0 15 190 0 0 31 31 0 0 62 15 128 0 28 7 0 0 8 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0])
</methods> <initialize> CraftedSmalltalk.RestartSignal </initialize> <initialize> CraftedSmalltalk.DebuggerClient </initialize> "Imported Classes:" self error: 'Attempting to file-in parcel imports. Choose terminate or close' <class> <name>Object</name> <environment>Core</environment> <super></super> <private>false</private> none <imports></imports> <category>Kernel-Objects</category> <attributes> <package>Kernel-Objects</package> </attributes> </class> <class> <name>ScrollingView</name> <environment>UI</environment> <super>UI.SimpleView</super> <private>false</private> none scrollOffset <imports></imports> <category>UIBasics-Support</category> <attributes> <package>UIBasics-Support</package> </attributes> </class> <class> <name>EventSensor</name> <environment>UI</environment> <super>UI.ApplicationWindowSensor</super> <private>false</private> none collapseEvents queueLocked <imports></imports> <category>Interface-Events-Support</category> <attributes> <package>Interface-Events-Support</package> </attributes> </class> <class> <name>Notification</name> <environment>Core</environment> <super>Core.Exception</super> <private>false</private> none <imports></imports> <category>Kernel-Exception Handling</category> <attributes> <package>Kernel-Exception Handling</package> </attributes> </class> <class> <name>ApplicationModel</name> <environment>UI</environment> <super>UI.Model</super> <private>false</private> none builder uiSession eventHandlers savedWindowInformation <imports></imports> <category>UIBuilder-Framework</category> <attributes> <package>UIBuilder-Framework</package> </attributes> </class> <class> <name>ControlInterrupt</name> <environment>Core</environment> <super>Core.GenericException</super> <private>false</private> none isInterrupt <imports></imports> <category>Kernel-Exception Handling</category> <attributes> <package>Kernel-Exception Handling</package> </attributes> </class> <class> <name>SystemNotification</name> <environment>Core</environment> <super>Core.ControlInterrupt</super> <private>false</private> none <imports></imports> <category>Kernel-Exception Handling</category> <attributes> <package>Kernel-Exception Handling</package> </attributes> </class>