]> SALOME platform Git repositories - modules/geom.git/blob - src/GEOMGUI/GeometryGUI_Swig.cxx
Salome HOME
ffae0d61db0ec97890913e4da88242eadc3ef136
[modules/geom.git] / src / GEOMGUI / GeometryGUI_Swig.cxx
1 //  GEOM GEOMGUI : GUI for Geometry component
2 //
3 //  Copyright (C) 2003  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4 //  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
5 //
6 //  This library is free software; you can redistribute it and/or
7 //  modify it under the terms of the GNU Lesser General Public
8 //  License as published by the Free Software Foundation; either
9 //  version 2.1 of the License.
10 //
11 //  This library is distributed in the hope that it will be useful,
12 //  but WITHOUT ANY WARRANTY; without even the implied warranty of
13 //  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 //  Lesser General Public License for more details.
15 //
16 //  You should have received a copy of the GNU Lesser General Public
17 //  License along with this library; if not, write to the Free Software
18 //  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
19 //
20 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
21 //
22 //
23 //
24 //  File   : GeometryGUI_Swig.cxx
25 //  Author : Nicolas REJNERI, Paul RASCLE
26 //  Module : GEOM
27 //  $Header$
28
29 #include "GeometryGUI_Swig.hxx"
30 #include "SALOMEGUI_Swig.hxx"
31
32 #include "GeometryGUI.h"
33
34 #include "SUIT_Session.h"
35 #include "SalomeApp_Application.h"
36 #include "SalomeApp_Study.h"
37 #include "SalomeApp_ImportOperation.h"
38
39 #include "OB_Browser.h"
40
41 #include "OCCViewer_ViewWindow.h"
42 #include "OCCViewer_ViewManager.h"
43 #include "SOCC_ViewModel.h"
44
45 #include "SVTK_ViewModel.h"
46 #include "SVTK_ViewWindow.h"
47 #include "SVTK_View.h"
48 #include "SVTK_Renderer.h"
49
50 #include "GEOM_Actor.h"
51 #include "GEOM_Client.hxx"
52 #include "GEOM_AISShape.hxx"
53 #include "GEOM_AssemblyBuilder.h"
54 #include "GEOM_InteractiveObject.hxx"
55 #include "GEOM_Displayer.h"
56
57 #include "SALOME_Event.hxx"
58
59 #include "utilities.h"
60
61 #include "SALOMEDSClient.hxx"
62
63 // OCCT Includes
64 #include <TopAbs.hxx>
65 #include <TopoDS_Shape.hxx>
66 #include <AIS_ListOfInteractive.hxx>
67 #include <AIS_ListIteratorOfListOfInteractive.hxx>
68 #include <AIS_Drawer.hxx>
69
70 // IDL Headers
71 #include <SALOMEconfig.h>
72 #include CORBA_SERVER_HEADER(GEOM_Gen)
73
74 #include <vtkRenderer.h>
75
76 using namespace std;
77
78
79 static GEOM_Client ShapeReader;
80
81 inline OCCViewer_Viewer* GetOCCViewer(SUIT_Application* theApp){
82   SUIT_ViewWindow* window = theApp->desktop()->activeWindow();
83   if(window && window->getViewManager()->getType() == OCCViewer_Viewer::Type()){
84     OCCViewer_ViewWindow* vw = dynamic_cast<OCCViewer_ViewWindow*>( window );
85     if ( vw ) {
86       OCCViewer_ViewManager* vm = dynamic_cast<OCCViewer_ViewManager*>( vw->getViewManager() );
87       if ( vm )
88         return vm->getOCCViewer();
89     }
90   }
91
92   return 0;
93 }
94
95 inline SVTK_ViewWindow* GetSVTKViewWindow(SUIT_Application* theApp){
96   SUIT_ViewWindow* window = theApp->desktop()->activeWindow();
97   if(window && window->getViewManager()->getType() == SVTK_Viewer::Type())
98     return dynamic_cast<SVTK_ViewWindow*>( window );
99
100   return 0;
101 }
102
103 GEOM_Swig::GEOM_Swig()
104 {
105   // MESSAGE("Constructeur");
106 }
107
108 GEOM_Swig::~GEOM_Swig()
109 {
110   // MESSAGE("Destructeur");
111 }
112
113 void GEOM_Swig::createAndDisplayGO (const char* Entry, bool isUpdated)
114 {
115   class TEvent: public SALOME_Event
116   {
117     std::string myEntry;
118     bool        myUpdateViewer;
119   public:
120     TEvent(const char* theEntry, bool toUpdateViewer):
121       myEntry(theEntry),
122       myUpdateViewer(toUpdateViewer)
123     {}
124     virtual void Execute()
125     {
126       SUIT_Application* app = SUIT_Session::session()->activeApplication();
127       if (!app) return;
128
129       SalomeApp_Study* ActiveStudy = dynamic_cast<SalomeApp_Study*>(app->activeStudy());
130       if (!ActiveStudy) return;
131
132       _PTR(Study) aStudy(ActiveStudy->studyDS());
133       _PTR(StudyBuilder) aStudyBuilder = aStudy->NewBuilder();
134
135       GEOM::GEOM_Gen_var Geom = GeometryGUI::GetGeomGen();
136       if (CORBA::is_nil(Geom)) {
137         GeometryGUI::InitGeomGen();
138         Geom = GeometryGUI::GetGeomGen();
139       }
140       if (CORBA::is_nil(Geom))
141         return;
142
143       string aFatherIOR;
144       _PTR(SComponent) father = aStudy->FindComponent("GEOM");
145       if (!father)
146         return;
147       if (!father->ComponentIOR(aFatherIOR)) {
148         aStudyBuilder->LoadWith(father, SalomeApp_Application::orb()->object_to_string(Geom));
149         father->ComponentIOR(aFatherIOR);
150       }
151
152       _PTR(SObject) obj = aStudy->FindObjectID(myEntry);
153       if (!obj)
154         return;
155
156       // Create new actor
157       _PTR(GenericAttribute) anAttr;
158       if (!obj->FindAttribute(anAttr, "AttributeIOR"))
159         return;
160       _PTR(AttributeIOR) anIOR(anAttr);
161       string anIORValue = anIOR->Value();
162
163       GEOM::GEOM_Object_var aShape = Geom->GetIORFromString(anIORValue.c_str());
164       TopoDS_Shape Shape = ShapeReader.GetShape(Geom,aShape);
165       if (!Shape.IsNull()) {
166         if (obj->FindAttribute(anAttr, "AttributeName")) {
167           _PTR(AttributeName) aName (anAttr);
168           string aNameValue = aName->Value();
169           // open transaction
170           /*SUIT_Operation* op = new SalomeApp_ImportOperation (app);
171           op->start();
172
173           _PTR(SObject) newObj1 = aStudyBuilder->NewObject(father);
174           aStudyBuilder->Addreference(newObj1, obj);
175           // commit transaction
176           op->commit();*/
177           Handle(GEOM_InteractiveObject) anIO =
178             new GEOM_InteractiveObject (const_cast<char*>(anIORValue.c_str()),
179                                         const_cast<char*>(aFatherIOR.c_str()),
180                                         "GEOM",
181                                         const_cast<char*>( obj->GetID().c_str()));
182
183           GEOM_Displayer(ActiveStudy).Display(anIO, myUpdateViewer);
184           /*if (SVTK_ViewWindow* aViewWindow = GetSVTKViewWindow(app)) {
185             SVTK_View* aView = aViewWindow->getView();
186             int aMode = aView->GetDisplayMode();
187
188             vtkActorCollection* theActors =
189               GEOM_AssemblyBuilder::BuildActors(Shape,0,aMode,true);
190             theActors->InitTraversal();
191             while (vtkActor* anActor = theActors->GetNextActor()) {
192               GEOM_Actor* GActor = GEOM_Actor::SafeDownCast(anActor);
193               GActor->setName(const_cast<char*>(aNameValue.c_str()));
194               GActor->setIO(anIO);
195               aView->Display(GActor);
196             }
197             aView->Repaint();
198           } else if (OCCViewer_Viewer* occViewer = GetOCCViewer(app)) {
199             Handle(AIS_InteractiveContext) ic = occViewer->getAISContext();
200             Handle(GEOM_AISShape) aSh =
201               new GEOM_AISShape (Shape,const_cast<char*>(aNameValue.c_str()));
202             aSh->setName(const_cast<char*>(aNameValue.c_str()));
203             aSh->setIO(anIO);
204             ic->Display(aSh);
205             ic->AddOrRemoveCurrentObject(aSh,true);
206             }*/
207           // update object browser
208           SalomeApp_Application* app = NULL; //dynamic_cast<SalomeApp_Application*>(app);
209           if (app) {
210             CAM_Module* module = app->module("Geometry");
211             SalomeApp_Module* appMod = dynamic_cast<SalomeApp_Module*>(module);
212             if (appMod)
213               appMod->updateObjBrowser(true);
214           }
215         }
216       }
217     }
218   };
219
220   // MESSAGE("createAndDisplayGO");
221   ProcessVoidEvent(new TEvent (Entry, isUpdated));
222
223   class TEventUpdateBrowser: public SALOME_Event
224     {
225       public:
226         TEventUpdateBrowser() {}
227         virtual void Execute() {
228           SalomeApp_Application* app =
229             dynamic_cast<SalomeApp_Application*>(SUIT_Session::session()->activeApplication());
230           if (app) {
231             CAM_Module* module = app->module("Geometry");
232             SalomeApp_Module* appMod = dynamic_cast<SalomeApp_Module*>(module);
233             if (appMod) appMod->updateObjBrowser(true);
234           }
235         }
236     };
237
238   if (isUpdated)
239     ProcessVoidEvent(new TEventUpdateBrowser ());
240 }
241
242 void GEOM_Swig::createAndDisplayFitAllGO (const char* Entry)
243 {
244   class TEventFitAll: public SALOME_Event
245   {
246     public:
247       TEventFitAll() {}
248       virtual void Execute() {
249         SUIT_Application* app = SUIT_Session::session()->activeApplication();
250         if (!app) return;
251         
252         if (SVTK_ViewWindow* aViewWindow = GetSVTKViewWindow(app))
253           {
254             SVTK_View* aView = aViewWindow->getView();
255             aView->GetRenderer()->OnFitAll();
256           }
257         else if (OCCViewer_Viewer* occViewer = GetOCCViewer(app))
258           {  
259             Handle(V3d_Viewer) aViewer3d = occViewer->getViewer3d();
260             aViewer3d->InitActiveViews();
261             
262             if (aViewer3d->MoreActiveViews())
263               aViewer3d->ActiveView()->FitAll();
264           }
265       }
266   };
267
268   createAndDisplayGO(Entry);
269   ProcessVoidEvent(new TEventFitAll());
270 }
271
272 int GEOM_Swig::getIndexTopology(const char* SubIOR, const char* IOR)
273 {
274   GEOM::GEOM_Gen_var aGeomGen = GeometryGUI::GetGeomGen();
275   if (CORBA::is_nil(aGeomGen))
276     return -1;
277
278   GEOM::GEOM_Object_var aMainShape = aGeomGen->GetIORFromString(IOR);
279   GEOM::GEOM_Object_var aSubShape  = aGeomGen->GetIORFromString(SubIOR);
280   if (CORBA::is_nil(aMainShape) || CORBA::is_nil(aSubShape))
281     return -1;
282
283   GEOM::GEOM_IShapesOperations_var anIShapesOperations =
284     aGeomGen->GetIShapesOperations(aMainShape->GetStudyID());
285   if (CORBA::is_nil(anIShapesOperations))
286     return -1;
287
288   return anIShapesOperations->GetTopologyIndex(aMainShape, aSubShape);
289 }
290
291 const char* GEOM_Swig::getShapeTypeString(const char* IOR)
292 {
293   TCollection_AsciiString aTypeName ("Shape of unknown type");
294
295   GEOM::GEOM_Gen_var aGeomGen = GeometryGUI::GetGeomGen();
296   if (!CORBA::is_nil(aGeomGen))
297   {
298     GEOM::GEOM_Object_var aShape = aGeomGen->GetIORFromString(IOR);
299     if (!CORBA::is_nil(aShape))
300     {
301       GEOM::GEOM_IShapesOperations_var anIShapesOperations =
302         aGeomGen->GetIShapesOperations(aShape->GetStudyID());
303       if (!CORBA::is_nil(anIShapesOperations))
304       {
305         aTypeName = anIShapesOperations->GetShapeTypeString(aShape);
306       }
307     }
308   }
309
310   return CORBA::string_dup(aTypeName.ToCString());
311 }
312
313
314 const char* GEOM_Swig::getShapeTypeIcon(const char* IOR)
315 {
316   GEOM::GEOM_Gen_var Geom = GeometryGUI::GetGeomGen();
317   if ( CORBA::is_nil( Geom ) )
318     return "None";
319
320   GEOM::GEOM_Object_var aShape = Geom->GetIORFromString(IOR);
321   TopoDS_Shape shape = ShapeReader.GetShape(Geom, aShape);
322
323   if( shape.IsNull() ) {
324     return "None" ;
325   }
326
327   switch (shape.ShapeType() )
328     {
329     case TopAbs_COMPOUND:
330       { return "ICON_OBJBROWSER_COMPOUND" ;}
331     case  TopAbs_COMPSOLID:
332       { return "ICON_OBJBROWSER_COMPSOLID" ;}
333     case TopAbs_SOLID:
334       { return "ICON_OBJBROWSER_SOLID" ;}
335     case TopAbs_SHELL:
336       { return "ICON_OBJBROWSER_SHELL" ;}
337     case TopAbs_FACE:
338       { return "ICON_OBJBROWSER_FACE" ;}
339     case TopAbs_WIRE:
340       { return "ICON_OBJBROWSER_WIRE" ;}
341     case TopAbs_EDGE:
342       { return "ICON_OBJBROWSER_EDGE" ;}
343     case TopAbs_VERTEX:
344       { return "ICON_OBJBROWSER_VERTEX" ;}
345     }
346
347   return "None";
348 }
349
350 void GEOM_Swig::setDisplayMode(const char* theEntry, int theMode)
351 {
352   class TEvent: public SALOME_Event {
353     std::string myEntry;
354     int myMode;
355   public:
356     TEvent(const char* theEntryArg, int theModeArg):
357       myEntry(theEntryArg), myMode(theModeArg)
358     {}
359     virtual void Execute() {
360       SUIT_Application* anApp = SUIT_Session::session()->activeApplication();
361       if (!anApp) return;
362
363       Handle(SALOME_InteractiveObject) anIO =
364         new SALOME_InteractiveObject(myEntry.c_str(), "GEOM", "");
365
366       if (SVTK_ViewWindow* aViewWindow = GetSVTKViewWindow(anApp)) {
367         SVTK_View* aView = aViewWindow->getView();
368         aView->SetDisplayMode(anIO, myMode);
369         aView->Repaint();
370       }
371       else if (OCCViewer_Viewer* occViewer = GetOCCViewer(anApp)) {
372         SOCC_Viewer* soccViewer = dynamic_cast<SOCC_Viewer*>(occViewer);
373         if (soccViewer)
374           soccViewer->switchRepresentation(anIO, myMode);
375       }
376     }
377   };
378
379   ProcessVoidEvent(new TEvent (theEntry, theMode));
380 }
381
382 void GEOM_Swig::setColor(const char* theEntry, int red, int green, int blue)
383 {
384   class TEvent: public SALOME_Event {
385     std::string myEntry;
386     int myRed;
387     int myGreen;
388     int myBlue;
389   public:
390     TEvent(const char* theEntryArg, int theR, int theG, int theB):
391       myEntry(theEntryArg), myRed(theR), myGreen(theG), myBlue(theB)
392     {}
393     virtual void Execute() {
394       SUIT_Application* anApp = SUIT_Session::session()->activeApplication();
395       if (!anApp) return;
396
397       Handle(SALOME_InteractiveObject) anIO =
398         new SALOME_InteractiveObject(myEntry.c_str(), "GEOM", "");
399
400       if (SVTK_ViewWindow* aViewWindow = GetSVTKViewWindow(anApp)){
401         SVTK_View* aView = aViewWindow->getView();
402         QColor aColor (myRed, myGreen, myBlue);
403         aView->SetColor(anIO, aColor);
404         aView->Repaint();
405       } else if (OCCViewer_Viewer* occViewer = GetOCCViewer(anApp)) {
406         Handle(AIS_InteractiveContext) ic = occViewer->getAISContext();
407         AIS_ListOfInteractive List;
408         ic->DisplayedObjects(List);
409         AIS_ListIteratorOfListOfInteractive ite (List);
410         for (; ite.More(); ite.Next()) {
411           Handle(SALOME_InteractiveObject) anObj =
412             Handle(SALOME_InteractiveObject)::DownCast(ite.Value()->GetOwner());
413           if (!anObj.IsNull() && anObj->hasEntry() && anObj->isSame(anIO)) {
414             Quantity_Color CSFColor =
415               Quantity_Color(myRed/255., myGreen/255., myBlue/255., Quantity_TOC_RGB);
416             ite.Value()->SetColor(CSFColor);
417             if (ite.Value()->IsKind(STANDARD_TYPE(GEOM_AISShape)))
418               Handle(GEOM_AISShape)::DownCast(ite.Value())->SetShadingColor(CSFColor);
419             ite.Value()->Redisplay(Standard_True);
420             occViewer->update();
421             break;
422           }
423         }
424       }
425     }
426   };
427   ProcessVoidEvent(new TEvent(theEntry, red, green, blue));
428 }
429
430 void GEOM_Swig::setTransparency(const char* theEntry, float transp)
431 {
432   class TEvent: public SALOME_Event {
433     std::string myEntry;
434     float myParam;
435   public:
436     TEvent(const char* theEntryArg, float theParam):
437       myEntry(theEntryArg), myParam(theParam)
438     {}
439     virtual void Execute() {
440       SUIT_Application* anApp = SUIT_Session::session()->activeApplication();
441       if (!anApp) return;
442
443       Handle(SALOME_InteractiveObject) anIO =
444         new SALOME_InteractiveObject(myEntry.c_str(), "GEOM", "");
445
446       if (SVTK_ViewWindow* aViewWindow = GetSVTKViewWindow(anApp)) {
447         SVTK_View* aView = aViewWindow->getView();
448         aView->SetTransparency(anIO, myParam);
449         aView->Repaint();
450       } else if (OCCViewer_Viewer* occViewer = GetOCCViewer(anApp)) {
451         SOCC_Viewer* soccViewer = dynamic_cast<SOCC_Viewer*>(occViewer);
452         if (soccViewer)
453           soccViewer->setTransparency(anIO, myParam);
454       }
455     }
456   };
457
458   ProcessVoidEvent(new TEvent (theEntry, transp));
459 }
460
461
462 class TInitGeomGenEvent: public SALOME_Event {
463 public:
464   typedef bool TResult;
465   TResult myResult;
466   TInitGeomGenEvent() : myResult(false) {}
467   virtual void Execute() {
468     myResult = GeometryGUI::InitGeomGen();
469   }
470 };
471 bool GEOM_Swig::initGeomGen()
472 {
473   return ProcessEvent(new TInitGeomGenEvent());
474 }
475
476
477
478 void GEOM_Swig::eraseGO (const char* Entry, bool allWindows)
479 {
480   class TEvent: public SALOME_Event
481   {
482     std::string myEntry;
483     bool myFromAllWindows;
484   public:
485     TEvent(const char* theEntry, bool fromAllWindows):
486       myEntry(theEntry), myFromAllWindows(fromAllWindows)
487     {}
488     virtual void Execute()
489     {
490       SUIT_Application* app = SUIT_Session::session()->activeApplication();
491       if (!app) return;
492       SalomeApp_Study* ActiveStudy = dynamic_cast<SalomeApp_Study*>(app->activeStudy());
493       if (!ActiveStudy) return;
494
495       Handle (SALOME_InteractiveObject) aIO = new SALOME_InteractiveObject(myEntry.c_str(), "GEOM", "");
496
497       GEOM_Displayer(ActiveStudy).Erase(aIO, true);
498       /*      if (myFromAllWindows) {
499         QPtrList<SUIT_ViewWindow> aWindows = app->desktop()->windows();
500         SUIT_ViewWindow* aWin = 0;
501         for (aWin = aWindows.first(); aWin; aWin = aWindows.next()) {
502           EraseObject(aWin, aIO);
503         }
504       } else {
505         SUIT_ViewWindow* aWin = app->desktop()->activeWindow();
506         if (aWin)
507           EraseObject(aWin, aIO);
508           }*/
509     }
510
511     /*  private:
512     void EraseObject(SUIT_ViewWindow* theWin, Handle (SALOME_InteractiveObject) theIO)
513     {
514       if (theWin->getViewManager()->getType() == OCCViewer_Viewer::Type()){
515         OCCViewer_ViewWindow* vw = dynamic_cast<OCCViewer_ViewWindow*>( theWin );
516         if ( vw ) {
517           OCCViewer_ViewManager* vm = dynamic_cast<OCCViewer_ViewManager*>( vw->getViewManager() );
518           if ( vm ) {
519             SOCC_Viewer* aViewer = dynamic_cast<SOCC_Viewer*>(vm->getOCCViewer());
520             if (aViewer) {
521               SALOME_Prs* aPrs = aViewer->CreatePrs(myEntry.c_str());
522               if (aPrs) {
523                 SALOME_OCCPrs* aOccPrs =  dynamic_cast<SALOME_OCCPrs*>(aPrs);
524                 if (aOccPrs) {
525                   aViewer->Erase(aOccPrs);
526                   aViewer->Repaint();
527                 }
528               }
529             }
530           }
531         }
532       } else if (theWin->getViewManager()->getType() == SVTK_Viewer::Type()){
533         SVTK_ViewWindow* aViewWindow = dynamic_cast<SVTK_ViewWindow*>( theWin );
534         if (aViewWindow) {
535           aViewWindow->Erase(theIO);
536         }
537       }
538       }*/
539
540   };
541   ProcessVoidEvent(new TEvent(Entry, allWindows));
542 }
543
544
545
546 void GEOM_Swig::setDeflection(const char* theEntry, float theDeflect)
547 {
548   class TEvent: public SALOME_Event {
549     std::string myEntry;
550     float myParam;
551   public:
552     TEvent(const char* theEntryArg, float theParam):
553       myEntry(theEntryArg), myParam(theParam)
554     {}
555     virtual void Execute() {
556       SUIT_Application* anApp = SUIT_Session::session()->activeApplication();
557       if (!anApp) return;
558
559       Handle(SALOME_InteractiveObject) anIO =
560         new SALOME_InteractiveObject(myEntry.c_str(), "GEOM", "");
561
562       if (SVTK_ViewWindow* aViewWindow = GetSVTKViewWindow(anApp)) {
563         vtkActorCollection* aActors = aViewWindow->getRenderer()->GetActors();
564         aActors->InitTraversal();
565         while (vtkActor* aAct = aActors->GetNextActor()) {
566           if (GEOM_Actor* aGeomActor = dynamic_cast<GEOM_Actor*>(aAct)) {
567             if (aGeomActor->hasIO()) {
568               Handle(SALOME_InteractiveObject) aNextIO = aGeomActor->getIO();
569               if (aNextIO->isSame(anIO)) {
570                 aGeomActor->setDeflection(myParam);
571                 aViewWindow->Repaint();
572                 return;
573               }
574             }
575           }
576         }
577         //      aView->SetTransparency(anIO, myParam);
578         //aView->Repaint();
579       } else if (OCCViewer_Viewer* occViewer = GetOCCViewer(anApp)) {
580         Handle(AIS_InteractiveContext) aContext = occViewer->getAISContext();
581         AIS_ListOfInteractive aAISList;
582         aContext->DisplayedObjects(aAISList);
583         AIS_ListIteratorOfListOfInteractive it(aAISList);
584         for (; it.More(); it.Next()) {
585           Handle(SALOME_InteractiveObject) aObj = 
586             Handle(SALOME_InteractiveObject)::DownCast(it.Value()->GetOwner());
587           if ((!aObj.IsNull()) && aObj->hasEntry() && aObj->isSame(anIO)) {
588             Handle(AIS_Shape) aShape = Handle(AIS_Shape)::DownCast(it.Value());
589             if (!aShape.IsNull()) {
590               Handle(AIS_Drawer) aDrawer = aShape->Attributes();
591               if (aDrawer.IsNull())
592                 aDrawer = new AIS_Drawer();
593               aDrawer->SetDeviationCoefficient(myParam);
594               aShape->SetAttributes(aDrawer);
595               aContext->Redisplay(aShape, true, true);
596               aContext->UpdateCurrentViewer();
597               return;
598             }
599           }
600         }
601       }
602     }
603   };
604
605   ProcessVoidEvent(new TEvent (theEntry, theDeflect));
606 }
607