diff options
author | treectrl <treectrl> | 2002-12-29 02:32:26 (GMT) |
---|---|---|
committer | treectrl <treectrl> | 2002-12-29 02:32:26 (GMT) |
commit | 624b8670d37fad6c1d9f79233ff7ab611ce48851 (patch) | |
tree | 65a6c00ff9b2dd916597a31f2ff3840f4d047038 | |
parent | 4893494021918cf519b873efc538f4a858ab86a3 (diff) | |
download | tktreectrl-624b8670d37fad6c1d9f79233ff7ab611ce48851.zip tktreectrl-624b8670d37fad6c1d9f79233ff7ab611ce48851.tar.gz tktreectrl-624b8670d37fad6c1d9f79233ff7ab611ce48851.tar.bz2 |
Fix increment calculations when tree has zero height or width.
-rw-r--r-- | generic/tkTreeDisplay.c | 53 |
1 files changed, 35 insertions, 18 deletions
diff --git a/generic/tkTreeDisplay.c b/generic/tkTreeDisplay.c index 337d756..f1dbb53 100644 --- a/generic/tkTreeDisplay.c +++ b/generic/tkTreeDisplay.c @@ -603,12 +603,21 @@ Range *Range_UnderPoint(TreeCtrl *tree, int *x_, int *y_, int nearest) RItem *Range_ItemUnderPoint(TreeCtrl *tree, Range *range, int *x_, int *y_) { RItem *rItem; - int x = (*x_), y = (*y_); + int x = -666, y = -666; int i, l, u; - /* x and y must be in Range */ - if (x < 0 || x >= range->totalWidth || y < 0 || y >= range->totalHeight) - goto panicNow; + if (x_ != NULL) + { + x = (*x_); + if (x < 0 || x >= range->totalWidth) + goto panicNow; + } + if (y_ != NULL) + { + y = (*y_); + if (y < 0 || y >= range->totalHeight) + goto panicNow; + } #if 1 if (tree->vertical) @@ -623,8 +632,8 @@ RItem *Range_ItemUnderPoint(TreeCtrl *tree, Range *range, int *x_, int *y_) if ((y >= rItem->offset) && (y < rItem->offset + rItem->size)) { /* Range -> item coords */ - (*x_) = x; - (*y_) = y - rItem->offset; + if (x_ != NULL) (*x_) = x; + if (y_ != NULL) (*y_) = y - rItem->offset; return rItem; } if (y < rItem->offset) @@ -645,8 +654,8 @@ RItem *Range_ItemUnderPoint(TreeCtrl *tree, Range *range, int *x_, int *y_) if ((x >= rItem->offset) && (x < rItem->offset + rItem->size)) { /* Range -> item coords */ - (*x_) = x - rItem->offset; - (*y_) = y; + if (x_ != NULL) (*x_) = x - rItem->offset; + if (y_ != NULL) (*y_) = y; return rItem; } if (x < rItem->offset) @@ -753,10 +762,10 @@ static void Increment_RedoX(TreeCtrl *tree) RItem *rItem; int visWidth = Tk_Width(tree->tkwin) - tree->inset * 2; int totalWidth = Tree_TotalWidth(tree); - int x1, x2, x, y; + int x1, x2, x; int size; - if (dInfo->rangeFirst == NULL) + if (totalWidth <= 0 /* dInfo->rangeFirst == NULL */) return; /* First increment is zero */ @@ -777,8 +786,7 @@ static void Increment_RedoX(TreeCtrl *tree) /* Find RItem whose right side is >= x1 by smallest amount */ x = x1; - y = 0; - rItem = Range_ItemUnderPoint(tree, range, &x, &y); + rItem = Range_ItemUnderPoint(tree, range, &x, NULL); if (rItem->offset + rItem->size < x2) x2 = rItem->offset + rItem->size; } @@ -804,10 +812,10 @@ static void Increment_RedoY(TreeCtrl *tree) int topInset = tree->inset + Tree_HeaderHeight(tree); int visHeight = Tk_Height(tree->tkwin) - topInset - tree->inset; int totalHeight = Tree_TotalHeight(tree); - int y1, y2, x, y; + int y1, y2, y; int size; - if (dInfo->rangeFirst == NULL) + if (totalHeight <= 0 /* dInfo->rangeFirst == NULL */) return; /* First increment is zero */ @@ -827,9 +835,8 @@ static void Increment_RedoY(TreeCtrl *tree) continue; /* Find RItem whose bottom edge is >= y1 by smallest amount */ - x = 0; y = y1; - rItem = Range_ItemUnderPoint(tree, range, &x, &y); + rItem = Range_ItemUnderPoint(tree, range, NULL, &y); if (rItem->offset + rItem->size < y2) y2 = rItem->offset + rItem->size; } @@ -3602,11 +3609,12 @@ void DumpDInfo(TreeCtrl *tree) DInfo *dInfo = (DInfo *) tree->dInfo; DItem *dItem; Range *range; + RItem *rItem; - dbwin("DumpDInfo: itemW,H %d,%d totalW,H %d,%d flags %0x\n", + dbwin("DumpDInfo: itemW,H %d,%d totalW,H %d,%d flags 0x%0x vertical %d itemVisCount %d\n", dInfo->itemWidth, dInfo->itemHeight, dInfo->totalWidth, dInfo->totalHeight, - dInfo->flags); + dInfo->flags, tree->vertical, tree->itemVisCount); dItem = dInfo->dItem; while (dItem != NULL) { @@ -3643,6 +3651,15 @@ void DumpDInfo(TreeCtrl *tree) dbwin(" Range: first %p last %p totalW,H %d,%d offset %d\n", range->first, range->last, range->totalWidth, range->totalHeight, range->offset); + rItem = range->first; + while (1) + { + dbwin(" RItem: item %d index %d offset %d size %d\n", + TreeItem_GetID(tree, rItem->item), rItem->index, rItem->offset, rItem->size); + if (rItem == range->last) + break; + rItem++; + } } } |