Subject: Re: buglet patch
From: Patrick Lam (plam@plam.lcs.mit.edu)
Date: Thu Mar 29 2001 - 02:22:57 CST
On Thu, 29 Mar 2001, Martin Sevior wrote:
> 
> Hi Patrick,
> 	  Unfortunately this patch makes tab leaders turn into an
> underscore when you drag it.
G'day,
Looks like I missed 0.7.14 anyway.
Actually the problem was that I used the wrong leader for the new leader
created from the dragging.  From the previous patch, you need only change
line 1438 from iLeader to m_draggingTabLeader.  I'll include a new patch
too.
[and i had trouble testing this patch because i upgraded my kernel from
2.4.0 to 2.4.2, putting the build in a new place...]
pat
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 08:25:35
@@ -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,14 +1103,16 @@
         // 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));
+		UT_DEBUGMSG(("hit tab %ld with leader %d\n",iTab, iLeader));
                 m_bValidMouseClick = true;
                 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, m_draggingTabLeader, 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 08:25:38
@@ -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;
 
This archive was generated by hypermail 2b25 : Thu Mar 29 2001 - 02:29:27 CST