This patch fixes the buglet where dragging a tab eradicated the associated
tab's leader.

Index: src/wp/ap/xp/ap_TopRuler.cpp
===================================================================
RCS file: /cvsroot/abi/src/wp/ap/xp/ap_TopRuler.cpp,v
retrieving revision 1.99
diff -u -r1.99 ap_TopRuler.cpp
--- src/wp/ap/xp/ap_TopRuler.cpp        2001/03/19 08:39:04     1.99
+++ src/wp/ap/xp/ap_TopRuler.cpp        2001/03/29 05:59:02
@@ -583,7 +583,8 @@
 void AP_TopRuler::_getTabStopXAnchor(AP_TopRulerInfo * pInfo,
                                                                                
UT_sint32 k,
                                                                                
UT_sint32 * pTab,
-                                                                               
eTabType & iType)
+                                                                               
+eTabType & iType,
+                                                                               
+eTabLeader & iLeader)
 {
        UT_sint32 xAbsLeft = _getFirstPixelInColumn(pInfo,pInfo->m_iCurrentColumn);
 
@@ -594,6 +595,7 @@
                // this is a new tab
                iPosition = m_dragStart;
                iType = m_draggingTabType;
+               iLeader = FL_LEADER_NONE;
        }
        else
        {
@@ -606,6 +608,7 @@
                UT_ASSERT(bRes);
                iPosition = TabInfo.getPosition();
                iType = TabInfo.getType();
+               iLeader = TabInfo.getLeader();
        }
 
        if (pTab)
@@ -635,12 +638,13 @@
        UT_sint32 anchor;
        UT_Rect rect;
        eTabType iType;
+       eTabLeader iLeader;
 
        if (m_draggingWhat == DW_TABSTOP)
        {
                // just deal with the tab being moved
 
-               _getTabStopXAnchor(pInfo, m_draggingTab, &anchor, iType);
+               _getTabStopXAnchor(pInfo, m_draggingTab, &anchor, iType, iLeader);
                _getTabStopRect(pInfo, anchor, &rect);
 
                _drawTabStop(rect, m_draggingTabType, false);
@@ -666,7 +670,7 @@
                                (m_draggingTab == (UT_sint32) i))
                                continue;
 
-                       _getTabStopXAnchor(pInfo, i, &anchor, iType);
+                       _getTabStopXAnchor(pInfo, i, &anchor, iType, iLeader);
                        _getTabStopRect(pInfo, anchor, &rect);
 
                        if (left < anchor)
