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);
    }
}
Esempio n. 3
0
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);
	}
}
Esempio n. 4
0
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);
}
Esempio n. 5
0
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;
	}
}
Esempio n. 6
0
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;
}
Esempio n. 7
0
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;
}
Esempio n. 8
0
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
}