diff options
Diffstat (limited to 'generic/tkListbox.c')
-rw-r--r-- | generic/tkListbox.c | 70 |
1 files changed, 44 insertions, 26 deletions
diff --git a/generic/tkListbox.c b/generic/tkListbox.c index f16218b..2929882 100644 --- a/generic/tkListbox.c +++ b/generic/tkListbox.c @@ -165,8 +165,9 @@ typedef struct { Pixmap gray; /* Pixmap for displaying disabled text. */ int flags; /* Various flag bits: see below for * definitions. */ - Tk_Justify justify; /* Justification */ - int oldMaxOffset; /* Used in scrolling for right/center justification */ + Tk_Justify justify; /* Justification. */ + int oldMaxOffset; /* Used in scrolling for right/center + * justification. */ } Listbox; /* @@ -277,6 +278,8 @@ static const Tk_OptionSpec optionSpecs[] = { {TK_OPTION_PIXELS, "-highlightthickness", "highlightThickness", "HighlightThickness", DEF_LISTBOX_HIGHLIGHT_WIDTH, -1, Tk_Offset(Listbox, highlightWidth), 0, 0, 0}, + {TK_OPTION_JUSTIFY, "-justify", "justify", "Justify", + DEF_LISTBOX_JUSTIFY, -1, Tk_Offset(Listbox, justify), 0, 0, 0}, {TK_OPTION_RELIEF, "-relief", "relief", "Relief", DEF_LISTBOX_RELIEF, -1, Tk_Offset(Listbox, relief), 0, 0, 0}, {TK_OPTION_BORDER, "-selectbackground", "selectBackground", "Foreground", @@ -310,8 +313,6 @@ static const Tk_OptionSpec optionSpecs[] = { {TK_OPTION_STRING, "-listvariable", "listVariable", "Variable", DEF_LISTBOX_LIST_VARIABLE, -1, Tk_Offset(Listbox, listVarName), TK_OPTION_NULL_OK, 0, 0}, - {TK_OPTION_JUSTIFY, "-justify", "justify", "Justify", - DEF_LISTBOX_JUSTIFY, -1, Tk_Offset(Listbox, justify), 0, 0, 0}, {TK_OPTION_END, NULL, NULL, NULL, NULL, 0, -1, 0, 0, 0} }; @@ -440,7 +441,7 @@ static char * ListboxListVarProc(ClientData clientData, const char *name2, int flags); static void MigrateHashEntries(Tcl_HashTable *table, int first, int last, int offset); -static int GetMaxOffset(Listbox *listPtr); +static int GetMaxOffset(Listbox *listPtr); /* * The structure below defines button class behavior by means of procedures @@ -1125,7 +1126,7 @@ ListboxBboxSubCmd( Tk_GetFontMetrics(listPtr->tkfont, &fm); pixelWidth = Tk_TextWidth(listPtr->tkfont, stringRep, stringLen); - x = listPtr->inset + listPtr->selBorderWidth - listPtr->xOffset; + x = listPtr->inset + listPtr->selBorderWidth - listPtr->xOffset; y = ((index - listPtr->topIndex)*listPtr->lineHeight) + listPtr->inset + listPtr->selBorderWidth; results[0] = Tcl_NewIntObj(x); @@ -2071,23 +2072,27 @@ DisplayListbox( /* * Draw the actual text of this item. */ - Tcl_ListObjIndex(listPtr->interp, listPtr->listObj, i, &curElement); - stringRep = Tcl_GetStringFromObj(curElement, &stringLen); - Tk_ComputeTextLayout(listPtr->tkfont, - stringRep, stringLen, 0, - listPtr->justify, TK_IGNORE_NEWLINES, &totalLength, &height); + + Tcl_ListObjIndex(listPtr->interp, listPtr->listObj, i, &curElement); + stringRep = Tcl_GetStringFromObj(curElement, &stringLen); + Tk_ComputeTextLayout(listPtr->tkfont, stringRep, stringLen, 0, + listPtr->justify, TK_IGNORE_NEWLINES, &totalLength, &height); Tk_GetFontMetrics(listPtr->tkfont, &fm); y += fm.ascent + listPtr->selBorderWidth; - if (listPtr->justify == TK_JUSTIFY_LEFT) { - x = listPtr->inset + listPtr->selBorderWidth - listPtr->xOffset; - } else if (listPtr->justify == TK_JUSTIFY_RIGHT) { - x = width - totalLength - listPtr->inset - listPtr->selBorderWidth - listPtr->xOffset + GetMaxOffset(listPtr) - 1; - } else { - x = (width + GetMaxOffset(listPtr))/2 - totalLength/2 - listPtr->xOffset; - } - Tk_DrawChars(listPtr->display, pixmap, gc, listPtr->tkfont, + if (listPtr->justify == TK_JUSTIFY_LEFT) { + x = listPtr->inset + listPtr->selBorderWidth - listPtr->xOffset; + } else if (listPtr->justify == TK_JUSTIFY_RIGHT) { + x = width - totalLength - listPtr->inset - + listPtr->selBorderWidth - listPtr->xOffset + + GetMaxOffset(listPtr) - 1; + } else { + x = (width + GetMaxOffset(listPtr))/2 - totalLength/2 - + listPtr->xOffset; + } + + Tk_DrawChars(listPtr->display, pixmap, gc, listPtr->tkfont, stringRep, stringLen, x, y); /* @@ -2641,7 +2646,12 @@ ListboxEventProc( ChangeListboxView(listPtr, listPtr->topIndex); if (listPtr->justify == TK_JUSTIFY_RIGHT) { maxOffset = GetMaxOffset(listPtr); - if (maxOffset != listPtr->oldMaxOffset && listPtr->oldMaxOffset > 0) { // window has shrunk + if (maxOffset != listPtr->oldMaxOffset && listPtr->oldMaxOffset > 0) { + + /* + * Window has shrunk. + */ + if (maxOffset > listPtr->oldMaxOffset) { tmpOffset = maxOffset - listPtr->oldMaxOffset; } else { @@ -2661,7 +2671,12 @@ ListboxEventProc( listPtr->oldMaxOffset = maxOffset; } else if (listPtr->justify == TK_JUSTIFY_CENTER) { maxOffset = GetMaxOffset(listPtr); - if (maxOffset != listPtr->oldMaxOffset && listPtr->oldMaxOffset > 0) { // window has shrunk + if (maxOffset != listPtr->oldMaxOffset && listPtr->oldMaxOffset > 0) { + + /* + * Window has shrunk. + */ + tmpOffset2 = maxOffset / 2; if (maxOffset > listPtr->oldMaxOffset) { tmpOffset = maxOffset/2 - listPtr->oldMaxOffset/2; @@ -3661,21 +3676,24 @@ MigrateHashEntries( * * GetMaxOffset -- * - * Passing in a listbox pointer, returns the maximum offset for the box + * Passing in a listbox pointer, returns the maximum offset for the box. * * Results: - * Listbox's maxOffset + * Listbox's maxOffset. * * Side effects: - * None + * None. * *---------------------------------------------------------------------- */ -static int GetMaxOffset(register Listbox *listPtr) +static int GetMaxOffset( + register Listbox *listPtr) { int maxOffset; - maxOffset = listPtr->maxWidth - (Tk_Width(listPtr->tkwin) - 2*listPtr->inset - 2*listPtr->selBorderWidth) + listPtr->xScrollUnit - 1; + maxOffset = listPtr->maxWidth - + (Tk_Width(listPtr->tkwin) - 2*listPtr->inset - + 2*listPtr->selBorderWidth) + listPtr->xScrollUnit - 1; if (maxOffset < 0) { maxOffset = 0; } |