1 /* $Id: ddvopen.c,v 1.98 2006/07/13 17:11:42 bollin Exp $
2 * ===========================================================================
3 *
4 * PUBLIC DOMAIN NOTICE
5 * National Center for Biotechnology Information (NCBI)
6 *
7 * This software/database is a "United States Government Work" under the
8 * terms of the United States Copyright Act. It was written as part of
9 * the author's official duties as a United States Government employee and
10 * thus cannot be copyrighted. This software/database is freely available
11 * to the public for use. The National Library of Medicine and the U.S.
12 * Government do not place any restriction on its use or reproduction.
13 * We would, however, appreciate having the NCBI and the author cited in
14 * any work or product based on this material
15 *
16 * Although all reasonable efforts have been taken to ensure the accuracy
17 * and reliability of the software and data, the NLM and the U.S.
18 * Government do not and cannot warrant the performance or results that
19 * may be obtained by using this software or data. The NLM and the U.S.
20 * Government disclaim all warranties, express or implied, including
21 * warranties of performance, merchantability or fitness for any particular
22 * purpose.
23 *
24 * ===========================================================================
25 *
26 * File Name: ddvopen.c
27 *
28 * Author: Patrick Durand
29 *
30 * Version Creation Date: 06/19/99
31 *
32 * $Revision: 1.98 $
33 *
34 * File Description: code to open a SeqAlign (file & Net) and code of the
35 * message callback for DeuxD-Viewer (DDV).
36 *
37 * Modifications:
38 * --------------------------------------------------------------------------
39 * $Log: ddvopen.c,v $
40 * Revision 1.98 2006/07/13 17:11:42 bollin
41 * use Uint4 instead of Uint2 for itemID values
42 *
43 * Revision 1.97 2004/04/01 13:43:06 lavr
44 * Spell "occurred", "occurrence", and "occurring"
45 *
46 * Revision 1.96 2001/04/26 16:41:20 juran
47 * Squelch warnings.
48 *
49 * Revision 1.95 2000/07/17 17:46:48 hurwitz
50 * made it so show/hide dialog only updates view when ok is clicked
51 *
52 * Revision 1.94 2000/07/14 22:24:56 lewisg
53 * fix scroll, click, visual c++ build bugs. add command line arg parse to ddv
54 *
55 * Revision 1.92 2000/07/05 19:23:13 lewisg
56 * add two panes to ddv, update msvc project files
57 *
58 * Revision 1.91 2000/06/16 14:57:03 lewisg
59 * move entrez calls out of desktop
60 *
61 * Revision 1.90 2000/06/15 17:33:18 hurwitz
62 * used view seqAlignPtr to get original (bug fix), and started working on left/right/center justify for DDE
63 *
64 * Revision 1.89 2000/06/15 16:01:07 hurwitz
65 * rewrote section that calls ViewMgr_Attach when SeqAlign is not editable but IBMable
66 *
67 * Revision 1.88 2000/06/13 18:23:55 hurwitz
68 * made ViewMgr_MakeMultiple routine, call this on each launch of DDE rather than launch of DDV
69 *
70 * Revision 1.87 2000/06/12 23:02:40 hurwitz
71 * enable launch of DDE from Cn3D, swith from DDV_ComputeRuler to DDE_ReMakeRuler, get rid of styles option for DDE
72 *
73 * Revision 1.86 2000/06/08 20:04:38 hurwitz
74 * made warning about converting to true multiple alignment into a Message window, and other small fixes
75 *
76 * Revision 1.85 2000/06/07 19:09:36 hurwitz
77 * made DDE_ReMakeRuler work with linked list of ParaGs
78 *
79 * Revision 1.84 2000/06/06 14:44:16 hurwitz
80 * fixed bug that SetAppProperty(dde_nogaps)
81 *
82 * Revision 1.83 2000/06/02 19:57:03 hurwitz
83 * added a query dialog when converting from pairwise multiple to true multiple, bug fix of double freeing of a seqAlignPtr
84 *
85 * Revision 1.82 2000/06/01 14:40:08 hurwitz
86 * temp fix: when DDV is launched as slave, don't allow aligned gaps
87 *
88 * Revision 1.81 2000/05/31 23:07:26 hurwitz
89 * made NoGaps a runtime parameter, fixed bug with vertical scroll of show/hide list, save edits query is not performed if nothing to save
90 *
91 * Revision 1.80 2000/05/24 21:43:00 hurwitz
92 * getting hide/show rows to work with DDV and DDE together
93 *
94 * Revision 1.79 2000/05/23 22:00:14 hurwitz
95 * working on launch of DDE from DDV
96 *
97 * Revision 1.78 2000/05/15 23:39:34 lewisg
98 * shred cblast, add menu items for gapped/ungapped, fix pdbheaders
99 *
100 * Revision 1.77 2000/05/15 22:00:36 hurwitz
101 * put save-edits query into DDV_SlaveQuit where it belongs
102 *
103 * Revision 1.76 2000/05/12 21:18:13 hurwitz
104 * added window asking if user wants to save unsaved edits for dde
105 *
106 * Revision 1.75 2000/05/12 16:15:25 hurwitz
107 * reverted to not doing IntersectOnMaster for DDE, now determined by call to ViewMgr_Attach
108 *
109 * Revision 1.74 2000/05/11 16:28:44 wheelan
110 * made DDV_ShredAln NLM_EXTERN
111 *
112 * Revision 1.73 2000/05/10 22:03:29 thiessen
113 * temporary fix for CN3D_[TRIM,SHRED] not defined
114 *
115 * Revision 1.72 2000/05/10 16:47:25 wheelan
116 * added CN3D_SHRED and CN3D_TRIM options; added ddv_shred_aln
117 *
118 * Revision 1.71 2000/05/09 14:21:54 wheelan
119 * added ddv_truncate_overlaps
120 *
121 * Revision 1.70 2000/05/08 16:29:27 wheelan
122 * change to ungapped BLAST
123 *
124 * Revision 1.69 2000/05/04 22:43:38 hurwitz
125 * don't launch DDE on top of DDV, change some wording, redraw DDE after save to AlnMgr
126 *
127 * Revision 1.68 2000/05/03 17:48:30 hurwitz
128 * keep DDV in same column when DDE does a save
129 *
130 * Revision 1.67 2000/05/03 16:16:51 hurwitz
131 * fixed bug fix from yesterday
132 *
133 * Revision 1.66 2000/05/02 19:50:38 hurwitz
134 * fixed some bugs with launching DDE from DDV, added new alnMgr fn for positioning DDE on proper column
135 *
136 * Revision 1.65 2000/04/28 14:43:37 hurwitz
137 * send message to DDV after edits in DDE are accepted by AlnMgr
138 *
139 * Revision 1.64 2000/04/27 22:21:58 lewisg
140 * misc bugs/features
141 *
142 * Revision 1.63 2000/04/27 19:57:59 hurwitz
143 * scroll to aligned block on launch of DDE
144 *
145 * Revision 1.62 2000/04/27 13:33:41 durand
146 * SpacerSize min value fixed to 1; update view when SpacerSize is changed
147 *
148 * Revision 1.61 2000/04/21 23:00:50 hurwitz
149 * can launch DDE from DDV
150 *
151 * Revision 1.60 2000/04/20 23:27:43 lewisg
152 * misc bug fixes
153 *
154 * Revision 1.59 2000/04/19 15:45:50 hurwitz
155 * can create display for a block
156 *
157 * Revision 1.58 2000/04/17 13:30:43 durand
158 * removed g_hParent and unused functions DDV_LaunchAlignViewer and DDV_LaunchAlignEditor
159 *
160 * Revision 1.57 2000/04/11 14:08:33 durand
161 * removed a debug line
162 *
163 * Revision 1.56 2000/04/10 20:33:40 lewisg
164 * fix show/hide for blast multiple, make blast multiple API generic
165 *
166 * Revision 1.55 2000/04/10 19:53:14 durand
167 * allowed ddv to display NULL SeqAlign
168 *
169 * Revision 1.54 2000/04/08 00:37:32 lewisg
170 * multiple seqentries, NEWSEQ message, etc.
171 *
172 * Revision 1.53 2000/04/07 15:03:08 durand
173 * added use of UPDATE_TYPE_NEWSEQ; DDV now rebuilt EntitiesTable after an update msg
174 *
175 * Revision 1.52 2000/04/04 17:51:54 lewisg
176 * fix various seq import bugs
177 *
178 * Revision 1.51 2000/03/29 23:38:06 lewisg
179 * hide/show, fixes to saving and opening
180 *
181 * Revision 1.50 2000/03/29 19:26:10 lewisg
182 * use blast2seqs instead of bandalign
183 *
184 * Revision 1.49 2000/03/27 22:15:06 lewisg
185 * add show/hide row dialog
186 *
187 * Revision 1.48 2000/03/27 18:07:48 hurwitz
188 * page up and page down working, give panel focus on launch
189 *
190 * Revision 1.47 2000/03/24 20:34:58 lewisg
191 * add blast from file, bug fixes, get rid of redundant code, etc.
192 *
193 * Revision 1.46 2000/03/22 20:31:34 durand
194 * added system menus for slave DDV
195 *
196 * Revision 1.45 2000/03/21 14:21:46 durand
197 * fixed a problem with menus setup
198 *
199 * Revision 1.44 2000/03/20 19:26:53 kans
200 * need to create menus before other window contents - Mac menu bar for windows is actually in content area
201 *
202 * Revision 1.43 2000/03/16 14:11:59 durand
203 * set corretly mouse mode menu
204 *
205 * Revision 1.42 2000/03/02 21:11:06 lewisg
206 * use bandalign for import sequence, make standalone ddv use viewmgr, make dialogs modal, send color update
207 *
208 * Revision 1.41 2000/03/02 15:43:10 durand
209 * use MovableModalWindow for dialog boxes
210 *
211 * Revision 1.40 2000/03/01 22:49:41 lewisg
212 * import bioseq, neatlyindex, get rid of dead code
213 *
214 * Revision 1.39 2000/02/28 20:15:32 durand
215 * if DDV is started from Cn3D, DDV doesn't set up anymore letters layout
216 *
217 * Revision 1.38 2000/02/15 22:40:57 lewisg
218 * add ability to launch udv so that it colors by row, fixes to colormgr, track rows from viewmgr, fix visual c projects
219 *
220 * Revision 1.37 2000/02/07 21:14:08 durand
221 * added a generic answer to Update messages
222 *
223 * Revision 1.36 2000/02/07 14:03:35 durand
224 * replace BioseqUnlockById by BioseqUnlock
225 *
226 * Revision 1.35 2000/02/05 01:32:22 lewisg
227 * add viewmgr, move place freeing is done in ddv, modify visual c++ projects
228 *
229 * Revision 1.34 2000/02/04 16:05:40 durand
230 * add click action to select a row
231 *
232 * Revision 1.33 2000/02/02 14:44:32 durand
233 * added function to create data structure for block editor, fixed some bugs
234 *
235 * Revision 1.32 2000/01/26 13:38:53 durand
236 * update the GUI for the editor. Add functions to create the data to be used by the editor
237 *
238 * Revision 1.31 2000/01/18 22:49:16 lewisg
239 * send OM_MSG_FLUSH to ddv/udv, tweak CPK coloration, misc bugs
240 *
241 * Revision 1.30 2000/01/12 21:52:16 durand
242 * add import function; update menus when DDV is loaded from Cn3D
243 *
244 * Revision 1.29 2000/01/11 15:05:23 durand
245 * remove network stuff
246 *
247 * Revision 1.28 2000/01/10 15:09:46 durand
248 * Use Entrez instead of ID1
249 *
250 * Revision 1.27 2000/01/05 21:11:14 durand
251 * update mouse click actions and DrawSequence function for a better use from ddv and cn3d
252 *
253 * Revision 1.26 1999/12/30 21:08:45 lewisg
254 * bioseq import dialog
255 *
256 * Revision 1.25 1999/12/30 13:45:50 beloslyu
257 * fix comment
258 *
259 * Revision 1.24 1999/12/29 22:55:03 lewisg
260 * get rid of seqalign id
261 *
262 * Revision 1.23 1999/12/23 19:22:06 durand
263 * modify default options for DDV when loaded from Cn3D
264 *
265 * Revision 1.22 1999/12/21 15:27:24 durand
266 * avoid to quit Cn3D when closing DDV
267 *
268 * Revision 1.21 1999/12/20 20:20:41 lewisg
269 * allow cn3d to do color and ddv to do case when both are running
270 *
271 * Revision 1.20 1999/12/07 21:40:13 durand
272 * add mouse modes menu and caret facility for the editor
273 *
274 * Revision 1.19 1999/12/06 16:19:19 durand
275 * add GoTo facility to DDV
276 *
277 * Revision 1.18 1999/12/03 23:17:23 lewisg
278 * Patrick's new global update msg, argument passing when launching ddv, experimental editing
279 *
280 * Revision 1.17 1999/11/30 18:19:47 durand
281 * fix a problem with function declaration DDV_CloseData
282 *
283 * Revision 1.16 1999/11/29 15:26:26 durand
284 * designed a new GUI to fix problems under MacOS, Linux and SGI
285 *
286 * Revision 1.15 1999/11/17 22:43:58 durand
287 * speed up the selection manager for large SeqAlign
288 *
289 * Revision 1.14 1999/11/09 17:09:00 durand
290 * transfer some functions from ddvgraph to ddvcreate, so that ddvcreate remains Vibrant free and can be compiled with BLAST
291 *
292 * Revision 1.13 1999/11/04 22:11:38 durand
293 * add the Desktop to DDV. Add a better set of cleanup functions when closing DDV. Before creating color tables, try to get them from the SeqAlign
294 *
295 * Revision 1.12 1999/11/03 21:29:47 durand
296 * add CTRL and SHFT keys for mouse selection. redesign the loader functions of DDV to properly register the message callbacks
297 *
298 * Revision 1.11 1999/10/29 19:04:21 durand
299 * move DDVUpdateMSG in objmgr.h
300 *
301 * Revision 1.10 1999/10/29 14:15:39 durand
302 * add simple mouse selection functions
303 *
304 * Revision 1.9 1999/10/23 21:20:45 lewisg
305 * move g_hParent to ddvopen.c
306 *
307 * Revision 1.8 1999/10/23 14:54:34 durand
308 * resolve external symbol g_hParent
309 *
310 * Revision 1.7 1999/10/22 14:19:43 durand
311 * update the code for the startup functions of DDV drawing panel
312 *
313 * Revision 1.6 1999/10/20 18:37:31 lewisg
314 * add messagefunc for slave mode
315 *
316 * Revision 1.5 1999/10/20 13:17:18 durand
317 * add display for disc. SeqAlign tails
318 *
319 * Revision 1.4 1999/10/16 15:02:25 durand
320 * fixes due to toolkit build failed
321 *
322 * Revision 1.3 1999/10/15 21:57:36 durand
323 * add a UI for display options
324 *
325 * Revision 1.2 1999/10/12 15:01:29 lewisg
326 * resolve confict with internal/ddv
327 *
328 * Revision 1.1 1999/09/30 14:10:28 durand
329 * add ddv to toolkit
330 *
331 * Revision 1.14 1999/09/30 13:38:10 durand
332 * DDV_CreateDisplayFromIndex takes ParaG_Size as an argument
333 *
334 * Revision 1.13 1999/09/16 13:07:52 durand
335 * add File|Close and File|Open|Network commands
336 *
337 * Revision 1.12 1999/09/09 21:55:06 durand
338 * instantiate the Fle|Close command of DDV
339 *
340 * Revision 1.11 1999/09/02 17:36:07 durand
341 * reconcile ddvopen.c
342 *
343 * Revision 1.10 1999/08/19 17:15:27 wheelan
344 * added messages to indicate timing of index building vs color tables
345 *
346 * Revision 1.9 1999/08/04 18:02:12 wheelan
347 * changes to support new seqalign indexing
348 *
349 * Revision 1.8 1999/07/29 12:43:07 durand
350 * update DDV_GetAndCheckSeqAlign
351 *
352 * Revision 1.7 1999/07/20 17:18:23 durand
353 * update DDV_GetAndCheckSeqAlign for PopSet Viewer
354 *
355 * Revision 1.6 1999/07/20 14:58:01 durand
356 * use the Color Manager to display colored MSA
357 *
358 * Revision 1.5 1999/07/01 15:28:29 durand
359 * validate function loaders of DDV
360 *
361 * Revision 1.2 1999/06/28 22:07:19 durand
362 * add loader functions and clean the code with Lint and Purify
363 *
364 * Revision 1.1 1999/06/19 17:21:05 durand
365 * add Vibrant DDV code
366 *
367 *
368 *
369 * ==========================================================================
370 */
371
372 #include <ncbi.h>
373 #include <vibrant.h>
374 #include <salfiles.h>
375 #include <pgppop.h>
376 #include <udviewer.h>
377 #include <ddvopen.h>
378 #include <ddvpanel.h>
379 #include <ddvmain.h>
380 #include <ddvgraph.h>
381 #include <ddvcreate.h>
382 #include <objmgr.h>
383 #include <gather.h>
384 #include <ddvcolor.h>
385 #include <samutil.h>
386 #include <blast.h>
387 #include <viewmgr.h>
388 #include <actutils.h>
389
390 /*extern WindoW g_hParent = NULL;*/
391 static void DDV_RegisterMsgFuncOnBsp(Uint2 bsp_eID,DdvMainPtr dmp);
392
393 static void DDV_Convert(ButtoN g);
394 static void DDV_NoConvert(ButtoN g);
395
396 /*local struct used only by the Download sequence dialog box*/
397 typedef struct ddvnetopen {
398 WindoW hWndMain; /*main window*/
399 TexT Entry; /*Entrez entry*/
400 PopuP AccessType; /*database type*/
401 ButtoN ok; /*ok button*/
402 UDVMainMenuPtr mmp; /*main menu*/
403 } DDVNetOpen, PNTR DDVNetOpenPtr;
404
405
406 /*******************************************************************************
407
408 Function : DDV_GetSelectedRegions()
409
410 Purpose : get the selected region(s) of one bioseq.
411
412 Parameters : om_ssp;list of selected regions (usually this field points to
413 ObjMgr data)
414 bsp_eID,bsp_iID; bioseq identifiers.
415
416 Return value : list of selected regions on the bioseq bsp_eID,bsp_iID
417
418 *******************************************************************************/
DDV_GetSelectedRegions(SelStructPtr om_ssp,Uint2 bsp_eID,Uint2 bsp_iID)419 extern ValNodePtr DDV_GetSelectedRegions(SelStructPtr om_ssp, Uint2 bsp_eID,
420 Uint2 bsp_iID)
421 {
422 SelStructPtr ssp;
423 SeqLocPtr slp,slp2;
424 ValNodePtr bsp_vnp=NULL,vnp;
425
426 if (om_ssp==NULL || bsp_eID==0 || bsp_iID==0) return(NULL);
427
428 ssp=om_ssp;
429
430 while(ssp){
431 if (ssp->entityID==bsp_eID && ssp->itemID==bsp_iID &&
432 ssp->itemtype==OBJ_BIOSEQ && ssp->regiontype==OM_REGION_SEQLOC){
433 slp=(SeqLocPtr)ssp->region;
434 while(slp){
435 slp2=slp->next;
436 slp->next=NULL;
437 if (!bsp_vnp){
438 vnp=ValNodeAddPointer(NULL,0,(Pointer)slp);
439 if (!vnp) return(NULL);
440 bsp_vnp=vnp;
441 }
442 else{
443 vnp=ValNodeAddPointer(&vnp,0,(Pointer)slp);
444 if (!vnp){
445 if (bsp_vnp) ValNodeFree(bsp_vnp);
446 return(NULL);
447 }
448 }
449 slp->next=slp2;
450 slp=slp->next;
451 }
452 }
453 ssp=ssp->next;
454 }
455 return(bsp_vnp);
456 }
457
458 /*******************************************************************************
459
460 Function : DDV_IsLetterSelected()
461
462 Purpose : check if a bsp_pos is selected (vnp_bsp is usually built with
463 DDV_GetSelectedRegions() function)
464
465 Return value : TRUE if bsp_pos is selected
466
467 *******************************************************************************/
DDV_IsLetterSelected(ValNodePtr vnp_bsp,Int4 bsp_pos)468 extern Boolean DDV_IsLetterSelected(ValNodePtr vnp_bsp, Int4 bsp_pos)
469 {
470 Boolean bSelected=FALSE;
471 ValNodePtr vnp;
472 SeqLocPtr slp;
473 Int4 bsp_start,bsp_stop;
474 if (vnp_bsp==NULL || bsp_pos==(Int4)-1) return(FALSE);
475
476 vnp=vnp_bsp;
477
478 while(vnp){
479 slp=(SeqLocPtr)vnp->data.ptrvalue;
480 bsp_start=SeqLocStart(slp);
481 bsp_stop=SeqLocStop(slp);
482 if (bsp_pos>=bsp_start && bsp_pos<=bsp_stop){
483 bSelected=TRUE;
484 break;
485 }
486 vnp=vnp->next;
487 }
488
489 return(bSelected);
490 }
491
492 /*******************************************************************************
493
494 Function : DDV_CheckBSPEntitiesInPgp()
495
496 Purpose : check if entityID,itemID Object is in the current paragraph
497
498 Return value : TRUE if success
499
500 *******************************************************************************/
501 /*static Boolean DDV_CheckBSPEntities(Uint4Ptr entitiesTbl,Int4 nRowBsp,
502 Int4 nBsp,Uint2 eID,Uint2 iID)
503 {
504 Uint2 bsp_eID,bsp_iID;
505 Int4 i;
506 Boolean bRet=FALSE;
507
508 for (i=0;i<nBsp;i++){
509 UDV_DecodeIdxFeat (entitiesTbl[i], &bsp_eID,&bsp_iID);
510 }
511 bsp=BioseqLockById(pgp->sip);
512 if (bsp){
513 bsp_eID=ObjMgrGetEntityIDForPointer((Pointer)bsp);
514 bsp_iID = GetItemIDGivenPointer (bsp_eID,
515 OBJ_BIOSEQ, (Pointer) bsp);
516
517 if (bsp_eID==eID && bsp_iID==iID) bRet=TRUE;
518 BioseqUnlock(bsp);
519 }
520 return(bRet);
521 }
522 */
523 /*******************************************************************************
524
525 Function : DDV_CheckBSPEntitiesInDisplay()
526
527 Purpose : check if entityID,itemID Object is in the current DDV display
528
529 Return value : TRUE if object found
530
531 *******************************************************************************/
DDV_CheckBSPEntitiesInDisplay(MsaParaGPopListPtr mpplp,Uint2 entityID,Uint4 itemID)532 static Boolean DDV_CheckBSPEntitiesInDisplay(MsaParaGPopListPtr mpplp,
533 Uint2 entityID,Uint4 itemID)
534 {
535 Uint2 bsp_eID;
536 Uint4 bsp_iID;
537 Int4 i;
538 Boolean bRet=FALSE;
539
540 /*scan the ParaG list to find the Bioseq*/
541 for (i=0;i<mpplp->nBsp;i++){
542 UDV_DecodeIdxFeat (mpplp->entitiesTbl[i], &bsp_eID,&bsp_iID);
543 if (bsp_eID==entityID && bsp_iID==itemID) {
544 bRet=TRUE;
545 break;
546 }
547 }
548 return(bRet);
549 }
550
551 /*******************************************************************************
552
553 Function : DDV_GetBspListGivenIDs()
554
555 Purpose : analyse the ParaG struct and get a list of row(s) containing the
556 BSP identified by eID and iID
557
558 Return value : list of row number (one-based values)
559
560 *******************************************************************************/
DDV_GetBspListGivenIDs(MsaParaGPopListPtr mpplp,Uint2 entityID,Uint4 itemID,Int4Ptr nFound)561 static Int4Ptr DDV_GetBspListGivenIDs(MsaParaGPopListPtr mpplp,
562 Uint2 entityID,Uint4 itemID,Int4Ptr nFound)
563 {
564 Int4 i;
565 Int4Ptr pList=NULL;
566 Uint2 bsp_eID;
567 Uint4 bsp_iID;
568
569 *nFound=0;
570
571 /*scan the ParaG list to find all the ref. of the Bioseq
572 (entityID,itemID) in the ParaG list*/
573 for (i=0;i<mpplp->nBsp;i++){
574 UDV_DecodeIdxFeat (mpplp->entitiesTbl[i], &bsp_eID,&bsp_iID);
575 if (bsp_eID==entityID && bsp_iID==itemID) {
576 if (!pList){
577 pList=(Int4Ptr)MemNew(sizeof(Int4));
578 }
579 else{
580 pList=(Int4Ptr)MemExtend((void *)pList,
581 ((*nFound)+1)*sizeof(Int4), (*nFound)*sizeof(Int4));
582 }
583 if (!pList) {*nFound=0;return(NULL);}
584
585
586 pList[*nFound]=i+1;
587 (*nFound)++;
588 }
589
590 }
591 return(pList);
592 }
593
594 /*******************************************************************************
595
596 Function : DDV_MSG_SELECT()
597
598 Purpose : manage OM_MSG_SELECT & OM_MSG_DESELECT message
599
600 Return value : OM_MSG_RET_OK if success
601
602 *******************************************************************************/
DDV_MSG_SELECT(OMMsgStructPtr ommsp,Boolean IsSelectMsg)603 static Int2 DDV_MSG_SELECT(OMMsgStructPtr ommsp,Boolean IsSelectMsg)
604 {
605 DdvMainPtr dmp; /*DDV panel data*/
606 OMUserDataPtr omudp;/*user data set when registering DDV panel*/
607 Int4Ptr bsp_List=NULL;
608 ParaGPtr pgp;
609
610 Boolean bRet;
611 SeqLocPtr slp;
612 Int4 from_col,to_col,from_row,to_row,bsp_start,bsp_stop,nBspInstances=0,i,
613 row_num;
614
615 omudp = (OMUserDataPtr)(ommsp->omuserdata);
616 if (omudp == NULL) return(OM_MSG_RET_ERROR);
617
618 dmp=(DdvMainPtr)omudp->userdata.ptrvalue;
619 if (dmp == NULL) return(OM_MSG_RET_ERROR);
620
621 if (ommsp->itemtype != OBJ_BIOSEQ) return(OM_MSG_RET_OK);
622 if (ommsp->regiontype!=OM_REGION_SEQLOC) return(OM_MSG_RET_OK);
623
624 /*Am I concern by that Bioseq ?*/
625 bRet=DDV_CheckBSPEntitiesInDisplay(&(dmp->MSA_d.pgp_l),ommsp->entityID,
626 ommsp->itemID);
627
628 if (bRet==FALSE) return(OM_MSG_RET_OK); /* some other viewer */
629
630 /*get the disp coord range*/
631 DDV_GetCurrentDispRange(dmp->hWndDDV,&(dmp->GrData),dmp->MSA_d.pgp_l.LengthAli,
632 &from_col,&to_col,&from_row,&to_row);
633
634 /*get the occurrence(s) (row(s) #) for that bioseq*/
635 bsp_List=DDV_GetBspListGivenIDs(&(dmp->MSA_d.pgp_l),ommsp->entityID,
636 ommsp->itemID,&nBspInstances);
637
638 if (bsp_List==NULL || nBspInstances==0) return(OM_MSG_RET_ERROR);
639
640 /*scan the SeqLoc list to figure out if it's currently on the screen*/
641 slp=(SeqLocPtr)ommsp->region;
642 while(slp){/*for each SeqLoc, I try to see what region(s) has (have) to be
643 uptdated*/
644 for(i=0;i<nBspInstances;i++){
645 row_num=bsp_List[i]-1;
646 bsp_start=DDV_GetDispCoordGivenBspCoord(dmp->MSA_d.pgp_l.TableHead[row_num],
647 SeqLocStart(slp));
648 bsp_stop=DDV_GetDispCoordGivenBspCoord(dmp->MSA_d.pgp_l.TableHead[row_num],
649 SeqLocStop(slp));
650 if (bsp_start!=(Int4)-1 && bsp_stop!=(Int4)-1){
651 pgp=(ParaGPtr)(dmp->MSA_d.pgp_l.TableHead[row_num]->data.ptrvalue);
652
653 row_num=pgp->StartLine+
654
655 (pgp->ScaleStyle==SCALE_POS_NONE ? (Int4)0 : (Int4)1);
656
657 DDV_InvalRegion(dmp->hWndDDV,&(dmp->GrData),
658 _max_(bsp_start,from_col),_min_(bsp_stop,to_col),
659 row_num,IsSelectMsg);
660
661 }
662 }
663 slp=slp->next;
664 }
665 return(OM_MSG_RET_OK);
666 }
667
668 /*******************************************************************************
669
670 Function : DDV_MSG_UPDATE_CaretPos()
671
672 Purpose : update the position of the caret (edit mode only)
673
674 Return value : OM_MSG_RET_OK if success
675
676 *******************************************************************************/
DDV_MSG_UPDATE_CaretPos(OMMsgStructPtr ommsp)677 static Int2 DDV_MSG_UPDATE_CaretPos(OMMsgStructPtr ommsp)
678 {
679 DdvMainPtr dmp; /*DDV panel data*/
680 OMUserDataPtr omudp;/*user data set when registering DDV panel*/
681 Boolean bRet;
682 Int4 from_col,to_col,from_row,to_row;
683
684 omudp = (OMUserDataPtr)(ommsp->omuserdata);
685 if (omudp == NULL) return(OM_MSG_RET_ERROR);
686
687 dmp=(DdvMainPtr)omudp->userdata.ptrvalue;
688 if (dmp == NULL) return(OM_MSG_RET_ERROR);
689
690 /*Am I concern by that Bioseq ?*/
691 bRet=DDV_CheckBSPEntitiesInDisplay(&(dmp->MSA_d.pgp_l),ommsp->entityID,
692 ommsp->itemID);
693
694 if (bRet==FALSE) return(OM_MSG_RET_ERROR);
695
696 /*get the disp coord range*/
697 DDV_GetCurrentDispRange(dmp->hWndDDV,&(dmp->GrData),dmp->MSA_d.pgp_l.LengthAli,
698 &from_col,&to_col,&from_row,&to_row);
699
700 /*switch to one-bsed value because dmp->dci values are one-based values*/
701 from_row++;
702 to_row++;
703 /*hide the caret from old coordinates*/
704 if (dmp->dci.old_col>=from_col && dmp->dci.old_col<=to_col &&
705 dmp->dci.old_row>=from_row && dmp->dci.old_row<=to_row){
706 DDV_InvalRegion(dmp->hWndDDV,&(dmp->GrData),
707 dmp->dci.old_col,dmp->dci.old_col+1,
708 dmp->dci.old_row,FALSE);
709 }
710 /*show caret on new coordinates*/
711 if (dmp->dci.new_col>=from_col && dmp->dci.new_col<=to_col &&
712 dmp->dci.new_row>=from_row && dmp->dci.new_row<=to_row){
713 DDV_InvalRegion(dmp->hWndDDV,&(dmp->GrData),
714 dmp->dci.new_col,dmp->dci.new_col+1,
715 dmp->dci.new_row,FALSE);
716 }
717 return(OM_MSG_RET_OK);
718 }
719
720 /*******************************************************************************
721
722 Function : DDV_MSG_UPDATE_DelBSP()
723
724 Purpose : rebuilt a display after deletion of one BSP
725
726 Return value : OM_MSG_RET_OK if success
727
728 *******************************************************************************/
DDV_MSG_UPDATE_DelBSP(OMMsgStructPtr ommsp)729 static Int2 DDV_MSG_UPDATE_DelBSP(OMMsgStructPtr ommsp)
730 {
731 DdvMainPtr dmp; /*DDV panel data*/
732 OMUserDataPtr omudp;/*user data set when registering DDV panel*/
733
734 omudp = (OMUserDataPtr)(ommsp->omuserdata);
735 if (omudp == NULL) return(OM_MSG_RET_ERROR);
736
737 dmp=(DdvMainPtr)omudp->userdata.ptrvalue;
738 if (dmp == NULL) return(OM_MSG_RET_ERROR);
739
740 /*delete the current display*/
741 if (dmp->MSA_d.pgp_l.TableHead)
742 DDV_DeleteDisplayList(&dmp->MSA_d.pgp_l);
743 if (dmp->MSA_d.pgp_l.RulerDescr)
744 ValNodeFreeData(dmp->MSA_d.pgp_l.RulerDescr);
745 if (dmp->MSA_d.pgp_l.entitiesTbl)
746 MemFree(dmp->MSA_d.pgp_l.entitiesTbl);
747 dmp->MSA_d.pgp_l.TableHead=NULL;
748 dmp->MSA_d.pgp_l.RulerDescr=NULL;
749 /*rebuild a new one*/
750 if (!DDV_CreateDisplayFromIndex(dmp->MSA_d.pgp_l.sap,
751 &(dmp->MSA_d.pgp_l),ParaG_Size,&(dmp->ddo)))
752 return(OM_MSG_RET_ERROR);
753
754 dmp->MSA_d.pgp_l.entitiesTbl=
755 DDV_BuildBspEntitiesTbl(dmp->MSA_d.pgp_l.TableHead,
756 dmp->MSA_d.pgp_l.nBsp);
757 if (!dmp->MSA_d.pgp_l.entitiesTbl)
758 return(OM_MSG_RET_ERROR);
759 /*build the Master Ruler descriptor*/
760 /* dmp->MSA_d.pgp_l.RulerDescr=DDV_ComputeRuler(dmp->MSA_d.pgp_l.sap,&(dmp->ddo)); */
761 dmp->MSA_d.pgp_l.RulerDescr = DDE_ReMakeRuler(&(dmp->MSA_d.pgp_l), FALSE, 0);
762
763 /*delete old tables*/
764 if(dmp->MasterViewer != SAMVIEWCN3D) {
765 DDV_ClearColor(dmp->Globals.colorp);
766 /*build new tables*/
767 if (!DDV_InitColour_When_Start(dmp->MSA_d.pgp_l.sap,
768 &(dmp->MSA_d.pgp_l),&(dmp->Globals.colorp), FALSE)){
769 dmp->ddo.bUseColors=FALSE;
770 }
771 }
772
773 DDV_SortPGPLineNum(dmp->MSA_d.pgp_l.TableHead,dmp->MSA_d.pgp_l.nBsp);
774 DDV_WhatSize(dmp);
775 /* DDV_SetupWin(dmp->hWndDDV,TRUE,NULL); */
776 DDV_Resize_DDV(dmp->hWndDDV,TRUE);
777 Update();
778
779 return(OM_MSG_RET_OK);
780 }
781 /*******************************************************************************
782
783 Function : DDV_MSG_UPDATE_ViewMgr()
784
785 Purpose : rebuild a display after update message from the ViewMgr
786
787 Return value : OM_MSG_RET_OK if success
788
789 *******************************************************************************/
DDV_MSG_UPDATE_ViewMgr(OMMsgStructPtr ommsp)790 static Int2 DDV_MSG_UPDATE_ViewMgr(OMMsgStructPtr ommsp)
791 {
792 DdvMainPtr dmp; /*DDV panel data*/
793 OMUserDataPtr omudp;/*user data set when registering DDV panel*/
794 BaR hsb;
795 Int4 HPos;
796
797 omudp = (OMUserDataPtr)(ommsp->omuserdata);
798 if (omudp == NULL) return(OM_MSG_RET_ERROR);
799
800 dmp=(DdvMainPtr)omudp->userdata.ptrvalue;
801 if (dmp == NULL) return(OM_MSG_RET_ERROR);
802
803 if (dmp->bEditor) return(OM_MSG_RET_OK);
804
805 /* get the current column */
806 hsb = GetSlateHScrollBar((SlatE) dmp->hWndDDV);
807 HPos = GetBarValue(hsb);
808
809 /*delete the current display*/
810 if (dmp->MSA_d.pgp_l.TableHead)
811 DDV_DeleteDisplayList(&dmp->MSA_d.pgp_l);
812 if (dmp->MSA_d.pgp_l.RulerDescr)
813 ValNodeFreeData(dmp->MSA_d.pgp_l.RulerDescr);
814 if (dmp->MSA_d.pgp_l.entitiesTbl)
815 MemFree(dmp->MSA_d.pgp_l.entitiesTbl);
816 dmp->MSA_d.pgp_l.TableHead=NULL;
817 dmp->MSA_d.pgp_l.RulerDescr=NULL;
818 /*rebuild a new one*/
819 if (!DDV_CreateDisplayFromIndex(dmp->MSA_d.pgp_l.sap,
820 &(dmp->MSA_d.pgp_l),ParaG_Size,&(dmp->ddo)))
821 return(OM_MSG_RET_ERROR);
822
823 dmp->MSA_d.pgp_l.entitiesTbl=
824 DDV_BuildBspEntitiesTbl(dmp->MSA_d.pgp_l.TableHead,
825 dmp->MSA_d.pgp_l.nBsp);
826 if (!dmp->MSA_d.pgp_l.entitiesTbl)
827 return(OM_MSG_RET_ERROR);
828
829 /* build the Master Ruler descriptor */
830 /* Patrick's ComputeRuler isn't working right, so I substituted mine -- Dave H. */
831 /* dmp->MSA_d.pgp_l.RulerDescr=DDV_ComputeRuler(dmp->MSA_d.pgp_l.sap,&(dmp->ddo)); */
832 dmp->MSA_d.pgp_l.RulerDescr = DDE_ReMakeRuler(&(dmp->MSA_d.pgp_l), FALSE, 0);
833
834 /*delete old tables*/
835 if(dmp->MasterViewer != SAMVIEWCN3D) {
836 DDV_ClearColor(dmp->Globals.colorp);
837 /*build new tables*/
838 if (!DDV_InitColour_When_Start(dmp->MSA_d.pgp_l.sap,
839 &(dmp->MSA_d.pgp_l),&(dmp->Globals.colorp), FALSE)){
840 dmp->ddo.bUseColors=FALSE;
841 }
842 }
843
844 DDV_SortPGPLineNum(dmp->MSA_d.pgp_l.TableHead,dmp->MSA_d.pgp_l.nBsp);
845 DDV_WhatSize(dmp);
846 DDV_Resize_DDV(dmp->hWndDDV,TRUE); /* DDV_SetupWin(dmp->hWndDDV,TRUE,NULL); */
847
848 /* put col back to where it was */
849 SetValue(hsb, HPos);
850
851 Update();
852
853 return(OM_MSG_RET_OK);
854 }
855
856 /*******************************************************************************
857
858 Function : DDV_MSG_UPDATE_Layout()
859
860 Purpose : manage the OM_MSG_UPDATE message
861
862 Return value : OM_MSG_RET_OK if success
863
864 *******************************************************************************/
DDV_MSG_UPDATE_Layout(PaneL hWndDDV,DDVUpdateLayoutDataPtr dumdp)865 static Int2 DDV_MSG_UPDATE_Layout(PaneL hWndDDV, DDVUpdateLayoutDataPtr dumdp)
866 {
867 DdvMainPtr dmp;
868 Int4 j;
869 Boolean bResetScrolls=FALSE,
870 bRebuildDisplay=FALSE,
871 bSwitchColors=FALSE,
872 bUpdateColors=FALSE;
873 Uint1 oldSpacerSize;
874
875 if (!hWndDDV || !dumdp)
876 return(OM_MSG_RET_OK);
877
878 dmp = (DdvMainPtr) GetObjectExtra(hWndDDV);
879
880 if (!dmp)
881 return(OM_MSG_RET_OK);
882
883 if (!Visible(hWndDDV))
884 return(OM_MSG_RET_OK);
885
886 oldSpacerSize=dmp->ddo.SpacerSize;
887 dmp->ddo.SpacerSize=dumdp->SpacerSize;
888
889 /*rebuild the display, if needed*/
890 if ((dmp->ddo.DispDiscStyle!=dumdp->DispDiscStyle) ||
891 (oldSpacerSize!=dumdp->SpacerSize) ||
892 (dmp->ddo.DiscJustification!=dumdp->DiscJustification) ||
893 (dmp->ddo.ShowLeftTail!=dumdp->ShowLeftTail)||
894 (dmp->ddo.ShowRightTail!=dumdp->ShowRightTail)){
895
896 if((dmp->ddo.ShowLeftTail!=dumdp->ShowLeftTail)||
897 (dmp->ddo.ShowRightTail!=dumdp->ShowRightTail)||
898 (dmp->ddo.DispDiscStyle!=dumdp->DispDiscStyle)){
899 bUpdateColors=TRUE;
900 }
901 /*update the styles*/
902 dmp->ddo.DispDiscStyle=dumdp->DispDiscStyle;
903 dmp->ddo.DiscJustification=dumdp->DiscJustification;
904 dmp->ddo.ShowLeftTail=dumdp->ShowLeftTail;
905 dmp->ddo.ShowRightTail=dumdp->ShowRightTail;
906
907 /*delete the current display*/
908 if (dmp->MSA_d.pgp_l.TableHead)
909 DDV_DeleteDisplayList(&dmp->MSA_d.pgp_l);
910 if (dmp->MSA_d.pgp_l.RulerDescr)
911 ValNodeFreeData(dmp->MSA_d.pgp_l.RulerDescr);
912 if (dmp->MSA_d.pgp_l.entitiesTbl)
913 MemFree(dmp->MSA_d.pgp_l.entitiesTbl);
914
915 dmp->MSA_d.pgp_l.TableHead=NULL;
916 dmp->MSA_d.pgp_l.RulerDescr=NULL;
917 /*rebuild a new one*/
918 if (!DDV_CreateDisplayFromIndex(dmp->MSA_d.pgp_l.sap,
919 &(dmp->MSA_d.pgp_l),ParaG_Size,&(dmp->ddo)))
920 return(OM_MSG_RET_ERROR);
921
922 dmp->MSA_d.pgp_l.entitiesTbl=
923 DDV_BuildBspEntitiesTbl(dmp->MSA_d.pgp_l.TableHead,
924 dmp->MSA_d.pgp_l.nBsp);
925 if (!dmp->MSA_d.pgp_l.entitiesTbl)
926 return(OM_MSG_RET_ERROR);
927 /*build the Master Ruler descriptor*/
928 /* dmp->MSA_d.pgp_l.RulerDescr=DDV_ComputeRuler(dmp->MSA_d.pgp_l.sap,&(dmp->ddo)); */
929 dmp->MSA_d.pgp_l.RulerDescr = DDE_ReMakeRuler(&(dmp->MSA_d.pgp_l), FALSE, 0);
930
931 /*init the colours*/
932 if(bUpdateColors){
933 if(dmp->MasterViewer != SAMVIEWCN3D ) {
934 /*delete old tables*/
935 DDV_ClearColor(dmp->Globals.colorp);
936 /*build new tables*/
937 if (!DDV_InitColour_When_Start(dmp->MSA_d.pgp_l.sap,
938 &(dmp->MSA_d.pgp_l),&(dmp->Globals.colorp),FALSE)){
939 dmp->ddo.bUseColors=FALSE;
940 }
941 }
942 }
943 bResetScrolls=TRUE;
944 bRebuildDisplay=TRUE;
945 }
946
947 /*set the ruler styles*/
948 if(dumdp->nSeq && dumdp->SeqList){
949 for(j=0;j<dumdp->nSeq;j++){
950 switch(dumdp->RulerStyle){
951 case SCALE_POS_TOP:
952 DDV_SetRulerAttribInPGP(dmp->MSA_d.pgp_l.TableHead[dumdp->SeqList[j]-1],
953 SCALE_POS_TOP);
954 break;
955 case SCALE_POS_NONE:
956 DDV_SetRulerAttribInPGP(dmp->MSA_d.pgp_l.TableHead[dumdp->SeqList[j]-1],
957 SCALE_POS_NONE);
958 break;
959 default:
960 DDV_SetRulerAttribInPGP(dmp->MSA_d.pgp_l.TableHead[dumdp->SeqList[j]-1],
961 SCALE_POS_NONE);
962 break;
963 }
964 }
965 bRebuildDisplay=TRUE;
966 }
967
968 /*colors*/
969 if(dmp->ddo.bUseColors!=dumdp->bUseColors){
970 dmp->ddo.bUseColors=dumdp->bUseColors;
971 bSwitchColors=TRUE;
972 }
973
974 /*redraw if needed*/
975 if (bRebuildDisplay){
976 DDV_SortPGPLineNum(dmp->MSA_d.pgp_l.TableHead,dmp->MSA_d.pgp_l.nBsp);
977 DDV_WhatSize(dmp);
978 DDV_Resize_DDV(hWndDDV,bResetScrolls); /* DDV_SetupWin(hWndDDV,bResetScrolls,NULL);*/
979 Update();
980 }
981 else if (bSwitchColors){
982 RecT rcP;
983 WindoW temport;
984
985 temport=SavePort(ParentWindow(hWndDDV));
986 Select(hWndDDV);
987
988 ObjectRect(hWndDDV,&rcP);
989 InvalRect(&rcP);
990 RestorePort(temport);
991 /*Update();*/
992 }
993
994
995 return(OM_MSG_RET_OK);
996 }
997
998 /*******************************************************************************
999
1000 Function : DDV_MSG_FLUSH()
1001
1002 Purpose : kill the viewer in response to a OM_MSG_FLUSH message
1003
1004 Return value : OM_MSG_RET_OK if success
1005
1006 *******************************************************************************/
DDV_MSG_FLUSH(OMMsgStructPtr ommsp)1007 static Int2 DDV_MSG_FLUSH(OMMsgStructPtr ommsp)
1008 {
1009 DdvMainPtr dmp; /*DDV panel data*/
1010 OMUserDataPtr omudp;/*user data set when registering DDV panel*/
1011 /*ParaGPtr pgp;
1012 BioseqPtr bsp;
1013 Int4 i;
1014 Uint2 bsp_eID;*/
1015
1016
1017 omudp = (OMUserDataPtr)(ommsp->omuserdata);
1018 if (omudp == NULL) return(OM_MSG_RET_ERROR);
1019
1020 dmp=(DdvMainPtr)omudp->userdata.ptrvalue;
1021 if (dmp == NULL) return(OM_MSG_RET_ERROR);
1022
1023 if (dmp->MSA_d.entityID==ommsp->entityID &&
1024 ((dmp->MSA_d.itemID==ommsp->itemID && ommsp->itemtype==OBJ_SEQALIGN)
1025 ||(ommsp->itemID == 0 && ommsp->itemtype==0))){
1026 Remove(dmp->hParent);
1027 DDV_CleanupDDVPdata_g(dmp);
1028 /* for(i=0;i<dmp->MSA_d.pgp_l.nBsp;i++){
1029 pgp=(ParaGPtr)(dmp->MSA_d.pgp_l.TableHead[i]->data.ptrvalue);
1030 bsp=BioseqLockById(pgp->sip);
1031 if (bsp != NULL){
1032 bsp_eID=ObjMgrGetEntityIDForPointer((Pointer)bsp);
1033 BioseqUnlock(bsp);
1034 if (bsp_eID>0 && bsp_eID!=dmp->MSA_d.entityID){
1035 ObjMgrFreeUserData(bsp_eID,dmp->procid,dmp->proctype,dmp->userkey);
1036 }
1037 }
1038 }
1039
1040 ObjMgrFreeUserData(dmp->MSA_d.entityID,dmp->procid,dmp->proctype,dmp->userkey);*/
1041 }
1042 return(OM_MSG_RET_OK);
1043 }
1044
1045 /*******************************************************************************
1046
1047 Function : DDV_SimpleUpdateAnswer()
1048
1049 Purpose : simple answer to an Update Msg; just redraw the window
1050
1051 Parameters : see Toolkit
1052
1053 Return value : see Toolkit
1054
1055 *******************************************************************************/
DDV_SimpleUpdateAnswer(OMMsgStructPtr ommsp)1056 static void DDV_SimpleUpdateAnswer(OMMsgStructPtr ommsp)
1057 {
1058 RecT rcP;
1059 WindoW temport;
1060 DdvMainPtr dmp; /*DDV panel data*/
1061 OMUserDataPtr omudp;/*user data set when registering DDV panel*/
1062
1063 omudp = (OMUserDataPtr)(ommsp->omuserdata);
1064 if (omudp == NULL) return;
1065
1066 dmp=(DdvMainPtr)omudp->userdata.ptrvalue;
1067 if (dmp == NULL) return;
1068
1069 temport=SavePort(ParentWindow(dmp->hWndDDV));
1070 Select(dmp->hWndDDV);
1071
1072 ObjectRect(dmp->hWndDDV,&rcP);
1073 InvalRect(&rcP);
1074 RestorePort(temport);
1075 }
1076
1077 /*******************************************************************************
1078
1079 Function : DDV_UpdateRegMsgFunc()
1080
1081 Purpose : register a MsgCallback in response to an OM_MSG_UPDATE, after
1082 SeqImport
1083
1084 *******************************************************************************/
DDV_UpdateRegMsgFunc(OMMsgStructPtr ommsp,Uint2 bsp_eID)1085 static void DDV_UpdateRegMsgFunc(OMMsgStructPtr ommsp,Uint2 bsp_eID)
1086 {
1087 DdvMainPtr dmp; /*DDV panel data*/
1088 OMUserDataPtr omudp;/*user data set when registering DDV panel*/
1089
1090 omudp = (OMUserDataPtr)(ommsp->omuserdata);
1091 if (omudp == NULL) return;
1092
1093 dmp=(DdvMainPtr)omudp->userdata.ptrvalue;
1094 if (dmp == NULL) return;
1095
1096 DDV_RegisterMsgFuncOnBsp(bsp_eID,dmp);
1097 }
1098
1099 /*******************************************************************************
1100
1101 Function : DDV_OM_MsgFunc()
1102
1103 Purpose : ObjMgr message loop of the DDV viewer/editor
1104
1105 Parameters : see Toolkit
1106
1107 Return value : see Toolkit
1108
1109 *******************************************************************************/
DDV_OM_MsgFunc(OMMsgStructPtr ommsp)1110 static Int2 LIBCALLBACK DDV_OM_MsgFunc (OMMsgStructPtr ommsp)
1111 {
1112 Int2 nRet=OM_MSG_RET_OK;
1113
1114 switch (ommsp->message)
1115 {
1116 case OM_MSG_DEL:
1117 break;
1118 case OM_MSG_CREATE:
1119 break;
1120 case OM_MSG_UPDATE:{
1121 DDVUpdateMSGPtr dump;
1122
1123 dump = (DDVUpdateMSGPtr)(ommsp->procmsgdata);
1124
1125 /*generic UPDATE msg*/
1126 if (!dump){
1127 DDV_SimpleUpdateAnswer(ommsp);
1128 break;
1129 }
1130
1131 /*specific UPDATE msg*/
1132 switch(dump->type){
1133 case UPDATE_TYPE_LAYOUT:{
1134 DDVUpdateLayoutDataPtr dumdp;
1135
1136 dumdp=(DDVUpdateLayoutDataPtr)dump->data;
1137
1138 if (!dumdp)
1139 break;
1140
1141 nRet=DDV_MSG_UPDATE_Layout(dumdp->ddv_panel,dumdp);
1142 break;
1143 }
1144 case UPDATE_TYPE_EDIT_DELBSP:
1145 nRet=DDV_MSG_UPDATE_DelBSP(ommsp);
1146 break;
1147 case UPDATE_TYPE_VIEWMGR:
1148 nRet=DDV_MSG_UPDATE_ViewMgr(ommsp);
1149 break;
1150 case UPDATE_TYPE_CARETPOS:
1151 nRet=DDV_MSG_UPDATE_CaretPos(ommsp);
1152 break;
1153 case UPDATE_TYPE_NEWSEQ:
1154 if (dump->data)
1155 DDV_UpdateRegMsgFunc(ommsp,*((Uint2 *)dump->data));
1156 break;
1157 default :
1158 DDV_SimpleUpdateAnswer(ommsp);
1159 }
1160
1161 break;
1162 }
1163 case OM_MSG_SELECT:
1164 nRet=DDV_MSG_SELECT(ommsp,TRUE);
1165 break;
1166 case OM_MSG_DESELECT:
1167 nRet=DDV_MSG_SELECT(ommsp,FALSE);
1168 break;
1169 case OM_MSG_CACHED:
1170 break;
1171 case OM_MSG_UNCACHED:
1172 break;
1173 case OM_MSG_TO_CLIPBOARD:
1174 break;
1175 case OM_MSG_SETCOLOR:
1176 break;
1177 case OM_MSG_FLUSH:
1178 DDV_MSG_FLUSH(ommsp);
1179 break;
1180 default:
1181 break;
1182 }
1183
1184 return (nRet);
1185 }
1186
1187 /*******************************************************************************
1188
1189 Function : DDV_RegisterMsgFuncOnBsp()
1190
1191 Purpose : register a MsgFunc for a bsp.
1192
1193 *******************************************************************************/
DDV_RegisterMsgFuncOnBsp(Uint2 bsp_eID,DdvMainPtr dmp)1194 static void DDV_RegisterMsgFuncOnBsp(Uint2 bsp_eID,DdvMainPtr dmp)
1195 {
1196 OMUserDataPtr omudp;
1197
1198 if (bsp_eID==0 || dmp==NULL) return;
1199
1200 omudp = ObjMgrAddUserData (bsp_eID,dmp->procid,dmp->proctype,dmp->userkey);
1201 if (omudp != NULL) {
1202 omudp->messagefunc = DDV_OM_MsgFunc;
1203 omudp->userdata.ptrvalue = (Pointer)dmp;
1204 }
1205 }
1206
1207 /*******************************************************************************
1208
1209 Function : DDV_RegMsgFuncForBsp()
1210
1211 Purpose : given the display data structure (nBsp & TableHead), register a
1212 MsgFunc callback for each bioseq of a SeqAlign.
1213
1214 Parameters : TableHead; entry point of the display data structure (ParaG list)
1215 nBsp; number of sequences in the SeqAlign
1216 master_eID; entityID of the object containing the SeqAlign
1217 procID; identifier of the viewer (usually DDV)
1218 userkey; userkey of the viewer (usually DDV)
1219
1220 Return value : -
1221
1222 *******************************************************************************/
DDV_RegMsgFuncForBsp(ValNodePtr PNTR TableHead,DdvMainPtr dmp,Int4 nBsp,Uint2 master_eID,Uint2 procID,Uint2 procType,Uint2 userkey)1223 static void DDV_RegMsgFuncForBsp(ValNodePtr PNTR TableHead,DdvMainPtr dmp,Int4 nBsp,
1224 Uint2 master_eID, Uint2 procID, Uint2 procType, Uint2 userkey)
1225 {
1226 OMUserDataPtr omudp,omudp_tmp;
1227 ParaGPtr pgp;
1228 BioseqPtr bsp;
1229 Int4 i;
1230 Boolean bFound;
1231 Uint2 bsp_eID;
1232
1233 if (!TableHead || nBsp==0 || master_eID==0 || procID==0
1234 || procType==0 ||userkey==0) return;
1235
1236 for(i=0;i<nBsp;i++){
1237 pgp=(ParaGPtr)(dmp->MSA_d.pgp_l.TableHead[i]->data.ptrvalue);
1238 bsp=BioseqLockById(pgp->sip);
1239 if (bsp){
1240 bsp_eID=ObjMgrGetEntityIDForPointer((Pointer)bsp);
1241 if (bsp_eID>0 && bsp_eID!=master_eID){
1242 omudp=ObjMgrGetUserData(bsp_eID,procID,procType,userkey);
1243 if (omudp){
1244 /*scan the user data associated with that bioseq and try to
1245 find if a Msg Func is already attached for DDV*/
1246 omudp_tmp=omudp;
1247 bFound=FALSE;
1248 while(omudp_tmp){
1249 if (omudp_tmp->procid==procID &&
1250 omudp_tmp->proctype==procType &&
1251 omudp_tmp->userkey==userkey &&
1252 omudp_tmp->messagefunc==DDV_OM_MsgFunc){
1253
1254 bFound=TRUE;
1255 break;
1256 }
1257 omudp_tmp=omudp_tmp->next;
1258 }
1259 }
1260 else{/*add the Msg Callaback and DDV main data block to the bioseq*/
1261 bFound=FALSE;
1262 }
1263 if (bFound==FALSE){
1264 DDV_RegisterMsgFuncOnBsp(bsp_eID,dmp);
1265 }
1266 }
1267 BioseqUnlock(bsp);
1268 }
1269 }
1270 }
1271
DDV_Convert(ButtoN g)1272 static void DDV_Convert(ButtoN g) {
1273 /*----------------------------------------------------------------------------
1274 * just need to quit the pop-up window
1275 *---------------------------------------------------------------------------*/
1276 WindoW hDialog;
1277
1278 hDialog = (WindoW)ParentWindow(g);
1279 if (!hDialog) return;
1280 Remove(hDialog);
1281 return;
1282 }
1283
1284
DDV_NoConvert(ButtoN g)1285 static void DDV_NoConvert(ButtoN g) {
1286 /*----------------------------------------------------------------------------
1287 * quit the pop-up window and close the file
1288 *---------------------------------------------------------------------------*/
1289 WindoW hDialog;
1290 DdvMainPtr dmp;
1291
1292 hDialog = (WindoW)ParentWindow(g);
1293 if (!hDialog) return;
1294 Remove(hDialog);
1295
1296 dmp = (DdvMainPtr) GetObjectExtra(hDialog);
1297 DDV_FileCloseIt(dmp->hParent);
1298 return;
1299 }
1300
1301
1302 /*******************************************************************************
1303
1304 Function : DDV_StartPanel_Slave()
1305
1306 Purpose : start DDV main window as a slave module: init 'dmp' data structure
1307 (if needed), create the DDV panel, prepare a display from 'sap'.
1308
1309 Parameters : sap; pointer to a SeqAlign
1310 input_entityID,input_itemID; identity of the SeqAlign
1311 dmp; main data of DDV. May be NULL
1312 hParent; parent window for DDV. Must not be NULL
1313 bSetAppProp; if TRUE, use SetAppProperty().
1314 bInitGraph; if TRUE, initialize the graphical data for DDV
1315 bEditor; if TRUE, start the editor mode. Otherwise, a simple
1316 viewer will ba started
1317 rcPp; the RecT that defines the size of the panel. can be NULL.
1318
1319 Note : This function assumes that DDV will be placed inside an existing
1320 parent window provided by the host application.
1321
1322 Return value : handle to the DDV panel
1323
1324 *******************************************************************************/
DDV_StartPanel_Slave(DdvMainPtr dmp,SeqAlignPtr sap,Uint2 * pInput_entityID,Uint4 * pInput_itemID,Boolean bEditor)1325 static Boolean DDV_StartPanel_Slave(DdvMainPtr dmp, SeqAlignPtr sap,
1326 Uint2* pInput_entityID, Uint4* pInput_itemID, Boolean bEditor)
1327 {
1328 DDV_ColorGlobal * dcgp;
1329 MsaParaGPopListPtr mpplp;
1330 BaR hsb;
1331 Int4 HPos, Col, IsEditable;
1332 DdvMainWinPtr mWin_d;
1333 Boolean* pNoGaps;
1334 Boolean NoGaps;
1335 char Str[1024];
1336 MsgAnswer Answer;
1337 Boolean Attached = FALSE;
1338
1339 WatchCursor();
1340
1341 if (!dmp->bEditor) {
1342 mWin_d = (DdvMainWinPtr) GetObjectExtra(dmp->hParent);
1343 Enable(mWin_d->MainMenu.LaunchEditor);
1344 IsEditable = AlnMgrIsEditable(sap);
1345 if (!IsEditable) {
1346 if (AlnMgrIsIBMable(sap)) {
1347 Str[0] = 0;
1348 StringCat(Str, "This file is a multiple pairwise alignment.\n");
1349 StringCat(Str, "To edit this file, it needs to be converted\n");
1350 StringCat(Str, "to a true multiple alignment.\n");
1351 StringCat(Str, "Should it be converted?");
1352 mWin_d->Show_logo=TRUE;
1353 Answer = Message(MSG_YN, "%s", Str);
1354 mWin_d->Show_logo=FALSE;
1355 if (Answer == ANS_YES) {
1356 if (ViewMgr_Attach(sap, TRUE, TRUE, *pInput_entityID, *pInput_itemID) < 1)
1357 return (FALSE);
1358 Attached = TRUE;
1359 }
1360 else {
1361 Disable(mWin_d->MainMenu.LaunchEditor);
1362 }
1363 }
1364 }
1365 else if (IsEditable == AM_EDITGAPS) {
1366 pNoGaps = (Boolean*) GetAppProperty("dde_nogaps");
1367 if (pNoGaps == NULL) NoGaps = TRUE;
1368 else NoGaps = *pNoGaps;
1369 if (NoGaps) {
1370 Str[0] = 0;
1371 StringCat(Str, "This alignment can't be edited\n");
1372 StringCat(Str, "because it has aligned gaps\n");
1373 StringCat(Str, "and DDV is running in NoGaps mode");
1374 Message(MSG_OK, "%s", Str);
1375 Disable(mWin_d->MainMenu.LaunchEditor);
1376 }
1377 }
1378 }
1379
1380 if (!Attached) {
1381 if (ViewMgr_Attach(sap, FALSE, FALSE, *pInput_entityID, *pInput_itemID) < 1)
1382 return (FALSE);
1383 }
1384
1385 /*if we have a NULL SeqAlign, switch the display style to show
1386 the sequences, not a spacer*/
1387 if (AlnMgrIsSAPNULL(sap)){
1388 dmp->ddo.DispDiscStyle=MSA_TXT_STYLE_2;
1389 dmp->ddo.SpacerSize=SPACER_TXT_BLANK;
1390 dmp->ddo.DiscJustification=DISP_JUST_LEFT;
1391 }
1392
1393 if (bEditor) {
1394 dmp->dsp = (DDE_StackPtr) GetAppProperty("ddeinterndata");
1395 if (dmp->dsp == NULL) {return(FALSE);}
1396 mpplp = dmp->dsp->pEdit->pPopList;
1397 /* copy paragraphs from DDE_Stack into the ones that are displayed */
1398 MemCopy(&(dmp->MSA_d.pgp_l),mpplp,sizeof(MsaParaGPopList));
1399 }
1400 else {
1401 if (!DDV_CreateDisplayFromIndex(sap,&(dmp->MSA_d.pgp_l),ParaG_Size,
1402 &(dmp->ddo))) return(FALSE);
1403 dmp->MSA_d.pgp_l.entitiesTbl=
1404 DDV_BuildBspEntitiesTbl(dmp->MSA_d.pgp_l.TableHead,
1405 dmp->MSA_d.pgp_l.nBsp);
1406 if (!dmp->MSA_d.pgp_l.entitiesTbl) return(FALSE);
1407 /*build the Master Ruler descriptor*/
1408 /* dmp->MSA_d.pgp_l.RulerDescr=DDV_ComputeRuler(sap,&(dmp->ddo)); */
1409 dmp->MSA_d.pgp_l.RulerDescr = DDE_ReMakeRuler(&(dmp->MSA_d.pgp_l), FALSE, 0);
1410 }
1411
1412 dmp->MSA_d.entityID=*pInput_entityID;
1413 dmp->MSA_d.itemID=*pInput_itemID;
1414
1415 /*
1416 #if defined(_DEBUG_DDE)
1417 {
1418 MsaParaGPopListPtr mpplp;
1419 mpplp = DDV_CreateDataForEditor(&(dmp->MSA_d.pgp_l), 0, dmp->MSA_d.pgp_l.LengthAli-1);
1420 MemCopy(&(dmp->MSA_d.pgp_l),mpplp,sizeof(MsaParaGPopList));
1421 dmp->dsp = DDE_NewStack(mpplp);
1422 }
1423 #endif
1424 */
1425
1426 /*get the color stuff from the sap object. Usually I can do that
1427 when DDV is loaded from Cn3D*/
1428 dcgp=DDV_GetColorGlobal((Pointer) sap);
1429
1430 /*init the colours*/
1431 if (dcgp==NULL){
1432 if (!DDV_InitColour_When_Start(dmp->MSA_d.pgp_l.sap,&(dmp->MSA_d.pgp_l),
1433 &(dmp->Globals.colorp),FALSE)){
1434 dmp->ddo.bUseColors=FALSE;
1435 }
1436 }
1437 else dmp->Globals.colorp = dcgp;
1438
1439 /*set the initial position of the caret (edit mode)*/
1440 dmp->dci.old_row=1;
1441 dmp->dci.new_row=1;
1442 dmp->dci.old_col=0;
1443 dmp->dci.new_col=0;
1444
1445
1446 /*relation between align size and display type; compute nTotLines for example*/
1447 DDV_WhatSize(dmp);
1448
1449 ArrowCursor();
1450 DDV_Resize_DDV(dmp->hWndDDV,TRUE); /*DDV_SetupWin (dmp->hWndDDV,TRUE,NULL); */
1451 /*Update();*/
1452
1453 CaptureSlateFocus((SlatE)dmp->hWndDDV);
1454
1455 /* scroll display horizontally so aligned region is shown at position 5 */
1456 if (DDE_GetNumBlocks2(&(dmp->MSA_d.pgp_l))) {
1457 hsb = GetSlateHScrollBar((SlatE) dmp->hWndDDV);
1458 HPos = GetBarValue(hsb);
1459 if (bEditor) {
1460 Col = DDE_GetAlignStart(dmp->dsp->pEdit, 0);
1461 }
1462 else {
1463 Col = 0;
1464 if (dmp->ddo.ShowLeftTail) {
1465 Col = AlnMgrGetMaxTailLength(sap, LEFT_TAIL);
1466 }
1467 }
1468 SetValue(hsb, HPos+Col-5);
1469 }
1470
1471 /* only enable left/right/center justify for an unaligned region in the editor */
1472 if (bEditor) {
1473 mWin_d = (DdvMainWinPtr) GetObjectExtra(dmp->hParent);
1474 if (dmp->dsp->IsUnAligned) {
1475 Enable(mWin_d->MainMenu.Justify);
1476 }
1477 else {
1478 Disable(mWin_d->MainMenu.Justify);
1479 }
1480 }
1481
1482 return(TRUE);
1483 }
1484
1485
1486 /*******************************************************************************
1487
1488 Function : DDV_ObjRegMasterDDV()
1489
1490 Purpose : call by ObjMgr to start DDV panel
1491
1492 Parameters : see Toolkit
1493
1494 Note : this callback is only used by the standalone DDV. Never use this
1495 callback for other purpose.
1496
1497 Return value : see Toolkit
1498
1499 *******************************************************************************/
DDV_ObjRegMasterDDV(Pointer data,Boolean bEditor)1500 static Int2 DDV_ObjRegMasterDDV (Pointer data,Boolean bEditor)
1501 {
1502 OMProcControlPtr ompcp;
1503 SeqAlignPtr sap=NULL;
1504 OMUserDataPtr omudp;
1505 DdvMainPtr dmp;
1506
1507 /*retrieve data*/
1508 ompcp = (OMProcControlPtr) data;
1509
1510 if (ompcp == NULL || ompcp->proc == NULL) {
1511 ErrPostEx (SEV_ERROR, 0, 0, "Data NULL [1]");
1512 return OM_MSG_RET_ERROR;
1513 }
1514 /*only accept a SeqALign*/
1515 switch (ompcp->input_itemtype) {
1516 case OBJ_SEQALIGN :
1517 sap = (SeqAlignPtr) ompcp->input_data;
1518 break;
1519 default :
1520 return OM_MSG_RET_ERROR;
1521 }
1522 /*oups... nothing to deal with*/
1523 if (sap == NULL) {
1524 ErrPostEx (SEV_ERROR, 0, 0, "Data NULL [2]");
1525 return OM_MSG_RET_ERROR;
1526 }
1527
1528 dmp = (DdvMainPtr) GetAppProperty("ddvinterndata");
1529 if (!dmp) goto error;
1530 if (!DDV_StartPanel_Slave(dmp, sap, &ompcp->input_entityID,
1531 &ompcp->input_itemID, bEditor)) goto error;
1532
1533
1534 /*attach a Msg Func on the current seqalign*/
1535 dmp->userkey=OMGetNextUserKey();
1536 dmp->procid=ompcp->proc->procid;
1537 dmp->proctype=ompcp->proc->proctype;
1538 omudp = ObjMgrAddUserData (ompcp->input_entityID, ompcp->proc->procid,
1539 (bEditor==TRUE ? OMPROC_EDIT : OMPROC_VIEW),dmp->userkey);
1540 if (omudp == NULL)
1541 goto error;
1542 omudp->messagefunc = DDV_OM_MsgFunc;
1543 omudp->userdata.ptrvalue = (Pointer)dmp;
1544
1545 /*attach a Msg Func on each Bioseq of the current seqalign*/
1546 DDV_RegMsgFuncForBsp(dmp->MSA_d.pgp_l.TableHead,dmp,dmp->MSA_d.pgp_l.nBsp,
1547 ompcp->input_entityID, dmp->procid,dmp->proctype,dmp->userkey);
1548
1549 DDV_EnableGotoTBItems(dmp->hParent,TRUE);
1550 return(OM_MSG_RET_DONE);
1551
1552 error:
1553 /*show the logo window*/
1554 /*mWin_d->Show_logo=TRUE;*/
1555 Update ();
1556 ArrowCursor();
1557 return(OM_MSG_RET_ERROR);
1558 }
1559
1560 /*******************************************************************************
1561
1562 Function : DDV_ObjRegMasterEditDDV()
1563
1564 Purpose : call by ObjMgr to start DDV as a standalone editor
1565
1566 Parameters : see Toolkit
1567
1568 Return value : see Toolkit
1569
1570 *******************************************************************************/
DDV_ObjRegMasterEditDDV(Pointer data)1571 extern Int2 LIBCALLBACK DDV_ObjRegMasterEditDDV (Pointer data)
1572 {
1573 return(DDV_ObjRegMasterDDV(data,TRUE));
1574 }
1575
1576 /*******************************************************************************
1577
1578 Function : DDV_ObjRegMasterViewDDV()
1579
1580 Purpose : call by ObjMgr to start DDV as a standalone viewer
1581
1582 Parameters : see Toolkit
1583
1584 Return value : see Toolkit
1585
1586 *******************************************************************************/
DDV_ObjRegMasterViewDDV(Pointer data)1587 extern Int2 LIBCALLBACK DDV_ObjRegMasterViewDDV (Pointer data)
1588 {
1589 return(DDV_ObjRegMasterDDV(data,FALSE));
1590 }
1591
1592
1593 /*******************************************************************************
1594
1595 Function : DDV_ObjRegSlaveDDV()
1596
1597 Purpose : call by DDV_ObjRegSlaveEditDDV() & DDV_ObjRegSlaveViewDDV(), below
1598
1599 *******************************************************************************/
DDV_ObjRegSlaveDDV(Pointer data,Boolean bEditor)1600 static Int2 DDV_ObjRegSlaveDDV(Pointer data,Boolean bEditor)
1601 {
1602 OMProcControlPtr ompcp;
1603 SeqAlignPtr sap=NULL;
1604 WindoW hParent=NULL;
1605 DdvMainWinPtr mWin_d;
1606 OMUserDataPtr omudp = NULL;
1607 DdvMainPtr dmp;
1608 SAM_ViewGlobal *vgp;
1609
1610
1611 /*retrieve data*/
1612 ompcp = (OMProcControlPtr) data;
1613 if (ompcp == NULL || ompcp->proc == NULL) {
1614 ErrPostEx (SEV_ERROR, 0, 0, "Data NULL [1]");
1615 return OM_MSG_RET_ERROR;
1616 }
1617
1618 /*only accept a SeqALign*/
1619 switch (ompcp->input_itemtype) {
1620 case OBJ_SEQALIGN :
1621 sap = (SeqAlignPtr) ompcp->input_data;
1622 break;
1623 default :
1624 return OM_MSG_RET_ERROR;
1625 }
1626
1627 /*oups... nothing to deal with*/
1628 if (sap == NULL) {
1629 ErrPostEx (SEV_ERROR, 0, 0, "Data NULL [2]");
1630 return OM_MSG_RET_ERROR;
1631 }
1632
1633 /*start the slave module*/
1634 /* get parameters from launching program */
1635 vgp = GetAppProperty(SAM_ViewString);
1636 if(vgp == NULL) hParent=DDV_StartMainWin_Slave(NULL,bEditor);
1637 else hParent=DDV_StartMainWin_Slave(vgp,bEditor);
1638
1639 if (hParent){
1640 RealizeWindow(hParent);
1641 Show(hParent);
1642 mWin_d=(DdvMainWinPtr)GetObjectExtra(hParent);
1643 dmp = (DdvMainPtr) GetObjectExtra(mWin_d->hWndDDV);
1644 if(vgp != NULL) dmp->MasterViewer = vgp->MasterViewer;
1645
1646 if(dmp->MasterViewer == SAMVIEWCN3D) {
1647 mWin_d->UseNetwork = TRUE;
1648 mWin_d->NetStartProc = vgp->NetStartProc;
1649 }
1650
1651 if (!DDV_StartPanel_Slave(dmp, sap, &ompcp->input_entityID,
1652 &ompcp->input_itemID, bEditor))
1653 goto error;
1654
1655 /*when the user will close DDV, DDV won't delete any data excepts
1656 its internal data structure*/
1657 dmp->dod.choice=DDV_OPENTYPE_NOTRESP;
1658
1659 /*attach a Msg Func on the current seqalign*/
1660 dmp->userkey=OMGetNextUserKey();
1661 dmp->procid=ompcp->proc->procid;
1662 dmp->proctype=ompcp->proc->proctype;
1663 omudp = ObjMgrAddUserData (ompcp->input_entityID, ompcp->proc->procid,
1664 (bEditor==TRUE ? OMPROC_EDIT : OMPROC_VIEW),dmp->userkey);
1665 if (omudp == NULL)
1666 goto error;
1667 omudp->messagefunc = DDV_OM_MsgFunc;
1668 omudp->userdata.ptrvalue = (Pointer)dmp;
1669 /*attach a Msg Func on each Bioseq of the current seqalign*/
1670 DDV_RegMsgFuncForBsp(dmp->MSA_d.pgp_l.TableHead,dmp,dmp->MSA_d.pgp_l.nBsp,
1671 ompcp->input_entityID, dmp->procid,dmp->proctype,dmp->userkey);
1672 DDV_EnableGotoTBItems(hParent,TRUE);
1673 }
1674 else {
1675 goto error;
1676 }
1677
1678 return(OM_MSG_RET_DONE);
1679
1680 error:
1681 if (hParent) Remove(hParent);
1682 return(OM_MSG_RET_ERROR);
1683 }
1684
1685 /*******************************************************************************
1686
1687 Function : DDV_ObjRegSlaveEditDDV()
1688
1689 Purpose : call by ObjMgr to start DDV as a slave, editor mode on a SeqAlign
1690
1691 Parameters : see Toolkit
1692
1693 Return value : see Toolkit
1694
1695 *******************************************************************************/
DDV_ObjRegSlaveEditDDV(Pointer data)1696 extern Int2 LIBCALLBACK DDV_ObjRegSlaveEditDDV (Pointer data)
1697 {
1698 return(DDV_ObjRegSlaveDDV(data,TRUE));
1699 }
1700
1701 /*******************************************************************************
1702
1703 Function : DDV_ObjRegSlaveViewDDV()
1704
1705 Purpose : call by ObjMgr to start DDV as a slave, editor mode on a SeqAlign
1706
1707 Parameters : see Toolkit
1708
1709 Return value : see Toolkit
1710
1711 *******************************************************************************/
DDV_ObjRegSlaveViewDDV(Pointer data)1712 extern Int2 LIBCALLBACK DDV_ObjRegSlaveViewDDV (Pointer data)
1713 {
1714 return(DDV_ObjRegSlaveDDV(data,FALSE));
1715 }
1716
1717 /*******************************************************************************
1718
1719 Function : DDV_GetAndCheckSeqAlign()
1720
1721 Purpose : given a file OR a GI OR a SeqEntry , retrieve SeqAlign(s)
1722
1723 Parameters : fp; a handle of an open file
1724 gi; a GI numger
1725 sep2; a SeqEntry
1726 fetchSepProc; fetch procedure of the user (only if GI!=0)
1727
1728 Return value : a list of nodes. For each node, data.intvalue is an entityID
1729 of a SeqAlign
1730
1731 *******************************************************************************/
DDV_GetAndCheckSeqAlign(FILE * fp,Int4 gi,SeqEntryPtr sep2,UdvFetchSeqEntryProc fetchSepProc,DdvOpenDataPtr dodp,Uint2Ptr entityID)1732 extern ValNodePtr DDV_GetAndCheckSeqAlign(FILE *fp,Int4 gi,SeqEntryPtr sep2,
1733 UdvFetchSeqEntryProc fetchSepProc,DdvOpenDataPtr dodp,Uint2Ptr entityID)
1734 {
1735 SeqEntryPtr sep=NULL;
1736 ValNodePtr head = NULL,vnp_ali=NULL;
1737 Pointer dataptr=NULL;
1738 Uint2 datatype=0;
1739 Uint2 nRet=DVV_MSG_M_OK;
1740
1741 *entityID=0;
1742 if (fp!=NULL){/*open a file*/
1743 /*Read the file (it can contain several objects)*/
1744 while ((dataptr = ReadAsnFastaOrFlatFile (fp, &datatype, NULL, FALSE,
1745 FALSE, TRUE, FALSE)) != NULL) {
1746 ValNodeAddPointer (&head, datatype, dataptr);
1747 }
1748 /*scan the first node of the head list*/
1749 datatype = head->choice;
1750 dataptr = head->data.ptrvalue;
1751 *entityID=ObjMgrRegister(datatype,dataptr);
1752 AssignIDsInEntity (*entityID,0,NULL);
1753 switch(datatype){
1754 case OBJ_SEQENTRY:
1755 case OBJ_SEQALIGN:
1756 case OBJ_SEQANNOT:
1757 case OBJ_BIOSEQ:
1758 case OBJ_BIOSEQSET:
1759 DDV_GetSeqAlign(dataptr,datatype,&vnp_ali);
1760 break;
1761 default:
1762 break;
1763 }
1764 if (dodp){
1765 dodp->choice=DDV_OPENTYPE_FILE;
1766 dodp->vnp=head;
1767 }
1768 } else if (gi!=0){/*retrieve a Network Entry given a GI*/
1769 if (fetchSepProc) {/*fetch the SeqEntry*/
1770 sep=fetchSepProc(gi, 0);
1771 if (!sep) {
1772 nRet=DVV_MSG_O_E_READGI;
1773 goto error;
1774 }
1775 *entityID=ObjMgrGetEntityIDForPointer((Pointer)sep);
1776 AssignIDsInEntity (*entityID,0,NULL);
1777 SeqEntryExplore(sep,(Pointer)&vnp_ali,DDV_SearchAli);
1778 if (dodp){
1779 dodp->choice=DDV_OPENTYPE_GI;
1780 dodp->sep=sep;
1781 }
1782 } else {
1783 nRet=DVV_MSG_O_E_NOFETCHFUNC;
1784 goto error;
1785 }
1786 } else if (sep2!=NULL){/*analyse a SeqEntry*/
1787 *entityID=ObjMgrGetEntityIDForPointer((Pointer)sep2);
1788 AssignIDsInEntity (*entityID,0,NULL);
1789 SeqEntryExplore(sep2,(Pointer)&vnp_ali,DDV_SearchAli);
1790 if (dodp){
1791 dodp->choice=DDV_OPENTYPE_SEP;
1792 dodp->sep=sep2;
1793 }
1794 } else {
1795 nRet=DVV_MSG_O_E_NOTHINGTODO;
1796 goto error;
1797 }
1798
1799 /*register for ObjMgr*/
1800 if (!vnp_ali) {
1801 nRet=DVV_MSG_O_E_BADTYPE;
1802 goto error;
1803 }
1804
1805
1806 return(vnp_ali);
1807
1808 error:
1809 /*to add : Msg Handler with nRet*/
1810 return(NULL);
1811 }
1812
1813 /*******************************************************************************
1814
1815 Function : DDV_FOpenTextProc()
1816
1817 Purpose : manage File name edit control of the FileOpen dialog box
1818
1819 Parameters : t; edit control
1820
1821 Return value : none
1822
1823 *******************************************************************************/
DDV_FOpenTextProc(TexT t)1824 static void DDV_FOpenTextProc(TexT t)
1825 {
1826 Char szFName[PATH_MAX]={""};
1827 WindoW hOpenDlg;
1828 DlgFileOpenDataPtr dfodp;
1829
1830 hOpenDlg=(WindoW)ParentWindow(t);
1831
1832 if (!hOpenDlg) return;
1833
1834 dfodp = (DlgFileOpenDataPtr) GetObjectExtra (hOpenDlg);
1835
1836 if (dfodp==NULL) return;
1837
1838 GetTitle(t, szFName, sizeof(szFName)-1);
1839
1840 if (StringLen(szFName) == 0)
1841 Disable(dfodp->Ok);
1842 else Enable(dfodp->Ok);
1843
1844 return;
1845 }
1846
1847 /*******************************************************************************
1848
1849 Function : DDV_FOpenBrowseProc()
1850
1851 Purpose : manage browse button of the FileOpen dialog box
1852
1853 Parameters : g; button
1854
1855 Return value : none
1856
1857 *******************************************************************************/
DDV_FOpenBrowseProc(ButtoN g)1858 static void DDV_FOpenBrowseProc(ButtoN g)
1859 {
1860 DlgFileOpenDataPtr dfodp;
1861 WindoW hOpenDlg;
1862 Char path[PATH_MAX]={""};
1863
1864 hOpenDlg=(WindoW)ParentWindow(g);
1865
1866 if (!hOpenDlg) return;
1867
1868 dfodp = (DlgFileOpenDataPtr) GetObjectExtra (hOpenDlg);
1869
1870 if (dfodp==NULL) return;
1871 if (!dfodp->FNameEditCtrl) return;
1872
1873 if (GetInputFileName (path, sizeof(path), NULL, NULL)){
1874 SetTitle(dfodp->FNameEditCtrl, path);
1875 DDV_FOpenTextProc(dfodp->FNameEditCtrl);
1876 }
1877
1878 return;
1879 }
1880
1881 /*******************************************************************************
1882
1883 Function : DDV_FOpenCancelProc()
1884
1885 Purpose : manage cancel button of the FileOpen dialog box
1886
1887 Parameters : g; button
1888
1889 Return value : none
1890
1891 *******************************************************************************/
DDV_FOpenCancelProc(ButtoN g)1892 static void DDV_FOpenCancelProc(ButtoN g)
1893 {
1894 WindoW hOpenDlg;
1895 DlgFileOpenDataPtr dfodp;
1896 DdvMainWinPtr mWin_d;
1897
1898 hOpenDlg=(WindoW)ParentWindow(g);
1899
1900 if (!hOpenDlg) return;
1901 dfodp = (DlgFileOpenDataPtr) GetObjectExtra (hOpenDlg);
1902
1903 if (dfodp){
1904 mWin_d = (DdvMainWinPtr) GetObjectExtra (dfodp->parent);
1905 if (mWin_d) Enable(mWin_d->MainMenu.FileOpen);
1906 }
1907
1908 Remove(hOpenDlg);
1909 }
1910
1911 /*******************************************************************************
1912
1913 Function : DDV_FOpenAcceptProc()
1914
1915 Purpose : manage ok button of the FileOpen dialog box
1916
1917 Parameters : g; button
1918
1919 Return value : none
1920
1921 *******************************************************************************/
DDV_FOpenAcceptProc(ButtoN g)1922 static void DDV_FOpenAcceptProc(ButtoN g)
1923 {
1924 WindoW hOpenDlg;
1925 DlgFileOpenDataPtr dfodp;
1926 DdvMainPtr dmp;
1927 DdvMainWinPtr mWin_d;
1928 Char szFName[PATH_MAX]={""};
1929 Boolean isBinary;
1930 FILE *fp;
1931 ValNodePtr vnp_ali=NULL;
1932 Uint2 nRet=DVV_MSG_M_OK,The_entityID;
1933 Int2 procval;
1934
1935 hOpenDlg=(WindoW)ParentWindow(g);
1936
1937 if (!hOpenDlg) return;
1938 dfodp = (DlgFileOpenDataPtr) GetObjectExtra (hOpenDlg);
1939
1940 if (dfodp){
1941
1942 mWin_d = (DdvMainWinPtr) GetObjectExtra (dfodp->parent);
1943 if (mWin_d!=NULL){
1944 /*try to connect Entrez; if failure, still ok : the user can
1945 use DDV with a local file. Otherwise he/she will be in trouble ;-)*/
1946 if (mWin_d->AutonomeViewer && mWin_d->NetStartProc){
1947 mWin_d->NetStartProc(mWin_d->UseNetwork);
1948 }
1949
1950 Enable(mWin_d->MainMenu.FileOpen);
1951 /*file name*/
1952 GetTitle(dfodp->FNameEditCtrl, szFName, sizeof(szFName));
1953
1954 /*file reading mode*/
1955 if (GetValue(dfodp->ReadMode)==2) isBinary=TRUE;
1956 else isBinary=FALSE;
1957
1958 Remove(hOpenDlg);
1959
1960 /* open the i/o files in the correct mode */
1961 if ((fp = FileOpen (szFName, isBinary?"rb":"r")) == NULL){
1962 nRet=DVV_MSG_O_E_OPENFILEFAIL;
1963 goto error;
1964 }
1965 /*restrieve a list of registered seqalign(s)*/
1966 WatchCursor();
1967 /*delete old data, if needed*/
1968 dmp=(DdvMainPtr)GetObjectExtra(mWin_d->hWndDDV);
1969 DDV_CleanupDDVPdata_g(dmp);
1970 DDV_CloseData(mWin_d,FALSE);
1971
1972 vnp_ali=DDV_GetAndCheckSeqAlign(fp,0,NULL,mWin_d->fetchSepProc,&(dmp->dod),
1973 &The_entityID);
1974 ArrowCursor();
1975 if (vnp_ali && The_entityID!=0){
1976 Uint2 entityID;
1977 Uint4 itemID;
1978 SeqAlignPtr sap;
1979
1980 /*get the first SeqAlign in the list and load the viewer panel*/
1981 dmp->vnp_ali=vnp_ali;
1982
1983 if(mWin_d->Show_logo){
1984 mWin_d->Show_logo=FALSE;
1985 }
1986 sap=(SeqAlignPtr)vnp_ali->data.ptrvalue;
1987 entityID=sap->idx.entityID;
1988 itemID=sap->idx.itemID;
1989 SetAppProperty("ddvinterndata",(void *)dmp);
1990 procval=GatherProcLaunch ((dmp->bEditor==TRUE? OMPROC_EDIT : OMPROC_VIEW), FALSE,
1991 entityID, itemID, OBJ_SEQALIGN, 0, 0, OBJ_SEQALIGN, 0);
1992 if ((procval = OM_MSG_RET_ERROR))
1993 mWin_d->Show_logo=TRUE;
1994 RemoveAppProperty("ddvinterndata");
1995 }
1996 FileClose(fp);
1997 }
1998 }
1999
2000 error:
2001 return;
2002 }
2003
2004 /*******************************************************************************
2005
2006 Function : DDV_OpenFile()
2007
2008 Purpose : callback of the File|Open command
2009
2010 Parameters : i; command item
2011
2012 Return value : none
2013
2014 *******************************************************************************/
DDV_OpenFile(IteM i)2015 extern void DDV_OpenFile(IteM i)
2016 {
2017 DlgFileOpenDataPtr dfodp;
2018 DdvMainWinPtr mWin_d;
2019 WindoW hWinMain,hOpenDlg;
2020 GrouP g,g4;
2021 ButtoN b1;
2022 TexT t1;
2023
2024 hWinMain=(WindoW)ParentWindow(i);
2025
2026 if (!hWinMain) return;
2027
2028 mWin_d = (DdvMainWinPtr) GetObjectExtra (hWinMain);
2029
2030 if (mWin_d==NULL) return;
2031
2032 dfodp=(DlgFileOpenDataPtr)MemNew(sizeof(DlgFileOpenData));
2033 if (!dfodp) return;
2034 MemSet(dfodp,0,sizeof(DlgFileOpenData));
2035
2036 hOpenDlg = MovableModalWindow(-30, -20, -10, -10,
2037 "DDV - Open a local file", NULL);
2038 g = NormalGroup(hOpenDlg, 2, 1, "File name:", systemFont, NULL);
2039 SetGroupMargins(g, 10, 10);
2040 SetGroupSpacing(g, 10, 20);
2041 t1 = DialogText(g,"",25, DDV_FOpenTextProc);
2042 PushButton(g, " browse...", DDV_FOpenBrowseProc);
2043
2044 g = HiddenGroup(hOpenDlg, 3, 1, NULL);
2045 SetGroupMargins(g, 10, 10);
2046 SetGroupSpacing(g, 30, 30);
2047
2048 g4 = NormalGroup(g, 2, 1, "File type", systemFont, NULL);
2049 SetGroupMargins(g4, 10, 10);
2050 RadioButton(g4, "Ascii");
2051 RadioButton(g4, "Binary");
2052 SetValue(g4, 1);
2053
2054 b1 = DefaultButton(g, "OK", DDV_FOpenAcceptProc);
2055 PushButton(g, "Cancel", DDV_FOpenCancelProc);
2056
2057 Disable(b1);
2058
2059 dfodp->parent=hWinMain;
2060 dfodp->FNameEditCtrl=t1;
2061 dfodp->Ok=b1;
2062 dfodp->ReadMode=g4;
2063
2064 SetObjectExtra (hOpenDlg, (Pointer) dfodp, StdCleanupExtraProc);
2065
2066 Select(hOpenDlg);
2067 Show(hOpenDlg);
2068
2069 /*allow only one FOpen dlg at a time*/
2070 /*UDV_set_PullMenus(&vmp->MainMenu,FALSE);*/
2071 }
2072
2073 /*******************************************************************************
2074
2075 Function : DDV_NetOpen_cancelProc()
2076
2077 Purpose : manage ok button of the Network open dialog box
2078
2079 Parameters : g; button
2080
2081 Return value : none
2082
2083 *******************************************************************************/
DDV_NetOpen_cancelProc(ButtoN g)2084 static void DDV_NetOpen_cancelProc(ButtoN g)
2085 {
2086 WindoW hOpenDlg;
2087 DDVNetOpenPtr dnop;
2088
2089 hOpenDlg=(WindoW)ParentWindow(g);
2090
2091 if (!hOpenDlg) return;
2092
2093 dnop = (DDVNetOpenPtr) GetObjectExtra (hOpenDlg);
2094
2095 if (dnop==NULL) return;
2096
2097 Remove(hOpenDlg);
2098 }
2099
2100 /*******************************************************************************
2101
2102 Function : DDV_IsInt()
2103
2104 Purpose : test if an entry access code is a GI number, i.e. an Int
2105
2106 Parameters : t; edit control
2107
2108 Return value : none
2109
2110 *******************************************************************************/
DDV_IsInt(CharPtr szAccess)2111 static Boolean DDV_IsInt(CharPtr szAccess)
2112 {
2113 Int2 i=0;
2114
2115 while(szAccess[i]){
2116 if (!IS_DIGIT(szAccess[i])){
2117 Message (MSG_OK, "Not a GI number.");
2118 return(FALSE);
2119 }
2120 i++;
2121 }
2122 return(TRUE);
2123 }
2124
2125 /*******************************************************************************
2126
2127 Function : DDV_NetOpen_okProc()
2128
2129 Purpose : manage ok button of the Network open dialog box
2130
2131 Parameters : g; button
2132
2133 Return value : none
2134
2135 *******************************************************************************/
DDV_NetOpen_okProc(ButtoN g)2136 static void DDV_NetOpen_okProc(ButtoN g)
2137 {
2138 WindoW hOpenDlg;
2139 DDVNetOpenPtr dnop;
2140 Char szAccess[50]={""};
2141 Int2 AccessType,procval;
2142 Int4 uid=0;
2143 DdvMainWinPtr mWin_d;
2144 ValNodePtr vnp_ali;
2145 MonitorPtr mon;
2146 DdvMainPtr dmp;
2147 Uint2 The_entityID;
2148
2149 hOpenDlg=(WindoW)ParentWindow(g);
2150
2151 if (!hOpenDlg) return;
2152
2153 dnop = (DDVNetOpenPtr) GetObjectExtra (hOpenDlg);
2154
2155 if (dnop==NULL) return;
2156
2157 mWin_d = (DdvMainWinPtr) GetObjectExtra (dnop->hWndMain);
2158 if (mWin_d==NULL) return;
2159
2160 dmp=(DdvMainPtr)GetObjectExtra(mWin_d->hWndDDV);
2161
2162 Hide(hOpenDlg);
2163
2164 /*retrieve a Gi*/
2165 GetTitle(dnop->Entry, szAccess, sizeof(szAccess));
2166
2167 if (StringHasNoText (szAccess)) {
2168 Message (MSG_OK, "Please enter a GI number");
2169 Show (hOpenDlg);
2170 Select (hOpenDlg);
2171 Select (dnop->Entry);
2172 return;
2173 }
2174
2175 AccessType=GetValue(dnop->AccessType);
2176 if (!StrToLong(szAccess,&uid))
2177 uid=0;
2178 /*Connect ID1 with a valid UID*/
2179 if (uid==0){
2180 ArrowCursor();
2181 Message (MSG_OK, "Unable to find your record in the database.");
2182 Show (hOpenDlg);
2183 Select (hOpenDlg);
2184 Select (dnop->Entry);
2185 return;
2186 }
2187 else{
2188 /*delete old data, if needed*/
2189 DDV_CleanupDDVPdata_g(dmp);
2190 DDV_CloseData(mWin_d,FALSE);
2191
2192 WatchCursor();
2193
2194 mon = MonitorStrNewEx (szAppName, 30, FALSE);
2195 MonitorStrValue (mon, "Retrieving your record...");
2196 Update ();
2197
2198 vnp_ali=DDV_GetAndCheckSeqAlign(NULL,uid,NULL,mWin_d->fetchSepProc,
2199 &(dmp->dod),&The_entityID);
2200
2201 ArrowCursor();
2202
2203 MonitorFree (mon);
2204
2205 if (vnp_ali && The_entityID!=0){
2206 Uint2 entityID;
2207 Uint4 itemID;
2208 SeqAlignPtr sap;
2209
2210 /*get the first SeqAlign in the list and load the viewer panel*/
2211 dmp->vnp_ali=vnp_ali;
2212
2213 if(mWin_d->Show_logo){
2214 /*Hide(mWin_d->Logo_Panel);*/
2215 mWin_d->Show_logo=FALSE;
2216 }
2217 sap=(SeqAlignPtr)vnp_ali->data.ptrvalue;
2218 entityID=sap->idx.entityID;
2219 itemID=sap->idx.itemID;
2220 SetAppProperty("ddvinterndata",(void *)dmp);
2221 procval=GatherProcLaunch ((dmp->bEditor==TRUE? OMPROC_EDIT : OMPROC_VIEW), FALSE,
2222 entityID, itemID, OBJ_SEQALIGN, 0, 0, OBJ_SEQALIGN, 0);
2223 if ((procval = OM_MSG_RET_ERROR))
2224 mWin_d->Show_logo=TRUE;
2225 RemoveAppProperty("ddvinterndata");
2226 }
2227 }
2228
2229 Remove(hOpenDlg);
2230 }
2231
2232 /*******************************************************************************
2233
2234 Function : DDV_NetOpen_access()
2235
2236 Purpose : manage Accession edit control of the Download dialog box
2237
2238 Parameters : t; edit control
2239
2240 Return value : none
2241
2242 *******************************************************************************/
DDV_NetOpen_access(TexT t)2243 static void DDV_NetOpen_access(TexT t)
2244 {
2245 Char szAccess[50]={""};
2246 WindoW hOpenDlg;
2247 DDVNetOpenPtr dnop;
2248
2249 hOpenDlg=(WindoW)ParentWindow(t);
2250
2251 if (!hOpenDlg) return;
2252
2253 dnop = (DDVNetOpenPtr) GetObjectExtra (hOpenDlg);
2254
2255 if (dnop==NULL) return;
2256
2257 GetTitle(t, szAccess, sizeof(szAccess));
2258
2259 if (StringLen(szAccess) == 0)
2260 Disable(dnop->ok);
2261 else Enable(dnop->ok);
2262
2263 return;
2264 }
2265
2266 /*******************************************************************************
2267
2268 Function : DDV_OpenNetwork()
2269
2270 Purpose : callback of the File|Network command
2271
2272 Parameters : i; command item
2273
2274 Return value : none
2275
2276 *******************************************************************************/
DDV_OpenNetwork(IteM i)2277 extern void DDV_OpenNetwork(IteM i)
2278 {
2279 DdvMainWinPtr mWin_d;
2280 WindoW hWinMain,hOpenDlg;
2281 GrouP g,c;
2282 DDVNetOpenPtr dnopp;
2283
2284 hWinMain=(WindoW)ParentWindow(i);
2285
2286 if (!hWinMain) return;
2287
2288 mWin_d = (DdvMainWinPtr) GetObjectExtra (hWinMain);
2289
2290 if (mWin_d==NULL) return;
2291
2292 dnopp=(DDVNetOpenPtr)MemNew(sizeof(DDVNetOpen));
2293 if (!dnopp) return;
2294
2295 /*init the Network, if needed*/
2296 if (mWin_d->AutonomeViewer && mWin_d->NetStartProc){
2297 if (!mWin_d->NetStartProc(mWin_d->UseNetwork)) return;
2298 }
2299
2300 hOpenDlg = MovableModalWindow(-30, -20, -10, -10,
2301 "DDV - Fetch a network entry", NULL);
2302 SetGroupSpacing (hOpenDlg, 10, 10);
2303
2304 dnopp->hWndMain=hWinMain;
2305
2306 /*accesion*/
2307 g = NormalGroup (hOpenDlg, 3, 0, "Entry", systemFont,NULL);
2308
2309 #ifdef WIN_MAC
2310 dnopp->AccessType = PopupList (g, TRUE, NULL);
2311 #endif
2312
2313 #ifndef WIN_MAC
2314 dnopp->AccessType = PopupList (g, FALSE, NULL);
2315 #endif
2316
2317 PopupItem(dnopp->AccessType,"PopSet");
2318
2319 SetValue (dnopp->AccessType, 1);
2320
2321 dnopp->Entry = DialogText (g, "", 10, DDV_NetOpen_access);
2322
2323 c = HiddenGroup (hOpenDlg, 4, 0, NULL);
2324 SetGroupSpacing (c, 10, 2);
2325 dnopp->ok=DefaultButton (c, "Retrieve", DDV_NetOpen_okProc);
2326 Disable (dnopp->ok);
2327 PushButton (c, "Cancel", DDV_NetOpen_cancelProc);
2328
2329 SetObjectExtra (hOpenDlg, (Pointer) dnopp, StdCleanupExtraProc);
2330
2331 /*display*/
2332 AlignObjects (ALIGN_CENTER, (HANDLE) g, (HANDLE) c, NULL);
2333 RealizeWindow (hOpenDlg);
2334 Show (hOpenDlg);
2335 Select (hOpenDlg);
2336 Update ();
2337 }
2338
DDV_SlaveQuit(WindoW hWinMain)2339 NLM_EXTERN void DDV_SlaveQuit(WindoW hWinMain)
2340 {
2341 DdvMainWinPtr mWin_d;
2342 DdvMainPtr dmp;
2343 WindoW hDialog;
2344 GrouP g1, g2;
2345 Boolean QuitElseWhere = FALSE;
2346
2347 mWin_d = (DdvMainWinPtr) GetObjectExtra((Handle)hWinMain);
2348 if (mWin_d==NULL) return;
2349
2350 /* if there are unsaved edits, ask the user if they'd like to save */
2351 dmp = (DdvMainPtr)GetObjectExtra(mWin_d->hWndDDV);
2352 if (dmp->bEditor) {
2353 if (dmp->dsp->SomethingToSave) {
2354 QuitElseWhere = TRUE;
2355 hDialog = MovableModalWindow(-30, -20, -10, -10, "DDE - Save Query", NULL);
2356 g1 = HiddenGroup(hDialog, 1, 1, NULL);
2357 StaticPrompt(g1, "Save Changes?", 0, stdLineHeight, systemFont, 'c');
2358 g2 = HiddenGroup(hDialog, 3, 1, NULL);
2359 PushButton(g2, "Yes", DDV_Save);
2360 PushButton(g2, "No", DDV_NoSave);
2361 PushButton(g2, "Cancel", DDV_Cancel);
2362 SetObjectExtra (hDialog, (Pointer)hWinMain, NULL);
2363 Select(hDialog);
2364 Show(hDialog);
2365 }
2366 }
2367 if (!QuitElseWhere) {
2368 if (mWin_d->AutonomeViewer)
2369 QuitProgram(); /*standalone DDV*/
2370 else
2371 Remove(hWinMain);/*slave viewer : just kill the main window*/
2372 }
2373 }
2374
2375 /*******************************************************************************
2376
2377 Function : DDV_StartMainWin_Slave()
2378
2379 Purpose : start DDV main window as a slave module: init 'dmp' data structure,
2380 set 'DDV_MAIN_DATA' property, start a dlg (the parent window of DDV
2381 panel).
2382
2383 Parameters : vgp; sets defaults for non-autonomous viewers
2384
2385 Return value : handle to the DDV main window
2386
2387 *******************************************************************************/
DDV_StartMainWin_Slave(SAM_ViewGlobal * vgp,Boolean bEditor)2388 extern WindoW DDV_StartMainWin_Slave(SAM_ViewGlobal *vgp,Boolean bEditor)
2389 {
2390 Int2 Margins;
2391 DdvMainWinPtr mWin_d;
2392 WindoW w;
2393 Boolean bRet;
2394 Char AppName[40];
2395
2396 /* use "DDE" for editor, "DDV" for viewer, for title */
2397 if (bEditor) {StringCpy(AppName, szAppName2);}
2398 else {StringCpy(AppName, szAppName);}
2399
2400 /*init data blocks*/
2401 mWin_d=(DdvMainWinPtr)MemNew(sizeof(DdvMainWin));
2402 if (!mWin_d) return(NULL);
2403
2404 /*main window*/
2405 Margins=15*stdCharWidth;
2406 if(vgp == NULL)
2407 w=DocumentWindow(Margins,Margins ,-10, -10,
2408 AppName,
2409 DDV_SlaveQuit,
2410 DDV_WinMainResize);
2411 else
2412 w=DocumentWindow(vgp->Rect.left,vgp->Rect.top ,-10, -10,
2413 AppName,
2414 DDV_SlaveQuit,
2415 DDV_WinMainResize);
2416
2417 if (!w) return(NULL);
2418
2419 SetObjectExtra (w, (Pointer) mWin_d, (FreeProc)DDV_WinMainCleanup);
2420 mWin_d->hWndMain=w;
2421 /*this is a slave editor/viewer*/
2422 mWin_d->AutonomeViewer=FALSE;
2423
2424 /*build GUI*/
2425 bRet=DDV_CreateViewerPanel(w,mWin_d, vgp, bEditor);
2426
2427 if (!bRet) return(NULL);
2428
2429 mWin_d->Show_logo=FALSE;
2430
2431 return(w);
2432 }
2433
2434
DDV_DigitsOnly(Char * str)2435 static Boolean DDV_DigitsOnly(Char* str)
2436 {
2437 while(*str) {
2438 if (!isdigit(*str))
2439 return FALSE;
2440 str++;
2441 }
2442 return TRUE;
2443 }
2444
2445 /*******************************************************************************
2446
2447 Function : DDV_ImportEnableProc
2448
2449 Purpose : this function does the actual bioseq import. note that it doesn't
2450 require a vibrant dialog to operate, only that idp is filled out
2451
2452 Return value : none
2453
2454 *******************************************************************************/
2455
DDV_ImportEnableProc(TexT t)2456 static void DDV_ImportEnableProc(TexT t)
2457 {
2458 Char str[32];
2459 WindoW hImportDlg;
2460 DDV_ImportDialog *idp;
2461
2462 hImportDlg= (WindoW)ParentWindow(t);
2463 if(hImportDlg == NULL) return;
2464 idp = (DDV_ImportDialog *) GetObjectExtra(hImportDlg);
2465 if(idp == NULL) return;
2466
2467 GetTitle(idp->DDV_tAccession, str, sizeof(str));
2468 if (StringLen(str) == 0) {
2469 Disable(idp->DDV_bImportAccept);
2470 } else {
2471 Enable(idp->DDV_bImportAccept);
2472 if(DDV_DigitsOnly(str)) SetValue(idp->DDV_gAccType, 2);
2473 else SetValue(idp->DDV_gAccType, 1);
2474 }
2475 return;
2476 }
2477
ddv_truncate_overlaps(SeqAlignPtr sap)2478 static SeqAlignPtr ddv_truncate_overlaps (SeqAlignPtr sap)
2479 {
2480 AMAlignIndexPtr amaip;
2481 DenseDiagPtr ddp;
2482 DenseDiagPtr ddp_head;
2483 DenseDiagPtr ddp_prev;
2484 DenseSegPtr dsp1;
2485 DenseSegPtr dsp2;
2486 Int4 i;
2487 SeqAlignPtr salp;
2488 Int4 start1;
2489 Int4 start2;
2490 Int4 stop1;
2491 Int4 stop2;
2492 Int4 tmp;
2493
2494 if (sap == NULL) return(NULL);
2495 if (sap->saip == NULL) return(NULL);
2496 if (sap->saip->indextype != INDEX_PARENT) return(NULL);
2497
2498 amaip = (AMAlignIndexPtr)(sap->saip);
2499 for (i=0; i<amaip->numsaps-1; i++)
2500 {
2501 AlnMgrGetNthSeqRangeInSA(amaip->saps[i], 1, &start1, &stop1);
2502 AlnMgrGetNthSeqRangeInSA(amaip->saps[i+1], 1, &start2, &stop2);
2503 if (start2 <= stop1)
2504 {
2505 dsp1 = (DenseSegPtr)(amaip->saps[i]->segs);
2506 dsp2 = (DenseSegPtr)(amaip->saps[i+1]->segs);
2507 dsp1->lens[0] = dsp1->lens[0] - (stop1-start2)/2;
2508 tmp = dsp1->starts[0]+dsp1->lens[0];
2509 tmp = tmp - dsp2->starts[0];
2510 dsp2->starts[1] = tmp + dsp2->starts[1];
2511 dsp2->starts[0] = dsp1->starts[0]+dsp1->lens[0];
2512 dsp2->lens[0] = stop2 - dsp2->starts[0] + 1;
2513 SAIndexFree(amaip->saps[i]->saip);
2514 SAIndexFree(amaip->saps[i+1]->saip);
2515 amaip->saps[i]->saip = amaip->saps[i+1]->saip = NULL;
2516 AlnMgrIndexSingleChildSeqAlign(amaip->saps[i]);
2517 AlnMgrIndexSingleChildSeqAlign(amaip->saps[i+1]);
2518 }
2519 AlnMgrGetNthSeqRangeInSA(amaip->saps[i], 2, &start1, &stop1);
2520 AlnMgrGetNthSeqRangeInSA(amaip->saps[i+1], 2, &start2, &stop2);
2521 if (start2 <= stop1)
2522 {
2523 dsp1 = (DenseSegPtr)(amaip->saps[i]->segs);
2524 dsp2 = (DenseSegPtr)(amaip->saps[i+1]->segs);
2525 dsp1->lens[0] = dsp1->lens[0] - (stop1-start2)/2;
2526 tmp = dsp1->starts[1]+dsp1->lens[0];
2527 tmp = tmp - dsp2->starts[1];
2528 dsp2->starts[0] = tmp + dsp2->starts[0];
2529 dsp2->starts[1] = dsp1->starts[1]+dsp1->lens[0];
2530 dsp2->lens[0] = stop2 - dsp2->starts[1] + 1;
2531 SAIndexFree(amaip->saps[i]->saip);
2532 SAIndexFree(amaip->saps[i+1]->saip);
2533 amaip->saps[i]->saip = amaip->saps[i+1]->saip = NULL;
2534 AlnMgrIndexSingleChildSeqAlign(amaip->saps[i]);
2535 AlnMgrIndexSingleChildSeqAlign(amaip->saps[i+1]);
2536 }
2537 }
2538 ddp_head = ddp_prev = NULL;
2539 for (i=0; i<amaip->numsaps; i++)
2540 {
2541 ddp = DenseDiagNew();
2542 AlnMgrGetNthSeqRangeInSA(amaip->saps[i], 1, &start1, &stop1);
2543 AlnMgrGetNthSeqRangeInSA(amaip->saps[i], 2, &start2, &stop2);
2544 dsp1 = (DenseSegPtr)(amaip->saps[i]->segs);
2545 ddp->starts = (Int4Ptr)MemNew(2*sizeof(Int4));
2546 ddp->dim = 2;
2547 ddp->id = dsp1->ids;
2548 dsp1->ids = NULL;
2549 ddp->starts[0] = start1;
2550 ddp->starts[1] = start2;
2551 ddp->len = stop1 - start1 + 1;
2552 if (ddp_head != NULL)
2553 {
2554 ddp_prev->next = ddp;
2555 ddp_prev = ddp;
2556 } else
2557 ddp_head = ddp_prev = ddp;
2558 }
2559 salp = SeqAlignNew();
2560 salp->dim = 2;
2561 salp->segtype = SAS_DENDIAG;
2562 salp->type = SAT_DIAGS;
2563 salp->segs = (Pointer)(ddp_head);
2564 SeqAlignFree(sap);
2565 return salp;
2566 }
2567
DDV_ShredAln(SeqAlignPtr sap)2568 NLM_EXTERN SeqAlignPtr DDV_ShredAln(SeqAlignPtr sap)
2569 {
2570 AMAlignIndexPtr amaip;
2571 AlnMsgPtr amp1;
2572 AlnMsgPtr amp2;
2573 DenseDiagPtr ddp;
2574 DenseDiagPtr ddp_head;
2575 DenseDiagPtr ddp_prev;
2576 Int4 i;
2577 Boolean more1;
2578 Boolean more2;
2579 SeqAlignPtr salp;
2580
2581 if (sap == NULL || sap->saip == NULL || sap->saip->indextype != INDEX_PARENT)
2582 return NULL;
2583 amaip = (AMAlignIndexPtr)(sap->saip);
2584 if (amaip->numrows > 2)
2585 return NULL;
2586 amp1 = AlnMsgNew();
2587 amp2 = AlnMsgNew();
2588 ddp_head = ddp_prev = NULL;
2589 for (i=0; i<amaip->numsaps; i++)
2590 {
2591 amp1 = AlnMsgReNew(amp1);
2592 amp2 = AlnMsgReNew(amp2);
2593 amp1->from_m = amp2->from_m = 0;
2594 amp1->to_m = amp2->to_m = -1;
2595 amp1->row_num = 1;
2596 amp2->row_num = 2;
2597 while ((more1 = AlnMgrGetNextAlnBit(amaip->saps[i], amp1)) && (more2 = AlnMgrGetNextAlnBit(amaip->saps[i], amp2)))
2598 {
2599 if (amp1->gap == 0 && amp2->gap == 0)
2600 {
2601 ddp = DenseDiagNew();
2602 ddp->dim = 2;
2603 ddp->starts = (Int4Ptr)MemNew(2*sizeof(Int4));
2604 ddp->strands = (Uint1Ptr)MemNew(2*sizeof(Uint1));
2605 ddp->id = AlnMgrGetNthSeqIdPtr(sap, 1);
2606 ddp->id->next = AlnMgrGetNthSeqIdPtr(sap, 2);
2607 ddp->starts[0] = amp1->from_b;
2608 ddp->starts[1] = amp2->from_b;
2609 ddp->len = amp1->to_b - amp1->from_b + 1;
2610 ddp->strands[0] = AlnMgrGetNthStrand(sap, 1);
2611 ddp->strands[1] = AlnMgrGetNthStrand(sap, 2);
2612 if (ddp_head != NULL)
2613 {
2614 ddp_prev->next = ddp;
2615 ddp_prev = ddp;
2616 } else
2617 ddp_head = ddp_prev = ddp;
2618 }
2619 }
2620 }
2621 salp = SeqAlignNew();
2622 salp->type = SAT_DIAGS;
2623 salp->segtype = SAS_DENDIAG;
2624 salp->dim = 2;
2625 salp->segs = (Pointer)(ddp_head);
2626 SeqAlignFree(sap);
2627 AlnMsgFree(amp1);
2628 AlnMsgFree(amp2);
2629 return salp;
2630 }
2631
2632 /*******************************************************************************
2633
2634 Function : DDV_DoAlign
2635
2636 Purpose : this function does the actual bioseq import. note that it doesn't
2637 require a vibrant dialog to operate, only that idp is filled out
2638
2639 Return value : none
2640
2641 *******************************************************************************/
2642
DDV_DoAlign(DDV_ImportDialog * idp)2643 NLM_EXTERN void DDV_DoAlign(DDV_ImportDialog *idp)
2644 {
2645 Char str[32];
2646 Bioseq *bsp1 = NULL, *bsp2 = NULL;
2647 SeqId si;
2648 SeqAlign *sap, *salp;
2649 Int4 value, i;
2650 ValNode *pvn;
2651 ErrSev sev;
2652
2653 if(idp->mode & DDVIMP2SE) {
2654 value = GetValue(idp->DDV_lsip); /*one-base value*/
2655 for(pvn = idp->pvnSips, i = 1; i != value && pvn != NULL;
2656 i++, pvn = pvn->next) continue;
2657 if(pvn != NULL)
2658 bsp1 = BioseqLockById((SeqId *)pvn->data.ptrvalue);
2659 } else bsp1 = BioseqLockById(idp->sip);
2660 if (bsp1 == NULL) {
2661 Message (MSG_ERROR, "Unable to load sequence");
2662 goto out2;
2663 }
2664
2665 if(idp->mode & DDVIMPNET) {
2666 si.choice = SEQID_GI;
2667 GetTitle(idp->DDV_tAccession, str, sizeof(str));
2668 if(GetValue(idp->DDV_gAccType) == 1 && idp->AccessionCB)
2669 si.data.intvalue = idp->AccessionCB(str, ISA_aa(bsp1->mol));
2670 else si.data.intvalue = atoi(str);
2671 if (si.data.intvalue <= 0) {
2672 Message (MSG_ERROR, "Unable to understand accession");
2673 goto out2;
2674 }
2675 bsp2 = BioseqLockById(&si);
2676 } else bsp2 = BioseqLockById((SeqId *)idp->sipslave->data.ptrvalue);
2677 if(bsp2 == NULL) {
2678 Message (MSG_ERROR, "Unable to load sequence");
2679 BioseqUnlock(bsp1);
2680 goto out2;
2681 }
2682 idp->bsp = bsp2;
2683
2684 if(ISA_aa(bsp1->mol) != ISA_aa(bsp2->mol) ||
2685 ISA_na(bsp1->mol) != ISA_na(bsp1->mol)) {
2686 Message (MSG_ERROR, "Sequences to be aligned not of same type");
2687 BioseqUnlock(bsp1);
2688 BioseqUnlock(bsp2);
2689 goto out2;
2690 }
2691
2692 sev = ErrSetMessageLevel(SEV_FATAL);
2693
2694 /* sap = ACT_GlobalAlignSimple(bsp1, bsp2, TRUE); */
2695 if(ISA_aa(bsp1->mol))
2696 sap = DDV_Blast2Seqs(bsp1, bsp2, idp->Gap, "blastp");
2697 else
2698 sap = DDV_Blast2Seqs(bsp1, bsp2, idp->Gap, "blastn");
2699
2700 ErrSetMessageLevel(sev);
2701 BioseqUnlock(bsp1);
2702 BioseqUnlock(bsp2);
2703
2704 if(sap == NULL) {
2705 Message (MSG_OK, "Not able to align the sequence");
2706 goto out2;
2707 }
2708
2709 SAM_ReplaceGI(sap);
2710 AlnMgrIndexSeqAlign(sap);
2711
2712 if(idp->Gap) {
2713 AlnMgrMakeMultipleByScore(sap);
2714 AlnMgrDeleteHidden(sap, FALSE);
2715 salp = DDV_ShredAln(sap);
2716 } else {
2717 AlnMgrMakeMultipleByScoreEx(sap, 10);
2718 AlnMgrDeleteHidden(sap, FALSE);
2719 salp = ddv_truncate_overlaps(sap);
2720 }
2721
2722 if(idp->callback) idp->callback(idp, idp->sap, salp);
2723 /*SeqAlignFree(sap);*/
2724
2725 out2:
2726 MemFree(idp->userdata);
2727 ValNodeFree(idp->pvnSips); /* don't free the data */
2728 ValNodeFree(idp->sipslave);
2729 }
2730
2731 /*******************************************************************************
2732
2733 Function : DDV_ImportAcceptProc
2734
2735 Purpose : fired by clicking OK in the bioseq import dialog
2736
2737 Return value : none
2738
2739 *******************************************************************************/
2740
DDV_ImportAcceptProc(ButtoN b)2741 static void DDV_ImportAcceptProc(ButtoN b)
2742 {
2743 WindoW hImportDlg;
2744 DDV_ImportDialog *idp;
2745
2746 hImportDlg= (WindoW)ParentWindow(b);
2747 if(hImportDlg == NULL) goto out;
2748 idp = (DDV_ImportDialog *) GetObjectExtra(hImportDlg);
2749 if(idp == NULL) goto out;
2750
2751 WatchCursor();
2752 DDV_DoAlign(idp);
2753 ArrowCursor();
2754
2755 out:
2756 Remove(hImportDlg);
2757 return;
2758 }
2759
2760 /*******************************************************************************
2761
2762 Function : DDV_ImportCB
2763
2764 Purpose : callback for import bioseq dialog. used to clean up after the
2765 import
2766
2767 Return value : none
2768
2769 *******************************************************************************/
2770
DDV_ImportCB(DDV_ImportDialog * idp,SeqAlign * salpdest,SeqAlign * salp)2771 NLM_EXTERN void DDV_ImportCB(DDV_ImportDialog *idp, SeqAlign *salpdest,
2772 SeqAlign *salp)
2773 {
2774 if (salpdest == NULL || salp == NULL) return;
2775 SeqAlignSetFree(salp->next);
2776 salp->next = NULL;
2777 ViewMgr_Add(salpdest, salp);
2778 }
2779
2780 /*******************************************************************************
2781
2782 Function : DDV_ImportCancelProc
2783
2784 Purpose : cancel function for the import bioseq dialog
2785
2786 Return value : none
2787
2788 *******************************************************************************/
2789
DDV_ImportCancelProc(ButtoN b)2790 static void DDV_ImportCancelProc(ButtoN b)
2791 {
2792 WindoW hImportDlg;
2793 DDV_ImportDialog *idp;
2794
2795 hImportDlg= (WindoW)ParentWindow(b);
2796 if(hImportDlg == NULL) return;
2797 idp = (DDV_ImportDialog *) GetObjectExtra(hImportDlg);
2798 if(idp == NULL) return;
2799 MemFree(idp->userdata);
2800
2801 Remove(idp->DDV_wImport);
2802 return;
2803 }
2804
2805 /*******************************************************************************
2806
2807 Function : DDV_ImportBioseqDlg
2808
2809 Purpose : dialog to import a bioseq into a seqalign. Note that it has
2810 several modes listed in ddvopen.h
2811
2812 Return value : none
2813
2814 *******************************************************************************/
2815
DDV_ImportBioseqDlg(DDV_ImportDialog * idp)2816 NLM_EXTERN void DDV_ImportBioseqDlg(DDV_ImportDialog *idp)
2817 {
2818 GrouP g, hg;
2819 ButtoN b;
2820 DDVUpdateMSG *dump;
2821 ValNode *pvn;
2822 Char szName[21]={""};
2823
2824 if(idp == NULL) return;
2825
2826 /* check if we have the right data for each mode */
2827 if(idp->mode == DDVIMPSE2SA
2828 && (idp->sip == NULL || idp->sap == NULL || idp->sipslave == NULL)) return;
2829 else if (idp->mode == DDVIMPSE2SE
2830 && (idp->pvnSips == NULL || idp->sipslave == NULL)) return;
2831 else if (idp->mode == DDVIMPNET2SA
2832 && (idp->sap == NULL || idp->sip == NULL)) return;
2833 else if (idp->mode == DDVIMPNET2SE
2834 && idp->pvnSips == NULL) return;
2835
2836 idp->DDV_wImport = NULL;
2837 idp->DDV_gAccType = NULL;
2838 idp->DDV_bImportAccept = NULL;
2839 idp->DDV_tAccession = NULL;
2840 dump = MemNew(sizeof(DDVUpdateMSG));
2841 if(dump == NULL) {
2842 MemFree(idp);
2843 return;
2844 }
2845 idp->userdata = dump;
2846 dump->data = NULL;
2847 dump->type=UPDATE_TYPE_EDIT_DELBSP;
2848
2849 idp->DDV_wImport = MovableModalWindow(-30, -20, -10, -10,
2850 "Import sequence using BLAST", NULL);
2851 Nlm_SetObjectExtra (idp->DDV_wImport, (Nlm_VoidPtr)idp, StdCleanupExtraProc);
2852
2853 if(idp->mode & DDVIMP2SE) {
2854 hg = HiddenGroup(idp->DDV_wImport, 1, 4, NULL);
2855 g = NormalGroup(hg, 1, 2, "Choose sequence to align to:", systemFont, NULL);
2856 idp->DDV_lsip = SingleList(g,10,6,NULL);
2857
2858 for(pvn = idp->pvnSips; pvn != NULL; pvn = pvn->next) {
2859 SeqIdWrite((SeqId *)pvn->data.ptrvalue,szName,
2860 PRINTID_TEXTID_ACCESSION, 10);
2861 ListItem(idp->DDV_lsip, szName);
2862 }
2863 SetValue(idp->DDV_lsip, 1);
2864 } else hg = HiddenGroup(idp->DDV_wImport, 1, 3, NULL);
2865
2866 if(idp->mode & DDVIMPNET) {
2867 g = NormalGroup(hg, 1, 2, " Enter sequence identifier:", systemFont, NULL);
2868 idp->DDV_tAccession = DialogText(g, "", 10, (TxtActnProc) DDV_ImportEnableProc);
2869 idp->DDV_gAccType =
2870 NormalGroup(hg, 1, 2, " accession type", systemFont, NULL);
2871 RadioButton(idp->DDV_gAccType, "Accession");
2872 RadioButton(idp->DDV_gAccType, "gi");
2873 }
2874
2875 g = HiddenGroup(hg, 2, 1, NULL);
2876 SetGroupSpacing(g, 15, 15);
2877 idp->DDV_bImportAccept =
2878 DefaultButton(g, "OK", (BtnActnProc) DDV_ImportAcceptProc);
2879 b = PushButton(g, "Cancel", (BtnActnProc) DDV_ImportCancelProc);
2880
2881 if(idp->mode & DDVIMPNET) {
2882 SetValue(idp->DDV_gAccType, 1);
2883 Disable(idp->DDV_bImportAccept);
2884 Select(idp->DDV_tAccession);
2885 }
2886 Show(idp->DDV_wImport);
2887 return;
2888 }
2889
2890 /*******************************************************************************
2891
2892 Function : DDV_ImportBioseq
2893
2894 Purpose : sets up dialog to import a bioseq into a seqalign
2895
2896 Return value : none
2897
2898 *******************************************************************************/
2899
DDV_ImportBioseq(IteM i)2900 NLM_EXTERN void DDV_ImportBioseq(IteM i)
2901 {
2902 DDV_ImportDialog *idp;
2903 DdvMainPtr dmp; /*DDV panel data*/
2904 DdvMainWinPtr mWin_d;
2905 WindoW hWinMain;
2906
2907 idp = MemNew(sizeof(DDV_ImportDialog));
2908 if(idp == NULL) return;
2909
2910 hWinMain=(WindoW)ParentWindow(i);
2911 if (hWinMain==NULL) return;
2912 mWin_d = (DdvMainWinPtr) GetObjectExtra (hWinMain);
2913 if (mWin_d==NULL) return;
2914
2915 if (mWin_d->NetStartProc) mWin_d->NetStartProc(mWin_d->UseNetwork);
2916
2917 if (mWin_d->hWndDDV==NULL) return;
2918 dmp = (DdvMainPtr) GetObjectExtra(mWin_d->hWndDDV);
2919 if (dmp==NULL) return;
2920
2921 if(dmp->MSA_d.pgp_l.sap == NULL) return;
2922
2923 idp->sap = dmp->MSA_d.pgp_l.sap;
2924 idp->sip = AlnMgrFindMaster(idp->sap);
2925 if(idp->sip == NULL) {
2926 Message (MSG_ERROR, "Alignment must have master sequence");
2927 MemFree(idp);
2928 return;
2929 }
2930
2931 idp->callback = DDV_ImportCB;
2932 idp->mode = DDVIMPNET2SA;
2933
2934 DDV_ImportBioseqDlg(idp);
2935 }
2936
2937
DDV_Blast2Seqs(Bioseq * bsp1,Bioseq * bsp2,Boolean gapped,Char * progname)2938 NLM_EXTERN SeqAlign *DDV_Blast2Seqs(Bioseq *bsp1, Bioseq *bsp2, Boolean gapped,
2939 Char *progname)
2940 {
2941 BLAST_OptionsBlkPtr options;
2942 SeqAlign *salp;
2943
2944 if(bsp1 == NULL || bsp2 == NULL || progname == NULL) return NULL;
2945 options = BLASTOptionNew(progname, gapped);
2946 if(options == NULL) return NULL;
2947 /* options->discontinuous = FALSE; */
2948 salp = BlastTwoSequences(bsp1, bsp2, progname, options);
2949 BLASTOptionDelete(options);
2950 return salp;
2951 }
2952
2953
2954 /*******************************************************************************
2955
2956 Function : DDV_ImportSeqAlign(), DDV_ImportNucSeqAlign() and DDV_ImportProtSeqAlign()
2957
2958 Purpose : import a sequence alignment of text type
2959
2960 Return value : none
2961
2962 *******************************************************************************/
DDV_ImportSeqAlign(Boolean is_prot,IteM i)2963 static void DDV_ImportSeqAlign(Boolean is_prot,IteM i)
2964 {
2965 WindoW hWinMain;
2966 DdvMainPtr dmp;
2967 DdvMainWinPtr mWin_d;
2968 SeqEntryPtr sep;
2969 ValNodePtr vnp_ali;
2970 SeqAlignPtr sap;
2971 Uint2 The_entityID,entityID;
2972 Uint4 itemID;
2973 Int2 procval;
2974
2975 hWinMain=(WindoW)ParentWindow(i);
2976
2977 mWin_d = (DdvMainWinPtr) GetObjectExtra (hWinMain);
2978
2979 sep=ReadAnyAlignment(is_prot,NULL);
2980
2981 if (sep!=NULL && mWin_d!=NULL){
2982 /*try to connect Entrez; if failure, still ok : the user can
2983 use DDV with a local file. Otherwise he/she will be in trouble ;-)*/
2984 if (mWin_d->AutonomeViewer && mWin_d->NetStartProc){
2985 mWin_d->NetStartProc(mWin_d->UseNetwork);
2986 }
2987 /*delete old data, if needed*/
2988 dmp=(DdvMainPtr)GetObjectExtra(mWin_d->hWndDDV);
2989 DDV_CleanupDDVPdata_g(dmp);
2990 DDV_CloseData(mWin_d,FALSE);
2991
2992 vnp_ali=DDV_GetAndCheckSeqAlign(NULL,0,sep,mWin_d->fetchSepProc,&(dmp->dod),
2993 &The_entityID);
2994 if (vnp_ali && The_entityID!=0){
2995
2996 /*get the first SeqAlign in the list and load the viewer panel*/
2997 dmp->vnp_ali=vnp_ali;
2998
2999 if(mWin_d->Show_logo){
3000 mWin_d->Show_logo=FALSE;
3001 }
3002 sap=(SeqAlignPtr)vnp_ali->data.ptrvalue;
3003 entityID=sap->idx.entityID;
3004 itemID=sap->idx.itemID;
3005 SetAppProperty("ddvinterndata",(void *)dmp);
3006 procval=GatherProcLaunch ((dmp->bEditor==TRUE? OMPROC_EDIT : OMPROC_VIEW), FALSE, entityID, itemID,
3007 OBJ_SEQALIGN, 0, 0, OBJ_SEQALIGN, 0);
3008 if ((procval = OM_MSG_RET_ERROR))
3009 mWin_d->Show_logo=TRUE;
3010 RemoveAppProperty("ddvinterndata");
3011 }
3012 }
3013 else{
3014 ErrPostEx (SEV_ERROR, 0, 0, "We do not support this format yet");
3015 }
3016 }
3017
DDV_ImportNucSeqAlign(IteM i)3018 extern void DDV_ImportNucSeqAlign(IteM i)
3019 {
3020 DDV_ImportSeqAlign(FALSE,i);
3021 }
3022
DDV_ImportProtSeqAlign(IteM i)3023 extern void DDV_ImportProtSeqAlign(IteM i)
3024 {
3025 DDV_ImportSeqAlign(TRUE,i);
3026 }
3027
DDV_GetLastRow(DDV_HideDialog * hdp)3028 static Int4 DDV_GetLastRow(DDV_HideDialog *hdp)
3029 {
3030 int i, max=0;
3031
3032 for (i = 1; i <= hdp->numrows; i++) {
3033 if (ViewMgr_TRow2VRow(hdp->salp, i) > 0) {
3034 max = i;
3035 }
3036 }
3037 return(max);
3038 }
3039
DDV_SetHideList(DDV_HideDialog * hdp)3040 static void DDV_SetHideList(DDV_HideDialog *hdp)
3041 {
3042 int i;
3043
3044 for(i = 1; i <= hdp->numrows; i++) {
3045 if(ViewMgr_TRow2VRow(hdp->salp, i) > 0)
3046 SetItemStatus(hdp->DDV_lsip, i, TRUE);
3047 else SetItemStatus(hdp->DDV_lsip, i, FALSE);
3048 }
3049 SetItemStatus(hdp->DDV_lsip, hdp->amaip->master, TRUE);
3050 }
3051
DDV_HideList(Nlm_LisT l)3052 static void DDV_HideList(Nlm_LisT l)
3053 /*******************************************************************************
3054 * this function is called each time an item from the list is clicked.
3055 * it sets the status for each row, making sure not to allow the
3056 * master to be hidden, nor the number of rows to be less than 2.
3057 *******************************************************************************/
3058 {
3059 WindoW hHideDlg;
3060 DDV_HideDialog *hdp;
3061 Int4 i, LastRow, count = 0;
3062
3063 hHideDlg = (WindoW)ParentWindow(l);
3064 if(hHideDlg == NULL) return;
3065 hdp = (DDV_HideDialog *) GetObjectExtra(hHideDlg);
3066 if(hdp == NULL) return;
3067
3068 /* get row count, and last displayed row */
3069 for(i = 1; i <= hdp->numrows; i++) {
3070 if (GetItemStatus(hdp->DDV_lsip, i)) {
3071 count++;
3072 LastRow = i;
3073 }
3074 }
3075
3076 /* don't let number of rows fall below 2 */
3077 if (count < 2) {
3078 if (hdp->LastValidRow == -1) {
3079 SetItemStatus(hdp->DDV_lsip, DDV_GetLastRow(hdp), TRUE);
3080 }
3081 else {
3082 SetItemStatus(hdp->DDV_lsip, hdp->LastValidRow, TRUE);
3083 }
3084 }
3085 else {
3086 /* each time a row is clicked, update the last saved row */
3087 hdp->LastValidRow = LastRow;
3088 }
3089
3090 /* don't let master be hidden */
3091 if (!GetItemStatus(hdp->DDV_lsip, 1)) {
3092 SetItemStatus(hdp->DDV_lsip, 1, TRUE);
3093 }
3094 }
3095
3096
DDV_HideAcceptProc(ButtoN b)3097 static void DDV_HideAcceptProc(ButtoN b)
3098 {
3099 WindoW hHideDlg;
3100 DDV_HideDialog *hdp;
3101 Int4 i;
3102 Boolean status;
3103
3104 hHideDlg = (WindoW)ParentWindow(b);
3105 if(hHideDlg == NULL) return;
3106 hdp = (DDV_HideDialog *) GetObjectExtra(hHideDlg);
3107 if(hdp == NULL) return;
3108
3109 for(i = 1; i <= hdp->numrows; i++) {
3110 status = GetItemStatus(hdp->DDV_lsip, i);
3111 ViewMgr_SetHidden(hdp->salp, !status, i);
3112 }
3113 ViewMgr_Update(hdp->salp);
3114 DDV_SetHideList(hdp);
3115
3116 MemFree(hdp->userdata);
3117 Remove(hdp->DDV_wHide);
3118 }
3119
3120
3121 /*******************************************************************************
3122
3123 Function : DDV_HideDlg
3124
3125 Purpose : dialog to import a bioseq into a seqalign. Note that it has
3126 several modes listed in ddvopen.h
3127
3128 Return value : none
3129
3130 *******************************************************************************/
3131
DDV_HideDlg(DDV_HideDialog * hdp)3132 NLM_EXTERN void DDV_HideDlg(DDV_HideDialog *hdp)
3133 {
3134 GrouP g, hg;
3135 ButtoN b;
3136 DDVUpdateMSG *dump;
3137 Char szName[181], szName2[161];
3138 Int4 i;
3139 SeqId *sip;
3140 Bioseq *bsp;
3141
3142 if(hdp == NULL) return;
3143 hdp->DDV_wHide = NULL;
3144
3145 hdp->target = ViewMgr_GetBeginIndexed(hdp->salp);
3146
3147 if(hdp->target == NULL) return;
3148 if( AlnMgrCheckAlignForParent(hdp->target) != AM_PARENT) return;
3149 hdp->amaip = (AMAlignIndexPtr)(hdp->target->saip);
3150 if (!hdp->amaip) return;
3151
3152 dump = MemNew(sizeof(DDVUpdateMSG));
3153 if(dump == NULL) {
3154 MemFree(hdp);
3155 return;
3156 }
3157 hdp->userdata = dump;
3158 dump->data = NULL;
3159 dump->type=UPDATE_TYPE_EDIT_DELBSP;
3160
3161 hdp->DDV_wHide = MovableModalWindow(-30, -20, -10, -10,
3162 "Hide/Show Sequences", NULL);
3163 /* need to do something more than std cleanup. also for blast dialog */
3164 Nlm_SetObjectExtra (hdp->DDV_wHide, (void *)hdp, StdCleanupExtraProc);
3165
3166 hg = HiddenGroup(hdp->DDV_wHide, 1, 2, NULL);
3167 g = NormalGroup(hg, 1, 2, "Choose sequences to show:", systemFont, NULL);
3168 hdp->DDV_lsip = MultiList(g,40, 6, DDV_HideList);
3169
3170 hdp->numrows = AlnMgrGetNumRows(hdp->target);
3171
3172 for(i = 1; i <= hdp->numrows; i++) {
3173 sip = AlnMgrGetNthSeqIdPtr(hdp->target, i);
3174 if(sip == NULL) continue;
3175 bsp=BioseqLockById(sip);
3176 if(bsp == NULL) continue;
3177 sip = SeqIdFindBestAccession(bsp->id);
3178 SeqIdWrite(sip, szName, PRINTID_TEXTID_ACCESSION, 10);
3179 CreateDefLine(NULL,bsp,szName2,157,0,NULL,NULL);
3180 BioseqUnlock(bsp);
3181 StrNCat(szName, " - ", 180);
3182 StrNCat(szName, szName2, 180);
3183 ListItem(hdp->DDV_lsip, szName);
3184 }
3185 DDV_SetHideList(hdp);
3186
3187 g = HiddenGroup(hg, 2, 1, NULL);
3188 SetGroupSpacing(g, 15, 15);
3189 b = DefaultButton(g, "OK", (BtnActnProc) DDV_HideAcceptProc);
3190
3191 Show(hdp->DDV_wHide);
3192
3193 /* set scroll to upper left */
3194 SetOffset(hdp->DDV_lsip, 0, 0);
3195
3196 return;
3197 }
3198
DDV_HideDlgItem(IteM i)3199 NLM_EXTERN void DDV_HideDlgItem(IteM i)
3200 {
3201 DDV_HideDialog *hdp;
3202 DdvMainPtr dmp; /*DDV panel data*/
3203 DdvMainWinPtr mWin_d;
3204 WindoW hWinMain;
3205
3206 hdp = MemNew(sizeof(DDV_HideDialog));
3207 if(hdp == NULL) return;
3208
3209 /* init LastValidRow to something illegal */
3210 hdp->LastValidRow = -1;
3211
3212 hWinMain=(WindoW)ParentWindow(i);
3213 if (hWinMain==NULL) return;
3214 mWin_d = (DdvMainWinPtr) GetObjectExtra (hWinMain);
3215 if (mWin_d==NULL) return;
3216
3217 if (mWin_d->hWndDDV==NULL) return;
3218 dmp = (DdvMainPtr) GetObjectExtra(mWin_d->hWndDDV);
3219 if (dmp==NULL) return;
3220
3221 if(dmp->MSA_d.pgp_l.sap == NULL) return;
3222
3223 hdp->salp = dmp->MSA_d.pgp_l.sap;
3224
3225 DDV_HideDlg(hdp);
3226 }
3227
3228
3229 /*******************************************************************************
3230
3231 Function : DDV_GetCharBufferForEditor()
3232
3233 Purpose : get a char buffer from a row of a SeqAlign, given display coords
3234
3235 Return value : an allocated char buffer ready for use by the editor. Null if
3236 failure
3237
3238 *******************************************************************************/
DDV_GetCharBufferForEditor(ParaGPtr pgp,CharPtr szEditSeq)3239 NLM_EXTERN void DDV_GetCharBufferForEditor(ParaGPtr pgp,CharPtr szEditSeq)
3240 {
3241 BioseqPtr bsp;
3242 Int4 bspLength;
3243 Boolean IsAA;
3244
3245 /*get sequence size and type*/
3246 bsp=BioseqLockById(pgp->sip);
3247 if (!bsp) return;
3248 bspLength=BioseqGetLen(bsp);
3249 IsAA=ISA_aa(bsp->mol);
3250 BioseqUnlock(bsp);
3251
3252 /*get the sequence*/
3253 DDV_GetSequenceFromParaG(pgp,&szEditSeq,bspLength,IsAA,NULL,NULL,NULL);
3254
3255 }
3256
3257 /*******************************************************************************
3258
3259 Function : DDV_GetMtdpListForEditor()
3260
3261 Purpose : get the descriptor for a row of a SeqAlign, given display coords
3262
3263 Note : in plain english, this function creates the pTxtList ValNode for
3264 a ParaG designed to be used in the editor.
3265
3266 Return value : a valnode ready for use by the editor. Null if
3267 failure.
3268
3269 *******************************************************************************/
DDV_GetMtdpListForEditor(ValNodePtr row,Int4 from_disp,Int4 to_disp)3270 NLM_EXTERN ValNodePtr DDV_GetMtdpListForEditor(ValNodePtr row,Int4 from_disp,
3271 Int4 to_disp)
3272 {
3273 MsaTxtDispPtr mtdp,new_mtdp,prev_mtdp;
3274 ValNodePtr vnp,vnp2,vnp3,vnpTxt;
3275 ParaGPtr pgp;
3276 Int4 cumulMtdp,beginCopy,endCopy,mtdp_size,mtdp_from_disp,
3277 mtdp_to_disp,mtdp_from,mtdp_to;
3278 Boolean bPop;
3279
3280
3281
3282 prev_mtdp=NULL;
3283 vnpTxt=NULL;
3284 for (vnp=row;vnp!=NULL;vnp=vnp->next){
3285 pgp=(ParaGPtr)vnp->data.ptrvalue;
3286 /*not yet in the first ParaG ?*/
3287 if (pgp->StopLetter<from_disp) {
3288 continue;
3289 }
3290 /*get the mtdp nodes*/
3291 cumulMtdp=0;
3292 for(vnp2=pgp->ptxtList;vnp2!=NULL;vnp2=vnp2->next){
3293 mtdp=(MsaTxtDispPtr)vnp2->data.ptrvalue;
3294 mtdp_size=mtdp->to-mtdp->from+1;
3295 /*convert mtdp coordinates (can Bioseq coord, gap coord, etc.)
3296 to display coordinates*/
3297 mtdp_from_disp=pgp->StartLetter+cumulMtdp;
3298 mtdp_to_disp=mtdp_from_disp+mtdp_size-1;
3299 if (mtdp_to_disp<from_disp) {
3300 cumulMtdp+=mtdp_size;
3301 continue;
3302 }
3303 beginCopy=_max_(from_disp,mtdp_from_disp);
3304 endCopy=_min_(mtdp_to_disp,to_disp);
3305
3306 /*convert display coordinates back to mtdp coordinates*/
3307 mtdp_from=mtdp->from+(beginCopy-mtdp_from_disp);
3308 mtdp_to=mtdp->from+(endCopy-mtdp_from_disp);
3309
3310 /*in order to merge nodes of same type, i keep track of
3311 the previous populated mtdp node. Same style==yes, then
3312 just extend to the right the previous node*/
3313 if (prev_mtdp){
3314 if (prev_mtdp->TextStyle==mtdp->TextStyle){
3315 prev_mtdp->to=mtdp_to;
3316 bPop=TRUE;
3317 }
3318 else{
3319 bPop=FALSE;
3320 }
3321 }
3322 else{
3323 bPop=FALSE;
3324 }
3325 if (!bPop){
3326 new_mtdp=(MsaTxtDispPtr)MemNew(sizeof(MsaTxtDisp));
3327 if (!new_mtdp) goto erreur;
3328 MemCopy(new_mtdp,mtdp,sizeof(MsaTxtDisp));
3329 new_mtdp->from=mtdp_from;
3330 new_mtdp->to=mtdp_to;
3331 if (!vnpTxt){
3332 vnp3=ValNodeAddPointer(&vnpTxt,0,(Pointer)new_mtdp);
3333 }
3334 else{
3335 vnp3=ValNodeAddPointer(&vnp3,0,(Pointer)new_mtdp);
3336 }
3337 prev_mtdp=new_mtdp;
3338 }
3339 if (mtdp_to_disp>=to_disp) break;
3340 cumulMtdp+=mtdp_size;
3341 }
3342 /*done ?*/
3343 if (pgp->StopLetter>=to_disp) break;
3344 }
3345 return(vnpTxt);
3346
3347 erreur:
3348 if (vnpTxt){
3349 DDV_DeleteTxtList(&vnpTxt);
3350 }
3351 return(NULL);
3352 }
3353
3354 /*******************************************************************************
3355
3356 Function : DDV_CreateDataForEditor()
3357
3358 Purpose : create a MsaParaGPopListPtr intended to be used by the editor
3359
3360 Return value : an allocated data block ready for use by the editor. Null if
3361 failure
3362
3363 *******************************************************************************/
DDV_CreateDataForEditor(MsaParaGPopListPtr mpplp,Int4 from_disp,Int4 to_disp)3364 NLM_EXTERN MsaParaGPopListPtr DDV_CreateDataForEditor(MsaParaGPopListPtr mpplp,
3365 Int4 from_disp,Int4 to_disp)
3366 {
3367 MsaParaGPopListPtr new_mpplp;
3368
3369 ParaGPtr pgp,old_pgp;
3370 Int4 i,iNewAliSize,diff;
3371
3372 if (from_disp<0 || from_disp>=mpplp->LengthAli || from_disp>to_disp ||
3373 to_disp<0 || to_disp>=mpplp->LengthAli){
3374 return(NULL);
3375 }
3376
3377 diff=to_disp-from_disp;
3378 iNewAliSize = diff+50;
3379
3380 if (iNewAliSize<1 || iNewAliSize>LIMIT_EDITOR_SIZE)
3381 return(NULL);
3382
3383 new_mpplp=(MsaParaGPopListPtr)MemNew(sizeof(MsaParaGPopList));
3384 if (!new_mpplp) return(NULL);
3385
3386 /*table of ParaG list (each cell of that table corresponds to one row
3387 of the seqalign to display*/
3388 new_mpplp->TableHead=(ValNodePtr *)MemNew(mpplp->nBsp*sizeof(ValNodePtr));
3389 if (!new_mpplp->TableHead) {
3390 MemFree(new_mpplp);
3391 return(NULL);
3392 }
3393 /*allocate the new ParaG list; for the editor there is a single ParaG for
3394 each row (for the viewer there are usually n ParaGs for each row. For the
3395 editor, the ParaG size = to_disp-from_disp+50 (whereas in the viewer a
3396 ParaG size = ParaG_Size (usually 70; see pgppop.h)*/
3397 for (i=0;i<mpplp->nBsp;i++){
3398 /*allocations*/
3399 pgp=(ParaGPtr)MemNew(sizeof(ParaG));
3400 if (!pgp) goto erreur;
3401 pgp->szEditSeq=(CharPtr)MemNew(iNewAliSize*sizeof(Char));
3402 if (pgp->szEditSeq==NULL) goto erreur;
3403 /*get the ParaG line descriptor */
3404 pgp->ptxtList=DDV_GetMtdpListForEditor(mpplp->TableHead[i],from_disp,
3405 to_disp);
3406 if (!pgp->ptxtList) goto erreur;
3407 /*get the char buffer*/
3408 old_pgp=(ParaGPtr)mpplp->TableHead[i]->data.ptrvalue;
3409 pgp->sip = old_pgp->sip;
3410 DDV_GetCharBufferForEditor(pgp,pgp->szEditSeq);
3411 if (*(pgp->szEditSeq)=='\0') goto erreur;
3412 /*copy/init values*/
3413 pgp->StartLetter = 0;
3414 pgp->StopLetter = diff;
3415 pgp->NumOrder = i;
3416 pgp->StartLine = i;
3417 pgp->nLines = 1;
3418 pgp->ScaleStyle=SCALE_POS_NONE;
3419 /*store pgp*/
3420 new_mpplp->TableHead[i]=(ValNodePtr)MemNew(sizeof(ValNode));
3421 if (!new_mpplp->TableHead[i]) goto erreur;
3422 new_mpplp->TableHead[i]->data.ptrvalue=(Pointer)pgp;
3423 }
3424
3425 /*seqali size and type*/
3426 new_mpplp->LengthAli=diff+1;
3427 new_mpplp->nBsp=mpplp->nBsp;
3428 new_mpplp->sap=mpplp->sap;
3429 new_mpplp->DisplayType=mpplp->DisplayType;
3430
3431 /*entities table*/
3432 new_mpplp->entitiesTbl=(Uint4Ptr)MemNew(new_mpplp->nBsp*sizeof(Uint4));
3433 if (new_mpplp->entitiesTbl==NULL) goto erreur;
3434 MemCopy(new_mpplp->entitiesTbl,mpplp->entitiesTbl,
3435 new_mpplp->nBsp*sizeof(Uint4));
3436 /*ruler descriptor*/
3437 new_mpplp->RulerDescr=DDV_GetRulerForEditor(mpplp->RulerDescr,from_disp,
3438 to_disp);
3439 if (new_mpplp->RulerDescr==NULL) goto erreur;
3440 return(new_mpplp);
3441
3442 erreur : /*serious problem*/
3443 if (new_mpplp->entitiesTbl)
3444 MemFree(new_mpplp->entitiesTbl);
3445 if (new_mpplp->RulerDescr)
3446 ValNodeFreeData(new_mpplp->RulerDescr);
3447 DDV_DeleteDisplayList(new_mpplp);
3448 MemFree(new_mpplp);
3449 return(NULL);
3450 }
3451
3452
3453