a99  V32.6
allegro Windows Hauptprogramm
 Alle Klassen Dateien Funktionen Variablen Typdefinitionen Aufzählungen Aufzählungswerte Makrodefinitionen
wkv.cpp
gehe zur Dokumentation dieser Datei
1 // wkv.cpp : Kurzlistenfenster f. Erg:Mengen (Kurzliste) und ViewListen
2 // 1998/2012
3 // $$980124 NEU : docT==2 .ALD
4 // Copyright 2011 Universitätsbibliothek Braunschweig, more see bottom
5 
6 // docT>2: View
7 
8 // Oeffnen des Fensters: s. DoModal(...)
9 
10 #include "stdafx.h"
11 #include "program.h"
12 #include "exet.hpp"
13 #include "ca99.h"
14 #include "a99.h"
15 #include "wkv.h"
16 #include "getl.h"
17 #include "winx.h"
18 
19 #ifdef _DEBUG
20 #define new DEBUG_NEW
21 #undef THIS_FILE
22 static char THIS_FILE[] = __FILE__;
23 #endif
24 
25 /////////////////////////////////////////////////////////////////////////////
26 // Wkv dialog
27 
28 extern EXET *Dsp;
29 extern char Bpos[]; // a99.cpp
30 extern a99 *dlg; // main dialog
31 // extern int dlg->xcode(char *, char *,bool md=0);
32 extern char viwN[]; // name of viewlist
33 
34 int dct; // delete counter
35 
36 // Konstruktor
37 
38 Wkv::Wkv(CWnd* pParent)
39  : CDialog(Wkv::IDD, pParent)
40 {
41  //{{AFX_DATA_INIT(Brief)
42  //}}AFX_DATA_INIT
43 
44 }
45 
46 
47 
49 {
50 // Opening the window
51 // Vorbereitungen vor dem ersten Oeffnen
52  int i;
53  extern int smod;
54  extern int spos;
55  extern int smax;
56  extern WINDOWPLACEMENT brplace;
57  extern CFont *bFont;
58 
60 
61  if(bFont)
62  {
63 // int h;
64 // extern LOGFONT lplf;
65 // h=lplf.lfHeight;
66 // lplf.lfHeight=0.9*h;
67 // lplf.lfWidth=6;
68 // bFont->CreateFontIndirect(&lplf);
69  m_brief.SetFont(bFont);
70  m_brset.SetFont(bFont);
71  m_title.SetFont(bFont);
72 // lplf.lfHeight=h;
73  }
74  if(brplace.length) { SetWindowPlacement(&brplace); Size(); }
75  else {
76 
77  GetWindowPlacement(&brplace);
78 // MoveWindow(150, 200, 625, 350);
79  }
80  foco=0;
81  if(direct) m_direct.SetCheck(1);
82  m_direct.SetWindowText(uif[331]);
83 
84 if(!resF) fseek(tabF,-9L,1);
85  // sonst wird an tabF hinten 0 angehaengt! (warum??)
86 
87  if(resF)
88  {
89  char *sp; sp=strchr(sr,':'); if(sp) ++sp; else sp=sr;
90  if(docT<3) sprintf(Aerror,"SET %s",sp);
91  else sprintf(Aerror,"%s %s",uif[366],viwN); // viwN (Dateiname) statt sr (1.Zeile)
92  i=strlen(Aerror); while(i<77) Aerror[i++]=' '; Aerror[i]=0;
93  if(docT>2) Bank->E3Coding((CHAR *)Aerror,0,0);
94  char *u; u=Aerror; if(docT>2) { if(*uif[7]) u=uif[7]; } else { if(*uif[2]) u=uif[2]; }
95  m_brset.SetWindowText(u); // res set name
96  }
97  if(resT)
98  {
99  if(*uif[2]) m_brset.SetWindowText(uif[2]); else m_brset.SetWindowText(Aerror); // res set name
100  SetPos(spos);
101  }
102  else
103  {
104  if(docT<3) { m_del.EnableWindow(FALSE);
105  if(*uif[5]) m_brset.SetWindowText(uif[5]); else m_brset.SetWindowText("Offline List");
106  if(*uif[6]) m_title.SetWindowText(uif[6]);
107  }
108  else
109  { char *u; if(*uif[9]) u=uif[9]; else if(size>20) u=uif[358]; else u=" ";
110  m_title.SetWindowText(u);
111  if(*uif[8]) m_brset.SetWindowText(uif[8]);
112  }
113 extern int vmod;
114  if(!vmod)
115  {
116  m_remove.EnableWindow(FALSE);
117  m_del.EnableWindow(FALSE);
118  }
119  m_resort.EnableWindow(FALSE);
120  m_ascdesc.EnableWindow(FALSE);
121  }
122  sprintf(Aerror,"%d",size);
123  m_size.SetWindowText(Aerror);
124  m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
125  SetIcon(m_hIcon, FALSE); // Set small icon
126 
127  FillList(cp);
128 
129  if(!resF) { if(*uif[4]) SetWindowText(uif[4]); else SetWindowText(uif[355]); }
130  else if(docT<3) { if(*uif[1]) SetWindowText(uif[1]);else SetWindowText(uif[356]); }
131  else { if(*uif[7]) SetWindowText(uif[7]); else SetWindowText(uif[366]); }
132 
133  m_brief.SetFocus();
134 
135  m_forward.SetWindowText(uif[497]); // weiter
136  m_backward.SetWindowText(uif[498]);// zurueck
137  m_top.SetWindowText(uif[408]); // Top
138  m_bot.SetWindowText(uif[409]); // Bottom
139  m_del.SetWindowText(uif[499]); // Del/Act
140  m_remove.SetWindowText(uif[407]); // Del/Act
141  m_ascdesc.SetWindowText(uif[247]);
142  m_fnd.SetWindowText("#Nr/Find");
143  if(smod==1) m_ad.SetWindowText(uif[249]);
144  else if(!smod) m_ad.SetWindowText(uif[248]);
145  else m_ad.SetWindowText(" ");
146  sprintf(Aerror,"<%d",smax+1); m_smax.SetWindowText(Aerror); *Aerror=0;
147 // if(size>smax) m_resort.EnableWindow(FALSE);
148  return TRUE; // return TRUE unless you set the focus to a control
149  // EXCEPTION: OCX Property Pages should return FALSE
150 } // Ende OnInitDialog()
151 
152 
153 
154 int Wkv::Srch(char *s,int po,int ud)
155  {
156  // view: suche s in den View-Zeilen
157  // from position po, ud=0/1 = down/up
158  int i=po; char z1[256], z2[512];
159  char t[64]; char u; char *v;
160 if(!resF) return -1;
161  if(*s=='^') u=1; else u=0; // ^xyz : suche xyz am Zeilenanfang
162  strcpy(z1,s+u);
163  Bank->E3Coding((CHAR *)z1,0,1); // ANSI->ASCII
164  dlg->xcode(t,z1,0);
165 // MessageBox(t,s);
166  if(ud) --po;
167  if(docT>2) fseek(resF,(long)((po)*docT),0);
168  else fseek(resF,(long)(po+1)*4L,0);
169  CWaitCursor cc; // Sanduhr setzen
170  while(1)
171  {
172  if(ud) { i=--po; if(po<0) return -1;
173  if(docT>2) fseek(resF,(long)(po*docT),0);
174  else fseek(resF,(long)(po+1)*4L,0);
175  }
176  if(docT>2) { if(!fgets(z1,255,resF)) break; } // View: read line
177  else if (!GetLine((CHAR *)z1,po)) break; // res.set: get STL line
178 extern int spos;
179  v=z1;
180  if(docT<3){ v=strchr(v,':')+1; while(*v==' ') ++v; if(u) v+=spos; }
181  dlg->xcode(z2,v,0);
182 // MessageBox(v,t); //test
183  if(docT>2) { v=strchr(z2,'|'); if(v) strcpy(z2,v+1); }
184  v=z2;
185  if(docT>2) // Zeilenanfang bereinigen:
186  if(*v==' ') ++v;
187  if(!u) { if(strstr(v,t)) return cp=i-1; }
188  else { if(!strncmp(v,t,strlen(t))) return cp=i-1; }
189  ++i;
190  }
191  return -1;
192 } // ENDE Srch()
193 
194 
195 char kl[270];
196 
197 int Wkv::GetLine(CHAR *kr, int k)
198 {
199  // get next line for listbox, k=line count 1st line
200  // pointer in file is already set! return 0 at end of file, 1 else
201  CHAR *a, *b;
202  int r1, r2, r3, r4, h1, h2;
203 
204  int flg;
205  long d;
206  long po, pn; // pos old and new
207  int m, l, c;
208 
209  // Welche Quelle?
210  if(docT<3)
211  {
212  if(resT) // Erg.Menge
213  {
214  flg=4;
215  r1=fgetc(resF);
216  if(r1==EOF) return 0; // End of res set reached
217  if(r1&128) flg=6;
218  r1=r1&127;
219  r2=fgetc(resF);r3=fgetc(resF);r4=fgetc(resF);
220  if(r4==EOF) return 0; // End of res set reached
221  po=16777216L*(long)r1+65536L*(long)r2+256L*(long)r3+(long)r4;
222  }
223  else // Offline-Datei
224  {
225  r1=fgetc(tabF);
226  if(r1==EOF) return 0;
227  r2=fgetc(tabF);r3=fgetc(tabF);r4=fgetc(tabF);
228  po=16777216L*(long)r1+65536L*(long)r2+256L*(long)r3+(long)r4;
229  flg=fgetc(tabF);
230  r1=fgetc(tabF);r2=fgetc(tabF);r3=fgetc(tabF);r4=fgetc(tabF);
231  if(r4==EOF) return 0;
232  pn=16777216L*(long)r1+65536L*(long)r2+256L*(long)r3+(long)r4;
233 // po==2L $$980125 NEW pos. 2L heisst: Neusatz
234  if(po==2L) d=pn; else d=po;
235  recF=docF;
236 // where's the rec?
237  if(flg==2) ; // if flag==1 then new file
238  else if(flg&1) { d=pn; recF=newF; } // new file
239  else if((flg&16) || (flg&4)) { d=po; recF=newF; } // new file
240  fseek(recF,d,0);
241  m=0;
242  }
243  }
244  else // docT>2 (Laenge der ViewZeilen!) : ViewList
245  {
246  ;
247  }
248 
249  if(docT<3)
250  if(flg&4 && Bank)
251  {
252  sprintf((char *)kr,"%4d: ",++k);
253  Bank->InSTL((RECNR)po,(CHAR *)kl+1,0);
254 // if(k>28) { sprintf(Aerror,"k=%d, po=%ld, flg=%d, kl=%s",k,po,flg,kl+1); MessageBox(Aerror); }
255  m=Bank->stll+1; *kl=1;
256  }
257  else
258  {
259  sprintf((char *)kr,"%4d. ",++k);
260  if(docT!=1)
261  {
262  *kl=fgetc(recF);
263  if(docT==2 && flg!=1)
264  { r1=fgetc(recF); r2=fgetc(recF); r3=fgetc(recF); r4=fgetc(recF);
265  po=16777216L*(long)r1+65536L*(long)r2+256L*(long)r3+(long)r4;
266  }
267  if(*Bpos) // $$980128 NEU
268  {
269  long Pos=ftell(recF);
270  while(1)
271  {
272  h1=fgetc(recF); h2=fgetc(recF);
273  if(h1==13 && h2==10) { fseek(recF,Pos,0); return 0; }
274  if(h1==Bpos[1] && (h2==Bpos[2] || !Bpos[2]))
275  { int j=3;
276  while(Bpos[j] && Bpos[j]==fgetc(recF)) ++j;
277  if(!Bpos[j]) { fseek(recF,(long)-j,1); break; }
278  }
279  while(fgetc(recF)>0); // go to end of field
280  }
281  }
282  if(shft)
283  { h1=0; while(h1++<shft)
284  { while(fgetc(recF));
285  if((h2=fgetc(recF))==13) { fseek(recF,d,0); break; } // too short
286  if(h1==shft) ungetc(h2,recF);
287  }
288  }
289  fgets(kl+1,100,recF);
290  m=100;
291  }
292  else while(m<100) { c=fgetc(recF); if(c==EOF) break;
293  kl[m++]=c;
294  if(c==13)
295  {
296  --m; c=fgetc(recF);
297  if(c==10)
298  {
299  kl[m]=' ';
300  c=fgetc(recF);
301  if(c==13) break;
302  else if(c=='#') kl[m++]=' '; else kl[m]=c;
303  }
304  else kl[m++]=c;
305  }
306  }
307  }
308  else
309  { if(fgets(kl,255,resF)==NULL) return 0;
310  m=docT-2;
311  }
312  if(docT!=3) { if(m>254) m=254; }
313  kl[m]=0;
314 
315  if(docT<3) // result set
316 {
317  b=(CHAR *)kr+6; a=(CHAR *)kl+1; l=0;
318  if(docT==2 && flg!=1) { sprintf((char *)b,"[%ld] ",po); b+=strlen(b)-1; }
319  if((flg&2) || *kl==9) { sprintf((char *)b,"DEL "); b+=5; }
320  if(flg&4 && flg&1) { sprintf((char *)b,"EDT "); b+=5; }
321  if(docT==2 && *kl==8) { sprintf((char *)b,"LOCK "); b+=5; }
322 
323  if(flg&4) strcpy(b,a);
324  else
325  { while(l++<m)
326  { if(*a<14)
327  { if(!*a) { *b++=' '; *b='#'; } else if(*a==13) break; else *b='*'; }
328  else *b=*a;
329  ++a; ++b;
330  }
331  *b=0;
332  }
333 } // view:
334 else {
335  strcpy((char *)kr," ");
336  if(*kl & 128) *kr='X';
337  a=(CHAR *)strchr(kl,'|'); if(a) ++a; else { a=(CHAR *)kl; *a=127&*a; }
338  strcpy((char *)kr+2,(char *)a);
339 // strcpy((char *)kr,(char *)a);
340 extern char cmod;
341  if(cmod=='1') if(docT<3) Bank->E3Coding((CHAR *)kr,0,1); // ANSI->ASCII
342  else Dsp->E3Coding((CHAR *)kr,0,1);
343  }
344  return 1;
345 } // ENDE GetLine(
346 
347 
348 int Wkv::FillList(int n)
349 {
350  // fill list box from text file and/or database
351  // pointer in file is already set!
352  extern char fomd;
353 
354  int r1, h1, h2;
355  int i=0;
356  int k;
357 // if(!resF) if(n>5) n-=5;
358  if(n<0) n=0;
359 
360 // what's the number of lines per box?
361  nli=31-m_brief.GetItemHeight(0);
362 
363  k=n;
364  if(docT<3)
365  {
366  if(!resF)
367  {
368  r1=fgetc(tabF); // Am ende angelangt? zurueck zum Anfang
369  if(r1==-1) fseek(tabF,0L,0);
370  else ungetc(r1,tabF);
371  }
372  if(resF)
373  if(!resT) { // if(!n) fseek(resF,(long)(k)*2L,0);
374  h1=fgetc(resF); h2=fgetc(resF);
375  k=h1*256+h2;
376  if(k<0) return 0; // EOF
377  fseek(tabF,(long)k*9L,0);
378  }
379  else {
380  ; // if(!n) fseek(resF,(long)(k+1)*4L,0);
381  }
382  else fseek(tabF,(long)k*9L,0);
383  }
384  else
385  {
386  fseek(resF,(long)(n*docT),0);
387  sprintf((char *)kr,"%d/%d",n+2,size);
388  m_size.SetWindowText((char *)kr);
389  }
390  m_brief.ResetContent();
391 
392  while(i<30)
393  {
394 
395  if(!GetLine(kr,k++)) break;
396  if(docT>2) Dsp->E3Coding((CHAR *)kr,0,0);
397  else Bank->E3Coding((CHAR *)kr,0,0); //V26
398 
399  m_brief.AddString((char *)kr);
400  ++i;
401  if(docT<3)
402  if(!resT) if(resF)
403  {
404  h1=fgetc(resF); h2=fgetc(resF);
405  if(h1==-1) break;
406  k=h1*256+h2;
407  fseek(tabF,(long)k*9L,0);
408  }
409  else ;
410  }
411 
412 // if (!n)
413  if(fomd) if(direct) { direct=0; m_direct.SetCheck(0); } // if form mode - no direct display!
414  if(docT>2) m_brief.SetCurSel(1); else m_brief.SetCurSel(0);
415 // else m_brief.SetCurSel(1);
416  if(direct) // direct display?
417  {
418  extern a99 *dlg; // main dialog
419  if(docT>2) dlg->ButtonDown(cp+1); else dlg->ButtonDown(cp);
420  }
421  return 1;
422 } // Ende FillList()
423 
424 // Fill the elements with values
425 void Wkv::DoDataExchange(CDataExchange* pDX)
426 {
428  //{{AFX_DATA_MAP(Brief)
429  DDX_Control(pDX, IDC_FND, m_fnd);
430  DDX_Control(pDX, IDC_SF, m_sf);
431  DDX_Control(pDX, IDC_SB, m_sb);
432  DDX_Control(pDX, IDC_LIST, m_list);
433  DDX_Control(pDX, IDC_BUTTON2, m_rite);
434  DDX_Control(pDX, IDC_BUTTON1, m_left);
435  DDX_Control(pDX, IDC_BH, m_bh);
436  DDX_Control(pDX, ONOK, m_brok);
437  DDX_Control(pDX, ID_END, m_canc);
438  DDX_Control(pDX, IDC_TOP, m_top);
439  DDX_Control(pDX, IDC_BOT, m_bot);
440  DDX_Control(pDX, IDC_SIZ, m_size);
441  DDX_Control(pDX, IDC_REM, m_remove);
442  DDX_Control(pDX, IDC_EDIT2, m_smax);
443  DDX_Control(pDX, IDC_BUTTON6, m_resort);
444  DDX_Control(pDX, IDC_ASC, m_ad);
445  DDX_Control(pDX, IDC_BUTTON5, m_ascdesc);
446  DDX_Control(pDX, IDC_TITLE, m_title);
447  DDX_Control(pDX, IDC_BRSET, m_brset);
448  DDX_Control(pDX, IDC_BUTTON3, m_del);
449  DDX_Control(pDX, IDC_CHECK1, m_direct);
450  DDX_Control(pDX, IDC_FORWARD, m_forward);
451  DDX_Control(pDX, IDC_BACKWARD, m_backward);
452  DDX_Control(pDX, IDC_POSIT, m_pos);
453  DDX_Control(pDX, IDC_WKV, m_brief);
454  //}}AFX_DATA_MAP
455 }
456 
457 // Zuordnung der Funktionen zu den Buttons
458 
459 BEGIN_MESSAGE_MAP(Wkv, CDialog)
460  ON_MESSAGE(WM_GOODBYE, OnGoodbye) // fuer Del
461  //{{AFX_MSG_MAP(Brief)
462  ON_LBN_SETFOCUS(IDC_WKV, OnSetfocusBrief)
463  ON_LBN_DBLCLK(IDC_WKV, OnDblclkBrief)
464  ON_BN_CLICKED(IDC_FORWARD, OnForward)
465  ON_BN_CLICKED(IDC_BACKWARD, OnBackward)
466  ON_WM_DESTROY()
467  ON_EN_SETFOCUS(IDC_POSIT, OnSetfocusPosit)
468  ON_LBN_SELCHANGE(IDC_WKV, OnSelchWkv)
469  ON_BN_CLICKED(IDC_BUTTON1, OnButtonL)
470  ON_BN_CLICKED(IDC_BUTTON2, OnButtonR)
471  ON_BN_CLICKED(IDC_BUTTON3, OnButtonDel)
472  ON_BN_CLICKED(IDC_CHECK1, OnDirect)
473  ON_BN_CLICKED(IDC_BUTTON4, OnButton4)
474  ON_BN_CLICKED(IDC_BUTTON7, OnSortbn)
475  ON_BN_CLICKED(IDC_TOP, OnTop)
476  ON_BN_CLICKED(IDC_BOT, OnBot)
477  ON_BN_CLICKED(IDC_BH, OnBh)
479  ON_BN_CLICKED(IDC_BUTTON6, OnResort)
480  ON_WM_HELPINFO()
481  ON_BN_CLICKED(IDC_REM, OnRem)
482  ON_BN_CLICKED(IDC_LIST, OnList)
483  ON_BN_CLICKED(ONOK, OnOK)
484  ON_BN_CLICKED(ID_END, OnCancel)
485  ON_BN_CLICKED(IDC_SB, OnSb)
486  ON_BN_CLICKED(IDC_SF, OnSf)
487  ON_WM_SIZE()
488  //}}AFX_MSG_MAP
489 END_MESSAGE_MAP()
490 
491 /////////////////////////////////////////////////////////////////////////////
492 // Wkv message handlers
493 
494 
495 int Wkv::DoModal(FILE *tF,FILE *dF,FILE *nF,int dT, int sZ, int pos, FILE *rsF, ABASE *Base, char *srt)
496 {
497  // Oeffnen des Fensters
498  extern int Shft;
499  strcpy(sr,srt);
500  Bank=Base;
501  shft=Shft;
502  tabF=tF; docF=dF; newF=nF; resF=rsF;
503  docT=dT;
504  if(sZ<1) return -1;
505 
506  dct=0;
507  size=sZ;
508  cp=cp0=pos-1; // init for FillList
509  if(cp<0) cp=cp0=0;
510 extern int flxflg;
511 
512  if(*srt<2 || (flxflg && dT<3)) direct=0; // *srt<2 : View 0 or View 1
513 // if(flxflg && dT<3) direct=0;
514  else direct=1; // display every title right after selection
515  // *srt == 0/1 : no direct displ / with editing
516  resT=0;
517  if(pos<0 && resF)
518  {
519  resT=pos+2;
520  long pp=ftell(resF);
521  if(resT==1) cp=cp0=(int)pp/4L - 1;
522  else cp=cp0=(int)pp/2L;
523  }
524 // OnCtlColor(GetDC(),&m_brief,CTLCOLOR_LISTBOX);
525 
526 
527  CDialog::DoModal(); // Nun die normale Initialisierung
528  Shft=shft;
529  if(resF) fseek(resF,0L,0);
530  if((resT || docT>2) && dct) //are there marks?
531  {
532  int c;
533  if(docT<3) fseek(resF,4L,0);
534  while((c=fgetc(resF))!=EOF) // then remove marks
535  {
536  fseek(resF,-1L,1);
537  c=c&127;
538  fputc(c,resF);
539  if(docT<3) fseek(resF,3L,1); else fseek(resF,(long)docT-1L,1);
540  }
541  fseek(resF,0L,0);
542  }
543  return cp;
544 } // ENDE DoModal(...)
545 
546 
547 int Wkv::DoModal() // Die normale Initialisierung
548 {
549 
550  return CDialog::DoModal();
551 }
552 
554 {
555  // right now, nothing
556 }
557 
559 {
560  OnOK(); // same as enter
561 }
562 
563 // Button "Weiter" : eine Seite danach
565 {
566  if(cp<size-nli) cp+=nli; else if(cp<size-12) cp+=10;
567  if(docT<3)
568  {
569  if(resF)
570  {
571  if(resT)
572  {
573  fseek(resF,(long)(cp+1)*4L,0);
574  }
575  else
576  {
577  fseek(resF,(long)cp*2L,0);
578  }
579  }
580  }
581  else fseek(resF,(long)cp*docT,0);
582  FillList(cp);
583 }
584 
585 // Button "Zurueck" : eine Seite davor
587 {
588  if(cp-nli>0) cp-=nli;
589  else cp=0;
590  if(docT<3)
591  {
592  if(resF)
593  {
594  if(resT)
595  {
596  fseek(resF,(long)(cp+1)*4L,0);
597  }
598  else
599  {
600  fseek(resF,(long)cp*2L,0);
601  }
602  }
603  }
604  else fseek(resF,(long)cp*docT,0);
605  FillList(cp);
606 }
607 
608 
610 {
611  // Focus moves away from line
612 
613  UpdateData(TRUE);
614 
615  char s[32];
616  m_pos.GetWindowText(s,31);
617  if(*s=='\\')
618  {
619  strncpy(Bpos,s,5); Bpos[5]=0; *Bpos='#';
620  }
621  else if(*s=='-') // Sortiermax einstellen
622  {
623  extern int smax;
624  int i=atoi(s+1);
625  if(i>0 && i<16001) smax=atoi(s+1);
626 // if(size>smax) m_resort.EnableWindow(TRUE);
627 // else m_resort.EnableWindow(FALSE);
628  sprintf(Aerror,"<%d",smax+1); m_smax.SetWindowText(Aerror); *Aerror=0;
629  }
630  else if(*s=='#')
631  {
632  cp=atoi(s+1)-1;
633 
634  if(cp>size) cp=size-20;
635  if(cp<1) cp=0;
636  }
637  else if(resT || docT>2) // if(docT>2)
638  {
639  int j=Srch(s,0,0); // s in ViewListe suchen
640  if(j>-1) { cp=j; if(docT<3) ++cp; }
641  else cp=0;
642  }
643  else return;
644  if(resF) { if(docT<3) fseek(resF,(long)(cp+1)*4L,0); }
645  else fseek(tabF,(long)(cp+1)*9L,0);
646  FillList(cp);
647 
648 }
649 
650 
651 void Wkv::OnOK()
652 {
653  // Enter was hit
654  // Mit Enter wird das Fenster geschlossen
655  extern char cmod;
656  if(!foco)
657  {
658  int cc, cP, yn=-1;
659  cc=m_brief.GetCurSel();
660  if(cp<0) cp=0; // nur zur Vorsicht
661  cP=cp+cc;
662 extern WINDOWPLACEMENT brplace;
663 GetWindowPlacement(&brplace);
664  if(dct) yn=MessageBox(uif[406],"a99/alcarta",MB_YESNOCANCEL);
665  if(yn==IDCANCEL) return;
666  if(yn==IDYES) { cP=cc=0; OnRem(); }
667 #ifdef A99
668  if(*sr==1) // Edit mode in a View
669  {
670  char zeile[200]; strcpy(zeile,"EDIT=");
671  fseek(resF,(long)cP*docT,0);
672  fgets(zeile+5,docT,resF);
673 
674  zeile[docT+3]=0; // help or flx ?
675  if(cmod=='0') Bank->E3Coding((CHAR *)zeile,0,0); // ASCII->ansi
676  // sprintf(Aerror,"cp=%d,cP=%d, cc=%d, %s",cp,cP,cc,zeile+5); MessageBox(Aerror); *Aerror=0;
677  {
678  extern char inpu[];
679  char *inp;
680  GetL *m_getl;
681  m_getl = new GetL(this);
682  m_getl->Ask(zeile);
683  delete m_getl;
684  if(*inpu)
685  {
686  fseek(resF,(long)cP*docT,0);
687  int i=strlen(inpu);
688  if(i<docT) { while(i<docT) inpu[i++]=' '; }
689  inpu[docT-2]=0;
690  sprintf(zeile," %s",inpu);
691  m_brief.DeleteString(cc);
692  inp=strchr(zeile,'|'); if (!inp) inp=zeile;
693  else { --inp; *inp=inp[1]=' '; }
694  m_brief.InsertString(cc,inp);
695  if(cmod=='0') Bank->E3Coding((CHAR *)inpu,0,1); // ansi->asci
696  fputs(inpu,resF);
697  }
698  }
699  return;
700  }
701 #endif
702  cp=cP;
703 extern int vmod; vmod=0;
704  CDialog::OnOK();
705  }
706  else { foco=0; OnKillfocusPosit(); m_brief.SetFocus(); }
707 } // Ende OnOK()
708 
709 
711 {
712 extern WINDOWPLACEMENT brplace;
713 GetWindowPlacement(&brplace);
715 }
716 
717 
719 {
720  foco=1;
721 }
722 
724 {
725  int yn=IDNO;
726  foco=0;
727  if(direct && docT<3) { OnOK(); return; }
728 
729  if(cp>-2) cp=-1; // no selection from listbox
730 
731 extern WINDOWPLACEMENT brplace;
732 GetWindowPlacement(&brplace);
733  if(dct) yn=MessageBox(uif[406],"a99/alcarta",MB_YESNOCANCEL);
734  if(yn==IDCANCEL) return;
735  if(yn==IDYES) OnRem();
736 extern int vmod; vmod=0;
738 }
739 
740 
742 {
743  // focus is moving to another line:
744  // display the record for that line at once
745 
746  extern a99 *dlg; // main dialog
747 
748  int p;
749 
750  p=m_brief.GetCurSel();
751 
752  if(docT>2) // View
753  {
754  sprintf((char *)kd,"%d/%d",cp+p+1,size);
755  m_size.SetWindowText((char *)kd);
756  }
757 
758  if(direct) // direct display?
759  {
760  dlg->ButtonDown(cp+p);
761  }
762 
763  if(p==29) // we are on the last line
764  {
765  ++cp;
766  if(docT>2) fseek(resF,(long)(cp+29)*docT,0);
767  else if(resF)
768  {
769  if(resT) fseek(resF,(long)(cp+30)*4L,0);
770  else fseek(resF,(long)(cp+30)*2L,0);
771  }
772  if(GetLine(kd,cp+29))
773  {
774  if(docT>2) Dsp->E3Coding((CHAR *)kd,0,0);
775  else Bank->E3Coding((CHAR *)kd,0,0); //V26
776  m_brief.AddString((char *)kd);
777  m_brief.DeleteString(0);
778  m_brief.SetCurSel(28);
779  }
780  else --cp;
781  }
782  if(p==0) if(cp>0)
783  {
784  if(docT<3)
785  if(resF)
786  {
787  if(resT) fseek(resF,(long)cp*4L,0);
788  else fseek(resF,(long)cp*2L,0);
789  }
790  else fseek(tabF,(long)(cp-1)*9L,0);
791  else fseek(resF,(long)(cp-1)*docT,0);
792  --cp;
793  if(GetLine(kd,cp))
794  {
795  if(docT>2) Dsp->E3Coding((CHAR *)kd,0,0);
796  else Bank->E3Coding((CHAR *)kd,0,0); //V26
797  m_brief.DeleteString(29);
798  m_brief.InsertString(0,(char *)kd);
799  m_brief.SetCurSel(1);
800  }
801  if(resT) fseek(resF,(long)(cp+31)*4L,0);
802 
803  }
804 } // ENDE OnSelchWkv
805 
806 void Wkv::SetPos(int spos)
807 {
808  // set sort position marker
809  extern char dataFont[];
810  sprintf(Aerror," %s ",Bank->IndeX[11]);
811  Bank->E3Coding((CHAR *)Aerror,0,0);
812  int j=Bank->stll;
813  int i=strlen(Aerror); while(i<j) Aerror[i++]=' ';
814  Aerror[i]=0;
815  Aerror[spos+6]=(!_strnicmp(dataFont,"allegro",7)?178:149);
816  if(*uif[3]) m_title.SetWindowText(uif[3]); else m_title.SetWindowText(Aerror);
817 }
818 
819 void Wkv::OnButtonL() // Left shift
820 {
821  extern int spos;
822 // sprintf(Aerror,"h=%d",m_brief.GetItemHeight(0)); MessageBox(Aerror);
823 
824  if(docT<3 && *Aerror!=1)
825  {
826  if(Bank && resF && resT)
827  {
828  --spos; if(spos<0) spos=0;
829  else SetPos(spos);
830  return;
831  }
832  else { if(shft) --shft; FillList(cp); }
833  }
834  else
835  {
836  char s[32];
837  m_pos.GetWindowText(s,31);
838  if(*s)
839  {
840  ++cp;
841  int j=Srch(s,cp+m_brief.GetCurSel(),1);
842  if(j!=-1) { cp=j;
843  if(docT<3) { fseek(resF,(long)(cp+2)*4L,0); ++cp; }
844  FillList(cp);
845  }
846  else --cp;
847  }
848  m_brief.SetFocus();
849  }
850 }
851 
852 void Wkv::OnButtonR() // Right shift
853 {
854  extern int spos;
855  if(docT<3 && *Aerror!=1)
856  {
857  if(Bank && resF && resT)
858  {
859  ++spos; if(spos>Bank->stll-1) spos=Bank->stll-1;
860  else SetPos(spos);
861  return;
862  }
863  else { ++shft; FillList(cp); }
864  }
865  else
866  {
867  char s[32];
868  m_pos.GetWindowText(s,31);
869  if(*s)
870  {
871 // if(docT>2) ++cp;
872  int j=Srch(s,cp+1+m_brief.GetCurSel(),0);
873  if(j!=-1) { cp=j;
874  if(docT<3) { cp+=2; fseek(resF,(long)(cp)*4L,0); --cp; }
875  FillList(cp);
876  }
877  else if(docT>2) --cp;
878  m_brief.SetFocus();
879  }
880  }
881 }
882 
883 
884 // apac99
885  char Zeile[200];
886  char neuzeil[204];
887 
888 
889 void Wkv::OnButtonDel() // Taste Entf : set/remove the DEL mark
890 {
891 extern int vmod;
892  m_pos.GetWindowText(neuzeil,32);
893  if(!resF || (!vmod && docT>2 && !strlen(neuzeil))) return; // only in result sets
894  long posf=ftell(resF); // current position
895 
896  int c, j, i=m_brief.GetCurSel();
897  m_brief.GetText(i,Zeile);
898  j=cp+i;
899  if(docT>2) fseek(resF,(long)j*docT,0);
900  else fseek(resF,(long)(j+1)*4L,0);
901 
902 if(strlen(neuzeil)) // find function is active
903 {
904  neuzeil[32]=0;
905  if(strlen(neuzeil))
906  { neuzeil[strlen(neuzeil)-1]=0;
907  m_pos.SetWindowText(neuzeil);
908  m_pos.SetFocus(); OnOK();
909  }
910  return;
911 }
912 
913  c=fgetc(resF);
914  if(c==EOF) return; // keine adresse
915  fseek(resF,-1L,1);
916  if(c & 128)
917  { c-=128;
918  if(docT<3) strcpy(Zeile+5,Zeile+10);
920  if(docT>2) *neuzeil=' ';
921  --dct;
922  }
923  else {
924  c+=128;
925  if(docT<3) { strcpy(neuzeil,Zeile);
926  sprintf(neuzeil+6,"DEL %s",Zeile+5); }
927  else { strcpy(neuzeil,Zeile); *neuzeil='X'; }
928  ++dct;
929  }
930  fputc(c,resF);
931  fseek(resF,posf,0); // restore curr pos
932  m_brief.DeleteString(i);
933  m_brief.InsertString(i,neuzeil);
934  m_brief.SetFocus();
935 /*
936  if(i==28)
937  {
938  ++cp;
939 // if(docT>2) fseek(resF,(long)(cp+29)*docT,0);
940  if(GetLine(kd,cp+29))
941  {
942  Dsp->E3Coding((CHAR *)kd,0,0);
943  m_brief.DeleteString(0);
944  m_brief.AddString((char *)kd);
945  }
946  else --cp;
947 
948  --i;
949  }
950  m_brief.SetCurSel(++i);
951 */
952  m_brief.SetCurSel(i);
953  m_brief.SendMessage(WM_KEYDOWN,VK_DOWN);
954 
955 } // ENDE // OnButtonDel()
956 
957 
959 {
960  direct=1-direct;
961  m_brief.SetFocus();
962 }
963 
964 void Wkv::OnButton4() // invisible Button for Alt+Z, same as F5
965 {
966  dlg->SendMessage(WM_GOODBYE,8,0); // Alt+Z
967 }
968 
969 
970 void Wkv::OnResort() // invisible Button for Alt+r
971 {
972  SORT(0); // Alt+r: sort by position
973 }
974 
975 // Alt+s : Sortieren nach Satznummer
976 void Wkv::OnSortbn() // invisible Button for Alt+s
977 {
978  SORT(1); // Alt+s: sort by rec#
979 }
980 
981 // Top line was reached, page up
982 
983 void Wkv::OnTop()
984 {
985  cp=nli;
986  OnBackward();
987 
988 }
989 
990 // Bottom line was reached, page down
991 
993 {
994  int d=direct; direct=0;
995  cp=size-40;
996  if(cp<0) cp=0;
997  OnForward();
998  m_brief.SetCurSel(m_brief.GetCount()-1); // last pos
999  direct=d;
1000  if(direct) // direct display?
1001  {
1002  extern a99 *dlg; // main dialog
1003  dlg->ButtonDown(size-1);
1004  }
1005  if(docT>2)
1006  {
1007  char kr[9];
1008  sprintf((char *)kr,"%d",size);
1009  m_size.SetWindowText((char *)kr);
1010  }
1011 
1012 }
1013 
1014 // F1 - Hilfetext
1015 void Wkv::OnBh() // help
1016 {
1017  extern a99 *dlg; // main dialog
1018  if(docT<3) dlg->helpinfo("_BR",uif[356]); // HA_BR
1019  else dlg->helpinfo("_VW",uif[356]); // HA_VW
1020  SetFocus();
1021 }
1022 
1023 // Button Auf/Ab
1024 void Wkv::OnAD() // toggle ascending/descending
1025 {
1026  if(Bank && resT && resF)
1027  {
1028  extern int smod;
1029  if(smod>1) smod=1; // unsortiert? aufw. einstellen
1030  smod=1-smod;
1031  if(smod==1) m_ad.SetWindowText(uif[249]);
1032  else if(!smod) m_ad.SetWindowText(uif[248]);
1033  else m_ad.SetWindowText("");
1034  SORT(0);
1035  }
1036 }
1037 
1038 void Wkv::SORT(int md) // sort result set, md=1: internal rec#
1039 {
1040  if(Bank && resT && resF)
1041  {
1042 extern a99 *dlg; // main dialog
1043  CWaitCursor cc; // Sanduhr setzen
1044  dlg->ReSort(md); // do the sorting
1045  OnTop();
1046  m_brief.SetFocus();
1047  }
1048 }
1049 
1050 BOOL Wkv::OnHelpInfo(HELPINFO* pHelpInfo)
1051 {
1052 
1053  OnBh(); return 1;
1054 // return CDialog::OnHelpInfo(pHelpInfo);
1055 }
1056 
1057 
1058 // Save the window's size and position
1059 
1060 void Wkv::Size()
1061 {
1062 WINDOWPLACEMENT bw;
1063 extern WINDOWPLACEMENT brplace;
1064 if(!brplace.length) return;
1065 
1066 int l,t,r, L, R, T, B, hi;
1067 L=brplace.rcNormalPosition.left;
1068 R=brplace.rcNormalPosition.right;
1069 if(!(R-L)) return;
1070 T=brplace.rcNormalPosition.top;
1071 B=brplace.rcNormalPosition.bottom;
1072 if(B-T==0) return;
1073 
1074 hi=B-T-76;
1075 
1076 m_brief.GetWindowPlacement(&bw);
1077 l=bw.rcNormalPosition.left;
1078 r=bw.rcNormalPosition.right;
1079 t=bw.rcNormalPosition.top;
1080 
1081 }
1082 
1083 
1084 // Zeilen beseitigen, die mit DEL markiert sind (Entf-Taste)
1085 void Wkv::OnRem() // remove DEL marked lines
1086 {
1087 
1088  extern char rssN[], viwN[];
1089  extern FILE *rsF, *rs1, *rs2;
1090  extern int rn0, rsize;
1091  extern a99 *dlg; // main dialog
1092  int c1,c2,c3,c4;
1093  int rsx;
1094  char rssX[128]; char z1[256];
1095  if(!resF) return; // only in result sets
1096  if(docT<3) strcpy(rssX,rssN); else strcpy(rssX,viwN);
1097  rsx=strlen(rssX)-2;
1098  rssX[rsx]='X';
1099  if(rssN[rsx]=='_') rsx=rssN[rsx+1]-'0';
1100  FILE *f2=fopen(rssX,"wb");
1101  CWaitCursor cc; // Sanduhr setzen
1102 if(docT<3)
1103 {
1104  fseek(resF,2L,0);
1105  fputc(255,f2); fputc(255,f2);
1106  fputc(fgetc(resF),f2); fputc(fgetc(resF),f2);
1107  while((c1=fgetc(resF))!=EOF)
1108  {
1109  c2=fgetc(resF); c3=fgetc(resF); c4=fgetc(resF);
1110  if(c1&128) ;
1111  else { fputc(c1,f2); fputc(c2,f2); fputc(c3,f2); fputc(c4,f2); }
1112  }
1113 }
1114 else
1115 {
1116  fseek(resF,0L,0);
1117  while(fgets(z1,256,resF))
1118  {
1119  if(!(*z1&128)) fprintf(f2,"%s",z1);
1120  }
1121 }
1122  fclose(f2);
1123  if(rsx==1) fclose(rs1);
1124  else if(rsx==2) fclose(rs2);
1125  if(rsF) fclose(rsF);
1126  if(docT<3) { unlink(rssN); rename(rssX,rssN); }
1127  else { if(resF) fclose(resF); unlink(viwN); rename(rssX,viwN); }
1128 // sprintf(Aerror,"rsx=%d, rssN=%s",rsx,rssN); MessageBox(Aerror); //test
1129 
1130  if(docT<3)
1131  {
1132  if(rsx==1) rs1=fopen(rssN,"r+b"); // and re-open
1133  else if(rsx==2) rs2=fopen(rssN,"r+b");
1134  rsF=resF=fopen(rssN,"r+b"); fseek(resF,0L,2); rsize=size=ftell(resF)/4L-1;
1135  }
1136  else
1137  {
1138  rsF=resF=fopen(viwN,"r+b"); fseek(resF,0L,0);
1139  }
1140 
1141  if(rsx==2) rn0=size; // groesse der Hist list
1142  m_size.SetWindowText(Aerror);
1143  dlg->chgHist(rsx,rsize); // chg result set size
1144 
1145  extern CHAR w[];
1146  dlg->m_rset.SetWindowText((char *)w+1);
1147  fseek(resF,4L,0);
1148  dct=0;
1149  FillList(cp=0);
1150  m_brief.SetFocus();
1151 
1152 } // ENDE OnRem()
1153 
1154 
1155 int bpl, bpr; // window position left,right
1156 
1157 
1158 LRESULT Wkv::OnGoodbye(WPARAM wParam, LPARAM lParam)
1159 {
1160 // diese messages werden durch aListBox ausgeloest
1161 // wenn bestimmte Tasten gedrueckt werden
1162 // wParam ist der Tastencode
1163 
1164  if(wParam==31)
1165  {
1166  if(lParam==38)
1167  {
1168  if(!m_brief.GetCurSel()) OnSelchWkv();
1169  }
1170 
1171  if(lParam==46) OnButtonDel(); // backspace/del was pressed in listbox
1172  if(lParam==34) OnForward();
1173  if(lParam==33) OnBackward();
1174  if(lParam==36) OnTop();
1175  if(lParam==35) OnBot();
1176  if(lParam==116) OnButton4(); // F5
1177 
1178  if(lParam==122) // F11 Position und Groesse vom Hauptfenster uebernehmen
1179  {
1180  extern WINDOWPLACEMENT brplace;
1181  GetWindowPlacement(&brplace);
1182  extern WINDOWPLACEMENT mwplace;
1183  dlg->GetWindowPlacement(&mwplace);
1184  int l,r,L,R;
1185  l=brplace.rcNormalPosition.left;
1186  r=brplace.rcNormalPosition.right;
1187  L=mwplace.rcNormalPosition.left;
1188  R=mwplace.rcNormalPosition.right;
1189  if(l==L && r==R) l=bpl, r=bpr; else { bpl=l; l=L; bpr=r; r=R; }
1190  brplace.rcNormalPosition.left=l;
1191  brplace.rcNormalPosition.right=r;
1192  brplace.rcNormalPosition.bottom=brplace.rcNormalPosition.top+467;
1193  SetWindowPlacement(&brplace);
1194  }
1195 
1196  if(lParam==118)
1197  {
1198  dlg->SendMessage(WM_GOODBYE,31,118); // Alt+Z
1199  }
1200  }
1201  if(wParam==32)
1202  if(lParam=='#') // # : full line display
1203  {
1204  int p=m_brief.GetCurSel();
1205  m_brief.GetText(p,Aerror); MessageBox(Aerror); *Aerror=0;
1206  }
1207  else { m_pos.GetWindowText((char*)kd,32);
1208  if(!*kd) strcpy(kd,"^");
1209  strcat(kd,"x"); kd[strlen(kd)-1]=(int)lParam;
1210  m_pos.SetWindowText((char *)kd);
1211  if(strlen(kd)>2) { if(cp) cp-=2; OnSf(); }
1212  else { m_pos.SetFocus(); OnOK(); }
1213  }
1214  return 0L;
1215 
1216 } // ENDE OnGoodbye()
1217 
1218 
1219 void Wkv::OnList() // Button [List] : brief list -> display
1220 {
1221  int from,nn;
1222  from=cp+m_brief.GetCurSel();
1223  cp=-2;
1224  char s[9];
1225  extern a99 *dlg; // main dialog
1226  m_pos.GetWindowText(s,8);
1227 // if(isdigit(*s))
1228  { nn=atoi(s);
1229 // cp=-3;
1230  dlg->ResList(0,from,nn); // ErgMenge ins Anzeigefenster
1231  }
1232  direct=0;
1233 // cp=-1;
1234  OnCancel();
1235 }
1236 
1237 
1238 void Wkv::OnSb()
1239 {
1240  if(docT<3) if(!resF || !resT) return;
1241  *Aerror=1;
1242  OnButtonL();
1243  *Aerror=0;
1244  m_brief.SetFocus();
1245 }
1246 
1247 void Wkv::OnSf()
1248 {
1249  if(docT<3) if(!resF || !resT) return;
1250  *Aerror=1;
1251  OnButtonR();
1252  *Aerror=0;
1253  m_brief.SetFocus();
1254 }
1255 
1256 
1257 
1258 void Wkv::OnSize(UINT ntype, int cx, int cy)
1259 {
1260 // event: Groessenaenderung findet statt, insbes. F11
1261 // alle Elemente entspr. veraendern und verschieben
1262 
1263  CDialog::OnSize(ntype,cx,cy);
1264 // empirische Werte fuer das Listenfeld:
1265 // return;
1266  m_brief.MoveWindow(5,50,cx-98,376);
1267 
1268  m_brok.MoveWindow(cx-45,2,45,50);
1269 
1270  m_ad.MoveWindow(cx-92,2,45,25);
1271  m_smax.MoveWindow(cx-92,30,45,25);
1272 
1273  m_ascdesc.MoveWindow(cx-92,53,45,30);
1274  m_canc.MoveWindow(cx-45,53,45,30);
1275 
1276  m_resort.MoveWindow(cx-92,84,45,30);
1277  m_bh.MoveWindow(cx-45,84,45,30);
1278 
1279  m_left.MoveWindow(cx-92,114,45,30);
1280  m_rite.MoveWindow(cx-45,114,45,30);
1281 
1282  m_backward.MoveWindow(cx-92,144,45,30);
1283  m_forward.MoveWindow(cx-45,144,45,30);
1284 
1285  m_top.MoveWindow(cx-92,174,45,30);
1286  m_bot.MoveWindow(cx-45,174,45,30);
1287 
1288  m_del.MoveWindow(cx-92,204,45,30);
1289  m_remove.MoveWindow(cx-45,204,45,30);
1290 
1291  m_list.MoveWindow(cx-46,235,46,28);
1292 
1293  m_sb.MoveWindow(cx-45,264,22,20);
1294  m_sf.MoveWindow(cx-21,264,22,20);
1295 
1296  m_direct.MoveWindow(cx-92,234,45,20);
1297  m_fnd.MoveWindow(cx-92,264,46,20);
1298 
1299  m_pos.MoveWindow(cx-92,286,95,25);
1300  m_title.MoveWindow(5,24,cx-98,24);
1301 
1302 }
1303 /*
1304  Copyright 2011 Universitätsbibliothek Braunschweig
1305 
1306  Licensed under the Apache License, Version 2.0 (the "License");
1307  you may not use this file except in compliance with the License.
1308  You may obtain a copy of the License at
1309 
1310  http://www.apache.org/licenses/LICENSE-2.0
1311 
1312  Unless required by applicable law or agreed to in writing, software
1313  distributed under the License is distributed on an "AS IS" BASIS,
1314  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1315  See the License for the specific language governing permissions and
1316  limitations under the License.
1317 */
1318