1245 lines
32 KiB
C
1245 lines
32 KiB
C
|
/*
|
||
|
Title: contigEditor
|
||
|
|
||
|
File: contigEditor.c
|
||
|
Purpose: C language entry point and initialisation functions
|
||
|
Last update: 5 April 1993
|
||
|
|
||
|
*/
|
||
|
|
||
|
|
||
|
/*
|
||
|
*/
|
||
|
|
||
|
#define CHKPNT(W,S) \
|
||
|
{ XSync(XtDisplay(W),False); fprintf(stderr,"CHKPNT: %s\n",S); }
|
||
|
|
||
|
|
||
|
/* ---- Includes ---- */
|
||
|
|
||
|
#include <stdio.h> /* IMPORT: freopen, stdout, stderr, fprintf */
|
||
|
/*#include <string.h>*/
|
||
|
|
||
|
#include <X11/Intrinsic.h>
|
||
|
#include <X11/Shell.h>
|
||
|
#include <X11/StringDefs.h>
|
||
|
#include <X11/Xaw/Box.h>
|
||
|
#include <X11/Xaw/Command.h>
|
||
|
#include <X11/Xaw/Form.h>
|
||
|
#include <X11/Xaw/Label.h>
|
||
|
#include <X11/Xaw/Scrollbar.h>
|
||
|
#include <X11/Xaw/SimpleMenu.h>
|
||
|
#include <X11/Xaw/SmeBSB.h>
|
||
|
#include <X11/Xaw/SmeLine.h>
|
||
|
#include <X11/Xaw/Text.h>
|
||
|
#include <X11/Xaw/Toggle.h>
|
||
|
|
||
|
#include "Sheet.h"
|
||
|
#include "contigEditor.h"
|
||
|
#include "locks.h"
|
||
|
#include "main.h"
|
||
|
#include "select.h"
|
||
|
#include "tagUtils.h"
|
||
|
#include "edUtils.h"
|
||
|
#include "extend.h"
|
||
|
#include "undo.h"
|
||
|
#include "fort.h"
|
||
|
|
||
|
|
||
|
|
||
|
/* ---- Static variables ---- */
|
||
|
static Widget editorShellWid; /* main editor shell */
|
||
|
static Widget mainFormWid; /* main editor form */
|
||
|
|
||
|
static Widget buttonsWid;
|
||
|
static Widget exitWid; /* Leave Editor button */
|
||
|
static Widget undoWid; /* Undo last edit command button */
|
||
|
static Widget supermanWid; /* switch for Superuser class of edit commands */
|
||
|
static Widget revealWid; /* switch for revealing hidden cutoff information */
|
||
|
#ifdef nana
|
||
|
static Widget saveWid; /* save command button */
|
||
|
#endif
|
||
|
static Widget lockWid; /* lock button for when joining */
|
||
|
#ifdef nana
|
||
|
static Widget joinWid; /* lock button for when joining */
|
||
|
#endif
|
||
|
static Widget labelWid; /* label displaying contig name */
|
||
|
static Widget insertWid; /* edit mode - insertion */
|
||
|
static Widget replaceWid; /* edit mode - replacement */
|
||
|
static Widget nextWid; /* search for next problem in consensus */
|
||
|
|
||
|
static Widget disagreeFormWid; /* for displaying disagreements when joining */
|
||
|
static Widget dummyWid;
|
||
|
Widget disagreeWid;
|
||
|
|
||
|
float pcCut; /* cut off for consensus calculation */
|
||
|
int editorMode;
|
||
|
enum States {StateDown=0,StateUp} editorState = StateDown;
|
||
|
static int lockOffset;
|
||
|
|
||
|
/* save/lock state */
|
||
|
int_f save_state;
|
||
|
|
||
|
SaveStruct saveState;
|
||
|
|
||
|
DefColours defColours;
|
||
|
|
||
|
|
||
|
|
||
|
/* ---- My translation tables ---- */
|
||
|
static char translationTable[] =
|
||
|
"\
|
||
|
Ctrl<Btn1Down>: XawPositionSimpleMenu(edMenu) XtMenuPopup(edMenu)\n\
|
||
|
<Btn1Down>: StartHighlight() buttonDown()\n\
|
||
|
<Btn1Motion>: ExtendHighlight()\n\
|
||
|
<Btn1Up>: MakeSelection()\n\
|
||
|
<Btn2Down>(2): buttonDown() invokeTrace()\n\
|
||
|
<Btn2Down>: buttonDown()\n\
|
||
|
<Btn3Down>: ExtendHighlight()\n\
|
||
|
<Btn3Motion>: ExtendHighlight()\n\
|
||
|
<Btn3Up>: ExtendHighlight()\n\
|
||
|
Meta<Key>Left: MetaLeft()\n\
|
||
|
Meta<Key>Right: MetaRight()\n\
|
||
|
<Key>Right: caretRight()\n\
|
||
|
<Key>Left: caretLeft()\n\
|
||
|
<Key>Down: caretDown()\n\
|
||
|
<Key>Up: caretUp()\n\
|
||
|
<Key>Delete: deleteKey()\n\
|
||
|
<Key>: keyPress()";
|
||
|
/*
|
||
|
<Btn2Down>: SelectTag()\n\
|
||
|
Meta<Key>Up: MetaUp()\n\
|
||
|
*/
|
||
|
static XtActionsRec actionTable[] = {
|
||
|
{"caretRight", caretRight},
|
||
|
{"caretLeft", caretLeft},
|
||
|
{"caretDown", caretDown},
|
||
|
{"caretUp", caretUp},
|
||
|
{"deleteKey", deleteKey},
|
||
|
{"keyPress", keyPress},
|
||
|
{"buttonDown", buttonDown},
|
||
|
{"invokeTrace", invokeTrace},
|
||
|
{"StartHighlight", start_highlight},
|
||
|
{"ExtendHighlight", extend_highlight},
|
||
|
{"MakeSelection", make_selection},
|
||
|
{"SelectTag", select_tag},
|
||
|
{"MetaLeft", meta_left},
|
||
|
{"MetaRight", meta_right},
|
||
|
{"MetaUp", meta_up},
|
||
|
};
|
||
|
XtTranslations parsedTTable;
|
||
|
|
||
|
|
||
|
static char translationTable2[] =
|
||
|
"<Btn1Down>: selectRead()";
|
||
|
|
||
|
static XtActionsRec actionTable2[] = {
|
||
|
{"selectRead", selectRead},
|
||
|
};
|
||
|
XtTranslations parsedTTable2;
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
/* ---- Private Functions ---- */
|
||
|
static int LeaveAllowed;
|
||
|
|
||
|
static void save()
|
||
|
/*
|
||
|
** Save Changes
|
||
|
*/
|
||
|
{
|
||
|
EdStruct *xx = intToEdStruct(0);
|
||
|
|
||
|
saveDB(
|
||
|
xx,
|
||
|
saveState.idevr,
|
||
|
saveState.idevw,
|
||
|
saveState.idevn,
|
||
|
saveState.relpg,
|
||
|
saveState.lngthg,
|
||
|
saveState.lnbr,
|
||
|
saveState.rnbr,
|
||
|
saveState.maxgel
|
||
|
);
|
||
|
}
|
||
|
|
||
|
static void join()
|
||
|
/*
|
||
|
** Join request made
|
||
|
*/
|
||
|
{
|
||
|
joinDB(
|
||
|
saveState.idevr,
|
||
|
saveState.idevw,
|
||
|
saveState.idevn,
|
||
|
saveState.relpg,
|
||
|
saveState.lngthg,
|
||
|
saveState.lnbr,
|
||
|
saveState.rnbr,
|
||
|
saveState.maxgel,
|
||
|
saveState.llinol,
|
||
|
saveState.lnconl,
|
||
|
saveState.llinor,
|
||
|
saveState.lnconr,
|
||
|
saveState.ngels,
|
||
|
saveState.nconts,
|
||
|
saveState.idbsiz
|
||
|
);
|
||
|
|
||
|
}
|
||
|
|
||
|
static void warningYesCallback(Widget w,
|
||
|
XtPointer client_data, XtPointer call_data)
|
||
|
/*
|
||
|
** A yes response to the
|
||
|
** warning about data not saved
|
||
|
*/
|
||
|
{
|
||
|
Widget popupWid = (Widget) client_data;
|
||
|
|
||
|
|
||
|
if (editorMode == EDITMODE)
|
||
|
save();
|
||
|
else
|
||
|
join();
|
||
|
|
||
|
LeaveAllowed = 1;
|
||
|
XtDestroyWidget(popupWid);
|
||
|
}
|
||
|
|
||
|
static void warningNoCallback(Widget w,
|
||
|
XtPointer client_data, XtPointer call_data)
|
||
|
/*
|
||
|
** A No response to the
|
||
|
** warning about data not saved
|
||
|
*/
|
||
|
{ Widget popupWid = (Widget) client_data;
|
||
|
|
||
|
LeaveAllowed = 1;
|
||
|
XtDestroyWidget(popupWid);
|
||
|
}
|
||
|
|
||
|
static void warningCancelCallback(Widget w,
|
||
|
XtPointer client_data, XtPointer call_data)
|
||
|
/*
|
||
|
** A Cancel response to the
|
||
|
** warning about data not saved
|
||
|
*/
|
||
|
{ Widget popupWid = (Widget) client_data;
|
||
|
|
||
|
LeaveAllowed = 0;
|
||
|
XtDestroyWidget(popupWid);
|
||
|
}
|
||
|
|
||
|
static void createLabelsForBox(Widget parentWid, char *warning)
|
||
|
{
|
||
|
Arg args[10];
|
||
|
int nargs;
|
||
|
|
||
|
nargs = 0;
|
||
|
XtSetArg(args[nargs], XtNlabel, warning); nargs++;
|
||
|
(void) XtCreateManagedWidget("warnPrompt", labelWidgetClass,
|
||
|
parentWid, args, nargs);
|
||
|
|
||
|
}
|
||
|
|
||
|
static int warnNotSaved(Widget parentWid, String warning)
|
||
|
/*
|
||
|
** Warn that changes have been made but contig hasn't been saved.
|
||
|
*/
|
||
|
{ Widget warningWid, warnFormWid, warnPromptBox;
|
||
|
Widget yesWid, noWid, cancelWid;
|
||
|
Arg args[10];
|
||
|
int nargs;
|
||
|
Position x, y;
|
||
|
Dimension width, height;
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
/*
|
||
|
Position the upper left hand corner of the popup at the
|
||
|
center of the parent widget.
|
||
|
*/
|
||
|
nargs = 0;
|
||
|
XtSetArg(args[nargs], XtNwidth, &width); nargs++;
|
||
|
XtSetArg(args[nargs], XtNheight, &height); nargs++;
|
||
|
XtGetValues(parentWid, args, nargs);
|
||
|
XtTranslateCoords(parentWid,
|
||
|
(Position) 0, (Position) height,
|
||
|
&x, &y);
|
||
|
nargs = 0;
|
||
|
XtSetArg(args[nargs], XtNx, x); nargs++;
|
||
|
XtSetArg(args[nargs], XtNy, y); nargs++;
|
||
|
warningWid = XtCreatePopupShell("warning", transientShellWidgetClass,
|
||
|
parentWid,
|
||
|
args, nargs);
|
||
|
|
||
|
/* Create the form */
|
||
|
nargs = 0;
|
||
|
warnFormWid = XtCreateManagedWidget("warnForm", formWidgetClass,
|
||
|
warningWid, args, nargs);
|
||
|
|
||
|
nargs = 0;
|
||
|
warnPromptBox = XtCreateManagedWidget("warnBox", boxWidgetClass,
|
||
|
warnFormWid, args, nargs);
|
||
|
|
||
|
createLabelsForBox(warnPromptBox,warning);
|
||
|
|
||
|
nargs = 0;
|
||
|
XtSetArg(args[nargs], XtNfromVert, warnPromptBox); nargs++;
|
||
|
yesWid = XtCreateManagedWidget("Yes", commandWidgetClass,
|
||
|
warnFormWid, args, nargs);
|
||
|
XtAddCallback(yesWid, XtNcallback, warningYesCallback, (XtPointer) warningWid);
|
||
|
|
||
|
nargs = 0;
|
||
|
XtSetArg(args[nargs], XtNfromHoriz, yesWid); nargs++;
|
||
|
XtSetArg(args[nargs], XtNfromVert, warnPromptBox); nargs++;
|
||
|
noWid = XtCreateManagedWidget("No", commandWidgetClass,
|
||
|
warnFormWid, args, nargs);
|
||
|
XtAddCallback(noWid, XtNcallback, warningNoCallback, (XtPointer) warningWid);
|
||
|
|
||
|
|
||
|
nargs = 0;
|
||
|
XtSetArg(args[nargs], XtNfromHoriz, noWid); nargs++;
|
||
|
XtSetArg(args[nargs], XtNfromVert, warnPromptBox); nargs++;
|
||
|
cancelWid = XtCreateManagedWidget("Cancel", commandWidgetClass,
|
||
|
warnFormWid, args, nargs);
|
||
|
XtAddCallback(cancelWid, XtNcallback,
|
||
|
warningCancelCallback, (XtPointer) warningWid);
|
||
|
|
||
|
/* This is a modal dialogue */
|
||
|
LeaveAllowed = -1;
|
||
|
XtPopup(warningWid, XtGrabNonexclusive);
|
||
|
|
||
|
while (LeaveAllowed==-1)
|
||
|
{
|
||
|
XEvent event;
|
||
|
|
||
|
XtAppNextEvent(XtWidgetToApplicationContext(parentWid), &event);
|
||
|
XtDispatchEvent(&event);
|
||
|
}
|
||
|
|
||
|
|
||
|
return LeaveAllowed;
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
static void editNextCallback(Widget w, XtPointer client_data, XtPointer call_data)
|
||
|
/*
|
||
|
** Next Problem button has been pushed
|
||
|
*/
|
||
|
{
|
||
|
EdStruct *xx = intToEdStruct(0);
|
||
|
|
||
|
if (editorState == StateDown) return;
|
||
|
|
||
|
findNextProblem(xx);
|
||
|
}
|
||
|
|
||
|
|
||
|
static void editRevealCallback(Widget w, XtPointer client_data, XtPointer call_data)
|
||
|
/*
|
||
|
** Next Problem button has been pushed
|
||
|
*/
|
||
|
{
|
||
|
EdStruct *xx;
|
||
|
Arg args[10];
|
||
|
int nargs;
|
||
|
Boolean state;
|
||
|
int i;
|
||
|
|
||
|
if (editorState == StateDown) return;
|
||
|
|
||
|
nargs = 0;
|
||
|
XtSetArg(args[nargs], XtNstate, &state); nargs++;
|
||
|
XtGetValues(w, args, nargs);
|
||
|
|
||
|
for (i=0;i<editorMode;i++) {
|
||
|
xx = intToEdStruct(i);
|
||
|
xx->reveal_cutoffs=state;
|
||
|
redisplaySequences (xx,xx->namesWid, xx->sequencesWid, xx->displayPos, xx->displayWidth);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
static void editLockCallback(Widget w, XtPointer client_data, XtPointer call_data)
|
||
|
/*
|
||
|
** Editor has been locked
|
||
|
*/
|
||
|
{
|
||
|
EdStruct *xx0 = intToEdStruct(0);
|
||
|
EdStruct *xx1 = intToEdStruct(1);
|
||
|
|
||
|
/*
|
||
|
int nargs;
|
||
|
Arg args[10];
|
||
|
|
||
|
nargs=0;
|
||
|
XtSetArg(args[nargs], XtNstate, &currMode); nargs++;
|
||
|
XtGetValues(lockWid, args, nargs);
|
||
|
|
||
|
if (currMode)
|
||
|
*/
|
||
|
lockOffset = xx1->displayPos - xx0->displayPos;
|
||
|
|
||
|
redisplaySequences (xx0,xx0->namesWid, xx0->sequencesWid, xx0->displayPos, xx0->displayWidth);
|
||
|
redisplaySequences (xx1,xx1->namesWid, xx1->sequencesWid, xx1->displayPos, xx1->displayWidth);
|
||
|
}
|
||
|
|
||
|
static void editUndoCallback(Widget w, XtPointer client_data, XtPointer call_data)
|
||
|
/*
|
||
|
** Undo last command request made
|
||
|
*/
|
||
|
{
|
||
|
undoLastCommand();
|
||
|
}
|
||
|
|
||
|
static void editExitCallback(Widget w, XtPointer client_data, XtPointer call_data)
|
||
|
/*
|
||
|
** Request made to leave the editor
|
||
|
*/
|
||
|
{
|
||
|
EdStruct *xx = intToEdStruct(0);
|
||
|
|
||
|
if (editorState == StateDown) return;
|
||
|
|
||
|
switch (editorMode) {
|
||
|
case EDITMODE:
|
||
|
if (editsMade(xx)) {
|
||
|
if (warnNotSaved(w,"Save changes?"))
|
||
|
{
|
||
|
XtPopdown(editorShellWid);
|
||
|
editorState = StateDown;
|
||
|
semaphoreRelease(activeLock);
|
||
|
}
|
||
|
} else {
|
||
|
XtPopdown(editorShellWid);
|
||
|
editorState = StateDown;
|
||
|
semaphoreRelease(activeLock);
|
||
|
}
|
||
|
break;
|
||
|
case JOINMODE: {
|
||
|
int overlapLength, wingeCount;
|
||
|
char warning[200];
|
||
|
|
||
|
countDisagreements(&overlapLength, &wingeCount);
|
||
|
if (overlapLength<=0) {
|
||
|
sprintf(warning,
|
||
|
"Contigs do not overlap\nPerform Join?\n");
|
||
|
} else {
|
||
|
sprintf(warning,
|
||
|
"Percentage Mismatch:\n %5.2f%%\nPerform Join?\n",
|
||
|
(float)(100*wingeCount)/(float)overlapLength);
|
||
|
}
|
||
|
|
||
|
if (warnNotSaved(w,warning))
|
||
|
{
|
||
|
XtPopdown(editorShellWid);
|
||
|
editorState = StateDown;
|
||
|
semaphoreRelease(activeLock);
|
||
|
}
|
||
|
break;
|
||
|
}
|
||
|
default:
|
||
|
XtPopdown(editorShellWid);
|
||
|
editorState = StateDown;
|
||
|
semaphoreRelease(activeLock);
|
||
|
}
|
||
|
/*
|
||
|
** We must shut down the search window as well
|
||
|
*/
|
||
|
if (editorState == StateDown) {
|
||
|
destroySearchWindow();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
static void sliderScrollCallback(Widget wid,
|
||
|
XtPointer client_data, XtPointer call_data)
|
||
|
/*
|
||
|
** left or right mouse button has caused the
|
||
|
** slider to move
|
||
|
*/
|
||
|
{
|
||
|
EdStruct *xx = widgetToEdStruct(XtParent(wid));
|
||
|
int position = (int) call_data;
|
||
|
|
||
|
float topOfThumb;
|
||
|
int nargs;
|
||
|
Arg args[10];
|
||
|
|
||
|
if (editorState == StateDown) return;
|
||
|
|
||
|
nargs=0;
|
||
|
XtSetArg(args[nargs], XtNtopOfThumb, &topOfThumb); nargs++;
|
||
|
XtGetValues(wid, args, nargs);
|
||
|
|
||
|
/* Move the thumb by one screenful in the appropriate direction */
|
||
|
if (position>0)
|
||
|
incDisplayPos(xx,D_screen);
|
||
|
else
|
||
|
decDisplayPos(xx,D_screen);
|
||
|
}
|
||
|
|
||
|
static void leftleftCallback(Widget wid,
|
||
|
XtPointer client_data, XtPointer call_data)
|
||
|
/*
|
||
|
** Jump left a long way
|
||
|
*/
|
||
|
{
|
||
|
EdStruct *xx = widgetToEdStruct(XtParent(XtParent(wid)));
|
||
|
if (editorState == StateDown) return;
|
||
|
|
||
|
decDisplayPos (xx,D_halfScreen);
|
||
|
}
|
||
|
|
||
|
static void leftCallback(Widget wid,
|
||
|
XtPointer client_data, XtPointer call_data)
|
||
|
/*
|
||
|
** Jump left a short way
|
||
|
*/
|
||
|
{
|
||
|
EdStruct *xx = widgetToEdStruct(XtParent(XtParent(wid)));
|
||
|
if (editorState == StateDown) return;
|
||
|
|
||
|
decDisplayPos (xx,D_character);
|
||
|
}
|
||
|
|
||
|
static void rightCallback(Widget wid,
|
||
|
XtPointer client_data, XtPointer call_data)
|
||
|
/*
|
||
|
** Jump right a short way
|
||
|
*/
|
||
|
{
|
||
|
EdStruct *xx = widgetToEdStruct(XtParent(XtParent(wid)));
|
||
|
if (editorState == StateDown) return;
|
||
|
|
||
|
incDisplayPos (xx,D_character);
|
||
|
}
|
||
|
|
||
|
static void rightrightCallback(Widget wid,
|
||
|
XtPointer client_data, XtPointer call_data)
|
||
|
/*
|
||
|
** Jump right a long way
|
||
|
*/
|
||
|
{
|
||
|
EdStruct *xx = widgetToEdStruct(XtParent(XtParent(wid)));
|
||
|
if (editorState == StateDown) return;
|
||
|
|
||
|
incDisplayPos (xx,D_halfScreen);
|
||
|
}
|
||
|
|
||
|
|
||
|
static void sliderJumpCallback(Widget wid,
|
||
|
XtPointer client_data, XtPointer call_data)
|
||
|
/*
|
||
|
** Middle mouse button used to reposition scroll bar
|
||
|
*/
|
||
|
{
|
||
|
float percent = *((float *) call_data);
|
||
|
EdStruct *xx = widgetToEdStruct(XtParent(wid));
|
||
|
|
||
|
if (editorState == StateDown) return;
|
||
|
|
||
|
setDisplayPosPercent(xx,percent);
|
||
|
}
|
||
|
|
||
|
static void getFontDetails(int *width, int *height)
|
||
|
/*
|
||
|
** Get the font width and height
|
||
|
** for the contig editor window
|
||
|
** ASSUME a single font is used!!
|
||
|
*/
|
||
|
{
|
||
|
Arg args[10];
|
||
|
int nargs;
|
||
|
XFontStruct *font;
|
||
|
|
||
|
nargs = 0;
|
||
|
XtSetArg(args[nargs], XtNfont, &font); nargs++;
|
||
|
XtGetValues(labelWid, args, nargs);
|
||
|
|
||
|
*width = font->max_bounds.width;
|
||
|
*height = font->max_bounds.ascent + font->max_bounds.descent;
|
||
|
}
|
||
|
|
||
|
static void setInitialStates(int reveal_state)
|
||
|
/*
|
||
|
** Set the initial states of togglewidgets
|
||
|
*/
|
||
|
{
|
||
|
Arg args[10];
|
||
|
int nargs;
|
||
|
|
||
|
nargs = 0;
|
||
|
XtSetArg(args[nargs], XtNstate, False); nargs++;
|
||
|
XtSetValues(lockWid, args, nargs);
|
||
|
|
||
|
nargs = 0;
|
||
|
XtSetArg(args[nargs], XtNstate, reveal_state); nargs++;
|
||
|
XtSetValues(revealWid, args, nargs);
|
||
|
|
||
|
}
|
||
|
|
||
|
static void tweakGeometry1()
|
||
|
/*
|
||
|
** Some geometry tweaking must be done before widgets are realised
|
||
|
*/
|
||
|
{
|
||
|
EdStruct *xx;
|
||
|
|
||
|
xx = intToEdStruct(1);
|
||
|
if (editorMode==EDITMODE) {
|
||
|
XtManageChild(nextWid);
|
||
|
XtUnmanageChild(lockWid);
|
||
|
#ifdef nana
|
||
|
XtUnmanageChild(joinWid);
|
||
|
#endif
|
||
|
XtUnmanageChild(disagreeFormWid);
|
||
|
XtUnmanageChild(xx->edWid);
|
||
|
XawFormDoLayout(mainFormWid,True);
|
||
|
} else {
|
||
|
XtUnmanageChild(nextWid);
|
||
|
XtManageChild(lockWid);
|
||
|
#ifdef nana
|
||
|
XtManageChild(joinWid);
|
||
|
#endif
|
||
|
XtManageChild(disagreeFormWid);
|
||
|
XtManageChild(xx->edWid);
|
||
|
XawFormDoLayout(mainFormWid,True);
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
static void tweakGeometry2()
|
||
|
/*
|
||
|
** Some geometry tweaking must be done after widgets are realised
|
||
|
*/
|
||
|
{
|
||
|
int i;
|
||
|
Arg args[10];
|
||
|
int nargs;
|
||
|
|
||
|
EdStruct *xx;
|
||
|
|
||
|
/*
|
||
|
** scroll button wids
|
||
|
*/
|
||
|
for (i=0;i<editorMode;i++) {
|
||
|
xx = intToEdStruct(i);
|
||
|
nargs = 0;
|
||
|
XtSetArg(args[nargs], XtNwidth, xx->fontWidth*NAMELEN+10); nargs++;
|
||
|
XtSetValues(xx->scrollButtonsWid, args, nargs);
|
||
|
|
||
|
/*
|
||
|
Dimension width;
|
||
|
xx = intToEdStruct(i);
|
||
|
nargs = 0;
|
||
|
XtSetArg(args[nargs], XtNwidth, &width); nargs++;
|
||
|
XtGetValues(xx->namesWid, args, nargs);
|
||
|
fprintf(stderr,"width.a = %d\n",(int)width);
|
||
|
nargs = 0;
|
||
|
XtSetArg(args[nargs], XtNwidth, width); nargs++;
|
||
|
XtSetValues(xx->scrollButtonsWid, args, nargs);
|
||
|
nargs = 0;
|
||
|
XtSetArg(args[nargs], XtNwidth, &width); nargs++;
|
||
|
XtGetValues(xx->sequencesWid, args, nargs);
|
||
|
fprintf(stderr,"width.b = %d\n",(int)width);
|
||
|
nargs = 0;
|
||
|
XtSetArg(args[nargs], XtNwidth, width); nargs++;
|
||
|
XtSetValues(xx->sliderWid, args, nargs);
|
||
|
*/
|
||
|
}
|
||
|
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
/* ---- Exported functions ---- */
|
||
|
|
||
|
|
||
|
void jxedit_(
|
||
|
int_f *idevr, /* unit number for relationships */
|
||
|
int_f *idevw, /* unit number for working versions of sequences */
|
||
|
int_f *idevn, /* unit number for sequence names */
|
||
|
int_f *idevt, /* unit number for tag information */
|
||
|
int_f *idevc, /* unit number for comment file */
|
||
|
int_f *relpg, /* relative positions of gels in sequences */
|
||
|
int_f *lngthg, /* lengths of sequences */
|
||
|
int_f *lnbr, /* left neighbours */
|
||
|
int_f *rnbr, /* right neighbours */
|
||
|
int_f *maxgel, /* maximum length of gel */
|
||
|
int_f *idbsiz, /* size of database */
|
||
|
int_f *lnconl, /* left contig to join */
|
||
|
int_f *llinol, /* left-most gel in contig of left contig */
|
||
|
int_f *lnconr, /* right contig for join */
|
||
|
int_f *llinor, /* left-most gel in contig of right contig */
|
||
|
int_f *igell, /* left gel specified on entry */
|
||
|
int_f *igellpos,/* position in left-most gel */
|
||
|
int_f *igelr, /* right gel specified on entry */
|
||
|
int_f *igelrpos,/* position in left-most gel */
|
||
|
int_f *perced, /* cutoff for consensus calculation */
|
||
|
int_f *ngels, /* number of gels in database */
|
||
|
int_f *nconts, /* number of contigs in database */
|
||
|
int_f *idm, /* database type */
|
||
|
int_f *rcstate, /* reveal cutoff state */
|
||
|
int_f *iok /* returns 0-saved (1) | 1-saved (2) | joined (4) */
|
||
|
)
|
||
|
/*
|
||
|
** Interface to FORTRAN for Join editor
|
||
|
*/
|
||
|
{
|
||
|
EdStruct *xx[2];
|
||
|
int reveal_state;
|
||
|
int i;
|
||
|
|
||
|
semaphoreGrab(activeLock);
|
||
|
editorState = StateUp;
|
||
|
editorMode = JOINMODE;
|
||
|
save_state = (int_f)0;
|
||
|
|
||
|
reveal_state = (*rcstate != 0);
|
||
|
setInitialStates(reveal_state);
|
||
|
|
||
|
/*
|
||
|
** Save arguments for later use
|
||
|
*/
|
||
|
saveState.idevr = idevr;
|
||
|
saveState.idevw = idevw;
|
||
|
saveState.idevn = idevn;
|
||
|
saveState.idevt = idevt;
|
||
|
saveState.idevc = idevc;
|
||
|
saveState.relpg = relpg;
|
||
|
saveState.lngthg = lngthg;
|
||
|
saveState.lnbr = lnbr;
|
||
|
saveState.rnbr = rnbr;
|
||
|
saveState.maxgel = maxgel;
|
||
|
saveState.idbsiz = idbsiz;
|
||
|
saveState.llinol = llinol;
|
||
|
saveState.lnconl = lnconl;
|
||
|
saveState.llinor = llinor;
|
||
|
saveState.lnconr = lnconr;
|
||
|
saveState.perced = perced;
|
||
|
saveState.ngels = ngels;
|
||
|
saveState.nconts = nconts;
|
||
|
saveState.idm = idm;
|
||
|
pcCut = * (float *) perced;
|
||
|
|
||
|
for (i=0; i<2; i++) {
|
||
|
int_f *llino = (i==0)?llinol:llinor;
|
||
|
|
||
|
/*
|
||
|
** Set up data structures
|
||
|
*/
|
||
|
xx[i] = intToEdStruct(i);
|
||
|
xx[i]->reveal_cutoffs = reveal_state;
|
||
|
if (initialiseDB(xx[i],idevr,idevw,idevn,relpg,lngthg,lnbr,rnbr,maxgel,idbsiz,llino)) {
|
||
|
if (i==1) freeDB(xx[0]);
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
** Set up display
|
||
|
*/
|
||
|
if (createEdDisplay(xx[i],
|
||
|
xx[i]->namesWid,
|
||
|
xx[i]->sequencesWid,
|
||
|
(i)?*igelr:*igell,
|
||
|
(i)?*igelrpos:*igellpos)) {
|
||
|
freeDB(xx[i]);
|
||
|
if (i==1) freeDB(xx[0]);
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
tweakGeometry1();
|
||
|
XtPopup(editorShellWid, XtGrabNone);
|
||
|
tweakGeometry2();
|
||
|
|
||
|
while (editorState != StateDown)
|
||
|
{
|
||
|
XEvent event;
|
||
|
|
||
|
XtAppNextEvent(XtWidgetToApplicationContext(xx[0]->edWid), &event);
|
||
|
XtDispatchEvent(&event);
|
||
|
}
|
||
|
|
||
|
for (i=0;i<2;i++) {
|
||
|
disown_selection(xx[i]);
|
||
|
freeDB(xx[i]);
|
||
|
cleanUpAllStacks();
|
||
|
}
|
||
|
|
||
|
*iok = save_state;
|
||
|
}
|
||
|
|
||
|
void cxedit_(
|
||
|
int_f *idevr, /* unit number for relationships */
|
||
|
int_f *idevw, /* unit number for working versions of sequences */
|
||
|
int_f *idevn, /* unit number for sequence names */
|
||
|
int_f *idevt, /* unit number for tag information */
|
||
|
int_f *idevc, /* unit number for comment file */
|
||
|
int_f *relpg, /* relative positions of gels in sequences */
|
||
|
int_f *lngthg, /* lengths of sequences */
|
||
|
int_f *lnbr, /* left neighbours */
|
||
|
int_f *rnbr, /* right neighbours */
|
||
|
int_f *maxgel, /* maximum length of gel */
|
||
|
int_f *idbsiz, /* size of database */
|
||
|
int_f *lincon, /* current contig to edit */
|
||
|
int_f *llino, /* left-most gel in contig */
|
||
|
int_f *igelno, /* gel number specified on entry */
|
||
|
int_f *igelpos, /* position in gel */
|
||
|
int_f *perced, /* cutoff for consensus calculation */
|
||
|
int_f *idm, /* database type */
|
||
|
int_f *rcstate, /* reveal cutoff state */
|
||
|
int_f *iok /* returns 0-saved (1) | 1-saved (2) | joined (4) */
|
||
|
)
|
||
|
/*
|
||
|
** Interface to FORTRAN for Contig Editor
|
||
|
*/
|
||
|
{
|
||
|
|
||
|
int reveal_state;
|
||
|
|
||
|
EdStruct *xx = intToEdStruct(0);
|
||
|
semaphoreGrab(activeLock);
|
||
|
editorState = StateUp;
|
||
|
editorMode = EDITMODE;
|
||
|
save_state = (int_f)0;
|
||
|
|
||
|
reveal_state = (*rcstate != 0);
|
||
|
setInitialStates(reveal_state);
|
||
|
|
||
|
/*
|
||
|
** Save arguments for later use
|
||
|
*/
|
||
|
saveState.idevr = idevr;
|
||
|
saveState.idevw = idevw;
|
||
|
saveState.idevn = idevn;
|
||
|
saveState.idevt = idevt;
|
||
|
saveState.idevc = idevc;
|
||
|
saveState.relpg = relpg;
|
||
|
saveState.lngthg = lngthg;
|
||
|
saveState.lnbr = lnbr;
|
||
|
saveState.rnbr = rnbr;
|
||
|
saveState.maxgel = maxgel;
|
||
|
saveState.idbsiz = idbsiz;
|
||
|
saveState.lincon = lincon;
|
||
|
saveState.llino = llino;
|
||
|
saveState.perced = perced;
|
||
|
saveState.idm = idm;
|
||
|
|
||
|
/*
|
||
|
** Set up data structures
|
||
|
*/
|
||
|
xx->reveal_cutoffs = reveal_state;
|
||
|
if (initialiseDB(xx,idevr,idevw,idevn,relpg,lngthg,lnbr,rnbr,maxgel,idbsiz,llino))
|
||
|
return;
|
||
|
|
||
|
/*
|
||
|
** Set up display
|
||
|
*/
|
||
|
pcCut = * (float *) perced;
|
||
|
if (createEdDisplay(xx,xx->namesWid,xx->sequencesWid,*igelno,*igelpos)) {
|
||
|
freeDB(xx);
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
tweakGeometry1();
|
||
|
XtPopup(editorShellWid, XtGrabNone);
|
||
|
tweakGeometry2();
|
||
|
|
||
|
while (editorState != StateDown)
|
||
|
{
|
||
|
XEvent event;
|
||
|
|
||
|
XtAppNextEvent(XtWidgetToApplicationContext(xx->namesWid), &event);
|
||
|
XtDispatchEvent(&event);
|
||
|
}
|
||
|
|
||
|
disown_selection(xx);
|
||
|
freeDB(xx);
|
||
|
cleanUpAllStacks();
|
||
|
|
||
|
*iok = save_state;
|
||
|
}
|
||
|
|
||
|
Widget createEditWid(Widget parentWid, Widget fromVertWid, int closeToVert)
|
||
|
/*
|
||
|
** Create an form with all the trappings of an editor window
|
||
|
*/
|
||
|
{
|
||
|
EdStruct *xx;
|
||
|
Widget llWid, lWid, rWid, rrWid;
|
||
|
Arg args[10];
|
||
|
int nargs;
|
||
|
|
||
|
xx = getFreeEdStruct();
|
||
|
if (xx == NULL) return NULL;
|
||
|
|
||
|
getFontDetails(&xx->fontWidth,&xx->fontHeight);
|
||
|
|
||
|
/*
|
||
|
** create main form
|
||
|
*/
|
||
|
nargs = 0;
|
||
|
XtSetArg(args[nargs], XtNfromVert, fromVertWid); nargs++;
|
||
|
if (closeToVert) {
|
||
|
XtSetArg(args[nargs], XtNvertDistance, 0); nargs++;
|
||
|
}
|
||
|
xx->edWid = XtCreateManagedWidget("edForm", formWidgetClass,
|
||
|
parentWid, args, nargs);
|
||
|
|
||
|
/*
|
||
|
** Scrollers
|
||
|
*/
|
||
|
nargs = 0;
|
||
|
xx->scrollButtonsWid = XtCreateManagedWidget("scrollButtons", formWidgetClass,
|
||
|
xx->edWid, args, nargs);
|
||
|
nargs = 0;
|
||
|
llWid = XtCreateManagedWidget("leftleft", commandWidgetClass,
|
||
|
xx->scrollButtonsWid, args, nargs);
|
||
|
XtAddCallback(llWid, XtNcallback, leftleftCallback, NULL );
|
||
|
nargs = 0;
|
||
|
XtSetArg(args[nargs], XtNfromHoriz, llWid); nargs++;
|
||
|
lWid = XtCreateManagedWidget("left", commandWidgetClass,
|
||
|
xx->scrollButtonsWid, args, nargs);
|
||
|
XtAddCallback(lWid, XtNcallback, leftCallback, NULL );
|
||
|
nargs = 0;
|
||
|
XtSetArg(args[nargs], XtNfromHoriz, lWid); nargs++;
|
||
|
rWid = XtCreateManagedWidget("right", commandWidgetClass,
|
||
|
xx->scrollButtonsWid, args, nargs);
|
||
|
XtAddCallback(rWid, XtNcallback, rightCallback, NULL );
|
||
|
nargs = 0;
|
||
|
XtSetArg(args[nargs], XtNfromHoriz, rWid); nargs++;
|
||
|
rrWid = XtCreateManagedWidget("rightright", commandWidgetClass,
|
||
|
xx->scrollButtonsWid, args, nargs);
|
||
|
XtAddCallback(rrWid, XtNcallback, rightrightCallback, NULL );
|
||
|
|
||
|
|
||
|
|
||
|
/*
|
||
|
** A Slider
|
||
|
*/
|
||
|
nargs = 0;
|
||
|
XtSetArg(args[nargs], XtNfromHoriz, xx->scrollButtonsWid); nargs++;
|
||
|
XtSetArg(args[nargs], XtNhorizDistance, 0); nargs++;
|
||
|
XtSetArg(args[nargs], XtNorientation, XtorientHorizontal); nargs++;
|
||
|
XtSetArg(args[nargs], XtNheight, xx->fontHeight+4); nargs++;
|
||
|
XtSetArg(args[nargs], XtNwidth, xx->fontWidth*(xx->displayWidth)+8); nargs++;
|
||
|
|
||
|
xx->sliderWid = XtCreateManagedWidget("slider", scrollbarWidgetClass,
|
||
|
xx->edWid, args, nargs);
|
||
|
XtAddCallback(xx->sliderWid, XtNjumpProc, sliderJumpCallback, NULL);
|
||
|
XtAddCallback(xx->sliderWid, XtNscrollProc, sliderScrollCallback, NULL);
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
/*
|
||
|
** ... and a text widget or two or three
|
||
|
*/
|
||
|
nargs = 0;
|
||
|
XtSetArg(args[nargs], XtNfromVert, xx->sliderWid); nargs++;
|
||
|
XtSetArg(args[nargs], XtNvertDistance, 0); nargs++;
|
||
|
XtSetArg(args[nargs], XtNcolumns, NAMELEN); nargs++;
|
||
|
xx->namesWid = XtCreateManagedWidget("names", sheetWidgetClass,
|
||
|
xx->edWid, args, nargs);
|
||
|
XtUninstallTranslations(xx->namesWid);
|
||
|
/* Add string to function bindings for our application actions */
|
||
|
XtAppAddActions(XtWidgetToApplicationContext(xx->edWid),
|
||
|
actionTable2, XtNumber(actionTable2));
|
||
|
parsedTTable2 = XtParseTranslationTable(translationTable2);
|
||
|
XtUninstallTranslations(xx->namesWid);
|
||
|
XtAugmentTranslations(xx->namesWid,parsedTTable2);
|
||
|
|
||
|
nargs = 0;
|
||
|
XtSetArg(args[nargs], XtNfromVert, xx->sliderWid); nargs++;
|
||
|
XtSetArg(args[nargs], XtNvertDistance, 0); nargs++;
|
||
|
XtSetArg(args[nargs], XtNfromHoriz, xx->namesWid); nargs++;
|
||
|
XtSetArg(args[nargs], XtNhorizDistance, 0); nargs++;
|
||
|
XtSetArg(args[nargs], XtNcolumns, DEFAULT_DISPLAY_WIDTH); nargs++;
|
||
|
xx->sequencesWid = XtCreateManagedWidget("sequences", sheetWidgetClass,
|
||
|
xx->edWid, args, nargs);
|
||
|
|
||
|
/* Add string to function bindings for our application actions */
|
||
|
XtAppAddActions(XtWidgetToApplicationContext(xx->edWid),
|
||
|
actionTable, XtNumber(actionTable));
|
||
|
parsedTTable = XtParseTranslationTable(translationTable);
|
||
|
XtUninstallTranslations(xx->sequencesWid);
|
||
|
|
||
|
XtAugmentTranslations(xx->sequencesWid,parsedTTable);
|
||
|
|
||
|
/*
|
||
|
** Pop-up menu
|
||
|
*/
|
||
|
createEdMenu(xx->sequencesWid);
|
||
|
|
||
|
return xx->edWid;
|
||
|
}
|
||
|
|
||
|
Widget createDisagreeWid(Widget parentWid, Widget fromVertWid, int closeToVert)
|
||
|
/*
|
||
|
** Create a form widget with all the trappings of a
|
||
|
** disagreement window
|
||
|
*/
|
||
|
{
|
||
|
Arg args[10];
|
||
|
int nargs;
|
||
|
int fontWidth, fontHeight;
|
||
|
|
||
|
getFontDetails(&fontWidth, &fontHeight);
|
||
|
|
||
|
/*
|
||
|
** create main form
|
||
|
*/
|
||
|
nargs = 0;
|
||
|
XtSetArg(args[nargs], XtNfromVert, fromVertWid); nargs++;
|
||
|
if (closeToVert) {
|
||
|
XtSetArg(args[nargs], XtNvertDistance, 0); nargs++;
|
||
|
}
|
||
|
disagreeFormWid = XtCreateManagedWidget("disagreeForm", formWidgetClass,
|
||
|
parentWid, args, nargs);
|
||
|
nargs = 0;
|
||
|
XtSetArg(args[nargs], XtNrows, 1); nargs++;
|
||
|
XtSetArg(args[nargs], XtNcolumns, NAMELEN); nargs++;
|
||
|
dummyWid = XtCreateManagedWidget("dummy", sheetWidgetClass,
|
||
|
disagreeFormWid, args, nargs);
|
||
|
nargs = 0;
|
||
|
XtSetArg(args[nargs], XtNrows, 1); nargs++;
|
||
|
XtSetArg(args[nargs], XtNcolumns, DEFAULT_DISPLAY_WIDTH); nargs++;
|
||
|
XtSetArg(args[nargs], XtNfromHoriz, dummyWid); nargs++;
|
||
|
disagreeWid = XtCreateManagedWidget("disagreements", sheetWidgetClass,
|
||
|
disagreeFormWid, args, nargs);
|
||
|
|
||
|
XtUninstallTranslations(dummyWid);
|
||
|
XtUninstallTranslations(disagreeWid);
|
||
|
|
||
|
return disagreeFormWid;
|
||
|
}
|
||
|
|
||
|
|
||
|
Widget CreateEditorShell(Widget parentWid)
|
||
|
/*
|
||
|
** Create all components of the
|
||
|
** Contig Editor
|
||
|
** and
|
||
|
** Join Editor
|
||
|
*/
|
||
|
{
|
||
|
Arg args[10];
|
||
|
int nargs;
|
||
|
Widget ed1Wid;
|
||
|
Widget ed2Wid;
|
||
|
Widget dw;
|
||
|
|
||
|
/*
|
||
|
** Create the contig editor shell
|
||
|
*/
|
||
|
editorShellWid = XtCreatePopupShell ("Editor",
|
||
|
topLevelShellWidgetClass,
|
||
|
parentWid,
|
||
|
NULL, (Cardinal) 0);
|
||
|
|
||
|
mainFormWid = XtCreateManagedWidget("mainForm", formWidgetClass,
|
||
|
editorShellWid,
|
||
|
NULL, (Cardinal) 0);
|
||
|
|
||
|
|
||
|
/*
|
||
|
** The form widget holds a label
|
||
|
*/
|
||
|
nargs = 0;
|
||
|
XtSetArg(args[nargs], XtNfromHoriz, exitWid); nargs++;
|
||
|
labelWid = XtCreateManagedWidget("title", labelWidgetClass,
|
||
|
mainFormWid, args, nargs);
|
||
|
|
||
|
|
||
|
/*
|
||
|
** Button box for contig/join editor
|
||
|
*/
|
||
|
nargs = 0;
|
||
|
XtSetArg(args[nargs], XtNfromHoriz, labelWid); nargs++;
|
||
|
buttonsWid = XtCreateManagedWidget("buttons", boxWidgetClass,
|
||
|
mainFormWid, args, nargs);
|
||
|
|
||
|
/*
|
||
|
** Toggle widgets for insert/replace edit modes
|
||
|
*/
|
||
|
nargs = 0;
|
||
|
insertWid = XtCreateManagedWidget("insert", toggleWidgetClass,
|
||
|
buttonsWid, args, nargs);
|
||
|
|
||
|
nargs = 0;
|
||
|
XtSetArg(args[nargs], XtNradioGroup, insertWid); nargs++;
|
||
|
replaceWid = XtCreateManagedWidget("replace", toggleWidgetClass,
|
||
|
buttonsWid, args, nargs);
|
||
|
|
||
|
/*
|
||
|
** Superman toggle widget (for super-duper editing)
|
||
|
*/
|
||
|
nargs = 0;
|
||
|
supermanWid = XtCreateManagedWidget("superman", toggleWidgetClass,
|
||
|
buttonsWid, args, nargs);
|
||
|
|
||
|
/*
|
||
|
** Reveal cutoffs
|
||
|
*/
|
||
|
nargs = 0;
|
||
|
revealWid = XtCreateManagedWidget("reveal", toggleWidgetClass,
|
||
|
buttonsWid, args, nargs);
|
||
|
XtAddCallback(revealWid, XtNcallback, editRevealCallback, NULL );
|
||
|
|
||
|
/*
|
||
|
** Undo command button
|
||
|
*/
|
||
|
nargs = 0;
|
||
|
undoWid = XtCreateManagedWidget("undo", commandWidgetClass,
|
||
|
buttonsWid, args, nargs);
|
||
|
XtAddCallback(undoWid, XtNcallback, editUndoCallback, NULL );
|
||
|
|
||
|
/*
|
||
|
** Next (problem) command button
|
||
|
*/
|
||
|
nargs = 0;
|
||
|
nextWid = XtCreateManagedWidget("next", commandWidgetClass,
|
||
|
buttonsWid, args, nargs);
|
||
|
XtAddCallback(nextWid, XtNcallback, editNextCallback, NULL );
|
||
|
|
||
|
#ifdef nana
|
||
|
/*
|
||
|
** Save command button
|
||
|
*/
|
||
|
nargs = 0;
|
||
|
saveWid = XtCreateManagedWidget("save", commandWidgetClass,
|
||
|
buttonsWid, args, nargs);
|
||
|
XtAddCallback(saveWid, XtNcallback, editSaveCallback, NULL );
|
||
|
#endif
|
||
|
|
||
|
/*
|
||
|
** Lock command button
|
||
|
*/
|
||
|
nargs = 0;
|
||
|
lockWid = XtCreateManagedWidget("lock", toggleWidgetClass,
|
||
|
buttonsWid, args, nargs);
|
||
|
XtAddCallback(lockWid, XtNcallback, editLockCallback, NULL );
|
||
|
|
||
|
#ifdef nana
|
||
|
/*
|
||
|
** Join command button
|
||
|
*/
|
||
|
nargs = 0;
|
||
|
joinWid = XtCreateManagedWidget("join", commandWidgetClass,
|
||
|
buttonsWid, args, nargs);
|
||
|
XtAddCallback(joinWid, XtNcallback, editJoinCallback, NULL );
|
||
|
#endif
|
||
|
|
||
|
/*
|
||
|
** and an exit button
|
||
|
*/
|
||
|
nargs = 0;
|
||
|
exitWid = XtCreateManagedWidget("exit", commandWidgetClass,
|
||
|
buttonsWid, args, nargs);
|
||
|
XtAddCallback(exitWid, XtNcallback, editExitCallback, NULL );
|
||
|
|
||
|
/*
|
||
|
** create editor
|
||
|
*/
|
||
|
ed1Wid = createEditWid(mainFormWid,buttonsWid,0);
|
||
|
dw = createDisagreeWid(mainFormWid,ed1Wid,1);
|
||
|
ed2Wid = createEditWid(mainFormWid,dw,1);
|
||
|
|
||
|
/*
|
||
|
** Create tag editor
|
||
|
*/
|
||
|
(void) createTagEditor(parentWid);
|
||
|
|
||
|
|
||
|
/*
|
||
|
** Create search diologue
|
||
|
*/
|
||
|
(void) createSearchWidget(parentWid);
|
||
|
|
||
|
return editorShellWid;
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
int editModeIsInsert()
|
||
|
/*
|
||
|
** Find out if editor is in insert mode rather than replace mode
|
||
|
*/
|
||
|
{
|
||
|
String currMode;
|
||
|
|
||
|
currMode = (String) XawToggleGetCurrent(insertWid);
|
||
|
if (currMode == NULL)
|
||
|
return 0;
|
||
|
else
|
||
|
return (strcmp (currMode,"insert") == 0);
|
||
|
}
|
||
|
|
||
|
int editModeIsSuperman()
|
||
|
/*
|
||
|
** Find out if we are entitled to use privilaged edit commands
|
||
|
*/
|
||
|
{
|
||
|
Boolean currMode;
|
||
|
int nargs;
|
||
|
Arg args[10];
|
||
|
|
||
|
nargs=0;
|
||
|
XtSetArg(args[nargs], XtNstate, &currMode); nargs++;
|
||
|
XtGetValues(supermanWid, args, nargs);
|
||
|
|
||
|
return currMode;
|
||
|
}
|
||
|
|
||
|
int inJoinMode()
|
||
|
/*
|
||
|
** Find out if the editor is in join mode
|
||
|
*/
|
||
|
{
|
||
|
return editorMode==JOINMODE;
|
||
|
}
|
||
|
|
||
|
int editorLocked()
|
||
|
/*
|
||
|
** Find out if the editor is locked (and in join mode of course)
|
||
|
*/
|
||
|
{
|
||
|
Boolean currMode;
|
||
|
int nargs;
|
||
|
Arg args[10];
|
||
|
|
||
|
if (inJoinMode()) {
|
||
|
nargs=0;
|
||
|
XtSetArg(args[nargs], XtNstate, &currMode); nargs++;
|
||
|
XtGetValues(lockWid, args, nargs);
|
||
|
|
||
|
return (currMode);
|
||
|
} else
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
int editorLockedPos(int force)
|
||
|
/*
|
||
|
** Find out the locked position
|
||
|
*/
|
||
|
{
|
||
|
if (force) {
|
||
|
EdStruct *xx0 = intToEdStruct(0);
|
||
|
EdStruct *xx1 = intToEdStruct(1);
|
||
|
|
||
|
return xx1->displayPos - xx0->displayPos;
|
||
|
} else
|
||
|
return (lockOffset);
|
||
|
}
|