1from paida.paida_core.PAbsorber import *
2from paida.paida_core.IFillStyle import *
3from paida.paida_core.ILineStyle import *
4from paida.paida_core.ITextStyle import *
5
6try:
7	import threading
8except ImportError:
9	import dummy_threading as threading
10import time
11
12N = None
13NE = None
14E = None
15SE = None
16S = None
17SW = None
18W = None
19NW = None
20CENTER = None
21
22def createRoot():
23	global _guiRoot
24	_guiRoot = _Root()
25	_guiRoot.setDaemon(True)
26
27def startRoot():
28	global _guiRoot
29	_guiRoot.start()
30
31def getRoot():
32	global _guiRoot
33	return _guiRoot
34
35def getFontList(_defaultCandidates):
36	return [''], ''
37
38class _Root(threading.Thread):
39	def __init__(self):
40		threading.Thread.__init__(self)
41		self._setRootCondition(threading.Condition())
42
43	def run(self):
44		rootCondition = self._getRootCondition()
45		rootCondition.acquire()
46		self._setRoot(None)
47
48		self._trees = []
49		self._plotters = []
50		self._requestedTrees = []
51		self._requestedPlotters = []
52		self._setQuitLoop(False)
53
54		self._setLock(threading.RLock())
55		self._setTreeCondition(threading.Condition())
56		self._setPlotterCondition(threading.Condition())
57
58		rootCondition.notifyAll()
59		rootCondition.release()
60		self._mainloop()
61
62	def _mainloop(self):
63		lock = self._getLock()
64		while 1:
65			if self._getQuitLoop() == True:
66				rootCondition = self._getRootCondition()
67				rootCondition.acquire()
68				### Wait other threads.
69				lock.acquire()
70				lock.release()
71				rootCondition.notifyAll()
72				rootCondition.release()
73				break
74			else:
75				if lock.acquire(blocking = 0):
76					self._check()
77					lock.release()
78				time.sleep(0.1)
79
80	def _setLock(self, lock):
81		self._lock = lock
82
83	def _getLock(self):
84		return  self._lock
85
86	def _setRootCondition(self, Condition):
87		self._rootCondition = Condition
88
89	def _getRootCondition(self):
90		return self._rootCondition
91
92	def _setTreeCondition(self, Condition):
93		self._treeCondition = Condition
94
95	def _getTreeCondition(self):
96		return self._treeCondition
97
98	def _setPlotterCondition(self, Condition):
99		self._plotterCondition = Condition
100
101	def _getPlotterCondition(self):
102		return self._plotterCondition
103
104	def _setQuitLoop(self, boolean):
105		self._quitLoop = boolean
106
107	def _getQuitLoop(self):
108		return self._quitLoop
109
110	def _setRoot(self, root):
111		self._root = root
112
113	def _getRoot(self):
114		return self._root
115
116	def _appendTree(self, tree):
117		self._trees.append(tree)
118
119	def _getTrees(self):
120		return self._trees
121
122	def _removeTree(self, tree):
123		self._getTrees().remove(tree)
124
125	def _appendPlotter(self, plotter):
126		self._plotters.append(plotter)
127
128	def _getPlotters(self):
129		return self._plotters
130
131	def _removePlotter(self, plotter):
132		self._getPlotters().remove(plotter)
133
134	def _requestTree(self):
135		treeCondition = self._getTreeCondition()
136		treeCondition.acquire()
137		bridge = []
138		self._requestedTrees.append(bridge)
139		treeCondition.wait()
140		treeCondition.release()
141		return bridge[0][0]
142
143	def _requestPlotter(self, viewWidth, viewHeight, width, height):
144		plotterCondition = self._getPlotterCondition()
145		plotterCondition.acquire()
146		bridge = []
147		self._requestedPlotters.append((bridge, viewWidth, viewHeight, width, height))
148		plotterCondition.wait()
149		plotterCondition.release()
150		return bridge[0][0]
151
152	def _check(self):
153		self._updateTrees()
154		self._updatePlotters()
155
156	def _updateTrees(self):
157		if self._requestedTrees:
158			treeCondition = self._getTreeCondition()
159			treeCondition.acquire()
160			for bridge in self._requestedTrees:
161				_tree = _Tree(self._getLock())
162				bridge.append([_tree])
163				self._appendTree(_tree)
164			self._requestedTrees = []
165			treeCondition.notifyAll()
166			treeCondition.release()
167
168		for tree in self._getTrees():
169			tree.update()
170
171	def _updatePlotters(self):
172		if self._requestedPlotters:
173			plotterCondition = self._getPlotterCondition()
174			plotterCondition.acquire()
175			for (bridge, viewWidth, viewHeight, width, height) in self._requestedPlotters:
176				_plotter = _Plotter(self._getLock(), viewWidth, viewHeight, width, height)
177				bridge.append([_plotter])
178				self._appendPlotter(_plotter)
179			self._requestedPlotters = []
180			plotterCondition.notifyAll()
181			plotterCondition.release()
182
183		for plotter in self._getPlotters():
184			plotter.update()
185
186class _Base:
187	def __init__(self, lock):
188		self._canvasCommands = []
189		self.setLock(lock)
190
191		### Create widges.
192		self.setRoot(None)
193		self.setFrame(None)
194		self.setCanvas(None)
195
196		self._setFontCondition(threading.Condition())
197
198		self.setShow(True)
199		self.setTitle('')
200
201	def _setFontCondition(self, condition):
202		self._fontCondition = condition
203
204	def _getFontCondition(self):
205		return self._fontCondition
206
207	def getNCanvasCommands(self):
208		return len(self._canvasCommands)
209
210	def setRoot(self, root):
211		self._root = root
212
213	def getRoot(self):
214		return self._root
215
216	def setFrame(self, frame):
217		self._frame = frame
218
219	def getFrame(self):
220		return self._frame
221
222	def setCanvas(self, canvas):
223		self._canvas = canvas
224
225	def getCanvas(self):
226		return self._canvas
227
228	def setLock(self, lock):
229		self._lock = lock
230
231	def getLock(self):
232		return  self._lock
233
234	def xscroll(self, *args):
235		self.getLock().acquire()
236		self._canvasCommands.append([self.canvas_xscroll, args, {}])
237		self.getLock().release()
238
239	def yscroll(self, *args):
240		self.getLock().acquire()
241		self._canvasCommands.append([self.canvas_yscroll, args, {}])
242		self.getLock().release()
243
244	def xview(self, *args):
245		self.getLock().acquire()
246		self._canvasCommands.append([self.canvas_xview, args, {}])
247		self.getLock().release()
248
249	def yview(self, *args):
250		self.getLock().acquire()
251		self._canvasCommands.append([self.canvas_yview, args, {}])
252		self.getLock().release()
253
254	def canvas_xscroll(self, *args1):
255		pass
256
257	def canvas_yscroll(self, *args1):
258		pass
259
260	def canvas_xview(self, *args1):
261		pass
262
263	def canvas_yview(self, *args1):
264		pass
265
266	def canvas_title(self, title):
267		self._title = title
268
269	def canvas_show(self, boolean):
270		self._show = boolean
271
272	def setTitle(self, title):
273		self.getLock().acquire()
274		self._canvasCommands.append([self.canvas_title, [title], {}])
275		self.getLock().release()
276
277	def getTitle(self):
278		return self._title
279
280	def setShow(self, boolean):
281		self.getLock().acquire()
282		self._canvasCommands.append([self.canvas_show, [boolean], {}])
283		self.getLock().release()
284
285	def getShow(self):
286		return self._show
287
288	def _getFontTuple(self, textStyle):
289		fontFamily = textStyle.font()
290		fontSize = str(int(textStyle.fontSize()))
291		options = ''
292		if textStyle.isBold():
293			options += 'bold'
294		else:
295			options += 'normal'
296		if textStyle.isItalic():
297			options += ' italic'
298		else:
299			options += ' roman'
300		if textStyle.isUnderlined():
301			options += ' underline'
302		else:
303			pass
304		return (fontFamily, fontSize, options)
305
306	def _getFontMeasurements(self, textDataList, bridge):
307		result = []
308		for textStyle, text in textDataList:
309			result.append([1, 1])
310		bridge.append(result)
311
312	def update(self):
313		self.getLock().acquire()
314		for [method, args1, args2] in self._canvasCommands:
315			method(*args1, **args2)
316		else:
317			self._canvasCommands = []
318		self.getLock().release()
319
320class _Tree(_Base):
321	def __init__(self, lock):
322		_Base.__init__(self, lock)
323
324	def setTree(self, tree):
325		self._tree = tree
326
327	def getTree(self):
328		return self._tree
329
330	def terminate(self):
331		self.getLock().acquire()
332		self._canvasCommands.append([self.canvas_terminate, [], {}])
333		self.getLock().release()
334
335	def canvas_terminate(self):
336		getRoot()._removeTree(self)
337		self.setTree(None)
338		self.setCanvas(None)
339		self.setFrame(None)
340		self.setRoot(None)
341
342	def redrawTree(self, block, itree):
343		if self.getLock().acquire(block):
344			canvasCommands = self._canvasCommands
345			command = [self.canvas_redrawTree, [itree], {}]
346			try:
347				while 1:
348					canvasCommands.remove(command)
349			except ValueError:
350				pass
351			canvasCommands.append(command)
352			self.getLock().release()
353
354	def canvas_redrawTree(self, itree):
355		pass
356
357class _Plotter(_Base):
358	def __init__(self, lock, viewWidth, viewHeight, width, height):
359		_Base.__init__(self, lock)
360		self.setPostscriptCondition(threading.Condition())
361
362		self.setScrollRegion(0, 0, 100, 100)
363
364	def _requestRegion(self, serialNumber, allTags, x0, y0, x1, y1):
365		### Nothing to do for batch GUI.
366		pass
367
368	def setPostscriptCondition(self, condition):
369		self._postscriptCondition = condition
370
371	def getPostscriptCondition(self):
372		return self._postscriptCondition
373
374	def setScrollRegion(self, *args):
375		self.getLock().acquire()
376		self._canvasCommands.append([self.canvas_scrollRegion, args, {}])
377		self.getLock().release()
378
379	def getScrollRegion(self):
380		return self._scrollRegion
381
382	def setViewWidth(self, viewWidth):
383		self.getLock().acquire()
384		self._canvasCommands.append([self.canvas_viewWidth, [viewWidth], {}])
385		self.getLock().release()
386
387	def getViewWidth(self):
388		return self._viewWidth
389
390	def setViewHeight(self, viewHeight):
391		self.getLock().acquire()
392		self._canvasCommands.append([self.canvas_viewHeight, [viewHeight], {}])
393		self.getLock().release()
394
395	def getViewHeight(self):
396		return self._viewHeight
397
398	def create_text(self, *args1, **args2):
399		self.getLock().acquire()
400		self._canvasCommands.append([self.getCanvas().create_text, args1, args2])
401		self.getLock().release()
402
403	def create_oval(self, *args1, **args2):
404		self.getLock().acquire()
405		self._canvasCommands.append([self.getCanvas().create_oval, args1, args2])
406		self.getLock().release()
407
408	def create_rectangle(self, *args1, **args2):
409		pass
410
411	def create_line(self, *args1, **args2):
412		pass
413
414	def create_polygon(self, *args1, **args2):
415		pass
416
417	def refresh(self):
418		pass
419
420	def delete(self, *args):
421		self.getLock().acquire()
422		self._canvasCommands.append([self.canvas_delete, args, {}])
423		self.getLock().release()
424
425	def create_styledText(self, *args1, **args2):
426		self.getLock().acquire()
427		self._canvasCommands.append([self.canvas_create_styledText, args1, args2])
428		self.getLock().release()
429
430	def create_styledExponent(self, *args1, **args2):
431		self.getLock().acquire()
432		self._canvasCommands.append([self.canvas_create_styledExponent, args1, args2])
433		self.getLock().release()
434
435	def create_styledOval(self, *args1, **args2):
436		self.getLock().acquire()
437		self._canvasCommands.append([self.canvas_create_styledOval, args1, args2])
438		self.getLock().release()
439
440	def create_styledRectangle(self, *args1, **args2):
441		self.getLock().acquire()
442		self._canvasCommands.append([self.canvas_create_styledRectangle, args1, args2])
443		self.getLock().release()
444
445	def create_styledLine(self, *args1, **args2):
446		self.getLock().acquire()
447		self._canvasCommands.append([self.canvas_create_styledLine, args1, args2])
448		self.getLock().release()
449
450	def create_styledPolygon(self, *args1, **args2):
451		self.getLock().acquire()
452		self._canvasCommands.append([self.canvas_create_styledPolygon, args1, args2])
453		self.getLock().release()
454
455	def create_styledMarker(self, *args1, **args2):
456		self.getLock().acquire()
457		self._canvasCommands.append([self.canvas_create_styledMarker, args1, args2])
458		self.getLock().release()
459
460	def create_styledTextsBox(self, *args1, **args2):
461		self.getLock().acquire()
462		self._canvasCommands.append([self.canvas_create_styledTextsBox, args1, args2])
463		self.getLock().release()
464
465	def create_styledLegendsBox(self, *args1, **args2):
466		self.getLock().acquire()
467		self._canvasCommands.append([self.canvas_create_styledLegendsBox, args1, args2])
468		self.getLock().release()
469
470	def create_styledStatisticsBox(self, *args1, **args2):
471		self.getLock().acquire()
472		self._canvasCommands.append([self.canvas_create_styledStatisticsBox, args1, args2])
473		self.getLock().release()
474
475	def setPostscript(self, fileName):
476		self.getLock().acquire()
477		self._canvasCommands.append([self.canvas_postscript, [fileName], {}])
478		self.getLock().release()
479
480	def setPostscriptStrings(self):
481		self.getLock().acquire()
482		self._canvasCommands.append([self.canvas_postscriptStrings, [], {}])
483		self.getLock().release()
484
485	def getPostscriptStrings(self):
486		return self._postscriptStrings
487
488	def terminate(self):
489		self.getLock().acquire()
490		self._canvasCommands.append([self.canvas_terminate, [], {}])
491		self.getLock().release()
492
493	def canvas_terminate(self):
494		getRoot()._removePlotter(self)
495		self.setPlotter(None)
496		self.setCanvas(None)
497		self.setFrame(None)
498		self.setRoot(None)
499
500	def canvas_scrollRegion(self, x0, y0, x1, y1):
501		self._scrollRegion = (0, 0, 100, 100)
502
503	def canvas_viewWidth(self, viewWidth):
504		self._viewWidth = 1
505
506	def canvas_viewHeight(self, viewHeight):
507		self._viewHeight = 1
508
509	def canvas_create_styledLegendsBox(self, infoStyle, region, layout, legends, tags):
510		pass
511
512	def canvas_create_styledStatisticsBox(self, infoStyle, region, layout, statisticsData, tags):
513		pass
514
515	def canvas_create_styledTextsBox(self, infoStyle, region, layout, textsData, tags):
516		pass
517
518	def canvas_postscript(self, fileName):
519		postscriptCondition = self.getPostscriptCondition()
520		postscriptCondition.acquire()
521		postscriptCondition.notifyAll()
522		postscriptCondition.release()
523
524	def canvas_postscriptStrings(self):
525		postscriptCondition = self.getPostscriptCondition()
526		postscriptCondition.acquire()
527		self._postscriptStrings = ''
528		postscriptCondition.notifyAll()
529		postscriptCondition.release()
530
531	def canvas_create_styledOval(self, lineStyle, fillStyle, tags, x0, y0, x1, y1):
532		pass
533
534	def canvas_create_styledRectangle(self, lineStyle, fillStyle, tags, x0, y0, x1, y1):
535		pass
536
537	def canvas_create_styledLine(self, lineStyle, tags, *points):
538		pass
539
540	def canvas_create_styledPolygon(self, lineStyle, fillStyle, tags, *points):
541		pass
542
543	def canvas_create_styledMarker(self, markerStyle, tags, x, y):
544		pass
545
546	def canvas_create_styledText(self, textStyle, tags, x, y, textData, anchor):
547		pass
548
549	def canvas_delete(self, *args1):
550		pass
551
552	def canvas_create_styledExponent(self, textStyle, tags, x, y, a, b, anchor, fontRatio, overOffsetRatio):
553		pass
554