Corretta gestione annullamento di una riga degli sheet
git-svn-id: svn://10.65.10.50/trunk@960 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
		
							parent
							
								
									a33eb771fb
								
							
						
					
					
						commit
						b4703266c9
					
				@ -128,8 +128,8 @@ void TBanner::handler(WINDOW win, EVENT* ep)
 | 
			
		||||
    x = (r.right-r.left-w)>>1, y = r.bottom - CHARY;
 | 
			
		||||
    win_draw_text(win, x, y, t, -1);
 | 
			
		||||
 | 
			
		||||
    r.left += 4; r.right -= 4;
 | 
			
		||||
    r.top += 4; r.bottom -= 4;
 | 
			
		||||
    r.left += 5; r.right -= 4;
 | 
			
		||||
    r.top += 5; r.bottom -= 4;
 | 
			
		||||
    set_pen(COLOR_WHITE); win_draw_rect(win, &r);
 | 
			
		||||
    offset_rect(&r, -1, -1);
 | 
			
		||||
    set_pen(COLOR_BLACK); win_draw_rect(win, &r);
 | 
			
		||||
 | 
			
		||||
@ -43,7 +43,8 @@ class TSpreadsheet : public TWindow
 | 
			
		||||
  TMask_field* _edit_field;      // Current edit field
 | 
			
		||||
  int _cur_row, _cur_rec, _cur_col;      // Current cell
 | 
			
		||||
  bool _row_dirty;               // Current row changed
 | 
			
		||||
  bool _check_enabled;           // Perform OFF_ROW checks
 | 
			
		||||
  bool _check_enabled;           // Perform OFF_ROW and OFF_CELL checks
 | 
			
		||||
  bool _update;                  // It's safe to update the display
 | 
			
		||||
  
 | 
			
		||||
  TString16 _button;
 | 
			
		||||
 | 
			
		||||
@ -59,8 +60,8 @@ protected:
 | 
			
		||||
  TMask_field* field(short id) const;
 | 
			
		||||
 | 
			
		||||
  int rec2row(int rec);
 | 
			
		||||
  int row2rec(int row);
 | 
			
		||||
  int set_pos(int row, int col) { _cur_col = col; return _cur_rec = row2rec(_cur_row = row); }
 | 
			
		||||
  int row2rec(int& row);
 | 
			
		||||
  int set_pos(int row, int col) { _cur_col = col; _cur_row = row; return _cur_rec = row2rec(_cur_row); }
 | 
			
		||||
 | 
			
		||||
  bool notify(int row, KEY k);
 | 
			
		||||
  void notify_change();
 | 
			
		||||
@ -127,7 +128,7 @@ TSpreadsheet::TSpreadsheet(short x, short y, short dx, short dy,
 | 
			
		||||
                           TSheet_field* o)
 | 
			
		||||
: _mask(maskname, maskno), _notify(NULL), _edit_field(NULL), 
 | 
			
		||||
  _owner(o), _cur_row(0), _cur_col(0), _active(TRUE),
 | 
			
		||||
  _row_dirty(FALSE), _check_enabled(TRUE), _firstfocus(TRUE)
 | 
			
		||||
  _row_dirty(FALSE), _check_enabled(TRUE), _firstfocus(TRUE), _update(TRUE)
 | 
			
		||||
{
 | 
			
		||||
  const int NUMBER_WIDTH = 3;
 | 
			
		||||
  const int MAX_COL = 32;
 | 
			
		||||
@ -291,22 +292,30 @@ TSpreadsheet::~TSpreadsheet()
 | 
			
		||||
}             
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
// Converts a row number in the correspondig record number
 | 
			
		||||
int TSpreadsheet::row2rec(int row)
 | 
			
		||||
