PageRenderTime 380ms CodeModel.GetById 21ms RepoModel.GetById 1ms app.codeStats 0ms

/xvarstar-0.9/xvarstar.c

#
C | 746 lines | 522 code | 104 blank | 120 comment | 49 complexity | 045093dce667855538e7c459d2781a65 MD5 | raw file
Possible License(s): GPL-2.0
  1. /*
  2. XVarStar, GCVS catalogue explorer
  3. Copyright (C) 2001-2008 Ivan Vitjuk
  4. This program is free software; you can redistribute it and/or modify
  5. it under the terms of the GNU General Public License as published by
  6. the Free Software Foundation; either version 2 of the License, or
  7. (at your option) any later version.
  8. This program is distributed in the hope that it will be useful,
  9. but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  11. GNU General Public License for more details.
  12. You should have received a copy of the GNU General Public License
  13. along with this program; if not, write to the Free Software
  14. Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
  15. */
  16. #include "config.h"
  17. #include <stdlib.h>
  18. #include <malloc.h>
  19. #include <unistd.h>
  20. #include <fcntl.h>
  21. #include <sys/types.h>
  22. #include <sys/stat.h>
  23. #include <Xm/Xm.h>
  24. #include <Xm/Text.h>
  25. #include <Xm/TextF.h>
  26. #include <Xm/PushB.h>
  27. #include <Xm/Label.h>
  28. #include <Xm/Form.h>
  29. #include <Xm/Frame.h>
  30. #include <Xm/Separator.h>
  31. #include <Xm/RowColumn.h>
  32. #include <Xm/ToggleB.h>
  33. #include <Xm/FileSB.h>
  34. #include <Xm/SelectioB.h>
  35. #include <Xm/DrawingA.h>
  36. #include "variable.h"
  37. #define DEFAULT_WIDTH 580
  38. #define DEFAULT_HEIGHT 450
  39. #define DEFAULT_ROWS 10
  40. #define PERCENT_WIDTH 200
  41. #define PERCENT_HEIGHT 10
  42. const XmStringCharSet char_set = XmSTRING_DEFAULT_CHARSET;
  43. static const int OK = 1;
  44. static const int CANCEL = 2;
  45. static XtAppContext Context;
  46. static Widget MainWidget;
  47. static Widget OutText, Progress, ProgressDialog;
  48. static Widget Name, Mag, Type, Const, Amplitude;
  49. static Widget NameStr, MagStr, TypeStr, ConstStr, AmplitudeStr;
  50. static Widget SaveDialog;
  51. static variable_t *Var=NULL;
  52. static char *FileName;
  53. static int HaveToSave;
  54. #define WELCOME_STRING "Welcome to XVarstar"
  55. #define VARSTAR_PATTERN "*.var"
  56. #define ABOUT_STRING \
  57. "XVarStar v" VERSION ", Copyright (C) 2001-2008 Ivan Vitjuk\n\n" \
  58. "This program is free software; you can redistribute it and/or modify\n" \
  59. "it under the terms of the GNU General Public License as published by\n" \
  60. "the Free Software Foundation; either version 2 of the License, or\n" \
  61. "(at your option) any later version.\n\n" \
  62. "This program is distributed in the hope that it will be useful,\n" \
  63. "but WITHOUT ANY WARRANTY; without even the implied warranty of\n" \
  64. "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n" \
  65. "GNU General Public License for more details.\n\n" \
  66. "You should have received a copy of the GNU General Public License\n" \
  67. "along with this program; if not, write to the Free Software\n" \
  68. "Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA\n"
  69. /*
  70. show about text
  71. */
  72. static void about_callback(Widget w, XtPointer client_data, XtPointer call_data)
  73. {
  74. int i;
  75. Arg args[10];
  76. i = 0;
  77. XtSetArg(args[i], XmNvalue, ABOUT_STRING); i++;
  78. XtSetValues(OutText, args, i);
  79. HaveToSave = 0;
  80. }
  81. /*
  82. load GCVS database from file
  83. */
  84. static void load_callback(Widget w, XtPointer client_data, XtPointer call_data)
  85. {
  86. int i = 0;
  87. Arg args[10];
  88. /*
  89. delete old database from memory and allocate space
  90. for new database
  91. */
  92. if(Var){
  93. var_list_free(Var);
  94. Var = NULL;
  95. }
  96. if(!(Var = var_list_init())){
  97. XtSetArg(args[i], XmNvalue,
  98. var_strerror("var_list_init", NULL, 0)); i++;
  99. XtSetValues(OutText, args, i);
  100. return;
  101. }
  102. HaveToSave = 0;
  103. i = 0;
  104. XtSetArg(args[i], XmNvalue, "Loading Database..."); i++;
  105. XtSetValues(OutText, args, i);
  106. /*
  107. show progress meter
  108. */
  109. XtManageChild(ProgressDialog);
  110. /*
  111. load database from file
  112. */
  113. if(!var_load_variables(config_data.gcvs_database, Var)){
  114. var_list_free(Var);
  115. i = 0;
  116. XtSetArg(args[i], XmNvalue,
  117. var_strerror("var_load_variables", NULL, 0)); i++;
  118. XtSetValues(OutText, args, i);
  119. XtUnmanageChild(ProgressDialog);
  120. return;
  121. }
  122. usleep(500000);
  123. XtUnmanageChild(ProgressDialog);
  124. i = 0;
  125. XtSetArg(args[i], XmNvalue, "Database Loaded!"); i++;
  126. XtSetValues(OutText, args, i);
  127. }
  128. static void quit_callback(Widget w, XtPointer client_data, XtPointer call_data)
  129. {
  130. exit(1);
  131. //XtAppSetExitFlag(Context);
  132. }
  133. /*
  134. save star list in file
  135. */
  136. static void savefile_callback(Widget w, XtPointer client_data, XtPointer call_data)
  137. {
  138. XmFileSelectionBoxCallbackStruct *s =
  139. (XmFileSelectionBoxCallbackStruct *) call_data;
  140. char *text;
  141. FILE *fp;
  142. if (*((int *)client_data) == CANCEL){
  143. XtUnmanageChild(SaveDialog);
  144. return;
  145. }
  146. if (FileName != NULL){
  147. XtFree(FileName);
  148. FileName = NULL;
  149. }
  150. /* get the filename from the file selection box */
  151. XmStringGetLtoR(s->value, char_set, &FileName);
  152. /*
  153. open file, get star list and save it
  154. */
  155. if((fp = fopen(FileName, "w"))){
  156. if((text = XmTextGetString(OutText))){
  157. size_t count = strlen(text);
  158. if(fwrite(text, sizeof(char), count, fp) != count)
  159. perror("fwrite");
  160. XtFree(text);
  161. }
  162. fclose(fp);
  163. }else
  164. perror("fopen");
  165. XtUnmanageChild(SaveDialog);
  166. }
  167. /*
  168. called when save star list in file is required
  169. */
  170. static void save_callback(Widget w, XtPointer client_data, XtPointer call_data)
  171. {
  172. if(!HaveToSave){
  173. int i=0;
  174. Arg args[5];
  175. XtSetArg(args[i], XmNvalue, "Have nothing to save!"); i++;
  176. XtSetValues(OutText, args, i);
  177. return;
  178. }
  179. XtManageChild(SaveDialog);
  180. }
  181. static int is_button_set(Widget b)
  182. {
  183. if(XmToggleButtonGetState(b) == XmSET)
  184. return 1;
  185. return 0;
  186. }
  187. /*
  188. search stars
  189. */
  190. static void search_callback(Widget w, XtPointer client_data, XtPointer call_data)
  191. {
  192. int i;
  193. Arg args[10];
  194. char *retstr;
  195. char *name, *type, *mag, *amp, *constell;
  196. i = 0;
  197. if(!Var){
  198. XtSetArg(args[i], XmNvalue, "Please load database first!");
  199. i++;
  200. XtSetValues(OutText, args, i);
  201. return;
  202. }
  203. /*
  204. determine search criteria and
  205. search strings
  206. */
  207. name = type = mag = amp = constell = NULL;
  208. if(is_button_set(Name) && SEARCH_NAME)
  209. name = XmTextGetString(NameStr);
  210. if(is_button_set(Mag) && SEARCH_MAG)
  211. mag = XmTextGetString(MagStr);
  212. if(is_button_set(Const) && SEARCH_CONST)
  213. constell = XmTextGetString(ConstStr);
  214. if(is_button_set(Type) && SEARCH_TYPE)
  215. type= XmTextGetString(TypeStr);
  216. if(is_button_set(Amplitude) && SEARCH_AMPLITUDE)
  217. amp = XmTextGetString(AmplitudeStr);
  218. /*
  219. start search
  220. */
  221. if((retstr = var_search(Var, name, type, mag, amp, constell))){
  222. XtSetArg(args[i], XmNvalue, retstr); i++;
  223. XtSetValues(OutText, args, i);
  224. free(retstr);
  225. HaveToSave = 1;
  226. }else{
  227. XtSetArg(args[i], XmNvalue,
  228. var_strerror("var_search", NULL, 0)); i++;
  229. XtSetValues(OutText, args, i);
  230. HaveToSave = 0;
  231. }
  232. if(name)
  233. XFree(name);
  234. if(type)
  235. XFree(type);
  236. if(mag)
  237. XFree(mag);
  238. if(amp)
  239. XFree(amp);
  240. if(constell)
  241. XFree(constell);
  242. }
  243. /*
  244. */
  245. static void focus_callback(Widget w, XtPointer client_data, XtPointer call_data)
  246. {
  247. int i;
  248. Arg args[5];
  249. i = 0;
  250. switch(((XmAnyCallbackStruct *)call_data)->reason){
  251. case XmCR_LOSING_FOCUS:
  252. XtSetArg(args[i], XmNcursorPositionVisible, False); i++;
  253. XtSetValues(w, args, i);
  254. break;
  255. case XmCR_FOCUS:
  256. XtSetArg(args[i], XmNcursorPositionVisible, True); i++;
  257. XtSetValues(w, args, i);
  258. break;
  259. default:
  260. ;
  261. }
  262. }
  263. /*
  264. activate textfield callback
  265. */
  266. static void textfield_callback(Widget w, XtPointer client_data, XtPointer call_data)
  267. {
  268. search_callback(w, NULL, NULL);
  269. }
  270. /*
  271. clear star list
  272. */
  273. static void clear_callback(Widget w, XtPointer client_data, XtPointer call_data)
  274. {
  275. int i;
  276. Arg args[10];
  277. i = 0;
  278. XtSetArg(args[i], XmNvalue, ""); i++;
  279. XtSetValues(OutText, args, i);
  280. HaveToSave = 0;
  281. }
  282. /*
  283. forms
  284. */
  285. static Widget create_form(char *name, Widget parent, Widget *top_w, int bottom)
  286. {
  287. int i;
  288. Arg args[10];
  289. Widget w;
  290. i = 0;
  291. if(top_w){
  292. XtSetArg(args[i], XmNtopAttachment, XmATTACH_WIDGET); i++;
  293. XtSetArg(args[i], XmNtopWidget, *top_w); i++;
  294. }else{
  295. XtSetArg(args[i], XmNtopAttachment, XmATTACH_FORM); i++;
  296. }
  297. if(bottom){
  298. XtSetArg(args[i], XmNbottomAttachment, XmATTACH_FORM); i++;
  299. }
  300. XtSetArg(args[i], XmNleftAttachment, XmATTACH_FORM); i++;
  301. XtSetArg(args[i], XmNrightAttachment, XmATTACH_FORM); i++;
  302. XtSetArg(args[i], XmNhorizontalSpacing, 3); i++;
  303. XtSetArg(args[i], XmNverticalSpacing, 3); i++;
  304. w = XmCreateForm(parent, name, args, i);
  305. XtManageChild(w);
  306. return w;
  307. }
  308. /*
  309. separator
  310. */
  311. static Widget create_separator(char *name, Widget parent, Widget top)
  312. {
  313. int i;
  314. Arg args[10];
  315. Widget sep;
  316. i = 0;
  317. XtSetArg(args[i], XmNtopAttachment, XmATTACH_WIDGET); i++;
  318. XtSetArg(args[i], XmNtopWidget, top); i++;
  319. XtSetArg(args[i], XmNleftAttachment, XmATTACH_FORM); i++;
  320. XtSetArg(args[i], XmNrightAttachment, XmATTACH_FORM); i++;
  321. XtSetArg(args[i], XmNseparatorType, XmSHADOW_ETCHED_OUT); i++;
  322. XtSetArg(args[i], XmNshadowThickness, 3); i++;
  323. sep = XmCreateSeparator(parent, name, args, i);
  324. XtManageChild(sep);
  325. return sep;
  326. }
  327. /*
  328. creates push and toggle buttons
  329. */
  330. static Widget create_button(char *name, char *label, char mnemonic,
  331. Widget parent, int toggle,
  332. int atop, int abottom, int aleft, int aright,
  333. Widget *top, Widget *bottom,
  334. Widget *left, Widget *right,
  335. XtCallbackProc callback)
  336. {
  337. int i;
  338. Arg args[20];
  339. Widget b;
  340. i = 0;
  341. if(atop)
  342. if(top){
  343. XtSetArg(args[i], XmNtopAttachment, XmATTACH_WIDGET); i++;
  344. XtSetArg(args[i], XmNtopWidget, *top); i++;
  345. }else{
  346. XtSetArg(args[i], XmNtopAttachment, XmATTACH_FORM); i++;
  347. }
  348. if(abottom)
  349. if(bottom){
  350. XtSetArg(args[i], XmNbottomAttachment, XmATTACH_WIDGET); i++;
  351. XtSetArg(args[i], XmNbottomWidget, *bottom); i++;
  352. }else{
  353. XtSetArg(args[i], XmNbottomAttachment, XmATTACH_FORM); i++;
  354. }
  355. if(aleft)
  356. if(left){
  357. XtSetArg(args[i], XmNleftAttachment, XmATTACH_WIDGET); i++;
  358. XtSetArg(args[i], XmNleftWidget, *left); i++;
  359. }else{
  360. XtSetArg(args[i], XmNleftAttachment, XmATTACH_FORM); i++;
  361. }
  362. if(aright)
  363. if(right){
  364. XtSetArg(args[i], XmNrightAttachment, XmATTACH_WIDGET); i++;
  365. XtSetArg(args[i], XmNrightWidget, *right); i++;
  366. }else{
  367. XtSetArg(args[i], XmNrightAttachment, XmATTACH_FORM); i++;
  368. }
  369. XtSetArg(args[i], XmNlabelString,
  370. XmStringCreate(label, char_set)); i++;
  371. if(toggle){
  372. XtSetArg(args[i], XmNset, XmUNSET); i++;
  373. b = XmCreateToggleButton(parent, name, args, i);
  374. }else{
  375. XtSetArg(args[i], XmNshadowThickness, 1); i++;
  376. if(mnemonic){
  377. XtSetArg(args[i], XmNmnemonic, mnemonic); i++;
  378. }
  379. b = XmCreatePushButton(parent, name, args, i);
  380. }
  381. XtManageChild(b);
  382. if(callback)
  383. XtAddCallback (b, XmNactivateCallback, callback, NULL);
  384. return b;
  385. }
  386. /*
  387. creates text fields where users will insert
  388. search strings
  389. */
  390. static Widget create_inputfield(char *name, char *label, Widget parent,
  391. Widget *top, int bottom)
  392. {
  393. int i;
  394. Arg args[10];
  395. Widget l, w;
  396. // input Text Field (search string label)
  397. i = 0;
  398. if(top){
  399. XtSetArg(args[i], XmNtopAttachment, XmATTACH_WIDGET); i++;
  400. XtSetArg(args[i], XmNtopWidget, *top); i++;
  401. }else{
  402. XtSetArg(args[i], XmNtopAttachment, XmATTACH_FORM); i++;
  403. }
  404. if(bottom){
  405. XtSetArg(args[i], XmNbottomAttachment, XmATTACH_FORM); i++;
  406. }
  407. XtSetArg(args[i], XmNleftAttachment, XmATTACH_FORM); i++;
  408. XtSetArg(args[i], XmNmarginLeft, 5); i++;
  409. XtSetArg(args[i], XmNlabelString,
  410. XmStringCreate(label, char_set)); i++;
  411. l = XmCreateLabel(parent, label, args, i);
  412. XtManageChild(l);
  413. // input Text Field (serach string)
  414. i = 0;
  415. XtSetArg(args[i], XmNleftAttachment, XmATTACH_WIDGET); i++;
  416. if(top){
  417. XtSetArg(args[i], XmNtopAttachment, XmATTACH_WIDGET); i++;
  418. XtSetArg(args[i], XmNtopWidget, *top); i++;
  419. }else{
  420. XtSetArg(args[i], XmNtopAttachment, XmATTACH_FORM); i++;
  421. }
  422. if(bottom){
  423. XtSetArg(args[i], XmNbottomAttachment, XmATTACH_FORM); i++;
  424. }
  425. XtSetArg(args[i], XmNleftWidget, l); i++;
  426. XtSetArg(args[i], XmNrightAttachment, XmATTACH_FORM); i++;
  427. XtSetArg(args[i], XmNcursorPositionVisible, False); i++;
  428. w = XmCreateTextField(parent, name, args, i);
  429. XtManageChild(w);
  430. XtAddCallback (w, XmNactivateCallback, textfield_callback, NULL);
  431. XtAddCallback( w, XmNfocusCallback, focus_callback, NULL);
  432. XtAddCallback( w, XmNlosingFocusCallback, focus_callback, NULL);
  433. return w;
  434. }
  435. /*
  436. draws progress meter
  437. percent is in 0.0-1.0 range
  438. */
  439. void var_draw_percent(float percent)
  440. {
  441. int i;
  442. Arg args[10];
  443. Window win;
  444. GC pm_gc;
  445. unsigned int pm_fgpix, pm_bgpix;
  446. #ifndef XtD
  447. #define XtD XtDisplay(MainWidget)
  448. #endif
  449. pm_gc = XCreateGC (XtD, XtWindow(Progress), 0L, NULL);
  450. i = 0;
  451. XtSetArg(args[i], XmNforeground, (XtArgVal)&pm_fgpix); i++;
  452. XtSetArg(args[i], XmNbackground, (XtArgVal)&pm_bgpix); i++;
  453. XtGetValues(Progress, args, i);
  454. win = XtWindow(Progress);
  455. XSetForeground (XtD, pm_gc, pm_fgpix);
  456. XFillRectangle (XtD, win, pm_gc, 0, 0,
  457. (int)(PERCENT_WIDTH*percent),
  458. PERCENT_HEIGHT);
  459. XmUpdateDisplay (MainWidget);
  460. }
  461. static void build_layout(Widget toplevel)
  462. {
  463. Widget sep;
  464. Widget mainF, buttonF, inputF, textF, selectF;
  465. Widget quitB, searchB, clearB, saveB, aboutB, loadB;
  466. Widget selectRC;
  467. Arg args[20];
  468. int i;
  469. /*
  470. build forms that will hold buttons and text fields
  471. */
  472. mainF = create_form("MainForm", toplevel, NULL, 1);
  473. selectF = create_form("SelectForm", mainF, NULL, 0);
  474. sep = create_separator("Separator", mainF, selectF);
  475. inputF = create_form("InputForm", mainF, &sep, 0);
  476. sep = create_separator("Separator", mainF, inputF);
  477. buttonF = create_form("ButtonForm", mainF, &sep, 0);
  478. i = 0;
  479. sep = create_separator("Separator", mainF, buttonF);
  480. textF = create_form("TextForm", mainF, &sep, 1);
  481. /*
  482. create buttons
  483. */
  484. loadB = create_button("LoadButton", "Load", 'L', buttonF, 0,
  485. 1, 1, 1, 0,
  486. NULL, NULL, NULL, NULL,
  487. load_callback);
  488. searchB = create_button("SearchButton", "Search", 'S', buttonF, 0,
  489. 1, 1, 1, 0,
  490. NULL, NULL, &loadB, NULL,
  491. search_callback);
  492. saveB = create_button("SaveButton", "Save", 'v', buttonF, 0,
  493. 1, 1, 1, 0,
  494. NULL, NULL, &searchB, NULL,
  495. save_callback);
  496. clearB = create_button("ClearButton", "Clear", 'C', buttonF, 0,
  497. 1, 1, 1, 0,
  498. NULL, NULL, &saveB, NULL,
  499. clear_callback);
  500. quitB = create_button("QuitButton", "Quit", 'Q', buttonF, 0,
  501. 1, 1, 0, 1,
  502. NULL, NULL, NULL, NULL,
  503. quit_callback);
  504. aboutB = create_button("AboutButton", "About", 'A', buttonF, 0,
  505. 1, 1, 0, 1,
  506. NULL, NULL, NULL, &quitB,
  507. about_callback);
  508. /*
  509. crate text fields
  510. */
  511. NameStr = create_inputfield("NameStrTextField", "Name: ",
  512. inputF, NULL, 0);
  513. MagStr = create_inputfield("MagStrTextField", "Magnitude: ",
  514. inputF, &NameStr, 0);
  515. TypeStr = create_inputfield("TypeStrTextField", "Type: ",
  516. inputF, &MagStr, 0);
  517. ConstStr = create_inputfield("ConstStrTextField", "Constellation: ",
  518. inputF, &TypeStr, 0);
  519. AmplitudeStr = create_inputfield("AmplitudeStrTextField", "Amplitude: ",
  520. inputF, &ConstStr, 1);
  521. /*
  522. create text that will hold list of stars
  523. */
  524. i = 0;
  525. XtSetArg(args[i], XmNleftAttachment, XmATTACH_FORM); i++;
  526. XtSetArg(args[i], XmNrightAttachment, XmATTACH_FORM); i++;
  527. XtSetArg(args[i], XmNtopAttachment, XmATTACH_FORM); i++;
  528. XtSetArg(args[i], XmNbottomAttachment, XmATTACH_FORM); i++;
  529. XtSetArg(args[i], XmNrows, DEFAULT_ROWS); i++;
  530. XtSetArg(args[i], XmNeditable, False); i++;
  531. XtSetArg(args[i], XmNcursorPositionVisible, False); i++;
  532. XtSetArg(args[i], XmNvalue, WELCOME_STRING); i++;
  533. //XtSetArg(args[i], XmNselectionArray, XmSELECT_OUT_LINE); i++;
  534. //XtSetArg(args[i], XmNselectionArrayCount, 1); i++;
  535. OutText = XmCreateScrolledText(textF, "OutputText", args, i);
  536. XtManageChild(OutText);
  537. /*
  538. create rowcolumnt for select buttons
  539. */
  540. i = 0;
  541. XtSetArg(args[i], XmNleftAttachment, XmATTACH_FORM); i++;
  542. XtSetArg(args[i], XmNrightAttachment, XmATTACH_FORM); i++;
  543. XtSetArg(args[i], XmNtopAttachment, XmATTACH_FORM); i++;
  544. XtSetArg(args[i], XmNbottomAttachment, XmATTACH_FORM); i++;
  545. XtSetArg(args[i], XmNradioBehavior, False); i++;
  546. XtSetArg(args[i], XmNtoggleMode, XmTOGGLE_BOOLEAN); i++;
  547. XtSetArg(args[i], XmNorientation, XmHORIZONTAL); i++;
  548. selectRC = XmCreateRowColumn(selectF, "SelectRowColumn", args, i);
  549. XtManageChild(selectRC);
  550. /*
  551. create select toggle buttons
  552. */
  553. Name = create_button("NameToggleButton", "Name", 0, selectRC, 1,
  554. 1, 1, 1, 0,
  555. NULL, NULL, NULL, NULL,
  556. NULL);
  557. Mag = create_button("MagToggleButton", "Magnitude", 0, selectRC, 1,
  558. 1, 1, 1, 0,
  559. NULL, NULL, &Name, NULL,
  560. NULL);
  561. Type = create_button("TypeToggleButton", "Type", 0, selectRC, 1,
  562. 1, 1, 1, 0,
  563. NULL, NULL, &Mag, NULL,
  564. NULL);
  565. Const = create_button("ConstToggleButton", "Constell", 0, selectRC, 1,
  566. 1, 1, 1, 0,
  567. NULL, NULL, &Type, NULL,
  568. NULL);
  569. Amplitude = create_button("AmpToggleButton", "Amplitude", 0, selectRC, 1,
  570. 1, 1, 1, 0,
  571. NULL, NULL, &Const, NULL,
  572. NULL);
  573. /*
  574. create save dialog
  575. */
  576. i=0;
  577. XtSetArg(args[i], XmNwidth, 400); i++;
  578. XtSetArg(args[i], XmNmustMatch, False); i++;
  579. XtSetArg(args[i], XmNautoUnmanage, False); i++;
  580. XtSetArg(args[i], XmNpattern,
  581. XmStringCreate((char *)VARSTAR_PATTERN, char_set)); i++;
  582. SaveDialog = XmCreateFileSelectionDialog(toplevel, "SaveDialog", args, i);
  583. XtAddCallback(SaveDialog, XmNcancelCallback,
  584. savefile_callback, (XtPointer)&CANCEL);
  585. XtAddCallback(SaveDialog, XmNokCallback,
  586. savefile_callback, (XtPointer)&OK);
  587. XtUnmanageChild(XmSelectionBoxGetChild(SaveDialog,
  588. XmDIALOG_HELP_BUTTON));
  589. /*
  590. create progress dialog
  591. */
  592. i = 0;
  593. XtSetArg (args[i], XmNverticalSpacing, 2); i++;
  594. XtSetArg (args[i], XmNhorizontalSpacing, 2); i++;
  595. ProgressDialog = XmCreateFormDialog (toplevel, "pdialog", args,i);
  596. /* the drawing area in a frame */
  597. i = 0;
  598. XtSetArg (args[i], XmNtopAttachment, XmATTACH_FORM); i++;
  599. XtSetArg (args[i], XmNbottomAttachment, XmATTACH_FORM); i++;
  600. XtSetArg (args[i], XmNleftAttachment, XmATTACH_FORM); i++;
  601. XtSetArg (args[i], XmNrightAttachment, XmATTACH_FORM); i++;
  602. sep = XmCreateFrame (ProgressDialog, "pframe", args, i);
  603. XtManageChild (sep);
  604. i = 0;
  605. XtSetArg (args[i], XmNwidth, PERCENT_WIDTH); i++;
  606. XtSetArg (args[i], XmNheight, PERCENT_HEIGHT); i++;
  607. Progress = XmCreateDrawingArea (sep, "progress", args, i);
  608. XtManageChild (Progress);
  609. }
  610. int main(int argc, char **argv)
  611. {
  612. Arg args[20];
  613. int i;
  614. // initialize program
  615. if(!var_configure()){
  616. var_perror("var_configure", stderr);
  617. exit(EXIT_FAILURE);
  618. }
  619. /* create the toplevel shell */
  620. MainWidget = XtAppInitialize(&Context, "XVarStar", NULL, 0,
  621. &argc, argv, NULL, NULL, 0);
  622. /* set the default size of the window. */
  623. i = 0;
  624. XtSetArg(args[i], XmNwidth, DEFAULT_WIDTH); i++;
  625. XtSetArg(args[i], XmNheight, DEFAULT_HEIGHT); i++;
  626. XtSetValues(MainWidget, args, i);
  627. /* build widgets */
  628. build_layout(MainWidget);
  629. XtRealizeWidget(MainWidget);
  630. XtAppMainLoop(Context);
  631. /*
  632. XtDestroyApplicationContext(Context);
  633. if(Var)
  634. var_list_free(Var);
  635. */
  636. return 0;
  637. }