Merge jv
authorHG Automerge
Wed, 01 Feb 2017 11:36:30 +0000
branchjv
changeset 17379 028adf14bc05
parent 17304 3eea1002b141 (current diff)
parent 17306 c31372fbe05a (diff)
child 17390 ce68ee978f93
Merge
AbstractDirectoryBrowser.st
AbstractFileBrowser.st
AbstractFileFinderApplicationComponent.st
AbstractSettingsApplication.st
CodeGeneratorTool.st
DebugView.st
EditFieldWithCompletion.st
ExpandableRevisionItem.st
FileApplicationNoteBook.st
ProcessMonitorV2.st
Tools__ClassList.st
Tools__HierarchicalClassList.st
Tools__Inspector2Tab.st
Tools__LintHighlighter.st
Tools__LintRuleDetail.st
Tools__LintRuleList.st
Tools__LintRuleSelectionDialog.st
Tools__NewClassWizardDialog.st
Tools__NewSystemBrowser.st
abbrev.stc
extensions.st
resources/de.rs
stx_libtool.st
--- a/.hgtags	Wed Jan 25 19:02:59 2017 +0000
+++ b/.hgtags	Wed Feb 01 11:36:30 2017 +0000
@@ -33,6 +33,7 @@
 596696438e67fee735ba71f62177ccc091b9a0bb expecco_1_7_2rc1
 5aa270837e0ab5e0fa19d2c02d46c864cc41c859 expeccoNET_1_5_1rc1
 62451ecb3d3bbf1f6067c931eda2cdb57aa67ead expeccoNET_1_7_0_0
+6a1aa6e554dd6aa718dcffaf083a91f120f434a1 expecco_ALM_1_10_0
 6ae442626f2090b5275b777f1a9d09ef0e092628 rel3_4_1_2
 6ea7ea821b44f30ae3737d4703af910788f4c854 rel3-1-2
 70600cb35dad3cb3331116ba9056e7bf99ead681 expecco_2_7_0
--- a/AbstractDirectoryBrowser.st	Wed Jan 25 19:02:59 2017 +0000
+++ b/AbstractDirectoryBrowser.st	Wed Feb 01 11:36:30 2017 +0000
@@ -46,6 +46,12 @@
 "
 ! !
 
+!AbstractDirectoryBrowser class methodsFor:'queries'!
+
+isAbstract
+    ^ self == AbstractDirectoryBrowser
+! !
+
 !AbstractDirectoryBrowser methodsFor:'accessing'!
 
 updateToExternFileHolderLock
--- a/AbstractFileBrowser.st	Wed Jan 25 19:02:59 2017 +0000
+++ b/AbstractFileBrowser.st	Wed Feb 01 11:36:30 2017 +0000
@@ -2821,6 +2821,12 @@
     ^ CodeExecutionLock new
 ! !
 
+!AbstractFileBrowser class methodsFor:'queries'!
+
+isAbstract
+    ^ self == AbstractFileBrowser
+! !
+
 !AbstractFileBrowser class methodsFor:'resources'!
 
 classResources
--- a/AbstractFileFinderApplicationComponent.st	Wed Jan 25 19:02:59 2017 +0000
+++ b/AbstractFileFinderApplicationComponent.st	Wed Feb 01 11:36:30 2017 +0000
@@ -37,6 +37,12 @@
  other person.  No title to or ownership of the software is
  hereby transferred.
 "
+!
+
+documentation
+" 
+    abstract superclass of file-search appliations which are embedded in the file browserV2
+"
 ! !
 
 !AbstractFileFinderApplicationComponent class methodsFor:'queries'!
--- a/AbstractSettingsApplication.st	Wed Jan 25 19:02:59 2017 +0000
+++ b/AbstractSettingsApplication.st	Wed Feb 01 11:36:30 2017 +0000
@@ -1360,6 +1360,15 @@
     "Modified: / 22-01-2012 / 10:50:15 / cg"
 ! !
 
+!AbstractSettingsApplication::AutoloadedPackagesSettingsAppl class methodsFor:'documentation'!
+
+documentation
+"
+    I manage packages which are to be loade automatically
+    whenever st/x ist started
+"
+! !
+
 !AbstractSettingsApplication::AutoloadedPackagesSettingsAppl class methodsFor:'help specs'!
 
 flyByHelpSpec
@@ -1581,6 +1590,14 @@
     ^ false.
 ! !
 
+!AbstractSettingsApplication::BuildSettingsAppl class methodsFor:'documentation'!
+
+documentation
+"
+    I manage parameters for package building (for deployment)
+"
+! !
+
 !AbstractSettingsApplication::BuildSettingsAppl class methodsFor:'help specs'!
 
 flyByHelpSpec
@@ -1923,6 +1940,15 @@
     ^ #('disabled' 'level1 (always safe)' 'level2 (usually safe)' 'full')
 ! !
 
+!AbstractSettingsApplication::ByteCodeCompilerSettingsAppl class methodsFor:'documentation'!
+
+documentation
+"
+    I manage settings for bytecode compilation.
+    Mostly controlling accepted syntax, warnings and errors.
+"
+! !
+
 !AbstractSettingsApplication::ByteCodeCompilerSettingsAppl class methodsFor:'help specs'!
 
 flyByHelpSpec
@@ -3227,6 +3253,14 @@
     ^ ObjectMemory supportsJustInTimeCompilation
 ! !
 
+!AbstractSettingsApplication::ChangeFileSettingsAppl class methodsFor:'documentation'!
+
+documentation
+"
+    I manage where the change file is to be stored and what is to be written into it
+"
+! !
+
 !AbstractSettingsApplication::ChangeFileSettingsAppl class methodsFor:'help specs'!
 
 flyByHelpSpec
--- a/CodeGeneratorTool.st	Wed Jan 25 19:02:59 2017 +0000
+++ b/CodeGeneratorTool.st	Wed Feb 01 11:36:30 2017 +0000
@@ -398,7 +398,7 @@
  inclusion of the above copyright notice.  This software may not
  be provided or otherwise made available to, or used by, any
  other person.  No title to or ownership of the software is
- hereby transferred.' bindWith:'%1' with:copyrightHolder.
+ hereby transferred.' bindWith:(Date today year) with:copyrightHolder.
 !
 
 copyrightTemplate:aString
--- a/DebugView.st	Wed Jan 25 19:02:59 2017 +0000
+++ b/DebugView.st	Wed Feb 01 11:36:30 2017 +0000
@@ -16,58 +16,58 @@
 "{ NameSpace: Smalltalk }"
 
 StandardSystemView subclass:#DebugView
-        instanceVariableNames:'busy haveControl exitAction canContinue contextView codeView
-                receiverInspector contextInspector contextArray selectedContext
-                catchBlock grabber mayProceed traceView tracing bigStep
-                skipLineNr abortButton terminateButton continueButton stepButton
-                nextButton nextOverButton nextOutButton sendButton returnButton
-                restartButton exclusive inspecting nChainShown inspectedProcess
-                updateProcess updateButton defineButton monitorToggle stepping
-                steppedContextLineno actualContext inWrap stackInspector
-                steppedContext wrapperContext firstContext stepHow cachable
-                currentMethod ignoreBreakpoints stepUntilEntering
-                lastStepUntilEntering lastSelectionInReceiverInspector
-                lastSelectionInContextInspector canShowMore reportButton
-                setOfHiddenCallingSelectors isStoppedAtHaltOrBreakPoint
-                exceptionInfoLabel methodCodeToggle
-                methodCodeToggleSelectionHolder
-                isStoppedAtBreakPointWithParameter breakPointParameter
-                hideSupportCode contextInfoLabel resendButton
-                gotoDialogOpenerButton isStoppedInModalDialog selectorToDefine
-                classToDefineIn gotoApplicationActionMethodButton
-                isStoppedInApplicationAction isStoppedAtStatementBreakpoint
-                verboseBacktraceHolder'
-        classVariableNames:'CachedDebugger CachedExclusive OpenDebuggers MoreDebuggingDetail
-                DebuggingDebugger DebuggingDebugger2 DebuggingContextWalk
-                DefaultDebuggerBackgroundColor InitialNChainShown IgnoredHalts
-                ShowThreadID LastIgnoreHaltNTimes LastIgnoreHaltDuration
-                LastExtent LastOrigin RememberedCallChain DebuggingDebugger3
-                NumberOfDebuggers DebuggerOnMainDisplayOnly'
-        poolDictionaries:''
-        category:'Interface-Debugger'
+	instanceVariableNames:'busy haveControl exitAction canContinue contextView codeView
+		receiverInspector contextInspector contextArray selectedContext
+		catchBlock grabber mayProceed traceView tracing bigStep
+		skipLineNr abortButton terminateButton continueButton stepButton
+		nextButton nextOverButton nextOutButton sendButton returnButton
+		restartButton exclusive inspecting nChainShown inspectedProcess
+		updateProcess updateButton defineButton monitorToggle stepping
+		steppedContextLineno actualContext inWrap stackInspector
+		steppedContext wrapperContext firstContext stepHow cachable
+		currentMethod ignoreBreakpoints stepUntilEntering
+		lastStepUntilEntering lastSelectionInReceiverInspector
+		lastSelectionInContextInspector canShowMore reportButton
+		setOfHiddenCallingSelectors isStoppedAtHaltOrBreakPoint
+		exceptionInfoLabel methodCodeToggle
+		methodCodeToggleSelectionHolder
+		isStoppedAtBreakPointWithParameter breakPointParameter
+		hideSupportCode contextInfoLabel resendButton
+		gotoDialogOpenerButton isStoppedInModalDialog selectorToDefine
+		classToDefineIn gotoApplicationActionMethodButton
+		isStoppedInApplicationAction isStoppedAtStatementBreakpoint
+		verboseBacktraceHolder'
+	classVariableNames:'CachedDebugger CachedExclusive OpenDebuggers MoreDebuggingDetail
+		DebuggingDebugger DebuggingDebugger2 DebuggingContextWalk
+		DefaultDebuggerBackgroundColor InitialNChainShown IgnoredHalts
+		ShowThreadID LastIgnoreHaltNTimes LastIgnoreHaltDuration
+		LastExtent LastOrigin RememberedCallChain DebuggingDebugger3
+		NumberOfDebuggers DebuggerOnMainDisplayOnly'
+	poolDictionaries:''
+	category:'Interface-Debugger'
 !
 
 Object subclass:#IgnoredHaltOrBreakpoint
-        instanceVariableNames:'ignoreEndTime ignoreCount ignoreUntilShiftKeyPressed
-                ignoredReceiverClasses ignoredProcesses
-                ignoredSendingClassAndSelectors'
-        classVariableNames:''
-        poolDictionaries:''
-        privateIn:DebugView
+	instanceVariableNames:'ignoreEndTime ignoreCount ignoreUntilShiftKeyPressed
+		ignoredReceiverClasses ignoredProcesses
+		ignoredSendingClassAndSelectors'
+	classVariableNames:''
+	poolDictionaries:''
+	privateIn:DebugView
 !
 
 DebugView::IgnoredHaltOrBreakpoint subclass:#IgnoredHalt
-        instanceVariableNames:'weakMethodHolder lineNumber'
-        classVariableNames:''
-        poolDictionaries:''
-        privateIn:DebugView
+	instanceVariableNames:'weakMethodHolder lineNumber'
+	classVariableNames:''
+	poolDictionaries:''
+	privateIn:DebugView
 !
 
 DebugView::IgnoredHaltOrBreakpoint subclass:#IgnoredBreakpoint
-        instanceVariableNames:'parameter'
-        classVariableNames:''
-        poolDictionaries:''
-        privateIn:DebugView
+	instanceVariableNames:'parameter'
+	classVariableNames:''
+	poolDictionaries:''
+	privateIn:DebugView
 !
 
 !DebugView class methodsFor:'documentation'!
@@ -8153,6 +8153,8 @@
         sel == #valueNowOrOnUnwindDo: ifTrue:[^ false].
         sel == #valueOnUnwindDo: ifTrue:[^ false].
         sel == #on:do: ifTrue:[^ false].
+        sel == #on:do:ensure: ifTrue:[^ false].
+        sel == #on:do:ifCurtailed: ifTrue:[^ false].
 
         sel == #value ifTrue:[^ false].
         sel == #value: ifTrue:[^ false].
@@ -8164,6 +8166,7 @@
     ].
 
     aContext isBlockContext ifTrue:[
+        |home|
 "/        sel == #value ifTrue:[^ false].
 "/        sel == #value: ifTrue:[^ false].
 "/        sel == #value:value: ifTrue:[^ false].
@@ -8178,23 +8181,25 @@
 "/            ]
 "/        ]
 
-        aContext home notNil ifTrue:[
-            aContext home receiver isProtoObject ifFalse:[
-                (aContext home receiver isMemberOf:Semaphore) ifTrue:[
-                    (aContext home selector == #wait) ifTrue:[^ false].
-                    (aContext home selector == #waitWithTimeoutMs:) ifTrue:[^ false].
-                ]
-            ]
-        ]
-    ].
-
+        home := aContext home.
+        (home notNil 
+         and:[home receiver isProtoObject not 
+         and:[home receiver isKindOf:Semaphore]]) ifTrue:[
+            (home selector == #wait) ifTrue:[^ false].
+            (home selector == #waitWithTimeoutMs:) ifTrue:[^ false].
+        ].
+    ].
+
+    rec isProtoObject ifTrue:[
+        ^ true.
+    ].
     (rec isExceptionHandler) ifTrue:[
         sel == #handle:do: ifTrue:[^ false].
         sel == #handleDo: ifTrue:[^ false].
         (sel startsWith:#raise) ifTrue:[^ false].
         sel == #answer:do: ifTrue:[^ false].
     ].
-    (rec isProtoObject not and:[ rec isException] ) ifTrue:[
+    (rec isException) ifTrue:[
         sel == #doRaise ifTrue:[^ false].
         sel == #doCallHandler: ifTrue:[^ false].
         (sel == #raise or:[sel == #raiseRequest]) ifTrue:[
@@ -8220,6 +8225,7 @@
 
     "Created: / 17-11-2001 / 19:34:20 / cg"
     "Modified: / 27-07-2012 / 17:26:54 / cg"
+    "Modified: / 31-01-2017 / 20:21:32 / stefan"
 ! !
 
 !DebugView methodsFor:'private-control loop'!
--- a/EditFieldWithCompletion.st	Wed Jan 25 19:02:59 2017 +0000
+++ b/EditFieldWithCompletion.st	Wed Feb 01 11:36:30 2017 +0000
@@ -39,7 +39,7 @@
 
 documentation
 "
-    documentation to be added.
+    an editfield, which does some completion on the Tab key.
 
     [author:]
         Jan Vrany (janfrog@bruxa)
--- a/ExpandableRevisionItem.st	Wed Jan 25 19:02:59 2017 +0000
+++ b/ExpandableRevisionItem.st	Wed Feb 01 11:36:30 2017 +0000
@@ -40,7 +40,7 @@
 
 documentation
 "
-    documentation to be added.
+    an item in a hierarchcal revision list
 
     [author:]
         Pierre Schwarz (ps@exept.de)
@@ -51,7 +51,6 @@
 
     [class variables:]
 "
-
 ! !
 
 !ExpandableRevisionItem methodsFor:'accessing'!
@@ -105,7 +104,7 @@
 !ExpandableRevisionItem class methodsFor:'documentation'!
 
 version
-    ^ '$Header: /cvs/stx/stx/libtool/ExpandableRevisionItem.st,v 1.5 2000/02/18 14:08:35 cg Exp $'
+    ^ '$Header$'
 !
 
 version_HG
--- a/FileApplicationNoteBook.st	Wed Jan 25 19:02:59 2017 +0000
+++ b/FileApplicationNoteBook.st	Wed Feb 01 11:36:30 2017 +0000
@@ -6336,9 +6336,9 @@
         text := editView contents.
         self fileContentsModel 
             value:(text asText emphasizeAllWith:UserPreferences current emphasisForChangedCode).
-        [editView flash] fork.
+        editView pushEvent:#flash.
     ] ifFalse:[
-"/        self fileContentsModel value:text string.
+        "/ self fileContentsModel value:text string.
     ].
     editView cursorMovementWhenUpdating:prevCursorBehavior.
     "/ self fileContentsModel changed:#value.
--- a/ProcessMonitorV2.st	Wed Jan 25 19:02:59 2017 +0000
+++ b/ProcessMonitorV2.st	Wed Feb 01 11:36:30 2017 +0000
@@ -1,5 +1,3 @@
-"{ Encoding: utf8 }"
-
 "
  COPYRIGHT (c) 2003 by eXept Software AG
 	      All Rights Reserved
@@ -35,7 +33,7 @@
 		hasSelectionWithDisabledInstrumentationHolder
 		hasSelectionWithEnabledInstrumentationHolder interruptCountHolder
 		timerActionCountHolder lastInterruptCount lastTimerActionCount
-		lastUpdateTimestamp'
+		lastUpdateTimestamp showStartTime'
 	classVariableNames:''
 	poolDictionaries:''
 	category:'Monitors-ST/X'
@@ -47,7 +45,8 @@
 		processInstrumentation processApplication processWindowTitle
 		processInstance weakArrayWithProcesses
 		processInstanceIndexInWeakArray processCurrentSegment
-		processSwitch prioVal idVal groupVal processBlocked'
+		processSwitch prioVal idVal groupVal processBlocked
+		startTimestamp'
 	classVariableNames:''
 	poolDictionaries:''
 	privateIn:ProcessMonitorV2
@@ -141,7 +140,7 @@
 
 aboutThisApplicationText
     ^ super aboutThisApplicationText ,
-      '\\Written by Christian Penk, eXept Software AG.' withCRs
+      '\\Written 2003 by Christian Penk, eXept Software AG,\and Claus Gittinger, eXept Software AG.' withCRs
 !
 
 flyByHelpSpec
@@ -1406,78 +1405,83 @@
 
     ^
      #(Menu
-	(
-	 (MenuItem
-	    enabled: hasSelectionWithStoppedProcessHolder
-	    label: 'Resume'
-	    itemValue: resumeProcess
-	  )
-	 (MenuItem
-	    enabled: hasSelectionHolder
-	    label: 'Suspend'
-	    itemValue: suspendProcess
-	  )
-	 (MenuItem
-	    enabled: hasSelectionHolder
-	    label: 'Stop'
-	    itemValue: stopProcess
-	  )
-	 (MenuItem
-	    label: '-'
-	  )
-	 (MenuItem
-	    enabled: hasSelectionHolder
-	    label: 'Abort'
-	    itemValue: abortProcess
-	  )
-	 (MenuItem
-	    enabled: hasSelectionHolder
-	    label: 'Terminate'
-	    itemValue: terminateProcess
-	  )
-	 (MenuItem
-	    enabled: hasSelectionHolder
-	    label: 'Hard Terminate'
-	    itemValue: hardTerminateProcess
-	  )
-	 (MenuItem
-	    enabled: hasSelectionHolder
-	    label: 'Terminate Group'
-	    itemValue: terminateProcessGroup
-	  )
-	 (MenuItem
-	    enabled: selectionRestartable
-	    label: 'Restart'
-	    itemValue: restartProcess
-	  )
-	 (MenuItem
-	    label: '-'
-	  )
-	 (MenuItem
-	    enabled: hasSelectionHolder
-	    label: 'Raise Prio'
-	    itemValue: raisePrio
-	  )
-	 (MenuItem
-	    enabled: hasSelectionHolder
-	    label: 'Lower Prio'
-	    itemValue: lowerPrio
-	  )
-	 (MenuItem
-	    enabled: hasSelectionHolder
-	    label: 'Set Prio Range...'
-	    itemValue: setPrioRange
-	  )
-	 (MenuItem
-	    label: '-'
-	  )
-	 (MenuItem
-	    label: 'Find by View'
-	    itemValue: findProcessByView
-	  )
-	 )
-	nil
-	nil
+        (
+         (MenuItem
+            enabled: hasSelectionWithStoppedProcessHolder
+            label: 'Resume'
+            itemValue: resumeProcess
+          )
+         (MenuItem
+            enabled: hasSelectionHolder
+            label: 'Suspend'
+            itemValue: suspendProcess
+          )
+         (MenuItem
+            enabled: hasSelectionHolder
+            label: 'Stop'
+            itemValue: stopProcess
+          )
+         (MenuItem
+            label: '-'
+          )
+         (MenuItem
+            enabled: hasSelectionHolder
+            label: 'Abort'
+            itemValue: abortProcess
+          )
+         (MenuItem
+            enabled: hasSelectionHolder
+            label: 'Terminate'
+            itemValue: terminateProcess
+          )
+         (MenuItem
+            enabled: hasSelectionHolder
+            label: 'Hard Terminate'
+            itemValue: hardTerminateProcess
+          )
+         (MenuItem
+            enabled: hasSelectionHolder
+            label: 'Terminate Group'
+            itemValue: terminateProcessGroup
+          )
+         (MenuItem
+            enabled: hasSelectionHolder
+            label: 'Terminate All Like This'
+            itemValue: terminateAllLikeThis
+          )
+         (MenuItem
+            enabled: selectionRestartable
+            label: 'Restart'
+            itemValue: restartProcess
+          )
+         (MenuItem
+            label: '-'
+          )
+         (MenuItem
+            enabled: hasSelectionHolder
+            label: 'Raise Prio'
+            itemValue: raisePrio
+          )
+         (MenuItem
+            enabled: hasSelectionHolder
+            label: 'Lower Prio'
+            itemValue: lowerPrio
+          )
+         (MenuItem
+            enabled: hasSelectionHolder
+            label: 'Set Prio Range...'
+            itemValue: setPrioRange
+          )
+         (MenuItem
+            label: '-'
+          )
+         (MenuItem
+            label: 'Find by View'
+            itemValue: findProcessByView
+          )
+         )
+        nil
+        nil
       )
 !
 
@@ -1497,103 +1501,94 @@
 
     ^
      #(#Menu
-	#(
-	 #(#MenuItem
-	    #enabled: #hasSelectionHolder
-	    #label: 'Debug'
-	    #itemValue: #debugProcess
-	    #translateLabel: true
-	  )
-	 #(#MenuItem
-	    #enabled: #hasSelectionHolder
-	    #label: 'Inspect'
-	    #itemValue: #inspectSelection
-	    #translateLabel: true
-	  )
-	 #(#MenuItem
-	    #enabled: #hasSelectionWithApplicationProcessHolder
-	    #label: 'Inspect Application'
-	    #itemValue: #inspectApplication
-	    #translateLabel: true
-	  )
-	 #(#MenuItem
-	    #enabled: #hasSelectionWithApplicationProcessHolder
-	    #label: 'Browse Application'
-	    #itemValue: #browseApplication
-	    #translateLabel: true
-	  )
-	 #(#MenuItem
-	    #label: '-'
-	  )
-	 #(#MenuItem
-	    #enabled: #hasSelectionWithStoppedProcessHolder
-	    #label: 'Resume'
-	    #itemValue: #resumeProcess
-	    #translateLabel: true
-	  )
-	 #(#MenuItem
-	    #enabled: #hasSelectionHolder
-	    #label: 'Suspend'
-	    #itemValue: #suspendProcess
-	    #translateLabel: true
-	  )
-	 #(#MenuItem
-	    #enabled: #hasSelectionHolder
-	    #label: 'Stop'
-	    #itemValue: #stopProcess
-	    #translateLabel: true
-	  )
-	 #(#MenuItem
-	    #label: '-'
-	  )
-	 #(#MenuItem
-	    #enabled: #hasSelectionHolder
-	    #label: 'Abort'
-	    #itemValue: #abortProcess
-	    #translateLabel: true
-	  )
-	 #(#MenuItem
-	    #enabled: #hasSelectionHolder
-	    #label: 'Terminate'
-	    #itemValue: #terminateProcess
-	    #translateLabel: true
-	  )
-	 #(#MenuItem
-	    #enabled: #hasSelectionHolder
-	    #label: 'Hard Terminate'
-	    #itemValue: #hardTerminateProcess
-	    #translateLabel: true
-	  )
-	 #(#MenuItem
-	    #enabled: #hasSelectionHolder
-	    #label: 'Terminate Group'
-	    #itemValue: #terminateProcessGroup
-	    #translateLabel: true
-	  )
-	 #(#MenuItem
-	    #enabled: #selectionRestartable
-	    #label: 'Restart'
-	    #itemValue: #restartProcess
-	    #translateLabel: true
-	  )
-	 #(#MenuItem
-	    #label: '-'
-	  )
-	 #(#MenuItem
-	    #enabled: #hasSelectionHolder
-	    #label: 'Raise Prio'
-	    #itemValue: #raisePrio
-	    #translateLabel: true
-	  )
-	 #(#MenuItem
-	    #enabled: #hasSelectionHolder
-	    #label: 'Lower Prio'
-	    #itemValue: #lowerPrio
-	    #translateLabel: true
-	  )
-	 )
-	nil
-	nil
+        #(
+         #(#MenuItem
+            #enabled: #hasSelectionHolder
+            #label: 'Debug'
+            #itemValue: #debugProcess
+          )
+         #(#MenuItem
+            #enabled: #hasSelectionHolder
+            #label: 'Inspect'
+            #itemValue: #inspectSelection
+          )
+         #(#MenuItem
+            #enabled: #hasSelectionWithApplicationProcessHolder
+            #label: 'Inspect Application'
+            #itemValue: #inspectApplication
+          )
+         #(#MenuItem
+            #enabled: #hasSelectionWithApplicationProcessHolder
+            #label: 'Browse Application'
+            #itemValue: #browseApplication
+          )
+         #(#MenuItem
+            #label: '-'
+          )
+         #(#MenuItem
+            #enabled: #hasSelectionWithStoppedProcessHolder
+            #label: 'Resume'
+            #itemValue: #resumeProcess
+          )
+         #(#MenuItem
+            #enabled: #hasSelectionHolder
+            #label: 'Suspend'
+            #itemValue: #suspendProcess
+          )
+         #(#MenuItem
+            #enabled: #hasSelectionHolder
+            #label: 'Stop'
+            #itemValue: #stopProcess
+          )
+         #(#MenuItem
+            #label: '-'
+          )
+         #(#MenuItem
+            #enabled: #hasSelectionHolder
+            #label: 'Abort'
+            #itemValue: #abortProcess
+          )
+         #(#MenuItem
+            #enabled: #hasSelectionHolder
+            #label: 'Terminate'
+            #itemValue: #terminateProcess
+          )
+         #(#MenuItem
+            #enabled: #hasSelectionHolder
+            #label: 'Hard Terminate'
+            #itemValue: #hardTerminateProcess
+          )
+         #(#MenuItem
+            #enabled: #hasSelectionHolder
+            #label: 'Terminate Group'
+            #itemValue: #terminateProcessGroup
+          )
+         (MenuItem
+            enabled: hasSelectionHolder
+            label: 'Terminate All Like This'
+            itemValue: terminateAllLikeThis
+          )
+         #(#MenuItem
+            #enabled: #selectionRestartable
+            #label: 'Restart'
+            #itemValue: #restartProcess
+          )
+         #(#MenuItem
+            #label: '-'
+          )
+         #(#MenuItem
+            #enabled: #hasSelectionHolder
+            #label: 'Raise Prio'
+            #itemValue: #raisePrio
+          )
+         #(#MenuItem
+            #enabled: #hasSelectionHolder
+            #label: 'Lower Prio'
+            #itemValue: #lowerPrio
+          )
+         )
+        nil
+        nil
       )
 
     "Modified: / 07-06-2007 / 12:49:47 / cg"
