6 runewidth "github.com/mattn/go-runewidth"
7 "github.com/zyedidia/micro/cmd/micro/buffer"
8 "github.com/zyedidia/micro/cmd/micro/config"
9 "github.com/zyedidia/micro/cmd/micro/info"
10 "github.com/zyedidia/micro/cmd/micro/screen"
11 "github.com/zyedidia/micro/cmd/micro/util"
12 "github.com/zyedidia/tcell"
15 type InfoWindow struct {
26 func NewInfoWindow(b *info.Bar) *InfoWindow {
31 iw.defStyle = config.DefStyle
33 if _, ok := config.Colorscheme["message"]; ok {
34 iw.defStyle = config.Colorscheme["message"]
37 iw.errStyle = config.DefStyle.
38 Foreground(tcell.ColorBlack).
39 Background(tcell.ColorMaroon)
41 if _, ok := config.Colorscheme["error-message"]; ok {
42 iw.errStyle = config.Colorscheme["error-message"]
45 iw.width, iw.y = screen.Screen.Size()
51 func (i *InfoWindow) Relocate() bool { return false }
52 func (i *InfoWindow) GetView() *View { return i.View }
53 func (i *InfoWindow) SetView(v *View) {}
55 func (i *InfoWindow) Clear() {
56 for x := 0; x < i.width; x++ {
57 screen.Screen.SetContent(x, i.y, ' ', nil, config.DefStyle)
61 func (i *InfoWindow) displayBuffer() {
63 line := b.LineBytes(0)
64 activeC := b.GetActiveCursor()
67 vlocX := utf8.RuneCountInString(i.Msg)
70 line, nColsBeforeStart := util.SliceVisualEnd(line, blocX, tabsize)
72 draw := func(r rune, style tcell.Style) {
73 if nColsBeforeStart <= 0 {
74 bloc := buffer.Loc{X: blocX, Y: 0}
75 if activeC.HasSelection() &&
76 (bloc.GreaterEqual(activeC.CurSelection[0]) && bloc.LessThan(activeC.CurSelection[1]) ||
77 bloc.LessThan(activeC.CurSelection[0]) && bloc.GreaterEqual(activeC.CurSelection[1])) {
78 // The current character is selected
79 style = config.DefStyle.Reverse(true)
81 if s, ok := config.Colorscheme["selection"]; ok {
87 screen.Screen.SetContent(vlocX, i.y, r, nil, style)
93 totalwidth := blocX - nColsBeforeStart
95 if activeC.X == blocX {
96 screen.Screen.ShowCursor(vlocX, i.y)
99 r, size := utf8.DecodeRune(line)
108 ts := tabsize - (totalwidth % tabsize)
111 width = runewidth.RuneWidth(r)
118 // Draw any extra characters either spaces for tabs or @ for incomplete wide runes
120 for j := 1; j < width; j++ {
121 draw(char, i.defStyle)
125 if vlocX >= i.width {
129 if activeC.X == blocX {
130 screen.Screen.ShowCursor(vlocX, i.y)
134 func (i *InfoWindow) Display() {
136 if i.HasPrompt || config.GlobalSettings["infobar"].(bool) {
137 if !i.HasPrompt && !i.HasMessage && !i.HasError {
147 for _, c := range display {
148 screen.Screen.SetContent(x, i.y, c, nil, style)
149 x += runewidth.RuneWidth(c)