SyncDlg: Disallow in/out changes to include local context menu
[TortoiseGit.git] / src / TortoiseProc / Settings / SetBugTraq.cpp
blob4088d66e18ff580c04a6d479c89516b1a51bb92f
1 // TortoiseGit - a Windows shell extension for easy version control
3 // Copyright (C) 2016 - TortoiseGit
4 // Copyright (C) 2008 - TortoiseSVN
6 // This program is free software; you can redistribute it and/or
7 // modify it under the terms of the GNU General Public License
8 // as published by the Free Software Foundation; either version 2
9 // of the License, or (at your option) any later version.
11 // This program is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 // GNU General Public License for more details.
16 // You should have received a copy of the GNU General Public License
17 // along with this program; if not, write to the Free Software Foundation,
18 // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
20 #include "stdafx.h"
21 #include "SetBugTraq.h"
22 #include "SetBugTraqAdv.h"
24 IMPLEMENT_DYNAMIC(CSetBugTraq, ISettingsPropPage)
26 CSetBugTraq::CSetBugTraq()
27 : ISettingsPropPage(CSetBugTraq::IDD)
31 CSetBugTraq::~CSetBugTraq()
35 void CSetBugTraq::DoDataExchange(CDataExchange* pDX)
37 ISettingsPropPage::DoDataExchange(pDX);
38 DDX_Control(pDX, IDC_BUGTRAQLIST, m_cBugTraqList);
42 BEGIN_MESSAGE_MAP(CSetBugTraq, ISettingsPropPage)
43 ON_BN_CLICKED(IDC_BUGTRAQREMOVEBUTTON, &CSetBugTraq::OnBnClickedRemovebutton)
44 ON_BN_CLICKED(IDC_BUGTRAQEDITBUTTON, &CSetBugTraq::OnBnClickedEditbutton)
45 ON_BN_CLICKED(IDC_BUGTRAQADDBUTTON, &CSetBugTraq::OnBnClickedAddbutton)
46 ON_BN_CLICKED(IDC_BUGTRAQCOPYBUTTON, &CSetBugTraq::OnBnClickedBugTraqcopybutton)
47 ON_NOTIFY(LVN_ITEMCHANGED, IDC_BUGTRAQLIST, &CSetBugTraq::OnLvnItemchangedBugTraqlist)
48 ON_NOTIFY(NM_DBLCLK, IDC_BUGTRAQLIST, &CSetBugTraq::OnNMDblclkBugTraqlist)
49 END_MESSAGE_MAP()
51 BOOL CSetBugTraq::OnInitDialog()
53 ISettingsPropPage::OnInitDialog();
55 m_associations.Load();
57 m_cBugTraqList.SetExtendedStyle((CRegDWORD(L"Software\\TortoiseGit\\FullRowSelect", TRUE) ? LVS_EX_FULLROWSELECT : 0) | LVS_EX_DOUBLEBUFFER | LVS_EX_INFOTIP | LVS_EX_CHECKBOXES);
59 // clear all previously set header columns
60 m_cBugTraqList.DeleteAllItems();
61 int c = m_cBugTraqList.GetHeaderCtrl()->GetItemCount() - 1;
62 while (c>=0)
63 m_cBugTraqList.DeleteColumn(c--);
65 // now set up the requested columns
66 CString temp;
68 temp.LoadString(IDS_SETTINGS_BUGTRAQ_PATHCOL);
69 m_cBugTraqList.InsertColumn(0, temp);
70 temp.LoadString(IDS_SETTINGS_BUGTRAQ_PROVIDERCOL);
71 m_cBugTraqList.InsertColumn(1, temp);
72 temp.LoadString(IDS_SETTINGS_BUGTRAQ_PARAMETERSCOL);
73 m_cBugTraqList.InsertColumn(2, temp);
75 SetWindowTheme(m_hWnd, L"Explorer", nullptr);
77 RebuildBugTraqList();
79 return TRUE;
82 void CSetBugTraq::RebuildBugTraqList()
84 m_cBugTraqList.SetRedraw(false);
85 m_cBugTraqList.DeleteAllItems();
87 // fill the list control with all the hooks
88 for (CBugTraqAssociations::const_iterator it = m_associations.begin(); it != m_associations.end(); ++it)
90 int pos = m_cBugTraqList.InsertItem(m_cBugTraqList.GetItemCount(), (*it)->GetPath().GetWinPathString());
91 m_cBugTraqList.SetCheck(pos, (*it)->IsEnabled());
92 m_cBugTraqList.SetItemText(pos, 1, (*it)->GetProviderName());
93 m_cBugTraqList.SetItemText(pos, 2, (*it)->GetParameters());
94 m_cBugTraqList.SetItemData(pos, (DWORD_PTR)*it);
97 int maxcol = m_cBugTraqList.GetHeaderCtrl()->GetItemCount() - 1;
98 for (int col = 0; col <= maxcol; col++)
99 m_cBugTraqList.SetColumnWidth(col, LVSCW_AUTOSIZE_USEHEADER);
100 m_cBugTraqList.SetRedraw(true);
103 void CSetBugTraq::OnBnClickedRemovebutton()
105 // traversing from the end to the beginning so that the indices are not skipped
106 int index = m_cBugTraqList.GetItemCount()-1;
107 while (index >= 0)
109 if (m_cBugTraqList.GetItemState(index, LVIS_SELECTED) & LVIS_SELECTED)
111 auto assoc = reinterpret_cast<CBugTraqAssociation*>(m_cBugTraqList.GetItemData(index));
112 if (!assoc)
114 RebuildBugTraqList();
115 return;
117 m_cBugTraqList.DeleteItem(index);
118 m_associations.Remove(assoc);
119 SetModified();
121 index--;
125 void CSetBugTraq::OnBnClickedEditbutton()
127 if (m_cBugTraqList.GetSelectedCount() != 1)
128 return;
130 int index = m_cBugTraqList.GetNextItem(-1, LVNI_SELECTED);
131 if (index == -1)
132 return;
134 auto assoc = reinterpret_cast<CBugTraqAssociation*>(m_cBugTraqList.GetItemData(index));
135 if (!assoc)
136 return;
138 CSetBugTraqAdv dlg(*assoc);
139 if (dlg.DoModal() == IDOK)
141 m_associations.Remove(assoc);
142 m_associations.Add(dlg.GetAssociation());
143 RebuildBugTraqList();
144 SetModified();
148 void CSetBugTraq::OnBnClickedAddbutton()
150 CSetBugTraqAdv dlg;
151 if (dlg.DoModal() == IDOK)
153 m_associations.Add(dlg.GetAssociation());
154 RebuildBugTraqList();
155 SetModified();
159 void CSetBugTraq::OnLvnItemchangedBugTraqlist(NMHDR* pNMHDR, LRESULT* pResult)
161 UINT count = m_cBugTraqList.GetSelectedCount();
162 GetDlgItem(IDC_BUGTRAQREMOVEBUTTON)->EnableWindow(count > 0);
163 GetDlgItem(IDC_BUGTRAQEDITBUTTON)->EnableWindow(count == 1);
164 GetDlgItem(IDC_BUGTRAQCOPYBUTTON)->EnableWindow(count == 1);
165 *pResult = 0;
167 LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);
168 if ((pNMLV->uOldState == 0) || (pNMLV->uNewState == 0) || (pNMLV->uNewState & LVIS_SELECTED) || (pNMLV->uNewState & LVIS_FOCUSED) || pNMLV->iItem < 0)
169 return;
171 auto assoc = reinterpret_cast<CBugTraqAssociation*>(m_cBugTraqList.GetItemData(pNMLV->iItem));
172 if (!assoc)
173 return;
174 if (assoc->SetEnabled(m_cBugTraqList.GetCheck(pNMLV->iItem) == BST_CHECKED))
175 SetModified();
178 void CSetBugTraq::OnNMDblclkBugTraqlist(NMHDR * /*pNMHDR*/, LRESULT *pResult)
180 OnBnClickedEditbutton();
181 *pResult = 0;
184 BOOL CSetBugTraq::OnApply()
186 UpdateData();
187 m_associations.Save();
188 SetModified(FALSE);
189 return ISettingsPropPage::OnApply();
192 void CSetBugTraq::OnBnClickedBugTraqcopybutton()
194 if (m_cBugTraqList.GetSelectedCount() != 1)
195 return;
197 int index = m_cBugTraqList.GetNextItem(-1, LVNI_SELECTED);
198 if (index == -1)
199 return;
201 auto assoc = reinterpret_cast<CBugTraqAssociation*>(m_cBugTraqList.GetItemData(index));
202 if (!assoc)
203 return;
205 CSetBugTraqAdv dlg(*assoc);
206 if (dlg.DoModal() == IDOK)
208 m_associations.Add(dlg.GetAssociation());
209 RebuildBugTraqList();
210 SetModified();