static int barPaint(GOC_HANDLER uchwyt) { GOC_StBar *pasek = (GOC_StBar*)uchwyt; int i; GOC_StElement elem; GOC_POSITION w = goc_elementGetWidth(uchwyt); memcpy(&elem, pasek, sizeof(GOC_StElement)); goc_elementGetLabelDrawer(uchwyt)(&elem, ""); if ( pasek->nText == 0 ) return GOC_ERR_OK; if ( pasek->rozmiar == GOC_BAR_COUNTEDSIZE ) elem.width = w / pasek->nText; else elem.width = pasek->rozmiar; for ( i=pasek->start; i<pasek->nText; i++ ) { if ( i<(elem.width%(pasek->nText)) ) elem.width++; if ( elem.x + elem.width > pasek->x + w ) elem.width = pasek->x + w - elem.x; if ( i != pasek->kursor ) elem.color = pasek->color; else elem.color = pasek->kolorZaznaczony; goc_elementGetLabelDrawer(uchwyt)(&elem, pasek->tekst[i]); elem.x += elem.width; if ( i<(elem.width%(pasek->nText)) ) { elem.x++; elem.width--; } } fflush(stdout); return GOC_ERR_OK; }
int goc_listAddColumn(GOC_HANDLER u, GOC_POSITION width) { GOC_POSITION free; GOC_COLUMN *kolumna; int i; GOC_StList *lista = (GOC_StList*)u; free = goc_elementGetWidth(u); free -= 2; /* ramka */ for ( i=0; i<lista->nKolumna; i++ ) free -= lista->pKolumna[i]->position; lista->pKolumna = goc_tableAdd( lista->pKolumna, &(lista->nKolumna), sizeof(GOC_COLUMN*) ); kolumna = malloc(sizeof(GOC_COLUMN)); memset(kolumna, 0, sizeof(GOC_COLUMN)); lista->pKolumna[lista->nKolumna-1] = kolumna; kolumna->position = width <= free ? width : free; // Wyrowanie liczby wierszow w stosunku do istenijacych kolumn if ( lista->nKolumna > 1 ) { kolumna->pText = goc_tableResize(kolumna->pText, &(kolumna->nText), sizeof(char*), lista->pKolumna[0]->nText); // Wyzerowanie wierszy if ( kolumna->pText ) memset(kolumna->pText, 0, sizeof(char*)*kolumna->nText); } // lista->kursor = -1; return GOC_ERR_OK; }
int listSetExt( GOC_HANDLER uchwyt, const char **pTable, unsigned int size) { GOC_StList *lista = (GOC_StList*)uchwyt; goc_listClear(uchwyt); /* Jesli nie ma zadnej kolumny, to zbuduj */ if ( lista->nKolumna == 0 ) goc_listAddColumn(uchwyt, goc_elementGetWidth(uchwyt)); lista->pKolumna[0]->pText = (char **)pTable; lista->pKolumna[0]->nText = size; lista->flag |= GOC_LISTFLAG_EXTERNAL; 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; }
/* * Odmowa wykonania polecenia, jezeli ustawione dane sa zewnetrzne. */ static int listAddRow(GOC_HANDLER u, GOC_LISTROW *wiersz) { GOC_StList* lista = (GOC_StList*)u; GOC_COLUMN *k = NULL; int i; if ( lista->flag & GOC_LISTFLAG_EXTERNAL ) return GOC_ERR_REFUSE; // jesli nie ma to stworz nowa kolumne if ( lista->nKolumna == 0 ) goc_listAddColumn(u, goc_elementGetWidth(u)); // ustal pozcje na podstawie sortowania lub jako ostatni element if ( wiersz->nRow == -1 ) { if ( lista->flag & GOC_LISTFLAG_SORT ) { k = lista->pKolumna[0]; for (i=0; i<k->nText; i++) { if ( strcmp(wiersz->pText[0], k->pText[i])<0 ) break; } wiersz->nRow = i; } else { wiersz->nRow = lista->pKolumna[0]->nText; } } // czy nie wykracza ponad dodanie if ( wiersz->nRow > lista->pKolumna[0]->nText ) return GOC_ERR_REFUSE; // dodawanie danych wiersza do kolumn for ( i=0; i<lista->nKolumna; i++ ) { k = lista->pKolumna[i]; k->pText = goc_tableInsert(k->pText, &(k->nText), sizeof(char*), wiersz->nRow); if ( i < wiersz->nText ) { k->pText[wiersz->nRow] = goc_stringCopy(NULL, wiersz->pText[i]); } else { k->pText[wiersz->nRow] = NULL; } } return GOC_ERR_OK; // return goc_listAddColumnText(u, tekst, 0); /* GOC_StList* lista = (GOC_StList*)u; char *pBuf = NULL; GOC_COLUMN *kolumna = NULL; if ( lista->flag & GOC_LISTFLAG_EXTERNAL ) return GOC_ERR_REFUSE; if ( lista->nKolumna == 0 ) goc_listAddColumn(u, lista->width); kolumna = lista->pKolumna[0]; pBuf = goc_stringCopy(pBuf, tekst); kolumna->pText = goc_tableAdd( kolumna->pText, &(kolumna->nText), sizeof(char*) ); kolumna->pText[kolumna->nText-1] = pBuf; // goc_systemSendMsg(u, GOC_MSG_PAINT, 0, 0); return GOC_ERR_OK;*/ }