summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authortreectrl <treectrl>2005-05-22 18:42:54 (GMT)
committertreectrl <treectrl>2005-05-22 18:42:54 (GMT)
commit4c62386a1afcaa56066e1ded772210f6cfaea9a2 (patch)
treee7f09dc9ee3d54edf01d84bc2b68f03f2f7dad93
parent51cdb7968ea6a3887adbb9565c3c652b67594291 (diff)
downloadtktreectrl-4c62386a1afcaa56066e1ded772210f6cfaea9a2.zip
tktreectrl-4c62386a1afcaa56066e1ded772210f6cfaea9a2.tar.gz
tktreectrl-4c62386a1afcaa56066e1ded772210f6cfaea9a2.tar.bz2
Added -resize option.
Numerous hacks under OSX/Aqua to let Appearance Manager draw the sort arrow.
-rw-r--r--generic/tkTreeColumn.c88
1 files changed, 82 insertions, 6 deletions
diff --git a/generic/tkTreeColumn.c b/generic/tkTreeColumn.c
index e06f951..cef7f2b 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.25 2005/05/21 19:36:30 treectrl Exp $
+ * RCS: @(#) $Id: tkTreeColumn.c,v 1.26 2005/05/22 18:42:54 treectrl Exp $
*/
#include "tkTreeCtrl.h"
@@ -36,6 +36,7 @@ struct Column
int expand; /* -expand */
int squeeze; /* -squeeze */
int visible; /* -visible */
+ int resize; /* -resize */
char *tag; /* -tag */
char *imageString; /* -image */
PerStateInfo arrowBitmap; /* -arrowbitmap */
@@ -189,6 +190,8 @@ static Tk_OptionSpec columnSpecs[] = {
(char *) NULL, Tk_Offset(Column, minWidthObj),
Tk_Offset(Column, minWidth),
TK_OPTION_NULL_OK, (ClientData) NULL, COLU_CONF_TWIDTH},
+ {TK_OPTION_BOOLEAN, "-resize", (char *) NULL, (char *) NULL,
+ "1", -1, Tk_Offset(Column, resize), 0, (ClientData) NULL, 0},
{TK_OPTION_BOOLEAN, "-squeeze", (char *) NULL, (char *) NULL,
"0", -1, Tk_Offset(Column, squeeze),
0, (ClientData) NULL, COLU_CONF_TWIDTH},
@@ -1237,12 +1240,30 @@ struct LayoutPart
static void Column_DoLayoutH(Column *column, struct Layout *layout)
{
+#if defined(MAC_OSX_TK)
+ TreeCtrl *tree = column->tree;
+#endif
struct LayoutPart *parts[3];
struct LayoutPart partArrow, partImage, partText;
int i, padList[4], widthList[3], n = 0;
int iArrow = -1, iImage = -1, iText = -1;
int left, right;
int widthForText = 0;
+#if defined(MAC_OSX_TK)
+ int margins[4];
+ int arrow = column->arrow;
+ int arrowSide = column->arrowSide;
+ int arrowGravity = column->arrowGravity;
+#endif
+
+#if defined(MAC_OSX_TK)
+ /* Under Aqua, we let the Appearance Manager draw the sort arrow */
+ if (tree->useTheme) {
+ column->arrow = ARROW_NONE;
+ column->arrowSide = SIDE_RIGHT;
+ column->arrowGravity = SIDE_RIGHT;
+ }
+#endif
if (column->arrow != ARROW_NONE) {
Column_GetArrowSize(column, &partArrow.width, &partArrow.height);
@@ -1338,6 +1359,26 @@ static void Column_DoLayoutH(Column *column, struct Layout *layout)
iArrow = n++;
}
+#if defined(MAC_OSX_TK)
+ /* Under Aqua, we let the Appearance Manager draw the sort arrow */
+ /* This code assumes the arrow is on the right */
+ if (tree->useTheme && (arrow != ARROW_NONE)) {
+ if (TreeTheme_GetHeaderContentMargins(tree, column->state,
+ arrow, margins) == TCL_OK) {
+ parts[n] = &partArrow;
+ partArrow.width = margins[2];
+ padList[n] = MAX(0, padList[n]); /* ignore -arrowpadx */
+ padList[n + 1] = 0;
+ iArrow = n++;
+ }
+ }
+ if (n == 0) {
+ column->arrow = arrow;
+ column->arrowSide = arrowSide;
+ column->arrowGravity = arrowGravity;
+ }
+#endif
+
if (n == 0)
return;
@@ -1495,6 +1536,13 @@ finish:
layout->textLeft = partText.left;
layout->textWidth = partText.width;
}
+
+#if defined(MAC_OSX_TK)
+ /* Under Aqua, we let the Appearance Manager draw the sort arrow */
+ column->arrow = arrow;
+ column->arrowSide = arrowSide;
+ column->arrowGravity = arrowGravity;
+#endif
}
int TreeColumn_NeededWidth(TreeColumn column_)
@@ -1503,6 +1551,10 @@ int TreeColumn_NeededWidth(TreeColumn column_)
TreeCtrl *tree = column->tree;
int i, widthList[3], padList[4], n = 0;
int arrowWidth, arrowHeight;
+#if defined(MAC_OSX_TK)
+ int margins[4];
+ int arrow = column->arrow;
+#endif
if (column->neededWidth >= 0)
return column->neededWidth;
@@ -1510,6 +1562,12 @@ int TreeColumn_NeededWidth(TreeColumn column_)
for (i = 0; i < 3; i++) widthList[i] = 0;
for (i = 0; i < 4; i++) padList[i] = 0;
+#if defined(MAC_OSX_TK)
+ /* Under OSX we let the Appearance Manager draw the sort arrow. */
+ if (tree->useTheme)
+ column->arrow = ARROW_NONE;
+#endif
+
if (column->arrow != ARROW_NONE)
Column_GetArrowSize(column, &arrowWidth, &arrowHeight);
if ((column->arrow != ARROW_NONE) && (column->arrowSide == SIDE_LEFT)) {
@@ -1555,6 +1613,19 @@ int TreeColumn_NeededWidth(TreeColumn column_)
column->neededWidth += widthList[i] + padList[i];
column->neededWidth += padList[n];
+#if defined(MAC_OSX_TK)
+ if (tree->useTheme)
+ column->arrow = arrow;
+
+ /* Under OSX we let the Appearance Manager draw the sort arrow. This code
+ * assumes the arrow is on the right. */
+ if (tree->useTheme &&
+ (TreeTheme_GetHeaderContentMargins(tree, column->state, column->arrow,
+ margins) == TCL_OK)) {
+ column->neededWidth += margins[2];
+ }
+#endif
+
/* Notice I'm not considering column->borderWidth. */
return column->neededWidth;
@@ -1569,7 +1640,7 @@ int TreeColumn_NeededHeight(TreeColumn column_)
if (column->neededHeight >= 0)
return column->neededHeight;
-#ifdef MAC_OSX_TK
+#if defined(MAC_OSX_TK)
/* List headers are a fixed height on Aqua */
if (tree->useTheme) {
(void) TreeTheme_GetHeaderFixedHeight(tree, &column->neededHeight);
@@ -1616,7 +1687,8 @@ int TreeColumn_NeededHeight(TreeColumn column_)
}
}
if (column->tree->useTheme &&
- (TreeTheme_GetHeaderContentMargins(tree, column->state, margins) == TCL_OK)) {
+ (TreeTheme_GetHeaderContentMargins(tree, column->state,
+ column->arrow, margins) == TCL_OK)) {
#ifdef WIN32
/* I'm hacking these margins since the default XP theme does not give
* reasonable ContentMargins for HP_HEADERITEM */
@@ -2431,8 +2503,8 @@ static void Column_Draw(Column *column, Drawable drawable, int x, int y, int dra
XFillRectangle(tree->display, drawable, gc, x, y, width, height);
} else {
if (tree->useTheme) {
- theme = TreeTheme_DrawHeaderItem(tree, drawable, column->state, x, y,
- width, height);
+ theme = TreeTheme_DrawHeaderItem(tree, drawable, column->state,
+ column->arrow, x, y, width, height);
}
if (theme != TCL_OK)
Tk_Fill3DRectangle(tree->tkwin, drawable, border,
@@ -2523,6 +2595,10 @@ static void Column_Draw(Column *column, Drawable drawable, int x, int y, int dra
if (dragImage)
return;
+#if defined(MAC_OSX_TK)
+ /* Under Aqua, we let the Appearance Manager draw the sort arrow */
+ if (theme != TCL_OK)
+#endif
Column_DrawArrow(column, drawable, x, y, layout);
if (theme != TCL_OK)
@@ -2603,7 +2679,7 @@ void Tree_DrawHeader(TreeCtrl *tree, Drawable drawable, int x, int y)
width = maxX - x + column->borderWidth;
height = tree->headerHeight;
if (tree->useTheme &&
- (TreeTheme_DrawHeaderItem(tree, pixmap, 0, x, y, width, height) == TCL_OK)) {
+ (TreeTheme_DrawHeaderItem(tree, pixmap, 0, 0, x, y, width, height) == TCL_OK)) {
} else {
Tk_3DBorder border;
border = PerStateBorder_ForState(tree, &column->border,