📄 view_table_control.cpp
字号:
///////////////////////////////////////////////////////////
// //
// SAGA //
// //
// System for Automated Geoscientific Analyses //
// //
// User Interface //
// //
// Program: SAGA //
// //
//-------------------------------------------------------//
// //
// VIEW_Table_Control.cpp //
// //
// Copyright (C) 2005 by Olaf Conrad //
// //
//-------------------------------------------------------//
// //
// This file is part of 'SAGA - System for Automated //
// Geoscientific Analyses'. SAGA is free software; you //
// can redistribute it and/or modify it under the terms //
// of the GNU General Public License as published by the //
// Free Software Foundation; version 2 of the License. //
// //
// SAGA is distributed in the hope that it will be //
// useful, but WITHOUT ANY WARRANTY; without even the //
// implied warranty of MERCHANTABILITY or FITNESS FOR A //
// PARTICULAR PURPOSE. See the GNU General Public //
// License for more details. //
// //
// You should have received a copy of the GNU General //
// Public License along with this program; if not, //
// write to the Free Software Foundation, Inc., //
// 59 Temple Place - Suite 330, Boston, MA 02111-1307, //
// USA. //
// //
//-------------------------------------------------------//
// //
// contact: Olaf Conrad //
// Institute of Geography //
// University of Goettingen //
// Goldschmidtstr. 5 //
// 37077 Goettingen //
// Germany //
// //
// e-mail: oconrad@saga-gis.org //
// //
///////////////////////////////////////////////////////////
//---------------------------------------------------------
///////////////////////////////////////////////////////////
// //
// //
// //
///////////////////////////////////////////////////////////
//---------------------------------------------------------
#include <wx/window.h>
#include <saga_api/saga_api.h>
#include "res_commands.h"
#include "res_dialogs.h"
#include "helper.h"
#include "wksp_data_manager.h"
#include "view_table_control.h"
///////////////////////////////////////////////////////////
// //
// //
// //
///////////////////////////////////////////////////////////
//---------------------------------------------------------
#define FIXED_COLS ((m_Constraint & TABLE_CTRL_FIXED_COLS) != 0)
#define FIXED_ROWS ((m_Constraint & TABLE_CTRL_FIXED_ROWS) != 0)
#define FIXED_TABLE ((m_Constraint & TABLE_CTRL_FIXED_TABLE) != 0)
//---------------------------------------------------------
#define SET_CELL_VALUE(REC, FLD, VAL) SetCellValue(REC, FLD, VAL)
#define SET_CELL_COLOR(REC, FLD, VAL) SetCellBackgroundColour(REC, FLD, wxColour(SG_GET_R(VAL), SG_GET_G(VAL), SG_GET_B(VAL)))
///////////////////////////////////////////////////////////
// //
// //
// //
///////////////////////////////////////////////////////////
//---------------------------------------------------------
IMPLEMENT_CLASS(CVIEW_Table_Control, wxGrid)
//---------------------------------------------------------
BEGIN_EVENT_TABLE(CVIEW_Table_Control, wxGrid)
EVT_GRID_CELL_CHANGE (CVIEW_Table_Control::On_Change)
EVT_GRID_CELL_LEFT_CLICK (CVIEW_Table_Control::On_LClick)
EVT_GRID_LABEL_LEFT_CLICK (CVIEW_Table_Control::On_LClick_Label)
EVT_GRID_LABEL_LEFT_DCLICK (CVIEW_Table_Control::On_LDClick_Label)
EVT_GRID_LABEL_RIGHT_CLICK (CVIEW_Table_Control::On_RClick_Label)
EVT_GRID_RANGE_SELECT (CVIEW_Table_Control::On_Select)
EVT_MENU (ID_CMD_TABLE_FIELD_ADD , CVIEW_Table_Control::On_Field_Add)
EVT_UPDATE_UI (ID_CMD_TABLE_FIELD_ADD , CVIEW_Table_Control::On_Field_Add_UI)
EVT_MENU (ID_CMD_TABLE_FIELD_DEL , CVIEW_Table_Control::On_Field_Del)
EVT_UPDATE_UI (ID_CMD_TABLE_FIELD_DEL , CVIEW_Table_Control::On_Field_Del_UI)
EVT_MENU (ID_CMD_TABLE_FIELD_SORT , CVIEW_Table_Control::On_Field_Sort)
EVT_UPDATE_UI (ID_CMD_TABLE_FIELD_SORT , CVIEW_Table_Control::On_Field_Sort_UI)
EVT_MENU (ID_CMD_TABLE_RECORD_ADD , CVIEW_Table_Control::On_Record_Add)
EVT_UPDATE_UI (ID_CMD_TABLE_RECORD_ADD , CVIEW_Table_Control::On_Record_Add_UI)
EVT_MENU (ID_CMD_TABLE_RECORD_INS , CVIEW_Table_Control::On_Record_Ins)
EVT_UPDATE_UI (ID_CMD_TABLE_RECORD_INS , CVIEW_Table_Control::On_Record_Ins_UI)
EVT_MENU (ID_CMD_TABLE_RECORD_DEL , CVIEW_Table_Control::On_Record_Del)
EVT_UPDATE_UI (ID_CMD_TABLE_RECORD_DEL , CVIEW_Table_Control::On_Record_Del_UI)
EVT_MENU (ID_CMD_TABLE_RECORD_DEL_ALL , CVIEW_Table_Control::On_Record_Clr)
EVT_UPDATE_UI (ID_CMD_TABLE_RECORD_DEL_ALL , CVIEW_Table_Control::On_Record_Clr_UI)
EVT_MENU (ID_CMD_TABLE_AUTOSIZE_COLS , CVIEW_Table_Control::On_Autosize_Cols)
EVT_MENU (ID_CMD_TABLE_AUTOSIZE_ROWS , CVIEW_Table_Control::On_Autosize_Rows)
END_EVENT_TABLE()
///////////////////////////////////////////////////////////
// //
// //
// //
///////////////////////////////////////////////////////////
//---------------------------------------------------------
CVIEW_Table_Control::CVIEW_Table_Control(wxWindow *pParent, CSG_Table *pTable, int Constraint)
: wxGrid(pParent, -1, wxDefaultPosition, wxDefaultSize, wxWANTS_CHARS|wxSUNKEN_BORDER)
{
m_pTable = pTable;
m_Constraint = Constraint;
CreateGrid(m_pTable->Get_Record_Count(), m_pTable->Get_Field_Count(), wxGrid::wxGridSelectRows);
_Set_Table();
}
//---------------------------------------------------------
CVIEW_Table_Control::~CVIEW_Table_Control(void)
{
}
///////////////////////////////////////////////////////////
// //
// //
// //
///////////////////////////////////////////////////////////
//---------------------------------------------------------
void CVIEW_Table_Control::Update_Table(void)
{
_Set_Table();
}
//---------------------------------------------------------
void CVIEW_Table_Control::Sort_Table(int iField, int Direction)
{
if( iField >= 0 && iField < m_pTable->Get_Field_Count() )
{
switch( Direction )
{
default: m_pTable->Toggle_Index(iField); break;
case 0: m_pTable->Set_Index(iField, TABLE_INDEX_None); break;
case 1: m_pTable->Set_Index(iField, TABLE_INDEX_Up ); break;
case 2: m_pTable->Set_Index(iField, TABLE_INDEX_Down); break;
}
_Set_Records();
}
}
//---------------------------------------------------------
bool CVIEW_Table_Control::_Set_Table(void)
{
int iField, Difference;
//-----------------------------------------------------
BeginBatch();
//-----------------------------------------------------
Difference = m_pTable->Get_Record_Count() - GetNumberRows();
if( Difference > 0 )
{
AppendRows(Difference);
}
else if( Difference < 0 )
{
DeleteRows(0, -Difference);
}
//-----------------------------------------------------
Difference = m_pTable->Get_Field_Count() - GetNumberCols();
if( Difference > 0 )
{
AppendCols(Difference);
}
else if( Difference < 0 )
{
DeleteCols(0, -Difference);
// here is a memory leak - solution: use own wxGridTableBase derived grid table class
}
//-----------------------------------------------------
for(iField=0; iField<m_pTable->Get_Field_Count(); iField++)
{
SetColLabelValue(iField, m_pTable->Get_Field_Name(iField));
switch( m_pTable->Get_Field_Type(iField) )
{
case TABLE_FIELDTYPE_Char:
case TABLE_FIELDTYPE_String: default:
break;
case TABLE_FIELDTYPE_Short:
case TABLE_FIELDTYPE_Int:
case TABLE_FIELDTYPE_Long:
SetColFormatNumber(iField);
break;
case TABLE_FIELDTYPE_Float:
case TABLE_FIELDTYPE_Double:
SetColFormatFloat(iField);
break;
case TABLE_FIELDTYPE_Color:
SetColFormatNumber(iField);
break;
}
}
//-----------------------------------------------------
_Set_Records();
//-----------------------------------------------------
EndBatch();
return( true );
}
//---------------------------------------------------------
bool CVIEW_Table_Control::_Set_Records(void)
{
BeginBatch();
for(int iRecord=0; iRecord<m_pTable->Get_Record_Count() && PROGRESSBAR_Set_Position(iRecord, m_pTable->Get_Record_Count()); iRecord++)
{
_Set_Record(iRecord, m_pTable->Get_Record_byIndex(iRecord));
}
PROCESS_Set_Okay();
Update_Selection();
EndBatch();
return( true );
}
//---------------------------------------------------------
bool CVIEW_Table_Control::_Set_Record(int iRecord, CSG_Table_Record *pRecord)
{
if( pRecord && iRecord >= 0 && iRecord < GetNumberRows() )
{
for(int iField=0; iField<m_pTable->Get_Field_Count(); iField++)
{
switch( m_pTable->Get_Field_Type(iField) )
{
default:
SET_CELL_VALUE(iRecord, iField, pRecord->asString (iField));
break;
case TABLE_FIELDTYPE_Color:
SET_CELL_COLOR(iRecord, iField, pRecord->asInt (iField));
break;
}
}
return( true );
}
return( false );
}
///////////////////////////////////////////////////////////
// //
// //
// //
///////////////////////////////////////////////////////////
//---------------------------------------------------------
bool CVIEW_Table_Control::Add_Record(void)
{
if( !FIXED_ROWS )
{
AppendRows();
_Set_Record(m_pTable->Get_Record_Count(), m_pTable->Add_Record());
return( true );
}
return( false );
}
//---------------------------------------------------------
bool CVIEW_Table_Control::Ins_Record(void)
{
if( !FIXED_ROWS )
{
int iRecord = GetGridCursorRow();
if( iRecord >= 0 && iRecord < GetNumberRows() )
{
InsertRows(iRecord);
_Set_Record(iRecord, m_pTable->Ins_Record(iRecord));
return( true );
}
}
return( false );
}
//---------------------------------------------------------
bool CVIEW_Table_Control::Del_Record(void)
{
if( !FIXED_ROWS )
{
int iRecord = GetGridCursorRow();
if( iRecord >= 0 && iRecord < GetNumberRows() )
{
DeleteRows(iRecord);
m_pTable->Del_Record(iRecord);
return( true );
}
}
return( false );
}
//---------------------------------------------------------
bool CVIEW_Table_Control::Del_Records(void)
{
if( !FIXED_ROWS && m_pTable->Del_Records() )
{
DeleteRows(0, GetNumberRows());
return( true );
}
return( false );
}
///////////////////////////////////////////////////////////
// //
// //
// //
///////////////////////////////////////////////////////////
//---------------------------------------------------------
bool CVIEW_Table_Control::Load(const wxChar *File_Name)
{
bool bResult = false;
CSG_Table Table;
if( Table.Create(File_Name)
&& Table.Get_Record_Count() > 0
&& Table.Get_Field_Count() == m_pTable->Get_Field_Count() )
{
m_pTable->Assign_Values(&Table);
_Set_Table();
bResult = true;
}
PROCESS_Set_Okay();
return( bResult );
}
//---------------------------------------------------------
bool CVIEW_Table_Control::Save(const wxChar *File_Name, int Format)
{
bool bResult;
bResult = m_pTable->Save(File_Name);
PROCESS_Set_Okay();
return( bResult );
}
///////////////////////////////////////////////////////////
// //
// //
// //
///////////////////////////////////////////////////////////
//---------------------------------------------------------
void CVIEW_Table_Control::On_Change(wxGridEvent &event)
{
int iRecord, iField;
CSG_Table_Record *pRecord;
iRecord = event.GetRow();
if( (pRecord = m_pTable->Get_Record_byIndex(iRecord)) != NULL )
{
iField = event.GetCol();
if( iField >= 0 && iField < m_pTable->Get_Field_Count() )
{
pRecord->Set_Value(iField, GetCellValue(iRecord, iField).c_str());
SET_CELL_VALUE(iRecord, iField, pRecord->asString(iField));
}
}
}
///////////////////////////////////////////////////////////
// //
// //
// //
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -