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_labelDrawer(GOC_StElement *elem, const char *tekst) { 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 GOC_POSITION w = goc_elementGetWidth((GOC_HANDLER)elem); line = (char *)malloc(w+1); memset(line, 0, w+1); memset(line, ' ', w); if ( tekst ) d = strlen(tekst) > w ? w : strlen(tekst); else d = w; switch ( elem->flag & COC_EFLAGA_G_JUSTIFY ) { case GOC_EFLAGA_RIGHT: p = w - d; break; case GOC_EFLAGA_LEFT: p = 0; break; case GOC_EFLAGA_CENTER: p = w - d; p >>= 1; break; } if ( tekst ) memcpy( line + p, tekst, d ); goc_gotoxy( goc_elementGetScreenX( (GOC_HANDLER)elem ), goc_elementGetScreenY( (GOC_HANDLER)elem ) ); goc_textallcolor( elem->color ); fputs( line, stdout ); free(line); return GOC_ERR_OK; }
int labelMoveDrawer(GOC_StElement *e, const char *tekst) { if ( wait ) { wait--; return GOC_ERR_OK; } wait = 1; if ( width != goc_elementGetWidth( (GOC_HANDLER)e ) ) { counter = 0; direction = 0; width = goc_elementGetWidth( (GOC_HANDLER)e ); } goc_textallcolor(e->color); if ( width <= strlen( tekst ) ) { char *tekstPisany = (char *)malloc(width+1); memset( tekstPisany, 0, width+1 ); memcpy( tekstPisany, tekst, width ); goc_saveXY(); goc_gotoxy( goc_elementGetScreenX( (GOC_HANDLER)e ), goc_elementGetScreenY( (GOC_HANDLER)e )); puts(tekstPisany); goc_loadXY(); return GOC_ERR_OK; } if ( direction ) { if ( counter > 0 ) { counter--; goc_saveXY(); goc_gotoxy( goc_elementGetScreenX( (GOC_HANDLER)e ) + counter, goc_elementGetScreenY( (GOC_HANDLER)e )); printf("%s ", tekst); goc_loadXY(); } else { direction = 0; } } else { if ( counter < width-strlen(tekst) ) { counter++; goc_saveXY(); goc_gotoxy( goc_elementGetScreenX( (GOC_HANDLER)e ) + counter - 1, goc_elementGetScreenY( (GOC_HANDLER)e )); printf(" %s", tekst); goc_loadXY(); } else { direction = 1; } } 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; }