Molecular Modeling Software
リビジョン | 07b7aec16f7dcc452d77ed3df18064332054cbfb (tree) |
---|---|
日時 | 2014-09-21 22:51:49 |
作者 | toshinagata1964 <toshinagata1964@a2be...> |
コミッター | toshinagata1964 |
Keyboard focus issues in Ruby dialog is (hopefully) improved.
git-svn-id: svn+ssh://svn.sourceforge.jp/svnroot/molby/trunk@572 a2be9bc6-48de-4e38-9406-05402d4bc13c
@@ -30,7 +30,7 @@ ifeq ($(TARGET_PLATFORM),MSW) | ||
30 | 30 | endif |
31 | 31 | |
32 | 32 | WXLIB_LIST = core,base,gl,adv |
33 | -OBJECTS = ConsoleFrame.o GlobalParameterFrame.o GlobalParameterFilesFrame.o MoleculeView.o MyApp.o MyCommand.o MyDocument.o MyGLCanvas.o MySlider.o MyClipboardData.o ProgressFrame.o MyListCtrl.o MyDocManager.o wxKillAddition.o RubyDialogFrame.o MyIPCSupport.o MyVersion.o MyThread.o MyProgressIndicator.o modalwindow.o | |
33 | +OBJECTS = ConsoleFrame.o GlobalParameterFrame.o GlobalParameterFilesFrame.o MoleculeView.o MyApp.o MyCommand.o MyDocument.o MyGLCanvas.o MySlider.o MyClipboardData.o ProgressFrame.o MyListCtrl.o MyDocManager.o wxKillAddition.o RubyDialogFrame.o MyIPCSupport.o MyVersion.o MyThread.o MyProgressIndicator.o modalwindow.o MyTextCtrl.o | |
34 | 34 | LIBS = MolLib.a Ruby_bind.a |
35 | 35 | RUBY_EXTLIB = scanf.rb |
36 | 36 |
@@ -2006,6 +2006,14 @@ s_RubyDialog_doItemAction(VALUE val) | ||
2006 | 2006 | VALUE items = rb_iv_get(self, "_items"); |
2007 | 2007 | int nitems = RARRAY_LEN(items); |
2008 | 2008 | int idx = RubyDialogCallback_indexOfItem(dref, ip); |
2009 | + static VALUE sTextActionSym = Qfalse, sEscapeActionSym, sReturnActionSym; | |
2010 | + | |
2011 | + if (sTextActionSym == Qfalse) { | |
2012 | + sTextActionSym = ID2SYM(rb_intern("text_action")); | |
2013 | + sEscapeActionSym = ID2SYM(rb_intern("escape_action")); | |
2014 | + sReturnActionSym = ID2SYM(rb_intern("return_action")); | |
2015 | + } | |
2016 | + | |
2009 | 2017 | if (idx < 0) |
2010 | 2018 | return Qnil; |
2011 | 2019 | ival = INT2NUM(idx); |
@@ -2048,7 +2056,14 @@ s_RubyDialog_doItemAction(VALUE val) | ||
2048 | 2056 | |
2049 | 2057 | if (tval == sTextFieldSymbol || tval == sTextViewSymbol) { |
2050 | 2058 | if (options == 1) |
2051 | - aval = ID2SYM(rb_intern("text_action")); /* Action for every text update */ | |
2059 | + aval = sTextActionSym; /* Action for every text update */ | |
2060 | + } | |
2061 | + | |
2062 | + if (tval == sTextFieldSymbol) { | |
2063 | + if (options == 2) | |
2064 | + aval = sReturnActionSym; | |
2065 | + else if (options == 4) | |
2066 | + aval = sEscapeActionSym; | |
2052 | 2067 | } |
2053 | 2068 | |
2054 | 2069 | /* If the item has the "action" attribute, call it */ |
@@ -2061,6 +2076,11 @@ s_RubyDialog_doItemAction(VALUE val) | ||
2061 | 2076 | } else if (rb_respond_to(itval, SYM2ID(aval))) { |
2062 | 2077 | /* If "action" method is defined, then call it without arguments */ |
2063 | 2078 | rb_funcall(itval, SYM2ID(aval), 0); |
2079 | + } else if (aval == sReturnActionSym || aval == sEscapeActionSym) { | |
2080 | + /* Enter or escape is pressed on text field */ | |
2081 | + rb_ivar_set(itval, SYM2ID(sIsProcessingActionSymbol), Qfalse); | |
2082 | + itval = s_RubyDialog_ItemAtIndex(self, (aval == sReturnActionSym ? INT2FIX(0) : INT2FIX(1))); | |
2083 | + s_RubyDialog_EndModal(1, &itval, self); | |
2064 | 2084 | } else { |
2065 | 2085 | /* Default action (only for default buttons) */ |
2066 | 2086 | if (idx == 0 || idx == 1) { |
@@ -0,0 +1,84 @@ | ||
1 | +/* | |
2 | + * MyTextCtrl.cpp | |
3 | + * Molby | |
4 | + * | |
5 | + * Created by Toshi Nagata on 2014/09/21. | |
6 | + * Copyright 2014 Toshi Nagata. All rights reserved. | |
7 | + * | |
8 | + This program is free software; you can redistribute it and/or modify | |
9 | + it under the terms of the GNU General Public License as published by | |
10 | + the Free Software Foundation version 2 of the License. | |
11 | + | |
12 | + This program is distributed in the hope that it will be useful, | |
13 | + but WITHOUT ANY WARRANTY; without even the implied warranty of | |
14 | + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
15 | + GNU General Public License for more details. | |
16 | + */ | |
17 | + | |
18 | +#include "MyTextCtrl.h" | |
19 | + | |
20 | +IMPLEMENT_DYNAMIC_CLASS(MyTextCtrl, wxTextCtrl) | |
21 | + | |
22 | +BEGIN_EVENT_TABLE(MyTextCtrl, wxTextCtrl) | |
23 | +EVT_KEY_UP(MyTextCtrl::OnKeyUp) | |
24 | +END_EVENT_TABLE() | |
25 | + | |
26 | +const wxEventType myTextCtrl_EVT_PROCESS_ESCAPE = wxNewEventType(); | |
27 | + | |
28 | +MyTextCtrl::MyTextCtrl() : wxTextCtrl() | |
29 | +{} | |
30 | + | |
31 | +MyTextCtrl::MyTextCtrl(wxWindow *parent, wxWindowID id, const wxString &value, | |
32 | + const wxPoint &pos, const wxSize &size, | |
33 | + long style, const wxValidator &validator, | |
34 | + const wxString &name) | |
35 | + : wxTextCtrl(parent, id, value, pos, size, style & ~(MyTextCtrl_Process_Escape), validator) | |
36 | +{ | |
37 | + processEscape = (style & MyTextCtrl_Process_Escape) != 0; | |
38 | +} | |
39 | + | |
40 | +MyTextCtrl::~MyTextCtrl() | |
41 | +{} | |
42 | + | |
43 | +// Call escape key handler on _releasing_ the ESC key | |
44 | +// Note: Overriding OnChar() function does not work! | |
45 | +// (Escape key is swallowed somewhere between OnKeyDown and OnChar) | |
46 | +void | |
47 | +MyTextCtrl::OnKeyUp(wxKeyEvent &event) { | |
48 | + if (processEscape && event.GetKeyCode() == WXK_ESCAPE) { | |
49 | + wxCommandEvent event(myTextCtrl_EVT_PROCESS_ESCAPE, m_windowId); | |
50 | + InitCommandEvent(event); | |
51 | + if (HandleWindowEvent(event)) { | |
52 | + return; | |
53 | + } | |
54 | + } | |
55 | + event.Skip(); | |
56 | + return; | |
57 | +#if defined(__WXMSW__) | |
58 | + // OnKeyDown() is private in WXMSW, so we cannot call the superclass handler. | |
59 | + // Here we copy the code in wxTextCtrl::OnKeyDown() | |
60 | + if ( event.GetModifiers() == wxMOD_CONTROL && IsRich() ) | |
61 | + { | |
62 | + switch ( event.GetKeyCode() ) | |
63 | + { | |
64 | + case 'C': | |
65 | + Copy(); | |
66 | + return; | |
67 | + case 'X': | |
68 | + Cut(); | |
69 | + return; | |
70 | + case 'V': | |
71 | + Paste(); | |
72 | + return; | |
73 | + default: | |
74 | + break; | |
75 | + } | |
76 | + } | |
77 | + if ( event.GetKeyCode() == WXK_ESCAPE && IsMultiLine() ) | |
78 | + return; | |
79 | + event.Skip(); | |
80 | +#else | |
81 | + // Pass the event to the superclass handler | |
82 | + wxTextCtrl::OnKeyDown(event); | |
83 | +#endif | |
84 | +} |
@@ -0,0 +1,44 @@ | ||
1 | +/* | |
2 | + * MyTextCtrl.h | |
3 | + * | |
4 | + * Created by Toshi Nagata on 2014/09/21. | |
5 | + * Copyright 2014 Toshi Nagata. All rights reserved. | |
6 | + | |
7 | + This program is free software; you can redistribute it and/or modify | |
8 | + it under the terms of the GNU General Public License as published by | |
9 | + the Free Software Foundation version 2 of the License. | |
10 | + | |
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. | |
15 | + | |
16 | + */ | |
17 | + | |
18 | +#ifndef __MyTextCtrl_h__ | |
19 | +#define __MyTextCtrl_h__ | |
20 | + | |
21 | +#include "wx/textctrl.h" | |
22 | + | |
23 | +#define MyTextCtrl_Process_Escape 0x10000000 | |
24 | + | |
25 | +extern const wxEventType myTextCtrl_EVT_PROCESS_ESCAPE; | |
26 | + | |
27 | +class MyTextCtrl: public wxTextCtrl { | |
28 | + | |
29 | +public: | |
30 | + MyTextCtrl(); | |
31 | + MyTextCtrl(wxWindow *parent, wxWindowID id, const wxString &value=wxEmptyString, | |
32 | + const wxPoint &pos=wxDefaultPosition, const wxSize &size=wxDefaultSize, | |
33 | + long style=0, const wxValidator &validator=wxDefaultValidator, | |
34 | + const wxString &name=wxTextCtrlNameStr); | |
35 | + virtual ~MyTextCtrl(); | |
36 | + bool processEscape; | |
37 | + void OnKeyUp(wxKeyEvent& event); | |
38 | + | |
39 | +private: | |
40 | + DECLARE_DYNAMIC_CLASS(MyTextCtrl) | |
41 | + DECLARE_EVENT_TABLE() | |
42 | +}; | |
43 | + | |
44 | +#endif /* __MyListCtrl_h__ */ |
@@ -34,6 +34,7 @@ | ||
34 | 34 | #include "MyApp.h" |
35 | 35 | #include "MyMBConv.h" |
36 | 36 | #include "MyDocument.h" |
37 | +#include "MyTextCtrl.h" | |
37 | 38 | |
38 | 39 | IMPLEMENT_DYNAMIC_CLASS(MyLayoutPanel, wxPanel) |
39 | 40 |
@@ -268,10 +269,17 @@ RubyDialogFrame::OnEnterProcessedOnText(wxCommandEvent &event) | ||
268 | 269 | void |
269 | 270 | RubyDialogFrame::OnKillFocusOnText(wxFocusEvent &event) |
270 | 271 | { |
272 | + event.Skip(); | |
271 | 273 | RubyDialog_doItemAction((RubyValue)dval, (RDItem *)(event.GetEventObject()), 3); |
272 | 274 | } |
273 | 275 | |
274 | 276 | void |
277 | +RubyDialogFrame::OnEscapeProcessedOnText(wxCommandEvent &event) | |
278 | +{ | |
279 | + RubyDialog_doItemAction((RubyValue)dval, (RDItem *)(event.GetEventObject()), 4); | |
280 | +} | |
281 | + | |
282 | +void | |
275 | 283 | RubyDialogFrame::OnDefaultButtonPressed(wxCommandEvent &event) |
276 | 284 | { |
277 | 285 | /* Ignore the wxID_OK and wxID_CANCEL requests if the default buttons are hidden */ |
@@ -416,6 +424,7 @@ void | ||
416 | 424 | RubyDialogFrame::OnActivate(wxActivateEvent &event) |
417 | 425 | { |
418 | 426 | wxModalWindow::OnActivate(event); |
427 | +#if defined(__WXMAC__) | |
419 | 428 | if (event.GetActive()) { |
420 | 429 | int i; |
421 | 430 | RDItem *itemp; |
@@ -431,6 +440,7 @@ RubyDialogFrame::OnActivate(wxActivateEvent &event) | ||
431 | 440 | } |
432 | 441 | } |
433 | 442 | } |
443 | +#endif | |
434 | 444 | } |
435 | 445 | |
436 | 446 | /* Remember the focused window after every focus change */ |
@@ -440,11 +450,14 @@ RubyDialogFrame::OnChildFocus(wxChildFocusEvent &event) | ||
440 | 450 | { |
441 | 451 | wxWindow *winp = wxWindow::FindFocus(); |
442 | 452 | if (winp != NULL) { |
453 | +#if defined(__WXMAC__) | |
443 | 454 | if (winp != lastFocusedWindow && wxDynamicCast(winp, wxTextCtrl) != NULL && ((wxTextCtrl *)winp)->IsEditable()) { |
444 | 455 | ((wxTextCtrl *)winp)->SelectAll(); |
445 | 456 | } |
457 | +#endif | |
446 | 458 | lastFocusedWindow = winp; |
447 | 459 | } |
460 | + event.Skip(); | |
448 | 461 | } |
449 | 462 | |
450 | 463 | void |
@@ -655,7 +668,7 @@ RubyDialog * | ||
655 | 668 | RubyDialogCallback_new(int style) |
656 | 669 | { |
657 | 670 | RubyDialogFrame *dref; |
658 | - int fstyle = wxCAPTION | wxSYSTEM_MENU; | |
671 | + int fstyle = wxCAPTION | wxSYSTEM_MENU | wxTAB_TRAVERSAL; | |
659 | 672 | if (style & rd_Resizable) |
660 | 673 | fstyle |= wxMAXIMIZE_BOX | wxRESIZE_BORDER; |
661 | 674 | if (style & rd_HasCloseBox) { |
@@ -689,10 +702,49 @@ RubyDialogCallback_setWindowTitle(RubyDialog *dref, const char *title) | ||
689 | 702 | ((RubyDialogFrame *)dref)->SetLabel(str); |
690 | 703 | } |
691 | 704 | |
705 | +void | |
706 | +RubyDialogCallback_initializeBeforeShow(RubyDialog *dref, int modal) | |
707 | +{ | |
708 | + RubyDialogFrame *dframe = (RubyDialogFrame *)dref; | |
709 | + | |
710 | + if (dframe->shouldInitializeBeforeShow) { | |
711 | + if (modal == 0) { | |
712 | + // Set a menu bar | |
713 | + // The window size may change on setting the menu bar, so restore the original size | |
714 | + // after setting the menu bar | |
715 | + int width, height; | |
716 | + dframe->GetClientSize(&width, &height); | |
717 | + dframe->SetMenuBar(wxGetApp().CreateMenuBar(3, NULL, NULL)); | |
718 | + dframe->SetClientSize(width, height); | |
719 | + } | |
720 | + // If there is a textfield or textview control, then set focus on the first one | |
721 | + int i; | |
722 | + RDItem *itemp; | |
723 | + for (i = 2; (itemp = dframe->DialogItemAtIndex(i)) != NULL; i++) { | |
724 | + bool canAcceptFocus; | |
725 | +#if defined(__WXMAC__) | |
726 | + canAcceptFocus = (wxDynamicCast((wxWindow *)itemp, wxTextCtrl) != NULL && ((wxTextCtrl *)itemp)->IsEditable()); | |
727 | +#else | |
728 | + canAcceptFocus = ((wxWindow *)itemp)->CanAcceptFocusFromKeyboard(); | |
729 | +#endif | |
730 | + | |
731 | + if (canAcceptFocus) { | |
732 | + if (wxDynamicCast((wxWindow *)itemp, wxTextCtrl) != NULL && ((wxTextCtrl *)itemp)->IsEditable()) { | |
733 | + ((wxTextCtrl *)itemp)->SelectAll(); | |
734 | + } | |
735 | + ((wxWindow *)itemp)->SetFocus(); | |
736 | + break; | |
737 | + } | |
738 | + } | |
739 | + dframe->shouldInitializeBeforeShow = false; | |
740 | + } | |
741 | +} | |
742 | + | |
692 | 743 | int |
693 | 744 | RubyDialogCallback_runModal(RubyDialog *dref) |
694 | 745 | { |
695 | 746 | int retval; |
747 | + RubyDialogCallback_initializeBeforeShow(dref, 1); | |
696 | 748 | ((RubyDialogFrame *)dref)->CenterOnScreen(); |
697 | 749 | retval = ((RubyDialogFrame *)dref)->ShowModal(); |
698 | 750 | if (retval == wxID_OK) |
@@ -734,11 +786,7 @@ RubyDialogCallback_show(RubyDialog *dref) | ||
734 | 786 | { |
735 | 787 | RubyDialogFrame *dframe = (RubyDialogFrame *)dref; |
736 | 788 | |
737 | - if (dframe->shouldInitializeBeforeShow) { | |
738 | - // Set a menu bar | |
739 | - dframe->SetMenuBar(wxGetApp().CreateMenuBar(3, NULL, NULL)); | |
740 | - dframe->shouldInitializeBeforeShow = false; | |
741 | - } | |
789 | + RubyDialogCallback_initializeBeforeShow(dref, 0); | |
742 | 790 | |
743 | 791 | if (dframe->myTimer != NULL) |
744 | 792 | dframe->StartIntervalTimer(-1); |
@@ -921,10 +969,11 @@ RubyDialogCallback_createItem(RubyDialog *dref, const char *type, const char *ti | ||
921 | 969 | no_action = true; |
922 | 970 | } else if (strcmp(type, "textfield") == 0) { |
923 | 971 | /* Editable text */ |
924 | - wxTextCtrl *tc = new wxTextCtrl(parent, -1, tstr, rect.GetPosition(), rect.GetSize(), wxTE_PROCESS_ENTER); | |
972 | + MyTextCtrl *tc = new MyTextCtrl(parent, -1, tstr, rect.GetPosition(), rect.GetSize(), wxTE_PROCESS_ENTER | MyTextCtrl_Process_Escape); | |
925 | 973 | control = tc; |
926 | 974 | tc->Connect(-1, wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler(RubyDialogFrame::OnTextUpdated), NULL, parent); |
927 | 975 | tc->Connect(-1, wxEVT_TEXT_ENTER, wxCommandEventHandler(RubyDialogFrame::OnEnterProcessedOnText), NULL, parent); |
976 | + tc->Connect(-1, myTextCtrl_EVT_PROCESS_ESCAPE, wxCommandEventHandler(RubyDialogFrame::OnEscapeProcessedOnText), NULL, parent); | |
928 | 977 | tc->Connect(-1, wxEVT_KILL_FOCUS, wxFocusEventHandler(RubyDialogFrame::OnKillFocusOnText), NULL, parent); |
929 | 978 | } else if (strcmp(type, "textview") == 0) { |
930 | 979 | /* Text view */ |
@@ -105,6 +105,7 @@ public: | ||
105 | 105 | void OnDialogItemAction(wxCommandEvent &event); |
106 | 106 | void OnTextUpdated(wxCommandEvent &event); |
107 | 107 | void OnEnterProcessedOnText(wxCommandEvent &event); |
108 | + void OnEscapeProcessedOnText(wxCommandEvent &event); | |
108 | 109 | void OnKillFocusOnText(wxFocusEvent &event); |
109 | 110 | |
110 | 111 | void OnTimerEvent(wxTimerEvent &event); |
@@ -56,6 +56,7 @@ | ||
56 | 56 | E4ACACE718C6D32300F08B67 /* ortep3 in Resources */ = {isa = PBXBuildFile; fileRef = E4ACACE418C6D32300F08B67 /* ortep3 */; }; |
57 | 57 | E4D379A219C87C2200636D28 /* modalwindow.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E4D379A119C87C2200636D28 /* modalwindow.cpp */; }; |
58 | 58 | E4D37E0E19CC831500636D28 /* modalwindow_osx.mm in Sources */ = {isa = PBXBuildFile; fileRef = E4D37E0D19CC831500636D28 /* modalwindow_osx.mm */; }; |
59 | + E4D3806619CEC7B600636D28 /* MyTextCtrl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E4D3806419CEC7B600636D28 /* MyTextCtrl.cpp */; }; | |
59 | 60 | E4FC77A9183E4F3F0064FB2E /* Dcd.c in Sources */ = {isa = PBXBuildFile; fileRef = E4FC777B183E4F3F0064FB2E /* Dcd.c */; }; |
60 | 61 | E4FC77AA183E4F3F0064FB2E /* IntGroup.c in Sources */ = {isa = PBXBuildFile; fileRef = E4FC777D183E4F3F0064FB2E /* IntGroup.c */; }; |
61 | 62 | E4FC77AB183E4F3F0064FB2E /* MainView.c in Sources */ = {isa = PBXBuildFile; fileRef = E4FC777F183E4F3F0064FB2E /* MainView.c */; }; |
@@ -145,6 +146,8 @@ | ||
145 | 146 | E4D379A019C87C1200636D28 /* modalwindow.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = modalwindow.h; sourceTree = "<group>"; }; |
146 | 147 | E4D379A119C87C2200636D28 /* modalwindow.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = modalwindow.cpp; sourceTree = "<group>"; }; |
147 | 148 | E4D37E0D19CC831500636D28 /* modalwindow_osx.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = modalwindow_osx.mm; sourceTree = "<group>"; }; |
149 | + E4D3806419CEC7B600636D28 /* MyTextCtrl.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MyTextCtrl.cpp; sourceTree = "<group>"; }; | |
150 | + E4D3806519CEC7B600636D28 /* MyTextCtrl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MyTextCtrl.h; sourceTree = "<group>"; }; | |
148 | 151 | E4FC777A183E4F3F0064FB2E /* cmdtool_stubs.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = cmdtool_stubs.c; path = ../MolLib/cmdtool_stubs.c; sourceTree = SOURCE_ROOT; }; |
149 | 152 | E4FC777B183E4F3F0064FB2E /* Dcd.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = Dcd.c; path = ../MolLib/Dcd.c; sourceTree = SOURCE_ROOT; }; |
150 | 153 | E4FC777C183E4F3F0064FB2E /* Dcd.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Dcd.h; path = ../MolLib/Dcd.h; sourceTree = SOURCE_ROOT; }; |
@@ -431,6 +434,8 @@ | ||
431 | 434 | E420BE09188574AD00A2B983 /* MyIPCSupport.h */, |
432 | 435 | E420BE0A188574AD00A2B983 /* MyListCtrl.cpp */, |
433 | 436 | E420BE0B188574AD00A2B983 /* MyListCtrl.h */, |
437 | + E4D3806419CEC7B600636D28 /* MyTextCtrl.cpp */, | |
438 | + E4D3806519CEC7B600636D28 /* MyTextCtrl.h */, | |
434 | 439 | E420BE11188574D700A2B983 /* MyMBConv.h */, |
435 | 440 | E420BE12188574D700A2B983 /* MyProgressIndicator.cpp */, |
436 | 441 | E420BE13188574D700A2B983 /* MyProgressIndicator.h */, |
@@ -625,6 +630,7 @@ | ||
625 | 630 | E4196C66190B2FA500183E62 /* menu.mm in Sources */, |
626 | 631 | E4D379A219C87C2200636D28 /* modalwindow.cpp in Sources */, |
627 | 632 | E4D37E0E19CC831500636D28 /* modalwindow_osx.mm in Sources */, |
633 | + E4D3806619CEC7B600636D28 /* MyTextCtrl.cpp in Sources */, | |
628 | 634 | ); |
629 | 635 | runOnlyForDeploymentPostprocessing = 0; |
630 | 636 | }; |