void CodeEditorComponent::scrollToKeepCaretOnScreen() { if (caretPos.getLineNumber() < firstLineOnScreen) scrollBy (caretPos.getLineNumber() - firstLineOnScreen); else if (caretPos.getLineNumber() >= firstLineOnScreen + linesOnScreen) scrollBy (caretPos.getLineNumber() - (firstLineOnScreen + linesOnScreen - 1)); const int column = indexToColumn (caretPos.getLineNumber(), caretPos.getIndexInLine()); if (column >= xOffset + columnsOnScreen - 1) scrollToColumn (column + 1 - columnsOnScreen); else if (column < xOffset) scrollToColumn (column); }
void CodeEditorComponent::scrollToKeepCaretOnScreen() { if (getWidth() > 0 && getHeight() > 0) { const int caretLine = caretPos.getLineNumber(); scrollToKeepLinesOnScreen (Range<int> (caretLine, caretLine)); const int column = indexToColumn (caretPos.getLineNumber(), caretPos.getIndexInLine()); if (column >= xOffset + columnsOnScreen - 1) scrollToColumn (column + 1 - columnsOnScreen); else if (column < xOffset) scrollToColumn (column); } }
void WMSetBrowserMaxVisibleColumns(WMBrowser * bPtr, int columns) { int curMaxVisibleColumns; int newFirstVisibleColumn = 0; assert(bPtr != NULL); columns = (columns < MIN_VISIBLE_COLUMNS) ? MIN_VISIBLE_COLUMNS : columns; columns = (columns > MAX_VISIBLE_COLUMNS) ? MAX_VISIBLE_COLUMNS : columns; if (columns == bPtr->maxVisibleColumns) { return; } curMaxVisibleColumns = bPtr->maxVisibleColumns; bPtr->maxVisibleColumns = columns; /* browser not loaded */ if (!bPtr->flags.loaded) { if ((columns > curMaxVisibleColumns) && (columns > bPtr->columnCount)) { int i = columns - bPtr->columnCount; bPtr->usedColumnCount = bPtr->columnCount; while (i--) { WMAddBrowserColumn(bPtr); } bPtr->usedColumnCount = 0; } /* browser loaded and columns > curMaxVisibleColumns */ } else if (columns > curMaxVisibleColumns) { if (bPtr->usedColumnCount > columns) { newFirstVisibleColumn = bPtr->usedColumnCount - columns; } if (newFirstVisibleColumn > bPtr->firstVisibleColumn) { newFirstVisibleColumn = bPtr->firstVisibleColumn; } if (columns > bPtr->columnCount) { int i = columns - bPtr->columnCount; int curUsedColumnCount = bPtr->usedColumnCount; bPtr->usedColumnCount = bPtr->columnCount; while (i--) { WMAddBrowserColumn(bPtr); } bPtr->usedColumnCount = curUsedColumnCount; } /* browser loaded and columns < curMaxVisibleColumns */ } else { newFirstVisibleColumn = bPtr->firstVisibleColumn; if (newFirstVisibleColumn + columns >= bPtr->usedColumnCount) { removeColumn(bPtr, newFirstVisibleColumn + columns); } } WMResizeWidget(bPtr, bPtr->view->size.width, bPtr->view->size.height); if (bPtr->flags.loaded) { XClearArea(bPtr->view->screen->display, bPtr->view->window, 0, 0, bPtr->view->size.width, bPtr->titleHeight, False); scrollToColumn(bPtr, newFirstVisibleColumn, True); } }
void WMRemoveBrowserItem(WMBrowser * bPtr, int column, int row) { WMList *list; if (column < 0 || column >= bPtr->usedColumnCount) return; list = WMGetBrowserListInColumn(bPtr, column); if (row < 0 || row >= WMGetListNumberOfRows(list)) return; removeColumn(bPtr, column + 1); if (bPtr->usedColumnCount < bPtr->maxVisibleColumns) scrollToColumn(bPtr, 0, True); else scrollToColumn(bPtr, bPtr->usedColumnCount - bPtr->maxVisibleColumns, True); WMRemoveListItem(list, row); }
void WMLoadBrowserColumnZero(WMBrowser * bPtr) { if (!bPtr->flags.loaded) { /* create column 0 */ WMAddBrowserColumn(bPtr); loadColumn(bPtr, 0); /* make column 0 visible */ scrollToColumn(bPtr, 0, True); bPtr->flags.loaded = 1; } }
static void listCallback(void *self, void *clientData) { WMBrowser *bPtr = (WMBrowser *) clientData; WMList *lPtr = (WMList *) self; WMListItem *item; int i, selNo; static WMListItem *oldItem = NULL; static int oldSelNo = 0; item = WMGetListSelectedItem(lPtr); selNo = WMGetArrayItemCount(WMGetListSelectedItems(lPtr)); if (oldItem == NULL || oldItem != item || oldSelNo != selNo) { for (i = 0; i < bPtr->columnCount; i++) { if (lPtr == bPtr->columns[i]) break; } assert(i < bPtr->columnCount); bPtr->selectedColumn = i; /* columns at right must be cleared */ removeColumn(bPtr, i + 1); /* open directory */ if (item && item->isBranch && selNo == 1) { WMAddBrowserColumn(bPtr); } if (bPtr->usedColumnCount < bPtr->maxVisibleColumns) i = 0; else i = bPtr->usedColumnCount - bPtr->maxVisibleColumns; scrollToColumn(bPtr, i, True); if (item && item->isBranch && selNo == 1) { loadColumn(bPtr, bPtr->usedColumnCount - 1); } } /* call callback for click */ if (bPtr->action) (*bPtr->action) (bPtr, bPtr->clientData); oldItem = item; oldSelNo = selNo; }
char *WMSetBrowserPath(WMBrowser * bPtr, char *path) { int i; char *str; char *tmp, *retPtr = NULL; int item; WMListItem *listItem; /* WMLoadBrowserColumnZero must be call first */ if (!bPtr->flags.loaded) { return False; } removeColumn(bPtr, 1); WMSelectListItem(bPtr->columns[0], -1); WMSetListPosition(bPtr->columns[0], 0); i = 0; str = wstrdup(path); tmp = strtok(str, bPtr->pathSeparator); while (tmp) { /* select it in the column */ item = WMFindRowOfListItemWithTitle(bPtr->columns[i], tmp); if (item < 0) { retPtr = &path[(int)(tmp - str)]; break; } WMSelectListItem(bPtr->columns[i], item); WMSetListPosition(bPtr->columns[i], item); listItem = WMGetListItem(bPtr->columns[i], item); if (!listItem || !listItem->isBranch) { break; } /* load next column */ WMAddBrowserColumn(bPtr); loadColumn(bPtr, i + 1); tmp = strtok(NULL, bPtr->pathSeparator); i++; } wfree(str); for (i = bPtr->usedColumnCount - 1; (i > -1) && !WMGetListSelectedItem(bPtr->columns[i]); i--) ; bPtr->selectedColumn = i; if (bPtr->columnCount < bPtr->maxVisibleColumns) { int i = bPtr->maxVisibleColumns - bPtr->columnCount; int curUsedColumnCount = bPtr->usedColumnCount; bPtr->usedColumnCount = bPtr->columnCount; while (i--) { WMAddBrowserColumn(bPtr); } bPtr->usedColumnCount = curUsedColumnCount; } scrollToColumn(bPtr, bPtr->columnCount - bPtr->maxVisibleColumns, True); return retPtr; }
static void scrollCallback(WMWidget * scroller, void *self) { WMBrowser *bPtr = (WMBrowser *) self; WMScroller *sPtr = (WMScroller *) scroller; int newFirst; #define LAST_VISIBLE_COLUMN bPtr->firstVisibleColumn+bPtr->maxVisibleColumns switch (WMGetScrollerHitPart(sPtr)) { case WSDecrementLine: if (bPtr->firstVisibleColumn > 0) { scrollToColumn(bPtr, bPtr->firstVisibleColumn - 1, True); } break; case WSDecrementPage: case WSDecrementWheel: if (bPtr->firstVisibleColumn > 0) { newFirst = bPtr->firstVisibleColumn - bPtr->maxVisibleColumns; scrollToColumn(bPtr, newFirst, True); } break; case WSIncrementLine: if (LAST_VISIBLE_COLUMN < bPtr->usedColumnCount) { scrollToColumn(bPtr, bPtr->firstVisibleColumn + 1, True); } break; case WSIncrementPage: case WSIncrementWheel: if (LAST_VISIBLE_COLUMN < bPtr->usedColumnCount) { newFirst = bPtr->firstVisibleColumn + bPtr->maxVisibleColumns; if (newFirst + bPtr->maxVisibleColumns >= bPtr->columnCount) newFirst = bPtr->columnCount - bPtr->maxVisibleColumns; scrollToColumn(bPtr, newFirst, True); } break; case WSKnob: { double floatValue; double value = bPtr->columnCount - bPtr->maxVisibleColumns; floatValue = WMGetScrollerValue(bPtr->scroller); floatValue = (floatValue * value) / value; newFirst = rint(floatValue * (float)(bPtr->columnCount - bPtr->maxVisibleColumns)); if (bPtr->firstVisibleColumn != newFirst) scrollToColumn(bPtr, newFirst, False); /*else WMSetScrollerParameters(bPtr->scroller, floatValue, bPtr->maxVisibleColumns/(float)bPtr->columnCount); */ } break; case WSKnobSlot: case WSNoPart: /* do nothing */ break; } #undef LAST_VISIBLE_COLUMN }