8 char *WMBrowserDidScrollNotification
= "WMBrowserDidScrollNotification";
11 typedef struct W_Browser
{
19 short usedColumnCount
; /* columns actually being used */
22 short maxVisibleColumns
;
23 short firstVisibleColumn
;
34 void *doubleClientData
;
35 WMAction
*doubleAction
;
37 WMBrowserFillColumnProc
*fillColumn
;
44 unsigned int isTitled
:1;
45 unsigned int allowMultipleSelection
:1;
46 unsigned int hasScroller
:1;
49 unsigned int loaded
:1;
50 unsigned int loadingColumn
:1;
55 #define COLUMN_SPACING 4
56 #define TITLE_SPACING 2
58 #define DEFAULT_WIDTH 305
59 #define DEFAULT_HEIGHT 200
60 #define DEFAULT_HAS_SCROLLER True
62 #define DEFAULT_SEPARATOR "/"
64 #define COLUMN_IS_VISIBLE(b, c) ((c) >= (b)->firstVisibleColumn \
65 && (c) < (b)->firstVisibleColumn + (b)->maxVisibleColumns)
68 static void handleEvents(XEvent
*event
, void *data
);
69 static void destroyBrowser(WMBrowser
*bPtr
);
71 static void setupScroller(WMBrowser
*bPtr
);
73 static void scrollToColumn(WMBrowser
*bPtr
, int column
);
75 static void paintItem(WMList
*lPtr
, int index
, Drawable d
, char *text
,
76 int state
, WMRect
*rect
);
78 static void loadColumn(WMBrowser
*bPtr
, int column
);
81 static void resizeBrowser(WMWidget
*, unsigned int, unsigned int);
83 W_ViewProcedureTable _BrowserViewProcedures
= {
92 WMCreateBrowser(WMWidget
*parent
)
97 bPtr
= wmalloc(sizeof(WMBrowser
));
98 memset(bPtr
, 0, sizeof(WMBrowser
));
100 bPtr
->widgetClass
= WC_Browser
;
102 bPtr
->view
= W_CreateView(W_VIEW(parent
));
107 bPtr
->view
->self
= bPtr
;
109 WMCreateEventHandler(bPtr
->view
, ExposureMask
|StructureNotifyMask
110 |ClientMessageMask
, handleEvents
, bPtr
);
112 /* default configuration */
113 bPtr
->flags
.hasScroller
= DEFAULT_HAS_SCROLLER
;
115 bPtr
->titleHeight
= 20;
116 bPtr
->flags
.isTitled
= 1;
117 bPtr
->maxVisibleColumns
= 2;
119 resizeBrowser(bPtr
, DEFAULT_WIDTH
, DEFAULT_HEIGHT
);
121 bPtr
->pathSeparator
= wstrdup(DEFAULT_SEPARATOR
);
123 if (bPtr
->flags
.hasScroller
)
126 for (i
=0; i
<bPtr
->maxVisibleColumns
; i
++) {
127 WMAddBrowserColumn(bPtr
);
129 bPtr
->usedColumnCount
= 0;
131 bPtr
->selectedColumn
= -1;
138 WMSetBrowserMaxVisibleColumns(WMBrowser
*bPtr
, int columns
)
140 if (columns
> bPtr
->maxVisibleColumns
) {
142 if (columns
> bPtr
->columnCount
) {
143 int i
= columns
- bPtr
->columnCount
;
146 WMAddBrowserColumn(bPtr
);
150 resizeBrowser(bPtr
, bPtr
->view
->size
.width
, bPtr
->view
->size
.height
);
152 } else if (columns
< bPtr
->maxVisibleColumns
) {
154 resizeBrowser(bPtr
, bPtr
->view
->size
.width
, bPtr
->view
->size
.height
);
157 bPtr
->maxVisibleColumns
= columns
;
162 WMGetBrowserNumberOfColumns(WMBrowser
*bPtr
)
164 return bPtr
->usedColumnCount
;
168 WMSetBrowserPathSeparator(WMBrowser
*bPtr
, char *separator
)
170 if (bPtr
->pathSeparator
)
171 free(bPtr
->pathSeparator
);
172 bPtr
->pathSeparator
= wstrdup(separator
);
178 drawTitleOfColumn(WMBrowser
*bPtr
, int column
)
180 WMScreen
*scr
= bPtr
->view
->screen
;
183 x
=(column
-bPtr
->firstVisibleColumn
)*(bPtr
->columnSize
.width
+COLUMN_SPACING
);
185 XFillRectangle(scr
->display
, bPtr
->view
->window
, W_GC(scr
->darkGray
), x
, 0,
186 bPtr
->columnSize
.width
, bPtr
->titleHeight
);
187 W_DrawRelief(scr
, bPtr
->view
->window
, x
, 0,
188 bPtr
->columnSize
.width
, bPtr
->titleHeight
, WRSunken
);
190 if (column
< bPtr
->usedColumnCount
&& bPtr
->titles
[column
])
191 W_PaintText(bPtr
->view
, bPtr
->view
->window
, scr
->boldFont
, x
,
192 (bPtr
->titleHeight
-WMFontHeight(scr
->boldFont
))/2,
193 bPtr
->columnSize
.width
, WACenter
, W_GC(scr
->white
),
194 False
, bPtr
->titles
[column
], strlen(bPtr
->titles
[column
]));
199 WMSetBrowserColumnTitle(WMBrowser
*bPtr
, int column
, char *title
)
202 assert(column
< bPtr
->usedColumnCount
);
204 if (bPtr
->titles
[column
])
205 free(bPtr
->titles
[column
]);
207 bPtr
->titles
[column
] = wstrdup(title
);
209 if (COLUMN_IS_VISIBLE(bPtr
, column
) && bPtr
->flags
.isTitled
) {
210 drawTitleOfColumn(bPtr
, column
);
216 WMGetBrowserListInColumn(WMBrowser
*bPtr
, int column
)
218 if (column
< 0 || column
>= bPtr
->usedColumnCount
)
221 return bPtr
->columns
[column
];
226 WMSetBrowserFillColumnProc(WMBrowser
*bPtr
, WMBrowserFillColumnProc
*proc
)
228 bPtr
->fillColumn
= proc
;
233 WMGetBrowserFirstVisibleColumn(WMBrowser
*bPtr
)
235 return bPtr
->firstVisibleColumn
;
240 removeColumn(WMBrowser
*bPtr
, int column
)
246 if (column
>= bPtr
->usedColumnCount
)
249 if (column
< bPtr
->maxVisibleColumns
) {
252 /* this code causes bugs */
255 if(bPtr
->usedColumnCount
< bPtr
->maxVisibleColumns
)
256 limit
= bPtr
->usedColumnCount
;
258 limit
= bPtr
->maxVisibleColumns
;
260 for (i
=column
; i
< limit
; i
++) {
262 free(bPtr
->titles
[i
]);
263 bPtr
->titles
[i
] = NULL
;
265 WMClearList(bPtr
->columns
[i
]);
266 bPtr
->usedColumnCount
--;
269 for (i
=column
; i
< bPtr
->maxVisibleColumns
; i
++) {
271 free(bPtr
->titles
[i
]);
272 bPtr
->titles
[i
] = NULL
;
274 WMClearList(bPtr
->columns
[i
]);
275 bPtr
->usedColumnCount
--;
277 tmp
= bPtr
->columnCount
;
278 for (i
=bPtr
->maxVisibleColumns
; i
< tmp
; i
++) {
280 free(bPtr
->titles
[i
]);
281 bPtr
->titles
[i
] = NULL
;
283 WMDestroyWidget(bPtr
->columns
[i
]);
284 bPtr
->columns
[i
] = NULL
;
286 bPtr
->usedColumnCount
--;
290 int tmp
= bPtr
->columnCount
;
291 for (i
=column
; i
< tmp
; i
++) {
293 free(bPtr
->titles
[i
]);
294 bPtr
->titles
[i
] = NULL
;
296 WMDestroyWidget(bPtr
->columns
[i
]);
297 bPtr
->columns
[i
] = NULL
;
299 bPtr
->usedColumnCount
--;
302 clist
= wmalloc(sizeof(WMList
*)*bPtr
->columnCount
);
303 tlist
= wmalloc(sizeof(char*)*bPtr
->columnCount
);
304 memcpy(clist
, bPtr
->columns
, sizeof(WMList
*)*bPtr
->columnCount
);
305 memcpy(tlist
, bPtr
->titles
, sizeof(char*)*bPtr
->columnCount
);
308 bPtr
->titles
= tlist
;
309 bPtr
->columns
= clist
;
315 WMGetBrowserSelectedItemInColumn(WMBrowser
*bPtr
, int column
)
317 if ((column
< 0) || (column
> bPtr
->columnCount
))
320 return WMGetListSelectedItem(bPtr
->columns
[column
]);
326 WMGetBrowserSelectedColumn(WMBrowser
*bPtr
)
328 return bPtr
->selectedColumn
;
333 WMGetBrowserSelectedRowInColumn(WMBrowser
*bPtr
, int column
)
335 if (column
>= 0 && column
< bPtr
->columnCount
) {
336 return WMGetListSelectedItemRow(bPtr
->columns
[column
]);
344 WMSetBrowserTitled(WMBrowser
*bPtr
, Bool flag
)
347 int columnX
, columnY
;
349 if (bPtr
->flags
.isTitled
== flag
)
354 if (!bPtr
->flags
.isTitled
) {
355 columnY
= TITLE_SPACING
+ bPtr
->titleHeight
;
357 bPtr
->columnSize
.height
-= columnY
;
359 for (i
=0; i
<bPtr
->columnCount
; i
++) {
360 WMResizeWidget(bPtr
->columns
[i
], bPtr
->columnSize
.width
,
361 bPtr
->columnSize
.height
);
363 columnX
= WMWidgetView(bPtr
->columns
[i
])->pos
.x
;
365 WMMoveWidget(bPtr
->columns
[i
], columnX
, columnY
);
368 bPtr
->columnSize
.height
+= TITLE_SPACING
+ bPtr
->titleHeight
;
370 for (i
=0; i
<bPtr
->columnCount
; i
++) {
371 WMResizeWidget(bPtr
->columns
[i
], bPtr
->columnSize
.width
,
372 bPtr
->columnSize
.height
);
374 columnX
= WMWidgetView(bPtr
->columns
[i
])->pos
.x
;
376 WMMoveWidget(bPtr
->columns
[i
], columnX
, 0);
380 bPtr
->flags
.isTitled
= flag
;
385 WMAddSortedBrowserItem(WMBrowser
*bPtr
, int column
, char *text
, Bool isBranch
)
389 if (column
< 0 || column
>= bPtr
->columnCount
)
392 item
= WMAddSortedListItem(bPtr
->columns
[column
], text
);
393 item
->isBranch
= isBranch
;
401 WMInsertBrowserItem(WMBrowser
*bPtr
, int column
, int row
, char *text
,
406 if (column
< 0 || column
>= bPtr
->columnCount
)
409 item
= WMInsertListItem(bPtr
->columns
[column
], row
, text
);
410 item
->isBranch
= isBranch
;
419 resizeBrowser(WMWidget
*w
, unsigned int width
, unsigned int height
)
421 WMBrowser
*bPtr
= (WMBrowser
*)w
;
422 int cols
= bPtr
->maxVisibleColumns
;
429 bPtr
->columnSize
.width
= (width
-(cols
-1)*COLUMN_SPACING
) / cols
;
430 bPtr
->columnSize
.height
= height
;
432 if (bPtr
->flags
.isTitled
) {
433 bPtr
->columnSize
.height
-= TITLE_SPACING
+ bPtr
->titleHeight
;
434 colY
= TITLE_SPACING
+ bPtr
->titleHeight
;
439 if (bPtr
->flags
.hasScroller
) {
440 bPtr
->columnSize
.height
-= SCROLLER_WIDTH
+ 4;
442 if (bPtr
->scroller
) {
443 WMResizeWidget(bPtr
->scroller
, width
-2, 1);
444 WMMoveWidget(bPtr
->scroller
, 1, height
-SCROLLER_WIDTH
-1);
449 for (i
= 0; i
< bPtr
->columnCount
; i
++) {
450 WMResizeWidget(bPtr
->columns
[i
], bPtr
->columnSize
.width
,
451 bPtr
->columnSize
.height
);
453 WMMoveWidget(bPtr
->columns
[i
], colX
, colY
);
455 if (COLUMN_IS_VISIBLE(bPtr
, i
)) {
456 colX
+= bPtr
->columnSize
.width
+COLUMN_SPACING
;
460 W_ResizeView(bPtr
->view
, width
, height
);
465 paintItem(WMList
*lPtr
, int index
, Drawable d
, char *text
, int state
,
468 WMView
*view
= W_VIEW(lPtr
);
469 W_Screen
*scr
= view
->screen
;
470 int width
, height
, x
, y
;
472 width
= rect
->size
.width
;
473 height
= rect
->size
.height
;
477 if (state
& WLDSSelected
)
478 XFillRectangle(scr
->display
, d
, W_GC(scr
->white
), x
, y
,
481 XClearArea(scr
->display
, d
, x
, y
, width
, height
, False
);
484 W_PaintText(view
, d
, scr
->normalFont
, x
+4, y
, width
,
485 WALeft
, W_GC(scr
->black
), False
, text
, strlen(text
));
488 if (state
& WLDSIsBranch
) {
489 XDrawLine(scr
->display
, d
, W_GC(scr
->darkGray
), x
+width
-11, y
+3,
490 x
+width
-6, y
+height
/2);
491 if (state
& WLDSSelected
)
492 XDrawLine(scr
->display
, d
,W_GC(scr
->gray
), x
+width
-11, y
+height
-5,
493 x
+width
-6, y
+height
/2);
495 XDrawLine(scr
->display
, d
,W_GC(scr
->white
), x
+width
-11, y
+height
-5,
496 x
+width
-6, y
+height
/2);
497 XDrawLine(scr
->display
, d
, W_GC(scr
->black
), x
+width
-12, y
+3,
498 x
+width
-12, y
+height
-5);
504 scrollCallback(WMWidget
*scroller
, void *self
)
506 WMBrowser
*bPtr
= (WMBrowser
*)self
;
507 WMScroller
*sPtr
= (WMScroller
*)scroller
;
509 #define LAST_VISIBLE_COLUMN bPtr->firstVisibleColumn+bPtr->maxVisibleColumns
511 switch (WMGetScrollerHitPart(sPtr
)) {
512 case WSDecrementLine
:
513 if (bPtr
->firstVisibleColumn
> 0) {
514 scrollToColumn(bPtr
, bPtr
->firstVisibleColumn
-1);
518 case WSDecrementPage
:
519 if (bPtr
->firstVisibleColumn
> 0) {
520 newFirst
= bPtr
->firstVisibleColumn
- bPtr
->maxVisibleColumns
;
522 scrollToColumn(bPtr
, newFirst
);
527 case WSIncrementLine
:
528 if (LAST_VISIBLE_COLUMN
< bPtr
->columnCount
) {
529 scrollToColumn(bPtr
, bPtr
->firstVisibleColumn
+1);
533 case WSIncrementPage
:
534 if (LAST_VISIBLE_COLUMN
< bPtr
->columnCount
) {
535 newFirst
= bPtr
->firstVisibleColumn
+ bPtr
->maxVisibleColumns
;
537 if (newFirst
+bPtr
->maxVisibleColumns
>= bPtr
->columnCount
)
538 newFirst
= bPtr
->columnCount
- bPtr
->maxVisibleColumns
;
540 scrollToColumn(bPtr
, newFirst
);
547 float value
= bPtr
->columnCount
- bPtr
->maxVisibleColumns
;
549 floatValue
= WMGetScrollerValue(bPtr
->scroller
);
551 floatValue
= (floatValue
*value
)/value
;
553 newFirst
= floatValue
*(float)(bPtr
->columnCount
- bPtr
->maxVisibleColumns
);
555 if (bPtr
->firstVisibleColumn
!= newFirst
)
556 scrollToColumn(bPtr
, newFirst
);
558 WMSetScrollerParameters(bPtr
->scroller
, floatValue
,
559 bPtr
->maxVisibleColumns
/(float)bPtr
->columnCount
);
569 #undef LAST_VISIBLE_COLUMN
574 setupScroller(WMBrowser
*bPtr
)
579 y
= bPtr
->view
->size
.height
- SCROLLER_WIDTH
- 1;
581 sPtr
= WMCreateScroller(bPtr
);
582 WMSetScrollerAction(sPtr
, scrollCallback
, bPtr
);
583 WMMoveWidget(sPtr
, 1, y
);
584 WMResizeWidget(sPtr
, bPtr
->view
->size
.width
-2, SCROLLER_WIDTH
);
586 bPtr
->scroller
= sPtr
;
593 WMSetBrowserAction(WMBrowser
*bPtr
, WMAction
*action
, void *clientData
)
595 bPtr
->action
= action
;
596 bPtr
->clientData
= clientData
;
601 WMSetBrowserHasScroller(WMBrowser
*bPtr
, int hasScroller
)
603 bPtr
->flags
.hasScroller
= hasScroller
;
609 WMSetBrowserPath(WMBrowser
*bPtr
, char *path
)
612 char *str
= wstrdup(path
);
616 WMListItem
*listItem
;
618 removeColumn(bPtr
, 1);
621 tmp
= strtok(str
, bPtr
->pathSeparator
);
623 /* select it in the column */
624 item
= WMFindRowOfListItemWithTitle(bPtr
->columns
[i
], tmp
);
629 WMSelectListItem(bPtr
->columns
[i
], item
);
630 WMSetListPosition(bPtr
->columns
[i
], item
);
632 listItem
= WMGetListItem(bPtr
->columns
[i
], item
);
633 if (!listItem
|| !listItem
->isBranch
) {
637 /* load next column */
638 WMAddBrowserColumn(bPtr
);
640 loadColumn(bPtr
, i
+1);
642 tmp
= strtok(NULL
, bPtr
->pathSeparator
);
648 bPtr
->selectedColumn
= bPtr
->usedColumnCount
- 1;
650 scrollToColumn(bPtr
, bPtr
->columnCount
-bPtr
->maxVisibleColumns
);
657 WMGetBrowserPath(WMBrowser
*bPtr
)
659 return WMGetBrowserPathToColumn(bPtr
, bPtr
->columnCount
);
664 WMGetBrowserPathToColumn(WMBrowser
*bPtr
, int column
)
670 if (column
>= bPtr
->usedColumnCount
)
671 column
= bPtr
->usedColumnCount
-1;
673 /* calculate size of buffer */
675 for (i
= 0; i
<= column
; i
++) {
676 item
= WMGetListSelectedItem(bPtr
->columns
[i
]);
679 size
+= strlen(item
->text
);
683 path
= wmalloc(size
+(column
+1)*strlen(bPtr
->pathSeparator
)+1);
686 for (i
= 0; i
<= column
; i
++) {
687 strcat(path
, bPtr
->pathSeparator
);
688 item
= WMGetListSelectedItem(bPtr
->columns
[i
]);
691 strcat(path
, item
->text
);
699 loadColumn(WMBrowser
*bPtr
, int column
)
701 assert(bPtr
->fillColumn
);
703 bPtr
->flags
.loadingColumn
= 1;
704 (*bPtr
->fillColumn
)(bPtr
, column
);
705 bPtr
->flags
.loadingColumn
= 0;
710 paintBrowser(WMBrowser
*bPtr
)
714 if (!bPtr
->view
->flags
.mapped
)
717 W_DrawRelief(bPtr
->view
->screen
, bPtr
->view
->window
, 0,
718 bPtr
->view
->size
.height
-SCROLLER_WIDTH
-2,
719 bPtr
->view
->size
.width
, 22, WRSunken
);
721 if (bPtr
->flags
.isTitled
) {
722 for (i
=0; i
<bPtr
->maxVisibleColumns
; i
++) {
723 drawTitleOfColumn(bPtr
, i
+bPtr
->firstVisibleColumn
);
730 handleEvents(XEvent
*event
, void *data
)
732 WMBrowser
*bPtr
= (WMBrowser
*)data
;
734 CHECK_CLASS(data
, WC_Browser
);
737 switch (event
->type
) {
743 destroyBrowser(bPtr
);
752 scrollToColumn(WMBrowser
*bPtr
, int column
)
759 if (column
!= bPtr
->firstVisibleColumn
)
766 bPtr
->firstVisibleColumn
= column
;
767 for (i
= 0; i
< bPtr
->usedColumnCount
; i
++) {
768 if (COLUMN_IS_VISIBLE(bPtr
, i
)) {
769 WMMoveWidget(bPtr
->columns
[i
], x
,
770 WMWidgetView(bPtr
->columns
[i
])->pos
.y
);
771 if (!WMWidgetView(bPtr
->columns
[i
])->flags
.realized
)
772 WMRealizeWidget(bPtr
->columns
[i
]);
773 WMMapWidget(bPtr
->columns
[i
]);
774 x
+= bPtr
->columnSize
.width
+COLUMN_SPACING
;
776 WMUnmapWidget(bPtr
->columns
[i
]);
780 /* update the scroller */
781 if (bPtr
->columnCount
> bPtr
->maxVisibleColumns
) {
782 float value
, proportion
;
784 value
= bPtr
->firstVisibleColumn
785 /(float)(bPtr
->columnCount
-bPtr
->maxVisibleColumns
);
786 proportion
= bPtr
->maxVisibleColumns
/(float)bPtr
->columnCount
;
787 WMSetScrollerParameters(bPtr
->scroller
, value
, proportion
);
789 WMSetScrollerParameters(bPtr
->scroller
, 0, 1);
792 if (bPtr
->view
->flags
.mapped
)
796 WMPostNotificationName(WMBrowserDidScrollNotification
, bPtr
, NULL
);
801 listCallback(void *self
, void *clientData
)
803 WMBrowser
*bPtr
= (WMBrowser
*)clientData
;
804 WMList
*lPtr
= (WMList
*)self
;
808 item
= WMGetListSelectedItem(lPtr
);
812 for (i
=0; i
<bPtr
->columnCount
; i
++) {
813 if (lPtr
== bPtr
->columns
[i
])
816 assert(i
<bPtr
->columnCount
);
818 bPtr
->selectedColumn
= i
;
820 /* columns at right must be cleared */
821 removeColumn(bPtr
, i
+1);
823 if (item
->isBranch
) {
824 WMAddBrowserColumn(bPtr
);
825 loadColumn(bPtr
, bPtr
->usedColumnCount
-1);
827 if (bPtr
->usedColumnCount
< bPtr
->maxVisibleColumns
)
830 i
= bPtr
->usedColumnCount
-bPtr
->maxVisibleColumns
;
831 scrollToColumn(bPtr
, i
);
833 /* call callback for click */
835 (*bPtr
->action
)(bPtr
, bPtr
->clientData
);
840 WMLoadBrowserColumnZero(WMBrowser
*bPtr
)
842 if (!bPtr
->flags
.loaded
) {
843 /* create column 0 */
844 WMAddBrowserColumn(bPtr
);
848 /* make column 0 visible */
849 scrollToColumn(bPtr
, 0);
851 bPtr
->flags
.loaded
= 1;
857 WMRemoveBrowserItem(WMBrowser
*bPtr
, int column
, int row
)
861 if (column
< 0 || column
>= bPtr
->usedColumnCount
)
864 list
= WMGetBrowserListInColumn(bPtr
, column
);
866 if (row
< 0 || row
>= WMGetListNumberOfRows(list
))
869 removeColumn(bPtr
, column
+1);
870 if (bPtr
->usedColumnCount
< bPtr
->maxVisibleColumns
)
871 scrollToColumn(bPtr
, 0);
873 scrollToColumn(bPtr
, bPtr
->usedColumnCount
-bPtr
->maxVisibleColumns
);
875 WMRemoveListItem(list
, row
);
880 WMAddBrowserColumn(WMBrowser
*bPtr
)
889 if (bPtr
->usedColumnCount
< bPtr
->columnCount
) {
890 return bPtr
->usedColumnCount
++;
893 bPtr
->usedColumnCount
++;
895 if (bPtr
->flags
.isTitled
) {
896 colY
= TITLE_SPACING
+ bPtr
->titleHeight
;
901 index
= bPtr
->columnCount
;
903 clist
= wmalloc(sizeof(WMList
*)*bPtr
->columnCount
);
904 tlist
= wmalloc(sizeof(char*)*bPtr
->columnCount
);
905 memcpy(clist
, bPtr
->columns
, sizeof(WMList
*)*(bPtr
->columnCount
-1));
906 memcpy(tlist
, bPtr
->titles
, sizeof(char*)*(bPtr
->columnCount
-1));
911 bPtr
->columns
= clist
;
912 bPtr
->titles
= tlist
;
914 bPtr
->titles
[index
] = NULL
;
916 list
= WMCreateList(bPtr
);
917 WMSetListAction(list
, listCallback
, bPtr
);
918 WMSetListUserDrawProc(list
, paintItem
);
919 bPtr
->columns
[index
] = list
;
921 WMResizeWidget(list
, bPtr
->columnSize
.width
, bPtr
->columnSize
.height
);
922 WMMoveWidget(list
, (bPtr
->columnSize
.width
+COLUMN_SPACING
)*index
, colY
);
923 if (COLUMN_IS_VISIBLE(bPtr
, index
))
926 /* update the scroller */
927 if (bPtr
->columnCount
> bPtr
->maxVisibleColumns
) {
928 float value
, proportion
;
930 value
= bPtr
->firstVisibleColumn
931 /(float)(bPtr
->columnCount
-bPtr
->maxVisibleColumns
);
932 proportion
= bPtr
->maxVisibleColumns
/(float)bPtr
->columnCount
;
933 WMSetScrollerParameters(bPtr
->scroller
, value
, proportion
);
942 destroyBrowser(WMBrowser
*bPtr
)
946 for (i
=0; i
<bPtr
->columnCount
; i
++) {
948 free(bPtr
->titles
[i
]);
952 free(bPtr
->pathSeparator
);