JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
page up: cursor to start if scrolled top already
[peach-html5-editor.git] / editor.coffee
index c78151a..a0bd0a4 100644 (file)
@@ -1077,6 +1077,13 @@ class PeachHTML5Editor
                                @kill_cursor()
                return
        on_page_up_key: (e) ->
+               if @wrap2.scrollTop is 0
+                       return unless @cursor?
+                       new_cursor = first_cursor_position @tree
+                       if new_cursor?
+                               if new_cursor.n isnt @cursor.n or new_cursor.i isnt @cursor.i
+                                       @move_cursor new_cursor
+                       return
                if @cursor?
                        screen_y = @cursor.y - @wrap2.scrollTop
                scroll_amount = @wrap2_height - breathing_room
@@ -1084,10 +1091,17 @@ class PeachHTML5Editor
                if @cursor?
                        @move_cursor_into_view screen_y + @wrap2.scrollTop
        on_page_down_key: (e) ->
+               lowest_scrollpos = @wrap2.scrollHeight - @wrap2_height
+               if @wrap2.scrollTop is lowest_scrollpos
+                       return unless @cursor?
+                       new_cursor = last_cursor_position @tree
+                       if new_cursor?
+                               if new_cursor.n isnt @cursor.n or new_cursor.i isnt @cursor.i
+                                       @move_cursor new_cursor
+                       return
                if @cursor?
                        screen_y = @cursor.y - @wrap2.scrollTop
                scroll_amount = @wrap2_height - breathing_room
-               lowest_scrollpos = @wrap2.scrollHeight - @wrap2_height
                @wrap2.scrollTop = Math.min lowest_scrollpos, @wrap2.scrollTop + scroll_amount
                if @cursor?
                        @move_cursor_into_view screen_y + @wrap2.scrollTop
@@ -1095,32 +1109,36 @@ class PeachHTML5Editor
        move_cursor_into_view: (y_target) ->
                return if y_target is @cursor.y
                was = @cursor
-               y_min = @wrap2.scrollTop + breathing_room
-               y_max = @wrap2.scrollTop + @wrap2_height - 2 * breathing_room
+               y_min = @wrap2.scrollTop
+               unless @wrap2.scrollTop is 0
+                       y_min += breathing_room
+               y_max = @wrap2.scrollTop + @wrap2_height
+               unless @wrap2.scrollTop is @wrap2.scrollHeight - @wrap2_height # downmost
+                       y_max -= breathing_room
                y_target = Math.min y_target, y_max
                y_target = Math.max y_target, y_min
                if y_target < @cursor.y
                        finder = find_up_cursor_position
-                       far_enough = (a, b) ->
-                               return a <= b
+                       far_enough = (cur, target_y) ->
+                               return cur.y + cur.h <= target_y
                else
                        finder = find_down_cursor_position
-                       far_enough = (a, b) ->
-                               return a >= b
+                       far_enough = (cur, y_target) ->
+                               return cur.y >= y_target
                loop
                        cur = finder @tree, was, @cursor_ideal_x
                        break unless cur?
-                       break if far_enough cur.y, y_target
+                       break if far_enough cur, y_target
                        was = cur
                if was is @cursor
                        was = null
                if was?
-                       if was.y > y_max
+                       if was.y + was.h > y_max
                                was = null
                        else if was.y < y_min
                                was = null
                if cur?
-                       if cur.y > y_max
+                       if cur.y + cur.h > y_max
                                cur = null
                        else if cur.y < y_min
                                cur = null
@@ -1128,7 +1146,7 @@ class PeachHTML5Editor
                        # both valid, pick best
                        if cur.y < y_min
                                new_cursor = was
-                       else if was.y > y_max
+                       else if was.y + was.h > y_max
                                new_cursor = cur
                        else if cur.y - y_target < y_target - was.y
                                new_cursor = cur