home *** CD-ROM | disk | FTP | other *** search
/ Tools / WinSN5.0Ver.iso / NETSCAP.50 / WIN1998.ZIP / ns / cmd / xfe / commands.c < prev    next >
Encoding:
C/C++ Source or Header  |  1998-04-08  |  93.8 KB  |  3,231 lines

  1. /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*-
  2.  *
  3.  * The contents of this file are subject to the Netscape Public License
  4.  * Version 1.0 (the "NPL"); you may not use this file except in
  5.  * compliance with the NPL.  You may obtain a copy of the NPL at
  6.  * http://www.mozilla.org/NPL/
  7.  *
  8.  * Software distributed under the NPL is distributed on an "AS IS" basis,
  9.  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
  10.  * for the specific language governing rights and limitations under the
  11.  * NPL.
  12.  *
  13.  * The Initial Developer of this code under the NPL is Netscape
  14.  * Communications Corporation.  Portions created by Netscape are
  15.  * Copyright (C) 1998 Netscape Communications Corporation.  All Rights
  16.  * Reserved.
  17.  */
  18. /* 
  19.    commands.c --- menus and toolbar.
  20.    Created: Jamie Zawinski <jwz@netscape.com>, 27-Jun-94.
  21.  */
  22.  
  23.  
  24. #include "mozilla.h"
  25. #include "xfe.h"
  26. #include "felocale.h"
  27. #include "xlate.h"
  28. #include "menu.h"
  29. #include "net.h"
  30. #include "e_kit.h"
  31. #include "prefapi.h"
  32. #include "intl_csi.h"
  33. #include <netdb.h>
  34. #ifdef FORTEZZA
  35. #include "ssl.h"
  36. #endif
  37. #include "selection.h"
  38.  
  39. #include "outline.h"
  40. #include "layers.h"
  41.  
  42.  
  43. #ifdef EDITOR
  44. #include "xeditor.h"
  45. #include "edt.h" /* just for EDT_MailDocument() */
  46. #endif /*EDITOR*/
  47.  
  48. #ifdef MOZ_MAIL_NEWS
  49. #include "msgcom.h"
  50. #include "msg_srch.h"
  51. #include "mailnews.h"
  52. #endif /* MOZ_MAIL_NEWS */
  53.  
  54. #include "il_icons.h"           /* Image icon enumeration. */
  55.  
  56. #include "mozjava.h"
  57.  
  58. #ifdef X_PLUGINS
  59. #include "np.h"
  60. #endif /* X_PLUGINS */
  61.  
  62. #ifndef NO_WEB_FONTS
  63. #include "nf.h"
  64. #endif /* NO_WEB_FONTS */
  65.  
  66. #include <Xm/RowColumn.h>
  67. #include <XmL/Grid.h>
  68.  
  69. /* for XP_GetString() */
  70. #include <xpgetstr.h>
  71. extern int XFE_SAVE_AS_TYPE_ENCODING;
  72. extern int XFE_SAVE_AS_TYPE;
  73. extern int XFE_SAVE_AS_ENCODING;
  74. extern int XFE_SAVE_AS;
  75. extern int XFE_ERROR_OPENING_FILE;
  76. extern int XFE_ERROR_DELETING_FILE;
  77. extern int XFE_LOG_IN_AS;
  78. extern int XFE_OUT_OF_MEMORY_URL;
  79. extern int XFE_FILE_OPEN;
  80. extern int XFE_PRINTING_OF_FRAMES_IS_CURRENTLY_NOT_SUPPORTED;
  81. extern int XFE_ERROR_SAVING_OPTIONS;
  82. extern int XFE_UNKNOWN_ESCAPE_CODE;
  83. extern int XFE_COULDNT_FORK;
  84. extern int XFE_EXECVP_FAILED;
  85. extern int XFE_SAVE_FRAME_AS;
  86. extern int XFE_SAVE_AS;
  87. extern int XFE_PRINT_FRAME;
  88. extern int XFE_PRINT;
  89. extern int XFE_DOWNLOAD_FILE;
  90. extern int XFE_COMPOSE_NO_SUBJECT;
  91. extern int XFE_COMPOSE;
  92. extern int XFE_NETSCAPE_UNTITLED;
  93. extern int XFE_NETSCAPE;
  94. extern int XFE_MAIL_FRAME;
  95. extern int XFE_MAIL_DOCUMENT;
  96. extern int XFE_NETSCAPE_MAIL;
  97. extern int XFE_NETSCAPE_NEWS;
  98. extern int XFE_BOOKMARKS;
  99. extern int XFE_ADDRESS_BOOK;
  100. extern int XFE_BACK;
  101. #if 0        /* Disabling back/forward in frame - dp */
  102. extern int XFE_BACK_IN_FRAME;
  103. #endif /* 0 */
  104. extern int XFE_FORWARD;
  105. extern int XFE_FORWARD_IN_FRAME;
  106. extern int XFE_CANNOT_SEE_FILE;
  107. extern int XFE_CANNOT_READ_FILE;
  108. extern int XFE_IS_A_DIRECTORY;
  109. extern int XFE_REFRESH;
  110. extern int XFE_REFRESH_FRAME;
  111.  
  112. extern int XFE_COMMANDS_ADD_BOOKMARK_USAGE;
  113. extern int XFE_COMMANDS_FIND_USAGE;
  114. extern int XFE_COMMANDS_HTML_HELP_USAGE;
  115. extern int XFE_COMMANDS_MAIL_TO_USAGE;
  116. extern int XFE_COMMANDS_OPEN_FILE_USAGE;
  117. extern int XFE_COMMANDS_OPEN_URL_USAGE;
  118. extern int XFE_COMMANDS_PRINT_FILE_USAGE;
  119. extern int XFE_COMMANDS_SAVE_AS_USAGE;
  120. extern int XFE_COMMANDS_SAVE_AS_USAGE_TWO;
  121. extern int XFE_COMMANDS_UNPARSABLE_ENCODING_FILTER_SPEC;
  122. extern int XFE_COMMANDS_UPLOAD_FILE;
  123.  
  124. extern char* help_menu_names[];
  125. extern char* directory_menu_names[];
  126.  
  127. extern MWContext * fe_reuseBrowser(MWContext *context,URL_Struct *url);
  128.  
  129. /* Local forward declarations */
  130. extern void fe_InsertMessageCompositionText(MWContext *context, 
  131.             const char *text,
  132.             XP_Bool leaveCursorAtBeginning);
  133.  
  134. extern void fe_mailfilter_cb(Widget, XtPointer, XtPointer);
  135.  
  136. /* Externs from dialog.c: */
  137. extern int fe_await_synchronous_url (MWContext *context);
  138.  
  139. /* Externs from mozilla.c */
  140. extern char * fe_MakeSashGeometry(char *old_geom_str, int pane_config,
  141.             unsigned int w, unsigned int h);
  142.  
  143.  
  144. static Boolean
  145. fe_hack_self_inserting_accelerator (Widget widget, XtPointer closure,
  146.                     XtPointer call_data)
  147. {
  148. #if 1
  149.  
  150.   /* But actually we're not using this any more. */
  151.   return False;
  152.  
  153. #else /* 0 */
  154.  
  155. /* This is completely disgusting.
  156.    We want certain keys to be equivalent to menu items everywhere EXCEPT
  157.    in text fields, where we would like them to do the obvious thing.
  158.    This pile of code is what we need to do to implement that!!
  159.  */
  160.  
  161.   XmPushButtonCallbackStruct *cd = (XmPushButtonCallbackStruct *) call_data;
  162.   MWContext *context = (MWContext *) closure;
  163.   Widget focus = XmGetFocusWidget (CONTEXT_WIDGET (context));
  164.   Modifiers mods;
  165.   KeySym k;
  166.   char *s;
  167.  
  168.   if (!focus||
  169.       (!XmIsText (focus) && !XmIsTextField (focus)))
  170.     return False;
  171.  
  172.   if (!cd || !cd->event)    /* can this happen? */
  173.     return False;
  174.  
  175.   if (cd->event->xany.type != KeyPress)
  176.     return False;
  177.  
  178.   /* If any bits but control, shift, or lock are on, this can't be a
  179.      self-inserting character. */
  180.   if (cd->event->xkey.state & ~(ControlMask|ShiftMask|LockMask))
  181.     return False;
  182.  
  183.   k = XtGetActionKeysym (cd->event, &mods);
  184.  
  185.   if (! k)
  186.     return False;
  187.  
  188.   s = XKeysymToString (k);
  189.   if (! s)
  190.     return False;
  191.  
  192.   if (*s < ' ' || *s >= 127)  /* non-printing char */
  193.     return False;
  194.  
  195.   if (s[1])        /* Not a self-inserting character - string is
  196.                probably "osfCancel" or some such nonsense. */
  197.     return False;
  198.  
  199. /* fe_text_insert moved to selection.c */
  200.   fe_text_insert (focus, s, CS_LATIN1);
  201.   return True;
  202.  
  203. #endif /* 0 */
  204. }
  205.  
  206. static void
  207. fe_page_forward_cb (Widget widget, XtPointer closure, XtPointer call_data)
  208. {
  209.   MWContext *context = (MWContext *) closure;
  210.   Widget sb = CONTEXT_DATA (context)->vscroll;
  211.   XmScrollBarCallbackStruct cb;
  212.   int pi = 0, v = 0, max = 1, min = 0;
  213.  
  214.   XP_ASSERT(sb);
  215.   if (!sb) return;
  216.   if (fe_hack_self_inserting_accelerator (widget, closure, call_data))
  217.     return;
  218.   XtVaGetValues (sb, XmNpageIncrement, &pi, XmNvalue, &v,
  219.          XmNmaximum, &max, XmNminimum, &min, 0);
  220.   cb.reason = XmCR_PAGE_INCREMENT;
  221.   cb.event = 0;
  222.   cb.pixel = 0;
  223.   cb.value = v + pi;
  224.   if (cb.value > max - pi) cb.value = max - pi;
  225.   if (cb.value < min) cb.value = min;
  226.   XtCallCallbacks (sb, XmNvalueChangedCallback, &cb);
  227. }
  228.  
  229.  
  230. static void
  231. fe_page_backward_cb (Widget widget, XtPointer closure, XtPointer call_data)
  232. {
  233.   MWContext *context = (MWContext *) closure;
  234.   Widget sb = CONTEXT_DATA (context)->vscroll;
  235.   XmScrollBarCallbackStruct cb;
  236.   int pi = 0, v = 0, min = 0;
  237.  
  238.   XP_ASSERT(sb);
  239.   if (!sb) return;
  240.   fe_UserActivity (context);
  241.   if (fe_hack_self_inserting_accelerator (widget, closure, call_data))
  242.     return;
  243.   XtVaGetValues (sb, XmNpageIncrement, &pi, XmNvalue, &v, XmNminimum, &min, 0);
  244.   cb.reason = XmCR_PAGE_INCREMENT;
  245.   cb.event = 0;
  246.   cb.pixel = 0;
  247.   cb.value = v - pi;
  248.   if (cb.value < min) cb.value = min;
  249.   XtCallCallbacks (sb, XmNvalueChangedCallback, &cb);
  250. }
  251.  
  252.  
  253. static void
  254. fe_line_forward_cb (Widget widget, XtPointer closure, XtPointer call_data)
  255. {
  256.   MWContext *context = (MWContext *) closure;
  257.   Widget sb = CONTEXT_DATA (context)->vscroll;
  258.   XmScrollBarCallbackStruct cb;
  259.   int li = 0, v = 0, max = 1, min = 0;
  260.  
  261. #ifdef EDITOR
  262.   if (context->is_editor) return;
  263. #endif /* EDITOR */
  264.     
  265.   XP_ASSERT(sb);
  266.   if (!sb) return;
  267.   fe_UserActivity (context);
  268.   if (fe_hack_self_inserting_accelerator (widget, closure, call_data))
  269.     return;
  270.   XtVaGetValues (sb, XmNincrement, &li, XmNvalue, &v,
  271.          XmNmaximum, &max, XmNminimum, &min, 0);
  272.   cb.reason = XmCR_INCREMENT;
  273.   cb.event = 0;
  274.   cb.pixel = 0;
  275.   cb.value = v + li;
  276.   if (cb.value > max - li) cb.value = max - li;
  277.   if (cb.value < min) cb.value = min;
  278.   XtCallCallbacks (sb, XmNvalueChangedCallback, &cb);
  279. }
  280.  
  281.  
  282. static void
  283. fe_line_backward_cb (Widget widget, XtPointer closure, XtPointer call_data)
  284. {
  285.   MWContext *context = (MWContext *) closure;
  286.   Widget sb = CONTEXT_DATA (context)->vscroll;
  287.   XmScrollBarCallbackStruct cb;
  288.   int li = 0, v = 0, min = 0;
  289.  
  290. #ifdef EDITOR
  291.   if (context->is_editor) return;
  292. #endif /* EDITOR */
  293.     
  294.   XP_ASSERT(sb);
  295.   if (!sb) return;
  296.   fe_UserActivity (context);
  297.   if (fe_hack_self_inserting_accelerator (widget, closure, call_data))
  298.     return;
  299.   XtVaGetValues (sb, XmNincrement, &li, XmNvalue, &v, XmNminimum, &min, 0);
  300.   cb.reason = XmCR_INCREMENT;
  301.   cb.event = 0;
  302.   cb.pixel = 0;
  303.   cb.value = v - li;
  304.   if (cb.value < min) cb.value = min;
  305.   XtCallCallbacks (sb, XmNvalueChangedCallback, &cb);
  306. }
  307.  
  308. static void
  309. fe_column_forward_cb (Widget widget, XtPointer closure, XtPointer call_data)
  310. {
  311.   MWContext *context = (MWContext *) closure;
  312.   Widget sb = CONTEXT_DATA (context)->hscroll;
  313.   XmScrollBarCallbackStruct cb;
  314.   int li = 0, v = 0, min = 0;
  315.  
  316.   XP_ASSERT(sb);
  317.   if (!sb) return;
  318.   fe_UserActivity (context);
  319.   if (fe_hack_self_inserting_accelerator (widget, closure, call_data))
  320.     return;
  321.   XtVaGetValues (sb, XmNincrement, &li, XmNvalue, &v, XmNminimum, &min, 0);
  322.   cb.reason = XmCR_INCREMENT;
  323.   cb.event = 0;
  324.   cb.pixel = 0;
  325.   cb.value = v - li;
  326.   if (cb.value < min) cb.value = min;
  327.   XtCallCallbacks (sb, XmNvalueChangedCallback, &cb);
  328. }
  329.  
  330.  
  331. static void
  332. fe_column_backward_cb (Widget widget, XtPointer closure, XtPointer call_data)
  333. {
  334.   MWContext *context = (MWContext *) closure;
  335.   Widget sb = CONTEXT_DATA (context)->hscroll;
  336.   XmScrollBarCallbackStruct cb;
  337.   int li = 0, v = 0, max = 1, min = 0;
  338.  
  339.   XP_ASSERT(sb);
  340.   if (!sb) return;
  341.   fe_UserActivity (context);
  342.   if (fe_hack_self_inserting_accelerator (widget, closure, call_data))
  343.     return;
  344.   XtVaGetValues (sb, XmNincrement, &li, XmNvalue, &v,
  345.          XmNmaximum, &max, XmNminimum, &min, 0);
  346.   cb.reason = XmCR_INCREMENT;
  347.   cb.event = 0;
  348.   cb.pixel = 0;
  349.   cb.value = v + li;
  350.   if (cb.value > max - li) cb.value = max - li;
  351.   if (cb.value < min) cb.value = min;
  352.   XtCallCallbacks (sb, XmNvalueChangedCallback, &cb);
  353. }
  354.  
  355.  
  356. /* File menu
  357.  */
  358.  
  359. static void
  360. fe_open_url_cb (Widget widget, XtPointer closure, XtPointer call_data)
  361. {
  362.   MWContext *context = (MWContext *) closure;
  363.   fe_UserActivity (context);
  364.   fe_OpenURLDialog(context);
  365. }
  366.  
  367. void
  368. fe_upload_file_cb (Widget widget, XtPointer closure, XtPointer call_data)
  369. {
  370.   MWContext *context = (MWContext *) closure;
  371.   XmString xm_title;
  372.   char *title = XP_GetString(XFE_COMMANDS_UPLOAD_FILE);
  373.   char *file, *msg;
  374.  
  375.   fe_UserActivity (context);
  376.   if (fe_hack_self_inserting_accelerator (widget, closure, call_data))
  377.     return;
  378.  
  379.   file = fe_ReadFileName (context, title, 0, True, 0);
  380.  
  381.   /* validate filename */
  382.   if (file) {
  383.     if (!fe_isFileExist(file)) {
  384.       msg = PR_smprintf( XP_GetString( XFE_CANNOT_SEE_FILE ), file);
  385.       if (msg) {
  386.     XFE_Alert(context, msg);
  387.     XP_FREE(msg);
  388.       }
  389.       XP_FREE (file);
  390.       file = NULL;
  391.     }
  392.     else if (!fe_isFileReadable(file)) {
  393.       msg = PR_smprintf( XP_GetString( XFE_CANNOT_READ_FILE ) , file);
  394.       if (msg) {
  395.     XFE_Alert(context, msg);
  396.     XP_FREE(msg);
  397.       }
  398.       XP_FREE (file);
  399.       file = NULL;
  400.     }
  401.     else if (fe_isDir(file)) {
  402.       msg = PR_smprintf( XP_GetString( XFE_IS_A_DIRECTORY ), file);
  403.       if (msg) {
  404.       XFE_Alert(context, msg);
  405.       if (msg) XP_FREE(msg);
  406.       }
  407.       XP_FREE (file);
  408.       file = NULL;
  409.     }
  410.   }
  411.  
  412.   if (file)
  413.     {
  414.       History_entry *he = SHIST_GetCurrent (&context->hist);
  415.       URL_Struct *url;
  416.  
  417.       if (he && he->address && (XP_STRNCMP (he->address, "ftp://", 6) == 0)
  418.       && he->address [strlen (he->address)-1] == '/')
  419.     {
  420.       url = NET_CreateURLStruct (he->address, NET_SUPER_RELOAD);
  421.       if (!url)
  422.         {
  423.           XP_FREE (file);
  424.           return;
  425.         }
  426.       url->method = URL_POST_METHOD;
  427.       url->files_to_post = XP_ALLOC (2);
  428.       if (!url->files_to_post)
  429.         {
  430.           XP_FREE (file);
  431.           return;
  432.         }
  433.  
  434.       url->files_to_post [0] = XP_STRDUP ((const char *) file);
  435.       url->files_to_post [1] = 0;
  436.  
  437.       fe_GetURL (context, url, FALSE);
  438.     }
  439.  
  440.       XP_FREE (file);
  441.     }
  442. }
  443.  
  444. void
  445. fe_reload_cb (Widget widget, XtPointer closure, XtPointer call_data)
  446. {
  447.   MWContext *context = (MWContext *) closure;
  448.   XmPushButtonCallbackStruct *cd = (XmPushButtonCallbackStruct *) call_data;
  449.   
  450.   fe_UserActivity (context);
  451.   if (fe_hack_self_inserting_accelerator (widget, closure, call_data))
  452.     return;
  453.   
  454.   if (cd && cd->event->xkey.state & ShiftMask)
  455.     fe_ReLayout (context, NET_SUPER_RELOAD);
  456.   else
  457.     fe_ReLayout (context, NET_NORMAL_RELOAD);
  458. }
  459.  
  460. /* not static -- it's needed by src/HTMLView.cpp */
  461. void
  462. fe_abort_cb (Widget widget, XtPointer closure, XtPointer call_data)
  463. {
  464.   MWContext *context = (MWContext *) closure;
  465.   fe_UserActivity (context);
  466.   if (fe_hack_self_inserting_accelerator (widget, closure, call_data))
  467.     return;
  468.   fe_AbortCallback (widget, closure, call_data);
  469. }
  470.  
  471. void
  472. fe_refresh_cb (Widget widget, XtPointer closure, XtPointer call_data)
  473. {
  474.   MWContext *context = (MWContext *) closure;
  475.   Widget wid;
  476.   Display *dpy;
  477.   Window win;
  478.   Dimension w = 0, h = 0;
  479.   XGCValues gcv;
  480.   GC gc;
  481.  
  482.   if (fe_IsGridParent (context)) context = fe_GetFocusGridOfContext (context);
  483.   XP_ASSERT (context);
  484.   if (!context) return;
  485.  
  486.   wid = CONTEXT_DATA (context)->drawing_area;
  487.   if (wid == NULL) return;
  488.  
  489.   dpy = XtDisplay (wid);
  490.   win = XtWindow (wid);
  491.  
  492.   fe_UserActivity (context);
  493.   if (fe_hack_self_inserting_accelerator (widget, closure, call_data))
  494.     return;
  495.  
  496.   XtVaGetValues (wid, XmNbackground, &gcv.foreground,
  497.          XmNwidth, &w, XmNheight, &h, 0);
  498.   gc = XCreateGC (dpy, win, GCForeground, &gcv);
  499.   XFillRectangle (dpy, win, gc, 0, 0, w, h);
  500.   XFreeGC (dpy, gc);
  501.  
  502.   if (context->compositor) {
  503.     XP_Rect rect;
  504.     
  505.     rect.left = CONTEXT_DATA(context)->document_x;
  506.     rect.top = CONTEXT_DATA(context)->document_y;
  507.     rect.right = rect.left + w;
  508.     rect.bottom = rect.top + h;
  509.     CL_UpdateDocumentRect(context->compositor,
  510.               &rect, (PRBool)FALSE);
  511.   }
  512. }
  513.  
  514.  
  515. char **fe_encoding_extensions = 0; /* gag.  used by mkcache.c. */
  516.  
  517.  
  518.  
  519. #ifdef EDITOR
  520. /*
  521.  *    Hack, hack, hack. These are in editor.c, please move the menu
  522.  *    definition there.
  523.  */
  524. extern void fe_editor_view_source_cb(Widget, XtPointer, XtPointer);
  525. extern void fe_editor_edit_source_cb(Widget, XtPointer, XtPointer);
  526. extern void fe_editor_browse_doc_cb(Widget, XtPointer, XtPointer);
  527. extern void fe_editor_about_cb(Widget, XtPointer, XtPointer);
  528. extern void fe_editor_open_file_cb(Widget, XtPointer, XtPointer);
  529. extern void fe_editor_edit_cb(Widget, XtPointer, XtPointer);
  530. extern void fe_editor_paragraph_style_menu_cb(Widget, XtPointer, XtPointer);
  531. extern void fe_editor_paragraph_style_cb(Widget, XtPointer, XtPointer);
  532. extern void fe_editor_new_cb(Widget, XtPointer, XtPointer);
  533. extern void fe_editor_new_from_wizard_cb(Widget, XtPointer, XtPointer);
  534. extern void fe_editor_new_from_template_cb(Widget, XtPointer, XtPointer);
  535. extern void fe_editor_open_file_cb(Widget, XtPointer, XtPointer);
  536. extern void fe_editor_save_cb(Widget, XtPointer, XtPointer);
  537. extern void fe_editor_save_as_cb(Widget, XtPointer, XtPointer);
  538. extern void fe_editor_edit_menu_cb(Widget, XtPointer, XtPointer);
  539. extern void fe_editor_undo_cb(Widget, XtPointer, XtPointer);
  540. extern void fe_editor_redo_cb(Widget, XtPointer, XtPointer);
  541. extern void fe_editor_view_menu_cb(Widget, XtPointer, XtPointer);
  542. extern void fe_editor_properties_menu_cb(Widget, XtPointer, XtPointer);
  543. extern void fe_editor_hrule_properties_cb(Widget, XtPointer, XtPointer);
  544. extern void fe_editor_display_tables_cb(Widget, XtPointer, XtPointer);
  545. extern void fe_editor_paragraph_marks_cb(Widget, XtPointer, XtPointer);
  546. extern void fe_editor_insert_menu_cb(Widget, XtPointer, XtPointer);
  547. extern void fe_editor_insert_link_cb(Widget, XtPointer, XtPointer);
  548. extern void fe_editor_insert_target_cb(Widget, XtPointer, XtPointer);
  549. extern void fe_editor_insert_image_cb(Widget, XtPointer, XtPointer);
  550. extern void fe_editor_insert_hrule_dialog_cb(Widget, XtPointer, XtPointer);
  551. extern void fe_editor_insert_html_cb(Widget, XtPointer, XtPointer);
  552. extern void fe_editor_insert_line_break_cb(Widget, XtPointer, XtPointer);
  553. extern void fe_editor_insert_non_breaking_space_cb(Widget,XtPointer,XtPointer);
  554. extern void fe_editor_char_props_menu_cb(Widget, XtPointer, XtPointer);
  555. extern void fe_editor_toggle_char_props_cb(Widget, XtPointer, XtPointer);
  556. extern void fe_editor_char_props_cb(Widget, XtPointer, XtPointer);
  557. extern void fe_editor_clear_char_props_cb(Widget, XtPointer, XtPointer);
  558. extern void fe_editor_font_size_menu_cb(Widget, XtPointer, XtPointer);
  559. extern void fe_editor_font_size_cb(Widget, XtPointer, XtPointer);
  560. extern void fe_editor_paragraph_props_menu_cb(Widget, XtPointer, XtPointer);
  561. extern void fe_editor_paragraph_props_cb(Widget, XtPointer, XtPointer);
  562. extern void fe_editor_indent_cb(Widget, XtPointer, XtPointer);
  563. extern void fe_editor_properties_dialog_cb(Widget, XtPointer, XtPointer);
  564. extern void fe_editor_delete_cb(Widget, XtPointer, XtPointer);
  565. extern void fe_editor_refresh_cb(Widget, XtPointer, XtPointer);
  566. extern void fe_editor_insert_hrule_cb(Widget, XtPointer, XtPointer);
  567. extern void fe_editor_cut_cb(Widget, XtPointer, XtPointer);
  568. extern void fe_editor_copy_cb(Widget, XtPointer, XtPointer);
  569. extern void fe_editor_paste_cb(Widget, XtPointer, XtPointer);
  570. extern void fe_editor_table_menu_cb(Widget, XtPointer, XtPointer);
  571. extern void fe_editor_table_insert_cb(Widget, XtPointer, XtPointer);
  572. extern void fe_editor_table_row_insert_cb(Widget, XtPointer, XtPointer);
  573. extern void fe_editor_table_column_insert_cb(Widget, XtPointer, XtPointer);
  574. extern void fe_editor_table_cell_insert_cb(Widget, XtPointer, XtPointer);
  575. extern void fe_editor_table_delete_cb(Widget, XtPointer, XtPointer);
  576. extern void fe_editor_table_row_delete_cb(Widget, XtPointer, XtPointer);
  577. extern void fe_editor_table_column_delete_cb(Widget, XtPointer, XtPointer);
  578. extern void fe_editor_table_cell_delete_cb(Widget, XtPointer, XtPointer);
  579. extern void fe_editor_file_menu_cb(Widget, XtPointer, XtPointer);
  580. extern void fe_editor_document_properties_dialog_cb(Widget, XtPointer,
  581.                             XtPointer);
  582. extern void fe_editor_preferences_dialog_cb(Widget, XtPointer, XtPointer);
  583. extern void fe_editor_target_properties_dialog_cb(Widget, XtPointer,
  584.                             XtPointer);
  585. extern void fe_editor_html_properties_dialog_cb(Widget, XtPointer,
  586.                         XtPointer);
  587. extern void fe_editor_table_properties_dialog_cb(Widget, XtPointer,
  588.                          XtPointer);
  589. extern void fe_editor_publish_cb(Widget, XtPointer, XtPointer);
  590. extern void fe_editor_find_cb(Widget, XtPointer, XtPointer);
  591. extern void fe_editor_find_again_cb(Widget, XtPointer, XtPointer);
  592. extern void fe_editor_windows_menu_cb(Widget, XtPointer, XtPointer);
  593. extern void fe_editor_select_all_cb(Widget, XtPointer, XtPointer);
  594. extern void fe_editor_delete_item_cb(Widget, XtPointer, XtPointer);
  595. extern void fe_editor_select_table_cb(Widget, XtPointer, XtPointer);
  596. extern void fe_editor_reload_cb(Widget, XtPointer, XtPointer);
  597. extern void fe_editor_set_colors_dialog_cb(Widget, XtPointer, XtPointer);
  598. extern void fe_editor_default_color_cb(Widget, XtPointer, XtPointer);
  599. extern void fe_editor_remove_links_cb(Widget, XtPointer, XtPointer);
  600. extern void fe_editor_open_url_cb(Widget, XtPointer, XtPointer);
  601. extern void fe_editor_show_paragraph_toolbar_cb(Widget, XtPointer, XtPointer);
  602. extern void fe_editor_show_character_toolbar_cb(Widget, XtPointer, XtPointer);
  603. extern void fe_editor_options_menu_cb(Widget, XtPointer, XtPointer);
  604. extern void fe_editor_browse_publish_location_cb(Widget, XtPointer, XtPointer);
  605.  
  606. #endif /* EDITOR */
  607.  
  608. /* not static -- it's needed by src/HTMLView.cpp */
  609. void
  610. fe_save_as_cb (Widget widget, XtPointer closure, XtPointer call_data)
  611. {
  612.   MWContext *context = (MWContext *) closure;
  613.   URL_Struct *url;
  614.  
  615.   fe_UserActivity (context);
  616.   if (fe_hack_self_inserting_accelerator (widget, closure, call_data))
  617.     return;
  618.  
  619.   {
  620.     MWContext *ctx = fe_GetFocusGridOfContext (context);
  621.     if (ctx)
  622.       context = ctx;
  623.   }
  624.  
  625.   url =    SHIST_CreateWysiwygURLStruct (context,
  626.                         SHIST_GetCurrent (&context->hist));
  627.  
  628.   if (url)
  629.     fe_SaveURL (context, url);
  630.   else
  631.     FE_Alert (context, fe_globalData.no_url_loaded_message);
  632. }
  633.  
  634. /* not static -- it's needed by src/HTMLView.cpp */
  635. void
  636. fe_save_top_frame_as_cb (Widget widget, XtPointer closure, XtPointer call_data)
  637. {
  638.   MWContext *context = (MWContext *) closure;
  639.   URL_Struct *url;
  640.  
  641.   fe_UserActivity (context);
  642.   if (fe_hack_self_inserting_accelerator (widget, closure, call_data))
  643.     return;
  644.  
  645.   url =    SHIST_CreateWysiwygURLStruct (context,
  646.                         SHIST_GetCurrent (&context->hist));
  647.  
  648.   if (url)
  649.     fe_SaveURL (context, url);
  650.   else
  651.     FE_Alert (context, fe_globalData.no_url_loaded_message);
  652. }
  653.  
  654. static unsigned int
  655. fe_save_as_stream_write_ready_method (NET_StreamClass *stream)
  656. {
  657.   return(MAX_WRITE_READY);
  658. }
  659.  
  660. struct view_source_data
  661. {
  662.   MWContext *context;
  663.   Widget widget;
  664. };
  665.  
  666.  
  667. void
  668. fe_view_source_cb (Widget widget, XtPointer closure, XtPointer call_data)
  669. {
  670.   MWContext *context = (MWContext *) closure;
  671.   History_entry *h;
  672.   URL_Struct *url;
  673.   char *new_url_add=0;
  674.  
  675.   h = SHIST_GetCurrent (&context->hist);
  676.   url = SHIST_CreateURLStructFromHistoryEntry(context, h);
  677.   if (! url)
  678.     {
  679.       FE_Alert (context, fe_globalData.no_url_loaded_message);
  680.       return;
  681.     }
  682.  
  683.   /* check to make sure it doesn't already have a view-source
  684.    * prefix.  If it does then this window is already viewing
  685.    * the source of another window.  In this case just
  686.    * show the same thing by reloading the url...
  687.    */
  688.   if(strncmp(VIEW_SOURCE_URL_PREFIX, 
  689.              url->address, 
  690.              sizeof(VIEW_SOURCE_URL_PREFIX)-1))
  691.     {
  692.       /* prepend VIEW_SOURCE_URL_PREFIX to the url to
  693.        * get the netlib to display the source view
  694.        */
  695.       StrAllocCopy(new_url_add, VIEW_SOURCE_URL_PREFIX);
  696.       StrAllocCat(new_url_add, url->address);
  697.       free(url->address);
  698.       url->address = new_url_add;
  699.     }
  700.  
  701.    /* make damn sure the form_data slot is zero'd or else all
  702.     * hell will break loose
  703.     */
  704.    XP_MEMSET (&url->savedData, 0, sizeof (SHIST_SavedData));
  705.  
  706. #ifdef EDITOR
  707.    if (EDT_IS_EDITOR(context) && !FE_CheckAndSaveDocument(context))
  708.        return;
  709. #endif
  710.  
  711. /*
  712.   fe_GetSecondaryURL (context, url, FO_PRESENT, NULL, FALSE);
  713. */
  714.   fe_GetURL (context, url, FALSE);
  715.  
  716. }
  717.  
  718. static int
  719. fe_view_source_stream_write_method (NET_StreamClass *stream, const char *str, int32 len)
  720. {
  721.   struct view_source_data *vsd = (struct view_source_data *) stream->data_object;
  722.   char buf [1024];
  723.   XmTextPosition pos, cpos;
  724.  
  725.   if (!vsd || !vsd->widget) return -1;
  726.   pos = XmTextGetLastPosition (vsd->widget);
  727.   cpos = 0;
  728.   XtVaGetValues (vsd->widget, XmNcursorPosition, &cpos, 0);
  729.  
  730.   /* We copy the data first because XmTextInsert() needs a null-terminated
  731.      string, and there isn't necessarily room on the end of `str' for us
  732.      to plop down a null. */
  733.   while (len > 0)
  734.     {
  735.       int i;
  736.       int L = (len > (sizeof(buf)-1) ? (sizeof(buf)-1) : len);
  737.       memcpy (buf, str, L);
  738.       buf [L] = 0;
  739.       str += L;
  740.       len -= L;
  741.       /* Crockishly translate CR to LF for the Motif text widget... */
  742.       for (i = 0; i < L; i++)
  743.     if (buf[i] == '\r' && buf[i+1] != '\n')
  744.       buf[i] = '\n';
  745.       XmTextInsert (vsd->widget, pos, buf);
  746.       pos += L;
  747.     }
  748.   XtVaSetValues (vsd->widget, XmNcursorPosition, cpos, 0);
  749.   return 1;
  750. }
  751.  
  752. static void
  753. fe_view_source_stream_complete_method (NET_StreamClass *stream)
  754. {
  755.   struct view_source_data *vsd = (struct view_source_data *) stream->data_object;
  756.   free (vsd);
  757. }
  758.  
  759. static void
  760. fe_view_source_stream_abort_method (NET_StreamClass *stream, int status)
  761. {
  762.   struct view_source_data *vsd = (struct view_source_data *) stream->data_object;
  763.   free (vsd);
  764. }
  765.  
  766.  
  767. /* Creates and returns a stream object which writes the data read into a
  768.    text widget.
  769.  */
  770. NET_StreamClass *
  771. fe_MakeViewSourceStream (int format_out, void *data_obj,
  772.              URL_Struct *url_struct, MWContext *context)
  773. {
  774.   struct view_source_data *vsd;
  775.   NET_StreamClass* stream;
  776.  
  777.   if (url_struct->is_binary)
  778.     {
  779.       FE_Alert (context, fe_globalData.binary_document_message);
  780.       return 0;
  781.     }
  782.  
  783.   vsd = url_struct->fe_data;
  784.   if (! vsd) abort ();
  785.   url_struct->fe_data = 0;
  786.  
  787.   stream = (NET_StreamClass *) calloc (sizeof (NET_StreamClass), 1);
  788.   if (!stream) return 0;
  789.  
  790.   stream->name           = "ViewSource";
  791.   stream->complete       = fe_view_source_stream_complete_method;
  792.   stream->abort          = fe_view_source_stream_abort_method;
  793.   stream->put_block      = fe_view_source_stream_write_method;
  794.   stream->is_write_ready = fe_save_as_stream_write_ready_method;
  795.   stream->data_object    = vsd;
  796.   stream->window_id      = context;
  797.   return stream;
  798. }
  799.  
  800. #ifdef MOZ_MAIL_NEWS
  801.  
  802. /* Mailing documents
  803.  */
  804.  
  805. void
  806. fe_mailNew_cb (Widget widget, XtPointer closure, XtPointer call_data)
  807. {
  808.   MWContext *context = (MWContext *) closure;
  809.   fe_UserActivity (context);
  810.   if (fe_hack_self_inserting_accelerator (widget, closure, call_data))
  811.     return;
  812.   MSG_Mail (context);
  813. }
  814.  
  815.  
  816. void
  817. fe_mailto_cb (Widget widget, XtPointer closure, XtPointer call_data)
  818. {
  819.   MWContext *context = (MWContext *) closure;
  820.   fe_UserActivity (context);
  821.   if (fe_hack_self_inserting_accelerator (widget, closure, call_data))
  822.     return;
  823.  
  824.   /*
  825.    * You cannot mail a frameset, you must mail the frame child
  826.    * with focus
  827.    */
  828.   if (fe_IsGridParent (context))
  829.     {
  830.       MWContext *ctx = fe_GetFocusGridOfContext (context);
  831.       if (ctx)
  832.         context = ctx;
  833.     }
  834. #ifdef EDITOR
  835.   if (EDT_IS_EDITOR(context))
  836.       EDT_MailDocument (context);
  837.   else
  838. #endif
  839.       MSG_MailDocument (context);
  840.  
  841. }
  842.  
  843. #endif  /* MOZ_MAIL_NEWS */
  844.  
  845. void
  846. fe_print_cb (Widget widget, XtPointer closure, XtPointer call_data)
  847. {
  848.   MWContext *context = (MWContext *) closure;
  849.   URL_Struct *url;
  850.  
  851.   fe_UserActivity (context);
  852.   if (fe_hack_self_inserting_accelerator (widget, closure, call_data))
  853.     return;
  854.  
  855. #ifdef EDITOR
  856.   if (EDT_IS_EDITOR(context) && !FE_CheckAndSaveDocument(context))
  857.       return;
  858. #endif
  859.  
  860.   {
  861.     MWContext *ctx = fe_GetFocusGridOfContext (context);
  862.     if (ctx)
  863.       context = ctx;
  864.   }
  865.  
  866.   url = SHIST_CreateURLStructFromHistoryEntry (context, SHIST_GetCurrent(&context->hist));
  867.   if (url) {
  868.     /* Free the url struct we created */
  869.     NET_FreeURLStruct(url);
  870.  
  871. #ifdef X_PLUGINS
  872.     if (CONTEXT_DATA(context)->is_fullpage_plugin) {
  873.       /* Full page plugins need a step here. We need to ask the plugin if
  874.        * it wants to handle the printing.
  875.        */
  876.       NPPrint npprint;
  877.       
  878.       npprint.mode = NP_FULL;
  879.       npprint.print.fullPrint.pluginPrinted = FALSE;
  880.       npprint.print.fullPrint.printOne = TRUE;
  881.       npprint.print.fullPrint.platformPrint = NULL;
  882.       NPL_Print(context->pluginList, &npprint);
  883.       if (npprint.print.fullPrint.pluginPrinted == TRUE)
  884.     return;
  885.     }
  886. #endif /* X_PLUGINS */
  887.  
  888.     fe_PrintDialog (context);
  889.   }
  890.   else
  891.     FE_Alert(context, fe_globalData.no_url_loaded_message);
  892. }
  893.  
  894. #define fe_quit_cb fe_QuitCallback
  895. void
  896. fe_QuitCallback (Widget widget, XtPointer closure, XtPointer call_data)
  897. {
  898.   MWContext *context = (MWContext *) closure;
  899.  
  900.   fe_UserActivity (context);
  901.   if (fe_hack_self_inserting_accelerator (widget, closure, call_data))
  902.     return;
  903. #ifdef MOZ_MAIL_NEWS
  904.   if (!fe_CheckUnsentMail ())
  905.     return;
  906.   if (!fe_CheckDeferredMail ())
  907.     return;
  908. #endif
  909. #ifdef EDITOR
  910.   if (!fe_EditorCheckUnsaved(context))
  911.       return;
  912. #endif /*EDITOR*/
  913.   if (!CONTEXT_DATA (context)->confirm_exit_p ||
  914.       FE_Confirm (context, fe_globalData.really_quit_message))
  915.     {
  916.       fe_AbortCallback (widget, closure, call_data);
  917.       fe_Exit (0);
  918.     }
  919. }
  920.  
  921.  
  922. /* FIND */
  923.  
  924. void
  925. fe_find_cb (Widget widget, XtPointer closure, XtPointer call_data)
  926. {
  927.   MWContext *context = (MWContext *) closure;
  928.   MWContext *top_context;
  929.  
  930.   fe_unset_findcommand_context();
  931.  
  932.   top_context = XP_GetNonGridContext(context);
  933.   if (!top_context) top_context = context;
  934.  
  935.   fe_UserActivity (top_context);
  936.   if (fe_hack_self_inserting_accelerator (CONTEXT_WIDGET(top_context),
  937.                       closure, call_data))
  938.     return;
  939.   fe_FindDialog (top_context, False);
  940. }
  941.  
  942.  
  943. void
  944. fe_find_again_cb (Widget widget, XtPointer closure, XtPointer call_data)
  945. {
  946.   MWContext *context = (MWContext *) closure;
  947.   MWContext *top_context;
  948.   fe_FindData *find_data;
  949.  
  950.   fe_unset_findcommand_context();
  951.  
  952.   top_context = XP_GetNonGridContext(context);
  953.   if (!top_context) top_context = context;
  954.  
  955.   fe_UserActivity (top_context);
  956.   if (fe_hack_self_inserting_accelerator (CONTEXT_WIDGET(top_context),
  957.                       closure, call_data))
  958.     return;
  959.  
  960.   find_data = CONTEXT_DATA(top_context)->find_data;
  961.  
  962.   if ((top_context->type == MWContextBrowser
  963. #ifdef MOZ_MAIL_NEWS
  964.     || top_context->type == MWContextMail
  965.     || top_context->type == MWContextNews
  966.     || top_context->type == MWContextMailMsg
  967. #endif
  968.     ) &&
  969.       find_data && find_data->string && find_data->string[0] != '\0')
  970.     fe_FindDialog (top_context, True);
  971.   else
  972.     XBell (XtDisplay (widget), 0);
  973. }
  974.  
  975.  
  976. #ifdef FORTEZZA
  977.  
  978. static void
  979. fe_fortezza_card_cb (Widget widget,
  980.                XtPointer closure,
  981.                XtPointer call_data)
  982. {
  983.   MWContext *context = (MWContext *) closure;
  984.   fe_UserActivity (context);
  985.   if (fe_hack_self_inserting_accelerator (widget, closure, call_data))
  986.     return;
  987.  
  988.   SSL_FortezzaMenu(context,SSL_FORTEZZA_CARD_SELECT);
  989. }
  990.  
  991. static void
  992. fe_fortezza_change_cb (Widget widget,
  993.                XtPointer closure,
  994.                XtPointer call_data)
  995. {
  996.   MWContext *context = (MWContext *) closure;
  997.   fe_UserActivity (context);
  998.   if (fe_hack_self_inserting_accelerator (widget, closure, call_data))
  999.     return;
  1000.   SSL_FortezzaMenu(context,SSL_FORTEZZA_CHANGE_PERSONALITY);
  1001. }
  1002.  
  1003. static void
  1004. fe_fortezza_view_cb (Widget widget,
  1005.                XtPointer closure,
  1006.                XtPointer call_data)
  1007. {
  1008.   MWContext *context = (MWContext *) closure;
  1009.   fe_UserActivity (context);
  1010.   if (fe_hack_self_inserting_accelerator (widget, closure, call_data))
  1011.     return;
  1012.   SSL_FortezzaMenu(context,SSL_FORTEZZA_VIEW_PERSONALITY);
  1013. }
  1014.  
  1015. static void
  1016. fe_fortezza_info_cb (Widget widget,
  1017.                XtPointer closure,
  1018.                XtPointer call_data)
  1019. {
  1020.   MWContext *context = (MWContext *) closure;
  1021.   fe_UserActivity (context);
  1022.   if (fe_hack_self_inserting_accelerator (widget, closure, call_data))
  1023.     return;
  1024.   SSL_FortezzaMenu(context,SSL_FORTEZZA_CARD_INFO);
  1025. }
  1026.  
  1027. static void
  1028. fe_fortezza_logout_cb (Widget widget,
  1029.                XtPointer closure,
  1030.                XtPointer call_data)
  1031. {
  1032.   MWContext *context = (MWContext *) closure;
  1033.   fe_UserActivity (context);
  1034.   if (fe_hack_self_inserting_accelerator (widget, closure, call_data))
  1035.     return;
  1036.   SSL_FortezzaMenu(context,SSL_FORTEZZA_LOGOUT);
  1037. }
  1038. #endif
  1039.  
  1040.  
  1041. #define HTTP_OFF        42
  1042.  
  1043.     /* "about:document" */
  1044. #define DOCINFO            "about:document"
  1045.  
  1046.     /* ".netscape.com/" */
  1047. #define DOT_NETSCAPE_DOT_COM_SLASH \
  1048.                 "\130\230\217\236\235\215\213\232\217\130\215"\
  1049.                 "\231\227\131"
  1050.  
  1051.     /* "http://home.netscape.com/" */
  1052. #define HTTP_NETSCAPE        "\222\236\236\232\144\131\131\222\231\227\217"\
  1053.                 "\130\230\217\236\235\215\213\232\217\130\215"\
  1054.                 "\231\227\131"
  1055.  
  1056.     /* "http://cgi.netscape.com/cgi-bin/" */
  1057. #define HTTP_CGI        "\222\236\236\232\144\131\131\215\221\223\130"\
  1058.                 "\230\217\236\235\215\213\232\217\130\215\231"\
  1059.                 "\227\131\215\221\223\127\214\223\230\131"
  1060.  
  1061.         /* "http://home.netscape.com/home/" */
  1062. #define HTTP_HOME               "\222\236\236\232\144\131\131\222\231\227\217"\
  1063.                                 "\130\230\217\236\235\215\213\232\217\130\215"\
  1064.                                 "\231\227\131\222\231\227\217\131"
  1065.  
  1066.         /* "http://home.netscape.com/eng/mozilla/4.0/" */
  1067. #define HTTP_ENG                "\222\236\236\232\144\131\131\222\231\227\217"\
  1068.                                 "\130\230\217\236\235\215\213\232\217\130\215"\
  1069.                                 "\231\227\131\217\230\221\131\227\231\244\223"\
  1070.                         "\226\226\213\131\136\130\132\131"
  1071.  
  1072.         /* "http://home.netscape.com/eng/mozilla/2.0/" */
  1073. #define HTTP_ENG_2_0            "\222\236\236\232\144\131\131\222\231\227\217"\
  1074.                                 "\130\230\217\236\235\215\213\232\217\130\215"\
  1075.                                 "\231\227\131\217\230\221\131\227\231\244\223"\
  1076.                                 "\226\226\213\131\134\130\132\131"
  1077.  
  1078.         /* "http://guide.netscape.com/" */
  1079. #define HTTP_GUIDE              "\222\236\236\232\144\131\131\221\237\223"\
  1080.                                 "\216\217\130\230\217\236\235\215\213\232"\
  1081.                                 "\217\130\215\231\227\131"
  1082.  
  1083.         /* "http://help.netscape.com/" */
  1084. #define HTTP_HELP         "\222\236\236\232\144\131\131\222\217\226\232"\
  1085.                           "\130\230\217\236\235\215\213\232\217\130\215"\
  1086.                           "\231\227\131"
  1087.  
  1088.         /* "http://home.netscape.com/info/" */
  1089. #define HTTP_INFO               "\222\236\236\232\144\131\131\222\231\227\217"\
  1090.                                 "\130\230\217\236\235\215\213\232\217\130\215"\
  1091.                                 "\231\227\131\223\230\220\231\131"
  1092.  
  1093.         /* "fishcam/" */
  1094. #define HTTP_FC                 HTTP_NETSCAPE \
  1095.                                 "\220\223\235\222\215\213\227\131"
  1096.  
  1097. #ifdef MOZ_MAIL_NEWS
  1098.         /* "newsrc:" */
  1099. #define HTTP_NEWSRC             "\230\217\241\235\234\215\144"
  1100. #endif
  1101.  
  1102.         /* "whats_new/" */
  1103. #define HTTP_WHATS_NEW          HTTP_GUIDE \
  1104.                                 "\241\222\213\236\235\211\230\217\241\131"
  1105.         /* "whats_cool/" */
  1106. #define HTTP_WHATS_COOL         HTTP_GUIDE \
  1107.                                 "\241\222\213\236\235\211\215\231\231\226"\
  1108.                                 "\131"
  1109.         /* "" */
  1110. #define HTTP_INET_DIRECTORY     HTTP_GUIDE
  1111.  
  1112.         /* "internet-search.html" */
  1113. #define HTTP_INET_SEARCH        HTTP_HOME "\223\230\236\217\234\230\217\236"\
  1114.                                 "\127\235\217\213\234\215\222\130\222\236\227"\
  1115.                                 "\226"
  1116.         /* "people/" */
  1117. #define HTTP_INET_WHITE         HTTP_GUIDE \
  1118.                                 "\232\217\231\232\226\217\131"
  1119.  
  1120.         /* "yellow_pages/" */
  1121. #define HTTP_INET_YELLOW        HTTP_GUIDE \
  1122.                                 "\243\217\226\226\231\241\211\232\213\221"\
  1123.                                 "\217\235\131"
  1124.  
  1125.         /* "about-the-internet.html" */
  1126. #define HTTP_INET_ABOUT         HTTP_HOME "\213\214\231\237\236\127\236\222"\
  1127.                                 "\217\127\223\230\236\217\234\230\217\236\130"\
  1128.                                 "\222\236\227\226"
  1129.  
  1130.         /* "update.html" */
  1131. #define HTTP_SOFTWARE           HTTP_HOME "\237\232\216\213\236\217\130\222\236\227\226"
  1132.  
  1133.         /* "how-to-create-web-services.html" */
  1134. #define HTTP_HOWTO              HTTP_HOME "\222\231\241\127\236\231\127\215"\
  1135.                                 "\234\217\213\236\217\127\241\217\214\127\235"\
  1136.                                 "\217\234\240\223\215\217\235\130\222\236\227"\
  1137.                                 "\226"
  1138.         /* "netscape-galleria.html" */
  1139. #define HTTP_GALLERIA           HTTP_HOME "\230\217\236\235\215\213\232\217"\
  1140.                                 "\127\221\213\226\226\217\234\223\213\130\222"\
  1141.                                 "\236\227\226"
  1142.  
  1143.         /* "relnotes/unix-" */
  1144. # define HTTP_REL_VERSION_PREFIX HTTP_ENG "\234\217\226\230\231\236\217\235"\
  1145.                                 "\131\237\230\223\242\127"
  1146.  
  1147. # define HTTP_BETA_VERSION_PREFIX H_REL_VERSION_PREFIX
  1148.  
  1149.         /* "reginfo-x.cgi" */
  1150. #define HTTP_REG        HTTP_HOME "\234\217\221\223\235\236\217\234\130\222\236\227\226"
  1151.  
  1152.  
  1153.         /* "handbook/" */
  1154. #define HTTP_MANUAL             HTTP_ENG "\222\213\230\216\214\231\231\225\131"
  1155.  
  1156.     /* "starter.html" */
  1157. #define HTTP_STARTER            HTTP_HOME "\235\236\213\234\236\217\234\130"\
  1158.                 "\222\236\227\226"
  1159.  
  1160. #ifdef NON_BETA
  1161.        /* "http://help.netscape.com/faqs.html" */
  1162. #define HTTP_FAQ                "\222\236\236\232\144\131\131\222\217\226\232"\
  1163.                                 "\130\230\217\236\235\215\213\232\217\130\215"\
  1164.                                 "\231\227\131\220\213\233\235\130\222\236\227"\
  1165.                                 "\226" 
  1166. #else
  1167.         /* "eng/beta_central/faq/index.html" */
  1168. #define HTTP_FAQ        HTTP_NETSCAPE "\217\230\221\131\214\217\236"\
  1169.                 "\213\211\215\217\230\236\234\213\226\131\220\213\233"\
  1170.                 "\131\223\230\216\217\242\130\222\236\227\226"
  1171. #endif
  1172.  
  1173.         /* "security-doc.html" */
  1174. #define HTTP_SECURITY           HTTP_INFO "\235\217\215\237\234\223\236\243"\
  1175.                                 "\127\216\231\215\130\222\236\227\226"
  1176.  
  1177. #ifdef NON_BETA
  1178.         /* "auto_bug.cgi" */
  1179. #define HTTP_FEEDBACK        HTTP_CGI "\213\237\236\231\211\214\237\221"\
  1180.                 "\130\215\221\223"
  1181. #else
  1182.         /* "eng/beta_central" */
  1183. #define HTTP_FEEDBACK        HTTP_NETSCAPE "\217\230\221\131\214\217\236"\
  1184.                 "\213\211\215\217\230\236\234\213\226"
  1185. #endif
  1186.  
  1187. #ifdef NON_BETA
  1188.         /* "http://help.netscape.com/" */
  1189. #define HTTP_SUPPORT            "\222\236\236\232\144\131\131\222\217\226\232"\
  1190.                 "\130\230\217\236\235\215\213\232\217\130\215"\
  1191.                 "\231\227\131"
  1192. #else
  1193.         /* "eng/beta_central" */
  1194. #define HTTP_SUPPORT        HTTP_NETSCAPE "\217\230\221\131\214\217\236"\
  1195.                 "\213\211\215\217\230\236\234\213\226"
  1196. #endif
  1197.  
  1198. #ifdef MOZ_MAIL_NEWS
  1199.         /* "news/news.html" */
  1200. #define HTTP_USENET         HTTP_ENG_2_0 "\230\217\241\235\131\230\217\241"\
  1201.                                 "\235\130\222\236\227\226"
  1202. #endif
  1203.  
  1204.         /* "about:plugins" */
  1205. #define HTTP_PLUGINS "\213\214\231\237\236\144\232\226\237\221\223\230\235"
  1206.  
  1207.         /* "about:fonts" */
  1208. #define HTTP_FONTS "\213\214\231\237\236\144\220\231\230\236\235"
  1209.  
  1210. #ifdef __sgi
  1211.  
  1212.     /* "http://www.sgi.com/surfer/silicon_sites.html" */
  1213. # define HTTP_SGI_MENU "\222\236\236\232\144\131\131\241\241\241\130\235\221"\
  1214.           "\223\130\215\231\227\131\235\237\234\220\217\234\131\235"\
  1215.           "\223\226\223\215\231\230\211\235\223\236\217\235\130\222"\
  1216.           "\236\227\226"
  1217.  
  1218.     /* "http://www.sgi.com" */
  1219. # define HTTP_SGI_BUTTON "\222\236\236\232\144\131\131\241\241\241\130\235"\
  1220.              "\221\223\130\215\231\227"
  1221.  
  1222.     /* "file:/usr/local/lib/netscape/docs/Welcome.html" */
  1223. # define HTTP_SGI_WELCOME "\220\223\226\217\144\131\237\235\234\131\226\231"\
  1224.               "\215\213\226\131\226\223\214\131\230\217\236\235"\
  1225.               "\215\213\232\217\131\216\231\215\235\131\201\217"\
  1226.               "\226\215\231\227\217\130\222\236\227\226"
  1227.  
  1228.     /* "http://www.adobe.com" */
  1229. # define HTTP_ADOBE_MENU "\222\236\236\232\144\131\131\241\241\241\130\213"\
  1230.              "\216\231\214\217\130\215\231\227"
  1231.  
  1232.     /* "http://www.sgi.com/surfer/cool_sites.html" */
  1233. # define SGI_WHATS_COOL  "\222\236\236\232\144\131\131\241\241\241\130\235"\
  1234.              "\221\223\130\215\231\227\131\235\237\234\220\217"\
  1235.              "\234\131\215\231\231\226\211\235\223\236\217\235"\
  1236.              "\130\222\236\227\226"
  1237.  
  1238.     /* "http://www.sgi.com/surfer/netscape/relnotes-" */
  1239. # define SGI_VERSION_PREFIX    "\222\236\236\232\144\131\131\241\241\241\130"\
  1240.                 "\235\221\223\130\215\231\227\131\235\237\234"\
  1241.                 "\220\217\234\131\230\217\236\235\215\213\232"\
  1242.                 "\217\131\234\217\226\230\231\236\217\235\127"
  1243.  
  1244. #endif /* __sgi */
  1245.  
  1246.     /* "products/client/communicator/" */
  1247. #define HTTP_PRODUCT_INFO HTTP_HELP "\232\234\231\216\237\215\236"\
  1248.                 "\235\131\215\226\223\217\230\236\131\215\231\227"\
  1249.                 "\227\237\230\223\215\213\236\231\234\131"
  1250.  
  1251.     /* "http://home.netscape.com/eng/intl/" */
  1252. #define HTTP_INTL "\222\236\236\232\144\131\131\222\231\227\217\130"\
  1253.                 "\230\217\236\235\215\213\232\217\130\215\231\227"\
  1254.                 "\131\217\230\221\131\223\230\236\226\131"
  1255.  
  1256.     /* "services.html" */
  1257. #define HTTP_SERVICES HTTP_HOME "\235\217\234\240\223\215\217\235"\
  1258.                 "\130\222\236\227\226"
  1259.  
  1260.  
  1261. static char *
  1262. go_get_url(char *which)
  1263. {
  1264.     char        clas[128];
  1265.     char        name[128];
  1266.     char        *p;
  1267.     char        *ret;
  1268.     char        *type;
  1269.     XrmValue    value;
  1270.  
  1271.     PR_snprintf(clas, sizeof (clas), "%s.Url.Which", fe_progclass);
  1272.     PR_snprintf(name, sizeof (name), "%s.url.%s", fe_progclass, which);
  1273.     if (XrmGetResource(XtDatabase(fe_display), name, clas, &type, &value))
  1274.     {
  1275.         ret = strdup(value.addr);
  1276.         if (!ret)
  1277.         {
  1278.             return NULL;
  1279.         }
  1280.         p = ret;
  1281.         while (*p)
  1282.         {
  1283.             *p += HTTP_OFF;
  1284.             p++;
  1285.         }
  1286.         if (!strstr(ret, DOT_NETSCAPE_DOT_COM_SLASH))
  1287.         {
  1288.             free(ret);
  1289.             return NULL;
  1290.         }
  1291.         return ret;
  1292.     }
  1293.  
  1294.     return NULL;
  1295. }
  1296.  
  1297.  
  1298. #define GO_GET_URL(func, res)            \
  1299.     static char *                \
  1300.     func(char *builtin)            \
  1301.     {                    \
  1302.         static char    *ret = NULL;    \
  1303.                         \
  1304.         if (ret)            \
  1305.         {                \
  1306.             return ret;        \
  1307.         }                \
  1308.                         \
  1309.         ret = go_get_url(res);        \
  1310.         if (ret)            \
  1311.         {                \
  1312.             return ret;        \
  1313.         }                \
  1314.                         \
  1315.         return builtin;            \
  1316.     }
  1317.  
  1318.  
  1319. GO_GET_URL(go_get_url_plugins, "aboutplugins")
  1320. GO_GET_URL(go_get_url_fonts, "aboutfonts")
  1321. GO_GET_URL(go_get_url_whats_new, "whats_new")
  1322. GO_GET_URL(go_get_url_whats_cool, "whats_cool")
  1323. GO_GET_URL(go_get_url_inet_directory, "directory")
  1324. GO_GET_URL(go_get_url_inet_search, "search")
  1325. GO_GET_URL(go_get_url_inet_white, "white")
  1326. GO_GET_URL(go_get_url_inet_yellow, "yellow")
  1327. GO_GET_URL(go_get_url_inet_about, "about")
  1328. GO_GET_URL(go_get_url_software, "software")
  1329. GO_GET_URL(go_get_url_howto, "howto")
  1330. GO_GET_URL(go_get_url_netscape, "netscape")
  1331. GO_GET_URL(go_get_url_galleria, "galleria")
  1332. GO_GET_URL(go_get_url_starter, "starter")
  1333. GO_GET_URL(go_get_url_rel_version_prefix, "rel_notes")
  1334. GO_GET_URL(go_get_url_reg, "reg")
  1335. GO_GET_URL(go_get_url_manual, "manual")
  1336. GO_GET_URL(go_get_url_faq, "faq")
  1337. GO_GET_URL(go_get_url_usenet, "usenet")
  1338. GO_GET_URL(go_get_url_security, "security")
  1339. GO_GET_URL(go_get_url_feedback, "feedback")
  1340. GO_GET_URL(go_get_url_support, "support")
  1341. GO_GET_URL(go_get_url_product_info, "productInfo")
  1342. GO_GET_URL(go_get_url_intl, "intl")
  1343. GO_GET_URL(go_get_url_services, "services")
  1344.  
  1345.  
  1346. #define H_WHATS_NEW             go_get_url_whats_new(HTTP_WHATS_NEW)
  1347. #define H_WHATS_COOL            go_get_url_whats_cool(HTTP_WHATS_COOL)
  1348. #define H_INET_DIRECTORY        go_get_url_inet_directory(HTTP_INET_DIRECTORY)
  1349. #define H_INET_SEARCH           go_get_url_inet_search(HTTP_INET_SEARCH)
  1350. #define H_INET_WHITE            go_get_url_inet_white(HTTP_INET_WHITE)
  1351. #define H_INET_YELLOW           go_get_url_inet_yellow(HTTP_INET_YELLOW)
  1352. #define H_INET_ABOUT            go_get_url_inet_about(HTTP_INET_ABOUT)
  1353. #define H_SOFTWARE              go_get_url_software(HTTP_SOFTWARE)
  1354. #define H_HOWTO                 go_get_url_howto(HTTP_HOWTO)
  1355. #define H_NETSCAPE              go_get_url_netscape(HTTP_NETSCAPE)
  1356. #define H_GALLERIA              go_get_url_galleria(HTTP_GALLERIA)
  1357. #define H_REL_VERSION_PREFIX    go_get_url_rel_version_prefix(HTTP_REL_VERSION_PREFIX)
  1358. #define H_REG                   go_get_url_reg(HTTP_REG)
  1359. #define H_MANUAL                go_get_url_manual(HTTP_MANUAL)
  1360. #define H_STARTER               go_get_url_starter(HTTP_STARTER)
  1361. #define H_FAQ                   go_get_url_faq(HTTP_FAQ)
  1362. #define H_USENET                go_get_url_usenet(HTTP_USENET)
  1363. #define H_SECURITY              go_get_url_security(HTTP_SECURITY)
  1364. #define H_FEEDBACK              go_get_url_feedback(HTTP_FEEDBACK)
  1365. #define H_SUPPORT               go_get_url_support(HTTP_SUPPORT)
  1366. #define H_PRODUCT_INFO          go_get_url_product_info(HTTP_PRODUCT_INFO)
  1367. #define H_INTL                  go_get_url_intl(HTTP_INTL)
  1368. #define H_SERVICES              go_get_url_services(HTTP_SERVICES)
  1369.  
  1370. /*
  1371.  * EXPORT_URL creates a function that returns a localized URL.
  1372.  * It is needed by the e-kit in order to allow localized URL's.
  1373.  */
  1374. #define EXPORT_URL(func, builtin) char* xfe_##func(void) {return func(builtin);}
  1375.  
  1376. EXPORT_URL(go_get_url_plugins, HTTP_PLUGINS)
  1377. EXPORT_URL(go_get_url_fonts, HTTP_FONTS)
  1378. EXPORT_URL(go_get_url_whats_new, HTTP_WHATS_NEW)
  1379. EXPORT_URL(go_get_url_whats_cool, HTTP_WHATS_COOL)
  1380. EXPORT_URL(go_get_url_inet_directory, HTTP_INET_DIRECTORY)
  1381. EXPORT_URL(go_get_url_inet_search, HTTP_INET_SEARCH)
  1382. EXPORT_URL(go_get_url_inet_white, HTTP_INET_WHITE)
  1383. EXPORT_URL(go_get_url_inet_yellow, HTTP_INET_YELLOW)
  1384. EXPORT_URL(go_get_url_inet_about, HTTP_INET_ABOUT)
  1385. EXPORT_URL(go_get_url_software, HTTP_SOFTWARE)
  1386. EXPORT_URL(go_get_url_howto, HTTP_HOWTO)
  1387. EXPORT_URL(go_get_url_netscape, HTTP_NETSCAPE)
  1388. EXPORT_URL(go_get_url_galleria, HTTP_GALLERIA)
  1389. EXPORT_URL(go_get_url_reg, HTTP_REG)
  1390. EXPORT_URL(go_get_url_manual, HTTP_MANUAL)
  1391. EXPORT_URL(go_get_url_starter, HTTP_STARTER)
  1392. EXPORT_URL(go_get_url_faq, HTTP_FAQ)
  1393. #ifdef MOZ_MAIL_NEWS
  1394. EXPORT_URL(go_get_url_usenet, HTTP_USENET)
  1395. #endif
  1396. EXPORT_URL(go_get_url_security, HTTP_SECURITY)
  1397. EXPORT_URL(go_get_url_feedback, HTTP_FEEDBACK)
  1398. EXPORT_URL(go_get_url_support, HTTP_SUPPORT)
  1399. EXPORT_URL(go_get_url_product_info, HTTP_PRODUCT_INFO)
  1400. EXPORT_URL(go_get_url_intl, HTTP_INTL)
  1401. EXPORT_URL(go_get_url_services, HTTP_SERVICES)
  1402.  
  1403. /*
  1404.  * xfe_go_get_url_relnotes
  1405.  */
  1406. char*
  1407. xfe_go_get_url_relnotes(void)
  1408. {
  1409.   static char* url = NULL;
  1410.  
  1411.   if ( url == NULL ) {
  1412.       char buf[1024];
  1413.       char* ptr;
  1414.       char* prefix = (strchr(fe_version, 'a') || strchr(fe_version, 'b'))
  1415.                      ? HTTP_BETA_VERSION_PREFIX
  1416.                      : H_REL_VERSION_PREFIX;
  1417.  
  1418. #ifdef GOLD
  1419.       sprintf(buf, "%sGold.html", fe_version);
  1420. #else
  1421.       sprintf(buf, "%s.html", fe_version);
  1422. #endif
  1423.  
  1424.       for ( ptr = buf; *ptr; ptr++ ) {
  1425.           *ptr+= HTTP_OFF;
  1426.       }
  1427.       url = (char*) malloc(strlen(prefix)+strlen(buf)+1);
  1428.       strcpy(url, prefix);
  1429.       strcat(url, buf);
  1430.   }
  1431.  
  1432.   return url;
  1433. }
  1434.  
  1435. void
  1436. fe_docinfo_cb (Widget widget, XtPointer closure, XtPointer call_data)
  1437. {
  1438.   MWContext *context = (MWContext *) closure;
  1439.   char buf [1024], *in, *out;
  1440.   fe_UserActivity (context);
  1441.   if (fe_hack_self_inserting_accelerator (widget, closure, call_data))
  1442.     return;
  1443.   for (in = DOCINFO, out = buf; *in; in++, out++) *out = *in - HTTP_OFF;
  1444.     *out = 0;
  1445.  
  1446. #ifdef EDITOR
  1447.   if (EDT_IS_EDITOR(context) && !FE_CheckAndSaveDocument(context))
  1448.     return;
  1449. #endif
  1450.   /* @@@@ this is the proper way to do it but I dont'
  1451.    * know the encoding scheme
  1452.    * fe_GetURL (context,NET_CreateURLStruct(buf, FALSE), FALSE);
  1453.    */
  1454.   fe_GetURL (context,NET_CreateURLStruct(DOCINFO, FALSE), FALSE);
  1455.  
  1456. #ifdef EDITOR
  1457.   fe_EditorRefresh(context);
  1458. #endif
  1459. }
  1460.  
  1461. char *
  1462. xfe_get_netscape_home_page_url()
  1463. {
  1464.   static char buf [128];
  1465.   char *in, *out;
  1466.   for (in = H_NETSCAPE, out = buf; *in; in++, out++) *out = *in - HTTP_OFF;
  1467.   *out = 0;
  1468.   return buf;
  1469. }
  1470.  
  1471. static void
  1472. fe_net_showstatus_cb (Widget widget, XtPointer closure, XtPointer call_data)
  1473. {
  1474.   MWContext *context = (MWContext *) closure;
  1475.   char *rv;
  1476.  
  1477.   fe_UserActivity (context);
  1478.   rv = NET_PrintNetlibStatus();
  1479.   NET_ToggleTrace();  /* toggle trace mode on and off */
  1480.   XFE_Alert (context, rv);
  1481.   free(rv);
  1482. }
  1483.  
  1484. static void
  1485. fe_fishcam_cb (Widget widget, XtPointer closure, XtPointer call_data)
  1486. {
  1487.   MWContext *context = (MWContext *) closure;
  1488.   char buf [1024], *in, *out;
  1489.   fe_UserActivity (context);
  1490.   if (fe_hack_self_inserting_accelerator (widget, closure, call_data))
  1491.     return;
  1492.   for (in = HTTP_FC, out = buf; *in; in++, out++) *out = *in - HTTP_OFF;
  1493.   *out = 0;
  1494.   fe_GetURL (context,NET_CreateURLStruct(buf, FALSE), FALSE);
  1495. }
  1496.  
  1497. void
  1498. fe_SearchCallback (Widget widget, XtPointer closure, XtPointer call_data)
  1499. {
  1500.   MWContext *context = (MWContext *) closure;
  1501.   char* url;
  1502.   fe_UserActivity (context);
  1503.   if (fe_hack_self_inserting_accelerator (widget, closure, call_data))
  1504.     return;
  1505.   if ( PREF_GetUrl("internal_url.net_search", &url) ) {
  1506.     fe_GetURL (context,NET_CreateURLStruct(url, FALSE), FALSE);
  1507.   }
  1508. }
  1509.  
  1510. void
  1511. fe_GuideCallback (Widget widget, XtPointer closure, XtPointer call_data)
  1512. {
  1513.   MWContext *context = (MWContext *) closure;
  1514.   char* url = NULL;
  1515.   int ok;
  1516.  
  1517.   fe_UserActivity (context);
  1518.  
  1519.   if (fe_hack_self_inserting_accelerator (widget, closure, call_data))
  1520.     return;
  1521.  
  1522.   ok = PREF_CopyConfigString("toolbar.places.default_url",&url);
  1523.  
  1524.   if (ok == PREF_NOERROR) 
  1525.   {
  1526.       FE_GetURL(context,NET_CreateURLStruct(url,NET_DONT_RELOAD));
  1527.   }                                                                       
  1528.   
  1529.   if (url)
  1530.   {
  1531.       XP_FREE(url);  
  1532.   }
  1533. }
  1534.  
  1535. void
  1536. fe_NetscapeCallback (Widget widget, XtPointer closure, XtPointer call_data)
  1537. {
  1538.   MWContext *context = (MWContext *) closure;
  1539.   char* url;
  1540.   fe_UserActivity (context);
  1541.   if (fe_hack_self_inserting_accelerator (widget, closure, call_data))
  1542.     return;
  1543.  
  1544.   if ( PREF_GetUrl("toolbar.logo", &url) ) {
  1545.       /*
  1546.        *    Call this guy, it will sort out if the current context
  1547.        *    is suitable, etc...
  1548.        */
  1549.       FE_GetURL(context,  NET_CreateURLStruct(url, NET_DONT_RELOAD));
  1550.   }
  1551. }
  1552.  
  1553. #ifdef __sgi
  1554. static void
  1555. fe_sgi_menu_cb (Widget widget, XtPointer closure, XtPointer call_data)
  1556. {
  1557.   MWContext *context = (MWContext *) closure;
  1558.   char buf [1024], *in, *out;
  1559.   fe_UserActivity (context);
  1560.   if (fe_hack_self_inserting_accelerator (widget, closure, call_data))
  1561.     return;
  1562.   for (in = HTTP_SGI_MENU, out = buf; *in; in++, out++) *out = *in - HTTP_OFF;
  1563.   *out = 0;
  1564.   fe_GetURL (context, NET_CreateURLStruct (buf, FALSE), FALSE);
  1565. }
  1566.  
  1567. static void
  1568. fe_adobe_menu_cb (Widget widget, XtPointer closure, XtPointer call_data)
  1569. {
  1570.   MWContext *context = (MWContext *) closure;
  1571.   char buf [1024], *in, *out;
  1572.   fe_UserActivity (context);
  1573.   if (fe_hack_self_inserting_accelerator (widget, closure, call_data))
  1574.     return;
  1575.   for (in = HTTP_ADOBE_MENU, out = buf; *in; in++, out++)
  1576.     *out = *in - HTTP_OFF;
  1577.   *out = 0;
  1578.   fe_GetURL (context, NET_CreateURLStruct (buf, FALSE), FALSE);
  1579. }
  1580.  
  1581. void
  1582. fe_SGICallback (Widget widget, XtPointer closure, XtPointer call_data)
  1583. {
  1584.   MWContext *context = (MWContext *) closure;
  1585.   char buf [1024], *in, *out;
  1586.   fe_UserActivity (context);
  1587.   if (fe_hack_self_inserting_accelerator (widget, closure, call_data))
  1588.     return;
  1589.   for (in = HTTP_SGI_BUTTON, out = buf; *in; in++, out++)
  1590.     *out = *in - HTTP_OFF;
  1591.   *out = 0;
  1592.   fe_GetURL (context, NET_CreateURLStruct (buf, FALSE), FALSE);
  1593. }
  1594.  
  1595. void
  1596. fe_sgi_welcome_cb (Widget widget, XtPointer closure, XtPointer call_data)
  1597. {
  1598.   MWContext *context = (MWContext *) closure;
  1599.   char buf [1024], *in, *out;
  1600.   fe_UserActivity (context);
  1601.   if (fe_hack_self_inserting_accelerator (widget, closure, call_data))
  1602.     return;
  1603.   for (in = HTTP_SGI_WELCOME, out = buf; *in; in++, out++)
  1604.     *out = *in - HTTP_OFF;
  1605.   *out = 0;
  1606.   fe_GetURL (context, NET_CreateURLStruct (buf, FALSE), FALSE);
  1607. }
  1608. #endif /* __sgi */
  1609.  
  1610. #ifdef JAVA
  1611.  
  1612. void
  1613. fe_new_show_java_console_cb (Widget widget, XtPointer closure, XtPointer call_data)
  1614. {
  1615.   LJ_HideConsole();
  1616.   LJ_ShowConsole();
  1617. }
  1618.  
  1619. #endif
  1620.  
  1621. void
  1622. fe_load_images_cb (Widget widget, XtPointer closure, XtPointer call_data)
  1623. {
  1624.   MWContext *context = (MWContext *) closure;
  1625.   fe_UserActivity (context);
  1626.   if (fe_hack_self_inserting_accelerator (widget, closure, call_data))
  1627.     return;
  1628.   fe_LoadDelayedImages (context);
  1629. }
  1630.  
  1631. /* Navigate menu
  1632.  */
  1633.  
  1634. /* not static -- it's needed by src/HTMLView.cpp */
  1635. void
  1636. fe_back_cb (Widget widget, XtPointer closure, XtPointer call_data)
  1637. {
  1638.   MWContext *context = (MWContext *) closure;
  1639.   MWContext *top_context = XP_GetNonGridContext(context);
  1640.   URL_Struct *url;
  1641.   if (fe_IsGridParent(top_context))
  1642.     {
  1643.         if (LO_BackInGrid(top_context))
  1644.           {
  1645.             return;
  1646.           }
  1647.     }
  1648.   fe_UserActivity (top_context);
  1649.   if (fe_hack_self_inserting_accelerator (widget, closure, call_data))
  1650.     return;
  1651.   url = SHIST_CreateURLStructFromHistoryEntry (top_context,
  1652.                            SHIST_GetPrevious (top_context));
  1653.   if (url)
  1654.     {
  1655.       fe_GetURL (top_context, url, FALSE);
  1656.     }
  1657.   else
  1658.     {
  1659.       FE_Alert (top_context, fe_globalData.no_previous_url_message);
  1660.     }
  1661. }
  1662.  
  1663. /* not static -- it's needed by src/HTMLView.cpp */
  1664. void
  1665. fe_forward_cb (Widget widget, XtPointer closure, XtPointer call_data)
  1666. {
  1667.   MWContext *context = (MWContext *) closure;
  1668.   MWContext *top_context = XP_GetNonGridContext(context);
  1669.   URL_Struct *url;
  1670.   if (fe_IsGridParent(top_context))
  1671.     {
  1672.         if (LO_ForwardInGrid(top_context))
  1673.           {
  1674.             return;
  1675.           }
  1676.     }
  1677.   fe_UserActivity (top_context);
  1678.   if (fe_hack_self_inserting_accelerator (widget, closure, call_data))
  1679.     return;
  1680.   url = SHIST_CreateURLStructFromHistoryEntry (top_context,
  1681.                            SHIST_GetNext (top_context));
  1682.   if (url)
  1683.     {
  1684.       fe_GetURL (top_context, url, FALSE);
  1685.     }
  1686.   else
  1687.     {
  1688.       FE_Alert (top_context, fe_globalData.no_next_url_message);
  1689.     }
  1690. }
  1691.  
  1692. /* not static -- it's needed by src/HTMLView.cpp ; BrowserFrame.cpp */
  1693. void
  1694. fe_home_cb (Widget widget, XtPointer closure, XtPointer call_data)
  1695. {
  1696.   URL_Struct *url;
  1697.   MWContext *context = (MWContext *) closure;
  1698.   fe_UserActivity (context);
  1699.   if (fe_hack_self_inserting_accelerator (widget, closure, call_data))
  1700.     return;
  1701.   if (!fe_globalPrefs.home_document || !*fe_globalPrefs.home_document)
  1702.     {
  1703.       XClearArea (XtDisplay (CONTEXT_WIDGET (context)),
  1704.           XtWindow (CONTEXT_DATA (context)->drawing_area), 
  1705.           0, 0,
  1706.           CONTEXT_DATA (context)->scrolled_width,
  1707.           CONTEXT_DATA (context)->scrolled_height, 
  1708.           False);
  1709.       FE_Alert (context, fe_globalData.no_home_url_message);
  1710.       return;
  1711.     }
  1712.   url = NET_CreateURLStruct (fe_globalPrefs.home_document, FALSE);
  1713.   fe_GetURL ((MWContext *) closure, url, FALSE);
  1714. }
  1715.  
  1716. static void
  1717. fe_add_bookmark_cb (Widget widget, XtPointer closure, XtPointer call_data)
  1718. {
  1719.   MWContext *context = (MWContext *) closure;
  1720.   fe_UserActivity (context);
  1721.   if (fe_hack_self_inserting_accelerator (widget, closure, call_data))
  1722.     return;
  1723.   fe_AddBookmarkCallback (widget, closure, call_data);
  1724. }
  1725.  
  1726. /* Help menu
  1727.  */
  1728. void
  1729. fe_about_cb (Widget widget, XtPointer closure, XtPointer call_data)
  1730. {
  1731.   MWContext *context = (MWContext *) closure;
  1732.  
  1733.   fe_UserActivity (context);
  1734.   if (fe_hack_self_inserting_accelerator (widget, closure, call_data))
  1735.     return;
  1736.  
  1737.   fe_reuseBrowser(context, NET_CreateURLStruct ("about:", FALSE));
  1738. }
  1739.  
  1740. void
  1741. fe_manual_cb (Widget widget, XtPointer closure, XtPointer call_data)
  1742. {
  1743.   MWContext *context = (MWContext *) closure;
  1744.   char* url;
  1745.   char buf[1024], *in, *out;
  1746.  
  1747.   fe_UserActivity (context);
  1748.   if (fe_hack_self_inserting_accelerator (widget, closure, call_data))
  1749.     return;
  1750.  
  1751.   url = HTTP_MANUAL;
  1752.  
  1753.   if ( url ) {
  1754.     for (in = url, out = buf; *in; in++, out++) *out = *in - HTTP_OFF;
  1755.     *out = 0;
  1756.     
  1757.     fe_reuseBrowser(context, NET_CreateURLStruct (buf, FALSE));
  1758.   }
  1759. }
  1760.  
  1761. #ifdef X_PLUGINS
  1762. void
  1763. fe_aboutPlugins_cb (Widget widget, XtPointer closure, XtPointer call_data)
  1764. {
  1765.   MWContext *context = (MWContext *) closure;
  1766.   fe_UserActivity (context);
  1767.   if (fe_hack_self_inserting_accelerator (widget, closure, call_data))
  1768.     return;
  1769.   fe_GetURL (context, NET_CreateURLStruct ("about:plugins", FALSE), FALSE);
  1770. }
  1771. #endif /* X_PLUGINS */
  1772.  
  1773. void
  1774. fe_aboutFonts_cb (Widget widget, XtPointer closure, XtPointer call_data)
  1775. {
  1776.   MWContext *context = (MWContext *) closure;
  1777.   fe_UserActivity (context);
  1778.   if (fe_hack_self_inserting_accelerator (widget, closure, call_data))
  1779.     return;
  1780.   fe_GetURL (context, NET_CreateURLStruct ("about:fonts", FALSE), FALSE);
  1781. }
  1782.  
  1783. /* Message composition stuff. */
  1784.  
  1785. void
  1786. fe_mailcompose_obeycb(MWContext *context, fe_MailComposeCallback cbid,
  1787.             void *call_data)
  1788. {
  1789.     switch (cbid) {
  1790.     case ComposeClearAllText_cb: {
  1791.         Widget text = CONTEXT_DATA (context)->mcBodyText;
  1792.         fe_SetTextFieldAndCallBack(text, "");
  1793.         break;
  1794.     }
  1795.     case ComposeSelectAllText_cb: {
  1796.         Widget text = CONTEXT_DATA (context)->mcBodyText;
  1797.         XmPushButtonCallbackStruct *cb = (XmPushButtonCallbackStruct *)
  1798.                         call_data;
  1799.         if (cb)
  1800.         XmTextSetSelection(text, 0, XmTextGetLastPosition(text),
  1801.                     cb->event->xkey.time);
  1802.         break;
  1803.     }
  1804.     default:
  1805.       XP_ASSERT (0);
  1806.       break;
  1807.     }
  1808. }
  1809.  
  1810. #ifdef MOZ_MAIL_NEWS
  1811. void
  1812. FE_InsertMessageCompositionText(MSG_Pane* comppane,
  1813.                 const char* text,
  1814.                 XP_Bool leaveCursorAtBeginning) {
  1815.  
  1816.   MWContext* context = MSG_GetContext(comppane);
  1817.   /* call - function defined in src/ComposeView.cpp */
  1818.   fe_InsertMessageCompositionText(context, text, leaveCursorAtBeginning);
  1819.   return;
  1820. }
  1821. #endif  /* MOZ_MAIL_NEWS */
  1822.  
  1823. /* rlogin 
  1824.  */
  1825.  
  1826. void
  1827. FE_ConnectToRemoteHost (MWContext *context, int url_type, char *hostname,
  1828.             char *port, char *username)
  1829. {
  1830.   char *name;
  1831.   const char *command;
  1832.   const char *user_command;
  1833.   char *buf;
  1834.   const char *in;
  1835.   char *out;
  1836.   char **av, **ac, **ae;
  1837.   int na;
  1838.   Boolean cop_out_p = False;
  1839.   pid_t forked;
  1840.  
  1841.   switch (url_type)
  1842.     {
  1843.     case FE_TELNET_URL_TYPE:
  1844.       name = "telnet";
  1845.       command = fe_globalPrefs.telnet_command;
  1846.       user_command = 0 /* fe_globalPrefs.telnet_user_command */;
  1847.       break;
  1848.     case FE_TN3270_URL_TYPE:
  1849.       name = "tn3270";
  1850.       command = fe_globalPrefs.tn3270_command;
  1851.       user_command = 0 /* fe_globalPrefs.tn3270_user_command */;
  1852.       break;
  1853.     case FE_RLOGIN_URL_TYPE:
  1854.       name = "rlogin";
  1855.       command = fe_globalPrefs.rlogin_command;
  1856.       user_command = fe_globalPrefs.rlogin_user_command;
  1857.       break;
  1858.     default:
  1859.       abort ();
  1860.     }
  1861.  
  1862.   if (username && user_command && *user_command)
  1863.     command = user_command;
  1864.   else if (username)
  1865.     cop_out_p = True;
  1866.  
  1867.   buf = (char*) malloc( strlen(command) + 1
  1868.     + (hostname && *hostname ? strlen(hostname) : strlen("localhost"))
  1869.     + (username && *username ? strlen(username) : 0)
  1870.     + (port && *port ? strlen(port) : 0) );
  1871.   ac = av = (char**) malloc(10 * sizeof (char*));
  1872.   if (buf == NULL || av == NULL)
  1873.     goto malloc_lossage;
  1874.   ae = av + 10;
  1875.   in = command;
  1876.   *ac = out = buf;
  1877.   na = 0;
  1878.   while (*in)
  1879.     {
  1880.       if (*in == '%')
  1881.     {
  1882.       in++;
  1883.       if (*in == 'h')
  1884.         {
  1885.           char *s;
  1886.           char *h = (hostname && *hostname ? hostname : "localhost");
  1887.  
  1888.           /* Only allow the hostname to contain alphanumerics or
  1889.          _ - and . to prevent people from embedding shell command
  1890.          security holes in the host name. */
  1891.           for (s = h; *s; s++)
  1892.         if (*s == '_' || (*s == '-' && s != h) || *s == '.' ||
  1893.             isalpha(*s) || isdigit(*s))
  1894.           *out++ = *s;
  1895.         }
  1896.       else if (*in == 'p')
  1897.         {
  1898.           if (port && *port)
  1899.         {
  1900.           short port_num = atoi(port);
  1901.  
  1902.           if (port_num > 0)
  1903.             {
  1904.               char buf1[6];
  1905.               PR_snprintf (buf1, sizeof (buf1), "%.5d", port_num);
  1906.               strcpy(out, buf1);
  1907.               out += strlen(buf1);
  1908.             }
  1909.         }
  1910.         }
  1911.       else if (*in == 'u')
  1912.         {
  1913.           char *s;
  1914.           /* Only allow the user name to contain alphanumerics or
  1915.          _ - and . to prevent people from embedding shell command
  1916.          security holes in the host name. */
  1917.           if (username && *username)
  1918.         {
  1919.           for (s = username; *s; s++)
  1920.             if (*s == '_' || (*s == '-' && s != username) ||
  1921.             *s == '.' || isalpha(*s) || isdigit(*s))
  1922.               *out++ = *s;
  1923.         }
  1924.         }
  1925.       else if (*in == '%')
  1926.         {
  1927.           *out++ = '%';
  1928.         }
  1929.       else
  1930.         {
  1931.           char buf2 [255];
  1932.           PR_snprintf (buf2, sizeof (buf2),
  1933.                  XP_GetString( XFE_UNKNOWN_ESCAPE_CODE ), name, *in);
  1934.           FE_Alert (context, buf2);
  1935.         }
  1936.       if (*in)
  1937.         in++;
  1938.     }
  1939.       else if (*in == ' ')
  1940.     {
  1941.       if (out != *ac)
  1942.         {
  1943.           *out++ = '\0';
  1944.           na++;
  1945.           if (++ac == ae)
  1946.         {
  1947.           av = (char**) realloc(av, (na + 10) * sizeof (char*));
  1948.           if (av == NULL)
  1949.             goto malloc_lossage;
  1950.           ac = av + na;
  1951.           ae = ac + 10;
  1952.         }
  1953.           *ac = out;
  1954.         }
  1955.       in++;
  1956.     }
  1957.       else
  1958.     {
  1959.       *out = *in;
  1960.       out++;
  1961.       in++;
  1962.     }
  1963.     }
  1964.  
  1965.   if (out != *ac)
  1966.     {
  1967.       *out = '\0';
  1968.       na++;
  1969.       ac++;
  1970.     }
  1971.   if (ac == ae)
  1972.     {
  1973.       av = (char**) realloc(av, (na + 1) * sizeof (char*));
  1974.       if (av == NULL)
  1975.     goto malloc_lossage;
  1976.       ac = av + na;
  1977.     }
  1978.   *ac = 0;
  1979.  
  1980.   if (cop_out_p)
  1981.     {
  1982.       char buf2 [1024];
  1983.       PR_snprintf (buf2, sizeof (buf2), XP_GetString(XFE_LOG_IN_AS), username);
  1984.       fe_Message (context, buf2);
  1985.     }
  1986.  
  1987.   switch (forked = fork ())
  1988.     {
  1989.     case -1:
  1990.       fe_perror (context, XP_GetString( XFE_COULDNT_FORK ) );
  1991.       break;
  1992.     case 0:
  1993.       {
  1994.     Display *dpy = XtDisplay (CONTEXT_WIDGET (context));
  1995.     close (ConnectionNumber (dpy));
  1996.  
  1997.     execvp (av [0], av);
  1998.  
  1999.     PR_snprintf (buf, sizeof (buf), XP_GetString( XFE_EXECVP_FAILED ),
  2000.             fe_progname, av[0]);
  2001.     perror (buf);
  2002.     exit (1);    /* Note that this only exits a child fork.  */
  2003.     break;
  2004.       }
  2005.     default:
  2006.       /* This is the "old" process (subproc pid is in `forked'.) */
  2007.       break;
  2008.     }
  2009.   free(av);
  2010.   free(buf);
  2011.   return;
  2012.  
  2013. malloc_lossage:
  2014.   if (av) free(av);
  2015.   if (buf) free(buf);
  2016.   fe_Message (context, XP_GetString(XFE_OUT_OF_MEMORY_URL));
  2017. }
  2018.  
  2019. /* The popup menu
  2020.  */
  2021.  
  2022. URL_Struct *fe_url_under_mouse = 0;
  2023. URL_Struct *fe_image_under_mouse = 0;
  2024.  
  2025. static void
  2026. fe_save_image_cb (Widget widget, XtPointer closure, XtPointer call_data)
  2027. {
  2028.   MWContext *context = (MWContext *) closure;
  2029.   XmString xm_title = 0;
  2030.   char *title = 0;
  2031.   URL_Struct *url;
  2032.  
  2033.   fe_UserActivity (context);
  2034.   if (fe_hack_self_inserting_accelerator (widget, closure, call_data))
  2035.     return;
  2036.  
  2037.   XtVaGetValues (widget, XmNlabelString, &xm_title, 0);
  2038.   XmStringGetLtoR (xm_title, XmFONTLIST_DEFAULT_TAG, &title);
  2039.   XmStringFree(xm_title);
  2040.  
  2041.   url =    fe_image_under_mouse;
  2042.   if (! url)
  2043.     FE_Alert (context, fe_globalData.not_over_image_message);
  2044.   if (title) free (title);
  2045.   if (url)
  2046.     fe_SaveURL (context, url);
  2047.   fe_image_under_mouse = 0; /* it will be freed in the exit routine. */
  2048. }
  2049.  
  2050.  
  2051. static void
  2052. fe_save_link_cb (Widget widget, XtPointer closure, XtPointer call_data)
  2053. {
  2054.   MWContext *context = (MWContext *) closure;
  2055.   XmString xm_title = 0;
  2056.   char *title = 0;
  2057.   URL_Struct *url;
  2058.  
  2059.   fe_UserActivity (context);
  2060.   if (fe_hack_self_inserting_accelerator (widget, closure, call_data))
  2061.     return;
  2062.  
  2063.   XtVaGetValues (widget, XmNlabelString, &xm_title, 0);
  2064.   XmStringGetLtoR (xm_title, XmFONTLIST_DEFAULT_TAG, &title);
  2065.   XmStringFree(xm_title);
  2066.  
  2067.   url =    fe_url_under_mouse;
  2068.   if (! url)
  2069.     FE_Alert (context, fe_globalData.not_over_link_message);
  2070.   if (title) free (title);
  2071.   if (url)
  2072.     fe_SaveURL (context, url);
  2073.   fe_url_under_mouse = 0; /* it will be freed in the exit routine. */
  2074. }
  2075.  
  2076. static void
  2077. fe_open_image_cb (Widget widget, XtPointer closure, XtPointer call_data)
  2078. {
  2079.   MWContext *context = (MWContext *) closure;
  2080.   URL_Struct *url;
  2081.   fe_UserActivity (context);
  2082.   if (fe_hack_self_inserting_accelerator (widget, closure, call_data))
  2083.     return;
  2084.   url =    fe_image_under_mouse;
  2085.   if (! url)
  2086.     FE_Alert (context, fe_globalData.not_over_image_message);
  2087.   else
  2088.     {
  2089.       fe_GetURL (XP_GetNonGridContext(context), url, FALSE);
  2090.       fe_image_under_mouse = 0; /* it will be freed in the exit routine. */
  2091.     }
  2092. }
  2093.  
  2094. static void
  2095. fe_clipboard_url_1 (Widget widget, XtPointer closure, XtPointer call_data,
  2096.                     URL_Struct *url, char* html)
  2097. {
  2098.   MWContext *context = (MWContext *) closure;
  2099.   XmPushButtonCallbackStruct *cb = (XmPushButtonCallbackStruct *) call_data;
  2100.   XEvent *event = (cb ? cb->event : 0);
  2101.   Time time = (event && (event->type == KeyPress ||
  2102.              event->type == KeyRelease)
  2103.            ? event->xkey.time :
  2104.            event && (event->type == ButtonPress ||
  2105.              event->type == ButtonRelease)
  2106.            ? event->xbutton.time :
  2107.            XtLastTimestampProcessed (XtDisplay(CONTEXT_WIDGET (context))));
  2108.   fe_UserActivity (context);
  2109.   if (fe_hack_self_inserting_accelerator (widget, closure, call_data)) {
  2110.       return;
  2111.   }
  2112.   if (! url)
  2113.     FE_Alert (context, fe_globalData.not_over_link_message);
  2114.   else
  2115.     {
  2116.         fe_OwnClipboard(widget, time,
  2117.                         strdup (url->address), html, NULL, 0, False);
  2118. #ifdef NOT_rhess
  2119.         /*
  2120.          * NOTE:  it's not really valid to make a primary selection if you
  2121.          *        can't show the selection on the display...
  2122.          *        [ this is a hidden selection ]
  2123.          *
  2124.          */
  2125.         fe_OwnPrimarySelection(widget, time, 
  2126.                                strdup (url->address), html, NULL, 0, context);
  2127. #endif
  2128.         NET_FreeURLStruct (url);
  2129.     }
  2130. }
  2131.  
  2132. static char fe_link_html_head[]   = "<A HREF=\"";
  2133. static char fe_link_html_middle[] = "\" >";
  2134. static char fe_link_html_tail[]   = "</A>";
  2135.  
  2136. static char fe_image_html_head[]  = "<IMG SRC=\"";
  2137. static char fe_image_html_tail[]  = "\" ALT=\"Image\" BORDER=0 >";
  2138.  
  2139. #define XFE_LINK_HTML_HEAD   (fe_link_html_head)
  2140. #define XFE_LINK_HTML_MIDDLE (fe_link_html_middle)
  2141. #define XFE_LINK_HTML_TAIL   (fe_link_html_tail)
  2142.  
  2143. #define XFE_IMAGE_HTML_HEAD  (fe_image_html_head)
  2144. #define XFE_IMAGE_HTML_TAIL  (fe_image_html_tail)
  2145.  
  2146. void
  2147. fe_clipboard_link_cb (Widget widget, XtPointer closure, 
  2148.                       XtPointer call_data,
  2149.                       URL_Struct *url)
  2150. {
  2151.     char *html = NULL;
  2152.     char *link = url->address;
  2153.     int32 len = strlen(link);
  2154.     char *head = XFE_LINK_HTML_HEAD;
  2155.     char *midd = XFE_LINK_HTML_MIDDLE;
  2156.     char *tail = XFE_LINK_HTML_TAIL;
  2157.  
  2158.     html = XP_ALLOC(len + len + 2 +
  2159.                     strlen(head) + strlen(midd) + strlen(tail)
  2160.                     );
  2161.     sprintf(html, "%s%s%s%s%s\0", head, link, midd, link, tail);
  2162.  
  2163.     fe_clipboard_url_1 (widget, closure, call_data, url, html);
  2164.     XP_FREE(html);
  2165. }
  2166.  
  2167. void
  2168. fe_clipboard_image_link_cb (Widget widget, XtPointer closure, 
  2169.                             XtPointer call_data,
  2170.                             URL_Struct *url, URL_Struct *img)
  2171. {
  2172.     char *html = NULL;
  2173.     char *link = url->address;
  2174.     int32 len = strlen(link);
  2175.     char *head = XFE_LINK_HTML_HEAD;
  2176.     char *midd = XFE_LINK_HTML_MIDDLE;
  2177.     char *tail = XFE_LINK_HTML_TAIL;
  2178.  
  2179.     if (!img) {
  2180.         html = XP_ALLOC(len + len + 2 +
  2181.                         strlen(head) + strlen(midd) + strlen(tail)
  2182.                         );
  2183.         sprintf(html, "%s%s%s%s%s\0", head, link, midd, link, tail);
  2184.  
  2185.         fe_clipboard_url_1 (widget, closure, call_data, url, html);
  2186.         XP_FREE(html);
  2187.     }
  2188.     else {
  2189.         char *image = img->address;
  2190.         char *ihead = XFE_IMAGE_HTML_HEAD;
  2191.         char *itail = XFE_IMAGE_HTML_TAIL;
  2192.  
  2193.         html = XP_ALLOC(len + 2 + strlen(image) +
  2194.                         strlen(head) + strlen(midd) + strlen(tail) +
  2195.                         strlen(ihead) + strlen(itail)
  2196.                         );
  2197.         sprintf(html, "%s%s%s%s%s%s%s\0", 
  2198.                 head, link, midd, ihead, image, itail, tail);
  2199.  
  2200.         fe_clipboard_url_1 (widget, closure, call_data, url, html);
  2201.         NET_FreeURLStruct (img);
  2202.     }
  2203.     XP_FREE(html);
  2204. }
  2205.  
  2206. void
  2207. fe_clipboard_image_cb (Widget widget, XtPointer closure, 
  2208.                        XtPointer call_data,
  2209.                        URL_Struct *url)
  2210. {
  2211.     char *html = NULL;
  2212.     char *link = url->address;
  2213.     int32 len = strlen(link);
  2214.  
  2215.     char *head = XFE_IMAGE_HTML_HEAD;
  2216.     char *tail = XFE_IMAGE_HTML_TAIL;
  2217.  
  2218.     html = XP_ALLOC(len + 2 + strlen(head) + strlen(tail));
  2219.  
  2220.     sprintf(html, "%s%s%s\0", head, link, tail);
  2221.  
  2222.     fe_clipboard_url_1 (widget, closure, call_data, url, html);
  2223.     XP_FREE(html);
  2224. }
  2225.  
  2226. /*
  2227.  * For scrolling the window with the arrow keys, we need to
  2228.  * insert a lookahead key eater into each action routine,
  2229.  * else it is possible to queue up too many key events, and
  2230.  * screw up our careful scroll/expose event timing.
  2231.  */
  2232. static void
  2233. fe_eat_window_key_events(Display *display, Window window)
  2234. {
  2235.   XEvent event;
  2236.  
  2237.   XSync(display, FALSE);
  2238.   while (XCheckTypedWindowEvent(display, window, KeyPress, &event) == TRUE);
  2239. }
  2240.  
  2241.  
  2242. static void
  2243. fe_column_forward_action (Widget widget, XEvent *event,
  2244.               String *av, Cardinal *ac)
  2245. {
  2246.   XKeyEvent *kev = (XKeyEvent *)event;
  2247.   MWContext *context = fe_WidgetToMWContext (widget);
  2248.   XP_ASSERT (context);
  2249.   if (!context) return;
  2250.  
  2251.   fe_column_forward_cb (widget, (XtPointer)context, (XtPointer)0);
  2252.   fe_eat_window_key_events(XtDisplay(widget), kev->window);
  2253. }
  2254.  
  2255.  
  2256. static void
  2257. fe_column_backward_action (Widget widget, XEvent *event,
  2258.               String *av, Cardinal *ac)
  2259. {
  2260.   XKeyEvent *kev = (XKeyEvent *)event;
  2261.   MWContext *context = fe_WidgetToMWContext (widget);
  2262.   XP_ASSERT (context);
  2263.   if (!context) return;
  2264.  
  2265.   fe_column_backward_cb (widget, (XtPointer)context, (XtPointer)0);
  2266.   fe_eat_window_key_events(XtDisplay(widget), kev->window);
  2267. }
  2268.  
  2269.  
  2270. static void
  2271. fe_line_forward_action (Widget widget, XEvent *event,
  2272.               String *av, Cardinal *ac)
  2273. {
  2274.   XKeyEvent *kev = (XKeyEvent *)event;
  2275.   MWContext *context = fe_WidgetToMWContext (widget);
  2276.   XP_ASSERT (context);
  2277.   if (!context) return;
  2278.  
  2279.   fe_line_forward_cb (widget, (XtPointer)context, (XtPointer)0);
  2280.   fe_eat_window_key_events(XtDisplay(widget), kev->window);
  2281. }
  2282.  
  2283.  
  2284. static void
  2285. fe_line_backward_action (Widget widget, XEvent *event,
  2286.               String *av, Cardinal *ac)
  2287. {
  2288.   XKeyEvent *kev = (XKeyEvent *)event;
  2289.   MWContext *context = fe_WidgetToMWContext (widget);
  2290.   XP_ASSERT (context);
  2291.   if (!context) return;
  2292.  
  2293.   fe_line_backward_cb (widget, (XtPointer)context, (XtPointer)0);
  2294.   fe_eat_window_key_events(XtDisplay(widget), kev->window);
  2295. }
  2296.  
  2297.  
  2298. /* Actions for use in translations tables. 
  2299.  */
  2300.  
  2301. #define DEFACTION(NAME) \
  2302. static void \
  2303. fe_##NAME##_action (Widget widget, XEvent *event, String *av, Cardinal *ac) \
  2304. {  \
  2305.   MWContext *context = fe_WidgetToMWContext (widget); \
  2306.   XP_ASSERT (context); \
  2307.   if (!context) return; \
  2308.   fe_##NAME##_cb (widget, (XtPointer)context, (XtPointer)0); \
  2309. }
  2310.  
  2311. /* DEFACTION (new) */
  2312. /*DEFACTION (open_url)*/
  2313. /*DEFACTION (open_file)*/
  2314. #ifdef EDITOR
  2315. /*DEFACTION (edit)*/
  2316. #endif /* EDITOR */
  2317. /*DEFACTION (save_as)*/
  2318. /*DEFACTION (mailto)*/
  2319. /*DEFACTION (print)*/
  2320. /* DEFACTION (docinfo) */
  2321. /*DEFACTION (delete)*/
  2322. /* DEFACTION (quit) */
  2323. /* DEFACTION (cut) */
  2324. /* DEFACTION (copy) */
  2325. /* DEFACTION (paste) */
  2326. /* DEFACTION (paste_quoted) */
  2327. /*DEFACTION (find)*/
  2328. /* DEFACTION (find_again) */
  2329. /* DEFACTION (reload) */
  2330. /* DEFACTION (load_images) */
  2331. /* DEFACTION (refresh) */
  2332. /* DEFACTION (view_source) */
  2333. /* DEFACTION (back) */
  2334. /* DEFACTION (forward) */
  2335. /* DEFACTION (history) */
  2336. /* DEFACTION (home) */
  2337. /*DEFACTION (save_options)*/
  2338. /* DEFACTION (view_bookmark) */
  2339. DEFACTION (fishcam)
  2340. DEFACTION (net_showstatus)
  2341. /* DEFACTION (abort) */
  2342. DEFACTION (page_forward)
  2343. DEFACTION (page_backward)
  2344. /*DEFACTION (line_forward)*/
  2345. /*DEFACTION (line_backward)*/
  2346. /*DEFACTION (column_forward)*/
  2347. /*DEFACTION (column_backward)*/
  2348.  
  2349. DEFACTION (save_image)
  2350. DEFACTION (open_image)
  2351. DEFACTION (save_link)
  2352. /*DEFACTION (follow_link)*/
  2353. /*DEFACTION (follow_link_new)*/
  2354. #undef DEFACTION
  2355.  
  2356. static void
  2357. fe_open_url_action (Widget widget, XEvent *event, String *av, Cardinal *ac)
  2358. {
  2359.   /* openURL() pops up a file requestor.
  2360.      openURL(http:xxx) opens that URL.
  2361.      Really only one arg is meaningful, but we also accept the form
  2362.      openURL(http:xxx, remote) for the sake of remote.c, and treat
  2363.      openURL(remote) the same as openURL().
  2364.    */
  2365.   MWContext *context = fe_WidgetToMWContext (widget);
  2366.   MWContext *old_context = NULL;
  2367.   Boolean other_p = False;
  2368.   char *windowName = 0;
  2369.   XP_ASSERT (context);
  2370.   if (!context) return;
  2371.   context = XP_GetNonGridContext (context);
  2372.   fe_UserActivity (context);
  2373.  
  2374.   if (*ac && av[*ac-1] && !strcmp (av[*ac-1], "<remote>"))
  2375.     (*ac)--;
  2376.  
  2377.   if (*ac > 1 && av[*ac-1] )
  2378.   {
  2379.      if ( 
  2380.       (!strcasecomp (av[*ac-1], "new-window") ||
  2381.        !strcasecomp (av[*ac-1], "new_window") ||
  2382.        !strcasecomp (av[*ac-1], "newWindow") ||
  2383.        !strcasecomp (av[*ac-1], "new")))
  2384.     {
  2385.       other_p = True;
  2386.       (*ac)--;
  2387.     }
  2388.     else if ( (old_context = XP_FindNamedContextInList(context, av[*ac-1])))
  2389.     {
  2390.     context = old_context;
  2391.     other_p = False;
  2392.         (*ac)--;
  2393.     }
  2394.     else 
  2395.     {
  2396.     StrAllocCopy(windowName, av[*ac-1]);
  2397.     other_p = True;
  2398.         (*ac)--;
  2399.     }
  2400.  
  2401.    }
  2402.  
  2403.   if (*ac == 1 && av[0])
  2404.     {
  2405.       URL_Struct *url_struct = NET_CreateURLStruct (av[0], FALSE);
  2406.  
  2407. #ifdef MOZ_MAIL_NEWS
  2408.       /* Dont create new windows for Compose. fe_GetURL will take care of it */
  2409.       if (MSG_RequiresComposeWindow(url_struct->address))
  2410.     other_p = False;
  2411. #endif
  2412.  
  2413.       if (other_p)
  2414.       {
  2415.     context = fe_MakeWindow (XtParent (CONTEXT_WIDGET (context)),
  2416.                context, url_struct, windowName, 
  2417.             MWContextBrowser, FALSE);
  2418.         XP_FREE(windowName);
  2419.       }
  2420.       else
  2421.     fe_GetURL (context, url_struct, FALSE);
  2422.     }
  2423.   else if (*ac > 1)
  2424.     {
  2425.       fprintf (stderr, 
  2426.            XP_GetString(XFE_COMMANDS_OPEN_URL_USAGE),
  2427.            fe_progname);
  2428.     }
  2429.   else
  2430.     {
  2431.       fe_open_url_cb (widget, (XtPointer)context, (XtPointer)0);
  2432.     }
  2433. }
  2434.  
  2435. #ifdef MOZ_MAIL_NEWS
  2436. static void
  2437. fe_mailto_action (Widget widget, XEvent *event, String *av, Cardinal *ac)
  2438. {
  2439.   /* see also fe_open_url_action()
  2440.  
  2441.      #### This really ought to be implemented by opening a "mailto:" URL,
  2442.      instead of by calling MSG_ComposeMessage -- that'd be more abstract
  2443.      and stuff.  -jwz
  2444.    */
  2445.  
  2446.   MWContext *context = fe_WidgetToMWContext (widget);
  2447.   XP_ASSERT (context);
  2448.   if (!context) return;
  2449.   fe_UserActivity (context);
  2450.   if (*ac && av[*ac-1] && !strcmp (av[*ac-1], "<remote>"))
  2451.     (*ac)--;
  2452.   if (*ac >= 1)
  2453.     {
  2454.       char *to;
  2455.       int size = 0;
  2456.       int i;
  2457.       for (i = 0; i < *ac; i++)
  2458.     size += (strlen (av[i]) + 2);
  2459.       to = (char *) malloc (size + 1);
  2460.       *to = 0;
  2461.       for (i = 0; i < *ac; i++)
  2462.     {
  2463.       strcat (to, av[i]);
  2464.       if (i < (*ac)-1)
  2465.         strcat (to, ", ");
  2466.     }
  2467.  
  2468.       MSG_ComposeMessage (context,
  2469.               0, /* from */
  2470.               0, /* reply_to */
  2471.               to,
  2472.               0, /* cc */
  2473.               0, /* bcc */
  2474.               0, /* fcc */
  2475.               0, /* newsgroups */
  2476.               0, /* followup_to */
  2477.               0, /* organization */
  2478.               0, /* subject */
  2479.               0, /* references */
  2480.               0, /* other_random_headers */
  2481.               0, /* priority */
  2482.               0, /* attachment */
  2483.               0, /* newspost_url */
  2484.               0, /* body */
  2485.               FALSE, /* encrypt_p */
  2486.               FALSE, /* sign_p */
  2487.               FALSE, /* force_plain_text */
  2488.               0 /* html_part */
  2489.               );
  2490.     }
  2491.   else if (*ac > 1)
  2492.     {
  2493.       fprintf (stderr, 
  2494.                XP_GetString(XFE_COMMANDS_MAIL_TO_USAGE),
  2495.                fe_progname);
  2496.     }
  2497.   else
  2498.     {
  2499.       fe_mailto_cb (widget, (XtPointer)context, (XtPointer)0);
  2500.     }
  2501. }
  2502. #endif  /* MOZ_MAIL_NEWS */
  2503.  
  2504.  
  2505. static void
  2506. fe_add_bookmark_action (Widget widget, XEvent *event, String *av, Cardinal *ac)
  2507. {
  2508.   /* See also fe_open_url_action() */
  2509.   MWContext *context = fe_WidgetToMWContext (widget);
  2510.   XP_ASSERT (context);
  2511.   if (!context) return;
  2512.   fe_UserActivity (context);
  2513.   if (*ac && av[*ac-1] && !strcmp (av[*ac-1], "<remote>"))
  2514.     (*ac)--;
  2515.   if ((*ac == 1 || *ac == 2) && av[0])
  2516.     {
  2517.       URL_Struct *url = NET_CreateURLStruct (av[0], FALSE);
  2518.       char *title = ((*ac == 2 && av[1]) ? av[1] : 0);
  2519.       fe_AddToBookmark (context, title, url, 0);
  2520.     }
  2521.   else if (*ac > 2)
  2522.     {
  2523.       fprintf (stderr,
  2524.                XP_GetString(XFE_COMMANDS_ADD_BOOKMARK_USAGE),
  2525.                fe_progname);
  2526.     }
  2527.   else
  2528.     {
  2529.       fe_add_bookmark_cb (widget, (XtPointer)context, (XtPointer)0);
  2530.     }
  2531. }
  2532.  
  2533. static void
  2534. fe_html_help_action (Widget widget, XEvent *event, String *av, Cardinal *ac)
  2535. {
  2536.   MWContext *context = fe_WidgetToMWContext (widget);
  2537.   XP_Bool remote_p = False;
  2538.   char *map_file_url;
  2539.   char *id;
  2540.   char *search_text;
  2541.  
  2542.   XP_ASSERT (context);
  2543.   if (!context) return;
  2544.   fe_UserActivity (context);
  2545.   if (*ac && av[*ac-1] && !strcmp (av[*ac-1], "<remote>")) {
  2546.     remote_p = True;
  2547.     (*ac)--;
  2548.   }
  2549.  
  2550.   if (*ac == 3) {
  2551.     map_file_url = av[0];
  2552.     id = av[1];
  2553.     search_text = av[2];
  2554.     NET_GetHTMLHelpFileFromMapFile(context, map_file_url, id, search_text);
  2555.   }
  2556.   else {
  2557.       fprintf (stderr,
  2558.                XP_GetString(XFE_COMMANDS_HTML_HELP_USAGE),
  2559.                fe_progname);
  2560.   }
  2561. }
  2562.  
  2563.  
  2564. static void
  2565. fe_deleteKey_action (Widget widget, XEvent *event, String *av, Cardinal *ac)
  2566. {
  2567.   MWContext *context = fe_WidgetToMWContext (widget);
  2568.  
  2569.   XP_ASSERT(context);
  2570.   if (!context) return;
  2571.  
  2572. #ifdef MOZ_MAIL_NEWS
  2573.   if (context->type == MWContextMail || context->type == MWContextNews)
  2574.     XP_ASSERT(0);
  2575.   else
  2576. #endif  /* MOZ_MAIL_NEWS */
  2577.     fe_page_backward_action(widget, event, av, ac);
  2578. }
  2579.  
  2580. static void
  2581. fe_undefined_key_action (Widget widget, XEvent *event,
  2582.              String *av, Cardinal *ac)
  2583. {
  2584.   XBell (XtDisplay (widget), 0);
  2585. }
  2586.  
  2587. /* for the rest, look in src/Command.cpp -- for 'cmd_mapping mapping[]' */
  2588. XtActionsRec fe_CommandActions [] =
  2589. {
  2590.   { "addBookmark",    fe_add_bookmark_action    },
  2591.  
  2592. #ifdef MOZ_MAIL_NEWS
  2593.   { "mailto",        fe_mailto_action },
  2594. #endif
  2595.  
  2596.   { "fishcam",        fe_fishcam_action    },
  2597.   { "net_showstatus",    fe_net_showstatus_action    },
  2598.   { "PageDown",        fe_page_forward_action    },
  2599.   { "PageUp",        fe_page_backward_action    },
  2600.   { "LineDown",        fe_line_forward_action    },
  2601.   { "LineUp",        fe_line_backward_action    },
  2602.   { "ColumnLeft",    fe_column_forward_action  },
  2603.   { "ColumnRight",    fe_column_backward_action },
  2604.  
  2605.   { "Delete",        fe_deleteKey_action },
  2606.   { "Backspace",    fe_deleteKey_action },
  2607.  
  2608.   { "SaveImage",    fe_save_image_action },
  2609.   { "OpenImage",    fe_open_image_action },
  2610.   { "SaveURL",        fe_save_link_action },
  2611.   { "OpenURL",        fe_open_url_action },
  2612.   { "OpenURLNewWindow",    fe_open_url_action },
  2613.  
  2614.   /* For Html Help */
  2615.   { "htmlHelp",        fe_html_help_action },
  2616.  
  2617.   { "undefined-key",    fe_undefined_key_action }
  2618. };
  2619.  
  2620. int fe_CommandActionsSize = countof (fe_CommandActions);
  2621.  
  2622. /**************************/
  2623. /* MessageCompose actions */
  2624. /* (Mail/News actions are */
  2625. /* defined in mailnews.c) */
  2626. /**************************/
  2627.  
  2628.  
  2629. void
  2630. fe_InitCommandActions ()
  2631. {
  2632.   XtAppAddActions(fe_XtAppContext, fe_CommandActions, fe_CommandActionsSize);
  2633. }
  2634.  
  2635.  
  2636. /* This installs all the usual translations on widgets which are a part
  2637.    of the main Netscape window -- it recursively decends the tree, 
  2638.    installing the appropriate translations everywhere.  This should
  2639.    not be called on popups/transients, but only on widgets which are
  2640.    children of the main Shell.
  2641.  */
  2642. void
  2643. fe_HackTranslations (MWContext *context, Widget widget)
  2644. {
  2645.   XtTranslations global_translations = 0;
  2646.   XtTranslations secondary_translations = 0;
  2647.   XP_Bool has_display_area = FALSE;
  2648.  
  2649.   if (XmIsGadget (widget))
  2650.     return;
  2651.  
  2652.  /* To prevent focus problems, dont enable translations on the menubar
  2653.     and its children. The problem was that when we had the translations
  2654.     in the menubar too, we could do a translation and popup a modal
  2655.     dialog when one of the menu's from the menubar was pulleddown. Now
  2656.     motif gets too confused about who holds pointer and keyboard focus.
  2657.  */
  2658.  
  2659.   if (XmIsRowColumn(widget)) {
  2660.     unsigned char type;
  2661.     XtVaGetValues(widget, XmNrowColumnType, &type, 0);
  2662.     if (type == XmMENU_BAR)
  2663.       return;
  2664.   }
  2665.  
  2666.   switch (context->type)
  2667.     {
  2668. #ifdef EDITOR
  2669.     case MWContextEditor:
  2670.       has_display_area = FALSE;
  2671.       global_translations = fe_globalData.global_translations;
  2672.       secondary_translations = fe_globalData.editor_global_translations;
  2673.       break;
  2674. #endif /*EDITOR*/
  2675.  
  2676.     case MWContextBrowser:
  2677.       has_display_area = TRUE;
  2678.       global_translations = fe_globalData.global_translations;
  2679.       secondary_translations = 0;
  2680.       break;
  2681.  
  2682.     case MWContextMail:
  2683.     case MWContextNews:
  2684.       has_display_area = TRUE;
  2685.       global_translations = fe_globalData.global_translations;
  2686.       secondary_translations = fe_globalData.mailnews_global_translations;
  2687.       break;
  2688.  
  2689.     case MWContextMailMsg:
  2690.       has_display_area = TRUE;
  2691.       global_translations = fe_globalData.global_translations;
  2692.       secondary_translations = fe_globalData.messagewin_global_translations;
  2693.       break;
  2694.  
  2695.     case MWContextMessageComposition:
  2696.       has_display_area = FALSE;
  2697.       global_translations = 0;
  2698.       secondary_translations = fe_globalData.mailcompose_global_translations;
  2699.       break;
  2700.  
  2701.     case MWContextBookmarks:
  2702.       has_display_area = FALSE;
  2703.       global_translations = 0;
  2704.       secondary_translations = fe_globalData.bm_global_translations;
  2705.       break;
  2706.     
  2707.     case MWContextHistory:
  2708.       has_display_area = FALSE;
  2709.       global_translations = 0;
  2710.       secondary_translations = fe_globalData.gh_global_translations;
  2711.       break;
  2712.     
  2713.     case MWContextAddressBook:
  2714.       has_display_area = FALSE;
  2715.       global_translations = 0;
  2716.       secondary_translations = fe_globalData.ab_global_translations;
  2717.       break;
  2718.     case MWContextDialog:
  2719.       has_display_area = TRUE;
  2720.       global_translations = 0;
  2721.       secondary_translations = fe_globalData.dialog_global_translations;
  2722.       break;
  2723.  
  2724.     default:
  2725.       break;
  2726.   }
  2727.  
  2728.   if (global_translations)
  2729.     XtOverrideTranslations (widget, global_translations);
  2730.   if (secondary_translations)
  2731.     XtOverrideTranslations (widget, secondary_translations);
  2732.  
  2733.  
  2734.   if (XmIsTextField (widget) || XmIsText (widget) || XmIsList(widget))
  2735.     {
  2736.       /* Set up the editing translations (all text fields, everywhere.) */
  2737.       if (XmIsTextField (widget) || XmIsText (widget))
  2738.     fe_HackTextTranslations (widget);
  2739.  
  2740.       /* Install globalTextFieldTranslations on single-line text fields in
  2741.      windows which have an HTML display area (browser, mail, news) but
  2742.      not in windows which don't have one (compose, download, bookmarks,
  2743.      address book...)
  2744.        */
  2745.       if (has_display_area &&
  2746.       XmIsTextField (widget) &&
  2747.       fe_globalData.global_text_field_translations)
  2748.     XtOverrideTranslations (widget,
  2749.                 fe_globalData.global_text_field_translations);
  2750.    }
  2751.   else
  2752.    {
  2753.        Widget *kids = 0;
  2754.        Cardinal nkids = 0;
  2755.  
  2756.       /* Not a Text or TextField.
  2757.        */
  2758.       /* Install globalNonTextTranslations on non-text widgets in windows which
  2759.      have an HTML display area (browser, mail, news, view source) but not
  2760.      in windows which don't have one (compose, download, bookmarks,
  2761.      address book...)
  2762.        */
  2763.       if (has_display_area &&
  2764.       fe_globalData.global_nontext_translations)
  2765.     XtOverrideTranslations (widget,
  2766.                 fe_globalData.global_nontext_translations);
  2767.  
  2768.       /* Now recurse on the children.
  2769.        */
  2770.       XtVaGetValues (widget, XmNchildren, &kids, XmNnumChildren, &nkids, 0);
  2771.       while (nkids--)
  2772.       fe_HackTranslations (context, kids [nkids]);
  2773.     }
  2774. }
  2775.  
  2776. /* This installs all the usual translations on Text and TextField widgets.
  2777.  */
  2778. void
  2779. fe_HackTextTranslations (Widget widget)
  2780.   Widget parent = widget;
  2781.  
  2782.   for (parent=widget; parent && !XtIsWMShell (parent); parent=XtParent(parent))
  2783.     if (XmLIsGrid(parent))
  2784.       /* We shouldn't be messing with Grid widget and its children */
  2785.       return;
  2786.  
  2787.   if (XmIsTextField(widget))
  2788.     {
  2789.       if (fe_globalData.editing_translations)
  2790.     XtOverrideTranslations (widget, fe_globalData.editing_translations);
  2791.       if (fe_globalData.single_line_editing_translations)
  2792.     XtOverrideTranslations (widget,
  2793.                   fe_globalData.single_line_editing_translations);
  2794.     }
  2795.   else if (XmIsText(widget))
  2796.     {
  2797.       if (fe_globalData.editing_translations)
  2798.     XtOverrideTranslations (widget, fe_globalData.editing_translations);
  2799.       if (fe_globalData.multi_line_editing_translations)
  2800.     XtOverrideTranslations (widget,
  2801.                   fe_globalData.multi_line_editing_translations);
  2802.     }
  2803.   else
  2804.     {
  2805.       XP_ASSERT(0);
  2806.     }
  2807. }
  2808.  
  2809. void
  2810. fe_HackFormTextTranslations(Widget widget)
  2811. {
  2812.   Widget parent = widget;
  2813.  
  2814.   for (parent=widget; parent && !XtIsWMShell (parent); parent=XtParent(parent))
  2815.     if (XmLIsGrid(parent))
  2816.       /* We shouldn't be messing with Grid widget and its children */
  2817.       return;
  2818.  
  2819.   if ((XmIsTextField(widget)) || (XmIsText(widget)) )
  2820.     {
  2821.       if (fe_globalData.form_elem_editing_translations)
  2822.     XtOverrideTranslations (widget, fe_globalData.form_elem_editing_translations);
  2823.     }
  2824.   else
  2825.     {
  2826.       XP_ASSERT(0);
  2827.     }
  2828. }
  2829.  
  2830.  
  2831. /* This installs all the usual translations for popups/transients.
  2832.    All it does is recurse the tree and call fe_HackTextTranslations
  2833.    on any Text or TextField widgets it finds.
  2834.  */
  2835. void
  2836. fe_HackDialogTranslations (Widget widget)
  2837. {
  2838.   if (XmIsGadget (widget))
  2839.     return;
  2840.   else if (XmIsText (widget) || XmIsTextField (widget))
  2841.     fe_HackTextTranslations (widget);
  2842.   else
  2843.     {
  2844.       Widget *kids = 0;
  2845.       Cardinal nkids = 0;
  2846.       XtVaGetValues (widget, XmNchildren, &kids, XmNnumChildren, &nkids, 0);
  2847.       while (nkids--)
  2848.     fe_HackDialogTranslations (kids [nkids]);
  2849.     }
  2850. }
  2851.  
  2852. /* these two are now in src/DownloadFrame.cpp */
  2853. extern NET_StreamClass *fe_MakeSaveAsStream (int format_out, void *data_obj,
  2854.                                              URL_Struct *url_struct, MWContext *context);
  2855.  
  2856. extern NET_StreamClass *fe_MakeSaveAsStreamNoPrompt (int format_out, void *data_obj,
  2857.                                                      URL_Struct *url_struct, MWContext *context);
  2858.  
  2859. void
  2860. fe_RegisterConverters (void)
  2861. {
  2862. #ifdef NEW_DECODERS
  2863.   NET_ClearAllConverters ();
  2864. #endif /* NEW_DECODERS */
  2865.  
  2866.   if (fe_encoding_extensions)
  2867.     {
  2868.       int i = 0;
  2869.       while (fe_encoding_extensions [i])
  2870.     free (fe_encoding_extensions [i++]);
  2871.       free (fe_encoding_extensions);
  2872.       fe_encoding_extensions = 0;
  2873.     }
  2874.  
  2875.   /* register X specific decoders
  2876.    */
  2877.   if (fe_globalData.encoding_filters)
  2878.     {
  2879.       char *copy = strdup (fe_globalData.encoding_filters);
  2880.       char *rest = copy;
  2881.       char *end = rest + strlen (rest);
  2882.  
  2883.       int exts_count = 0;
  2884.       int exts_size = 10;
  2885.       char **all_exts = (char **) malloc (sizeof (char *) * exts_size);
  2886.  
  2887.       while (rest < end)
  2888.     {
  2889.       char *start;
  2890.       char *eol, *colon;
  2891.       char *input, *output, *extensions, *command;
  2892.       eol = strchr (rest, '\n');
  2893.       if (eol) *eol = 0;
  2894.  
  2895.       rest = fe_StringTrim (rest);
  2896.       if (! *rest)
  2897.         /* blank lines are ok */
  2898.         continue;
  2899.  
  2900.       start = rest;
  2901.  
  2902.       colon = strchr (rest, ':');
  2903.       if (! colon) goto LOSER;
  2904.       *colon = 0;
  2905.       input = fe_StringTrim (rest);
  2906.       rest = colon + 1;
  2907.  
  2908.       colon = strchr (rest, ':');
  2909.       if (! colon) goto LOSER;
  2910.       *colon = 0;
  2911.       output = fe_StringTrim (rest);
  2912.       rest = colon + 1;
  2913.  
  2914.       colon = strchr (rest, ':');
  2915.       if (! colon) goto LOSER;
  2916.       *colon = 0;
  2917.       extensions = fe_StringTrim (rest);
  2918.       rest = colon + 1;
  2919.  
  2920.       command = fe_StringTrim (rest);
  2921.       rest = colon + 1;
  2922.       
  2923.       if (*command)
  2924.         {
  2925.           /* First save away the extensions. */
  2926.           char *rest = extensions;
  2927.           while (*rest)
  2928.         {
  2929.           char *start;
  2930.           char *comma, *end;
  2931.           while (isspace (*rest))
  2932.             rest++;
  2933.           start = rest;
  2934.           comma = XP_STRCHR (start, ',');
  2935.           end = (comma ? comma - 1 : start + strlen (start));
  2936.           while (end >= start && isspace (*end))
  2937.             end--;
  2938.           if (comma) end++;
  2939.           if (start < end)
  2940.             {
  2941.               all_exts [exts_count] =
  2942.             (char *) malloc (end - start + 1);
  2943.               strncpy (all_exts [exts_count], start, end - start);
  2944.               all_exts [exts_count][end - start] = 0;
  2945.               if (++exts_count == exts_size)
  2946.             all_exts = (char **)
  2947.               realloc (all_exts,
  2948.                    sizeof (char *) * (exts_size += 10));
  2949.             }
  2950.           rest = (comma ? comma + 1 : end);
  2951.         }
  2952.           all_exts [exts_count] = 0;
  2953.           fe_encoding_extensions = all_exts;
  2954.  
  2955.           /* Now register the converter. */
  2956.           NET_RegisterExternalDecoderCommand (input, output, command);
  2957.         }
  2958.       else
  2959.         {
  2960.       LOSER:
  2961.           fprintf (stderr,
  2962.                    XP_GetString(XFE_COMMANDS_UNPARSABLE_ENCODING_FILTER_SPEC),
  2963.                    fe_progname, start);
  2964.         }
  2965.       rest = (eol ? eol + 1 : end);
  2966.     }
  2967.       free (copy);
  2968.     }
  2969.  
  2970.   /* Register standard decoders
  2971.      This must come AFTER all calls to NET_RegisterExternalDecoderCommand(),
  2972.      (at least in the `NEW_DECODERS' world.)
  2973.    */
  2974.   NET_RegisterMIMEDecoders ();
  2975.  
  2976.   /* How to save to disk. */
  2977.   NET_RegisterContentTypeConverter ("*", FO_SAVE_AS, NULL,
  2978.                     fe_MakeSaveAsStream);
  2979.  
  2980.   /* Saving any binary format as type `text' should save as `source' instead.
  2981.    */
  2982.   NET_RegisterContentTypeConverter ("*", FO_SAVE_AS_TEXT, NULL,
  2983.                     fe_MakeSaveAsStreamNoPrompt);
  2984.   NET_RegisterContentTypeConverter ("*", FO_QUOTE_MESSAGE, NULL,
  2985.                     fe_MakeSaveAsStreamNoPrompt);
  2986.  
  2987.   /* default presentation converter - offer to save unknown types. */
  2988.   NET_RegisterContentTypeConverter ("*", FO_PRESENT, NULL,
  2989.                     fe_MakeSaveAsStream);
  2990.  
  2991. #if 0
  2992.   NET_RegisterContentTypeConverter ("*", FO_VIEW_SOURCE, NULL,
  2993.                     fe_MakeViewSourceStream);
  2994. #endif
  2995.  
  2996. #ifndef NO_MOCHA_CONVERTER_HACK
  2997.   /* libmocha:LM_InitMocha() installs this convert. We blow away all
  2998.    * converters that were installed and hence these mocha default converters
  2999.    * dont get recreated. And mocha has no call to re-register them.
  3000.    * So this hack. - dp/brendan
  3001.    */
  3002.   NET_RegisterContentTypeConverter(APPLICATION_JAVASCRIPT, FO_PRESENT, 0,
  3003.                    NET_CreateMochaConverter);
  3004. #endif /* NO_MOCHA_CONVERTER_HACK */
  3005.  
  3006.   /* Parse stuff out of the .mime.types and .mailcap files.
  3007.    * We dont have to check dates of files for modified because all that
  3008.    * would have been done by the caller. The only place time checking
  3009.    * happens is
  3010.    * (1) Helperapp page is created
  3011.    * (2) Helpers are being saved (OK button pressed on the General Prefs).
  3012.    */
  3013.   NET_InitFileFormatTypes (fe_globalPrefs.private_mime_types_file,
  3014.                fe_globalPrefs.global_mime_types_file);
  3015.   fe_isFileChanged(fe_globalPrefs.private_mime_types_file, 0,
  3016.            &fe_globalData.privateMimetypeFileModifiedTime);
  3017.  
  3018.   NET_RegisterConverters (fe_globalPrefs.private_mailcap_file,
  3019.               fe_globalPrefs.global_mailcap_file);
  3020.   fe_isFileChanged(fe_globalPrefs.private_mailcap_file, 0,
  3021.            &fe_globalData.privateMailcapFileModifiedTime);
  3022.  
  3023. #ifndef NO_WEB_FONTS
  3024.   /* Register webfont converters */
  3025.   NF_RegisterConverters();
  3026. #endif /* NO_WEB_FONTS */
  3027.  
  3028.   /* Plugins go on top of all this */
  3029.   fe_RegisterPluginConverters();
  3030. }
  3031.  
  3032. /* The Windows menu in the toolbar */
  3033.  
  3034. static void
  3035. fe_switch_context_cb (Widget widget, XtPointer closure, XtPointer call_data)
  3036. {
  3037.   MWContext *context = (MWContext *) closure;
  3038.   struct fe_MWContext_cons *cntx = fe_all_MWContexts;
  3039.  
  3040.   /* We need to watchout here. If we were holding down the menu and
  3041.    * before we select, a context gets destroyed (ftp is done say), then
  3042.    * selecting on that item would give an invalid context here. Guard
  3043.    * against that case by validating the context.
  3044.    */
  3045.   
  3046.   while (cntx && (cntx->context != context))
  3047.     cntx = cntx->next;
  3048.   if (!cntx)
  3049.     /* Ah ha! invalid context. I told you! */
  3050.     return;
  3051.   
  3052.   XMapRaised(XtDisplay(CONTEXT_WIDGET(context)),
  3053.            XtWindow(CONTEXT_WIDGET(context)));
  3054.   return;
  3055. }
  3056.  
  3057. void 
  3058. fe_SetString(Widget widget, const char* propname, char* str)
  3059. {
  3060.   XmString xmstr;
  3061.   xmstr = XmStringCreate(str, XmFONTLIST_DEFAULT_TAG);
  3062.   XtVaSetValues(widget, propname, xmstr, 0);
  3063.   XmStringFree(xmstr);
  3064. }
  3065.  
  3066. static void
  3067. fe_addto_windows_menu(Widget w, MWContext *context, MWContextType lookfor)
  3068. {
  3069.   Widget menu = CONTEXT_DATA (context)->windows_menu;
  3070.   Widget button = w;
  3071.   char buf[1024], *title, *s;
  3072.   struct fe_MWContext_cons *cntx = NULL;
  3073.   Boolean more = True;        /* some contexts are always single. In those
  3074.                    cases, this will become False and stop
  3075.                    further search */
  3076.   INTL_CharSetInfo c;
  3077.  
  3078.   for (cntx = fe_all_MWContexts; more && cntx; cntx = cntx->next)
  3079.     {
  3080.     c = LO_GetDocumentCharacterSetInfo(cntx->context);
  3081.     if (cntx->context->type == lookfor) {
  3082.       /* Fix title */
  3083.       switch (lookfor) {
  3084.     case MWContextMail:
  3085.           title = XP_GetString( XFE_NETSCAPE_MAIL );
  3086.         more = False;
  3087.         break;
  3088.     case MWContextNews:
  3089.           title = XP_GetString( XFE_NETSCAPE_NEWS );
  3090.         more = False;
  3091.         break;
  3092.     case MWContextBookmarks:
  3093.           title = XP_GetString( XFE_BOOKMARKS );
  3094.         more = False;
  3095.         break;
  3096.     case MWContextAddressBook:
  3097.           title = XP_GetString( XFE_ADDRESS_BOOK );
  3098.         more = False;
  3099.         break;
  3100.     case MWContextSaveToDisk:
  3101.         button = 0;
  3102.         title =
  3103.         fe_GetTextField (CONTEXT_DATA(cntx->context)->url_label);
  3104.         XP_ASSERT(title);
  3105.         s = fe_Basename(title);
  3106.         INTL_MidTruncateString (INTL_GetCSIWinCSID(c), s, s, 25);
  3107.         PR_snprintf(buf, sizeof (buf), XP_GetString( XFE_DOWNLOAD_FILE ), s );
  3108.         XtFree(title);
  3109.         title = buf;
  3110.         break;
  3111.     case MWContextMessageComposition:
  3112.         button = 0;
  3113.         title = cntx->context->title;
  3114.         if (!title) {
  3115.         title = buf;
  3116.         PR_snprintf(buf, sizeof (buf), XP_GetString( XFE_COMPOSE_NO_SUBJECT ) );
  3117.         }
  3118.         else {
  3119.         s = XP_STRDUP(title);
  3120.             INTL_MidTruncateString (INTL_GetCSIWinCSID(c), s, s, 25);
  3121.         PR_snprintf(buf, sizeof (buf), XP_GetString( XFE_COMPOSE ), s );
  3122.         XP_FREE(s);
  3123.         title = buf;
  3124.         }
  3125.         break;
  3126.     case MWContextBrowser:
  3127.     case MWContextEditor:
  3128.         button = 0;
  3129.         /* Dont process grid children */
  3130.         if (cntx->context->is_grid_cell) continue;
  3131.         title = cntx->context->title;
  3132. #if defined(EDITOR) && defined(EDITOR_UI)
  3133.         if (!title || title[0] == '\0') {
  3134.           History_entry *he = SHIST_GetCurrent(&cntx->context->hist);
  3135.           char *url = (he && he->address ? he->address : 0);
  3136.           if (url != NULL && strcmp(url, "file:///Untitled") != 0)
  3137.             title = url;
  3138.         }
  3139. #endif /*defined(EDITOR) && defined(EDITOR_UI)*/
  3140.         if (!title || !(*title)) {
  3141.           title = buf;
  3142.           PR_snprintf(buf, sizeof (buf), XP_GetString( XFE_NETSCAPE_UNTITLED ) );
  3143.         }
  3144.         else {
  3145.         unsigned char *loc;
  3146.  
  3147.         s = strdup(title);
  3148.         title = buf;
  3149.         INTL_MidTruncateString (INTL_GetCSIWinCSID(c), s, s, 35);
  3150.         loc = fe_ConvertToLocaleEncoding(INTL_GetCSIWinCSID(c),
  3151.                          (unsigned char *) s);
  3152.         PR_snprintf(buf, sizeof (buf), XP_GetString( XFE_NETSCAPE ),
  3153.                 loc);
  3154.         if ((char *) loc != s) {
  3155.             XP_FREE(loc);
  3156.         }
  3157.         XP_FREE(s);
  3158.         }
  3159.         break;
  3160.         default:
  3161.       assert(0);
  3162.       break;
  3163.       }
  3164.       if (!button)
  3165.     button = XmCreateToggleButtonGadget (menu, "windowButton", NULL, 0);
  3166.       XtVaSetValues(button, XmNset, (context == cntx->context),
  3167.             XmNvisibleWhenOff, False, 0);
  3168.       XtAddCallback (button, XmNvalueChangedCallback, fe_switch_context_cb,
  3169.             cntx->context);
  3170.       fe_SetString(button, XmNlabelString, title);
  3171.       XtManageChild(button);
  3172.       }
  3173.     }
  3174.     /* If nothing found, turn button off */
  3175.     if (w && !cntx)
  3176.       XtVaSetValues(w, XmNset, False, XmNvisibleWhenOff, False, 0);
  3177. }
  3178.  
  3179. void
  3180. fe_GenerateWindowsMenu (MWContext *context)
  3181. {
  3182.   Widget menu = CONTEXT_DATA (context)->windows_menu;
  3183.   Widget *kids = 0;
  3184.   Cardinal nkids = 0, kid;
  3185.  
  3186.   if (menu == NULL || CONTEXT_DATA (context)->windows_menu_up_to_date_p)
  3187.     return;
  3188.  
  3189.   XtVaGetValues (menu, XmNchildren, &kids, XmNnumChildren, &nkids, 0);
  3190.  
  3191.   if (context->type == MWContextBrowser)
  3192.     XP_ASSERT(nkids >= 7);
  3193.   else
  3194.     XP_ASSERT(nkids >= 6);
  3195.  
  3196.   kid = 0;
  3197.  
  3198.   fe_addto_windows_menu(kids[kid++], context, MWContextMail);
  3199.  
  3200.   /* next is separator */
  3201.   kid++;
  3202.  
  3203.   fe_addto_windows_menu(kids[kid++], context, MWContextAddressBook);
  3204.   fe_addto_windows_menu(kids[kid++], context, MWContextBookmarks);
  3205.  
  3206.   /* next is history for MWContextBrowser only */
  3207.   if (context->type == MWContextBrowser)
  3208.       XtVaSetValues(kids[kid++], XmNset, False, XmNvisibleWhenOff, False, 0);
  3209.  
  3210.   /* Benjie - added this btn to test mailfilter I will get rid of it soon */
  3211.   XtVaSetValues(kids[kid++], XmNset, False, XmNvisibleWhenOff, False, 0);
  3212.  
  3213.   /* next is separator */
  3214.   kid++;
  3215.  
  3216.   /* Destroy the rest of the children buttons */
  3217.   XtUnmanageChildren (&kids[kid], nkids-kid);
  3218.   for(; kid < nkids; kid++) XtDestroyWidget(kids[kid]);
  3219.  
  3220.   fe_addto_windows_menu(0, context, MWContextBrowser);
  3221. #if defined(EDITOR) && defined(EDITOR_UI)
  3222.   fe_addto_windows_menu(0, context, MWContextEditor);
  3223. #endif
  3224.   fe_addto_windows_menu(0, context, MWContextMessageComposition);
  3225.   fe_addto_windows_menu(0, context, MWContextSaveToDisk);
  3226.  
  3227.   CONTEXT_DATA (context)->windows_menu_up_to_date_p = True;
  3228. }
  3229.  
  3230.