JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
fix click offset bug
[peach-html5-editor.git] / editor.coffee
index 411072a..8290b37 100644 (file)
@@ -51,7 +51,7 @@ debug_dot_at = (doc, x, y) ->
 
 # text nodes don't have getBoundingClientRect(), so use selection api to find
 # it.
-get_el_bounds = (el) ->
+get_el_bounds = window.bounds = (el) ->
        if el.getBoundingClientRect?
                rect = el.getBoundingClientRect()
        else
@@ -623,7 +623,7 @@ class PeachHTML5Editor
                @cursor_el = null
                @cursor_visible = false
                @poll_for_blur_timeout = null
-               @iframe_offset = null
+               @wrap2_offset = null
                @iframe_height = null
                opt_fragment = @options.fragment ? true
                @parser_opts = {}
@@ -703,12 +703,11 @@ class PeachHTML5Editor
                if @options.on_init?
                        @options.on_init()
        overlay_event_to_inner_xy: (e) ->
-               unless @iframe_offset?
-                       @iframe_offset = get_el_bounds @iframe
-               x = e.pageX # TODO ?cross-browserify
-               y = e.pageY + @wrap2.scrollTop # TODO ?cross-browserify
-               # TODO adjust for scrolling
-               return x: x - @iframe_offset.x, y: y - @iframe_offset.y
+               unless @wrap2_offset?
+                       @wrap2_offset = get_el_bounds @wrap2
+               x = e.pageX - overlay_padding
+               y = e.pageY - overlay_padding + @wrap2.scrollTop
+               return x: x - @wrap2_offset.x, y: y - @wrap2_offset.y
        onclick: (e) ->
                xy = @overlay_event_to_inner_xy e
                new_cursor = find_loc_cursor_position @tree, xy
@@ -751,11 +750,31 @@ class PeachHTML5Editor
                                                new_loc = cursor_to_xyh new_cursor[0], new_cursor[1]
                                        if new_cursor?
                                                # now we're above
-                                               if new_loc.x > old_loc.x
-                                                       console.log 'fixme'
-                                                       # TODO move left until we go up or meet/pass old_loc.x
-                                                       # then set new_cursor to the closest
-                                               @move_cursor new_cursor
+                                               if new_loc.x <= old_loc.x
+                                                       @move_cursor new_cursor
+                                                       return false
+                                               target_y = new_loc.y
+                                               # search leftward, until we find the closest position
+                                               while new_loc.x > old_loc.x and new_loc.y is target_y
+                                                       prev_loc = new_loc
+                                                       prev_cursor = new_cursor
+                                                       new_cursor = find_prev_cursor_position @tree, new_cursor[0], new_cursor[1]
+                                                       break unless new_cursor?
+                                                       new_loc = cursor_to_xyh new_cursor[0], new_cursor[1]
+                                               # move cursor to prev_cursor or new_cursor
+                                               if new_cursor?
+                                                       if new_loc.y is target_y
+                                                               # both valid, and on the same line, use closest
+                                                               if (old_loc.x - new_loc.x) < (prev_loc.x - old_loc.x)
+                                                                       @move_cursor new_cursor
+                                                               else
+                                                                       @move_cursor prev_cursor
+                                                       else
+                                                               # new_cursor on wrong line, use prev_cursor
+                                                               @move_cursor prev_cursor
+                                               else
+                                                       # can't go any further prev, use prev_cursor
+                                                       @move_cursor prev_cursor
                                else
                                        # move cursor to first position in document
                                        new_cursor = find_prev_cursor_position @tree