mozilla/cmd/xfe/src/EmbeddedEditor.cpp
mozilla/cmd/xfe/src/ComposeView.cpp
- Modifications to get the insert menu (editorGoodiesMenu), on the embedded
editor and compose view toolbar, to display text instead of icons.
git-svn-id: svn://10.0.0.236/trunk@11231 18797224-902f-48f8-a5cc-f745e15eee43
2536 lines
63 KiB
C++
2536 lines
63 KiB
C++
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
|
*
|
|
* The contents of this file are subject to the Netscape Public License
|
|
* Version 1.0 (the "NPL"); you may not use this file except in
|
|
* compliance with the NPL. You may obtain a copy of the NPL at
|
|
* http://www.mozilla.org/NPL/
|
|
*
|
|
* Software distributed under the NPL is distributed on an "AS IS" basis,
|
|
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
|
|
* for the specific language governing rights and limitations under the
|
|
* NPL.
|
|
*
|
|
* The Initial Developer of this code under the NPL is Netscape
|
|
* Communications Corporation. Portions created by Netscape are
|
|
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
|
|
* Reserved.
|
|
*/
|
|
/*
|
|
ComposeView.cpp -- presents view for composing a mail messages.
|
|
Created: Dora Hsu <dora@netscape.com>, 23-Sept-96.
|
|
*/
|
|
|
|
|
|
#include "rosetta.h"
|
|
#include "xfe2_extern.h"
|
|
#include "ComposeView.h"
|
|
#include "ComposeFolderView.h"
|
|
#include "AddressOutliner.h"
|
|
#include "TextEditorView.h"
|
|
#include "EditorView.h"
|
|
#include "Command.h"
|
|
#include "new_manage.h"
|
|
#include "xp_mem.h"
|
|
#include "ViewGlue.h"
|
|
#include <Xm/Frame.h>
|
|
#include <Xfe/ToolBox.h>
|
|
#include "xfe.h"
|
|
#include "edt.h"
|
|
#include "felocale.h"
|
|
#include "intl_csi.h"
|
|
#include "secnav.h"
|
|
|
|
#include "xeditor.h"
|
|
|
|
/* for XP_GetString() */
|
|
#include <xpgetstr.h>
|
|
extern int MK_MSG_EMPTY_MESSAGE;
|
|
extern int MK_MSG_DOUBLE_INCLUDE;
|
|
HG12821
|
|
extern int MK_MSG_MISSING_SUBJECT;
|
|
extern int XFE_NO_SUBJECT;
|
|
|
|
#include "prefs.h"
|
|
|
|
#if defined(DEBUG_dora) || defined(DEBUG_sgidev)
|
|
#define XDEBUG(x) x
|
|
#else
|
|
#define XDEBUG(x)
|
|
#endif
|
|
|
|
static Atom XFE_TEXT_ATOM = 0;
|
|
|
|
extern "C" {
|
|
void xfe2_EditorInit(MWContext* context);
|
|
void xfe2_EditorImSetCoords(MWContext* context);
|
|
void xfe2_EditorCaretHide(MWContext* context);
|
|
void xfe2_EditorCaretShow(MWContext* context);
|
|
void xfe2_EditorWaitWhileContextBusy(MWContext* context);
|
|
char *xfe2_GetClipboardText(Widget focus, int32 *internal);
|
|
CL_Compositor *fe_create_compositor(MWContext *context);
|
|
Boolean fe_EditorCanPasteCache(MWContext* context, int32* r_length);
|
|
Boolean fe_EditorCanPasteLocal(MWContext* context, int32* r_length);
|
|
Boolean fe_EditorCanPasteText(MWContext* context, int32* r_length);
|
|
Boolean fe_EditorCut(MWContext* context, Time timestamp);
|
|
Boolean fe_EditorCopy(MWContext* context, Time timestamp);
|
|
Boolean fe_EditorPaste(MWContext* context, Time timestamp);
|
|
Widget fe_EditorCreateComposeToolbar(MWContext*, Widget, char*);
|
|
}
|
|
|
|
extern "C" XtPointer fe_GetFont(MWContext *context, int sizeNum, int fontmask);
|
|
extern "C" void
|
|
fe_set_compose_wrap_state(MWContext *context, XP_Bool wrap_p);
|
|
|
|
extern "C" void fe_addToContextList(MWContext *context);
|
|
|
|
extern "C" void fe_cut_cb (Widget widget, XtPointer closure,
|
|
XtPointer call_data);
|
|
extern "C" void fe_paste_cb(Widget widget, XtPointer closure,
|
|
XtPointer call_data);
|
|
extern "C" void fe_copy_cb (Widget widget, XtPointer closure,
|
|
XtPointer call_data);
|
|
extern "C" void fe_paste_quoted_cb (Widget widget, XtPointer closure,
|
|
XtPointer call_data);
|
|
extern "C" void fe_mailNew_cb (Widget widget, XtPointer closure,
|
|
XtPointer call_data);
|
|
extern "C" void fe_SensitizeMenus (MWContext *context);
|
|
extern "C" int FE_GetMessageBody (MSG_Pane* comppane,
|
|
char **body,
|
|
uint32 *body_size,
|
|
MSG_FontCode **font_changes);
|
|
extern XtResource fe_Resources[];
|
|
extern Cardinal fe_ResourcesSize;
|
|
|
|
const char *XFE_ComposeView::tabBeforeSubject = "XFE_ComposeView::tabBeforeSubject";
|
|
const char *XFE_ComposeView::tabAfterSubject = "XFE_ComposeView::tabAfterSubject";
|
|
const char *XFE_ComposeView::tabPrev = "XFE_ComposeView::tabPrev";
|
|
const char *XFE_ComposeView::tabNext = "XFE_ComposeView::tabNext";
|
|
const char *XFE_ComposeView::updateSecurityOption= "XFE_ComposeView::updateSecurityOption";
|
|
|
|
|
|
static void TabBeforeSubjectTraverse(Widget w, XEvent *, String *, Cardinal *)
|
|
{
|
|
XtPointer client;
|
|
XFE_ComposeView *obj ;
|
|
|
|
XtVaGetValues( w, XmNuserData, &client, 0);
|
|
|
|
XDEBUG(printf("Inside ... TabBeforeSubjectTraverse to notify...\n");)
|
|
|
|
obj = (XFE_ComposeView *) client;
|
|
obj->getToplevel()->notifyInterested(XFE_ComposeView::tabBeforeSubject, client);
|
|
}
|
|
|
|
static void TabAfterSubjectTraverse(Widget w, XEvent *, String *, Cardinal *)
|
|
{
|
|
XtPointer client;
|
|
XFE_ComposeView *obj ;
|
|
|
|
XtVaGetValues( w, XmNuserData, &client, 0);
|
|
XDEBUG(printf("Inside ... TabAfterSubjectTraverse to notify...\n");)
|
|
|
|
obj = (XFE_ComposeView *) client;
|
|
obj->getToplevel()->notifyInterested(XFE_ComposeView::tabAfterSubject, client);
|
|
}
|
|
|
|
extern XtAppContext fe_XtAppContext;
|
|
|
|
static XtActionsRec actions[] =
|
|
{{"PrevTabTraverse", TabBeforeSubjectTraverse },
|
|
{"NextTabTraverse", TabAfterSubjectTraverse }};
|
|
|
|
|
|
static char prevtraverseTranslations[] =
|
|
"~Ctrl Shift <Key>Tab: PrevTabTraverse()\n\
|
|
Ctrl Shift <Key>Tab: NextTabTraverse()\n\
|
|
~Shift <Key>Tab: NextTabTraverse()";
|
|
|
|
|
|
|
|
static void PrevTabTraverse(Widget w, XEvent *, String *, Cardinal *)
|
|
{
|
|
XtPointer client;
|
|
XFE_ComposeView *obj ;
|
|
|
|
#ifdef DEBUG_rhess
|
|
fprintf(stderr, "Editor::[ PrevTabTraverse ]\n");
|
|
#endif
|
|
|
|
XtVaGetValues( w, XmNuserData, &client, 0);
|
|
|
|
obj = (XFE_ComposeView *) client;
|
|
obj->getToplevel()->notifyInterested(XFE_ComposeView::tabPrev, client);
|
|
}
|
|
|
|
static void NextTabTraverse(Widget w, XEvent *, String *, Cardinal *)
|
|
{
|
|
XtPointer client;
|
|
XFE_ComposeView *obj ;
|
|
|
|
#ifdef DEBUG_rhess
|
|
fprintf(stderr, "Editor::[ NextTabTraverse ]\n");
|
|
#endif
|
|
|
|
XtVaGetValues( w, XmNuserData, &client, 0);
|
|
|
|
obj = (XFE_ComposeView *) client;
|
|
obj->getToplevel()->notifyInterested(XFE_ComposeView::tabNext, client);
|
|
}
|
|
|
|
extern XtAppContext fe_XtAppContext;
|
|
|
|
static XtActionsRec cv_actions[] =
|
|
{{"CvTabTraversePrev", PrevTabTraverse },
|
|
{"CvTabTraverseNext", NextTabTraverse }};
|
|
|
|
|
|
static char cvTraverseTranslations[] =
|
|
"~Meta ~Alt Ctrl ~Shift <Key>Tab: CvTabTraversePrev()\n\
|
|
~Meta ~Alt Ctrl Shift <Key>Tab: CvTabTraverseNext()";
|
|
|
|
|
|
|
|
XFE_ComposeView::XFE_ComposeView(XFE_Component *toplevel_component,
|
|
Widget parent,
|
|
XFE_View *parent_view,
|
|
MWContext *context,
|
|
MWContext *context_to_copy,
|
|
MSG_CompositionFields * fields,
|
|
MSG_Pane *p,
|
|
const char *pInitialText,
|
|
XP_Bool preferToUseHtml)
|
|
: XFE_MNView(toplevel_component, parent_view, context, p)
|
|
{
|
|
INTL_CharSetInfo c;
|
|
INTL_CharSetInfo c_to_copy;
|
|
|
|
c = LO_GetDocumentCharacterSetInfo(context);
|
|
if (context_to_copy)
|
|
c_to_copy = LO_GetDocumentCharacterSetInfo(context_to_copy);
|
|
else
|
|
c_to_copy = c;
|
|
|
|
MSG_Pane *pane = NULL;
|
|
|
|
// XXX should really be done in the frame..
|
|
if (context_to_copy)
|
|
CONTEXT_DATA(m_contextData)->xfe_doc_csid =
|
|
CONTEXT_DATA(context_to_copy)->xfe_doc_csid;
|
|
else
|
|
CONTEXT_DATA(m_contextData)->xfe_doc_csid = fe_globalPrefs.doc_csid;
|
|
|
|
INTL_SetCSIWinCSID(c, INTL_GetCSIWinCSID(c_to_copy));
|
|
|
|
mailComposer = NULL;
|
|
mailAttachment = NULL;
|
|
m_expanded = True;
|
|
m_toolbarW = NULL;
|
|
m_format_toolbar = NULL;
|
|
m_editorFormW = NULL;
|
|
m_subjectFormW = NULL;
|
|
m_editorFocusP = False;
|
|
m_subjectW = NULL;
|
|
m_addrTextW = NULL;
|
|
m_addrTypeW = NULL;
|
|
m_focusW = NULL;
|
|
m_nullW = NULL;
|
|
m_daW = NULL;
|
|
m_topW = NULL;
|
|
|
|
m_folderViewAlias = NULL; // These are just pointer aliases to views
|
|
m_textViewAlias = NULL; // this class does not own these views
|
|
m_htmlViewAlias = NULL; // It's the parent class who owns these views
|
|
m_delayedSent = False;
|
|
m_plaintextP = !fe_globalPrefs.send_html_msg;
|
|
m_pInitialText = NULL;
|
|
if ( pInitialText && strlen(pInitialText) )
|
|
m_pInitialText = XP_STRDUP(pInitialText);
|
|
|
|
m_requestHTML = preferToUseHtml;
|
|
m_initEditorP = False;
|
|
m_postEditorP = False;
|
|
m_puntEditorP = False;
|
|
m_delayEditorP = False;
|
|
m_dontQuoteP = False;
|
|
|
|
if ( m_requestHTML ) {
|
|
m_plaintextP = False;
|
|
}
|
|
else {
|
|
m_plaintextP = True;
|
|
}
|
|
|
|
#ifdef DEBUG_rhess
|
|
if (m_plaintextP)
|
|
fprintf(stderr, "ComposeView::[ plaintext ]\n");
|
|
else
|
|
fprintf(stderr, "ComposeView::[ HTML ]\n");
|
|
#endif
|
|
|
|
getToplevel()->registerInterest(XFE_Component::afterRealizeCallback,
|
|
this,
|
|
(XFE_FunctionNotification)afterRealizeWidget_cb);
|
|
|
|
{ // Create base widgets
|
|
Widget w;
|
|
/*w = XmCreateForm(parent, "composeViewBaseWidget", NULL, 0);*/
|
|
|
|
w = XtVaCreateWidget("panedw",
|
|
xmPanedWindowWidgetClass,
|
|
parent,
|
|
XmNnavigationType, XmTAB_GROUP,
|
|
NULL);
|
|
setBaseWidget(w);
|
|
}
|
|
|
|
|
|
|
|
if (!p)
|
|
{
|
|
pane = MSG_CreateCompositionPane(m_contextData,
|
|
//context_to_copy required by xp
|
|
context_to_copy,
|
|
fe_mailNewsPrefs, fields, XFE_MNView::m_master );
|
|
setPane(pane);
|
|
CONTEXT_DATA(m_contextData)->comppane = (MSG_Pane*)pane;
|
|
|
|
CONTEXT_DATA(m_contextData)->mcCitedAndUnedited = True;
|
|
CONTEXT_DATA(m_contextData)->mcEdited = False;
|
|
}
|
|
|
|
CONTEXT_DATA (m_contextData)->compose_wrap_lines_p = True;
|
|
|
|
createWidget(getBaseWidget());
|
|
}
|
|
|
|
XFE_ComposeView::~XFE_ComposeView()
|
|
{
|
|
// destroyPane();
|
|
// Don't call this here. Calling MSG_MailCompositionAllConnections-
|
|
// complete will destroy the composition pane.
|
|
|
|
if (!m_plaintextP) {
|
|
XtRemoveEventHandler(m_subjectW,
|
|
ButtonPressMask, FALSE, unGrabEditorProc, this);
|
|
XtRemoveEventHandler(m_daW,
|
|
FocusChangeMask, FALSE, daFocusProc, this);
|
|
XtRemoveEventHandler(m_topW,
|
|
FocusChangeMask, FALSE, topFocusProc, this);
|
|
if (m_nullW)
|
|
XtRemoveEventHandler(m_nullW, FocusChangeMask, FALSE,
|
|
nullFocusProc, this);
|
|
}
|
|
}
|
|
|
|
static ToolbarSpec alignment_menu_spec[] = {
|
|
{ xfeCmdSetAlignmentStyleLeft, PUSHBUTTON, &ed_left_group },
|
|
{ xfeCmdSetAlignmentStyleCenter, PUSHBUTTON, &ed_center_group },
|
|
{ xfeCmdSetAlignmentStyleRight, PUSHBUTTON, &ed_right_group },
|
|
{ NULL }
|
|
};
|
|
|
|
static ToolbarSpec goodies_menu_spec[] = {
|
|
{ xfeCmdInsertLink, PUSHBUTTON /* , &ed_link_group */ },
|
|
{ xfeCmdInsertTarget, PUSHBUTTON /* , &ed_target_group */ },
|
|
{ xfeCmdInsertImage, PUSHBUTTON /* , &ed_image_group */ },
|
|
{ xfeCmdInsertHorizontalLine, PUSHBUTTON /* , &ed_hrule_group */ },
|
|
{ xfeCmdInsertTable, PUSHBUTTON /* , &ed_table_group */ },
|
|
{ NULL }
|
|
};
|
|
|
|
static ToolbarSpec editor_style_toolbar_spec[] = {
|
|
|
|
{ xfeCmdSetParagraphStyle, COMBOBOX },
|
|
{ xfeCmdSetFontFace, COMBOBOX },
|
|
{ xfeCmdSetFontSize, COMBOBOX },
|
|
{ xfeCmdSetFontColor, COMBOBOX },
|
|
TOOLBAR_SEPARATOR,
|
|
|
|
{ xfeCmdToggleCharacterStyleBold, TOGGLEBUTTON, &ed_bold_group },
|
|
{ xfeCmdToggleCharacterStyleItalic, TOGGLEBUTTON, &ed_italic_group },
|
|
{ xfeCmdToggleCharacterStyleUnderline, TOGGLEBUTTON, &ed_underline_group },
|
|
{ xfeCmdClearAllStyles, PUSHBUTTON , &ed_clear_group },
|
|
TOOLBAR_SEPARATOR,
|
|
|
|
{ xfeCmdInsertBulletedList, TOGGLEBUTTON, &ed_bullet_group },
|
|
{ xfeCmdInsertNumberedList, TOGGLEBUTTON, &ed_number_group },
|
|
TOOLBAR_SEPARATOR,
|
|
|
|
{ xfeCmdOutdent, PUSHBUTTON, &ed_outdent_group },
|
|
{ xfeCmdIndent, PUSHBUTTON, &ed_indent_group },
|
|
{ xfeCmdSetAlignmentStyle, CASCADEBUTTON, &ed_left_group, 0, 0, 0,
|
|
(MenuSpec*)&alignment_menu_spec },
|
|
{ "editorGoodiesMenu", CASCADEBUTTON, &ed_insert_group, 0, 0, 0,
|
|
(MenuSpec*)&goodies_menu_spec },
|
|
{ NULL }
|
|
};
|
|
|
|
void
|
|
XFE_ComposeView::createSubjectBar(Widget parent)
|
|
{
|
|
Cardinal ac =0;
|
|
Arg av[20];
|
|
m_subjectFormW = XtVaCreateManagedWidget("subjectFormW",
|
|
xmFormWidgetClass, parent,
|
|
XmNtopAttachment, XmATTACH_FORM,
|
|
XmNleftAttachment, XmATTACH_FORM,
|
|
XmNrightAttachment, XmATTACH_FORM,
|
|
XmNbottomAttachment, XmATTACH_NONE, 0);
|
|
|
|
ac = 0;
|
|
XtSetArg (av [ac], XmNtopAttachment, XmATTACH_FORM); ac++;
|
|
if (m_plaintextP) {
|
|
XtSetArg (av [ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
|
|
}
|
|
else {
|
|
XtSetArg (av [ac], XmNtraversalOn, False); ac++;
|
|
}
|
|
XtSetArg (av [ac], XmNleftAttachment, XmATTACH_FORM); ac++;
|
|
XtSetArg (av [ac], XmNrightAttachment, XmATTACH_NONE); ac++;
|
|
XtSetArg (av [ac], XmNarrowDirection, XmARROW_UP); ac++;
|
|
XtSetArg (av [ac], XmNtraversalOn, False); ac++;
|
|
XtSetArg (av [ac], XmNshadowThickness, 0); ac++;
|
|
m_expand_arrowW = XmCreateArrowButton(m_subjectFormW, "toggleAddressArea",
|
|
av, ac);
|
|
fe_WidgetAddToolTips(m_expand_arrowW);
|
|
|
|
m_expanded = True;
|
|
XtAddCallback(m_expand_arrowW, XmNactivateCallback, expandCallback, this);
|
|
XtManageChild(m_expand_arrowW);
|
|
|
|
|
|
/* Create the text field */
|
|
char name[30];
|
|
char buf[100];
|
|
Widget subjectLabelW;
|
|
|
|
PR_snprintf(name, sizeof (name), "%s", "subject");
|
|
|
|
ac = 0;
|
|
XtSetArg(av[ac], XmNleftAttachment, XmATTACH_WIDGET); ac++;
|
|
XtSetArg(av[ac], XmNleftWidget, m_expand_arrowW); ac++;
|
|
XtSetArg(av[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
|
|
if (m_plaintextP) {
|
|
XtSetArg(av[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
|
|
}
|
|
XtSetArg(av[ac], XmNrightAttachment, XmATTACH_NONE); ac++;
|
|
PR_snprintf(buf, sizeof (buf), "%sLabel", name);
|
|
subjectLabelW = XmCreateLabelGadget(m_subjectFormW, buf, av, ac);
|
|
XtManageChild(subjectLabelW);
|
|
|
|
Dimension height;
|
|
|
|
ac =0;
|
|
m_subjectW = fe_CreateTextField(m_subjectFormW, name, av, ac);
|
|
|
|
XtVaGetValues(m_subjectW, XmNheight, &height, 0);
|
|
|
|
// Set default priority...should be consistent with default menu priority toggle state
|
|
((XFE_ComposeFolderView*)m_folderViewAlias)->selectPriority(MSG_NormalPriority);
|
|
|
|
Widget toolbox_widget = NULL;
|
|
|
|
if (!m_plaintextP) {
|
|
XFE_Component* top_level = getToplevel();
|
|
Widget top_widget = top_level->getBaseWidget();
|
|
|
|
XFE_Toolbox* toolbox = new XFE_Toolbox(top_level, m_subjectFormW);
|
|
|
|
toolbox_widget = toolbox->getBaseWidget();
|
|
|
|
// Make sure the toolbox is efficiently resized
|
|
XtVaSetValues(toolbox_widget,XmNusePreferredHeight,True,NULL);
|
|
|
|
toolbox->show(); // manage
|
|
|
|
m_format_toolbar = new XFE_EditorToolbar(top_level,
|
|
toolbox,
|
|
"formattingToolbar",
|
|
(ToolbarSpec*)&editor_style_toolbar_spec,
|
|
False);
|
|
}
|
|
|
|
// Register Action
|
|
|
|
XtAppAddActions( fe_XtAppContext, actions, 2);
|
|
|
|
XtVaSetValues(m_subjectW, XmNuserData, this, NULL);
|
|
XtOverrideTranslations(m_subjectW,
|
|
XtParseTranslationTable(prevtraverseTranslations));
|
|
|
|
|
|
if (!m_plaintextP) {
|
|
XtInsertEventHandler(m_subjectW, ButtonPressMask, FALSE,
|
|
unGrabEditorProc, this, XtListTail);
|
|
}
|
|
|
|
ac = 0;
|
|
XtSetArg(av[ac], XmNleftAttachment, XmATTACH_WIDGET); ac++;
|
|
XtSetArg(av[ac], XmNleftWidget, subjectLabelW); ac++;
|
|
XtSetArg(av[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
|
|
if (m_plaintextP) {
|
|
XtSetArg(av[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
|
|
}
|
|
XtSetArg(av[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
|
|
XtSetArg(av[ac], XmNrightOffset, 5); ac++;
|
|
XtSetArg(av[ac], XmNtraversalOn, True); ac++;
|
|
XtSetArg(av[ac], XmNhighlightOnEnter, True); ac++;
|
|
XtSetValues(m_subjectW, av, ac);
|
|
XtManageChild(m_subjectW);
|
|
|
|
if (!m_plaintextP) {
|
|
ac = 0;
|
|
XtSetArg(av[ac], XmNtopAttachment, XmATTACH_WIDGET); ac++;
|
|
XtSetArg(av[ac], XmNtopWidget, m_subjectW); ac++;
|
|
XtSetArg(av[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
|
|
XtSetArg(av[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
|
|
XtSetArg(av[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
|
|
XtSetArg(av[ac], XmNtraversalOn, False); ac++;
|
|
XtSetValues(toolbox_widget, av, ac);
|
|
XtManageChild(toolbox_widget);
|
|
}
|
|
|
|
if (fe_globalData.nonterminal_text_translations) {
|
|
XtOverrideTranslations(m_subjectW,
|
|
fe_globalData.nonterminal_text_translations);
|
|
}
|
|
|
|
|
|
if (m_plaintextP) {
|
|
getToplevel()->registerInterest( XFE_TextEditorView::textFocusIn,
|
|
this, (XFE_FunctionNotification)textEditorFocusIn_cb);
|
|
}
|
|
getToplevel()->registerInterest( XFE_AddressOutliner::textFocusIn, this,
|
|
(XFE_FunctionNotification)addressTextFocusIn_cb);
|
|
getToplevel()->registerInterest( XFE_AddressOutliner::typeFocusIn, this,
|
|
(XFE_FunctionNotification)addressTypeFocusIn_cb);
|
|
|
|
getToplevel()->registerInterest( XFE_AddressOutliner::tabNext, this,
|
|
(XFE_FunctionNotification)tabToSubject_cb);
|
|
|
|
getToplevel()->registerInterest( XFE_ComposeView::tabPrev, this,
|
|
(XFE_FunctionNotification)tabToSubject_cb);
|
|
|
|
setDefaultSubjectHeader();
|
|
|
|
// Add callback after the default subject has been set to avoid
|
|
// extra trip to valueChangeCallback
|
|
XtAddCallback(m_subjectW, XmNvalueChangedCallback,
|
|
subjectChangeCallback, (XtPointer)this);
|
|
|
|
XtAddCallback(m_subjectW, XmNfocusCallback,
|
|
subjectFocusIn_CB, (XtPointer)this);
|
|
}
|
|
|
|
void
|
|
XFE_ComposeView::setDefaultSubjectHeader()
|
|
{
|
|
const char * subject = MSG_GetCompHeader(getPane(),MSG_SUBJECT_HEADER_MASK);
|
|
char *pStr = XP_STRDUP(subject);
|
|
|
|
|
|
if (pStr && strlen(pStr))
|
|
{
|
|
fe_SetTextFieldAndCallBack(m_subjectW, pStr);
|
|
}
|
|
XP_FREE(pStr);
|
|
}
|
|
|
|
void
|
|
XFE_ComposeView::show()
|
|
{
|
|
if (!m_plaintextP && m_format_toolbar != NULL)
|
|
m_format_toolbar->show();
|
|
|
|
XFE_MNView::show(); // call super
|
|
}
|
|
|
|
void
|
|
XFE_ComposeView::createWidget(Widget )
|
|
|
|
{
|
|
Boolean wrap_p ;
|
|
{
|
|
// Create subviews
|
|
XFE_ComposeFolderView *view =
|
|
new XFE_ComposeFolderView(getToplevel(), (XFE_View*)this,
|
|
(MSG_Pane*)getPane(),getContext());
|
|
|
|
view->createWidgets(getBaseWidget(), m_plaintextP);
|
|
|
|
addView(view); // Parent class owns this view via "add" operation
|
|
m_folderViewAlias = (XFE_View*) view;
|
|
XtVaSetValues( view->getBaseWidget(),
|
|
XmNallowResize, True, NULL);
|
|
view->show();
|
|
|
|
}
|
|
{
|
|
// Creating the subject bar....
|
|
|
|
Widget lowerForm = XmCreateForm(getBaseWidget(),
|
|
"lowrPaneFormWidget", NULL, 0 );
|
|
XtVaSetValues(lowerForm,
|
|
XmNshadowThickness, 0,
|
|
XmNmarginWidth, 0,
|
|
XmNmarginHeight, 0,
|
|
XmNnavigationType, XmTAB_GROUP, NULL );
|
|
|
|
createSubjectBar(lowerForm);
|
|
|
|
m_editorFormW = XmCreateFrame(lowerForm,
|
|
"composeViewEditFormWidget", NULL, 0);
|
|
|
|
XtVaSetValues(m_editorFormW,
|
|
XmNnavigationType, XmTAB_GROUP,
|
|
XmNtopAttachment, XmATTACH_WIDGET,
|
|
XmNtopWidget, m_subjectFormW,
|
|
XmNtopOffset, 5,
|
|
XmNbottomAttachment, XmATTACH_FORM,
|
|
XmNleftAttachment, XmATTACH_FORM,
|
|
XmNrightAttachment, XmATTACH_FORM, NULL);
|
|
|
|
XtManageChild(m_editorFormW);
|
|
XtManageChild(lowerForm);
|
|
}
|
|
if (m_plaintextP)
|
|
{
|
|
// Create Plain Editor View
|
|
XFE_TextEditorView *view2 =
|
|
new XFE_TextEditorView(getToplevel(),(XFE_View*) this,
|
|
(MSG_Pane*)getPane(), m_contextData);
|
|
|
|
wrap_p = CONTEXT_DATA (m_contextData)->compose_wrap_lines_p;
|
|
view2->createWidgets(m_editorFormW, wrap_p);
|
|
addView(view2); // Parent class owns this view via "add" operation
|
|
m_textViewAlias = (XFE_View*) view2;
|
|
view2->show();
|
|
|
|
// This is a hack...
|
|
//CONTEXT_DATA(m_contextData)->mcBodyText = m_textViewAlias->getBaseWidget();
|
|
|
|
getToplevel()->registerInterest(
|
|
XFE_ComposeView::tabAfterSubject, this,
|
|
(XFE_FunctionNotification)tabToEditor_cb);
|
|
}
|
|
else
|
|
{
|
|
m_contextData->is_editor = True;
|
|
m_contextData->bIsComposeWindow = TRUE;
|
|
|
|
// CONTEXT_DATA (m_contextData)->scrolled_width = 0;
|
|
// CONTEXT_DATA (m_contextData)->scrolled_height = 0;
|
|
|
|
XFE_EditorView *view3 =
|
|
new XFE_EditorView(getToplevel(), m_editorFormW,
|
|
(XFE_View*) this, m_contextData);
|
|
|
|
m_daW = CONTEXT_DATA(m_contextData)->drawing_area;
|
|
m_topW = getToplevel()->getBaseWidget();
|
|
|
|
#ifdef DEBUG_rhess2
|
|
// XmNpreeditType, "overthespot",
|
|
// XmNpreeditType, "root",
|
|
// XmNpreeditType, "none",
|
|
|
|
XtVaSetValues (m_topW,
|
|
XmNpreeditType, "offthespot",
|
|
0);
|
|
#endif
|
|
|
|
XtVaSetValues (XtParent(m_daW),
|
|
XmNborderWidth, 2,
|
|
XmNborderColor,
|
|
CONTEXT_DATA (m_contextData)->default_bg_pixel,
|
|
0);
|
|
|
|
XtVaSetValues (m_daW,
|
|
XmNtraversalOn, True,
|
|
0);
|
|
|
|
XtInsertEventHandler(m_daW, FocusChangeMask, FALSE,
|
|
daFocusProc, this, XtListTail);
|
|
XtInsertEventHandler(m_topW, FocusChangeMask, FALSE,
|
|
topFocusProc, this, XtListTail);
|
|
|
|
// wrap_p = CONTEXT_DATA (m_contextData)->compose_wrap_lines_p;
|
|
|
|
addView(view3); // Parent class owns this view via "add" operation
|
|
|
|
m_htmlViewAlias = (XFE_View*) view3;
|
|
view3->show();
|
|
|
|
// This is a hack...
|
|
CONTEXT_DATA (m_contextData)->mcBodyText = NULL;
|
|
|
|
getToplevel()->registerInterest(
|
|
XFE_ComposeView::tabAfterSubject, this,
|
|
(XFE_FunctionNotification)tabToEditor_cb);
|
|
|
|
// getToplevel()->registerInterest(
|
|
// XFE_AddressOutliner::tabPrev, this,
|
|
// (XFE_FunctionNotification)tabToEditor_cb);
|
|
}
|
|
|
|
|
|
}
|
|
|
|
XFE_CALLBACK_DEFN(XFE_ComposeView,afterRealizeWidget)(XFE_NotificationCenter *,
|
|
void *, void*)
|
|
{
|
|
XmFontList fontList;
|
|
// fe_MailComposeWin_Activate(context);
|
|
fontList = (XmFontList)fe_GetFont (m_contextData, 3, LO_FONT_FIXED);
|
|
// Set the default font in the text widget
|
|
if (m_plaintextP)
|
|
((XFE_TextEditorView*)m_textViewAlias)->setFont(fontList);
|
|
else {
|
|
// Register Action
|
|
|
|
XtAppAddActions( fe_XtAppContext, cv_actions, 2);
|
|
|
|
#ifdef DEBUG_rhess
|
|
fprintf(stderr, "Editor::[ override ]\n");
|
|
#endif
|
|
|
|
XtVaSetValues(
|
|
CONTEXT_DATA (m_contextData)->drawing_area,
|
|
XmNuserData, this, 0
|
|
);
|
|
XtOverrideTranslations(
|
|
CONTEXT_DATA (m_contextData)->drawing_area,
|
|
XtParseTranslationTable(cvTraverseTranslations)
|
|
);
|
|
|
|
}
|
|
|
|
// Initialize widget now
|
|
initialize();
|
|
|
|
// Get Font
|
|
//fe_SensitizeMenus (m_contextData);
|
|
|
|
// Set focus to the appropriate place depending on our mode:
|
|
// If there's no recipient, the AddressOutliner will grab the focus.
|
|
const char * subject = MSG_GetCompHeader(getPane(),MSG_SUBJECT_HEADER_MASK);
|
|
|
|
// If there's a recipient but no subject, put the focus in the
|
|
// subject field;
|
|
if (!subject || strlen(subject) <= 0)
|
|
{
|
|
XmProcessTraversal(m_subjectW, XmTRAVERSE_CURRENT);
|
|
}
|
|
else // else shift keyboard focus into the editor
|
|
{
|
|
focusIn();
|
|
}
|
|
|
|
MSG_SetCompBoolHeader(getPane(),MSG_ATTACH_VCARD_BOOL_HEADER_MASK, fe_globalPrefs.attach_address_card);
|
|
}
|
|
|
|
Boolean
|
|
XFE_ComposeView::isCommandEnabled(CommandType command, void *calldata,
|
|
XFE_CommandInfo* info)
|
|
{
|
|
MSG_Pane *pane = getPane();
|
|
|
|
if (pane && MSG_DeliveryInProgress(pane) && command != xfeCmdStopLoading)
|
|
return False;
|
|
|
|
Widget destW= XmGetDestination(XtDisplay(getBaseWidget()));
|
|
Widget focusW= XmGetFocusWidget(getBaseWidget());
|
|
if ((command == xfeCmdWrapLongLines && !m_plaintextP)
|
|
)
|
|
return False;
|
|
|
|
if (command == xfeCmdAttachAddressBookCard) {
|
|
XDEBUG(printf("XFE_ComposeView::isCommandEnabled(xfeCmdAttachAddressBookCard)\n"));
|
|
return TRUE;
|
|
}
|
|
else if ( (command == xfeCmdNewMessage )
|
|
|| (command == xfeCmdSaveDraft)
|
|
|| (command == xfeCmdSaveTemplate)
|
|
|| (command == xfeCmdQuoteOriginalText)
|
|
|| (command == xfeCmdQuote)
|
|
|| (command == xfeCmdAttach)
|
|
|| (command == xfeCmdWrapLongLines)
|
|
|| (command == xfeCmdEditPreferences)
|
|
|| (command == xfeCmdSendMessageNow)
|
|
|| (command == xfeCmdSendMessageLater)
|
|
|| (command == xfeCmdSearchAddress)
|
|
|| (command == xfeCmdSetPriorityHighest)
|
|
|| (command == xfeCmdSetPriorityHigh)
|
|
|| (command == xfeCmdSetPriorityNormal)
|
|
|| (command == xfeCmdSetPriorityLow)
|
|
|| (command == xfeCmdSetPriorityLowest)
|
|
|| (command == xfeCmdToggleAddressArea)
|
|
|| (command == xfeCmdToggleFormatToolbar) )
|
|
return True;
|
|
else if ( command == xfeCmdDeleteItem ) {
|
|
if ( m_plaintextP ) {
|
|
return True;
|
|
}
|
|
else {
|
|
if ( m_focusW ) {
|
|
if ( m_focusW != m_addrTypeW )
|
|
if ((m_focusW == m_subjectW) ||
|
|
(m_focusW == m_addrTextW)) {
|
|
return True;
|
|
}
|
|
else {
|
|
if (m_plaintextP) {
|
|
// NOTE: textEditorView handles this one...
|
|
//
|
|
XFE_TextEditorView* tev =
|
|
(XFE_TextEditorView*)m_textViewAlias;
|
|
return tev->isCommandEnabled(xfeCmdDelete,
|
|
calldata,info);
|
|
}
|
|
else {
|
|
return False;
|
|
}
|
|
}
|
|
else
|
|
return False;
|
|
}
|
|
else {
|
|
XFE_EditorView *html = (XFE_EditorView*) m_htmlViewAlias;
|
|
XFE_Command* handler = html->getCommand(command);
|
|
|
|
if (handler != NULL) {
|
|
return handler->isEnabled(html, info);
|
|
}
|
|
else {
|
|
return False;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else if ( command == xfeCmdUndo ) {
|
|
if ( m_plaintextP ) {
|
|
return False;
|
|
}
|
|
else {
|
|
if ( m_focusW ) {
|
|
return False;
|
|
}
|
|
else {
|
|
XFE_EditorView *html = (XFE_EditorView*) m_htmlViewAlias;
|
|
XFE_Command* handler = html->getCommand(command);
|
|
|
|
if (handler != NULL) {
|
|
return handler->isEnabled(html, info);
|
|
}
|
|
else {
|
|
return False;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else if ( command == xfeCmdCut ||
|
|
command == xfeCmdCopy ) {
|
|
// NOTE... [ this should only be enabled if there's a selection..
|
|
//
|
|
if ( m_focusW ) {
|
|
if (XmIsTextField( m_focusW )) {
|
|
XmTextPosition left;
|
|
XmTextPosition right;
|
|
Boolean gotcha = False;
|
|
|
|
// NOTE: we disable Cut/Copy if we're in the type
|
|
// field of the AddressOutliner...
|
|
//
|
|
if (m_focusW != m_addrTypeW) {
|
|
gotcha = XmTextFieldGetSelectionPosition(m_focusW,
|
|
&left, &right);
|
|
}
|
|
|
|
if (gotcha) {
|
|
return ((right - left) > 0);
|
|
}
|
|
else {
|
|
return False;
|
|
}
|
|
}
|
|
else {
|
|
if (XmIsText ( m_focusW )) {
|
|
XmTextPosition left;
|
|
XmTextPosition right;
|
|
|
|
Boolean gotcha = False;
|
|
|
|
// NOTE: we disable Cut/Copy if we're in the type
|
|
// field of the AddressOutliner...
|
|
//
|
|
if (m_focusW != m_addrTypeW) {
|
|
gotcha = XmTextGetSelectionPosition(m_focusW,
|
|
&left, &right);
|
|
}
|
|
|
|
if (gotcha) {
|
|
return ((right - left) > 0);
|
|
}
|
|
else {
|
|
return False;
|
|
}
|
|
}
|
|
else {
|
|
return False;
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
if (m_plaintextP) {
|
|
// WARNING... [ the focus isn't being set correctly
|
|
//
|
|
#ifdef DEBUG_rhess
|
|
fprintf(stderr, "ERROR::[ m_focusW = NULL ]\n");
|
|
#endif
|
|
return False;
|
|
}
|
|
else {
|
|
XFE_EditorView *html = (XFE_EditorView*) m_htmlViewAlias;
|
|
XFE_Command* handler = html->getCommand(command);
|
|
|
|
if (handler != NULL) {
|
|
return handler->isEnabled(html, info);
|
|
}
|
|
else {
|
|
return False;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else if ( command == xfeCmdPaste ||
|
|
command == xfeCmdPasteAsQuoted ) {
|
|
if ( m_focusW ) {
|
|
// NOTE... [ disable pasteAsQuoted for non-editor widgets
|
|
//
|
|
if ( command == xfeCmdPasteAsQuoted ) {
|
|
if ( m_focusW == m_subjectW ||
|
|
m_focusW == m_addrTextW ||
|
|
m_focusW == m_addrTypeW ) {
|
|
return False;
|
|
}
|
|
}
|
|
else {
|
|
// NOTE... [ disable paste for the address type widget
|
|
//
|
|
if (m_focusW == m_addrTypeW) {
|
|
return False;
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
if (m_plaintextP) {
|
|
// WARNING... [ the focus isn't being set correctly
|
|
//
|
|
#ifdef DEBUG_rhess
|
|
fprintf(stderr, "ERROR::[ m_focusW = NULL ]\n");
|
|
#endif
|
|
return False;
|
|
}
|
|
}
|
|
|
|
if (m_plaintextP) {
|
|
// NOTE... [ we call the editor code to check the clipboard
|
|
//
|
|
int32 len;
|
|
|
|
if (fe_EditorCanPasteCache(m_contextData, &len) ||
|
|
fe_EditorCanPasteLocal(m_contextData, &len) ||
|
|
fe_EditorCanPasteText (m_contextData, &len)) {
|
|
return True;
|
|
}
|
|
else {
|
|
return False;
|
|
}
|
|
}
|
|
else {
|
|
// NOTE... [ this should only be enabled if there's
|
|
// [ something to PASTE in the clipboard
|
|
//
|
|
XFE_EditorView *html = (XFE_EditorView*) m_htmlViewAlias;
|
|
XFE_Command* handler = html->getCommand(xfeCmdPaste);
|
|
|
|
if (handler != NULL) {
|
|
return handler->isEnabled(html, info);
|
|
}
|
|
else {
|
|
return False;
|
|
}
|
|
}
|
|
}
|
|
else if ((command == xfeCmdSelectAll)) {
|
|
|
|
// If we are a PlainText editor, pass onto TextEditorView..
|
|
if (m_plaintextP) {
|
|
XFE_TextEditorView* tev =
|
|
(XFE_TextEditorView*)m_textViewAlias;
|
|
|
|
return tev->isCommandEnabled(command, calldata, info);
|
|
}
|
|
|
|
// HTML.. SelectAll only works for the main work area.
|
|
else if (!m_plaintextP && (m_focusW == NULL)) {
|
|
|
|
XFE_EditorView* hev = (XFE_EditorView*)m_htmlViewAlias;
|
|
XFE_Command* handler = hev->getCommand(command);
|
|
|
|
if (handler != NULL)
|
|
return handler->isEnabled(hev, info);
|
|
}
|
|
|
|
// ignore any other.
|
|
return False;
|
|
}
|
|
else if ( m_plaintextP &&
|
|
((XFE_TextEditorView*)m_textViewAlias)->isCommandEnabled(command,calldata,info))
|
|
{
|
|
return True;
|
|
}
|
|
// All other commands we pass to FolderView.
|
|
else if (m_folderViewAlias->isCommandEnabled(command, calldata, info))
|
|
return True;
|
|
else
|
|
return XFE_MNView::isCommandEnabled(command, calldata, info);
|
|
}
|
|
|
|
Boolean
|
|
XFE_ComposeView::isCommandSelected(CommandType command, void * calldata,
|
|
XFE_CommandInfo* info)
|
|
{
|
|
if ( command == xfeCmdSetPriorityHighest)
|
|
return ((XFE_ComposeFolderView*)m_folderViewAlias)
|
|
->isPrioritySelected(MSG_HighestPriority);
|
|
|
|
else if ( command == xfeCmdSetPriorityHigh)
|
|
return ((XFE_ComposeFolderView*)m_folderViewAlias)
|
|
->isPrioritySelected(MSG_HighPriority);
|
|
|
|
else if ( command == xfeCmdSetPriorityNormal)
|
|
return ((XFE_ComposeFolderView*)m_folderViewAlias)
|
|
->isPrioritySelected(MSG_NormalPriority);
|
|
|
|
else if ( command == xfeCmdSetPriorityLow)
|
|
return ((XFE_ComposeFolderView*)m_folderViewAlias)
|
|
->isPrioritySelected(MSG_LowPriority);
|
|
|
|
else if ( command == xfeCmdSetPriorityLowest)
|
|
return ((XFE_ComposeFolderView*)m_folderViewAlias)
|
|
->isPrioritySelected(MSG_LowestPriority);
|
|
|
|
else if ( command == xfeCmdAttachAddressBookCard)
|
|
{
|
|
XDEBUG(printf("XFE_ComposeView::isCommandEnabled(xfeCmdAttachAddressBookCard)\n"));
|
|
return MSG_GetCompBoolHeader(getPane(),MSG_ATTACH_VCARD_BOOL_HEADER_MASK);
|
|
}
|
|
|
|
else if ( command == xfeCmdWrapLongLines)
|
|
{
|
|
return CONTEXT_DATA (m_contextData)->compose_wrap_lines_p;
|
|
}
|
|
else
|
|
return XFE_MNView::isCommandSelected(command, calldata, info);
|
|
}
|
|
|
|
|
|
Boolean
|
|
XFE_ComposeView::handlesCommand(CommandType command, void* calldata, XFE_CommandInfo* info)
|
|
{
|
|
XDEBUG( printf ("in XFE_ComposeView::handlesCommand(%s)\n", Command::getString(command));)
|
|
|
|
if ((command == xfeCmdWrapLongLines && !m_plaintextP)
|
|
)
|
|
return False;
|
|
if ( (command == xfeCmdNewMessage )
|
|
|| (command == xfeCmdSaveDraft)
|
|
|| (command == xfeCmdSaveTemplate)
|
|
|| (command == xfeCmdAddresseePicker)
|
|
|| (command == xfeCmdQuoteOriginalText)
|
|
|| (command == xfeCmdQuote)
|
|
|| (command == xfeCmdAttach)
|
|
|| (command == xfeCmdAttachAddressBookCard)
|
|
|| (command == xfeCmdEditPreferences)
|
|
|| (command == xfeCmdSendMessageNow)
|
|
|| (command == xfeCmdSendMessageLater)
|
|
|| (command == xfeCmdWrapLongLines)
|
|
|| (command == xfeCmdUndo)
|
|
|| (command == xfeCmdCut)
|
|
|| (command == xfeCmdCopy)
|
|
|| (command == xfeCmdPaste)
|
|
|| (command == xfeCmdDelete)
|
|
|| (command == xfeCmdPasteAsQuoted)
|
|
|| (command == xfeCmdDeleteItem)
|
|
|| (command == xfeCmdSearchAddress)
|
|
|| (command == xfeCmdSetPriorityHighest)
|
|
|| (command == xfeCmdSetPriorityHigh)
|
|
|| (command == xfeCmdSetPriorityNormal)
|
|
|| (command == xfeCmdSetPriorityLow)
|
|
|| (command == xfeCmdSetPriorityLowest)
|
|
|| (command == xfeCmdToggleAddressArea)
|
|
|| (command == xfeCmdToggleFormatToolbar) )
|
|
return True;
|
|
else if ( m_plaintextP &&
|
|
((XFE_TextEditorView*)m_textViewAlias)->handlesCommand(command,calldata,info))
|
|
{
|
|
return True;
|
|
}
|
|
else if (m_folderViewAlias->handlesCommand(command, calldata, info))
|
|
return True;
|
|
else
|
|
return XFE_MNView::handlesCommand(command, calldata, info);
|
|
}
|
|
|
|
char*
|
|
XFE_ComposeView::commandToString(CommandType cmd,
|
|
void* calldata, XFE_CommandInfo* info)
|
|
{
|
|
if (cmd == xfeCmdToggleFormatToolbar) {
|
|
|
|
Widget widget = NULL;
|
|
Boolean show = !m_format_toolbar->isShown();
|
|
|
|
if (info != NULL)
|
|
widget = info->widget;
|
|
|
|
return getShowHideLabelString(cmd, show, widget);
|
|
|
|
} else if (cmd == xfeCmdToggleAddressArea) {
|
|
|
|
Widget widget = NULL;
|
|
|
|
if (info != NULL)
|
|
widget = info->widget;
|
|
|
|
return getShowHideLabelString(cmd, !m_expanded, widget);
|
|
|
|
} else
|
|
|
|
return XFE_MNView::commandToString(cmd, calldata, info);
|
|
}
|
|
|
|
|
|
XFE_Command*
|
|
XFE_ComposeView::getCommand(CommandType cmd)
|
|
{
|
|
if (m_plaintextP) {
|
|
return NULL;
|
|
} else {
|
|
if ( cmd == xfeCmdCut ||
|
|
cmd == xfeCmdCopy ||
|
|
cmd == xfeCmdPaste ||
|
|
cmd == xfeCmdDeleteItem ||
|
|
cmd == xfeCmdSelectAll ||
|
|
cmd == xfeCmdUndo ) {
|
|
return NULL;
|
|
}
|
|
else
|
|
return ((XFE_EditorView*)m_htmlViewAlias)->getCommand(cmd);
|
|
}
|
|
}
|
|
|
|
XP_Bool
|
|
XFE_ComposeView::continueAfterSanityCheck()
|
|
{
|
|
int errcode = 0;
|
|
XP_Bool cont = True;
|
|
|
|
errcode = MSG_SanityCheck(getPane(),errcode);
|
|
|
|
XDEBUG( printf("Send Now error code is %d\n", errcode);)
|
|
if ( errcode == MK_MSG_EMPTY_MESSAGE )
|
|
{
|
|
cont = XFE_Confirm(m_contextData,XP_GetString(errcode));
|
|
}
|
|
else if ( errcode == MK_MSG_DOUBLE_INCLUDE)
|
|
{
|
|
cont = XFE_Confirm(m_contextData,XP_GetString(errcode));
|
|
}
|
|
|
|
else if ( errcode == MK_MSG_MISSING_SUBJECT )
|
|
{
|
|
const char *def = XP_GetString(XFE_NO_SUBJECT);
|
|
char *subject = (char *) fe_dialog (CONTEXT_WIDGET(m_contextData),
|
|
"promptSubject",
|
|
0, TRUE, def, TRUE, TRUE, 0);
|
|
|
|
if ( subject && strlen(subject) )
|
|
{
|
|
fe_SetTextFieldAndCallBack(m_subjectW, subject);
|
|
|
|
MSG_SetCompHeader(getPane(),MSG_SUBJECT_HEADER_MASK,subject);
|
|
XtFree(subject);
|
|
}
|
|
else if ( !subject )
|
|
{
|
|
cont = False;
|
|
}
|
|
}
|
|
return cont;
|
|
}
|
|
|
|
void
|
|
XFE_ComposeView::doCommand(CommandType command, void * calldata, XFE_CommandInfo* info)
|
|
{
|
|
char *pBody;
|
|
uint32 bodySize;
|
|
MSG_FontCode *font_changes;
|
|
int errcode = 0;
|
|
Widget destW= XmGetDestination(XtDisplay(getBaseWidget()));
|
|
Widget focusW= XmGetFocusWidget(getBaseWidget());
|
|
|
|
XDEBUG( printf ("in XFE_ComposeView::doCommand()\n");)
|
|
XDEBUG( printf ("Do Command: %s \n", Command::getString(command));)
|
|
|
|
if (command == xfeCmdSendMessageNow)
|
|
{
|
|
XDEBUG( printf ("XFE_ComposeView::sendMessageNow()\n");)
|
|
|
|
updateHeaderInfo ( );
|
|
|
|
MSG_SetHTMLMarkup(getPane(), !m_plaintextP);
|
|
|
|
FE_GetMessageBody(getPane(), &pBody, &bodySize, &font_changes);
|
|
//if ( bodySize)
|
|
MSG_SetCompBody(getPane(), pBody );
|
|
|
|
XP_FREE(pBody);
|
|
|
|
if ( !continueAfterSanityCheck()) return;
|
|
|
|
MSG_CommandType msg_cmd = MSG_SendMessage;
|
|
|
|
#if 0
|
|
// For now, this flag was always set to true which is incorrect
|
|
if( fe_globalPrefs.queue_for_later_p )
|
|
msg_cmd = MSG_SendMessageLater;
|
|
#endif
|
|
|
|
/* ###tw Should still probably do the commandstatus stuff. */
|
|
MSG_Command(getPane(), msg_cmd, NULL, 0);
|
|
}
|
|
else if (command == xfeCmdSendMessageLater)
|
|
{
|
|
XDEBUG( printf ("XFE_ComposeView::sendMessageLater()\n");)
|
|
|
|
updateHeaderInfo ( );
|
|
|
|
FE_GetMessageBody(getPane(), &pBody, &bodySize, &font_changes);
|
|
//if ( bodySize)
|
|
MSG_SetCompBody(getPane(), pBody );
|
|
|
|
XP_FREE(pBody);
|
|
|
|
while ((errcode = MSG_SanityCheck(getPane(),errcode))!=0)
|
|
{
|
|
XDEBUG( printf("Send Later error code is %d\n", errcode);)
|
|
if (!XFE_Confirm(m_contextData,XP_GetString(errcode)))
|
|
return;
|
|
}
|
|
// Mark this to be true so that when ComposeFame deletion
|
|
// happened, it will delete the ComposeFrame accordingly
|
|
m_delayedSent = True;
|
|
/* ###tw Should still probably do the commandstatus stuff. */
|
|
MSG_Command(getPane(), MSG_SendMessageLater, NULL, 0);
|
|
}
|
|
else if (command == xfeCmdSaveDraft ||
|
|
command == xfeCmdSaveTemplate)
|
|
{
|
|
XDEBUG( printf ("XFE_ComposeView::saveAsDraft()\n");)
|
|
|
|
updateHeaderInfo ( );
|
|
|
|
FE_GetMessageBody(getPane(), &pBody, &bodySize, &font_changes);
|
|
//if ( bodySize)
|
|
MSG_SetCompBody(getPane(), pBody );
|
|
|
|
XP_FREE(pBody);
|
|
|
|
/* ###tw Should still probably do the commandstatus stuff. */
|
|
if (command == xfeCmdSaveDraft)
|
|
MSG_Command(getPane(), MSG_SaveDraft, NULL, 0);
|
|
else if (command == xfeCmdSaveTemplate)
|
|
MSG_Command(getPane(), MSG_SaveTemplate, NULL, 0);
|
|
|
|
// Reset these two flags so that if user close the window, they
|
|
// will not be prompt to save again
|
|
CONTEXT_DATA(m_contextData)->mcCitedAndUnedited = True;
|
|
CONTEXT_DATA(m_contextData)->mcEdited = False;
|
|
}
|
|
else if (command == xfeCmdEditPreferences)
|
|
{
|
|
fe_showMailNewsPreferences(getToplevel(), (MWContext*)m_contextData);
|
|
}
|
|
else if (command == xfeCmdQuoteOriginalText||
|
|
command == xfeCmdQuote)
|
|
{
|
|
if (m_plaintextP) {
|
|
Widget textW = CONTEXT_DATA(m_contextData)->mcBodyText;
|
|
|
|
XtSetSensitive(textW, False);
|
|
MSG_QuoteMessage (getPane(), &XFE_ComposeView::doQuoteMessage, this);
|
|
XtSetSensitive(textW, True);
|
|
}
|
|
else {
|
|
#ifdef DEBUG_rhess
|
|
if (command == xfeCmdQuote)
|
|
fprintf(stderr, "xfeCmdQuote\n");
|
|
else
|
|
fprintf(stderr, "xfeCmdQuoteOriginalText\n");
|
|
#endif
|
|
MSG_SetHTMLMarkup(getPane(), TRUE);
|
|
MSG_QuoteMessage (getPane(), &XFE_ComposeView::doQuoteMessage, this);
|
|
}
|
|
}
|
|
else if ( command == xfeCmdUndo )
|
|
{
|
|
if (!m_plaintextP) {
|
|
XFE_EditorView* hev = (XFE_EditorView*)m_htmlViewAlias;
|
|
XFE_Command* handler = hev->getCommand(command);
|
|
|
|
if (handler != NULL) {
|
|
handler->doCommand(hev, info);
|
|
}
|
|
}
|
|
}
|
|
else if ( command == xfeCmdCut )
|
|
{
|
|
if (m_plaintextP) {
|
|
fe_cut_cb(CONTEXT_WIDGET (m_contextData),
|
|
(XtPointer) m_contextData, NULL);
|
|
}
|
|
else {
|
|
if (m_focusW == NULL) {
|
|
// NOTE: pass this command to the EditorView...
|
|
//
|
|
#ifdef DEBUG_rhess
|
|
fprintf(stderr, "xfeCmdCut::[ HTML ]\n");
|
|
#endif
|
|
XFE_EditorView* hev = (XFE_EditorView*)m_htmlViewAlias;
|
|
XFE_Command* handler = hev->getCommand(command);
|
|
|
|
if (handler != NULL) {
|
|
handler->doCommand(hev, info);
|
|
}
|
|
}
|
|
else {
|
|
#ifdef DEBUG_rhess
|
|
fprintf(stderr, "xfeCmdCut::[ plain ][ %p ]\n", focusW);
|
|
#endif
|
|
m_focusW = focusW;
|
|
|
|
fe_cut_cb(CONTEXT_WIDGET (m_contextData),
|
|
(XtPointer) m_contextData, NULL);
|
|
}
|
|
}
|
|
}
|
|
else if ( command == xfeCmdCopy )
|
|
{
|
|
if (m_plaintextP) {
|
|
fe_copy_cb(CONTEXT_WIDGET (m_contextData),
|
|
(XtPointer) m_contextData, NULL);
|
|
}
|
|
else {
|
|
if (m_focusW == NULL) {
|
|
// NOTE: pass this command to the EditorView...
|
|
//
|
|
#ifdef DEBUG_rhess
|
|
fprintf(stderr, "xfeCmdCopy::[ HTML ]\n");
|
|
#endif
|
|
XFE_EditorView* hev = (XFE_EditorView*)m_htmlViewAlias;
|
|
XFE_Command* handler = hev->getCommand(command);
|
|
|
|
if (handler != NULL) {
|
|
handler->doCommand(hev, info);
|
|
}
|
|
}
|
|
else {
|
|
#ifdef DEBUG_rhess
|
|
fprintf(stderr, "xfeCmdCopy::[ plain ][ %p ]\n", focusW);
|
|
#endif
|
|
m_focusW = focusW;
|
|
|
|
fe_copy_cb(CONTEXT_WIDGET (m_contextData),
|
|
(XtPointer) m_contextData, NULL);
|
|
}
|
|
}
|
|
}
|
|
else if ( command == xfeCmdPaste )
|
|
{
|
|
if (m_plaintextP) {
|
|
fe_paste_cb(CONTEXT_WIDGET (m_contextData),
|
|
(XtPointer) m_contextData, NULL);
|
|
}
|
|
else {
|
|
if ((m_focusW == NULL) || (info->widget == m_daW)) {
|
|
Boolean handled = handleStealthPasteQuote(command, info);
|
|
|
|
if (!handled) {
|
|
// NOTE: pass this command to the EditorView...
|
|
//
|
|
#ifdef DEBUG_rhess
|
|
fprintf(stderr, "xfeCmdPaste::[ HTML ]\n");
|
|
#endif
|
|
XFE_EditorView* hev = (XFE_EditorView*)m_htmlViewAlias;
|
|
XFE_Command* handler = hev->getCommand(command);
|
|
|
|
if (handler != NULL) {
|
|
handler->doCommand(hev, info);
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
#ifdef DEBUG_rhess
|
|
fprintf(stderr, "xfeCmdPaste::[ plain ][ %p ]\n", focusW);
|
|
#endif
|
|
m_focusW = focusW;
|
|
|
|
fe_paste_cb(CONTEXT_WIDGET (m_contextData),
|
|
(XtPointer) m_contextData, NULL);
|
|
}
|
|
}
|
|
}
|
|
else if ( command == xfeCmdPasteAsQuoted )
|
|
{
|
|
if (m_plaintextP) {
|
|
// This command will always make the textWidget to be the focus,
|
|
// per UI spec
|
|
Widget textW = CONTEXT_DATA(m_contextData)->mcBodyText;
|
|
|
|
XmProcessTraversal(textW, XmTRAVERSE_CURRENT);
|
|
|
|
fe_paste_quoted_cb(CONTEXT_WIDGET (m_contextData),
|
|
(XtPointer) m_contextData, NULL);
|
|
}
|
|
else {
|
|
Boolean handled = handleStealthPasteQuote(command, info);
|
|
|
|
if (!handled) {
|
|
int32 internal = 0;
|
|
char* clip_data = NULL;
|
|
|
|
clip_data = xfe2_GetClipboardText(focusW, &internal);
|
|
|
|
if (clip_data) {
|
|
MSG_PastePlaintextQuotation(getPane(), clip_data);
|
|
XP_FREE(clip_data);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else if ( command == xfeCmdSetPriorityHighest )
|
|
{
|
|
// Set Priority
|
|
((XFE_ComposeFolderView*)m_folderViewAlias)
|
|
->selectPriority(MSG_HighestPriority);
|
|
}
|
|
else if ( command == xfeCmdSetPriorityHigh )
|
|
{
|
|
// Set Priority
|
|
((XFE_ComposeFolderView*)m_folderViewAlias)
|
|
->selectPriority(MSG_HighPriority);
|
|
}
|
|
else if ( command == xfeCmdSetPriorityNormal )
|
|
{
|
|
// Set Priority
|
|
((XFE_ComposeFolderView*)m_folderViewAlias)
|
|
->selectPriority(MSG_NormalPriority);
|
|
}
|
|
else if ( command == xfeCmdSetPriorityLow )
|
|
{
|
|
// Set Priority
|
|
((XFE_ComposeFolderView*)m_folderViewAlias)
|
|
->selectPriority(MSG_LowPriority);
|
|
}
|
|
else if ( command == xfeCmdSetPriorityLowest )
|
|
{
|
|
// Set Priority
|
|
((XFE_ComposeFolderView*)m_folderViewAlias)
|
|
->selectPriority(MSG_LowestPriority);
|
|
}
|
|
else if ( command == xfeCmdWrapLongLines )
|
|
{
|
|
XP_Bool state = CONTEXT_DATA (m_contextData)->compose_wrap_lines_p;
|
|
setComposeWrapState(!state);
|
|
}
|
|
else if ( command == xfeCmdAttachAddressBookCard )
|
|
{
|
|
// toggle compose header flag
|
|
XP_Bool state=MSG_GetCompBoolHeader(getPane(),MSG_ATTACH_VCARD_BOOL_HEADER_MASK);
|
|
MSG_SetCompBoolHeader(getPane(),MSG_ATTACH_VCARD_BOOL_HEADER_MASK, state ? FALSE : TRUE);
|
|
}
|
|
else if ( command == xfeCmdViewAddresses ||
|
|
command == xfeCmdAttachFile ||
|
|
command == xfeCmdAttachWebPage ||
|
|
command == xfeCmdDeleteAttachment ||
|
|
command == xfeCmdViewOptions ||
|
|
command == xfeCmdViewAttachments ||
|
|
command == xfeCmdAddresseePicker )
|
|
{
|
|
if ( m_folderViewAlias )
|
|
m_folderViewAlias->doCommand(command, calldata, info);
|
|
}
|
|
else if (command == xfeCmdToggleFormatToolbar)
|
|
{
|
|
m_format_toolbar->toggleShowingState();
|
|
}
|
|
else if (command == xfeCmdToggleAddressArea)
|
|
{
|
|
toggleAddressArea();
|
|
}
|
|
#ifdef ROSETTA_DOES_DECLARATIONS
|
|
HG81210
|
|
#endif /* ROSETTA_DOES_DECLARATIONS */
|
|
else if (command == xfeCmdDeleteItem) {
|
|
if ( m_focusW ) {
|
|
if ( m_focusW != m_addrTypeW ) {
|
|
if ((m_focusW == m_subjectW) ||
|
|
(m_focusW == m_addrTextW)) {
|
|
// NOTE: Xt handles the simple text widgets...
|
|
//
|
|
XEvent *event = info->event;
|
|
XtCallActionProc(m_focusW,
|
|
"delete-next-character",
|
|
event, NULL, 0 );
|
|
}
|
|
else {
|
|
if (m_plaintextP) {
|
|
// NOTE: textEditorView handles this one...
|
|
//
|
|
XFE_TextEditorView* tev =
|
|
(XFE_TextEditorView*)m_textViewAlias;
|
|
|
|
tev->doCommand(xfeCmdDelete, calldata, info);
|
|
}
|
|
else {
|
|
// NOTE: we shouldn't ever get here...
|
|
//
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
XFE_EditorView* hev = (XFE_EditorView*)m_htmlViewAlias;
|
|
XFE_Command* handler = hev->getCommand(command);
|
|
|
|
if (handler != NULL) {
|
|
handler->doCommand(hev, info);
|
|
}
|
|
}
|
|
}
|
|
else if ((command == xfeCmdSelectAll)) {
|
|
// If we are a PlainText editor, pass onto TextEditorView..
|
|
if (m_plaintextP) {
|
|
XFE_TextEditorView* tev =
|
|
(XFE_TextEditorView*)m_textViewAlias;
|
|
|
|
tev->doCommand(command, calldata, info);
|
|
}
|
|
|
|
// HTML.. SelectAll only works for the main work area.
|
|
else if (!m_plaintextP && m_focusW == NULL) {
|
|
|
|
XFE_EditorView* hev = (XFE_EditorView*)m_htmlViewAlias;
|
|
XFE_Command* handler = hev->getCommand(command);
|
|
|
|
if (handler != NULL)
|
|
handler->doCommand(hev, info);
|
|
|
|
} // ignore any other.
|
|
}
|
|
else if ( (m_plaintextP ) &&
|
|
((XFE_TextEditorView*)m_textViewAlias)->isCommandEnabled(command,calldata,info))
|
|
|
|
((XFE_TextEditorView*)m_textViewAlias)->doCommand(command,calldata,info);
|
|
else if ( (m_folderViewAlias ) &&
|
|
((XFE_ComposeFolderView*)m_folderViewAlias)->isCommandEnabled(command,calldata,info))
|
|
|
|
((XFE_ComposeFolderView*)m_folderViewAlias)->doCommand(command,calldata,info);
|
|
else
|
|
{
|
|
XFE_MNView::doCommand(command, calldata, info);
|
|
}
|
|
}
|
|
|
|
XP_Bool
|
|
XFE_ComposeView::handleStealthPasteQuote(CommandType cmd, XFE_CommandInfo* info)
|
|
{
|
|
Widget base = getBaseWidget();
|
|
Display *dpy = XtDisplay(base);
|
|
Window rat = XGetSelectionOwner(dpy, XA_PRIMARY);
|
|
XP_Bool stealth = False;
|
|
|
|
// NOTE... [ special handling required to support both menu and mouse
|
|
// [ click enabling of this feature...
|
|
//
|
|
if (rat != None) {
|
|
if (info &&
|
|
info->event &&
|
|
(((info->event->type == ButtonRelease) &&
|
|
(cmd == xfeCmdPasteAsQuoted)) ||
|
|
((info->event->type == ButtonPress) &&
|
|
(cmd == xfeCmdPaste))
|
|
) &&
|
|
(info->event->xkey.state & ShiftMask)) {
|
|
stealth = True;
|
|
}
|
|
}
|
|
|
|
if (stealth) {
|
|
Time timestamp = info->event->xbutton.time;
|
|
|
|
// NOTE... [ if it's triggered off a mouse click (Btn2),
|
|
// [ set the location before you paste...
|
|
//
|
|
if ((info->event->type == ButtonPress) &&
|
|
(cmd == xfeCmdPaste)
|
|
) {
|
|
fe_EditorGrabFocus(m_contextData, info->event);
|
|
}
|
|
|
|
/*
|
|
* NOTE: only works if we are talking to one server... [ oops ]
|
|
*/
|
|
if (XFE_TEXT_ATOM == 0)
|
|
XFE_TEXT_ATOM = XmInternAtom(dpy, "STRING", False);
|
|
|
|
/*
|
|
* NOTE: only paste text from primary selection...
|
|
*/
|
|
XtGetSelectionValue(base,
|
|
XA_PRIMARY, XFE_TEXT_ATOM,
|
|
quotePrimarySel_cb,
|
|
(XtPointer) this,
|
|
timestamp);
|
|
}
|
|
|
|
return stealth;
|
|
}
|
|
|
|
void*
|
|
XFE_ComposeView::getComposerData()
|
|
{
|
|
return mailComposer;
|
|
}
|
|
|
|
void
|
|
XFE_ComposeView::setComposerData(void* data)
|
|
{
|
|
mailComposer= data;
|
|
}
|
|
|
|
void*
|
|
XFE_ComposeView::getAttachmentData()
|
|
{
|
|
return mailAttachment;
|
|
}
|
|
|
|
void
|
|
XFE_ComposeView::setAttachmentData(void* data)
|
|
{
|
|
mailAttachment= data;
|
|
}
|
|
|
|
|
|
|
|
extern "C" void
|
|
fe_MailComposeDocumentLoaded(MWContext* context)
|
|
{
|
|
XtPointer client = NULL;
|
|
XFE_ComposeView *obj = NULL;
|
|
Widget da = NULL;
|
|
|
|
#ifdef DEBUG_rhess2
|
|
fprintf(stderr, "ComposeView::[ fe_MailComposeGetURLExitRoutine ]\n");
|
|
#endif
|
|
|
|
da = CONTEXT_DATA(context)->drawing_area;
|
|
if (da) {
|
|
XtVaGetValues(da, XmNuserData, &client, 0);
|
|
|
|
obj = (XFE_ComposeView *) client;
|
|
obj->initEditorContents();
|
|
}
|
|
}
|
|
|
|
extern "C" void *
|
|
fe_compose_getData(MWContext *context)
|
|
{
|
|
XFE_Frame *f = ViewGlue_getFrame(context);
|
|
|
|
XP_ASSERT(f && f->getType() == FRAME_MAILNEWS_COMPOSE);
|
|
|
|
return ((XFE_ComposeView *)f->getView())->getComposerData();
|
|
}
|
|
|
|
extern "C" void
|
|
fe_compose_setData(MWContext *context, void* data)
|
|
{
|
|
XFE_Frame *f = ViewGlue_getFrame(context);
|
|
|
|
XP_ASSERT(f && f->getType() == FRAME_MAILNEWS_COMPOSE);
|
|
|
|
((XFE_ComposeView *)f->getView())->setComposerData(data);
|
|
}
|
|
|
|
extern "C" void *
|
|
fe_compose_getAttachment(MWContext *context)
|
|
{
|
|
XFE_Frame *f = ViewGlue_getFrame(context);
|
|
|
|
XP_ASSERT(f && f->getType() == FRAME_MAILNEWS_COMPOSE);
|
|
|
|
return ((XFE_ComposeView *)f->getView())->getAttachmentData();
|
|
}
|
|
|
|
extern "C" void
|
|
fe_compose_setAttachment(MWContext *context, void* data)
|
|
{
|
|
XFE_Frame *f = ViewGlue_getFrame(context);
|
|
|
|
XP_ASSERT(f && f->getType() == FRAME_MAILNEWS_COMPOSE);
|
|
|
|
((XFE_ComposeView *)f->getView())->setAttachmentData(data);
|
|
}
|
|
|
|
|
|
// ------------ NEW CODE ----------------------
|
|
|
|
int
|
|
XFE_ComposeView::quoteMessage(const char *textData)
|
|
{
|
|
if (textData != NULL)
|
|
{
|
|
#ifdef DEBUG_rhess
|
|
fprintf(stderr, "quoteMessage\n");
|
|
#endif
|
|
insertMessageCompositionText( textData, False);
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
int
|
|
XFE_ComposeView::doQuoteMessage(void *closure, const char *textData)
|
|
{
|
|
XFE_ComposeView *obj = (XFE_ComposeView *)closure;
|
|
|
|
XP_ASSERT(obj != NULL);
|
|
|
|
#ifdef DEBUG_rhess
|
|
fprintf(stderr, "doQuoteMessage\n");
|
|
#endif
|
|
|
|
// Requires to return negative value on error
|
|
return obj->quoteMessage(textData);
|
|
}
|
|
|
|
void
|
|
XFE_ComposeView::displayDefaultTextBody()
|
|
{
|
|
MSG_Pane *pane = getPane(); // Get it from MNView
|
|
const char *pBody = MSG_GetCompBody(pane);
|
|
|
|
if ( m_pInitialText && XP_STRLEN(m_pInitialText) ) {
|
|
insertMessageCompositionText( m_pInitialText, False);
|
|
|
|
if (m_plaintextP)
|
|
insertMessageCompositionText( "\n", False);
|
|
|
|
XP_FREEIF(m_pInitialText);
|
|
|
|
m_dontQuoteP = True;
|
|
#ifdef DEBUG_rhess
|
|
fprintf(stderr, " m_dontQuoteP... [ True ]\n");
|
|
#endif
|
|
}
|
|
else {
|
|
if ( pBody && strlen(pBody) ) {
|
|
insertMessageCompositionText( pBody, False);
|
|
|
|
m_dontQuoteP = False;
|
|
#ifdef DEBUG_rhess
|
|
fprintf(stderr, " m_dontQuoteP... [ False ]\n");
|
|
#endif
|
|
}
|
|
else {
|
|
if (m_plaintextP) {
|
|
// NOTE: skip over this for plaintext...
|
|
//
|
|
}
|
|
else {
|
|
// NOTE: we need this to handle the special case where there
|
|
// isn't any default text for the message...
|
|
//
|
|
#ifdef DEBUG_rhess
|
|
fprintf(stderr, "displayDefaultTextBody::[ NULL ]\n");
|
|
#endif
|
|
xfe2_EditorInit(m_contextData);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// Inserting initial addressing field value
|
|
void
|
|
XFE_ComposeView::initialize()
|
|
{
|
|
MSG_Pane *pane = getPane(); // Get it from MNView
|
|
Widget textW = NULL;
|
|
|
|
if (m_plaintextP) {
|
|
XmTextPosition cPos = 0;
|
|
|
|
textW = CONTEXT_DATA(m_contextData)->mcBodyText;
|
|
|
|
XtSetSensitive(textW, False);
|
|
|
|
MSG_SetHTMLMarkup(pane, !m_plaintextP);
|
|
|
|
if ( m_pInitialText && XP_STRLEN(m_pInitialText) ) {
|
|
m_dontQuoteP = True;
|
|
}
|
|
else {
|
|
m_dontQuoteP = False;
|
|
}
|
|
|
|
if ( !m_dontQuoteP && MSG_ShouldAutoQuote (pane) ) {
|
|
MSG_QuoteMessage (pane, &XFE_ComposeView::doQuoteMessage, this);
|
|
}
|
|
|
|
cPos = XmTextGetLastPosition(textW);
|
|
|
|
XmTextSetCursorPosition(textW, cPos);
|
|
|
|
displayDefaultTextBody();
|
|
|
|
XmTextSetCursorPosition(textW, cPos);
|
|
|
|
XtSetSensitive(textW, True);
|
|
}
|
|
else {
|
|
// NOTE: do all this work in XFE_ComposeView::initEditor()...
|
|
//
|
|
}
|
|
}
|
|
|
|
XP_Bool
|
|
XFE_ComposeView::hasFocus()
|
|
{
|
|
return m_editorFocusP;
|
|
}
|
|
|
|
void
|
|
XFE_ComposeView::daFocusProc(Widget,XtPointer cd,XEvent *event,Boolean*)
|
|
{
|
|
// NOTE: event handler on the drawing area...
|
|
//
|
|
XFE_ComposeView *obj = (XFE_ComposeView*)cd;
|
|
|
|
#ifdef DEBUG_rhess_NOT
|
|
if (!event->xfocus.send_event)
|
|
{
|
|
fprintf(stderr, "++---------------------------------[ synth ]\n");
|
|
}
|
|
#endif
|
|
|
|
if (event->type == FocusIn)
|
|
{
|
|
obj->focusIn();
|
|
}
|
|
else
|
|
{
|
|
obj->focusOut();
|
|
}
|
|
}
|
|
|
|
void
|
|
XFE_ComposeView::topFocusProc(Widget,XtPointer cd,XEvent *event,Boolean*)
|
|
{
|
|
// NOTE: event handler on the toplevel shell...
|
|
//
|
|
XFE_ComposeView *obj = (XFE_ComposeView*)cd;
|
|
|
|
if (event->type == FocusIn)
|
|
{
|
|
// NOTE: we don't need to do anything here since the
|
|
// nullFocusProc event handler on m_nullW will
|
|
// auto-magically set the focus to the editor...
|
|
//
|
|
}
|
|
else
|
|
{
|
|
obj->saveFocus();
|
|
}
|
|
}
|
|
|
|
void
|
|
XFE_ComposeView::nullFocusProc(Widget,XtPointer cd,XEvent *event,Boolean*)
|
|
{
|
|
// NOTE: event handler on the "null" widget...
|
|
//
|
|
XFE_ComposeView *obj = (XFE_ComposeView*)cd;
|
|
|
|
if (event->type == FocusIn)
|
|
{
|
|
#ifdef DEBUG_rhess2
|
|
fprintf(stderr, "null::[ FocusIn ]\n");
|
|
#endif
|
|
obj->focusIn();
|
|
}
|
|
else
|
|
{
|
|
#ifdef DEBUG_rhess2
|
|
fprintf(stderr, "null::[ FocusOut ]\n");
|
|
#endif
|
|
}
|
|
}
|
|
|
|
void
|
|
XFE_ComposeView::saveFocus()
|
|
{
|
|
Widget who = XmGetFocusWidget(m_topW);
|
|
|
|
if (who) {
|
|
// NOTE: don't mess with m_focusW unless we've lost focus
|
|
// in the editor...
|
|
if (who == m_nullW) {
|
|
m_focusW = NULL;
|
|
}
|
|
}
|
|
}
|
|
|
|
void
|
|
XFE_ComposeView::focusIn()
|
|
{
|
|
if (m_plaintextP) {
|
|
Widget textW = CONTEXT_DATA(m_contextData)->mcBodyText;
|
|
XmProcessTraversal(textW, XmTRAVERSE_CURRENT);
|
|
|
|
m_focusW = textW;
|
|
}
|
|
else {
|
|
if (!m_editorFocusP) {
|
|
m_editorFocusP = True;
|
|
|
|
XtVaSetValues (XtParent(m_daW), XmNborderColor,
|
|
CONTEXT_DATA (m_contextData)->default_fg_pixel,
|
|
0);
|
|
|
|
xfe2_EditorCaretShow(m_contextData);
|
|
|
|
XmProcessTraversal(m_topW, XmTRAVERSE_CURRENT);
|
|
|
|
// NOTE: if there's any "magic" in this whole focus mechanism,
|
|
// it's right here...
|
|
//
|
|
Widget who = XmGetFocusWidget(m_topW);
|
|
|
|
if (m_nullW) {
|
|
if (m_nullW != who) {
|
|
#ifdef DEBUG_rhess
|
|
fprintf(stderr, "yikes... [ new m_nullW value ]\n");
|
|
#endif
|
|
XtRemoveEventHandler(m_nullW, FocusChangeMask,
|
|
FALSE, nullFocusProc, this);
|
|
XtInsertEventHandler(who, FocusChangeMask, FALSE,
|
|
nullFocusProc, this, XtListTail);
|
|
}
|
|
}
|
|
else {
|
|
XtInsertEventHandler(who, FocusChangeMask, FALSE,
|
|
nullFocusProc, this, XtListTail);
|
|
}
|
|
|
|
m_nullW = who;
|
|
m_focusW = NULL;
|
|
|
|
if (fe_globalData.editor_im_input_enabled) {
|
|
xfe2_EditorImSetCoords(m_contextData);
|
|
}
|
|
|
|
XtSetKeyboardFocus(m_topW, m_daW);
|
|
}
|
|
}
|
|
}
|
|
|
|
void
|
|
XFE_ComposeView::focusOut()
|
|
{
|
|
Widget who = XmGetFocusWidget(m_topW);
|
|
|
|
if (m_plaintextP) {
|
|
// YOH: any idea if we need to do something here?...
|
|
//
|
|
}
|
|
else {
|
|
if (m_editorFocusP) {
|
|
m_editorFocusP = False;
|
|
|
|
xfe2_EditorCaretHide(m_contextData);
|
|
|
|
if (fe_globalData.editor_im_input_enabled) {
|
|
XmImUnsetFocus(m_daW);
|
|
}
|
|
|
|
XtSetKeyboardFocus(m_topW, None);
|
|
|
|
XtVaSetValues (XtParent(m_daW), XmNborderColor,
|
|
CONTEXT_DATA (m_contextData)->default_bg_pixel,
|
|
0);
|
|
|
|
// XFlush(XtDisplay(m_subjectW));
|
|
XmProcessTraversal(m_topW, XmTRAVERSE_CURRENT);
|
|
XmProcessTraversal(who, XmTRAVERSE_CURRENT);
|
|
}
|
|
}
|
|
}
|
|
|
|
void
|
|
XFE_ComposeView::updateCompToolbar()
|
|
{
|
|
char* address;
|
|
URL_Struct* n_url;
|
|
|
|
if (m_delayEditorP) {
|
|
m_delayEditorP = False;
|
|
|
|
#ifdef DEBUG_rhess
|
|
fprintf(stderr, "initEditor... [ about:editfilenew ]\n");
|
|
#endif
|
|
|
|
// NOTE: create a blank address...
|
|
address = "about:editfilenew";
|
|
n_url = NET_CreateURLStruct(address, NET_DONT_RELOAD);
|
|
|
|
((XFE_EditorView*)m_htmlViewAlias)->getURL(n_url);
|
|
}
|
|
}
|
|
|
|
int
|
|
XFE_ComposeView::initEditor()
|
|
{
|
|
char* address;
|
|
URL_Struct* n_url;
|
|
int rtn = 0;
|
|
|
|
if ( m_plaintextP ) {
|
|
}
|
|
else {
|
|
if (XP_IsContextBusy(m_contextData)) {
|
|
#ifdef DEBUG_rhess
|
|
fprintf(stderr, "initEditor::[ delay ]\n");
|
|
#endif
|
|
m_delayEditorP = True;
|
|
}
|
|
else {
|
|
#ifdef DEBUG_rhess
|
|
fprintf(stderr, "initEditor\n");
|
|
#endif
|
|
m_delayEditorP = False;
|
|
|
|
// NOTE: create a blank address...
|
|
address = "about:editfilenew";
|
|
n_url = NET_CreateURLStruct(address, NET_DONT_RELOAD);
|
|
|
|
rtn = ((XFE_EditorView*)m_htmlViewAlias)->getURL(n_url);
|
|
}
|
|
}
|
|
|
|
return (rtn);
|
|
}
|
|
|
|
|
|
void
|
|
XFE_ComposeView::initEditorContents()
|
|
{
|
|
MSG_Pane *pane = getPane(); // Get it from MNView
|
|
|
|
if (m_puntEditorP) {
|
|
#ifdef DEBUG_rhess2
|
|
fprintf(stderr, "initEditorContents::[ PUNT ]\n");
|
|
#endif
|
|
}
|
|
else {
|
|
if (!m_initEditorP) {
|
|
m_initEditorP = True;
|
|
|
|
MSG_SetHTMLMarkup(pane, !m_plaintextP);
|
|
|
|
// EDT_ReturnKey(m_contextData);
|
|
|
|
// EDT_SelectAll(m_contextData);
|
|
// EDT_ClearSelection(m_contextData);
|
|
|
|
if ( m_pInitialText && XP_STRLEN(m_pInitialText) ) {
|
|
m_dontQuoteP = True;
|
|
}
|
|
else {
|
|
m_dontQuoteP = False;
|
|
}
|
|
|
|
EDT_BeginOfDocument(m_contextData, False);
|
|
|
|
if ( !m_dontQuoteP && MSG_ShouldAutoQuote (pane) ) {
|
|
#ifdef DEBUG_rhess
|
|
fprintf(stderr, "initEditorContents::[ quote ]\n");
|
|
#endif
|
|
MSG_QuoteMessage (pane,
|
|
&XFE_ComposeView::doQuoteMessage, this);
|
|
}
|
|
else {
|
|
#ifdef DEBUG_rhess
|
|
fprintf(stderr, "initEditorContents::[ default ]\n");
|
|
#endif
|
|
m_postEditorP = True;
|
|
|
|
displayDefaultTextBody();
|
|
}
|
|
}
|
|
else {
|
|
if (!m_postEditorP) {
|
|
#ifdef DEBUG_rhess
|
|
fprintf(stderr, "initEditorContents::[ default ]\n");
|
|
#endif
|
|
m_postEditorP = True;
|
|
|
|
EDT_EndOfDocument(m_contextData, False);
|
|
|
|
displayDefaultTextBody();
|
|
}
|
|
else {
|
|
#ifdef DEBUG_rhess
|
|
fprintf(stderr, "initEditorContents::[ top ]\n");
|
|
#endif
|
|
m_puntEditorP = True;
|
|
|
|
EDT_BeginOfDocument(m_contextData, False);
|
|
// NOTE: we need to set this so that we can determine
|
|
// if the user has changed the document from
|
|
// what we just loaded...
|
|
//
|
|
EDT_SetDirtyFlag(m_contextData, False);
|
|
|
|
fe_UserActivity(m_contextData);
|
|
|
|
xfe2_EditorInit(m_contextData);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
XFE_CALLBACK_DEFN(XFE_ComposeView,tabToEditor)(XFE_NotificationCenter*, void*, void*)
|
|
{
|
|
#ifdef DEBUG_rhess
|
|
fprintf(stderr, "Editor::[ tabToEditor ]\n");
|
|
#endif
|
|
|
|
focusIn();
|
|
}
|
|
|
|
void
|
|
XFE_ComposeView::insertMessageCompositionText(
|
|
const char* text, XP_Bool leaveCursorBeginning)
|
|
{
|
|
if (m_plaintextP) {
|
|
((XFE_TextEditorView*)m_textViewAlias)->
|
|
insertMessageCompositionText(text, leaveCursorBeginning);
|
|
}
|
|
else {
|
|
#ifdef DEBUG_rhess2
|
|
fprintf(stderr, "++\n%s\n++\n", text);
|
|
#endif
|
|
((XFE_EditorView*)m_htmlViewAlias)->
|
|
insertMessageCompositionText(text, leaveCursorBeginning,
|
|
m_requestHTML);
|
|
}
|
|
}
|
|
|
|
void
|
|
XFE_ComposeView::getMessageBody(
|
|
char **pBody, uint32 *body_size,
|
|
MSG_FontCode **font_changes)
|
|
{
|
|
if (m_plaintextP) {
|
|
((XFE_TextEditorView*)m_textViewAlias)->
|
|
getMessageBody(pBody, body_size, font_changes);
|
|
}
|
|
else {
|
|
((XFE_EditorView*)m_htmlViewAlias)->
|
|
getMessageBody(pBody, body_size, font_changes);
|
|
}
|
|
}
|
|
|
|
void
|
|
XFE_ComposeView::doneWithMessageBody(char *pBody)
|
|
{
|
|
if (m_plaintextP) {
|
|
((XFE_TextEditorView *)m_textViewAlias)->doneWithMessageBody(pBody);
|
|
}
|
|
else {
|
|
((XFE_EditorView *)m_htmlViewAlias)->doneWithMessageBody(pBody);
|
|
}
|
|
}
|
|
|
|
void
|
|
XFE_ComposeView::setComposeWrapState(XP_Bool wrap_p)
|
|
{
|
|
if (m_plaintextP) {
|
|
if ( m_textViewAlias )
|
|
((XFE_TextEditorView*)m_textViewAlias)->setComposeWrapState(wrap_p);
|
|
}
|
|
else {
|
|
// punt on this one for now... [ XFE_EditorView ]
|
|
}
|
|
}
|
|
|
|
XP_Bool
|
|
XFE_ComposeView::isDelayedSent()
|
|
{
|
|
return m_delayedSent;
|
|
}
|
|
|
|
XP_Bool
|
|
XFE_ComposeView::isHTML()
|
|
{
|
|
return !m_plaintextP;
|
|
}
|
|
|
|
|
|
extern "C" void
|
|
fe_InsertMessageCompositionText(
|
|
MWContext *context,
|
|
const char* text, XP_Bool leaveCursorBeginning)
|
|
{
|
|
|
|
XFE_Frame *f = ViewGlue_getFrame(context);
|
|
|
|
XP_ASSERT(f!=NULL && f->getType() == FRAME_MAILNEWS_COMPOSE);
|
|
|
|
#ifdef DEBUG_rhess
|
|
fprintf(stderr, "fe_InsertMessageCompositionText::[ ]\n");
|
|
#endif
|
|
|
|
((XFE_ComposeView*)f->getView())->insertMessageCompositionText(
|
|
text, leaveCursorBeginning);
|
|
}
|
|
|
|
extern "C" void
|
|
fe_getMessageBody(
|
|
MWContext *context,
|
|
char **pBody, uint32 *body_size,
|
|
MSG_FontCode **font_changes)
|
|
{
|
|
|
|
XFE_Frame *f = ViewGlue_getFrame(context);
|
|
|
|
XP_ASSERT(f!=NULL && f->getType() == FRAME_MAILNEWS_COMPOSE);
|
|
|
|
#ifdef DEBUG_rhess
|
|
fprintf(stderr, "fe_getMessageBody::[ ]\n");
|
|
#endif
|
|
|
|
((XFE_ComposeView*)f->getView())->getMessageBody(pBody, body_size,
|
|
font_changes);
|
|
}
|
|
extern "C" void
|
|
fe_doneWithMessageBody(MWContext *context, char *pBody, uint32 /*body_size*/)
|
|
{
|
|
|
|
XFE_Frame *f = ViewGlue_getFrame(context);
|
|
|
|
XP_ASSERT(f!=NULL && f->getType() == FRAME_MAILNEWS_COMPOSE);
|
|
|
|
#ifdef DEBUG_rhess
|
|
fprintf(stderr, "fe_doneWithMessageBody::[ ]\n");
|
|
#endif
|
|
|
|
((XFE_ComposeView*)f->getView())->doneWithMessageBody(pBody);
|
|
}
|
|
|
|
extern "C" void
|
|
fe_addToContextList(MWContext *context)
|
|
{
|
|
struct fe_MWContext_cons *cons;
|
|
|
|
if ( context== NULL) return;
|
|
|
|
cons = XP_NEW_ZAP(struct fe_MWContext_cons);
|
|
|
|
if ( cons == NULL ) return;
|
|
|
|
cons->context = context;
|
|
cons->next = fe_all_MWContexts;
|
|
fe_all_MWContexts = cons;
|
|
XP_AddContextToList (context);
|
|
}
|
|
|
|
extern "C" void
|
|
fe_set_compose_wrap_state(MWContext *context, XP_Bool wrap_p)
|
|
{
|
|
XFE_Frame *frame = ViewGlue_getFrame(XP_GetNonGridContext(context));
|
|
|
|
XP_ASSERT(frame && frame->getType() == FRAME_MAILNEWS_COMPOSE);
|
|
|
|
((XFE_ComposeView*)frame->getView())->setComposeWrapState(wrap_p);
|
|
}
|
|
|
|
void
|
|
XFE_ComposeView::subjectUpdate(Widget w, XtPointer)
|
|
{
|
|
MSG_HEADER_SET msgtype = MSG_SUBJECT_HEADER_MASK;
|
|
char* value = 0;
|
|
char *newvalue = 0;
|
|
MSG_Pane *comppane = (MSG_Pane*)getPane();
|
|
|
|
value = fe_GetTextField(w);
|
|
newvalue = MSG_UpdateHeaderContents(comppane, msgtype, value);
|
|
if (newvalue) {
|
|
fe_SetTextField(w, newvalue);
|
|
MSG_SetCompHeader(comppane, msgtype, newvalue);
|
|
XP_FREE(newvalue);
|
|
}
|
|
}
|
|
|
|
void
|
|
XFE_ComposeView::subjectChange(Widget w, XtPointer)
|
|
{
|
|
MSG_HEADER_SET msgtype = MSG_SUBJECT_HEADER_MASK;
|
|
char* value = 0;
|
|
MSG_Pane *comppane = (MSG_Pane*)getPane();
|
|
|
|
value = fe_GetTextField(w);
|
|
MSG_SetCompHeader (comppane, msgtype, value);
|
|
}
|
|
|
|
|
|
void
|
|
XFE_ComposeView::subjectChangeCallback(Widget w, XtPointer clientData, XtPointer callData)
|
|
{
|
|
XFE_ComposeView *obj = (XFE_ComposeView*)clientData;
|
|
|
|
obj->subjectChange(w, callData);
|
|
}
|
|
|
|
void
|
|
XFE_ComposeView::textEditorFocus(Widget who)
|
|
{
|
|
#ifdef DEBUG_rhess2
|
|
fprintf(stderr, "textEditor::[ %p ]\n", who);
|
|
#endif
|
|
m_focusW = who;
|
|
}
|
|
|
|
void
|
|
XFE_ComposeView::addressTextFocus(Widget who)
|
|
{
|
|
unGrabEditor();
|
|
|
|
#ifdef DEBUG_rhess2
|
|
fprintf(stderr, "addressText::[ %p ]\n", who);
|
|
#endif
|
|
m_addrTextW = who;
|
|
m_focusW = who;
|
|
}
|
|
|
|
void
|
|
XFE_ComposeView::addressTypeFocus(Widget who)
|
|
{
|
|
unGrabEditor();
|
|
|
|
#ifdef DEBUG_rhess2
|
|
fprintf(stderr, "addressType::[ %p ]\n", who);
|
|
#endif
|
|
m_addrTypeW = who;
|
|
m_focusW = who;
|
|
}
|
|
|
|
void
|
|
XFE_ComposeView::subjectFocus()
|
|
{
|
|
unGrabEditor();
|
|
|
|
m_focusW = m_subjectW;
|
|
}
|
|
|
|
void
|
|
XFE_ComposeView::quoteText(char * value)
|
|
{
|
|
if (value) {
|
|
MSG_PastePlaintextQuotation(getPane(), value);
|
|
}
|
|
}
|
|
|
|
void
|
|
XFE_ComposeView::quotePrimarySel_cb(Widget, XtPointer cdata,
|
|
Atom*, Atom *type, XtPointer value,
|
|
unsigned long*, int*)
|
|
{
|
|
XFE_ComposeView *obj = (XFE_ComposeView*)cdata;
|
|
|
|
if (value) {
|
|
if (*type == XFE_TEXT_ATOM) {
|
|
#ifdef DEBUG_rhess
|
|
fprintf(stderr, "quotePrimarySel_cb::[ text ]\n");
|
|
#endif
|
|
obj->quoteText( (char *) value );
|
|
}
|
|
else {
|
|
#ifdef DEBUG_rhess
|
|
fprintf(stderr, "WARNING... [ unknown type atom ]\n");
|
|
#endif
|
|
}
|
|
}
|
|
#ifdef DEBUG_rhess
|
|
else {
|
|
fprintf(stderr, "quotePrimarySel_cb::[ NULL ]\n");
|
|
}
|
|
#endif
|
|
}
|
|
|
|
void
|
|
XFE_ComposeView::subjectFocusIn_CB(Widget,
|
|
XtPointer clientData,
|
|
XtPointer)
|
|
{
|
|
XFE_ComposeView *obj = (XFE_ComposeView*)clientData;
|
|
|
|
obj->subjectFocus();
|
|
}
|
|
|
|
void
|
|
XFE_ComposeView::expandCallback(Widget, XtPointer clientData, XtPointer)
|
|
{
|
|
XFE_ComposeView *obj = (XFE_ComposeView*)clientData;
|
|
|
|
obj->toggleAddressArea();
|
|
}
|
|
|
|
|
|
void
|
|
XFE_ComposeView::toggleAddressArea()
|
|
{
|
|
Widget widget = m_expand_arrowW;
|
|
|
|
if (m_expanded)
|
|
{ // Current, it is expanded. we need to collapse it
|
|
XtVaSetValues(widget, XmNarrowDirection, XmARROW_DOWN, 0);
|
|
m_folderViewAlias->hide();
|
|
m_expanded = False;
|
|
}
|
|
else // Expand it
|
|
{
|
|
XtVaSetValues(widget, XmNarrowDirection, XmARROW_UP, 0);
|
|
m_folderViewAlias->show();
|
|
m_expanded = True;
|
|
}
|
|
}
|
|
|
|
|
|
XFE_CALLBACK_DEFN(XFE_ComposeView, tabToSubject)(XFE_NotificationCenter*, void*, void*)
|
|
{
|
|
XDEBUG(printf("About to tab to subject...\n");)
|
|
unGrabEditor();
|
|
}
|
|
|
|
XFE_CALLBACK_DEFN(XFE_ComposeView, textEditorFocusIn)(XFE_NotificationCenter*, void*, void* calldata)
|
|
{
|
|
Widget who = (Widget) calldata;
|
|
|
|
textEditorFocus(who);
|
|
}
|
|
|
|
XFE_CALLBACK_DEFN(XFE_ComposeView, addressTextFocusIn)(XFE_NotificationCenter*, void*, void* calldata)
|
|
{
|
|
Widget who = (Widget) calldata;
|
|
|
|
addressTextFocus(who);
|
|
}
|
|
|
|
XFE_CALLBACK_DEFN(XFE_ComposeView, addressTypeFocusIn)(XFE_NotificationCenter*, void*, void* calldata)
|
|
{
|
|
Widget who = (Widget) calldata;
|
|
|
|
addressTypeFocus(who);
|
|
}
|
|
|
|
void
|
|
XFE_ComposeView::unGrabEditorProc(Widget, XtPointer cd, XEvent*, Boolean*)
|
|
{
|
|
XFE_ComposeView *obj = (XFE_ComposeView*)cd;
|
|
|
|
obj->unGrabEditor();
|
|
}
|
|
|
|
void
|
|
XFE_ComposeView::unGrabEditor()
|
|
{
|
|
if (m_editorFocusP) {
|
|
#ifdef DEBUG_rhess
|
|
fprintf(stderr, "::[ unGrabEditor ]\n");
|
|
#endif
|
|
focusOut();
|
|
}
|
|
}
|
|
|
|
void
|
|
XFE_ComposeView::editorFocus(Boolean flag)
|
|
{
|
|
m_editorFocusP = flag;
|
|
}
|
|
|
|
Boolean
|
|
XFE_ComposeView::isModified()
|
|
{
|
|
Boolean modified = False;
|
|
|
|
if ( m_plaintextP )
|
|
modified = ((XFE_TextEditorView*)m_textViewAlias)->isModified();
|
|
else
|
|
modified = ((XFE_EditorView*)m_htmlViewAlias)->isModified();
|
|
return modified;
|
|
}
|
|
|
|
void
|
|
XFE_ComposeView::updateHeaderInfo(void)
|
|
{
|
|
|
|
|
|
((XFE_ComposeFolderView*)m_folderViewAlias)->updateHeaderInfo();
|
|
if (m_subjectW)
|
|
{
|
|
char *string;
|
|
|
|
string = fe_GetTextField(m_subjectW);
|
|
|
|
MSG_SetCompHeader(getPane(),MSG_SUBJECT_HEADER_MASK,string);
|
|
XtFree(string);
|
|
}
|
|
|
|
}
|
|
|
|
XFE_View*
|
|
XFE_ComposeView::getCommandView(XFE_Command* )
|
|
{
|
|
//
|
|
// We can do a much simpler (and faster) implimentation that
|
|
// the XFE_View version, because the only sub view that ever
|
|
// impliments XFE_Commands is the html editor view.
|
|
//
|
|
if (!m_plaintextP)
|
|
return (XFE_TextEditorView*)m_htmlViewAlias;
|
|
else
|
|
return NULL;
|
|
}
|
|
|
|
extern "C" void
|
|
FE_SecurityOptionsChanged(MWContext * pContext)
|
|
{
|
|
XFE_Frame * pFrame = ViewGlue_getFrame(XP_GetNonGridContext(pContext));
|
|
if ( pFrame ) {
|
|
((XFE_ComposeView*)pFrame->getView())->getToplevel()->
|
|
notifyInterested(XFE_ComposeView::updateSecurityOption, NULL);
|
|
}
|
|
}
|
|
|