source: Scheduling/trunk/cs/bsdx0200GUISourceCode/CGView.cs@ 1334

Last change on this file since 1334 was 1233, checked in by Tariq Hamkari, 13 years ago

fixing bug "crash when user name has a single quote"

File size: 148.4 KB
RevLine 
[614]1using System;
2using System.Collections;
[1174]3using System.Collections.Generic;
[614]4using System.ComponentModel;
5using System.Windows.Forms;
6using System.Diagnostics;
7using System.Data;
8using System.Threading;
9using IndianHealthService.BMXNet;
[1073]10using System.Runtime.InteropServices;
[1110]11using System.Drawing.Printing;
[1112]12using System.Linq;
[614]13
14namespace IndianHealthService.ClinicalScheduling
15{
16 /// <summary>
[1069]17 /// Main Form: Shows Tree of Clinics and Calendar Grid
[614]18 /// </summary>
19 public class CGView : System.Windows.Forms.Form
20 {
21 private System.Windows.Forms.MainMenu mainMenu1;
22 private System.Windows.Forms.MenuItem mnuFile;
23 private System.Windows.Forms.MenuItem mnuTest;
24 private System.Windows.Forms.MenuItem mnuAppointment;
25 private System.Windows.Forms.MenuItem mnuNewAppointment;
26 private System.Windows.Forms.MenuItem mnu1Day;
27 private System.Windows.Forms.MenuItem mnu7Day;
28 private System.Windows.Forms.MenuItem menuItem4;
29 private System.Windows.Forms.MenuItem mnu5Day;
30 private System.Windows.Forms.MenuItem mnu10Minute;
31 private System.Windows.Forms.MenuItem mnu20Minute;
32 private System.Windows.Forms.MenuItem mnu30Minute;
33 private System.Windows.Forms.MenuItem mnuTimeScale;
34 private System.Windows.Forms.MenuItem mnu15Minute;
35 private System.Windows.Forms.MenuItem mnuOpenSchedule;
36 private System.Windows.Forms.MenuItem menuItem1;
37 private System.Windows.Forms.TreeView tvSchedules;
38 private System.Windows.Forms.MenuItem mnuViewScheduleTree;
39 private System.Windows.Forms.MenuItem mnuDeleteAppointment;
40 private System.Windows.Forms.MenuItem mnuTest1;
41 private System.Windows.Forms.Splitter splitter1;
42 private System.Windows.Forms.Splitter splitter2;
43 private System.Windows.Forms.StatusBar statusBar1;
44 private System.Windows.Forms.DateTimePicker dateTimePicker1;
45 private System.Windows.Forms.MenuItem mnuViewRightPanel;
46 private System.Windows.Forms.Panel panelRight;
47 private System.Windows.Forms.Panel panelTop;
48 private System.Windows.Forms.Panel panelCenter;
49 private System.Windows.Forms.Panel panelBottom;
50 private System.Windows.Forms.Label lblResource;
[1174]51 private System.Windows.Forms.ContextMenu ctxResourceTree;
[614]52 private System.Windows.Forms.MenuItem ctxOpenSchedule;
53 private System.Windows.Forms.MenuItem ctxEditAvailability;
54 private System.Windows.Forms.MenuItem ctxProperties;
55 private System.Windows.Forms.MenuItem mnuSchedulingManagment;
56 private System.Windows.Forms.MenuItem ctxFindAppt;
57 private System.Windows.Forms.MenuItem mnuFindAppt;
58 internal System.Windows.Forms.MenuItem mnuRPMSServer;
59 internal System.Windows.Forms.MenuItem mnuRPMSLogin;
60 private System.Windows.Forms.MenuItem mnuCheckIn;
61 private System.Windows.Forms.MenuItem menuItem3;
62 private System.Windows.Forms.MenuItem mnuHelpAbout;
63 private System.Windows.Forms.MenuItem mnuCalendar;
64 private System.Windows.Forms.MenuItem mnuHelp;
65 private System.Windows.Forms.MenuItem mnuClose;
66 private System.Windows.Forms.MenuItem mnuViewPatientAppts;
67 private IndianHealthService.ClinicalScheduling.CalendarGrid calendarGrid1;
68 private System.Windows.Forms.MenuItem mnuCopyAppointment;
69 private System.Windows.Forms.Panel panelClip;
70 private System.Windows.Forms.ListBox lstClip;
71 private System.Windows.Forms.Label label1;
72 private System.Windows.Forms.ContextMenu ctxApptClipMenu;
73 private System.Windows.Forms.MenuItem mnuRemoveClipItem;
74 private System.Windows.Forms.MenuItem mnuClearClipItems;
75 private System.Windows.Forms.MenuItem mnuEditAppointment;
76 private System.Windows.Forms.ContextMenu ctxCalendarGrid;
77 private System.Windows.Forms.MenuItem ctxCalGridAdd;
78 private System.Windows.Forms.MenuItem ctxCalGridEdit;
79 private System.Windows.Forms.MenuItem ctxCalGridDelete;
80 private System.Windows.Forms.MenuItem ctxCalGridCheckIn;
81 private System.Windows.Forms.MenuItem menuItem6;
82 private System.Windows.Forms.MenuItem menuItem7;
[788]83 private System.Windows.Forms.MenuItem mnuPrintReminderLetters;
[614]84 private System.Windows.Forms.MenuItem mnuPrintPatientLetter;
85 private System.Windows.Forms.MenuItem mnuPrintClinicSchedules;
86 private System.Windows.Forms.MenuItem ctxCalGridNoShow;
87 private System.Windows.Forms.MenuItem ctxCalGridNoShowUndo;
88 private System.Windows.Forms.MenuItem mnuNoShow;
89 private System.Windows.Forms.MenuItem mnuNoShowUndo;
90 private System.Windows.Forms.MenuItem mnuPrintRebookLetters;
91 private System.Windows.Forms.MenuItem mnuPrintCancellationLetters;
92 private System.Windows.Forms.MenuItem mnuWalkIn;
[1174]93 private System.Windows.Forms.MenuItem sepApptMenu1;
94 private System.Windows.Forms.MenuItem sepApptMenu2;
[614]95 private System.Windows.Forms.MenuItem ctxCalGridWalkin;
[1174]96 private System.Windows.Forms.MenuItem ctxCalGridSep1;
97 private System.Windows.Forms.MenuItem ctxCalGridSep2;
[614]98 private System.Windows.Forms.MenuItem mnuOpenMultipleSchedules;
99 private System.Windows.Forms.MenuItem mnuDisplayWalkIns;
100 private System.Windows.Forms.MenuItem mnuRPMSDivision;
[1174]101 private MenuItem ctxCalGridSep3;
[1110]102 private MenuItem ctxCalGridReprintApptSlip;
[1118]103 private MenuItem ctxCalGridUndoCheckin;
104 private MenuItem ctxPrintScheduleT0;
105 private MenuItem ctxPrintScheduleT1;
106 private MenuItem ctxPrintScheduleT3;
[1127]107 private MenuItem menuItem12;
108 private MenuItem mnuRefresh;
[1174]109 private MenuItem ctxCalGridMkRadAppt;
110 private MenuItem ctxCalGridCancelRadAppt;
111 private MenuItem mnuMkRadAppt;
112 private MenuItem mnuCancelRadAppt;
113 private MenuItem mnuUndoCheckin;
114 private MenuItem sepApptMenu3;
115 private MenuItem mnuReprintApptSlip;
[614]116 private IContainer components;
117
118 #region Initialization
119 public CGView()
120 {
121 //
122 // Required for Windows Form Designer support
123 //
124 InitializeComponent();
125
126 m_nSlots = 0;
127 m_alSelectedTreeResourceArray = new ArrayList();
128 m_ClipList = new CGAppointments();
129
130 }
131
132 public void InitializeDocView(string sText)
133 {
134 this.Text = this.DocManager.ConnectInfo.UserName;
135 if (sText != null)
136 this.Text += " - " + sText;
137 if (DocManager.ConnectInfo.DivisionName != null)
138 this.Text += " - " + DocManager.ConnectInfo.DivisionName;
139 }
140
141 public void InitializeDocView(CGDocument doc,
142 CGDocumentManager docMgr,
143 DateTime dStartDate,
144 string sText)
145 {
146 System.IntPtr pHandle = this.Handle;
147 this.DocManager = docMgr;
148 this.StartDate = dStartDate;
149 this.Document = doc;
[1073]150
151 //Rather strangely, this line is needed for God knows Why...
152 //Without it, the Grid tries to draw appointments, but can't.
153 //Making a constructor in the Calendar Grid itself didn't work. Don't know why.
154 //XXX: For later investigation.
155 this.Appointments = new CGAppointments();
156
157
[821]158 // Set username and division up top
159 this.Text = this.DocManager.ConnectInfo.UserName;
[614]160 if (sText != null)
161 this.Text += " - " + sText;
162 if (DocManager.ConnectInfo.DivisionName != null)
163 this.Text += " - " + DocManager.ConnectInfo.DivisionName;
164
165 this.m_ConnectInfo = m_DocManager.ConnectInfo;
166 m_bmxDelegate = new BMXNetConnectInfo.BMXNetEventDelegate(BMXNetEventHandler);
167 m_ConnectInfo.BMXNetEvent += m_bmxDelegate;
168 }
169
170 private BMXNetConnectInfo.BMXNetEventDelegate m_bmxDelegate;
[1073]171
[614]172
173 #endregion initialization
174
175 #region Windows Form Designer generated code
176 /// <summary>
177 /// Required method for Designer support - do not modify
178 /// the contents of this method with the code editor.
179 /// </summary>
180 private void InitializeComponent()
181 {
182 this.components = new System.ComponentModel.Container();
183 System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(CGView));
184 this.mainMenu1 = new System.Windows.Forms.MainMenu(this.components);
185 this.mnuFile = new System.Windows.Forms.MenuItem();
186 this.mnuOpenSchedule = new System.Windows.Forms.MenuItem();
187 this.mnuOpenMultipleSchedules = new System.Windows.Forms.MenuItem();
188 this.menuItem1 = new System.Windows.Forms.MenuItem();
189 this.mnuRPMSServer = new System.Windows.Forms.MenuItem();
190 this.mnuRPMSLogin = new System.Windows.Forms.MenuItem();
191 this.mnuRPMSDivision = new System.Windows.Forms.MenuItem();
192 this.menuItem3 = new System.Windows.Forms.MenuItem();
193 this.mnuSchedulingManagment = new System.Windows.Forms.MenuItem();
194 this.menuItem6 = new System.Windows.Forms.MenuItem();
195 this.mnuPrintClinicSchedules = new System.Windows.Forms.MenuItem();
[788]196 this.mnuPrintReminderLetters = new System.Windows.Forms.MenuItem();
[614]197 this.mnuPrintRebookLetters = new System.Windows.Forms.MenuItem();
198 this.mnuPrintCancellationLetters = new System.Windows.Forms.MenuItem();
199 this.mnuPrintPatientLetter = new System.Windows.Forms.MenuItem();
200 this.menuItem7 = new System.Windows.Forms.MenuItem();
201 this.mnuClose = new System.Windows.Forms.MenuItem();
202 this.mnuAppointment = new System.Windows.Forms.MenuItem();
203 this.mnuNewAppointment = new System.Windows.Forms.MenuItem();
[1174]204 this.mnuWalkIn = new System.Windows.Forms.MenuItem();
205 this.mnuMkRadAppt = new System.Windows.Forms.MenuItem();
[614]206 this.mnuEditAppointment = new System.Windows.Forms.MenuItem();
207 this.mnuDeleteAppointment = new System.Windows.Forms.MenuItem();
[1174]208 this.mnuCancelRadAppt = new System.Windows.Forms.MenuItem();
209 this.sepApptMenu1 = new System.Windows.Forms.MenuItem();
[614]210 this.mnuNoShow = new System.Windows.Forms.MenuItem();
211 this.mnuNoShowUndo = new System.Windows.Forms.MenuItem();
[1174]212 this.sepApptMenu2 = new System.Windows.Forms.MenuItem();
213 this.mnuCheckIn = new System.Windows.Forms.MenuItem();
214 this.mnuUndoCheckin = new System.Windows.Forms.MenuItem();
215 this.sepApptMenu3 = new System.Windows.Forms.MenuItem();
216 this.mnuFindAppt = new System.Windows.Forms.MenuItem();
[614]217 this.mnuCopyAppointment = new System.Windows.Forms.MenuItem();
218 this.mnuViewPatientAppts = new System.Windows.Forms.MenuItem();
[1174]219 this.mnuReprintApptSlip = new System.Windows.Forms.MenuItem();
[614]220 this.mnuCalendar = new System.Windows.Forms.MenuItem();
221 this.mnuDisplayWalkIns = new System.Windows.Forms.MenuItem();
222 this.mnu1Day = new System.Windows.Forms.MenuItem();
223 this.mnu5Day = new System.Windows.Forms.MenuItem();
224 this.mnu7Day = new System.Windows.Forms.MenuItem();
225 this.menuItem4 = new System.Windows.Forms.MenuItem();
226 this.mnuTimeScale = new System.Windows.Forms.MenuItem();
227 this.mnu10Minute = new System.Windows.Forms.MenuItem();
228 this.mnu15Minute = new System.Windows.Forms.MenuItem();
229 this.mnu20Minute = new System.Windows.Forms.MenuItem();
230 this.mnu30Minute = new System.Windows.Forms.MenuItem();
231 this.mnuViewScheduleTree = new System.Windows.Forms.MenuItem();
232 this.mnuViewRightPanel = new System.Windows.Forms.MenuItem();
[1127]233 this.menuItem12 = new System.Windows.Forms.MenuItem();
234 this.mnuRefresh = new System.Windows.Forms.MenuItem();
[614]235 this.mnuHelp = new System.Windows.Forms.MenuItem();
236 this.mnuHelpAbout = new System.Windows.Forms.MenuItem();
237 this.mnuTest = new System.Windows.Forms.MenuItem();
238 this.mnuTest1 = new System.Windows.Forms.MenuItem();
239 this.tvSchedules = new System.Windows.Forms.TreeView();
[1174]240 this.ctxResourceTree = new System.Windows.Forms.ContextMenu();
[614]241 this.ctxOpenSchedule = new System.Windows.Forms.MenuItem();
242 this.ctxEditAvailability = new System.Windows.Forms.MenuItem();
243 this.ctxProperties = new System.Windows.Forms.MenuItem();
244 this.ctxFindAppt = new System.Windows.Forms.MenuItem();
[1118]245 this.ctxPrintScheduleT0 = new System.Windows.Forms.MenuItem();
246 this.ctxPrintScheduleT1 = new System.Windows.Forms.MenuItem();
[1124]247 this.ctxPrintScheduleT3 = new System.Windows.Forms.MenuItem();
[614]248 this.panelRight = new System.Windows.Forms.Panel();
249 this.panelClip = new System.Windows.Forms.Panel();
250 this.lstClip = new System.Windows.Forms.ListBox();
251 this.ctxApptClipMenu = new System.Windows.Forms.ContextMenu();
252 this.mnuRemoveClipItem = new System.Windows.Forms.MenuItem();
253 this.mnuClearClipItems = new System.Windows.Forms.MenuItem();
254 this.label1 = new System.Windows.Forms.Label();
255 this.panelTop = new System.Windows.Forms.Panel();
256 this.dateTimePicker1 = new System.Windows.Forms.DateTimePicker();
257 this.lblResource = new System.Windows.Forms.Label();
258 this.panelCenter = new System.Windows.Forms.Panel();
[1176]259 this.calendarGrid1 = new IndianHealthService.ClinicalScheduling.CalendarGrid();
[614]260 this.ctxCalendarGrid = new System.Windows.Forms.ContextMenu();
261 this.ctxCalGridAdd = new System.Windows.Forms.MenuItem();
[1174]262 this.ctxCalGridMkRadAppt = new System.Windows.Forms.MenuItem();
[614]263 this.ctxCalGridEdit = new System.Windows.Forms.MenuItem();
264 this.ctxCalGridDelete = new System.Windows.Forms.MenuItem();
[1174]265 this.ctxCalGridCancelRadAppt = new System.Windows.Forms.MenuItem();
[614]266 this.ctxCalGridCheckIn = new System.Windows.Forms.MenuItem();
[1118]267 this.ctxCalGridUndoCheckin = new System.Windows.Forms.MenuItem();
[1174]268 this.ctxCalGridSep1 = new System.Windows.Forms.MenuItem();
[614]269 this.ctxCalGridNoShow = new System.Windows.Forms.MenuItem();
270 this.ctxCalGridNoShowUndo = new System.Windows.Forms.MenuItem();
[1174]271 this.ctxCalGridSep2 = new System.Windows.Forms.MenuItem();
[614]272 this.ctxCalGridWalkin = new System.Windows.Forms.MenuItem();
[1174]273 this.ctxCalGridSep3 = new System.Windows.Forms.MenuItem();
[1110]274 this.ctxCalGridReprintApptSlip = new System.Windows.Forms.MenuItem();
[614]275 this.panelBottom = new System.Windows.Forms.Panel();
276 this.statusBar1 = new System.Windows.Forms.StatusBar();
277 this.splitter1 = new System.Windows.Forms.Splitter();
278 this.splitter2 = new System.Windows.Forms.Splitter();
279 this.panelRight.SuspendLayout();
280 this.panelClip.SuspendLayout();
281 this.panelTop.SuspendLayout();
282 this.panelCenter.SuspendLayout();
283 this.panelBottom.SuspendLayout();
284 this.SuspendLayout();
285 //
286 // mainMenu1
287 //
288 this.mainMenu1.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
289 this.mnuFile,
290 this.mnuAppointment,
291 this.mnuCalendar,
292 this.mnuHelp,
293 this.mnuTest});
294 //
295 // mnuFile
296 //
297 this.mnuFile.Index = 0;
298 this.mnuFile.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
299 this.mnuOpenSchedule,
300 this.mnuOpenMultipleSchedules,
301 this.menuItem1,
302 this.mnuRPMSServer,
303 this.mnuRPMSLogin,
304 this.mnuRPMSDivision,
305 this.menuItem3,
306 this.mnuSchedulingManagment,
307 this.menuItem6,
308 this.mnuPrintClinicSchedules,
[788]309 this.mnuPrintReminderLetters,
[614]310 this.mnuPrintRebookLetters,
311 this.mnuPrintCancellationLetters,
312 this.mnuPrintPatientLetter,
313 this.menuItem7,
314 this.mnuClose});
315 this.mnuFile.Text = "&File";
316 this.mnuFile.Popup += new System.EventHandler(this.mnuFile_Popup);
317 //
318 // mnuOpenSchedule
319 //
320 this.mnuOpenSchedule.Enabled = false;
321 this.mnuOpenSchedule.Index = 0;
322 this.mnuOpenSchedule.Text = "&Open Schedule";
323 this.mnuOpenSchedule.Visible = false;
324 this.mnuOpenSchedule.Click += new System.EventHandler(this.mnuOpenSchedule_Click);
325 //
326 // mnuOpenMultipleSchedules
327 //
328 this.mnuOpenMultipleSchedules.Index = 1;
[794]329 this.mnuOpenMultipleSchedules.Shortcut = System.Windows.Forms.Shortcut.CtrlM;
[614]330 this.mnuOpenMultipleSchedules.Text = "Open M&ultiple Schedules";
331 this.mnuOpenMultipleSchedules.Click += new System.EventHandler(this.mnuOpenMultipleSchedules_Click);
332 //
333 // menuItem1
334 //
335 this.menuItem1.Index = 2;
336 this.menuItem1.Text = "-";
337 //
338 // mnuRPMSServer
339 //
340 this.mnuRPMSServer.Index = 3;
[1071]341 this.mnuRPMSServer.Shortcut = System.Windows.Forms.Shortcut.CtrlShiftS;
[627]342 this.mnuRPMSServer.Text = "Change VistA &Server";
[614]343 this.mnuRPMSServer.Click += new System.EventHandler(this.mnuRPMSServer_Click);
344 //
345 // mnuRPMSLogin
346 //
347 this.mnuRPMSLogin.Index = 4;
[1071]348 this.mnuRPMSLogin.Shortcut = System.Windows.Forms.Shortcut.CtrlShiftL;
[627]349 this.mnuRPMSLogin.Text = "Change VistA &Login";
[614]350 this.mnuRPMSLogin.Click += new System.EventHandler(this.mnuRPMSLogin_Click);
351 //
352 // mnuRPMSDivision
353 //
354 this.mnuRPMSDivision.Index = 5;
[1071]355 this.mnuRPMSDivision.Shortcut = System.Windows.Forms.Shortcut.CtrlShiftD;
[627]356 this.mnuRPMSDivision.Text = "Change VistA &Division";
[614]357 this.mnuRPMSDivision.Click += new System.EventHandler(this.mnuRPMSDivision_Click);
358 //
359 // menuItem3
360 //
361 this.menuItem3.Index = 6;
362 this.menuItem3.Text = "-";
363 //
364 // mnuSchedulingManagment
365 //
366 this.mnuSchedulingManagment.Index = 7;
[788]367 this.mnuSchedulingManagment.Shortcut = System.Windows.Forms.Shortcut.CtrlShiftM;
[614]368 this.mnuSchedulingManagment.Text = "Scheduling &Management";
369 this.mnuSchedulingManagment.Click += new System.EventHandler(this.mnuSchedulingManagment_Click);
370 //
371 // menuItem6
372 //
373 this.menuItem6.Index = 8;
374 this.menuItem6.Text = "-";
375 //
376 // mnuPrintClinicSchedules
377 //
378 this.mnuPrintClinicSchedules.Index = 9;
[772]379 this.mnuPrintClinicSchedules.Shortcut = System.Windows.Forms.Shortcut.CtrlP;
[614]380 this.mnuPrintClinicSchedules.Text = "&Print Clinic Schedules";
381 this.mnuPrintClinicSchedules.Click += new System.EventHandler(this.mnuPrintClinicSchedules_Click);
382 //
[788]383 // mnuPrintReminderLetters
[614]384 //
[788]385 this.mnuPrintReminderLetters.Index = 10;
[1174]386 this.mnuPrintReminderLetters.Shortcut = System.Windows.Forms.Shortcut.CtrlE;
[788]387 this.mnuPrintReminderLetters.Text = "Print Rem&inder Letters";
388 this.mnuPrintReminderLetters.Click += new System.EventHandler(this.mnuPrintReminderLetters_Click);
[614]389 //
390 // mnuPrintRebookLetters
391 //
392 this.mnuPrintRebookLetters.Index = 11;
[850]393 this.mnuPrintRebookLetters.Shortcut = System.Windows.Forms.Shortcut.CtrlR;
[614]394 this.mnuPrintRebookLetters.Text = "Print &Rebook Letters";
395 this.mnuPrintRebookLetters.Click += new System.EventHandler(this.mnuPrintRebookLetters_Click);
396 //
397 // mnuPrintCancellationLetters
398 //
399 this.mnuPrintCancellationLetters.Index = 12;
[788]400 this.mnuPrintCancellationLetters.Shortcut = System.Windows.Forms.Shortcut.CtrlShiftC;
[614]401 this.mnuPrintCancellationLetters.Text = "Print C&ancellation Letters";
402 this.mnuPrintCancellationLetters.Click += new System.EventHandler(this.mnuPrintCancellationLetters_Click);
403 //
404 // mnuPrintPatientLetter
405 //
406 this.mnuPrintPatientLetter.Index = 13;
[789]407 this.mnuPrintPatientLetter.Shortcut = System.Windows.Forms.Shortcut.CtrlL;
[614]408 this.mnuPrintPatientLetter.Text = "Print Patient Le&tter";
409 this.mnuPrintPatientLetter.Click += new System.EventHandler(this.mnuPrintPatientLetter_Click);
410 //
411 // menuItem7
412 //
413 this.menuItem7.Index = 14;
414 this.menuItem7.Text = "-";
415 //
416 // mnuClose
417 //
418 this.mnuClose.Index = 15;
[789]419 this.mnuClose.Shortcut = System.Windows.Forms.Shortcut.CtrlW;
[614]420 this.mnuClose.Text = "&Close Schedule";
421 this.mnuClose.Click += new System.EventHandler(this.mnuClose_Click);
422 //
423 // mnuAppointment
424 //
425 this.mnuAppointment.Index = 1;
426 this.mnuAppointment.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
427 this.mnuNewAppointment,
[1174]428 this.mnuWalkIn,
429 this.mnuMkRadAppt,
[614]430 this.mnuEditAppointment,
431 this.mnuDeleteAppointment,
[1174]432 this.mnuCancelRadAppt,
433 this.sepApptMenu1,
[614]434 this.mnuNoShow,
435 this.mnuNoShowUndo,
[1174]436 this.sepApptMenu2,
437 this.mnuCheckIn,
438 this.mnuUndoCheckin,
439 this.sepApptMenu3,
440 this.mnuFindAppt,
[614]441 this.mnuCopyAppointment,
[1174]442 this.mnuViewPatientAppts,
443 this.mnuReprintApptSlip});
[614]444 this.mnuAppointment.Text = "&Appointment";
445 this.mnuAppointment.Popup += new System.EventHandler(this.mnuAppointment_Popup);
446 //
447 // mnuNewAppointment
448 //
449 this.mnuNewAppointment.Index = 0;
[1143]450 this.mnuNewAppointment.Shortcut = System.Windows.Forms.Shortcut.Ins;
[614]451 this.mnuNewAppointment.Text = "&New Appointment";
452 this.mnuNewAppointment.Click += new System.EventHandler(this.mnuNewAppointment_Click);
453 //
[1174]454 // mnuWalkIn
455 //
456 this.mnuWalkIn.Index = 1;
457 this.mnuWalkIn.Shortcut = System.Windows.Forms.Shortcut.ShiftIns;
458 this.mnuWalkIn.Text = "Create Wal&k-In Appointment";
459 this.mnuWalkIn.Click += new System.EventHandler(this.mnuWalkIn_Click);
460 //
461 // mnuMkRadAppt
462 //
463 this.mnuMkRadAppt.Index = 2;
464 this.mnuMkRadAppt.Shortcut = System.Windows.Forms.Shortcut.CtrlIns;
465 this.mnuMkRadAppt.Text = "Make Radiology Appointment";
466 this.mnuMkRadAppt.Click += new System.EventHandler(this.mnuMkRadAppt_Click);
467 //
[614]468 // mnuEditAppointment
469 //
[1174]470 this.mnuEditAppointment.Index = 3;
[1143]471 this.mnuEditAppointment.Shortcut = System.Windows.Forms.Shortcut.F2;
[614]472 this.mnuEditAppointment.Text = "&Edit Appointment";
473 this.mnuEditAppointment.Click += new System.EventHandler(this.mnuEditAppointment_Click);
474 //
475 // mnuDeleteAppointment
476 //
[1174]477 this.mnuDeleteAppointment.Index = 4;
[1143]478 this.mnuDeleteAppointment.Shortcut = System.Windows.Forms.Shortcut.Del;
[614]479 this.mnuDeleteAppointment.Text = "Cance&l Appointment";
480 this.mnuDeleteAppointment.Click += new System.EventHandler(this.mnuDeleteAppointment_Click);
481 //
[1174]482 // mnuCancelRadAppt
[614]483 //
[1174]484 this.mnuCancelRadAppt.Index = 5;
485 this.mnuCancelRadAppt.Shortcut = System.Windows.Forms.Shortcut.CtrlDel;
486 this.mnuCancelRadAppt.Text = "Cancel Radiology Appointment";
487 this.mnuCancelRadAppt.Click += new System.EventHandler(this.mnuCancelRadAppt_Click);
[614]488 //
[1174]489 // sepApptMenu1
490 //
491 this.sepApptMenu1.Index = 6;
492 this.sepApptMenu1.Text = "-";
493 //
[614]494 // mnuNoShow
495 //
[1174]496 this.mnuNoShow.Index = 7;
497 this.mnuNoShow.Shortcut = System.Windows.Forms.Shortcut.CtrlN;
[614]498 this.mnuNoShow.Text = "Mark as No Sho&w";
499 this.mnuNoShow.Click += new System.EventHandler(this.mnuNoShow_Click);
500 //
501 // mnuNoShowUndo
502 //
[1174]503 this.mnuNoShowUndo.Index = 8;
504 this.mnuNoShowUndo.Shortcut = System.Windows.Forms.Shortcut.CtrlShiftN;
[614]505 this.mnuNoShowUndo.Text = "&Undo No Show";
506 this.mnuNoShowUndo.Click += new System.EventHandler(this.mnuNoShowUndo_Click);
507 //
[1174]508 // sepApptMenu2
[614]509 //
[1174]510 this.sepApptMenu2.Index = 9;
511 this.sepApptMenu2.Text = "-";
[614]512 //
[1174]513 // mnuCheckIn
[614]514 //
[1174]515 this.mnuCheckIn.Index = 10;
516 this.mnuCheckIn.Shortcut = System.Windows.Forms.Shortcut.CtrlI;
517 this.mnuCheckIn.Text = "Check &In Patient";
518 this.mnuCheckIn.Click += new System.EventHandler(this.mnuCheckIn_Click);
[614]519 //
[1174]520 // mnuUndoCheckin
[614]521 //
[1174]522 this.mnuUndoCheckin.Index = 11;
523 this.mnuUndoCheckin.Shortcut = System.Windows.Forms.Shortcut.CtrlShiftI;
524 this.mnuUndoCheckin.Text = "Undo Checkin";
525 this.mnuUndoCheckin.Click += new System.EventHandler(this.mnuUndoCheckin_Click);
[614]526 //
[1174]527 // sepApptMenu3
528 //
529 this.sepApptMenu3.Index = 12;
530 this.sepApptMenu3.Text = "-";
531 //
[614]532 // mnuFindAppt
533 //
[1174]534 this.mnuFindAppt.Index = 13;
[1124]535 this.mnuFindAppt.Shortcut = System.Windows.Forms.Shortcut.CtrlF;
[1143]536 this.mnuFindAppt.Text = "&Find Empty Slots";
[614]537 this.mnuFindAppt.Click += new System.EventHandler(this.mnuFindAppt_Click);
538 //
[1174]539 // mnuCopyAppointment
[614]540 //
[1174]541 this.mnuCopyAppointment.Index = 14;
542 this.mnuCopyAppointment.Shortcut = System.Windows.Forms.Shortcut.CtrlC;
543 this.mnuCopyAppointment.Text = "&Copy Appointment to Clipboard";
544 this.mnuCopyAppointment.Click += new System.EventHandler(this.mnuCopyAppointment_Click);
[614]545 //
546 // mnuViewPatientAppts
547 //
[1174]548 this.mnuViewPatientAppts.Index = 15;
549 this.mnuViewPatientAppts.Shortcut = System.Windows.Forms.Shortcut.CtrlShiftZ;
[614]550 this.mnuViewPatientAppts.Text = "&View Patient Appointments";
551 this.mnuViewPatientAppts.Click += new System.EventHandler(this.mnuViewPatientAppts_Click);
552 //
[1174]553 // mnuReprintApptSlip
554 //
555 this.mnuReprintApptSlip.Index = 16;
556 this.mnuReprintApptSlip.Shortcut = System.Windows.Forms.Shortcut.CtrlShiftP;
557 this.mnuReprintApptSlip.Text = "Reprint Appointment Slip";
558 this.mnuReprintApptSlip.Click += new System.EventHandler(this.mnuReprintApptSlip_Click);
559 //
[614]560 // mnuCalendar
561 //
562 this.mnuCalendar.Index = 2;
563 this.mnuCalendar.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
564 this.mnuDisplayWalkIns,
565 this.mnu1Day,
566 this.mnu5Day,
567 this.mnu7Day,
568 this.menuItem4,
569 this.mnuTimeScale,
570 this.mnuViewScheduleTree,
[1127]571 this.mnuViewRightPanel,
572 this.menuItem12,
573 this.mnuRefresh});
[614]574 this.mnuCalendar.Text = "&View";
575 //
576 // mnuDisplayWalkIns
577 //
578 this.mnuDisplayWalkIns.Checked = true;
579 this.mnuDisplayWalkIns.Index = 0;
[1174]580 this.mnuDisplayWalkIns.Shortcut = System.Windows.Forms.Shortcut.F12;
[614]581 this.mnuDisplayWalkIns.Text = "&Display Walk-Ins";
582 this.mnuDisplayWalkIns.Click += new System.EventHandler(this.mnuDisplayWalkIns_Click);
583 //
584 // mnu1Day
585 //
586 this.mnu1Day.Index = 1;
[794]587 this.mnu1Day.Shortcut = System.Windows.Forms.Shortcut.Ctrl1;
[614]588 this.mnu1Day.Text = "&1-Day View";
589 this.mnu1Day.Click += new System.EventHandler(this.mnu1Day_Click);
590 //
591 // mnu5Day
592 //
593 this.mnu5Day.Index = 2;
[794]594 this.mnu5Day.Shortcut = System.Windows.Forms.Shortcut.Ctrl5;
[614]595 this.mnu5Day.Text = "&5-Day View";
596 this.mnu5Day.Click += new System.EventHandler(this.mnu5Day_Click);
597 //
598 // mnu7Day
599 //
600 this.mnu7Day.Index = 3;
[794]601 this.mnu7Day.Shortcut = System.Windows.Forms.Shortcut.Ctrl7;
[614]602 this.mnu7Day.Text = "&7-Day View";
603 this.mnu7Day.Click += new System.EventHandler(this.mnu7Day_Click);
604 //
605 // menuItem4
606 //
607 this.menuItem4.Index = 4;
608 this.menuItem4.Text = "-";
609 //
610 // mnuTimeScale
611 //
612 this.mnuTimeScale.Index = 5;
613 this.mnuTimeScale.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
614 this.mnu10Minute,
615 this.mnu15Minute,
616 this.mnu20Minute,
617 this.mnu30Minute});
618 this.mnuTimeScale.Text = "&Time Scale";
619 //
620 // mnu10Minute
621 //
[1124]622 this.mnu10Minute.Enabled = false;
[614]623 this.mnu10Minute.Index = 0;
[794]624 this.mnu10Minute.Shortcut = System.Windows.Forms.Shortcut.Ctrl0;
[614]625 this.mnu10Minute.Text = "&10-Minute";
626 this.mnu10Minute.Click += new System.EventHandler(this.mnu10Minute_Click);
627 //
628 // mnu15Minute
629 //
[1124]630 this.mnu15Minute.Enabled = false;
[614]631 this.mnu15Minute.Index = 1;
[794]632 this.mnu15Minute.Shortcut = System.Windows.Forms.Shortcut.Ctrl4;
[614]633 this.mnu15Minute.Text = "1&5-Minute";
634 this.mnu15Minute.Click += new System.EventHandler(this.mnu15Minute_Click);
635 //
636 // mnu20Minute
637 //
[1124]638 this.mnu20Minute.Enabled = false;
[614]639 this.mnu20Minute.Index = 2;
[794]640 this.mnu20Minute.Shortcut = System.Windows.Forms.Shortcut.Ctrl3;
[614]641 this.mnu20Minute.Text = "&20-Minute";
642 this.mnu20Minute.Click += new System.EventHandler(this.mnu20Minute_Click);
643 //
644 // mnu30Minute
645 //
[1124]646 this.mnu30Minute.Enabled = false;
[614]647 this.mnu30Minute.Index = 3;
[794]648 this.mnu30Minute.Shortcut = System.Windows.Forms.Shortcut.Ctrl2;
[614]649 this.mnu30Minute.Text = "&30-Minute";
650 this.mnu30Minute.Click += new System.EventHandler(this.mnu30Minute_Click);
651 //
652 // mnuViewScheduleTree
653 //
[1174]654 this.mnuViewScheduleTree.Checked = true;
[614]655 this.mnuViewScheduleTree.Index = 6;
[1174]656 this.mnuViewScheduleTree.Shortcut = System.Windows.Forms.Shortcut.F4;
[614]657 this.mnuViewScheduleTree.Text = "&Schedule Tree";
658 this.mnuViewScheduleTree.Click += new System.EventHandler(this.mnuViewScheduleTree_Click);
659 //
660 // mnuViewRightPanel
661 //
662 this.mnuViewRightPanel.Index = 7;
663 this.mnuViewRightPanel.Text = "&Appointment Clipboard";
664 this.mnuViewRightPanel.Click += new System.EventHandler(this.mnuViewRightPanel_Click);
665 //
[1127]666 // menuItem12
667 //
668 this.menuItem12.Index = 8;
669 this.menuItem12.Text = "-";
670 //
671 // mnuRefresh
672 //
673 this.mnuRefresh.Index = 9;
674 this.mnuRefresh.Shortcut = System.Windows.Forms.Shortcut.F5;
675 this.mnuRefresh.Text = "Refresh Data";
676 this.mnuRefresh.Click += new System.EventHandler(this.mnuRefresh_Click);
677 //
[614]678 // mnuHelp
679 //
680 this.mnuHelp.Index = 3;
681 this.mnuHelp.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
682 this.mnuHelpAbout});
683 this.mnuHelp.Text = "&Help";
684 //
685 // mnuHelpAbout
686 //
687 this.mnuHelpAbout.Index = 0;
688 this.mnuHelpAbout.Text = "&About";
689 this.mnuHelpAbout.Click += new System.EventHandler(this.mnuHelpAbout_Click);
690 //
691 // mnuTest
692 //
693 this.mnuTest.Enabled = false;
694 this.mnuTest.Index = 4;
695 this.mnuTest.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
696 this.mnuTest1});
697 this.mnuTest.Text = "&Test";
698 this.mnuTest.Visible = false;
699 //
700 // mnuTest1
701 //
702 this.mnuTest1.Index = 0;
703 this.mnuTest1.Text = "Test1";
704 this.mnuTest1.Click += new System.EventHandler(this.mnuTest1_Click);
705 //
706 // tvSchedules
707 //
708 this.tvSchedules.BackColor = System.Drawing.SystemColors.ControlLight;
[1174]709 this.tvSchedules.ContextMenu = this.ctxResourceTree;
[614]710 this.tvSchedules.Dock = System.Windows.Forms.DockStyle.Left;
711 this.tvSchedules.HotTracking = true;
712 this.tvSchedules.Location = new System.Drawing.Point(0, 0);
713 this.tvSchedules.Name = "tvSchedules";
[1174]714 this.tvSchedules.Size = new System.Drawing.Size(128, 392);
[614]715 this.tvSchedules.Sorted = true;
716 this.tvSchedules.TabIndex = 1;
717 this.tvSchedules.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.tvSchedules_AfterSelect);
[1106]718 this.tvSchedules.NodeMouseClick += new System.Windows.Forms.TreeNodeMouseClickEventHandler(this.tvSchedules_NodeMouseClick);
[1027]719 this.tvSchedules.DoubleClick += new System.EventHandler(this.tvSchedules_DoubleClick);
[1106]720 this.tvSchedules.MouseEnter += new System.EventHandler(this.tvSchedules_MouseEnter);
[614]721 //
[1174]722 // ctxResourceTree
[614]723 //
[1174]724 this.ctxResourceTree.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
[614]725 this.ctxOpenSchedule,
726 this.ctxEditAvailability,
727 this.ctxProperties,
[1118]728 this.ctxFindAppt,
729 this.ctxPrintScheduleT0,
730 this.ctxPrintScheduleT1,
731 this.ctxPrintScheduleT3});
[1174]732 this.ctxResourceTree.Popup += new System.EventHandler(this.contextMenu1_Popup);
[614]733 //
734 // ctxOpenSchedule
735 //
736 this.ctxOpenSchedule.DefaultItem = true;
737 this.ctxOpenSchedule.Index = 0;
738 this.ctxOpenSchedule.Text = "&Open Schedule";
739 this.ctxOpenSchedule.Click += new System.EventHandler(this.ctxOpenSchedule_Click);
740 //
741 // ctxEditAvailability
742 //
743 this.ctxEditAvailability.Index = 1;
744 this.ctxEditAvailability.Text = "&Edit Resource Availability";
745 this.ctxEditAvailability.Click += new System.EventHandler(this.ctxEditAvailability_Click);
746 //
747 // ctxProperties
748 //
749 this.ctxProperties.Index = 2;
[1118]750 this.ctxProperties.Text = "P&roperties";
[614]751 this.ctxProperties.Click += new System.EventHandler(this.ctxProperties_Click);
752 //
753 // ctxFindAppt
754 //
755 this.ctxFindAppt.Index = 3;
[1143]756 this.ctxFindAppt.Text = "&Find Empty Slots";
[614]757 this.ctxFindAppt.Click += new System.EventHandler(this.ctxFindAppt_Click);
758 //
[1118]759 // ctxPrintScheduleT0
760 //
761 this.ctxPrintScheduleT0.Index = 4;
762 this.ctxPrintScheduleT0.Text = "Print Clinic Schedule(s) (T+&0)";
763 this.ctxPrintScheduleT0.Click += new System.EventHandler(this.ctxPrintScheduleT0_Click);
764 //
765 // ctxPrintScheduleT1
766 //
767 this.ctxPrintScheduleT1.Index = 5;
768 this.ctxPrintScheduleT1.Text = "Print Clinic Schedule(s) (T+&1)";
769 this.ctxPrintScheduleT1.Click += new System.EventHandler(this.ctxPrintScheduleT1_Click);
770 //
[1124]771 // ctxPrintScheduleT3
772 //
773 this.ctxPrintScheduleT3.Index = 6;
774 this.ctxPrintScheduleT3.Text = "Print Clinic Schedule(s) (T+&3)";
775 this.ctxPrintScheduleT3.Click += new System.EventHandler(this.ctxPrintScheduleT3_Click);
776 //
[614]777 // panelRight
778 //
779 this.panelRight.Controls.Add(this.panelClip);
780 this.panelRight.Dock = System.Windows.Forms.DockStyle.Right;
[1106]781 this.panelRight.Location = new System.Drawing.Point(996, 0);
[614]782 this.panelRight.Name = "panelRight";
[1174]783 this.panelRight.Size = new System.Drawing.Size(128, 392);
[614]784 this.panelRight.TabIndex = 3;
785 this.panelRight.Visible = false;
786 //
787 // panelClip
788 //
789 this.panelClip.Controls.Add(this.lstClip);
790 this.panelClip.Controls.Add(this.label1);
791 this.panelClip.Dock = System.Windows.Forms.DockStyle.Top;
792 this.panelClip.Location = new System.Drawing.Point(0, 0);
793 this.panelClip.Name = "panelClip";
794 this.panelClip.Size = new System.Drawing.Size(128, 448);
795 this.panelClip.TabIndex = 0;
796 //
797 // lstClip
798 //
799 this.lstClip.AllowDrop = true;
800 this.lstClip.ContextMenu = this.ctxApptClipMenu;
801 this.lstClip.DisplayMember = "PatientName";
802 this.lstClip.Dock = System.Windows.Forms.DockStyle.Fill;
803 this.lstClip.Location = new System.Drawing.Point(0, 32);
804 this.lstClip.Name = "lstClip";
[1027]805 this.lstClip.Size = new System.Drawing.Size(128, 416);
[614]806 this.lstClip.TabIndex = 0;
807 this.lstClip.SelectedIndexChanged += new System.EventHandler(this.lstClip_SelectedIndexChanged);
808 this.lstClip.DragDrop += new System.Windows.Forms.DragEventHandler(this.lstClip_DragDrop);
[1027]809 this.lstClip.DragEnter += new System.Windows.Forms.DragEventHandler(this.lstClip_DragEnter);
810 this.lstClip.MouseDown += new System.Windows.Forms.MouseEventHandler(this.lstClip_MouseDown);
[614]811 this.lstClip.MouseMove += new System.Windows.Forms.MouseEventHandler(this.lstClip_MouseMove);
812 //
813 // ctxApptClipMenu
814 //
815 this.ctxApptClipMenu.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
816 this.mnuRemoveClipItem,
817 this.mnuClearClipItems});
818 this.ctxApptClipMenu.Popup += new System.EventHandler(this.ctxApptClipMenu_Popup);
819 //
820 // mnuRemoveClipItem
821 //
822 this.mnuRemoveClipItem.Index = 0;
823 this.mnuRemoveClipItem.Text = "Remove Item";
824 this.mnuRemoveClipItem.Click += new System.EventHandler(this.mnuRemoveClipItem_Click);
825 //
826 // mnuClearClipItems
827 //
828 this.mnuClearClipItems.Index = 1;
829 this.mnuClearClipItems.Text = "Clear All";
830 this.mnuClearClipItems.Click += new System.EventHandler(this.mnuClearClipItems_Click);
831 //
832 // label1
833 //
834 this.label1.Dock = System.Windows.Forms.DockStyle.Top;
835 this.label1.Location = new System.Drawing.Point(0, 0);
836 this.label1.Name = "label1";
837 this.label1.Size = new System.Drawing.Size(128, 32);
838 this.label1.TabIndex = 1;
839 this.label1.Text = "Appointment Clipboard";
840 this.label1.TextAlign = System.Drawing.ContentAlignment.BottomCenter;
841 //
842 // panelTop
843 //
844 this.panelTop.Controls.Add(this.dateTimePicker1);
845 this.panelTop.Controls.Add(this.lblResource);
846 this.panelTop.Dock = System.Windows.Forms.DockStyle.Top;
847 this.panelTop.Location = new System.Drawing.Point(128, 0);
848 this.panelTop.Name = "panelTop";
[1106]849 this.panelTop.Size = new System.Drawing.Size(868, 24);
[614]850 this.panelTop.TabIndex = 6;
851 //
852 // dateTimePicker1
853 //
854 this.dateTimePicker1.Dock = System.Windows.Forms.DockStyle.Right;
855 this.dateTimePicker1.DropDownAlign = System.Windows.Forms.LeftRightAlignment.Right;
[1106]856 this.dateTimePicker1.Location = new System.Drawing.Point(662, 0);
[614]857 this.dateTimePicker1.Name = "dateTimePicker1";
[1097]858 this.dateTimePicker1.Size = new System.Drawing.Size(206, 20);
[614]859 this.dateTimePicker1.TabIndex = 1;
[1066]860 this.dateTimePicker1.CloseUp += new System.EventHandler(this.dateTimePicker1_CloseUp);
861 this.dateTimePicker1.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.dateTimePicker1_KeyPress);
862 this.dateTimePicker1.Leave += new System.EventHandler(this.dateTimePicker1_Leave);
[614]863 //
864 // lblResource
865 //
866 this.lblResource.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
867 this.lblResource.ForeColor = System.Drawing.SystemColors.Highlight;
868 this.lblResource.Location = new System.Drawing.Point(8, 5);
869 this.lblResource.Name = "lblResource";
870 this.lblResource.Size = new System.Drawing.Size(456, 19);
871 this.lblResource.TabIndex = 2;
872 //
873 // panelCenter
874 //
875 this.panelCenter.Controls.Add(this.calendarGrid1);
876 this.panelCenter.Dock = System.Windows.Forms.DockStyle.Fill;
877 this.panelCenter.Location = new System.Drawing.Point(136, 24);
878 this.panelCenter.Name = "panelCenter";
[1174]879 this.panelCenter.Size = new System.Drawing.Size(857, 344);
[614]880 this.panelCenter.TabIndex = 7;
881 //
[1176]882 // calendarGrid1
883 //
884 this.calendarGrid1.AllowDrop = true;
885 this.calendarGrid1.Appointments = null;
886 this.calendarGrid1.ApptDragSource = null;
887 this.calendarGrid1.AutoScroll = true;
888 this.calendarGrid1.AutoScrollMinSize = new System.Drawing.Size(600, 1898);
889 this.calendarGrid1.AvailabilityArray = null;
890 this.calendarGrid1.BackColor = System.Drawing.SystemColors.Window;
891 this.calendarGrid1.Columns = 5;
892 this.calendarGrid1.ContextMenu = this.ctxCalendarGrid;
893 this.calendarGrid1.Dock = System.Windows.Forms.DockStyle.Fill;
894 this.calendarGrid1.DrawWalkIns = true;
895 this.calendarGrid1.GridBackColor = null;
896 this.calendarGrid1.GridEnter = false;
897 this.calendarGrid1.Location = new System.Drawing.Point(0, 0);
898 this.calendarGrid1.Name = "calendarGrid1";
899 this.calendarGrid1.Resources = ((System.Collections.ArrayList)(resources.GetObject("calendarGrid1.Resources")));
900 this.calendarGrid1.SelectedAppointment = 0;
901 this.calendarGrid1.Size = new System.Drawing.Size(857, 344);
902 this.calendarGrid1.StartDate = new System.DateTime(2003, 1, 27, 0, 0, 0, 0);
903 this.calendarGrid1.TabIndex = 0;
904 this.calendarGrid1.TimeScale = 20;
905 this.calendarGrid1.CGAppointmentChanged += new IndianHealthService.ClinicalScheduling.CalendarGrid.CGAppointmentChangedHandler(this.calendarGrid1_CGAppointmentChanged);
906 this.calendarGrid1.CGAppointmentAdded += new IndianHealthService.ClinicalScheduling.CalendarGrid.CGAppointmentChangedHandler(this.calendarGrid1_CGAppointmentAdded);
907 this.calendarGrid1.CGSelectionChanged += new IndianHealthService.ClinicalScheduling.CalendarGrid.CGSelectionChangedHandler(this.calendarGrid1_CGSelectionChanged);
908 this.calendarGrid1.DoubleClick += new System.EventHandler(this.calendarGrid1_DoubleClick);
909 this.calendarGrid1.MouseEnter += new System.EventHandler(this.calendarGrid1_MouseEnter);
910 //
[614]911 // ctxCalendarGrid
912 //
913 this.ctxCalendarGrid.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
914 this.ctxCalGridAdd,
[1174]915 this.ctxCalGridMkRadAppt,
[614]916 this.ctxCalGridEdit,
917 this.ctxCalGridDelete,
[1174]918 this.ctxCalGridCancelRadAppt,
[614]919 this.ctxCalGridCheckIn,
[1118]920 this.ctxCalGridUndoCheckin,
[1174]921 this.ctxCalGridSep1,
[614]922 this.ctxCalGridNoShow,
923 this.ctxCalGridNoShowUndo,
[1174]924 this.ctxCalGridSep2,
[804]925 this.ctxCalGridWalkin,
[1174]926 this.ctxCalGridSep3,
[1110]927 this.ctxCalGridReprintApptSlip});
[614]928 this.ctxCalendarGrid.Popup += new System.EventHandler(this.ctxCalendarGrid_Popup);
929 //
930 // ctxCalGridAdd
931 //
932 this.ctxCalGridAdd.Index = 0;
933 this.ctxCalGridAdd.Text = "Add Appointment";
934 this.ctxCalGridAdd.Click += new System.EventHandler(this.ctxCalGridAdd_Click);
935 //
[1174]936 // ctxCalGridMkRadAppt
937 //
938 this.ctxCalGridMkRadAppt.Index = 1;
939 this.ctxCalGridMkRadAppt.Text = "Make Radiology Appointment";
940 this.ctxCalGridMkRadAppt.Click += new System.EventHandler(this.ctxCalGridMkRadAppt_Click);
941 //
[614]942 // ctxCalGridEdit
943 //
[1174]944 this.ctxCalGridEdit.Index = 2;
[614]945 this.ctxCalGridEdit.Text = "Edit Appointment";
946 this.ctxCalGridEdit.Click += new System.EventHandler(this.ctxCalGridEdit_Click);
947 //
948 // ctxCalGridDelete
949 //
[1174]950 this.ctxCalGridDelete.Index = 3;
[614]951 this.ctxCalGridDelete.Text = "Cancel Appointment";
952 this.ctxCalGridDelete.Click += new System.EventHandler(this.ctxCalGridDelete_Click);
953 //
[1174]954 // ctxCalGridCancelRadAppt
955 //
956 this.ctxCalGridCancelRadAppt.Index = 4;
957 this.ctxCalGridCancelRadAppt.Text = "Cancel Radiology Appointment";
958 this.ctxCalGridCancelRadAppt.Click += new System.EventHandler(this.ctxCalGridCancelRadAppt_Click);
959 //
[614]960 // ctxCalGridCheckIn
961 //
[1174]962 this.ctxCalGridCheckIn.Index = 5;
[614]963 this.ctxCalGridCheckIn.Text = "Check In Patient";
964 this.ctxCalGridCheckIn.Click += new System.EventHandler(this.ctxCalGridCheckIn_Click);
965 //
[1118]966 // ctxCalGridUndoCheckin
967 //
[1174]968 this.ctxCalGridUndoCheckin.Index = 6;
[1118]969 this.ctxCalGridUndoCheckin.Text = "&Undo Check In";
970 this.ctxCalGridUndoCheckin.Click += new System.EventHandler(this.ctxCalGridUndoCheckin_Click);
971 //
[1174]972 // ctxCalGridSep1
[614]973 //
[1174]974 this.ctxCalGridSep1.Index = 7;
975 this.ctxCalGridSep1.Text = "-";
[614]976 //
977 // ctxCalGridNoShow
978 //
[1174]979 this.ctxCalGridNoShow.Index = 8;
[614]980 this.ctxCalGridNoShow.Text = "Mark as No Show";
981 this.ctxCalGridNoShow.Click += new System.EventHandler(this.ctxCalGridNoShow_Click);
982 //
983 // ctxCalGridNoShowUndo
984 //
[1174]985 this.ctxCalGridNoShowUndo.Index = 9;
[614]986 this.ctxCalGridNoShowUndo.Text = "Undo NoShow";
987 this.ctxCalGridNoShowUndo.Click += new System.EventHandler(this.ctxCalGridNoShowUndo_Click);
988 //
[1174]989 // ctxCalGridSep2
[614]990 //
[1174]991 this.ctxCalGridSep2.Index = 10;
992 this.ctxCalGridSep2.Text = "-";
[614]993 //
994 // ctxCalGridWalkin
995 //
[1174]996 this.ctxCalGridWalkin.Index = 11;
[614]997 this.ctxCalGridWalkin.Text = "Create Wal&k-In Appointment";
998 this.ctxCalGridWalkin.Click += new System.EventHandler(this.ctxCalGridWalkin_Click);
999 //
[1174]1000 // ctxCalGridSep3
[804]1001 //
[1174]1002 this.ctxCalGridSep3.Index = 12;
1003 this.ctxCalGridSep3.Text = "-";
[804]1004 //
[1110]1005 // ctxCalGridReprintApptSlip
[821]1006 //
[1174]1007 this.ctxCalGridReprintApptSlip.Index = 13;
[1110]1008 this.ctxCalGridReprintApptSlip.Text = "&Reprint Appointment Slip";
1009 this.ctxCalGridReprintApptSlip.Click += new System.EventHandler(this.ctxCalGridReprintApptSlip_Click);
[821]1010 //
[614]1011 // panelBottom
1012 //
1013 this.panelBottom.Controls.Add(this.statusBar1);
1014 this.panelBottom.Dock = System.Windows.Forms.DockStyle.Bottom;
[1174]1015 this.panelBottom.Location = new System.Drawing.Point(136, 368);
[614]1016 this.panelBottom.Name = "panelBottom";
[1106]1017 this.panelBottom.Size = new System.Drawing.Size(857, 24);
[614]1018 this.panelBottom.TabIndex = 8;
1019 //
1020 // statusBar1
1021 //
1022 this.statusBar1.Dock = System.Windows.Forms.DockStyle.Fill;
1023 this.statusBar1.Location = new System.Drawing.Point(0, 0);
1024 this.statusBar1.Name = "statusBar1";
[1106]1025 this.statusBar1.Size = new System.Drawing.Size(857, 24);
[614]1026 this.statusBar1.SizingGrip = false;
1027 this.statusBar1.TabIndex = 0;
1028 //
1029 // splitter1
1030 //
1031 this.splitter1.Location = new System.Drawing.Point(128, 24);
1032 this.splitter1.Name = "splitter1";
[1174]1033 this.splitter1.Size = new System.Drawing.Size(8, 368);
[614]1034 this.splitter1.TabIndex = 9;
1035 this.splitter1.TabStop = false;
1036 //
1037 // splitter2
1038 //
1039 this.splitter2.Dock = System.Windows.Forms.DockStyle.Right;
[1106]1040 this.splitter2.Location = new System.Drawing.Point(993, 24);
[614]1041 this.splitter2.Name = "splitter2";
[1174]1042 this.splitter2.Size = new System.Drawing.Size(3, 368);
[614]1043 this.splitter2.TabIndex = 10;
1044 this.splitter2.TabStop = false;
1045 //
1046 // CGView
1047 //
1048 this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
[1174]1049 this.ClientSize = new System.Drawing.Size(1124, 392);
[614]1050 this.Controls.Add(this.panelCenter);
1051 this.Controls.Add(this.panelBottom);
1052 this.Controls.Add(this.splitter2);
1053 this.Controls.Add(this.splitter1);
1054 this.Controls.Add(this.panelTop);
1055 this.Controls.Add(this.panelRight);
1056 this.Controls.Add(this.tvSchedules);
1057 this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
1058 this.Menu = this.mainMenu1;
1059 this.Name = "CGView";
1060 this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
1061 this.Text = "CGView";
1062 this.Activated += new System.EventHandler(this.CGView_Activated);
1063 this.Closing += new System.ComponentModel.CancelEventHandler(this.CGView_Closing);
[1027]1064 this.Load += new System.EventHandler(this.CGView_Load);
1065 this.CursorChanged += new System.EventHandler(this.CGView_CursorChanged);
[614]1066 this.panelRight.ResumeLayout(false);
1067 this.panelClip.ResumeLayout(false);
1068 this.panelTop.ResumeLayout(false);
1069 this.panelCenter.ResumeLayout(false);
1070 this.panelBottom.ResumeLayout(false);
1071 this.ResumeLayout(false);
1072
1073 }
1074 #endregion
1075
1076 #region Fields
1077
1078 private CGDocument m_Document;
1079 private CGDocumentManager m_DocManager;
1080 private int m_nSlots;
1081 private ArrayList m_alSelectedTreeResourceArray = new ArrayList();
1082 private string m_sDocName;
1083 private CGAppointments m_ClipList;
1084 private bool m_bDragDropStart = false;
1085 private Hashtable m_htOverbook;
1086 private Hashtable m_htModifySchedule;
1087 private Hashtable m_htChangeAppts;
1088 private BMXNetConnectInfo m_ConnectInfo = null;
1089 public BMXNetConnectInfo.BMXNetEventDelegate BMXNetEvent;
1090
1091 #endregion Fields
1092
1093 #region Properties
1094
1095 /// <summary>
1096 /// Access the CalendarGrid associated with this view
1097 /// </summary>
1098 public CalendarGrid CGrid
1099 {
1100 get
1101 {
1102 return this.calendarGrid1;
1103 }
1104 }
1105
1106 /// <summary>
1107 /// Accesses the document associated with this view
1108 /// </summary>
1109 public CGDocument Document
1110 {
1111 get
1112 {
1113 return this.m_Document;
1114 }
1115 set
1116 {
1117 this.m_Document = value;
1118 }
1119 }
1120
1121 public CGDocumentManager DocManager
1122 {
1123 get
1124 {
1125 return m_DocManager;
1126 }
1127 set
1128 {
1129 m_DocManager = value;
1130 }
1131 }
1132
1133 public DateTime StartDate
1134 {
1135 get
1136 {
1137 return this.calendarGrid1.StartDate;
1138 }
1139 set
1140 {
1141 this.calendarGrid1.StartDate = value;
1142 }
1143 }
1144
1145 public CGAppointments Appointments
1146 {
1147 get
1148 {
1149 return this.calendarGrid1.Appointments;
1150 }
1151 set
1152 {
1153 this.calendarGrid1.Appointments = value;
1154 }
1155 }
1156
1157
1158 #endregion
1159
1160 #region AppointmentMenu Handlers
1161
1162 private void mnuAppointment_Popup(object sender, System.EventArgs e)
1163 {
[1174]1164 // our flags
1165 bool _findApptsEnabled = (this.Document.Resources.Count > 0)? true : false ;
1166 bool _addApptsEnabled = AddAppointmentEnabled();
1167 bool _editApptsEnabled = EditAppointmentEnabled();
1168 bool _isRadAppt = IsThisARadiologyResource();
1169 bool _noShowEnabled = NoShowEnabled();
1170 bool _undoCheckinEnabled = UndoCheckinEnabled();
1171 //end flags
[614]1172
[1174]1173 mnuNewAppointment.Enabled = _addApptsEnabled && !_isRadAppt;
1174 mnuWalkIn.Enabled = _addApptsEnabled && !_isRadAppt;
1175 mnuMkRadAppt.Enabled = _isRadAppt && _addApptsEnabled;
[614]1176
[1174]1177 mnuEditAppointment.Enabled = _editApptsEnabled && !_isRadAppt;
1178 mnuDeleteAppointment.Enabled = _editApptsEnabled && !_isRadAppt;
1179 mnuCancelRadAppt.Enabled = _isRadAppt && _editApptsEnabled;
1180 mnuNoShow.Enabled = _noShowEnabled && _editApptsEnabled;
1181 mnuNoShowUndo.Enabled = !_noShowEnabled && _editApptsEnabled;
1182 mnuCheckIn.Enabled = _editApptsEnabled && !_isRadAppt;
1183 mnuUndoCheckin.Enabled = _undoCheckinEnabled && !_isRadAppt;
[614]1184
[1174]1185 mnuFindAppt.Enabled = _findApptsEnabled;
1186 mnuCopyAppointment.Enabled = _editApptsEnabled && !_isRadAppt;
1187 mnuViewPatientAppts.Enabled = true;
1188 mnuReprintApptSlip.Enabled = _editApptsEnabled;
[614]1189 }
1190
1191 private void mnuCheckIn_Click(object sender, System.EventArgs e)
1192 {
1193 AppointmentCheckIn();
1194 }
1195
1196 private void mnuCopyAppointment_Click(object sender, System.EventArgs e)
1197 {
1198 //For each appointment in the grid's selected list,
1199 //add to the clip list
1200 //and add to m_ClipList
1201 try
1202 {
1203 foreach (CGAppointment a in this.calendarGrid1.SelectedAppointments.AppointmentTable.Values)
1204 {
[1174]1205 if (m_ClipList.AppointmentTable.Contains((int)a.AppointmentKey))
[614]1206 {
1207 return;
1208 }
1209 m_ClipList.AddAppointment(a);
[1174]1210 lstClip.Items.Add(a);
[614]1211 }
1212 }
1213 catch (Exception ex)
1214 {
1215 string s = ex.Message;
1216 Debug.Write(s);
1217 return;
1218 }
1219 }
1220
1221 private void mnuDeleteAppointment_Click(object sender, System.EventArgs e)
1222 {
1223 AppointmentDelete();
1224 }
1225
1226 private void mnuEditAppointment_Click(object sender, System.EventArgs e)
1227 {
1228 AppointmentEdit();
1229 }
1230
1231 private void mnuNewAppointment_Click(object sender, System.EventArgs e)
1232 {
1233 AppointmentAddNew();
1234 }
1235
1236 private void mnuNoShow_Click(object sender, System.EventArgs e)
1237 {
1238 AppointmentNoShow(true);
1239 }
1240
1241 private void mnuNoShowUndo_Click(object sender, System.EventArgs e)
1242 {
1243 AppointmentNoShow(false);
1244 }
1245
[1118]1246 private void ctxCalGridUndoCheckin_Click(object sender, EventArgs e)
1247 {
1248 AppointmentUndoCheckin();
1249 }
1250
[1174]1251 private void mnuMkRadAppt_Click(object sender, EventArgs e)
1252 {
1253 AppointmentAddNewRadiology();
1254 }
1255
1256 private void mnuCancelRadAppt_Click(object sender, EventArgs e)
1257 {
1258 AppointmentDeleteOneRadiology();
1259 }
1260
1261 private void mnuUndoCheckin_Click(object sender, EventArgs e)
1262 {
1263 AppointmentUndoCheckin();
1264 }
1265
1266 private void mnuReprintApptSlip_Click(object sender, EventArgs e)
1267 {
1268 int apptID = this.CGrid.SelectedAppointment;
1269 if (apptID <= 0) return;
1270
1271 CGAppointment a = (CGAppointment)this.Appointments.AppointmentTable[apptID];
1272
1273 PrintAppointmentSlip(a);
1274 }
1275
[614]1276 #endregion AppointmentMenu Handlers
1277
1278 #region ContextMenu1 Handlers
1279
1280 private void contextMenu1_Popup(object sender, System.EventArgs e)
1281 {
1282 //Enable/disable OpenSchedule and Find Appointment options
1283 bool bEnabled = (m_alSelectedTreeResourceArray.Count > 0)? true : false ;
1284 this.ctxOpenSchedule.Enabled = bEnabled;
1285 this.ctxFindAppt.Enabled = bEnabled;
[1118]1286 this.ctxPrintScheduleT0.Enabled = bEnabled;
1287 this.ctxPrintScheduleT1.Enabled = bEnabled;
1288 this.ctxPrintScheduleT3.Enabled = bEnabled;
[614]1289
1290 //properties not supported now
1291 this.ctxProperties.Enabled = false;
1292 this.ctxProperties.Visible = false;
1293
1294 //Enable/disable Availability menu option
1295 if (m_alSelectedTreeResourceArray.Count != 1)
1296 {
1297 this.ctxEditAvailability.Enabled = false;
1298 return;
1299 }
1300
1301 if (this.DocManager.ScheduleManager == true)
1302 {
1303 ctxEditAvailability.Enabled = true;
1304 return;
1305 }
1306
1307 string sResource = (string) m_alSelectedTreeResourceArray[0];
1308 DataTable dt = this.DocManager.GlobalDataSet.Tables["ResourceUser"];
1309 DataView dv = new DataView(dt, "", "RESOURCENAME ASC", DataViewRowState.OriginalRows);
1310 string sDuz = this.DocManager.ConnectInfo.DUZ;
1311 bool bModSchedule = false;
1312 DataRowView[] drvA = dv.FindRows(sResource);
1313 if (drvA.Length == 0)
1314 {
1315 this.ctxEditAvailability.Enabled = false;
1316 }
1317 else
1318 {
1319 string sModSchedule = "NO";
1320 foreach (DataRowView drv in drvA)
1321 {
1322 if (drv["USERID"].ToString() == sDuz)
1323 {
1324 sModSchedule = drv["MODIFY_SCHEDULE"].ToString();
1325 break;
1326 }
1327 }
1328
1329 bModSchedule = (sModSchedule == "YES")?true:false;
1330 this.ctxEditAvailability.Enabled = bModSchedule;
1331 }
1332 }
1333
1334 private void ctxEditAvailability_Click(object sender, System.EventArgs e)
1335 {
1336 this.EditScheduleAvailability();
1337 }
1338
1339 private void ctxOpenSchedule_Click(object sender, System.EventArgs e)
1340 {
1341 OpenSelectedSchedule(m_alSelectedTreeResourceArray, DateTime.Today);
1342 }
1343
[1118]1344 private void ctxPrintScheduleT0_Click(object sender, EventArgs e)
1345 {
1346 PrintClinicSchedule(DateTime.Today, DateTime.Today);
1347 }
1348
1349 private void ctxPrintScheduleT1_Click(object sender, EventArgs e)
1350 {
1351 PrintClinicSchedule(DateTime.Today.AddDays(1), DateTime.Today.AddDays(1));
1352 }
1353
1354 private void ctxPrintScheduleT3_Click(object sender, EventArgs e)
1355 {
1356 PrintClinicSchedule(DateTime.Today.AddDays(3), DateTime.Today.AddDays(3));
1357 }
1358
[614]1359 private void ctxProperties_Click(object sender, System.EventArgs e)
1360 {
1361 //TODO: Implement Properties dialog
1362 MessageBox.Show("TODO: Implement Properties dialog");
1363 }
1364
1365 private void ctxFindAppt_Click(object sender, System.EventArgs e)
1366 {
1367 FindAvailableAppointment(m_alSelectedTreeResourceArray);
1368 }
1369
1370 #endregion ContextMenu1 Handlers
1371
1372 #region ctxApptClipMenu Handlers
1373
1374 private void mnuClearClipItems_Click(object sender, System.EventArgs e)
1375 {
1376 this.m_ClipList.ClearAllAppointments();
1377 lstClip.Items.Clear();
1378 }
1379
1380 private void mnuRemoveClipItem_Click(object sender, System.EventArgs e)
1381 {
1382 int i = lstClip.SelectedIndex;
1383 CGAppointment a = (CGAppointment) lstClip.SelectedItem;
1384 int nKey = a.AppointmentKey;
1385 if (i > -1)
1386 {
1387 m_ClipList.RemoveAppointment(nKey);
1388 lstClip.Items.RemoveAt(i);
1389 }
1390 }
1391
1392 private void ctxApptClipMenu_Popup(object sender, System.EventArgs e)
1393 {
1394 mnuClearClipItems.Enabled = (m_ClipList.AppointmentTable.Count > 0);
1395 mnuRemoveClipItem.Enabled = (lstClip.SelectedIndex > -1);
1396 }
1397
1398 #endregion ctxApptClipMenu Handlers
1399
1400 #region ctxCalGridMenu Handlers
1401
1402 private void ctxCalendarGrid_Popup(object sender, System.EventArgs e)
1403 {
[1176]1404 // our flags
1405 bool _findApptsEnabled = (this.Document.Resources.Count > 0) ? true : false;
1406 bool _addApptsEnabled = AddAppointmentEnabled();
1407 bool _editApptsEnabled = EditAppointmentEnabled();
1408 bool _isRadAppt = IsThisARadiologyResource();
1409 bool _noShowEnabled = NoShowEnabled();
1410 bool _undoCheckinEnabled = UndoCheckinEnabled();
1411 //end flags
[1174]1412
[1176]1413 if (_isRadAppt)//this is a radiology resource
[1174]1414 {
1415 ctxCalGridAdd.Visible = false;
1416 ctxCalGridDelete.Visible = false;
1417 ctxCalGridEdit.Visible = false;
1418 ctxCalGridCheckIn.Visible = false;
1419 ctxCalGridNoShow.Visible = false;
1420 ctxCalGridNoShowUndo.Visible = false;
1421 ctxCalGridWalkin.Visible = false;
1422 ctxCalGridUndoCheckin.Visible = false;
1423 ctxCalGridSep1.Visible = false;
1424 ctxCalGridSep2.Visible = false;
1425
1426 ctxCalGridMkRadAppt.Visible = true;
1427 ctxCalGridCancelRadAppt.Visible = true;
1428
1429
1430 }
1431
1432 else // this is a normal resource
1433 {
1434 ctxCalGridAdd.Visible = true;
1435 ctxCalGridDelete.Visible = true;
1436 ctxCalGridEdit.Visible = true;
1437 ctxCalGridCheckIn.Visible = true;
1438 ctxCalGridNoShow.Visible = true;
1439 ctxCalGridNoShowUndo.Visible = true;
1440 ctxCalGridWalkin.Visible = true;
1441 ctxCalGridUndoCheckin.Visible = true;
1442 ctxCalGridSep1.Visible = true;
1443 ctxCalGridSep2.Visible = true;
1444
1445 ctxCalGridMkRadAppt.Visible = false;
1446 ctxCalGridCancelRadAppt.Visible = false;
1447 }
[1176]1448
1449 //Toggle availability of make, edit, checkin and delete appointments etc
[614]1450 //based on whether appropriate element is selected.
[1176]1451 ctxCalGridAdd.Enabled = _addApptsEnabled && !_isRadAppt;
1452 ctxCalGridWalkin.Enabled = _addApptsEnabled && !_isRadAppt;
1453 ctxCalGridEdit.Enabled = _editApptsEnabled && !_isRadAppt;;
1454 ctxCalGridDelete.Enabled = _editApptsEnabled && !_isRadAppt;
[1174]1455
[1176]1456 ctxCalGridCheckIn.Enabled = _editApptsEnabled && !_isRadAppt;
1457 ctxCalGridUndoCheckin.Enabled = _undoCheckinEnabled && !_isRadAppt;
1458 ctxCalGridNoShow.Enabled = _noShowEnabled && _editApptsEnabled;
1459 ctxCalGridNoShowUndo.Enabled = !_noShowEnabled && _editApptsEnabled;
1460 ctxCalGridReprintApptSlip.Enabled = _editApptsEnabled;
1461
[1174]1462 //if the rad ones are visible, then these apply
[1176]1463 ctxCalGridMkRadAppt.Enabled = _isRadAppt && _addApptsEnabled;
1464 ctxCalGridCancelRadAppt.Enabled = _isRadAppt && _editApptsEnabled;
[804]1465 }
[614]1466
1467 private void ctxCalGridAdd_Click(object sender, System.EventArgs e)
1468 {
1469 AppointmentAddNew();
1470 }
1471
1472 private void calendarGrid1_DoubleClick(object sender, System.EventArgs e)
1473 {
1474 if (calendarGrid1.SelectedAppointment > 0)
1475 AppointmentEdit();
1476 }
1477
1478 private void ctxCalGridEdit_Click(object sender, System.EventArgs e)
1479 {
1480 AppointmentEdit();
1481 }
1482
1483 private void ctxCalGridDelete_Click(object sender, System.EventArgs e)
1484 {
1485 AppointmentDelete();
1486 }
1487
1488 private void ctxCalGridCheckIn_Click(object sender, System.EventArgs e)
1489 {
1490 AppointmentCheckIn();
1491 }
1492
1493 private void ctxCalGridNoShow_Click(object sender, System.EventArgs e)
1494 {
1495 AppointmentNoShow(true);
1496 }
1497
1498 private void ctxCalGridNoShowUndo_Click(object sender, System.EventArgs e)
1499 {
1500 AppointmentNoShow(false);
1501 }
1502
[1174]1503 private void ctxCalGridMkRadAppt_Click(object sender, EventArgs e)
1504 {
1505 AppointmentAddNewRadiology();
1506 }
1507
1508 private void ctxCalGridCancelRadAppt_Click(object sender, EventArgs e)
1509 {
1510 AppointmentDeleteOneRadiology();
1511 }
1512
[1110]1513 private void ctxCalGridReprintApptSlip_Click(object sender, EventArgs e)
[804]1514 {
[1110]1515 int apptID = this.CGrid.SelectedAppointment;
1516 if (apptID <= 0) return;
1517
1518 CGAppointment a = (CGAppointment) this.Appointments.AppointmentTable[apptID];
[1111]1519
1520 PrintAppointmentSlip(a);
[804]1521 }
1522
[614]1523 #endregion ctxCalGridMenu Handlers
1524
1525 #region Methods
1526
[1174]1527 /// <summary>
1528 /// Decides whether this is a Radiology Resource. Local Helper to decide what menu items to enable/display
1529 /// </summary>
1530 /// <returns></returns>
1531 private bool IsThisARadiologyResource()
1532 {
1533 //I don't like this logic!!! but works for now!
1534 //Note: I use banana peeling model below
1535
1536 //If no cell is selected AND no appointment is selected, then it's false
1537 if (this.calendarGrid1.SelectedRange.Cells.CellCount < 1 && this.calendarGrid1.SelectedAppointment < 1)
1538 return false;
1539
1540 //If an appointment is selected then...
1541 if (this.calendarGrid1.SelectedAppointment > 0)
1542 {
1543 CGAppointment appt = this.Appointments.AppointmentTable[this.calendarGrid1.SelectedAppointment] as CGAppointment;
1544 if (appt == null) return false; //appt doesn't exist; old appointment and grid wasn't refreshed yet
1545 if (appt.RadiologyExamIEN.HasValue && appt.RadiologyExamIEN.Value > 0) return true; //this appointment is a radiology appointment since it has that member
1546 else return false;
1547
1548 }
1549
1550 //Otherwise, we are for sure dealing with a cell.
1551 //We need to determine if the cell resource is mapped to a Radiology Hospital Location.
1552 DateTime dStart;
1553 DateTime dEnd;
1554 string sResource;
1555
1556 // Get resource
1557 bool bRet = this.calendarGrid1.GetSelectedTime(out dStart, out dEnd, out sResource);
1558
1559 // If we fail, return false (but this is not supposed to ever happen)
1560 if (bRet == false)
1561 {
1562 return false;
1563 }
1564
1565 // see if resource is mapped to a Radiology Hospital Location.
1566 return IsThisARadiologyResource(sResource);
1567 }
1568
1569 private bool IsThisARadiologyResource(string sResource)
1570 {
1571 // see if resource is mapped to a Radiology Hospital Location.
1572 return ( //select all Hospital Locations which are radiology locations
1573 from hl in CGDocumentManager.Current.GlobalDataSet.Tables["HospitalLocation"].AsEnumerable()
1574 where hl.Field<string>("IS_RADIOLOGY_LOCATION") == "1"
1575 //join this to the resources table using the foreign ID (plain jane relational join)
1576 join res in CGDocumentManager.Current.GlobalDataSet.Tables["Resources"].AsEnumerable()
1577 on hl.Field<int>("HOSPITAL_LOCATION_ID") equals res.Field<int>("HOSPITAL_LOCATION_ID")
1578 //then filter this down to the resource that we have
1579 where res.Field<string>("RESOURCE_NAME") == sResource
1580 //if we have any row left, then it is true.
1581 select hl).Any();
1582 }
1583
[614]1584 private bool EditAppointmentEnabled()
1585 {
1586 try
1587 {
1588 //Call here if there is a selected appointment in the grid
1589 if (calendarGrid1.SelectedAppointment < 1)
1590 return false;
1591 CGAppointment appt = (CGAppointment)this.Appointments.AppointmentTable[calendarGrid1.SelectedAppointment];
1592 string sResource = appt.Resource;
1593 return EditAppointmentEnabled(sResource);
1594
1595 }
1596 catch (Exception ex)
1597 {
1598 string sMsg = ex.Message;
1599 return false;
1600 }
1601 }
1602
1603 private bool EditAppointmentEnabled(string sResource)
1604 {
1605
1606 bool bManager = this.DocManager.ScheduleManager;
1607 if (bManager == true)
1608 {
1609 return (true);
1610 }
1611 else
1612 {
1613 bool bModAppts;
1614 bModAppts = (bool)this.m_htChangeAppts[sResource];
1615 return bModAppts;
1616 }
1617 }
1618
1619 private bool AddAppointmentEnabled()
1620 {
1621 if (this.calendarGrid1.SelectedRange.Cells.CellCount < 1)
1622 return false;
1623
1624 bool bManager = this.DocManager.ScheduleManager;
1625 if (bManager == true)
1626 {
1627 return (true);
1628 }
1629 else
1630 {
1631 DateTime dStart = DateTime.Today;
1632 DateTime dEnd = DateTime.Today;
1633 string sResource = "";
1634 bool bRet = this.calendarGrid1.GetSelectedTime(out dStart, out dEnd, out sResource);
1635 if (bRet == false)
1636 {
1637 return false;
1638 }
1639 bool bSlotsAvailable;
1640 bool bOverbook;
1641 bool bModSchedule;
1642 bool bModAppts;
1643 bOverbook = (bool)this.m_htOverbook[sResource];
1644 bModSchedule = (bool)this.m_htModifySchedule[sResource];
1645 bModAppts = (bool)this.m_htChangeAppts[sResource];
1646 if (bModAppts == false)
1647 return false;
1648
[1176]1649 CGAvailability resultantAvail;
1650 m_nSlots = m_Document.SlotsAvailable(dStart, dEnd, sResource, this.calendarGrid1.TimeScale, out resultantAvail);
1651
[614]1652 bSlotsAvailable = (this.m_nSlots > 0);
1653 return ((bSlotsAvailable) || (bModSchedule) || (bOverbook));
1654 }
1655 }
1656
[1118]1657 private bool NoShowEnabled()
1658 {
1659 if (calendarGrid1.SelectedAppointment < 1)
1660 return false;
1661 CGAppointment appt = (CGAppointment)this.Appointments.AppointmentTable[calendarGrid1.SelectedAppointment];
1662 return !appt.NoShow;
1663 }
1664
1665 private bool UndoCheckinEnabled()
1666 {
1667 if (calendarGrid1.SelectedAppointment < 1) return false;
1668 CGAppointment appt = (CGAppointment)this.Appointments.AppointmentTable[calendarGrid1.SelectedAppointment];
1669 return appt.CheckInTime.Ticks > 0;
1670 }
1671
[614]1672 /// <summary>
1673 /// Clean up any resources being used.
1674 /// </summary>
1675 protected override void Dispose( bool disposing )
1676 {
1677 if( disposing )
1678 {
1679 if(components != null)
1680 {
1681 components.Dispose();
1682 }
1683 }
1684 base.Dispose( disposing );
1685 }
1686
[1106]1687 void UpdateStatusBar(DateTime dStart, DateTime dEnd, CGAvailability av)
[614]1688 {
[1106]1689 System.Text.StringBuilder sbMsg = new System.Text.StringBuilder(100);
1690 sbMsg.Append(dStart.ToShortTimeString() + " to " + dEnd.ToShortTimeString());
1691 if (av != null && m_nSlots > 0)
[614]1692 {
[1106]1693 sbMsg.Append(String.Format(" has {0} slot(s) available for {1}. ", m_nSlots.ToString(), av.AccessTypeName));
1694 }
[614]1695 else
1696 {
[1106]1697 sbMsg.Append(": No appointment slots available. ");
[614]1698 }
1699
[1106]1700 if (av != null)
1701 {
1702 sbMsg.Append(String.Format("Source Block: {0} to {1} with {2} slot(s) of type {3}",
1703 av.StartTime.ToShortTimeString(),
1704 av.EndTime.ToShortTimeString(),
1705 av.Slots.ToString(),
1706 av.AccessTypeName));
1707
1708 sbMsg.Append(". ");
1709
1710 if (av.Note.Trim().Length > 0) sbMsg.Append("Note: " + av.Note + ".");
1711 }
1712
1713 this.statusBar1.Text = sbMsg.ToString();
[614]1714 }
1715
1716 private void EditScheduleAvailability()
1717 {
1718 CGAVDocument doc = new CGAVDocument();
1719 try
1720 {
1721 //If resource already open, then navigate to its window
1722 CGAVView v =this.DocManager.GetAVViewByResource(m_alSelectedTreeResourceArray);
1723
1724 if (v != null)
1725 {
1726 v.Activate();
1727 }
1728 else
1729 {
1730 //If not already open, get a lock and open it
1731 doc.DocManager = this.DocManager;
1732 for (int j=0; j < m_alSelectedTreeResourceArray.Count; j++)
1733 {
1734 doc.AddResource((string) m_alSelectedTreeResourceArray[j]);
1735 }
1736 doc.DocName = this.m_sDocName;
1737
1738 //Get preferred time scale from resource info
1739
1740 DataTable dt = this.DocManager.GlobalDataSet.Tables["Resources"];
1741 DataView dv = new DataView(dt, "", "RESOURCE_NAME ASC", DataViewRowState.OriginalRows);
1742 int nScale = 60;
1743 int nTest=0;
1744 string sResource;
1745 int nDataRow;
1746 DataRowView drv;
1747 string sResourceID="";
1748 for (int j=0; j < m_alSelectedTreeResourceArray.Count; j++)
1749 {
1750 sResource = (string) m_alSelectedTreeResourceArray[j];
1751 nDataRow = dv.Find(sResource);
1752 Debug.Assert(nDataRow != -1);
1753 drv = dv[nDataRow];
1754 if (drv["TIMESCALE"].ToString() == "")
1755 {
1756 nTest = 15; //15 minute default
1757 }
1758 else
1759 {
1760 nTest = (int) drv["TIMESCALE"];
1761 }
1762 nScale = (nTest < nScale)?nTest : nScale ;
1763 sResourceID = drv["RESOURCEID"].ToString();
1764 }
1765
1766 doc.ResourceID = Convert.ToInt32(sResourceID);
1767
1768 bool bLock = DocManager.ConnectInfo.bmxNetLib.Lock("^BSDXRES(" + sResourceID + ")", "+");
1769 if (bLock == false)
1770 {
1771 throw new BMXNetException("Another user is currently editing availability for this resource. Try later.");
1772 }
1773
1774 doc.OnOpenDocument();
1775 v =this.DocManager.GetAVViewByResource(m_alSelectedTreeResourceArray);
1776 CalendarGrid cg = v.CGrid;
1777
1778 cg.TimeScale = nScale;
1779
1780 //Position grid to 0700
[1069]1781 cg.PositionGrid(7);
[614]1782 }
1783 }
1784 catch (Exception ex)
1785 {
[620]1786 MessageBox.Show("Unable to edit availability for " + m_sDocName + " schedule. " + ex.Message, "Clinical Scheduling");
[614]1787 this.m_DocManager.CloseAllViews(doc);
1788 return;
1789 }
1790 }
1791
[1070]1792 /// <summary>
1793 /// Opens a view of the Schedule a user requested to open at a specific date
1794 /// </summary>
1795 /// <param name="sSelectedTreeResourceArray">A set of resources to open (?pending more investigation)</param>
1796 /// <param name="dDate">Date at which to show the Grid</param>
[614]1797 private void OpenSelectedSchedule(ArrayList sSelectedTreeResourceArray, DateTime dDate)
1798 {
1799 //If resource already open, then navigate to its window
[1124]1800 CGView v = this.DocManager.GetViewByResource(sSelectedTreeResourceArray);
[614]1801 if (v != null)
1802 {
1803 v.Activate();
1804 v.dateTimePicker1.Value = dDate;
[1106]1805 v.RequestRefreshGrid();
[1070]1806 return;
[614]1807 }
[1070]1808
[1073]1809 //So if it is not a view that's already open, it means we have to grab the data for
1810 //So we tell the user to wait wait wait
1811 this.Cursor = Cursors.WaitCursor;
1812 this.LoadSplash(); //Open "Loading" splash
1813
1814
1815 //If this Document has no resources then use it (happens when the GUI has nothing open, typically after log-in)
[1070]1816 //Else, create a new document
1817 CGDocument doc;
1818 if (this.Document.m_sResourcesArray.Count == 0)
1819 {
1820 doc = this.Document;
1821 }
[614]1822 else
1823 {
[1070]1824 doc = new CGDocument();
1825 doc.DocManager = this.DocManager;
1826 }
[1066]1827
[1070]1828 //Add resources to Document
1829 for (int j=0; j < sSelectedTreeResourceArray.Count; j++)
1830 {
1831 doc.AddResource((string) sSelectedTreeResourceArray[j]);
1832 }
1833
1834 doc.DocName = this.m_sDocName;
[1066]1835
[1070]1836 try
1837 {
[1124]1838 doc.OnOpenDocument(dDate); //this typically creates a new view
[1070]1839 }
[1066]1840
[1070]1841 catch (Exception ex)
1842 {
1843 MessageBox.Show("Unable to open " + m_sDocName + " schedule. " + ex.Message, "Clinical Scheduling");
1844 this.m_DocManager.CloseAllViews(doc);
1845 return;
1846 }
1847
[1124]1848 //We are doing this--again--to fetch the view we just opened in OnOpenDocument
1849 //XXX: Yes, I know, this totally sucks. But I don't fully grasp the whole thing yet to refactor it.
[1070]1850 v =this.DocManager.GetViewByResource(sSelectedTreeResourceArray);
[1071]1851
[1073]1852 //Position the Grid to start at a certain day.
[1071]1853 //XXX: This must be a better way to do this.
1854 v.dateTimePicker1.Value = dDate;
1855 v.StartDate = doc.StartDate;
[1070]1856
1857 //Get preferred time scale from resource info
1858 //If more than one resource, get smallest time scale
1859 CalendarGrid cg = v.CGrid;
1860 DataTable dt = this.DocManager.GlobalDataSet.Tables["Resources"];
1861 DataView dv = new DataView(dt, "", "RESOURCE_NAME ASC", DataViewRowState.OriginalRows);
1862 int nScale = 60;
1863 int nTest=0;
1864 string sResource;
1865 int nDataRow;
1866 DataRowView drv;
1867 for (int j=0; j < sSelectedTreeResourceArray.Count; j++)
1868 {
1869 sResource = (string) sSelectedTreeResourceArray[j];
1870 nDataRow = dv.Find(sResource);
1871 Debug.Assert(nDataRow != -1);
1872 drv = dv[nDataRow];
1873 if (drv["TIMESCALE"].ToString() == "")
[614]1874 {
[1070]1875 nTest = 15; //15 minute default
[614]1876 }
[1070]1877 else
[614]1878 {
[1070]1879 nTest = (int) drv["TIMESCALE"];
[614]1880 }
[1070]1881 nScale = (nTest < nScale)?nTest : nScale ;
1882 }
[614]1883
[1070]1884 cg.TimeScale = nScale;
[614]1885
[1070]1886 cg.PositionGrid(7);
[614]1887
[1124]1888 //new code for v 1.5 //smh
1889 //Disable entries that would make time scale smaller b/c users should not be able to
1890 //make appointments for smaller time scales
1891 if (nScale >= 10)
1892 {
1893 v.mnu10Minute.Enabled = true;
1894 v.mnu15Minute.Enabled = true;
1895 v.mnu20Minute.Enabled = true;
1896 v.mnu30Minute.Enabled = true;
1897 }
1898 if (nScale >= 15)
1899 {
1900 v.mnu10Minute.Enabled = false;
1901 v.mnu15Minute.Enabled = true;
1902 v.mnu20Minute.Enabled = true;
1903 v.mnu30Minute.Enabled = true;
1904 }
1905 if (nScale >= 20)
1906 {
1907 v.mnu10Minute.Enabled = false;
1908 v.mnu15Minute.Enabled = false;
1909 v.mnu20Minute.Enabled = true;
1910 v.mnu30Minute.Enabled = true;
1911 }
1912 if (nScale >= 30)
1913 {
1914 v.mnu10Minute.Enabled = false;
1915 v.mnu15Minute.Enabled = false;
1916 v.mnu20Minute.Enabled = false;
1917 v.mnu30Minute.Enabled = true;
1918 }
1919 if (nScale >= 60)
1920 {
1921 v.mnu10Minute.Enabled = false;
1922 v.mnu15Minute.Enabled = false;
1923 v.mnu20Minute.Enabled = false;
1924 v.mnu30Minute.Enabled = false;
1925 }
1926 //end new code
1927
[1070]1928 //Get the OverBook and ModifySchedule permissions from ResourceUser table
1929 //and populate the hashtables
1930 string sOverbook;
1931 string sModSchedule;
1932 string sModAppts;
1933 bool bOverbook;
1934 bool bModSchedule;
1935 bool bModAppts;
1936 v.m_htOverbook = new Hashtable(sSelectedTreeResourceArray.Count);
1937 v.m_htModifySchedule = new Hashtable(sSelectedTreeResourceArray.Count);
1938 v.m_htChangeAppts = new Hashtable(sSelectedTreeResourceArray.Count);
1939 dt = this.DocManager.GlobalDataSet.Tables["ResourceUser"];
1940 dv = new DataView(dt, "", "RESOURCENAME ASC", DataViewRowState.OriginalRows);
[1233]1941
1942 //dv.RowFilter = "USERNAME = '" + filte_name + "'";
1943 dv.RowFilter = String.Format("USERNAME = '{0}'", this.DocManager.ConnectInfo.UserName.Replace("'", "''"));
1944
[1070]1945 for (int j=0; j < dv.Count; j++)
1946 {
1947 drv = dv[j];
1948 sResource = drv["RESOURCENAME"].ToString();
1949 sOverbook = drv["OVERBOOK"].ToString();
1950 bOverbook = (sOverbook == "YES")?true:false;
1951 sModSchedule = drv["MODIFY_SCHEDULE"].ToString();
1952 bModSchedule = (sModSchedule == "YES")?true:false;
1953 sModAppts = drv["MODIFY_APPOINTMENTS"].ToString();
1954 bModAppts = (sModAppts == "YES")?true:false;
1955 v.m_htOverbook[sResource] = bOverbook;
1956 v.m_htModifySchedule[sResource] = bModSchedule;
1957 v.m_htChangeAppts[sResource] = bModAppts;
1958 }
[614]1959
[1070]1960 //For programmers and scheduling managers, set all permissions for all resources
1961 if (this.DocManager.ScheduleManager == true)
1962 {
1963 dt = this.DocManager.GlobalDataSet.Tables["Resources"];
1964 foreach (DataRow dr in dt.Rows)
[614]1965 {
[1070]1966 sResource = dr["RESOURCE_NAME"].ToString();
1967 v.m_htOverbook[sResource] = true;
1968 v.m_htModifySchedule[sResource] = true;
1969 v.m_htChangeAppts[sResource] = true;
[614]1970 }
[1070]1971 }
[614]1972
[1070]1973 v.calendarGrid1.SetOverlapTable();
1974 v.calendarGrid1.Refresh();
[1073]1975
1976 // Set cursor back and stop splash screen
1977 this.Cursor = Cursors.Default;
1978 StopSplash();
[614]1979 }
1980
1981 private void LoadTree()
1982 {
1983 //Navigate from ResourceGroup table to Resources table
1984 DataRow[] arrRows;
1985 DataRelation dr = DocManager.GlobalDataSet.Relations["GroupResource"];
1986 string sGroup;
1987 string sResource;
1988 int nIndex = 0;
1989 foreach (DataRow r in DocManager.GlobalDataSet.Tables["ResourceGroup"].Rows)
1990 {
1991 sGroup = r["RESOURCE_GROUP"].ToString();
1992 TreeNode deptNode = new TreeNode(sGroup);
1993 nIndex = this.tvSchedules.Nodes.Add(deptNode);
1994 tvSchedules.Nodes[nIndex].Tag = "Dept";
1995 arrRows = r.GetChildRows(dr);
1996 for (int i=0; i< arrRows.Length; i++)
1997 {
1998 sResource = arrRows[i]["RESOURCE_NAME"].ToString();
1999 TreeNode resNode = new TreeNode(sResource);
2000 int nResIndex = deptNode.Nodes.Add(resNode);
2001 deptNode.Nodes[nResIndex].Tag = "Resource";
2002 }
2003 }
2004 }
2005
2006 public void CreateNewSchedule()
2007 {
2008 //Create a new document and open it
2009 CGDocument doc = new CGDocument();
2010 doc.DocManager = this.DocManager;
2011 try
2012 {
[1106]2013 doc.OnOpenDocument(DateTime.Today);
[614]2014 }
2015 catch (Exception ex)
2016 {
[620]2017 MessageBox.Show("Unable to open " + m_sDocName + " schedule. " + ex.Message, "Clinical Scheduling");
[614]2018 this.m_DocManager.CloseAllViews(doc);
2019 return;
2020 }
2021 }
2022
2023 private void AppointmentEdit()
2024 {
2025 try
2026 {
2027 int nApptID = this.calendarGrid1.SelectedAppointment;
2028 Debug.Assert(nApptID != 0);
2029
2030 CGAppointment a = (CGAppointment) this.Appointments.AppointmentTable[nApptID];
2031
2032 DAppointPage dAppt = new DAppointPage();
2033 dAppt.DocManager = this.m_DocManager;
2034 dAppt.InitializePage(a);
2035
2036 calendarGrid1.CGToolTip.Active = false;
2037
2038 if (dAppt.ShowDialog(this) == DialogResult.Cancel)
2039 {
2040 calendarGrid1.CGToolTip.Active = true;
2041 return;
2042 }
2043 calendarGrid1.CGToolTip.Active = true;
2044
2045 string sNote = dAppt.Note;
2046
2047 //Call Document to edit appointment
2048 this.Document.EditAppointment(a, sNote);
2049
[1143]2050 if (dAppt.PrintAppointmentSlip)
2051 {
2052 PrintAppointmentSlip(a);
2053 }
2054
2055 //Redraw appointments
2056 this.UpdateArrays();
2057
2058 //Then tell RPMS that we are updated
2059 RaiseRPMSEvent("BSDX SCHEDULE", a.Resource);
[614]2060 }
2061 catch (Exception ex)
2062 {
2063 Debug.Write("CGView.AppointmentEdit Failed: " + ex.Message);
2064 }
2065 }
2066
2067 /// <summary>
[1118]2068 /// Marks all selected appointments as No Show from this.calendarGrid1.SelectedAppointments
[614]2069 /// </summary>
[1118]2070 /// <param name="bNoShow">True - Mark as noshow; False - undo noshow</param>
[614]2071 private void AppointmentNoShow(bool bNoShow)
2072 {
2073
2074 //bNoShow indicates whether to mark or un-mark as noshow
2075 bool bMarked = false; //Indicates at least one attempt to mark as noshow succeeded
2076 bool bRebook = false; //Stores user's response to auto-rebook dialog question
[1118]2077 CGAppointments alRebookList = new CGAppointments(); // list of appointments to rebook
2078
2079 DNoShow dlg = new DNoShow(); // no show dialog
2080
2081 if (bNoShow == true) // if noshowing, show the dialog to ask the user
[614]2082 {
2083 if (dlg.ShowDialog(this) == DialogResult.Cancel)
2084 {
2085 return;
2086 }
2087 }
2088
2089 bRebook = dlg.AutoRebook;
2090
2091 foreach (CGAppointment a in this.calendarGrid1.SelectedAppointments.AppointmentTable.Values)
2092 {
2093 int nApptID = a.AppointmentKey;
2094 Debug.Assert(nApptID != 0);
2095 try
2096 {
[1118]2097 if ((bNoShow == true) // if no-showing
[614]2098 &&
2099 (a.StartTime.Date > DateTime.Today.Date)
2100 &&
[620]2101 (MessageBox.Show(this, "The appointment for " + a.PatientName + " is in the future. Are you sure you want to No-Show?", "Windows Scheduling", MessageBoxButtons.OKCancel, MessageBoxIcon.Question) != DialogResult.OK))
[614]2102 {
2103 }
[1118]2104 else // otherwise, make or undo show
[614]2105 {
[1118]2106 string sError = Document.AppointmentNoShow(a, bNoShow);
[614]2107 if (sError != "1")
2108 throw new Exception(sError);
2109
2110 bMarked = true;
2111 }
2112 }
2113 catch (Exception ex)
2114 {
[620]2115 MessageBox.Show("Unable to mark appointment No Show: " + ex.Message, "Clinical Scheduling");
[614]2116 }
[1118]2117
[614]2118 if (bRebook == true)
2119 {
2120 try
2121 {
2122 CGAppointment aRebook;
2123 int nMinimumdays = dlg.RebookStartDays;
2124 int nMaximumdays = dlg.RebookMaxDays;
2125 int nAccessType = dlg.RebookAccessType;
2126 //-1 means use current type
2127
2128 if (nAccessType == -1)
2129 {
2130 //Get access type from grid
2131 int nRow = 0;
2132 int nCol = 0;
2133 CGCell cgCell = new CGCell();
2134 this.calendarGrid1.GetCellFromTime(a.StartTime, ref nRow, ref nCol, true , a.Resource);
2135 cgCell.CellColumn = nCol;
2136 cgCell.CellRow = nRow;
2137 this.calendarGrid1.GetTypeFromCell(cgCell, out nAccessType);
2138 a.AccessTypeID = nAccessType;
2139 }
2140 string sResult = Document.AutoRebook(a, nAccessType, nMinimumdays, nMaximumdays, out aRebook);
2141 if (sResult == "1")
2142 {
2143 //Add appointment to list of rebooked appointments
2144 alRebookList.AddAppointment(a);
2145 }
2146 else
2147 {
2148 MessageBox.Show("Unable to rebook this patient: " + a.PatientName);
2149 }
2150
2151 }
2152 catch (Exception ex)
2153 {
2154 MessageBox.Show("Unable to rebook: " + ex.Message);
2155 }
2156 }
[1118]2157
2158 if (bMarked == true)
2159 {
2160 //Notify other scheduling users that this schedule has changed
2161 try
2162 {
2163 //this.Document.RefreshDocument(); no need for this; event raised back and prompts refresh itself.
2164 RaiseRPMSEvent("BSDX SCHEDULE", a.Resource);
2165 }
2166 catch (Exception ex)
2167 {
2168 Debug.Write(ex.Message);
2169 }
2170 this.calendarGrid1.Invalidate();
2171 }
2172 }
2173 AutoRebookFromList(alRebookList);
[614]2174 }
2175
[1118]2176 /// <summary>
2177 /// Prints Auto Rebook Letters; does nothing else to DB!!!
2178 /// </summary>
2179 /// <param name="alRebookList">List of appointments</param>
[614]2180 private void AutoRebookFromList(CGAppointments alRebookList)
2181 {
2182 //Print AutoRebook letters.
2183 if (alRebookList.AppointmentCount > 0)
2184 {
2185 //build |-delimited list of ApptIDs to pass to BSDX REBOOK LIST
2186 string sApptIDList = "";
2187
2188 System.Collections.ArrayList a = new ArrayList();
2189
2190 foreach (CGAppointment appt in alRebookList.AppointmentTable.Values)
2191 {
2192 string sApptID = appt.AppointmentKey.ToString() + "|";
2193 sApptIDList += sApptID;
2194 if (a.Contains(appt.Resource) == false)
2195 a.Add(appt.Resource);
2196 }
[789]2197
2198 // Print rebooks
[614]2199 string sClinicList = "";
2200 foreach (string sRes in a)
2201 {
2202 sClinicList = sClinicList + sRes + "|";
2203 }
[788]2204 DPatientLetter dpl = new DPatientLetter();
2205 dpl.InitializeFormRebookLetters(this.DocManager, sClinicList, sApptIDList);
[614]2206 dpl.ShowDialog(this);
2207 }
2208 }
2209
2210 /// <summary>
[1174]2211 /// Delete one Radiology Appointment
2212 /// </summary>
2213 private void AppointmentDeleteOneRadiology()
2214 {
2215 Debug.Assert(this.calendarGrid1.SelectedAppointment > 0);
2216
2217 CGAppointment a = this.Appointments.AppointmentTable[this.calendarGrid1.SelectedAppointment] as CGAppointment;
2218
2219 Debug.Assert(a.RadiologyExamIEN.HasValue);
2220
[1186]2221 //Can we cancel the appointment?
2222 bool _canCancel = CGDocumentManager.Current.DAL.CanCancelRadExam(a.RadiologyExamIEN.Value);
2223
2224 if (!_canCancel)
2225 {
[1190]2226 MessageBox.Show(this, "This appointment cannot be cancelled.\nReason:\nThe exam associated with this appointment is active/complete/discontinued.");
[1186]2227 return;
2228 }
2229
2230 //Prior to making expensive db calls, tell the grid nothing is selected anymore so nobody would try to pick it up later
[1174]2231 this.calendarGrid1.SelectedAppointment = 0;
2232
[1176]2233 //Now, Cancel the appointment
2234 this.Document.DeleteAppointment(a.AppointmentKey);
2235
[1174]2236 //Cancel Radiology Exam
2237 CGDocumentManager.Current.DAL.CancelRadiologyExam(a.PatientID, a.RadiologyExamIEN.Value);
2238
2239 //redraw the grid to display new set of appointments after this appt was removed.
2240 this.UpdateArrays();
[1176]2241
[1186]2242 //Tell other instances that this schedule has been updated
[1176]2243 RaiseRPMSEvent("BSDX SCHEDULE", a.Resource);
[1174]2244 }
2245
2246 /// <summary>
[614]2247 /// Delete appointment ApptID
2248 /// </summary>
2249 /// <param name="nApptID"></param>
2250 /// <returns></returns>
2251 private string AppointmentDeleteOne(int nApptID)
2252 {
2253 return Document.DeleteAppointment(nApptID);
2254 }
2255
2256 /// <summary>
2257 /// Delete all selected appointments
2258 /// </summary>
[1118]2259 private void AppointmentDelete()
2260 {
2261 calendarGrid1.CGToolTip.Active = false;
2262 CGAppointments alRebookList = new CGAppointments();
[614]2263
[1118]2264 // check to see if any appointment is checked in first
2265 foreach (CGAppointment a in this.calendarGrid1.SelectedAppointments.AppointmentTable.Values)
2266 {
2267 if (a.CheckInTime.Ticks > 0)
2268 {
[1159]2269 MessageBox.Show("You must undo the check-in first before removing the appointment.");
[1118]2270 return;
2271 }
2272 }
[614]2273
[1118]2274 DCancelAppt dCancel = new DCancelAppt();
2275 dCancel.InitializePage(this.m_DocManager);
2276 if (dCancel.ShowDialog(this) != DialogResult.OK)
2277 {
2278 calendarGrid1.CGToolTip.Active = true;
2279 return;
2280 }
[614]2281
[1174]2282 //At this point, the appointment will be deleted...
2283 //Remove the Selected Appointment from the grid because we don't anybody to think there's still
2284 //an appointment selected while we are still updating the grid
2285 this.calendarGrid1.SelectedAppointment = 0;
2286
[1118]2287 bool bClinic = dCancel.ClinicCancelled;
2288 int nReason = dCancel.CancelReason;
2289 string sRemarks = dCancel.CancelRemarks;
2290 bool bRebook = dCancel.AutoRebook;
2291 int nRebookStart = dCancel.RebookStartDays;
2292 int nRebookMax = dCancel.RebookMaxDays;
2293 int nRebookAccessType = dCancel.RebookAccessType;
[614]2294
[1118]2295 calendarGrid1.CGToolTip.Active = true;
[614]2296
[1118]2297 foreach (CGAppointment a in this.calendarGrid1.SelectedAppointments.AppointmentTable.Values)
2298 {
2299
2300 int nApptID = a.AppointmentKey;
2301 Debug.Assert(nApptID != 0);
2302 try
2303 {
2304 string sError = Document.DeleteAppointment(nApptID, bClinic, nReason, sRemarks);
2305 if (sError != "")
2306 throw new Exception(sError);
[614]2307
[1118]2308 this.UpdateArrays(); //Redraw this calendar grid
[614]2309
[1118]2310 if (bRebook == true)
2311 {
2312 try
2313 {
2314 //TODO: Parameterize or dialogize the minum and maximum rebook days
2315 CGAppointment aRebook;
2316 int nMinimumdays = nRebookStart;
2317 int nMaximumdays = nRebookMax;
2318 string sResult = Document.AutoRebook(a, nRebookAccessType, nMinimumdays, nMaximumdays, out aRebook);
2319 if (sResult == "1")
2320 {
2321 //Add appointment to list of rebooked appointments
2322 alRebookList.AddAppointment(a);
2323 }
[1084]2324
[1118]2325 }
2326 catch (Exception ex)
2327 {
2328 MessageBox.Show("Unable to rebook: " + ex.Message);
2329 }
2330 }
[614]2331
[1118]2332 RaiseRPMSEvent("BSDX SCHEDULE", a.Resource);
2333 }
2334 catch (Exception ex)
2335 {
2336 MessageBox.Show("Unable to delete appointment. " + ex.Message, "Clinical Scheduling");
2337 }
[614]2338
[1118]2339
2340 if (alRebookList.AppointmentCount > 0)
2341 {
2342 AutoRebookFromList(alRebookList);
2343 }
2344 }
2345 }
2346
[614]2347 private void AppointmentCheckIn()
2348 {
2349 int nApptID = this.calendarGrid1.SelectedAppointment;
2350 Debug.Assert(nApptID != 0);
2351
[1083]2352 //smh
2353 //CGAppointment a = (CGAppointment) this.Appointments.AppointmentTable[nApptID];
2354 CGAppointment a = (CGAppointment)this.Document.Appointments.AppointmentTable[nApptID];
[614]2355 try
2356 {
2357 bool bAlreadyCheckedIn = false;
2358 if (a.CheckInTime.Ticks > 0)
2359 bAlreadyCheckedIn = true;
2360
2361 if ((bAlreadyCheckedIn == false)
2362 &&
2363 (a.StartTime.Date > DateTime.Today.Date))
2364 {
[620]2365 MessageBox.Show(this, "It is too early to check in " + a.PatientName, "Windows Scheduling", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
[614]2366 return;
2367 }
[1062]2368
[614]2369 DCheckIn dlgCheckin = new DCheckIn();
[1111]2370 dlgCheckin.InitializePage(a);
[614]2371 calendarGrid1.CGToolTip.Active = false;
2372 if (dlgCheckin.ShowDialog(this) != DialogResult.OK)
2373 {
2374 calendarGrid1.CGToolTip.Active = true;
2375 return;
2376 }
2377 calendarGrid1.CGToolTip.Active = true;
2378
[1112]2379 if (bAlreadyCheckedIn != true)
2380 {
2381 DateTime dtCheckIn = dlgCheckin.CheckInTime;
[614]2382
[1112]2383 //Tell appointment that it is checked in, for proper coloring;
2384 //When you refresh from the DB, it will have this property.
2385 a.CheckInTime = DateTime.Now;
[614]2386
[1112]2387 //Save to Database
2388 this.Document.CheckInAppointment(nApptID, dtCheckIn);
2389 }
[1111]2390
2391 //Get Provider (XXXXXXXX: NOT SAVED TO THE DATABASE RIGHT NOW)
2392 a.Provider = dlgCheckin.Provider;
[1083]2393
[1111]2394 // Print Routing Slip if user checks that box...
[1062]2395 if (dlgCheckin.PrintRouteSlip)
[1111]2396 this.PrintRoutingSlip(a);
[804]2397
[1097]2398 //redraw grid
[614]2399 this.calendarGrid1.Invalidate();
2400 }
2401 catch (Exception ex)
2402 {
[620]2403 MessageBox.Show("Error checking in patient: " + ex.Message, "Clinical Scheduling");
[614]2404 }
2405
2406 }
2407
[1118]2408 private void AppointmentUndoCheckin()
2409 {
2410 Debug.Assert(calendarGrid1.SelectedAppointment > 0);
2411
2412 foreach (CGAppointment a in this.calendarGrid1.SelectedAppointments.AppointmentTable.Values)
2413 {
[1127]2414
[1118]2415 string msg; //out var
2416 bool didweSucceed = Document.AppointmentUndoCheckin(a, out msg);
2417
2418 if (!didweSucceed)
2419 {
2420 MessageBox.Show("Error: " + msg);
2421 continue;
2422 }
2423
2424 RaiseRPMSEvent("BSDX SCHEDULE", a.Resource);
2425 }
2426
2427 this.UpdateArrays();
2428 }
2429
[614]2430 private void AppointmentAddWalkin()
2431 {
2432 try
2433 {
[1125]2434
[614]2435
2436 //Get Time and Resource from Selected Cell
2437 DateTime dStart = DateTime.Today;
2438 DateTime dEnd = DateTime.Today;
2439 string sResource = "";
2440 bool bRet = this.calendarGrid1.GetSelectedTime(out dStart, out dEnd, out sResource);
2441 if (bRet == false)
2442 return;
2443
2444 TimeSpan tsDuration = dEnd - dStart;
2445 int nDuration = (int) tsDuration.TotalMinutes;
2446 Debug.Assert(nDuration > 0);
2447
2448 /*
2449 * 8-10-05 Added check to prevent walkin from being created
2450 * on a date later than today.
2451 */
2452
2453 if (dStart.Date > DateTime.Today.Date)
2454 {
[620]2455 MessageBox.Show(this, "You cannot create a walk-in appointment for a date in the future.\n Select today's date and try again.", "Windows Scheduling", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
[614]2456 return;
2457 }
2458
[964]2459 // Added check for making Walk-ins in the past. 9/28/2010
2460 if (dStart.Date < DateTime.Today.Date)
2461 {
2462 var result = MessageBox.Show("Are you sure you want to make a Walk-in in the past?", "Windows Scheduling", MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button2);
2463 if (result == DialogResult.No) return;
2464 }
2465
[614]2466 /*
2467 * 8-10-05 Added overbook prompt for walkin
2468 */
[1083]2469 //SMH: Takes too long to do.
2470 //this.Document.RefreshDocument();
[1106]2471 CGAvailability resultantAvail;
[614]2472
[1106]2473 m_nSlots = m_Document.SlotsAvailable(dStart, dEnd, sResource, this.calendarGrid1.TimeScale, out resultantAvail);
2474
[614]2475 if (m_nSlots < 1)
2476 {
[620]2477 DialogResult dr = MessageBox.Show(this, "There are no slots available at the selected time. Do you want to overbook this appointment?", "Clinical Scheduling",MessageBoxButtons.YesNo);
[614]2478 if (dr != DialogResult.Yes)
2479 {
2480 return;
2481 }
2482 }
2483
2484 //Display a dialog to collect Patient Name
2485 DPatientLookup dPat = new DPatientLookup();
2486 dPat.DocManager = m_DocManager;
2487
2488 int nAccessTypeID = 0;
2489 bRet = calendarGrid1.GetSelectedType(out nAccessTypeID);
2490
2491 if (dPat.ShowDialog(this) == DialogResult.Cancel)
2492 {
2493 return;
2494 }
2495
[1125]2496 CGAppointment appt = new CGAppointment();
[614]2497 appt.PatientID = Convert.ToInt32(dPat.PatientIEN);
2498 appt.PatientName = dPat.PatientName;
2499 appt.StartTime = dStart;
2500 appt.EndTime = dEnd;
2501 appt.Resource = sResource;
2502 appt.HealthRecordNumber = dPat.HealthRecordNumber;
2503
[1125]2504 appt.Patient = new Patient
2505 {
2506 DFN = Convert.ToInt32(dPat.PatientIEN),
2507 ID = dPat.PatientPID,
2508 Name = dPat.PatientName,
2509 HRN = dPat.HealthRecordNumber,
2510 DOB = dPat.PatientDOB
2511 };
2512
[1083]2513 //smh: Takes too long
2514 //this.Document.RefreshDocument();
[614]2515
2516 //Call Document to add a walkin appointment
2517 int nApptID = this.Document.CreateAppointment(appt, true);
2518
2519 //Now check them in.
2520 calendarGrid1.SelectedAppointment = nApptID;
2521 AppointmentCheckIn();
2522
[1125]2523 //Show the new set of appointments by calling UpdateArrays.
[1083]2524 this.UpdateArrays();
2525
[1118]2526 RaiseRPMSEvent("BSDX SCHEDULE", appt.Resource);
[614]2527 }
2528 catch (Exception ex)
2529 {
[1083]2530 string msg;
2531 if (BMXNetLib.Piece(ex.Message, "~", 1) == "-10") // -10 means that BSDXAPI reported an error.
2532 msg = BMXNetLib.Piece(ex.Message, "~", 4);
2533 else
2534 msg = ex.Message;
[614]2535
[1083]2536 MessageBox.Show("VISTA says: \r\n" + msg, "Unable to Make Walk-in Appointment");
2537 return;
[614]2538 }
2539 }
2540
2541 private void AppointmentAddNew()
2542 {
2543 try
2544 {
2545 //Get Time and Resource from Selected Cell
2546 DateTime dStart = DateTime.Today;
2547 DateTime dEnd = DateTime.Today;
2548 string sResource = "";
2549 bool bRet = this.calendarGrid1.GetSelectedTime(out dStart, out dEnd, out sResource);
2550 if (bRet == false)
2551 return;
[964]2552
2553 // Added check for making Walk-ins in the past. 9/28/2010
2554 if (dStart.Date < DateTime.Today.Date)
2555 {
2556 var result = MessageBox.Show("Are you sure you want to make an appointment in the past?", "Windows Scheduling", MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button2);
2557 if (result == DialogResult.No) return;
2558 }
2559
[614]2560 //Test dStart for Holiday
2561 DataView dvHoliday = new DataView(this.DocManager.GlobalDataSet.Tables["HOLIDAY"]);
2562 dvHoliday.Sort="DATE ASC";
2563 int nFind = dvHoliday.Find(dStart.Date);
2564 if (nFind > -1)
2565 {
2566 string sHoliday = "";
2567 DataRowView drv = dvHoliday[nFind];
2568 sHoliday = drv["NAME"].ToString();
[620]2569 if (MessageBox.Show(this, dStart.ToShortDateString() + " is a holiday (" + sHoliday + "). Are you sure you want to make this appointment?","Clinical Scheduling", MessageBoxButtons.OKCancel, MessageBoxIcon.Question) != DialogResult.OK)
[614]2570 return;
2571 }
2572
[1083]2573 //Sam: takes too long. Remove this call; deal with the issue of concurrent appointments another way.
2574 //this.Document.RefreshDocument();
[1106]2575 CGAvailability resultantAvail;
2576 m_nSlots = m_Document.SlotsAvailable(dStart, dEnd, sResource, this.calendarGrid1.TimeScale, out resultantAvail);
[614]2577
2578 if (m_nSlots < 1)
2579 {
[620]2580 DialogResult dr = MessageBox.Show(this, "There are no slots available at the selected time. Do you want to overbook this appointment?", "Clinical Scheduling",MessageBoxButtons.YesNo);
[614]2581 if (dr != DialogResult.Yes)
2582 {
2583 return;
2584 }
2585 }
2586
2587 //Display a dialog to collect Patient Name
2588 DPatientLookup dPat = new DPatientLookup();
2589 dPat.DocManager = m_DocManager;
2590
2591 int nAccessTypeID = 0;
2592 bRet = calendarGrid1.GetSelectedType(out nAccessTypeID);
2593
2594 if (dPat.ShowDialog(this) == DialogResult.Cancel)
2595 {
2596 return;
2597 }
2598
2599 //Call the appointment dialog to collect the appointment info
2600 Debug.Assert(dPat.PatientIEN != "");
2601 DAppointPage dAppt = new DAppointPage();
2602 dAppt.DocManager = this.m_DocManager;
2603 string sNote = "";
[1106]2604 dAppt.InitializePage(dPat.PatientIEN, dStart, dEnd, sResource, sNote, nAccessTypeID);
[614]2605
2606 if (dAppt.ShowDialog(this) == DialogResult.Cancel)
2607 {
2608 return;
2609 }
2610
[1106]2611 CGAppointment appt = dAppt.Appointment;
2612
2613 // old way of making an appointment
2614 /*new CGAppointment();
[614]2615 appt.PatientID = Convert.ToInt32(dPat.PatientIEN);
2616 appt.PatientName = dPat.PatientName;
2617 appt.StartTime = dStart;
2618 appt.EndTime = dEnd;
2619 appt.Resource = sResource;
2620 appt.Note = dAppt.Note;
2621 appt.HealthRecordNumber = dPat.HealthRecordNumber;
2622 appt.AccessTypeID = nAccessTypeID;
[1106]2623 */
[614]2624
[1083]2625 //Call Document to add a new appointment. Document adds appointment to CGAppointments array.
[614]2626 this.Document.CreateAppointment(appt);
[794]2627
[1111]2628
[1106]2629 if (dAppt.PrintAppointmentSlip)
2630 {
[1111]2631 PrintAppointmentSlip(appt);
[1106]2632 }
2633
[1083]2634 //Show the new set of appointments by calling UpdateArrays. Fetches Document's CGAppointments
2635 this.UpdateArrays();
[1118]2636
2637 RaiseRPMSEvent("BSDX SCHEDULE", appt.Resource);
[614]2638 }
2639 catch (Exception ex)
[1083]2640 {
2641 string msg;
2642 if (BMXNetLib.Piece(ex.Message, "~", 1) == "-10") // -10 means that BSDXAPI reported an error.
2643 msg = BMXNetLib.Piece(ex.Message, "~", 4);
2644 else
2645 msg = ex.Message;
2646
2647 MessageBox.Show("VISTA says: \r\n" + msg, "Unable to Make Appointment");
[614]2648 return;
[1083]2649 }
[614]2650 }
2651
[1174]2652 /// <summary>
2653 /// Add a new Radiology Appointment to VISTA (ÒÝÊì as my mom calls it)
2654 /// </summary>
2655 private void AppointmentAddNewRadiology()
2656 {
[1176]2657 try
2658 {
2659 DateTime dStart, dEnd; //return vales for below
2660 string sResource; //ditto
2661 int nAccessTypeID = 0; //ditto
[1174]2662
[1176]2663 this.calendarGrid1.GetSelectedTime(out dStart, out dEnd, out sResource);
2664 this.calendarGrid1.GetSelectedType(out nAccessTypeID);
[1174]2665
[1176]2666 Debug.Assert(sResource != null);
2667 Debug.Assert(dStart > DateTime.MinValue);
[1174]2668
[1176]2669 //Get Slots
2670 CGAvailability resultantAvail;
2671 m_nSlots = m_Document.SlotsAvailable(dStart, dEnd, sResource, this.calendarGrid1.TimeScale, out resultantAvail);
[1174]2672
[1176]2673 if (m_nSlots < 1)
2674 {
2675 DialogResult dr = MessageBox.Show(this, "There are no slots available at the selected time. Do you want to overbook this appointment?", "Clinical Scheduling", MessageBoxButtons.YesNo);
2676 if (dr != DialogResult.Yes)
2677 {
2678 return;
2679 }
2680 }
[1174]2681
[1176]2682 //Display a dialog to collect Patient Name
2683 DPatientLookup dPat = new DPatientLookup();
2684 dPat.DocManager = m_DocManager;
[1174]2685
[1176]2686 if (dPat.ShowDialog(this) == DialogResult.Cancel)
2687 {
2688 return;
2689 }
[1174]2690
[1176]2691 int DFN = Int32.Parse(dPat.PatientIEN);
2692 // Hospital Location IEN
2693 int hlIEN = (from resource in CGDocumentManager.Current.GlobalDataSet.Tables["Resources"].AsEnumerable()
2694 where resource.Field<string>("RESOURCE_NAME") == sResource
2695 select resource.Field<int>("HOSPITAL_LOCATION_ID")).FirstOrDefault();
[1174]2696
[1176]2697 //Get Radiology Exams from the DB
2698 List<RadiologyExam> _radExams = CGDocumentManager.Current.DAL.GetRadiologyExamsForPatientinHL(DFN, hlIEN);
[1174]2699
[1176]2700 //If none found...
2701 if (!_radExams.Any())
2702 {
2703 MessageBox.Show("Patient does not have any radiology exams to register.");
2704 return;
2705 }
[1174]2706
[1176]2707 //Display a form for the user to select radiology exams.
2708 DRadExamsSelect _radform = new DRadExamsSelect(_radExams);
[1174]2709
[1176]2710 if (_radform.ShowDialog() == DialogResult.Cancel) return;
[1174]2711
[1176]2712 //Get some return values
2713 int _examien = _radform.ExamIEN;
2714 string _procedurename = _radform.ProcedureName;
[1174]2715
[1176]2716 //Now create and save the appointment
2717 CGAppointment appt = new CGAppointment();
2718 string _sNote = "Radiology Exam (" + _examien + "): " + _procedurename;
2719 appt.CreateAppointment(dStart, dEnd, _sNote, 0, sResource);
2720 appt.PatientID = Int32.Parse(dPat.PatientIEN);
2721 appt.PatientName = dPat.PatientName;
2722 appt.AccessTypeID = nAccessTypeID;
2723 appt.RadiologyExamIEN = _examien;
2724 appt.Patient = new Patient
2725 {
2726 DFN = Convert.ToInt32(dPat.PatientIEN),
2727 ID = dPat.PatientPID,
2728 Name = dPat.PatientName,
2729 HRN = dPat.HealthRecordNumber,
2730 DOB = dPat.PatientDOB
2731 };
[1174]2732
[1176]2733 this.Document.CreateAppointment(appt);
[1174]2734
[1176]2735 //Save Radiology Exam Schedule Info to Radiology Package
2736 CGDocumentManager.Current.DAL.ScheduleRadiologyExam(DFN, _examien, dStart);
2737
2738 //Print Appointment Slip if requested
2739 if (_radform.PrintAppointmentSlip) this.PrintAppointmentSlip(appt);
2740
2741 //Now redraw the grid to display the new appointments
2742 this.UpdateArrays();
2743
2744 //Raise event to other clients
2745 RaiseRPMSEvent("BSDX SCHEDULE", appt.Resource);
2746 }
2747 catch (Exception ex)
2748 {
2749 string msg;
2750 if (BMXNetLib.Piece(ex.Message, "~", 1) == "-10") // -10 means that BSDXAPI reported an error.
2751 msg = BMXNetLib.Piece(ex.Message, "~", 4);
2752 else
2753 msg = ex.Message;
2754
2755 MessageBox.Show("VISTA says: \r\n" + msg, "Unable to Make Appointment");
2756 return;
2757 }
[1174]2758 }
2759
2760
[1073]2761 #region BMX Event Processing and Callbacks
2762 /// <summary>
2763 /// Loosely typed delegate used several times below.
2764 /// </summary>
2765 delegate void OnUpdateScheduleDelegate();
2766
2767 /// <summary>
2768 /// Subscription point for each CGView to process BMX events polled from the server
2769 /// </summary>
2770 /// <param name="obj">Not used</param>
2771 /// <param name="e">BMXEvent Args:
2772 /// e.BMXEvent is free text for Event Type; e.BMXParam is free text for Event Arguments</param>
2773 private void BMXNetEventHandler(Object obj, BMXNet.BMXNetEventArgs e)
2774 {
2775 try
2776 {
2777 // if this class is undefined (e.g. if the user just closed the form, do nothing
2778 if (this == null) return;
2779
2780 // if event is Autofire event
2781 if (e.BMXEvent == "BMXNet AutoFire")
2782 {
2783 Debug.Write("CGView caught AutoFire event.\n");
2784
2785 //Create a delegate to OnUpdateSchedule and call Async
2786 //Once Async Call is done, go to OnUpdateScheduleCallback
2787 OnUpdateScheduleDelegate ousd = new OnUpdateScheduleDelegate(OnUpdateSchedule);
2788 ousd.BeginInvoke(OnUpdateScheduleCallback, null);
2789
2790 return;
2791 }
2792
2793 // if event is BSDX SCHEDULE
2794 else if (e.BMXEvent == "BSDX SCHEDULE")
2795 {
2796 //See if any of the resources in the event argument matches BSDX Schedule.
2797 //If yes, fire off the delegate
2798 string sResourceName;
2799 for (int j = 0; j < m_Document.m_sResourcesArray.Count; j++)
2800 {
2801 sResourceName = m_Document.m_sResourcesArray[j].ToString();
2802 if (e.BMXParam == sResourceName)
2803 {
2804 Debug.Write("CGView caught BSDX SCHEDULE event.\n");
2805
2806 //Create a delegate to OnUpdateSchedule and call Async
2807 //Once Async Call is done, go to OnUpdateScheduleCallb
2808 OnUpdateScheduleDelegate ousd = new OnUpdateScheduleDelegate(OnUpdateSchedule);
2809 ousd.BeginInvoke(OnUpdateScheduleCallback, null);
2810
2811 break;
2812 }
2813 }
2814 }
2815 }
2816 catch (Exception ex)
2817 {
2818 Debug.Write(ex.Message);
2819 }
2820 }
2821
2822 /// <summary>
2823 /// Update Appointments and Availabilites using Document.RefreshDocumentAsync on a different thread
2824 /// </summary>
2825 /// <remarks>
2826 /// This method is expected to be called asynchornously.
2827 /// </remarks>
[614]2828 public void OnUpdateSchedule()
2829 {
2830 try
2831 {
[1073]2832 m_Document.RefreshDocumentAsync(); //new
[614]2833 }
2834 catch (Exception ex)
2835 {
[620]2836 MessageBox.Show("Unable to refresh document " + ex.Message, "Clinical Scheduling");
[614]2837 }
2838 }
2839
[825]2840 /// <summary>
[1073]2841 /// Callback for when OnUpdateSchedule is done. Triggers the Grid to redraw itself by calling UpdateArrays.
2842 /// </summary>
2843 /// <param name="itfAR">not used</param>
2844 /// <remarks>Calls UpdateArrays via this.Invoke to make sure that the grid is redrawn on the UI thread</remarks>
2845 private void OnUpdateScheduleCallback(IAsyncResult itfAR)
2846 {
2847 OnUpdateScheduleDelegate d = new OnUpdateScheduleDelegate(UpdateArrays);
[1095]2848
2849 //try catch just in case that the view closed in the meantime.
2850 try
2851 {
2852 this.Invoke(d);
2853 }
2854 catch (InvalidOperationException)
2855 {
2856 return;
2857 }
[1073]2858 }
2859
2860 /// <summary>
2861 /// Create a new event in RPMS. Wrapper around BMXConnectInfo.RaiseEvent
2862 /// </summary>
2863 /// <param name="sEvent">Name of Event to Raise</param>
2864 /// <param name="sParams">Parameter of Event to Raise</param>
2865 public void RaiseRPMSEvent(string sEvent, string sParams)
2866 {
2867 try
2868 {
2869 //Signal RPMS to raise an event
[1118]2870 m_ConnectInfo.RaiseEvent(sEvent, sParams, false);
[1073]2871 }
2872 catch (Exception ex)
2873 {
2874 Debug.Write(ex.Message);
2875 }
2876 }
2877
2878 #endregion
2879
2880 /// <summary>
[825]2881 /// This is how you set how the grid will look
2882 /// </summary>
[614]2883 public void UpdateArrays()
2884 {
[1066]2885 // Make sure that we are called synchronously
[614]2886 Debug.Assert(this.InvokeRequired == false,"CGView.UpdateArrays InvokeRequired");
[821]2887 // This is where you set how the grid will look
[1083]2888
2889 //Create Deep copy of Availability Array
2890 ArrayList availArrayCopy = new ArrayList();
2891 foreach (CGAvailability av in this.m_Document.AvailabilityArray)
2892 availArrayCopy.Add(av);
2893
[614]2894 try
2895 {
[1073]2896 //Tell the grid about Avails, Appts, and Resources.
[1083]2897 this.calendarGrid1.AvailabilityArray = availArrayCopy;
[1073]2898 //Appts are cloned b/c if we tie into the class directly, we shoot off errors when we manipulate it.
[1083]2899 this.calendarGrid1.Appointments = (CGAppointments)this.m_Document.Appointments.Clone();
[614]2900 this.calendarGrid1.Resources = this.m_Document.Resources;
[1073]2901 //Redraw the calendar grid
[821]2902 this.calendarGrid1.OnUpdateArrays(); // this draws the Calendar
[614]2903 this.lblResource.Text = this.m_Document.DocName;
2904 this.calendarGrid1.Invalidate();
2905 }
2906 catch (Exception ex)
2907 {
[620]2908 MessageBox.Show("Unable to update arrays " + ex.Message, "Clinical Scheduling");
[614]2909 }
2910 }
2911
2912 private void SchedulingManagement()
2913 {
2914 try
2915 {
2916 bool bLock = DocManager.ConnectInfo.Lock("^BSDXMGR", "+", "");
2917 if (bLock == false)
2918 {
2919 throw new Exception("Another user is currently in Scheduling Management. Try later.");
2920 }
2921
2922 DManagement dMgm = new DManagement();
2923 dMgm.InitializeDialog(this.m_DocManager);
2924
2925 if (dMgm.ShowDialog(this) == DialogResult.Cancel)
2926 {
2927 }
2928
2929 m_DocManager.GlobalDataSet.Tables["ResourceUser"].Clear();
2930 m_DocManager.LoadResourceUserTable(false);
2931 bLock = DocManager.ConnectInfo.bmxNetLib.Lock("^BSDXMGR", "-");
2932 }
2933 catch (ApplicationException aex)
2934 {
2935 string sMsg = aex.Message;
2936 MessageBox.Show("Unable to acquire transmit lock. Try later.");
2937 }
2938 catch (Exception ex)
2939 {
[620]2940 MessageBox.Show("Scheduling Management Error: " + ex.Message, "Clinical Scheduling");
[614]2941 }
2942 }
2943
2944 public void UpdateTree()
2945 {
2946 this.tvSchedules.Nodes.Clear();
2947 this.LoadTree();
2948 }
2949
2950 public void ViewPatientAppointments()
2951 {
2952 try
2953 {
2954 //Display a dialog to collect Patient Name
2955 DPatientLookup dPat = new DPatientLookup();
2956 dPat.DocManager = m_DocManager;
2957 if (dPat.ShowDialog(this) == DialogResult.Cancel)
2958 {
2959 return;
2960 }
2961
2962 Debug.Assert(dPat.PatientIEN != "");
2963 int nPatientID = Convert.ToInt32(dPat.PatientIEN);
2964 ViewPatientAppointments(nPatientID);
2965 }
2966 catch (Exception ex)
2967 {
[620]2968 MessageBox.Show(this, ex.Message, "Clinical Scheduling", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
[614]2969 }
2970 }
2971
2972 public void ViewPatientAppointments(int PatientID)
2973 {
2974 DPatientApptDisplay dPa = new DPatientApptDisplay();
2975
2976 dPa.InitializeForm(this.DocManager, PatientID);
2977
2978
2979 if (dPa.ShowDialog(this) != DialogResult.Cancel)
2980 {
2981
2982 }
2983
2984 }
2985
2986 private void FindAvailableAppointment(ArrayList alResourceArray)
2987 {
2988 DApptSearch dSearch = new DApptSearch();
2989 dSearch.InitializePage(alResourceArray, this.m_DocManager);
2990 if (dSearch.ShowDialog(this) == DialogResult.Cancel)
2991 return;
2992
[1097]2993 CGAvailability av = dSearch.SelectedAvailability;
2994
[614]2995 ArrayList alResource = new ArrayList();
[1097]2996 alResource.Add(av.ResourceList);
2997 DateTime sDate = av.StartTime;
2998 m_sDocName = av.ResourceList;
[614]2999 OpenSelectedSchedule(alResource, sDate);
3000
3001 }
3002
3003 #endregion Methods
3004
3005 #region Events
3006
[1073]3007 /// <summary>
3008 /// Special import to get the GetActiveWindow method from Win32
3009 /// </summary>
3010 /// <returns>Windows Handle number for Foregreound Active Window</returns>
3011 [DllImport("user32.dll")]
3012 static extern IntPtr GetActiveWindow();
3013
3014 /// <summary>
3015 /// If a mouse enters the grid, check if the grid is on the active form first before stealing the focus
3016 /// </summary>
3017 /// <param name="sender"></param>
3018 /// <param name="e"></param>
3019 private void calendarGrid1_MouseEnter(object sender, EventArgs e)
3020 {
3021 if (GetActiveWindow() == this.Handle)
3022 calendarGrid1.Focus();
3023 }
[1106]3024
3025 /// <summary>
3026 /// If mouse enters the Tree Section, check if the grid is on the active form first before stealing the focus
3027 /// </summary>
3028 /// <param name="sender"></param>
3029 /// <param name="e"></param>
3030 private void tvSchedules_MouseEnter(object sender, EventArgs e)
3031 {
3032 if (GetActiveWindow() == this.Handle)
3033 tvSchedules.Focus();
3034 }
[1073]3035
3036 private void CGView_Load(object sender, System.EventArgs e)
[614]3037 {
3038 Debug.Assert (this.Document != null);
3039
3040 //Register the view
3041 CGDocumentManager.Current.RegisterDocumentView(this.Document, this);
3042
3043 //Load the Group-Resource treeview
3044 LoadTree();
3045
3046 this.SetDesktopLocation(this.DesktopLocation.X + 10, this.DesktopLocation.Y + 10);
[1071]3047
3048 //Show the Form
3049 this.Activate();
[1106]3050
3051 //Set focus on the calendar grid
3052 this.calendarGrid1.Focus();
[614]3053 }
3054
3055 private void mnuOpenSchedule_Click(object sender, System.EventArgs e)
3056 {
3057 CreateNewSchedule();
3058 }
3059
3060 private void mnu1Day_Click(object sender, System.EventArgs e)
3061 {
3062 DateTime dtPicker = dateTimePicker1.Value;
3063 DateTime DayOnly = new DateTime(dtPicker.Year, dtPicker.Month, dtPicker.Day);
3064 this.calendarGrid1.StartDate = DayOnly;
3065 this.calendarGrid1.Columns = 1;
3066 }
3067
3068 private void mnu5Day_Click(object sender, System.EventArgs e)
3069 {
3070 if (this.calendarGrid1.Columns == 1)
3071 {
3072 this.StartDate = this.Document.StartDate;
3073 }
3074
3075 this.calendarGrid1.Columns = 5;
3076 this.Document.m_nColumnCount = 5; // MJL 1/17/2007
[1066]3077 RequestRefreshGrid();
[614]3078 }
3079
3080 private void mnu7Day_Click(object sender, System.EventArgs e)
3081 {
3082 this.calendarGrid1.Columns = 7;
3083 this.Document.m_nColumnCount = 7; // MJL 1/17/2007
[1066]3084 RequestRefreshGrid();
[614]3085 }
3086
3087 private void mnu10Minute_Click(object sender, System.EventArgs e)
3088 {
3089 CalendarGrid cg = this.calendarGrid1;
3090 cg.TimeScale = 10;
[1069]3091 cg.PositionGrid(7);
[614]3092 }
3093
3094 private void mnu15Minute_Click(object sender, System.EventArgs e)
3095 {
3096 CalendarGrid cg = this.calendarGrid1;
3097 cg.TimeScale = 15;
[1069]3098 cg.PositionGrid(7);
[614]3099 }
3100
3101 private void mnu20Minute_Click(object sender, System.EventArgs e)
3102 {
3103 CalendarGrid cg = this.calendarGrid1;
3104 cg.TimeScale = 20;
[1069]3105 cg.PositionGrid(7);
[614]3106 }
3107
3108 private void mnu30Minute_Click(object sender, System.EventArgs e)
3109 {
3110 CalendarGrid cg = this.calendarGrid1;
3111 cg.TimeScale = 30;
[1069]3112 cg.PositionGrid(7);
[614]3113 }
3114
3115 private void mnuViewScheduleTree_Click(object sender, System.EventArgs e)
3116 {
3117 this.mnuViewScheduleTree.Checked = this.tvSchedules.Visible;
3118 this.tvSchedules.Visible = !(this.tvSchedules.Visible);
3119 this.mnuViewScheduleTree.Checked = !(this.mnuViewScheduleTree.Checked);
3120 }
3121
3122
[1106]3123
[614]3124 private void tvSchedules_DoubleClick(object sender, System.EventArgs e)
3125 {
3126 if (m_alSelectedTreeResourceArray == null)
3127 return;
3128 if (m_alSelectedTreeResourceArray.Count < 1)
3129 {
3130 if (this.tvSchedules.SelectedNode.Text != "")
3131 {
3132 SetResourceArrayFromGroup(tvSchedules.SelectedNode.Text);
3133 }
3134 else
3135 {
3136 return;
3137 }
3138 }
3139 OpenSelectedSchedule(m_alSelectedTreeResourceArray, DateTime.Today);
3140 }
3141
3142 //20041109 Added
3143 private void SetResourceArrayFromGroup(string sGroup)
3144 {
3145 //Navigate from ResourceGroup table to Resources table
3146 DataRow[] arrRows;
3147 DataRelation dr = DocManager.GlobalDataSet.Relations["GroupResource"];
3148 DataRow r = DocManager.GlobalDataSet.Tables["ResourceGroup"].Rows.Find(sGroup);
3149 arrRows = r.GetChildRows(dr);
3150 for (int i=0; i< arrRows.Length; i++)
3151 {
3152 string sResource = arrRows[i]["RESOURCE_NAME"].ToString();
3153 m_alSelectedTreeResourceArray.Add(sResource);
3154 }
3155 m_sDocName = sGroup;
3156 }
3157
3158 public void SyncTree()
3159 {
3160
3161 }
3162
[1106]3163
[614]3164 private void tvSchedules_AfterSelect(object sender, System.Windows.Forms.TreeViewEventArgs e)
[1106]3165 {
[614]3166 m_alSelectedTreeResourceArray = new ArrayList();
3167 string sResource = e.Node.FullPath;
3168 string[] ss = sResource.Split((char) 92);
3169 int l = ss.GetUpperBound(0);
3170
3171 if (l == 0) //a resource group was checked, so get all underying resources
3172 {
3173 SetResourceArrayFromGroup(ss[0]);
3174 }
3175 else
3176 {
3177 sResource = ss[l];
3178 m_alSelectedTreeResourceArray.Add(ss[1]);
3179 }
3180
3181 m_sDocName = ss[l];
3182 return;
3183
3184 }
3185
[1106]3186 /// <summary>
3187 /// Makes sure that the node gets selected no matter where we click.
3188 /// Incidentally, Invokes AfterSelect event.
3189 /// </summary>
3190 /// <param name="sender"></param>
3191 /// <param name="e"></param>
3192 private void tvSchedules_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
3193 {
3194 e.Node.TreeView.SelectedNode = e.Node;
3195 }
3196
3197 /// <summary>
3198 /// Useless code now... Good place to test something.
3199 /// </summary>
3200 /// <param name="sender"></param>
3201 /// <param name="e"></param>
[614]3202 private void mnuTest1_Click(object sender, System.EventArgs e)
3203 {
3204 ReaderWriterLock m_rwl = this.DocManager.ConnectInfo.bmxNetLib.BMXRWL;
3205 try
3206 {
3207 m_rwl.AcquireWriterLock(50);
3208 Debug.Write("\nTest Button 1 Acquired first lock\n");
3209 m_rwl.AcquireWriterLock(50);
3210 Debug.Write("Test Button 1 Acquired second lock\n");
3211 this.DocManager.ViewRefresh();
3212 Thread.Sleep(5000);
3213 try
3214 {
3215 }
3216 catch
3217 {
3218 }
3219 finally
3220 {
3221 m_rwl.ReleaseWriterLock();
3222 Debug.Write ("Test Button 1 released first lock.\n");
3223 m_rwl.ReleaseWriterLock();
3224 Debug.Write ("Test Button 1 released second lock.\n");
3225 }
3226
3227 return;
3228 }
3229 catch (Exception ex)
3230 {
3231 Debug.Write("Test Button 1 exception: " + ex.Message + "\n");
3232 }
3233 }
3234
3235 private void CGView_Closing(object sender, System.ComponentModel.CancelEventArgs e)
3236 {
3237 try
3238 {
3239 m_ConnectInfo.BMXNetEvent -= m_bmxDelegate;
3240 this.calendarGrid1.CloseGrid();
3241 }
3242 catch (Exception ex)
3243 {
3244 Debug.Write("CGView_Closing exception: " + ex.Message + "\n");
3245 }
3246 }
3247
3248 private void mnuViewRightPanel_Click(object sender, System.EventArgs e)
3249 {
3250 this.mnuViewRightPanel.Checked = this.panelRight.Visible;
3251 this.panelRight.Visible = !(this.panelRight.Visible);
3252 this.mnuViewRightPanel.Checked = !(this.mnuViewRightPanel.Checked);
3253 }
3254
3255
3256 private void calendarGrid1_CGSelectionChanged(object sender, IndianHealthService.ClinicalScheduling.CGSelectionChangedArgs e)
3257 {
[1106]3258 CGAvailability resultantAvail;
3259 m_nSlots = m_Document.SlotsAvailable(e.StartTime, e.EndTime, e.Resource, this.calendarGrid1.TimeScale, out resultantAvail);
3260 UpdateStatusBar(e.StartTime, e.EndTime, resultantAvail);
[614]3261 }
3262
[1084]3263 /// <summary>
3264 /// Fired during drag and drop, on the drop action.
3265 /// </summary>
3266 /// <param name="sender"></param>
3267 /// <param name="e"></param>
[614]3268 private void calendarGrid1_CGAppointmentChanged(object sender, IndianHealthService.ClinicalScheduling.CGAppointmentChangedArgs e)
3269 {
3270 try
3271 {
[1174]3272 // added April 13 2011
3273 // Can't edit radiology appointments (Why? b/c it's intimately tied to Radiology Entry of the Hosp Loc)
3274 if (e.Appointment.RadiologyExamIEN.HasValue && e.Appointment.RadiologyExamIEN.Value > 0)
3275 {
3276 MessageBox.Show("You cannot move a radiology appointment.", "Clinical Scheduling");
3277 return;
3278 }
3279
3280 // added May 5 2011
3281 // Can't move an appointment to a radiology resource
3282 if (IsThisARadiologyResource(e.Resource))
3283 {
3284 MessageBox.Show("You cannot move an appointment to a radiology location.", "Clinical Scheduling");
3285 return;
3286 }
3287
[614]3288 if (e.Appointment.CheckInTime.Ticks > 0)
3289 {
[1174]3290 MessageBox.Show("You cannot change the appointment time because the patient has already checked in.", "Clinical Scheduling");
[614]3291 return;
3292 }
3293
[964]3294 // Added check for making Walk-ins/appts in the past. 9/28/2010 //smh
3295 if (e.StartTime < DateTime.Today.Date)
3296 {
3297 var result = MessageBox.Show("Are you sure you want to make an appointment in the past?", "Windows Scheduling", MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button2);
3298 if (result == DialogResult.No) return;
3299 }
3300
[1084]3301 //Can user edit destination resource?
[614]3302 if (EditAppointmentEnabled(e.Resource) == false)
3303 return;
[1084]3304
3305 //Can user edit original schedule?
[614]3306 if (EditAppointmentEnabled(e.Appointment.Resource) == false)
3307 return;
3308
[620]3309 if (MessageBox.Show("Are you sure you want to move this appointment?", "Clinical Scheduling", MessageBoxButtons.YesNo) != DialogResult.Yes)
[614]3310 return;
3311
3312 //20040909 Cherokee Replaced this block with following
3313 // if (m_Document.SlotsAvailable(e.StartTime, e.EndTime, e.Resource, out sAccessType, out sAvailabilityMessage) < 1)
3314 // {
3315 // MessageBox.Show("There are no appointment slots available for the selected time.");
3316 // return;
3317 // }
3318 bool bOverbook =false;
3319 if (m_htOverbook.Count > 0)
3320 {
3321 bOverbook = (bool) this.m_htOverbook[e.Resource.ToString()];
3322 }
3323 bool bModSchedule =false;
3324 if (m_htModifySchedule.Count > 0)
3325 {
3326 bModSchedule = (bool) this.m_htModifySchedule[e.Resource.ToString()];
3327 }
[1106]3328 CGAvailability resultantAvail;
3329 bool bSlotsAvailable = (m_Document.SlotsAvailable(e.StartTime, e.EndTime, e.Resource, this.calendarGrid1.TimeScale, out resultantAvail) > 0);
[614]3330 if (!((bSlotsAvailable) || (bModSchedule) || (bOverbook) ))
3331 {
3332 MessageBox.Show("There are no appointment slots available for the selected time.");
3333 return;
3334 }
3335
3336 /*
3337 * 7-19-05 Added overbook prompt
3338 */
3339 if (bSlotsAvailable == false)
3340 {
[620]3341 DialogResult dr = MessageBox.Show(this, "There are no slots available at the selected time. Do you want to overbook this appointment?", "Clinical Scheduling",MessageBoxButtons.YesNo);
[614]3342 if (dr != DialogResult.Yes)
3343 {
3344 return;
3345 }
3346 }
3347
[1084]3348 //Create a new appointment using old data for patient demographics and note and new data
3349 //for StartTime, EndTime, Resource, AccessTypeID
3350 CGAppointment appt = new CGAppointment();
3351 appt.PatientID = e.Appointment.PatientID;
3352 appt.PatientName = e.Appointment.PatientName;
3353 appt.StartTime = e.StartTime;
3354 appt.EndTime = e.EndTime;
3355 appt.Resource = e.Resource;
3356 appt.Note = e.Appointment.Note;
3357 appt.HealthRecordNumber = e.Appointment.HealthRecordNumber;
3358 appt.AccessTypeID = e.AccessTypeID;
[1143]3359 appt.Patient = e.Appointment.Patient;
3360
[1084]3361 this.Document.CreateAppointment(appt);
3362
3363 //CGAppointment a = new CGAppointment();
3364 //a.StartTime = e.StartTime;
3365 ////e.Appointment.StartTime = e.StartTime
3366 //a.EndTime = e.EndTime;
3367 ////e.Appointment.EndTime = e.EndTime;
3368 //a.Resource = e.Resource;
3369 ////e.Appointment.Resource = e.Resource;
3370 //a.AccessTypeID = e.AccessTypeID;
3371 ////e.Appointment.AccessTypeID = e.AccessTypeID;
3372 //m_Document.CreateAppointment(a);
[614]3373
[964]3374
3375 string sError = AppointmentDeleteOne(e.Appointment.AppointmentKey);
3376 if (sError != "")
[614]3377 {
3378 MessageBox.Show(sError);
3379 return;
3380 }
3381
3382 }
3383 catch (Exception ex)
3384 {
[620]3385 MessageBox.Show("Unable to change appointment " + ex.Message, "Clinical Scheduling");
[1084]3386 //this.m_DocManager.UpdateViews();
[614]3387 return;
3388 }
3389 finally
3390 {
[1084]3391 this.UpdateArrays();
[614]3392 }
3393 try
3394 {
3395 RaiseRPMSEvent("BSDX SCHEDULE" , e.Resource);
3396 if (e.Resource != e.OldResource)
3397 RaiseRPMSEvent("BSDX SCHEDULE", e.OldResource);
[1084]3398
3399 //That will take too long. Don't do it. Try and see what happens when you come
3400 //this.m_DocManager.UpdateViews(e.Resource, e.OldResource);
[614]3401 }
3402 catch (Exception ex)
3403 {
3404 Debug.Write(ex.Message);
3405 }
3406 }
3407
3408 private void mnuSchedulingManagment_Click(object sender, System.EventArgs e)
3409 {
3410 SchedulingManagement();
3411 }
3412
3413 private void mnuFile_Popup(object sender, System.EventArgs e)
3414 {
3415 this.mnuSchedulingManagment.Enabled = DocManager.ScheduleManager;
3416 }
3417
3418 private void mnuFindAppt_Click(object sender, System.EventArgs e)
3419 {
3420 FindAvailableAppointment(this.Document.Resources);
3421 }
3422
3423 private void mnuRPMSServer_Click(object sender, System.EventArgs e)
3424 {
3425 //Handled by DocumentManager class
3426 }
3427
3428 private void mnuRPMSLogin_Click(object sender, System.EventArgs e)
3429 {
3430 //Handled by DocumentManager class
3431 }
3432
3433 private void CGView_Activated(object sender, System.EventArgs e)
3434 {
3435 calendarGrid1.GridEnter = true;
3436 }
3437
3438 private void mnuHelpAbout_Click(object sender, System.EventArgs e)
3439 {
[620]3440 MessageBox.Show("Clinical Scheduling Version " + Application.ProductVersion, "Clinical Scheduling", MessageBoxButtons.OK, MessageBoxIcon.Information);
[614]3441 }
3442
3443 private void ImplementMsg()
3444 {
[620]3445 MessageBox.Show("Clinical Scheduling", "TODO: Implement this function");
[614]3446 }
3447
3448 private void mnuClose_Click(object sender, System.EventArgs e)
3449 {
3450 DialogResult dr = MessageBox.Show("Are you sure you want to close this schedule?", Application.ProductName, MessageBoxButtons.OKCancel);
3451 if (dr != DialogResult.OK)
3452 return;
3453
3454 this.Close();
3455 }
3456
3457 private void mnuViewPatientAppts_Click(object sender, System.EventArgs e)
3458 {
3459 ViewPatientAppointments();
3460 }
3461
3462 private void lstClip_DragEnter(object sender, System.Windows.Forms.DragEventArgs e)
3463 {
3464 bool b = e.Data.GetDataPresent(typeof(CGAppointment));
3465 if (b == true)
3466 {
3467 e.Effect = DragDropEffects.Move;
3468 }
3469 else
3470 {
3471 e.Effect = DragDropEffects.None;
3472 }
3473
3474 }
3475
3476 private void lstClip_DragDrop(object sender, System.Windows.Forms.DragEventArgs e)
3477 {
3478 try
3479 {
3480 CGAppointment a = (CGAppointment) e.Data.GetData(typeof(CGAppointment));
3481 if (m_ClipList.AppointmentTable.Contains((int) a.AppointmentKey))
3482 {
3483 return;
3484 }
[1186]3485
3486 if (a.RadiologyExamIEN.HasValue)
3487 {
3488 MessageBox.Show("Cannot move a radiology appointment to the clipboard");
3489 return;
3490 }
3491
[614]3492 m_ClipList.AddAppointment(a);
3493 lstClip.Items.Add(a);
3494 }
3495 catch(Exception ex)
3496 {
3497 Debug.Write(ex.Message);
3498 }
3499
3500 }
3501
3502 private void lstClip_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
3503 {
3504 m_bDragDropStart = false;
3505 }
3506
3507 private void lstClip_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e)
3508 {
3509 try
3510 {
3511 if ((m_bDragDropStart == false)&&(lstClip.SelectedIndex > -1))
3512 {
3513 CGAppointment a = (CGAppointment) lstClip.Items[lstClip.SelectedIndex];
3514 this.calendarGrid1.ApptDragSource = "list";
3515 DragDropEffects effect = DoDragDrop(a, DragDropEffects.Move);
3516 m_bDragDropStart = true;
3517 }
3518 }
3519 catch (Exception ex)
3520 {
3521 Debug.Write(ex.Message);
3522 }
3523 }
3524
3525 private void calendarGrid1_CGAppointmentAdded(object sender, IndianHealthService.ClinicalScheduling.CGAppointmentChangedArgs e)
3526 {
3527 try
3528 {
3529 bool bSlotsAvailable;
3530 bool bOverbook;
3531 bool bModSchedule;
3532 bool bModAppts;
3533
3534 if (this.EditAppointmentEnabled(e.Appointment.Resource) == false)
3535 return;
3536
3537 bModAppts = (bool) this.m_htChangeAppts[e.Resource.ToString()];
3538 if (bModAppts == false)
3539 return;
3540
[964]3541 // Added check for making Walk-ins/appts in the past. 9/28/2010 //smh
3542 if (e.StartTime < DateTime.Today.Date)
3543 {
3544 var result = MessageBox.Show("Are you sure you want to make an appointment in the past?", "Windows Scheduling", MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button2);
3545 if (result == DialogResult.No) return;
3546 }
3547
3548
[614]3549 bOverbook = (bool) this.m_htOverbook[e.Resource.ToString()];
3550 bModSchedule = (bool) this.m_htModifySchedule[e.Resource.ToString()];
[1106]3551 CGAvailability resultantAvail;
[614]3552
[1106]3553 bSlotsAvailable = (m_Document.SlotsAvailable(e.StartTime, e.EndTime, e.Resource, this.calendarGrid1.TimeScale, out resultantAvail) > 0);
3554
[614]3555 if (!((bSlotsAvailable) || (bModSchedule) || (bOverbook) ))
3556 {
3557 MessageBox.Show("There are no appointment slots available for the selected time.");
3558 return;
3559 }
3560
3561 /*
3562 * 7-19-05 Added overbook prompt
3563 */
3564 if (bSlotsAvailable == false)
3565 {
[620]3566 DialogResult dr = MessageBox.Show(this, "There are no slots available at the selected time. Do you want to overbook this appointment?", "Clinical Scheduling",MessageBoxButtons.YesNo);
[614]3567 if (dr != DialogResult.Yes)
3568 {
3569 return;
3570 }
3571 }
3572
3573 e.Appointment.StartTime = e.StartTime;
3574 e.Appointment.EndTime = e.EndTime;
3575 e.Appointment.Resource = e.Resource;
3576 e.Appointment.AccessTypeID = e.AccessTypeID;
3577 m_Document.CreateAppointment(e.Appointment);
3578 }
3579 catch (Exception ex)
3580 {
[620]3581 MessageBox.Show("Unable to add new appointment " + ex.Message, "Clinical Scheduling");
[614]3582 return;
3583 }
3584 try
3585 {
3586 RaiseRPMSEvent("BSDX SCHEDULE" , e.Resource);
3587 if (e.Resource != e.OldResource)
3588 RaiseRPMSEvent("BSDX SCHEDULE", e.OldResource);
3589 this.m_DocManager.UpdateViews(e.Resource, e.OldResource);
3590 }
3591 catch (Exception ex)
3592 {
3593 Debug.Write(ex.Message);
3594 }
3595 }
3596
3597 private void lstClip_SelectedIndexChanged(object sender, System.EventArgs e)
3598 {
3599
3600 }
3601
3602 private void mnuPrintClinicSchedules_Click(object sender, System.EventArgs e)
3603 {
3604 try
3605 {
3606 DSelectLetterClinics ds = new DSelectLetterClinics();
3607 ds.InitializePage(this.m_DocManager.GlobalDataSet, "Print Clinic Schedules");
3608 ds.SetupForReports();
3609 if (ds.ShowDialog(this) != DialogResult.OK)
3610 return;
3611
3612 //get the resource names and call the letter printer
3613
3614 string sClinics = ds.SelectedClinics;
3615 DateTime dtBegin = ds.BeginDate;
3616 DateTime dtEnd = ds.EndDate;
3617
3618 DPatientLetter dpl = new DPatientLetter();
3619 dpl.InitializeFormClinicSchedule(this.DocManager, sClinics, dtBegin, dtEnd);
3620 dpl.ShowDialog(this);
3621
3622 }
3623 catch(Exception ex)
3624 {
[620]3625 MessageBox.Show(this, ex.Message, "Clinical Scheduling", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
[614]3626 }
3627 }
3628
[788]3629 private void mnuPrintReminderLetters_Click(object sender, System.EventArgs e)
[614]3630 {
3631 try
3632 {
3633 DSelectLetterClinics ds = new DSelectLetterClinics();
3634 ds.InitializePage(this.m_DocManager.GlobalDataSet, "Print Reminder Letters");
3635 if (ds.ShowDialog(this) != DialogResult.OK)
3636 return;
3637
3638 //get the resource names and call the letter printer
3639
3640 string sClinics = ds.SelectedClinics;
3641 DateTime dtBegin = ds.BeginDate;
3642 DateTime dtEnd = ds.EndDate;
3643
3644 DPatientLetter dpl = new DPatientLetter();
[788]3645 dpl.InitializeFormPatientReminderLetters(this.DocManager, sClinics, dtBegin, dtEnd);
[614]3646 dpl.ShowDialog(this);
3647
3648 }
3649 catch(Exception ex)
3650 {
[620]3651 MessageBox.Show(this, ex.Message, "Clinical Scheduling", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
[614]3652 }
3653
3654 }
3655
3656 private void mnuPrintRebookLetters_Click(object sender, System.EventArgs e)
3657 {
3658 try
3659 {
3660 DSelectLetterClinics ds = new DSelectLetterClinics();
3661 ds.InitializePage(this.m_DocManager.GlobalDataSet, "Print Clinic Rebook Letters");
3662 if (ds.ShowDialog(this) != DialogResult.OK)
3663 return;
3664
[788]3665 //Call the letter printer
[614]3666 DPatientLetter dpl = new DPatientLetter();
[788]3667 dpl.InitializeFormRebookLetters(this.DocManager, ds.SelectedClinics, ds.BeginDate, ds.EndDate);
[614]3668 dpl.ShowDialog(this);
3669
3670 }
3671 catch(Exception ex)
3672 {
[620]3673 MessageBox.Show(this, ex.Message, "Clinical Scheduling", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
[614]3674 }
3675 }
3676
3677 private void mnuPrintPatientLetter_Click(object sender, System.EventArgs e)
3678 {
[772]3679 ViewPatientAppointments();
[614]3680 }
3681
3682 private void mnuRPMSDivision_Click(object sender, System.EventArgs e)
3683 {
3684 this.DocManager.ChangeDivision(this);
3685 }
3686
3687 private void CGView_CursorChanged(object sender, System.EventArgs e)
3688 {
3689
3690 }
3691
3692 private void mnuDisplayWalkIns_Click(object sender, System.EventArgs e)
3693 {
3694 calendarGrid1.DrawWalkIns = !(calendarGrid1.DrawWalkIns);
3695 mnuDisplayWalkIns.Checked = calendarGrid1.DrawWalkIns;
3696 calendarGrid1.SetOverlapTable();
3697 calendarGrid1.Refresh();
3698 }
3699
3700 private void mnuOpenMultipleSchedules_Click(object sender, System.EventArgs e)
3701 {
3702
3703 try
3704 {
3705 DSelectSchedules ds = new DSelectSchedules();
3706 ds.InitializePage(this.m_DocManager.GlobalDataSet, "Open Multiple Schedules");
3707 if (ds.ShowDialog(this) != DialogResult.OK)
3708 return;
3709
3710 //get the resource names and open schedules
3711
3712 ArrayList sResources = ds.SelectedClinics;
3713 if (ds.SingleWindow == true)
3714 {
3715 m_sDocName = (ds.GroupWindowName == "")?"Multiple Selected Schedules":ds.GroupWindowName;
3716 OpenSelectedSchedule( sResources, DateTime.Today);
3717 }
3718 else
3719 {
3720 foreach (string sResource in sResources)
3721 {
3722 ArrayList alSingle = new ArrayList(1);
3723 alSingle.Add(sResource);
3724 m_sDocName = sResource;
3725 OpenSelectedSchedule( alSingle, DateTime.Today);
3726 }
3727 }
3728 return;
3729
3730 }
3731 catch(Exception ex)
3732 {
[620]3733 MessageBox.Show(this, ex.Message, "Clinical Scheduling", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
[614]3734 }
3735
3736 }
3737
3738 private void ctxCalGridWalkin_Click(object sender, System.EventArgs e)
3739 {
3740 AppointmentAddWalkin();
3741 }
3742
3743 private void mnuWalkIn_Click(object sender, System.EventArgs e)
3744 {
3745 AppointmentAddWalkin();
3746 }
3747
3748 private void mnuPrintCancellationLetters_Click(object sender, System.EventArgs e)
3749 {
3750 try
3751 {
3752 DSelectLetterClinics ds = new DSelectLetterClinics();
3753 ds.InitializePage(this.m_DocManager.GlobalDataSet, "Print Clinic Cancellation Letters");
3754 if (ds.ShowDialog(this) != DialogResult.OK)
3755 return;
3756
3757 //get the resource names and call the letter printer
3758
3759 string sClinics = ds.SelectedClinics;
3760 DateTime dtBegin = ds.BeginDate;
3761 DateTime dtEnd = ds.EndDate;
3762
3763 DPatientLetter dpl = new DPatientLetter();
3764
[788]3765 dpl.InitializeFormCancellationLetters(this.DocManager, sClinics, dtBegin, dtEnd);
[614]3766 dpl.ShowDialog(this);
3767 }
3768 catch(Exception ex)
3769 {
[620]3770 MessageBox.Show(this, ex.Message, "Clinical Scheduling", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
[614]3771 }
3772 }
3773
[1111]3774 private void PrintRoutingSlip(CGAppointment appt)
[804]3775 {
[1112]3776 //get this appointment's order
3777 //Today's appointments
3778 var todaysAppts = (from lkappts in this.Document.Appointments.AppointmentTable.Values.Cast<CGAppointment>()
[1126]3779 where lkappts.StartTime > appt.StartTime.Date && lkappts.StartTime < appt.StartTime.AddDays(1).Date && lkappts.Resource == appt.Resource
[1112]3780 orderby lkappts.StartTime
3781 select lkappts).ToList();
3782
3783 //Find the order of the appointment
3784 int apptOrder = todaysAppts.FindIndex(eachappt => eachappt.StartTime == appt.StartTime && eachappt.PatientID == appt.PatientID);
3785
3786 //Index is zero based, so add 1
3787 apptOrder++;
3788
3789 //Send that to the routing slip as a parameter
[1111]3790 PrintDocument pd = new PrintDocument() { DocumentName = "Routing Slip for Appt " + appt.AppointmentKey };
[1112]3791 pd.PrintPage += (object s, System.Drawing.Printing.PrintPageEventArgs e) => CGDocumentManager.Current.PrintingObject.PrintRoutingSlip(appt, apptOrder, e);
[1111]3792 pd.Print();
[804]3793 }
3794
[1111]3795 private void PrintAppointmentSlip(CGAppointment appt)
3796 {
3797 PrintDocument pd = new PrintDocument() { DocumentName = "Appointment Slip for Appt " + appt.AppointmentKey }; //Autoinit for DocName
3798 pd.PrintPage += (object s, System.Drawing.Printing.PrintPageEventArgs e) => CGDocumentManager.Current.PrintingObject.PrintAppointmentSlip(appt, e);
3799 pd.Print();
3800 }
3801
[1066]3802
[1083]3803 /// <summary>
3804 /// Update Selection of date if user does not pick a date/time
3805 /// </summary>
3806 /// <param name="sender"></param>
3807 /// <param name="e"></param>
[1066]3808 private void dateTimePicker1_Leave(object sender, EventArgs e)
3809 {
3810 if (this.Document.SelectedDate != dateTimePicker1.Value.Date)
3811 RequestRefreshGrid();
3812 }
[614]3813
[1083]3814 /// <summary>
3815 /// Handle Selection of Date via mouse from datetimepicker dropdown
3816 /// </summary>
3817 /// <param name="sender"></param>
3818 /// <param name="e"></param>
[1066]3819 private void dateTimePicker1_CloseUp(object sender, EventArgs e)
3820 {
3821 if (this.Document.SelectedDate != dateTimePicker1.Value.Date)
3822 RequestRefreshGrid();
3823 }
[614]3824
[1083]3825 /// <summary>
3826 /// Handle Enter and Escape key on dateTimePicker
3827 /// </summary>
3828 /// <param name="sender"></param>
3829 /// <param name="e"></param>
[1066]3830 private void dateTimePicker1_KeyPress(object sender, KeyPressEventArgs e)
3831 {
3832 //if enter key is pressed:
3833 // Tell windows that we are handling this
3834 // Request a Refresh Grid if the date is different
3835 // Set-Focus to Calendar Grid
3836 if (e.KeyChar == (char)Keys.Enter)
3837 {
3838 e.Handled = true;
[614]3839
[1066]3840 if (this.Document.SelectedDate != dateTimePicker1.Value.Date)
3841 RequestRefreshGrid();
3842
3843 this.CGrid.Focus();
3844 }
[614]3845
[1066]3846 //if escape key is pressed:
3847 // Tell windows that we are handling this
3848 // Set-Focus to Calendar Grid
3849 if (e.KeyChar == (char)Keys.Escape)
3850 {
3851 e.Handled = true;
3852 this.CGrid.Focus();
3853 }
3854 }
[804]3855
[1127]3856 private void mnuRefresh_Click(object sender, EventArgs e)
3857 {
3858 ForceRefreshGrid();
3859 }
[804]3860
[1066]3861 #endregion events
3862
[1111]3863 /// <summary>
3864 /// Refresh grid if needed.
3865 /// </summary>
[1066]3866 void RequestRefreshGrid()
3867 {
[1070]3868 DateTime dDate = dateTimePicker1.Value.Date;
3869 // Change Date on Document
[1066]3870 this.Document.SelectedDate = dDate;
[1071]3871
3872 // Do we need to update?
3873 bool isRefreshNeeded = this.Document.IsRefreshNeeded();
3874
[1070]3875 //Splash when loading and change Cursor
[1071]3876 if (isRefreshNeeded)
3877 {
3878 this.Cursor = Cursors.WaitCursor;
3879 LoadSplash();
3880 this.Document.RefreshDocument();
3881 StopSplash();
3882 this.Cursor = Cursors.Default;
3883 }
[1070]3884
[1071]3885
[1066]3886 if (this.Document.Resources.Count == 1)
3887 {
3888 if (this.calendarGrid1.Columns > 1)
3889 {
3890 this.StartDate = this.Document.StartDate;
3891 }
3892 else
3893 {
3894 this.StartDate = this.Document.SelectedDate;
3895 }
3896 }
3897 else
3898 {
3899 this.StartDate = this.Document.SelectedDate;
3900 }
[1070]3901
3902 //Is this needed? -- Yes it is. There is a bug in the drawing code for the calendar
3903 //First time it draws, it draws appointments, but not availability slots
3904 //Second time it draws, it both appointments and availabilites
3905 //XXX: Need to investigate
[1066]3906 this.Document.UpdateAllViews();
3907 }
3908
[1127]3909 /// <summary>
3910 /// This forces a grid refresh.
3911 /// </summary>
3912 void ForceRefreshGrid()
3913 {
3914 if (this.Document.m_sResourcesArray.Count == 0) return;
3915 this.Cursor = Cursors.WaitCursor;
3916 LoadSplash();
[1128]3917 this.Document.RefreshSchedule();
[1127]3918 this.UpdateArrays();
3919 StopSplash();
3920 this.Cursor = Cursors.Default;
3921 }
3922
[1143]3923 //private delegate DialogResult dLoadingSplash(IWin32Window owner);
3924 string _tempStatusBartext;
[1070]3925
3926 /// <summary>
[1143]3927 /// Loads a splash that says "Loading" -- removed it april 13 2010
[1070]3928 /// </summary>
3929 private void LoadSplash()
3930 {
[1143]3931 _tempStatusBartext = this.statusBar1.Text;
3932 this.statusBar1.Text = "Refreshing Schedule...";
3933 //_loadingSplash = new LoadingSplash();
3934 //_loadingSplash.StartPosition = FormStartPosition.CenterScreen; //XXX: Don't like this, but will do for now.
3935 //_loadingSplash.UseWaitCursor = true; // tell user we are working
3936 //_loadingSplash.Show(this);
3937 //Thread threadSplash = new Thread(tstart);
3938 //threadSplash.IsBackground = true;
3939 //threadSplash.Name = "Loading Thread";
3940 //threadSplash.Start(this);
3941
3942 //Thread threadSplash = new Thread(new ThreadStart(() => _loadingSplash.ShowDialog())); // lambda
3943 //threadSplash.IsBackground = true; //expendable thread -- exit even if still running.
3944 //threadSplash.Name = "Loading Thread";
3945 //threadSplash.Start();
[1070]3946 }
3947
3948 private void StopSplash()
3949 {
[1143]3950 this.statusBar1.Text = _tempStatusBartext;
[1070]3951 }
3952
[1106]3953
[1118]3954 private void PrintClinicSchedule(DateTime dStart, DateTime dEnd)
3955 {
3956 DPatientLetter dpl = new DPatientLetter();
[1106]3957
[1118]3958 int[] resourceIENs = (from resource in CGDocumentManager.Current.GlobalDataSet.Tables["Resources"].AsEnumerable()
3959 join resource_name in m_alSelectedTreeResourceArray.Cast<string>() on resource.Field<string>("RESOURCE_NAME") equals resource_name
3960 select resource.Field<int>("RESOURCEID")
3961 ).ToArray<int>();
[1106]3962
[1118]3963 // + | is an oddity in the Mumps code which I haven't investigated yet.
3964 dpl.InitializeFormClinicSchedule(this.DocManager, string.Join("|", resourceIENs) + "|", dStart, dEnd);
3965 dpl.ShowDialog(this);
3966 }
[1106]3967
[1073]3968
[614]3969 }//End class
3970}
Note: See TracBrowser for help on using the repository browser.