Annotation of Amaya/amaya/HTMLbook.c, revision 1.135

1.1       cvs         1: /*
                      2:  *
1.129     vatton      3:  *  (c) COPYRIGHT INRIA and W3C, 1996-2005
1.1       cvs         4:  *  Please first read the full copyright statement in file COPYRIGHT.
                      5:  *
                      6:  */
1.65      cvs         7:  
1.1       cvs         8: /*
                      9:  * Initialization functions and button functions of Amaya application.
                     10:  *
                     11:  * Authors: V. Quint, I. Vatton
1.85      cvs        12:  *          R. Guetari (W3C/INRIA) - Windows version.
1.1       cvs        13:  */
                     14: 
1.107     carcone    15: #ifdef _WX
1.135   ! vatton     16: #include "wx/wx.h"
1.107     carcone    17: #endif /* _WX */
1.1       cvs        18: 
                     19: /* Included headerfiles */
1.101     gully      20: #define THOT_EXPORT extern
1.1       cvs        21: #include "amaya.h"
1.44      cvs        22: #include "AHTURLTools_f.h"
1.1       cvs        23: #include "print.h"
1.51      cvs        24: #include "css.h"
1.101     gully      25: #include "init_f.h"
1.1       cvs        26: 
1.116     gully      27: #include "appdialogue_wx.h"
                     28: #include "message_wx.h"
                     29: 
1.25      cvs        30: /* structure to register sub-documents in MakeBook function*/
                     31: typedef struct _SubDoc
1.135   ! vatton     32: {
        !            33:   struct _SubDoc  *SDnext;
        !            34:   Element          SDel;
        !            35:   char            *SDname;
        !            36: }SubDoc;
1.25      cvs        37: 
1.29      cvs        38: /* the structure used for the GetIncludedDocuments_callback function */
1.58      cvs        39: typedef struct _IncludeCtxt
1.53      cvs        40: {
1.58      cvs        41:   Element              div; /* enclosing element for the search */
                     42:   Element              link; /* current processed link */
1.104     vatton     43:   char                *utf8path; /* called url */
1.85      cvs        44:   char                 *name; /* the fragment name */
1.58      cvs        45:   struct _IncludeCtxt  *ctxt; /* the previous context */
                     46: } IncludeCtxt;
1.29      cvs        47: 
1.55      cvs        48: /* shared with windialogapi.c */
                     49: ThotBool         PrintURL;
                     50: ThotBool        NumberLinks;
                     51: ThotBool        WithToC;
                     52: ThotBool         IgnoreCSS;
                     53: 
1.25      cvs        54: static struct _SubDoc  *SubDocs;
1.85      cvs        55: static char             PSfile[MAX_PATH];
                     56: static char             PPrinter[MAX_PATH];
                     57: static char            *DocPrintURL;
1.53      cvs        58: static Document                DocPrint;
1.2       cvs        59: static int              PaperPrint;
1.73      cvs        60: static int              ManualFeed = PP_OFF;
1.71      cvs        61: static int              Orientation;
1.2       cvs        62: static int              PageSize;
1.71      cvs        63: static int              PagePerSheet;
1.1       cvs        64: 
1.114     vatton     65: #include "EDITORactions_f.h"
1.1       cvs        66: #include "init_f.h"
                     67: #include "HTMLactions_f.h"
                     68: #include "HTMLbook_f.h"
                     69: #include "HTMLedit_f.h"
1.25      cvs        70: #include "HTMLhistory_f.h"
1.51      cvs        71: #include "UIcss_f.h"
1.1       cvs        72: 
1.107     carcone    73: #ifdef _WINGUI
1.37      cvs        74: #include "wininclude.h"
1.103     cvs        75: #endif /* _WINGUI */
1.31      cvs        76: 
1.107     carcone    77: #ifdef _WX
1.135   ! vatton     78: #include "wxdialogapi_f.h"
1.107     carcone    79: #endif /* _WX */
                     80: 
1.101     gully      81: static ThotBool GetIncludedDocuments (Element el, Element link,
1.135   ! vatton     82:                                       Document doc, IncludeCtxt *prev);
1.1       cvs        83: /*----------------------------------------------------------------------
1.94      vatton     84:   RedisplayDocument redisplays a view of a document
                     85:   ----------------------------------------------------------------------*/
                     86: void  RedisplayDocument(Document doc, View view)
                     87: {
1.95      vatton     88:   Element             el;
                     89:   int                 position;
                     90:   int                 distance;
                     91: 
                     92:   /* get the current position in the document */
                     93:   position = RelativePosition (doc, &distance);
1.94      vatton     94:   TtaSetDisplayMode (doc, NoComputedDisplay);
                     95:   TtaSetDisplayMode (doc, DisplayImmediately);
1.95      vatton     96:   /* show the document at the same position */
                     97:   el = ElementAtPosition (doc, position);
                     98:   TtaShowElement (doc, view, el, distance);
1.94      vatton     99: }
                    100: 
                    101: 
                    102: /*----------------------------------------------------------------------
1.16      cvs       103:   RegisterSubDoc adds a new entry in SubDoc table.
                    104:   ----------------------------------------------------------------------*/
1.94      vatton    105: static void RegisterSubDoc (Element el, char *url)
1.16      cvs       106: {
                    107:   struct _SubDoc  *entry, *last;
                    108: 
                    109:   if (url == NULL || url[0] == EOS)
                    110:     return;
                    111: 
1.101     gully     112:   entry = (struct _SubDoc *)TtaGetMemory (sizeof (struct _SubDoc));
1.16      cvs       113:   entry->SDnext = NULL;
                    114:   entry->SDel = el;
1.83      cvs       115:   entry->SDname = TtaStrdup (url);
1.16      cvs       116: 
                    117:   if (SubDocs == NULL)
                    118:     SubDocs = entry;
                    119:   else
                    120:     {
                    121:       last = SubDocs;
                    122:       while (last->SDnext != NULL)
1.135   ! vatton    123:         last = last->SDnext;
1.16      cvs       124:       last->SDnext = entry;
                    125:     }
                    126: }
                    127: 
                    128: 
                    129: /*----------------------------------------------------------------------
                    130:   SearchSubDoc searches whether a document name is registered or not
                    131:   within the SubDoc table.
                    132:   Return the DIV element that correspond to the sub-document or NULL.
                    133:   ----------------------------------------------------------------------*/
1.94      vatton    134: static Element SearchSubDoc (char *url)
1.16      cvs       135: {
                    136:   Element          el;
                    137:   struct _SubDoc  *entry;
1.47      cvs       138:   ThotBool         docFound;
1.16      cvs       139: 
                    140:   if (url == NULL || url[0] == EOS)
                    141:     return (NULL);
                    142: 
                    143:   entry = SubDocs;
                    144:   docFound = FALSE;
                    145:   el = NULL;
                    146:   while (!docFound && entry != NULL)
                    147:     {
1.83      cvs       148:       docFound = (strcmp (url, entry->SDname) == 0);
1.16      cvs       149:       if (!docFound)
1.135   ! vatton    150:         entry = entry->SDnext;
1.16      cvs       151:       else
1.135   ! vatton    152:         /* document found -> return the DIV element */
        !           153:         el = entry->SDel;
1.16      cvs       154:     }
                    155:   return (el);
                    156: }
                    157: 
                    158: /*----------------------------------------------------------------------
                    159:   FreeSubDocTable frees all entries in SubDoc table.
                    160:   ----------------------------------------------------------------------*/
1.94      vatton    161: static void FreeSubDocTable ()
1.16      cvs       162: {
                    163:   struct _SubDoc  *entry, *last;
                    164: 
                    165:   entry = SubDocs;
                    166:   while (entry != NULL)
                    167:     {
                    168:       last = entry;
                    169:       entry = entry->SDnext;
                    170:       TtaFreeMemory (last->SDname);
                    171:       TtaFreeMemory (last);
                    172:     }
                    173:   SubDocs = NULL;
                    174: }
                    175: 
                    176: 
                    177: /*----------------------------------------------------------------------
1.1       cvs       178:   SetInternalLinks
1.8       cvs       179:   Associate an InternalLink attribute with all anchor (A) elements of the
                    180:   document which designate an element in the same document.
1.1       cvs       181:   InternalLink is a Thot reference attribute that links a source and a
                    182:   target anchor and that allows P schemas to display and print cross-references
                    183:   ----------------------------------------------------------------------*/
