/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
- /*
- XVarStar, GCVS catalogue explorer
- Copyright (C) 2001-2008 Ivan Vitjuk
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
- #include "config.h"
- #include <stdlib.h>
- #include <malloc.h>
- #include <unistd.h>
- #include <fcntl.h>
- #include <sys/types.h>
- #include <sys/stat.h>
- #include <Xm/Xm.h>
- #include <Xm/Text.h>
- #include <Xm/TextF.h>
- #include <Xm/PushB.h>
- #include <Xm/Label.h>
- #include <Xm/Form.h>
- #include <Xm/Frame.h>
- #include <Xm/Separator.h>
- #include <Xm/RowColumn.h>
- #include <Xm/ToggleB.h>
- #include <Xm/FileSB.h>
- #include <Xm/SelectioB.h>
- #include <Xm/DrawingA.h>
- #include "variable.h"
- #define DEFAULT_WIDTH 580
- #define DEFAULT_HEIGHT 450
- #define DEFAULT_ROWS 10
- #define PERCENT_WIDTH 200
- #define PERCENT_HEIGHT 10
- const XmStringCharSet char_set = XmSTRING_DEFAULT_CHARSET;
- static const int OK = 1;
- static const int CANCEL = 2;
- static XtAppContext Context;
- static Widget MainWidget;
- static Widget OutText, Progress, ProgressDialog;
- static Widget Name, Mag, Type, Const, Amplitude;
- static Widget NameStr, MagStr, TypeStr, ConstStr, AmplitudeStr;
- static Widget SaveDialog;
- static variable_t *Var=NULL;
- static char *FileName;
- static int HaveToSave;
- #define WELCOME_STRING "Welcome to XVarstar"
- #define VARSTAR_PATTERN "*.var"
- #define ABOUT_STRING \
- "XVarStar v" VERSION ", Copyright (C) 2001-2008 Ivan Vitjuk\n\n" \
- "This program is free software; you can redistribute it and/or modify\n" \
- "it under the terms of the GNU General Public License as published by\n" \
- "the Free Software Foundation; either version 2 of the License, or\n" \
- "(at your option) any later version.\n\n" \
- "This program is distributed in the hope that it will be useful,\n" \
- "but WITHOUT ANY WARRANTY; without even the implied warranty of\n" \
- "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n" \
- "GNU General Public License for more details.\n\n" \
- "You should have received a copy of the GNU General Public License\n" \
- "along with this program; if not, write to the Free Software\n" \
- "Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA\n"
- /*
- show about text
- */
- static void about_callback(Widget w, XtPointer client_data, XtPointer call_data)
- {
- int i;
- Arg args[10];
- i = 0;
- XtSetArg(args[i], XmNvalue, ABOUT_STRING); i++;
- XtSetValues(OutText, args, i);
- HaveToSave = 0;
- }
- /*
- load GCVS database from file
- */
- static void load_callback(Widget w, XtPointer client_data, XtPointer call_data)
- {
- int i = 0;
- Arg args[10];
- /*
- delete old database from memory and allocate space
- for new database
- */
- if(Var){
- var_list_free(Var);
- Var = NULL;
- }
- if(!(Var = var_list_init())){
- XtSetArg(args[i], XmNvalue,
- var_strerror("var_list_init", NULL, 0)); i++;
- XtSetValues(OutText, args, i);
- return;
- }
- HaveToSave = 0;
- i = 0;
- XtSetArg(args[i], XmNvalue, "Loading Database..."); i++;
- XtSetValues(OutText, args, i);
- /*
- show progress meter
- */
- XtManageChild(ProgressDialog);
- /*
- load database from file
- */
- if(!var_load_variables(config_data.gcvs_database, Var)){
- var_list_free(Var);
- i = 0;
- XtSetArg(args[i], XmNvalue,
- var_strerror("var_load_variables", NULL, 0)); i++;
- XtSetValues(OutText, args, i);
- XtUnmanageChild(ProgressDialog);
- return;
- }
- usleep(500000);
- XtUnmanageChild(ProgressDialog);
- i = 0;
- XtSetArg(args[i], XmNvalue, "Database Loaded!"); i++;
- XtSetValues(OutText, args, i);
- }
- static void quit_callback(Widget w, XtPointer client_data, XtPointer call_data)
- {
- exit(1);
- //XtAppSetExitFlag(Context);
- }
- /*
- save star list in file
- */
- static void savefile_callback(Widget w, XtPointer client_data, XtPointer call_data)
- {
- XmFileSelectionBoxCallbackStruct *s =
- (XmFileSelectionBoxCallbackStruct *) call_data;
- char *text;
- FILE *fp;
-
- if (*((int *)client_data) == CANCEL){
- XtUnmanageChild(SaveDialog);
- return;
- }
-
- if (FileName != NULL){
- XtFree(FileName);
- FileName = NULL;
- }
-
- /* get the filename from the file selection box */
- XmStringGetLtoR(s->value, char_set, &FileName);
-
- /*
- open file, get star list and save it
- */
- if((fp = fopen(FileName, "w"))){
- if((text = XmTextGetString(OutText))){
- size_t count = strlen(text);
- if(fwrite(text, sizeof(char), count, fp) != count)
- perror("fwrite");
- XtFree(text);
- }
- fclose(fp);
- }else
- perror("fopen");
-
- XtUnmanageChild(SaveDialog);
- }
- /*
- called when save star list in file is required
- */
- static void save_callback(Widget w, XtPointer client_data, XtPointer call_data)
- {
- if(!HaveToSave){
- int i=0;
- Arg args[5];
- XtSetArg(args[i], XmNvalue, "Have nothing to save!"); i++;
- XtSetValues(OutText, args, i);
- return;
- }
- XtManageChild(SaveDialog);
- }
- static int is_button_set(Widget b)
- {
- if(XmToggleButtonGetState(b) == XmSET)
- return 1;
- return 0;
- }
- /*
- search stars
- */
- static void search_callback(Widget w, XtPointer client_data, XtPointer call_data)
- {
- int i;
- Arg args[10];
- char *retstr;
- char *name, *type, *mag, *amp, *constell;
-
- i = 0;
- if(!Var){
- XtSetArg(args[i], XmNvalue, "Please load database first!");
- i++;
- XtSetValues(OutText, args, i);
- return;
- }
-
- /*
- determine search criteria and
- search strings
- */
- name = type = mag = amp = constell = NULL;
- if(is_button_set(Name) && SEARCH_NAME)
- name = XmTextGetString(NameStr);
- if(is_button_set(Mag) && SEARCH_MAG)
- mag = XmTextGetString(MagStr);
- if(is_button_set(Const) && SEARCH_CONST)
- constell = XmTextGetString(ConstStr);
- if(is_button_set(Type) && SEARCH_TYPE)
- type= XmTextGetString(TypeStr);
- if(is_button_set(Amplitude) && SEARCH_AMPLITUDE)
- amp = XmTextGetString(AmplitudeStr);
- /*
- start search
- */
- if((retstr = var_search(Var, name, type, mag, amp, constell))){
- XtSetArg(args[i], XmNvalue, retstr); i++;
- XtSetValues(OutText, args, i);
- free(retstr);
- HaveToSave = 1;
- }else{
- XtSetArg(args[i], XmNvalue,
- var_strerror("var_search", NULL, 0)); i++;
- XtSetValues(OutText, args, i);
- HaveToSave = 0;
- }
- if(name)
- XFree(name);
- if(type)
- XFree(type);
- if(mag)
- XFree(mag);
- if(amp)
- XFree(amp);
- if(constell)
- XFree(constell);
- }
- /*
-
- */
- static void focus_callback(Widget w, XtPointer client_data, XtPointer call_data)
- {
- int i;
- Arg args[5];
- i = 0;
- switch(((XmAnyCallbackStruct *)call_data)->reason){
- case XmCR_LOSING_FOCUS:
- XtSetArg(args[i], XmNcursorPositionVisible, False); i++;
- XtSetValues(w, args, i);
- break;
- case XmCR_FOCUS:
- XtSetArg(args[i], XmNcursorPositionVisible, True); i++;
- XtSetValues(w, args, i);
- break;
- default:
- ;
- }
- }
- /*
- activate textfield callback
- */
- static void textfield_callback(Widget w, XtPointer client_data, XtPointer call_data)
- {
- search_callback(w, NULL, NULL);
- }
- /*
- clear star list
- */
- static void clear_callback(Widget w, XtPointer client_data, XtPointer call_data)
- {
- int i;
- Arg args[10];
-
- i = 0;
- XtSetArg(args[i], XmNvalue, ""); i++;
- XtSetValues(OutText, args, i);
- HaveToSave = 0;
- }
- /*
- forms
- */
- static Widget create_form(char *name, Widget parent, Widget *top_w, int bottom)
- {
- int i;
- Arg args[10];
- Widget w;
- i = 0;
- if(top_w){
- XtSetArg(args[i], XmNtopAttachment, XmATTACH_WIDGET); i++;
- XtSetArg(args[i], XmNtopWidget, *top_w); i++;
- }else{
- XtSetArg(args[i], XmNtopAttachment, XmATTACH_FORM); i++;
- }
- if(bottom){
- XtSetArg(args[i], XmNbottomAttachment, XmATTACH_FORM); i++;
- }
- XtSetArg(args[i], XmNleftAttachment, XmATTACH_FORM); i++;
- XtSetArg(args[i], XmNrightAttachment, XmATTACH_FORM); i++;
- XtSetArg(args[i], XmNhorizontalSpacing, 3); i++;
- XtSetArg(args[i], XmNverticalSpacing, 3); i++;
- w = XmCreateForm(parent, name, args, i);
- XtManageChild(w);
-
- return w;
- }
- /*
- separator
- */
- static Widget create_separator(char *name, Widget parent, Widget top)
- {
- int i;
- Arg args[10];
- Widget sep;
- i = 0;
- XtSetArg(args[i], XmNtopAttachment, XmATTACH_WIDGET); i++;
- XtSetArg(args[i], XmNtopWidget, top); i++;
- XtSetArg(args[i], XmNleftAttachment, XmATTACH_FORM); i++;
- XtSetArg(args[i], XmNrightAttachment, XmATTACH_FORM); i++;
- XtSetArg(args[i], XmNseparatorType, XmSHADOW_ETCHED_OUT); i++;
- XtSetArg(args[i], XmNshadowThickness, 3); i++;
- sep = XmCreateSeparator(parent, name, args, i);
- XtManageChild(sep);
-
- return sep;
- }
- /*
- creates push and toggle buttons
- */
- static Widget create_button(char *name, char *label, char mnemonic,
- Widget parent, int toggle,
- int atop, int abottom, int aleft, int aright,
- Widget *top, Widget *bottom,
- Widget *left, Widget *right,
- XtCallbackProc callback)
- {
- int i;
- Arg args[20];
- Widget b;
-
- i = 0;
- if(atop)
- if(top){
- XtSetArg(args[i], XmNtopAttachment, XmATTACH_WIDGET); i++;
- XtSetArg(args[i], XmNtopWidget, *top); i++;
- }else{
- XtSetArg(args[i], XmNtopAttachment, XmATTACH_FORM); i++;
- }
-
- if(abottom)
- if(bottom){
- XtSetArg(args[i], XmNbottomAttachment, XmATTACH_WIDGET); i++;
- XtSetArg(args[i], XmNbottomWidget, *bottom); i++;
- }else{
- XtSetArg(args[i], XmNbottomAttachment, XmATTACH_FORM); i++;
- }
- if(aleft)
- if(left){
- XtSetArg(args[i], XmNleftAttachment, XmATTACH_WIDGET); i++;
- XtSetArg(args[i], XmNleftWidget, *left); i++;
- }else{
- XtSetArg(args[i], XmNleftAttachment, XmATTACH_FORM); i++;
- }
- if(aright)
- if(right){
- XtSetArg(args[i], XmNrightAttachment, XmATTACH_WIDGET); i++;
- XtSetArg(args[i], XmNrightWidget, *right); i++;
- }else{
- XtSetArg(args[i], XmNrightAttachment, XmATTACH_FORM); i++;
- }
- XtSetArg(args[i], XmNlabelString,
- XmStringCreate(label, char_set)); i++;
- if(toggle){
- XtSetArg(args[i], XmNset, XmUNSET); i++;
- b = XmCreateToggleButton(parent, name, args, i);
- }else{
- XtSetArg(args[i], XmNshadowThickness, 1); i++;
- if(mnemonic){
- XtSetArg(args[i], XmNmnemonic, mnemonic); i++;
- }
- b = XmCreatePushButton(parent, name, args, i);
- }
- XtManageChild(b);
- if(callback)
- XtAddCallback (b, XmNactivateCallback, callback, NULL);
- return b;
- }
- /*
- creates text fields where users will insert
- search strings
- */
- static Widget create_inputfield(char *name, char *label, Widget parent,
- Widget *top, int bottom)
- {
- int i;
- Arg args[10];
- Widget l, w;
- // input Text Field (search string label)
- i = 0;
- if(top){
- XtSetArg(args[i], XmNtopAttachment, XmATTACH_WIDGET); i++;
- XtSetArg(args[i], XmNtopWidget, *top); i++;
- }else{
- XtSetArg(args[i], XmNtopAttachment, XmATTACH_FORM); i++;
- }
- if(bottom){
- XtSetArg(args[i], XmNbottomAttachment, XmATTACH_FORM); i++;
- }
- XtSetArg(args[i], XmNleftAttachment, XmATTACH_FORM); i++;
- XtSetArg(args[i], XmNmarginLeft, 5); i++;
- XtSetArg(args[i], XmNlabelString,
- XmStringCreate(label, char_set)); i++;
- l = XmCreateLabel(parent, label, args, i);
- XtManageChild(l);
- // input Text Field (serach string)
- i = 0;
- XtSetArg(args[i], XmNleftAttachment, XmATTACH_WIDGET); i++;
- if(top){
- XtSetArg(args[i], XmNtopAttachment, XmATTACH_WIDGET); i++;
- XtSetArg(args[i], XmNtopWidget, *top); i++;
- }else{
- XtSetArg(args[i], XmNtopAttachment, XmATTACH_FORM); i++;
- }
- if(bottom){
- XtSetArg(args[i], XmNbottomAttachment, XmATTACH_FORM); i++;
- }
- XtSetArg(args[i], XmNleftWidget, l); i++;
- XtSetArg(args[i], XmNrightAttachment, XmATTACH_FORM); i++;
- XtSetArg(args[i], XmNcursorPositionVisible, False); i++;
- w = XmCreateTextField(parent, name, args, i);
- XtManageChild(w);
- XtAddCallback (w, XmNactivateCallback, textfield_callback, NULL);
- XtAddCallback( w, XmNfocusCallback, focus_callback, NULL);
- XtAddCallback( w, XmNlosingFocusCallback, focus_callback, NULL);
- return w;
- }
- /*
- draws progress meter
- percent is in 0.0-1.0 range
- */
- void var_draw_percent(float percent)
- {
- int i;
- Arg args[10];
- Window win;
- GC pm_gc;
- unsigned int pm_fgpix, pm_bgpix;
- #ifndef XtD
- #define XtD XtDisplay(MainWidget)
- #endif
-
- pm_gc = XCreateGC (XtD, XtWindow(Progress), 0L, NULL);
-
- i = 0;
- XtSetArg(args[i], XmNforeground, (XtArgVal)&pm_fgpix); i++;
- XtSetArg(args[i], XmNbackground, (XtArgVal)&pm_bgpix); i++;
- XtGetValues(Progress, args, i);
- win = XtWindow(Progress);
- XSetForeground (XtD, pm_gc, pm_fgpix);
- XFillRectangle (XtD, win, pm_gc, 0, 0,
- (int)(PERCENT_WIDTH*percent),
- PERCENT_HEIGHT);
- XmUpdateDisplay (MainWidget);
- }
- static void build_layout(Widget toplevel)
- {
- Widget sep;
- Widget mainF, buttonF, inputF, textF, selectF;
- Widget quitB, searchB, clearB, saveB, aboutB, loadB;
- Widget selectRC;
- Arg args[20];
- int i;
- /*
- build forms that will hold buttons and text fields
- */
- mainF = create_form("MainForm", toplevel, NULL, 1);
- selectF = create_form("SelectForm", mainF, NULL, 0);
- sep = create_separator("Separator", mainF, selectF);
- inputF = create_form("InputForm", mainF, &sep, 0);
- sep = create_separator("Separator", mainF, inputF);
- buttonF = create_form("ButtonForm", mainF, &sep, 0);
- i = 0;
-
- sep = create_separator("Separator", mainF, buttonF);
- textF = create_form("TextForm", mainF, &sep, 1);
-
- /*
- create buttons
- */
- loadB = create_button("LoadButton", "Load", 'L', buttonF, 0,
- 1, 1, 1, 0,
- NULL, NULL, NULL, NULL,
- load_callback);
- searchB = create_button("SearchButton", "Search", 'S', buttonF, 0,
- 1, 1, 1, 0,
- NULL, NULL, &loadB, NULL,
- search_callback);
- saveB = create_button("SaveButton", "Save", 'v', buttonF, 0,
- 1, 1, 1, 0,
- NULL, NULL, &searchB, NULL,
- save_callback);
-
- clearB = create_button("ClearButton", "Clear", 'C', buttonF, 0,
- 1, 1, 1, 0,
- NULL, NULL, &saveB, NULL,
- clear_callback);
-
- quitB = create_button("QuitButton", "Quit", 'Q', buttonF, 0,
- 1, 1, 0, 1,
- NULL, NULL, NULL, NULL,
- quit_callback);
- aboutB = create_button("AboutButton", "About", 'A', buttonF, 0,
- 1, 1, 0, 1,
- NULL, NULL, NULL, &quitB,
- about_callback);
-
- /*
- crate text fields
- */
- NameStr = create_inputfield("NameStrTextField", "Name: ",
- inputF, NULL, 0);
- MagStr = create_inputfield("MagStrTextField", "Magnitude: ",
- inputF, &NameStr, 0);
- TypeStr = create_inputfield("TypeStrTextField", "Type: ",
- inputF, &MagStr, 0);
- ConstStr = create_inputfield("ConstStrTextField", "Constellation: ",
- inputF, &TypeStr, 0);
- AmplitudeStr = create_inputfield("AmplitudeStrTextField", "Amplitude: ",
- inputF, &ConstStr, 1);
- /*
- create text that will hold list of stars
- */
- i = 0;
- XtSetArg(args[i], XmNleftAttachment, XmATTACH_FORM); i++;
- XtSetArg(args[i], XmNrightAttachment, XmATTACH_FORM); i++;
- XtSetArg(args[i], XmNtopAttachment, XmATTACH_FORM); i++;
- XtSetArg(args[i], XmNbottomAttachment, XmATTACH_FORM); i++;
- XtSetArg(args[i], XmNrows, DEFAULT_ROWS); i++;
- XtSetArg(args[i], XmNeditable, False); i++;
- XtSetArg(args[i], XmNcursorPositionVisible, False); i++;
- XtSetArg(args[i], XmNvalue, WELCOME_STRING); i++;
- //XtSetArg(args[i], XmNselectionArray, XmSELECT_OUT_LINE); i++;
- //XtSetArg(args[i], XmNselectionArrayCount, 1); i++;
- OutText = XmCreateScrolledText(textF, "OutputText", args, i);
- XtManageChild(OutText);
-
- /*
- create rowcolumnt for select buttons
- */
- i = 0;
- XtSetArg(args[i], XmNleftAttachment, XmATTACH_FORM); i++;
- XtSetArg(args[i], XmNrightAttachment, XmATTACH_FORM); i++;
- XtSetArg(args[i], XmNtopAttachment, XmATTACH_FORM); i++;
- XtSetArg(args[i], XmNbottomAttachment, XmATTACH_FORM); i++;
- XtSetArg(args[i], XmNradioBehavior, False); i++;
- XtSetArg(args[i], XmNtoggleMode, XmTOGGLE_BOOLEAN); i++;
- XtSetArg(args[i], XmNorientation, XmHORIZONTAL); i++;
- selectRC = XmCreateRowColumn(selectF, "SelectRowColumn", args, i);
- XtManageChild(selectRC);
- /*
- create select toggle buttons
- */
- Name = create_button("NameToggleButton", "Name", 0, selectRC, 1,
- 1, 1, 1, 0,
- NULL, NULL, NULL, NULL,
- NULL);
- Mag = create_button("MagToggleButton", "Magnitude", 0, selectRC, 1,
- 1, 1, 1, 0,
- NULL, NULL, &Name, NULL,
- NULL);
- Type = create_button("TypeToggleButton", "Type", 0, selectRC, 1,
- 1, 1, 1, 0,
- NULL, NULL, &Mag, NULL,
- NULL);
- Const = create_button("ConstToggleButton", "Constell", 0, selectRC, 1,
- 1, 1, 1, 0,
- NULL, NULL, &Type, NULL,
- NULL);
- Amplitude = create_button("AmpToggleButton", "Amplitude", 0, selectRC, 1,
- 1, 1, 1, 0,
- NULL, NULL, &Const, NULL,
- NULL);
- /*
- create save dialog
- */
- i=0;
- XtSetArg(args[i], XmNwidth, 400); i++;
- XtSetArg(args[i], XmNmustMatch, False); i++;
- XtSetArg(args[i], XmNautoUnmanage, False); i++;
- XtSetArg(args[i], XmNpattern,
- XmStringCreate((char *)VARSTAR_PATTERN, char_set)); i++;
- SaveDialog = XmCreateFileSelectionDialog(toplevel, "SaveDialog", args, i);
- XtAddCallback(SaveDialog, XmNcancelCallback,
- savefile_callback, (XtPointer)&CANCEL);
- XtAddCallback(SaveDialog, XmNokCallback,
- savefile_callback, (XtPointer)&OK);
- XtUnmanageChild(XmSelectionBoxGetChild(SaveDialog,
- XmDIALOG_HELP_BUTTON));
- /*
- create progress dialog
- */
- i = 0;
- XtSetArg (args[i], XmNverticalSpacing, 2); i++;
- XtSetArg (args[i], XmNhorizontalSpacing, 2); i++;
- ProgressDialog = XmCreateFormDialog (toplevel, "pdialog", args,i);
-
- /* the drawing area in a frame */
- i = 0;
- XtSetArg (args[i], XmNtopAttachment, XmATTACH_FORM); i++;
- XtSetArg (args[i], XmNbottomAttachment, XmATTACH_FORM); i++;
- XtSetArg (args[i], XmNleftAttachment, XmATTACH_FORM); i++;
- XtSetArg (args[i], XmNrightAttachment, XmATTACH_FORM); i++;
- sep = XmCreateFrame (ProgressDialog, "pframe", args, i);
- XtManageChild (sep);
- i = 0;
- XtSetArg (args[i], XmNwidth, PERCENT_WIDTH); i++;
- XtSetArg (args[i], XmNheight, PERCENT_HEIGHT); i++;
- Progress = XmCreateDrawingArea (sep, "progress", args, i);
- XtManageChild (Progress);
- }
- int main(int argc, char **argv)
- {
- Arg args[20];
- int i;
-
- // initialize program
- if(!var_configure()){
- var_perror("var_configure", stderr);
- exit(EXIT_FAILURE);
- }
-
- /* create the toplevel shell */
- MainWidget = XtAppInitialize(&Context, "XVarStar", NULL, 0,
- &argc, argv, NULL, NULL, 0);
-
- /* set the default size of the window. */
- i = 0;
- XtSetArg(args[i], XmNwidth, DEFAULT_WIDTH); i++;
- XtSetArg(args[i], XmNheight, DEFAULT_HEIGHT); i++;
- XtSetValues(MainWidget, args, i);
-
- /* build widgets */
- build_layout(MainWidget);
- XtRealizeWidget(MainWidget);
- XtAppMainLoop(Context);
- /*
- XtDestroyApplicationContext(Context);
-
- if(Var)
- var_list_free(Var);
- */
- return 0;
- }