// Afisam cautarea din partea de jos a ecranului
void ListaCarti::afiseaza_cautare()
{
    int columns = get_console_size().columns;
    int rows = get_console_size().rows;
    string text = "Cautare: ";

    CONSOLE_CURSOR_INFO cursorInfo;
    GetConsoleCursorInfo(console, &cursorInfo);
    cursorInfo.bVisible = TRUE;  // set the cursor visibility, http://stackoverflow.com/questions/18028808/blinking-underscore-with-console
    SetConsoleCursorInfo(console, &cursorInfo);

    SetConsoleTextAttribute(console, FOREGROUND_GREEN);

    COORD newpos;
    newpos.X = columns - text.length() - MAX_FILTRU_LENGTH - 5;
    newpos.Y = rows - 2;
    SetConsoleCursorPosition(console, newpos);

    cout << text << filtru;
}
void ListaCarti::ascunde_cautare()
{
    int columns = get_console_size().columns;
    int rows = get_console_size().rows;
    string text = "Cautare: ";

    CONSOLE_CURSOR_INFO cursorInfo;
    GetConsoleCursorInfo(console, &cursorInfo);
    cursorInfo.bVisible = FALSE;  // set the cursor visibility, http://stackoverflow.com/questions/18028808/blinking-underscore-with-console
    SetConsoleCursorInfo(console, &cursorInfo);

    COORD newpos;
    newpos.X = columns - text.length() - MAX_FILTRU_LENGTH - 5;
    newpos.Y = rows - 2;
    SetConsoleCursorPosition(console, newpos);

    for (int i=0; i<text.length()+MAX_FILTRU_LENGTH; i++)
    {
        cout << " ";
    }
}
void ListaCarti::clear_selection(int index)
{
    int columns = get_console_size().columns;

    int row_of_index = row_for_index(index);
    COORD pos;
    pos.X = 1;
    pos.Y = row_of_index;

    SetConsoleTextAttribute(console, FOREGROUND_GREEN);
    for (int i = pos.X; i<columns-1; i++)
    {
        char c = charAtXY(i, row_of_index);

        COORD newpos;
        newpos.X = i;
        newpos.Y = row_of_index;
        SetConsoleCursorPosition(console, newpos);
        cout << c;
    }
}
void ListaCarti::highlight_index(int index)
{
    if (indexuri.size() == 0) return;
    int columns = get_console_size().columns;

    int row_of_index = row_for_index(index);
    COORD pos;
    pos.X = 1;
    pos.Y = row_of_index;

    SetConsoleTextAttribute(console, FOREGROUND_RED | BACKGROUND_BLUE | BACKGROUND_GREEN | BACKGROUND_RED);
    for (int i = pos.X; i<columns-1; i++)
    {
        char c = charAtXY(i, row_of_index);

        COORD newpos;
        newpos.X = i;
        newpos.Y = row_of_index;
        SetConsoleCursorPosition(console, newpos);
        cout << c;
    }
}
示例#5
0
/**
 * Edit a stream
 * @param console_in   stream to read console from
 * @param console_out  stream to write console to
 * @param stream  stream to read/write file to
 */
