/* -*- Mode: C; tab-width: 8; 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. */ #include "mozilla.h" #include "xfe.h" #include "fonts.h" #include #include #include #include /* for xfe widgets and utilities */ extern void* fe_compose_getData(MWContext* context); extern void* fe_compose_setData(MWContext* context, void* data); extern void fe_mc_field_lostfocus(Widget widget, XtPointer closure, XtPointer call_data); extern void fe_mc_field_changed(Widget widget, XtPointer closure, XtPointer call_data); extern WidgetList fe_create_composition_widgets(MWContext* context, Widget pane, int *numkids); typedef enum { MailComposeLayoutAddress, MailComposeLayoutAttach, MailComposeLayoutCompose } MailComposeLayoutType; /* fe_MailComposeContextData *mailcomposer = 0;*/ /*Temporary*/ #define MAILCOMPOSE_CONTEXT_DATA(context) ((fe_MailComposeContextData*)(fe_compose_getData(context))) #include /* for XP_GetString() */ extern int XFE_PRI_URGENT; extern int XFE_PRI_IMPORTANT; extern int XFE_PRI_NORMAL; extern int XFE_PRI_FYI; extern int XFE_PRI_JUNK; extern int XFE_PRI_PRIORITY; extern int XFE_COMPOSE_LABEL; extern int XFE_COMPOSE_ADDRESSING; extern int XFE_COMPOSE_ATTACHMENT; extern int XFE_COMPOSE_COMPOSE; static void createDummy(Widget parent, char *name) { XtVaCreateManagedWidget(name, xmLabelWidgetClass, parent, XmNtopAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_FORM, XmNleftAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_FORM, XmNmarginWidth, 80, XmNmarginHeight, 60, NULL); } static Widget createOptionMenu(MWContext *context, Widget parent, char* widgetName, char* labelName, Widget *popup) { Cardinal ac; Arg av[10]; Visual *v = 0; Colormap cmap = 0; Cardinal depth =0; Widget option_menu; XmString xmStr = 0; Widget shell = parent; while (shell && !XtIsShell(shell)) shell = XtParent(shell); XtVaGetValues(shell, XtNvisual, &v, XtNcolormap, &cmap, XtNdepth, &depth, 0); ac = 0; XtSetArg(av[ac], XmNvisual, v); ac++; XtSetArg(av[ac], XmNdepth, depth); ac++; XtSetArg(av[ac], XmNcolormap, cmap); ac ++; *popup= XmCreatePulldownMenu(parent, widgetName, av, ac); ac = 0; XtSetArg(av[ac], XmNsubMenuId, *popup); ac++; XtSetArg(av[ac], XmNmarginWidth, 0); ac++; if (labelName && *labelName) { xmStr = XmStringCreateSimple(labelName); XtSetArg(av[ac], XmNlabelString, xmStr); ac++; } option_menu = XmCreateOptionMenu(parent, widgetName, av, ac); if (xmStr) XmStringFree(xmStr); return option_menu; } Widget makeOptionMenu(MWContext *context, Widget parent) { int i; int ac = 0; Arg av[20]; Widget optionW = 0; Widget popUpW = 0; XmString xmStr; Widget btn; int priorityCnt= 5; /* May need to get from somewhere */ optionW = createOptionMenu(context, parent, "priorityOption", XP_GetString(XFE_PRI_PRIORITY), &popUpW); for ( i = 0; i < priorityCnt; i++ ) { xmStr = XmStringCreateSimple(XP_GetString(XFE_PRI_URGENT+i)); ac = 0; XtSetArg(av[ac], XmNuserData, i); ac++; XtSetArg(av[ac], XmNlabelString, xmStr); ac++; btn = XmCreatePushButtonGadget(popUpW, "attrBtn", av, ac); XtManageChild(btn); if ( i == 2 ) /* Normal */ XtVaSetValues(optionW, XmNmenuHistory, btn, 0); XmStringFree(xmStr); } XtManageChild(optionW); return optionW; } static Widget createManagedCompose(MWContext *context, Widget pane) { int ac = 0; char name[30]; char buf[100]; fe_ContextData* data = CONTEXT_DATA(context); Widget form; Widget secureW; Widget optionW; Widget subjectTextW; Widget subjectLabelW; /* XmFontList fontList; */ Arg av[20]; Widget composeform; ac = 0; XtSetArg(av[ac], XmNresizePolicy, XmRESIZE_GROW); ac++; composeform = XmCreateForm(pane, "mailto_field", av, ac); ac = 0; XtSetArg(av[ac], XmNleftAttachment, XmATTACH_FORM); ac++; XtSetArg(av[ac], XmNrightAttachment, XmATTACH_FORM); ac++; XtSetArg(av[ac], XmNtopAttachment, XmATTACH_FORM); ac++; XtSetArg(av[ac], XmNbottomAttachment, XmATTACH_NONE); ac++; form = XmCreateForm(composeform, "mailto_field", av, ac); XtManageChild(form); /* Create a secure button */ ac = 0; XtSetArg(av[ac], XmNleftAttachment, XmATTACH_NONE); ac++; XtSetArg(av[ac], XmNrightAttachment, XmATTACH_FORM); ac++; XtSetArg(av[ac], XmNtopAttachment, XmATTACH_FORM); ac++; XtSetArg(av[ac], XmNbottomAttachment, XmATTACH_FORM); ac++; secureW = XmCreateToggleButtonGadget(form, "secureToggle", av, ac); XtManageChild(secureW); /* Create a priority option */ optionW = makeOptionMenu(context, form); XtVaSetValues( optionW, XmNleftAttachment, XmATTACH_NONE, XmNrightAttachment, XmATTACH_WIDGET, XmNrightWidget, secureW, XmNrightOffset, 5, XmNtopAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_FORM, NULL); /* Create the text field */ PR_snprintf(name, sizeof (name), "%s", "subject"); ac = 0; XtSetArg(av[ac], XmNleftAttachment, XmATTACH_FORM); ac++; XtSetArg(av[ac], XmNtopAttachment, XmATTACH_FORM); ac++; XtSetArg(av[ac], XmNbottomAttachment, XmATTACH_FORM); ac++; XtSetArg(av[ac], XmNrightAttachment, XmATTACH_WIDGET); ac++; XtSetArg(av[ac], XmNrightOffset, 5); ac++; XtSetArg(av[ac], XmNrightWidget, optionW); ac++; subjectTextW = fe_CreateTextField(form, name, av, ac); if (fe_globalData.nonterminal_text_translations) { XtOverrideTranslations(subjectTextW, fe_globalData.nonterminal_text_translations); } XtAddCallback(subjectTextW, XmNvalueChangedCallback, fe_mc_field_changed, (XtPointer)MSG_SUBJECT_HEADER_MASK); XtAddCallback(subjectTextW, XmNlosingFocusCallback, fe_mc_field_lostfocus, (XtPointer)MSG_SUBJECT_HEADER_MASK ); ac = 0; XtSetArg(av[ac], XmNleftAttachment, XmATTACH_FORM); ac++; XtSetArg(av[ac], XmNtopAttachment, XmATTACH_FORM); ac++; XtSetArg(av[ac], XmNbottomAttachment, XmATTACH_FORM); ac++; XtSetArg(av[ac], XmNrightAttachment, XmATTACH_WIDGET); ac++; XtSetArg(av[ac], XmNrightWidget, subjectTextW); ac++; PR_snprintf(buf, sizeof (buf), XP_GetString(XFE_COMPOSE_LABEL), name); subjectLabelW = XmCreateLabelGadget(form, buf, av, ac); data->mcSubject = subjectTextW; /* Subject is not a drop site */ XtVaSetValues(subjectTextW, XmNleftOffset, XfeWidth(subjectLabelW), 0); /* Manage All children here */ XtManageChild(subjectTextW); XtManageChild(subjectLabelW); ac = 0; XtSetArg (av[ac], XmNeditMode, XmMULTI_LINE_EDIT); ac++; XtSetArg(av[ac], XmNleftAttachment, XmATTACH_FORM); ac++; XtSetArg(av[ac], XmNrightAttachment, XmATTACH_FORM); ac++; XtSetArg(av[ac], XmNtopAttachment, XmATTACH_WIDGET); ac++; XtSetArg(av[ac], XmNtopWidget, form); ac++; XtSetArg(av[ac], XmNbottomAttachment, XmATTACH_FORM); ac++; XtSetArg(av[ac], XmNtopOffset, 5); ac++; data->mcBodyText = XmCreateScrolledText(composeform, "mailto_bodyText", av, ac); XtManageChild(data->mcBodyText); XtVaSetValues(XtParent(data->mcBodyText), XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, form, XmNleftAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_FORM, NULL); XtManageChild(composeform); return composeform; } extern Widget fe_MailComposeAddress_CreateManaged(MWContext* context, Widget parent) { Widget frame; WidgetList formList; int k = 0; Arg av[10]; int ac = 0; Widget pane; pane = XmCreatePanedWindow(parent, "pane2", av, ac); XtVaSetValues(pane, XmNseparatorOn, True, 0); ac =0; frame = XmCreateFrame(pane, "frame1", av, ac); XtVaSetValues(frame, XmNtopAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_NONE, XmNleftAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_FORM, 0); XtManageChild(frame); formList = fe_create_composition_widgets(context, frame, &k); XtManageChildren(formList, k); XtManageChild(frame); return pane; } extern Widget fe_make_managed_attach_form(MWContext* context, Widget parent); extern Widget fe_MailComposeAttach_CreateManaged(MWContext* context, Widget parent) { Widget messb; messb = fe_make_managed_attach_form(context, parent); return messb; } static Widget fe_MailCompose_CreateManaged(MWContext* context, Widget parent) { Widget compose; compose = createManagedCompose(context, parent); return compose; } static Widget fe_MailComposeContainer_CreateManaged(MWContext* context) { fe_MailComposeContextData *data = MAILCOMPOSE_CONTEXT_DATA(context); Widget container; Widget address; Widget attach; /* Arg av[10]; */ /* int ac = 0; */ data->container = container = XtVaCreateManagedWidget("mailcompose_container", xmFormWidgetClass, data->parentFolder, XmNtopAttachment, XmATTACH_FORM, XmNbottomAttachment,XmATTACH_FORM, XmNleftAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_FORM, XmNresizePolicy, XmRESIZE_GROW, 0); data->address = fe_MailComposeAddress_CreateManaged(context, container); data->attach = fe_MailComposeAttach_CreateManaged(context, container); data->compose = fe_MailCompose_CreateManaged(context, container); return container; } static Widget fe_MailComposeWin_AddTab( MWContext* context, char *tabName) { fe_MailComposeContextData *data = MAILCOMPOSE_CONTEXT_DATA(context); Widget parentFolder; Widget tab; XmString xmstr = 0; if (!data) return NULL; parentFolder = data->parentFolder; xmstr = XmStringCreateSimple(tabName); tab = XmLFolderAddTabForm(parentFolder, xmstr); XtVaSetValues(tab, XmNtopAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_FORM, XmNleftAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_FORM, XmNresizePolicy, XmRESIZE_GROW, NULL); XmStringFree(xmstr); return tab; } static Widget fe_MailComposeWin_CreateFolders(MWContext* context) { fe_MailComposeContextData *data = MAILCOMPOSE_CONTEXT_DATA(context); Widget folder; Widget parent; if (!data) return NULL; parent = data->parent; folder = XtVaCreateManagedWidget("composeFolder", xmlFolderWidgetClass, parent, NULL); return folder; } static fe_MailComposeContextData * fe_MailComposeWin_CreateContext(MWContext *context) { fe_MailComposeContextData *data = MAILCOMPOSE_CONTEXT_DATA(context); if ( !data ) data = (fe_MailComposeContextData*) malloc(sizeof(fe_MailComposeContextData)); data->tab_number = 0; data->parent = 0; data->container = 0; data->parentFolder = 0; data->address = 0; data->attach = 0; data->compose = 0; data->address_tab = 0; data->attach_tab = 0; data->compose_tab = 0; return data; } static void fe_MailComposeWin_DestroyContext(MWContext *context) { fe_MailComposeContextData *data = MAILCOMPOSE_CONTEXT_DATA(context); if ( !data ) return; XtDestroyWidget(data->parentFolder); /* Remember to destroy mad from the context */ } static void mailcompose_layout(fe_MailComposeContextData *data, MailComposeLayoutType type) { Widget manage= 0, unmanage = 0; switch (type) { case MailComposeLayoutAddress: manage = data->address; unmanage = data->attach; break; case MailComposeLayoutAttach: manage = data->attach; unmanage = data->address; break; case MailComposeLayoutCompose: default: /* Do nothing */ break; } if ( manage && unmanage ) { XtUnmanageChild(unmanage); XtVaSetValues(manage, XmNtopAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_NONE, XmNleftAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_FORM, 0); XtVaSetValues(data->compose, XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, manage, XmNtopOffset, 6, XmNbottomAttachment, XmATTACH_FORM, XmNleftAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_FORM, 0); XtManageChild(manage); } else if (type ==MailComposeLayoutCompose ) { XtUnmanageChild(data->address); XtUnmanageChild(data->attach); XtVaSetValues(data->compose, XmNtopAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_FORM, XmNleftAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_FORM, 0); } } extern void fe_make_new_attach_list(MWContext *context); static void activateTab(Widget w, XtPointer clientData, XtPointer callData) { XmLFolderCallbackStruct *cb = (XmLFolderCallbackStruct *)callData; MWContext *context = (MWContext *)clientData; fe_ContextData* data = CONTEXT_DATA(context); String text; XmTextPosition pos; fe_MailComposeContextData *maildata = MAILCOMPOSE_CONTEXT_DATA(context); XtVaSetValues(maildata->address_tab, XmNtabManagedWidget, NULL, 0); XtVaSetValues(maildata->attach_tab, XmNtabManagedWidget, NULL, 0); XtVaSetValues(maildata->compose_tab, XmNtabManagedWidget, NULL, 0); XmProcessTraversal(w, XmTRAVERSE_DOWN); if ( cb->pos == 0 ) { mailcompose_layout(maildata, MailComposeLayoutAddress); XtVaSetValues(maildata->address_tab, XmNtabManagedWidget, maildata->container,0); XmProcessTraversal (data->mcSubject, XmTRAVERSE_CURRENT); } else if (cb->pos == 1 ) { mailcompose_layout(maildata, MailComposeLayoutAttach); fe_make_new_attach_list(context); XtVaSetValues(maildata->attach_tab, XmNtabManagedWidget, maildata->container,0); XmProcessTraversal (data->mcSubject, XmTRAVERSE_CURRENT); } else { mailcompose_layout(maildata, MailComposeLayoutCompose); XtVaSetValues(maildata->compose_tab, XmNtabManagedWidget, maildata->container,0); XmProcessTraversal (data->mcSubject, XmTRAVERSE_CURRENT); } } Widget fe_MailComposeWin_Create(MWContext* context, Widget parent) { XmFontList fontList; Widget mainForm = 0; fe_MailComposeContextData *data = MAILCOMPOSE_CONTEXT_DATA(context); WidgetList formList2; int j; if ( !data ) /* Create a new one */ data = fe_MailComposeWin_CreateContext(context); fe_compose_setData(context, (void *)data); data->parent = parent; mainForm = fe_MailComposeWin_CreateFolders(context); data->parentFolder = mainForm; /* Create the Container */ { data->container = fe_MailComposeContainer_CreateManaged(context); } /* Create Addressing */ { XmString xmStr; xmStr = XmStringCreateSimple(XP_GetString(XFE_COMPOSE_ADDRESSING)); data->address_tab = XmLFolderAddTab(data->parentFolder, xmStr); XmStringFree(xmStr); } /* Create Attachment */ { XmString xmStr; xmStr = XmStringCreateSimple(XP_GetString(XFE_COMPOSE_ATTACHMENT)); data->attach_tab = XmLFolderAddTab(data->parentFolder, xmStr); XmStringFree(xmStr); } /* Create Compose */ { XmString xmStr; xmStr = XmStringCreateSimple(XP_GetString(XFE_COMPOSE_COMPOSE)); data->compose_tab = XmLFolderAddTab(data->parentFolder, xmStr); XmStringFree(xmStr); } XtAddCallback(data->parentFolder, XmNactivateCallback, activateTab, context); return (mainForm); } void fe_MailComposeWin_Activate(MWContext *context) { XmLFolderSetActiveTab(MAILCOMPOSE_CONTEXT_DATA(context)->parentFolder, 0, True); } void fe_MailComposeWin_ActivateFolder(MWContext *context, int pos) { XmLFolderSetActiveTab(MAILCOMPOSE_CONTEXT_DATA(context)->parentFolder, pos, True); }