168 lines
4.5 KiB
VimL
Executable File
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
|
|
|