let s:buf_nr = -1

"OpenWindow opens a new scratch window and put's the content into the window
function! go#ui#OpenWindow(title, content)
    " reuse existing buffer window if it exists otherwise create a new one
    if !bufexists(s:buf_nr)
        execute 'botright new'
        file `="[" . a:title . "]"`
        let s:buf_nr = bufnr('%')
    elseif bufwinnr(s:buf_nr) == -1
        execute 'botright new'
        execute s:buf_nr . 'buffer'
    elseif bufwinnr(s:buf_nr) != bufwinnr('%')
        execute bufwinnr(s:buf_nr) . 'wincmd w'
    endif


    " Keep minimum height to 10, if there is more just increase it that it
    " occupies all results
    let buffer_height = 10
    if len(a:content) < buffer_height
        exe 'resize ' . buffer_height
    else
        exe 'resize ' . len(a:content)
    endif
	
		" some sane default values for a readonly buffer
    setlocal filetype=vimgo
    setlocal bufhidden=delete
    setlocal buftype=nofile
    setlocal noswapfile
    setlocal nobuflisted
    setlocal winfixheight
    setlocal cursorline " make it easy to distinguish

    " we need this to purge the buffer content
    setlocal modifiable

    "delete everything first from the buffer
    %delete _  

    " add the content
    call append(0, a:content)

    " delete last line that comes from the append call
    $delete _  

    " set it back to non modifiable
    setlocal nomodifiable
endfunction


" CloseWindow closes the current window
function! go#ui#CloseWindow()
    close
    echo ""
endfunction

" OpenDefinition parses the current line and jumps to it by openening a new
" tab
function! go#ui#OpenDefinition(filter)
    let curline = getline('.')

    " don't touch our first line or any blank line
    if curline =~ a:filter || curline =~ "^$"
        " supress information about calling this function
        echo "" 
        return
    endif

    " format: 'interface file:lnum:coln'
    let mx = '^\(^\S*\)\s*\(.\{-}\):\(\d\+\):\(\d\+\)'

    " parse it now into the list
    let tokens = matchlist(curline, mx)

    " convert to: 'file:lnum:coln'
    let expr = tokens[2] . ":" . tokens[3] . ":" .  tokens[4]

    " jump to it in a new tab, we use explicit lgetexpr so we can later change
    " the behaviour via settings (like opening in vsplit instead of tab)
    lgetexpr expr
    tab split
    ll 1

    " center the word 
    norm! zz 
endfunction

