SmallSense__JavaEditSupport.st
author Jan Vrany <jan.vrany@fit.cvut.cz>
Mon, 26 Aug 2013 10:33:23 +0100
changeset 67 020b7461b15e
parent 64 2257d7223898
child 108 71471dc81e77
permissions -rw-r--r--
Package structure reorganization. SmallSense is no longer Smalltalk-specific but it provides infrastructure to build support for other languages as well. Therefore classes and class categories were renamed to reflect whether it is a reusable *core* thing or Smalltalk-specific code.

"{ Package: 'jv:smallsense' }"

"{ NameSpace: SmallSense }"

EditSupport subclass:#JavaEditSupport
	instanceVariableNames:'lastTypedKey0 lastTypedKey1 lastTypedKey2 lastTypedKey3'
	classVariableNames:''
	poolDictionaries:''
	category:'SmallSense-Java'
!

!JavaEditSupport methodsFor:'accessing'!

language
    "superclass SmallSenseEditSupport says that I am responsible to implement this method"

    ^ (Smalltalk at:#JavaLanguage) instance.

    "Modified: / 04-08-2013 / 02:07:32 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!JavaEditSupport methodsFor:'event handling'!

keyPress: key x:x y:y in: view

    "Handles an event in given view (a subview of codeView).
     If the method returns true, the event will not be processed
     by the view."

    view ~~ textView ifTrue:[ ^ false ].

    lastTypedKey3 := lastTypedKey2.
    lastTypedKey2 := lastTypedKey1.
    lastTypedKey1 := lastTypedKey0.
    lastTypedKey0 := key.

    key == ${ ifTrue:[
        ^ self keyPressOpenCurly
    ].

    ^ super keyPress: key x:x y:y in: view

    "Created: / 07-03-2010 / 09:36:44 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 04-08-2013 / 03:06:02 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

keyPressOpenCurly
    | line token i |

    line := service codeView listAt: service codeView cursorLine.
    line notEmptyOrNil ifTrue:[
        i := line size.
        [ (line at: i) isSeparator and:[i > 0] ] whileTrue:[ i := i - 1 ].
        (i ~~ 0 and:[service codeView cursorCol < i]) ifTrue:[
            ^ false.
        ].
    ] ifFalse:[
        self insertElectricBlockOpenedBy: '{' closedBy: '}'. 
        ^ true
    ].

    token := self tokenAtCursorLine.
    (token isNil or:[token == #String]) ifTrue:[ ^ false ].

    self insertElectricBlockOpenedBy: '{' closedBy: '}'. 
    ^ true

    "Created: / 04-08-2013 / 01:54:48 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!JavaEditSupport methodsFor:'private'!

tokenAtCursorLine
    | scanner token |

    scanner := (Smalltalk at:#JavaScanner) for: (service textView listAt: service textView cursorLine) string.

    [ 
        [ 
            token := scanner nextToken.
            (token ~~ #EOF and:[ scanner tokenEndPosition + 1 < service textView cursorCol ])
        ] whileTrue.
    ] on: Error do:[
        token := nil.
    ].
    ^ token

    "Created: / 04-08-2013 / 02:00:43 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 04-08-2013 / 03:10:40 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

tokensAtCursorLine
    | scanner token |

    scanner := (Smalltalk at:#JavaScanner) for: (service textView listAt: service textView cursorLine) string.
    ^ OrderedCollection streamContents:[:tokens |
        [ token := scanner nextToken.token ~~ #EOF ] whileTrue:[
            tokens nextPut: token.
        ].
    ].

    "Created: / 04-08-2013 / 01:57:24 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !