Index: src/ch/RuleEditDlg.cpp =================================================================== diff -u -re6f64ea0eecaf86dfa1a42c80604d227b69be768 -rd8305b46376f2b1a3d3d053ba8c2f265a3cbc56d --- src/ch/RuleEditDlg.cpp (.../RuleEditDlg.cpp) (revision e6f64ea0eecaf86dfa1a42c80604d227b69be768) +++ src/ch/RuleEditDlg.cpp (.../RuleEditDlg.cpp) (revision d8305b46376f2b1a3d3d053ba8c2f265a3cbc56d) @@ -23,6 +23,8 @@ #include "RuleEditAlreadyExistsDlg.h" #include "RuleEditErrorDlg.h" #include "RuleEditNotEnoughSpaceDlg.h" +#include +#include #ifdef _DEBUG #define new DEBUG_NEW @@ -33,6 +35,72 @@ using namespace string; using namespace chengine; +namespace +{ + int GetSelectedIndex(CListCtrl& ctlList) + { + POSITION pos = ctlList.GetFirstSelectedItemPosition(); + if(pos == nullptr) + return -1; + + int iItem = ctlList.GetNextSelectedItem(pos); + return iItem; + } + + template + void OnUpButton(RuleEditDlg* pDlg, CListCtrl& ctlList, RuleList& ruleList, std::function reloadList) + { + int iItem = GetSelectedIndex(ctlList); + if(iItem < 1) + return; + + // store current item + auto rRule = ruleList.GetAt(iItem); + + // remove current item + ctlList.DeleteItem(iItem); + ruleList.RemoveAt(iItem); + + // re-insert it at the right position + ruleList.InsertAt(iItem - 1, rRule); + reloadList(pDlg); + + ctlList.SetItemState(iItem - 1, LVIS_SELECTED, LVIS_SELECTED); + } + + template + void OnDownButton(RuleEditDlg* pDlg, CListCtrl& ctlList, RuleList& ruleList, std::function reloadList) + { + int iItem = GetSelectedIndex(ctlList); + if(iItem < 0 || iItem + 1 >= ctlList.GetItemCount()) + return; + + // store current item + auto rRule = ruleList.GetAt(iItem); + + // remove current item + ctlList.DeleteItem(iItem); + ruleList.RemoveAt(iItem); + + // re-insert it at the right position + ruleList.InsertAt(iItem + 1, rRule); + reloadList(pDlg); + + ctlList.SetItemState(iItem + 1, LVIS_SELECTED, LVIS_SELECTED); + } + + template + void OnRemoveButton(CListCtrl& ctlList, RuleList& ruleList) + { + int iItem = GetSelectedIndex(ctlList); + if(iItem < 0) + return; + + ctlList.DeleteItem(iItem); + ruleList.RemoveAt(iItem); + } +} + RuleEditDlg::RuleEditDlg(const FeedbackRules& rRules) : ictranslate::CLanguageDialog(IDD_RULE_EDIT_ALL_DIALOG), m_rules(rRules) @@ -53,15 +121,25 @@ ON_BN_CLICKED(IDC_ALREADY_EXISTS_CHANGE_BUTTON, OnAlreadyExistsChangeButton) ON_BN_CLICKED(IDC_ALREADY_EXISTS_ADD_BUTTON, OnAlreadyExistsAddButton) ON_BN_CLICKED(IDC_ALREADY_EXISTS_REMOVE_BUTTON, OnAlreadyExistsRemoveButton) + ON_BN_CLICKED(IDC_ALREADY_EXISTS_UP_BUTTON, OnAlreadyExistsUpButton) + ON_BN_CLICKED(IDC_ALREADY_EXISTS_DOWN_BUTTON, OnAlreadyExistsDownButton) ON_BN_CLICKED(IDC_FILE_ERROR_CHANGE_BUTTON, OnErrorChangeButton) ON_BN_CLICKED(IDC_FILE_ERROR_ADD_BUTTON, OnErrorAddButton) ON_BN_CLICKED(IDC_FILE_ERROR_REMOVE_BUTTON, OnErrorRemoveButton) + ON_BN_CLICKED(IDC_FILE_ERROR_UP_BUTTON, OnErrorUpButton) + ON_BN_CLICKED(IDC_FILE_ERROR_DOWN_BUTTON, OnErrorDownButton) ON_BN_CLICKED(IDC_NOT_ENOUGH_SPACE_CHANGE_BUTTON, OnNotEnoughSpaceChangeButton) ON_BN_CLICKED(IDC_NOT_ENOUGH_SPACE_ADD_BUTTON, OnNotEnoughSpaceAddButton) ON_BN_CLICKED(IDC_NOT_ENOUGH_SPACE_REMOVE_BUTTON, OnNotEnoughSpaceRemoveButton) + ON_BN_CLICKED(IDC_NOT_ENOUGH_SPACE_UP_BUTTON, OnNotEnoughSpaceUpButton) + ON_BN_CLICKED(IDC_NOT_ENOUGH_SPACE_DOWN_BUTTON, OnNotEnoughSpaceDownButton) + ON_NOTIFY(LVN_ITEMCHANGED, IDC_FILE_ALREADY_EXISTS_RULES_LIST, OnAlreadyExistsItemChanged) + ON_NOTIFY(LVN_ITEMCHANGED, IDC_FILE_ERROR_RULES_LIST, OnErrorItemChanged) + ON_NOTIFY(LVN_ITEMCHANGED, IDC_NOT_ENOUGH_SPACE_RULES_LIST, OnNotEnoughSpaceItemChanged) + ON_NOTIFY(NM_DBLCLK, IDC_FILE_ALREADY_EXISTS_RULES_LIST, OnDblclkAlreadyExistsList) ON_NOTIFY(NM_DBLCLK, IDC_FILE_ERROR_RULES_LIST, OnDblclkErrorList) ON_NOTIFY(NM_DBLCLK, IDC_NOT_ENOUGH_SPACE_RULES_LIST, OnDblclkNotEnoughSpaceList) @@ -82,22 +160,30 @@ AddResizableControl(IDC_ALREADY_EXISTS_CHANGE_BUTTON, 1.0, 0.34, 0.0, 0.0); AddResizableControl(IDC_ALREADY_EXISTS_ADD_BUTTON, 1.0, 0.34, 0.0, 0.0); AddResizableControl(IDC_ALREADY_EXISTS_REMOVE_BUTTON, 1.0, 0.34, 0.0, 0.0); + AddResizableControl(IDC_ALREADY_EXISTS_UP_BUTTON, 0.0, 0.34, 0.0, 0.0); + AddResizableControl(IDC_ALREADY_EXISTS_DOWN_BUTTON, 0.0, 0.34, 0.0, 0.0); AddResizableControl(IDC_FILE_ERROR_RULES_STATIC, 0.0, 0.34, 1.0, 0.0); AddResizableControl(IDC_FILE_ERROR_RULES_LIST, 0.0, 0.34, 1.0, 0.33); AddResizableControl(IDC_FILE_ERROR_CHANGE_BUTTON, 1.0, 0.67, 0.0, 0.0); AddResizableControl(IDC_FILE_ERROR_ADD_BUTTON, 1.0, 0.67, 0.0, 0.0); AddResizableControl(IDC_FILE_ERROR_REMOVE_BUTTON, 1.0, 0.67, 0.0, 0.0); + AddResizableControl(IDC_FILE_ERROR_UP_BUTTON, 0.0, 0.67, 0.0, 0.0); + AddResizableControl(IDC_FILE_ERROR_DOWN_BUTTON, 0.0, 0.67, 0.0, 0.0); AddResizableControl(IDC_NOT_ENOUGH_SPACE_STATIC, 0.0, 0.67, 1.0, 0.0); AddResizableControl(IDC_NOT_ENOUGH_SPACE_RULES_LIST, 0.0, 0.67, 1.0, 0.33); AddResizableControl(IDC_NOT_ENOUGH_SPACE_CHANGE_BUTTON, 1.0, 1.0, 0.0, 0.0); AddResizableControl(IDC_NOT_ENOUGH_SPACE_ADD_BUTTON, 1.0, 1.0, 0.0, 0.0); AddResizableControl(IDC_NOT_ENOUGH_SPACE_REMOVE_BUTTON, 1.0, 1.0, 0.0, 0.0); + AddResizableControl(IDC_NOT_ENOUGH_SPACE_UP_BUTTON, 0.0, 1.0, 0.0, 0.0); + AddResizableControl(IDC_NOT_ENOUGH_SPACE_DOWN_BUTTON, 0.0, 1.0, 0.0, 0.0); AddResizableControl(IDOK, 1.0, 1.0, 0.0, 0.0); AddResizableControl(IDCANCEL, 1.0, 1.0, 0.0, 0.0); + AddResizableControl(IDC_BOTTOM_BAR_STATIC, 0.0, 1.0, 1.0, 0.0); + InitializeResizableControls(); // styles @@ -110,6 +196,12 @@ InitErrorColumns(); InitNotEnoughSpaceColumns(); + FillAlreadyExistsList(); + FillErrorList(); + FillNotEnoughSpaceList(); + + EnableControls(); + UpdateData(FALSE); return TRUE; @@ -507,6 +599,8 @@ FillAlreadyExistsList(); FillErrorList(); FillNotEnoughSpaceList(); + + EnableControls(); } void RuleEditDlg::OnOK() @@ -516,35 +610,85 @@ CLanguageDialog::OnOK(); } +void RuleEditDlg::EnableControls() +{ + EnableAlreadyExistsControls(); + EnableErrorControls(); + EnableNotEnoughSpaceControls(); +} + +void RuleEditDlg::EnableAlreadyExistsControls() +{ + int iCurrentSel = GetSelectedIndex(m_ctlAlreadyExistsRulesList); + GetDlgItem(IDC_ALREADY_EXISTS_UP_BUTTON)->EnableWindow(iCurrentSel > 0); + GetDlgItem(IDC_ALREADY_EXISTS_DOWN_BUTTON)->EnableWindow(iCurrentSel >= 0 && iCurrentSel + 1 < m_ctlAlreadyExistsRulesList.GetItemCount()); + GetDlgItem(IDC_ALREADY_EXISTS_CHANGE_BUTTON)->EnableWindow(iCurrentSel >= 0); + GetDlgItem(IDC_ALREADY_EXISTS_REMOVE_BUTTON)->EnableWindow(iCurrentSel >= 0); +} + +void RuleEditDlg::EnableErrorControls() +{ + int iCurrentSel = GetSelectedIndex(m_ctlErrorRulesList); + GetDlgItem(IDC_FILE_ERROR_UP_BUTTON)->EnableWindow(iCurrentSel > 0); + GetDlgItem(IDC_FILE_ERROR_DOWN_BUTTON)->EnableWindow(iCurrentSel >= 0 && iCurrentSel + 1 < m_ctlErrorRulesList.GetItemCount()); + GetDlgItem(IDC_FILE_ERROR_CHANGE_BUTTON)->EnableWindow(iCurrentSel >= 0); + GetDlgItem(IDC_FILE_ERROR_REMOVE_BUTTON)->EnableWindow(iCurrentSel >= 0); +} + +void RuleEditDlg::EnableNotEnoughSpaceControls() +{ + int iCurrentSel = GetSelectedIndex(m_ctlNotEnoughSpaceRulesList); + GetDlgItem(IDC_NOT_ENOUGH_SPACE_UP_BUTTON)->EnableWindow(iCurrentSel > 0); + GetDlgItem(IDC_NOT_ENOUGH_SPACE_DOWN_BUTTON)->EnableWindow(iCurrentSel >= 0 && iCurrentSel + 1 < m_ctlNotEnoughSpaceRulesList.GetItemCount()); + GetDlgItem(IDC_NOT_ENOUGH_SPACE_CHANGE_BUTTON)->EnableWindow(iCurrentSel >= 0); + GetDlgItem(IDC_NOT_ENOUGH_SPACE_REMOVE_BUTTON)->EnableWindow(iCurrentSel >= 0); +} + +void RuleEditDlg::OnAlreadyExistsItemChanged(NMHDR* /*pNMHDR*/, LRESULT* /*pResult*/) +{ + EnableAlreadyExistsControls(); +} + +void RuleEditDlg::OnErrorItemChanged(NMHDR* /*pNMHDR*/, LRESULT* /*pResult*/) +{ + EnableErrorControls(); +} + +void RuleEditDlg::OnNotEnoughSpaceItemChanged(NMHDR* /*pNMHDR*/, LRESULT* /*pResult*/) +{ + EnableNotEnoughSpaceControls(); +} + void RuleEditDlg::OnDblclkAlreadyExistsList(NMHDR* /*pNMHDR*/, LRESULT* pResult) { - OnAlreadyExistsChangeButton(); + int iItem = GetSelectedIndex(m_ctlAlreadyExistsRulesList); + if(iItem < 0) + OnAlreadyExistsAddButton(); + else + OnAlreadyExistsChangeButton(); *pResult = 0; } void RuleEditDlg::OnAlreadyExistsChangeButton() { - POSITION pos = m_ctlAlreadyExistsRulesList.GetFirstSelectedItemPosition(); - if(pos != nullptr) - { - FeedbackAlreadyExistsRuleList& rRules = m_rules.GetAlreadyExistsRules(); + int iItem = GetSelectedIndex(m_ctlAlreadyExistsRulesList); + if(iItem < 0) + return; - int iItem = m_ctlAlreadyExistsRulesList.GetNextSelectedItem(pos); - if(iItem < 0) - return; + FeedbackAlreadyExistsRuleList& rRules = m_rules.GetAlreadyExistsRules(); + auto& rRule = rRules.GetAt(iItem); - auto& rRule = rRules.GetAt(iItem); + RuleEditAlreadyExistsDlg dlg(rRule); + if(dlg.DoModal() == IDOK) + { + // delete old element + m_ctlAlreadyExistsRulesList.DeleteItem(iItem); - RuleEditAlreadyExistsDlg dlg(rRule); - if(dlg.DoModal() == IDOK) - { - // delete old element - m_ctlAlreadyExistsRulesList.DeleteItem(iItem); - - rRule = dlg.GetRule(); - AddAlreadyExistsRule(rRule, iItem); - } + rRule = dlg.GetRule(); + AddAlreadyExistsRule(rRule, iItem); } + + EnableAlreadyExistsControls(); } void RuleEditDlg::OnAlreadyExistsAddButton() @@ -558,30 +702,34 @@ m_rules.GetAlreadyExistsRules().Add(rRule); AddAlreadyExistsRule(rRule, -1); } + EnableAlreadyExistsControls(); } void RuleEditDlg::OnAlreadyExistsRemoveButton() { - FeedbackAlreadyExistsRuleList& rRules = m_rules.GetAlreadyExistsRules(); + OnRemoveButton(m_ctlAlreadyExistsRulesList, m_rules.GetAlreadyExistsRules()); + EnableAlreadyExistsControls(); +} - while(true) - { - POSITION pos = m_ctlAlreadyExistsRulesList.GetFirstSelectedItemPosition(); - if(pos == nullptr) - break; +void RuleEditDlg::OnAlreadyExistsUpButton() +{ + OnUpButton(this, m_ctlAlreadyExistsRulesList, m_rules.GetAlreadyExistsRules(), &RuleEditDlg::FillAlreadyExistsList); + EnableAlreadyExistsControls(); +} - int iItem = m_ctlAlreadyExistsRulesList.GetNextSelectedItem(pos); - if(iItem < 0) - return; - - m_ctlAlreadyExistsRulesList.DeleteItem(iItem); - rRules.RemoveAt(iItem); - } +void RuleEditDlg::OnAlreadyExistsDownButton() +{ + OnDownButton(this, m_ctlAlreadyExistsRulesList, m_rules.GetAlreadyExistsRules(), &RuleEditDlg::FillAlreadyExistsList); + EnableAlreadyExistsControls(); } void RuleEditDlg::OnDblclkErrorList(NMHDR* /*pNMHDR*/, LRESULT* pResult) { - OnErrorChangeButton(); + int iItem = GetSelectedIndex(m_ctlAlreadyExistsRulesList); + if(iItem < 0) + OnErrorAddButton(); + else + OnErrorChangeButton(); *pResult = 0; } @@ -608,6 +756,7 @@ AddErrorRule(rRule, iItem); } } + EnableErrorControls(); } void RuleEditDlg::OnErrorAddButton() @@ -621,30 +770,34 @@ m_rules.GetErrorRules().Add(rRule); AddErrorRule(rRule, -1); } + EnableErrorControls(); } void RuleEditDlg::OnErrorRemoveButton() { - FeedbackErrorRuleList& rRules = m_rules.GetErrorRules(); + OnRemoveButton(m_ctlErrorRulesList, m_rules.GetErrorRules()); + EnableErrorControls(); +} - while(true) - { - POSITION pos = m_ctlErrorRulesList.GetFirstSelectedItemPosition(); - if(pos == nullptr) - break; +void RuleEditDlg::OnErrorUpButton() +{ + OnUpButton(this, m_ctlErrorRulesList, m_rules.GetErrorRules(), &RuleEditDlg::FillErrorList); + EnableErrorControls(); +} - int iItem = m_ctlErrorRulesList.GetNextSelectedItem(pos); - if(iItem < 0) - return; - - m_ctlErrorRulesList.DeleteItem(iItem); - rRules.RemoveAt(iItem); - } +void RuleEditDlg::OnErrorDownButton() +{ + OnDownButton(this, m_ctlErrorRulesList, m_rules.GetErrorRules(), &RuleEditDlg::FillErrorList); + EnableErrorControls(); } void RuleEditDlg::OnDblclkNotEnoughSpaceList(NMHDR* /*pNMHDR*/, LRESULT* pResult) { - OnNotEnoughSpaceChangeButton(); + int iItem = GetSelectedIndex(m_ctlAlreadyExistsRulesList); + if(iItem < 0) + OnNotEnoughSpaceAddButton(); + else + OnNotEnoughSpaceChangeButton(); *pResult = 0; } @@ -671,6 +824,7 @@ AddNotEnoughSpaceRule(rRule, iItem); } } + EnableNotEnoughSpaceControls(); } void RuleEditDlg::OnNotEnoughSpaceAddButton() @@ -684,23 +838,23 @@ m_rules.GetNotEnoughSpaceRules().Add(rRule); AddNotEnoughSpaceRule(rRule, -1); } + EnableNotEnoughSpaceControls(); } void RuleEditDlg::OnNotEnoughSpaceRemoveButton() { - FeedbackNotEnoughSpaceRuleList& rRules = m_rules.GetNotEnoughSpaceRules(); + OnRemoveButton(m_ctlNotEnoughSpaceRulesList, m_rules.GetNotEnoughSpaceRules()); + EnableNotEnoughSpaceControls(); +} - while(true) - { - POSITION pos = m_ctlNotEnoughSpaceRulesList.GetFirstSelectedItemPosition(); - if(pos == nullptr) - break; +void RuleEditDlg::OnNotEnoughSpaceUpButton() +{ + OnUpButton(this, m_ctlNotEnoughSpaceRulesList, m_rules.GetNotEnoughSpaceRules(), &RuleEditDlg::FillNotEnoughSpaceList); + EnableNotEnoughSpaceControls(); +} - int iItem = m_ctlNotEnoughSpaceRulesList.GetNextSelectedItem(pos); - if(iItem < 0) - return; - - m_ctlNotEnoughSpaceRulesList.DeleteItem(iItem); - rRules.RemoveAt(iItem); - } +void RuleEditDlg::OnNotEnoughSpaceDownButton() +{ + OnDownButton(this, m_ctlNotEnoughSpaceRulesList, m_rules.GetNotEnoughSpaceRules(), &RuleEditDlg::FillNotEnoughSpaceList); + EnableNotEnoughSpaceControls(); }