JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
page down key: cursor to end if scrolled bot already
[peach-html5-editor.git] / editor.coffee
index c78151a..a7c3c66 100644 (file)
@@ -1088,6 +1088,14 @@ class PeachHTML5Editor
                        screen_y = @cursor.y - @wrap2.scrollTop
                scroll_amount = @wrap2_height - breathing_room
                lowest_scrollpos = @wrap2.scrollHeight - @wrap2_height
+               if @wrap2.scrollTop is lowest_scrollpos # already at bottom
+                       return unless @cursor?
+                       # move cursor to bottom
+                       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
                @wrap2.scrollTop = Math.min lowest_scrollpos, @wrap2.scrollTop + scroll_amount
                if @cursor?
                        @move_cursor_into_view screen_y + @wrap2.scrollTop
@@ -1095,32 +1103,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 +1140,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