dotar/vim/autoload/railmoon/widget/window.vim
2011-11-17 16:00:49 -06:00

168 lines
4.5 KiB
VimL
Executable File

" Author: Mykola Golubyev ( Nickolay Golubev )
" Email: golubev.nikolay@gmail.com
" Home: www.railmoon.com
" Module: railmoon#widget#window
" Purpose: util functions for work with widget windows id
"
" -
" [ public library function ]
" Name: railmoon#widget#window#find_on_tab
" Purpose: determine window number on given tab with pointed id
" [ parameters ]
" tabpage_number number of tabpage
" variable_name name of window id variable
" id window id to search
" -
function! railmoon#widget#window#find_on_tab(tabpage_number, variable_name, id)
let windows_count = tabpagewinnr(a:tabpage_number, '$')
let window_number = 1
while window_number <= windows_count
let window_id = gettabwinvar(a:tabpage_number, window_number, a:variable_name)
if a:id == window_id
return window_number
endif
let window_number += 1
endwhile
return 0
endfunction
" -
" [ public library function ]
" Name: railmoon#widget#window#find
" Purpose: determine tabpage number and window number as list of two elements with pointed id
" [ parameters ]
" id widget id to search
" -
function! railmoon#widget#window#find(id)
let tabpage_count = tabpagenr('$')
let tabpage_number = 1
while tabpage_number <= tabpage_count
let window_number = railmoon#widget#window#find_on_tab(tabpage_number, 'widget_id', a:id)
if window_number
return [ tabpage_number, window_number ]
endif
let tabpage_number += 1
endwhile
throw 'window with "widget_id" = '.a:id.' not found'
return [0, 0]
endfunction
" -
" [ public library function ]
" Name: railmoon#widget#window#visible
" Purpose: determine visible or not widget window with pointed id
" [ parameters ]
" id widget id to select
" -
function! railmoon#widget#window#visible(id)
if exists('w:widget_id') && w:widget_id == a:id
return 1
endif
let window_number = railmoon#widget#window#find_on_tab(tabpagenr(), 'widget_id', a:id)
return window_number > 0
endfunction
" -
" [ public library function ]
" Name: railmoon#widget#window#select
" Purpose: make window with given widget id active
" [ parameters ]
" id widget id to select
" -
function! railmoon#widget#window#select(id)
call railmoon#trace#push('window#select')
call railmoon#trace#debug('id = '.a:id)
try
if exists('w:widget_id') && w:widget_id == a:id
return 1
endif
let tabpage_and_window_number = railmoon#widget#window#find(a:id)
if tabpage_and_window_number[0] == 0
return 0
endif
call s:select_window(tabpage_and_window_number[0], tabpage_and_window_number[1])
return 1
finally
call railmoon#trace#debug('...')
call railmoon#trace#pop()
endtry
endfunction
" -
" [ public library function ]
" Name: railmoon#widget#window#save_selected
" Purpose: save current tabpage number, window mark id, position, mode
" -
function! railmoon#widget#window#save_selected()
call railmoon#trace#push('window#save_selected')
try
if ! exists('w:railmoon_window_mark_id')
let w:railmoon_window_mark_id = railmoon#id#acquire('railmoon_window_mark_id')
endif
return [tabpagenr(), w:railmoon_window_mark_id, getpos('.'), mode()]
finally
call railmoon#trace#debug('...')
call railmoon#trace#pop()
endtry
endfunction
" -
" [ public library function ]
" Name: railmoon#widget#window#load_selected
" Purpose: select tabpage number, window number, position, mode
" [ parameters ]
" selection list with four elements: tabpage number, window mark id,
" position, mode
" -
function! railmoon#widget#window#load_selected(selection)
call railmoon#trace#push('window#load_selected')
try
exec a:selection[0].'tabnext'
let window_number =
\ railmoon#widget#window#find_on_tab(a:selection[0],
\ 'railmoon_window_mark_id',
\ a:selection[1])
exec window_number.'wincmd w'
if a:selection[3] == 'n'
stopinsert
elseif a:selection[3] == 'i'
startinsert
endif
call setpos('.', a:selection[2])
finally
call railmoon#trace#debug('...')
call railmoon#trace#pop()
endtry
endfunction
" -
" [ internal usage ]
" Purpose: open tabpage number and select window number
" -
function! s:select_window(tabpage_number, window_number)
exec a:tabpage_number . 'tabnext'
exec a:window_number.'wincmd w'
endfunction