PageRenderTime 42ms CodeModel.GetById 6ms RepoModel.GetById 1ms app.codeStats 0ms

/thotlib/base/config.c

https://github.com/pffy/Amaya-Editor
C | 1908 lines | 1386 code | 130 blank | 392 comment | 481 complexity | f1896c0d033348eb0e7ea7b3e98c6d46 MD5 | raw file

Large files files are truncated, but you can click here to view the full file

  1. /*
  2. *
  3. * (c) COPYRIGHT INRIA, 1996-2008
  4. * Please first read the full copyright statement in file COPYRIGHT.
  5. *
  6. */
  7. /*
  8. * gestion des fichiers de configuration et de langue.
  9. *
  10. * Authors: V. Quint (IRNIA)
  11. *
  12. */
  13. #ifdef _WX
  14. #include "wx/wx.h"
  15. #endif /* _WX */
  16. #include "thot_gui.h"
  17. #include "thot_sys.h"
  18. #include "constmedia.h"
  19. #include "constmenu.h"
  20. #include "typemedia.h"
  21. #include "frame.h"
  22. #include "language.h"
  23. #include "application.h"
  24. #include "appdialogue.h"
  25. #include "fileaccess.h"
  26. #include "document.h"
  27. #ifdef _WX
  28. #include "appdialogue_wx.h"
  29. #include "AmayaWindow.h"
  30. #endif /* _WX */
  31. #ifdef _WINGUI
  32. #include "wininclude.h"
  33. int app_lang;
  34. #endif /* _WINGUI */
  35. #undef THOT_EXPORT
  36. #define THOT_EXPORT extern
  37. #include "platform_tv.h"
  38. #include "edit_tv.h"
  39. #include "frame_tv.h"
  40. #include "units_tv.h"
  41. #include "appdialogue_tv.h"
  42. #define MAX_ITEM_CONF 100
  43. #include "applicationapi_f.h"
  44. #include "fileaccess_f.h"
  45. #include "inites_f.h"
  46. #include "memory_f.h"
  47. #include "message_f.h"
  48. #include "thotmsg_f.h"
  49. #include "views_f.h"
  50. static ThotBool doc_import[MAX_ITEM_CONF];
  51. static char *doc_items[MAX_ITEM_CONF];
  52. static char *doc_items_menu[MAX_ITEM_CONF];
  53. static char *nat_items[MAX_ITEM_CONF];
  54. static char *nat_items_menu[MAX_ITEM_CONF];
  55. static char *ext_items[MAX_ITEM_CONF];
  56. static char *ext_items_menu[MAX_ITEM_CONF];
  57. static char *pres_items[MAX_ITEM_CONF];
  58. static char *pres_items_menu[MAX_ITEM_CONF];
  59. static char *export_items[MAX_ITEM_CONF];
  60. static char *export_items_menu[MAX_ITEM_CONF];
  61. /*----------------------------------------------------------------------
  62. ConfigInit initializes the configuration module
  63. ----------------------------------------------------------------------*/
  64. void ConfigInit ()
  65. {
  66. int i;
  67. for (i = 0; i < MAX_ITEM_CONF; i++)
  68. {
  69. doc_items[i] = NULL;
  70. doc_import[i] = FALSE;
  71. doc_items_menu[i] = NULL;
  72. nat_items[i] = NULL;
  73. nat_items_menu[i] = NULL;
  74. ext_items[i] = NULL;
  75. ext_items_menu[i] = NULL;
  76. pres_items[i] = NULL;
  77. pres_items_menu[i] = NULL;
  78. export_items[i] = NULL;
  79. export_items_menu[i] = NULL;
  80. }
  81. /* TtaConfigReadConfigFiles (SchemaPath);*/
  82. }
  83. /*----------------------------------------------------------------------
  84. getFirstWord
  85. ----------------------------------------------------------------------*/
  86. static void getFirstWord (unsigned char *line, char *word)
  87. {
  88. int indword, indline;
  89. indline = 0;
  90. word[0] = EOS;
  91. /* skip spaces if there are */
  92. while (line[indline] <= SPACE && line[indline] != EOS)
  93. indline++;
  94. if (line[indline] == '#')
  95. /* cette ligne ne comporte qu'un commentaire */
  96. return;
  97. /* copie tous les caracteres jusqu'a rencontrer le 1er espace ou ":" */
  98. /* ou la fin de ligne */
  99. indword = 0;
  100. while (line[indline] > SPACE && line[indline] != ':' &&
  101. line[indline] != EOS)
  102. word[indword++] = line[indline++];
  103. /* marque la fin du mot trouve' */
  104. word[indword] = EOS;
  105. }
  106. /*----------------------------------------------------------------------
  107. getSecondWord
  108. ----------------------------------------------------------------------*/
  109. static void getSecondWord (unsigned char *line, char *word)
  110. {
  111. int indword, indline;
  112. indline = 0;
  113. word[0] = EOS;
  114. /* saute les espaces de debut de ligne */
  115. while (line[indline] <= SPACE && line[indline] != EOS)
  116. indline++;
  117. if (line[indline] == '#')
  118. /* cette ligne ne comporte qu'un commentaire */
  119. return;
  120. /* saute le 1er mot, jusqu'a rencontrer le 1er espace */
  121. /* ou la fin de ligne */
  122. while (line[indline] > SPACE && line[indline] != EOS)
  123. indline++;
  124. /* saute les espaces qui suivent le 1er mot */
  125. while (line[indline] <= SPACE && line[indline] != EOS)
  126. indline++;
  127. if (line[indline] == '#')
  128. /* le premier mot est suivi d'un commentaire */
  129. return;
  130. /* copie tous les caracteres du 2eme mot jusqu'a rencontrer le 1er */
  131. /* espace ou la fin de ligne */
  132. indword = 0;
  133. while (line[indline] > SPACE && line[indline] != EOS)
  134. word[indword++] = line[indline++];
  135. /* marque la fin du mot trouve' */
  136. word[indword] = EOS;
  137. }
  138. /*----------------------------------------------------------------------
  139. singleWord
  140. ----------------------------------------------------------------------*/
  141. static ThotBool singleWord (unsigned char *line)
  142. {
  143. int ind;
  144. ind = 0;
  145. /* saute les espaces de debut de ligne */
  146. while (line[ind] <= SPACE && line[ind] != EOS)
  147. ind++;
  148. if (line[ind] == '#')
  149. /* la ligne commence par un commentaire */
  150. return FALSE;
  151. /* saute le premier mot */
  152. while (line[ind] > SPACE && line[ind] != '#' &&
  153. line[ind] != ':' && line[ind] != EOS)
  154. ind++;
  155. /* saute les espaces qui suivent le 1er mot */
  156. while (line[ind] <= SPACE && line[ind] != EOS)
  157. ind++;
  158. if (line[ind] == '#' || line[ind] == EOS)
  159. /* il ne reste rien dans la ligne ou seulement un commentaire */
  160. return TRUE;
  161. else
  162. /* il y a des caracteres significatifs apres le 1er mot */
  163. return FALSE;
  164. }
  165. /*----------------------------------------------------------------------
  166. getStringAfterColon
  167. ----------------------------------------------------------------------*/
  168. static void getStringAfterColon (unsigned char *line, char *text)
  169. {
  170. int indline, indtext;
  171. indline = 0;
  172. text[0] = EOS;
  173. while (line[indline] != ':' && line[indline] != EOS)
  174. indline++;
  175. if (line[indline] == ':')
  176. {
  177. indline++;
  178. while (line[indline] <= SPACE && line[indline] != EOS)
  179. indline++;
  180. if (line[indline] == '#' || line[indline] == EOS)
  181. return;
  182. indtext = 0;
  183. while (line[indline] != '#' && line[indline] != EOS)
  184. text[indtext++] = line[indline++];
  185. /* elimine les blancs de fin de ligne */
  186. indtext--;
  187. while (text[indtext] <= SPACE && indtext >= 0)
  188. indtext--;
  189. indtext++;
  190. /* termine la chaine */
  191. text[indtext] = EOS;
  192. }
  193. }
  194. /*----------------------------------------------------------------------
  195. readUntil lit le fichier file (qui doit etre ouvert)
  196. jusqu'a trouver une ligne qui contienne un seul mot,
  197. soit word1 soit word2.
  198. Retourne
  199. 0 si on ne trouve pas cette ligne,
  200. 1 si on trouve le 1er mot,
  201. 2 si on trouve le 2eme mot.
  202. ----------------------------------------------------------------------*/
  203. static int readUntil (FILE *file, const char *word1, const char *word2)
  204. {
  205. ThotBool stop;
  206. int ret;
  207. char line[MAX_TXT_LEN];
  208. char word[MAX_TXT_LEN];
  209. stop = FALSE;
  210. ret = 0;
  211. do
  212. if (fgets (line, MAX_TXT_LEN - 1, file) == NULL)
  213. /* fin de fichier */
  214. stop = TRUE;
  215. else
  216. {
  217. getFirstWord ((unsigned char*)line, word);
  218. if (singleWord ((unsigned char*)line))
  219. {
  220. if (*word1 != EOS)
  221. if (strcmp (word, word1) == 0)
  222. ret = 1;
  223. if (*word2 != EOS)
  224. if (strcmp (word, word2) == 0)
  225. ret = 2;
  226. }
  227. }
  228. while (!stop && ret == 0);
  229. return ret;
  230. }
  231. #if 0
  232. /*----------------------------------------------------------------------
  233. namesOfDocType
  234. ----------------------------------------------------------------------*/
  235. static void namesOfDocType (char *fname, char **doctypeOrig,
  236. char **doctypeTrans, int *typ, ThotBool *import)
  237. {
  238. int i, l, point, res;
  239. FILE *file;
  240. char line[MAX_TXT_LEN];
  241. char text[MAX_TXT_LEN];
  242. char word[MAX_TXT_LEN];
  243. char URL_DIR_SEP;
  244. ThotBool stop;
  245. *doctypeOrig = NULL;
  246. *doctypeTrans = NULL;
  247. *typ = CONFIG_UNKNOWN_TYPE;
  248. *import = FALSE;
  249. if (fname && strchr (fname, '/'))
  250. URL_DIR_SEP = '/';
  251. else
  252. URL_DIR_SEP = DIR_SEP;
  253. /* ouvre le fichier */
  254. file = TtaReadOpen (fname);
  255. if (file == NULL)
  256. {
  257. fprintf (stderr, "cannot open file %s\n", fname);
  258. return;
  259. }
  260. /* cherche le premier mot du fichier, hors commentaires et espaces */
  261. stop = FALSE;
  262. do
  263. if (fgets (line, MAX_TXT_LEN - 1, file) == NULL)
  264. stop = TRUE;
  265. else
  266. {
  267. getFirstWord (line, word);
  268. if (word[0] != EOS)
  269. stop = TRUE;
  270. }
  271. while (!stop);
  272. if (!singleWord (line))
  273. /* le premier mot n'est pas seul dans la ligne, erreur */
  274. return;
  275. if (strcmp (word, "document") == 0)
  276. *typ = CONFIG_DOCUMENT_STRUCT;
  277. else if (strcmp (word, "nature") == 0)
  278. *typ = CONFIG_NATURE_STRUCT;
  279. else if (strcmp (word, "extension") == 0)
  280. *typ = CONFIG_EXTENSION_STRUCT;
  281. else if (strcmp (word, "document-nature") == 0)
  282. *typ = CONFIG_EXCLUSION;
  283. else
  284. /* le premier mot du fichier est invalide */
  285. {
  286. fprintf (stderr, "file %s: invalid first word %s\n", fname, word);
  287. return;
  288. }
  289. /* cherche le "." marquant le suffixe a la fin du nom de fichier */
  290. i = strlen (fname);
  291. while (i > 0 && fname[i] != '.')
  292. i--;
  293. if (fname[i] == '.')
  294. point = i;
  295. else
  296. point = 0;
  297. /* cherche le dernier DIR_SEP du nom de fichier */
  298. while (i > 0 && fname[i] != URL_DIR_SEP)
  299. i--;
  300. if (fname[i] == URL_DIR_SEP)
  301. i++;
  302. if (fname[i] == '_')
  303. /* ignore les fichiers dont le nom commence par "-" */
  304. return;
  305. l = strlen (&fname[i]) + 1;
  306. *doctypeOrig = (char*) TtaGetMemory (l);
  307. if (point != 0)
  308. fname[point] = EOS;
  309. strcpy (*doctypeOrig, &fname[i]);
  310. /* retablit le '.' du suffixe dans le nom de fichier */
  311. if (point != 0)
  312. fname[point] = '.';
  313. if (*typ == CONFIG_DOCUMENT_STRUCT || *typ == CONFIG_EXCLUSION)
  314. /* Il s'agit d'un type de document, on cherche une ligne */
  315. /* contenant un seul mot: "import" ou "translation" */
  316. res = readUntil (file, "import", "translation");
  317. else
  318. /* il s'agit d'une nature ou d'une extension, on ne cherche */
  319. /* que la ligne "translation" */
  320. res = readUntil (file, "", "translation");
  321. if (res == 1)
  322. /* on a trouve' le mot "import" */
  323. {
  324. *import = TRUE;
  325. /* cherche la ligne comportant le seul mot "translation" */
  326. res = readUntil (file, "", "translation");
  327. }
  328. if (res == 2)
  329. /* on a trouve' le mot translation */
  330. {
  331. /* on cherche la ligne qui donne la traduction du nom de schema */
  332. stop = FALSE;
  333. do
  334. if (fgets (line, MAX_TXT_LEN - 1, file) == NULL)
  335. {
  336. stop = TRUE;
  337. word[0] = EOS;
  338. }
  339. else
  340. {
  341. getFirstWord (line, word);
  342. if (strcmp (word, *doctypeOrig) == 0)
  343. stop = TRUE;
  344. }
  345. while (!stop);
  346. if (strcmp (word, *doctypeOrig) == 0)
  347. /* on a trouve' la ligne voulue */
  348. {
  349. getStringAfterColon (line, text);
  350. if (text[0] == EOS)
  351. fprintf (stderr, "invalid line in file %s\n %s\n", fname, line);
  352. else
  353. {
  354. *doctypeTrans = TtaGetMemory (strlen (text) + 1);
  355. strcpy (*doctypeTrans, AsciiTranslate (text));
  356. }
  357. }
  358. }
  359. TtaReadClose (file);
  360. /* Si le fichier de configuration ne definit pas de traduction pour */
  361. /* le nom du schema, on prend le nom d'origine comme traduction */
  362. if (*doctypeTrans == NULL)
  363. {
  364. *doctypeTrans = TtaGetMemory (l);
  365. strcpy (*doctypeTrans, *doctypeOrig);
  366. }
  367. }
  368. #endif
  369. /*----------------------------------------------------------------------
  370. ConfigFree
  371. Frees the table entries of all the document types, natures and
  372. extensions.
  373. ----------------------------------------------------------------------*/
  374. void ConfigFree (void)
  375. {
  376. int i;
  377. for (i = 0; i < MAX_ITEM_CONF; i++)
  378. {
  379. if (doc_items[i] != NULL)
  380. {
  381. TtaFreeMemory (doc_items[i]);
  382. doc_items[i] = NULL;
  383. }
  384. doc_import[i] = FALSE;
  385. if (doc_items_menu[i] != NULL)
  386. {
  387. TtaFreeMemory (doc_items_menu[i]);
  388. doc_items_menu[i] = NULL;
  389. }
  390. if (nat_items[i] != NULL)
  391. {
  392. TtaFreeMemory (nat_items[i]);
  393. nat_items[i] = NULL;
  394. }
  395. if (nat_items_menu[i] != NULL)
  396. {
  397. TtaFreeMemory (nat_items_menu[i]);
  398. nat_items_menu[i] = NULL;
  399. }
  400. if (ext_items[i] != NULL)
  401. {
  402. TtaFreeMemory (ext_items[i]);
  403. ext_items[i] = NULL;
  404. }
  405. if (ext_items_menu[i] != NULL)
  406. {
  407. TtaFreeMemory (ext_items_menu[i]);
  408. ext_items_menu[i] = NULL;
  409. }
  410. }
  411. }
  412. #ifdef IV
  413. /*----------------------------------------------------------------------
  414. TtaConfigReadConfigFiles (re)initialise les tables des schemas de
  415. structure (documents, natures et extensions) qui ont
  416. des fichiers de langue dans les directories de schemas.
  417. ----------------------------------------------------------------------*/
  418. void TtaConfigReadConfigFiles (char *aSchemaPath)
  419. {
  420. int nbitemdoc, nbitemnat, nbitemext;
  421. int beginning, i;
  422. int typ;
  423. ThotBool import;
  424. char *Dir;
  425. PathBuffer DirBuffer;
  426. #define NAME_LENGTH 100
  427. #define MAX_NAME 80
  428. #define SELECTOR_NB_ITEMS 5
  429. char *suffix;
  430. PathBuffer fname;
  431. char *nameOrig;
  432. char *nameTrans;
  433. ThotBool stop;
  434. /* force the english language in schemas */
  435. suffix = "en";
  436. #ifdef _WINGUI
  437. app_lang = EN_LANG;
  438. #endif /* _WINGUI */
  439. /* libere les anciennes entrees des tables de types de documents */
  440. /* de natures et d'extensions */
  441. ConfigFree ();
  442. beginning = 0;
  443. i = 0;
  444. nbitemdoc = 0;
  445. nbitemnat = 0;
  446. nbitemext = 0;
  447. /* traite successivement tous les directories du path des schemas */
  448. strncpy (DirBuffer, aSchemaPath, MAX_PATH);
  449. stop = FALSE;
  450. while (DirBuffer[i] != EOS && i < MAX_PATH && !stop)
  451. {
  452. while (DirBuffer[i] != PATH_SEP && DirBuffer[i] != EOS && i < MAX_PATH)
  453. i++;
  454. if (DirBuffer[i] == EOS)
  455. /* dernier directory du path. Il faut s'arreter apres ce directory */
  456. stop = TRUE;
  457. if (DirBuffer[i] == PATH_SEP)
  458. DirBuffer[i] = EOS;
  459. if (DirBuffer[i] == EOS)
  460. /* un directory de schema a ete isole' */
  461. {
  462. Dir = &DirBuffer[beginning];
  463. if (TtaCheckDirectory (Dir))
  464. /* c'est bien un directory */
  465. {
  466. /* commande "ls" sur le directory */
  467. }
  468. /* continue a chercher les directories dans le path des schemas */
  469. i++;
  470. beginning = i;
  471. }
  472. }
  473. }
  474. /*----------------------------------------------------------------------
  475. ConfigMakeDocTypeMenu cree dans BufMenu la liste des schemas de
  476. structure qui ont des fichiers de langue dans les
  477. directories de schemas.
  478. Si doc == TRUE on prend les schemas de documents, sinon
  479. les schemas de nature.
  480. ----------------------------------------------------------------------*/
  481. int ConfigMakeDocTypeMenu (char *BufMenu, int *lgmenu, ThotBool doc)
  482. {
  483. int nbitem, len, i;
  484. nbitem = 0;
  485. *lgmenu = 0;
  486. BufMenu[0] = EOS;
  487. i = 0;
  488. if (doc)
  489. /* parcourt la table des noms de types de documents */
  490. while (i < MAX_ITEM_CONF && doc_items[i] != NULL)
  491. {
  492. if (doc_items_menu[i] != NULL)
  493. /* cette entree de la table a une traduction, on la prend */
  494. {
  495. len = strlen (doc_items_menu[i]);
  496. strcpy (BufMenu + (*lgmenu), doc_items_menu[i]);
  497. }
  498. else
  499. /* pas de traduction, on prend le nom d'origine du schema */
  500. {
  501. len = strlen (doc_items[i]);
  502. strcpy (BufMenu + (*lgmenu), doc_items[i]);
  503. }
  504. (*lgmenu) += len + 1;
  505. nbitem++;
  506. i++;
  507. }
  508. else
  509. /* parcourt la table des noms de natures */
  510. while (i < MAX_ITEM_CONF && nat_items[i] != NULL)
  511. {
  512. if (nat_items_menu[i] != NULL)
  513. /* cette entree de la table a une traduction, on la prend */
  514. {
  515. len = strlen (nat_items_menu[i]);
  516. strcpy (BufMenu + (*lgmenu), nat_items_menu[i]);
  517. }
  518. else
  519. /* pas de traduction, on prend le nom d'origine du schema */
  520. {
  521. len = strlen (nat_items[i]);
  522. strcpy (BufMenu + (*lgmenu), nat_items[i]);
  523. }
  524. (*lgmenu) += len + 1;
  525. nbitem++;
  526. i++;
  527. }
  528. return nbitem;
  529. }
  530. /*----------------------------------------------------------------------
  531. TtaConfigSSchemaExternalName retourne dans nameUser le nom
  532. externe, dans la langue de l'utilisateur, du schema de
  533. structure dont le nom interne est nameSchema.
  534. Typ indique s'il s'agit d'un schema de document (1), de
  535. nature (2) ou d'extension (3).
  536. ----------------------------------------------------------------------*/
  537. void TtaConfigSSchemaExternalName (char *nameUser, char *nameSchema, int Typ)
  538. {
  539. int i;
  540. ThotBool found;
  541. i = 0;
  542. found = FALSE;
  543. nameUser[0] = EOS;
  544. switch (Typ)
  545. {
  546. case CONFIG_DOCUMENT_STRUCT:
  547. while (i < MAX_ITEM_CONF && !found && doc_items[i] != NULL)
  548. {
  549. if (strcmp (nameSchema, doc_items[i]) == 0)
  550. {
  551. if (doc_items_menu[i] != NULL)
  552. strcpy (nameUser, doc_items_menu[i]);
  553. found = TRUE;
  554. }
  555. else
  556. i++;
  557. }
  558. break;
  559. case CONFIG_NATURE_STRUCT:
  560. while (i < MAX_ITEM_CONF && !found && nat_items[i] != NULL)
  561. {
  562. if (strcmp (nameSchema, nat_items[i]) == 0)
  563. {
  564. if (nat_items_menu[i] != NULL)
  565. strcpy (nameUser, nat_items_menu[i]);
  566. found = TRUE;
  567. }
  568. else
  569. i++;
  570. }
  571. break;
  572. case CONFIG_EXTENSION_STRUCT:
  573. while (i < MAX_ITEM_CONF && !found && ext_items[i] != NULL)
  574. {
  575. if (strcmp (nameSchema, ext_items[i]) == 0)
  576. {
  577. if (ext_items_menu[i] != NULL)
  578. strcpy (nameUser, ext_items_menu[i]);
  579. found = TRUE;
  580. }
  581. else
  582. i++;
  583. }
  584. break;
  585. }
  586. }
  587. /*----------------------------------------------------------------------
  588. ConfigSSchemaInternalName donne le nom du schema de structure qui
  589. correspond a un nom traduit dans la langue de l'utilisateur.
  590. Si Doc est vrai, il s'agit d'un schema de document, sinon c'est
  591. un schema de nature.
  592. ----------------------------------------------------------------------*/
  593. void ConfigSSchemaInternalName (char *nameUser, char *nameSchema,
  594. ThotBool Doc)
  595. {
  596. int i;
  597. ThotBool found;
  598. i = 0;
  599. found = FALSE;
  600. nameSchema[0] = EOS;
  601. if (Doc)
  602. while (i < MAX_ITEM_CONF && !found && doc_items_menu[i] != NULL)
  603. {
  604. if (strcmp (nameUser, doc_items_menu[i]) == 0)
  605. {
  606. if (doc_items[i] != NULL)
  607. strcpy (nameSchema, doc_items[i]);
  608. found = TRUE;
  609. }
  610. else
  611. i++;
  612. }
  613. else
  614. while (i < MAX_ITEM_CONF && !found && nat_items_menu[i] != NULL)
  615. {
  616. if (strcmp (nameUser, nat_items_menu[i]) == 0)
  617. {
  618. if (nat_items[i] != NULL)
  619. strcpy (nameSchema, nat_items[i]);
  620. found = TRUE;
  621. }
  622. else
  623. i++;
  624. }
  625. }
  626. #endif /* IV */
  627. /*----------------------------------------------------------------------
  628. openConfigFile
  629. ----------------------------------------------------------------------*/
  630. static FILE *openConfigFile (const char *name, ThotBool lang)
  631. {
  632. FILE *file;
  633. const char *suffix;
  634. int i;
  635. PathBuffer DirBuffer, filename;
  636. char *app_home;
  637. if (lang)
  638. suffix = "en";
  639. else
  640. suffix = "conf";
  641. /* Search in HOME directory */
  642. app_home = TtaGetEnvString ("APP_HOME");
  643. strcpy (DirBuffer, app_home);
  644. MakeCompleteName (name, suffix, DirBuffer, filename, &i);
  645. if (!TtaFileExist (filename))
  646. {
  647. /* compose le nom du fichier a ouvrir avec le nom du directory */
  648. /* des schemas et le suffixe */
  649. strncpy (DirBuffer, SchemaPath, MAX_PATH);
  650. MakeCompleteName (name, suffix, DirBuffer, filename, &i);
  651. if (!TtaFileExist (filename))
  652. {
  653. if (strcmp (name, "Annot"))
  654. {
  655. /* it's probably a generic name */
  656. strncpy (DirBuffer, SchemaPath, MAX_PATH);
  657. MakeCompleteName ("XML", suffix, DirBuffer, filename, &i);
  658. }
  659. }
  660. }
  661. /* ouvre le fichier */
  662. file = TtaReadOpen (filename);
  663. return (file);
  664. }
  665. /*----------------------------------------------------------------------
  666. ConfigMakeMenuPres cree dans BufMenu la liste des schemas de
  667. presentation qui peuvent s'appliquer au schema de structure de
  668. nom schema.
  669. ----------------------------------------------------------------------*/
  670. int ConfigMakeMenuPres (char *schema, char *BufMenu)
  671. {
  672. int nbitem, len, indmenu;
  673. FILE *file;
  674. ThotBool stop;
  675. char line[MAX_TXT_LEN];
  676. char text[MAX_TXT_LEN];
  677. char textISO[MAX_TXT_LEN];
  678. char word[MAX_TXT_LEN];
  679. nbitem = 0;
  680. indmenu = 0;
  681. if (BufMenu != NULL)
  682. BufMenu[0] = EOS;
  683. file = openConfigFile (schema, TRUE);
  684. if (file == NULL)
  685. return 0;
  686. stop = FALSE;
  687. if (readUntil (file, "presentation", ""))
  688. do
  689. {
  690. if (fgets (line, MAX_TXT_LEN - 1, file) == NULL)
  691. stop = TRUE;
  692. else
  693. {
  694. getFirstWord ((unsigned char*)line, word);
  695. if (word[0] != EOS)
  696. /* la ligne n'est pas vide */
  697. {
  698. /* si la ligne contient un mot cle marquant le debut */
  699. /* d'une autre section, on a fini */
  700. if (singleWord ((unsigned char*)line))
  701. {
  702. if (strcmp (word, "export") == 0)
  703. stop = TRUE;
  704. else if (strcmp (word, "import") == 0)
  705. stop = TRUE;
  706. else if (strcmp (word, "translation") == 0)
  707. stop = TRUE;
  708. }
  709. if (!stop)
  710. {
  711. getStringAfterColon ((unsigned char*)line, text);
  712. if (text[0] == EOS)
  713. fprintf (stderr, "invalid line in file %s\n %s\n",
  714. schema, line);
  715. else
  716. {
  717. strcpy (textISO, (char *)AsciiTranslate (text));
  718. if (pres_items[nbitem] != NULL)
  719. TtaFreeMemory (pres_items[nbitem]);
  720. pres_items[nbitem] = (char *)TtaGetMemory (strlen(word)+1);
  721. strcpy (pres_items[nbitem], (char *)word);
  722. if (pres_items_menu[nbitem] != NULL)
  723. TtaFreeMemory (pres_items_menu[nbitem]);
  724. len = strlen (textISO) + 1;
  725. pres_items_menu[nbitem] = (char *)TtaGetMemory (len);
  726. strcpy (pres_items_menu[nbitem], (char *)textISO);
  727. if (BufMenu != NULL)
  728. {
  729. strcpy (&BufMenu[indmenu], textISO);
  730. indmenu += len;
  731. }
  732. nbitem++;
  733. }
  734. }
  735. }
  736. }
  737. }
  738. while (!stop);
  739. TtaReadClose (file);
  740. return nbitem;
  741. }
  742. /*----------------------------------------------------------------------
  743. ConfigGetPSchemaName recupere dans la table des schemas de
  744. presentation le nom interne du schema qui se trouve
  745. a l'entree de rang choix.
  746. ----------------------------------------------------------------------*/
  747. void ConfigGetPSchemaName (int choix, char *schpres)
  748. {
  749. strcpy (schpres, pres_items[choix - 1]);
  750. }
  751. /*----------------------------------------------------------------------
  752. ConfigMakeImportMenu cree dans BufMenu la liste des schemas de
  753. structure qui ont des fichiers de langue dans les
  754. directories de schemas.
  755. ----------------------------------------------------------------------*/
  756. int ConfigMakeImportMenu (char *BufMenu)
  757. {
  758. int nbitem, len, i, lgmenu;
  759. lgmenu = 0;
  760. nbitem = 0;
  761. BufMenu[0] = EOS;
  762. i = 0;
  763. /* parcourt la table des types de documents */
  764. while (i < MAX_ITEM_CONF && doc_items[i] != NULL)
  765. {
  766. if (doc_import[i])
  767. {
  768. if (doc_items_menu[i] != NULL)
  769. /* cette entree de la table a une traduction, on la prend */
  770. {
  771. len = strlen (doc_items_menu[i]);
  772. strcpy (&BufMenu[lgmenu], doc_items_menu[i]);
  773. }
  774. else
  775. /* pas de traduction, on prend le nom d'origine du schema */
  776. {
  777. len = strlen (doc_items[i]);
  778. strcpy (&BufMenu[lgmenu], doc_items[i]);
  779. }
  780. lgmenu += len + 1;
  781. nbitem++;
  782. }
  783. i++;
  784. }
  785. return nbitem;
  786. }
  787. /*----------------------------------------------------------------------
  788. ConfigMakeMenuExport cree dans BufMenu la liste des schemas de
  789. traduction qui peuvent s'appliquer au schema de structure de
  790. nom schema.
  791. ----------------------------------------------------------------------*/
  792. int ConfigMakeMenuExport (char *schema, char *BufMenu)
  793. {
  794. int indmenu;
  795. int nbitem, len;
  796. FILE *file;
  797. ThotBool stop;
  798. char line[MAX_TXT_LEN];
  799. char text[MAX_TXT_LEN];
  800. char textISO[MAX_TXT_LEN];
  801. char word[MAX_TXT_LEN];
  802. nbitem = 0;
  803. indmenu = 0;
  804. if (BufMenu != NULL)
  805. BufMenu[0] = EOS;
  806. file = openConfigFile (schema, TRUE);
  807. if (file == NULL)
  808. return 0;
  809. stop = FALSE;
  810. if (readUntil (file, "export", ""))
  811. do
  812. {
  813. if (fgets (line, MAX_TXT_LEN - 1, file) == NULL)
  814. stop = TRUE;
  815. else
  816. {
  817. getFirstWord ((unsigned char*)line, word);
  818. if (word[0] != EOS)
  819. /* la ligne n'est pas vide */
  820. {
  821. /* si la ligne contient un mot cle marquant le debut */
  822. /* d'une autre section, on a fini */
  823. if (singleWord ((unsigned char*)line))
  824. {
  825. if (strcmp (word, "presentation") == 0)
  826. stop = TRUE;
  827. else if (strcmp (word, "import") == 0)
  828. stop = TRUE;
  829. else if (strcmp (word, "translation") == 0)
  830. stop = TRUE;
  831. }
  832. if (!stop)
  833. {
  834. getStringAfterColon ((unsigned char*)line, text);
  835. if (text[0] == EOS)
  836. fprintf (stderr, "invalid line in file %s\n %s\n", schema, line);
  837. else
  838. {
  839. strcpy (textISO, (char *)AsciiTranslate (text));
  840. if (export_items[nbitem] != NULL)
  841. TtaFreeMemory (export_items[nbitem]);
  842. export_items[nbitem] = (char *)TtaGetMemory (strlen (word) + 10);
  843. strcpy (export_items[nbitem], word);
  844. if (export_items_menu[nbitem] != NULL)
  845. TtaFreeMemory (export_items_menu[nbitem]);
  846. len = strlen (textISO) + 1;
  847. export_items_menu[nbitem] = (char *)TtaGetMemory (len);
  848. strcpy (export_items_menu[nbitem], textISO);
  849. if (BufMenu != NULL)
  850. {
  851. strcpy (&BufMenu[indmenu], textISO);
  852. indmenu += len;
  853. }
  854. nbitem++;
  855. }
  856. }
  857. }
  858. }
  859. }
  860. while (!stop);
  861. TtaReadClose (file);
  862. return nbitem;
  863. }
  864. /*----------------------------------------------------------------------
  865. ConfigGetExportSchemaName recupere dans la table des schemas de
  866. traduction le nom interne du schema qui se trouve
  867. a l'entree de rang choix.
  868. ----------------------------------------------------------------------*/
  869. void ConfigGetExportSchemaName (int choix, char *schtrad)
  870. {
  871. strcpy (schtrad, export_items[choix - 1]);
  872. }
  873. /*----------------------------------------------------------------------
  874. Translate
  875. ----------------------------------------------------------------------*/
  876. static ThotBool Translate (PtrSSchema pSS, char *word, char *trans)
  877. {
  878. ThotBool found;
  879. int i, j;
  880. PtrTtAttribute pAttr;
  881. found = FALSE;
  882. /* cherche le mot a traduire d'abord parmi les noms d'elements */
  883. for (i = 0; i < pSS->SsNRules; i++)
  884. if (pSS->SsRule->SrElem[i]->SrName != NULL &&
  885. strcmp ((char *)AsciiTranslate (word), pSS->SsRule->SrElem[i]->SrName) == 0)
  886. {
  887. TtaFreeMemory (pSS->SsRule->SrElem[i]->SrName);
  888. pSS->SsRule->SrElem[i]->SrName = TtaStrdup ((char *)AsciiTranslate (trans));
  889. found = TRUE;
  890. }
  891. /* cherche ensuite parmi les noms d'attributs et de valeurs d'attributs */
  892. for (i = 0; i < pSS->SsNAttributes; i++)
  893. {
  894. pAttr = pSS->SsAttribute->TtAttr[i];
  895. if (pAttr->AttrName != NULL &&
  896. strcmp ((char *)AsciiTranslate (word), pAttr->AttrName) == 0)
  897. {
  898. TtaFreeMemory (pAttr->AttrName);
  899. pAttr->AttrName = TtaStrdup ((char *)AsciiTranslate (trans));
  900. found = TRUE;
  901. }
  902. else if (pAttr->AttrType == AtEnumAttr)
  903. for (j = 0; j < pAttr->AttrNEnumValues; j++)
  904. if (strcmp ((char *)AsciiTranslate (word), pAttr->AttrEnumValue[j]) == 0)
  905. {
  906. strncpy (pAttr->AttrEnumValue[j],
  907. (char *)AsciiTranslate (trans), MAX_NAME_LENGTH - 1);
  908. found = TRUE;
  909. }
  910. }
  911. /* cherche enfin parmi les regles d'extension, si c'est un schema d'extension */
  912. if (pSS->SsExtension)
  913. if (pSS->SsNExtensRules > 0 && pSS->SsExtensBlock != NULL)
  914. for (i = 0; i < pSS->SsNExtensRules; i++)
  915. if (pSS->SsExtensBlock->EbExtensRule[i].SrName != NULL &&
  916. strcmp ((char *)AsciiTranslate (word), pSS->SsExtensBlock->EbExtensRule[i].SrName) == 0)
  917. {
  918. TtaFreeMemory (pSS->SsExtensBlock->EbExtensRule[i].SrName);
  919. pSS->SsExtensBlock->EbExtensRule[i].SrName =
  920. TtaStrdup ((char *)AsciiTranslate (trans));
  921. found = TRUE;
  922. }
  923. return found;
  924. }
  925. /*----------------------------------------------------------------------
  926. ConfigTranslateSSchema
  927. ----------------------------------------------------------------------*/
  928. void ConfigTranslateSSchema (PtrSSchema pSS)
  929. {
  930. FILE *file;
  931. char *line;
  932. char *text;
  933. char *word;
  934. ThotBool stop, error;
  935. if (pSS == NULL)
  936. return;
  937. /* ouvre le fichier de configuration langue associe' au schema */
  938. file = openConfigFile (pSS->SsName, TRUE);
  939. if (file == NULL)
  940. /* pas de fichier langue associe' a ce schema de structure */
  941. return;
  942. stop = FALSE;
  943. /* avance dans le fichier jusqu'a la ligne qui contient le seul */
  944. /* mot "translation" */
  945. line = (char *)TtaGetMemory (MAX_TXT_LEN);
  946. text = (char *)TtaGetMemory (MAX_TXT_LEN);
  947. word = (char *)TtaGetMemory (MAX_TXT_LEN);
  948. if (readUntil (file, "translation", ""))
  949. /* lit le fichier ligne a ligne */
  950. do
  951. {
  952. error = FALSE;
  953. /* lit une ligne du fichier */
  954. if (fgets (line, MAX_TXT_LEN - 1, file) == NULL)
  955. /* fin de fichier */
  956. stop = TRUE;
  957. else
  958. {
  959. /* prend le premier mot de la ligne */
  960. getFirstWord ((unsigned char*)line, word);
  961. if (word[0] != EOS)
  962. /* la ligne n'est pas vide */
  963. {
  964. /* si la ligne contient un mot cle marquant le debut */
  965. /* d'une autre section, on a fini */
  966. if (singleWord ((unsigned char*)line))
  967. {
  968. if (strcmp (word, "presentation") == 0)
  969. stop = TRUE;
  970. else if (strcmp (word, "export") == 0)
  971. stop = TRUE;
  972. else if (strcmp (word, "import") == 0)
  973. stop = TRUE;
  974. else
  975. {
  976. fprintf (stderr, "invalid line in file %s\n %s\n",
  977. pSS->SsName, line);
  978. error = TRUE;
  979. }
  980. }
  981. if (!stop && !error)
  982. {
  983. /* cherche la chaine de caracteres qui suit ':' */
  984. getStringAfterColon ((unsigned char*)line, text);
  985. if (text[0] == EOS)
  986. fprintf (stderr, "invalid line in file %s\n %s\n",
  987. pSS->SsName, line);
  988. else if (!Translate (pSS, word, text))
  989. fprintf (stderr, "invalid line in file %s\n %s\n",
  990. pSS->SsName, line);
  991. }
  992. }
  993. }
  994. }
  995. while (!stop);
  996. TtaFreeMemory (line);
  997. TtaFreeMemory (text);
  998. TtaFreeMemory (word);
  999. TtaReadClose (file);
  1000. }
  1001. /*----------------------------------------------------------------------
  1002. ConfigDefaultPSchema retourne dans schpres le nom du 1er
  1003. schema de presentation associe' au schema de structure schstr
  1004. dans le fichier .conf correspondant.
  1005. Retourne FALSE si pas trouve', TRUE si OK.
  1006. ----------------------------------------------------------------------*/
  1007. ThotBool ConfigDefaultPSchema (char *schstr, char **schpres)
  1008. {
  1009. ThotBool ok, stop;
  1010. FILE *file;
  1011. char line[MAX_TXT_LEN];
  1012. char word[MAX_TXT_LEN];
  1013. ok = FALSE;
  1014. *schpres = NULL;
  1015. /* ouvre le fichier .conf associe' au schema de structure */
  1016. file = openConfigFile (schstr, FALSE);
  1017. if (file != NULL)
  1018. /* on a ouvert le fichier .conf */
  1019. {
  1020. /* on cherche la premiere ligne qui commence par le mot "style" */
  1021. stop = FALSE;
  1022. do
  1023. /* lit une ligne */
  1024. if (fgets (line, MAX_TXT_LEN - 1, file) == NULL)
  1025. /* fin de fichier */
  1026. stop = TRUE;
  1027. else
  1028. {
  1029. /* prend le premier mot de la ligne */
  1030. getFirstWord ((unsigned char*)line, word);
  1031. if (strcmp (word, "style") == 0)
  1032. {
  1033. /* le 1er mot est "style". Cherche le mot qui suit : c'est le */
  1034. /* nom du schema de presentation cherche' */
  1035. getSecondWord ((unsigned char *)line, word);
  1036. if (word[0] != EOS)
  1037. /* il y a bien un 2eme mot : succes */
  1038. {
  1039. *schpres = TtaStrdup (word);
  1040. ok = TRUE;
  1041. }
  1042. stop = TRUE;
  1043. }
  1044. }
  1045. while (!stop);
  1046. TtaReadClose (file);
  1047. }
  1048. return ok;
  1049. }
  1050. /*----------------------------------------------------------------------
  1051. readUntilStyle lit le fichier file (qui doit etre ouvert)
  1052. jusqu'a trouver une ligne qui contienne le mot "style"
  1053. suivi du nom namePSchema.
  1054. Retourne TRUE si trouve, FALSE sinon.
  1055. ----------------------------------------------------------------------*/
  1056. static ThotBool readUntilStyle (FILE *file, char *namePSchema)
  1057. {
  1058. ThotBool stop;
  1059. ThotBool ok;
  1060. char line[MAX_TXT_LEN];
  1061. char word[MAX_TXT_LEN];
  1062. char name[MAX_TXT_LEN];
  1063. stop = FALSE;
  1064. ok = FALSE;
  1065. do
  1066. if (fgets (line, MAX_TXT_LEN - 1, file) == NULL)
  1067. /* fin de fichier */
  1068. stop = TRUE;
  1069. else
  1070. {
  1071. getFirstWord ((unsigned char*)line, word);
  1072. if (strcmp (word, "style") == 0)
  1073. {
  1074. getSecondWord ((unsigned char *)line, word);
  1075. strcpy (name, word);
  1076. if (strcmp (name, namePSchema) == 0 ||
  1077. strcmp (name, "XMLP") == 0)
  1078. ok = TRUE;
  1079. }
  1080. }
  1081. while (!stop && !ok);
  1082. return ok;
  1083. }
  1084. /*----------------------------------------------------------------------
  1085. openConfFileAndReadUntil ouvre le fichier .conf qui concerne
  1086. le schema de structure pSS et avance dans ce fichier
  1087. jusqu'a la ligne qui marque la section de nom sectName.
  1088. Retourne le file descriptor du fichier si on a trouve'
  1089. le fichier .conf et la section, NULL sinon.
  1090. ----------------------------------------------------------------------*/
  1091. static FILE *openConfFileAndReadUntil (PtrSSchema pSS, const char *sectName)
  1092. {
  1093. FILE *file;
  1094. /* ouvre le fichier .conf */
  1095. file = NULL;
  1096. if (pSS != NULL)
  1097. file = openConfigFile (pSS->SsName, FALSE);
  1098. if (file != NULL)
  1099. /* on a ouvert le fichier */
  1100. {
  1101. /* cherche la ligne "style xxxx" qui correspond au schema P concerne' */
  1102. if (!readUntilStyle (file, pSS->SsDefaultPSchema))
  1103. /* pas trouve' */
  1104. {
  1105. TtaReadClose (file);
  1106. file = NULL;
  1107. }
  1108. else
  1109. /* cherche le debut de la section voulue */
  1110. if (!readUntil (file, sectName, ""))
  1111. /* pas trouve' */
  1112. {
  1113. TtaReadClose (file);
  1114. file = NULL;
  1115. }
  1116. }
  1117. return file;
  1118. }
  1119. /*----------------------------------------------------------------------
  1120. getNextLineInSection lit dans line la prochaine ligne du
  1121. fichier file qui fasse partie de la meme section.
  1122. Retourne TRUE si succes, FALSE si on a atteint la fin
  1123. de la section courante ou du fichier.
  1124. ----------------------------------------------------------------------*/
  1125. static ThotBool getNextLineInSection (FILE * file, char *line)
  1126. {
  1127. ThotBool ok, stop;
  1128. char word1[MAX_TXT_LEN];
  1129. char word2[MAX_TXT_LEN];
  1130. ok = FALSE;
  1131. stop = FALSE;
  1132. do
  1133. /* lit une ligne */
  1134. if (fgets (line, MAX_TXT_LEN - 1, file) == NULL)
  1135. /* fin de fichier */
  1136. stop = TRUE;
  1137. else
  1138. {
  1139. /* prend le permier mot de la ligne lue */
  1140. getFirstWord ((unsigned char*)line, word1);
  1141. if (word1[0] != EOS)
  1142. /* la ligne n'est pas vide */
  1143. {
  1144. /* si la ligne contient un mot cle marquant le debut d'une autre */
  1145. /* section, on a fini */
  1146. if (singleWord ((unsigned char*)line))
  1147. /* la ligne contient un seul mot */
  1148. {
  1149. if (strcmp (word1, "open") == 0)
  1150. stop = TRUE;
  1151. else if (strcmp (word1, "geometry") == 0)
  1152. stop = TRUE;
  1153. else if (strcmp (word1, "presentation") == 0)
  1154. stop = TRUE;
  1155. else if (strcmp (word1, "options") == 0)
  1156. stop = TRUE;
  1157. else
  1158. /* ligne contenant un seul mot. on considere que c'est OK... */
  1159. ok = TRUE;
  1160. }
  1161. else
  1162. /* la ligne contient plus d'un mot */
  1163. if (strcmp (word1, "style") == 0)
  1164. {
  1165. getSecondWord ((unsigned char *)line, word2);
  1166. if (word2[0] != ':')
  1167. /* la ligne est du type "style xxxx". C'est une fin de section */
  1168. stop = TRUE;
  1169. else
  1170. ok = TRUE;
  1171. }
  1172. else
  1173. /* la ligne ne commence pas par "style". OK */
  1174. ok = TRUE;
  1175. }
  1176. }
  1177. while (!stop && !ok);
  1178. return ok;
  1179. }
  1180. /*----------------------------------------------------------------------
  1181. ConfigKeyboard.
  1182. ----------------------------------------------------------------------*/
  1183. void ConfigKeyboard (int *x, int *y)
  1184. {
  1185. FILE *file;
  1186. char seqLine[MAX_TXT_LEN];
  1187. char line[MAX_TXT_LEN];
  1188. int nbIntegers;
  1189. *x = 600;
  1190. *y = 100;
  1191. file = openConfigFile ("keyboard", FALSE);
  1192. if (file == NULL)
  1193. return;
  1194. getNextLineInSection (file, line);
  1195. /* extrait la partie de la ligne qui suit les deux-points */
  1196. getStringAfterColon ((unsigned char*)line, seqLine);
  1197. if (seqLine[0] != EOS)
  1198. /* extrait les 4 entiers */
  1199. nbIntegers = sscanf (seqLine, "%d %d", x, y);
  1200. TtaReadClose (file);
  1201. }
  1202. /*----------------------------------------------------------------------
  1203. getXYWidthHeight
  1204. Lit les 4 entiers x, y, width, height qui suivent les deux-points
  1205. dans une ligne de la section open ou geometry d'un fichier .conf
  1206. Retourne TRUE si succes.
  1207. ----------------------------------------------------------------------*/
  1208. static ThotBool getXYWidthHeight (char *line, PtrDocument pDoc, int *x,
  1209. int *y, int *width, int *height)
  1210. {
  1211. char seqLine[MAX_TXT_LEN];
  1212. int nbIntegers;
  1213. ThotBool result;
  1214. result = FALSE;
  1215. /* extrait la partie de la ligne qui suit les deux-points */
  1216. getStringAfterColon ((unsigned char*)line, seqLine);
  1217. if (seqLine[0] != EOS)
  1218. {
  1219. /* extrait les 4 entiers */
  1220. nbIntegers = sscanf (seqLine, "%d %d %d %d", x, y, width, height);
  1221. if (nbIntegers != 4)
  1222. fprintf (stderr, "invalid line in file %s.conf\n %s\n",
  1223. pDoc->DocSSchema->SsName, line);
  1224. else
  1225. result = TRUE;
  1226. }
  1227. /* check the position/size is coherent */
  1228. if (*x < 0)
  1229. *x = 0;
  1230. if (*y < 0)
  1231. *y = 0;
  1232. if (*width <= 0)
  1233. *width = 800;
  1234. if (*height <= 0)
  1235. *height = 600;
  1236. return result;
  1237. }
  1238. /*----------------------------------------------------------------------
  1239. ConfigOpenFirstViews ouvre, pour le document pDoc, les vues
  1240. specifiees dans la section open du fichier de
  1241. configuration .conf
  1242. ----------------------------------------------------------------------*/
  1243. void ConfigOpenFirstViews (PtrDocument pDoc)
  1244. {
  1245. FILE *file;
  1246. int x, y, width, height;
  1247. char line[MAX_TXT_LEN];
  1248. char nameview[MAX_TXT_LEN];
  1249. /* ouvre le fichier .conf du document et avance jusqu'a la section "open" */
  1250. file = openConfFileAndReadUntil (pDoc->DocSSchema, "open");
  1251. if (file != NULL)
  1252. {
  1253. /* on a trouve' le debut de la section open. On lit le fichier .conf */
  1254. /* ligne par ligne, jusqu'a la fin de cette section */
  1255. while (getNextLineInSection (file, line))
  1256. {
  1257. /* le 1er mot de la ligne est le nom d'une vue a ouvrir */
  1258. getFirstWord ((unsigned char*)line, nameview);
  1259. /* lit les coordonnees (x, y) et dimensions (width, height) de la */
  1260. /* frame ou doit s'afficher la vue */
  1261. if (getXYWidthHeight (line, pDoc, &x, &y, &width, &height))
  1262. /* lecture reussie, on ouvre la vue */
  1263. OpenViewByName (pDoc, nameview, x, y, width, height);
  1264. }
  1265. TtaReadClose (file);
  1266. }
  1267. }
  1268. /*----------------------------------------------------------------------
  1269. ConfigGetViewGeometry retourne la position (x, y) et les
  1270. dimensions (width, height) de la fenetre ou doit
  1271. s'afficher la vue de non view pour le document pDoc.
  1272. ----------------------------------------------------------------------*/
  1273. void ConfigGetViewGeometry (PtrDocument pDoc, const char *view, int *x,
  1274. int *y, int *width, int *height)
  1275. {
  1276. FILE *file;
  1277. char line[MAX_TXT_LEN];
  1278. char nameview[MAX_TXT_LEN];
  1279. ThotBool found;
  1280. *x = 0;
  1281. *y = 0;
  1282. *width = 0;
  1283. *height = 0;
  1284. /* ouvre le fichier .conf du document et avance jusqu'a la section
  1285. "open" */
  1286. file = openConfFileAndReadUntil (pDoc->DocSSchema, "open");
  1287. if (file != NULL)
  1288. {
  1289. /* on a trouve' le debut de la section open. On lit le fichier
  1290. .conf ligne par ligne, jusqu'a la ligne qui commence par le
  1291. name de la vue */
  1292. found = FALSE;
  1293. while (!found && getNextLineInSection (file, line))
  1294. {
  1295. /* le 1er mot de la ligne est le nom d'une vue */
  1296. getFirstWord ((unsigned char*)line, nameview);
  1297. /* est-ce le nom de la vue cherchee ? */
  1298. found = (strcmp (nameview, view) == 0);
  1299. }
  1300. if (!found)
  1301. /* on n'a pas trouve' dans la section "open". On cherche dans la
  1302. section "geometry" */
  1303. {
  1304. TtaReadClose (file);
  1305. file = openConfFileAndReadUntil (pDoc->DocSSchema, "geometry");
  1306. if (file != NULL)
  1307. while (!found && getNextLineInSection (file, line))
  1308. {
  1309. /* le 1er mot de la ligne est le nom d'une vue */
  1310. getFirstWord ((unsigned char*)line, nameview);
  1311. /* est-ce le nom de la vue cherchee ? */
  1312. found = (strcmp (nameview, view) == 0);
  1313. }
  1314. }
  1315. TtaReadClose (file);
  1316. if (found)
  1317. getXYWidthHeight (line, pDoc, x, y, width, height);
  1318. }
  1319. }
  1320. /*----------------------------------------------------------------------
  1321. TtaGetViewFullscreen returns true if the current window is fullscreen
  1322. ----------------------------------------------------------------------*/
  1323. ThotBool TtaGetViewFullscreen(Document doc, int view)
  1324. {
  1325. #ifdef _WX
  1326. int window_id = TtaGetDocumentWindowId( doc, -1 );
  1327. AmayaWindow * p_window = TtaGetWindowFromId( window_id );
  1328. if (p_window)
  1329. return p_window->IsFullScreen();
  1330. else
  1331. return FALSE;
  1332. #else /* _WX */
  1333. return FALSE;
  1334. #endif /* _WX */
  1335. }
  1336. /*----------------------------------------------------------------------
  1337. TtaGetViewIconized returns true if the current window is maximized
  1338. ----------------------------------------------------------------------*/
  1339. ThotBool TtaGetViewIconized(Document doc, int view)
  1340. {
  1341. #ifdef _WX
  1342. int window_id = TtaGetDocumentWindowId( doc, -1 );
  1343. AmayaWindow * p_window = TtaGetWindowFromId( window_id );
  1344. if (p_window)
  1345. return p_window->IsIconized();
  1346. else
  1347. return FALSE;
  1348. #else /* _WX */
  1349. return FALSE;
  1350. #endif /* _WX */
  1351. }
  1352. /*----------------------------------------------------------------------
  1353. TtaGetViewMaximize returns true if the current window is maximized
  1354. ----------------------------------------------------------------------*/
  1355. ThotBool TtaGetViewMaximized(Document doc, int view)
  1356. {
  1357. #ifdef _WX
  1358. int window_id = TtaGetDocumentWindowId( doc, -1 );
  1359. AmayaWindow * p_window = TtaGetWindowFromId( window_id );
  1360. if (p_window)
  1361. return p_window->IsMaximized();
  1362. else
  1363. return FALSE;
  1364. #else /* _WX */
  1365. return FALSE;
  1366. #endif /* _WX */
  1367. }
  1368. /*----------------------------------------------------------------------
  1369. TtaGetViewXYWH returns the current geometry (x, y, width, and height)
  1370. values associated with the frame where a view is displayed
  1371. ----------------------------------------------------------------------*/
  1372. void TtaGetViewXYWH (Document doc, int view, int *xmm, int *ymm, int *width,
  1373. int *height)
  1374. {
  1375. #ifdef _WX
  1376. int window_id = TtaGetDocumentWindowId( doc, -1 );
  1377. if (window_id < 0)
  1378. {
  1379. *xmm = 0;
  1380. *ymm = 0;
  1381. *width = 800;
  1382. *height = 600;
  1383. return;
  1384. }
  1385. *width = WindowTable[window_id].FrWidth;
  1386. *height = WindowTable[window_id].FrHeight;
  1387. AmayaWindow * p_window = TtaGetWindowFromId( window_id );
  1388. p_window->GetPosition( xmm, ymm );
  1389. /* check the position/size is coherent */
  1390. if (*xmm < 0)
  1391. *xmm = 0;
  1392. if (*ymm < 0)
  1393. *ymm = 0;
  1394. if (*width < 0)
  1395. *width = 800;
  1396. if (*height < 0)
  1397. *height = 600;
  1398. #endif /* _WX */
  1399. #ifdef _WINGUI
  1400. int frame;
  1401. HWND hWnd;
  1402. RECT rect;
  1403. frame = GetWindowNumber (doc, view);
  1404. hWnd = FrMainRef[frame];
  1405. /* ask Windows what's the geometry of the frame */
  1406. if (!GetWindowRect (hWnd, &rect))
  1407. *width = *height = 0;
  1408. else
  1409. {
  1410. /* convert the result into mm */
  1411. *xmm = (int) (rect.left);
  1412. *ymm = (int) (rect.top);
  1413. *width = (int) (rect.right - rect.left);
  1414. *height = (int) (rect.bottom - rect.top);
  1415. }
  1416. #endif /* _WINGUI */
  1417. return;
  1418. }
  1419. /*----------------------------------------------------------------------
  1420. TtaGetViewGeometryRegistry ret;urns the position (x, y) and sizes
  1421. (width, height) of the frame where the view is displayed. These values
  1422. are read from the Thot registry.
  1423. Parameters: document: the document.
  1424. name: the name of the view in P schema.
  1425. ----------------------------------------------------------------------*/
  1426. void TtaGetViewGeometry (Document document, const char *name, int *x, int *y,
  1427. int *width, int *height)
  1428. {
  1429. PtrDocument pDoc;
  1430. char line[MAX_TXT_LEN];
  1431. char *ptr;
  1432. UserErrorCode = 0;
  1433. *x = 0;
  1434. *y = 0;
  1435. *width = 0;
  1436. *height = 0;;
  1437. if (document < 1 || document > MAX_DOCUMENTS)
  1438. TtaError (ERR_invalid_document_parameter);
  1439. else if (document != 0)
  1440. {
  1441. pDoc = LoadedDocument[document - 1];
  1442. ptr = TtaGetEnvString (name);
  1443. if (!ptr || ptr[0] == EOS)
  1444. ConfigGetViewGeometry (pDoc, name, x, y, width, height);
  1445. else
  1446. {
  1447. sprintf (line, ":%s", ptr);
  1448. getXYWidthHeight (line, pDoc, x, y, width, height);
  1449. }
  1450. }
  1451. }
  1452. /*----------------------------------------------------------------------
  1453. TtaGetViewGeometryMM returns the position (x, y) and sizes
  1454. (width, height) of the frame where a view is displayed. The values
  1455. returned are in mm
  1456. Parameters: document: the document.
  1457. name: the name of the view in P schema.
  1458. ----------------------------------------------------------------------*/
  1459. void TtaGetViewGeometryMM (Document document, char *name, int *x,
  1460. int *y, int *width, int *height)
  1461. {
  1462. TtaGetViewGeometry (document, name, x, y, width, height);
  1463. }
  1464. /*----------------------------------------------------------------------
  1465. ConfigGetPSchemaNature retourne dans presNature le nom du
  1466. schema de presentation a appliquer a la nature de nom
  1467. nameNature dans le contexte du schema de structure pSS
  1468. ----------------------------------------------------------------------*/
  1469. ThotBool ConfigGetPSchemaNature (PtrSSchema pSS, char *nameNature,
  1470. char **presNature)
  1471. {
  1472. FILE *file;
  1473. char line[MAX_TXT_LEN];
  1474. char seqLine[MAX_TXT_LEN];
  1475. char name[MAX_TXT_LEN];
  1476. ThotBool found;
  1477. ThotBool ok;
  1478. *presNature = NULL;
  1479. ok = FALSE;
  1480. /* ouvre le fichier .conf du document et avance jusqu'a la section "presentation" */
  1481. file = openConfFileAndReadUntil (pSS, "presentation");
  1482. if (file != NULL)
  1483. {
  1484. /* on a trouve' le debut de la section presentation. On lit le fichier */
  1485. /* ligne par ligne jusqu'a la ligne qui commence par le nom de la nature */
  1486. found = FALSE;
  1487. while (!found && getNextLineInSection (file, line))
  1488. {
  1489. /* le 1er mot de la ligne est le nom d'une nature */
  1490. getFirstWord ((unsigned char*)line, name);
  1491. /* est-ce le nom de la nature cherchee ? */
  1492. found = (strcmp (name, nameNature) == 0);
  1493. }
  1494. if (found)
  1495. /* on a trouve' la ligne de la section presentation qui commence par */
  1496. /* le nom de la nature voulue */
  1497. {
  1498. /* le nom de nature est suivi, apres ":", du nom du schema de */
  1499. /* presentation a appliquer */
  1500. getStringAfterColon ((unsigned char*)line, seqLine);
  1501. if (seqLine[0] == EOS)
  1502. fprintf (stderr, "invalid line in file %s.conf\n %s\n", pSS->SsName, line);
  1503. else
  1504. {
  1505. *presNature = TtaStrdup (seqLine);
  1506. ok = TRUE;
  1507. }
  1508. }
  1509. TtaReadClose (file);
  1510. }
  1511. return ok;
  1512. }
  1513. /*----------------------------------------------------------------------
  1514. ConfigGetPresentationOption cherche, dans le fichier .conf
  1515. correspondant au schema de structure pSS, la valeur
  1516. de l'…

Large files files are truncated, but you can click here to view the full file