]> git.saurik.com Git - wxWidgets.git/commitdiff
OGL improvements
authorJulian Smart <julian@anthemion.co.uk>
Sun, 6 Sep 1998 14:32:25 +0000 (14:32 +0000)
committerJulian Smart <julian@anthemion.co.uk>
Sun, 6 Sep 1998 14:32:25 +0000 (14:32 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@677 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

utils/ogl/distrib/ogl.rsp
utils/ogl/src/basic.cpp
utils/ogl/src/basic.h
utils/ogl/src/basic2.cpp
utils/ogl/src/lines.cpp
utils/ogl/src/lines.h
utils/ogl/src/linesp.h
utils/ogl/src/makefile.b32
utils/ogl/src/makefile.nt
utils/ogl/src/ogldiag.cpp

index f7eaa1967c1e6e59af73c68b8debdf142fea6721..74c26f53df4f8a12923ab5e0ac5ac3f5539d417c 100644 (file)
@@ -1,21 +1,20 @@
 src/*.cpp
-src/*.c
 src/*.h
 src/*.rc
 src/*.def
 src/*.xbm
-src/make*.*
+src/*.xpm
+src/makefile*
 src/*.txt
 src/*.ico
 src/*.bmp
 
 samples/ogledit/*.cpp
-samples/ogledit/*.c
 samples/ogledit/*.h
 samples/ogledit/*.rc
 samples/ogledit/*.def
 samples/ogledit/*.xbm
-samples/ogledit/make*.*
+samples/ogledit/makefile*
 samples/ogledit/*.txt
 
 samples/ogledit/*.ico
@@ -23,6 +22,7 @@ samples/ogledit/*.bmp
 samples/ogledit/bitmaps/*.bmp
 samples/ogledit/bitmaps/*.gif
 samples/ogledit/bitmaps/*.xbm
+samples/ogledit/bitmaps/*.xpm
 
 distrib/*.rsp
 distrib/*.bat
index 240dfc58eae6fc354faab00a64aef5b5f641982c..ce0ed54a71f760d3a7f3c5742453f0034596ad5e 100644 (file)
@@ -1056,11 +1056,11 @@ bool wxShape::AttachmentSortTest(int attachmentPoint, const wxRealPoint& pt1, co
     return FALSE;
 }
 
-void wxShape::MoveLineToNewAttachment(wxDC& dc, wxLineShape *to_move,
+bool wxShape::MoveLineToNewAttachment(wxDC& dc, wxLineShape *to_move,
                                        double x, double y)
 {
   if (!GetAttachmentMode())
-      return;
+      return FALSE;
 
   int newAttachment, oldAttachment;
   double distance;
@@ -1069,7 +1069,7 @@ void wxShape::MoveLineToNewAttachment(wxDC& dc, wxLineShape *to_move,
   // the user has moved the point to
   bool hit = HitTest(x, y, &newAttachment, &distance);
   if (!hit)
-    return;
+    return FALSE;
 
   EraseLinks(dc);
 
@@ -1138,6 +1138,8 @@ void wxShape::MoveLineToNewAttachment(wxDC& dc, wxLineShape *to_move,
     newOrdering.Append(to_move);
 
   GetEventHandler()->OnChangeAttachment(newAttachment, to_move, newOrdering);
+
+  return TRUE;
 }
 
 void wxShape::OnChangeAttachment(int attachment, wxLineShape* line, wxList& ordering)
@@ -1467,15 +1469,15 @@ void wxShape::Move(wxDC& dc, double x, double y, bool display)
   double old_x = m_xpos;
   double old_y = m_ypos;
 
-  m_xpos = x; m_ypos = y;
-
   if (!GetEventHandler()->OnMovePre(dc, x, y, old_x, old_y, display))
   {
-    m_xpos = old_x;
-    m_ypos = old_y;
+//    m_xpos = old_x;
+//    m_ypos = old_y;
     return;
   }
 
+  m_xpos = x; m_ypos = y;
+
   ResetControlPoints();
 
   if (display)
index bc3bb5f356dc6ab36c737e42154fe48036f84a4b..a134d73e799abd2338fc5c2a542a2299b5d6b7b1 100644 (file)
@@ -394,7 +394,7 @@ class wxShape: public wxShapeEvtHandler
   virtual void EraseLinks(wxDC& dc, int attachment = -1, bool recurse = FALSE);
   virtual void DrawLinks(wxDC& dc, int attachment = -1, bool recurse = FALSE);
 
-  virtual void MoveLineToNewAttachment(wxDC& dc, wxLineShape *to_move,
+  virtual bool MoveLineToNewAttachment(wxDC& dc, wxLineShape *to_move,
                                        double x, double y);
 
   // Reorders the lines coming into the node image at this attachment
@@ -638,6 +638,9 @@ class wxEllipseShape: public wxShape
   inline double GetWidth() const { return m_width; }
   inline double GetHeight() const { return m_height; }
 
+  inline void SetWidth(double w) { m_width = w; }
+  inline void SetHeight(double h) { m_height = h; }
+
 protected:
   double m_width;
   double m_height;
index 2c9c7c9b2cdef90c7430c2b83082df17b5b9850e..46e1723c6a86fbb58fdc89881274ac7f81df65f6 100644 (file)
@@ -1583,9 +1583,10 @@ void wxShape::OnSizingBeginDragLeft(wxControlPoint* pt, double x, double y, int
 
   wxClientDC dc(GetCanvas());
   GetCanvas()->PrepareDC(dc);
-
+/*
   if (pt->m_eraseObject)
     this->Erase(dc);
+*/
 
   dc.SetLogicalFunction(wxXOR);
 
@@ -1694,8 +1695,11 @@ void wxShape::OnSizingEndDragLeft(wxControlPoint* pt, double x, double y, int ke
   this->Recompute();
   this->ResetControlPoints();
 
+  this->Erase(dc);
+/*
   if (!pt->m_eraseObject)
     this->Show(FALSE);
+*/
 
   this->SetSize(pt->controlPointDragEndWidth, pt->controlPointDragEndHeight);
 
@@ -1711,8 +1715,10 @@ void wxShape::OnSizingEndDragLeft(wxControlPoint* pt, double x, double y, int ke
   else
     theObject->Move(dc, pt->controlPointDragPosX, pt->controlPointDragPosY);
 
+/*
   if (!eraseIt)
     theObject->Show(TRUE);
+*/
     
   // Recursively redraw links if we have a composite.
   if (theObject->GetChildren().Number() > 0)
index 18d726812039f8c39ac8eb8a0ae256c4b4512126..b321ba38543d020eb6155befab7b5452c3b78622 100644 (file)
@@ -249,7 +249,7 @@ void wxLineShape::FormatText(wxDC& dc, const wxString& s, int i)
       EraseRegion(dc, region, xx, yy);
       if (m_labelObjects[i])
       {
-        m_labelObjects[i]->Select(FALSE);
+        m_labelObjects[i]->Select(FALSE, &dc);
         m_labelObjects[i]->Erase(dc);
         m_labelObjects[i]->SetSize(actualW, actualH);
       }
@@ -391,12 +391,13 @@ void GraphicsStraightenLine(wxRealPoint *point1, wxRealPoint *point2)
   else point2->y = point1->y;
 }
 
-void wxLineShape::Straighten(wxDCdc)
+void wxLineShape::Straighten(wxDC *dc)
 {
   if (!m_lineControlPoints || m_lineControlPoints->Number() < 3)
     return;
 
-  Erase(dc);
+  if (dc)
+    Erase(* dc);
 
   wxNode *first_point_node = m_lineControlPoints->First();
   wxNode *last_point_node = m_lineControlPoints->Last();
@@ -417,7 +418,8 @@ void wxLineShape::Straighten(wxDC& dc)
     node = node->Next();
   }
 
-  Draw(dc);
+  if (dc)
+    Draw(* dc);
 }
 
 
@@ -1496,7 +1498,7 @@ void wxLineShape::ReadPrologAttributes(wxExpr *clause)
   m_attachmentFrom = 0;
 
   clause->AssignAttributeValue("attachment_to", &m_attachmentTo);
-  clause->AssignAttributeValue("attachmen_from", &m_attachmentFrom);
+  clause->AssignAttributeValue("attachment_from", &m_attachmentFrom);
 
   wxExpr *line_list = NULL;
 
@@ -1666,12 +1668,12 @@ void wxLineShape::Select(bool select, wxDC* dc)
             m_labelObjects[i]->RemoveFromCanvas(m_canvas);
             delete m_labelObjects[i];
           }
