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.InfoBuf) *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) Resize(w, h int) {
55 // func (i *InfoWindow) YesNoPrompt() (bool, bool) {
59 // screen.Screen.ShowCursor(utf8.RuneCountInString(i.Msg), i.y)
63 // switch e := event.(type) {
64 // case *tcell.EventKey:
66 // case tcell.KeyRune:
67 // if e.Rune() == 'y' || e.Rune() == 'Y' {
68 // i.HasPrompt = false
70 // } else if e.Rune() == 'n' || e.Rune() == 'N' {
71 // i.HasPrompt = false
72 // return false, false
74 // case tcell.KeyCtrlC, tcell.KeyCtrlQ, tcell.KeyEscape:
77 // i.HasPrompt = false
84 func (i *InfoWindow) Relocate() bool { return false }
85 func (i *InfoWindow) GetView() *View { return i.View }
86 func (i *InfoWindow) SetView(v *View) {}
87 func (i *InfoWindow) SetActive(b bool) {}
89 func (i *InfoWindow) GetMouseLoc(vloc buffer.Loc) buffer.Loc {
90 c := i.Buffer.GetActiveCursor()
91 l := i.Buffer.LineBytes(0)
92 n := utf8.RuneCountInString(i.Msg)
93 return buffer.Loc{c.GetCharPosInLine(l, vloc.X-n), 0}
96 func (i *InfoWindow) Clear() {
97 for x := 0; x < i.width; x++ {
98 screen.Screen.SetContent(x, i.y, ' ', nil, config.DefStyle)
102 func (i *InfoWindow) displayBuffer() {
104 line := b.LineBytes(0)
105 activeC := b.GetActiveCursor()
108 vlocX := utf8.RuneCountInString(i.Msg)
111 line, nColsBeforeStart, bslice := util.SliceVisualEnd(line, blocX, tabsize)
114 draw := func(r rune, style tcell.Style) {
115 if nColsBeforeStart <= 0 {
116 bloc := buffer.Loc{X: blocX, Y: 0}
117 if activeC.HasSelection() &&
118 (bloc.GreaterEqual(activeC.CurSelection[0]) && bloc.LessThan(activeC.CurSelection[1]) ||
119 bloc.LessThan(activeC.CurSelection[0]) && bloc.GreaterEqual(activeC.CurSelection[1])) {
120 // The current character is selected
121 style = config.DefStyle.Reverse(true)
123 if s, ok := config.Colorscheme["selection"]; ok {
129 screen.Screen.SetContent(vlocX, i.y, r, nil, style)
135 totalwidth := blocX - nColsBeforeStart
137 if activeC.X == blocX {
138 screen.Screen.ShowCursor(vlocX, i.y)
141 r, size := utf8.DecodeRune(line)
150 ts := tabsize - (totalwidth % tabsize)
153 width = runewidth.RuneWidth(r)
160 // Draw any extra characters either spaces for tabs or @ for incomplete wide runes
162 for j := 1; j < width; j++ {
163 draw(char, i.defStyle)
167 if vlocX >= i.width {
171 if activeC.X == blocX {
172 screen.Screen.ShowCursor(vlocX, i.y)
176 func (i *InfoWindow) Display() {
178 if i.HasPrompt || config.GlobalSettings["infobar"].(bool) {
179 if !i.HasPrompt && !i.HasMessage && !i.HasError {
189 for _, c := range display {
190 screen.Screen.SetContent(x, i.y, c, nil, style)
191 x += runewidth.RuneWidth(c)