int TSpreadsheet::row2rec(int& row)
 | 
			
		||||
{
 | 
			
		||||
  int rows;
 | 
			
		||||
  const long* rec = xi_get_list_info(_list, &rows);
 | 
			
		||||
  
 | 
			
		||||
  if (row < 0 || row >= rows)
 | 
			
		||||
  int r = -1;
 | 
			
		||||
  if (row < 0) 
 | 
			
		||||
  {
 | 
			
		||||
#ifdef DBG
 | 
			
		||||
    error_box("Line %d is not visible: the last one is %d", row, rows);
 | 
			
		||||
#endif
 | 
			
		||||
    return 0;
 | 
			
		||||
    row = 0;
 | 
			
		||||
    r = (int)rec[row]-1; 
 | 
			
		||||
  }  
 | 
			
		||||
  else 
 | 
			
		||||
    if (row >= rows) 
 | 
			
		||||
    { 
 | 
			
		||||
      row = rows-1;
 | 
			
		||||
      r = (int)rec[row]+1; 
 | 
			
		||||
    }  
 | 
			
		||||
    else 
 | 
			
		||||
      r = (int)rec[row];
 | 
			
		||||
  
 | 
			
		||||
  return (int)rec[row];
 | 
			
		||||
  CHECKD(r >= 0 && r <= items(), "Sheet line out of range: ", row);
 | 
			
		||||
 | 
			
		||||
  return r;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -375,7 +384,7 @@ void TSpreadsheet::set_focus_cell(int riga, int colonna)
 | 
			
		||||
  if (colonna < _columns)
 | 
			
		||||
  {          
 | 
			
		||||
    XI_OBJ cell;     
 | 
			
		||||
    XI_MAKE_CELL(&cell, _list, r, colonna);
 | 
			
		||||
    XI_MAKE_CELL(&cell, _list, riga, colonna);
 | 
			
		||||
    xi_set_focus(&cell);          
 | 
			
		||||
    
 | 
			
		||||
    if (_edit_field == NULL)
 | 
			
		||||
@ -433,6 +442,8 @@ bool TSpreadsheet::destroy(int rec)
 | 
			
		||||
 | 
			
		||||
void TSpreadsheet::update(int row)
 | 
			
		||||
{                        
 | 
			
		||||
  if (_update)
 | 
			
		||||
  {
 | 
			
		||||
    if (row < 0)
 | 
			
		||||
    {                 
 | 
			
		||||
      xi_cell_request(_list);                 // Force updatde
 | 
			
		||||
@ -440,6 +451,7 @@ void TSpreadsheet::update(int row)
 | 
			
		||||
    }
 | 
			
		||||
    else
 | 
			
		||||
      update_rec(row);  
 | 
			
		||||
  }    
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -538,7 +550,7 @@ void TSpreadsheet::list_handler(XI_EVENT *xiev)
 | 
			
		||||
          }
 | 
			
		||||
          if (field(cid)->has_query())
 | 
			
		||||
          {
 | 
			
		||||
            xiev->v.cell_request.button =
 | 
			
		||||
            xiev->v.cell_request.button = TRUE;
 | 
			
		||||
            xiev->v.cell_request.button_on_focus = TRUE;
 | 
			
		||||
          }
 | 
			
		||||
          if (cell_disabled(rec, col))
 | 
			
		||||
@ -547,10 +559,12 @@ void TSpreadsheet::list_handler(XI_EVENT *xiev)
 | 
			
		||||
      }  
 | 
			
		||||
    } else src = format("%d", rec+1);
 | 
			
		||||
 | 
			
		||||
    const int len = xiev->v.cell_request.len;
 | 
			
		||||
    char* dst = xiev->v.cell_request.s;
 | 
			
		||||
    if (src)
 | 
			
		||||
    if (src && *src)
 | 
			
		||||
    {
 | 
			
		||||
      const int len = xiev->v.cell_request.len;
 | 
			
		||||
      strncpy(dst, src, len);
 | 
			
		||||
    }  
 | 
			
		||||
    else
 | 
			
		||||
      *dst = '\0';
 | 
			
		||||
  }
 | 
			
		||||
