Legend:
Page
Library
Module
Module type
Parameter
Class
Class type
Source
Source file zed_cursor.ml
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141(*
* zed_cursor.ml
* -------------
* Copyright : (c) 2011, Jeremie Dimino <jeremie@dimino.org>
* Licence : BSD3
*
* This file is a part of Zed, an editor engine.
*)openReactexceptionOut_of_boundstypechanges={position:int;added:int;removed:int;added_width:int;removed_width:int;}typeaction=|User_moveofint|Text_modificationofchanges(* start, added, removed *)typet={position:intsignal;send:action->unit;length:intref;changes:changesevent;get_lines:unit->Zed_lines.t;coordinates:(int*int)signal;coordinates_display:(int*int)signal;line:intsignal;column:intsignal;column_display:intsignal;wanted_column:intsignal;set_wanted_column:int->unit;}letcreatelengthchangesget_linespositionwanted_column=ifposition<0||position>lengththenraiseOut_of_bounds;letlength=reflengthinletuser_moves,send=E.create()inletupdate_positionpositionaction=matchactionwith|User_movepos->pos|Text_modificationchanges->letdelta=changes.added-changes.removedinlength:=!length+delta;if!length<0thenraiseOut_of_bounds;(* Move the cursor if it is after the start of the changes. *)ifposition>changes.positionthenbeginifdelta>=0then(* Text has been inserted, advance the cursor. *)position+deltaelseifposition<changes.position-deltathen(* Text has been removed and the removed block contains the
cursor, move it at the beginning of the removed block. *)changes.positionelse(* Text has been removed before the cursor, move back the
cursor. *)position+deltaendelsepositioninlettext_modifications=E.map(funx->Text_modificationx)changesinletposition=S.foldupdate_positionposition(E.select[user_moves;text_modifications])inletcompute_coordinates_and_displayposition=letlines=get_lines()inletindex=Zed_lines.line_indexlinespositioninletbol=Zed_lines.line_startlinesindexinletcolumn=position-bolinletwidth=Zed_lines.force_widthlinesbolcolumnin(index,column,bol,width)inletcoordinates_and_display=S.mapcompute_coordinates_and_displaypositioninletcoordinates=S.map(fun(row,column,_,_)->(row,column))coordinates_and_displayinletcoordinates_display=S.map(fun(row,_,_,width)->(row,width))coordinates_and_displayinletline=S.mapfstcoordinatesinletcolumn=S.mapsndcoordinatesinletcolumn_display=S.mapsndcoordinates_displayinletwanted_column,set_wanted_column=S.createwanted_columnin{position;send;length;changes;get_lines;coordinates;coordinates_display;line;column;column_display;wanted_column;set_wanted_column;}letcopycursor=create!(cursor.length)cursor.changescursor.get_lines(S.valuecursor.position)(S.valuecursor.wanted_column)letpositioncursor=cursor.positionletget_positioncursor=S.valuecursor.positionletlinecursor=cursor.lineletget_linecursor=S.valuecursor.lineletcolumncursor=cursor.columnletcolumn_displaycursor=cursor.column_displayletget_columncursor=S.valuecursor.columnletget_column_displaycursor=S.valuecursor.column_displayletcoordinatescursor=cursor.coordinatesletcoordinates_displaycursor=cursor.coordinatesletget_coordinatescursor=S.valuecursor.coordinatesletget_coordinates_displaycursor=S.valuecursor.coordinates_displayletwanted_columncursor=cursor.wanted_columnletget_wanted_columncursor=S.valuecursor.wanted_columnletset_wanted_columncursorcolumn=cursor.set_wanted_columncolumnletmovecursor?(set_wanted_column=true)delta=letnew_position=S.valuecursor.position+deltainifnew_position<0||new_position>!(cursor.length)thenraiseOut_of_boundselsebegincursor.send(User_movenew_position);ifset_wanted_columnthencursor.set_wanted_column(S.valuecursor.column_display)endletgotocursor?(set_wanted_column=true)position=ifposition<0||position>!(cursor.length)thenraiseOut_of_boundselsebegincursor.send(User_moveposition);ifset_wanted_columnthencursor.set_wanted_column(S.valuecursor.column_display)end