staden-lg/src/staden/tman_main.c

252 lines
6.0 KiB
C

/*
Title: tman_main
File: tman_main.c
Purpose: Main module for Trace Manager
Last update: Tuesday 14 April 1992
Change log:
9 July 1991 New trace title parameter in manageTrace, and call to
createDisplay
Fixed problem with geometry management with a sleep(1)
after widget popup. Seems to work...not sure why
16 Jan 1992 When trace is already present in the trace manager
reposition old trace
14 Feb 1992 Support SCF format traces
14 Apr 1992 If file if SCF read in regardless of claimed format.
*/
/*
*/
/* ---- Includes ---- */
#include "mystdlib.h" /* IMPORT: exit */
#include "tman_main.h"
#include "tman_display.h" /* IMPORT: displaySeq, unDisplaySeq */
#include "tman_traceDisplay.h" /* IMPORT: setScaleFactor */
#include "tman_context.h"
#include "seq.h" /* IMPORT: Seq, NULLSeq */
#include "seqIOABI.h" /* IMPORT: readSeqABI */
#include "seqIOALF.h" /* IMPORT: readSeqALF */
#include "seqIOSCF.h" /* IMPORT: readSeqSCF */
#include "seqIOPlain.h" /* IMPORT: readSeqPlain */
#include <stdio.h>
/*#include <string.h>*/
#include <X11/Intrinsic.h>
#include <X11/StringDefs.h>
#include <X11/Shell.h>
#include <X11/Xaw/Command.h>
#include <X11/Xaw/Form.h>
#include <X11/Xaw/Box.h>
/* ---- definitions ---- */
#define TMAN_STATE_DOWN 0
#define TMAN_STATE_UP 1
/* ---- Static variables ---- */
static int tman_state = TMAN_STATE_DOWN;
static Widget traceManagerShellWidget;
static Widget mainFormWid;
static Widget buttonWid,quitWid,hideWid;
static Widget traceForm;
static void initialDisplayedSeq(DisplayContext *dc,
char *format, char *fn,
int baseNum, int leftCutOff, int cutLength,
int bottom, int baseSpacing)
/*
This function may be called once, after the application
has been realised, to specify a sequence to be displayed
initially. If it is not called, no sequence is initially
displayed.
*/
{
if (dc->seq == NULLSeq) {
/*
** if file is in SCF read in as such regardless of `format'
*/
if (is_SCF(fn))
dc->seq = readSeqSCF(fn);
else {
if (strcmp(format, "ABI ") == 0)
dc->seq = readSeqABI(fn);
else if (strcmp(format, "ALF ") == 0)
dc->seq = readSeqALF(fn);
else if (strcmp(format, "SCF ") == 0)
dc->seq = readSeqSCF(fn);
else
dc->seq = readSeqPlain(fn);
}
if (dc->seq != NULLSeq)
{
int i;
/*
* YUK!
* We need to do the following so that complement_seq() works
*/
/* All ed bases are the same are orig bases */
for (i=0;i<dc->seq->NorigBases;i++) dc->seq->edits[i] = i;
/* The table of edits has all its entries free */
for (i=0;i<MaxEdits;i++) dc->seq->edBasePos[i] = NULLPoint;
oppInitialize();
if (bottom) complement_seq(dc->seq);
setScaleFactor(dc,1.0);
/*
Set the `file name' and `number of bases' labels.
*/
displaySeq(dc->seq,
((baseNum!=NULLBaseNum) &&
(baseNum>=0) &&
(baseNum<getNBases(dc->seq,OrigBases))
)
? baseNum
: NULLBaseNum,
leftCutOff,
cutLength,
baseSpacing
);
}
else
XBell(XtDisplay(traceManagerShellWidget), 100);
} else {
repositionSeq(dc->seq,
((baseNum!=NULLBaseNum) &&
(baseNum>=0) &&
(baseNum<getNBases(dc->seq,OrigBases))
)
? baseNum
: NULLBaseNum
);
}
}
/* ---- Callbacks ---- */
static void quitCallback(Widget widget,
XtPointer client_data, XtPointer call_data)
{ /* hide the trace manager widget */
XtPopdown(traceManagerShellWidget);
destroyContexts();
tman_state = TMAN_STATE_DOWN;
}
static void hideCallback(Widget widget,
XtPointer client_data, XtPointer call_data)
{ /* hide the trace manager widget */
tman_state = TMAN_STATE_DOWN;
XtPopdown(traceManagerShellWidget);
}
/* ---- Exported functions ---- */
void CreateTraceManager(Widget parentWid)
{
Arg args[10];
int nargs;
/*
Create the widgets
*/
traceManagerShellWidget = XtCreatePopupShell ("Traces",
topLevelShellWidgetClass,
parentWid,
NULL, (Cardinal) 0);
mainFormWid = XtCreateManagedWidget("mainForm", formWidgetClass,
traceManagerShellWidget,
NULL, (Cardinal) 0);
/*
** Box widget for buttons
*/
nargs = 0;
buttonWid = XtCreateManagedWidget("buttons", boxWidgetClass,
mainFormWid, args, nargs);
nargs = 0;
quitWid = XtCreateManagedWidget("quit", commandWidgetClass,
buttonWid, args, nargs);
XtAddCallback(quitWid, XtNcallback, quitCallback, NULL);
nargs = 0;
hideWid = XtCreateManagedWidget("hide", commandWidgetClass,
buttonWid, args, nargs);
XtAddCallback(hideWid, XtNcallback, hideCallback, NULL);
nargs = 0;
XtSetArg(args[nargs], XtNfromVert, buttonWid); nargs++;
traceForm = XtCreateManagedWidget("traceForm", formWidgetClass,
mainFormWid, args, nargs);
initialiseDisplayContexts();
tman_state = TMAN_STATE_DOWN;
}
void manageTrace(
char *format,
char *rawDataFile,
int baseNum,
int leftCutOff,
int cutLength,
int complimented,
int baseSpacing,
char *traceTitle
)
{
DisplayContext *dc,*lastdc;
char *traceName;
if ((traceName=(char *)strrchr(rawDataFile,'/'))==NULL)
traceName = rawDataFile;
else
traceName++;
lastdc = getLastDisplayContext();
dc = getDisplay(traceForm,(lastdc==NULL)?NULL:lastdc->mainFormWid,traceName, traceTitle);
if (tman_state == TMAN_STATE_DOWN) {
XtPopup(traceManagerShellWidget,XtGrabNone);
XSync(XtDisplay(traceManagerShellWidget),False);
/* We need to sleep here to let X perform its
** geometry negotiation correctly.
** It's a bit of a kludge...sorry!
*/
sleep(1);
tman_state = TMAN_STATE_UP;
}
initialDisplayedSeq(dc, format, rawDataFile, baseNum,
leftCutOff, cutLength, complimented, baseSpacing);
XawFormDoLayout(traceForm,True);
}