-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathcollection_query.py
69 lines (49 loc) · 2.24 KB
/
collection_query.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
import abc
from copy import deepcopy
from PythonVoiceCodingPlugin.library import get_source_region
from PythonVoiceCodingPlugin.library.selection_node import nearest_node_from_offset,node_from_range
from PythonVoiceCodingPlugin.library.modification import ModificationHandler
from PythonVoiceCodingPlugin.queries.abstract.query import Query
class CollectionQuery(Query):
"""docstring for CollectionQuery"""
multiple_in = False
indexable = False
select_insertion = True
label = "Collection"
@abc.abstractmethod
def handle_single(self,view_information,query_description,extra = {}):
pass
@abc.abstractmethod
def handle_multiple(self,view_information,query_description,extra = {}):
pass
################################################################
################################################################
def __init__(self, code,latest_build = None):
super(CollectionQuery, self).__init__(code,latest_build)
self.result = None
self.writing_positions = []
self.items = []
self.optional_selection = []
def __call__(self,view_information,query_description,extra = {}):
selection = self._get_selection(view_information,extra)
self.writing_positions = selection if isinstance(selection,list) else [selection]
self.writing_positions = sorted(self.writing_positions)
if self.indexable:
self.result,self.items = self.handle_single(view_information,query_description,extra)
if self.result and self.select_insertion:
m = ModificationHandler()
for location in self.writing_positions:
m.modify_from(0, location, self.result)
self.optional_selection = [m.forward(x) for x in self.writing_positions]
else:
self.items = self.handle_single(view_information,query_description,extra)
return self.result,self.items,self.writing_positions ,self.optional_selection
def _preliminary(self,view_information,query_description, extra = {}):
selection = self._get_selection(view_information,extra)
build = self.general_build
if not build or not build[0] :
return None,None,None
root,atok,m,r = build
selection = m.forward(selection)
origin = nearest_node_from_offset(root,atok, selection[0]) if selection[0]==selection[1] else node_from_range(root,atok, selection)
return build, selection, origin