Return to HTMLbook.c CVS log | Up to [Public] / Amaya / amaya |
1.1 cvs 1: /* 2: * 3: * (c) COPYRIGHT MIT and INRIA, 1996. 4: * Please first read the full copyright statement in file COPYRIGHT. 5: * 6: */ 7: 8: /* 9: * Initialization functions and button functions of Amaya application. 10: * 11: * Authors: V. Quint, I. Vatton 1.49 cvs 12: * R. Guetari (W3C/INRIA) - Unicode and Windows version. 1.1 cvs 13: */ 14: 15: 16: /* Included headerfiles */ 17: #define THOT_EXPORT 18: #include "amaya.h" 1.44 cvs 19: #include "AHTURLTools_f.h" 1.1 cvs 20: #include "print.h" 1.51 ! cvs 21: #include "css.h" 1.1 cvs 22: 23: #define NumFormPrint 1 24: #define NumMenuOptions 2 25: #define NumMenuPaperFormat 3 26: #define NumMenuSupport 4 27: #define NumZonePrinterName 5 28: #define PRINT_MAX_REF 6 29: 1.25 cvs 30: /* structure to register sub-documents in MakeBook function*/ 31: typedef struct _SubDoc 32: { 33: struct _SubDoc *SDnext; 34: Element SDel; 1.36 cvs 35: STRING SDname; 1.25 cvs 36: }SubDoc; 37: 1.29 cvs 38: /* the structure used for the GetIncludedDocuments_callback function */ 39: typedef struct _GetIncludedDocuments_context { 40: Element link, next; 41: Attribute RelAttr, HrefAttr; 1.36 cvs 42: STRING url, ptr, text; 1.29 cvs 43: Document document; 44: } GetIncludedDocuments_context; 45: 1.25 cvs 46: static struct _SubDoc *SubDocs; 1.2 cvs 47: static int PaperPrint; 48: static int ManualFeed; 49: static int PageSize; 1.50 cvs 50: static CHAR_T PSdir[MAX_PATH]; 51: static CHAR_T pPrinter[MAX_PATH]; 1.1 cvs 52: static Document docPrint; 1.47 cvs 53: static ThotBool numberLinks; 54: static ThotBool withToC; 55: static ThotBool printURL; 1.1 cvs 56: static int basePrint; 57: 58: #include "init_f.h" 59: #include "HTMLactions_f.h" 60: #include "HTMLbook_f.h" 61: #include "HTMLedit_f.h" 1.25 cvs 62: #include "HTMLhistory_f.h" 1.51 ! cvs 63: #include "UIcss_f.h" 1.1 cvs 64: 1.31 cvs 65: #ifdef _WINDOWS 1.37 cvs 66: #include "wininclude.h" 1.31 cvs 67: #endif /* _WINDOWS */ 68: 1.29 cvs 69: /*----------------------------------------------------------------------- 70: Function prototypes 71: ----------------------------------------------------------------------*/ 72: #ifdef __STDC__ 73: static void GetIncludedDocuments (Element el, Document document); 74: void MakeBook_callback (Document document); 75: #else 76: static void GetIncludedDocuments (/* el, document */); 77: void MakeBook_callback (/* Document document */); 78: #endif 1.1 cvs 79: 80: /*---------------------------------------------------------------------- 1.16 cvs 81: RegisterSubDoc adds a new entry in SubDoc table. 82: ----------------------------------------------------------------------*/ 83: #ifdef __STDC__ 1.36 cvs 84: static void RegisterSubDoc (Element el, STRING url) 1.16 cvs 85: #else 86: static void RegisterSubDoc (el, url) 87: Element el; 1.36 cvs 88: STRING url; 1.16 cvs 89: #endif 90: { 91: struct _SubDoc *entry, *last; 92: 93: if (url == NULL || url[0] == EOS) 94: return; 95: 96: entry = TtaGetMemory (sizeof (struct _SubDoc)); 97: entry->SDnext = NULL; 98: entry->SDel = el; 99: entry->SDname = TtaStrdup (url); 100: 101: if (SubDocs == NULL) 102: SubDocs = entry; 103: else 104: { 105: last = SubDocs; 106: while (last->SDnext != NULL) 107: last = last->SDnext; 108: last->SDnext = entry; 109: } 110: } 111: 112: 113: /*---------------------------------------------------------------------- 114: SearchSubDoc searches whether a document name is registered or not 115: within the SubDoc table. 116: Return the DIV element that correspond to the sub-document or NULL. 117: ----------------------------------------------------------------------*/ 118: #ifdef __STDC__ 1.36 cvs 119: static Element SearchSubDoc (STRING url) 1.16 cvs 120: #else 121: static Element SearchSubDoc (url) 1.36 cvs 122: STRING url; 1.16 cvs 123: #endif 124: { 125: Element el; 126: struct _SubDoc *entry; 1.47 cvs 127: ThotBool docFound; 1.16 cvs 128: 129: if (url == NULL || url[0] == EOS) 130: return (NULL); 131: 132: entry = SubDocs; 133: docFound = FALSE; 134: el = NULL; 135: while (!docFound && entry != NULL) 136: { 1.36 cvs 137: docFound = (ustrcmp (url, entry->SDname) == 0); 1.16 cvs 138: if (!docFound) 139: entry = entry->SDnext; 140: else 141: /* document found -> return the DIV element */ 142: el = entry->SDel; 143: } 144: return (el); 145: } 146: 147: /*---------------------------------------------------------------------- 148: FreeSubDocTable frees all entries in SubDoc table. 149: ----------------------------------------------------------------------*/ 150: static void FreeSubDocTable () 151: { 152: struct _SubDoc *entry, *last; 153: 154: entry = SubDocs; 155: while (entry != NULL) 156: { 157: last = entry; 158: entry = entry->SDnext; 159: TtaFreeMemory (last->SDname); 160: TtaFreeMemory (last); 161: } 162: SubDocs = NULL; 163: } 164: 165: 166: 167: /*---------------------------------------------------------------------- 1.1 cvs 168: SetInternalLinks 1.8 cvs 169: Associate an InternalLink attribute with all anchor (A) elements of the 170: document which designate an element in the same document. 1.1 cvs 171: InternalLink is a Thot reference attribute that links a source and a 172: target anchor and that allows P schemas to display and print cross-references 173: ----------------------------------------------------------------------*/ 174: #ifdef __STDC__ 1.4 cvs 175: void SetInternalLinks (Document document) 1.1 cvs 176: #else 1.4 cvs 177: void SetInternalLinks (document) 1.1 cvs 178: Document document; 179: #endif 180: { 1.32 cvs 181: Element el, div, link, target, sibling; 182: ElementType elType, linkType; 1.16 cvs 183: Attribute HrefAttr, IntLinkAttr; 1.17 cvs 184: Attribute attr, ExtLinkAttr; 1.16 cvs 185: AttributeType attrType; 1.36 cvs 186: STRING text, ptr, url; 1.43 cvs 187: CHAR_T number[10]; 188: CHAR_T value[MAX_LENGTH]; 1.25 cvs 189: int length, i, volume; 190: int status, position; 1.47 cvs 191: ThotBool split; 1.1 cvs 192: 1.16 cvs 193: /* Remember the current status of the document */ 194: status = TtaIsDocumentModified (document); 1.32 cvs 195: el = TtaGetMainRoot (document); 196: volume = TtaGetElementVolume (el); 197: elType = TtaGetElementType (el); 198: elType.ElTypeNum = HTML_EL_AnyLink; 1.16 cvs 199: attrType.AttrSSchema = elType.ElSSchema; 1.32 cvs 200: /* looks for all links in the document */ 1.16 cvs 201: link = el; 202: while (link != NULL) 203: { 1.25 cvs 204: /* display the progression of the work */ 205: el = link; 206: position = 0; 207: while (el != NULL) 208: { 209: sibling = el; 210: do 211: { 212: /* add volume of each previous element */ 213: TtaPreviousSibling (&sibling); 214: if (sibling != NULL) 215: position += TtaGetElementVolume (sibling); 216: } 217: while (sibling != NULL); 218: el = TtaGetParent (el); 219: } 1.49 cvs 220: usprintf (number, TEXT("%d"), position*100/volume); 1.25 cvs 221: TtaSetStatus (document, 1, TtaGetMessage (AMAYA, AM_UPDATED_LINK), number); 222: TtaHandlePendingEvents (); 1.16 cvs 223: link = TtaSearchTypedElement (elType, SearchForward, link); 224: if (link != NULL) 1.32 cvs 225: /* a link has been found */ 1.16 cvs 226: { 1.32 cvs 227: linkType = TtaGetElementType (link); 228: if (linkType.ElTypeNum == HTML_EL_Anchor) 229: attrType.AttrTypeNum = HTML_ATTR_HREF_; 230: else 231: attrType.AttrTypeNum = HTML_ATTR_cite; 1.16 cvs 232: HrefAttr = TtaGetAttribute (link, attrType); 233: attrType.AttrTypeNum = HTML_ATTR_InternalLink; 234: IntLinkAttr = TtaGetAttribute (link, attrType); 235: attrType.AttrTypeNum = HTML_ATTR_ExternalLink; 236: ExtLinkAttr = TtaGetAttribute (link, attrType); 237: if (HrefAttr == NULL) 1.32 cvs 238: /* this element is not a link (no href or cite attribute) */ 1.16 cvs 239: /* remove attributes InternalLink and ExternalLink if they 240: are present */ 241: { 1.8 cvs 242: if (IntLinkAttr != NULL) 1.16 cvs 243: TtaRemoveAttribute (link, IntLinkAttr, document); 244: if (ExtLinkAttr != NULL) 245: TtaRemoveAttribute (link, ExtLinkAttr, document); 246: } 247: else 1.32 cvs 248: /* this element has an HREF or cite attribute */ 1.16 cvs 249: { 250: length = TtaGetTextAttributeLength (HrefAttr); 1.49 cvs 251: text = TtaAllocString (length + 1); 1.16 cvs 252: TtaGiveTextAttributeValue (HrefAttr, text, &length); 253: 254: /* does an external link become an internal link ? */ 1.25 cvs 255: if (document == DocBook && SubDocs != NULL) 1.16 cvs 256: { 1.36 cvs 257: ptr = ustrrchr (text, '#'); 1.16 cvs 258: url = text; 1.18 cvs 259: split = FALSE; 1.16 cvs 260: if (ptr == text) 261: /* a local link */ 262: url = NULL; 1.17 cvs 263: else if (ptr != NULL) 1.16 cvs 264: { 265: /* split url and name part */ 266: ptr[0] = EOS; 267: split = TRUE; 268: } 269: 270: /* Is it a sub-document */ 271: div = SearchSubDoc (url); 272: if (split) 273: /* retore the mark */ 274: ptr[0] = '#'; 275: 276: if (div == NULL) 277: { 278: /* it's not a sub-document */ 279: if (url == NULL) 280: /* a local link */ 281: ptr = &text[1]; 282: else 283: /* still an externa; link */ 284: ptr = NULL; 285: } 286: else 287: { 288: /* this link becomes internal */ 1.17 cvs 289: if (ptr != NULL) 1.16 cvs 290: { 1.17 cvs 291: /* get the target name */ 1.36 cvs 292: ustrcpy (value, ptr); 293: length = ustrlen (value); 1.17 cvs 294: /* check whether the name changed */ 295: i = 0; 296: target = SearchNAMEattribute (document, &value[1], NULL); 297: while (target != NULL) 1.16 cvs 298: { 1.17 cvs 299: /* is it the right NAME */ 300: if (TtaIsAncestor (target, div)) 301: target = NULL; 302: else 303: { 304: /* continue the search */ 305: i++; 1.49 cvs 306: usprintf (&value[length], TEXT("%d"), i); 1.32 cvs 307: target = SearchNAMEattribute (document, 308: &value[1], NULL); 1.17 cvs 309: } 1.16 cvs 310: } 311: } 1.17 cvs 312: else 313: { 314: /* get the DIV name */ 315: attrType.AttrTypeNum = HTML_ATTR_ID; 316: attr = TtaGetAttribute (div, attrType); 317: length = 200; 318: value[0] = '#'; 319: TtaGiveTextAttributeValue (attr, &value[1], &length); 320: } 1.16 cvs 321: ptr = &value[1]; 322: TtaSetAttributeText (HrefAttr, value, link, document); 323: } 324: } 325: else if (text[0] == '#') 326: ptr = &text[1]; 327: else 328: ptr = NULL; 329: 330: if (ptr != NULL) 331: /* it's an internal link. Attach an attribute InternalLink */ 332: /* to the link, if this attribute does not exist yet */ 333: { 334: if (IntLinkAttr == NULL) 335: { 336: attrType.AttrTypeNum = HTML_ATTR_InternalLink; 337: IntLinkAttr = TtaNewAttribute (attrType); 338: TtaAttachAttribute (link, IntLinkAttr, document); 339: } 340: /* looks for the target element */ 341: target = SearchNAMEattribute (document, ptr, NULL); 342: if (target != NULL) 343: /* set the Thot link */ 1.32 cvs 344: TtaSetAttributeReference (IntLinkAttr, link, document, 345: target, document); 1.16 cvs 346: } 347: else 348: /* it's an external link */ 349: { 350: /* Remove the InternalLink attribute if it is present */ 351: if (IntLinkAttr != NULL) 352: TtaRemoveAttribute (link, IntLinkAttr, document); 353: /* create an ExternalLink attribute if there is none */ 354: if (ExtLinkAttr == NULL) 355: { 356: attrType.AttrTypeNum = HTML_ATTR_ExternalLink; 357: ExtLinkAttr = TtaNewAttribute (attrType); 358: TtaAttachAttribute (link, ExtLinkAttr, document); 359: } 360: } 361: TtaFreeMemory (text); 362: } 363: } 364: } 365: /* Reset document status */ 366: if (!status) 367: TtaSetDocumentUnmodified (document); 1.3 cvs 368: } 369: 370: /*---------------------------------------------------------------------- 371: CheckPrintingDocument reinitialize printing parameters as soon as 372: the printing document changes. 373: ----------------------------------------------------------------------*/ 374: #ifdef __STDC__ 375: static void CheckPrintingDocument (Document document) 376: #else 377: static void CheckPrintingDocument (document) 378: Document document; 379: #endif 380: { 1.43 cvs 381: CHAR_T docName[MAX_LENGTH]; 1.36 cvs 382: STRING ptr; 1.43 cvs 383: CHAR_T suffix[MAX_LENGTH]; 1.3 cvs 384: int lg; 385: 386: if (docPrint != document) 387: { 388: /* initialize print parameters */ 389: docPrint = document; 390: 391: /* define the new default PS file */ 1.49 cvs 392: ptr = TtaGetEnvString (TEXT("APP_TMPDIR")); 1.3 cvs 393: if (ptr != NULL && TtaCheckDirectory (ptr)) 1.50 cvs 394: ustrcpy(PSdir, ptr); 1.44 cvs 395: else 1.49 cvs 396: ustrcpy (PSdir, TtaGetDefEnvString (TEXT("APP_TMPDIR"))); 1.36 cvs 397: lg = ustrlen(PSdir); 1.3 cvs 398: if (PSdir[lg - 1] == DIR_SEP) 1.44 cvs 399: PSdir[--lg] = EOS; 400: 1.36 cvs 401: ustrcpy (docName, TtaGetDocumentName (document)); 1.3 cvs 402: ExtractSuffix (docName, suffix); 1.49 cvs 403: usprintf (&PSdir[lg], TEXT("%c%s.ps"), DIR_SEP, docName); 1.3 cvs 404: TtaSetPsFile (PSdir); 405: /* define the new default PrintSchema */ 406: numberLinks = FALSE; 407: withToC = FALSE; 1.34 cvs 408: printURL = TRUE; 1.49 cvs 409: TtaSetPrintSchema (_EMPTYSTR_); 1.3 cvs 410: /* no manual feed */ 411: ManualFeed = PP_OFF; 412: TtaSetPrintParameter (PP_ManualFeed, ManualFeed); 413: } 414: } 415: 416: 417: /*---------------------------------------------------------------------- 418: PrintAs prints the document using predefined parameters. 419: ----------------------------------------------------------------------*/ 420: #ifdef __STDC__ 1.45 cvs 421: static void PrintDocument (Document doc, View view) 1.3 cvs 422: #else /* __STDC__ */ 1.45 cvs 423: static void PrintDocument (doc, view) 1.38 cvs 424: Document doc; 1.3 cvs 425: #endif /* __STDC__ */ 426: { 1.34 cvs 427: AttributeType attrType; 428: Attribute attr; 429: Element el; 1.50 cvs 430: STRING files, dir; 431: CHAR_T viewsToPrint[MAX_PATH]; 1.47 cvs 432: ThotBool status, textFile; 1.3 cvs 433: 1.38 cvs 434: textFile = (DocumentTypes[doc] == docText || 435: DocumentTypes[doc] == docTextRO || 436: DocumentTypes[doc] == docCSS || 437: DocumentTypes[doc] == docCSSRO); 438: 439: CheckPrintingDocument (doc); 1.49 cvs 440: ustrcpy (viewsToPrint, TEXT("Formatted_view ")); 1.38 cvs 441: if (!textFile && withToC) 1.49 cvs 442: ustrcat (viewsToPrint, TEXT("Table_of_contents ")); 1.38 cvs 443: if (!textFile && numberLinks) 1.8 cvs 444: /* display numbered links */ 1.3 cvs 445: { 1.8 cvs 446: /* associate an attribute InternalLink with all anchors refering 447: a target in the same document. This allows P schemas to work 448: properly */ 449: SetInternalLinks (docPrint); 1.3 cvs 450: if (PageSize == PP_A4) 1.49 cvs 451: TtaSetPrintSchema (TEXT("HTMLPLP")); 1.3 cvs 452: else 1.49 cvs 453: TtaSetPrintSchema (TEXT("HTMLPLPUS")); 454: ustrcat (viewsToPrint, TEXT("Links_view ")); 1.32 cvs 455: } 456: else 457: { 458: if (PageSize == PP_A4) 1.38 cvs 459: { 460: if (textFile) 1.49 cvs 461: TtaSetPrintSchema (TEXT("TextFilePP")); 1.38 cvs 462: else 1.49 cvs 463: TtaSetPrintSchema (TEXT("HTMLPP")); 1.38 cvs 464: } 1.32 cvs 465: else 1.38 cvs 466: { 467: if (textFile) 1.49 cvs 468: TtaSetPrintSchema (TEXT("TextFilePPUS")); 1.38 cvs 469: else 1.49 cvs 470: TtaSetPrintSchema (TEXT("HTMLPPUS")); 1.38 cvs 471: } 1.3 cvs 472: } 1.34 cvs 473: /* post or remove the PrintURL attribute */ 1.38 cvs 474: el = TtaGetMainRoot (doc); 475: status = TtaIsDocumentModified (doc); 476: attrType.AttrSSchema = TtaGetDocumentSSchema (doc); 477: if (textFile) 478: attrType.AttrTypeNum = TextFile_ATTR_PrintURL; 479: else 480: attrType.AttrTypeNum = HTML_ATTR_PrintURL; 1.34 cvs 481: attr = TtaGetAttribute (el, attrType); 482: if (attr == 0 && printURL) 483: { 484: attr = TtaNewAttribute (attrType); 1.38 cvs 485: TtaAttachAttribute (el, attr, doc); 1.34 cvs 486: } 1.50 cvs 487: 1.34 cvs 488: if (attr != 0 && !printURL) 1.38 cvs 489: TtaRemoveAttribute (el, attr, doc); 1.50 cvs 490: /* get the path dir where css files have to be stored */ 491: if (textFile) 492: files = NULL; 493: else 494: { 495: TtaGetPrintNames (&files, &dir); 496: /* store css files and get the list of names */ 497: files = CssToPrint (doc, dir); 498: } 499: TtaPrint (docPrint, viewsToPrint, files); 500: TtaFreeMemory (files); 1.34 cvs 501: if (!status) 1.38 cvs 502: TtaSetDocumentUnmodified (doc); 1.1 cvs 503: } 504: 1.45 cvs 505: /*---------------------------------------------------------------------- 506: PrintAs prints the document using predefined parameters. 507: ----------------------------------------------------------------------*/ 508: #ifdef __STDC__ 509: void PrintAs (Document doc, View view) 510: #else /* __STDC__ */ 511: void PrintAs (doc, view) 512: Document doc; 513: #endif /* __STDC__ */ 514: { 515: #ifdef _WINDOWS 516: SetupAndPrint (doc, view); 517: #else /* _WINDOWS */ 518: PrintDocument (doc, view); 519: #endif /* _WINDOWS */ 520: } 1.1 cvs 521: 522: /*---------------------------------------------------------------------- 523: CallbackImage manage returns of Picture form. 524: ----------------------------------------------------------------------*/ 525: #ifdef __STDC__ 1.36 cvs 526: void CallbackPrint (int ref, int typedata, STRING data) 1.1 cvs 527: #else /* __STDC__ */ 528: void CallbackPrint (ref, typedata, data) 529: int ref; 530: int typedata; 1.36 cvs 531: STRING data; 1.1 cvs 532: #endif /* __STDC__ */ 533: { 534: int val; 535: 536: val = (int) data; 537: switch (ref - basePrint) 538: { 539: case NumFormPrint: 540: TtaDestroyDialogue (basePrint+NumFormPrint); 541: switch (val) 542: { 543: case 1: 544: /* confirms the paper print option */ 545: /* the other options are not taken into account without this 546: confirmation */ 1.2 cvs 547: TtaSetPrintParameter (PP_Destination, PaperPrint); 548: TtaSetPrintParameter (PP_ManualFeed, ManualFeed); 549: TtaSetPrintParameter (PP_PaperSize, PageSize); 550: TtaSetPrintCommand (pPrinter); 551: TtaSetPsFile (PSdir); 1.40 cvs 552: /* update the environment variable */ 1.49 cvs 553: TtaSetEnvString (_THOTPRINT_EVAR_, pPrinter, TRUE); 554: TtaSetEnvInt (_PAPERSIZE_EVAR_, PageSize, TRUE); 1.46 cvs 555: PrintDocument (docPrint, 1); 1.1 cvs 556: break; 1.2 cvs 557: case 0: 1.40 cvs 558: PaperPrint = (TtaGetPrintParameter (PP_Destination)) ? PP_PRINTER : PP_PS; 1.2 cvs 559: ManualFeed = TtaGetPrintParameter (PP_ManualFeed); 560: PageSize = TtaGetPrintParameter (PP_PaperSize); 561: TtaGetPrintCommand (pPrinter); 562: TtaGetPsFile (PSdir); 563: break; 1.1 cvs 564: default: 565: break; 566: } 567: break; 568: case NumMenuOptions: 569: switch (val) 570: { 571: case 0: 572: /* Manual feed option */ 1.2 cvs 573: if (ManualFeed == PP_ON) 574: ManualFeed = PP_OFF; 575: else 576: ManualFeed = PP_ON; 1.1 cvs 577: break; 578: case 1: 579: /* Toc option */ 580: withToC = !withToC; 581: break; 582: case 2: 1.3 cvs 583: /* numberLinks option */ 1.1 cvs 584: numberLinks = !numberLinks; 1.34 cvs 585: case 3: 586: /* URL option */ 587: printURL = !printURL; 1.1 cvs 588: break; 589: } 590: break; 591: case NumMenuPaperFormat: 592: /* page size submenu */ 593: switch (val) 594: { 595: case 0: 1.2 cvs 596: PageSize = PP_A4; 1.1 cvs 597: break; 598: case 1: 1.2 cvs 599: PageSize = PP_US; 1.1 cvs 600: break; 601: } 602: break; 603: case NumMenuSupport: 604: /* paper print/save PostScript submenu */ 605: switch (val) 606: { 607: case 0: 1.2 cvs 608: if (PaperPrint == PP_PS) 1.1 cvs 609: { 1.2 cvs 610: PaperPrint = PP_PRINTER; 1.1 cvs 611: TtaSetTextForm (basePrint+NumZonePrinterName, pPrinter); 612: } 613: break; 614: case 1: 1.2 cvs 615: if (PaperPrint == PP_PRINTER) 1.1 cvs 616: { 1.2 cvs 617: PaperPrint = PP_PS; 1.1 cvs 618: TtaSetTextForm (basePrint+NumZonePrinterName, PSdir); 619: } 620: break; 621: } 622: break; 623: case NumZonePrinterName: 624: if (data[0] != '\0') 1.2 cvs 625: if (PaperPrint == PP_PRINTER) 1.40 cvs 626: /* text capture zone for the printer name */ 627: ustrncpy (pPrinter, data, MAX_PATH); 1.1 cvs 628: else 629: /* text capture zone for the name of the PostScript file */ 1.36 cvs 630: ustrncpy (PSdir, data, MAX_PATH); 1.1 cvs 631: break; 632: } 633: } 634: 635: /*---------------------------------------------------------------------- 636: ----------------------------------------------------------------------*/ 637: #ifdef __STDC__ 638: void InitPrint (void) 639: #else /* __STDC__ */ 640: void InitPrint () 641: #endif /* __STDC__ */ 642: { 1.36 cvs 643: STRING ptr; 1.1 cvs 644: 645: basePrint = TtaSetCallback (CallbackPrint, PRINT_MAX_REF); 646: docPrint = 0; 647: 648: /* init printer variables */ 649: /* read default printer variable */ 1.49 cvs 650: ptr = TtaGetEnvString (_THOTPRINT_EVAR_); 1.1 cvs 651: if (ptr == NULL) 1.49 cvs 652: ustrcpy (pPrinter, _EMPTYSTR_); 1.1 cvs 653: else 1.36 cvs 654: ustrcpy (pPrinter, ptr); 1.49 cvs 655: TtaGetEnvInt (_PAPERSIZE_EVAR_, &PageSize); 1.2 cvs 656: PaperPrint = PP_PRINTER; 1.35 cvs 657: printURL = TRUE; 1.2 cvs 658: TtaSetPrintParameter (PP_Destination, PaperPrint); 659: TtaSetPrintParameter (PP_PaperSize, PageSize); 660: TtaSetPrintCommand (pPrinter); 1.1 cvs 661: } 662: 663: /*---------------------------------------------------------------------- 1.3 cvs 664: SetupAndPrint sets printing parameters and starts the printing process 1.1 cvs 665: ----------------------------------------------------------------------*/ 666: #ifdef __STDC__ 1.38 cvs 667: void SetupAndPrint (Document doc, View view) 1.1 cvs 668: #else 1.38 cvs 669: void SetupAndPrint (doc, view) 670: Document doc; 1.1 cvs 671: View view; 672: #endif 673: { 1.10 cvs 674: # ifndef _WINDOWS 1.43 cvs 675: CHAR_T bufMenu[MAX_LENGTH]; 1.3 cvs 676: int i; 1.27 cvs 677: # endif /* !_WINDOWS */ 1.47 cvs 678: ThotBool textFile; 1.38 cvs 679: 680: textFile = (DocumentTypes[doc] == docText || 681: DocumentTypes[doc] == docTextRO || 682: DocumentTypes[doc] == docCSS || 683: DocumentTypes[doc] == docCSSRO); 1.1 cvs 684: 685: /* Print form */ 1.38 cvs 686: CheckPrintingDocument (doc); 1.40 cvs 687: 688: /* read the values that the user may have changed thru 689: the configuration menu */ 690: TtaGetPrintCommand (pPrinter); 691: PageSize = TtaGetPrintParameter (PP_PaperSize); 1.27 cvs 692: 693: # ifndef _WINDOWS 1.38 cvs 694: TtaNewSheet (basePrint+NumFormPrint, TtaGetViewFrame (doc, view), 1.1 cvs 695: TtaGetMessage (LIB, TMSG_LIB_PRINT), 1.3 cvs 696: 1, TtaGetMessage (AMAYA, AM_BUTTON_PRINT), FALSE, 2, 'L', D_CANCEL); 1.1 cvs 697: i = 0; 698: sprintf (&bufMenu[i], "%s%s", "T", TtaGetMessage (LIB, TMSG_MANUAL_FEED)); 1.36 cvs 699: i += ustrlen (&bufMenu[i]) + 1; 1.1 cvs 700: sprintf (&bufMenu[i], "%s%s", "T", TtaGetMessage (AMAYA, AM_PRINT_TOC)); 1.36 cvs 701: i += ustrlen (&bufMenu[i]) + 1; 1.1 cvs 702: sprintf (&bufMenu[i], "%s%s", "T", TtaGetMessage (AMAYA, AM_NUMBERED_LINKS)); 1.36 cvs 703: i += ustrlen (&bufMenu[i]) + 1; 1.34 cvs 704: sprintf (&bufMenu[i], "%s%s", "T", TtaGetMessage (AMAYA, AM_PRINT_URL)); 1.1 cvs 705: TtaNewToggleMenu (basePrint+NumMenuOptions, basePrint+NumFormPrint, 1.34 cvs 706: TtaGetMessage (LIB, TMSG_OPTIONS), 4, bufMenu, NULL, FALSE); 1.2 cvs 707: if (ManualFeed == PP_ON) 1.1 cvs 708: TtaSetToggleMenu (basePrint+NumMenuOptions, 0, TRUE); 709: if (withToC) 710: TtaSetToggleMenu (basePrint+NumMenuOptions, 1, TRUE); 711: if (numberLinks) 712: TtaSetToggleMenu (basePrint+NumMenuOptions, 2, TRUE); 1.34 cvs 713: if (printURL) 714: TtaSetToggleMenu (basePrint+NumMenuOptions, 3, TRUE); 1.1 cvs 715: 716: /* Paper format submenu */ 717: i = 0; 718: sprintf (&bufMenu[i], "%s%s", "B", TtaGetMessage (LIB, TMSG_A4)); 1.36 cvs 719: i += ustrlen (&bufMenu[i]) + 1; 1.1 cvs 720: sprintf (&bufMenu[i], "%s%s", "B", TtaGetMessage (LIB, TMSG_US)); 721: TtaNewSubmenu (basePrint+NumMenuPaperFormat, basePrint+NumFormPrint, 0, 722: TtaGetMessage (LIB, TMSG_PAPER_SIZE), 2, bufMenu, NULL, FALSE); 1.2 cvs 723: if (PageSize == PP_US) 1.1 cvs 724: TtaSetMenuForm (basePrint+NumMenuPaperFormat, 1); 725: else 726: TtaSetMenuForm (basePrint+NumMenuPaperFormat, 0); 727: 728: /* Print to paper/ Print to file submenu */ 729: i = 0; 730: sprintf (&bufMenu[i], "%s%s", "B", TtaGetMessage (LIB, TMSG_PRINTER)); 1.36 cvs 731: i += ustrlen (&bufMenu[i]) + 1; 1.1 cvs 732: sprintf (&bufMenu[i], "%s%s", "B", TtaGetMessage (LIB, TMSG_PS_FILE)); 733: TtaNewSubmenu (basePrint+NumMenuSupport, basePrint+NumFormPrint, 0, 734: TtaGetMessage (LIB, TMSG_OUTPUT), 2, bufMenu, NULL, TRUE); 735: /* text capture zone for the printer name */ 736: TtaNewTextForm (basePrint+NumZonePrinterName, basePrint+NumFormPrint, NULL, 30, 1, FALSE); 737: 738: /* initialization of the PaperPrint selector */ 1.2 cvs 739: if (PaperPrint == PP_PRINTER) 1.1 cvs 740: { 741: TtaSetMenuForm (basePrint+NumMenuSupport, 0); 742: TtaSetTextForm (basePrint+NumZonePrinterName, pPrinter); 743: } 744: else 745: { 746: TtaSetMenuForm (basePrint+NumMenuSupport, 1); 747: TtaSetTextForm (basePrint+NumZonePrinterName, PSdir); 748: } 749: 750: /* activates the Print form */ 1.10 cvs 751: TtaShowDialogue (basePrint+NumFormPrint, FALSE); 752: # else /* _WINDOWS */ 1.38 cvs 753: CreatePrintDlgWindow (TtaGetViewFrame (doc, view), PSdir, basePrint, NumMenuSupport, NumMenuOptions, NumMenuPaperFormat, NumZonePrinterName, NumFormPrint); 1.10 cvs 754: # endif /* _WINDOWS */ 1.38 cvs 755: if (textFile) 756: { 757: /* invalid dialogue entries */ 758: TtaRedrawMenuEntry (basePrint+NumMenuOptions, 1, NULL, -1, FALSE); 759: TtaRedrawMenuEntry (basePrint+NumMenuOptions, 2, NULL, -1, FALSE); } 1.1 cvs 760: } 761: 762: /*---------------------------------------------------------------------- 763: SectionNumbering 764: Execute the "Section Numbering" command 765: ----------------------------------------------------------------------*/ 766: #ifdef __STDC__ 1.38 cvs 767: void SectionNumbering (Document doc, View view) 1.1 cvs 768: #else 1.38 cvs 769: void SectionNumbering (doc, view) 770: Document doc; 1.1 cvs 771: View view; 772: #endif 773: { 1.38 cvs 774: ChangeAttrOnRoot (doc, HTML_ATTR_SectionNumbering); 1.1 cvs 775: } 776: 777: /*---------------------------------------------------------------------- 778: UpdateURLsInSubtree 779: Update NAMEs and URLs in subtree of el element, to take into account 780: the move from one document to another. 781: If a NAME attribute already exists in the new document, it is changed 782: to avoid duplicate names. 783: Transform the HREF and SRC attribute to make them independent from their 784: former base. 785: ----------------------------------------------------------------------*/ 786: #ifdef __STDC__ 787: static void UpdateURLsInSubtree (NotifyElement *event, Element el) 788: #else 789: static void UpdateURLsInSubtree (event, el) 790: NotifyElement *event; 791: Element el; 792: #endif 793: { 794: Element nextEl; 795: 796: event->element = el; 797: ElementPasted (event); 798: nextEl = TtaGetFirstChild (el); 799: while (nextEl != NULL) 800: { 801: UpdateURLsInSubtree (event, nextEl); 802: TtaNextSibling (&nextEl); 803: } 804: } 805: 806: 807: /*---------------------------------------------------------------------- 808: MoveDocumentBody 809: Copy the elements contained in the BODY of document sourceDoc to the 810: position of element *el in document destDoc. 811: Delete the element containing *el and all its empty ancestors. 812: If deleteTree is TRUE, copied elements are deleted from the source 813: document. 814: ----------------------------------------------------------------------*/ 815: #ifdef __STDC__ 1.47 cvs 816: static void MoveDocumentBody (Element *el, Document destDoc, Document sourceDoc, STRING target, STRING url, ThotBool deleteTree) 1.1 cvs 817: #else 1.16 cvs 818: static void MoveDocumentBody (el, destDoc, sourceDoc, target, url, deleteTree) 1.12 cvs 819: Element *el; 820: Document destDoc; 821: Document sourceDoc; 1.36 cvs 822: STRING target; 823: STRING url; 1.47 cvs 824: ThotBool deleteTree; 1.1 cvs 825: #endif 826: { 1.14 cvs 827: Element root, ancestor, elem, firstInserted; 1.12 cvs 828: Element lastInserted, srce, copy, old, parent, sibling; 829: ElementType elType; 830: NotifyElement event; 831: int checkingMode; 1.47 cvs 832: ThotBool isID; 1.1 cvs 833: 1.13 cvs 834: if (target != NULL) 835: { 836: /* locate the target element within the source document */ 837: root = SearchNAMEattribute (sourceDoc, target, NULL); 838: elType = TtaGetElementType (root); 839: isID = (elType.ElTypeNum != HTML_EL_Anchor 840: && elType.ElTypeNum != HTML_EL_MAP); 841: } 842: else 843: { 844: isID = FALSE; 845: /* get the BODY element of source document */ 846: root = TtaGetMainRoot (sourceDoc); 847: elType = TtaGetElementType (root); 848: elType.ElTypeNum = HTML_EL_BODY; 849: root = TtaSearchTypedElement (elType, SearchForward, root); 850: } 851: 852: if (root != NULL) 1.12 cvs 853: { 854: /* don't check the abstract tree against the structure schema */ 855: checkingMode = TtaGetStructureChecking (destDoc); 856: TtaSetStructureChecking (0, destDoc); 857: /* get elem, the ancestor of *el which is a child of a DIV or BODY 858: element in the destination document. The copied elements will be 859: inserted just before this element. */ 860: elem = *el; 861: do 1.1 cvs 862: { 1.12 cvs 863: ancestor = TtaGetParent (elem); 864: if (ancestor != NULL) 865: { 866: elType = TtaGetElementType (ancestor); 867: if (elType.ElTypeNum == HTML_EL_BODY || 868: elType.ElTypeNum == HTML_EL_Division) 869: ancestor = NULL; 870: else 871: elem = ancestor; 872: } 1.1 cvs 873: } 1.12 cvs 874: while (ancestor != NULL); 875: parent = TtaGetParent (elem); 1.14 cvs 876: 877: /* insert a DIV element */ 1.15 cvs 878: elType.ElTypeNum = HTML_EL_Division; 1.16 cvs 879: lastInserted = TtaNewElement (destDoc, elType); 880: TtaInsertSibling (lastInserted, elem, TRUE, destDoc); 881: RegisterSubDoc (lastInserted, url); 1.42 cvs 882: CreateTargetAnchor (destDoc, lastInserted, FALSE); 1.14 cvs 883: 1.12 cvs 884: /* do copy */ 1.16 cvs 885: firstInserted = NULL; 1.17 cvs 886: if (isID) 887: srce = root; 888: else 889: srce = TtaGetFirstChild (root); 1.12 cvs 890: while (srce != NULL) 1.1 cvs 891: { 1.12 cvs 892: copy = TtaCopyTree (srce, sourceDoc, destDoc, parent); 893: if (copy != NULL) 894: { 1.16 cvs 895: if (firstInserted == NULL) 1.12 cvs 896: /* this is the first copied element. Insert it before elem */ 897: { 1.16 cvs 898: TtaInsertFirstChild (©, lastInserted, destDoc); 1.12 cvs 899: firstInserted = copy; 900: } 901: else 902: /* insert the new copied element after the element previously 903: copied */ 904: TtaInsertSibling (copy, lastInserted, FALSE, destDoc); 905: lastInserted = copy; 906: /* update the NAMEs and URLs in the copied element */ 907: event.document = destDoc; 908: event.position = sourceDoc; 909: UpdateURLsInSubtree(&event, copy); 910: } 911: /* get the next element in the source document */ 912: old = srce; 913: TtaNextSibling (&srce); 914: if (deleteTree) 915: TtaDeleteTree (old, sourceDoc); 1.13 cvs 916: /* Stop here if the target points to a specific element with an ID */ 917: if (isID) 918: srce = NULL; 1.1 cvs 919: } 1.12 cvs 920: 921: /* delete the element(s) containing the link to the copied document */ 922: /* delete the parent element of *el and all empty ancestors */ 923: elem = TtaGetParent (*el); 924: do 1.1 cvs 925: { 1.12 cvs 926: sibling = elem; 927: TtaNextSibling (&sibling); 928: if (sibling == NULL) 929: { 930: sibling = elem; 931: TtaPreviousSibling (&sibling); 932: if (sibling == NULL) 933: elem = TtaGetParent (elem); 934: } 1.1 cvs 935: } 1.12 cvs 936: while (sibling == NULL); 937: TtaDeleteTree (elem, destDoc); 938: /* restore previous chacking mode */ 1.47 cvs 939: TtaSetStructureChecking ((ThotBool)checkingMode, destDoc); 1.12 cvs 940: /* return the address of the first copied element */ 941: *el = firstInserted; 942: } 1.1 cvs 943: } 944: 1.29 cvs 945: 946: #ifdef __STDC__ 947: void GetIncludedDocuments_callback (int newdoc, int status, 1.36 cvs 948: STRING urlName, 949: STRING outputfile, 950: STRING content_type, 1.29 cvs 951: void * context) 952: #else /* __STDC__ */ 953: void GetIncludedDocuments_callback (newdoc, status, urlName, 954: outputfile, content_type, 955: context) 956: int newdoc; 957: int status; 1.36 cvs 958: STRING urlName; 959: STRING outputfile; 960: STRING content_type; 1.29 cvs 961: void *context; 962: #endif /* __STDC__ */ 963: { 964: Element link, next; 965: Attribute RelAttr, HrefAttr; 1.36 cvs 966: STRING url, ptr, text; 1.29 cvs 967: Document document; 968: GetIncludedDocuments_context *ctx; 969: 970: /* restore GetIncludedDocuments's context */ 971: ctx = (GetIncludedDocuments_context *) context; 972: 973: if (!ctx) 974: return; 975: 976: RelAttr = ctx->RelAttr; 977: link = ctx->link; 978: HrefAttr = ctx->HrefAttr; 979: url = ctx->url; 980: ptr = ctx->ptr; 981: document = ctx->document; 982: next = ctx->next; 983: text = ctx->text; 984: 985: TtaFreeMemory (ctx); 986: 987: if (RelAttr != NULL && link != NULL) 988: { 989: if (HrefAttr != NULL) 990: { 991: if (url != NULL) 992: { 993: if (newdoc != 0 && newdoc != document) 994: { 995: /* it's not the document itself */ 996: /* copy the target document at the position of the link */ 997: MoveDocumentBody (&next, document, newdoc, ptr, url, 1.47 cvs 998: (ThotBool)(newdoc == IncludedDocument)); 1.29 cvs 999: } 1000: /* global variables */ 1001: FreeDocumentResource (IncludedDocument); 1002: TtaCloseDocument (IncludedDocument); 1003: IncludedDocument = 0; 1004: } 1005: TtaFreeMemory (text); 1006: } 1007: } 1008: 1009: if (next != NULL && DocBook == document) 1010: { 1011: SetStopButton (document); 1012: GetIncludedDocuments (next, document); 1013: } 1014: else 1015: MakeBook_callback (document); 1016: } 1017: 1.1 cvs 1018: /*---------------------------------------------------------------------- 1019: GetIncludedDocuments 1020: Look forward, starting from element el, for a link (A) with attribute 1.5 cvs 1021: REL="chapter" or REL="subdocument" and replace that link by the contents 1022: of the target document. 1.1 cvs 1023: ----------------------------------------------------------------------*/ 1024: #ifdef __STDC__ 1.29 cvs 1025: static void GetIncludedDocuments (Element el, Document document) 1.1 cvs 1026: #else 1.29 cvs 1027: static void GetIncludedDocuments (el, document) 1.1 cvs 1028: Element el; 1029: Document document; 1030: #endif 1031: { 1.29 cvs 1032: Element link, next; 1033: Attribute RelAttr, HrefAttr = NULL; 1034: AttributeType attrType; 1035: int length; 1.36 cvs 1036: STRING text, ptr, url = NULL; 1.29 cvs 1037: Document newdoc; 1.47 cvs 1038: ThotBool call_callback = FALSE; 1.29 cvs 1039: GetIncludedDocuments_context *ctx = NULL; 1040: 1041: link = el; 1042: RelAttr = NULL; 1043: next = NULL; 1044: 1045: ctx = TtaGetMemory (sizeof (GetIncludedDocuments_context)); 1046: memset (ctx, 0, sizeof (GetIncludedDocuments_context)); 1047: 1048: attrType.AttrSSchema = TtaGetDocumentSSchema (document); 1049: attrType.AttrTypeNum = HTML_ATTR_REL; 1050: 1051: 1052: /* looks for an anchor having an attribute REL="chapter" or 1053: REL="subdocument" */ 1054: while (link != NULL && RelAttr == NULL) 1055: { 1056: TtaSearchAttribute (attrType, SearchForward, link, &link, &RelAttr); 1057: if (link != NULL && RelAttr != NULL) 1058: { 1059: length = TtaGetTextAttributeLength (RelAttr); 1.49 cvs 1060: text = TtaAllocString (length + 1); 1.29 cvs 1061: TtaGiveTextAttributeValue (RelAttr, text, &length); 1.49 cvs 1062: if (ustrcasecmp (text, TEXT("chapter")) && ustrcasecmp (text, TEXT("subdocument"))) 1.29 cvs 1063: RelAttr = NULL; 1064: TtaFreeMemory (text); 1065: } 1066: } 1067: 1068: ctx->RelAttr = RelAttr; 1069: ctx->link = link; 1070: ctx->document = document; 1071: ctx->HrefAttr = HrefAttr; 1.1 cvs 1072: 1.29 cvs 1073: if (RelAttr != NULL && link != NULL) 1074: /* a link with attribute REL="Chapter" has been found */ 1075: { 1076: next = link; 1077: ctx->next =next; 1078: attrType.AttrTypeNum = HTML_ATTR_HREF_; 1079: HrefAttr = TtaGetAttribute (link, attrType); 1080: if (HrefAttr != NULL) 1.1 cvs 1081: /* this link has an attribute HREF */ 1082: { 1083: length = TtaGetTextAttributeLength (HrefAttr); 1.49 cvs 1084: text = TtaAllocString (length + 1); 1.1 cvs 1085: TtaGiveTextAttributeValue (HrefAttr, text, &length); 1.36 cvs 1086: ptr = ustrrchr (text, '#'); 1.12 cvs 1087: url = text; 1088: if (ptr != NULL) 1089: { 1090: if (ptr == text) 1091: url = NULL; 1.16 cvs 1092: /* link to a particular position within a remote document */ 1.12 cvs 1093: ptr[0] = EOS; 1094: ptr = &ptr[1]; 1095: } 1.29 cvs 1096: 1097: ctx->url = url; 1098: ctx->ptr = ptr; 1099: ctx->text = text; 1100: ctx->HrefAttr = HrefAttr; 1.12 cvs 1101: 1102: if (url != NULL) 1.29 cvs 1103: /* this link designates an external document */ 1.1 cvs 1104: { 1105: /* create a new document and loads the target document */ 1.49 cvs 1106: IncludedDocument = TtaNewDocument (TEXT("HTML"), TEXT("tmp")); 1.30 cvs 1107: if (IncludedDocument != 0) 1108: { 1109: TtaSetStatus (document, 1, TtaGetMessage (AMAYA, AM_FETCHING), url); 1110: newdoc = GetHTMLDocument (url, NULL, IncludedDocument, 1.29 cvs 1111: document, CE_MAKEBOOK, FALSE, 1112: (void *) GetIncludedDocuments_callback, 1113: (void *) ctx); 1.30 cvs 1114: } 1.1 cvs 1115: } 1.29 cvs 1116: else 1117: call_callback = TRUE; 1118: } 1119: else 1120: call_callback = TRUE; 1121: } 1122: else 1123: call_callback = TRUE; 1124: 1125: if (call_callback) 1126: GetIncludedDocuments_callback (document, -1, url, NULL, NULL, 1127: (void *) ctx); 1.1 cvs 1128: } 1129: 1130: 1131: /*---------------------------------------------------------------------- 1.29 cvs 1132: MakeBook_callback 1133: ----------------------------------------------------------------------*/ 1134: #ifdef __STDC__ 1135: void MakeBook_callback (Document document) 1136: #else 1137: void MakeBook_callback (Document document) 1138: #endif /* __STDC__ */ 1139: 1140: { 1141: ResetStop (document); 1142: /* update internal links */ 1143: SetInternalLinks (document); 1144: /* remove registered sub-documents */ 1145: FreeSubDocTable (); 1146: DocBook = 0; 1.39 cvs 1147: SetBrowserEditor (document); 1.29 cvs 1148: TtaSetStatus (document, 1, TtaGetMessage (AMAYA, AM_DOCUMENT_LOADED), NULL); 1149: } 1150: 1151: /*---------------------------------------------------------------------- 1.1 cvs 1152: MakeBook 1153: Replace all links in a document which have an attribute REL="chapter" 1.5 cvs 1154: or REL="subdocument" by the corresponding target document. 1.1 cvs 1155: ----------------------------------------------------------------------*/ 1156: #ifdef __STDC__ 1157: void MakeBook (Document document, View view) 1158: #else 1159: void MakeBook (document, view) 1160: Document document; 1161: View view; 1162: #endif 1163: { 1164: Element root, body, el; 1165: ElementType elType; 1166: 1.24 cvs 1167: /* stops all current transfers on this document */ 1.25 cvs 1168: StopTransfer (document, 1); 1169: /* simulate a transfert in the main document */ 1170: ActiveMakeBook (document); 1.1 cvs 1171: root = TtaGetMainRoot (document); 1172: elType = TtaGetElementType (root); 1173: elType.ElTypeNum = HTML_EL_BODY; 1174: body = TtaSearchTypedElement (elType, SearchForward, root); 1175: TtaSetDocumentModified (document); 1176: el = body; 1.29 cvs 1177: 1178: if (el != NULL && DocBook == document) 1179: GetIncludedDocuments (el, document); 1180: else 1181: MakeBook_callback (document); 1.1 cvs 1182: } 1.29 cvs 1183: 1184: 1185: 1186: 1187: 1188: 1189: 1190: 1191: 1192: