1
2
3
4
5 import wx
6
7
8
9
12
13 from Gnumed.wxpython.gmNarrativeWidgets import cSoapNoteInputNotebook
14 from Gnumed.wxpython.gmDateTimeInput import cFuzzyTimestampInput
15 from Gnumed.wxpython.gmEMRStructWidgets import cEncounterTypePhraseWheel
16 from Gnumed.wxpython import gmListWidgets
17
18
19 kwds["style"] = wx.NO_BORDER|wx.TAB_TRAVERSAL
20 wx.ScrolledWindow.__init__(self, *args, **kwds)
21 self._splitter_main = wx.SplitterWindow(self, -1, style=wx.SP_3D|wx.SP_BORDER|wx.SP_PERMIT_UNSPLIT)
22 self.__splitter_main_right_pnl = wx.Panel(self._splitter_main, -1, style=wx.NO_BORDER)
23 self._splitter_right = wx.SplitterWindow(self.__splitter_main_right_pnl, -1, style=wx.SP_3D|wx.SP_BORDER|wx.SP_PERMIT_UNSPLIT)
24 self.__splitter_right_bottom_pnl = wx.ScrolledWindow(self._splitter_right, -1, style=wx.NO_BORDER)
25 self.__splitter_right_top_pnl = wx.Panel(self._splitter_right, -1, style=wx.NO_BORDER)
26 self._NB_device_editors = cSoapNoteInputNotebook(self.__splitter_right_top_pnl, -1, style=0)
27 self.__splitter_main_left_pnl = wx.Panel(self._splitter_main, -1, style=wx.NO_BORDER|wx.FULL_REPAINT_ON_RESIZE)
28 self._splitter_left = wx.SplitterWindow(self.__splitter_main_left_pnl, -1, style=wx.SP_3D|wx.SP_BORDER)
29 self.__splitter_left_bottom_pnl = wx.Panel(self._splitter_left, -1, style=wx.NO_BORDER)
30 self.__splitter_left_top_pnl = wx.Panel(self._splitter_left, -1)
31 self.__szr_bottom_left_staticbox = wx.StaticBox(self.__splitter_left_bottom_pnl, -1, _("Previous Encounters"))
32 self.__szr_top_right_staticbox = wx.StaticBox(self.__splitter_right_top_pnl, -1, _("New notes in current encounter"))
33 self.__szr_lower_bottom_right_staticbox = wx.StaticBox(self.__splitter_right_bottom_pnl, -1, _("Tips and Hints"))
34 self.__szr_top_left_staticbox = wx.StaticBox(self.__splitter_left_top_pnl, -1, _("Active Device Settings"))
35 self._TCTRL_current_status = wx.TextCtrl(self.__splitter_left_top_pnl, -1, _("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|wx.NO_BORDER)
36 self._LCTRL_pevious_encounters = gmListWidgets.cReportListCtrl(self.__splitter_left_bottom_pnl, -1, style=wx.LC_REPORT|wx.NO_BORDER|wx.FULL_REPAINT_ON_RESIZE)
37 self._PRW_encounter_type = cEncounterTypePhraseWheel(self.__splitter_right_top_pnl, -1, "", style=wx.NO_BORDER)
38 self._PRW_encounter_start = cFuzzyTimestampInput(self.__splitter_right_top_pnl, -1, "", style=wx.NO_BORDER)
39 self._PRW_encounter_end = cFuzzyTimestampInput(self.__splitter_right_top_pnl, -1, "", style=wx.NO_BORDER)
40 self._BTN_new_encounter = wx.Button(self.__splitter_right_top_pnl, -1, _("New"), style=wx.BU_EXACTFIT)
41 self._TCTRL_rfe = wx.TextCtrl(self.__splitter_right_top_pnl, -1, "", style=wx.NO_BORDER)
42 self.notebook_1_pane_1 = wx.Panel(self._NB_device_editors, -1)
43 self._TCTRL_aoe = wx.TextCtrl(self.__splitter_right_top_pnl, -1, "", style=wx.NO_BORDER)
44 self._TCTRL_ekg = wx.TextCtrl(self.__splitter_right_top_pnl, -1, "", style=wx.NO_BORDER)
45 self._BTN_save_all = wx.Button(self.__splitter_right_top_pnl, -1, _("&All"), style=wx.BU_EXACTFIT)
46 self._BTN_save_encounter = wx.Button(self.__splitter_right_top_pnl, -1, _("&Encounter"), style=wx.BU_EXACTFIT)
47 self._BTN_save_note = wx.Button(self.__splitter_right_top_pnl, -1, _("&Note"), style=wx.BU_EXACTFIT)
48 self._BTN_new_editor = wx.Button(self.__splitter_right_top_pnl, -1, _("&New"), style=wx.BU_EXACTFIT)
49 self._BTN_clear_editor = wx.Button(self.__splitter_right_top_pnl, -1, _("&Clear"), style=wx.BU_EXACTFIT)
50 self._BTN_discard_editor = wx.Button(self.__splitter_right_top_pnl, -1, _("&Discard"), style=wx.BU_EXACTFIT)
51 self._lbl_hints = wx.StaticText(self.__splitter_right_bottom_pnl, -1, _("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."))
52
53 self.__set_properties()
54 self.__do_layout()
55
56 self.Bind(wx.EVT_LIST_ITEM_ACTIVATED, self._on_problem_activated, self._LCTRL_pevious_encounters)
57 self.Bind(wx.EVT_BUTTON, self._on_new_encounter_button_pressed, self._BTN_new_encounter)
58 self.Bind(wx.EVT_BUTTON, self._on_save_all_button_pressed, self._BTN_save_all)
59 self.Bind(wx.EVT_BUTTON, self._on_save_encounter_button_pressed, self._BTN_save_encounter)
60 self.Bind(wx.EVT_BUTTON, self._on_save_note_button_pressed, self._BTN_save_note)
61 self.Bind(wx.EVT_BUTTON, self._on_new_editor_button_pressed, self._BTN_new_editor)
62 self.Bind(wx.EVT_BUTTON, self._on_clear_editor_button_pressed, self._BTN_clear_editor)
63 self.Bind(wx.EVT_BUTTON, self._on_discard_editor_button_pressed, self._BTN_discard_editor)
64
65
67
68 self.SetScrollRate(10, 10)
69 self._TCTRL_current_status.Enable(False)
70 self._LCTRL_pevious_encounters.SetToolTipString(_("This shows the list of previous encounters"))
71 self._PRW_encounter_type.SetToolTipString(_("Select the type of encounter."))
72 self._PRW_encounter_start.SetToolTipString(_("Date and time when the current (!) encounter started."))
73 self._PRW_encounter_end.SetToolTipString(_("Date and time when the current (!) encounter ends."))
74 self._BTN_new_encounter.SetToolTipString(_("Start a new encounter. If there are any changes to the current encounter you will be asked whether to save them."))
75 self._TCTRL_rfe.SetToolTipString(_("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)."))
76 self._TCTRL_aoe.SetToolTipString(_("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."))
77 self._TCTRL_ekg.SetToolTipString(_("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."))
78 self._BTN_save_all.SetToolTipString(_("Save encounter details and all progress notes."))
79 self._BTN_save_encounter.SetToolTipString(_("Save the encounter details."))
80 self._BTN_save_note.SetToolTipString(_("Save the currently displayed progress note."))
81 self._BTN_new_editor.SetToolTipString(_("Open a new progress note editor.\n\nThere is a configuration item on whether to allow several new-episode editors at once."))
82 self._BTN_clear_editor.SetToolTipString(_("Clear the editor for the displayed progress note."))
83 self._BTN_discard_editor.SetToolTipString(_("Discard the editor for the displayed progress note."))
84 self.__splitter_right_bottom_pnl.SetScrollRate(10, 10)
85
86
88
89 __szr_main = wx.BoxSizer(wx.HORIZONTAL)
90 __szr_right = wx.BoxSizer(wx.VERTICAL)
91 __szr_lower_bottom_right = wx.StaticBoxSizer(self.__szr_lower_bottom_right_staticbox, wx.VERTICAL)
92 __szr_top_right = wx.StaticBoxSizer(self.__szr_top_right_staticbox, wx.VERTICAL)
93 __szr_buttons = wx.BoxSizer(wx.HORIZONTAL)
94 __szr_ekg = wx.BoxSizer(wx.HORIZONTAL)
95 __szr_aoe = wx.BoxSizer(wx.HORIZONTAL)
96 __gszr_encounter_details = wx.FlexGridSizer(2, 2, 2, 5)
97 __szr_encounter_details = wx.BoxSizer(wx.HORIZONTAL)
98 __szr_left = wx.BoxSizer(wx.VERTICAL)
99 __szr_bottom_left = wx.StaticBoxSizer(self.__szr_bottom_left_staticbox, wx.VERTICAL)
100 __szr_top_left = wx.StaticBoxSizer(self.__szr_top_left_staticbox, wx.VERTICAL)
101 __szr_top_left.Add(self._TCTRL_current_status, 1, wx.EXPAND, 0)
102 self.__splitter_left_top_pnl.SetSizer(__szr_top_left)
103 __szr_bottom_left.Add(self._LCTRL_pevious_encounters, 1, wx.EXPAND, 0)
104 self.__splitter_left_bottom_pnl.SetSizer(__szr_bottom_left)
105 self._splitter_left.SplitHorizontally(self.__splitter_left_top_pnl, self.__splitter_left_bottom_pnl)
106 __szr_left.Add(self._splitter_left, 1, wx.EXPAND, 0)
107 self.__splitter_main_left_pnl.SetSizer(__szr_left)
108 __lbl_encounter_details = wx.StaticText(self.__splitter_right_top_pnl, -1, _("Encounter"))
109 __gszr_encounter_details.Add(__lbl_encounter_details, 0, wx.ALIGN_CENTER_VERTICAL, 0)
110 __szr_encounter_details.Add(self._PRW_encounter_type, 1, wx.RIGHT|wx.EXPAND|wx.ALIGN_CENTER_VERTICAL, 10)
111 __szr_encounter_details.Add(self._PRW_encounter_start, 1, wx.RIGHT|wx.EXPAND|wx.ALIGN_CENTER_VERTICAL, 5)
112 __lbl_until = wx.StaticText(self.__splitter_right_top_pnl, -1, _("until"))
113 __szr_encounter_details.Add(__lbl_until, 0, wx.RIGHT|wx.ALIGN_CENTER_VERTICAL, 5)
114 __szr_encounter_details.Add(self._PRW_encounter_end, 1, wx.RIGHT|wx.EXPAND|wx.ALIGN_CENTER_VERTICAL, 5)
115 __szr_encounter_details.Add(self._BTN_new_encounter, 0, wx.EXPAND, 0)
116 __gszr_encounter_details.Add(__szr_encounter_details, 1, wx.EXPAND, 0)
117 __lbl_rfe = wx.StaticText(self.__splitter_right_top_pnl, -1, _("Request"))
118 __gszr_encounter_details.Add(__lbl_rfe, 0, wx.ALIGN_CENTER_VERTICAL, 0)
119 __gszr_encounter_details.Add(self._TCTRL_rfe, 1, wx.EXPAND|wx.ALIGN_CENTER_VERTICAL, 0)
120 __gszr_encounter_details.AddGrowableCol(1)
121 __szr_top_right.Add(__gszr_encounter_details, 0, wx.RIGHT|wx.EXPAND, 3)
122 self._NB_device_editors.AddPage(self.notebook_1_pane_1, _("device1"))
123 __szr_top_right.Add(self._NB_device_editors, 1, wx.RIGHT|wx.TOP|wx.EXPAND, 3)
124 __lbl_aoe = wx.StaticText(self.__splitter_right_top_pnl, -1, _("Summary"))
125 __szr_aoe.Add(__lbl_aoe, 0, wx.RIGHT|wx.ALIGN_CENTER_VERTICAL, 5)
126 __szr_aoe.Add(self._TCTRL_aoe, 1, wx.RIGHT|wx.TOP|wx.BOTTOM|wx.EXPAND|wx.ALIGN_CENTER_VERTICAL, 5)
127 __szr_top_right.Add(__szr_aoe, 0, wx.RIGHT|wx.TOP|wx.EXPAND, 3)
128 __lbl_ekg = wx.StaticText(self.__splitter_right_top_pnl, -1, _("EKG"))
129 __szr_ekg.Add(__lbl_ekg, 0, wx.RIGHT|wx.ALIGN_CENTER_VERTICAL, 5)
130 __szr_ekg.Add(self._TCTRL_ekg, 1, wx.RIGHT|wx.TOP|wx.BOTTOM|wx.EXPAND|wx.ALIGN_CENTER_VERTICAL, 5)
131 __szr_top_right.Add(__szr_ekg, 0, wx.RIGHT|wx.TOP|wx.EXPAND, 3)
132 __lbl_save = wx.StaticText(self.__splitter_right_top_pnl, -1, _("Save:"))
133 __szr_buttons.Add(__lbl_save, 0, wx.RIGHT|wx.ALIGN_CENTER_VERTICAL, 5)
134 __szr_buttons.Add(self._BTN_save_all, 0, wx.RIGHT|wx.EXPAND, 3)
135 __szr_buttons.Add(self._BTN_save_encounter, 0, wx.RIGHT|wx.EXPAND, 3)
136 __szr_buttons.Add(self._BTN_save_note, 0, wx.EXPAND, 0)
137 __szr_buttons.Add((1, 1), 1, 0, 0)
138 __lbl_editor = wx.StaticText(self.__splitter_right_top_pnl, -1, _("Editor:"))
139 __szr_buttons.Add(__lbl_editor, 0, wx.RIGHT|wx.ALIGN_CENTER_VERTICAL, 5)
140 __szr_buttons.Add(self._BTN_new_editor, 0, wx.RIGHT|wx.EXPAND, 3)
141 __szr_buttons.Add(self._BTN_clear_editor, 0, wx.RIGHT|wx.EXPAND, 3)
142 __szr_buttons.Add(self._BTN_discard_editor, 0, wx.EXPAND, 0)
143 __szr_buttons.Add((1, 1), 1, 0, 0)
144 __szr_top_right.Add(__szr_buttons, 0, wx.RIGHT|wx.TOP|wx.EXPAND, 3)
145 self.__splitter_right_top_pnl.SetSizer(__szr_top_right)
146 __szr_lower_bottom_right.Add(self._lbl_hints, 0, wx.EXPAND, 0)
147 self.__splitter_right_bottom_pnl.SetSizer(__szr_lower_bottom_right)
148 self._splitter_right.SplitHorizontally(self.__splitter_right_top_pnl, self.__splitter_right_bottom_pnl)
149 __szr_right.Add(self._splitter_right, 1, wx.EXPAND, 0)
150 self.__splitter_main_right_pnl.SetSizer(__szr_right)
151 self._splitter_main.SplitVertically(self.__splitter_main_left_pnl, self.__splitter_main_right_pnl)
152 __szr_main.Add(self._splitter_main, 1, wx.EXPAND, 0)
153 self.SetSizer(__szr_main)
154 __szr_main.Fit(self)
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