143 lines
3.4 KiB
Standard ML
143 lines
3.4 KiB
Standard ML
structure NormalModeTextBuilder =
|
|
struct
|
|
structure Utils = TextBuilderUtils
|
|
|
|
(* Prerequisite to all functions in this structure:
|
|
* - Move buffer to startLine before calling any function. *)
|
|
|
|
fun startBuild
|
|
( startLine
|
|
, cursorPos
|
|
, buffer: LineGap.t
|
|
, windowWidth
|
|
, windowHeight
|
|
, floatWindowWidth
|
|
, floatWindowHeight
|
|
, searchList
|
|
, visualScrollColumn
|
|
, acc
|
|
) =
|
|
let
|
|
val
|
|
{ rightStrings
|
|
, rightLines
|
|
, line = curLine
|
|
, idx = curIdx
|
|
, textLength
|
|
, ...
|
|
} = buffer
|
|
|
|
val env = Utils.initEnv
|
|
( 0
|
|
, 0
|
|
, windowWidth
|
|
, windowHeight
|
|
, floatWindowWidth
|
|
, floatWindowHeight
|
|
, searchList
|
|
, visualScrollColumn
|
|
, startLine
|
|
)
|
|
val {startX, startY, ...} = env
|
|
in
|
|
if textLength = 1 then
|
|
(* empty string, so there is nothing we can draw
|
|
* except a cursor at the line start.
|
|
* An empty string is usually thought of to have a length of 0
|
|
* and this is true, but we always have a \n at the end of the buffer
|
|
* to respect Unix-style file endings, which we always uphold.
|
|
* So, for us, an empty string has a length of 1. *)
|
|
[Utils.makeCursor (startX, startY, env)]
|
|
else
|
|
case (rightStrings, rightLines) of
|
|
(shd :: stl, lhd :: ltl) =>
|
|
let
|
|
(* get relative index of line to start building from *)
|
|
val strPos =
|
|
Utils.getRelativeLineStartFromRightHead
|
|
(startLine, curLine, lhd)
|
|
(* get absolute idx of line *)
|
|
val absIdx = curIdx + strPos
|
|
in
|
|
if PersistentVector.isEmpty searchList then
|
|
TextBuilderWithCursor.build
|
|
( strPos
|
|
, shd
|
|
, stl
|
|
, lhd
|
|
, ltl
|
|
, startX
|
|
, startY
|
|
, 0
|
|
, startLine
|
|
, absIdx
|
|
, cursorPos
|
|
, env
|
|
, acc
|
|
)
|
|
else
|
|
TextBuilderWithHighlight.build
|
|
( strPos
|
|
, shd
|
|
, stl
|
|
, lhd
|
|
, ltl
|
|
, startX
|
|
, startY
|
|
, 0
|
|
, startLine
|
|
, absIdx
|
|
, cursorPos
|
|
, env
|
|
, acc
|
|
)
|
|
end
|
|
| (_, _) => acc
|
|
end
|
|
|
|
fun buildWithExisting
|
|
( startLine
|
|
, cursorPos
|
|
, buffer: LineGap.t
|
|
, windowWidth
|
|
, windowHeight
|
|
, searchList
|
|
, visualScrollColumn
|
|
, acc
|
|
) =
|
|
startBuild
|
|
( startLine
|
|
, cursorPos
|
|
, buffer
|
|
, windowWidth
|
|
, windowHeight
|
|
, Real32.fromInt windowWidth
|
|
, Real32.fromInt windowHeight
|
|
, searchList
|
|
, visualScrollColumn
|
|
, []
|
|
)
|
|
|
|
fun build
|
|
( startLine
|
|
, cursorPos
|
|
, buffer: LineGap.t
|
|
, windowWidth
|
|
, windowHeight
|
|
, searchList
|
|
, visualScrollColumn
|
|
) =
|
|
startBuild
|
|
( startLine
|
|
, cursorPos
|
|
, buffer
|
|
, windowWidth
|
|
, windowHeight
|
|
, Real32.fromInt windowWidth
|
|
, Real32.fromInt windowHeight
|
|
, searchList
|
|
, visualScrollColumn
|
|
, []
|
|
)
|
|
end
|