void muon_edit(handle_t console_in, handle_t console_out, const char *title, handle_t stream)
  {
  int rc;
  int i;

  editor_t *ed = (editor_t *) neutron_malloc(sizeof(editor_t));
  memset(ed, 0, sizeof(editor_t));
  ed->console_in = console_in;
  ed->console_out = console_out;
  ed->title = title;
  ed->anchor = -1;

  rc = load_file(ed, stream);

  get_console_size(ed);

  bool done = false;
  int key;

  ed->refresh = 1;
  while (!done)
    {
    if (ed->refresh)
      {
      draw_screen(ed);
      draw_full_statusline(ed);
      ed->refresh = 0;
      ed->lineupdate = 0;
      }
    else if (ed->lineupdate)
      {
      update_line(ed);
      ed->lineupdate = 0;
      draw_statusline(ed);
      }
    else
      {
      draw_statusline(ed);
      }

    position_cursor(ed);

    key = getkey(ed);

    if (key >= ' ' && key <= 0x7F)
      {
      insert_char(ed, (char) key);
      }
    else
      {
      switch (key)
        {
        case KEY_F1:
          help(ed);
          break;
        case KEY_F5:
          redraw_screen(ed);
          break;
       case KEY_UP:
         up(ed, 0);
          break;
        case KEY_DOWN:
          down(ed, 0);
          break;
        case KEY_LEFT:
          left(ed, 0);
          break;
        case KEY_RIGHT:
          right(ed, 0);
          break;
        case KEY_HOME:
          home(ed, 0);
          break;
        case KEY_END:
          end(ed, 0);
          break;
        case KEY_PGUP:
          pageup(ed, 0);
          break;
        case KEY_PGDN:
          pagedown(ed, 0);
          break;
        case KEY_CTRL_RIGHT:
          wordright(ed, 0);
          break;
        case KEY_CTRL_LEFT:
          wordleft(ed, 0);
          break;
        case KEY_CTRL_HOME:
          top(ed, 0);
          break;
        case KEY_CTRL_END:
          bottom(ed, 0);
          break;
        case KEY_SHIFT_UP:
          up(ed, 1);
          break;
        case KEY_SHIFT_DOWN:
          down(ed, 1);
          break;
        case KEY_SHIFT_LEFT:
          left(ed, 1);
          break;
        case KEY_SHIFT_RIGHT:
          right(ed, 1);
          break;
        case KEY_SHIFT_PGUP:
          pageup(ed, 1);
          break;
        case KEY_SHIFT_PGDN:
          pagedown(ed, 1);
          break;
        case KEY_SHIFT_HOME:
          home(ed, 1);
          break;
        case KEY_SHIFT_END:
          end(ed, 1);
          break;
        case KEY_SHIFT_CTRL_RIGHT:
          wordright(ed, 1);
          break;
        case KEY_SHIFT_CTRL_LEFT:
          wordleft(ed, 1);
          break;
        case KEY_SHIFT_CTRL_HOME:
          top(ed, 1);
          break;
        case KEY_SHIFT_CTRL_END:
          bottom(ed, 1);
          break;
        case ctrl('a'):
          select_all(ed);
          break;
        case ctrl('c'):
          copy_selection(ed);
          break;
        case ctrl('f'):
          find_text(ed, 0);
          break;
        case ctrl('l'):
          goto_line(ed);
          break;
        case ctrl('g'):
          find_text(ed, 1);
          break;
        case KEY_TAB:
          indent(ed, INDENT);
          break;
        case KEY_SHIFT_TAB:
          unindent(ed, INDENT);
          break;
        case KEY_ENTER:
          newline(ed);
          break;
        case KEY_BACKSPACE:
          backspace(ed);
          break;
        case KEY_DEL:
          del(ed);
          break;
        case ctrl('x'):
          cut_selection(ed);
          break;
        case ctrl('z'):
          undo(ed);
          break;
        case ctrl('r'):
          redo(ed);
          break;
        case ctrl('v'):
          paste_selection(ed);
          break;
        case ctrl('s'):
          save_editor(ed);
          break;
        case ctrl('q'):
          done = close_editor(ed);
          break;
        }
      }
    }

  gotoxy(ed, 0, ed->lines + 1);

  outstr(ed, RESET_COLOR CLREOL);

  if (ed->clipboard)
    neutron_free(ed->clipboard);

  if (ed->search)
    neutron_free(ed->search);

  if (ed->linebuf)
    neutron_free(ed->linebuf);

  clear_undo(ed);
  neutron_free(ed);
  }
示例#6
0
void redraw_screen(editor_t *ed)
  {
  get_console_size(ed);
  draw_screen(ed);
  }
