source: trunk/src/seismic_processing/glass/src/modules/Catalog/CatalogScroll.cpp @ 3212

Revision 3212, 14.1 KB checked in by paulf, 12 years ago (diff)

sync from hydra_proj circa Oct 2007

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
Line 
1#include <windows.h>
2#include <stdio.h>
3#include "CatalogScroll.h"
4#include "IGlint.h"
5#include "CatalogMod.h"
6#include "date.h"
7#include "str.h"
8#include <Debug.h>
9extern "C" {
10#include "utility.h"
11}
12
13#define szORIGIN_LOGFILE_BASE_NAME "glass_origin_log.txt"
14
15extern CMod *pMod;
16
17
18static char szOriginLogfileName[256];
19
20//---------------------------------------------------------------------------------------CScroll
21CScroll::CScroll() {
22        hFont = 0;
23        hText = 18;
24        pGlint = 0;
25        nCat = 0;
26        iCat = -1;
27  memset(Cat,0,sizeof(Cat));
28
29  bLogOrigins = false;
30//      DebugOn();
31  iX = 0;
32  iY = 0;
33        nX = 800;
34        nY = 400;
35}
36
37//---------------------------------------------------------------------------------------~CScroll
38CScroll::~CScroll() {
39        CatOut();
40        if(hFont)
41                DeleteObject(hFont);
42}
43
44//---------------------------------------------------------------------------------------Init
45void CScroll::Init(HINSTANCE hinst, char *title) 
46{
47        iStyle |= WS_VSCROLL;
48        CWin::Init(hinst, title);
49        ScrollBar();
50        Refresh();
51}
52
53//---------------------------------------------------------------------------------------Refresh
54// Redraw map
55void CScroll::Refresh() {
56        InvalidateRect(hWnd, NULL, true);
57        UpdateWindow(hWnd);
58}
59
60//---------------------------------------------------------------------------------------Size
61void CScroll::Size(int w, int h) {
62        nScr = h / hText - 2;
63        ScrollBar();
64        Refresh();
65}
66
67
68//---------------------------------------------------------------------------------------Draw
69void CScroll::Draw(HDC hdc) {
70        CAT *cat;
71        char txt[128];
72        RECT r;
73        int h;
74
75        if(!hFont) {
76                hFont = CreateFont(18, 0, 0, 0, FW_NORMAL,
77                        false, false, false, OEM_CHARSET,
78                        OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,
79                        FIXED_PITCH, NULL);
80                if(!hFont)
81                        return;
82                SelectObject(hdc, hFont);
83        }
84
85        SelectObject(hdc, hFont);
86        GetClientRect(hWnd, &r);
87
88        int ipos = GetScrollPos(hWnd, SB_VERT);
89  int i1, i2;
90
91        i1 = nCat - MAXCAT;
92        if(i1 < 0)
93                i1 = 0;
94        i1 += ipos;
95        i2 = i1 + nScr - 1;
96        if(i2 >= nCat) // DK 022504  wrapped catalog should be in the range [nCat-MAXCAT, nCat-1]
97                i2 = nCat-1;
98        int icat;
99        h = 10;
100//      sprintf(txt, "%4d %s %9.4f %10.4f %6.2f%4d%6.2f", org->iOrigin,
101//              dt->Date20().GetBuffer(), org->dLat, org->dLon, org->dZ,
102//              org->nEq, org->dRms);
103        strncpy(txt, " Seq Origin Time           Latitude  Longitude  Depth Neq  Nph  RMS  Aff  Gap idOrg", sizeof(txt)-1);
104        txt[sizeof(txt)-1] = 0x00;
105        TextOut(hdc, 10, h, txt, strlen(txt));
106        h += hText;
107        for(icat=i1; icat<=i2; icat++) {
108                cat = &Cat[icat%MAXCAT];
109                sprintf(txt, "%s", cat->sCat);
110                if(icat == iCat) {
111                        SetTextColor(hdc, RGB(255, 0, 0));
112                        TextOut(hdc, 10, h, txt, strlen(txt));
113                        SetTextColor(hdc, RGB(0, 0, 0));
114                } else {
115                        TextOut(hdc, 10, h, txt, strlen(txt));
116                }
117                h += hText;
118        }
119}
120
121//---------------------------------------------------------------------------------------Quake
122void CScroll::Quake(char *ent) {
123        int icat;
124        int jcat;
125        char txt[256];
126        int i1,i2;
127        int i;
128
129        if(!pGlint)
130                return;
131        ORIGIN *org = pGlint->getOrigin(ent);
132
133  // DK CLEANUP add NULL origin check!!!
134  if(!org)
135  {
136    // Must be a delete message
137
138    // Delete the quake from the list!  Catalog should currently range from nCat-MAXCAT to nCat-1
139    i1 = nCat - MAXCAT;
140    i2 = nCat - 1; 
141
142    if(i1 < 0)
143      i1 = 0;
144    iCat = -1;
145
146    CDebug::Log(DEBUG_MINOR_INFO,"Deleting Quake nCat/MC/i1/i2 = %d/%d/%d/%d\n",
147                nCat,MAXCAT,i1,i2);
148
149    for(i=i1; i<nCat; i++) 
150    {
151      jcat = i%MAXCAT;
152      //        TRACE("Cat[%d].iOrigin:%d org->iOrigin:%d\n", jcat, Cat[jcat].iOrigin, org->iOrigin);
153      if(strcmp(Cat[jcat].idQuake, ent))
154        continue;
155     
156      // We found the deleted quake in the list
157      // Delete it from the list
158
159      /* There are two cases here:
160         1) The index of the start of the catalog is less than (or equal to)
161             the index of the end of the catalog.  This is the simple case,
162             and we just copy every element after the one to-be-deleted,
163             forward one index in the  array.
164         2) The index of the start of the catalog is after the index of the
165             end of the catalog.  This is the complex case.  We have to copy
166             all of the elements (except the deleted one), maintain the order,
167             handle wrapping around the end of the array, etc.
168       **************************************************************************/
169      //if(nCat < MAXCAT)               // DK 022304
170      if((i1%MAXCAT) <= (i2%MAXCAT))   // DK 022304
171      {
172        CDebug::Log(DEBUG_MINOR_INFO,"Using Delete Method 1.  jcat/nCat = %d/%d\n",
173                    jcat,nCat);
174        memmove(&Cat[jcat], &Cat[jcat+1], (nCat-jcat-1) * sizeof(Cat[jcat]));
175        nCat--;
176        iCat = nCat-1;
177      }
178      else
179      {
180        int iMaxCat = i2%MAXCAT;
181        int iMinCat = i1%MAXCAT;
182        int iTempCat = 0;
183        int nNumRecords;
184        CAT     * TempCat;
185        CDebug::Log(DEBUG_MINOR_INFO,"Using Delete Method 2.  jcat/nCat = %d/%d\n",
186                    jcat,nCat);
187
188        TempCat = (CAT *) malloc(MAXCAT * sizeof(CAT));
189        if(!TempCat)
190        {
191          CDebug::Log(DEBUG_MAJOR_ERROR, "Quake():  Could not allocate %d bytes for Temporary catalog.  Returning  error.\n",
192            MAXCAT*sizeof(CAT));
193          exit(-1);
194          return;
195        }
196       
197        if(jcat >= iMinCat)
198        {
199          CDebug::Log(DEBUG_MINOR_INFO,"Using Delete Method 2.  jcat/min/max/tc = %d/%d/%d/%u\n",
200                      jcat,iMinCat,iMaxCat,TempCat);
201          // copy from iMinCat through (jcat - 1)
202          nNumRecords = (jcat - 1) - iMinCat + 1;
203          memcpy(&TempCat[iTempCat], &Cat[iMinCat], nNumRecords * sizeof(CAT));
204          iTempCat += nNumRecords;
205
206          // copy from (jcat + 1) through (MAXCAT - 1)
207          nNumRecords = (MAXCAT - 1) - (jcat + 1) + 1;
208          memcpy(&TempCat[iTempCat], &Cat[jcat + 1], nNumRecords * sizeof(CAT));
209          iTempCat += nNumRecords;
210
211          // copy from 0 through iMaxCat
212          nNumRecords = iMaxCat - 0 + 1;
213          memcpy(&TempCat[iTempCat], &Cat[0], nNumRecords * sizeof(CAT));
214          iTempCat += nNumRecords;
215        }
216        else
217        {
218          CDebug::Log(DEBUG_MINOR_INFO,"Using Delete Method 3.  jcat/min/max/tc = %d/%d/%d/%u\n",
219                      jcat,iMinCat,iMaxCat,TempCat);
220          // copy from iMinCat through (MAXCAT - 1)
221          nNumRecords = (MAXCAT - 1) - iMinCat + 1;
222          memcpy(&TempCat[iTempCat], &Cat[iMinCat], nNumRecords * sizeof(CAT));
223          iTempCat += nNumRecords;
224
225          // copy from 0 through (jcat - 1)
226          nNumRecords = (jcat - 1) - 0 + 1;
227          memcpy(&TempCat[iTempCat], &Cat[0], nNumRecords * sizeof(CAT));
228          iTempCat += nNumRecords;
229
230         // copy from (jcat + 1) through iMaxCat
231          nNumRecords = iMaxCat - (jcat + 1) + 1;
232          memcpy(&TempCat[iTempCat], &Cat[jcat + 1], nNumRecords * sizeof(CAT));
233          iTempCat += nNumRecords;
234        }
235
236        // set nCat = (MAXCAT - 1)
237        nCat = MAXCAT - 1;
238        iCat = nCat - 1;
239        memcpy(Cat,TempCat,iTempCat * sizeof(CAT));
240        free(TempCat);  // DK 022603  Free temporary catalog memory allocated above
241        CDebug::Log(DEBUG_MINOR_INFO,"Copied %d records during deletion(%s)\n", iTempCat,ent);
242      }  // end else    (nCat >= MAXCAT)
243
244      sprintf(txt, "Origin %s deleted!\n", ent);
245      LogOrigin(-1,txt);
246      ScrollBar();
247      Refresh();
248
249      return;
250    }  // end for each quake in list
251
252    // Quake not found, issue an error message
253    CDebug::Log(DEBUG_MINOR_ERROR, "Got quake message for id(%s), but could "
254                                   "not find quake in Glint or in Cat list.\n", 
255                ent);
256    return;
257  }  // end if quake not found in Glint
258
259        CDate dt(org->dT);
260  char * sz0 = strchr(org->idOrigin, '0');
261  int iIDOrigin;
262  if(sz0)
263    iIDOrigin = atoi(sz0);
264  else
265    iIDOrigin = -1;
266
267        _snprintf(txt, sizeof(txt)-1, "%4d %s %9.4f %10.4f %6.2f%4d %4d %4.2f %5.2f %3d %5d", org->iOrigin,
268                dt.Date20().GetBuffer(), org->dLat, org->dLon, org->dZ,
269                org->nEq, org->nPh, org->dRms, org->dAff, (int)org->dGap, iIDOrigin);
270  txt[sizeof(txt)-1] = 0x00;
271        i1 = nCat - MAXCAT;
272        if(i1 < 0)
273                i1 = 0;
274        iCat = -1;
275        for(i=i1; i<nCat; i++) {
276                jcat = i%MAXCAT;
277        //      TRACE("Cat[%d].iOrigin:%d org->iOrigin:%d\n", jcat, Cat[jcat].iOrigin, org->iOrigin);
278                if(Cat[jcat].iOrigin != org->iOrigin)
279                        continue;
280                strncpy(Cat[jcat].sCat, txt, sizeof(Cat[jcat].sCat)-1);
281    Cat[jcat].sCat[sizeof(Cat[jcat].sCat)-1] = 0x00;
282                iCat = i;
283                break;
284        }
285        if(iCat < 0) {
286                iCat = nCat;
287                icat = nCat%MAXCAT;
288                Cat[icat].iOrigin = org->iOrigin;
289                strncpy(Cat[icat].idQuake, ent, sizeof(Cat[icat].idQuake)-1);
290    Cat[icat].idQuake[sizeof(Cat[icat].idQuake)-1] = 0x00;
291                strncpy(Cat[icat].sCat, txt, sizeof(Cat[icat].sCat)-1);
292    Cat[icat].sCat[sizeof(Cat[icat].sCat)-1] = 0x00;
293                nCat++;
294        }
295  LogOrigin(iCat,txt);
296        ScrollBar();
297        Refresh();
298}
299
300//---------------------------------------------------------------------------------------ScrollBar
301// Calculate and instantiate appropriate scroll bar parameters
302void CScroll::ScrollBar() 
303{
304  int nscr = nCat;
305
306  int ipos = GetScrollPos(hWnd, SB_VERT);
307 
308  if(nscr > MAXCAT)
309    nscr = MAXCAT;
310  int iscr = nscr - nScr;
311  if(iscr <= 0) {
312    SetScrollRange(hWnd, SB_VERT, 0, 100, FALSE);
313    SetScrollPos(hWnd, SB_VERT, 0, TRUE);
314    ShowScrollBar(hWnd, SB_VERT, FALSE);
315  } 
316  else 
317  {
318    int i1;
319    if(nCat < MAXCAT)
320      i1 = 0;
321    else
322      i1 = nCat - MAXCAT;
323   
324    // ipos  - the current position of the scroll bar
325    // nscr  - the number of quakes in the display list
326    // nScr  - the number of quakes that will fit on the screen
327    // iscr  - the number of scroll positions (list size - screen size)
328    int iMaxQuake = nCat - (iscr - ipos);
329    int iMinQuake = iMaxQuake - (nScr -1);
330    if(iCat < iMinQuake || iCat > iMaxQuake)
331    {
332      // change the scroll position so that the selected quake
333      // will be on the screen.
334      ipos = iscr-(nCat-(nScr/2)-iCat);
335
336    }
337    // else we're already set
338
339    if(ipos < 0) ipos = 0;
340    else if(ipos > iscr) ipos = iscr;
341    SetScrollRange(hWnd, SB_VERT, 0, iscr, FALSE);
342    SetScrollPos(hWnd, SB_VERT, ipos, TRUE);
343    ShowScrollBar(hWnd, SB_VERT, TRUE);
344  }
345}  // end CScroll::ScrollBar()
346
347//---------------------------------------------------------------------------------------VScroll
348void CScroll::VScroll(int code, int pos) {
349//      TRACE("Scroll %d %d\n", code, pos);
350        int ipos = GetScrollPos(hWnd, SB_VERT);
351        switch(code) {
352        case SB_LINEUP:
353                ipos--;
354                break;
355        case SB_LINEDOWN:
356                ipos++;
357                break;
358        case SB_PAGEUP:
359                ipos-=5;
360                break;
361        case SB_PAGEDOWN:
362                ipos+=5;
363                break;
364        case SB_THUMBPOSITION:
365                ipos = pos;
366                break;
367        }
368        if(ipos < 0)
369                ipos = 0;
370        SetScrollPos(hWnd, SB_VERT, ipos, TRUE);
371        Refresh();
372}
373
374//---------------------------------------------------------------------------------------LeftDown
375void CScroll::LeftDown(int x, int y) {
376        int i1 = nCat - MAXCAT;
377        if(i1 < 0)
378                i1 = 0;
379        int ipos = GetScrollPos(hWnd, SB_VERT);
380        int icat = ipos + i1 + (y - 10)/hText - 1;
381  CDebug::Log(DEBUG_MINOR_INFO,"iCat = %d\n", icat);
382        if(icat < i1)
383                return;
384        if(icat >= nCat)
385                return;
386
387        IMessage *m = pMod->CreateMessage("Grok");
388        m->setStr("Quake", Cat[icat%MAXCAT].idQuake);  // DK added 061903
389        pMod->Broadcast(m);
390        m->Release();
391}
392
393//---------------------------------------------------------------------------------------Pau
394// Called before SIAM process termination -- dump catalog to dist (catalog.txt)
395void CScroll::CatOut() 
396{
397        FILE *f;
398
399  char szCatalogFileName[256];
400  char * szEW_LOG;
401
402  // set the full name of the catalog file
403  szEW_LOG = getenv("EW_LOG");
404  if(!szEW_LOG)
405    szEW_LOG = "";
406
407  _snprintf(szCatalogFileName, sizeof(szCatalogFileName), 
408            "%s%s", szEW_LOG, "catalog.txt");
409  szCatalogFileName[sizeof(szCatalogFileName)-1] = 0x00;
410
411
412        if(!(f=fopen(szCatalogFileName, "a")))
413  {
414
415    CDebug::Log(DEBUG_MINOR_ERROR,"CScroll::CatOut()  ERROR:  Could not open catalog file (%s) to dump catalog.\n",
416                szCatalogFileName);
417                return;
418  }
419
420        CAT *cat;
421        int i2 = nCat-1;  // DK 022504  wrapped catalog should be in the range [nCat-MAXCAT, nCat-1]
422        int i1 = nCat - MAXCAT;
423        if(i1 < 0)
424                i1 = 0;
425        int icat;
426  time_t tNow;
427  time(&tNow);
428        fprintf(f, "***********************************************\n"
429             "*  CATALOG %35s"
430             "***********************************************\n",
431          ctime(&tNow));
432        for(icat=i1; icat<=i2; icat++) {
433                cat = &Cat[icat%MAXCAT];
434                fprintf(f, "%s\n", cat->sCat);
435        }
436        fclose(f);
437  f=NULL;
438}
439
440
441/**************************************************
442    CScroll::SetOriginLogging(int bLog)
443
444
445     params:
446      bLog - flag indicating whether or not origins should
447             be logged to disk.
448
449     return value:
450         1 - disk logging enabled
451         0 - disk logging disabled
452 ***************************************************/
453int CScroll::SetOriginLogging(int bLog) 
454{
455  FILE * f;
456
457  this->bLogOrigins = false;
458
459  if(bLog)
460  {
461    char * szEW_LOG = getenv("EW_LOG");
462    if(!szEW_LOG)
463      szEW_LOG = "";
464    _snprintf(szOriginLogfileName, sizeof(szOriginLogfileName), 
465              "%s%s", szEW_LOG, szORIGIN_LOGFILE_BASE_NAME);
466    szOriginLogfileName[sizeof(szOriginLogfileName)-1] = 0x00;
467
468    if(f = fopen(szOriginLogfileName, "w"))
469    {
470      time_t tNow;
471      time(&tNow);
472      fprintf(f,"\n\n"
473                "########################################\n"
474                "### STARTING AT %s"
475                "########################################\n\n",
476              ctime(&tNow));
477      fclose(f);
478      f = NULL;
479      this->bLogOrigins = true;
480    }
481    else
482    {
483      CDebug::Log(DEBUG_MINOR_ERROR, 
484                  "CScroll:SetOriginLogging(): ERROR: Unable to open origins log file (%s).\n",
485                  szOriginLogfileName);
486    }
487  }
488  return(this->bLogOrigins);
489}
490
491
492int  CScroll::LogOrigin(int iCat, char * txt)
493{
494  int rc = false;
495  FILE * f;
496  if(bLogOrigins)
497  {
498    if(f = fopen(szOriginLogfileName, "a"))
499    {
500      fprintf(f, "%d %s\n", iCat, txt);
501      fclose(f);
502      f = NULL;
503      rc = true;
504    }
505    else
506    {
507      CDebug::Log(DEBUG_MINOR_ERROR, "CScroll:LogOrigin(): ERROR: Unable to open origins log file (%s).\n",
508                  szOriginLogfileName);
509    }
510  }
511
512  return(rc);
513}  // end CScroll::LogOrigin()
Note: See TracBrowser for help on using the repository browser.