@@ -1838,6 +1833,11 @@
             indication: showWindowTitle
           )
          (MenuItem
+            label: 'Start Time'
+            hideMenuOnActivated: false
+            indication: showStartTime
+          )
+         (MenuItem
             label: '-'
           )
          (MenuItem
@@ -1874,223 +1874,243 @@
 
     ^#(
       (DataSetColumnSpec
-	 label: 'Id'
-	 id: id
-	 activeHelpKeyForLabel: 'processId'
-	 labelAlignment: left
-	 labelButtonType: Button
-	 labelActionSelector: sortProcessListBy:
-	 labelActionArgument: 'idVal'
-	 width: 45
-	 type: number
-	 model: processId
-	 canSelect: false
-	 showRowSeparator: false
-	 showColSeparator: false
+         label: 'Id'
+         id: id
+         labelAlignment: left
+         activeHelpKeyForLabel: 'processId'
+         labelButtonType: Button
+         labelActionSelector: sortProcessListBy:
+         labelActionArgument: 'idVal'
+         width: 45
+         height: heightOfFirstRow
+         type: number
+         model: processId
+         canSelect: false
+         showRowSeparator: false
+         showColSeparator: false
        )
       (DataSetColumnSpec
-	 label: 'Group'
-	 id: group
-	 activeHelpKeyForLabel: 'processGroup'
-	 labelAlignment: left
-	 labelButtonType: Button
-	 labelActionSelector: sortProcessListBy:
-	 labelActionArgument: 'groupVal'
-	 width: 45
-	 model: processGroup
-	 canSelect: false
-	 showRowSeparator: false
-	 showColSeparator: false
+         label: 'Group'
+         id: group
+         labelAlignment: left
+         activeHelpKeyForLabel: 'processGroup'
+         labelButtonType: Button
+         labelActionSelector: sortProcessListBy:
+         labelActionArgument: 'groupVal'
+         width: 45
+         height: heightOfFirstRow
+         model: processGroup
+         canSelect: false
+         showRowSeparator: false
+         showColSeparator: false
        )
       (DataSetColumnSpec
-	 label: 'Name'
-	 id: name
-	 activeHelpKeyForLabel: 'processName'
-	 labelAlignment: left
-	 labelButtonType: Button
-	 labelActionSelector: sortProcessListBy:
-	 labelActionArgument: 'processName'
-	 width: 200
-	 model: processName
-	 canSelect: false
-	 showRowSeparator: false
-	 showColSeparator: false
+         label: 'Name'
+         id: name
+         labelAlignment: left
+         activeHelpKeyForLabel: 'processName'
+         labelButtonType: Button
+         labelActionSelector: sortProcessListBy:
+         labelActionArgument: 'processName'
+         width: 200
+         height: heightOfFirstRow
+         model: processName
+         canSelect: false
+         showRowSeparator: false
+         showColSeparator: false
        )
       (DataSetColumnSpec
-	 label: 'Instr.'
-	 id: instrumentation
-	 labelAlignment: left
-	 width: 50
-	 "/ activeHelpKey: 'processInstrumentation'
-	 activeHelpKeyForLabel: 'processInstrumentation'
-	 labelButtonType: Button
-	 labelActionSelector: sortProcessListBy:
-	 labelActionArgument: 'processInstrumentation'
-	 model: processInstrumentation
-	 menuFromApplication: false
-	 canSelect: false
-	 showRowSeparator: false
-	 showColSeparator: false
+         label: 'Instr.'
+         id: instrumentation
+         labelAlignment: left
+         activeHelpKeyForLabel: 'processInstrumentation'
+         labelButtonType: Button
+         labelActionSelector: sortProcessListBy:
+         labelActionArgument: 'processInstrumentation'
+         width: 50
+         height: heightOfFirstRow
+         model: processInstrumentation
+         menuFromApplication: false
+         canSelect: false
+         showRowSeparator: false
+         showColSeparator: false
+       )
+      (DataSetColumnSpec
+         label: ''
+         id: active
+         activeHelpKeyForLabel: 'processWasActive'
+         labelButtonType: Button
+         labelActionSelector: sortProcessListBy:
+         labelActionArgument: 'processActive'
+         width: 10
+         height: 5
+         model: processActive
+         menuFromApplication: false
+         canSelect: false
+         showRowSeparator: false
+         showColSeparator: false
        )
       (DataSetColumnSpec
-	 label: ''
-	 id: active
-	 "/ activeHelpKey: 'processWasActive'
-	 activeHelpKeyForLabel: 'processWasActive'
-	 labelButtonType: Button
-	 labelActionSelector: sortProcessListBy:
-	 labelActionArgument: 'processActive'
-	 width: 10
-	 height: 5
-	 model: processActive
-	 menuFromApplication: false
-	 canSelect: false
-	 showRowSeparator: false
-	 showColSeparator: false
+         label: 'State'
+         id: state
+         labelAlignment: left
+         activeHelpKeyForLabel: 'processState'
+         labelButtonType: Button
+         labelActionSelector: sortProcessListBy:
+         labelActionArgument: 'processState'
+         width: 100
+         height: heightOfFirstRow
+         model: processState
+         menuFromApplication: false
+         canSelect: false
+         showRowSeparator: false
+         showColSeparator: false
        )
       (DataSetColumnSpec
-	 label: 'State'
-	 id: state
-	 labelAlignment: left
-	 "/ activeHelpKey: 'processState'
-	 activeHelpKeyForLabel: 'processState'
-	 labelButtonType: Button
-	 labelActionSelector: sortProcessListBy:
-	 labelActionArgument: 'processState'
-	 width: 100
-	 model: processState
-	 menuFromApplication: false
-	 canSelect: false
-	 showRowSeparator: false
-	 showColSeparator: false
-       )
-      (DataSetColumnSpec
-	 label: 'Prio'
-	 id: prio
-	 labelAlignment: left
-	 "/ activeHelpKey: 'processPriority'
-	 activeHelpKeyForLabel: 'processPriority'
-	 labelButtonType: Button
-	 labelActionSelector: sortProcessListBy:
-	 labelActionArgument: 'prioVal'
-	 width: 40
-	 model: processPrio
-	 menuFromApplication: false
-	 canSelect: false
-	 showRowSeparator: false
-	 showColSeparator: false
+         label: 'Prio'
+         id: prio
+         labelAlignment: left
+         activeHelpKeyForLabel: 'processPriority'
+         labelButtonType: Button
+         labelActionSelector: sortProcessListBy:
+         labelActionArgument: 'prioVal'
+         width: 40
+         height: heightOfFirstRow
+         model: processPrio
+         menuFromApplication: false
+         canSelect: false
+         showRowSeparator: false
+         showColSeparator: false
        )
       (DataSetColumnSpec
-	 label: 'Used Stack'
-	 id: usedStack
-	 labelAlignment: left
-	 "/ activeHelpKey: 'processUsedStack'
-	 activeHelpKeyForLabel: 'processUsedStack'
-	 labelButtonType: Button
-	 labelActionSelector: sortProcessListBy:
-	 labelActionArgument: 'processUsedStack'
-	 columnAlignment: right
-	 width: 75
-	 type: number
-	 model: processUsedStack
-	 menuFromApplication: false
-	 canSelect: false
-	 showRowSeparator: false
-	 showColSeparator: false
+         label: 'Used Stack'
+         id: usedStack
+         labelAlignment: left
+         activeHelpKeyForLabel: 'processUsedStack'
+         labelButtonType: Button
+         labelActionSelector: sortProcessListBy:
+         labelActionArgument: 'processUsedStack'
+         columnAlignment: right
+         width: 75
+         height: heightOfFirstRow
+         type: number
+         model: processUsedStack
+         menuFromApplication: false
+         canSelect: false
+         showRowSeparator: false
+         showColSeparator: false
        )
       (DataSetColumnSpec
-	 label: 'Total Stack'
-	 id: totalStack
-	 labelAlignment: left
-	 "/ activeHelpKey: 'processTotalStack'
-	 activeHelpKeyForLabel: 'processTotalStack'
-	 labelButtonType: Button
-	 labelActionSelector: sortProcessListBy:
-	 labelActionArgument: 'processTotalStack'
-	 columnAlignment: right
-	 width: 75
-	 model: processTotalStack
-	 menuFromApplication: false
-	 canSelect: false
-	 showRowSeparator: false
-	 showColSeparator: false
+         label: 'Total Stack'
+         id: totalStack
+         labelAlignment: left
+         activeHelpKeyForLabel: 'processTotalStack'
+         labelButtonType: Button
+         labelActionSelector: sortProcessListBy:
+         labelActionArgument: 'processTotalStack'
+         columnAlignment: right
+         width: 75
+         height: heightOfFirstRow
+         model: processTotalStack
+         menuFromApplication: false
+         canSelect: false
+         showRowSeparator: false
+         showColSeparator: false
        )
       (DataSetColumnSpec
-	 label: 'Current-Segment'
-	 id: currentSegment
-	 activeHelpKeyForLabel: 'processCurrentSegment'
-	 labelAlignment: left
-	 labelButtonType: Button
-	 labelActionSelector: sortProcessListBy:
-	 labelActionArgument: 'processCurrentSegment'
-	 width: 110
-	 model: processCurrentSegment
-	 canSelect: false
-	 showRowSeparator: false
-	 showColSeparator: false
+         label: 'Current-Segment'
+         id: currentSegment
+         labelAlignment: left
+         activeHelpKeyForLabel: 'processCurrentSegment'
+         labelButtonType: Button
+         labelActionSelector: sortProcessListBy:
+         labelActionArgument: 'processCurrentSegment'
+         width: 110
+         height: heightOfFirstRow
+         model: processCurrentSegment
+         canSelect: false
+         showRowSeparator: false
+         showColSeparator: false
        )
       (DataSetColumnSpec
-	 label: 'Switch'
-	 id: switch
-	 activeHelpKeyForLabel: 'processSwitch'
-	 labelAlignment: left
-	 labelButtonType: Button
-	 labelActionSelector: sortProcessListBy:
-	 labelActionArgument: 'processSwitch'
-	 columnAlignment: right
-	 width: 55
-	 type: number
-	 model: processSwitch
-	 canSelect: false
-	 showRowSeparator: false
-	 showColSeparator: false
+         label: 'Switch'
+         id: switch
+         labelAlignment: left
+         activeHelpKeyForLabel: 'processSwitch'
+         labelButtonType: Button
+         labelActionSelector: sortProcessListBy:
+         labelActionArgument: 'processSwitch'
+         columnAlignment: right
+         width: 55
+         height: heightOfFirstRow
+         type: number
+         model: processSwitch
+         canSelect: false
+         showRowSeparator: false
+         showColSeparator: false
        )
       (DataSetColumnSpec
-	 label: 'Where'
-	 id: where
-	 labelAlignment: left
-	 "/ activeHelpKey: 'processWhere'
-	 activeHelpKeyForLabel: 'processWhere'
-	 labelButtonType: Button
-	 labelActionSelector: sortProcessListBy:
-	 labelActionArgument: 'processWhere'
-	 model: processWhere
-	 menuFromApplication: false
-	 canSelect: false
-	 showRowSeparator: false
-	 showColSeparator: false
+         label: 'Where'
+         id: where
+         labelAlignment: left
+         activeHelpKeyForLabel: 'processWhere'
+         labelButtonType: Button
+         labelActionSelector: sortProcessListBy:
+         labelActionArgument: 'processWhere'
+         height: heightOfFirstRow
+         model: processWhere
+         menuFromApplication: false
+         canSelect: false
+         showRowSeparator: false
+         showColSeparator: false
        )
       (DataSetColumnSpec
-	 label: 'Application'
-	 id: application
-	 labelAlignment: left
-	 "/ activeHelpKey: 'processApplication'
-	 activeHelpKeyForLabel: 'processApplication'
-	 labelButtonType: Button
-	 labelActionSelector: sortProcessListBy:
-	 labelActionArgument: 'processApplication'
-	 model: processApplication
-	 menuFromApplication: false
-	 canSelect: false
-	 showRowSeparator: false
-	 showColSeparator: false
+         label: 'Application'
+         id: application
+         labelAlignment: left
+         activeHelpKeyForLabel: 'processApplication'
+         labelButtonType: Button
+         labelActionSelector: sortProcessListBy:
+         labelActionArgument: 'processApplication'
+         height: heightOfFirstRow
+         model: processApplication
+         menuFromApplication: false
+         canSelect: false
+         showRowSeparator: false
+         showColSeparator: false
        )
       (DataSetColumnSpec
-	 label: 'Window Title'
-	 id: windowTitle
-	 labelAlignment: left
-	 "/ activeHelpKey: 'processWindowTitle'
-	 activeHelpKeyForLabel: 'processWindowTitle'
-	 labelButtonType: Button
-	 labelActionSelector: sortProcessListBy:
-	 labelActionArgument: 'processWindowTitle'
-	 model: processWindowTitle
-	 menuFromApplication: false
-	 canSelect: false
-	 showRowSeparator: false
-	 showColSeparator: false
+         label: 'Window Title'
+         id: windowTitle
+         labelAlignment: left
+         activeHelpKeyForLabel: 'processWindowTitle'
+         labelButtonType: Button
+         labelActionSelector: sortProcessListBy:
+         labelActionArgument: 'processWindowTitle'
+         height: heightOfFirstRow
+         model: processWindowTitle
+         menuFromApplication: false
+         canSelect: false
+         showRowSeparator: false
+         showColSeparator: false
+       )
+      (DataSetColumnSpec
+         label: 'Start Time'
+         id: startTime
+         activeHelpKeyForLabel: 'processStartTime'
+         labelButtonType: Button
+         labelActionSelector: sortProcessListBy:
+         labelActionArgument: 'processStartTime'
+         height: heightOfFirstRow
+         type: timestamp
+         model: processStartTime
+         formatString: '%(day)-%(shortMonthName) %h:%m:%s'
+         menuFromApplication: false
+         showRowSeparator: false
+         showColSeparator: false
        )
       )
