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