1.94      vatton    184: void SetInternalLinks (Document document)
1.1       cvs       185: {
1.32      cvs       186:   Element              el, div, link, target, sibling;
                    187:   ElementType          elType, linkType;
1.16      cvs       188:   Attribute            HrefAttr, IntLinkAttr;
1.17      cvs       189:   Attribute             attr, ExtLinkAttr;
1.16      cvs       190:   AttributeType                attrType;
1.85      cvs       191:   char                *text, *ptr, *url; 
1.83      cvs       192:   char                  number[10];
                    193:   char                  value[MAX_LENGTH];
1.25      cvs       194:   int                  length, i, volume;
                    195:   int                   status, position;
1.47      cvs       196:   ThotBool              split;
1.1       cvs       197: 
1.16      cvs       198:   /* Remember the current status of the document */
                    199:   status = TtaIsDocumentModified (document);
1.32      cvs       200:   el = TtaGetMainRoot (document);
                    201:   volume = TtaGetElementVolume (el);
                    202:   elType = TtaGetElementType (el);
                    203:   elType.ElTypeNum = HTML_EL_AnyLink;
1.16      cvs       204:   attrType.AttrSSchema = elType.ElSSchema;
1.32      cvs       205:   /* looks for all links in the document */
1.16      cvs       206:   link = el;
                    207:   while (link != NULL)
                    208:     {
1.25      cvs       209:       /* display the progression of the work */
                    210:       el = link;
                    211:       position = 0;
                    212:       while (el != NULL)
1.135   ! vatton    213:         {
        !           214:           sibling = el;
        !           215:           do
        !           216:             {
        !           217:               /* add volume of each previous element */
        !           218:               TtaPreviousSibling (&sibling);
        !           219:               if (sibling != NULL)
        !           220:                 position += TtaGetElementVolume (sibling);
        !           221:             }
        !           222:           while (sibling != NULL);
        !           223:           el = TtaGetParent (el);
        !           224:         }
1.83      cvs       225:       sprintf (number, "%d", position*100/volume);
1.25      cvs       226:       TtaSetStatus (document, 1, TtaGetMessage (AMAYA, AM_UPDATED_LINK), number);
                    227:       TtaHandlePendingEvents ();
1.16      cvs       228:       link = TtaSearchTypedElement (elType, SearchForward, link);
                    229:       if (link != NULL)
1.135   ! vatton    230:         /* a link has been found */
        !           231:         {
        !           232:           linkType = TtaGetElementType (link);
        !           233:           if (linkType.ElTypeNum == HTML_EL_Anchor)
        !           234:             attrType.AttrTypeNum = HTML_ATTR_HREF_;
        !           235:           else
        !           236:             attrType.AttrTypeNum = HTML_ATTR_cite;
        !           237:           HrefAttr = TtaGetAttribute (link, attrType);
        !           238:           attrType.AttrTypeNum = HTML_ATTR_InternalLink;
        !           239:           IntLinkAttr = TtaGetAttribute (link, attrType);
        !           240:           attrType.AttrTypeNum = HTML_ATTR_ExternalLink;
        !           241:           ExtLinkAttr = TtaGetAttribute (link, attrType);
        !           242:           if (HrefAttr == NULL)
        !           243:             /* this element is not a link (no href or cite attribute) */
        !           244:             /* remove attributes InternalLink and ExternalLink if they
        !           245:                are present */
        !           246:             {
        !           247:               if (IntLinkAttr != NULL)
        !           248:                 TtaRemoveAttribute (link, IntLinkAttr, document);
        !           249:               if (ExtLinkAttr != NULL)
        !           250:                 TtaRemoveAttribute (link, ExtLinkAttr, document);         
        !           251:             }
        !           252:           else
        !           253:             /* this element has an HREF or cite attribute */
        !           254:             {
        !           255:               length = TtaGetTextAttributeLength (HrefAttr);
        !           256:               text = (char *)TtaGetMemory (length + 1);
        !           257:               TtaGiveTextAttributeValue (HrefAttr, text, &length);
        !           258: 
        !           259:               /* does an external link become an internal link ? */
        !           260:               if (document == DocBook && SubDocs != NULL)
        !           261:                 {
        !           262:                   ptr = strrchr (text, '#');
        !           263:                   url = text;
        !           264:                   split = FALSE;
        !           265:                   if (ptr == text)
        !           266:                     /* a local link */
        !           267:                     url = NULL;
        !           268:                   else if (ptr != NULL)
        !           269:                     {
        !           270:                       /* split url and name part */
        !           271:                       ptr[0] = EOS;
        !           272:                       split = TRUE;
        !           273:                     }
        !           274: 
        !           275:                   /* Is it a sub-document */
        !           276:                   div = SearchSubDoc (url);
        !           277:                   if (split)
        !           278:                     /* retore the mark */
        !           279:                     ptr[0] = '#';
        !           280: 
        !           281:                   if (div == NULL)
        !           282:                     {
        !           283:                       /* it's not a sub-document */
        !           284:                       if (url == NULL)
        !           285:                         /* a local link */
        !           286:                         ptr = &text[1];
        !           287:                       else
        !           288:                         /* still an externa; link */
        !           289:                         ptr = NULL;
        !           290:                     }
        !           291:                   else
        !           292:                     {
        !           293:                       /* this link becomes internal */
        !           294:                       if (ptr != NULL)
        !           295:                         {
        !           296:                           /* get the target name */
        !           297:                           strcpy (value, ptr);
        !           298:                           length = strlen (value);
        !           299:                           /* check whether the name changed */
        !           300:                           i = 0;
        !           301:                           target = SearchNAMEattribute (document, &value[1], NULL, NULL);
        !           302:                           while (target != NULL)
        !           303:                             {
        !           304:                               /* is it the right NAME */
        !           305:                               if (TtaIsAncestor (target, div))
        !           306:                                 target = NULL;
        !           307:                               else
        !           308:                                 {
        !           309:                                   /* continue the search */
        !           310:                                   i++;
        !           311:                                   sprintf (&value[length], "%d", i);
        !           312:                                   target = SearchNAMEattribute (document,
        !           313:                                                                 &value[1], NULL, NULL);
        !           314:                                 }
        !           315:                             }
        !           316:                         }
        !           317:                       else
        !           318:                         {
        !           319:                           /* get the DIV name */
        !           320:                           attrType.AttrTypeNum = HTML_ATTR_ID;
        !           321:                           attr = TtaGetAttribute (div, attrType);
        !           322:                           length = 200;
        !           323:                           value[0] = '#';
        !           324:                           TtaGiveTextAttributeValue (attr, &value[1], &length);
        !           325:                         }
        !           326:                       ptr = &value[1];
        !           327:                       TtaSetAttributeText (HrefAttr, value, link, document);
        !           328:                     }
        !           329:                 }
        !           330:               else if (text[0] == '#')
        !           331:                 ptr = &text[1];
        !           332:               else
        !           333:                 ptr = NULL;
        !           334: 
        !           335:               if (ptr != NULL)
        !           336:                 /* it's an internal link. Attach an attribute InternalLink */
        !           337:                 /* to the link, if this attribute does not exist yet */
        !           338:                 {
        !           339:                   if (IntLinkAttr == NULL)
        !           340:                     {
        !           341:                       attrType.AttrTypeNum = HTML_ATTR_InternalLink;
        !           342:                       IntLinkAttr = TtaNewAttribute (attrType);
        !           343:                       TtaAttachAttribute (link, IntLinkAttr, document);
        !           344:                     }
        !           345:                   /* looks for the target element */
        !           346:                   target = SearchNAMEattribute (document, ptr, NULL, NULL);
        !           347:                   if (target != NULL)
        !           348:                     /* set the Thot link */
        !           349:                     TtaSetAttributeReference (IntLinkAttr, link, document,
        !           350:                                               target);
        !           351:                 }
        !           352:               else
        !           353:                 /* it's an external link */
        !           354:                 {
        !           355:                   /* Remove the InternalLink attribute if it is present */
        !           356:                   if (IntLinkAttr != NULL)
        !           357:                     TtaRemoveAttribute (link, IntLinkAttr, document);
        !           358:                   /* create an ExternalLink attribute if there is none */
        !           359:                   if (ExtLinkAttr == NULL)
        !           360:                     {
        !           361:                       attrType.AttrTypeNum = HTML_ATTR_ExternalLink;
        !           362:                       ExtLinkAttr = TtaNewAttribute (attrType);
        !           363:                       TtaAttachAttribute (link, ExtLinkAttr, document);
        !           364:                     }
        !           365:                 }
        !           366:               TtaFreeMemory (text);
        !           367:             }
        !           368:         }
1.16      cvs       369:     }
                    370:   /* Reset document status */
                    371:   if (!status)
                    372:     TtaSetDocumentUnmodified (document);
1.3       cvs       373: }
                    374: 
                    375: /*----------------------------------------------------------------------
                    376:   CheckPrintingDocument reinitialize printing parameters as soon as
                    377:   the printing document changes.
                    378:   ----------------------------------------------------------------------*/
1.89      vatton    379: static void CheckPrintingDocument (Document document)
1.3       cvs       380: {
1.83      cvs       381:   char         docName[MAX_LENGTH];
                    382:   char        *ptr; 
                    383:   char         suffix[MAX_LENGTH];
1.81      cvs       384:   int            lg;
                    385: 
                    386:   if (DocPrint != document || DocPrintURL == NULL ||
1.83      cvs       387:       strcmp(DocPrintURL, DocumentURLs[document]))
1.81      cvs       388:     {
                    389:       /* initialize print parameters */
                    390:       TtaFreeMemory (DocPrintURL);
                    391:       DocPrint = document;
                    392:       DocPrintURL = TtaStrdup (DocumentURLs[document]);
                    393:       
                    394:       /* define the new default PS file */
                    395:       ptr = TtaGetEnvString ("APP_TMPDIR");
                    396:       if (ptr != NULL && TtaCheckDirectory (ptr))
1.135   ! vatton    397:         strcpy (PSfile, ptr);
1.81      cvs       398:       else
1.135   ! vatton    399:         strcpy (PSfile, TtaGetDefEnvString ("APP_TMPDIR"));
1.83      cvs       400:       lg = strlen (PSfile);
                    401:       if (PSfile[lg - 1] == DIR_SEP)
1.135   ! vatton    402:         PSfile[--lg] = EOS;
1.83      cvs       403:       strcpy (docName, TtaGetDocumentName (document));
1.90      vatton    404:       TtaExtractSuffix (docName, suffix);
1.83      cvs       405:       sprintf (&PSfile[lg], "%c%s.ps", DIR_SEP, docName);
1.81      cvs       406:       TtaSetPsFile (PSfile);
                    407:     }
1.3       cvs       408: }
                    409: 
                    410: /*----------------------------------------------------------------------
1.135   ! vatton    411:   PrintDocument prints the document using predefined parameters.
        !           412:   ----------------------------------------------------------------------*/  
1.91      vatton    413: static void PrintDocument (Document doc, View view)
1.3       cvs       414: {
1.126     cvs       415: #if defined(_WINDOWS) && defined(_WX) && defined(IV)
1.116     gully     416:   /* On windows and with wxWidgets, disable printing for the moment */
                    417:   wxMessageDialog messagedialog( NULL,
1.135   ! vatton    418:                                  TtaConvMessageToWX("Not implemented yet"), 
        !           419:                                  _T("Warning"),
        !           420:                                  (long) wxOK | wxICON_EXCLAMATION | wxSTAY_ON_TOP);
1.116     gully     421:   messagedialog.ShowModal();
                    422: #else /* defined(_WINDOWS) && defined(_WX) */
1.34      cvs       423:   AttributeType      attrType;
1.84      cvs       424:   ElementType        elType;
1.34      cvs       425:   Attribute          attr;
1.84      cvs       426:   Element            el, docEl;
1.85      cvs       427:   char              *files, *dir;
1.84      cvs       428:   char               viewsToPrint[MAX_PATH];
1.47      cvs       429:   ThotBool           status, textFile;
1.3       cvs       430: 
1.38      cvs       431:   textFile = (DocumentTypes[doc] == docText ||
1.75      cvs       432:               DocumentTypes[doc] == docSource ||
1.135   ! vatton    433:               DocumentTypes[doc] == docCSS);
1.38      cvs       434: 
1.81      cvs       435:   /* initialize printing information */
1.75      cvs       436:   CheckPrintingDocument (doc);
1.83      cvs       437:   strcpy (viewsToPrint, "Formatted_view ");
1.75      cvs       438:   if (DocumentTypes[doc] == docHTML && WithToC)
1.83      cvs       439:     strcat (viewsToPrint, "Table_of_contents ");
1.75      cvs       440:   
                    441:   if (textFile)
                    442:     {
                    443:       if (PageSize == PP_A4)
1.135   ! vatton    444:         {
        !           445:           if (Orientation == PP_Landscape)
        !           446:             TtaSetPrintSchema ("TextFilePL");
        !           447:           else
        !           448:             TtaSetPrintSchema ("TextFilePP");
        !           449:         }
1.75      cvs       450:       else
1.135   ! vatton    451:         {
        !           452:           if (Orientation == PP_Landscape)
        !           453:             TtaSetPrintSchema ("TextFileUSL");
        !           454:           else
        !           455:             TtaSetPrintSchema ("TextFilePPUS");
        !           456:         }
1.75      cvs       457:     }
                    458:   else if (DocumentTypes[doc] == docSVG)
1.88      vatton    459:     TtaSetPrintSchema ("SVGP");
1.75      cvs       460:   else if (DocumentTypes[doc] == docMath)
1.82      cvs       461:     TtaSetPrintSchema ("MathMLP");
1.75      cvs       462:   else if (DocumentTypes[doc] == docAnnot)
1.82      cvs       463:     TtaSetPrintSchema ("AnnotP");
1.113     quint     464:   else if (DocumentTypes[doc] == docHTML)
1.75      cvs       465:     {
1.113     quint     466:       if (NumberLinks)
1.135   ! vatton    467:         /* display numbered links */
        !           468:         {
        !           469:           /* associate an attribute InternalLink with all anchors refering
        !           470:              a target in the same document.  This allows P schemas to work
        !           471:              properly */
        !           472:           SetInternalLinks (DocPrint);
        !           473:           if (PageSize == PP_A4)
        !           474:             {
        !           475:               if (Orientation == PP_Landscape)
        !           476:                 TtaSetPrintSchema ("HTMLPLL");
        !           477:               else
        !           478:                 TtaSetPrintSchema ("HTMLPLP");
        !           479:             }
        !           480:           else
        !           481:             {
        !           482:               if (Orientation == PP_Landscape)
        !           483:                 TtaSetPrintSchema ("HTMLUSLL");
        !           484:               else
        !           485:                 TtaSetPrintSchema ("HTMLPLPUS");
        !           486:             }
        !           487:           strcat (viewsToPrint, "Links_view ");
        !           488:         }
1.113     quint     489:       else if (PageSize == PP_A4)
1.135   ! vatton    490:         {
        !           491:           if (Orientation == PP_Landscape)
        !           492:             TtaSetPrintSchema ("HTMLPL");
        !           493:           else
        !           494:             TtaSetPrintSchema ("HTMLPP");
        !           495:         }
1.75      cvs       496:       else
1.135   ! vatton    497:         {
        !           498:           if (Orientation == PP_Landscape)
        !           499:             TtaSetPrintSchema ("HTMLUSL");
        !           500:           else
        !           501:             TtaSetPrintSchema ("HTMLPPUS");
        !           502:         }    
1.75      cvs       503:     }
                    504:   status = TtaIsDocumentModified (doc);
1.71      cvs       505: 
1.75      cvs       506:   if (textFile || DocumentTypes[doc] == docImage ||
                    507:       DocumentTypes[doc] == docHTML)
                    508:     {
                    509:       /* post or remove the PrintURL attribute */
                    510:       attrType.AttrSSchema = TtaGetDocumentSSchema (doc);
1.84      cvs       511:       elType.ElSSchema = attrType.AttrSSchema;
1.75      cvs       512:       if (textFile)
1.135   ! vatton    513:         {
        !           514:           elType. ElTypeNum = TextFile_EL_TextFile;
        !           515:           attrType.AttrTypeNum = TextFile_ATTR_PrintURL;
        !           516:         }
1.75      cvs       517:       else
1.135   ! vatton    518:         {
        !           519:           elType. ElTypeNum = HTML_EL_HTML;
        !           520:           attrType.AttrTypeNum = HTML_ATTR_PrintURL;
        !           521:         }
1.84      cvs       522:       docEl = TtaGetMainRoot (doc);
                    523:       el = TtaSearchTypedElement (elType, SearchForward, docEl);
1.75      cvs       524:       attr = TtaGetAttribute (el, attrType);
                    525:       if (!attr && PrintURL)
1.135   ! vatton    526:         {
        !           527:           attr = TtaNewAttribute (attrType);
        !           528:           TtaAttachAttribute (el, attr, doc);
        !           529:         }
1.75      cvs       530:       if (attr && !PrintURL)
1.135   ! vatton    531:         TtaRemoveAttribute (el, attr, doc);
1.75      cvs       532:     }
                    533:   
                    534:   /* get the path dir where css files have to be stored */
1.113     quint     535:   if ((DocumentTypes[doc] == docHTML || DocumentTypes[doc] == docSVG ||
                    536:        DocumentTypes[doc] == docXml) &&
1.78      cvs       537:       !IgnoreCSS)
1.75      cvs       538:     {
                    539:       TtaGetPrintNames (&files, &dir);
                    540:       /* store css files and get the list of names */
                    541:       files = CssToPrint (doc, dir);
                    542:     }
                    543:   else
                    544:     files = NULL;
                    545:   TtaPrint (DocPrint, viewsToPrint, files);
                    546:   if (files)
                    547:     TtaFreeMemory (files);
                    548:   if (!status)
                    549:     TtaSetDocumentUnmodified (doc);
1.116     gully     550: #endif /* defined(_WINDOWS) && defined(_WX) */
1.1       cvs       551: }
                    552: 
