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