1 /*
2 * ===========================================================================
3 *
4 *                            PUBLIC DOMAIN NOTICE
5 *               National Center for Biotechnology Information
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 have not placed any restriction on its use or reproduction.
13 *
14 *  Although all reasonable efforts have been taken to ensure the accuracy
15 *  and reliability of the software and data, the NLM and the U.S.
16 *  Government do not and cannot warrant the performance or results that
17 *  may be obtained by using this software or data. The NLM and the U.S.
18 *  Government disclaim all warranties, express or implied, including
19 *  warranties of performance, merchantability or fitness for any particular
20 *  purpose.
21 *
22 *  Please cite the author in any work or product based on this material.
23 *
24 * ===========================================================================
25 *
26 * File Name: gtrdraw.c
27 *
28 * Author(s): John Kuzio
29 *
30 * Version Creation Date: 98-01-01
31 *
32 * $Revision: 6.4 $
33 *
34 * File Description: sentinal trees
35 *
36 * Modifications:
37 * --------------------------------------------------------------------------
38 * Date       Name        Description of modification
39 * --------------------------------------------------------------------------
40 * $Log: gtrdraw.c,v $
41 * Revision 6.4  1999/10/04 17:46:23  kans
42 * include vibrant.h
43 *
44 * Revision 6.3  1998/10/01 16:37:10  kuzio
45 * cast
46 *
47 * Revision 6.2  1998/09/16 19:00:36  kuzio
48 * cvs logs
49 *
50 * ==========================================================================
51 */
52 
53 #include <vibrant.h>
54 #include <drawingp.h>
55 #include <gtrdraw.h>
56 
57 /* common */
58 
CleanGSP(BigScalar calldata)59 static void CleanGSP (BigScalar calldata)
60 {
61   GraphTreeSentPtr gtp;
62 
63   if ((gtp = (GraphTreeSentPtr) calldata) == NULL)
64     return;
65   MemFree (gtp->epa);
66   MemFree (gtp->offsetX);
67   MemFree (gtp->offsetY);
68   ValNodeFreeData (gtp->vnpnames);
69   MemFree (gtp);
70   return;
71 }
72 
PlotTheTreePlot(Int4Ptr epa,Int4 numval,ValNodePtr vnp,Int2 fontsize,Boolean flagLabelNodes,AttPData PNTR curattrib,Int2 scrolloffsetX,Int2 scrolloffsetY)73 static void PlotTheTreePlot (Int4Ptr epa, Int4 numval, ValNodePtr vnp,
74                              Int2 fontsize, Boolean flagLabelNodes,
75                              AttPData PNTR curattrib,
76                              Int2 scrolloffsetX, Int2 scrolloffsetY)
77 {
78   Int4    i;
79   PoinT   point1, point2;
80   Int2    width, height;
81   CharPtr name;
82   FonT    f, fx;
83   Uint1   curR, curG, curB;
84 
85   if (flagLabelNodes)
86   {
87     curR = curattrib->color[0];
88     curG = curattrib->color[1];
89     curB = curattrib->color[2];
90     fx = FindNextResidentFont (NULL);
91     f = CreateFont (Helvetica (fontsize, STYLE_BOLD));
92     SelectFont (f);
93   }
94 
95   for (i = 0; i < numval; i++)
96   {
97     point1.x = scrolloffsetX + (Int2) *epa++;
98     point1.y = scrolloffsetY + (Int2) *epa++;
99     point2.x = scrolloffsetX + (Int2) *epa++;
100     point2.y = scrolloffsetY + (Int2) *epa++;
101     DrawLine (point1, point2);
102     if (flagLabelNodes && vnp->data.ptrvalue != NULL)
103     {
104       SelectColor (255, 0, 0);
105       name = (CharPtr) vnp->data.ptrvalue;
106       if (StrLen (name) > 8)
107         name[8] = '\0';
108       width = StringWidth (name);
109       height = FontHeight ();
110       PaintStringEx (name,(Int2)(point2.x-(width/2)),(Int2)(point2.y+height));
111       SelectColor (curR, curG, curB);
112     }
113     vnp = vnp->next;
114   }
115 
116   if (flagLabelNodes)
117   {
118     SelectFont (fx);
119     DeleteFont (f);
120   }
121 
122   return;
123 }
124 
TreeSentProc(BigScalar calldata,PrimDrawContext pdc)125 static void TreeSentProc (BigScalar calldata, PrimDrawContext pdc)
126 {
127   GraphTreeSentPtr gtp;
128   DrawInfoPtr      dInfoPtr;
129   ScaleInfo        sInfo;
130 
131   if ((gtp = (GraphTreeSentPtr) calldata) == NULL)
132     return;
133   if (gtp->epa == NULL)
134     return;
135 
136   dInfoPtr = (DrawInfoPtr) pdc;
137   sInfo    = dInfoPtr->scale;
138   if (gtp->offsetX == NULL)
139   {
140     gtp->offsetX = (Int4Ptr) MemNew (sizeof (Int4));
141     *(gtp->offsetX) = sInfo.offsetX;
142     gtp->offsetY = (Int4Ptr) MemNew (sizeof (Int4));
143     *(gtp->offsetY) = sInfo.offsetY;
144   }
145   PlotTheTreePlot (gtp->epa, gtp->numval, gtp->vnpnames,
146                    gtp->fontsize, gtp->flagLabelNodes,
147                    &(dInfoPtr->curattrib),
148                    (Int2) (sInfo.offsetX - (*(gtp->offsetX))),
149                    (Int2) (sInfo.offsetY - (*(gtp->offsetY))));
150   return;
151 }
152 
AddTreeSentinelToPicture(SegmenT seg,TreeNodePtr ptrNode,Int2 fontsize,Boolean flagLabelNodes)153 static GraphTreeSentPtr AddTreeSentinelToPicture (SegmenT seg,
154                                                   TreeNodePtr ptrNode,
155                                                   Int2 fontsize,
156                                                   Boolean flagLabelNodes)
157 {
158   GraphTreeSentPtr gtp;
159   Int4Ptr          epap;
160   Int4             numval, nwidth, xwidth, ndepth, xdepth;
161   TreeNodePtr      ptrNodeNext;
162   Boolean          flagTakeNext;
163   ValNodePtr       vnp;
164 
165   if ((gtp = (GraphTreeSentPtr) MemNew (sizeof (GraphTreeSentData))) == NULL)
166     return NULL;
167   if ((gtp->epa = (Int4Ptr) MemNew (sizeof (Int4) * 262144)) == NULL)
168     return NULL;
169   gtp->offsetX = NULL;
170   gtp->offsetY = NULL;
171   gtp->flagIsGUI = VibrantIsGUI ();
172   gtp->vnpnames = NULL;
173   gtp->fontsize = fontsize;
174   gtp->flagLabelNodes = flagLabelNodes;
175 
176   epap = gtp->epa;
177   numval = 0;
178   ptrNodeNext = NULL;
179   flagTakeNext = FALSE;
180   while ((ptrNodeNext = ExploreTree (ptrNode, ptrNodeNext,
181           &flagTakeNext)) != NULL)
182   {
183     if (ptrNodeNext->ptrChildLeft != NULL)
184     {
185       *epap++ = ptrNodeNext->xcoord;
186       *epap++ = ptrNodeNext->ycoord;
187       *epap++ = ptrNodeNext->ptrChildLeft->xcoord;
188       *epap++ = ptrNodeNext->ptrChildLeft->ycoord;
189       vnp = ValNodeNew (gtp->vnpnames);
190       if (gtp->vnpnames == NULL)
191         gtp->vnpnames = vnp;
192       if ((ptrNodeNext->ptrChildLeft->ptrChildLeft == NULL) &&
193           (ptrNodeNext->ptrChildLeft->ptrChildRight == NULL))
194       {
195         vnp->data.ptrvalue = (Pointer) StringSave
196                               (ptrNodeNext->ptrChildLeft->name);
197       }
198       numval++;
199     }
200     if (ptrNodeNext->ptrChildRight != NULL)
201     {
202       *epap++ = ptrNodeNext->xcoord;
203       *epap++ = ptrNodeNext->ycoord;
204       *epap++ = ptrNodeNext->ptrChildRight->xcoord;
205       *epap++ = ptrNodeNext->ptrChildRight->ycoord;
206       vnp = ValNodeNew (gtp->vnpnames);
207       if (gtp->vnpnames == NULL)
208         gtp->vnpnames = vnp;
209       if ((ptrNodeNext->ptrChildRight->ptrChildLeft == NULL) &&
210           (ptrNodeNext->ptrChildRight->ptrChildRight == NULL))
211       {
212         vnp->data.ptrvalue = (Pointer) StringSave
213                               (ptrNodeNext->ptrChildRight->name);
214       }
215       numval++;
216     }
217     flagTakeNext = FALSE;
218   }
219   gtp->numval = numval;
220 
221   nwidth = GetMinimumTreeXcoord (ptrNode);
222   ndepth = GetMinimumTreeYcoord (ptrNode);
223   xwidth = GetMaximumTreeXcoord (ptrNode);
224   xdepth = GetMaximumTreeYcoord (ptrNode);
225   xwidth += 32;
226   xdepth += 16;
227   gtp->snt = AddSntRectangle (seg, nwidth, ndepth, xwidth, xdepth,
228                               TreeSentProc, (BigScalar) gtp,
229                               CleanGSP, 0);
230   return gtp;
231 }
232 
DrawTree(TreeNodePtr ptrNode)233 extern SegmenT DrawTree (TreeNodePtr ptrNode)
234 {
235   SegmenT seg;
236 
237   seg = CreatePicture ();
238   AddTreeSentinelToPicture (seg, ptrNode, 8, TRUE);
239   return seg;
240 }
241