1.45      cvs       553: /*----------------------------------------------------------------------
1.135   ! vatton    554:   PrintAs prints the document using predefined parameters.
        !           555:   ----------------------------------------------------------------------*/  
1.89      vatton    556: void PrintAs (Document doc, View view)
1.45      cvs       557: {
1.103     cvs       558: #ifdef _WINGUI
1.72      cvs       559:   DocPrint = doc;
                    560:   ReusePrinterDC ();
1.103     cvs       561: #else /* _WINGUI */
1.45      cvs       562:   PrintDocument (doc, view);
1.103     cvs       563: #endif /* _WINGUI */
1.45      cvs       564: }
1.1       cvs       565: 
                    566: /*----------------------------------------------------------------------
1.135   ! vatton    567:   CallbackImage handle return of Print form.                   
1.1       cvs       568:   ----------------------------------------------------------------------*/
1.85      cvs       569: void CallbackPrint (int ref, int typedata, char *data)
1.1       cvs       570: {
1.133     cvs       571:   long int            val;
1.1       cvs       572: 
1.133     cvs       573:   val = (long int) data;
1.53      cvs       574:   switch (ref - BasePrint)
1.1       cvs       575:     {
1.69      cvs       576:     case FormPrint:
                    577:       TtaDestroyDialogue (BasePrint + FormPrint);
1.1       cvs       578:       switch (val)
1.135   ! vatton    579:         {
        !           580:         case 1:
        !           581:           TtaSetPrintCommand (PPrinter);
        !           582:           TtaSetPsFile (PSfile);
        !           583:           /* update the environment variable */
        !           584:           TtaSetEnvString ("THOTPRINT", PPrinter, TRUE);
        !           585:           TtaSaveAppRegistry ();
        !           586:           PrintDocument (DocPrint, 1);
        !           587:           break;
        !           588:         default:
        !           589:           break;
        !           590:         }
1.1       cvs       591:       break;
1.69      cvs       592:     case PrintOptions:
1.1       cvs       593:       switch (val)
1.135   ! vatton    594:         {
        !           595:         case 0:
        !           596:           /* Manual feed option */
        !           597:           if (ManualFeed == PP_ON)
        !           598:             ManualFeed = PP_OFF;
        !           599:           else
        !           600:             ManualFeed = PP_ON;
        !           601:           TtaSetPrintParameter (PP_ManualFeed, ManualFeed);
        !           602:           break;
        !           603:         case 1:
        !           604:           /* Toc option */
        !           605:           WithToC = !WithToC;
        !           606:           break;
        !           607:         case 2:
        !           608:           /* NumberLinks option */
        !           609:           NumberLinks = !NumberLinks;
        !           610:         case 3:
        !           611:           /* URL option */
        !           612:           PrintURL = !PrintURL;
        !           613:           break;
        !           614:         case 4:
        !           615:           /* CSS option */
        !           616:           IgnoreCSS = !IgnoreCSS;
        !           617:           break;
        !           618:         }
1.1       cvs       619:       break;
1.69      cvs       620:     case PaperFormat:
1.1       cvs       621:       /* page size submenu */
                    622:       switch (val)
1.135   ! vatton    623:         {
        !           624:         case 0:
        !           625:           PageSize = PP_A4;
        !           626:           break;
        !           627:         case 1:
        !           628:           PageSize = PP_US;
        !           629:           break;
        !           630:         }
1.81      cvs       631:       TtaSetPrintParameter (PP_PaperSize, PageSize);
1.1       cvs       632:       break;
1.71      cvs       633:     case PaperOrientation:
                    634:       /* orientation submenu */
                    635:       Orientation = val;
1.81      cvs       636:       TtaSetPrintParameter (PP_Orientation, Orientation);
1.71      cvs       637:       break;
                    638:     case PPagesPerSheet:
                    639:       /* pages per sheet submenu */
                    640:       switch (val)
1.135   ! vatton    641:         {
        !           642:         case 0:
        !           643:           PagePerSheet = 1;
        !           644:           break;
        !           645:         case 1:
        !           646:           PagePerSheet = 2;
        !           647:           break;
        !           648:         case 2:
        !           649:           PagePerSheet = 4;
        !           650:           break;
        !           651:         }
1.81      cvs       652:       TtaSetPrintParameter (PP_PagesPerSheet, PagePerSheet);
1.71      cvs       653:       break;
1.69      cvs       654:     case PrintSupport:
1.1       cvs       655:       /* paper print/save PostScript submenu */
                    656:       switch (val)
1.135   ! vatton    657:         {
        !           658:         case 0:
        !           659:           if (PaperPrint == PP_PS)
        !           660:             {
        !           661:               PaperPrint = PP_PRINTER;
1.110     cvs       662: #ifdef _GTK
1.135   ! vatton    663:               TtaSetTextForm (BasePrint + PPrinterName, PPrinter);
1.110     cvs       664: #endif /* _GTK */
1.135   ! vatton    665:               TtaSetPrintParameter (PP_Destination, PaperPrint);
        !           666:             }
        !           667:           break;
        !           668:         case 1:
        !           669:           if (PaperPrint == PP_PRINTER)
        !           670:             {
        !           671:               PaperPrint = PP_PS;
1.110     cvs       672: #ifdef _GTK
1.135   ! vatton    673:               TtaSetTextForm (BasePrint + PPrinterName, PSfile);
1.110     cvs       674: #endif /* _GTK */
1.135   ! vatton    675:               TtaSetPrintParameter (PP_Destination, PaperPrint);
        !           676:             }
        !           677:           break;
        !           678:         }
1.1       cvs       679:       break;
1.69      cvs       680:     case PPrinterName:
1.131     vatton    681:       if (data[0] != EOS)
1.135   ! vatton    682:         {
        !           683:           if (PaperPrint == PP_PRINTER)
        !           684:             /* text capture zone for the printer name */
        !           685:             strncpy (PPrinter, data, MAX_PATH);
        !           686:           else
        !           687:             /* text capture zone for the name of the PostScript file */
        !           688:             strncpy (PSfile, data, MAX_PATH);
        !           689:         }
1.1       cvs       690:       break;
                    691:     }
                    692: }
                    693: 
                    694: /*----------------------------------------------------------------------
                    695:   ----------------------------------------------------------------------*/
