コード例 #1
0
static int listHotKeyPgUp(
	GOC_HANDLER uchwyt, GOC_MSG wiesc, void* pBuf, unsigned int nBuf)
{
	GOC_StList *lista = (GOC_StList*)uchwyt;
	int n = goc_listGetRowsAmmount(uchwyt);
	int retCode = GOC_ERR_OK;
	// brak wpisów
	if ( n <= 0 )
		return retCode;
	// kursor jest ju¿ na pocz±tku
	if ( lista->kursor == 0 )
		return retCode;
	// kursor jeszcze nie ustawiony
	if ( lista->kursor < 0 )
	{
		lista->kursor = 0;
		return retCode;
	}
	// wykonaj przesuniecie wszystkiego o lista->height-2
	lista->start -= goc_elementGetHeight(uchwyt)-2;
	lista->kursor -= goc_elementGetHeight(uchwyt)-2;
	// wykonaj wyrównanie
	if ( lista->start < 0 )
		lista->start = 0;
	if ( lista->kursor < 0 )
		lista->kursor = 0;
	// zgloszenie zmiany
	goc_systemSendMsg(uchwyt, GOC_MSG_LISTCHANGE,
		lista->pKolumna[0]->pText[lista->kursor],
		lista->kursor);
	// wy¶wietlenie
	if ( lista->flag & GOC_EFLAGA_SHOWN )
		goc_systemSendMsg(uchwyt, GOC_MSG_PAINT, 0, 0);
	return retCode;
}
コード例 #2
0
static int listCursorPrev(GOC_HANDLER uchwyt)
{
	GOC_StList *lista = (GOC_StList*)uchwyt;
	if ( lista->kursor > 0 )
	{
		lista->kursor--;
		goc_systemSendMsg(uchwyt, GOC_MSG_LISTCHANGE,
			lista->pKolumna[0]->pText[lista->kursor],
			lista->kursor);
		if ( lista->start > lista->kursor )
		{
			// przemaluj calosc, nastapilo przewiniecie strony
			int n = goc_listGetRowsAmmount(uchwyt);
			GOC_POSITION height = goc_elementGetHeight(uchwyt);
			lista->start = listCountStart(lista->kursor, height, n);
			goc_systemSendMsg(uchwyt, GOC_MSG_PAINT, 0, 0);
		}
		if ( lista->flag & GOC_EFLAGA_SHOWN )
		{
			// przemaluj tylko linie nastepna i tam gdzie poszedl kursor
			listRedrawLine(uchwyt, lista->kursor);
			listRedrawLine(uchwyt, lista->kursor+1);
			goc_gotoxy(
				goc_elementGetScreenX(uchwyt)+1,
				goc_elementGetScreenY(uchwyt)+(lista->kursor-lista->start) + 1);
			fflush(stdout);
		}
	}
	return GOC_ERR_OK;
}
コード例 #3
0
int goc_listSetCursor(GOC_HANDLER uchwyt, int pos)
{
	GOC_StList *lista = (GOC_StList*)uchwyt;
	int cnt = goc_listGetRowsAmmount( uchwyt );
	GOC_POSITION height = goc_elementGetHeight(uchwyt);
	if ( lista->nKolumna == 0 )
		return GOC_ERR_REFUSE;
	// jezeli pozycja sie nie zmienila nic nie rob
	if ( lista->kursor == pos )
		return GOC_ERR_OK;
	if ( pos < 0 )
	{
		lista->kursor = -1;
		goc_systemSendMsg(uchwyt, GOC_MSG_LISTCHANGE, NULL, lista->kursor);
	}
	else if ( pos < cnt )
	{
		lista->kursor = pos;
		goc_systemSendMsg(uchwyt, GOC_MSG_LISTCHANGE,
			lista->pKolumna[0]->pText[lista->kursor],
			lista->kursor);
	}
	else
		return GOC_ERR_REFUSE;
	lista->start = listCountStart(lista->kursor, height, cnt);
	return GOC_ERR_OK;
}
コード例 #4
0
static int labelPaint(GOC_StLabel *napis)
{
//	char *line; // line do wypisania
//	unsigned int d; // d³ugo¶æ do kopiowania dla linii do wypisania
//	unsigned int p = 0; // przesuniêcie wzglêdem pocz±tku punktu pisania
	unsigned int i; // licznik
	GOC_POSITION height;
	if ( napis->nText == 0 )
		return GOC_ERR_OK;
	if ( !(napis->flag & GOC_EFLAGA_PAINTED) )
		return GOC_ERR_OK;

//	line = (char *)malloc(napis->width+1);
//	memset(line, 0, napis->width+1);
	
	height = goc_elementGetHeight((GOC_HANDLER)napis);
	for ( i = 0; i < height; i++ )
  	{
		GOC_StElement elem;
		if ( i + napis->start >= napis->nText )
			break;
		memcpy( &elem,  napis, sizeof(GOC_StElement) );
//		memset( line, ' ', napis->width );
//		d = strlen(napis->tekst[i+napis->start].line) > napis->width ? napis->width :
//			strlen(napis->tekst[i+napis->start].line);
//		switch ( napis->tekst[i+napis->start].flag & COC_EFLAGA_G_JUSTIFY )
//	  	{
//			case GOC_EFLAGA_RIGHT:
//				p = napis->width - d;
//				break;
//			case GOC_EFLAGA_LEFT:
//				p = 0;
//				break;
//			case GOC_EFLAGA_CENTER:
//				p = napis->width - d;
//				p >>= 1;
//				break;
//		}
		elem.flag = napis->tekst[i+napis->start].flag;
//		memcpy( line + p, napis->tekst[i+napis->start].line, d );
		elem.y += i;
		elem.color = napis->tekst[i+napis->start].color;
		goc_elementGetLabelDrawer( (GOC_HANDLER)napis )(
			&elem, napis->tekst[i+napis->start].line );
//		goc_textallcolor( napis->tekst[i+napis->start].color );
//		fputs( line, stdout );
	}
	napis->flag |= GOC_EFLAGA_SHOWN;
	fflush(stdout);
//	free(line);
	return GOC_ERR_OK;
}
コード例 #5
0
static int goc_listPaint(GOC_HANDLER u)
{
	GOC_StList *lista = (GOC_StList*)u;
	int i; // licznik zdañ
	int j; // licznik kolumn
	int n; // maksymalna liczba wierszy
	GOC_COLUMN *k;
	GOC_StElement e;
	GOC_FUN_LABELDRAWER *drawer;

	if ( !(lista->flag & GOC_EFLAGA_PAINTED) )
		return GOC_ERR_OK;

	drawer = goc_elementGetLabelDrawer(u);

	memcpy(&e, lista, sizeof(GOC_StElement));
	e.color = lista->kolorRamka;
	goc_elementGetFrameDrawer(u)(&e, "*-*| |*-*");
	// rysowanie tytulu, jesli obecny
	if ( lista->pTytul )
	{
		GOC_StElement elTytul;
		memcpy( &elTytul, lista, sizeof(GOC_StElement));
		elTytul.color = lista->kolorRamka;
		elTytul.height = 1;
		elTytul.x += 2;
		elTytul.flag = GOC_EFLAGA_CENTER;
		if ( elTytul.width > 2 )
		{
			elTytul.width -= 4;
			if ( strlen(lista->pTytul)+2 < elTytul.width )
				elTytul.width = strlen(lista->pTytul)+2;
		}
		else
			elTytul.width = 0;
		drawer(&elTytul, lista->pTytul);

	}
	
	n = goc_listGetRowsAmmount(u);
	j=0;
	for ( i=lista->start; i<n; i++ )
	{
		if ( i - lista->start > goc_elementGetHeight(u)-3 )
			break;
		goc_systemSendMsg(u, GOC_MSG_LISTSETCOLOR, &(e.color), i);
//		j %= lista->nKolumna;
		e.y++;
		e.x = lista->x;
		(e.x)++;
		for ( j = 0; j < lista->nKolumna; j++ )
		{
			k = lista->pKolumna[j];
			e.width = k->position;
			if ( i<k->nText )
				drawer(&e, k->pText[i]);
			else
				drawer(&e, "");
			e.x += k->position;
		}

//		if (!j)
//		{
//		}
//		e.width = lista->pKolumna[j];
//		j++;
	}
	if (lista->kursor != -1)
		goc_gotoxy(
			goc_elementGetScreenX(u)+1,
			goc_elementGetScreenY(u)+(lista->kursor-lista->start) + 1);
	fflush(stdout);
	lista->flag |= GOC_EFLAGA_SHOWN;
	return GOC_ERR_OK;
}