int ListaCarti::row_for_index(int index)
{
    int rows = get_console_size().rows;

    return index + 3;
}
void ListaCarti::afiseaza()
{
    int columns = get_console_size().columns;
    int rows = get_console_size().rows;
    string c_titlu_text = "Titlu";
    string c_autor_text = "Autor";
    string c_editura_text = "Editura";
    string c_an_text = "An";
    string c_imprumutat_text = "Imprum.";

    int title_column_w = columns - 40;  // 40 = 20 pentru Editura, 10 pentru An, 10 pentru Imprumutat
    system("cls");
    SetConsoleTextAttribute(console, FOREGROUND_GREEN);

    CONSOLE_CURSOR_INFO cursorInfo;
    GetConsoleCursorInfo(console, &cursorInfo);
    cursorInfo.bVisible = FALSE;  // set the cursor visibility, http://stackoverflow.com/questions/18028808/blinking-underscore-with-console
    SetConsoleCursorInfo(console, &cursorInfo);

    // Deseneaza partea de sus a chenarului
    cout << (char)201;
    // Titlu
    for (int i=0; i<title_column_w/2-2; i++)    // -2 deoarece aici avem si coltul din stanga-sus
    {
        cout << (char)205;
    }
    cout << (char)209;  // Separator de coloana - https://www.google.ro/search?q=ascii+tabel&tbm=isch&imgil=IvVP_xaycIIKOM%253A%253BJMtOixefP_tDJM%253Bhttp%25253A%25252F%25252Fwww.asciitable.com%25252F&source=iu&pf=m&fir=IvVP_xaycIIKOM%253A%252CJMtOixefP_tDJM%252C_&biw=1536&bih=701&ved=0ahUKEwi-46TwwrjKAhUDWiwKHTzCCSwQyjcIMg&ei=Jo-fVr64DoO0sQG8hKfgAg#imgrc=IvVP_xaycIIKOM%3A
    // Autor
    for (int i=0; i<title_column_w/2-1; i++)
    {
        cout << (char)205;
    }
    cout << (char)209;  // Separator de coloana
    // Editura
    for (int i=0; i<EDITURA_W-1; i++)
    {
        cout << (char)205;
    }
    cout << (char)209;  // Separator de coloana
    // An
    for (int i=0; i<AN_W-1; i++)
    {
        cout << (char)205;
    }
    cout << (char)209;  // Separator de coloana
    // Imprumutat
    for (int i=0; i<IMPRUMUTAT_W-1; i++)
    {
        cout << (char)205;
    }
    cout << (char)187;

    // Randul cu titlurile coloanelor
    // Titlu
    cout << (char)186;
    int titlu_x_start = title_column_w/4 - c_titlu_text.length()/2;
    for (int i=1; i<titlu_x_start; i++)
    {
        cout << " ";
    }
    cout << c_titlu_text;
    for (int i=titlu_x_start+c_titlu_text.length(); i<title_column_w/2-1; i++)
    {
        cout << " ";
    }
    cout << (char)179;

    // Autor
    int autor_x_start = title_column_w/4 - c_autor_text.length()/2;
    for (int i=1; i<autor_x_start; i++)
    {
        cout << " ";
    }
    cout << c_autor_text;
    for (int i=autor_x_start+c_autor_text.length(); i<title_column_w/2; i++)
    {
        cout << " ";
    }
    cout << (char)179;

    // Editura
    int editura_x_start = EDITURA_W/2 - c_editura_text.length()/2;
    for (int i=1; i<editura_x_start; i++)
    {
        cout << " ";
    }
    cout << c_editura_text;
    for (int i=editura_x_start+c_editura_text.length(); i<EDITURA_W; i++)
    {
        cout << " ";
    }
    cout << (char)179;

    // An
    int an_x_start = AN_W/2 - c_an_text.length()/2;
    for (int i=1; i<an_x_start; i++)
    {
        cout << " ";
    }
    cout << c_an_text;
    for (int i=an_x_start+c_an_text.length(); i<AN_W; i++)
    {
        cout << " ";
    }
    cout << (char)179;

    // Imprumutat
    int imprumutat_x_start = IMPRUMUTAT_W/2 - c_imprumutat_text.length()/2;
    for (int i=1; i<imprumutat_x_start; i++)
    {
        cout << " ";
    }
    cout << c_imprumutat_text;
    for (int i=imprumutat_x_start+c_imprumutat_text.length(); i<IMPRUMUTAT_W; i++)
    {
        cout << " ";
    }
    cout << (char)186;

    // Separator
    cout << (char)199;
    for (int i=1; i<title_column_w/2-1; i++)
    {
        cout << (char)196;
    }
    cout << (char)197;
    for (int i=title_column_w/2+1; i<title_column_w; i++)
    {
        cout << (char)196;
    }
    cout << (char)197;
    for (int i=1; i<EDITURA_W; i++)
    {
        cout << (char)196;
    }
    cout << (char)197;
    for (int i=1; i<AN_W; i++)
    {
        cout << (char)196;
    }
    cout << (char)197;
    for (int i=1; i<IMPRUMUTAT_W; i++)
    {
        cout << (char)196;
    }
    cout << (char)182;

    // Interogare SQL
    sqlite3 *db;
    sqlite3_stmt *stmt;
    indexuri.clear();

    int rc = sqlite3_open((ExePath() + "\\biblioteca.sqlite").c_str(), &db);
    if (rc)
    {
        cout << string("Eroare la deschiderea bazei de date: ") + sqlite3_errmsg(db);
        return;
    }
    string sql = "SELECT id, titlu, autor, editura, an, imprumutat, pagini, isbn FROM carti ";
    if (filtru.length()) // filtru= 'black' din 'black beauty'
    {
        sql += string(" WHERE (titlu LIKE '%") + filtru + "%')";
        sql += string(" OR (autor LIKE '%") + filtru + "%')";
        sql += string(" OR (editura LIKE '%") + filtru + "%')";
    }
    if (filtrare != toate) // In cazul in care vrem sa vedem cartile disponibile sau cele imprumutate
    {
        if (filtru.length())
        {
            sql += " AND";
        }
        else
        {
            sql += " WHERE";
        }
        switch (filtrare)
        {
        case disponibile:
            sql += " imprumutat='0'";
            break;
        case imprumutate:
            sql += " imprumutat='" + to_string(EcranLogin::current_user.id) + "'";
            break;
        }
    }
    rc = sqlite3_prepare_v2(db, sql.c_str(), -1, &stmt, NULL);
    if (rc == SQLITE_OK)
    {
        int idx = 0;
        while (TRUE)
        {
            rc = sqlite3_step(stmt);
            if (rc != SQLITE_ROW && rc != SQLITE_DONE)
            {
                string errmsg(sqlite3_errmsg(db));
                sqlite3_finalize(stmt);
                sqlite3_close(db);
                break;
            }

            if (rc == SQLITE_ROW)
            {
                Carte carte;
                carte.id = sqlite3_column_int(stmt, 0);
                carte.titlu = (char*)sqlite3_column_text(stmt, 1);
                carte.autor = (char*)sqlite3_column_text(stmt, 2);
                carte.editura = (char*)sqlite3_column_text(stmt, 3);
                carte.an = (char*)sqlite3_column_text(stmt, 4);
                carte.imprumutat = sqlite3_column_int(stmt, 5);
                carte.nr_pag = (char*)sqlite3_column_text(stmt, 6);
                carte.isbn = (char*)sqlite3_column_text(stmt, 7);

                indexuri[idx] = carte;

                // Titlul cartii
                cout << (char)186;
                int titlu_carte_x_start = title_column_w/4 - carte.titlu.length()/2;
                for (int i=1; i<titlu_carte_x_start; i++)
                {
                    cout << " ";
                }
                cout << carte.titlu;
                for (int i=titlu_carte_x_start+carte.titlu.length(); i<title_column_w/2-1; i++)
                {
                    cout << " ";
                }
                cout << (char)179;

                // Autorul cartii
                int autor_carte_x_start = title_column_w/4 - carte.autor.length()/2;
                for (int i=1; i<autor_carte_x_start; i++)
                {
                    cout << " ";
                }
                cout << carte.autor;
                for (int i=autor_carte_x_start+carte.autor.length(); i<title_column_w/2; i++)
                {
                    cout << " ";
                }
                cout << (char)179;

                // Editura cartii
                int editura_carte_x_start = EDITURA_W/2 - carte.editura.length()/2;
                for (int i=1; i<editura_carte_x_start; i++)
                {
                    cout << " ";
                }
                cout << carte.editura;
                for (int i=editura_carte_x_start+carte.editura.length(); i<EDITURA_W; i++)
                {
                    cout << " ";
                }
                cout << (char)179;

                // Anul cartii
                int an_carte_x_start = AN_W/2 - carte.an.length()/2;
                for (int i=1; i<an_carte_x_start; i++)
                {
                    cout << " ";
                }
                cout << carte.an;
                for (int i=an_carte_x_start+carte.an.length(); i<AN_W; i++)
                {
                    cout << " ";
                }
                cout << (char)179;

                // Imprumutat
                string imprumutat_carte = (carte.imprumutat == 0) ? "NU" : "DA";
                int imprumutat_carte_x_start = IMPRUMUTAT_W/2 - imprumutat_carte.length()/2;
                for (int i=1; i<imprumutat_carte_x_start; i++)
                {
                    cout << " ";
                }
                cout << imprumutat_carte;
                for (int i=imprumutat_carte_x_start+imprumutat_carte.length(); i<IMPRUMUTAT_W; i++)
                {
                    cout << " ";
                }
                cout << (char)186;

                idx++;
            }
            else
            {
                sqlite3_finalize(stmt);
                sqlite3_close(db);
                break;
            }
        }
    }
    sqlite3_finalize(stmt);
    sqlite3_close(db);

    // Deseneaza randurile goale, daca e nevoie
    for (int i=indexuri.size(); i<rows-6; i++)
    {
        cout << (char)186;
        for (int j=1; j<title_column_w/2-1; j++)
        {
            cout << " ";
        }
        cout << (char)179;
        for (int j=1; j<title_column_w/2; j++)
        {
            cout << " ";
        }
        cout << (char)179;
        for (int j=1; j<EDITURA_W; j++)
        {
            cout << " ";
        }
        cout << (char)179;
        for (int j=1; j<AN_W; j++)
        {
            cout << " ";
        }
        cout << (char)179;
        for (int j=1; j<IMPRUMUTAT_W; j++)
        {
            cout << " ";
        }
        cout << (char)186;
    }

    // Deseneaza latura de jos a chenarului
    cout << (char)200;
    for (int j=1; j<title_column_w/2-1; j++)
    {
        cout << char(205);
    }
    cout << (char)207;
    for (int j=1; j<title_column_w/2; j++)
    {
        cout << char(205);
    }
    cout << (char)207;
    for (int j=1; j<EDITURA_W; j++)
    {
        cout << char(205);
    }
    cout << (char)207;
    for (int j=1; j<AN_W; j++)
    {
        cout << char(205);
    }
    cout << (char)207;
    for (int j=1; j<IMPRUMUTAT_W; j++)
    {
        cout << char(205);
    }
    cout << (char)188;

    // Afiseaza tastele pentru modificarea listei
    if (editare != NULL)
    {
        string taste = "F2: Modifica | F8: Sterge";
        cout << taste;
        for (int i=taste.length(); i<columns; i++)
        {
            cout << " ";
        }
    }
    else
    {
        string taste;
        if (filtrare == disponibile)
        {
            taste = "F2: Imprumuta";
        }
        else if (filtrare == imprumutate)
        {
            taste = "F2: Returneaza";
        }
        cout << taste;
        for (int i=taste.length(); i<columns; i++)
        {
            cout << " ";
        }
    }

    current_index = 0;
    highlight_index(current_index);
    if (filtru.length())
    {
        afiseaza_cautare();
    }

    while (TRUE)
    {
        int key = getch();
        if (key == 13)
        {
            if (indexuri.size() == 0) continue;
            if (filtru.length())
            {
                afiseaza();
                break;
            }
            Carte carte = indexuri[current_index];
            selection(carte);
            break;
        }
        else if (key == 224)      // vezi http://stackoverflow.com/questions/10463201/getch-and-arrow-codes
        {
            // empty the buffer, we don't want arrow keys to appear as letters
            int ch = getch();
            if (indexuri.size() == 0) continue;
            if (ch == 80)
            {
                clear_selection(current_index);
                current_index += 1;
                if (current_index > indexuri.size()-1) current_index = 0;
                highlight_index(current_index);
            }
            else if (ch == 72)
            {
                clear_selection(current_index);
                current_index -= 1;
                if (current_index < 0) current_index = indexuri.size() - 1;
                highlight_index(current_index);
            }
        }
        else if (key >= 32 && key <= 126)
        {
            if (filtru.length() == 0) afiseaza_cautare();
            if (filtru.length() > MAX_FILTRU_LENGTH) continue;
            filtru += (char)key;
            cout << (char)key;
        }
        else if (key == 8)      // backspace
        {
            filtru = filtru.substr(0, filtru.size()-1);
            cout << (char)key;
            cout << " ";
            cout << (char)key;
            if (filtru.length() == 0)
            {
                ascunde_cautare();
                afiseaza();
                continue;
            }
        }
        else if (key == 255)
        {
            afiseaza();
            break;
        }
        else if (key == 27)
        {
            if (filtru.length())
            {
                filtru = "";
                afiseaza();
                ascunde_cautare();
                continue;
            }
            cancel();
            break;
        }
        else if (key == 0)      // S-a apasat una din tastele F1, F2, F3, etc...
        {
            int f = getch();
            if (indexuri.size() == 0) continue;
            if (editare != NULL)    // Utilizatorul este admin
            {
                if (f == 60)    // F2
                {
                    editeaza_carte(current_index);
                }
                else if (f == 66)      // F8
                {
                    sterge_carte(current_index);
                }
            }
            else      // Utilizatorul este student
            {
                if (filtrare == disponibile)
                {
                    imprumuta_carte(current_index);
                }
                else if (filtrare == imprumutate)
                {
                    returneaza_carte(current_index);
                }
            }
        }
    }
}