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; }
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; }
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; }
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; }
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; }