+    
 ! !
 
 !ProcessMonitorV2 methodsFor:'accessing'!
@@ -2407,6 +2427,16 @@
     ^ showProcessId
 !
 
+showStartTime
+    "return/create the 'showStartTime' value holder (automatically generated)"
+
+    showStartTime isNil ifTrue:[
+        showStartTime := false asValue.
+        showStartTime onChangeSend:#viewedColumnsChanged to:self
+    ].
+    ^ showStartTime
+!
+
 showState
     "return/create the 'showState' value holder (automatically generated)"
 
@@ -2664,64 +2694,70 @@
 !
 
 viewedColumnsChanged
+    "take the class's columnSpec and select the one's selected by the user.
+     Stuff this filtered tableColSpec into the value holder"
+    
     | columns buffer locCurrentSortOrder currentSortOrderColumn currentSortOrderReverse oldSelection sel|
 
     "/ remember the selected processes
     sel := self selectedProcesses value.
     sel notNil ifTrue:[
-	oldSelection := OrderedCollection new.
-	sel do:[:proItem|
-	    |process|
-
-	    (process := proItem processInstance) notNil ifTrue:[
-		oldSelection add:process
-	    ].
-	].
+        oldSelection := OrderedCollection new.
+        sel do:[:proItem|
+            |process|
+
+            (process := proItem processInstance) notNil ifTrue:[
+                oldSelection add:process
+            ].
+        ].
     ].
