summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authortreectrl <treectrl>2006-10-26 02:56:54 (GMT)
committertreectrl <treectrl>2006-10-26 02:56:54 (GMT)
commit81812c37de967b7d55dd0f037354e0cecf0be69f (patch)
tree3912f7c909743549f9bfffe6363202d46c3d55ee
parent49103fe904265c3fd015426123f1bc7c1aae4127 (diff)
downloadtktreectrl-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.c110
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;