-          m_labelObjects[i] = new wxLabelShape(this, region, w, h);
+          m_labelObjects[i] = OnCreateLabelShape(this, region, w, h);
           m_labelObjects[i]->AddToCanvas(m_canvas);
           m_labelObjects[i]->Show(TRUE);
           if (dc)
             m_labelObjects[i]->Move(*dc, (double)(x + xx), (double)(y + yy));
-          m_labelObjects[i]->Select(TRUE);
+          m_labelObjects[i]->Select(TRUE, dc);
         }
       }
     }
@@ -1683,6 +1685,7 @@ void wxLineShape::Select(bool select, wxDC* dc)
       if (m_labelObjects[i])
       {
         m_labelObjects[i]->Select(FALSE, dc);
+        m_labelObjects[i]->Erase(*dc);
         m_labelObjects[i]->RemoveFromCanvas(m_canvas);
         delete m_labelObjects[i];
         m_labelObjects[i] = NULL;
@@ -1704,6 +1707,7 @@ wxLineControlPoint::wxLineControlPoint(wxShapeCanvas *theCanvas, wxShape *object
   m_xpos = x;
   m_ypos = y;
   m_type = the_type;
+  m_point = NULL;
 }
 
 wxLineControlPoint::~wxLineControlPoint()
@@ -1770,7 +1774,7 @@ void wxLineShape::OnSizingDragLeft(wxControlPoint* pt, bool draw, double x, doub
 
   if (lpt->m_type == CONTROL_POINT_ENDPOINT_FROM || lpt->m_type == CONTROL_POINT_ENDPOINT_TO)
   {
-    lpt->SetX(x); lpt->SetY(y);
+//    lpt->SetX(x); lpt->SetY(y);
   }
 
 }
@@ -1785,6 +1789,7 @@ void wxLineShape::OnSizingBeginDragLeft(wxControlPoint* pt, double x, double y,
   wxLineShape *lineShape = (wxLineShape *)this;
   if (lpt->m_type == CONTROL_POINT_LINE)
   {
+    lpt->m_originalPos = * (lpt->m_point);
     m_canvas->Snap(&x, &y);
 
     this->Erase(dc);
@@ -1817,18 +1822,6 @@ void wxLineShape::OnSizingBeginDragLeft(wxControlPoint* pt, double x, double y,
 
   if (lpt->m_type == CONTROL_POINT_ENDPOINT_FROM || lpt->m_type == CONTROL_POINT_ENDPOINT_TO)
   {
-    lpt->Erase(dc);
-    lineShape->OnDraw(dc);
-    if (lpt->m_type == CONTROL_POINT_ENDPOINT_FROM)
-    {
-      lineShape->GetFrom()->OnDraw(dc);
-      lineShape->GetFrom()->OnDrawContents(dc);
-    }
-    else
-    {
-      lineShape->GetTo()->OnDraw(dc);
-      lineShape->GetTo()->OnDrawContents(dc);
-    }
     m_canvas->SetCursor(g_oglBullseyeCursor);
     lpt->m_oldCursor = wxSTANDARD_CURSOR;
   }
@@ -1848,19 +1841,26 @@ void wxLineShape::OnSizingEndDragLeft(wxControlPoint* pt, double x, double y, in
   {
     m_canvas->Snap(&x, &y);
 
-    dc.SetLogicalFunction(wxCOPY);
-    lpt->m_xpos = x; lpt->m_ypos = y;
-    lpt->m_point->x = x; lpt->m_point->y = y;
+    wxRealPoint pt = wxRealPoint(x, y);
+
+    // Move the control point back to where it was;
+    // MoveControlPoint will move it to the new position
+    // if it decides it wants. We only moved the position
+    // during user feedback so we could redraw the line
+    // as it changed shape.
+    lpt->m_xpos = lpt->m_originalPos.x; lpt->m_ypos = lpt->m_originalPos.y;
+    lpt->m_point->x = lpt->m_originalPos.x; lpt->m_point->y = lpt->m_originalPos.y;
 
-    lineShape->GetEventHandler()->OnMoveLink(dc);
+    OnMoveMiddleControlPoint(dc, lpt, pt);
   }
   if (lpt->m_type == CONTROL_POINT_ENDPOINT_FROM)
   {
     if (lpt->m_oldCursor)
       m_canvas->SetCursor(lpt->m_oldCursor);
-    this->Erase(dc);
 
-    lpt->m_xpos = x; lpt->m_ypos = y;
+//    this->Erase(dc);
+
+//    lpt->m_xpos = x; lpt->m_ypos = y;
 
     if (lineShape->GetFrom())
     {
@@ -1872,7 +1872,7 @@ void wxLineShape::OnSizingEndDragLeft(wxControlPoint* pt, double x, double y, in
     if (lpt->m_oldCursor)
       m_canvas->SetCursor(lpt->m_oldCursor);
 
-    lpt->m_xpos = x; lpt->m_ypos = y;
+//    lpt->m_xpos = x; lpt->m_ypos = y;
 
     if (lineShape->GetTo())
     {
@@ -1890,13 +1890,22 @@ void wxLineShape::OnSizingEndDragLeft(wxControlPoint* pt, double x, double y, in
   // N.B. in OnMoveControlPoint, an event handler in Hardy could have deselected
   // the line and therefore deleted 'this'. -> GPF, intermittently.
   // So assume at this point that we've been blown away.
-  wxLineShape *lineObj = lineShape;
-  wxShapeCanvas *objCanvas = m_canvas;
 
-  lineObj->OnMoveControlPoint(i+1, x, y);
+  lineShape->OnMoveControlPoint(i+1, x, y);
 #endif
 }
 
+// This is called only when a non-end control point is moved.
+bool wxLineShape::OnMoveMiddleControlPoint(wxDC& dc, wxLineControlPoint* lpt, const wxRealPoint& pt)
+{
+    lpt->m_xpos = pt.x; lpt->m_ypos = pt.y;
+    lpt->m_point->x = pt.x; lpt->m_point->y = pt.y;
+
+    GetEventHandler()->OnMoveLink(dc);
+
+    return TRUE;
+}
+
 // Implement movement of endpoint to a new attachment
 // OBSOLETE: done by dragging with the left button.
 
@@ -2394,6 +2403,12 @@ void wxArrowHead::SetSize(double size)
   }
 }
 
+// Can override this to create a different class of label shape
+wxLabelShape* wxLineShape::OnCreateLabelShape(wxLineShape *parent, wxShapeRegion *region, double w, double h)
+{
+    return new wxLabelShape(parent, region, w, h);
+}
+
 /*
  * Label object
  *
@@ -2456,14 +2471,19 @@ void wxLabelShape::OnEndDragLeft(double x, double y, int keys, int attachment)
 
 bool wxLabelShape::OnMovePre(wxDC& dc, double x, double y, double old_x, double old_y, bool display)
 {
-  m_shapeRegion->SetSize(m_width, m_height);
+    return m_lineShape->OnLabelMovePre(dc, this, x, y, old_x, old_y, display);
+}
+
+bool wxLineShape::OnLabelMovePre(wxDC& dc, wxLabelShape* labelShape, double x, double y, double old_x, double old_y, bool display)
+{
+  labelShape->m_shapeRegion->SetSize(labelShape->GetWidth(), labelShape->GetHeight());
 
   // Find position in line's region list
   int i = 0;
-  wxNode *node = m_lineShape->GetRegions().First();
+  wxNode *node = GetRegions().First();
   while (node)
   {
-    if (m_shapeRegion == (wxShapeRegion *)node->Data())
+    if (labelShape->m_shapeRegion == (wxShapeRegion *)node->Data())
       node = NULL;
     else
     {
@@ -2472,18 +2492,21 @@ bool wxLabelShape::OnMovePre(wxDC& dc, double x, double y, double old_x, double
     }
   }
   double xx, yy;
-  m_lineShape->GetLabelPosition(i, &xx, &yy);
+  GetLabelPosition(i, &xx, &yy);
   // Set the region's offset, relative to the default position for
   // each region.
-  m_shapeRegion->SetPosition((double)(x - xx), (double)(y - yy));
+  labelShape->m_shapeRegion->SetPosition((double)(x - xx), (double)(y - yy));
+
+  labelShape->SetX(x);
+  labelShape->SetY(y);
 
   // Need to reformat to fit region.
-  if (m_shapeRegion->GetText())
+  if (labelShape->m_shapeRegion->GetText())
   {
 
-    wxString s(m_shapeRegion->GetText());
-    m_lineShape->FormatText(dc, s, i);
-    m_lineShape->DrawRegion(dc, m_shapeRegion, xx, yy);
+    wxString s(labelShape->m_shapeRegion->GetText());
+    labelShape->FormatText(dc, s, i);
+    DrawRegion(dc, labelShape->m_shapeRegion, xx, yy);
   }
   return TRUE;
 }
index e15a64b93d51c6be5de3833d83dbed0fd84d650e..4b94a9c95bbb6c139ea8e9d47f15691257ec7d81 100644 (file)
@@ -88,6 +88,7 @@ class wxArrowHead: public wxObject
 };
 
 // Line object
+class wxLabelShape;
 class wxLineShape: public wxShape
 {
  DECLARE_DYNAMIC_CLASS(wxLineShape)
@@ -107,7 +108,9 @@ class wxLineShape: public wxShape
   void OnDrawControlPoints(wxDC& dc);
   void OnEraseControlPoints(wxDC& dc);
   void OnErase(wxDC& dc);
-  virtual inline void OnMoveControlPoint(int WXUNUSED(which), double WXUNUSED(x), double WXUNUSED(y)) {}
+  virtual bool OnMoveControlPoint(int WXUNUSED(which), double WXUNUSED(x), double WXUNUSED(y)) { return FALSE; }
+  virtual bool OnMoveMiddleControlPoint(wxDC& dc, wxLineControlPoint* lpt, const wxRealPoint& pt);
+  virtual bool OnLabelMovePre(wxDC& dc, wxLabelShape* labelShape, double x, double y, double old_x, double old_y, bool display);
   void OnDrawOutline(wxDC& dc, double x, double y, double w, double h);
   void GetBoundingBoxMin(double *w, double *h);
   void FormatText(wxDC& dc, const wxString& s, int regionId = 0);
@@ -139,8 +142,11 @@ class wxLineShape: public wxShape
   // position is 0 (middle), 1 (start), 2 (end)
   void GetLabelPosition(int position, double *x, double *y);
 
+  // Can override this to create a different class of label shape
+  virtual wxLabelShape* OnCreateLabelShape(wxLineShape *parent = NULL, wxShapeRegion *region = NULL, double w = 0.0, double h = 0.0);
+
   // Straighten verticals and horizontals
-  virtual void Straighten(wxDC& dc);
+  virtual void Straighten(wxDC* dc = NULL);
 
   // Not implemented
   inline void SetMaintainStraightLines(bool flag) { m_maintainStraightLines = flag; }
index 70b7026d74534df95e02445773bb3636ece0a6e7..383fe7f554a73ce46fb8893eca3cc046db3f8de3 100644 (file)
@@ -44,6 +44,7 @@ public:
 
   int           m_type;
   wxRealPoint*  m_point;  // Line point
+  wxRealPoint   m_originalPos;
 
 };
 
index 794590245494e213e9830d240ece68e44cf91dcd..c9acc471b1019d9949ee5406e64f7689da6d76d9 100644 (file)
@@ -51,7 +51,7 @@ CPPFLAGS=$(DEBUG_FLAGS) $(OPT) @$(CFG)
 CFLAGS=$(DEBUG_FLAGS) $(OPT) @$(CFG)
 
 OBJECTS = basic.obj basic2.obj canvas.obj ogldiag.obj lines.obj misc.obj divided.obj constrnt.obj\
- composit.obj drawn.obj bitmap.obj mfutils.obj
+ composit.obj drawn.obj bmpshape.obj mfutils.obj
 
 all:    $(OGLLIB)
 
index dfd5a0b159e569408f6bb0d4bbf81ec70e47e194..9a16cb591929693e987e49e6ef194b0774b2ba4a 100644 (file)
@@ -26,7 +26,7 @@ LOCALDOCDIR=$(WXDIR)\utils\ogl\docs
 PROGRAM=test
  
 OBJECTS = basic.obj basic2.obj canvas.obj ogldiag.obj lines.obj misc.obj divided.obj constrnt.obj\
- composit.obj drawn.obj bitmap.obj mfutils.obj
+ composit.obj drawn.obj bmpshape.obj mfutils.obj
 
 LIBTARGET=$(WXDIR)\lib\ogl.lib
 
@@ -104,7 +104,7 @@ drawn.obj:      drawn.$(SRCSUFF) basic.h misc.h canvas.h drawn.h drawnp.h basicp
 $(CPPFLAGS) /c /Tp $*.$(SRCSUFF)
 <<
 
-bitmap.obj:      bitmap.$(SRCSUFF) basic.h misc.h canvas.h bitmap.h
+bmpshape.obj:      bmpshape.$(SRCSUFF) basic.h misc.h canvas.h bmpshape.h
         cl @<<
 $(CPPFLAGS) /c /Tp $*.$(SRCSUFF)
 <<
index 60efe27a7d23f0dd486df65f6099431fc500a079..915c289e10296eb82791290ab4233ae6873c66d8 100644 (file)
@@ -400,6 +400,7 @@ void wxDiagram::ReadLines(wxExprDatabase& database)
       shape->Show(TRUE);
 
       OnShapeLoad(database, *shape, *clause);
+      shape->SetCanvas(GetCanvas());
 
       long image_to = -1; long image_from = -1;
       clause->GetAttributeValue("to", image_to);