home *** CD-ROM | disk | FTP | other *** search
/ Source Code 1994 March / Source_Code_CD-ROM_Walnut_Creek_March_1994.iso / compsrcs / x / volume17 / xtexcad1 / part02 < prev    next >
Encoding:
Text File  |  1992-04-20  |  50.2 KB  |  1,525 lines

  1. Newsgroups: comp.sources.x
  2. Path: uunet!zaphod.mps.ohio-state.edu!mips!msi!dcmartin
  3. From: Fritz Haubensak <hsk@informatik.uni-wuerzburg.de>
  4. Subject: v17i066: TeXcad (X) version 1.2, Part02/10
  5. Message-ID: <1992Apr21.130745.2180@msi.com>
  6. Originator: dcmartin@fascet
  7. Sender: dcmartin@msi.com (David C. Martin - Moderator)
  8. Nntp-Posting-Host: fascet
  9. Organization: Molecular Simulations, Inc.
  10. References: <csx-17i065-xtexcad-1.2@uunet.UU.NET>
  11. Date: Tue, 21 Apr 1992 13:07:45 GMT
  12. Approved: dcmartin@msi.com
  13. Lines: 1510
  14.  
  15. Submitted-by: Fritz Haubensak <hsk@informatik.uni-wuerzburg.de>
  16. Posting-number: Volume 17, Issue 66
  17. Archive-name: xtexcad-1.2/part02
  18.  
  19. # this is part.02 (part 2 of a multipart archive)
  20. # do not concatenate these parts, unpack them in order with /bin/sh
  21. # file file_sel.c continued
  22. #
  23. if test ! -r _shar_seq_.tmp; then
  24.     echo 'Please unpack part 1 first!'
  25.     exit 1
  26. fi
  27. (read Scheck
  28.  if test "$Scheck" != 2; then
  29.     echo Please unpack part "$Scheck" next!
  30.     exit 1
  31.  else
  32.     exit 0
  33.  fi
  34. ) < _shar_seq_.tmp || exit 1
  35. if test ! -f _shar_wnt_.tmp; then
  36.     echo 'x - still skipping file_sel.c'
  37. else
  38. echo 'x - continuing file file_sel.c'
  39. sed 's/^X//' << 'SHAR_EOF' >> 'file_sel.c' &&
  40. X     offset = (char *)(offset + LAENGE);  /* freie Stelle */
  41. X     i++;
  42. X     }
  43. X   
  44. X   /* Liste alphabetisch sortieren */
  45. X   qsort(Liste2[2],i-2,LAENGE,strcmp);
  46. X   
  47. X   /* Liste mit NULL Eintrag beenden */
  48. X   i++;
  49. X   Liste2[i] = NULL;
  50. X
  51. X   /* Directory Stream schliessen */
  52. X   closedir(dirp2);
  53. X
  54. X   /* alten Speicher wieder freigeben */
  55. X   if(Liste != NULL)
  56. X     free(Liste);
  57. X   if(Inhalt != NULL)
  58. X     free(Inhalt);
  59. X
  60. X   Liste = Liste2;
  61. X   Inhalt = Inhalt2;
  62. X
  63. X   return((String *)Liste); /* Pointer auf Listenkopf wird zureuckgegeben */
  64. }
  65. X
  66. /*****************************************************************************/
  67. /* Funktion steuert bei einer Neuerstellung der Liste im Listwidget den      */
  68. /* Ablauf und veranlasst die sich daraus ergebenden Folgen.                  */
  69. /*                                                                           */
  70. /* Aufruf: direct_to_list();                                                 */
  71. /*                                                                           */
  72. /* Parameter: keine                                                          */
  73. /* Rueckgabe: keine                                                          */
  74. /*****************************************************************************/
  75. void direct_to_list()
  76. {
  77. X   Arg args[1];
  78. X   short anzahl;              /* anzahl Directoryeintraege */
  79. X
  80. X   anzahl = count_eintraege();
  81. X
  82. X   /* Datei bei einem Patternwechsel nicht mehr vorhanden */
  83. X   /* Dateinamen in Labelfeld loeschen */
  84. X   /* ohne direkt in Pointer zu schreiben wird Wert nicht angezeigt */
  85. X   XtSetArg(args[0],XtNstring," ");
  86. X   XtSetValues(((DialogWidget)text)->dialog.valueW,args,1);
  87. X
  88. X   /* neue Liste erstellen und Listwidget uebergeben */
  89. X   XtUnmanageChild(list_direct);
  90. X   XawListChange(list_direct,directory_erstellen(anzahl),anzahl,0,True);
  91. X   XtManageChild(list_direct);
  92. X
  93. X   /* Rollbalken wieder am oeberen Ende positionieren */ 
  94. X
  95. X
  96. }        
  97. X
  98. /*****************************************************************************/
  99. /* Callbackfunktion fuer den Ok-Button. (Rueckgabe Dateiname, Fileselectbox  */
  100. /* schliessen.                                                               */
  101. /*                                                                           */
  102. /* Aufruf: Ok_gelickt(w,client_data,call_data);                              */
  103. /*                                                                           */
  104. /* Funktion wird nur von X-Windows aufgerufen.                               */
  105. /*****************************************************************************/
  106. void Ok_geklickt(Widget w ,caddr_t client_data,caddr_t call_data)
  107. {
  108. X  char *stelle;                 /* Pointer auf erstes Blank im String */
  109. X
  110. X
  111. X  if(XawDialogGetValueString(text)[0]  == ' ')
  112. X    /* falls Dateiname leer ist wird NULL zurueck gegeben vgl. CANCEL-Button */
  113. X    filename = NULL;
  114. X  else 
  115. X    {
  116. X    /* Dateinamenfeld war mit Dateinamen gefuellt */
  117. X    filename = (char *)malloc(MAXPATH*sizeof(char));
  118. X    getcwd(filename,LAENGE2);
  119. X    strcat(filename,"/");
  120. X    strcat(filename,XawDialogGetValueString(text));
  121. X    /* nachfolgende Blanks abschneiden */
  122. X    if((stelle=index(filename,' ')) != NULL)  
  123. X    *stelle = '\0';
  124. X    }
  125. X
  126. X  /* Ueberpruefen, ob Dateiname jetzt tatsaechlich passt */
  127. X  free(Liste);
  128. X  free(Inhalt);
  129. X  XtPopdown(file_s);             /* Ruecksprung */
  130. }
  131. /*****************************************************************************/
  132. /* Callbackfunktion fuer den Return im Labelfeld Dateinamen aufgerufen       */
  133. /* Setzt die Parmeter fuer Ok_geklickt (s.o.) um.                            */
  134. /*                                                                           */
  135. /* Aufruf: Ok2_gelickt(widget,event,params,n_params);                        */
  136. /*                                                                           */
  137. /* Funktion wird nur von X-Windows aufgerufen.                               */
  138. /*****************************************************************************/
  139. void Ok2_geklickt(Widget widget,XEvent *event,String *params,Cardinal *n_params)
  140. {
  141. X  /* Prozedur wird nach <Return> in Labelfeld aufgerufen */
  142. X  /* setzt nur Parameter fuer Ok_geklickt um */
  143. X  Ok_geklickt(XtParent(widget),NULL,NULL);
  144. }
  145. X
  146. X
  147. /*****************************************************************************/
  148. /* Callbackfunktion fuer den Return im Labelfeld Pfadnamen aufgerufen        */
  149. /* Wechselt in neuen Pfad und erstellt Eintraege in der Liste neu.           */
  150. /*                                                                           */
  151. /* Aufruf: Path_changed(widget,event,params,n_params);                       */
  152. /*                                                                           */
  153. /* Funktion wird nur von X-Windows aufgerufen.                               */
  154. /*****************************************************************************/
  155. void Path_changed(Widget widget,XEvent *event,String *params,Cardinal *n_params)
  156. {
  157. X  char *home,               /* Homedirectory aus dem Environment */
  158. X       *stelle;             /* temporaerer Pointer */
  159. X  char p_name[LAENGE2];     /* Pfad in korrigierter Laenge */
  160. char p_name2[LAENGE2];
  161. X  char neuer_pfad[LAENGE2]; /* neuer eingegebene Pfad */
  162. Arg args[1];
  163. X  
  164. X  /* Prozedur wird nach <Return> in Dialogfeld fuer Path aufgerufen */
  165. X  /* uebernimmt ggf. neues Pattern und aendert Eintrage im Fenster    */
  166. X  sprintf(neuer_pfad,"%-50.50s",XawDialogGetValueString(XtParent(widget)));
  167. X  /* nachfolgende Blanks abschneiden */
  168. X
  169. X  if((stelle=index(neuer_pfad,' ')) != NULL)  
  170. X    *stelle = '\0';
  171. X  else                       /* Namen sind zu lang */ 
  172. X    {
  173. X    neuer_pfad[LAENGE2] = '\0';
  174. X    neuer_pfad[LAENGE2-1] = '*';
  175. X    }
  176. X
  177. X  if(chdir(neuer_pfad) == -1)
  178. X    /* Fehler beim Wechsel in angegebenen Pfadnamen */
  179. X    {
  180. X    home = getenv("HOME");
  181. X    if(home != NULL)
  182. X       chdir(home);    /* bei Fehler ins Homedirectory wechseln */ 
  183. X    else               /* kein Eintrag fuer Homedirectory gefunden */
  184. X       chdir("/");
  185. X
  186. X    /* Dialogfeld zur Ausgabe des aktuellen Verzeichnisnamen  aendern  */
  187. X    getcwd(p_name,LAENGE2);
  188. X    /* ohne direkt in Pointer zu schreiben wird Wert nicht angezeigt */
  189. X    XtSetArg(args[0],XtNstring,p_name);
  190. X    XtSetValues(((DialogWidget)path)->dialog.valueW,args,1);
  191. X    }
  192. X
  193. X  /* evtl. Wechsel in neues Directory erfolgt, daher Liste neu erstellen */
  194. X  direct_to_list();
  195. }
  196. X
  197. /*****************************************************************************/
  198. /* Callbackfunktion fuer ein Verlassen des Labelfeldes fuer Pfadeingabe      */
  199. /* wenn die Eingabe des Pfades nichtr mit Return abgeschlossen wurde, so     */
  200. /* muss der Pfad wieder korrekt angezeigt werden.                            */
  201. /*                                                                           */
  202. /* Aufruf: Path_leave(widget,event,params,n_params);                         */
  203. /*                                                                           */
  204. /* Funktion wird nur von X-Windows aufgerufen.                               */
  205. /*****************************************************************************/
  206. void Path_leave(Widget widget,XEvent *event,String *params,Cardinal *n_params)
  207. {
  208. X  char p_name[LAENGE2];     /* Pfad in korrigierter Laenge */
  209. char p_name2[LAENGE2];
  210. Arg args[1];
  211. X
  212. X  /* Dialogfeld zur Ausgabe des aktuellen Verzeichnisnamen  aendern  */
  213. X  getcwd(p_name,LAENGE2);
  214. X  /* ohne direkt in Pointer zu schreiben wird Wert nicht angezeigt */
  215. X  sprintf(p_name2,"%-50.50s",p_name);
  216. X  XtSetArg(args[0],XtNstring,p_name2);
  217. X  XtSetValues(((DialogWidget)path)->dialog.valueW,args,1);
  218. }
  219. X
  220. /*****************************************************************************/
  221. /* Callbackfunktion fuer den Return im Labelfeld Pattern aufgerufen          */
  222. /* Wechselt globales Pattern aus und erstellt Eintrage in der Liste neu.     */
  223. /*                                                                           */
  224. /* Aufruf: Patt_changed(widget,event,params,n_params);                       */
  225. /*                                                                           */
  226. /* Funktion wird nur von X-Windows aufgerufen.                               */
  227. /*****************************************************************************/
  228. void Patt_change(Widget widget,XEvent *event,String *params,Cardinal *n_params)
  229. {
  230. X  char neues_patt[LAENGE];   /* neues Patternmuster */
  231. X
  232. X  /* Prozedur wird nach <Return> in Labelfeld fuer Pattern aufgerufen */
  233. X  /* uebernimmt ggf. neues Pattern und aendert Eintrage im Fenster    */
  234. X  strcpy(neues_patt,(char *)XawDialogGetValueString(XtParent(widget)));
  235. X
  236. X  if(neues_patt != patt_global)       /* nur aendern falls Pattern anders */
  237. X    {
  238. X    strcpy(patt_global,neues_patt);   /* neues Pattern setzen */
  239. X    /* Eintrage im Fenster neu erstellen */ 
  240. X    direct_to_list();
  241. X    }
  242. }
  243. X
  244. /*****************************************************************************/
  245. /* Callbackfunktion fuer den Cancel-Button.(Rueckgabe NULL, Fileselectbox    */
  246. /* schliessen.                                                               */
  247. /*                                                                           */
  248. /* Aufruf: Cancel_gelickt(w,client_data,call_data);                          */
  249. /*                                                                           */
  250. /* Funktion wird nur von X-Windows aufgerufen.                               */
  251. /*****************************************************************************/
  252. void Cancel_geklickt(Widget w,caddr_t client_data,caddr_t call_data)
  253. {
  254. X  filename = NULL;                  /* gibt immer NULL zurueck */
  255. X  free(Liste);
  256. X  free(Inhalt);
  257. X  XtPopdown(file_s);
  258. }
  259. X
  260. /*****************************************************************************/
  261. /* Callbackfunktion fuer das Waehlen eines Eintrages in der Liste des List-  */
  262. /* widget. Prueft, ob Name eine Datei (Uebernahme in Dialogewidget) oder ein */
  263. /* Directory ist. (Wechsel in neues Directory,Liste neu erstellen)           */
  264. /*                                                                           */
  265. /* Aufruf: File_gewaehlt(w,client_data,call_data);                           */
  266. /*                                                                           */
  267. /* Funktion wird nur von X-Windows aufgerufen.                               */
  268. /*****************************************************************************/
  269. void File_gewaehlt(Widget w,caddr_t client_data,caddr_t call_data)
  270. {
  271. X  char name[LAENGE+2],          /* gekuerzter Eintragsnamen (ohne Blanks) */
  272. X       p_name[LAENGE2],         /* Pathname mit 50 Stellen */
  273. X       p_name2[LAENGE2];
  274. char name2[21];
  275. X  Arg args[1];                  /* Argumentvektor */
  276. X  char *stelle;                 /* Pointer auf erstes Blank im String */
  277. X  short i;                      /* Zaehler */
  278. X  XawListReturnStruct *feld;     /* Rueckgabe gewaehltes Feld(Listwidget) */
  279. X
  280. X  
  281. X  /* geklickter Dateinamen ermitteln */
  282. X  feld = XawListShowCurrent(w);  
  283. X
  284. X  /* Zeichenkette kopieren, damit Button nicht veraendert wird */
  285. X  strcpy(name,feld->string); 
  286. X  name[LAENGE+2] = '\0';
  287. X
  288. X  /* nachfolgende Blanks abschneiden */
  289. X  if((stelle=index(name,' ')) != NULL)  
  290. X    *stelle = '\0';
  291. X
  292. X  if (!(Is_direct(name)) && (name[0] != ' ')) /* Name nicht leer */
  293. X     /* Eintrag war Dateieintrag */
  294. X     {
  295. X     /* Eintrag wird in Labelfeld uebernommen */
  296. X     /* ohne direkt in Pointer zu schreiben wird der Wert nicht angezeigt */
  297. X     sprintf(name2,"%-20s",name);
  298. X     XtSetArg(args[0],XtNstring,name2);
  299. X     XtSetValues(((DialogWidget)text)->dialog.valueW,args,1);
  300. X     }
  301. X  else                                          
  302. X     {
  303. X     /* Eintrag war Directory */
  304. X     chdir(name);
  305. X
  306. X     /* Dialogfeld zur Ausgabe des aktuellen Verzeichnisnamen  aendern  */
  307. X     getcwd(p_name,LAENGE2);
  308. X     /* ohne direkt in Pointer zu schreiben wird Wert nicht angezeigt */
  309. X     sprintf(p_name2,"%-50.50s",p_name);
  310. X     XtSetArg(args[0],XtNstring,p_name2);
  311. X     XtSetValues(((DialogWidget)path)->dialog.valueW,args,1);
  312. X
  313. X     /* neue Liste erstellen und anzeigen */
  314. X     direct_to_list();
  315. X
  316. X     }
  317. X
  318. X
  319. X
  320. /*****************************************************************************/
  321. /* Funktion setzt einen String die Mitte eines Strings, der aus einer ueber- */
  322. /* gebenen Anzahl von Leerzeichen besteht.                                   */
  323. /*                                                                           */
  324. /* Aufruf: center(zeile,laenge);                                             */
  325. /*                                                                           */
  326. /* Parameter: char *zeile; String der positioniert werden soll.              */
  327. /*            short laenge; Laenge des neu erstellten Strings.               */
  328. /* Rueckgabe: char *; Pointer auf den neu erstellten String                  */
  329. /*                                                                           */
  330. /* !Vorsicht: der Speicher fuer den neuen String wird mit malloc belegt und! */
  331. /* !sollte daher vom spaeteren Benutzer wieder freigegeben werden          ! */
  332. /*****************************************************************************/
  333. char *center(char *zeile,short laenge)
  334. {
  335. X   char *neue_zeile;            /* neu erstellter String */
  336. X   short blanks,                /* Anzahl fuehrende Blanks */
  337. X     zeilen_laenge,         /* Laenge des uebergebenen Strings */
  338. X     i,s;
  339. X
  340. X   zeilen_laenge = strlen(zeile);
  341. X   neue_zeile = (char *)malloc((laenge+1) *sizeof(char));
  342. X
  343. X   /* am Anfang Blanks einfuegen */
  344. X   blanks = (int)((laenge - zeilen_laenge)/2);
  345. X
  346. X   /* gesamten String loeschen */
  347. X   for(i=0;i<=laenge;i++)
  348. X      neue_zeile[i] = ' ';
  349. X
  350. X   /* String uebernehmen */
  351. X   for(i=blanks;i<=blanks+zeilen_laenge-1;i++)
  352. X      neue_zeile[i] = zeile[i-blanks];
  353. X    
  354. X   neue_zeile[laenge] = '\0';
  355. X            
  356. X   return(neue_zeile);
  357. }
  358. /*****************************************************************************/
  359. /* Callbackfunktion fuer allgemeine Events die unterdreuckt werden sollen    */
  360. /* Die Funktion wird aufgerufen, raeumt den Stack auf und kehrt zureuck      */
  361. /*                                                                           */
  362. /* Aufruf: Dummy(widget,event,params,n_params);                              */
  363. /*                                                                           */
  364. /* Funktion wird nur von X-Windows aufgerufen.                               */
  365. /*****************************************************************************/
  366. /* Prozedur dient dazu unerwuenscht Events abzufangen */
  367. void Dummy(Widget widget,XEvent *event,String *params,Cardinal *n_params)
  368. {
  369. }
  370. X
  371. /*****************************************************************************/
  372. /* Funktion initialisiert Fileselectbox.(erstellt Widgets usw.)              */
  373. /* Diese Funktion wird i.A. nur einmal waehrend eines Programmes aufgerufen  */
  374. /*                                                                           */
  375. /* Aufruf: init_file_select(w);                                              */
  376. /*                                                                           */
  377. /* Parameter: Widget w; Widget im Baum, an das Fileselectbox gehangen wird   */
  378. /* Rueckgabe: PopupShell Widget, dass Fileselectbox Popup enthaelt           */
  379. /*****************************************************************************/
  380. Widget init_file_select(Widget w)     
  381. {
  382. X   Arg args[8];               /* Argumentvektor */
  383. X   Widget ok,                 /* Button fuer Ok */
  384. X      box,                /* Rahmen um ganze Fileselectbox */
  385. X      fenster,            /* ViewportWidget um Dir-Eintraege */
  386. X      cancel;             /* Button fuer Cancel */
  387. X   short anzahl;              /* Anzahl temporaere Variablen */
  388. X   XtTranslations trans;      /* Aktionsbeschreibung */
  389. X   /* hinzugefuegte Events bei den Dialogboxen */
  390. X   static XtActionsRec Return_null[]={{"Ok2_geklickt",Ok2_geklickt},};
  391. X   static XtActionsRec Patt_return[]={{"Patt_change",Patt_change},};
  392. X   static XtActionsRec Dummy_call[]={{"Dummy",Dummy},};
  393. X   static XtActionsRec Path_return[]={{"Path_changed",Path_changed},};
  394. X   static XtActionsRec Path_verlas[]={{"Path_leave",Path_leave},};
  395. X   
  396. X   Dimension breite;
  397. X
  398. X   /* Abfrage, so dass FileSelectbox nur einmal initialisiert wird */
  399. X   if(init_called)  /* bereits aufgerufen */
  400. X     return(file_s);
  401. X
  402. X   /* Funktion zum ersten mal aufgerufen Flag setzen */ 
  403. X   init_called = 1;                   
  404. X
  405. X   /* Pattern initialisieren */
  406. X   strcpy(patt_global,"*");
  407. X
  408. X   /* Voreinstellung fuer Dateiname ist Leerstrings */
  409. X   sprintf(_default,"%-21s"," ");
  410. X   sprintf(_default2,"%-51s"," ");
  411. X
  412. X   /* File_selectbox ist Popupshell */
  413. X   XtSetArg( args[0],XtNx, (XtArgVal) DEFAULT_X);
  414. X   XtSetArg( args[1],XtNy, (XtArgVal) DEFAULT_Y);
  415. X   file_s = XtCreatePopupShell("F1",transientShellWidgetClass,w,args,2);
  416. X   
  417. X   /* passender Rahmen um das Ganze */
  418. X   box = XtCreateManagedWidget("F2",formWidgetClass,file_s,NULL,0);
  419. X
  420. X   /* Labelfeld zur Ausgabe der Ueberschrift */           
  421. X   XtSetArg( args[0],XtNlabel, (XtArgVal) _default2);
  422. X   XtSetArg( args[1],XtNborderWidth, (XtArgVal) 4);
  423. X   XtSetArg( args[2],XtNvertDistance, (XtArgVal) ABSTAND);
  424. X   XtSetArg( args[3],XtNhorizDistance, (XtArgVal) ABSTAND);
  425. X   titel_zeile = XtCreateManagedWidget("F10",labelWidgetClass,box,args,4);
  426. X   
  427. X   /* Dialogfeld zur Ausgabe des aktuellen Verzeichnisnamen */
  428. X   XtSetArg( args[0],XtNvalue, (XtArgVal) _default2);
  429. X   XtSetArg( args[1],XtNvertDistance, (XtArgVal) ABSTAND);
  430. X   XtSetArg( args[2],XtNhorizDistance, (XtArgVal) ABSTAND);
  431. X   XtSetArg( args[3],XtNfromVert, (XtArgVal) titel_zeile);
  432. X   XtSetArg( args[4],XtNlabel,(XtArgVal) _default2);
  433. X   XtSetArg( args[5],XtNborderWidth, (XtArgVal) 0);       
  434. X   path = (DialogWidget)
  435. X    XtCreateManagedWidget("F9",dialogWidgetClass,box,args,6); 
  436. X   /* Labelfeld bei der Dialogbox nicht auf den Bildschirm */
  437. X   XtSetArg( args[0],XtNfromHoriz,(XtArgVal) NULL);
  438. X   XtSetArg( args[1],XtNfromVert, (XtArgVal) NULL);
  439. X   XtSetValues( path->dialog.valueW,args,2);
  440. X   XtUnmanageChild(path->dialog.labelW);
  441. X   XtSetArg(args[0],XtNwidth,&breite);
  442. X   XtGetValues(path->dialog.labelW,args,1);
  443. X   XtSetArg(args[0],XtNresize, XawtextResizeNever);
  444. X   XtSetArg(args[1],XtNwidth,breite);
  445. X   XtSetValues(path->dialog.valueW,args,2);
  446. X   /* Return innerhalb des Textfeldes abfangen */
  447. X   XtAppAddActions(XtWidgetToApplicationContext(path->dialog.valueW),
  448. X      Path_return,1);
  449. X   XtSetArg(args[0],XtNresize, XawtextResizeNever);
  450. X   XtSetValues(((DialogWidget)path)->dialog.valueW,args,1);
  451. X   trans=XtParseTranslationTable(":<Key>Return:Path_changed()");
  452. X   XtOverrideTranslations(path->dialog.valueW,trans);
  453. X   /* Eingabe von Leerzeichen im Filenamen ist verboten */
  454. X   XtAppAddActions(XtWidgetToApplicationContext(path->dialog.valueW),
  455. X      Dummy_call,1);
  456. X   trans=XtParseTranslationTable(":<Key>space:Dummy()");
  457. X   XtOverrideTranslations(path->dialog.valueW,trans);
  458. X   /* Wenn das Dialogfeld ohne Return verlassen wird, so muss der */
  459. X   /* Pfadname wieder korrekt angezeigt werden */
  460. X   XtAppAddActions(XtWidgetToApplicationContext(path->dialog.valueW),
  461. X      Path_verlas,1);
  462. X   trans=XtParseTranslationTable(":<LeaveWindow>:Path_leave()");
  463. X   XtAugmentTranslations(path->dialog.valueW,trans);
  464. X
  465. X   /* Viewport um automatischen Rollbalken zu erzeugen */
  466. X   XtSetArg( args[0],XtNallowVert, (XtArgVal) True);
  467. X   XtSetArg( args[1],XtNheight, (XtArgVal) HOEHE);
  468. X   XtSetArg( args[2],XtNwidth, (XtArgVal) WEITE);
  469. X   XtSetArg( args[3],XtNforceBars, (XtArgVal) True);
  470. X   XtSetArg( args[4],XtNfromVert, (XtArgVal) path);
  471. X   XtSetArg( args[5],XtNvertDistance, (XtArgVal) ABSTAND);
  472. X   XtSetArg( args[6],XtNhorizDistance, (XtArgVal) ABSTAND);
  473. X   fenster =XtCreateManagedWidget("F3",viewportWidgetClass,box,args,7);
  474. X  
  475. X   /* Directoryeintraege in ListWidget uebernehmen */
  476. X   anzahl = count_eintraege();
  477. X   XtSetArg( args[0],XtNverticalList, (XtArgVal) True);
  478. X   XtSetArg( args[1],XtNlist, (XtArgVal) directory_erstellen(anzahl));
  479. X   XtSetArg( args[2],XtNnumberStrings, (XtArgVal) anzahl);
  480. X   XtSetArg( args[3],XtNlongest, (XtArgVal) WEITE);
  481. X   XtSetArg( args[4],XtNwidth, (XtArgVal) WEITE);
  482. X   XtSetArg( args[5],XtNvertDistance, (XtArgVal) ABSTAND);
  483. X   list_direct = XtCreateManagedWidget("F5",listWidgetClass,fenster,args,6);
  484. X   XtAddCallback(list_direct,XtNcallback,File_gewaehlt,NULL);
  485. X
  486. X   /* Eingabefeld fuer Dateinamen */
  487. X   XtSetArg( args[0],XtNlabel, (XtArgVal) "    FILENAME <cr>   ");
  488. X   XtSetArg( args[1],XtNvalue, (XtArgVal) _default);
  489. X   XtSetArg( args[2],XtNvertDistance, (XtArgVal) (3*ABSTAND));
  490. X   XtSetArg( args[3],XtNfromVert, (XtArgVal) path);
  491. X   XtSetArg( args[4],XtNhorizDistance, (XtArgVal) (2*ABSTAND));
  492. X   XtSetArg( args[5],XtNfromHoriz, (XtArgVal) fenster);
  493. X   text =(DialogWidget)
  494. X     XtCreateManagedWidget("F6",dialogWidgetClass,box,args,6);
  495. X   XtSetArg(args[0],XtNwidth,&breite);
  496. X   XtGetValues(text->dialog.labelW,args,1);
  497. X   XtSetArg(args[0],XtNresize, XawtextResizeNever);
  498. X   XtSetArg(args[1],XtNwidth,breite);
  499. X   XtSetValues(text->dialog.valueW,args,2);
  500. X   XtSetArg(args[0],XtNresize, XawtextResizeNever);
  501. X   XtSetValues(((DialogWidget)text)->dialog.valueW,args,1);
  502. X
  503. X   /* Return abfangen */
  504. X   XtAppAddActions(XtWidgetToApplicationContext(text->dialog.valueW),
  505. X      Return_null,1);
  506. X   trans=XtParseTranslationTable(":<Key>Return:Ok2_geklickt()");
  507. X   XtOverrideTranslations(text->dialog.valueW,trans);
  508. X   /* Eingabe von Leerzeichen im Filenamen ist verboten */
  509. X   XtAppAddActions(XtWidgetToApplicationContext(text->dialog.valueW),
  510. X      Dummy_call,1);
  511. X   trans=XtParseTranslationTable(":<Key>space:Dummy()");
  512. X   XtOverrideTranslations(text->dialog.valueW,trans);
  513. X
  514. X   /* Eingabefeld fuer Pattern */
  515. X   XtSetArg( args[0],XtNlabel, (XtArgVal) "    FILETYPE <cr>   ");
  516. X   XtSetArg( args[1],XtNvalue, (XtArgVal) _default);
  517. X   XtSetArg( args[2],XtNvertDistance, (XtArgVal) ABSTAND);
  518. X   XtSetArg( args[3],XtNfromVert, (XtArgVal) text);
  519. X   XtSetArg( args[4],XtNhorizDistance, (XtArgVal) (2*ABSTAND));
  520. X   XtSetArg( args[5],XtNfromHoriz, (XtArgVal) fenster);
  521. X   patt_t=(DialogWidget)    
  522. X     XtCreateManagedWidget("F13",dialogWidgetClass,box,args,6);
  523. X   XtSetArg(args[0],XtNwidth,&breite);
  524. X   XtGetValues(patt_t->dialog.labelW,args,1);
  525. X   XtSetArg(args[0],XtNresize, XawtextResizeNever);
  526. X   XtSetArg(args[1],XtNwidth,breite);
  527. X   XtSetValues(patt_t->dialog.valueW,args,2);
  528. X   XtSetArg(args[0],XtNresize, XawtextResizeNever);
  529. X   XtSetValues(((DialogWidget)patt_t)->dialog.valueW,args,1);
  530. X   /* Return abfangen */
  531. X   XtAppAddActions(XtWidgetToApplicationContext(patt_t->dialog.valueW),
  532. X      Patt_return,1);
  533. X   trans=XtParseTranslationTable(":<Key>Return:Patt_change()");
  534. X   XtOverrideTranslations(patt_t->dialog.valueW,trans);
  535. X   /* Eingabe von Leerzeichen im Pattern ist verboten */
  536. X   XtAppAddActions(XtWidgetToApplicationContext(patt_t->dialog.valueW),
  537. X      Dummy_call,1);
  538. X   trans=XtParseTranslationTable(":<Key>space:Dummy()");
  539. X   XtOverrideTranslations(patt_t->dialog.valueW,trans);
  540. X
  541. X   /* Cancel Button */
  542. X   XtSetArg( args[0],XtNlabel, (XtArgVal) "        Cancel         ");
  543. X   XtSetArg( args[1],XtNvertDistance, (XtArgVal) (16*ABSTAND));
  544. X   XtSetArg( args[2],XtNfromVert, (XtArgVal) patt_t);
  545. X   XtSetArg( args[3],XtNhorizDistance, (XtArgVal) (2* ABSTAND));
  546. X   XtSetArg( args[4],XtNfromHoriz, (XtArgVal) fenster);
  547. X   cancel = XtCreateManagedWidget("F7",commandWidgetClass,box,args,5);
  548. X   XtAddCallback(cancel,XtNcallback,Cancel_geklickt,NULL);
  549. X
  550. X   /* OK Button */
  551. X   XtSetArg( args[0],XtNlabel,(XtArgVal) "        Accept         ");
  552. X   XtSetArg( args[1],XtNvertDistance, (XtArgVal) ABSTAND);
  553. X   XtSetArg( args[2],XtNfromVert, (XtArgVal) cancel);
  554. X   XtSetArg( args[3],XtNhorizDistance, (XtArgVal) (2*ABSTAND));
  555. X   XtSetArg( args[4],XtNfromHoriz, (XtArgVal) fenster);
  556. X   ok = XtCreateManagedWidget("F8",commandWidgetClass,box,args,5);
  557. X   XtAddCallback(ok,XtNcallback,Ok_geklickt,NULL);
  558. X
  559. X   return(file_s);
  560. }
  561. X
  562. X
  563. /*****************************************************************************/
  564. /* Funktion zum Aufruf der Fileselectbox.   (s.o)                            */
  565. /*                                                                           */
  566. /* Aufruf: File_select(x,y,patt,titel);                                      */
  567. /*****************************************************************************/
  568. char *file_select(char *patt,char *titel)
  569. {
  570. X   XtAppContext app_context;           /* Applikationskontext */
  571. X   XEvent event;                       /* Event */
  572. X   Arg args[2];                        /* Argumentvektor */
  573. X   char p_name[LAENGE2],               /* Path ion korrigierter Laenge */
  574. X    t_name[LAENGE2];               /* Titel in korrigierter Laenge */
  575. X   char *temp;                         /* Pointer zur Speicherfreigabe */
  576. X
  577. X   if( strlen(patt) > LAENGE || 
  578. X      strlen(titel) == 0 || strlen(titel) > LAENGE2 )
  579. X      {
  580. X
  581. X      printf("Die Argumente sind nicht korrekt !!! \n");
  582. X      return(NULL);
  583. X      }
  584. X   else 
  585. X      {
  586. X
  587. X      Liste = (String *)NULL;
  588. X      Inhalt = (char *)NULL;
  589. X
  590. X      /* uebergebenes Pattern in globale Variable uebernehmen */
  591. X      if(strlen(patt)!=0)
  592. X          strcpy(patt_global,patt);
  593. X      
  594. X      /* Titelzeile in Labelfeld uebernehmen */
  595. X      temp = center(titel,LAENGE2);  /* Ueberschrift zentrieren */
  596. X      strcpy(t_name,temp);
  597. X      free(temp);
  598. X      XtSetArg( args[0],XtNlabel,(XtArgVal) t_name);
  599. X      XtSetValues(titel_zeile,args,1);
  600. X
  601. X      /* aktuellen Pfadnamen im Dialogwidget anzeigen */
  602. X      temp = malloc(LAENGE2+1);
  603. X      getcwd(temp,LAENGE2);
  604. X      sprintf(p_name,"%-51s",temp);                        
  605. X      free(temp);
  606. X      /* Dialogfeld zur Ausgabe des aktuellen Verzeichnisnamen  aendern  */
  607. X      /* ohne direkt in Pointer zu schreiben wird Wert nicht angezeigt */
  608. X      XtSetArg(args[0],XtNstring,p_name);
  609. X      XtSetValues(((DialogWidget)path)->dialog.valueW,args,1);
  610. X
  611. X      /* Pattern in DialogWidget uebernehmen */
  612. X      /* ohne direkt in Pointer zu schreiben wird Wert nicht angezeigt */
  613. X      XtSetArg(args[0],XtNstring,patt_global);
  614. X      XtSetValues(((DialogWidget)patt_t)->dialog.valueW,args,1);
  615. X       
  616. X      /* aktuelles Directory eintragen */
  617. X      direct_to_list(); 
  618. X
  619. X      /* Fileselectbox auf dem Bildschirm anzeigen */
  620. X      XtPopup(file_s,XtGrabExclusive);
  621. X       
  622. X      /* Events im Popup selbst verwalten */
  623. X      app_context = XtWidgetToApplicationContext(file_s);
  624. X      while(((ShellWidget)file_s)->shell.popped_up)
  625. X      {
  626. X     XtAppNextEvent(app_context,&event);
  627. X     XtDispatchEvent(&event);
  628. X      }
  629. X
  630. X      } 
  631. X
  632. X   /* String bereits in beim OK-Button kontrolliert */
  633. X   return(filename);
  634. X
  635. X
  636. /*******************************************************************
  637. X * Center a popup in the middle of another widget if possible,     *
  638. X * otherwise make shure that the popup is visible on the screen    *
  639. X *******************************************************************/
  640. void centerpopup(Widget centerin,Widget tocenter)
  641. {
  642. Display *CurDpy;
  643. Position xin,yin,x,y;
  644. Dimension win,hin,wto,hto;
  645. Arg args[4];
  646. X
  647. CurDpy = XtDisplay(centerin);
  648. XXtRealizeWidget(tocenter);
  649. XXtSetArg(args[0],XtNwidth,&wto);
  650. XXtSetArg(args[1],XtNheight,&hto);
  651. XXtGetValues(tocenter,args,2);
  652. X
  653. XXtSetArg(args[0],XtNwidth,&win);
  654. XXtSetArg(args[1],XtNheight,&hin);
  655. XXtGetValues(centerin,args,2);
  656. X
  657. XXtTranslateCoords(centerin,0,0,&xin,&yin);
  658. X
  659. x = xin + win/2 - wto/2;
  660. y = yin + hin/2 - hto/2;
  661. if(x < 0)
  662. X    x = 0;
  663. if(y < 0)
  664. X    y = 0;
  665. if((x+wto) > DisplayWidth(CurDpy, DefaultScreen(CurDpy)))
  666. X    x = DisplayWidth(CurDpy, DefaultScreen(CurDpy)) - wto;
  667. if((y+hto) > DisplayHeight(CurDpy, DefaultScreen(CurDpy)))
  668. X    y = DisplayHeight(CurDpy, DefaultScreen(CurDpy)) - hto;
  669. X
  670. XXtSetArg(args[0],XtNx,x);
  671. XXtSetArg(args[1],XtNy,y);
  672. XXtSetValues(tocenter,args,2);
  673. XXWarpPointer(CurDpy,None,DefaultRootWindow(CurDpy),0,0,0,0,x+wto/2,y+hto/2);
  674. }
  675. X
  676. SHAR_EOF
  677. echo 'File file_sel.c is complete' &&
  678. chmod 0644 file_sel.c ||
  679. echo 'restore of file_sel.c failed'
  680. Wc_c="`wc -c < 'file_sel.c'`"
  681. test 36818 -eq "$Wc_c" ||
  682.     echo 'file_sel.c: original size 36818, current size' "$Wc_c"
  683. rm -f _shar_wnt_.tmp
  684. fi
  685. # ============= file_sel.h ==============
  686. if test -f 'file_sel.h' -a X"$1" != X"-c"; then
  687.     echo 'x - skipping file_sel.h (File already exists)'
  688.     rm -f _shar_wnt_.tmp
  689. else
  690. > _shar_wnt_.tmp
  691. echo 'x - extracting file_sel.h (Text)'
  692. sed 's/^X//' << 'SHAR_EOF' > 'file_sel.h' &&
  693. /* xtexcad  V1.2 - graphic editor for LaTeX */
  694. /* 1991 by K.Zitzmann */
  695. /* header-file file_sel.h */
  696. X
  697. #ifndef FILE_SELH
  698. #define FILE_SELH
  699. X
  700. X
  701. X
  702. X
  703. int Is_direct(char *name);
  704. short count_eintraege(void);
  705. int match(char *sstring,char *pattern);
  706. String *directory_erstellen(short anzahl);
  707. void direct_to_list(void);
  708. void Ok_geklickt(Widget w ,caddr_t client_data,caddr_t call_data);
  709. void Ok2_geklickt(Widget widget,XEvent *event,String *params,Cardinal *n_params);
  710. void Path_changed(Widget widget,XEvent *event,String *params,Cardinal *n_params);
  711. void Path_leave(Widget widget,XEvent *event,String *params,Cardinal *n_params);
  712. void Patt_change(Widget widget,XEvent *event,String *params,Cardinal *n_params);
  713. void Cancel_geklickt(Widget w,caddr_t client_data,caddr_t call_data);
  714. void File_gewaehlt(Widget w,caddr_t client_data,caddr_t call_data);
  715. char *center(char *zeile,short laenge);
  716. void Dummy(Widget widget,XEvent *event,String *params,Cardinal *n_params);
  717. Widget init_file_select(Widget w);
  718. char *file_select(char *patt,char *titel);
  719. X
  720. X
  721. #endif
  722. X
  723. X
  724. X
  725. X
  726. X
  727. X
  728. SHAR_EOF
  729. chmod 0644 file_sel.h ||
  730. echo 'restore of file_sel.h failed'
  731. Wc_c="`wc -c < 'file_sel.h'`"
  732. test 1046 -eq "$Wc_c" ||
  733.     echo 'file_sel.h: original size 1046, current size' "$Wc_c"
  734. rm -f _shar_wnt_.tmp
  735. fi
  736. # ============= graphics.c ==============
  737. if test -f 'graphics.c' -a X"$1" != X"-c"; then
  738.     echo 'x - skipping graphics.c (File already exists)'
  739.     rm -f _shar_wnt_.tmp
  740. else
  741. > _shar_wnt_.tmp
  742. echo 'x - extracting graphics.c (Text)'
  743. sed 's/^X//' << 'SHAR_EOF' > 'graphics.c' &&
  744. /* xtexcad  V1.2 - graphic editor for LaTeX */
  745. /* 1991 by K.Zitzmann */
  746. /* graphics.c */
  747. X
  748. #include "x_stuff.h"
  749. #include "oberfl.h"
  750. #include "ereignis.h"
  751. #include "io_trans.h"
  752. #include "graphics.h"
  753. #include <math.h>
  754. #include <ctype.h>
  755. X
  756. X
  757. X
  758. X
  759. X
  760. int black_white_patch = (1==0); /* JM */
  761. X
  762. X
  763. X
  764. /* the LaTeX-dilemma : restricted slopes, length and diameters */
  765. X
  766. /* possible line slopes */
  767. /*
  768. X * the constants indicate the possible values for the numerator or
  769. X * denominator of the fraction which represents the slope, i.e "6" means,
  770. X * values from -6 to 6
  771. X */
  772. /*
  773. X * convention : some TeX implementations support unlimited slopes, diameters
  774. X * and length. This might be indicated by changing the r-value to 0 !!!
  775. X */
  776. X
  777. int             line_slope = 6;
  778. int             slope_line = 6;    /* a copy */
  779. int             arrow_slope = 4;
  780. int             slope_arrow = 4;    /* a copy */
  781. int             line_length = 10;    /* each line/arrow must be 10 points
  782. X                     * long */
  783. /* const circle_diameter[0]={-1}; */
  784. /* diameters must! be sorted by size */
  785. /* -1 is an end-marker */
  786. int             circle_diameter[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 20, 24, 28, 32, 36, 40, -1};
  787. int             disc_diameter[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, -1};
  788. int             rast_height = 40;
  789. X
  790. float           l_slope[30][3];    /* static !!! depends on 'line_slope' !!!! */
  791. float           a_slope[20][3];    /* dito! */
  792. Boolean         visible;
  793. int        ab=-9;
  794. Widget        muschel; /* popup-shell for textedit */
  795. Widget        fb_muschel; /* popup-shell ... */
  796. Widget        db_muschel; /* popup-shell ... */
  797. X
  798. struct textdel {
  799. X        Widget tg; /* pointer to the togglewidget */
  800. X        void *obj; /* pointer to text */
  801. X        } mem[10];        
  802. X
  803. X
  804. X
  805. X
  806. X
  807. void
  808. transform(char *name)
  809. {
  810. X    /* eliminates all special characters in this string */
  811. X
  812. X    char           *buffer;
  813. X    int             i, k, name_length;
  814. X
  815. X
  816. X
  817. X    name_length = strlen(name);
  818. X
  819. X    buffer = (char *) malloc(name_length + 1);
  820. X
  821. X    strcpy(buffer, name);
  822. X
  823. X    for (i = 0, k = 0; (i <= name_length), (buffer[i] != '\0'); i++)
  824. X    {
  825. X        if (isprint(buffer[i]))
  826. X            name[k++] = buffer[i];
  827. X    }
  828. X
  829. X    if (name[k - 1] != '\0')
  830. X        name[k] = '\0';
  831. X
  832. X    free(buffer);
  833. X
  834. X
  835. }
  836. X
  837. X
  838. X
  839. X
  840. X
  841. void
  842. make_GCcontext()
  843. {
  844. X    /* make a GC */
  845. X
  846. X    XGCValues       gcvals;
  847. X    Display        *disp=XtDisplay(toplevel);
  848. X    Drawable        win=(Drawable)XtWindow(toplevel);
  849. X    unsigned long   maske;
  850. X    char            d_list[5];
  851. X    Screen        *scr=XtScreen(toplevel);
  852. X
  853. X
  854. X    gcvals.foreground = BlackPixel(disp,XScreenNumberOfScreen(scr));
  855. X    gcvals.background = WhitePixel(disp,XScreenNumberOfScreen(scr));
  856. X    gcvals.line_width = 0;
  857. X    gcvals.plane_mask = AllPlanes;
  858. X    gcvals.line_style = LineSolid;
  859. X    gcvals.cap_style = CapButt;
  860. X    gcvals.join_style = JoinMiter;
  861. X    gcvals.fill_style = FillSolid;
  862. X    gcvals.fill_rule = WindingRule;
  863. X    gcvals.dash_offset = 5;
  864. X    
  865. X    /* gcvals.function = GXxor; */ 
  866. X    /* JM */ 
  867. X    /* starts here... */
  868. X    black_white_patch = (gcvals.foreground == 0);
  869. X    if (black_white_patch)
  870. X        gcvals.function = GXequiv;
  871. X    else
  872. X        gcvals.function = GXxor;
  873. X    /* ...ends here ! */
  874. X
  875. X    maske = (GCForeground | GCBackground | GCLineWidth | GCLineWidth |
  876. X    GCPlaneMask | GCLineStyle | GCCapStyle | GCJoinStyle | GCFillStyle |
  877. X         GCFillRule | GCDashOffset | GCFunction);
  878. X
  879. X
  880. X    gc = XCreateGC(disp, win, maske, &gcvals);
  881. X
  882. X    /* for dashed lines only */
  883. X    copy_gc = XCreateGC(disp, win, maske, &gcvals);
  884. X
  885. X    d_list[0] = 3;
  886. X    d_list[1] = 10;
  887. X    d_list[2] = '\0';
  888. X    XSetLineAttributes(disp, copy_gc, 0, LineOnOffDash, CapButt, JoinMiter);
  889. X    XSetDashes(disp, copy_gc, 0, d_list, strlen(d_list));
  890. X
  891. X
  892. X
  893. }
  894. X
  895. X
  896. void
  897. PointerPosition(int *x, int *y, unsigned int *mask)
  898. {
  899. X    /* return the (relative) coordinates of the pointer in pboard */
  900. X    /* XQueryPointer returns origin-coordinates: (-1,-1) !!! */
  901. X    /* origin is top-left */
  902. X
  903. X    Display        *disp;
  904. X    Window          win, egal1, egal2;
  905. X    int             h, v;
  906. X    Bool            result;
  907. X    disp = XtDisplay(pboard);
  908. X    win = XtWindow(pboard);
  909. X    result = XQueryPointer(disp, win, &egal1, &egal2, &h, &v, x, y, mask);
  910. X    /* important parameters are disp,win,x,y */
  911. X    /* result==False is an impossible error ! */
  912. X    /* corrections of origin : */
  913. X
  914. X    if ((*x) < 0)
  915. X        x = 0;
  916. X    if ((*y) < 0)
  917. X        y = 0;
  918. X
  919. X
  920. }/* function returns the x,y coordinates of the pointer in pboard */
  921. X
  922. X
  923. void
  924. snapPointerPosition(int *x, int *y, unsigned int *mask)
  925. {
  926. X    PointerPosition(x, y, mask);
  927. X    if ((snap == True) && (raster == True))
  928. X        valid_snap_coords(x, y);
  929. }
  930. X
  931. X
  932. void
  933. valid_snap_coords(int *x, int *y)
  934. {
  935. X    /* compute the coordinates of the nearest raster-node */
  936. X    int             res, h = rast_height;
  937. X    float           a, b;
  938. X    a = (float) (*x);
  939. X    b = (float) (*y);
  940. X
  941. X    if (zoomed == True)
  942. X        zoomed2real(&a, &b);
  943. X
  944. X    (*x) = (int) a;
  945. X    (*y) = (int) b;
  946. X
  947. X    res = (h / 2 + (*x)) / h;
  948. X    (*x) = res * h;
  949. X
  950. X    res = (h / 2 + (*y)) / h;
  951. X    (*y) = res * h;
  952. X
  953. X
  954. X    a = (float) (*x);
  955. X    b = (float) (*y);
  956. X
  957. X    if (zoomed == True)
  958. X        real2zoomed(&a, &b);
  959. X
  960. X    (*x) = (int) a;
  961. X    (*y) = (int) b;
  962. X
  963. X
  964. }
  965. X
  966. X
  967. void
  968. set_TM_btn1_first(Widget w, XEvent * event, String * id, Cardinal * num)
  969. {
  970. X    switch (graph_action)
  971. X    {
  972. X    case 'Z':set_zoom_window();
  973. X        break;
  974. X
  975. X    case 'T':
  976. X        set_text_input();
  977. X        break;
  978. X
  979. X    case 'P':
  980. X        set_pick_object();
  981. X        break;
  982. X
  983. X    case 'Y':
  984. X        set_copy_object();
  985. X        break;
  986. X
  987. X    case 'G':
  988. X        set_pick_erase();
  989. X        break;
  990. X
  991. X    default:
  992. X        set_first();
  993. X        break;
  994. X    }
  995. }
  996. X
  997. X
  998. void
  999. set_first()
  1000. {
  1001. X    /* sets the translation manager of pboard */
  1002. X    /* if button is pressed, execute the function */
  1003. X
  1004. X    /* Override Translation Manager */
  1005. X    XtTranslations  trans_table;
  1006. X    char            destination[80] = "<Btn1Down>: btn1_press_first()";
  1007. X    static XtActionsRec actions[80] = {{"btn1_press_first", btn1_press_first}};
  1008. X    XtAddActions(actions, XtNumber(actions));
  1009. X    trans_table = XtParseTranslationTable(destination);
  1010. X    XtOverrideTranslations(pboard, trans_table);
  1011. X
  1012. }
  1013. X
  1014. void
  1015. set_text_input()
  1016. {
  1017. X    /* does the same (as the function above) for 'text' */
  1018. X    /* Override Translation Manager */
  1019. X    XtTranslations  trans_table;
  1020. X    char            destination[80] = "<Btn1Down>: manage_text_input()";
  1021. X    static XtActionsRec actions[80] = {{"manage_text_input", manage_text_input}};
  1022. X    XtAddActions(actions, XtNumber(actions));
  1023. X    trans_table = XtParseTranslationTable(destination);
  1024. X    XtOverrideTranslations(pboard, trans_table);
  1025. X
  1026. }
  1027. X
  1028. void print_head(char ch)
  1029. {
  1030. X  char txt[80];
  1031. X
  1032. X    strcpy(txt, titlename);
  1033. X    strcat(txt, "  :  ");
  1034. X
  1035. X    switch (ch)
  1036. X    {
  1037. X        case 'L':strcat(txt,"#### Line ####");
  1038. X             break;
  1039. X        case 'I':strcat(txt,"#### Bezier ####");
  1040. X             break;
  1041. X        case 'V':strcat(txt,"#### Vector ####");
  1042. X             break;
  1043. X        case 'N':strcat(txt,"#### Box --> framed ####");
  1044. X             break;
  1045. X        case 'D':strcat(txt,"#### Box --> dashed ####");
  1046. X             break;
  1047. X        case 'F':strcat(txt,"#### Box --> filled ####");
  1048. X             break;
  1049. X        case 'O':strcat(txt,"#### Circle --> oval ####");
  1050. X             break;
  1051. X        case 'C':strcat(txt,"#### Circle --> normal ####");
  1052. X             break;
  1053. X        case 'B':strcat(txt,"#### Circle --> filled ####");
  1054. X             break;
  1055. X        default :strcat(txt,titlename);
  1056. X             break;
  1057. X    }
  1058. X    
  1059. X    headline(toplevel,txt);
  1060. X
  1061. }
  1062. X
  1063. X
  1064. void
  1065. leave_translation()
  1066. {
  1067. X  char              destination[80] = "<LeaveWindow> : left() \n";
  1068. X  static         XtActionsRec actions[80] = {{"left", left}};
  1069. X  XtTranslations      trans_table;
  1070. X
  1071. X
  1072. X    XtAddActions(actions, XtNumber(actions));
  1073. X    trans_table = XtParseTranslationTable(destination);
  1074. X    XtOverrideTranslations(pboard, trans_table);
  1075. }
  1076. X
  1077. X
  1078. void
  1079. newline()
  1080. {
  1081. X  char ch;
  1082. X  
  1083. X    /* button 3 or 4 was pressed, start drawing a new line (object) */
  1084. X
  1085. X    XtUninstallTranslations(pboard);    
  1086. X
  1087. X    leave_translation();
  1088. X    ch=graph_action;
  1089. X    leaving();
  1090. X    leave_translation();
  1091. X    print_head(ch);
  1092. X    graph_action=ch;
  1093. X    set_first();
  1094. X    
  1095. }
  1096. X
  1097. X
  1098. void
  1099. btn1_press_first(Widget w, XEvent * event, String * id, Cardinal * num)
  1100. {
  1101. X    /* ------------------------------------------------------------- */
  1102. X    /* btn1 in pboard was pressed for the first time */
  1103. X    /* ------------------------------------------------------------- */
  1104. X
  1105. X    XtTranslations  trans_table;
  1106. X    char            destination[80] = "<LeaveNotify>: leaving()";
  1107. X    char            destination2[80] = "<Btn2Down>: newline()\n\
  1108. X                        <Btn3Down>: newline()\n";
  1109. X    static XtActionsRec actions[80] = {{"leaving", leaving},
  1110. X                       {"newline", newline}
  1111. X                      };
  1112. X    int             x, y;
  1113. X    unsigned int    mask;
  1114. X
  1115. X
  1116. X
  1117. X
  1118. X    /* get the position of the pointer */
  1119. X    snapPointerPosition(&x, &y, &mask);
  1120. X
  1121. X    /* install interrupt-action */
  1122. X    XtAddActions(actions, XtNumber(actions));
  1123. X    trans_table = XtParseTranslationTable(destination);
  1124. X    XtOverrideTranslations(pboard, trans_table);
  1125. X    trans_table = XtParseTranslationTable(destination2);
  1126. X    XtOverrideTranslations(pboard, trans_table);
  1127. X
  1128. X
  1129. X
  1130. X
  1131. X    /* prepare the 2nd btn1-press */
  1132. X    set_TM_btn1_second();
  1133. X
  1134. X
  1135. X
  1136. X
  1137. X    /* store the coordinates */
  1138. X    switch (graph_action)
  1139. X    {
  1140. X    case 'I':
  1141. X        if (bezier_start == NULL)
  1142. X        {    /* first entry */
  1143. X            bezier_start = (struct fig6 *) malloc(sizeof(bezier));
  1144. X            bezier_curr = bezier_start;
  1145. X        } else
  1146. X        {    /* insert at end */
  1147. X            bezier_curr->next = (struct fig6 *) malloc(sizeof(bezier));
  1148. X            bezier_curr = bezier_curr->next;
  1149. X        }
  1150. X        bezier_curr->ax = (float) x;
  1151. X        bezier_curr->ay = (float) y;
  1152. X        bezier_curr->ex= -999.0;    /* special marker */
  1153. X        bezier_curr->next = NULL;
  1154. X        break;    /* bezier_curr points to (incomplete) structure */
  1155. X
  1156. X    case 'L':
  1157. X        if (strich_start == NULL)
  1158. X        {    /* first entry */
  1159. X            strich_start = (struct fig2 *) malloc(sizeof(strich));
  1160. X            strich_curr = strich_start;
  1161. X        } else
  1162. X        {    /* insert at end */
  1163. X            strich_curr->next = (struct fig2 *) malloc(sizeof(strich));
  1164. X            strich_curr = strich_curr->next;
  1165. X        }
  1166. X        strich_curr->x = (float) x;
  1167. X        strich_curr->y = (float) y;
  1168. X        strich_curr->h = -999.0;    /* special marker */
  1169. X        strich_curr->next = NULL;
  1170. X        break;    /* strich_curr points to (incomplete) structure */
  1171. X
  1172. X    case 'V':
  1173. X        if (pfeil_start == NULL)
  1174. X        {    /* first entry */
  1175. X            pfeil_start = (struct fig2 *) malloc(sizeof(pfeil));
  1176. X            pfeil_curr = pfeil_start;
  1177. X        } else
  1178. X        {    /* insert at end */
  1179. X            pfeil_curr->next = (struct fig2 *) malloc(sizeof(pfeil));
  1180. X            pfeil_curr = pfeil_curr->next;
  1181. X        }
  1182. X        pfeil_curr->x = (float) x;
  1183. X        pfeil_curr->y = (float) y;
  1184. X        pfeil_curr->h = -999.0;     /* special marker */
  1185. X        pfeil_curr->next = NULL;
  1186. X        break;    /* pfeil_curr points to (incomplete) structure */
  1187. X
  1188. X    case 'N':
  1189. X        if (framedBox_start == NULL)
  1190. X        {    /* first entry */
  1191. X            framedBox_start = (struct fig3 *) malloc(sizeof(framedBox));
  1192. X            framedBox_curr = framedBox_start;
  1193. X        } else
  1194. X        {    /* insert at end */
  1195. X            framedBox_curr->next = (struct fig3 *) malloc(sizeof(framedBox));
  1196. X            framedBox_curr = framedBox_curr->next;
  1197. X        }
  1198. X        framedBox_curr->x = (float) x;
  1199. X        framedBox_curr->y = (float) y;
  1200. X        framedBox_curr->h = -999;    /* special marker */
  1201. X        framedBox_curr->next = NULL;
  1202. X        break;    /* framedBox_curr points to (incomplete) structure */
  1203. X
  1204. X    case 'D':
  1205. X        if (dashedBox_start == NULL)
  1206. X        {    /* first entry */
  1207. X            dashedBox_start = (struct fig4 *) malloc(sizeof(dashedBox));
  1208. X            dashedBox_curr = dashedBox_start;
  1209. X        } else
  1210. X        {    /* insert at end */
  1211. X            dashedBox_curr->next = (struct fig4 *) malloc(sizeof(dashedBox));
  1212. X            dashedBox_curr = dashedBox_curr->next;
  1213. X        }
  1214. X        dashedBox_curr->x = (float) x;
  1215. X        dashedBox_curr->y = (float) y;
  1216. X        dashedBox_curr->h = -999;    /* special marker */
  1217. X        dashedBox_curr->next = NULL;
  1218. X        break;    /* dashedBox_curr points to (incomplete) structure */
  1219. X
  1220. X    case 'F':
  1221. X        if (filledBox_start == NULL)
  1222. X        {    /* first entry */
  1223. X            filledBox_start = (struct fig2 *) malloc(sizeof(filledBox));
  1224. X            filledBox_curr = filledBox_start;
  1225. X        } else
  1226. X        {    /* insert at end */
  1227. X            filledBox_curr->next = (struct fig2 *) malloc(sizeof(filledBox));
  1228. X            filledBox_curr = filledBox_curr->next;
  1229. X        }
  1230. X        filledBox_curr->x = (float) x;
  1231. X        filledBox_curr->y = (float) y;
  1232. X        filledBox_curr->h = -999;    /* special marker */
  1233. X        filledBox_curr->next = NULL;
  1234. X        break;    /* filledBox_curr points to (incomplete) structure */
  1235. X
  1236. X    case 'C':
  1237. X        if (kreis_start == NULL)
  1238. X        {    /* first entry */
  1239. X            kreis_start = (struct fig2 *) malloc(sizeof(kreis));
  1240. X            kreis_curr = kreis_start;
  1241. X        } else
  1242. X        {    /* insert at end */
  1243. X            kreis_curr->next = (struct fig2 *) malloc(sizeof(kreis));
  1244. X            kreis_curr = kreis_curr->next;
  1245. X        }
  1246. X        kreis_curr->x = (float) x;
  1247. X        kreis_curr->y = (float) y;
  1248. X        kreis_curr->h = -999;    /* special marker */
  1249. X        kreis_curr->next = NULL;
  1250. X        break;    /* kreis_curr points to (incomplete) structure */
  1251. X
  1252. X    case 'B':
  1253. X        if (disc_start == NULL)
  1254. X        {    /* first entry */
  1255. X            disc_start = (struct fig2 *) malloc(sizeof(disc));
  1256. X            disc_curr = disc_start;
  1257. X        } else
  1258. X        {    /* insert at end */
  1259. X            disc_curr->next = (struct fig2 *) malloc(sizeof(disc));
  1260. X            disc_curr = disc_curr->next;
  1261. X        }
  1262. X        disc_curr->x = (float) x;
  1263. X        disc_curr->y = (float) y;
  1264. X        disc_curr->h = -999;    /* special marker */
  1265. X        disc_curr->next = NULL;
  1266. X        break;    /* disc_curr points to (incomplete) structure */
  1267. X
  1268. X    case 'O':
  1269. X        if (oval_start == NULL)
  1270. X        {    /* first entry */
  1271. X            oval_start = (struct fig1 *) malloc(sizeof(oval));
  1272. X            oval_curr = oval_start;
  1273. X        } else
  1274. X        {    /* insert at end */
  1275. X            oval_curr->next = (struct fig1 *) malloc(sizeof(oval));
  1276. X            oval_curr = oval_curr->next;
  1277. X        }
  1278. X        oval_curr->x = (float) x;
  1279. X        oval_curr->y = (float) y;
  1280. X        oval_curr->h = -999;    /* special marker */
  1281. X        oval_curr->next = NULL;
  1282. X        break;    /* oval_curr points to (incomplete) structure */
  1283. X
  1284. X    default:
  1285. X        break;
  1286. X    }    /* switch */
  1287. X
  1288. X    enable_tracker();
  1289. X
  1290. X
  1291. }
  1292. X
  1293. X
  1294. X
  1295. X
  1296. X
  1297. void
  1298. set_TM_btn1_second()
  1299. {
  1300. X    /*
  1301. X     * btn1 was pressed for the first time in pboard. Now, prepare the
  1302. X     * second btn1-press
  1303. X     */
  1304. X
  1305. X    /* Override Translation Manager */
  1306. X    XtTranslations  trans_table;
  1307. X    char            destination[80] = "<Btn1Down>: btn1_press_second()";
  1308. X    static XtActionsRec actions[80] = {{"btn1_press_second", btn1_press_second}};
  1309. X    XtAddActions(actions, XtNumber(actions));
  1310. X    trans_table = XtParseTranslationTable(destination);
  1311. X    XtOverrideTranslations(pboard, trans_table);
  1312. }
  1313. X
  1314. X
  1315. X
  1316. void
  1317. btn1_press_second(Widget w, XEvent * event, String * id, Cardinal * num)
  1318. {
  1319. X    /* button was pressed in pboard (for the 2nd time) */
  1320. X    int             x, y, r;
  1321. X    float           a1, a2, e1, e2;
  1322. X    Display        *disp;
  1323. X    Drawable        win;
  1324. X    char         ch=graph_action;
  1325. X    int        lenn=81;
  1326. X
  1327. X
  1328. X    disp = XtDisplay(pboard);
  1329. X    win = XtWindow(pboard);
  1330. X
  1331. X    track_it(&x, &y);    /* the rubber-band-tracker */
  1332. X
  1333. X
  1334. X    switch (graph_action)
  1335. X    {
  1336. X    case 'I':
  1337. X        /* bezier_curr points to incomplete srtucture */
  1338. X        XtUninstallTranslations(pboard);
  1339. X        bezier_curr->ex = (float) x;
  1340. X        bezier_curr->ey = (float) y;
  1341. X        /* delete the line */
  1342. X        XDrawLine(disp,win,gc,(int)bezier_curr->ax,(int)bezier_curr->ay,(int)x,(int)y);
  1343. X        if (zoomed == True)
  1344. X        {
  1345. X            /* translate first coordinate to real-system */
  1346. X            zoomed2real(&bezier_curr->ax,&bezier_curr->ay);
  1347. X            /* translate second coordinate to real-system */
  1348. X            zoomed2real(&bezier_curr->ex,&bezier_curr->ey);
  1349. X        }
  1350. X        bezier_curr->sx=-999.0; /* special marker */
  1351. X        set_lastBezier_press(); /* watch 3rd btn1-press */
  1352. X        break;
  1353. X
  1354. X    case 'L':    /* correct coordinates */
  1355. X        valid_line_coords((int) strich_curr->x, (int) strich_curr->y, &x, &y);
  1356. X        /* strich_curr points to incomplete srtucture */
  1357. X        strich_curr->h = (float) x;
  1358. X        strich_curr->v = (float) y;
  1359. X        if (zoomed == True)
  1360. X        {
  1361. X            /* translate first coordinate to real-system */
  1362. X            a1 = strich_curr->x;
  1363. X            a2 = strich_curr->y;
  1364. X            zoomed2real(&a1, &a2);
  1365. X            strich_curr->x = a1;
  1366. X            strich_curr->y = a2;
  1367. X
  1368. X            /* translate second coordinate to real-system */
  1369. X
  1370. X            e1 = strich_curr->h;
  1371. X            e2 = strich_curr->v;
  1372. X            zoomed2real(&e1, &e2);
  1373. X            strich_curr->h = e1;
  1374. X            strich_curr->v = e2;
  1375. X        }
  1376. X        /* create new struct */
  1377. X        strich_curr->next = (struct fig2 *) malloc(sizeof(strich));
  1378. X        strich_curr = strich_curr->next;
  1379. X        strich_curr->x = (float) x;
  1380. X        strich_curr->y = (float) y;
  1381. X        strich_curr->h = -999;    /* special marker */
  1382. X        strich_curr->next = NULL;
  1383. X        break;    /* strich_curr points to (incomplete) structure */
  1384. X
  1385. X    case 'V':    /* correct coordinates */
  1386. X        valid_vector_coords((int) pfeil_curr->x, (int) pfeil_curr->y, &x, &y);
  1387. X        /* pfeil_curr points to incomplete srtucture */
  1388. X        pfeil_curr->h = (float) x;
  1389. X        pfeil_curr->v = (float) y;
  1390. X        draw_vector_marker(pfeil_curr->x, pfeil_curr->y, pfeil_curr->h, pfeil_curr->v);
  1391. X        if (zoomed == True)
  1392. X        {
  1393. X            /* translate first coordinate to real-system */
  1394. X            a1 = pfeil_curr->x;
  1395. X            a2 = pfeil_curr->y;
  1396. X            zoomed2real(&a1, &a2);
  1397. X            pfeil_curr->x = a1;
  1398. X            pfeil_curr->y = a2;
  1399. X
  1400. X            /* translate second coordinate to real-system */
  1401. X
  1402. X            e1 = pfeil_curr->h;
  1403. X            e2 = pfeil_curr->v;
  1404. X            zoomed2real(&e1, &e2);
  1405. X            pfeil_curr->h = e1;
  1406. X            pfeil_curr->v = e2;
  1407. X        }
  1408. X        /* create new struct */
  1409. X        pfeil_curr->next = (struct fig2 *) malloc(sizeof(pfeil));
  1410. X        pfeil_curr = pfeil_curr->next;
  1411. X        pfeil_curr->x = (float) x;
  1412. X        pfeil_curr->y = (float) y;
  1413. X        pfeil_curr->h = -999;    /* special marker */
  1414. X        pfeil_curr->next = NULL;
  1415. X        break;    /* pfeil_curr points to (incomplete) structure */
  1416. X
  1417. X    case 'N':    /* framedBox_curr points to incomplete structure */
  1418. X        /* forget translations */
  1419. X        XtUninstallTranslations(pboard); 
  1420. X        framedBox_curr->h = (float) x;
  1421. X        framedBox_curr->v = (float) y;
  1422. X        norm_rectangle(&framedBox_curr->x, &framedBox_curr->y,
  1423. X                   &framedBox_curr->h, &framedBox_curr->v);
  1424. X        if (zoomed == True)
  1425. X        {
  1426. X            /* translate first coordinate to real-system */
  1427. X            a1 = framedBox_curr->x;
  1428. X            a2 = framedBox_curr->y;
  1429. X            zoomed2real(&a1, &a2);
  1430. X            framedBox_curr->x = a1;
  1431. X            framedBox_curr->y = a2;
  1432. X
  1433. X            /* translate second coordinate to real-system */
  1434. X
  1435. X            e1 = framedBox_curr->h;
  1436. X            e2 = framedBox_curr->v;
  1437. X            zoomed2real(&e1, &e2);
  1438. X            framedBox_curr->h = e1;
  1439. X            framedBox_curr->v = e2;
  1440. X        }
  1441. X        /* ask for text in box */
  1442. X        txtpos[0] = 'X';
  1443. X        txtpos[1] = 'X';
  1444. X        query_box_text_and_position();
  1445. X        /* now, txtpos contains the position of the text in your box */
  1446. X        /* boxinput contains the text-string */
  1447. X        if (txtpos[0] == '?')    /* cancel option */
  1448. X            leaving();
  1449. X        else
  1450. X        {
  1451. X            if (lenn<1+strlen(boxinput)) lenn=1+strlen(boxinput);
  1452. X            framedBox_curr->text = (char *) malloc(lenn);
  1453. X            strcpy(framedBox_curr->text, boxinput);
  1454. X            strcpy(framedBox_curr->textpos, txtpos);
  1455. X            /* draw the shadow-style */
  1456. X            draw_the_shadow((void *) framedBox_curr, nn);
  1457. X            /* the global variable <shadow> decides, which shadow */
  1458. X            /* will be drawn */
  1459. X            left();
  1460. X        }
  1461. X        graph_action='N';
  1462. X        print_head(graph_action);
  1463. X        leave_translation();
  1464. X        set_first();    
  1465. X        break;    /* framedBox terminated */
  1466. X
  1467. X    case 'D':    /* dashedBox_curr points to incomplete structure */
  1468. X        /* forget translations */
  1469. X        XtUninstallTranslations(pboard);
  1470. X        dashedBox_curr->h = (float) x;
  1471. X        dashedBox_curr->v = (float) y;
  1472. X        norm_rectangle(&dashedBox_curr->x, &dashedBox_curr->y,
  1473. X                   &dashedBox_curr->h, &dashedBox_curr->v);
  1474. X        if (zoomed == True)
  1475. X        {
  1476. X            /* translate first coordinate to real-system */
  1477. X            a1 = dashedBox_curr->x;
  1478. X            a2 = dashedBox_curr->y;
  1479. X            zoomed2real(&a1, &a2);
  1480. X            dashedBox_curr->x = a1;
  1481. X            dashedBox_curr->y = a2;
  1482. X
  1483. X            /* translate second coordinate to real-system */
  1484. X
  1485. X            e1 = dashedBox_curr->h;
  1486. X            e2 = dashedBox_curr->v;
  1487. X            zoomed2real(&e1, &e2);
  1488. X            dashedBox_curr->h = e1;
  1489. X            dashedBox_curr->v = e2;
  1490. X        }
  1491. X        /* ask for text in box */
  1492. X        txtpos[0] = 'X';
  1493. X        txtpos[1] = 'X';
  1494. X        query_box_text_and_position();
  1495. X        /* now, txtpos contains the position of the text in your box */
  1496. X        /* boxinput contains the text-string */
  1497. X        if (txtpos[0] == '?')    /* cancel option */
  1498. X            leaving();
  1499. X        else
  1500. X        {
  1501. X            if (lenn<1+strlen(boxinput)) lenn=1+strlen(boxinput);
  1502. X            dashedBox_curr->text = (char *) malloc(lenn);
  1503. X            strcpy(dashedBox_curr->text, boxinput);
  1504. X            strcpy(dashedBox_curr->textpos, txtpos);
  1505. X            dashedBox_curr->dashlength = 0.5;    /* constant */
  1506. X            /* draw the shadow-style */
  1507. X            draw_the_shadow((void *) dashedBox_curr, dd);
  1508. SHAR_EOF
  1509. true || echo 'restore of graphics.c failed'
  1510. fi
  1511. echo 'End of  part 2'
  1512. echo 'File graphics.c is continued in part 3'
  1513. echo 3 > _shar_seq_.tmp
  1514. exit 0
  1515. -- 
  1516. --
  1517. Molecular Simulations, Inc.            mail: dcmartin@msi.com
  1518. 796 N. Pastoria Avenue                uucp: uunet!dcmartin
  1519. Sunnyvale, California 94086            at&t: 408/522-9236
  1520.