From b985e8c96f3b0a0e7df92ff244fe19e4dcb4398f Mon Sep 17 00:00:00 2001
From: Jean-Paul Chaput <Jean-Paul.Chaput@lip6.fr>
Date: Sat, 17 Apr 2010 10:13:17 +0000
Subject: [PATCH]   * ./hurricane:     - New: In Reference, adds a type to
 differentiate between "Labels" and         "Position". Labels are strings
 that we wants to display, and position         are specific points with a
 name attached to it.     - New: In CellWidget, specific display for the two
 kind of references         (Label & Display).

---
 hurricane/src/hurricane/Reference.cpp         | 19 ++++----
 hurricane/src/hurricane/hurricane/Reference.h | 16 ++++---
 hurricane/src/viewer/CellWidget.cpp           | 43 ++++++++++++++++---
 .../src/viewer/hurricane/viewer/CellWidget.h  |  5 ++-
 4 files changed, 61 insertions(+), 22 deletions(-)

diff --git a/hurricane/src/hurricane/Reference.cpp b/hurricane/src/hurricane/Reference.cpp
index 38efdcbf..3206c76a 100644
--- a/hurricane/src/hurricane/Reference.cpp
+++ b/hurricane/src/hurricane/Reference.cpp
@@ -37,11 +37,12 @@ namespace Hurricane {
   DbU::Unit Reference::_extend = 0;
 
 
-Reference::Reference(Cell* cell, const Name& name, DbU::Unit x, DbU::Unit y)
-// ***************************************************************
+Reference::Reference(Cell* cell, const Name& name, DbU::Unit x, DbU::Unit y, Type type)
+// ************************************************************************************
 :  Inherit(cell),
   _name(name),
-  _point(x,y)
+  _point(x,y),
+  _type(type)
 {
   if ( !_extend ) _extend = DbU::grid(0.5);
 
@@ -49,20 +50,20 @@ Reference::Reference(Cell* cell, const Name& name, DbU::Unit x, DbU::Unit y)
     throw Error("Can't create " + _TName("Reference") + " : empty name");
 }
 
-Reference* Reference::create(Cell* cell, const Name& name, DbU::Unit x, DbU::Unit y)
-// ***********************************************************************
+Reference* Reference::create(Cell* cell, const Name& name, DbU::Unit x, DbU::Unit y, Type type )
+// *********************************************************************************************
 {
-  Reference* reference = new Reference(cell, name, x, y);
+  Reference* reference = new Reference(cell, name, x, y, type);
 
   reference->_postCreate();
 
   return reference;
 }
 
-Reference* Reference::create(Cell* cell, const Name& name, const Point& point)
-// ***************************************************************************
+Reference* Reference::create(Cell* cell, const Name& name, const Point& point, Type type)
+// **************************************************************************************
 {
-  return create(cell,name,point.getX(),point.getY());
+  return create(cell,name,point.getX(),point.getY(),type);
 }
 
 Box  Reference::getBoundingBox() const
diff --git a/hurricane/src/hurricane/hurricane/Reference.h b/hurricane/src/hurricane/hurricane/Reference.h
index f5432933..71535b76 100644
--- a/hurricane/src/hurricane/hurricane/Reference.h
+++ b/hurricane/src/hurricane/hurricane/Reference.h
@@ -38,21 +38,23 @@ class Reference : public Marker {
 // *****
 
     public: typedef Marker Inherit;
+    public: enum Type { Label=1, Position=2 };
 
 // Attributes
 // **********
 
-    public: Name _name;
-    public: Point _point;
-    public: static DbU::Unit _extend;
+    private: Name _name;
+    private: Point _point;
+    private: Type  _type;
+    private: static DbU::Unit _extend;
 
 // Constructors
 // ************
 
-    protected: Reference(Cell* cell, const Name& name, DbU::Unit x, DbU::Unit y);
+    protected: Reference(Cell* cell, const Name& name, DbU::Unit x, DbU::Unit y, Type type);
 
-    public: static Reference* create(Cell* cell, const Name& name, DbU::Unit x, DbU::Unit y );
-    public: static Reference* create(Cell* cell, const Name& name, const Point& point );
+    public: static Reference* create(Cell* cell, const Name& name, DbU::Unit x, DbU::Unit y, Type type=Position );
+    public: static Reference* create(Cell* cell, const Name& name, const Point& point, Type type=Position );
 
 // Accessors
 // *********
@@ -60,11 +62,13 @@ class Reference : public Marker {
     public: virtual Box getBoundingBox() const;
     public: const Name& getName() const {return _name;};
     public: const Point& getPoint() const {return _point;};
+    public: Type getType() const { return _type; }
 
 // Updators
 // ********
 
     public: virtual void translate(const DbU::Unit& dx, const DbU::Unit& dy);
+    public: void setType ( Type type ) { _type=type; }
 
 // Others
 // ******
diff --git a/hurricane/src/viewer/CellWidget.cpp b/hurricane/src/viewer/CellWidget.cpp
index 6ef009c8..0a3ee7e8 100644
--- a/hurricane/src/viewer/CellWidget.cpp
+++ b/hurricane/src/viewer/CellWidget.cpp
@@ -860,14 +860,34 @@ namespace Hurricane {
     static QRect  rectangle;
 
     const Reference* reference = dynamic_cast<const Reference*>(marker);
-    if ( reference ) {
+    if ( reference and _cellWidget->isDrawable("text.reference") and (getDepth() < 2) ) {
       _goCount++;
-      Box bb = transformation.getBox(reference->getBoundingBox()).inflate(DbU::lambda(5.0));
-      rectangle = _cellWidget->dbuToDisplayRect ( bb );
+      unsigned int flags = BigFont|Bold|Frame;
 
-      if ( _cellWidget->isDrawable("text.reference") and (getDepth() < 2) ) {
-        const char* refName = reference->getName()._getSharedName()->_getSString().c_str();
-        _cellWidget->drawDisplayText ( rectangle, refName, BigFont|Bold|Center|Frame );
+      Box bb = transformation.getBox ( reference->getBoundingBox() );
+      rectangle = _cellWidget->dbuToDisplayRect ( bb );
+      rectangle.adjust ( 10, 10, 10, 10 );
+
+      if ( reference->getType() == Reference::Position ) {
+        QPoint point = _cellWidget->dbuToDisplayPoint ( reference->getPoint() );
+        rectangle.translate ( point.x() - rectangle.x(), point.y() - rectangle.y() );
+
+        flags |= Left;
+      } else {
+        flags |= Center;
+      }
+
+      const char* refName = reference->getName()._getSharedName()->_getSString().c_str();
+      _cellWidget->drawDisplayText ( rectangle, refName, flags );
+
+      if ( reference->getType() == Reference::Position ) {
+        QPoint losange [5] = { QPoint(rectangle.x()  ,rectangle.y()-6)
+                             , QPoint(rectangle.x()-6,rectangle.y()  )
+                             , QPoint(rectangle.x()  ,rectangle.y()+6)
+                             , QPoint(rectangle.x()+6,rectangle.y()  )
+                             , QPoint(rectangle.x()  ,rectangle.y()-6)
+                             };
+        _cellWidget->drawScreenPolyline ( losange, 5, 2 );
       }
     }
   }
@@ -1731,6 +1751,7 @@ namespace Hurricane {
       bottomLeft.ry() += height/2;
     } else if ( flags & Top ) {
       bottomLeft.ry() += height;
+    } else if ( flags & Left ) {
     }
 
     if ( flags & Frame ) painter.drawRect ( bottomLeft.x()-1, bottomLeft.y()-height, width+2, height );
@@ -1764,13 +1785,23 @@ namespace Hurricane {
   }
 
 
+  void  CellWidget::drawScreenPolygon ( const QPoint* points, int count, size_t plane )
+  {
+    _drawingPlanes.painter(plane).drawPolygon ( points, count );
+  }
+
+
   void  CellWidget::drawScreenPolyline ( const QPoint* points, int count, int width, size_t plane )
   {
+    _drawingPlanes.painter(plane).save ();
+
     QPen pen = _drawingPlanes.painter(plane).pen ();
     pen.setWidth ( width );
 
     _drawingPlanes.painter(plane).setPen ( pen );
     _drawingPlanes.painter(plane).drawPolyline ( points, count );
+
+    _drawingPlanes.painter(plane).restore ();
   }
 
 
diff --git a/hurricane/src/viewer/hurricane/viewer/CellWidget.h b/hurricane/src/viewer/hurricane/viewer/CellWidget.h
index f4613451..3f0585dd 100644
--- a/hurricane/src/viewer/hurricane/viewer/CellWidget.h
+++ b/hurricane/src/viewer/hurricane/viewer/CellWidget.h
@@ -117,7 +117,9 @@ namespace Hurricane {
                           , Reverse=0x04
                           , Frame  =0x08
                           , Center =0x10
-                          , Top    =0x20
+                          , Left   =0x20
+                          , Right  =0x40
+                          , Top    =0x80
                           };
     public:
     // Constructor & Destructor.
@@ -187,6 +189,7 @@ namespace Hurricane {
               void                    drawRulers                 ( QRect );
               void                    drawDisplayText            ( const QRect& , const char*, unsigned int flags=0 );
               void                    drawDisplayText            ( const QPoint&, const char*, unsigned int flags=0, int angle=0 );
+              void                    drawScreenPolygon          ( const QPoint*, int count,     size_t plane=PlaneId::Working );
               void                    drawScreenLine             ( const QPoint&, const QPoint&, size_t plane=PlaneId::Working, bool mode=true );
               void                    drawScreenRect             ( const QPoint&, const QPoint&, size_t plane=PlaneId::Working );
               void                    drawScreenRect             ( const QRect& ,                size_t plane=PlaneId::Working );