@@ -704,7 +708,7 @@
 }
 
 UT_sint32 AP_TopRuler::_findTabStop(AP_TopRulerInfo * pInfo, 
-                                                                       UT_uint32 x, 
UT_uint32 y, eTabType & iType)
+                                                                       UT_uint32 x, 
+UT_uint32 y, eTabType & iType, eTabLeader & iLeader)
 {
        // hit-test all the existing tabs
        // return the index of the one found
@@ -714,7 +718,7 @@
 
        for (UT_sint32 i = 0; i < pInfo->m_iTabStops; i++)
        {
-               _getTabStopXAnchor(pInfo, i, &anchor, iType);
+               _getTabStopXAnchor(pInfo, i, &anchor, iType, iLeader);
                _getTabStopRect(pInfo, anchor, &rect);
 
                if (rect.containsPoint(x,y))
@@ -1099,7 +1103,8 @@
        // next hit-test against the tabs
 
        eTabType iType;
-       UT_sint32 iTab = _findTabStop(&m_infoCache, x, s_iFixedHeight/2 + 
s_iFixedHeight/4 - 3, iType);
+       eTabLeader iLeader;
+       UT_sint32 iTab = _findTabStop(&m_infoCache, x, s_iFixedHeight/2 + 
+s_iFixedHeight/4 - 3, iType, iLeader);
        if (iTab >= 0)
        {
                UT_DEBUGMSG(("hit tab %ld\n",iTab));
@@ -1107,6 +1112,7 @@
                m_draggingWhat = DW_TABSTOP;
                m_draggingTab = iTab;
                m_draggingTabType = iType;
+               m_draggingTabLeader = iLeader;
                m_dragStart = 0;
                m_bBeforeFirstMotion = true;
                return;
@@ -1193,6 +1199,7 @@
                m_draggingWhat = DW_TABSTOP;
                m_draggingTab = tr_TABINDEX_NEW;
                m_draggingTabType = m_iDefaultTabType;
+               m_draggingTabLeader = FL_LEADER_NONE;
                m_bBeforeFirstMotion = true;
 
                // this is a new widget, so it needs more work to get started
@@ -1415,19 +1422,20 @@
        case DW_TABSTOP:
                {
                                eTabType iType;
+                       eTabLeader iLeader;
 
-                       UT_sint32 iTab = _findTabStop(&m_infoCache, xgrid+xAbsLeft, 
s_iFixedHeight/2 + s_iFixedHeight/4 - 3, iType);
+                       UT_sint32 iTab = _findTabStop(&m_infoCache, xgrid+xAbsLeft, 
+s_iFixedHeight/2 + s_iFixedHeight/4 - 3, iType, iLeader);
                        
                        UT_DEBUGMSG (("iTab: %i, m_draggingTab: %i\n", iTab, 
m_draggingTab));
                        
                        if (iTab >= 0 && iTab != m_draggingTab)
                        {
                                UT_DEBUGMSG (("This tab was released over an existing 
tab. It will be deleted.\n"));
-                               _setTabStops(tick, m_draggingTab, true); // true for 
the last arg will cause this to be deleted
+                               _setTabStops(tick, m_draggingTab, iLeader, true); // 
+true for the last arg will cause this to be deleted
                        }
                        else
                        {
-                               _setTabStops(tick, iTab, false);
+                               _setTabStops(tick, iTab, iLeader, false);
                        }
                        m_draggingWhat = DW_NOTHING;
                        return;
@@ -1439,7 +1447,7 @@
        }
 }
 
-void AP_TopRuler::_setTabStops(ap_RulerTicks tick, UT_sint32 iTab, bool bDelete)
+void AP_TopRuler::_setTabStops(ap_RulerTicks tick, UT_sint32 iTab, eTabLeader 
+iLeader, bool bDelete)
 {
        UT_sint32 xAbsLeft = 
_getFirstPixelInColumn(&m_infoCache,m_infoCache.m_iCurrentColumn);
        double dxrel = _scalePixelDistanceToUnits(m_draggingCenter-xAbsLeft,tick);
@@ -1450,7 +1458,9 @@
                
        if (!bDelete)
        {
-               char * sz = NULL;
+               char * sz = NULL, sz1[2];
+               sz1[0] = (char)iLeader + '0'; sz1[1] = 0;
+
                switch(m_draggingTabType)
                {
                        case FL_TAB_LEFT:               sz = "L";       break;
@@ -1464,6 +1474,7 @@
                buf += m_pG->invertDimension(tick.dimType,dxrel);
                buf += "/";
                buf += sz;
+               buf += sz1;
        }
 
        // then append all the remaining tabstops, if any
@@ -2076,7 +2087,7 @@
                        // delete the tab
                        m_draggingWhat = dw;
                        ap_RulerTicks tick(m_pG,m_dim);
-                       _setTabStops(tick, tr_TABINDEX_NONE, true);
+                       _setTabStops(tick, tr_TABINDEX_NONE, FL_LEADER_NONE, true);
                }
                break;
 
Index: src/wp/ap/xp/ap_TopRuler.h
===================================================================
RCS file: /cvsroot/abi/src/wp/ap/xp/ap_TopRuler.h,v
retrieving revision 1.46
diff -u -r1.46 ap_TopRuler.h
--- src/wp/ap/xp/ap_TopRuler.h  2001/02/06 22:54:58     1.46
+++ src/wp/ap/xp/ap_TopRuler.h  2001/03/29 05:59:02
@@ -157,16 +157,16 @@
        void    _getTabToggleRect(UT_Rect * prToggle);
        void    _drawTabToggle(const UT_Rect * pClipRect, bool bErase);
 
-       void    _getTabStopXAnchor(AP_TopRulerInfo * pInfo, UT_sint32 k, UT_sint32 * 
pTab, eTabType & iType);
+       void    _getTabStopXAnchor(AP_TopRulerInfo * pInfo, UT_sint32 k, UT_sint32 * 
+pTab, eTabType & iType, eTabLeader & iLeader);
        void    _getTabStopRect(AP_TopRulerInfo * pInfo, UT_sint32 anchor, UT_Rect * 
pRect);
        void    _drawTabProperties(const UT_Rect * pClipRect,
                                                                   AP_TopRulerInfo * 
pInfo,
                                                                   bool bDrawAll = 
true);
 
-       UT_sint32               _findTabStop(AP_TopRulerInfo * pInfo, UT_uint32 x, 
UT_uint32 y, eTabType & iType);
+       UT_sint32               _findTabStop(AP_TopRulerInfo * pInfo, UT_uint32 x, 
+UT_uint32 y, eTabType & iType, eTabLeader & iLeader);
        const char *    _getTabStopString(AP_TopRulerInfo * pInfo, UT_sint32 k);
        void                    _getTabZoneRect(AP_TopRulerInfo * pInfo, UT_Rect 
&rZone);
-       void                    _setTabStops(ap_RulerTicks tick, UT_sint32 iTab, bool 
bDelete);
+       void                    _setTabStops(ap_RulerTicks tick, UT_sint32 iTab, 
+eTabLeader iLeader, bool bDelete);
 
        UT_sint32       _getColumnMarkerXRightEnd(AP_TopRulerInfo * pInfo, UT_uint32 
kCol);
        void            _getColumnMarkerRect(AP_TopRulerInfo * pInfo, UT_uint32 kCol, 
UT_sint32 xCenter,
@@ -238,6 +238,7 @@
        UT_Rect                         m_dragging2Rect; /* rect of drag-along */
        UT_sint32                       m_draggingTab;  /* index of tab being dragged 
*/
        eTabType                        m_draggingTabType;
+       eTabLeader                      m_draggingTabLeader;
        UT_sint32                       m_dragStart;
        bool                            m_bBeforeFirstMotion;
 


Reply via email to