1.94      vatton    696: void InitPrint (void)
1.1       cvs       697: {
1.83      cvs       698:   char* ptr;
1.1       cvs       699: 
1.135   ! vatton    700:   BasePrint = TtaSetCallback ((Proc)CallbackPrint, PRINT_MAX_REF);
        !           701:   DocPrint = 0;
        !           702:   DocPrintURL = NULL;
        !           703: 
        !           704:   /* read default printer variable */
        !           705:   ptr = TtaGetEnvString ("THOTPRINT");
        !           706:   if (ptr == NULL)
        !           707:     strcpy (PPrinter, "");
        !           708:   else
        !           709:     strcpy (PPrinter, ptr);
        !           710:   TtaSetPrintCommand (PPrinter);
        !           711:   PaperPrint = PP_PRINTER;
        !           712:   TtaSetPrintParameter (PP_Destination, PaperPrint);
        !           713: 
        !           714:   /* define the new default PrintSchema */
        !           715:   NumberLinks = FALSE;
        !           716:   WithToC = FALSE;
        !           717:   IgnoreCSS = FALSE;
        !           718:   PrintURL = TRUE;
        !           719:   PageSize = TtaGetPrintParameter (PP_PaperSize);        
        !           720:   TtaSetPrintSchema ("");
        !           721:   /* no manual feed */
        !           722:   ManualFeed = PP_OFF;
        !           723:   TtaSetPrintParameter (PP_ManualFeed, ManualFeed);
        !           724:   PagePerSheet = 1;
        !           725:   TtaSetPrintParameter (PP_PagesPerSheet, PagePerSheet);
1.1       cvs       726: }
                    727: 
                    728: /*----------------------------------------------------------------------
1.3       cvs       729:   SetupAndPrint sets printing parameters and starts the printing process
1.1       cvs       730:   ----------------------------------------------------------------------*/
1.91      vatton    731: void SetupAndPrint (Document doc, View view)
1.1       cvs       732: {
1.107     carcone   733: #ifdef _GTK
1.83      cvs       734:   char           bufMenu[MAX_LENGTH];
1.91      vatton    735:   int            i;
1.107     carcone   736: #endif /* _GTK */
1.91      vatton    737:   ThotBool       textFile;
1.38      cvs       738: 
1.81      cvs       739:   textFile = (DocumentTypes[doc] == docText || DocumentTypes[doc] == docCSS);
                    740:   /* Print form */
                    741:   CheckPrintingDocument (doc);
1.27      cvs       742: 
1.107     carcone   743: #ifdef _GTK
1.81      cvs       744:   TtaNewSheet (BasePrint + FormPrint, TtaGetViewFrame (doc, view), 
1.135   ! vatton    745:                TtaGetMessage (LIB, TMSG_LIB_PRINT), 1,
        !           746:                TtaGetMessage (LIB, TMSG_BUTTON_PRINT), FALSE, 3, 'L', D_CANCEL);
1.81      cvs       747: 
                    748:   /* Paper format submenu */
                    749:   i = 0;
                    750:   sprintf (&bufMenu[i], "%s%s", "B", TtaGetMessage (LIB, TMSG_A4));
1.83      cvs       751:   i += strlen (&bufMenu[i]) + 1;
1.81      cvs       752:   sprintf (&bufMenu[i], "%s%s", "B", TtaGetMessage (LIB, TMSG_US));
                    753:   TtaNewSubmenu (BasePrint + PaperFormat, BasePrint + FormPrint, 0,
1.135   ! vatton    754:                  TtaGetMessage (LIB, TMSG_PAPER_SIZE), 2, bufMenu, NULL, 0, TRUE);
1.81      cvs       755:   if (PageSize == PP_US)
                    756:     TtaSetMenuForm (BasePrint + PaperFormat, 1);
                    757:   else
                    758:     TtaSetMenuForm (BasePrint + PaperFormat, 0);
                    759:   
                    760:   /* Orientation submenu */
                    761:   i = 0;
                    762:   sprintf (&bufMenu[i], "%s%s", "B", TtaGetMessage (AMAYA, AM_PORTRAIT));
1.83      cvs       763:   i += strlen (&bufMenu[i]) + 1;
1.81      cvs       764:   sprintf (&bufMenu[i], "%s%s", "B", TtaGetMessage (AMAYA, AM_LANDSCAPE));
                    765:   TtaNewSubmenu (BasePrint + PaperOrientation, BasePrint + FormPrint, 0,
1.135   ! vatton    766:                  TtaGetMessage (AMAYA, AM_ORIENTATION), 2, bufMenu, NULL, 0, TRUE);
1.81      cvs       767:   if (Orientation == PP_Landscape)
                    768:     TtaSetMenuForm (BasePrint + PaperOrientation, 1);
                    769:   else
                    770:     TtaSetMenuForm (BasePrint + PaperOrientation, 0);
                    771:   /* Pages per sheet submenu */
                    772:   i = 0;
                    773:   sprintf (&bufMenu[i], "%s%s", "B", TtaGetMessage (LIB, TMSG_1_PAGE_SHEET));
1.83      cvs       774:   i += strlen (&bufMenu[i]) + 1;
1.81      cvs       775:   sprintf (&bufMenu[i], "%s%s", "B", TtaGetMessage (LIB, TMSG_2_PAGE_SHEET));
1.83      cvs       776:   i += strlen (&bufMenu[i]) + 1;
1.81      cvs       777:   sprintf (&bufMenu[i], "%s%s", "B", TtaGetMessage (LIB, TMSG_4_PAGE_SHEET));
                    778:   TtaNewSubmenu (BasePrint + PPagesPerSheet, BasePrint + FormPrint, 0,
1.135   ! vatton    779:                  TtaGetMessage (LIB, TMSG_REDUCTION), 3, bufMenu, NULL, 0, TRUE);
1.81      cvs       780:   if (PagePerSheet == 1)
                    781:     TtaSetMenuForm (BasePrint + PPagesPerSheet, 0);
                    782:   else if (PagePerSheet == 2)
                    783:     TtaSetMenuForm (BasePrint + PPagesPerSheet, 1);
                    784:   else
                    785:     TtaSetMenuForm (BasePrint + PPagesPerSheet, 2);
                    786:     
                    787:   /* Print to paper/ Print to file submenu */
                    788:   i = 0;
                    789:   sprintf (&bufMenu[i], "%s%s", "B", TtaGetMessage (LIB, TMSG_PRINTER));
1.83      cvs       790:   i += strlen (&bufMenu[i]) + 1;
1.81      cvs       791:   sprintf (&bufMenu[i], "%s%s", "B", TtaGetMessage (LIB, TMSG_PS_FILE));
                    792:   TtaNewSubmenu (BasePrint + PrintSupport, BasePrint + FormPrint, 0,
1.135   ! vatton    793:                  TtaGetMessage (LIB, TMSG_OUTPUT), 2, bufMenu, NULL, 0, TRUE);
1.81      cvs       794: 
                    795:   /* PaperPrint selector */
                    796:   TtaNewTextForm (BasePrint + PPrinterName, BasePrint + FormPrint, NULL, 30, 1, TRUE);
                    797:   if (PaperPrint == PP_PRINTER)
                    798:     {
                    799:       TtaSetMenuForm (BasePrint + PrintSupport, 0);
                    800:       TtaSetTextForm (BasePrint + PPrinterName, PPrinter);
                    801:     }
                    802:   else
                    803:     {
                    804:       TtaSetMenuForm (BasePrint + PrintSupport, 1);
                    805:       TtaSetTextForm (BasePrint + PPrinterName, PSfile);
                    806:     }
1.1       cvs       807: 
1.81      cvs       808:   /* The toggle */
                    809:   i = 0;
                    810:   sprintf (&bufMenu[i], "%s%s", "T", TtaGetMessage (LIB, TMSG_MANUAL_FEED));
1.83      cvs       811:   i += strlen (&bufMenu[i]) + 1;
1.81      cvs       812:   sprintf (&bufMenu[i], "%s%s", "T", TtaGetMessage (AMAYA, AM_PRINT_TOC));
1.83      cvs       813:   i += strlen (&bufMenu[i]) + 1;
1.81      cvs       814:   sprintf (&bufMenu[i], "%s%s", "T", TtaGetMessage (AMAYA, AM_NUMBERED_LINKS));
1.83      cvs       815:   i += strlen (&bufMenu[i]) + 1;
1.81      cvs       816:   sprintf (&bufMenu[i], "%s%s", "T", TtaGetMessage (AMAYA, AM_PRINT_URL));
1.83      cvs       817:   i += strlen (&bufMenu[i]) + 1;
1.81      cvs       818:   sprintf (&bufMenu[i], "%s%s", "T", TtaGetMessage (AMAYA, AM_WITH_CSS));
                    819:   TtaNewToggleMenu (BasePrint + PrintOptions, BasePrint + FormPrint,
1.135   ! vatton    820:                     TtaGetMessage (LIB, TMSG_OPTIONS), 5, bufMenu, NULL, FALSE);
1.81      cvs       821:   if (ManualFeed == PP_ON)
                    822:     TtaSetToggleMenu (BasePrint + PrintOptions, 0, TRUE);
                    823:   else
                    824:     TtaSetToggleMenu (BasePrint + PrintOptions, 0, FALSE);
                    825:   TtaSetToggleMenu (BasePrint + PrintOptions, 1, WithToC);
                    826:   TtaSetToggleMenu (BasePrint + PrintOptions, 2, NumberLinks);
                    827:   TtaSetToggleMenu (BasePrint + PrintOptions, 3, PrintURL);
                    828:   TtaSetToggleMenu (BasePrint + PrintOptions, 4, IgnoreCSS);
                    829:   
                    830:   /* activates the Print form */
                    831:   TtaShowDialogue (BasePrint+FormPrint, FALSE);
                    832:   if (textFile)
                    833:     {
                    834:       /* invalid dialogue entries */
1.102     gully     835:       TtaRedrawMenuEntry (BasePrint + PrintOptions, 1, NULL, (ThotColor)-1, FALSE);
                    836:       TtaRedrawMenuEntry (BasePrint + PrintOptions, 2, NULL, (ThotColor)-1, FALSE);
1.81      cvs       837:     }
1.107     carcone   838: #endif /* _GTK */
                    839: #ifdef _WINGUI
1.81      cvs       840:   CreatePrintDlgWindow (TtaGetViewFrame (doc, view), PSfile);
1.103     cvs       841: #endif /* _WINGUI */
1.107     carcone   842: #ifdef _WX
1.108     gully     843:   {
1.125     gully     844:     int paper_format;
                    845:     int orientation;
                    846:     int disposition;
                    847:     int paper_print;
1.128     cvs       848:     ThotBool manual_feed;
                    849:     ThotBool with_toc;
                    850:     ThotBool with_links;
                    851:     ThotBool with_url;
                    852:     ThotBool ignore_css;
1.125     gully     853: 
                    854:     /* Paper format submenu */
                    855:     if (PageSize == PP_US)
                    856:       paper_format = 1;
                    857:     else
                    858:       paper_format = 0;
                    859: 
                    860:     /* Orientation submenu */
                    861:     if (Orientation == PP_Landscape)
                    862:       orientation = 1;
                    863:     else
                    864:       orientation = 0;
                    865: 
                    866:     /* Pages per sheet submenu */
                    867:     if (PagePerSheet == 1)
                    868:       disposition = 0;
                    869:     else if (PagePerSheet == 2)
                    870:       disposition = 1;
                    871:     else
                    872:       disposition = 2;
                    873: 
                    874:     /* PaperPrint selector */
                    875:     if (PaperPrint == PP_PRINTER)
                    876:       paper_print = 0;
                    877:     else
                    878:       paper_print = 1;
                    879:     
                    880:     /* The toggle */
                    881:     manual_feed = (ManualFeed == PP_ON);
                    882:     with_toc = WithToC;
                    883:     with_links = NumberLinks;
                    884:     with_url = PrintURL;
                    885:     ignore_css = IgnoreCSS;
                    886: 
                    887:     /* The dialog creation */
1.108     gully     888:     ThotBool created;
1.125     gully     889:     created = CreatePrintDlgWX (BasePrint + FormPrint, TtaGetViewFrame (doc, view),
1.135   ! vatton    890:                                 PPrinter,
        !           891:                                 PSfile, 
        !           892:                                 paper_format,
        !           893:                                 orientation,
        !           894:                                 disposition,
        !           895:                                 paper_print,
        !           896:                                 manual_feed,
        !           897:                                 with_toc,
        !           898:                                 with_links,
        !           899:                                 with_url,
        !           900:                                 ignore_css);
1.108     gully     901:     if (created)
                    902:       {
1.135   ! vatton    903:         TtaShowDialogue (BasePrint+FormPrint, FALSE);
1.108     gully     904:       }
                    905:   }
                    906:   
1.107     carcone   907: #endif /* _WX */
1.1       cvs       908: }
                    909: 
                    910: /*----------------------------------------------------------------------
                    911:   UpdateURLsInSubtree
                    912:   Update NAMEs and URLs in subtree of el element, to take into account
                    913:   the move from one document to another.
                    914:   If a NAME attribute already exists in the new document, it is changed
                    915:   to avoid duplicate names.
                    916:   Transform the HREF and SRC attribute to make them independent from their
                    917:   former base.
                    918:   ----------------------------------------------------------------------*/
1.99      cvs       919: void UpdateURLsInSubtree (NotifyElement *event, Element el)
1.1       cvs       920: {
1.77      cvs       921:   Element             nextEl, child;
                    922:   ElementType         elType;
                    923:   SSchema             HTMLschema;
1.1       cvs       924: 
                    925:   nextEl = TtaGetFirstChild (el);
1.82      cvs       926:   HTMLschema = TtaGetSSchema ("HTML", event->document);
1.99      cvs       927:   if (HTMLschema)
1.1       cvs       928:     {
1.99      cvs       929:       elType.ElSSchema = HTMLschema;
                    930:       while (nextEl != NULL)
1.135   ! vatton    931:         {
        !           932:           event->element = nextEl;
        !           933:           ElementPasted (event);
1.99      cvs       934:          
1.135   ! vatton    935:           /* manage included links and anchors */
        !           936:           elType.ElTypeNum = HTML_EL_Anchor;
        !           937:           child = TtaSearchTypedElement (elType, SearchInTree, nextEl);
        !           938:           while (child)
        !           939:             {
        !           940:               event->element = child;
        !           941:               ElementPasted (event);
        !           942:               child = TtaSearchTypedElementInTree (elType, SearchForward, nextEl, child);
        !           943:             }
1.99      cvs       944:          
1.135   ! vatton    945:           /* manage included links and anchors */
        !           946:           elType.ElTypeNum = HTML_EL_PICTURE_UNIT;
        !           947:           child = TtaSearchTypedElement (elType, SearchInTree, nextEl);
        !           948:           while (child)
        !           949:             {
        !           950:               event->element = child;
        !           951:               ElementPasted (event);
        !           952:               child = TtaSearchTypedElementInTree (elType, SearchForward, nextEl, child);
        !           953:             }
        !           954:           TtaNextSibling (&nextEl);
        !           955:         }
1.1       cvs       956:     }
                    957: }
                    958: 
                    959: 
                    960: /*----------------------------------------------------------------------
                    961:   MoveDocumentBody
1.58      cvs       962:   Copy the elements contained in the BODY of the document sourceDoc at the
                    963:   position of the element el in the document destDoc.
                    964:   Delete the element containing el and all its empty ancestors.
1.1       cvs       965:   If deleteTree is TRUE, copied elements are deleted from the source
                    966:   document.
1.58      cvs       967:   Return the root element that delimits the new inserted part (a div).
1.1       cvs       968:   ----------------------------------------------------------------------*/
1.80      cvs       969: static Element MoveDocumentBody (Element el, Document destDoc,
1.135   ! vatton    970:                                  Document sourceDoc, char *target,
        !           971:                                  char *url, ThotBool deleteTree)
