diff options
author | treectrl <treectrl> | 2006-10-26 02:56:54 (GMT) |
---|---|---|
committer | treectrl <treectrl> | 2006-10-26 02:56:54 (GMT) |
commit | 81812c37de967b7d55dd0f037354e0cecf0be69f (patch) | |
tree | 3912f7c909743549f9bfffe6363202d46c3d55ee | |
parent | 49103fe904265c3fd015426123f1bc7c1aae4127 (diff) | |
download | tktreectrl-81812c37de967b7d55dd0f037354e0cecf0be69f.zip tktreectrl-81812c37de967b7d55dd0f037354e0cecf0be69f.tar.gz tktreectrl-81812c37de967b7d55dd0f037354e0cecf0be69f.tar.bz2 |
Column description of "all" doesn't return the tail column if the command prohibits the tail.
Fixed crash with "range a b" when a or b was the tail column.
-rw-r--r-- | generic/tkTreeColumn.c | 110 |
1 files changed, 57 insertions, 53 deletions
diff --git a/generic/tkTreeColumn.c b/generic/tkTreeColumn.c index a13f348..ec67b36 100644 --- a/generic/tkTreeColumn.c +++ b/generic/tkTreeColumn.c @@ -7,7 +7,7 @@ * Copyright (c) 2002-2003 Christian Krone * Copyright (c) 2003 ActiveState Corporation * - * RCS: @(#) $Id: tkTreeColumn.c,v 1.46 2006/10/16 01:18:37 treectrl Exp $ + * RCS: @(#) $Id: tkTreeColumn.c,v 1.47 2006/10/26 02:56:54 treectrl Exp $ */ #include "tkTreeCtrl.h" @@ -607,6 +607,45 @@ Column_MakeState( return state; } +/* + *---------------------------------------------------------------------- + * + * TreeColumn_FirstAndLast -- + * + * Determine the order of two columns and swap them if needed. + * + * Results: + * The return value is the number of columns in the range between + * first and last. + * + * Side effects: + * None. + * + *---------------------------------------------------------------------- + */ + +int +TreeColumn_FirstAndLast( + TreeColumn *first, /* Column token. */ + TreeColumn *last /* Column token. */ + ) +{ + int indexFirst, indexLast, index; + + indexFirst = TreeColumn_Index(*first); + indexLast = TreeColumn_Index(*last); + if (indexFirst > indexLast) { + TreeColumn column = *first; + *first = *last; + *last = column; + + index = indexFirst; + indexFirst = indexLast; + indexLast = index; + } + return indexLast - indexFirst + 1; +} + typedef struct Qualifiers { TreeCtrl *tree; int visible; /* 1 for -visible TRUE, @@ -852,6 +891,7 @@ Qualifiers_Free( * list listOfDescs * order N QUALIFIERS MODIFIERS * range first last QUALIFIERS + * tag tagExpr QUALIFIERS * tail * tree * @@ -960,7 +1000,8 @@ TreeColumnList_FromObj( } column = column->next; } - if (Qualifies(&q, (Column *) tree->columnTail)) { + if (!(flags & CFO_NOT_TAIL) && + Qualifies(&q, (Column *) tree->columnTail)) { TreeColumnList_Append(columns, tree->columnTail); } column = NULL; @@ -970,7 +1011,8 @@ TreeColumnList_FromObj( TreeColumnList_Append(columns, (TreeColumn) column); column = column->next; } - TreeColumnList_Append(columns, tree->columnTail); + if (!(flags & CFO_NOT_TAIL)) + TreeColumnList_Append(columns, tree->columnTail); column = NULL; } else { column = (Column *) COLUMN_ALL; @@ -1043,29 +1085,24 @@ TreeColumnList_FromObj( case INDEX_RANGE: { TreeColumn _first, _last; - Column *first, *last; if (TreeColumn_FromObj(tree, objv[listIndex + 1], &_first, CFO_NOT_NULL) != TCL_OK) goto errorExit; - first = (Column *) _first; if (TreeColumn_FromObj(tree, objv[listIndex + 2], &_last, CFO_NOT_NULL) != TCL_OK) goto errorExit; - last = (Column *) _last; - if (first->index > last->index) { - column = first; - first = last; - last = column; - } - column = first; + (void) TreeColumn_FirstAndLast(&_first, &_last); + column = (Column *) _first; while (1) { if (Qualifies(&q, column)) { TreeColumnList_Append(columns, column); } - if (column == last) + if (column == (Column *) _last) break; column = column->next; + if (column == NULL) + column = (Column *) tree->columnTail; } column = NULL; break; @@ -1319,45 +1356,6 @@ TreeColumn_FromObj( /* *---------------------------------------------------------------------- * - * TreeColumn_FirstAndLast -- - * - * Determine the order of two columns and swap them if needed. - * - * Results: - * The return value is the number of columns in the range between - * first and last. - * - * Side effects: - * None. - * - *---------------------------------------------------------------------- - */ - -int -TreeColumn_FirstAndLast( - TreeColumn *first, /* Column token. */ - TreeColumn *last /* Column token. */ - ) -{ - int indexFirst, indexLast, index; - - indexFirst = TreeColumn_Index(*first); - indexLast = TreeColumn_Index(*last); - if (indexFirst > indexLast) { - TreeColumn column = *first; - *first = *last; - *last = column; - - index = indexFirst; - indexFirst = indexLast; - indexLast = index; - } - return indexLast - indexFirst + 1; -} - -/* - *---------------------------------------------------------------------- - * * ColumnForEach_Start -- * * Begin iterating over items. A command might accept two column @@ -2026,7 +2024,13 @@ Column_Config( before = (Column *) tree->columnLockRight; break; case COLUMN_LOCK_NONE: - before = (Column *) tree->columnLockRight; + if (lock == COLUMN_LOCK_LEFT) { + before = (Column *) tree->columnLockNone; + if (before == NULL) + before = (Column *) tree->columnLockRight; + } + else + before = (Column *) tree->columnLockRight; break; case COLUMN_LOCK_RIGHT: before = (Column *) NULL; |