-"/    Transcript showCR:'oldSelection on catch in viewedColumnsChanged', (oldSelection isNil ifTrue:['nil'] ifFalse:[oldSelection first printString]).
+
+    "/ Transcript showCR:'oldSelection on catch in viewedColumnsChanged', (oldSelection isNil ifTrue:['nil'] ifFalse:[oldSelection first printString]).
     columns := OrderedCollection new.
     self class tableColumns do:[:el|
-	columns add:(DataSetColumnSpec decodeFromLiteralArray:el).
+        columns add:(DataSetColumnSpec decodeFromLiteralArray:el).
     ].
     buffer := columns copy.
     locCurrentSortOrder := self currentSortOrder value.
     currentSortOrderColumn := locCurrentSortOrder at:#column ifAbsent:nil.
     currentSortOrderReverse := locCurrentSortOrder at:#reverse ifAbsent:nil.
     buffer do:[:col |
-	| id |
-	id := col id.
-	id notNil ifTrue:[
-	    (col labelActionArgument notNil and:[col labelActionArgument asSymbol == currentSortOrderColumn]) ifTrue:[
-		| label icon|
-		label := col label.
-		icon := currentSortOrderReverse ifTrue:[self class detailsMenuIconDown] ifFalse:[self class detailsMenuIconUp].
-		col label:(LabelAndIcon label:label icon:icon).
-	    ].
-	    #(
-		( #id             #showProcessId)
-		( #group          #showGroup)
-		( #prio           #showPrio)
-		( #currentSegment #showCurrentSegment)
-		( #state          #showState)
-		( #switch         #showSwitch)
-		( #totalStack     #showTotalStack)
-		( #usedStack      #showUsedStack)
-		( #where          #showWhere)
-		( #application    #showApplication)
-		( #windowTitle    #showWindowTitle)
-		( #instrumentation #showInstrumentation)
-	    ) pairsDo:[:colName :holderAccessorSelector |
-		(id == colName and:[(self perform:holderAccessorSelector) value not]) ifTrue:[
-		    columns remove:col.
-		]
-	    ]
-	]
+        | id |
+        id := col id.
+        id notNil ifTrue:[
+            (col labelActionArgument notNil and:[col labelActionArgument asSymbol == currentSortOrderColumn]) ifTrue:[
+                | label icon|
+                label := col label.
+                icon := currentSortOrderReverse ifTrue:[self class detailsMenuIconDown] ifFalse:[self class detailsMenuIconUp].
+                col label:(LabelAndIcon label:label icon:icon).
+            ].
+            #(
+                ( #id             #showProcessId)
+                ( #group          #showGroup)
+                ( #prio           #showPrio)
+                ( #currentSegment #showCurrentSegment)
+                ( #state          #showState)
+                ( #switch         #showSwitch)
+                ( #totalStack     #showTotalStack)
+                ( #usedStack      #showUsedStack)
+                ( #where          #showWhere)
+                ( #application    #showApplication)
+                ( #windowTitle    #showWindowTitle)
+                ( #startTime      #showStartTime)
+                ( #instrumentation #showInstrumentation)
+            ) pairsDo:[:colName :holderAccessorSelector |
+                (id == colName and:[(self perform:holderAccessorSelector) value not]) ifTrue:[
+                    columns remove:col.
+                ]
+            ]
+        ]
     ].
+    
     updateSema critical:[
-	self tableColumns value:columns.
+        self tableColumns value:columns.
 "/        self updateTable:nil.
 "/        Transcript showCR:'oldSelection on set in viewedColumnsChanged', (oldSelection isNil ifTrue:['nil'] ifFalse:[oldSelection first printString]).
-	self changeSelectionToProcesses:oldSelection.
+        self changeSelectionToProcesses:oldSelection.
     ].
 
     "Modified: / 17-08-2011 / 11:11:21 / cg"
@@ -2984,6 +3020,36 @@
     self selectedProcessesSend:#suspend
 !
 
+terminateAllLikeThis
+    "terminate the selected process with all of its subprocesses"
+
+    |names|
+
+    names := Set new.
+    self selectedProcessesDo:[:p |
+        names add:p name.
+    ].
+
+    ProcessorScheduler knownProcesses 
+        select:[:p | (names includes:p name) ]
+        thenDo:[:eachProcessToTerminate |
+        |doTerminateThis|
+
+        doTerminateThis :=
+            ((eachProcessToTerminate isSystemProcess not)
+            or:[ Dialog confirm:(resources 
+                                    string:'Terminate the system process: %1 (Pid=%2)?'
+                                    with:eachProcessToTerminate name
+                                    with:eachProcessToTerminate id) ]).
+                            
+        doTerminateThis ifTrue:[
+            eachProcessToTerminate terminate
+        ].    
+    ].
+    
+    self updateList.
+!
+
 terminateProcess
     "terminate the selected process"
 
@@ -3584,6 +3650,7 @@
     processItem processGroup:(self getGroupStringFor:aProcess).
     processItem groupVal:(processItem processGroup isNumber ifTrue:[processItem processGroup] ifFalse:[-1]).
 
+    processItem processStartTime:aProcess startTimestamp.
     processItem processName:aProcess name ? ''.
 
     state := aProcess state.
@@ -4137,6 +4204,18 @@
     processPrio := something.
 !
 
+processStartTime
+    "return the value of the instance variable 'startTime' (automatically generated)"
+
+    ^ startTimestamp
+!
+
+processStartTime:aTimestamp
+    "set the value of the instance variable 'startTime' (automatically generated)"
+
+    startTimestamp := aTimestamp
+!
+
 processState
     ^ processState
 !
--- a/Tools__ClassList.st	Wed Jan 25 19:02:59 2017 +0000
+++ b/Tools__ClassList.st	Wed Feb 01 11:36:30 2017 +0000
@@ -18,7 +18,7 @@
 		selectedClassNameIndices currentNamespace hidePrivateClasses
 		unloadedClassesColor markApplicationsHolder classFilterBlock
 		sortByNameAndInheritance outGeneratorHolderForMethods
-		addOwnerClasses'
+		addOwnerClasses ownersAddedForTheirPrivateClassesOnly'
 	classVariableNames:''
 	poolDictionaries:''
 	category:'Interface-Browsers-New'
@@ -242,11 +242,11 @@
     ^ addOwnerClasses.
 !
 
-addOwnerClasses:aValueHolder
+addOwnerClasses:aBooleanValueHolder
     addOwnerClasses notNil ifTrue:[
         addOwnerClasses removeDependent:self
     ].
-    addOwnerClasses := aValueHolder.
+    addOwnerClasses := aBooleanValueHolder.
     addOwnerClasses notNil ifTrue:[
         addOwnerClasses addDependent:self
     ].
@@ -1256,6 +1256,8 @@
 
     classesAlready := IdentitySet new.
     classesOrdered := OrderedCollection new.
+    ownersAddedForTheirPrivateClassesOnly := IdentitySet new.
+
     hidePrivate := self hidePrivateClasses value.
 
     privateClassesPerClass := IdentityDictionary new.
@@ -1305,6 +1307,7 @@
     "/ are there any private classes, for which the owner is not in the list ?
     privateClassesPerClass keysAndValuesDo:[:eachOwnerClass :privateClasses|
         (classesAlready includes:eachOwnerClass) ifFalse:[
+            ownersAddedForTheirPrivateClassesOnly add:eachOwnerClass.
             classesOrdered add:eachOwnerClass.
             classesAlready add:eachOwnerClass.
 "/            privateClasses do:[:privateClass |
@@ -1385,6 +1388,7 @@
     classesAlready := IdentitySet new.
     classes := Set new.
     classesOrdered := OrderedCollection new.
+    ownersAddedForTheirPrivateClassesOnly := IdentitySet new.
     hidePrivate := self hidePrivateClasses value.
 
     privateClassesPerClass := IdentityDictionary new.
@@ -1402,8 +1406,10 @@
                 or:[self isClass:cls shownWithPackageFilter:packageFilter]) ifTrue:[
                     (classesAlready includes:cls) ifFalse:[
                         classesAlready add:cls.
+                        ownersAddedForTheirPrivateClassesOnly remove:cls ifAbsent:[].
                         ((owner := cls owningClass) notNil and:[self addOwnerClasses value]) ifTrue:[
                             (classesAlready includes:owner) ifFalse:[
+                                ownersAddedForTheirPrivateClassesOnly add:owner.
                                 classesAlready add:owner.
                                 classes add:owner.
                             ].
@@ -1573,13 +1579,18 @@
                                 ].
                             ].
 
+                            (ownersAddedForTheirPrivateClassesOnly notNil 
+                              and:[ownersAddedForTheirPrivateClassesOnly includes:eachClass]
+                            ) ifTrue:[
+                                clr := Color grey.
+                            ].
+                            
                             self showCoverageInformation value ifTrue:[
                                 clr := self colorForCoverageInformationOfClass:eachClass.
-                                clr notNil ifTrue:[
-                                    nm := self colorize:nm with:#color -> clr
-                                ].
                             ].
-                            clr isNil ifTrue:[
+                            clr notNil ifTrue:[
+                                nm := self colorize:nm with:#color -> clr
+                            ] ifFalse:[
                                 isInChangeSet ifTrue:[
                                     nm := self emphasizeForChangedCode:nm
                                 ].
--- a/Tools__HierarchicalClassList.st	Wed Jan 25 19:02:59 2017 +0000
+++ b/Tools__HierarchicalClassList.st	Wed Feb 01 11:36:30 2017 +0000
@@ -282,7 +282,7 @@
         "/ nm := nm,(' (?) ' colorizeAllWith:Color grey).
     ] ifTrue:[
         aClass isAbstract ifTrue:[ nm := nm allItalic ].
-        nm := nm,((' (%1+%2) ' bindWith:(aClass methodDictionary size) with:(aClass class methodDictionary size)) 
+        nm := nm,((' (%1+%2) ' bindWith:(aClass methodsCount) with:(aClass class methodsCount)) 
                                 withColor:self class pseudoEntryForegroundColor).
     ].
 
--- a/Tools__Inspector2Tab.st	Wed Jan 25 19:02:59 2017 +0000
+++ b/Tools__Inspector2Tab.st	Wed Feb 01 11:36:30 2017 +0000
@@ -36,6 +36,64 @@
 "
 ! !
 
+!Inspector2Tab class methodsFor:'special instance creation'!
+
+toBrowseClass:aClass selector:initialSelectorOrNil label:label
+    "create and return an inspector tab containing
+     a browser on aClass (and optional initialSelector).
+     This is a utility to be used by inspector2TabXXX methods, which want to embed a clas browser."
+     
+    |makeView view|
+
+    makeView := 
+        [
+            |spec browser navigationState canvas|
+
+
+            (view isNil ifTrue:[
+                "/ spec := #singleClassBrowserSpec.
+                spec := #multipleClassBrowserSpec.
+
+                browser := Tools::NewSystemBrowser new.
+                browser isEmbeddedBrowser:true.
+                browser createBuilder.
+
+                navigationState := browser navigationState.
+                navigationState canvasType:spec.
+                browser browserCanvasType:spec.
+
+                canvas := browser browserCanvas value.
+                canvas builder:(browser builder).
+                navigationState canvas:canvas.
+                "/ browser switchToClassHierarchyView.
+                "/ browser showInheritedMethods.
+
+                navigationState classList value:(aClass theNonMetaclass withAllSuperclasses).
+                navigationState meta value:(aClass isMetaclass).
+                browser classListGenerator value:(aClass theNonMetaclass withAllSuperclasses).
+                browser sortByNameAndInheritance value:true.
+                browser
+                    selectClass:aClass;
+                    selectProtocol: (Tools::BrowserList nameListEntryForALL). 
+                browser switchToClass:aClass selector:initialSelectorOrNil updateHistory: false.
+                view := ApplicationSubView new client: browser spec: spec.
+                "/ sigh must be done after postbuild
+                navigationState classListApplication addOwnerClasses value:false.
+            ]).
+            view
+        ].
+
+    ^ self new
+            priority: 0;
+            label:label;
+            viewHolder: makeView;
+            yourself
+
+    "
+     GenericToolbarIconLibrary systemBrowserIcon inspect
+    "
+! !
+
 !Inspector2Tab methodsFor:'accessing'!
 
 application
@@ -144,6 +202,10 @@
 
 !Inspector2Tab class methodsFor:'documentation'!
 
+version
+    ^ '$Header$'
+!
+
 version_CVS
     ^ '$Header$'
 !
--- a/Tools__LintHighlighter.st	Wed Jan 25 19:02:59 2017 +0000
+++ b/Tools__LintHighlighter.st	Wed Feb 01 11:36:30 2017 +0000
@@ -1,3 +1,5 @@
+"{ Encoding: utf8 }"
+
 "
  COPYRIGHT (c) 2006 by eXept Software AG
               All Rights Reserved
@@ -228,7 +230,7 @@
                 resultSelectionIntervalsForSource: string tree: tree in: class 
                 do: [:interval|
                     interval notEmptyOrNil ifTrue:[
-                        (interval first == 1 and:[interval last == text size]) ifTrue:[
+                        ((interval first == 1 and:[interval last == text size]) or:[interval last > text size]) ifTrue:[
                             self debuggingCodeFor:#jv is:[
                                  Transcript showCR:'>> no meaningful selection interval for ' , rule printString.
                             ].
@@ -261,6 +263,7 @@
     "Created: / 02-12-2014 / 11:28:43 / Jan Vrany <jan.vrany@fit.cvut.cz>"
     "Modified (format): / 15-12-2014 / 18:58:52 / Jan Vrany <jan.vrany@fit.cvut.cz>"
     "Modified (format): / 19-11-2016 / 13:35:25 / cg"
+    "Modified: / 30-01-2017 / 14:51:18 / stefan"
 ! !
 
 !LintHighlighter methodsFor:'initialization'!
--- a/Tools__LintRuleDetail.st	Wed Jan 25 19:02:59 2017 +0000
+++ b/Tools__LintRuleDetail.st	Wed Feb 01 11:36:30 2017 +0000
@@ -29,7 +29,7 @@
 
 ApplicationModel subclass:#LintRuleDetail
 	instanceVariableNames:'ruleHolder rationaleVisibleHolder rationalView
-		selectedMethodsHolder'
+		selectedMethodsHolder selectedClassesHolder'
 	classVariableNames:''
 	poolDictionaries:''
 	category:'Interface-Lint'
@@ -63,6 +63,23 @@
  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
  OTHER DEALINGS IN THE SOFTWARE.
 "
+!
+
+documentation
+"
+    Embeddable list to display affected methods from a selected SmallLint rules.
+    (this is embedded in the browser when showing lint check outcomes)
+
+    [author:]
+        Jan Vrany <jan.vrany@fit.cvut.cz>
+
+    [instance variables:]
+
+    [class variables:]
+
+    [see also:]
+
+"
 ! !
 
 !LintRuleDetail class methodsFor:'help specs'!
@@ -196,6 +213,7 @@
         #ruleHolder
         #ruleRationaleAspect
         #selectedMethodsHolder
+        #selectedClassesHolder
       ).
 
     "Modified: / 01-03-2012 / 16:31:04 / cg"
@@ -208,6 +226,7 @@
 
     rule := self ruleHolder value.
     rule isNil ifTrue:[^ self].
+    
     ruleClass := rule class.
     (ruleClass implements:#rationale) ifTrue:[
         sel := #rationale.
@@ -233,7 +252,7 @@
     "Modified: / 01-03-2012 / 08:50:20 / cg"
 !
 
-rationaleVisibleHolder:something
+rationaleVisibleHolder:aValueHolder
     "set the 'rationaleVisibleHolder' value holder (automatically generated)"
 
     |oldValue newValue|
@@ -242,7 +261,7 @@
         oldValue := rationaleVisibleHolder value.
         rationaleVisibleHolder removeDependent:self.
     ].
-    rationaleVisibleHolder := something.
+    rationaleVisibleHolder := aValueHolder.
     rationaleVisibleHolder notNil ifTrue:[
         rationaleVisibleHolder addDependent:self.
     ].
@@ -263,7 +282,7 @@
     "Modified: / 01-03-2012 / 08:51:03 / cg"
 !
 
-ruleHolder:something
+ruleHolder:aValueHolder
     "set the 'ruleHolder' value holder (automatically generated)"
 
     |oldValue newValue|
@@ -272,7 +291,7 @@
         oldValue := ruleHolder value.
         ruleHolder removeDependent:self.
     ].
-    ruleHolder := something.
+    ruleHolder := aValueHolder.
     ruleHolder notNil ifTrue:[
         ruleHolder addDependent:self.
     ].
@@ -311,7 +330,7 @@
 
     (holder := builder bindingAt:#ruleRationaleAspect) isNil ifTrue:[
         "cannot use a BlockValue linked on the ruleHolder for the
-         ruleRationaleAspect, because the ruleHolder maight be changed dynamically
+         ruleRationaleAspect, because the ruleHolder might be changed dynamically
          via the aspect-linking mechanism"
 "/        holder := (AspectAdaptor forAspect: #rationale) subjectChannel: self ruleHolder.
         holder := '' asValue.
@@ -323,6 +342,35 @@
     "Modified: / 01-03-2012 / 15:29:16 / cg"
 !
 
+selectedClassesHolder
+    "return/create the 'selectedClassesHolder' value holder (automatically generated)"
+
+    selectedClassesHolder isNil ifTrue:[
+        selectedClassesHolder := #() asValue.
+        selectedClassesHolder addDependent:self.
+    ].
+    ^ selectedClassesHolder
+!
+
+selectedClassesHolder:aValueHolder
+    "set the 'selectedClassesHolder' value holder (automatically generated)"
+
+    |oldValue newValue|
+
+    selectedClassesHolder notNil ifTrue:[
+        oldValue := selectedClassesHolder value.
+        selectedClassesHolder removeDependent:self.
+    ].
+    selectedClassesHolder := aValueHolder.
+    selectedClassesHolder notNil ifTrue:[
+        selectedClassesHolder addDependent:self.
+    ].
+    newValue := selectedClassesHolder value.
+    oldValue ~= newValue ifTrue:[
+        self update:#value with:newValue from:selectedClassesHolder.
+    ].
+!
+
 selectedMethodsHolder
     "return/create the 'selectedMethodsHolder' value holder (automatically generated)"
 
@@ -333,7 +381,7 @@
     ^ selectedMethodsHolder
 !
 
-selectedMethodsHolder:something
+selectedMethodsHolder:aValueHolder
     "set the 'selectedMethodsHolder' value holder (automatically generated)"
 
     |oldValue newValue|
@@ -342,7 +390,7 @@
         oldValue := selectedMethodsHolder value.
         selectedMethodsHolder removeDependent:self.
     ].
-    selectedMethodsHolder := something.
+    selectedMethodsHolder := aValueHolder.
     selectedMethodsHolder notNil ifTrue:[
         selectedMethodsHolder addDependent:self.
     ].
@@ -367,8 +415,17 @@
          ^ self.
     ].
     changedObject == selectedMethodsHolder ifTrue:[
-        "/ cg: preparations to show method-specific text in rationale/detail
-        "/ view. Not yet done...
+        "/ cg: preparations to show method-specific text in rationale/detail view
+        "/ Not yet done...
+        self updateRule.
+        ^ self 
+    ].
+
+    changedObject == selectedClassesHolder ifTrue:[
+        "/ cg: preparations to show class-specific text in rationale/detail view
+        "/ Not yet done...
+        self updateRule.
+        ^ self 
     ].
 
     super update:something with:aParameter from:changedObject
@@ -382,10 +439,23 @@
      ruleRationaleAspect, because the ruleHolder maight be changed dynamically
      via the aspect-linking mechanism"
 
-    |rule|
+    |rule text|
 
+    text := ''.
+    
     rule := self ruleHolder value.
-    self ruleRationaleAspect value: (rule isNil ifTrue:[''] ifFalse:[rule rationaleWithAnchor]).
+    rule notNil ifTrue:[
+        selectedMethodsHolder value size == 1 ifTrue:[
+            text := rule rationaleWithAnchorForMethod:(selectedMethodsHolder value first).
+        ] ifFalse:[    
+            selectedClassesHolder value size == 1 ifTrue:[
+                text := rule rationaleWithAnchorForClass:(selectedClassesHolder value first).
+            ] ifFalse:[    
+                text := rule rationaleWithAnchor.
+            ]
+        ]    
+    ].
+    self ruleRationaleAspect value:text.
 
     "Created: / 01-03-2012 / 15:28:18 / cg"
 !
--- a/Tools__LintRuleList.st	Wed Jan 25 19:02:59 2017 +0000
+++ b/Tools__LintRuleList.st	Wed Feb 01 11:36:30 2017 +0000
@@ -74,7 +74,8 @@
 
 documentation
 "
-    Embeddable list to display a set of SmallLint rules. 
+    Embeddable list to display a set of SmallLint rules.
+    (this is embedded in the browser when showing lint check outcomes)
 
     Supports 3 modes (controlled by modeHolder)
         #display            - only display given set of rules.
--- a/Tools__LintRuleSelectionDialog.st	Wed Jan 25 19:02:59 2017 +0000
+++ b/Tools__LintRuleSelectionDialog.st	Wed Feb 01 11:36:30 2017 +0000
@@ -103,7 +103,8 @@
     dialog open.
     dialog accepted ifTrue:[
         rules := dialog selectionAsRule
-    ]
+    ].
+    rules inspect.
 
                                                                 [exEnd]
 
--- a/Tools__NewClassWizardDialog.st	Wed Jan 25 19:02:59 2017 +0000
+++ b/Tools__NewClassWizardDialog.st	Wed Feb 01 11:36:30 2017 +0000
@@ -1032,7 +1032,7 @@
         self canDisableTemplateCreationHolder value:true.
     ].    
     
-    stereoTypeSymbol = nil ifTrue:[
+    stereoTypeSymbol isNil ifTrue:[
         self createInitializerHolder value:true.
         self createPrintMethodHolder value:false.
         self createAccessorsHolder value:true.
--- a/Tools__NewSystemBrowser.st	Wed Jan 25 19:02:59 2017 +0000
+++ b/Tools__NewSystemBrowser.st	Wed Feb 01 11:36:30 2017 +0000
@@ -5592,6 +5592,10 @@
                        subAspect: selectedMethodsHolder
                        aspect: selectedMethods
                      )
+                    (SubChannelInfoSpec
+                       subAspect: selectedClassesHolder
+                       aspect: selectedClasses
+                     )
                    )
                    createNewApplication: true
                    createNewBuilder: true
@@ -6109,6 +6113,11 @@
                   showBusyCursorWhilePerforming: true
                 )
                (MenuItem
+                  label: 'With Documentation to be Added'
+                  itemValue: browseMenuClassesWithDocumentationToBeAdded
+                  showBusyCursorWhilePerforming: true
+                )
+               (MenuItem
                   label: 'Without Copyright'
                   itemValue: browseMenuClassesWithoutCopyright
                   showBusyCursorWhilePerforming: true
@@ -7389,6 +7398,10 @@
                   label: '-'
                 )
                (MenuItem
+                  label: 'Show Definition'
+                  itemValue: classMenuDefinition
+                )
+               (MenuItem
                   label: 'Show Comment'
                   itemValue: classMenuComment
                 )
@@ -7397,8 +7410,8 @@
                   itemValue: classMenuHierarchy
                 )
                (MenuItem
-                  label: 'Show Definition'
-                  itemValue: classMenuDefinition
+                  label: 'Show Repository Summary'
+                  itemValue: classMenuRepositorySummary
                 )
                (MenuItem
                   label: '-'
@@ -19168,7 +19181,6 @@
     "Return a refactory environment on all selected classes
      May return nil if refactory browser is not available"
 
-
     |subjects allSubjects|
 
     self canUseRefactoringSupport ifTrue:[
@@ -19190,6 +19202,10 @@
 !
 
 selectedCodeComponentsAsEnvironment
+    "Returns a non-empty environment for the current selection. 
+     Depends on the current navigation state and context. 
+     May return nil if refactory browser is not available."
+
     ^ self selectedEnvironment
 
     "Created: / 17-04-2010 / 10:09:16 / Jan Vrany <jan.vrany@fit.cvut.cz>"
@@ -19198,6 +19214,10 @@
 !
 
 selectedEnvironment
+    "Returns a non-empty environment for the current selection. 
+     Depends on the current navigation state and context. 
+     May return nil if refactory browser is not available."
+
     ^ self selectedNonEmptyEnvironment.
 
     "Modified: / 03-08-2011 / 22:49:37 / cg"
@@ -19252,8 +19272,9 @@
 !
 
 selectedNonEmptyEnvironment
-    "Returns a non-empty environment for current selection. Depends on current navigation state
-     and context. May return nil if refactory browser is not available."
+    "Returns a non-empty environment for the current selection. 
+     Depends on the current navigation state and context. 
+     May return nil if refactory browser is not available."
 
     | type mode |
 
@@ -23849,9 +23870,9 @@
         ]
     ].
 
-"/    selectedClasses size == 1 ifTrue:[
-"/        self selectedProtocols value:nil.
-"/    ].
+    "/    selectedClasses size == 1 ifTrue:[
+    "/        self selectedProtocols value:nil.
+    "/    ].
 
     navigationState isVersionDiffBrowser ifFalse:[
         theClassOrNil := self theSingleSelectedClass.
@@ -25794,6 +25815,25 @@
     "Modified: / 29-08-2013 / 12:23:44 / cg"
 !
 
+browseMenuClassesWithDocumentationToBeAdded
+    "searches for classes with either no documentation method,
+     or where the documentation method includes the string 'documentation to be added'"
+    
+    |searchBlock|
+
+    searchBlock := [
+                        self findClassesForWhich:[:cls |
+                            |m|
+                            
+                            (m := cls theMetaclass compiledMethodAt:#documentation) notNil
+                              and:[ (( m source ? '') includesString:'documentation to be added' caseSensitive:false)
+                              and:[ "self halt." true ]]
+                        ].
+                   ].
+
+    self spawnClassBrowserForSearch:searchBlock sortBy:nil in:#newBuffer label:'Classes with documentation to be added'
+!
+
 browseMenuClassesWithFilter:aFilterBlock label:aLabelString
     |searchBlock|
 
@@ -27442,22 +27482,28 @@
     ^ nil
 !
 
-findClassesWithoutClassMethod:selector
+findClassesForWhich:aBlock
     |classes|
 
     classes := IdentitySet new.
     environment allClassesDo:[:eachClass |
-        (eachClass isMeta not
-        and:[eachClass isLoaded
-        and:[eachClass isNameSpace not
-        and:[(eachClass class includesSelector:selector) not]]])
-        ifTrue:[
+        (aBlock value:eachClass) ifTrue:[
              classes add:eachClass
         ].
     ].
     ^ classes asOrderedCollection
 !
 
+findClassesWithoutClassMethod:selector
+    ^ self findClassesForWhich:
+        [:eachClass |
+            (eachClass isMeta not
+              and:[eachClass isLoaded
+              and:[eachClass isNameSpace not
+              and:[(eachClass class includesSelector:selector) not]]])
+        ].
+!
+
 pickViewAndBrowseApplicationClass
     "let user click on a view, then browse its appliction class"
 
@@ -28728,8 +28774,18 @@
                 selectedRules := browser selectedLintRules value.
                 failedMethods := OrderedCollection new.
                 selectedRules ? #() do:[:rule|
-                    failedMethods addAll:
-                        (rule failedMethodsInAnyOf: selectedClasses meta: self hasMetaSelected)
+                    rule isClassScope ifTrue:[
+                        "/ show all methods then
+                        selectedClasses do:[:eachClass |
+                            failedMethods addAll:(
+                                self hasMetaSelected 
+                                    ifTrue:[ eachClass theMetaclass methodDictionary values]
+                                ifFalse:[ eachClass theNonMetaclass methodDictionary values]).
+                        ].        
+                    ] ifFalse:[    
+                        failedMethods addAll:
+                            (rule failedMethodsInAnyOf: selectedClasses meta: self hasMetaSelected)
+                    ].
                 ].
                 failedMethods do:[:mth|
                     whatToDo
@@ -28843,27 +28899,31 @@
 
 smalllintRun
     "Run previously selected rules or default rules on
-     currently selected code (depends on navigation state)"
-
-    ^ self smalllintRunOnEnvironment: self selectedCodeComponentsAsEnvironment
+     the currently selected code (depends on navigation state).
+     i.e. creates either a selectorEnvironment or a classEnvironment,
+     depending on the browser's navigation state"
+
+    ^ self smalllintRunOnEnvironment: (self selectedCodeComponentsAsEnvironment)
 
     "Created: / 27-11-2014 / 11:43:59 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
-smalllintRun:ruleSetOrNil onEnvironment:rbenvironment
+smalllintRun:ruleSetOrNil onEnvironment:rbEnvironment
     "Run given SmallLint rules on given browser environment.
      If `ruleSetOrNil` is nil then ask for the set of rules.
      As a side effect, remembers run rules so next time user
      does 'Run Again', these rules we be run."
 
-    | rule  runRules |
+    |rule runRules environmentUsed |
 
     ruleSetOrNil isNil ifTrue:[
         | dialog |
 
         dialog := Tools::LintRuleSelectionDialog new.
         dialog open.
-        dialog accepted ifFalse:[ ^ self ].
+        dialog accepted ifFalse:[ 
+            ^ self 
+        ].
         rule := dialog selectionAsRule
     ] ifFalse:[
         rule := ruleSetOrNil.
@@ -28883,15 +28943,36 @@
         LastLintRulesHolder := ValueHolder new.
     ].
     LastLintRulesHolder value:rule.
+
+    (environmentUsed := rbEnvironment) isClassEnvironment ifFalse:[
+        "/ change the environment to a class-environment?
+        (rule isClassScope 
+        or:[ 
+            rule isMixedScope 
+            and:[
+                (Dialog confirm:(resources stringWithCRs:'The rule contains class checks and method checks, ok to check whole classes?\(method checks will be applied to all methods in the classes - not only to the selected)')) 
+            ]    
+        ]) ifTrue:[
+            environmentUsed := rbEnvironment asClassEnvironment.
+        ].    
+    ].    
     
     runRules := 
         [
-            "/ Run on copy, because running rules has a sideeffect
+            |msg|
+            
+            "/ Run on a copy of the rule, because running a rule has the sideeffect
             "/ of modifying the rule (storing in its result)
             rule := rule copy.
-            self smalllintRunRule:rule onEnvironment:rbenvironment.
+            self smalllintRunRule:rule onEnvironment:environmentUsed.
             [ rule notNil and:[ rule isEmpty ] ] whileTrue:[
-                (Dialog confirm:(resources string: 'Nothing special found.\\Proceed to select more/different lint rules.') withCRs) ifTrue:[
+                msg := 'Nothing special found.\\Proceed to select more/different lint rules.'.
+                (rule isClassScope or:[rule isMixedScope]) ifTrue:[
+                    environmentUsed isClassEnvironment ifFalse:[
+                        msg := 'Nothing special found.\Notice that the rule contains class checks, but only individual methods were checked.\\Proceed to select more/different lint rules\or cancel and select whole classes to be checked.'.
+                    ].    
+                ].    
+                (Dialog confirm:(resources stringWithCRs:msg)) ifTrue:[
                     | dialog |
 
                     dialog := Tools::LintRuleSelectionDialog new.
@@ -28902,7 +28983,7 @@
                             "/ Run on copy, because running rules has a sideeffect
                             "/ of modifying the rule (storing in its result)
                             rule := rule copy.
-                            self smalllintRunRule:rule onEnvironment:rbenvironment.
+                            self smalllintRunRule:rule onEnvironment:environmentUsed.
                         ].
                     ] ifFalse:[
                         rule := nil.
@@ -28911,11 +28992,15 @@
                     rule := nil
                 ].
             ].
+            
             rule notNil ifTrue:[
+                |browserTitle|
+                
                 "/ Do this asynchronously, this is called from backgdound worker thread!!
+                browserTitle := resources string:'SmallLint results for %1' with:environmentUsed label.
                 self enqueueMessage: #spawnSmalllintBrowserByRuleFor:in:label:
                      for: self
-                     arguments: (Array with: rule with: #newBuffer with: 'SmallLint results for ' , rbenvironment label)
+                     arguments:{rule . #newBuffer . browserTitle}
             ].
         ].
         
@@ -28944,25 +29029,25 @@
 
 smalllintRunRule: anRBLintRule onEnvironment: aBrowserEnvironment
     "Internal helper: Actually run the given rule on given environment.
-     THis is called from a background worker - see smallLintRun:onEnvironment:
-    "
-
-    | rules checker numClassesOverAll numMethodsOverAll numRules
+     This is called from a background worker - see smallLintRun:onEnvironment:
+    "
+
+    | rules checker numClassesOverAll numRules
       count lastPercentage timeOfLastFeedback anyWarning anyError anyInfo|
 
+    "/ make sure that smallLint is loaded
     (Smalltalk at:#RBBuiltinRuleSet) isNil ifTrue:[
         self loadSmalllint
     ].
 
-    "/ avoid this reference (for project-dependencies). Should this method be an extension, maybe
+    "/ avoid direct class reference (for project-dependencies).
     "/ checker := SmalllintChecker.
     checker := (Smalltalk at:#SmalllintChecker).
 
     rules := anRBLintRule flattened.
     aBrowserEnvironment cacheClasses.
     numRules := rules size.
-    numClassesOverAll := aBrowserEnvironment numberClasses * 2 "tests class AND metaclass".
-    numMethodsOverAll := numClassesOverAll * numRules.
+    numClassesOverAll := aBrowserEnvironment numberClasses * 2 "tests class AND metaclass" * numRules.
     count := 0.
     lastPercentage := nil.
     timeOfLastFeedback := Timestamp now.
@@ -29859,7 +29944,7 @@
 !
 
 classMenuChangeAspect:aspect
-    "show a classes comment/hierarchy or definition"
+    "show a classes comment/hierarchy/definition/... <aspect>"
 
     |cls|
 
@@ -29892,6 +29977,10 @@
         self showClassOwnershipGraph:cls.
         ^ self
     ].
+    aspect == #classRepositorySummary ifTrue:[
+        self showClassRepositorySummary:cls.
+        ^ self
+    ].
 
     self error:'unknown aspect: ', aspect printString.
 
@@ -29999,7 +30088,8 @@
 !
 
 classMenuComment
-    "show a classes comment"
+    "show a classes comment.
+     changes the aspect to automatically show the comment when another class is selected."
 
     self classMenuChangeAspect:#classComment
 
@@ -30189,7 +30279,8 @@
 !
 
 classMenuDefinition
-    "show a classes definition"
+    "show a classes definition;
+     changes the aspect to automatically show the definition when another class is selected."
 
     self classMenuChangeAspect:#classDefinition
 
@@ -31097,7 +31188,8 @@
 !
 
 classMenuHierarchy
-    "show a classes hierarchy"
+    "show a classes hierarchy.
+     changes the aspect to automatically show the hierarchy when another class is selected."
 
     self classMenuChangeAspect:#classHierarchy
     "Modified: / 8.11.2001 / 23:06:09 / cg"
@@ -31506,12 +31598,16 @@
 !
 
 classMenuMetrics
+    "show the classes' metrics summary.
+     Requires the OOM (an exept internal package) to be loaded"
+
     |codeView resultStream |
 
     OOM::MetricsSummaryGenerator isNil ifTrue:[
         Dialog warn:('The metrics package is not loaded').
         ^ self
     ].
+    
     (self askIfModified:'Code was modified.\\Show metrics anyway ?') ifFalse:[^ self].
 
     codeView := self codeView.
@@ -32085,7 +32181,8 @@
 !
 
 classMenuOwnershipGraph
-    "show a classes ownership graph/trend"
+    "show a classes ownership graph/trend.
+     changes the aspect to automatically show the ownership graph when another class is selected."
 
     self classMenuChangeAspect:#classOwnershipGraph
 !
@@ -32511,6 +32608,13 @@
     "Modified: / 12-08-2014 / 12:28:19 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
+classMenuRepositorySummary
+    "show a classes repository summary info.
+     changes the aspect to automatically show the summary info when another class is selected."
+
+    self classMenuChangeAspect:#classRepositorySummary
+!
+
 classMenuRewrite
     MethodRewriter new
         classes: self selectedClassesValue;
@@ -40001,10 +40105,26 @@
 !
 
 debugMenuRunLintRuleOn
-    "apply the selected rule(s) on a chosen set of classes"
-
-    |package packagesInChangeSet ruleset env packages|
-
+    "apply the selected rule(s) on a chosen set of package classes"
+
+    |package packagesInChangeSet ruleset env|
+
+    ruleset := RBLintRuleSet new.
+    self selectedClasses value do:[:each |
+        |cls|
+
+        cls := each theNonMetaclass.
+        (cls isSubclassOf:RBLintRule) ifTrue:[
+            (cls isAbstract "cls isBroken" or:[ cls isVisible not ]) ifFalse:[
+                ruleset addRule:(cls new).
+            ].    
+        ].
+    ].
+    ruleset isEmptyInTree ifTrue:[
+        Dialog information:'The ruleset is empty (or only abstract/inVisible rules selected'.
+        ^ self
+    ].
+    
     packagesInChangeSet := 
         (ChangeSet current 
             collect:[:chg | |cls| (cls := chg changeClass) notNil ifTrue:[cls package] ]
@@ -40019,28 +40139,15 @@
     package isNil ifTrue:[^ self].
     LastLintedPackage := package.
     
-    ruleset := RBLintRuleSet new.
-    self selectedClasses value do:[:each |
-        |cls|
-        
-        cls := each theNonMetaclass.
-        (cls isSubclassOf:RBLintRule) ifTrue:[
-            (cls isBroken
-            or:[ cls isVisible not ]) ifFalse:[
-                ruleset addRule:(cls new).
-            ].    
-        ].
-    ].
+    env := PackageEnvironment new.
+
     package = '* all *' ifTrue:[
-        packages := Smalltalk allPackageIDs
+        env packageNames:Smalltalk allPackageIDs.
+        env label:('package ' , package).
     ] ifFalse:[    
-        packages := { package }
-    ].
-    
-    env := PackageEnvironment new
-                packageNames:packages;
-                label:('package ' , package);
-                yourself.
+        env packageNamesMatchingAny: { package }.
+        env label:('packages matching ' , package).
+    ].
                                                            
     self smalllintRun:ruleset onEnvironment:env.
 !
@@ -46731,13 +46838,27 @@
     numMethods := methods size.
     affectedPackages := Set new.
     
-    affectedPackages := methods collect:[:m | m package] as:Set.
-    affectedPackages add:newProject.
+    methods do:[:eachMethod |
+        |mClass oldPackage|
+        
+        mClass := eachMethod mclass.
+        oldPackage := eachMethod package.
+        "/ if it was an extension before, the old package needs an update (for its extension list)
+        (oldPackage ~= mClass package) ifTrue:[
+            affectedPackages add:oldPackage
+        ].    
+        "/ if it will be an extension afterwards, the new package needs an update (for its extension list)
+        (newProject ~= mClass package) ifTrue:[
+            affectedPackages add:newProject
+        ].    
+    ].
+    affectedPackages remove:(PackageId noProjectID) ifAbsent:[].
     
     (self canUseRefactoringSupport and:[numMethods > 1]) ifTrue:[
         change := CompositeRefactoryChange named:('Move ', numMethods printString , ' methods to project ' , newProject).
         methods do:[:eachMethod |
             |mClass|
+            
             mClass := eachMethod mclass.
             change
                 changeProjectOf:(eachMethod selector)
@@ -48380,8 +48501,11 @@
     "/ majority is defined: more than 2/3 of the other impls are in a particular package:
     projectsOfOtherImplementations := affectedMethods
                                         collectAll:[:eachMethod |
-                                            (environment allImplementorsOf:eachMethod selector)
-                                                collect:[:cls | (cls compiledMethodAt:eachMethod selector) package]
+                                            |selector|
+                                            selector := eachMethod selector.
+                                            (environment allImplementorsOf:selector)
+                                                select:[:cls | (cls compiledMethodAt:selector) ~~ eachMethod]
+                                                thenCollect:[:cls | (cls compiledMethodAt:selector) package]
                                         ] as: Bag.
 
     "/ Transcript show:'all: '; show:projectsOfOtherImplementations size; show:' this: '; showCR:projectsOfOtherImplementations sortedCounts first.
@@ -54344,13 +54468,15 @@
     (navigationState isClassBrowser) ifTrue:[
         "/ must check if that class is in the list ...
         ((navigationState classList value ? #()) includesIdentical:aClass) ifFalse:[
-            navigationState isSingleClassBrowser ifTrue:[
-                navigationState classList value:(Array with:aClass).
-            ] ifFalse:[
-                (self confirm:'Class not in list.\\Add a buffer for it ?' withCRs) ifTrue:[
-                    self spawnFullBrowserInClass:aClass selector:aSelector in:#newBuffer.
-                ].
-                ^ self
+            ((navigationState classList value ? #()) includesIdentical:aClass theNonMetaclass) ifFalse:[
+                navigationState isSingleClassBrowser ifTrue:[
+                    navigationState classList value:(Array with:aClass).
+                ] ifFalse:[
+                    (self confirm:'Class not in list.\\Add a buffer for it ?' withCRs) ifTrue:[
+                        self spawnFullBrowserInClass:aClass selector:aSelector in:#newBuffer.
+                    ].
+                    ^ self
+                ].
             ].
         ].
         self selectedClasses value:(OrderedCollection with:aClass).
@@ -55385,6 +55511,10 @@
         self showClassHierarchy:theNonMetaclass.
         ^ self.
     ].
+    codeAspect == #classRepositorySummary ifTrue:[
+        self showClassRepositorySummary:theNonMetaclass.
+        ^ self.
+    ].
 
     ((codeAspect == #primitiveDefinitions)
     or:[ (codeAspect == #primitiveFunctions)
@@ -55393,18 +55523,27 @@
         ^ self.
     ].
 
-    self codeAspect: #classDefinition.
+    "/ self codeAspect: #classDefinition.
     self setAcceptActionForClass.
     self showClassDefinition:aClass.
 !
 
 showClassComment:aClass
+    "show the classes comment.
+     This is NOT the string extracted from the documentaion method,
+     but the old-style (ST80-style) comment.
+     ST/X does not use those, as the eat up memory (they are in-image strings),
+     whereas the documentation method's comment is only in the sourcefile, and 
+     loaded on demand.
+     Thus, the ST80 comment will only be shown for classes which have been loaded from
+     ST80/Squeak source code."
+     
     |code codeView|
 
     self codeAspect:#classComment.
     self setAcceptActionForClassComment.
-"/    self selectedMethods value:nil.
-"/    self selectedProtocols value:nil.
+    "/ self selectedMethods value:nil.
+    "/ self selectedProtocols value:nil.
 
     aClass notNil ifTrue:[
         aClass isLoaded ifFalse:[
@@ -55789,6 +55928,42 @@
     self showClassPrimitive:#primitiveVariables class:aClass
 !
 
+showClassRepositorySummary:aClass
+    "shows summary info from the repository:
+        current version,
+        newest in repository,
+        original checkin date (i.e. age),
+        tags on the current version
+        maybe more in the future
+    "
+        
+    |info scm codeView|
+
+    self codeAspect:#classRepositorySummary.
+    self setAcceptActionForNothing.
+
+    aClass isNil ifTrue:[^ self].
+
+    info := String streamContents:[:s |
+        (scm := aClass sourceCodeManager) isNil ifTrue:[
+            s nextPutLine:'Class has source code manager defined'.
+            (scm := SourceCodeManager) isNil ifTrue:[
+                s nextPutLine:'No default source code manager is defined'.
+            ].  
+        ].
+        scm notNil ifTrue:[
+            self withWaitCursorDo:[
+                scm printClassRepositorySummaryForClass:aClass on:s
+            ].
+        ]
+    ].
+
+    codeView := self codeView.
+    codeView contents:info.
+    codeView modified:false.
+    navigationState realModifiedState:false.
+!
+
 showClassVarInfoFor:var in:aClass value:val
     |text valText lines|
 
--- a/abbrev.stc	Wed Jan 25 19:02:59 2017 +0000
+++ b/abbrev.stc	Wed Feb 01 11:36:30 2017 +0000
@@ -200,7 +200,6 @@
 ClassItemRootForRevision ClassItemRootForRevision stx:libtool 'Interface-Browsers-Support' 0
 ClassNameItem ClassNameItem stx:libtool 'Interface-Browsers-Support' 0
 ClassRevisionTree ClassRevisionTree stx:libtool 'Interface-Browsers-Support' 1
-ClassVariablesInspectorView ClassVariablesInspectorView stx:libtool 'Interface-Inspector' 2
 CodeGeneratorTests CodeGeneratorTests stx:libtool 'Interface-Browsers' 1
 ColorInspectorView ColorInspectorView stx:libtool 'Interface-Inspector' 2
 EWorldIconLibrary EWorldIconLibrary stx:libtool 'Interface-Smalltalk' 0
@@ -216,6 +215,7 @@
 ProjectView ProjectView stx:libtool 'Interface-Tools' 2
 SemaphoreMonitor SemaphoreMonitor stx:libtool 'Monitors-ST/X' 2
 SmalltalkInspectorView SmalltalkInspectorView stx:libtool 'Interface-Inspector' 2
+ClassVariablesInspectorView ClassVariablesInspectorView stx:libtool 'Interface-Inspector' 2
 SourceRevisionItem SourceRevisionItem stx:libtool 'Interface-Browsers-Support' 0
 TextDiffTests TextDiffTests stx:libtool 'Collections-Sequenceable-Diff' 1
 Tools::CodeView2DemoApp Tools__CodeView2DemoApp stx:libtool 'Interface-CodeView' 1
--- a/extensions.st	Wed Jan 25 19:02:59 2017 +0000
+++ b/extensions.st	Wed Feb 01 11:36:30 2017 +0000
@@ -601,6 +601,8 @@
     |d|
 
     d := super inspectorExtraAttributes
+        add:'-hex' -> [ self asByteArray hexPrintStringWithSeparator:Character space ];
+        add:'-bytes' -> [ self asByteArray ];
         add:'-utf8String' -> [ self utf8Encoded ];
         add:'-utf8Bytes' -> [ self utf8Encoded asByteArray ];
         add:'-utf8' -> [ self utf8Encoded asByteArray hexPrintStringWithSeparator:Character space ];
@@ -1327,6 +1329,44 @@
 
 !Image methodsFor:'inspecting'!
 
+inspector2TabImageCreatorClass
+    <inspector2Tab>
+
+    |name className s ownerClass ownerSelector |
+    
+    (name := Icon nameIfKnownIcon:self) isNil ifTrue:[^ nil].
+
+    s := name readStream.
+    className := s upToSeparator.
+    (ownerClass := Smalltalk classNamed: className) isNil ifTrue:[^ nil].
+    s skipSeparators.
+    ownerSelector := s upToSeparator.
+    ownerSelector = 'class' ifTrue:[
+        ownerClass := ownerClass theMetaclass.
+        ownerSelector := ''.
+        s skipSeparators.
+    ].    
+    ownerSelector := ownerSelector , s upToEnd.
+    ownerSelector knownAsSymbol ifFalse:[^ nil].
+    ownerSelector := ownerSelector asSymbol.
+    
+    (ownerClass implements:ownerSelector) ifFalse:[
+        ownerClass := ownerClass isMeta ifTrue:[ ownerClass theNonMetaclass] ifFalse:[ ownerClass theMetaclass ].
+        (ownerClass implements:ownerSelector) ifFalse:[
+            ^ nil
+        ].
+    ].
+
+    ^ Tools::Inspector2Tab 
+        toBrowseClass:ownerClass selector:ownerSelector label:'Image Creator'
+
+    "
+     ToolbarIconLibrary systemBrowserIcon inspect
+    "
+! !
+
+!Image methodsFor:'inspecting'!
+
 inspector2Tabs
     |tabs|
     
@@ -1359,9 +1399,13 @@
 
     d := super inspectorExtraAttributes.
     (name := Icon nameIfKnownIcon:self) notNil ifTrue:[
-        d add:'-name' -> [ name ]
+        d add:'-origin (comes from)' -> [ name ]
     ].    
     ^ d
+
+    "
+     ToolbarIconLibrary systemBrowserIcon inspect
+    "
 ! !
 
 !Image methodsFor:'inspecting'!
@@ -1759,49 +1803,51 @@
 !Object methodsFor:'inspecting'!
 
 inspector2TabClass
-    |makeView|
-
     <inspector2Tab>
 
-    makeView := [
-        |spec view browser navigationState cls canvas|
-
-
-        view isNil ifTrue:[
-            "/ spec := #singleClassBrowserSpec.
-            spec := #multipleClassBrowserSpec.
-
-            browser := Tools::NewSystemBrowser new
-                           isEmbeddedBrowser:true;
-                           createBuilder.
-
-            navigationState := browser navigationState.
-            navigationState canvasType:spec.
-            browser browserCanvasType:spec.
-
-            canvas := browser browserCanvas value.
-            canvas builder:(browser builder).
-            navigationState canvas:canvas.
-            "/ browser switchToClassHierarchyView.
-            "/ browser showInheritedMethods.
-
-            cls := self class theNonMetaclass.
-            browser classListGenerator value:(cls withAllSuperclasses).
-            browser sortByNameAndInheritance value:true.
-            browser
-                selectClass:cls;
-                selectProtocol: (Tools::BrowserList nameListEntryForALL).  
-            view := ApplicationSubView new client: browser spec: spec.
-            navigationState classListApplication addOwnerClasses value:false.
-        ].
-        view
-    ].
-
-    ^  Tools::Inspector2Tab new
-            priority: 0;
-            label:'Class';
-            viewHolder: makeView;
-            yourself
+    ^ Tools::Inspector2Tab toBrowseClass:self class theNonMetaclass selector:nil label:'Class'
+    
+"/    |makeView|
+"/
+"/    makeView := [
+"/        |spec view browser navigationState cls canvas|
+"/
+"/
+"/        view isNil ifTrue:[
+"/            "/ spec := #singleClassBrowserSpec.
+"/            spec := #multipleClassBrowserSpec.
+"/
+"/            browser := Tools::NewSystemBrowser new
+"/                           isEmbeddedBrowser:true;
+"/                           createBuilder.
+"/
+"/            navigationState := browser navigationState.
+"/            navigationState canvasType:spec.
+"/            browser browserCanvasType:spec.
+"/
+"/            canvas := browser browserCanvas value.
+"/            canvas builder:(browser builder).
+"/            navigationState canvas:canvas.
+"/            "/ browser switchToClassHierarchyView.
+"/            "/ browser showInheritedMethods.
+"/
+"/            cls := self class theNonMetaclass.
+"/            browser classListGenerator value:(cls withAllSuperclasses).
+"/            browser sortByNameAndInheritance value:true.
+"/            browser
+"/                selectClass:cls;
+"/                selectProtocol: (Tools::BrowserList nameListEntryForALL).  
+"/            view := ApplicationSubView new client: browser spec: spec.
+"/            navigationState classListApplication addOwnerClasses value:false.
+"/        ].
+"/        view
+"/    ].
+"/
+"/    ^  Tools::Inspector2Tab new
+"/            priority: 0;
+"/            label:'Class';
+"/            viewHolder: makeView;
+"/            yourself
 
     "Created: / 03-02-2015 / 11:00:01 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
--- a/resources/de.rs	Wed Jan 25 19:02:59 2017 +0000
+++ b/resources/de.rs	Wed Feb 01 11:36:30 2017 +0000
@@ -619,6 +619,7 @@
 'Close %1 only or Exit Smalltalk (Close all) ?'                                                         'Nur %1 schließen oder Smalltalk beenden (alle schließen) ?'
 'Close All like This'                                                                                   'Alle dieser Art schließen'
 'Close All like This%1'                                                                                 'Alle dieser Art schließen%1'
+'Close all like This%1'                                                                                 'Alle dieser Art schließen%1'
 'Close Debugger and Abort'                                                                              'Debugger schließen und abbrechen'
 'Close Tab'                                                                                             'Tab schließen'
 'Close all Debuggers'                                                                                   'Alle Debugger schließen'
@@ -863,6 +864,7 @@
 'Deiconify All'                                                                                         'Alle Fenster zeigen'
 'Deiconify All like This'                                                                               'Alle dieser Art zeigen'
 'Deiconify All like This%1'                                                                             'Alle dieser Art zeigen%1'
+'Deiconify all like This%1'                                                                             'Alle dieser Art zeigen%1'
 'Delete'                                                                                                'Entfernen'
 'Delete File'                                                                                           'Datei löschen'
 'Delete Selected File(s)'                                                                               'Ausgewählte Datei(en) löschen'
@@ -1314,6 +1316,7 @@
 'Iconify All'                                                                                           'Alle Fenster minimieren'
 'Iconify All like This'                                                                                 'Alle dieser Art minimieren'
 'Iconify All like This%1'                                                                               'Alle dieser Art minimieren%1'
+'Iconify all like This%1'                                                                               'Alle dieser Art minimieren%1'
 'Iconify all'                                                                                           'Alle Fenster minimieren'
 'Identifier Color'                                                                                      'Sonstige Bezeichner'
 'If Present, Load Binary Objects when Autoloading'                                                      'Bei Autoload, binäre Datei-Objekte laden, falls vorhanden'
@@ -2564,6 +2567,8 @@
 'Tenure'                                                                                                'Tenure (Objekte altern)'
 'Terminate Group'                                                                                       'Prozessgruppe terminieren'
 'Terminate Processes Forked Here'                                                                       'Hier geforkte Prozesse beenden'
+'Terminate All Like This'                                                                               'Alle mit diesem Namen terminieren'
+'Terminate all like This'                                                                               'Alle mit diesem Namen terminieren'
 'Test'                                                                                                  'Prüfen'
 'TestCase'                                                                                              'Testfall'
 'Tetra'                                                                                                 'Tetraeder'
--- a/stx_libtool.st	Wed Jan 25 19:02:59 2017 +0000
+++ b/stx_libtool.st	Wed Feb 01 11:36:30 2017 +0000
@@ -395,7 +395,6 @@
         (ClassItemRootForRevision autoload)
         (ClassNameItem autoload)
         (ClassRevisionTree autoload)
-        (ClassVariablesInspectorView autoload)
         (CodeGeneratorTests autoload)
         (ColorInspectorView autoload)
         (EWorldIconLibrary autoload)
@@ -411,6 +410,7 @@
         (ProjectView autoload)
         (SemaphoreMonitor autoload)
         (SmalltalkInspectorView autoload)
+        (ClassVariablesInspectorView autoload)
         (SourceRevisionItem autoload)
         (TextDiffTests autoload)
         (#'Tools::CodeView2DemoApp' autoload)
@@ -616,6 +616,7 @@
         'StandaloneStartup class' iconInBrowserSymbol
         'Warning class' iconInBrowserSymbol
         'AbstractSyntaxHighlighter class' formatStatements:in:elementsInto:
+        Image inspector2TabImageCreatorClass
     )
 ! !
 
--- a/stx_libtoolWINrc.rc	Wed Jan 25 19:02:59 2017 +0000
+++ b/stx_libtoolWINrc.rc	Wed Feb 01 11:36:30 2017 +0000
@@ -3,7 +3,7 @@
 // automagically generated from the projectDefinition: stx_libtool.
 //
 VS_VERSION_INFO VERSIONINFO
-  FILEVERSION     7,1,1,155
+  FILEVERSION     7,1,1,156
   PRODUCTVERSION  7,1,0,0
 #if (__BORLANDC__)
   FILEFLAGSMASK   VS_FF_DEBUG | VS_FF_PRERELEASE
@@ -20,12 +20,12 @@
     BEGIN
       VALUE "CompanyName", "Claus Gittinger / eXept Software AG\0"
       VALUE "FileDescription", "Smalltalk/X Tools (LIB)\0"
-      VALUE "FileVersion", "7.1.1.155\0"
+      VALUE "FileVersion", "7.1.1.156\0"
       VALUE "InternalName", "stx:libtool\0"
       VALUE "LegalCopyright", "Copyright Claus Gittinger 1988\nCopyright eXept Software AG 2012\0"
       VALUE "ProductName", "Smalltalk/X\0"
       VALUE "ProductVersion", "7.1.0.0\0"
-      VALUE "ProductDate", "Tue, 17 Jan 2017 00:00:35 GMT\0"
+      VALUE "ProductDate", "Wed, 25 Jan 2017 15:06:35 GMT\0"
     END
 
   END