1.1       cvs       972: {
1.58      cvs       973:   Element         root, ancestor, elem, firstInserted, div;
1.12      cvs       974:   Element          lastInserted, srce, copy, old, parent, sibling;
                    975:   ElementType     elType;
                    976:   NotifyElement    event;
1.124     vatton    977:   ThotBool         checkingMode;
1.47      cvs       978:   ThotBool         isID;
1.1       cvs       979: 
1.67      cvs       980:   div = NULL;
1.13      cvs       981:   if (target != NULL)
                    982:     {
                    983:       /* locate the target element within the source document */
1.98      vatton    984:       root = SearchNAMEattribute (sourceDoc, target, NULL, NULL);
1.13      cvs       985:       elType = TtaGetElementType (root);
1.84      cvs       986:       isID = (elType.ElTypeNum != HTML_EL_Anchor &&
1.135   ! vatton    987:               elType.ElTypeNum != HTML_EL_MAP);
1.13      cvs       988:     }
                    989:   else
                    990:     {
                    991:       isID = FALSE;
                    992:       /* get the BODY element of source document */
                    993:       root = TtaGetMainRoot (sourceDoc);
                    994:       elType = TtaGetElementType (root);
                    995:       elType.ElTypeNum = HTML_EL_BODY;
                    996:       root = TtaSearchTypedElement (elType, SearchForward, root);
                    997:     }
                    998: 
                    999:   if (root != NULL)
1.12      cvs      1000:     {
                   1001:       /* don't check the abstract tree against the structure schema */
                   1002:       checkingMode = TtaGetStructureChecking (destDoc);
1.124     vatton   1003:       TtaSetStructureChecking (FALSE, destDoc);
1.58      cvs      1004:       /* get elem, the ancestor of el which is a child of a DIV or BODY
1.135   ! vatton   1005:          element in the destination document. The copied elements will be
        !          1006:          inserted just before this element. */
1.58      cvs      1007:       elem = el;
1.12      cvs      1008:       do
1.135   ! vatton   1009:         {
        !          1010:           ancestor = TtaGetParent (elem);
        !          1011:           if (ancestor != NULL)
        !          1012:             {
        !          1013:               elType = TtaGetElementType (ancestor);
        !          1014:               if (elType.ElTypeNum == HTML_EL_BODY ||
        !          1015:                   elType.ElTypeNum == HTML_EL_Division)
        !          1016:                 ancestor = NULL;
        !          1017:               else
        !          1018:                 elem = ancestor;
        !          1019:             }
        !          1020:         }
1.12      cvs      1021:       while (ancestor != NULL);
                   1022:       parent = TtaGetParent (elem);
1.14      cvs      1023: 
                   1024:       /* insert a DIV element */
1.15      cvs      1025:       elType.ElTypeNum = HTML_EL_Division;
1.16      cvs      1026:       lastInserted = TtaNewElement (destDoc, elType);
                   1027:       TtaInsertSibling (lastInserted, elem, TRUE, destDoc);
1.58      cvs      1028:       /* this delimits the new inserted part of the document */
1.16      cvs      1029:       RegisterSubDoc (lastInserted, url);
1.76      kahan    1030:       CreateTargetAnchor (destDoc, lastInserted, FALSE, FALSE);
1.58      cvs      1031:       div = lastInserted;
1.14      cvs      1032: 
1.12      cvs      1033:       /* do copy */
1.16      cvs      1034:       firstInserted = NULL;
1.17      cvs      1035:       if (isID)
1.135   ! vatton   1036:         srce = root;
1.17      cvs      1037:       else
1.135   ! vatton   1038:         srce = TtaGetFirstChild (root);
1.12      cvs      1039:       while (srce != NULL)
1.135   ! vatton   1040:         {
        !          1041:           copy = TtaCopyTree (srce, sourceDoc, destDoc, parent);
        !          1042:           if (copy != NULL)
        !          1043:             {
        !          1044:               if (firstInserted == NULL)
        !          1045:                 /* this is the first copied element. Insert it before elem */
        !          1046:                 {
        !          1047:                   TtaInsertFirstChild (&copy, lastInserted, destDoc);
        !          1048:                   firstInserted = copy;
        !          1049:                 }
        !          1050:               else
        !          1051:                 /* insert the new copied element after the element previously
        !          1052:                    copied */
        !          1053:                 TtaInsertSibling (copy, lastInserted, FALSE, destDoc);
        !          1054:               lastInserted = copy;
        !          1055:               /* update the NAMEs and URLs in the copied element */
        !          1056:               event.event = TteElemPaste;
        !          1057:               event.document = destDoc;
        !          1058:               event.element = copy;
        !          1059:               event.elementType = TtaGetElementType (copy);
        !          1060:               event.position = sourceDoc;
        !          1061:               event.info = 0;
        !          1062:               UpdateURLsInSubtree(&event, copy);
        !          1063:             }
        !          1064:           /* get the next element in the source document */
        !          1065:           old = srce;
        !          1066:           TtaNextSibling (&srce);
        !          1067:           if (deleteTree)
        !          1068:             TtaDeleteTree (old, sourceDoc);
        !          1069:           /* Stop here if the target points to a specific element with an ID */
        !          1070:           if (isID)
        !          1071:             srce = NULL;
        !          1072:         }
1.12      cvs      1073:       
                   1074:       /* delete the element(s) containing the link to the copied document */
1.58      cvs      1075:       /* delete the parent element of el and all empty ancestors */
                   1076:       elem = TtaGetParent (el);
1.12      cvs      1077:       do
1.135   ! vatton   1078:         {
        !          1079:           sibling = elem;
        !          1080:           TtaNextSibling (&sibling);
        !          1081:           if (sibling == NULL)
        !          1082:             {
        !          1083:               sibling = elem;
        !          1084:               TtaPreviousSibling (&sibling);
        !          1085:               if (sibling == NULL)
        !          1086:                 elem = TtaGetParent (elem);
        !          1087:             }
        !          1088:         }
1.12      cvs      1089:       while (sibling == NULL);
                   1090:       TtaDeleteTree (elem, destDoc);
                   1091:       /* restore previous chacking mode */
1.124     vatton   1092:       TtaSetStructureChecking (checkingMode, destDoc);
1.12      cvs      1093:     }
1.58      cvs      1094:   /* return the address of the new division */
                   1095:   return (div);
1.1       cvs      1096: }
                   1097: 
1.29      cvs      1098: 
1.58      cvs      1099: /*----------------------------------------------------------------------
                   1100:   CloseMakeBook
                   1101:   ----------------------------------------------------------------------*/
                   1102: static void CloseMakeBook (Document document)
                   1103: {
                   1104:   ResetStop (document);
                   1105:   /* update internal links */
                   1106:   SetInternalLinks (document);
                   1107:   /* if the document changed force the browser mode */
1.128     cvs      1108:   if (SubDocs == NULL)
                   1109:     /* send a warning to the user to avoid to save this document */
                   1110:     /* remove registered  sub-documents */
                   1111:     FreeSubDocTable ();
1.58      cvs      1112:   DocBook = 0;
                   1113:   TtaSetStatus (document, 1, TtaGetMessage (AMAYA, AM_DOCUMENT_LOADED), NULL);
                   1114: }
                   1115: 
                   1116: 
                   1117: /*----------------------------------------------------------------------
                   1118:   GetIncludedDocuments_callback finishes the GetIncludedDocuments procedure
                   1119:   ----------------------------------------------------------------------*/
                   1120: void   GetIncludedDocuments_callback (int newdoc, int status, 
1.135   ! vatton   1121:                                       char *urlName,
        !          1122:                                       char *outputfile, 
        !          1123:                                       AHTHeaders *http_headers,
        !          1124:                                       void * context)
1.29      cvs      1125: {
1.58      cvs      1126:   Element              link, div;
                   1127:   IncludeCtxt          *ctx, *prev;
1.104     vatton   1128:   char                *utf8path, *ptr;
1.58      cvs      1129:   ThotBool              found = FALSE;
1.29      cvs      1130: 
                   1131:   /* restore GetIncludedDocuments's context */
1.58      cvs      1132:   ctx = (IncludeCtxt *) context;  
1.29      cvs      1133:   if (!ctx)
                   1134:     return;
                   1135: 
1.58      cvs      1136:   div = NULL;
1.29      cvs      1137:   link = ctx->link;
1.58      cvs      1138:   ptr = ctx->name;
1.104     vatton   1139:   utf8path = ctx->utf8path;
                   1140:   if (utf8path)
1.29      cvs      1141:     {
1.58      cvs      1142:       if (newdoc && newdoc != DocBook)
1.135   ! vatton   1143:         {
        !          1144:           /* it's not the DocBook itself */
        !          1145:           /* copy the target document at the position of the link */
        !          1146:           TtaSetDocumentModified (DocBook);
        !          1147:           div = MoveDocumentBody (link, DocBook, newdoc, ptr, utf8path,
        !          1148:                                   (ThotBool)(newdoc == IncludedDocument));
        !          1149:         }
1.58      cvs      1150:       /* global variables */
                   1151:       FreeDocumentResource (IncludedDocument);
                   1152:       TtaCloseDocument (IncludedDocument);
                   1153:       IncludedDocument = 0;
1.29      cvs      1154:     }
1.58      cvs      1155: 
1.104     vatton   1156:   if (div)
1.29      cvs      1157:     {
1.58      cvs      1158:       /* new starting point for the search */
                   1159:       ctx->link = div;
                   1160:       found = GetIncludedDocuments (div, div, DocBook, ctx);
1.29      cvs      1161:     }
1.104     vatton   1162: 
1.58      cvs      1163:   while (!found && ctx)
                   1164:     {
                   1165:       /* this sub-document has no more inclusion, examine the caller */
                   1166:       div = ctx->div;
                   1167:       link = ctx->link;
                   1168:       prev = ctx->ctxt;
1.104     vatton   1169:       TtaFreeMemory (utf8path);
                   1170:       utf8path = NULL;
1.58      cvs      1171:       TtaFreeMemory (ctx);
                   1172:       ctx = prev;
                   1173:       found = GetIncludedDocuments (div, link, DocBook, ctx);
                   1174:     }
                   1175:   if (!found)
                   1176:     /* all links are now managed */
                   1177:     CloseMakeBook (DocBook);
1.29      cvs      1178: }
                   1179: 
