]> git.saurik.com Git - wxWidgets.git/commitdiff
Merged in from Mahogany. A bit better and safer.
authorKarsten Ballüder <ballueder@usa.net>
Tue, 18 May 1999 15:05:29 +0000 (15:05 +0000)
committerKarsten Ballüder <ballueder@usa.net>
Tue, 18 May 1999 15:05:29 +0000 (15:05 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@2497 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

user/wxLayout/TODO
user/wxLayout/wxllist.cpp
user/wxLayout/wxllist.h
user/wxLayout/wxlwindow.cpp
user/wxLayout/wxlwindow.h

index 932d6e93d47953955f20555da983ac5437d4cdbd..6d3df47b67b558b4455ad277b9e3716d2aef4d9b 100644 (file)
@@ -18,10 +18,13 @@ TODO
 
   - UNDO!!
   - replacement of llist in window
 
   - UNDO!!
   - replacement of llist in window
+  - selection highlighting is a bit broken
+Improve speed! (See layout problem below!)
 
 The following two probs can probably be fixed by adding the
 RecalculateLayout() method:
 
 The following two probs can probably be fixed by adding the
 RecalculateLayout() method:
- Funny re-layout shows again in sample text.
+Funny re-layout shows again in sample text.
+(Gone after calling layout for all objects before drawing one.)
  Printing works again, but layout at begin of new page is corrupted.
 
 
  Printing works again, but layout at begin of new page is corrupted.
 
 
index 9c687de6d923a33c9c38e0b45521aaf78b814db4..548e6dc268aa94c60569e8a507aa934d53cb8839 100644 (file)
@@ -598,6 +598,11 @@ wxLayoutLine::RecalculatePosition(wxLayoutList *llist)
 void
 wxLayoutLine::RecalculatePositions(int recurse, wxLayoutList *llist)
 {
 void
 wxLayoutLine::RecalculatePositions(int recurse, wxLayoutList *llist)
 {
+   //FIXME: is this really needed? We run Layout() anyway.
+   // Recursing here, drives computation time up exponentially, as
+   // each line will cause all following lines to be recalculated.
+   return;
+   
    wxASSERT(recurse >= 0);
    wxPoint pos = m_Position;
    CoordType height = m_Height;
    wxASSERT(recurse >= 0);
    wxPoint pos = m_Position;
    CoordType height = m_Height;
@@ -1243,7 +1248,8 @@ wxLayoutLine::Copy(wxLayoutList *llist,
    CoordType firstOffset, lastOffset;
 
    if(to == -1) to = GetLength();
    CoordType firstOffset, lastOffset;
 
    if(to == -1) to = GetLength();
-   
+   if(from == to) return;
+      
    wxLOiterator first = FindObject(from, &firstOffset);
    wxLOiterator last  = FindObject(to, &lastOffset);
 
    wxLOiterator first = FindObject(from, &firstOffset);
    wxLOiterator last  = FindObject(to, &lastOffset);
 
@@ -1562,6 +1568,7 @@ bool
 wxLayoutList::Insert(wxLayoutObject *obj)
 {
    wxASSERT(m_CursorLine);
 wxLayoutList::Insert(wxLayoutObject *obj)
 {
    wxASSERT(m_CursorLine);
+   if(! m_CursorLine) m_CursorLine = GetFirstLine();
    SetUpdateRect(m_CursorScreenPos);
    SetUpdateRect(m_CursorScreenPos+m_CursorSize);
    m_CursorLine->Insert(m_CursorPos.x, obj);
    SetUpdateRect(m_CursorScreenPos);
    SetUpdateRect(m_CursorScreenPos+m_CursorSize);
    m_CursorLine->Insert(m_CursorPos.x, obj);
index 7edbcbbdff0e06c9861b3ded03548b06e22131da..267447465ad477f727b12d6b5897c77854b1dcb0 100644 (file)
@@ -99,10 +99,13 @@ public:
    struct UserData
    {
       UserData() { m_refcount = 1; }
    struct UserData
    {
       UserData() { m_refcount = 1; }
-      void IncRef(void) { m_refcount++; }
-      void DecRef(void) { m_refcount--; if(m_refcount == 0) delete this;}
+      inline void IncRef(void) { m_refcount++; }
+      inline void DecRef(void) { m_refcount--; if(m_refcount == 0) delete this;}
+      inline void SetLabel(const wxString &l) { m_label = l; }
+      inline const wxString & GetLabel(void) const { return m_label; }
    private:
       int m_refcount;
    private:
       int m_refcount;
+      wxString m_label;
    protected:
       virtual ~UserData() { wxASSERT(m_refcount == 0); }
       /// prevents gcc from generating stupid warnings
    protected:
       virtual ~UserData() { wxASSERT(m_refcount == 0); }
       /// prevents gcc from generating stupid warnings
@@ -161,6 +164,7 @@ public:
 
    /** Tells the object about some user data. This data is associated
        with the object and will be deleted at destruction time.
 
    /** Tells the object about some user data. This data is associated
        with the object and will be deleted at destruction time.
+       It is reference counted.
    */
    void   SetUserData(UserData *data)
       {
    */
    void   SetUserData(UserData *data)
       {
@@ -171,8 +175,11 @@ public:
             m_UserData->IncRef();
       }
    
             m_UserData->IncRef();
       }
    
-   /** Return the user data. */
-   void * GetUserData(void) const { if(m_UserData) m_UserData->IncRef(); return m_UserData; }
+   /** Return the user data.
+    Increments the object's reference count. When no longer needed,
+    caller must call DecRef() on the pointer returned.
+   */
+   UserData * GetUserData(void) const { if(m_UserData) m_UserData->IncRef(); return m_UserData; }
 
    /** Makes a copy of this object.
     */
 
    /** Makes a copy of this object.
     */
@@ -745,8 +752,8 @@ public:
       { MoveCursorHorizontally(-m_CursorPos.x); }
 
    /// Returns current cursor position.
       { MoveCursorHorizontally(-m_CursorPos.x); }
 
    /// Returns current cursor position.
-   wxPoint GetCursorPos(wxDC &dc) const { return m_CursorPos; }
-   wxPoint GetCursorPos() const { return m_CursorPos; }
+   const wxPoint &GetCursorPos(wxDC &dc) const { return m_CursorPos; }
+   const wxPoint &GetCursorPos() const { return m_CursorPos; }
    
    //@}
 
    
    //@}
 
index cc63534cb7654499e71aee39cd813400a0a01cf1..80d47b9f80f22cdec0c321fc73341c77876b87e0 100644 (file)
@@ -75,6 +75,7 @@ wxLayoutWindow::wxLayoutWindow(wxWindow *parent)
                       wxHSCROLL | wxVSCROLL | wxBORDER)
 
 {
                       wxHSCROLL | wxVSCROLL | wxBORDER)
 
 {
+   SetStatusBar(NULL); // don't use statusbar
    m_Editable = false;
    m_doSendEvents = false;
    m_ViewStartX = 0; m_ViewStartY = 0;
    m_Editable = false;
    m_doSendEvents = false;
    m_ViewStartX = 0; m_ViewStartY = 0;
@@ -160,23 +161,33 @@ wxLayoutWindow::OnMouse(int eventId, wxMouseEvent& event)
    bool found;
    wxLayoutObject *obj = m_llist->FindObjectScreen(dc, findPos,
                                                    &cursorPos, &found);
    bool found;
    wxLayoutObject *obj = m_llist->FindObjectScreen(dc, findPos,
                                                    &cursorPos, &found);
+   wxLayoutObject::UserData *u = obj ? obj->GetUserData() : NULL;
 
    //has the mouse only been moved?
    if(eventId == WXLOWIN_MENU_MOUSEMOVE)
    {
       // found is only true if we are really over an object, not just
       // behind it
 
    //has the mouse only been moved?
    if(eventId == WXLOWIN_MENU_MOUSEMOVE)
    {
       // found is only true if we are really over an object, not just
       // behind it
-      if(found && obj && obj->GetUserData() != NULL)
+      if(found && u)
       {
          if(!m_HandCursor)
             SetCursor(wxCURSOR_HAND);
          m_HandCursor = TRUE;
       {
          if(!m_HandCursor)
             SetCursor(wxCURSOR_HAND);
          m_HandCursor = TRUE;
+         if(m_StatusBar && m_StatusFieldLabel != -1) 
+         {
+            const wxString &label = u->GetLabel();
+            if(label.Length())
+               m_StatusBar->SetStatusText(label,
+                                          m_StatusFieldLabel);
+         }
       }
       else
       {
          if(m_HandCursor)
             SetCursor(wxCURSOR_IBEAM);
          m_HandCursor = FALSE;
       }
       else
       {
          if(m_HandCursor)
             SetCursor(wxCURSOR_IBEAM);
          m_HandCursor = FALSE;
+         if(m_StatusBar && m_StatusFieldLabel != -1) 
+            m_StatusBar->SetStatusText("", m_StatusFieldLabel);
       }
       if(event.LeftIsDown())
       {
       }
       if(event.LeftIsDown())
       {
@@ -198,6 +209,7 @@ wxLayoutWindow::OnMouse(int eventId, wxMouseEvent& event)
          m_Selecting = false;
          DoPaint(FALSE); 
       }
          m_Selecting = false;
          DoPaint(FALSE); 
       }
+      if(u) u->DecRef();
       return;
    }
 
       return;
    }
 
@@ -210,18 +222,24 @@ wxLayoutWindow::OnMouse(int eventId, wxMouseEvent& event)
       ScrollToCursor();
       DoPaint(FALSE); // DoPaint suppresses flicker under GTK
    }
       ScrollToCursor();
       DoPaint(FALSE); // DoPaint suppresses flicker under GTK
    }
+
    if(!m_doSendEvents) // nothing to do
    if(!m_doSendEvents) // nothing to do
+   {
+      if(u) u->DecRef();
       return;
       return;
+   }
 
    // only do the menu if activated, editable and not on a clickable object
    if(eventId == WXLOWIN_MENU_RCLICK
       && IsEditable()
 
    // only do the menu if activated, editable and not on a clickable object
    if(eventId == WXLOWIN_MENU_RCLICK
       && IsEditable()
-      && (! obj || (obj && obj->GetUserData() == NULL))
-      )
+      && (! obj || u == NULL))
    {
       PopupMenu(m_PopupMenu, m_ClickPosition.x, m_ClickPosition.y);
    {
       PopupMenu(m_PopupMenu, m_ClickPosition.x, m_ClickPosition.y);
+      if(u) u->DecRef();
       return;
    }
       return;
    }
+
+   if(u) u->DecRef();
    // find the object at this position
    if(obj)
    {
    // find the object at this position
    if(obj)
    {
@@ -412,7 +430,10 @@ void
 wxLayoutWindow::OnKeyUp(wxKeyEvent& event)
 {
    if(event.KeyCode() == WXK_SHIFT && m_llist->IsSelecting())
 wxLayoutWindow::OnKeyUp(wxKeyEvent& event)
 {
    if(event.KeyCode() == WXK_SHIFT && m_llist->IsSelecting())
+   {
       m_llist->EndSelection();
       m_llist->EndSelection();
+      m_Selecting = false;
+   }
    event.Skip();
 }
 
    event.Skip();
 }
 
@@ -605,6 +626,12 @@ wxLayoutWindow::InternalPaint(const wxRect *updateRect)
 
    ResetDirty();
    m_ScrollToCursor = false;
 
    ResetDirty();
    m_ScrollToCursor = false;
+   if(m_StatusBar && m_StatusFieldCursor != -1) 
+   {
+      wxString label;
+      label.Printf(_("L:%d C:%d"), m_llist->GetCursorPos().x+1, m_llist->GetCursorPos().y+1);
+      m_StatusBar->SetStatusText(label, m_StatusFieldCursor);
+   }
 }
 
 // change the range and position of scrollbars
 }
 
 // change the range and position of scrollbars
index fd913824c8c0443d0d494d4409444f0abf63682b..ead3310cf7147b2587ac31a551dee4f5898353c0 100644 (file)
@@ -163,7 +163,19 @@ public:
    bool IsModified(void) const { return m_Modified; }
    /// Mark list as modified or unchanged.
    void SetModified(bool modified = true) { m_Modified = modified; }
    bool IsModified(void) const { return m_Modified; }
    /// Mark list as modified or unchanged.
    void SetModified(bool modified = true) { m_Modified = modified; }
-
+   /** Tell window to update a wxStatusBar with UserData labels and
+       cursor positions.
+       @param bar wxStatusBar pointer
+       @param labelfield field to use in statusbar for URLs/userdata labels, or -1 to disable
+       @param cursorfield field to use for cursor position, or -1 to disable
+   */
+   inline SetStatusBar(class wxStatusBar *bar,
+                       int labelfield = -1,
+                       int cursorfield = -1)
+      {
+         m_StatusBar = bar; m_StatusFieldLabel = labelfield;
+         m_StatusFieldCursor = cursorfield;
+      }
 protected:   
    /// generic function for mouse events processing
    void OnMouse(int eventId, wxMouseEvent& event);
 protected:   
    /// generic function for mouse events processing
    void OnMouse(int eventId, wxMouseEvent& event);
@@ -211,6 +223,12 @@ private:
    wxMemoryDC  *m_memDC;
    wxBitmap    *m_bitmap;
    wxPoint      m_bitmapSize;
    wxMemoryDC  *m_memDC;
    wxBitmap    *m_bitmap;
    wxPoint      m_bitmapSize;
+   /// A frame's statusbar to update
+   class wxStatusBar *m_StatusBar;
+   /// statusbar field for labels
+   int          m_StatusFieldLabel;
+   /// statusbar field for cursor positions
+   int          m_StatusFieldCursor;
    /// a pointer to a bitmap for the background
    wxBitmap    *m_BGbitmap;
    DECLARE_EVENT_TABLE()
    /// a pointer to a bitmap for the background
    wxBitmap    *m_BGbitmap;
    DECLARE_EVENT_TABLE()