1 /*
2 * This file is part of the Code::Blocks IDE and licensed under the GNU General Public License, version 3
3 * http://www.gnu.org/licenses/gpl-3.0.html
4 */
5 #include "fpoptionsdlg.h"
6
7 #include <sdk.h>
8 #ifndef CB_PRECOMP
9 #include <wx/intl.h>
10 #include <wx/listbox.h>
11 #include <wx/xrc/xmlres.h>
12 #include <wx/spinctrl.h>
13 #include <wx/checkbox.h>
14 #include <wx/combobox.h>
15 #include <wx/radiobox.h>
16 #include <wx/radiobut.h>
17 #include <wx/treectrl.h>
18 #include <wx/slider.h>
19 #include <wx/button.h>
20 #include <wx/stattext.h>
21 #include <wx/regex.h>
22 #include <wx/colordlg.h>
23 #include <wx/choice.h>
24
25 #include <configmanager.h>
26 #include <manager.h>
27 #include <globals.h>
28 #endif
29 #include <algorithm>
30 #include <vector>
31
32 #include "fortranproject.h"
33
BEGIN_EVENT_TABLE(FPOptionsDlg,wxPanel)34 BEGIN_EVENT_TABLE(FPOptionsDlg, wxPanel)
35 EVT_UPDATE_UI(-1, FPOptionsDlg::OnUpdateUI)
36 EVT_LISTBOX(XRCID("lbAIStatements"), FPOptionsDlg::OnAISelectionChanged)
37 EVT_BUTTON(XRCID("btCHFullColour"), FPOptionsDlg::OnChooseColour)
38 EVT_BUTTON(XRCID("btCHUnfinColour"), FPOptionsDlg::OnChooseColour)
39 END_EVENT_TABLE()
40
41 FPOptionsDlg::FPOptionsDlg(wxWindow* parent, NativeParserF* np, FortranProject* fp)
42 : m_pNativeParser(np),
43 m_pFortranProject(fp)
44 {
45 ConfigManager* cfg = Manager::Get()->GetConfigManager(_T("fortran_project"));
46
47 wxXmlResource::Get()->LoadPanel(this, parent, _T("dlgFPSettings"));
48
49 XRCCTRL(*this, "chkEnableCC", wxCheckBox)->SetValue(cfg->ReadBool(_T("/use_code_completion"), true));
50 XRCCTRL(*this, "chkSmartCodeCompletion", wxCheckBox)->SetValue(cfg->ReadBool(_T("/use_smart_code_completion"), true));
51 XRCCTRL(*this, "chkOnlyUseAssociated", wxCheckBox)->SetValue(cfg->ReadBool(_T("/only_use_associated"), true));
52 XRCCTRL(*this, "chkShowHiddenEntities", wxCheckBox)->SetValue(cfg->ReadBool(_T("/show_hidden_entities"), false));
53 XRCCTRL(*this, "chkShowTypeVariables", wxCheckBox)->SetValue(cfg->ReadBool(_T("/show_type_variables"), true));
54 XRCCTRL(*this, "spnMaxMatches", wxSpinCtrl)->SetValue(cfg->ReadInt(_T("/max_matches"), 16384));
55
56 XRCCTRL(*this, "chkEnableSB", wxCheckBox)->SetValue(cfg->ReadBool(_T("/use_symbols_browser"), true));
57 XRCCTRL(*this, "chkFloatSB", wxCheckBox)->SetValue(cfg->ReadBool(_T("/as_floating_window"), false));
58 XRCCTRL(*this, "chkBottomTree", wxCheckBox)->SetValue(cfg->ReadBool(_T("/visible_bottom_tree"), true));
59 XRCCTRL(*this, "chkSortSB", wxCheckBox)->SetValue(cfg->ReadBool(_T("/browser_sort_alphabetically"), true));
60 XRCCTRL(*this, "chkLocVarSB", wxCheckBox)->SetValue(cfg->ReadBool(_T("/browser_show_local_variables"), true));
61 XRCCTRL(*this, "chkInclSepar", wxCheckBox)->SetValue(cfg->ReadBool(_T("/browser_show_include_files_separately"), true));
62
63 XRCCTRL(*this, "chkKL_1", wxCheckBox)->SetValue(cfg->ReadBool(_T("/lexer_keywords_set1"), true));
64 XRCCTRL(*this, "chkKL_2", wxCheckBox)->SetValue(cfg->ReadBool(_T("/lexer_keywords_set2"), true));
65 XRCCTRL(*this, "chkKL_3", wxCheckBox)->SetValue(cfg->ReadBool(_T("/lexer_keywords_set3"), false));
66 XRCCTRL(*this, "chkKL_4", wxCheckBox)->SetValue(cfg->ReadBool(_T("/lexer_keywords_set4"), false));
67 XRCCTRL(*this, "chkKL_5", wxCheckBox)->SetValue(cfg->ReadBool(_T("/lexer_keywords_set5"), false));
68 XRCCTRL(*this, "chkKL_6", wxCheckBox)->SetValue(cfg->ReadBool(_T("/lexer_keywords_set6"), false));
69 XRCCTRL(*this, "chkKL_7", wxCheckBox)->SetValue(cfg->ReadBool(_T("/lexer_keywords_set7"), false));
70 XRCCTRL(*this, "chkKL_8", wxCheckBox)->SetValue(cfg->ReadBool(_T("/lexer_keywords_set8"), false));
71 XRCCTRL(*this, "chkKL_9", wxCheckBox)->SetValue(cfg->ReadBool(_T("/lexer_keywords_set9"), false));
72
73 XRCCTRL(*this, "rbCase", wxRadioBox)->SetSelection(cfg->ReadInt(_T("/keywords_case"), 0));
74
75 XRCCTRL(*this, "chkCallTipsArrays", wxCheckBox)->SetValue(cfg->ReadBool(_T("/call_tip_arrays"), true));
76
77 wxCheckBox* chkCH = XRCCTRL(*this, "chkConstrHighlighterEnable", wxCheckBox);
78 chkCH->SetValue(cfg->ReadBool(_T("/do_construct_highlighting"), true));
79 wxButton* btCHFull = XRCCTRL(*this, "btCHFullColour", wxButton);
80 btCHFull->SetBackgroundColour(cfg->ReadColour(_T("/chighlighter_full_colour"),wxColour(165, 165, 255)));
81 wxButton* btCHUnfin = XRCCTRL(*this, "btCHUnfinColour", wxButton);
82 btCHUnfin->SetBackgroundColour(cfg->ReadColour(_T("/chighlighter_unfinished_colour"),wxColour(255, 165, 0)));
83 if (!chkCH->GetValue())
84 {
85 XRCCTRL(*this, "stCHFullColour", wxStaticText)->Enable(false);
86 XRCCTRL(*this, "stCHUnfinColour", wxStaticText)->Enable(false);
87 btCHFull->Enable(false);
88 btCHUnfin->Enable(false);
89 }
90
91 XRCCTRL(*this, "chkFortranInfo", wxCheckBox)->SetValue(cfg->ReadBool(_T("/use_log_window"), true));
92 XRCCTRL(*this, "chkComAbove", wxCheckBox)->SetValue(cfg->ReadBool(_T("/include_comments_above"), true));
93 XRCCTRL(*this, "chkComBelow", wxCheckBox)->SetValue(cfg->ReadBool(_T("/include_comments_below"), true));
94 XRCCTRL(*this, "chkDeclarLog", wxCheckBox)->SetValue(cfg->ReadBool(_T("/include_declarations_log"), true));
95 XRCCTRL(*this, "chkLogComRight", wxCheckBox)->SetValue(cfg->ReadBool(_T("/include_log_comments_variable"), true));
96
97 int iShowDocW = cfg->ReadInt(_T("/show_docs_window"), 1);
98 if (iShowDocW == 0)
99 XRCCTRL(*this, "rbutDocWAlways", wxRadioButton)->SetValue(true);
100 else if (iShowDocW == 1)
101 XRCCTRL(*this, "rbutDocWOnly", wxRadioButton)->SetValue(true);
102 else
103 XRCCTRL(*this, "rbutDocWDont", wxRadioButton)->SetValue(true);
104
105 XRCCTRL(*this, "cbAIEnable", wxCheckBox)->SetValue(cfg->ReadBool(_T("/ainsert_enable"), true));
106 FillAutoInsert();
107 }
108
~FPOptionsDlg()109 FPOptionsDlg::~FPOptionsDlg()
110 {
111 }
112
FillAutoInsert()113 void FPOptionsDlg::FillAutoInsert()
114 {
115 const std::map<wxString,wxString>* ainames = m_AInsert.GetNameMap();
116 std::map<wxString,wxString>::const_iterator it;
117 std::vector<wxString> vecnames;
118
119 for (it = ainames->begin(); it != ainames->end(); ++it)
120 {
121 vecnames.push_back(it->second);
122 }
123
124 std::sort(vecnames.begin(), vecnames.end());
125
126 for (size_t i=0; i<vecnames.size(); ++i)
127 {
128 XRCCTRL(*this, "lbAIStatements", wxListBox)->Append(vecnames[i]);
129 }
130 m_AISelIdx = 0;
131 XRCCTRL(*this, "lbAIStatements", wxListBox)->SetSelection(m_AISelIdx);
132 ShowCurrientAInsert(m_AISelIdx);
133 }
134
ShowCurrientAInsert(int idx)135 void FPOptionsDlg::ShowCurrientAInsert(int idx)
136 {
137 m_AISelIdx = -1;
138
139 wxString sel = XRCCTRL(*this, "lbAIStatements", wxListBox)->GetString(idx);
140 wxArrayString aitstr;
141 wxArrayString alignstr;
142 bool isen;
143 if (!m_AInsert.GetItemChoices(sel, aitstr, alignstr, isen))
144 return;
145
146 XRCCTRL(*this, "cbAIInsert", wxChoice)->Clear();
147 for (size_t i=0; i<aitstr.Count(); i++)
148 {
149 XRCCTRL(*this, "cbAIInsert", wxChoice)->Append(aitstr[i]);
150 }
151
152 XRCCTRL(*this, "cbAIAlign", wxChoice)->Clear();
153 if (alignstr.Count() > 0)
154 {
155 XRCCTRL(*this, "cbAIAlign", wxChoice)->Enable(true);
156 m_cbAIAlign_wasEnabled = true;
157 for (size_t i=0; i<alignstr.Count(); i++)
158 {
159 XRCCTRL(*this, "cbAIAlign", wxChoice)->Append(alignstr[i]);
160 }
161 }
162 else
163 {
164 XRCCTRL(*this, "cbAIAlign", wxChoice)->Enable(false);
165 m_cbAIAlign_wasEnabled = false;
166 }
167
168 XRCCTRL(*this, "cbAIAddName", wxCheckBox)->Enable(isen);
169 m_cbAIAddName_wasEnabled = isen;
170
171 int aiType;
172 bool doAddName;
173 bool alignToStatement;
174 if (!m_AInsert.GetItemValues(sel, aiType, doAddName, alignToStatement))
175 return;
176
177 XRCCTRL(*this, "cbAIInsert", wxChoice)->SetSelection(aiType);
178 int ats = alignToStatement? 0: 1;
179 XRCCTRL(*this, "cbAIAlign", wxChoice)->SetSelection(ats);
180 XRCCTRL(*this, "cbAIAddName", wxCheckBox)->SetValue(doAddName);
181 m_AISelIdx = idx;
182 }
183
OnAISelectionChanged(wxCommandEvent & event)184 void FPOptionsDlg::OnAISelectionChanged(wxCommandEvent& event)
185 {
186 int idx = XRCCTRL(*this, "lbAIStatements", wxListBox)->GetSelection();
187 if (idx != wxNOT_FOUND)
188 {
189 ReadAIChoice();
190 ShowCurrientAInsert(idx);
191 }
192 }
193
ReadAIChoice()194 void FPOptionsDlg::ReadAIChoice()
195 {
196 wxString sel = XRCCTRL(*this, "lbAIStatements", wxListBox)->GetString(m_AISelIdx);
197
198 int aiType = XRCCTRL(*this, "cbAIInsert", wxChoice)->GetSelection();
199 int iAlign = XRCCTRL(*this, "cbAIAlign", wxChoice)->GetSelection();
200 bool alignToStatement = iAlign==0 ? true : false;
201 bool doAddName = XRCCTRL(*this, "cbAIAddName", wxCheckBox)->GetValue();
202
203 m_AInsert.EditRule(sel, aiType, doAddName, alignToStatement);
204 }
205
OnUpdateUI(wxUpdateUIEvent & event)206 void FPOptionsDlg::OnUpdateUI(wxUpdateUIEvent& event)
207 {
208 bool en = XRCCTRL(*this, "chkEnableCC", wxCheckBox)->GetValue();
209
210 XRCCTRL(*this, "chkSmartCodeCompletion", wxCheckBox)->Enable(en);
211 XRCCTRL(*this, "chkOnlyUseAssociated", wxCheckBox)->Enable(en);
212 XRCCTRL(*this, "chkShowHiddenEntities", wxCheckBox)->Enable(en);
213 XRCCTRL(*this, "chkShowTypeVariables", wxCheckBox)->Enable(en);
214 XRCCTRL(*this, "spnMaxMatches", wxSpinCtrl)->Enable(en);
215 XRCCTRL(*this, "rbCase", wxRadioBox)->Enable(en);
216 XRCCTRL(*this, "chkKL_1", wxCheckBox)->Enable(en);
217 XRCCTRL(*this, "chkKL_2", wxCheckBox)->Enable(en);
218 XRCCTRL(*this, "chkKL_3", wxCheckBox)->Enable(en);
219 XRCCTRL(*this, "chkKL_4", wxCheckBox)->Enable(en);
220 XRCCTRL(*this, "chkKL_5", wxCheckBox)->Enable(en);
221 XRCCTRL(*this, "chkKL_6", wxCheckBox)->Enable(en);
222 XRCCTRL(*this, "chkKL_7", wxCheckBox)->Enable(en);
223 XRCCTRL(*this, "chkKL_8", wxCheckBox)->Enable(en);
224 XRCCTRL(*this, "chkKL_9", wxCheckBox)->Enable(en);
225
226 en = XRCCTRL(*this, "chkEnableSB", wxCheckBox)->GetValue();
227 XRCCTRL(*this, "chkFloatSB", wxCheckBox)->Enable(en);
228 XRCCTRL(*this, "chkBottomTree", wxCheckBox)->Enable(en);
229 XRCCTRL(*this, "chkSortSB", wxCheckBox)->Enable(en);
230 XRCCTRL(*this, "chkLocVarSB", wxCheckBox)->Enable(en);
231 XRCCTRL(*this, "chkInclSepar", wxCheckBox)->Enable(en);
232
233 bool chkCH_en = XRCCTRL(*this, "chkConstrHighlighterEnable", wxCheckBox)->GetValue();
234 XRCCTRL(*this, "btCHFullColour", wxButton)->Enable(chkCH_en);
235 XRCCTRL(*this, "btCHUnfinColour", wxButton)->Enable(chkCH_en);
236 XRCCTRL(*this, "stCHFullColour", wxStaticText)->Enable(chkCH_en);
237 XRCCTRL(*this, "stCHUnfinColour", wxStaticText)->Enable(chkCH_en);
238
239 en = XRCCTRL(*this, "chkFortranInfo", wxCheckBox)->GetValue();
240 XRCCTRL(*this, "chkComAbove", wxCheckBox)->Enable(en);
241 XRCCTRL(*this, "chkComBelow", wxCheckBox)->Enable(en);
242 XRCCTRL(*this, "chkDeclarLog", wxCheckBox)->Enable(en);
243 XRCCTRL(*this, "chkLogComRight", wxCheckBox)->Enable(en);
244
245 en = XRCCTRL(*this, "cbAIEnable", wxCheckBox)->GetValue();
246 XRCCTRL(*this, "lbAIStatements", wxListBox)->Enable(en);
247 XRCCTRL(*this, "stAIText1", wxStaticText)->Enable(en);
248 XRCCTRL(*this, "stAIText2", wxStaticText)->Enable(en);
249 XRCCTRL(*this, "cbAIInsert", wxChoice)->Enable(en);
250
251 if (en && m_cbAIAlign_wasEnabled)
252 XRCCTRL(*this, "cbAIAlign", wxChoice)->Enable(en);
253 else if (!en)
254 XRCCTRL(*this, "cbAIAlign", wxChoice)->Enable(en);
255
256 if (en && m_cbAIAddName_wasEnabled)
257 XRCCTRL(*this, "cbAIAddName", wxCheckBox)->Enable(en);
258 else if (!en)
259 XRCCTRL(*this, "cbAIAddName", wxCheckBox)->Enable(en);
260 }
261
OnApply()262 void FPOptionsDlg::OnApply()
263 {
264 ConfigManager* cfg = Manager::Get()->GetConfigManager(_T("fortran_project"));
265
266 // force parser to read its options that we write in the config
267 cfg->Write(_T("/use_code_completion"), (bool)XRCCTRL(*this, "chkEnableCC", wxCheckBox)->GetValue());
268
269 // set all other member options
270 cfg->Write(_T("/use_smart_code_completion"), (bool)XRCCTRL(*this, "chkSmartCodeCompletion", wxCheckBox)->GetValue());
271 cfg->Write(_T("/only_use_associated"), (bool)XRCCTRL(*this, "chkOnlyUseAssociated", wxCheckBox)->GetValue());
272 cfg->Write(_T("/show_hidden_entities"), (bool)XRCCTRL(*this, "chkShowHiddenEntities", wxCheckBox)->GetValue());
273 cfg->Write(_T("/show_type_variables"), (bool)XRCCTRL(*this, "chkShowTypeVariables", wxCheckBox)->GetValue());
274 cfg->Write(_T("/max_matches"), (int)XRCCTRL(*this, "spnMaxMatches", wxSpinCtrl)->GetValue());
275
276 cfg->Write(_T("/use_symbols_browser"), (bool)XRCCTRL(*this, "chkEnableSB", wxCheckBox)->GetValue());
277 cfg->Write(_T("/as_floating_window"), (bool)XRCCTRL(*this, "chkFloatSB", wxCheckBox)->GetValue());
278 cfg->Write(_T("/visible_bottom_tree"), (bool)XRCCTRL(*this, "chkBottomTree", wxCheckBox)->GetValue());
279 cfg->Write(_T("/browser_sort_alphabetically"), (bool)XRCCTRL(*this, "chkSortSB", wxCheckBox)->GetValue());
280 cfg->Write(_T("/browser_show_local_variables"), (bool)XRCCTRL(*this, "chkLocVarSB", wxCheckBox)->GetValue());
281 cfg->Write(_T("/browser_show_include_files_separately"), (bool)XRCCTRL(*this, "chkInclSepar", wxCheckBox)->GetValue());
282
283 cfg->Write(_T("/lexer_keywords_set1"), (bool)XRCCTRL(*this, "chkKL_1", wxCheckBox)->GetValue());
284 cfg->Write(_T("/lexer_keywords_set2"), (bool)XRCCTRL(*this, "chkKL_2", wxCheckBox)->GetValue());
285 cfg->Write(_T("/lexer_keywords_set3"), (bool)XRCCTRL(*this, "chkKL_3", wxCheckBox)->GetValue());
286 cfg->Write(_T("/lexer_keywords_set4"), (bool)XRCCTRL(*this, "chkKL_4", wxCheckBox)->GetValue());
287 cfg->Write(_T("/lexer_keywords_set5"), (bool)XRCCTRL(*this, "chkKL_5", wxCheckBox)->GetValue());
288 cfg->Write(_T("/lexer_keywords_set6"), (bool)XRCCTRL(*this, "chkKL_6", wxCheckBox)->GetValue());
289 cfg->Write(_T("/lexer_keywords_set7"), (bool)XRCCTRL(*this, "chkKL_7", wxCheckBox)->GetValue());
290 cfg->Write(_T("/lexer_keywords_set8"), (bool)XRCCTRL(*this, "chkKL_8", wxCheckBox)->GetValue());
291 cfg->Write(_T("/lexer_keywords_set9"), (bool)XRCCTRL(*this, "chkKL_9", wxCheckBox)->GetValue());
292
293 cfg->Write(_T("/keywords_case"), (int)XRCCTRL(*this, "rbCase", wxRadioBox)->GetSelection());
294
295 cfg->Write(_T("/call_tip_arrays"), (bool)XRCCTRL(*this, "chkCallTipsArrays", wxCheckBox)->GetValue());
296
297 cfg->Write(_T("/chighlighter_full_colour"), XRCCTRL(*this, "btCHFullColour", wxButton)->GetBackgroundColour());
298 cfg->Write(_T("/chighlighter_unfinished_colour"), XRCCTRL(*this, "btCHUnfinColour", wxButton)->GetBackgroundColour());
299
300 cfg->Write(_T("/use_log_window"), (bool)XRCCTRL(*this, "chkFortranInfo", wxCheckBox)->GetValue());
301 cfg->Write(_T("/include_comments_above"), (bool)XRCCTRL(*this, "chkComAbove", wxCheckBox)->GetValue());
302 cfg->Write(_T("/include_comments_below"), (bool)XRCCTRL(*this, "chkComBelow", wxCheckBox)->GetValue());
303 cfg->Write(_T("/include_declarations_log"), (bool)XRCCTRL(*this, "chkDeclarLog", wxCheckBox)->GetValue());
304 cfg->Write(_T("/include_log_comments_variable"), (bool)XRCCTRL(*this, "chkLogComRight", wxCheckBox)->GetValue());
305
306 int iShowDocW;
307 if (XRCCTRL(*this, "rbutDocWAlways", wxRadioButton)->GetValue())
308 iShowDocW = 0;
309 else if (XRCCTRL(*this, "rbutDocWOnly", wxRadioButton)->GetValue())
310 iShowDocW = 1;
311 else
312 iShowDocW = 2;
313
314 cfg->Write(_T("/show_docs_window"), iShowDocW);
315
316 cfg->Write(_T("/ainsert_enable"), (bool)XRCCTRL(*this, "cbAIEnable", wxCheckBox)->GetValue());
317 ReadAIChoice();
318 m_AInsert.WriteAIOptions();
319
320 cfg->Write(_T("/do_construct_highlighting"), (bool)XRCCTRL(*this, "chkConstrHighlighterEnable", wxCheckBox)->GetValue());
321
322 m_pNativeParser->RereadOptions();
323 m_pFortranProject->RereadOptions();
324 }
325
OnChooseColour(wxCommandEvent & event)326 void FPOptionsDlg::OnChooseColour(wxCommandEvent& event)
327 {
328 wxColourData data;
329 wxWindow* sender = FindWindowById(event.GetId());
330 data.SetColour(sender->GetBackgroundColour());
331
332 wxColourDialog dlg(this, &data);
333 PlaceWindow(&dlg);
334 if (dlg.ShowModal() == wxID_OK)
335 {
336 wxColour colour = dlg.GetColourData().GetColour();
337 sender->SetBackgroundColour(colour);
338 //sender->SetLabel(wxEmptyString);
339 }
340 }
341