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 (©, 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 (©, 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