📄 treeeditcontrol.h
字号:
_DBINT("Start Edit returns ", nOK)
}
else
{
*pCancel = FALSE; // no editor created, allow grid's own editor
}
m_nEditRow = nRow;
m_nEditCol = nCol;
return;
}
else
{
string str = m_flx.EditMask;
if(!str.IsEmpty())
{
str.Empty();
m_flx.EditMask = str;
}
}
if(nCol != EDIT_COL_INDEX || NULL == trNode) // col(0) parameter labels, cannot edit
{
*pCancel = TRUE;
return;
}
m_flx.ComboList = get_node_combo_str(trNode);
}
//virtual
void OnAfterEdit(int nRow, int nCol)
{
//Profiler jj;
GridListControl::OnAfterEdit(nRow, nCol);//m_bMouseDownToggleCheck = false;//---- CPY 5/20/03 CHECK_BOX_CLICK_OUTSIDE_CHECK_TO_TOGGLE
bool bCheckCellSizeChange = false; // only certain cell type need checking CPY 8/24/03 v7.5674 QA70-5061 ADD_DISPLAY_OPTIONS
TreeNode trNode = get_tree_node(nRow);
if(trNode)
{
string strOldVal = trNode.Text;
int nVal;
DWORD dwTemp = m_flx.Cell(flexcpData, nRow, nCol);
if(dwTemp)
{
EditorManager trNodeManager;
BOOL bModified;
if(m_dwEditor)
bModified = trNodeManager.AfterEdit(dwTemp);
else if(TRGP_RANGE == trNode.ID)
{
string strCellText = m_flx.Cell(flexcpText, nRow, nCol);
bModified = trNodeManager.AfterEdit(dwTemp, AFTER_EDIT_USE_STR, strCellText);
string strNew = trNodeManager.GetText(dwTemp);
m_flx.Cell(flexcpText, nRow, nCol) = strNew;
bCheckCellSizeChange = true;//CPY 8/24/03 v7.5674 QA70-5061 ADD_DISPLAY_OPTIONS
}
else // no editor, then possible to be using grid's combo
{
bModified = trNodeManager.AfterEdit(dwTemp, m_flx.ComboIndex);
bCheckCellSizeChange = true;//CPY 8/24/03 v7.5674 QA70-5061 ADD_DISPLAY_OPTIONS
}
_DBINT("After Edit returns ", bModified)
trNode.Text = trNodeManager.GetText(dwTemp);
}
else
{
switch(trNode.ID)
{
case TRGP_CHECK:
nVal = m_flx.Cell(flexcpChecked, nRow, nCol);
trNode.nVal = flexUnchecked == nVal? 0:1;
break;
default:
trNode.Text = m_flx.Cell(flexcpText, nRow, nCol);
bCheckCellSizeChange = true;//CPY 8/24/03 v7.5674 QA70-5061 ADD_DISPLAY_OPTIONS
break;
}
}
// data changed, OK button should be enabled, which might be disabled by
// apply button
string strNewVal = trNode.Text;
if(strNewVal.Compare(strOldVal) != 0)
{
PEVENT_FUNC pfn = getEventHandler(trNode);
uint wParam = 0;
if(pfn)
{
// we need to know if event handler has changed any .Show
vector<int> vSaveShows; tree_get_shows(m_trEdit, vSaveShows);
vector<int> vSaveEnables; tree_get_enables(m_trEdit, vSaveEnables);
vector<string> vSaveValues; tree_get_values(m_trEdit, vSaveValues);//CPY 5/30/03 QA70-4577 EVENT_HANDLER_NEED_DIALOG_AND_VALUE_UPDATE
if(pfn(m_trEdit, nRow, trNode.ID, *m_pdlg))
{
//out_str("need to update");
vector<int> vShows; tree_get_shows(m_trEdit, vShows);
wParam = is_same(vShows, vSaveShows)? 0 : GRID_CHANGE_SHOW;
vector<int> vEnables; tree_get_enables(m_trEdit, vEnables);
if(!is_same(vEnables, vSaveEnables))
wParam |= GRID_CHANGE_ENABLE;
int nChanges = tree_update_changes(m_trEdit, vSaveValues);
if(nChanges > 0)
wParam |= GRID_CHANGE_VALUE;
}
}
if(bCheckCellSizeChange && !(wParam & GRID_CHANGE_VALUE) && !(wParam & GRID_CHANGE_SHOW))
{
if(updateGridColWidth(nRow, strOldVal))
wParam |= GRID_CHANGE_SIZE;
}
if(wParam)
PostDlgMessage(WM_USER_RECONSTRUCT, wParam);
}
}
}
private:
PEVENT_FUNC getEventHandler(const TreeNode& trNodeRow)
{
//--- CPY 8/24/03 v7.5674 QA70-5061 ADD_DISPLAY_OPTIONS
if(trNodeRow)
{
string strTemp;
if(trNodeRow.GetAttribute(STR_ATTRIB_HANDLER, strTemp) && !strTemp.IsEmpty())
{
DWORD dwTemp = atoi(strTemp);
PEVENT_FUNC pfn = (PEVENT_FUNC)dwTemp;
if(pfn)
return pfn;
return NULL; // if handler is set but not valid, we can diable generic handler
}
}
PEVENT_FUNC temp_pEventFunc = m_pfnEvent;// wait until we can call member function pointer directly
TreeNode trNode = m_trEdit;
if(trNode)
return temp_pEventFunc;
return NULL;
}
//------- CPY 5/15/03 v7.0585 QA70-4477 TREE_BRANCH_SUPPORT
bool addTreeNodes(TreeNode& tr, int nLevel = -1)
{
int nCnt = tr.GetNodeCount();
if(nCnt < 1) // no children, add leaf
addTreeRow(tr, nLevel);
else
{
if(nLevel >= 0)
addTreeRow(tr, nLevel, true);
foreach(TreeNode cNode in tr.Children)
{
addTreeNodes(cNode, nLevel+1);
}
}
return true;
}
void addTreeRow(TreeNode& cNode, int nLevel, bool bIsBranch = false)
{
string strTemp;
if(!cNode.GetAttribute(STR_LABEL_ATTRIB, strTemp))
strTemp = cNode.tagName;
if(!bIsBranch)
strTemp += "\t";
m_flx.AddItem(strTemp);
if(m_bIsOutlineTree && nLevel >= 0)
{
int nRow = m_flx.Rows - 1;
m_flx.IsSubtotal(nRow) = true;
m_flx.RowOutlineLevel(nRow) = nLevel;
}
}
//------- end TREE_BRANCH_SUPPORT
void prepareGridForDisplay(bool bResize = true, bool bInit = false)
{
// out_str("enter prepareGridForDisplay");
// make all font size bigger
double fSizeFactor = 1.00;
double fRowSizeFactor = fSizeFactor * 1.3;
double fTempFactor;
m_flx.Row = 0;
m_flx.Col = 0;
int nSize = m_nFontSize;//flx.CellFontSize;
nSize = 0.5 + nSize * fSizeFactor;
vector<int> vnBranchRowsToExpand;//---- CPY 8/24/03 v7.5674 QA70-5061 ADD_DISPLAY_OPTIONS
for(int ii = 0; ii < m_flx.Rows; ii++)
{
fTempFactor = fRowSizeFactor;
if(prepareEditCell(ii, fTempFactor, vnBranchRowsToExpand))
m_flx.RowHeight(ii) = 0.5 + m_nRowHeight * fTempFactor;
else
m_flx.RowHeight(ii) = 0;
}
if(bInit && m_bIsOutlineTree)
{
m_flx.Outline(0);// collaps the tree
//---- CPY 8/24/03 v7.5674 QA70-5061 ADD_DISPLAY_OPTIONS
for(int jj = 0; jj < vnBranchRowsToExpand.GetSize(); jj++)
m_flx.IsCollapsed(vnBranchRowsToExpand[jj]) = flexOutlineExpanded;
//----
}
if(bResize)
{
//ResizeCols(6.0, 3.0);
resizeGrid()
}
updateGridEnableSettings();
}
void resizeGrid()
{
ResizeCols(6.0, 3.0);
}
void updateGridEnableSettings()
{
uint nColorDisable = RGB(127, 127, 127);
for(int ii = 0; ii < m_flx.Rows; ii++)
{
TreeNode trNode = get_tree_node(ii);
if(trNode && trNode.Enable >= 0)
{
for(int nC = 0; nC < m_flx.Cols; nC++)
{
m_flx.Cell(flexcpForeColor, ii, nC) = trNode.Enable > 0? 0:nColorDisable;
}
}
}
}
bool updateGridColWidth(int nRow, const string& strOldVal) // -1 to scan all rows
{
if(nRow < 0)
return false; // not supported yet
int nOldLength = strOldVal.GetLength();
string str = m_flx.Cell(flexcpText, nRow, EDIT_COL_INDEX);
int nNewLength = str.GetLength();
if(nOldLength < 1) nOldLength = 1;
if((nNewLength - nOldLength) > nOldLength * 0.2 || (nOldLength - nNewLength) > nOldLength * 0.5 )
{
resizeGrid();
return true;
}
return false;
}
// return flase if cell should be hidden
bool prepareEditCell(int nRow, double& dbRowSizeFactor, vector<int>& vnBranchRowsToExpand)
{
int nCol = EDIT_COL_INDEX;
m_flx.Row = nRow;
m_flx.Col = nCol;// last col need to be right aligned
static int s_ID = 1;
// next we need to setup edit cell according to tree
TreeNode trNode = get_tree_node(nRow);
EditorManager trNodeManager;
DWORD dwTemp;
string strTemp;
if(trNode)
{
int nNodeType = trNode.ID;
switch(nNodeType)
{
case TRGP_BRANCH:
// default to collaps
//flx.IsCollapsed(nRow) = flexOutlineSubtotals;
//---- CPY 8/24/03 v7.5674 QA70-5061 ADD_DISPLAY_OPTIONS
if(trNode.GetAttribute(STR_ATTRIB_BRANCH, strTemp))
{
dwTemp = atoi(strTemp);
if(dwTemp)
m_flx.RowData(nRow) = dwTemp;
if(dwTemp & GETNBRANCH_OPEN)
vnBranchRowsToExpand.Add(nRow);
}
//---- end QA70-5061 ADD_DISPLAY_OPTIONS
break;
case TRGP_CHECK:
m_flx.Cell(flexcpPictureAlignment, nRow, nCol) = JUSTIFICATION_CHECKBOX;//flexPicAlignCenterCenter ;
break;
case TRGP_STR_LIST:
case TRGP_COLOR:
case TRGP_RANGE:
dwTemp = trNodeManager.New(nNodeType, nRow, s_ID++, get_node_combo_str(trNode));
m_flx.Cell(flexcpData, nRow, nCol) = dwTemp;
dbRowSizeFactor *= trNodeManager.GetCellHeightFactor(dwTemp);
break;
case TRGP_DOUBLE:
m_flx.Cell(flexcpAlignment, nRow, nCol) = JUSTIFICATION_NUM;//flexAlignCenterCenter;
break;
default:
m_flx.Cell(flexcpAlignment, nRow, nCol) = JUSTIFICATION_STR//flexAlignCenterCenter;
}
setGridCellValue(nRow, nCol, trNode);
//--- CPY 8/24/03 v7.5674 QA70-5061 ADD_DISPLAY_OPTIONS
if(trNode.GetAttribute(STR_ATTRIB_LABEL_COLOR, strTemp))
{
DWORD dwColor = atoi(strTemp);
m_flx.Cell(flexcpForeColor, nRow, LABEL_COL_INDEX) = dwColor;
}
if(trNode.GetAttribute(STR_ATTRIB_BKGRND_COLOR, strTemp))
{
DWORD dwColor = atoi(strTemp);
m_flx.Cell(flexcpBackColor, nRow, LABEL_COL_INDEX) = dwColor;
}
//---
}
// flx.ComboSearch = flexCmbSearchNone;
// flx.CellAlignment = flexAlignLeftTop; //flexAlignRightCenter;
if(trNode.IsValid() && trNode.Show == 0)
return false;
if(m_bIsFlatDialogDisplay)
m_flx.Cell(flexcpBackColor, nRow, nCol) = RGB(255,255,255);
return true;
}
//--- CPY 5/30/03 QA70-4577 EVENT_HANDLER_NEED_DIALOG_AND_VALUE_UPDATE
bool updateGridValues() // ret true to indicate dialog needs resize to fit, grid size has changed
{
bool bRet = false;
for(int ii = 0; ii < m_flx.Rows; ii++)
{
TreeNode trNode = get_tree_node(ii);
if(tree_node_changed(trNode))
{
string strOldVal = m_flx.Cell(flexcpData, ii, EDIT_COL_INDEX);
setGridCellValue(ii, EDIT_COL_INDEX, trNode);
if(updateGridColWidth(ii, strOldVal))
bRet = true;
}
}
tree_remove_attribute(m_trEdit, STR_CHANGED_ATTRIB);
return bRet;
}
//--- end CPY 5/30/03 QA70-4577
void setGridCellValue(int nRow, int nCol, const TreeNode& trNode)
{
EditorManager trNodeManager;
DWORD dwTemp;
int nNodeType = trNode.ID;
switch(nNodeType)
{
case TRGP_BRANCH:
// default to collaps
//flx.IsCollapsed(nRow) = flexOutlineSubtotals;
break;
case TRGP_CHECK:
m_flx.Cell(flexcpChecked, nRow, nCol) = trNode.nVal>0? flexChecked : flexUnchecked;
break;
case TRGP_STR_LIST:
case TRGP_COLOR:
case TRGP_RANGE:
dwTemp = m_flx.Cell(flexcpData, nRow, nCol);
if (nNodeType == TRGP_RANGE)
trNodeManager.SetText(dwTemp, trNode.Text, OXVT_STRING);
else
trNodeManager.SetText(dwTemp, trNode.Text);
m_flx.Cell(flexcpText, nRow, nCol) = trNodeManager.GetText(dwTemp, FALSE); // get display text
break;
case TRGP_DOUBLE:
{
//---- CPY v7.5723 QA70-5376 GETNBOX_ADD_SIG_DIGITS_SUPPORT
// we have to go through this to avoid 1.0 displayed as 1. by generic storage in XML for doubles
//double val = trNode.dVal;
//string strVal = val;
//m_flx.Cell(flexcpText, nRow, nCol) = szTemp;
char szTemp[MAXLINE];
DoubleToStr(trNode.dVal, szTemp, MAXLINE, m_strNumFormat);
m_flx.Cell(flexcpText, nRow, nCol) = szTemp;
//---- end GETNBOX_ADD_SIG_DIGITS_SUPPORT
}
break;
default:
m_flx.Cell(flexcpText, nRow, nCol) = trNode.Text;
}
}
TreeNode get_tree_node(int nRow)
{
int nIndex = nRow - m_flx.FixedRows;
return tree_get_node(m_trEdit, nIndex);
}
private:
Dialog* m_pdlg;
PEVENT_FUNC m_pfnEvent;
TreeNode m_trEdit;// local copy of ref to tree being edited
int m_nEditRow;
int m_nEditCol;
bool m_bDataReady;
bool m_bIsFlatDialogDisplay;// trying to similate dialog look using gray grid lines etc
bool m_bIsOutlineTree;
DWORD m_dwEditor;
string m_strNumFormat;
};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -