" Author: Eric Van Dewoestine
"
" License: {{{
"
" Copyright (C) 2005 - 2014 Eric Van Dewoestine
"
" This program is free software: you can redistribute it and/or modify
" it under the terms of the GNU General Public License as published by
" the Free Software Foundation, either version 3 of the License, or
" (at your option) any later version.
"
" This program is distributed in the hope that it will be useful,
" but WITHOUT ANY WARRANTY; without even the implied warranty of
" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
" GNU General Public License for more details.
"
" You should have received a copy of the GNU General Public License
" along with this program. If not, see .
"
" }}}
" Script Variables {{{
let s:command_comment =
\ '-command javadoc_comment -p "" -f "" -o -e '
let s:command_element_doc =
\ '-command java_element_doc -p "" -f "" -o -l -e '
let s:command_doc_link = '-command java_element_doc -u ""'
let s:command_source_dirs = '-command java_src_dirs -p ""'
" }}}
function! eclim#java#doc#Comment() " {{{
" Add / update the comments for the element under the cursor.
if !eclim#project#util#IsCurrentFileInProject()
return
endif
call eclim#lang#SilentUpdate()
let project = eclim#project#util#GetCurrentProjectName()
let file = eclim#project#util#GetProjectRelativeFilePath()
let offset = eclim#util#GetCurrentElementOffset()
let command = s:command_comment
let command = substitute(command, '', project, '')
let command = substitute(command, '', file, '')
let command = substitute(command, '', offset, '')
let command = substitute(command, '', eclim#util#GetEncoding(), '')
let result = eclim#Execute(command)
if result != "0"
call eclim#util#Reload({'retab': 1})
write
endif
endfunction " }}}
function! eclim#java#doc#Preview() " {{{
if !eclim#project#util#IsCurrentFileInProject()
return
endif
if !eclim#java#util#IsValidIdentifier(expand(''))
call eclim#util#EchoError
\ ("Element under the cursor is not a valid java identifier.")
return 0
endif
exec 'pedit +:call\ eclim#java#doc#PreviewOpen(' . bufnr('%') . ') [javadoc]'
endfunction " }}}
function! eclim#java#doc#PreviewOpen(bufnr_or_url) " {{{
if a:bufnr_or_url =~ '^\d\+$'
let curwin = winnr()
exec bufwinnr(a:bufnr_or_url) . 'winc w'
let project = eclim#project#util#GetCurrentProjectName()
let file = eclim#lang#SilentUpdate(1, 1)
let position = eclim#util#GetCurrentElementPosition()
let offset = substitute(position, '\(.*\);\(.*\)', '\1', '')
let length = substitute(position, '\(.*\);\(.*\)', '\2', '')
exec curwin . 'winc w'
let command = s:command_element_doc
let command = substitute(command, '', project, '')
let command = substitute(command, '', file, '')
let command = substitute(command, '', offset, '')
let command = substitute(command, '', length, '')
let command = substitute(command, '', eclim#util#GetEncoding(), '')
else
let command = s:command_doc_link
let command = substitute(command, '', a:bufnr_or_url, '')
endif
let result = eclim#Execute(command)
if type(result) == g:DICT_TYPE
if !exists('b:eclim_javadoc_stack')
let b:eclim_javadoc_stack = []
let b:eclim_javadoc_index = -1
elseif b:eclim_javadoc_index >= 0
let b:eclim_javadoc_stack = b:eclim_javadoc_stack[:b:eclim_javadoc_index]
endif
call add(b:eclim_javadoc_stack, result)
let b:eclim_javadoc_index += 1
let b:eclim_javadoc = result
setlocal modifiable
call append(0, split(result.text, '\n'))
retab
if getline('$') =~ '^\s*$'
$,$delete _
endif
call cursor(1, 1)
elseif type(result) == g:STRING_TYPE
if result == ''
call eclim#util#EchoWarning('No javadoc found.')
else
call eclim#util#EchoError(result)
endif
return
endif
setlocal wrap
setlocal nomodifiable
setlocal nolist
setlocal noswapfile
setlocal nobuflisted
setlocal buftype=nofile
setlocal bufhidden=wipe
setlocal conceallevel=2 concealcursor=ncv
set ft=javadoc_preview
hi link javadocPreviewLink Label
syntax match javadocPreviewLinkStart contained /|/ conceal
syntax match javadocPreviewLinkEnd contained /\[\d\+\]|/ conceal
syntax region javadocPreviewLink start="|" end="" concealends
syntax match javadocPreviewLink /|.\{-}\[\d\+\]|/
\ contains=JavadocPreviewLinkStart,JavadocPreviewLinkEnd
nnoremap :call eclim#java#doc#PreviewLink()
nnoremap :call eclim#java#doc#PreviewLink()
nnoremap :call eclim#java#doc#PreviewHistory(-1)
nnoremap :call eclim#java#doc#PreviewHistory(1)
endfunction " }}}
function! eclim#java#doc#PreviewLink() " {{{
let line = getline('.')
let cnum = col('.')
if line[cnum - 1] == '|'
let cnum += cnum > 1 && line[cnum - 2] == ']' ? -1 : 1
endif
let text = substitute(line, '.*|\(.\{-}\%' . cnum . 'c.\{-}\)|.*', '\1', '')
if text == line || text !~ '\[\d\+]$'
return
endif
exec 'let index = ' . substitute(text, '.*\[\(\d\+\)\]$', '\1', '')
if !exists('b:eclim_javadoc') || len(b:eclim_javadoc.links) <= index
return
endif
let url = b:eclim_javadoc.links[index].href
if url =~ '^eclipse-javadoc:'
exec 'pedit +:call\ eclim#java#doc#PreviewOpen("' . url . '") [javadoc]'
else
call eclim#web#OpenUrl(url)
endif
endfunction " }}}
function! eclim#java#doc#PreviewHistory(offset) " {{{
if !exists('b:eclim_javadoc_stack')
return
endif
let index = b:eclim_javadoc_index + a:offset
if index < 0 || index > len(b:eclim_javadoc_stack) -1
return
endif
let result = b:eclim_javadoc_stack[index]
let b:eclim_javadoc = result
let b:eclim_javadoc_index = index
setlocal modifiable
1,$delete _
call append(0, split(result.text, '\n'))
retab
if getline('$') =~ '^\s*$'
$,$delete _
endif
setlocal nomodifiable
call cursor(1, 1)
endfunction " }}}
function! eclim#java#doc#Javadoc(bang, ...) " {{{
" Run javadoc for all, or the supplied, source files.
" Optional args:
" file, file, file, ...: one ore more source files.
if !eclim#project#util#IsCurrentFileInProject()
return
endif
let project_path = eclim#project#util#GetCurrentProjectRoot()
let project = eclim#project#util#GetCurrentProjectName()
let args = '-p "' . project . '"'
if len(a:000) > 0 && (len(a:000) > 1 || a:000[0] != '')
let args .= ' -f "' . join(a:000, ' ') . '"'
endif
let cwd = getcwd()
try
exec 'lcd ' . escape(project_path, ' ')
call eclim#util#MakeWithCompiler('eclim_javadoc', a:bang, args)
finally
exec 'lcd ' . escape(cwd, ' ')
endtry
endfunction " }}}
function! eclim#java#doc#CommandCompleteJavadoc(argLead, cmdLine, cursorPos) " {{{
let dir = eclim#project#util#GetCurrentProjectRoot()
let cmdLine = strpart(a:cmdLine, 0, a:cursorPos)
let args = eclim#util#ParseCmdLine(cmdLine)
let argLead = cmdLine =~ '\s$' ? '' : args[len(args) - 1]
let project = eclim#project#util#GetCurrentProjectName()
let command = substitute(s:command_source_dirs, '', project, '')
let result = eclim#Execute(command)
let paths = []
if result != '' && result != '0'
let paths = map(split(result, "\n"),
\ "eclim#project#util#GetProjectRelativeFilePath(v:val)")
endif
let results = []
if argLead !~ '^\s*$'
let follow = 0
for path in paths
if argLead =~ '^' . path
let follow = 1
break
elseif path =~ '^' . argLead
call add(results, path)
endif
endfor
if follow
let results = split(eclim#util#Glob(dir . '/' . argLead . '*', 1), '\n')
call filter(results, "isdirectory(v:val) || v:val =~ '\\.java$'")
call map(results, "substitute(v:val, '\\', '/', 'g')")
call map(results, 'isdirectory(v:val) ? v:val . "/" : v:val')
call map(results, 'substitute(v:val, dir, "", "")')
call map(results, 'substitute(v:val, "^\\(/\\|\\\\\\)", "", "g")')
call map(results, "substitute(v:val, ' ', '\\\\ ', 'g')")
endif
else
let results = paths
endif
return eclim#util#ParseCommandCompletionResults(argLead, results)
endfunction " }}}
" vim:ft=vim:fdm=marker