1.1       cvs      1180: /*----------------------------------------------------------------------
                   1181:   GetIncludedDocuments
1.58      cvs      1182:   Look forward within the element el, starting from element link, for a 
                   1183:   link (A) with attribute rel="chapter" or rel="subdocument" and replace
                   1184:   that link by the contents of the target document.
                   1185:   Return TRUE if one inclusion is launched.
1.1       cvs      1186:   ----------------------------------------------------------------------*/
1.96      vatton   1187: static ThotBool GetIncludedDocuments (Element el, Element link,
1.135   ! vatton   1188:                                       Document doc, IncludeCtxt *prev)
1.1       cvs      1189: {
1.58      cvs      1190:   ElementType           elType;
                   1191:   Attribute            attr;
                   1192:   AttributeType                attrType;
                   1193:   Document             newdoc;
                   1194:   IncludeCtxt          *ctx = NULL;
1.104     vatton   1195:   char                *utf8path, *ptr;
1.29      cvs      1196:   int                  length;
1.58      cvs      1197:   ThotBool              found = FALSE;
1.29      cvs      1198: 
1.58      cvs      1199:   /* look for anchors with the attribute rel within the element  el */
                   1200:   attr = NULL;
1.96      vatton   1201:   attrType.AttrSSchema = TtaGetSSchema ("HTML", doc);
1.58      cvs      1202:   elType.ElSSchema = attrType.AttrSSchema;
                   1203:   elType.ElTypeNum = HTML_EL_Anchor;
1.29      cvs      1204: 
1.58      cvs      1205:   /* Get only one included file each time */
                   1206:   while (link && attr == NULL)
1.29      cvs      1207:     {
1.58      cvs      1208:       link = TtaSearchTypedElementInTree (elType, SearchForward, el, link);
                   1209:       if (link)
1.135   ! vatton   1210:         {
        !          1211:           attrType.AttrTypeNum = HTML_ATTR_REL;
        !          1212:           attr = TtaGetAttribute (link, attrType);
        !          1213:         }
1.58      cvs      1214:       if (attr)
1.135   ! vatton   1215:         {
        !          1216:           length = TtaGetTextAttributeLength (attr);
        !          1217:           utf8path = (char *)TtaGetMemory (length + 1);
        !          1218:           TtaGiveTextAttributeValue (attr, utf8path, &length);
        !          1219:           /* Valid rel values are rel="chapter" or rel="subdocument" */
        !          1220:           if (strcasecmp (utf8path, "chapter") &&
        !          1221:               strcasecmp (utf8path, "subdocument"))
        !          1222:             attr = NULL;
        !          1223:           TtaFreeMemory (utf8path);
        !          1224:         }
1.58      cvs      1225:   
                   1226:       if (attr)
1.135   ! vatton   1227:         {
        !          1228:           /* a link with attribute rel="Chapter" has been found */
        !          1229:           attrType.AttrTypeNum = HTML_ATTR_HREF_;
        !          1230:           attr = TtaGetAttribute (link, attrType);
        !          1231:         }
1.58      cvs      1232:       if (attr)
1.135   ! vatton   1233:         /* this link has an attribute HREF */
        !          1234:         {
        !          1235:           length = TtaGetTextAttributeLength (attr);
        !          1236:           utf8path = (char *)TtaGetMemory (length + 1);
        !          1237:           TtaGiveTextAttributeValue (attr, utf8path, &length);
        !          1238:           ptr = strrchr (utf8path, '#');
        !          1239:           if (ptr)
        !          1240:             {
        !          1241:               /* link to a particular position within a document */
        !          1242:               if (ptr == utf8path)
        !          1243:                 {
        !          1244:                   /* local link */
        !          1245:                   TtaFreeMemory (utf8path);
        !          1246:                   utf8path = NULL;
        !          1247:                 }
        !          1248:               else
        !          1249:                 {
        !          1250:                   ptr[0] = EOS;
        !          1251:                   ptr = &ptr[1];
        !          1252:                 }
        !          1253:             }
1.58      cvs      1254:                  
1.135   ! vatton   1255:           if (utf8path)
        !          1256:             /* this link designates an external document */
        !          1257:             {
        !          1258:               /* create a new document and loads the target document */
        !          1259:               IncludedDocument = TtaNewDocument ("HTML", "tmp");
        !          1260:               if (IncludedDocument != 0)
        !          1261:                 {
        !          1262:                   TtaSetStatus (doc, 1, TtaGetMessage (AMAYA, AM_FETCHING), utf8path);
        !          1263:                   ctx = (IncludeCtxt *)TtaGetMemory (sizeof (IncludeCtxt));
        !          1264:                   ctx->div =  el;
        !          1265:                   ctx->link = link;
        !          1266:                   ctx->utf8path = utf8path; /* the URL of the document */
        !          1267:                   ctx->name = ptr;
        !          1268:                   ctx->ctxt = prev; /* previous context */
        !          1269:                   /* Get the reference of the calling document */
        !          1270:                   SetStopButton (doc);
        !          1271:                   newdoc = GetAmayaDoc (utf8path, NULL, IncludedDocument,
        !          1272:                                         doc, CE_MAKEBOOK, FALSE, 
        !          1273:                                         (void (*)(int, int, char*, char*, const AHTHeaders*, void*)) GetIncludedDocuments_callback,
        !          1274:                                         (void *) ctx);
        !          1275:                   found = TRUE;
        !          1276:                 }
        !          1277:             }
        !          1278:           else
        !          1279:             TtaFreeMemory (utf8path);
        !          1280:         }
1.29      cvs      1281:     }
1.58      cvs      1282:   return (found);
1.1       cvs      1283: }
                   1284: 
                   1285: 
                   1286: /*----------------------------------------------------------------------
                   1287:   MakeBook
                   1288:   Replace all links in a document which have an attribute REL="chapter"
1.5       cvs      1289:   or REL="subdocument" by the corresponding target document.
1.1       cvs      1290:   ----------------------------------------------------------------------*/
1.96      vatton   1291: void MakeBook (Document doc, View view)
1.1       cvs      1292: {
1.58      cvs      1293:   Element          root, body;
                   1294:   ElementType      elType;
1.1       cvs      1295: 
1.58      cvs      1296:   /* stops all current transfers on this document */
1.96      vatton   1297:   StopTransfer (doc, 1);
1.58      cvs      1298:   /* simulate a transfert in the main document */
1.96      vatton   1299:   DocBook = doc;
1.58      cvs      1300:   IncludedDocument = 0;
1.96      vatton   1301:   root = TtaGetMainRoot (doc);
1.58      cvs      1302:   elType = TtaGetElementType (root);
                   1303:   elType.ElTypeNum = HTML_EL_BODY;
                   1304:   body = TtaSearchTypedElement (elType, SearchForward, root);
1.29      cvs      1305: 
1.58      cvs      1306:   if (body)
1.96      vatton   1307:     GetIncludedDocuments (body, body, doc, NULL);
1.1       cvs      1308: }
1.105     vatton   1309: 
                   1310: /*----------------------------------------------------------------------
                   1311:   ----------------------------------------------------------------------*/
                   1312: void ReadAsUTF_8 (Document doc, View view)
                   1313: {
                   1314:   ReparseAs (doc, view, FALSE, UTF_8);
                   1315: }
                   1316: 
                   1317: /*----------------------------------------------------------------------
                   1318:   ----------------------------------------------------------------------*/
                   1319: void ReadAsISO_8859_1 (Document doc, View view)
                   1320: {
                   1321:   ReparseAs (doc, view, FALSE, ISO_8859_1);
                   1322: }
                   1323: 
                   1324: /*----------------------------------------------------------------------
                   1325:   ----------------------------------------------------------------------*/
                   1326: void ReadAsISO_8859_2 (Document doc, View view)
                   1327: {
                   1328:   ReparseAs (doc, view, FALSE, ISO_8859_2);
                   1329: }
                   1330: 
                   1331: /*----------------------------------------------------------------------
                   1332:   ----------------------------------------------------------------------*/
                   1333: void ReadAsISO_8859_3 (Document doc, View view)
                   1334: {
                   1335:   ReparseAs (doc, view, FALSE, ISO_8859_3);
                   1336: }
                   1337: 
                   1338: /*----------------------------------------------------------------------
                   1339:   ----------------------------------------------------------------------*/
                   1340: void ReadAsISO_8859_4 (Document doc, View view)
                   1341: {
                   1342:   ReparseAs (doc, view, FALSE, ISO_8859_4);
                   1343: }
                   1344: 
                   1345: /*----------------------------------------------------------------------
                   1346:   ----------------------------------------------------------------------*/
                   1347: void ReadAsISO_8859_5 (Document doc, View view)
                   1348: {
                   1349:   ReparseAs (doc, view, FALSE, ISO_8859_5);
                   1350: }
                   1351: 
                   1352: /*----------------------------------------------------------------------
                   1353:   ----------------------------------------------------------------------*/
                   1354: void ReadAsISO_8859_6 (Document doc, View view)
                   1355: {
                   1356:   ReparseAs (doc, view, FALSE, ISO_8859_6);
                   1357: }
                   1358: 
                   1359: /*----------------------------------------------------------------------
                   1360:   ----------------------------------------------------------------------*/
                   1361: void ReadAsISO_8859_7 (Document doc, View view)
                   1362: {
                   1363:   ReparseAs (doc, view, FALSE, ISO_8859_7);
                   1364: }
                   1365: 
                   1366: /*----------------------------------------------------------------------
                   1367:   ----------------------------------------------------------------------*/
                   1368: void ReadAsISO_8859_8 (Document doc, View view)
                   1369: {
                   1370:   ReparseAs (doc, view, FALSE, ISO_8859_8);
                   1371: }
                   1372: 
                   1373: /*----------------------------------------------------------------------
                   1374:   ----------------------------------------------------------------------*/
                   1375: void ReadAsISO_8859_9 (Document doc, View view)
                   1376: {
                   1377:   ReparseAs (doc, view, FALSE, ISO_8859_9);
                   1378: }
                   1379: 
                   1380: /*----------------------------------------------------------------------
                   1381:   ----------------------------------------------------------------------*/
                   1382: void ReadAsISO_8859_15 (Document doc, View view)
                   1383: {
                   1384:   ReparseAs (doc, view, FALSE, ISO_8859_15);
                   1385: }
                   1386: 
                   1387: /*----------------------------------------------------------------------
                   1388:   ----------------------------------------------------------------------*/
                   1389: void ReadAsKOI8_R (Document doc, View view)
                   1390: {
                   1391:   ReparseAs (doc, view, FALSE, KOI8_R);
                   1392: }
                   1393: 
                   1394: /*----------------------------------------------------------------------
                   1395:   ----------------------------------------------------------------------*/
                   1396: void ReadAsWINDOWS_1250 (Document doc, View view)
                   1397: {
                   1398:   ReparseAs (doc, view, FALSE, WINDOWS_1250);
                   1399: }
                   1400: 
                   1401: /*----------------------------------------------------------------------
                   1402:   ----------------------------------------------------------------------*/
                   1403: void ReadAsWINDOWS_1251 (Document doc, View view)
                   1404: {
                   1405:   ReparseAs (doc, view, FALSE, WINDOWS_1251);
                   1406: }
                   1407: 
                   1408: /*----------------------------------------------------------------------
                   1409:   ----------------------------------------------------------------------*/
                   1410: void ReadAsWINDOWS_1252 (Document doc, View view)
                   1411: {
                   1412:   ReparseAs (doc, view, FALSE, WINDOWS_1252);
                   1413: }
                   1414: 
                   1415: /*----------------------------------------------------------------------
                   1416:   ----------------------------------------------------------------------*/
                   1417: void ReadAsWINDOWS_1253 (Document doc, View view)
                   1418: {
                   1419:   ReparseAs (doc, view, FALSE, WINDOWS_1253);
                   1420: }
                   1421: 
                   1422: /*----------------------------------------------------------------------
                   1423:   ----------------------------------------------------------------------*/
                   1424: void ReadAsWINDOWS_1254 (Document doc, View view)
                   1425: {
                   1426:   ReparseAs (doc, view, FALSE, WINDOWS_1254);
                   1427: }
                   1428: 
                   1429: /*----------------------------------------------------------------------
                   1430:   ----------------------------------------------------------------------*/
                   1431: void ReadAsWINDOWS_1255 (Document doc, View view)
                   1432: {
                   1433:   ReparseAs (doc, view, FALSE, WINDOWS_1255);
                   1434: }
                   1435: 
                   1436: /*----------------------------------------------------------------------
                   1437:   ----------------------------------------------------------------------*/
                   1438: void ReadAsWINDOWS_1256 (Document doc, View view)
                   1439: {
                   1440:   ReparseAs (doc, view, FALSE, WINDOWS_1256);
                   1441: }
                   1442: 
                   1443: /*----------------------------------------------------------------------
                   1444:   ----------------------------------------------------------------------*/
                   1445: void ReadAsWINDOWS_1257 (Document doc, View view)
                   1446: {
                   1447:   ReparseAs (doc, view, FALSE, WINDOWS_1257);
                   1448: }
                   1449: 
                   1450: /*----------------------------------------------------------------------
                   1451:   ----------------------------------------------------------------------*/