@ -610,7 +624,9 @@ void TSpreadsheet::list_handler(XI_EVENT *xiev)
 | 
			
		||||
    {
 | 
			
		||||
      update_rec(_cur_rec);
 | 
			
		||||
      _row_dirty = TRUE;
 | 
			
		||||
    }
 | 
			
		||||
    } else
 | 
			
		||||
      if (k == K_DEL)
 | 
			
		||||
        _row_dirty = _cell_dirty = FALSE;
 | 
			
		||||
 | 
			
		||||
    if (!cell_disabled(_cur_rec, _cur_col-1))
 | 
			
		||||
      set_focus_cell(_cur_row, _cur_col);
 | 
			
		||||
@ -652,8 +668,10 @@ void TSpreadsheet::list_handler(XI_EVENT *xiev)
 | 
			
		||||
      bool ok = sheet_mask().check_fields();
 | 
			
		||||
      if (ok) 
 | 
			
		||||
      { 
 | 
			
		||||
        _update = FALSE;
 | 
			
		||||
        mask2str(_cur_rec);               
 | 
			
		||||
        ok = notify(_cur_rec, K_ENTER);       // Notify edit
 | 
			
		||||
        _update = TRUE;
 | 
			
		||||
      } 
 | 
			
		||||
      if (!ok)
 | 
			
		||||
        xiev->refused = TRUE;
 | 
			
		||||
@ -965,17 +983,18 @@ TMask& TSpreadsheet::mask() const
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
// Ritorna il campo con l'identificatore dato della maschera dello sheet
 | 
			
		||||
TMask_field* TSpreadsheet::field(short id) const
 | 
			
		||||
{
 | 
			
		||||
  const int pos = _mask.id2pos(id);
 | 
			
		||||
  if (pos < 0) return NULL;
 | 
			
		||||
  return &_mask.fld(pos);
 | 
			
		||||
  return pos < 0 ? NULL : &_mask.fld(pos);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void TSpreadsheet::mask2str(int riga)
 | 
			
		||||
// Ricopia i campi della maschera nel record dato ed aggiorna il display
 | 
			
		||||
void TSpreadsheet::mask2str(int rec)
 | 
			
		||||
{
 | 
			
		||||
  TToken_string& r = row(riga);
 | 
			
		||||
  TToken_string& r = row(rec);
 | 
			
		||||
  r.cut(0);
 | 
			
		||||
  for (short id = FIRST_FIELD; ; id++)
 | 
			
		||||
  {                                 
 | 
			
		||||
@ -1000,7 +1019,7 @@ void TSpreadsheet::mask2str(int riga)
 | 
			
		||||
#endif    
 | 
			
		||||
  }
 | 
			
		||||
#if XVT_OS == XVT_OS_WIN
 | 
			
		||||
  update_rec(riga);
 | 
			
		||||
  update(rec);
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -1235,7 +1254,7 @@ void TSheet_field::create(WINDOW parent)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
// Certified 100%
 | 
			
		||||
TArray& TSheet_field::rows_array() const
 | 
			
		||||
TString_array& TSheet_field::rows_array() const
 | 
			
		||||
{
 | 
			
		||||
  return _sheet->rows_array();
 | 
			
		||||
}
 | 
			
		||||
@ -1268,6 +1287,7 @@ TToken_string& TSheet_field::row(int n)
 | 
			
		||||
void TSheet_field::force_update(int r)
 | 
			
		||||
{
 | 
			
		||||
#if XVT_OS == XVT_OS_WIN
 | 
			
		||||
  if (_sheet->_check_enabled)
 | 
			
		||||
    _sheet->update(r);
 | 
			
		||||
#else
 | 
			
		||||
  _sheet->open();
 | 
			
		||||
 | 
			
		||||
@ -30,7 +30,7 @@ protected:
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
  TToken_string& row(int n);    // Get/Create a new row
 | 
			
		||||
  TArray& rows_array() const;   // Get all rows
 | 
			
		||||
  TString_array& rows_array() const;   // Get all rows
 | 
			
		||||
  int first_empty() const;      // First empty row
 | 
			
		||||
  int items() const;            // Number of rows
 | 
			
		||||
  int selected() const;         // Number of current row
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user