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

Revision 2175, 13.9 KB checked in by paulf, 13 years ago (diff)

new hydra glass mods

  • 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
38//---------------------------------------------------------------------------------------~CScroll
39CScroll::~CScroll() {
40        CatOut();
41        if(hFont)
42                DeleteObject(hFont);
43}
44
45//---------------------------------------------------------------------------------------Init
46void CScroll::Init(HINSTANCE hinst, char *title) {
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_MAJOR_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
186        TempCat = (CAT *) malloc(MAXCAT * sizeof(CAT));
187        if(!TempCat)
188        {
189          CDebug::Log(DEBUG_MAJOR_ERROR, "Quake():  Could not allocate %d bytes for Temporary catalog.  Returning  error.\n",
190            MAXCAT*sizeof(CAT));
191          exit(-1);
192          return;
193        }
194       
195        if(jcat >= iMinCat)
196        {
197          CDebug::Log(DEBUG_MINOR_INFO,"Using Delete Method 2.  jcat/min/max/tc = %d/%d/%d/%u\n",
198                      jcat,iMinCat,iMaxCat,TempCat);
199          // copy from iMinCat through (jcat - 1)
200          nNumRecords = (jcat - 1) - iMinCat + 1;
201          memcpy(&TempCat[iTempCat], &Cat[iMinCat], nNumRecords * sizeof(CAT));
202          iTempCat += nNumRecords;
203
204          // copy from (jcat + 1) through (MAXCAT - 1)
205          nNumRecords = (MAXCAT - 1) - (jcat + 1) + 1;
206          memcpy(&TempCat[iTempCat], &Cat[jcat + 1], nNumRecords * sizeof(CAT));
207          iTempCat += nNumRecords;
208
209          // copy from 0 through iMaxCat
210          nNumRecords = iMaxCat - 0 + 1;
211          memcpy(&TempCat[iTempCat], &Cat[0], nNumRecords * sizeof(CAT));
212          iTempCat += nNumRecords;
213        }
214        else
215        {
216          CDebug::Log(DEBUG_MINOR_INFO,"Using Delete Method 3.  jcat/min/max/tc = %d/%d/%d/%u\n",
217                      jcat,iMinCat,iMaxCat,TempCat);
218          // copy from iMinCat through (MAXCAT - 1)
219          nNumRecords = (MAXCAT - 1) - iMinCat + 1;
220          memcpy(&TempCat[iTempCat], &Cat[iMinCat], nNumRecords * sizeof(CAT));
221          iTempCat += nNumRecords;
222
223          // copy from 0 through (jcat - 1)
224          nNumRecords = (jcat - 1) - 0 + 1;
225          memcpy(&TempCat[iTempCat], &Cat[0], nNumRecords * sizeof(CAT));
226          iTempCat += nNumRecords;
227
228         // copy from (jcat + 1) through iMaxCat
229          nNumRecords = iMaxCat - (jcat + 1) + 1;
230          memcpy(&TempCat[iTempCat], &Cat[jcat + 1], nNumRecords * sizeof(CAT));
231          iTempCat += nNumRecords;
232        }
233
234        // set nCat = (MAXCAT - 1)
235        nCat = MAXCAT - 1;
236        iCat = nCat - 1;
237        memcpy(Cat,TempCat,iTempCat * sizeof(CAT));
238        free(TempCat);  // DK 022603  Free temporary catalog memory allocated above
239        CDebug::Log(DEBUG_MINOR_INFO,"Copied %d records during deletion(%s)\n", iTempCat,ent);
240      }  // end else    (nCat >= MAXCAT)
241
242      CDebug::Log(DEBUG_MINOR_INFO,"End1: Deleting Quake nCat/iCat = %d/%d\n",
243                nCat,iCat);
244
245      sprintf(txt, "Origin %s deleted!\n", ent);
246      LogOrigin(-1,txt);
247      ScrollBar();
248      Refresh();
249
250      CDebug::Log(DEBUG_MINOR_INFO,"End2: Deleting Quake nCat/iCat = %d/%d\n",
251                nCat,iCat);
252
253      return;
254    }  // end for each quake in list
255
256    // Quake not found, issue an error message
257    CDebug::Log(DEBUG_MINOR_ERROR, "Got quake message for id(%s), but could "
258                                   "not find quake in Glint or in Cat list.\n", 
259                ent);
260    return;
261  }  // end if quake not found in Glint
262
263        CDate dt(org->dT);
264  char * sz0 = strchr(org->idOrigin, '0');
265  int iIDOrigin;
266  if(sz0)
267    iIDOrigin = atoi(sz0);
268  else
269    iIDOrigin = -1;
270
271        sprintf(txt, "%4d %s %9.4f %10.4f %6.2f%4d %4d %4.2f %5.2f %3d %5d", org->iOrigin,
272                dt.Date20().GetBuffer(), org->dLat, org->dLon, org->dZ,
273                org->nEq, org->nPh, org->dRms, org->dAff, (int)org->dGap, iIDOrigin);
274        i1 = nCat - MAXCAT;
275        if(i1 < 0)
276                i1 = 0;
277        iCat = -1;
278        for(i=i1; i<nCat; i++) {
279                jcat = i%MAXCAT;
280        //      TRACE("Cat[%d].iOrigin:%d org->iOrigin:%d\n", jcat, Cat[jcat].iOrigin, org->iOrigin);
281                if(Cat[jcat].iOrigin != org->iOrigin)
282                        continue;
283                strcpy(Cat[jcat].sCat, txt);
284                iCat = i;
285                break;
286        }
287        if(iCat < 0) {
288                iCat = nCat;
289                icat = nCat%MAXCAT;
290                Cat[icat].iOrigin = org->iOrigin;
291                strcpy(Cat[icat].idQuake, ent);
292                strcpy(Cat[icat].sCat, txt);
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.