1.134     vatton   1452: void ReadAsGB_2312 (Document doc, View view)
                   1453: {
                   1454:   ReparseAs (doc, view, FALSE, GB_2312);
                   1455: }
                   1456: 
                   1457: /*----------------------------------------------------------------------
                   1458:   ----------------------------------------------------------------------*/
1.105     vatton   1459: void ReadAsISO_2022_JP (Document doc, View view)
                   1460: {
                   1461:   ReparseAs (doc, view, FALSE, ISO_2022_JP);
                   1462: }
                   1463: 
                   1464: /*----------------------------------------------------------------------
                   1465:   ----------------------------------------------------------------------*/
                   1466: void ReadAsEUC_JP (Document doc, View view)
                   1467: {
                   1468:   ReparseAs (doc, view, FALSE, EUC_JP);
                   1469: }
                   1470: 
                   1471: /*----------------------------------------------------------------------
                   1472:   ----------------------------------------------------------------------*/
                   1473: void ReadAsSHIFT_JIS (Document doc, View view)
                   1474: {
                   1475:   ReparseAs (doc, view, FALSE, SHIFT_JIS);
                   1476: }
1.114     vatton   1477: 
                   1478: /*----------------------------------------------------------------------
1.119     vatton   1479:   SectionNumbering generates numbers for all HTML Hi elements after
                   1480:   the current position.
                   1481:   ----------------------------------------------------------------------*/
                   1482: void SectionNumbering (Document doc, View view)
                   1483: {
1.120     vatton   1484:   Element             el, new_, child;
                   1485:   DisplayMode         dispMode;
                   1486:   SSchema             HTMLschema;
                   1487:   ElementType         elType, childType, searchedType1, searchedType2;
                   1488:   ElementType         searchedType3, searchedType4, searchedType5;
                   1489:   Language            lang;
                   1490:   char                s[MAX_LENGTH], n[20], *text;
                   1491:   int                 nH2, nH3, nH4, nH5, nH6, length, i;
1.123     vatton   1492:   ThotBool            closeUndo, change = FALSE;
1.120     vatton   1493: 
                   1494:   /* check if there is HTML Hi elements and if the current position is
1.135   ! vatton   1495:      within a HTML Body element */
1.120     vatton   1496:   dispMode = TtaGetDisplayMode (doc);
                   1497: 
                   1498:   /* check if there is any HTML element within the document */
                   1499:   HTMLschema = TtaGetSSchema ("HTML", doc);
                   1500:   if (HTMLschema == NULL)
                   1501:     /* no HTML element */
                   1502:     return;
                   1503: 
                   1504:   if (TtaPrepareUndo (doc))
1.135   ! vatton   1505:     closeUndo = FALSE;
1.120     vatton   1506:   else
                   1507:     {
                   1508:       closeUndo = TRUE;
                   1509:       TtaOpenUndoSequence (doc, NULL, NULL, 0, 0);
                   1510:     }
                   1511: 
                   1512:   el = TtaGetMainRoot (doc);
                   1513:   searchedType1.ElSSchema = HTMLschema;
                   1514:   searchedType1.ElTypeNum = HTML_EL_H2;
                   1515:   searchedType2.ElSSchema = HTMLschema;
                   1516:   searchedType2.ElTypeNum = HTML_EL_H3;
                   1517:   searchedType3.ElSSchema = HTMLschema;
                   1518:   searchedType3.ElTypeNum = HTML_EL_H4;
                   1519:   searchedType4.ElSSchema = HTMLschema;
                   1520:   searchedType4.ElTypeNum = HTML_EL_H5;
                   1521:   searchedType5.ElSSchema = HTMLschema;
                   1522:   searchedType5.ElTypeNum = HTML_EL_H6;
                   1523:   nH2 = nH3 = nH4 = nH5 = nH6 = 0;
                   1524:   while (el)
                   1525:     {
                   1526:       el = TtaSearchElementAmong5Types (searchedType1, searchedType2,
1.135   ! vatton   1527:                                         searchedType3, searchedType4,
        !          1528:                                         searchedType5, SearchForward, el);
1.120     vatton   1529:       if (el)
1.135   ! vatton   1530:         {
        !          1531:           /* generate the text number */
        !          1532:           elType = TtaGetElementType (el);
        !          1533:           s[0] = EOS;
        !          1534:           switch (elType.ElTypeNum)
        !          1535:             {
        !          1536:             case HTML_EL_H2:
        !          1537:               nH2++;
        !          1538:               nH3 = nH4 = nH5 = nH6 = 0;
        !          1539:               sprintf (s, "%d.", nH2);
        !          1540:               break;
        !          1541:             case HTML_EL_H3:
        !          1542:               nH3++;
        !          1543:               nH4 = nH5 = nH6 = 0;
        !          1544:               if (nH2)
        !          1545:                 sprintf (s, "%d.", nH2);
        !          1546:               sprintf (n, "%d.", nH3);
        !          1547:               strcat (s, n);
        !          1548:               break;
        !          1549:             case HTML_EL_H4:
        !          1550:               nH4++;
        !          1551:               nH5 = nH6 = 0;
        !          1552:               if (nH2)
        !          1553:                 sprintf (s, "%d.", nH2);
        !          1554:               if (nH3)
        !          1555:                 {
        !          1556:                   sprintf (n, "%d.", nH3);
        !          1557:                   strcat (s, n);
        !          1558:                 }
        !          1559:               sprintf (n, "%d.", nH4);
        !          1560:               strcat (s, n);
        !          1561:               break;
        !          1562:             case HTML_EL_H5:
        !          1563:               nH5++;
        !          1564:               nH6 = 0;
        !          1565:               if (nH2)
        !          1566:                 sprintf (s, "%d.", nH2);
        !          1567:               if (nH3)
        !          1568:                 {
        !          1569:                   sprintf (n, "%d.", nH3);
        !          1570:                   strcat (s, n);
        !          1571:                 }
        !          1572:               if (nH4)
        !          1573:                 {
        !          1574:                   sprintf (n, "%d.", nH4);
        !          1575:                   strcat (s, n);
        !          1576:                 }
        !          1577:               sprintf (n, "%d.", nH5);
        !          1578:               strcat (s, n);
        !          1579:               break;
        !          1580:             case HTML_EL_H6:
        !          1581:               nH6++;
        !          1582:               if (nH2)
        !          1583:                 sprintf (s, "%d.", nH2);
        !          1584:               if (nH3)
        !          1585:                 {
        !          1586:                   sprintf (n, "%d.", nH3);
        !          1587:                   strcat (s, n);
        !          1588:                 }
        !          1589:               if (nH4)
        !          1590:                 {
        !          1591:                   sprintf (n, "%d.", nH4);
        !          1592:                   strcat (s, n);
        !          1593:                 }
        !          1594:               if (nH5)
        !          1595:                 {
        !          1596:                   sprintf (n, "%d.", nH5);
        !          1597:                   strcat (s, n);
        !          1598:                 }
        !          1599:               sprintf (n, "%d.", nH6);
        !          1600:               strcat (s, n);
        !          1601:               break;
        !          1602:             default: break;
        !          1603:             }
        !          1604:           strcat (s, " ");
        !          1605: 
        !          1606:           /* look for the first leaf child */
        !          1607:           child = el;
        !          1608:           if (child)
        !          1609:             {
        !          1610:               do
        !          1611:                 {
        !          1612:                   child = TtaGetFirstChild (child);
        !          1613:                   childType = TtaGetElementType (child);
        !          1614:                 }
        !          1615:               while (!TtaIsLeaf (childType) && childType.ElSSchema == HTMLschema);
        !          1616:             }
        !          1617:           if (child && childType.ElSSchema == HTMLschema &&
        !          1618:               childType.ElTypeNum == HTML_EL_TEXT_UNIT)
        !          1619:             {
        !          1620:               /* the first leaf child is a text unit */
        !          1621:               new_ = NULL;
        !          1622:               /* check the text contents */
        !          1623:               length = TtaGetTextLength (child) + 1;
        !          1624:               text = (char *)TtaGetMemory (length);
        !          1625:               TtaGiveTextContent (child, (unsigned char *)text, &length, &lang);
        !          1626:               /* remove the old number */
        !          1627:               i = 0;
        !          1628:               while (isdigit (text[i]) || text[i] == '.')
        !          1629:                 i++;
        !          1630:               TtaRegisterElementReplace (child, doc);
        !          1631:               TtaSetTextContent (child, (unsigned char *)s, Latin_Script, doc);
        !          1632:               TtaAppendTextContent (child, (unsigned char *)&text[i], doc);
        !          1633:               TtaFreeMemory (text);
        !          1634:               change = TRUE;
        !          1635:             }
        !          1636:           else
        !          1637:             {
        !          1638:               /* add a new text element */
        !          1639:               elType.ElTypeNum = HTML_EL_TEXT_UNIT;
        !          1640:               new_ = TtaNewElement (doc, elType);
        !          1641:               if (child)
        !          1642:                 /* insert before */
        !          1643:                 TtaInsertSibling (new_, child, TRUE, doc);
        !          1644:               else
        !          1645:                 TtaInsertFirstChild (&new_, el, doc);
        !          1646:               TtaSetTextContent (new_, (unsigned char *)s, Latin_Script, doc);
        !          1647:               TtaRegisterElementCreate (new_, doc);
        !          1648:               change = TRUE;
        !          1649:             }
        !          1650:         }
1.120     vatton   1651:     }
                   1652: 
                   1653:   if (closeUndo)
                   1654:     TtaCloseUndoSequence (doc);
                   1655:   if (dispMode == DisplayImmediately)
                   1656:     TtaSetDisplayMode (doc, dispMode);
1.123     vatton   1657:   if (change)
                   1658:     TtaSetDocumentModified (doc);
1.119     vatton   1659: }
                   1660: 
                   1661: /*----------------------------------------------------------------------
1.114     vatton   1662:   MakeToC generates a Table of Contents at the current position.
                   1663:   Looks for all HTML Hi elements after the current position.
                   1664:   ----------------------------------------------------------------------*/
                   1665: void MakeToc (Document doc, View view)
                   1666: {
                   1667:   Element             el, new_, *list, parent, copy, srce, child, prev;
                   1668:   Element             toc, lH2, lH3, lH4, lH5, lH6, item;
                   1669:   ElementType         elType, searchedType1, searchedType2;
                   1670:   ElementType         searchedType3, searchedType4, searchedType5;
                   1671:   ElementType         ulType, copyType;
                   1672:   AttributeType       attrType;
                   1673:   Attribute           attr;
                   1674:   DisplayMode         dispMode;
                   1675:   char               *s, *id;
                   1676:   int                 firstChar, i;
                   1677:   ThotBool            closeUndo;
                   1678: 
                   1679:   /* check if there is HTML Hi elements and if the current position is
1.135   ! vatton   1680:      within a HTML Body element */
1.114     vatton   1681:   dispMode = TtaGetDisplayMode (doc);
                   1682: 
                   1683:   /* get the insert point */
                   1684:   TtaGiveFirstSelectedElement (doc, &el, &firstChar, &i);
                   1685:   if (el == NULL || TtaIsReadOnly (el))
1.117     vatton   1686:     {
                   1687:       /* no selection */
                   1688:       TtaDisplaySimpleMessage (CONFIRM, AMAYA, AM_NO_INSERT_POINT);
1.135   ! vatton   1689:       return;
1.117     vatton   1690:     }
1.114     vatton   1691:   elType = TtaGetElementType (el);
                   1692:   s = TtaGetSSchemaName (elType.ElSSchema);
                   1693:   if (strcmp (s, "HTML"))
                   1694:     /* not within HTML element */
                   1695:     return;
                   1696:   if (!HTMLelementAllowed (doc))
                   1697:     /* the creation of an HTML element is not allowed here */
                   1698:     return;
                   1699: 
                   1700:   if (dispMode == DisplayImmediately)
                   1701:     TtaSetDisplayMode (doc, SuspendDisplay);
                   1702: 
                   1703:   if (TtaPrepareUndo (doc))
1.135   ! vatton   1704:     closeUndo = FALSE;
1.114     vatton   1705:   else
                   1706:     {
                   1707:       closeUndo = TRUE;
                   1708:       TtaOpenUndoSequence (doc, NULL, NULL, 0, 0);
                   1709:     }
                   1710: 
                   1711:   attrType.AttrSSchema = elType.ElSSchema;
                   1712:   ulType.ElSSchema = elType.ElSSchema;
1.115     vatton   1713:   ulType.ElTypeNum = HTML_EL_Unnumbered_List;
1.114     vatton   1714:   searchedType1.ElSSchema = elType.ElSSchema;
                   1715:   searchedType1.ElTypeNum = HTML_EL_H2;
                   1716:   searchedType2.ElSSchema = elType.ElSSchema;
                   1717:   searchedType2.ElTypeNum = HTML_EL_H3;
                   1718:   searchedType3.ElSSchema = elType.ElSSchema;
                   1719:   searchedType3.ElTypeNum = HTML_EL_H4;
                   1720:   searchedType4.ElSSchema = elType.ElSSchema;
                   1721:   searchedType4.ElTypeNum = HTML_EL_H5;
                   1722:   searchedType5.ElSSchema = elType.ElSSchema;
                   1723:   searchedType5.ElTypeNum = HTML_EL_H6;
1.115     vatton   1724:   toc = lH2 = lH3 = lH4 = lH5 = lH6 = prev = NULL;
1.114     vatton   1725:   list = NULL;
                   1726:   while (el)
                   1727:     {
                   1728:       el = TtaSearchElementAmong5Types (searchedType1, searchedType2,
1.135   ! vatton   1729:                                         searchedType3, searchedType4,
        !          1730:                                         searchedType5, SearchForward, el);
1.114     vatton   1731:       if (el)
1.135   ! vatton   1732:         {
        !          1733:           if (toc == NULL)
        !          1734:             {
        !          1735:               /* genetate the enclosing division */
        !          1736:               elType.ElTypeNum = HTML_EL_Division;
        !          1737:               TtaCreateElement (elType, doc);
        !          1738:               TtaGiveFirstSelectedElement (doc, &child, &firstChar, &i);
        !          1739:               toc = TtaGetTypedAncestor (child, elType);
        !          1740:               TtaRegisterElementDelete (child, doc);
        !          1741:               TtaRemoveTree (child, doc);
        !          1742:               if (toc)
        !          1743:                 {
        !          1744:                   /* it's the last created element */
        !          1745:                   attrType.AttrTypeNum = HTML_ATTR_Class;
        !          1746:                   attr = TtaNewAttribute (attrType);
        !          1747:                   TtaAttachAttribute (toc, attr, doc);
        !          1748:                   TtaSetAttributeText (attr, "toc", toc, doc);
        !          1749:                   TtaRegisterAttributeCreate (attr, toc, doc);
        !          1750:                 }
        !          1751:             }
        !          1752:           if (toc == NULL)
        !          1753:             el = NULL;
        !          1754:           else
        !          1755:             {
        !          1756:               /* does the element have an ID attribute already? */
        !          1757:               attrType.AttrTypeNum = HTML_ATTR_ID;
        !          1758:               attr = TtaGetAttribute (el, attrType);
        !          1759:               if (!attr)
        !          1760:                 {
        !          1761:                   /* generate the ID if it does't exist */
        !          1762:                   CreateTargetAnchor (doc, el, TRUE, TRUE);
        !          1763:                   attr = TtaGetAttribute (el, attrType);
        !          1764:                 }
        !          1765:               i = TtaGetTextAttributeLength (attr) + 1;
        !          1766:               id = (char *)TtaGetMemory (i + 1);
        !          1767:               id[0] = '#';
        !          1768:               TtaGiveTextAttributeValue (attr, &id[1], &i);
1.114     vatton   1769:              
1.135   ! vatton   1770:               /* locate or generate the list */
        !          1771:               elType = TtaGetElementType (el);
        !          1772:               if (elType.ElTypeNum == HTML_EL_H2)
        !          1773:                 {
        !          1774:                   parent = toc;
        !          1775:                   lH3 = lH4 = lH5 = lH6 = NULL;
        !          1776:                   list = &lH2;
        !          1777:                 }
        !          1778:               else if (elType.ElTypeNum == HTML_EL_H3)
        !          1779:                 {
        !          1780:                   if (lH2)
        !          1781:                     parent = TtaGetLastChild (lH2);
        !          1782:                   else
        !          1783:                     parent = toc;
        !          1784:                   lH4 = lH5 = lH6 = NULL;
        !          1785:                   list = &lH3;
        !          1786:                 }
        !          1787:               else if (elType.ElTypeNum == HTML_EL_H4)
        !          1788:                 {
        !          1789:                   if (lH3)
        !          1790:                     parent =  TtaGetLastChild (lH3);
        !          1791:                   else if (lH2)
        !          1792:                     parent =  TtaGetLastChild (lH2);
        !          1793:                   else
        !          1794:                     parent = toc;
        !          1795:                   lH5 = lH6 = NULL;
        !          1796:                   list = &lH4;
        !          1797:                 }
        !          1798:               else if (elType.ElTypeNum == HTML_EL_H5)
        !          1799:                 {
        !          1800:                   if (lH4)
        !          1801:                     parent =  TtaGetLastChild (lH4);
        !          1802:                   else if (lH3)
        !          1803:                     parent =  TtaGetLastChild (lH3);
        !          1804:                   else if (lH2)
        !          1805:                     parent =  TtaGetLastChild (lH2);
        !          1806:                   else
        !          1807:                     parent = toc;
        !          1808:                   lH6 = NULL;
        !          1809:                   list = &lH5;
        !          1810:                 }
        !          1811:               else if (elType.ElTypeNum == HTML_EL_H6)
        !          1812:                 {
        !          1813:                   if (lH5)
        !          1814:                     parent =  TtaGetLastChild (lH5);
        !          1815:                   else if (lH4)
        !          1816:                     parent =  TtaGetLastChild (lH4);
        !          1817:                   else if (lH3)
        !          1818:                     parent =  TtaGetLastChild (lH3);
        !          1819:                   else if (lH2)
        !          1820:                     parent =  TtaGetLastChild (lH2);
        !          1821:                   else
        !          1822:                     parent = toc;
        !          1823:                   list = &lH6;
        !          1824:                 }
        !          1825: 
        !          1826:               if (*list == NULL)
        !          1827:                 {
        !          1828:                   /* generate the list */
        !          1829:                   *list = TtaNewElement (doc, ulType);
        !          1830:                   child = TtaGetLastChild (parent);
        !          1831:                   if (child)
        !          1832:                     TtaInsertSibling (*list, child, FALSE, doc);
        !          1833:                   else
        !          1834:                     TtaInsertFirstChild (list, parent, doc);
        !          1835:                   TtaRegisterElementCreate (*list, doc);
        !          1836:                 }
        !          1837:               /* generate the list item */
        !          1838:               elType.ElTypeNum = HTML_EL_List_Item;
        !          1839:               item = TtaNewElement (doc, elType);
        !          1840:               /* generate the HTML_EL_Pseudo_paragraph */
        !          1841:               elType.ElTypeNum =  HTML_EL_Pseudo_paragraph;
        !          1842:               parent = TtaNewElement (doc, elType);
        !          1843:               TtaInsertFirstChild (&parent, item, doc);
        !          1844:               /* generate the link anchor */
        !          1845:               elType.ElTypeNum = HTML_EL_Anchor;
        !          1846:               new_ = TtaNewElement (doc, elType);
        !          1847:               TtaInsertFirstChild (&new_, parent, doc);
        !          1848:               attrType.AttrTypeNum = HTML_ATTR_HREF_;
        !          1849:               attr = TtaNewAttribute (attrType);
        !          1850:               TtaAttachAttribute (new_, attr, doc);
        !          1851:               TtaSetAttributeText (attr, id, new_, doc);
        !          1852:               TtaFreeMemory (id);
        !          1853:               id = NULL;
        !          1854:               /* get a copy of the Hi contents */
        !          1855:               srce = TtaGetFirstChild (el);
        !          1856:               prev = NULL;
        !          1857:               parent = NULL;
        !          1858:               while (srce)
        !          1859:                 {
        !          1860:                   copyType = TtaGetElementType (srce);
        !          1861:                   if (copyType.ElTypeNum == HTML_EL_Anchor &&
        !          1862:                       copyType.ElSSchema == elType.ElSSchema)
        !          1863:                     {
        !          1864:                       /* copy the anchor contents instead of the anchor */
        !          1865:                       parent = srce;
        !          1866:                       srce = TtaGetFirstChild (parent);
        !          1867:                     }
        !          1868:                   if (srce)
        !          1869:                     {
        !          1870:                       /* copy children of the next source */
        !          1871:                       copy = TtaCopyTree (srce, doc, doc, new_);
        !          1872:                       if (copy)
        !          1873:                         {
        !          1874:                           if (prev == NULL)
        !          1875:                             /* this is the first copied element. Insert it before elem */
        !          1876:                             TtaInsertFirstChild (&copy, new_, doc);
        !          1877:                           else
        !          1878:                             /* insert the new copied element after the element previously
        !          1879:                                copied */
        !          1880:                             TtaInsertSibling (copy, prev, FALSE, doc);
        !          1881:                           prev = copy;
        !          1882:                         }
        !          1883:                       TtaNextSibling (&srce);
        !          1884:                     }
        !          1885:                   if (srce == NULL && parent)
        !          1886:                     {
        !          1887:                       /* copy children of an anchor */
        !          1888:                       srce = parent;
        !          1889:                       parent = NULL;
        !          1890:                       if (srce)
        !          1891:                         TtaNextSibling (&srce);
        !          1892:                     }
        !          1893:                 }
        !          1894:               child = TtaGetLastChild (*list);
        !          1895:               if (child)
        !          1896:                 TtaInsertSibling (item, child, FALSE, doc);
        !          1897:               else
        !          1898:                 TtaInsertFirstChild (&item, *list, doc);
        !          1899:               TtaRegisterElementCreate (item, doc);
        !          1900:             }
        !          1901:         }
1.114     vatton   1902:     }
                   1903: 
                   1904:   if (closeUndo)
                   1905:     TtaCloseUndoSequence (doc);
1.135   ! vatton   1906:   /* force a complete redisplay to apply CSS */
        !          1907:   TtaSetDisplayMode (doc, NoComputedDisplay);
1.114     vatton   1908:   if (dispMode == DisplayImmediately)
                   1909:     TtaSetDisplayMode (doc, dispMode);
1.115     vatton   1910:   /* select the end of the toc */
                   1911:   if (prev)
                   1912:     {
                   1913:       child = prev;
                   1914:       while (child)
1.135   ! vatton   1915:         {
        !          1916:           child = TtaGetLastChild (prev);
        !          1917:           if (child)
        !          1918:             prev = child;
        !          1919:         }
1.115     vatton   1920:       elType = TtaGetElementType (prev);
                   1921:       if (elType.ElTypeNum == HTML_EL_TEXT_UNIT)
1.135   ! vatton   1922:         {
        !          1923:           i = TtaGetElementVolume (prev);
        !          1924:           TtaSelectString (doc, prev, i+1, i);
        !          1925:         }
1.115     vatton   1926:       else
1.135   ! vatton   1927:         TtaSelectElement (doc, prev);
1.115     vatton   1928:     }
1.114     vatton   1929: }

Webmaster