Coccinelle release-1.0.0-rc11
[bpt/coccinelle.git] / python / coccilib / coccigui / vimeditor.py
CommitLineData
34e49164
C
1# -*- coding: utf-8 -*-
2
3# vim:set shiftwidth=4 tabstop=4 expandtab textwidth=79:
4#Copyright (c) 2005-2006 The PIDA Project
5
6#Permission is hereby granted, free of charge, to any person obtaining a copy
7#of this software and associated documentation files (the "Software"), to deal
8#in the Software without restriction, including without limitation the rights
9#to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10#copies of the Software, and to permit persons to whom the Software is
11#furnished to do so, subject to the following conditions:
12
13#The above copyright notice and this permission notice shall be included in
14#all copies or substantial portions of the Software.
15
16#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17#IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18#FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19#AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20#LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21#OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22#SOFTWARE.
23
24import os
25import gobject
26
27import pida.core.service as service
28from pida.core import errors
29
30defs = service.definitions
31types = service.types
32
33import vimcom
34
35class vim_editor(object):
36
37 single_view = None
38
39 class display(defs.optiongroup):
40 class colour_scheme(defs.option):
41 """The colour scheme to use in vim (Empty will be ignored)."""
42 rtype = types.string
43 default = ''
44 class hide_vim_menu(defs.option):
45 """Whether the vim menu will be hidden."""
46 rtype = types.boolean
47 default = False
48
49 def init(self):
50 self.__servers = {}
51 self.__documents = {}
52 self.__old_shortcuts = {'n':{}, 'v':{}}
53 self.__currentdocument = None
54 self._create_initscript()
55 self.__cw = vimcom.communication_window(self)
56 self.__newdocs = {}
57
58 def _create_initscript(self):
59 script_path = os.path.join(self.boss.get_pida_home(), 'pida_vim_init.vim')
60 if not os.path.exists(script_path):
61 f = open(script_path, 'w')
62 f.write(vimcom.VIMSCRIPT)
63 f.close()
64
65 def vim_init_server(self):
66 self.__cw.load_script(self.server,
67 os.path.join(self.boss.get_pida_home(), 'pida_vim_init.vim'))
68
69 def stop_fetching_serverlist(self):
70 self.__cw.keep_fetching_serverlist = False
71
72 def get_server(self):
73 raise NotImplementedError
74
75 def vim_start(self):
76 raise NotImplementedError
77
78 def vim_new_serverlist(self, serverlist):
79 raise NotImplementedError
80
81 def cmd_start(self):
82 self.vim_start()
83
84 def cmd_revert(self):
85 self.__cw.revert(self.server)
86
87 def cmd_close(self, document):
88 if document.unique_id in self.__newdocs:
89 fn = self.__newdocs[document.unique_id]
90 else:
91 fn = document.filename
92 self.__cw.close_buffer(self.server, fn)
93
94 def cmd_edit(self, document):
95 """Open and edit."""
96 if document is not self.__currentdocument:
97 if (document.unique_id in
98 self.__servers.setdefault(self.server, [])):
99 if document.unique_id in self.__newdocs:
100 fn = self.__newdocs[document.unique_id]
101 else:
102 fn = document.filename
103 self.__cw.change_buffer(self.server, fn)
104 self.__cw.foreground(self.server)
105 else:
106 found = False
107 for server in self.__servers:
108 serverdocs = self.__servers[server]
109 if document.unique_id in serverdocs:
110 self.__cw.change_buffer(server, document.filename)
111 self.__cw.foreground(server)
112 found = True
113 break
114 if not found:
115 if document.filename is None:
116 newname = self.__cw.new_file(self.server)
117 self.__newdocs[document.unique_id] = newname
118 else:
119 self.__cw.open_file(self.server, document.filename)
120 self.__servers[self.server].append(document.unique_id)
121 self.__documents[document.unique_id] = document
122 self.__currentdocument = document
123 if self.single_view is not None:
124 self.single_view.raise_page()
125 if document.filename is None:
126 title = 'New File'
127 else:
128 title = document.filename
129 self.single_view.long_title = title
130
131 def cmd_undo(self):
132 self.__cw.undo(self.server)
133
134 def cmd_redo(self):
135 self.__cw.redo(self.server)
136
137 def cmd_cut(self):
138 self.__cw.cut(self.server)
139
140 def cmd_copy(self):
141 self.__cw.copy(self.server)
142
143 def cmd_paste(self):
144 self.__cw.paste(self.server)
145
146 def cmd_save(self):
147 self.__cw.save(self.server)
148
149 def cmd_save_as(self, filename):
150 del self.__newdocs[self.__currentdocument.unique_id]
151 self.__cw.save_as(self.server, filename)
152
153 def cmd_goto_line(self, linenumber):
154 self.__cw.goto_line(self.server, linenumber + 1)
155
156 def cmd_show_mark(self, index, filename, line):
157 self.__cw.show_sign(self.server, index, filename, line)
158
159 def cmd_hide_mark(self, index):
160 pass
161
162 def reset(self):
163 colorscheme = self.opts.display__colour_scheme
164 if colorscheme:
165 self.__cw.set_colorscheme(self.server, colorscheme)
166 if self.opts.display__hide_vim_menu:
167 self.__cw.set_menu_visible(self.server, False)
168 #self.__load_shortcuts()
169
170 def open_file_line(self, filename, linenumber):
171 if self.__currentfile != filename:
172 self.open_file(filename)
173 self.__bufferevents.append([self.goto_line, (linenumber, )])
174 else:
175 self.goto_line(linenumber)
176
177 def goto_line(self, linenumber):
178 self.__cw.change_cursor(self.server, 1, linenumber)
179
180 def vim_bufferchange(self, server, cwd, filename, bufnr):
181 self.log.debug('vim buffer change "%s"', filename)
182 if not filename or filename in '-MiniBufExplorer-':
183 return
184 if os.path.abspath(filename) != filename:
185 filename = os.path.join(cwd, filename)
186 if os.path.isdir(filename):
187 if self.opts.behaviour__open_directories_in_pida:
188 self.boss.call_command('filemanager', 'browse',
189 directory=filename)
190 self.__cw.close_buffer(self.server, filename)
191 return
192 if self.__currentdocument is None or filename != self.__currentdocument.filename:
193 for uid, fn in self.__newdocs.iteritems():
194 if fn == filename:
195 doc = self.__documents[uid]
196 self.__current_doc_set(doc)
197 return
198 for doc in self.__documents.values():
199 if doc.filename == filename:
200 self.__current_doc_set(doc)
201 return
202 self.boss.call_command('buffermanager', 'open_file',
203 filename=filename)
204
205 def __current_doc_set(self, doc):
206 self.__currentdocument = doc
207 self.boss.call_command('buffermanager', 'open_document',
208 document=doc)
209
210 def vim_bufferunload(self, server, filename, *args):
211 self.log.debug('vim unloaded "%s"', filename)
212 if filename != '':
213 doc = None
214 for uid, fn in self.__newdocs.iteritems():
215 if fn == filename:
216 doc = self.__documents[uid]
217 break
218 if doc is None:
219 for uid, document in self.__documents.iteritems():
220 if document.filename == filename:
221 doc = document
222 break
223 if doc is not None:
224 self.__servers[server].remove(doc.unique_id)
225 del self.__documents[uid]
226 self.__currentdocument = None
227 self.boss.call_command('buffermanager', 'document_closed',
228 document=doc, dorefresh=True)
229
230 def vim_started(self, server):
231 print 'started'
232
233 def vim_filesave(self, server, *args):
234 self.boss.call_command('buffermanager', 'reset_current_document')
235
236 def vim_globalkp(self, server, name):
237 self.boss.command('keyboardshortcuts', 'keypress-by-name',
238 kpname=name)
239
240 def vim_shutdown(self, server, *args):
241 #self.clean_after_shutdown(server)
242 self.after_shutdown(server)
243
244 def vim_set_breakpoint(self, server, line):
245 self.boss.call_command('pythondebugger', 'set_breakpoint',
246 filename=self.__currentdocument.filename, line=int(line))
247
248 def clean_after_shutdown(self, server):
249 for docid in self.__servers.setdefault(server, []):
250 doc = self.__documents[docid]
251 del self.__documents[docid]
252 self.boss.call_command('buffermanager', 'document_closed',
253 document=doc)
254 self.__servers[server] = []
255 self.__currentdocument = None
256
257 def after_shutdown(self, server):
258 pass
259
260 def get_vim_window(self):
261 return self.__cw
262 vim_window= property(get_vim_window)
263
264 def get_current_document(self):
265 return self.__currentdocument
266 current_document = property(get_current_document)
267
268 def stop(self):
269 self.__cw.quit(self.server)