SmallSense__SmalltalkEditSupport.st
changeset 260 e3becce6ef1e
parent 255 c32b4a6595d6
parent 257 623cefc35e2e
child 354 cbffe76c9b5a
child 374 e65bd2bf892a
child 841 088d207d9275
--- a/SmallSense__SmalltalkEditSupport.st	Fri Jul 25 21:14:13 2014 +0100
+++ b/SmallSense__SmalltalkEditSupport.st	Fri Jul 25 21:15:22 2014 +0100
@@ -70,43 +70,53 @@
     "Created: / 04-05-2014 / 23:29:57 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
-undent: text
-    | lines indent tabwidth  |
+undent: stringOrStringCollection
+    | lines indent tabwidth ignoreIndentOfFirstLineIfZero indentOfFirstLineIsZero |
 
-    lines := text asStringCollection.
+    stringOrStringCollection isStringCollection ifTrue:[ 
+        ignoreIndentOfFirstLineIfZero := false.
+        stringOrStringCollection removeLast.
+        lines := stringOrStringCollection.
+    ] ifFalse:[
+        ignoreIndentOfFirstLineIfZero := true.
+        lines := stringOrStringCollection asStringCollection.
+    ].
     tabwidth := (ListView userDefaultTabPositions = ListView tab4Positions) ifTrue:[ 4 ] ifFalse: [ 8 ].
+    indent := nil.
+    indentOfFirstLineIsZero := false.
+
     1 to: lines size do:[:lineNo |
-        | line i |
+        | line lineIndent |
 
         line := lines at: lineNo.
-        i := line indexOfNonSeparator.
-        indent isNil ifTrue:[
-            (i ~~ 0) ifTrue:[
-                indent := ((i - 1) // tabwidth) * tabwidth.
-                indent == 0 ifTrue:[
-                    lineNo == 1 ifTrue:[
-                        indent := nil.
-                    ] ifFalse:[
-                        ^ text.
-                    ].
+        lineIndent := line indexOfNonSeparator.
+        (lineIndent ~~ 0) ifTrue:[
+            indent isNil ifTrue:[
+                indent := ((lineIndent - 1) // tabwidth) * tabwidth.
+            ] ifFalse:[ 
+                indent := (((lineIndent - 1) // tabwidth) * tabwidth) min: indent.
+            ].
+            indent == 0 ifTrue:[
+                (lineNo == 1 and:[ignoreIndentOfFirstLineIfZero]) ifTrue:[
+                    indent := nil.
+                    indentOfFirstLineIsZero := true.
+                ] ifFalse:[
+                    ^ stringOrStringCollection isStringCollection
+                        ifTrue:[ stringOrStringCollection asStringWithoutFinalCR ]
+                        ifFalse:[ stringOrStringCollection ]
                 ].
             ].
         ].
-        indent notNil ifTrue:[
-            i > indent ifTrue:[
-                lines at: lineNo put: (line copyFrom: indent + 1).
-            ] ifFalse:[
-                ^ text.
-            ].
+    ].
+    1 to: lines size do:[:lineNr |  
+        (lineNr ~~ 1 or:[indentOfFirstLineIsZero not]) ifTrue:[ 
+            lines at: lineNr put: ((lines at: lineNr) copyFrom: indent + 1).
         ].
     ].
-    ^ (text last == Character cr) ifTrue:[
-        lines asString.
-    ] ifFalse:[
-        lines asStringWithoutFinalCR
-    ].
+    ^ lines asStringWithoutFinalCR
 
     "Created: / 04-05-2014 / 23:09:35 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 23-07-2014 / 23:24:18 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
 !SmalltalkEditSupport methodsFor:'accessing'!