OSDN Git Service

Add SCI Edit to GitBlameView
[tortoisegit/TortoiseGitJp.git] / src / TortoiseProc / Settings / SetBugTraqAdv.cpp
1 // TortoiseSVN - a Windows shell extension for easy version control\r
2 \r
3 // Copyright (C) 2008 - TortoiseSVN\r
4 \r
5 // This program is free software; you can redistribute it and/or\r
6 // modify it under the terms of the GNU General Public License\r
7 // as published by the Free Software Foundation; either version 2\r
8 // of the License, or (at your option) any later version.\r
9 \r
10 // This program is distributed in the hope that it will be useful,\r
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of\r
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
13 // GNU General Public License for more details.\r
14 \r
15 // You should have received a copy of the GNU General Public License\r
16 // along with this program; if not, write to the Free Software Foundation,\r
17 // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\r
18 //\r
19 #include "stdafx.h"\r
20 #include "SetBugTraqAdv.h"\r
21 #include "BrowseFolder.h"\r
22 #include "BugTraqAssociations.h"\r
23 #include "..\IBugTraqProvider\IBugTraqProvider_h.h"\r
24 \r
25 IMPLEMENT_DYNAMIC(CSetBugTraqAdv, CResizableStandAloneDialog)\r
26 \r
27 CSetBugTraqAdv::CSetBugTraqAdv(CWnd* pParent /*= NULL*/)\r
28         : CResizableStandAloneDialog(CSetBugTraqAdv::IDD, pParent)\r
29         , m_provider_clsid(GUID_NULL)\r
30 {\r
31 }\r
32 \r
33 CSetBugTraqAdv::CSetBugTraqAdv(const CBugTraqAssociation &assoc, CWnd* pParent /*= NULL*/)\r
34         : CResizableStandAloneDialog(CSetBugTraqAdv::IDD, pParent)\r
35         , m_sPath(assoc.GetPath().GetWinPathString())\r
36         , m_provider_clsid(assoc.GetProviderClass())\r
37         , m_sParameters(assoc.GetParameters())\r
38 {\r
39 }\r
40 \r
41 CSetBugTraqAdv::~CSetBugTraqAdv()\r
42 {\r
43 }\r
44 \r
45 void CSetBugTraqAdv::DoDataExchange(CDataExchange* pDX)\r
46 {\r
47         CResizableStandAloneDialog::DoDataExchange(pDX);\r
48         DDX_Text(pDX, IDC_BUGTRAQPATH, m_sPath);\r
49         DDX_Control(pDX, IDC_BUGTRAQPROVIDERCOMBO, m_cProviderCombo);\r
50         DDX_Text(pDX, IDC_BUGTRAQPARAMETERS, m_sParameters);\r
51 }\r
52 \r
53 BEGIN_MESSAGE_MAP(CSetBugTraqAdv, CResizableStandAloneDialog)\r
54         ON_WM_DESTROY()\r
55         ON_BN_CLICKED(IDC_BUGTRAQBROWSE, &CSetBugTraqAdv::OnBnClickedBugTraqbrowse)\r
56         ON_BN_CLICKED(IDHELP, &CSetBugTraqAdv::OnBnClickedHelp)\r
57         ON_CBN_SELCHANGE(IDC_BUGTRAQPROVIDERCOMBO, &CSetBugTraqAdv::OnCbnSelchangeBugtraqprovidercombo)\r
58         ON_BN_CLICKED(IDC_OPTIONS, &CSetBugTraqAdv::OnBnClickedOptions)\r
59 END_MESSAGE_MAP()\r
60 \r
61 BOOL CSetBugTraqAdv::OnInitDialog()\r
62 {\r
63         CResizableStandAloneDialog::OnInitDialog();\r
64 \r
65         std::vector<CBugTraqProvider> providers = CBugTraqAssociations::GetAvailableProviders();\r
66         if (providers.size() == 0)\r
67         {\r
68                 AfxMessageBox(IDS_ERR_NO_AVAILABLE_BUGTRAQ_PROVIDERS);\r
69                 EndDialog(IDCANCEL);\r
70                 return TRUE;\r
71         }\r
72 \r
73         for (std::vector<CBugTraqProvider>::const_iterator it = providers.begin(); it != providers.end(); ++it)\r
74         {\r
75                 int index = m_cProviderCombo.AddString(it->name);\r
76                 m_cProviderCombo.SetItemDataPtr(index, new CBugTraqProvider(*it));\r
77         }\r
78 \r
79         // preselect the right provider in the combo; we can't do this above, because the\r
80         // combo will sort the entries.\r
81         if (m_provider_clsid == GUID_NULL)\r
82                 m_cProviderCombo.SetCurSel(0);\r
83 \r
84         for (int i = 0; i < m_cProviderCombo.GetCount(); ++i)\r
85         {\r
86                 CBugTraqProvider *p = (CBugTraqProvider *)m_cProviderCombo.GetItemDataPtr(i);\r
87                 if (p->clsid == m_provider_clsid)\r
88                 {\r
89                         m_cProviderCombo.SetCurSel(i);\r
90                         break;\r
91                 }\r
92         }\r
93 \r
94         UpdateData(FALSE);\r
95         CheckHasOptions();\r
96 \r
97         AddAnchor(IDC_BUGTRAQWCPATHLABEL, TOP_LEFT, TOP_RIGHT);\r
98         AddAnchor(IDC_BUGTRAQPATH, TOP_LEFT, TOP_RIGHT);\r
99         AddAnchor(IDC_BUGTRAQBROWSE, TOP_RIGHT);\r
100         AddAnchor(IDC_BUGTRAQPROVIDERLABEL, TOP_LEFT, TOP_RIGHT);\r
101         AddAnchor(IDC_BUGTRAQPROVIDERCOMBO, TOP_LEFT, TOP_RIGHT);\r
102         AddAnchor(IDC_BUGTRAQPARAMETERSLABEL, TOP_LEFT, TOP_RIGHT);\r
103         AddAnchor(IDC_BUGTRAQPARAMETERS, TOP_LEFT, TOP_RIGHT);\r
104         AddAnchor(IDOK, BOTTOM_RIGHT);\r
105         AddAnchor(IDCANCEL, BOTTOM_RIGHT);\r
106         AddAnchor(IDHELP, BOTTOM_RIGHT);\r
107         EnableSaveRestore(_T("SetBugTraqAdvDlg"));\r
108         return TRUE;\r
109 }\r
110 \r
111 void CSetBugTraqAdv::OnDestroy()\r
112 {\r
113         for (int i = 0; i < m_cProviderCombo.GetCount(); ++i)\r
114                 delete (CBugTraqProvider *)m_cProviderCombo.GetItemDataPtr(i);\r
115 \r
116         CResizableStandAloneDialog::OnDestroy();\r
117 }\r
118 \r
119 void CSetBugTraqAdv::OnOK()\r
120 {\r
121         UpdateData();\r
122 \r
123         m_provider_clsid = GUID_NULL;\r
124 \r
125         int index = m_cProviderCombo.GetCurSel();\r
126         if (index != CB_ERR)\r
127         {\r
128                 CBugTraqProvider *provider = (CBugTraqProvider *)m_cProviderCombo.GetItemDataPtr(index);\r
129                 m_provider_clsid = provider->clsid;\r
130         }\r
131 \r
132         CComPtr<IBugTraqProvider> pProvider;\r
133         HRESULT hr = pProvider.CoCreateInstance(m_provider_clsid);\r
134 \r
135         if (FAILED(hr))\r
136         {\r
137                 ShowBalloon(IDC_BUGTRAQPROVIDERCOMBO, IDS_ERR_MISSING_PROVIDER);\r
138                 return;\r
139         }\r
140 \r
141         VARIANT_BOOL valid;\r
142         if (FAILED(hr = pProvider->ValidateParameters(GetSafeHwnd(), m_sParameters.AllocSysString(), &valid)))\r
143         {\r
144                 ShowBalloon(IDC_BUGTRAQPARAMETERS, IDS_ERR_PROVIDER_VALIDATE_FAILED);\r
145                 return;\r
146         }\r
147 \r
148         if (valid != VARIANT_TRUE)\r
149                 return; // It's assumed that the provider will have done this.\r
150 \r
151         CResizableStandAloneDialog::OnOK();\r
152 }\r
153 \r
154 void CSetBugTraqAdv::OnBnClickedBugTraqbrowse()\r
155 {\r
156         CBrowseFolder browser;\r
157         CString sPath;\r
158         browser.SetInfo(CString(MAKEINTRESOURCE(IDS_SETTINGS_BUGTRAQ_SELECTFOLDERPATH)));\r
159         browser.m_style = BIF_EDITBOX | BIF_NEWDIALOGSTYLE | BIF_RETURNFSANCESTORS | BIF_RETURNONLYFSDIRS;\r
160         if (browser.Show(m_hWnd, sPath) == CBrowseFolder::OK)\r
161         {\r
162                 m_sPath = sPath;\r
163                 UpdateData(FALSE);\r
164         }\r
165 }\r
166 \r
167 void CSetBugTraqAdv::OnBnClickedHelp()\r
168 {\r
169         OnHelp();\r
170 }\r
171 \r
172 CBugTraqAssociation CSetBugTraqAdv::GetAssociation() const\r
173 {\r
174         return CBugTraqAssociation(m_sPath, m_provider_clsid, CBugTraqAssociations::LookupProviderName(m_provider_clsid), m_sParameters);\r
175 }\r
176 \r
177 void CSetBugTraqAdv::CheckHasOptions()\r
178 {\r
179         m_provider_clsid = GUID_NULL;\r
180 \r
181         int index = m_cProviderCombo.GetCurSel();\r
182         if (index != CB_ERR)\r
183         {\r
184                 CBugTraqProvider *provider = (CBugTraqProvider *)m_cProviderCombo.GetItemDataPtr(index);\r
185                 m_provider_clsid = provider->clsid;\r
186         }\r
187 \r
188         CComPtr<IBugTraqProvider2> pProvider;\r
189         HRESULT hr = pProvider.CoCreateInstance(m_provider_clsid);\r
190 \r
191         if (SUCCEEDED(hr))\r
192         {\r
193                 VARIANT_BOOL hasOptions = VARIANT_FALSE;\r
194                 if (SUCCEEDED(hr = pProvider->HasOptions(&hasOptions)))\r
195                 {\r
196                         if (hasOptions == VARIANT_TRUE)\r
197                         {\r
198                                 GetDlgItem(IDC_OPTIONS)->EnableWindow(TRUE);\r
199                                 return;\r
200                         }\r
201                 }\r
202         }\r
203 \r
204         GetDlgItem(IDC_OPTIONS)->EnableWindow(FALSE);\r
205 }\r
206 \r
207 void CSetBugTraqAdv::OnCbnSelchangeBugtraqprovidercombo()\r
208 {\r
209         CheckHasOptions();\r
210 }\r
211 \r
212 void CSetBugTraqAdv::OnBnClickedOptions()\r
213 {\r
214         m_provider_clsid = GUID_NULL;\r
215 \r
216         int index = m_cProviderCombo.GetCurSel();\r
217         if (index != CB_ERR)\r
218         {\r
219                 CBugTraqProvider *provider = (CBugTraqProvider *)m_cProviderCombo.GetItemDataPtr(index);\r
220                 m_provider_clsid = provider->clsid;\r
221         }\r
222 \r
223         CComPtr<IBugTraqProvider2> pProvider;\r
224         HRESULT hr = pProvider.CoCreateInstance(m_provider_clsid);\r
225 \r
226         if (SUCCEEDED(hr))\r
227         {\r
228                 BSTR temp = NULL;\r
229                 CString p;\r
230                 GetDlgItemText(IDC_BUGTRAQPARAMETERS, p);\r
231                 BSTR params = p.AllocSysString();\r
232                 if (SUCCEEDED(hr = pProvider->ShowOptionsDialog(GetSafeHwnd(), params, &temp)))\r
233                 {\r
234                         SetDlgItemText(IDC_BUGTRAQPARAMETERS, temp);\r
235                 }\r
236                 SysFreeString(temp);\r
237         }\r
238 }\r