1
2
3
4
5
6 import wx
7
8
9 import gettext
10
11
12
13
14
15
18
19 kwds["style"] = kwds.get("style", 0) | wx.BORDER_NONE | wx.TAB_TRAVERSAL
20 wx.ScrolledWindow.__init__(self, *args, **kwds)
21 self._splitter_main = wx.SplitterWindow(self, wx.ID_ANY, style=wx.SP_3D | wx.SP_BORDER | wx.SP_PERMIT_UNSPLIT)
22 self.__splitter_main_left_pnl = wx.Panel(self._splitter_main, wx.ID_ANY, style=wx.BORDER_NONE | wx.FULL_REPAINT_ON_RESIZE)
23 self._splitter_left = wx.SplitterWindow(self.__splitter_main_left_pnl, wx.ID_ANY, style=wx.SP_3D | wx.SP_BORDER)
24 self.__splitter_left_top_pnl = wx.Panel(self._splitter_left, wx.ID_ANY)
25 self._TCTRL_current_status = wx.TextCtrl(self.__splitter_left_top_pnl, wx.ID_ANY, _("In this area GNUmed will place the status of all cardiac devices and device parts. There can be more than one device at a time\n\nIt potentially looks like this\n----------------------------------------------------------------------------------------------------------------\nDevice: SJM Atlas DR (active) Battery: 2.4V (MOL) Implanted: Feb 09 2008\n\nRA: Medtronic Sprint fidelis (active, flaky, replacement) Implanted: Feb 09 2008\nSensing: 2 (1.5) mV Threshold: 0.7/0.5 (1/0.4) V/ms Impedance: 800 (900) Ohm\n\nRV: Medtronic Sprint fidelis (active, flaky, replacement) Implanted: Feb 09 2008\nSensing: 7 (15) mV Threshold: 0.7/0.5 (1/0.4) V/ms Impedance: 800 (900) Ohm\n\nLV: Medtronic Sprint fidelis (active, flaky, Y-connector) Implanted: Feb 09 2008\nSensing: 7 ( ?) mV Threshold: 1/1.5 (1/1) V/ms Impedance: 800 (900) Ohm\n----------------------------------------------------------------------------------------------------------------\nDevice: Medtronic Relia SR (inactive) Batttery 2.1V (EOL) Implanted: Jan 23 2000\n\nDevice: Medtronic Kappa SR (explanted) Batttery 2.1V (EOL) Explanted: Jan 23 2000 (Jan 23 1995)\n-----------------------------------------------------------------------------------------------------------------\nRA Lead: Medtronic ? (inactive, capped) Implanted: Jan 23 2000\nRV Lead: Medtronic ? (explanted) Explanted: Feb 09 2008"), style=wx.TE_MULTILINE | wx.TE_READONLY | wx.TE_WORDWRAP)
26 self.__splitter_left_bottom_pnl = wx.Panel(self._splitter_left, wx.ID_ANY, style=wx.BORDER_NONE)
27 self._LCTRL_pevious_encounters = cReportListCtrl(self.__splitter_left_bottom_pnl, wx.ID_ANY, style=wx.BORDER_NONE | wx.FULL_REPAINT_ON_RESIZE | wx.LC_REPORT)
28 self.__splitter_main_right_pnl = wx.Panel(self._splitter_main, wx.ID_ANY, style=wx.BORDER_NONE)
29 self._splitter_right = wx.SplitterWindow(self.__splitter_main_right_pnl, wx.ID_ANY, style=wx.SP_3D | wx.SP_BORDER | wx.SP_PERMIT_UNSPLIT)
30 self.__splitter_right_top_pnl = wx.Panel(self._splitter_right, wx.ID_ANY, style=wx.BORDER_NONE)
31 self._PRW_encounter_type = cEncounterTypePhraseWheel(self.__splitter_right_top_pnl, wx.ID_ANY, "")
32 self._PRW_encounter_start = cFuzzyTimestampInput(self.__splitter_right_top_pnl, wx.ID_ANY, "")
33 self._PRW_encounter_end = cFuzzyTimestampInput(self.__splitter_right_top_pnl, wx.ID_ANY, "")
34 self._BTN_new_encounter = wx.Button(self.__splitter_right_top_pnl, wx.ID_ANY, _("New"), style=wx.BU_EXACTFIT)
35 self._TCTRL_rfe = wx.TextCtrl(self.__splitter_right_top_pnl, wx.ID_ANY, "")
36 self._NB_device_editors = cSoapNoteInputNotebook(self.__splitter_right_top_pnl, wx.ID_ANY, style=0)
37 self.notebook_1_pane_1 = wx.Panel(self._NB_device_editors, wx.ID_ANY)
38 self._TCTRL_aoe = wx.TextCtrl(self.__splitter_right_top_pnl, wx.ID_ANY, "")
39 self._TCTRL_ekg = wx.TextCtrl(self.__splitter_right_top_pnl, wx.ID_ANY, "")
40 self._BTN_save_all = wx.Button(self.__splitter_right_top_pnl, wx.ID_ANY, _("&All"), style=wx.BU_EXACTFIT)
41 self._BTN_save_encounter = wx.Button(self.__splitter_right_top_pnl, wx.ID_ANY, _("&Encounter"), style=wx.BU_EXACTFIT)
42 self._BTN_save_note = wx.Button(self.__splitter_right_top_pnl, wx.ID_ANY, _("&Note"), style=wx.BU_EXACTFIT)
43 self._BTN_new_editor = wx.Button(self.__splitter_right_top_pnl, wx.ID_ANY, _("&New"), style=wx.BU_EXACTFIT)
44 self._BTN_clear_editor = wx.Button(self.__splitter_right_top_pnl, wx.ID_ANY, _("&Clear"), style=wx.BU_EXACTFIT)
45 self._BTN_discard_editor = wx.Button(self.__splitter_right_top_pnl, wx.ID_ANY, _("&Discard"), style=wx.BU_EXACTFIT)
46 self.__splitter_right_bottom_pnl = wx.ScrolledWindow(self._splitter_right, wx.ID_ANY, style=wx.BORDER_NONE)
47 self._lbl_hints = wx.StaticText(self.__splitter_right_bottom_pnl, wx.ID_ANY, _("In this area GNUmed will place hints and tips\nrelated to the current interrogation note and patient.\n\nThose hints will be derived from a variety of\nsources such as classifications (ICD, ...), \nsafety warnings, online resources (Google\nand friends), device databases, etc.\n\nEventually, those hints will be active in that you\ncan click on them and be taken to the relevant\ninformation/an appropriate action be performed."))
48
49 self.__set_properties()
50 self.__do_layout()
51
52 self.Bind(wx.EVT_LIST_ITEM_ACTIVATED, self._on_problem_activated, self._LCTRL_pevious_encounters)
53 self.Bind(wx.EVT_BUTTON, self._on_new_encounter_button_pressed, self._BTN_new_encounter)
54 self.Bind(wx.EVT_BUTTON, self._on_save_all_button_pressed, self._BTN_save_all)
55 self.Bind(wx.EVT_BUTTON, self._on_save_encounter_button_pressed, self._BTN_save_encounter)
56 self.Bind(wx.EVT_BUTTON, self._on_save_note_button_pressed, self._BTN_save_note)
57 self.Bind(wx.EVT_BUTTON, self._on_new_editor_button_pressed, self._BTN_new_editor)
58 self.Bind(wx.EVT_BUTTON, self._on_clear_editor_button_pressed, self._BTN_clear_editor)
59 self.Bind(wx.EVT_BUTTON, self._on_discard_editor_button_pressed, self._BTN_discard_editor)
60
61
63
64 self.SetScrollRate(10, 10)
65 self._TCTRL_current_status.Enable(False)
66 self._LCTRL_pevious_encounters.SetToolTip(_("This shows the list of previous encounters"))
67 self._splitter_left.SetMinimumPaneSize(20)
68 self._PRW_encounter_type.SetToolTip(_("Select the type of encounter."))
69 self._PRW_encounter_start.SetToolTip(_("Date and time when the current (!) encounter started."))
70 self._PRW_encounter_end.SetToolTip(_("Date and time when the current (!) encounter ends."))
71 self._BTN_new_encounter.SetToolTip(_("Start a new encounter. If there are any changes to the current encounter you will be asked whether to save them."))
72 self._TCTRL_rfe.SetToolTip(_("This documents why the encounter takes place.\n\nIt may be due to a patient request or it may be prompted by other reasons. Often initially collected at the front desk and put into a waiting list comment. May turn out to just be a proxy request for why the patient really is here.\n\nAlso known as the Reason For Encounter/Visit (RFE)."))
73 self._TCTRL_aoe.SetToolTip(_("This summarizes the outcome/assessment of the consultation from the doctors point of view. Note that this summary spans all the problems discussed during this encounter."))
74 self._TCTRL_ekg.SetToolTip(_("This summarizes the outcome/assessment of the consultation from the doctors point of view. Note that this summary spans all the problems discussed during this encounter."))
75 self._BTN_save_all.SetToolTip(_("Save encounter details and all progress notes."))
76 self._BTN_save_encounter.SetToolTip(_("Save the encounter details."))
77 self._BTN_save_note.SetToolTip(_("Save the currently displayed progress note."))
78 self._BTN_new_editor.SetToolTip(_("Open a new progress note editor.\n\nThere is a configuration item on whether to allow several new-episode editors at once."))
79 self._BTN_clear_editor.SetToolTip(_("Clear the editor for the displayed progress note."))
80 self._BTN_discard_editor.SetToolTip(_("Discard the editor for the displayed progress note."))
81 self.__splitter_right_bottom_pnl.SetScrollRate(10, 10)
82 self._splitter_right.SetMinimumPaneSize(20)
83 self._splitter_main.SetMinimumPaneSize(20)
84
85
87
88 __szr_main = wx.BoxSizer(wx.HORIZONTAL)
89 __szr_right = wx.BoxSizer(wx.VERTICAL)
90 __szr_lower_bottom_right = wx.StaticBoxSizer(wx.StaticBox(self.__splitter_right_bottom_pnl, wx.ID_ANY, _("Tips and Hints")), wx.VERTICAL)
91 __szr_top_right = wx.StaticBoxSizer(wx.StaticBox(self.__splitter_right_top_pnl, wx.ID_ANY, _("New notes in current encounter")), wx.VERTICAL)
92 __szr_buttons = wx.BoxSizer(wx.HORIZONTAL)
93 __szr_ekg = wx.BoxSizer(wx.HORIZONTAL)
94 __szr_aoe = wx.BoxSizer(wx.HORIZONTAL)
95 __gszr_encounter_details = wx.FlexGridSizer(2, 2, 2, 5)
96 __szr_encounter_details = wx.BoxSizer(wx.HORIZONTAL)
97 __szr_left = wx.BoxSizer(wx.VERTICAL)
98 __szr_bottom_left = wx.StaticBoxSizer(wx.StaticBox(self.__splitter_left_bottom_pnl, wx.ID_ANY, _("Previous Encounters")), wx.VERTICAL)
99 __szr_top_left = wx.StaticBoxSizer(wx.StaticBox(self.__splitter_left_top_pnl, wx.ID_ANY, _("Active Device Settings")), wx.VERTICAL)
100 __szr_top_left.Add(self._TCTRL_current_status, 1, wx.EXPAND, 0)
101 self.__splitter_left_top_pnl.SetSizer(__szr_top_left)
102 __szr_bottom_left.Add(self._LCTRL_pevious_encounters, 1, wx.EXPAND, 0)
103 self.__splitter_left_bottom_pnl.SetSizer(__szr_bottom_left)
104 self._splitter_left.SplitHorizontally(self.__splitter_left_top_pnl, self.__splitter_left_bottom_pnl)
105 __szr_left.Add(self._splitter_left, 1, wx.EXPAND, 0)
106 self.__splitter_main_left_pnl.SetSizer(__szr_left)
107 __lbl_encounter_details = wx.StaticText(self.__splitter_right_top_pnl, wx.ID_ANY, _("Encounter"))
108 __gszr_encounter_details.Add(__lbl_encounter_details, 0, wx.ALIGN_CENTER_VERTICAL, 0)
109 __szr_encounter_details.Add(self._PRW_encounter_type, 1, wx.ALIGN_CENTER_VERTICAL | wx.EXPAND | wx.RIGHT, 10)
110 __szr_encounter_details.Add(self._PRW_encounter_start, 1, wx.ALIGN_CENTER_VERTICAL | wx.EXPAND | wx.RIGHT, 5)
111 __lbl_until = wx.StaticText(self.__splitter_right_top_pnl, wx.ID_ANY, _("until"))
112 __szr_encounter_details.Add(__lbl_until, 0, wx.ALIGN_CENTER_VERTICAL | wx.RIGHT, 5)
113 __szr_encounter_details.Add(self._PRW_encounter_end, 1, wx.ALIGN_CENTER_VERTICAL | wx.EXPAND | wx.RIGHT, 5)
114 __szr_encounter_details.Add(self._BTN_new_encounter, 0, wx.EXPAND, 0)
115 __gszr_encounter_details.Add(__szr_encounter_details, 1, wx.EXPAND, 0)
116 __lbl_rfe = wx.StaticText(self.__splitter_right_top_pnl, wx.ID_ANY, _("Request"))
117 __gszr_encounter_details.Add(__lbl_rfe, 0, wx.ALIGN_CENTER_VERTICAL, 0)
118 __gszr_encounter_details.Add(self._TCTRL_rfe, 1, wx.ALIGN_CENTER_VERTICAL | wx.EXPAND, 0)
119 __gszr_encounter_details.AddGrowableCol(1)
120 __szr_top_right.Add(__gszr_encounter_details, 0, wx.EXPAND | wx.RIGHT, 3)
121 self._NB_device_editors.AddPage(self.notebook_1_pane_1, _("device1"))
122 __szr_top_right.Add(self._NB_device_editors, 1, wx.EXPAND | wx.RIGHT | wx.TOP, 3)
123 __lbl_aoe = wx.StaticText(self.__splitter_right_top_pnl, wx.ID_ANY, _("Summary"))
124 __szr_aoe.Add(__lbl_aoe, 0, wx.ALIGN_CENTER_VERTICAL | wx.RIGHT, 5)
125 __szr_aoe.Add(self._TCTRL_aoe, 1, wx.ALIGN_CENTER_VERTICAL | wx.BOTTOM | wx.EXPAND | wx.RIGHT | wx.TOP, 5)
126 __szr_top_right.Add(__szr_aoe, 0, wx.EXPAND | wx.RIGHT | wx.TOP, 3)
127 __lbl_ekg = wx.StaticText(self.__splitter_right_top_pnl, wx.ID_ANY, _("EKG"))
128 __szr_ekg.Add(__lbl_ekg, 0, wx.ALIGN_CENTER_VERTICAL | wx.RIGHT, 5)
129 __szr_ekg.Add(self._TCTRL_ekg, 1, wx.ALIGN_CENTER_VERTICAL | wx.BOTTOM | wx.EXPAND | wx.RIGHT | wx.TOP, 5)
130 __szr_top_right.Add(__szr_ekg, 0, wx.EXPAND | wx.RIGHT | wx.TOP, 3)
131 __lbl_save = wx.StaticText(self.__splitter_right_top_pnl, wx.ID_ANY, _("Save:"))
132 __szr_buttons.Add(__lbl_save, 0, wx.ALIGN_CENTER_VERTICAL | wx.RIGHT, 5)
133 __szr_buttons.Add(self._BTN_save_all, 0, wx.EXPAND | wx.RIGHT, 3)
134 __szr_buttons.Add(self._BTN_save_encounter, 0, wx.EXPAND | wx.RIGHT, 3)
135 __szr_buttons.Add(self._BTN_save_note, 0, wx.EXPAND, 0)
136 __szr_buttons.Add((1, 1), 1, 0, 0)
137 __lbl_editor = wx.StaticText(self.__splitter_right_top_pnl, wx.ID_ANY, _("Editor:"))
138 __szr_buttons.Add(__lbl_editor, 0, wx.ALIGN_CENTER_VERTICAL | wx.RIGHT, 5)
139 __szr_buttons.Add(self._BTN_new_editor, 0, wx.EXPAND | wx.RIGHT, 3)
140 __szr_buttons.Add(self._BTN_clear_editor, 0, wx.EXPAND | wx.RIGHT, 3)
141 __szr_buttons.Add(self._BTN_discard_editor, 0, wx.EXPAND, 0)
142 __szr_buttons.Add((1, 1), 1, 0, 0)
143 __szr_top_right.Add(__szr_buttons, 0, wx.EXPAND | wx.RIGHT | wx.TOP, 3)
144 self.__splitter_right_top_pnl.SetSizer(__szr_top_right)
145 __szr_lower_bottom_right.Add(self._lbl_hints, 0, wx.EXPAND, 0)
146 self.__splitter_right_bottom_pnl.SetSizer(__szr_lower_bottom_right)
147 self._splitter_right.SplitHorizontally(self.__splitter_right_top_pnl, self.__splitter_right_bottom_pnl)
148 __szr_right.Add(self._splitter_right, 1, wx.EXPAND, 0)
149 self.__splitter_main_right_pnl.SetSizer(__szr_right)
150 self._splitter_main.SplitVertically(self.__splitter_main_left_pnl, self.__splitter_main_right_pnl)
151 __szr_main.Add(self._splitter_main, 1, wx.EXPAND, 0)
152 self.SetSizer(__szr_main)
153 __szr_main.Fit(self)
154 self.Layout()
155
156
158 print("Event handler '_on_problem_activated' not implemented!")
159 event.Skip()
160
162 print("Event handler '_on_new_encounter_button_pressed' not implemented!")
163 event.Skip()
164
166 print("Event handler '_on_save_all_button_pressed' not implemented!")
167 event.Skip()
168
170 print("Event handler '_on_save_encounter_button_pressed' not implemented!")
171 event.Skip()
172
174 print("Event handler '_on_save_note_button_pressed' not implemented!")
175 event.Skip()
176
178 print("Event handler '_on_new_editor_button_pressed' not implemented!")
179 event.Skip()
180
182 print("Event handler '_on_clear_editor_button_pressed' not implemented!")
183 event.Skip()
184
186 print("Event handler '_on_discard_editor_button_pressed' not implemented!")
187 event.Skip()
188
189
190