Files
Mozilla/mozilla/cmd/xfe/src/PrefsMailFolderDlg.cpp
spider d56dcfe52f NORMANDY_DDAY merge...
git-svn-id: svn://10.0.0.236/trunk@4478 18797224-902f-48f8-a5cc-f745e15eee43
1998-06-25 05:50:45 +00:00

350 lines
11 KiB
C++

/* -*- Mode: C++; tab-width: 4 -*-
PrefsMailFolderDlg.cpp -- Generic dialog for choosing a mail folder
Copyright © 1998 Netscape Communications Corporation, all rights reserved.
Created: Alec Flett <alecf@netscape.com>, 05-Mar-98
*/
#include "MozillaApp.h"
#include "xpgetstr.h"
#include "felocale.h"
#include "msgcom.h"
#include "msgmast.h"
#include "PrefsMailFolderDlg.h"
#include "FolderPromptDialog.h"
#include "ViewGlue.h"
#include <Xm/Form.h>
#include <Xm/LabelG.h>
#include <Xfe/Xfe.h>
extern int XFE_CHOOSE_FOLDER_INSTRUCT;
extern int XFE_FOLDER_ON_FORMAT;
extern int MK_MSG_SENT_L10N_NAME;
XFE_PrefsMailFolderDialog::XFE_PrefsMailFolderDialog(Widget parent,
MSG_Master *master,
MWContext *context) :
XFE_Dialog(parent,"prefsMailFolderDialog",TRUE, TRUE, // ok and cancel
FALSE, FALSE, FALSE, TRUE), // nothing else
m_l10n_name(0),
m_retVal(0)
{
m_context=context;
m_master=master;
}
XFE_PrefsMailFolderDialog::~XFE_PrefsMailFolderDialog()
{
// should I be deleting FolderDropdowns?
// the delete is also commented out on FolderPromptDialog.cpp, line 81
// delete m_folderDropDown;
// delete m_serverDropDown;
delete m_l10n_name;
}
void XFE_PrefsMailFolderDialog::cb_ok(Widget, XtPointer closure, XtPointer)
{
XFE_PrefsMailFolderDialog *theDialog =
(XFE_PrefsMailFolderDialog *)closure;
theDialog->hide();
theDialog->m_retVal=theDialog->getFolder();
theDialog->m_doneWithLoop=True;
}
void XFE_PrefsMailFolderDialog::cb_cancel(Widget, XtPointer closure, XtPointer)
{
XFE_PrefsMailFolderDialog *theDialog =
(XFE_PrefsMailFolderDialog *)closure;
theDialog->hide();
theDialog->m_doneWithLoop=True;
}
void XFE_PrefsMailFolderDialog::cb_newFolder(Widget, XtPointer closure, XtPointer)
{
XFE_PrefsMailFolderDialog *theDialog =
(XFE_PrefsMailFolderDialog *)closure;
theDialog->newFolder();
}
void XFE_PrefsMailFolderDialog::newFolder() {
XFE_FolderPromptDialog *fpd =
new XFE_FolderPromptDialog(this->getBaseWidget(),
"newFolderDialog",
NULL,
this);
MSG_FolderInfo *folder=m_folderDropdown->getSelectedFolder();
MSG_FolderInfo *newFolder = fpd->prompt(folder);
if (newFolder) {
m_folderDropdown->resyncDropdown();
setFolder(newFolder);
}
delete fpd;
}
MWContext *XFE_PrefsMailFolderDialog::getContext()
{
return m_context;
}
void XFE_PrefsMailFolderDialog::initPage()
{
Widget kids[10];
int i=0;
Arg av[10];
Cardinal ac;
XP_ASSERT(m_chrome);
ac=0;
Widget form = XmCreateForm(m_chrome, "form", av, ac);
m_instruct_label =
kids[i++] = XmCreateLabelGadget(form, "instructions",av,ac);
XtVaSetValues(m_instruct_label,
XmNtopAttachment, XmATTACH_FORM,
XmNleftAttachment, XmATTACH_FORM,
XmNrightAttachment, XmATTACH_NONE,
XmNbottomAttachment, XmATTACH_NONE,
NULL);
ac=0;
kids[i++] = m_server_toggle =
XmCreateToggleButtonGadget(form, "folderOnServer", av, ac);
kids[i++] = m_folder_toggle =
XmCreateToggleButtonGadget(form, "specificFolder", av, ac);
m_serverDropdown =
new XFE_FolderDropdown(this,form, // only show servers
TRUE, FALSE, FALSE, FALSE);
Widget server_dropdown =
kids[i++] = m_serverDropdown->getBaseWidget();
m_folderDropdown =
new XFE_FolderDropdown(this,form, // only select folders
FALSE, FALSE, FALSE);
Widget folder_dropdown =
kids[i++] = m_folderDropdown->getBaseWidget();
kids[i++] = m_new_folder_button =
XmCreatePushButtonGadget(form, "newFolder", av, ac);
int max_height1=XfeVaGetTallestWidget(m_server_toggle,
server_dropdown,
NULL);
int max_height2=XfeVaGetTallestWidget(m_folder_toggle,
folder_dropdown,
m_new_folder_button,
NULL);
XtVaSetValues(m_server_toggle,
XmNheight, max_height1,
XmNtopAttachment, XmATTACH_WIDGET,
XmNtopWidget, m_instruct_label,
XmNleftAttachment, XmATTACH_FORM,
XmNrightAttachment, XmATTACH_NONE,
XmNbottomAttachment, XmATTACH_NONE,
XmNindicatorType, XmONE_OF_MANY,
NULL);
m_serverDropdown->setPopupServer(FALSE);
XtVaSetValues(server_dropdown,
XmNheight, max_height1,
XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET,
XmNtopWidget, m_server_toggle,
XmNleftAttachment, XmATTACH_WIDGET,
XmNleftWidget, m_server_toggle,
XmNrightAttachment, XmATTACH_FORM,
XmNbottomAttachment, XmATTACH_NONE,
NULL);
XtVaSetValues(m_folder_toggle,
XmNheight, max_height2,
XmNtopAttachment, XmATTACH_WIDGET,
XmNtopWidget, m_server_toggle,
XmNleftAttachment, XmATTACH_FORM,
XmNrightAttachment, XmATTACH_NONE,
XmNbottomAttachment, XmATTACH_NONE,
XmNindicatorType, XmONE_OF_MANY,
NULL);
m_folderDropdown->setPopupServer(FALSE);
XtVaSetValues(folder_dropdown,
XmNheight, max_height2,
XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET,
XmNtopWidget, m_folder_toggle,
XmNleftAttachment, XmATTACH_WIDGET,
XmNleftWidget, m_folder_toggle,
XmNrightWidget, XmATTACH_NONE,
XmNbottomWidget, XmATTACH_NONE,
NULL);
XtVaSetValues(m_new_folder_button,
XmNheight, max_height2,
XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET,
XmNtopWidget, m_folder_toggle,
XmNleftAttachment, XmATTACH_WIDGET,
XmNleftWidget, folder_dropdown,
XmNrightWidget, XmATTACH_FORM,
XmNbottomWidget, XmATTACH_NONE,
NULL);
XtManageChild(form);
XtManageChild(m_instruct_label);
XtManageChildren(kids, i);
// callbacks
XtAddCallback(m_chrome, XmNokCallback, cb_ok, this);
XtAddCallback(m_chrome, XmNcancelCallback, cb_cancel, this);
XtAddCallback(m_new_folder_button, XmNactivateCallback, cb_newFolder,this);
XtAddCallback(m_folder_toggle,XmNvalueChangedCallback,cb_folderClick,this);
XtAddCallback(m_server_toggle,XmNvalueChangedCallback,cb_serverClick,this);
}
MSG_FolderInfo *XFE_PrefsMailFolderDialog::getFolder()
{
if (XmToggleButtonGetState(m_folder_toggle)) {
return m_folderDropdown->getSelectedFolder();
}
// we have to get the new MSG_FolderInfo * for the
// l10n'd folder name
if (XmToggleButtonGetState(m_server_toggle)) {
MSG_FolderInfo *server=m_serverDropdown->getSelectedFolder();
// get the URL for the server
URL_Struct *folderUrl=MSG_ConstructUrlForFolder(NULL, server);
int urllen=XP_STRLEN(folderUrl->address) + 1 +
XP_STRLEN(m_l10n_name);
char *url = new char[urllen];
// construct the new URL
XP_STRCPY(url, folderUrl->address);
XP_STRCAT(url, "/");
XP_STRCAT(url, m_l10n_name);
// get the MSG_FolderInfo for the folder
MSG_FolderInfo *folder=
(MSG_FolderInfo *)m_master->FindMailFolder(url, TRUE);
XP_FREE(url);
NET_FreeURLStruct(folderUrl);
return folder;
}
return NULL;
}
void XFE_PrefsMailFolderDialog::setFolder(MSG_FolderInfo *folder, int l10n_name)
{
MSG_FolderLine folderLine;
m_retVal=folder;
MSG_FolderInfo *server=GetHostFolderInfo(folder);
if (!server) server=MSG_GetLocalMailTree(m_master);
MSG_GetFolderLineById(m_master,folder,&folderLine);
if (l10n_name) {
if (m_l10n_name) XP_FREE(m_l10n_name);
m_l10n_name = XP_STRDUP(XP_GetString(l10n_name));
}
if (!m_l10n_name) m_l10n_name = XP_STRDUP(XP_GetString(MK_MSG_SENT_L10N_NAME));
// set instructions
char *char_format = XP_GetString(XFE_CHOOSE_FOLDER_INSTRUCT);
char *char_string = PR_smprintf(char_format, m_l10n_name);
XmString xmstr = XmStringCreateLocalized(char_string);
XtVaSetValues(m_instruct_label,
XmNlabelString, xmstr,
NULL);
XmStringFree(xmstr);
XP_FREE(char_string);
char_format = XP_GetString(XFE_FOLDER_ON_FORMAT);
char_string = PR_smprintf(char_format, m_l10n_name, "");
xmstr = XmStringCreateLocalized(char_string);
XtVaSetValues(m_server_toggle,
XmNlabelString, xmstr,
NULL);
XmStringFree(xmstr);
XP_FREE(char_string);
m_serverDropdown->selectFolder(server);
m_folderDropdown->selectFolder(folder);
if (folder && !XP_STRCMP(m_l10n_name, folderLine.name)) {
XmToggleButtonSetState(m_server_toggle, True, True);
// because the first time niether is set, and thus
// the callback to un-set m_folder_toggle isn't called
m_folderDropdown->setSensitive(False);
} else {
XmToggleButtonSetState(m_folder_toggle, True, True);
// because the first time niether is set, and thus
// the callback to un-set m_server_toggle isn't called
m_serverDropdown->setSensitive(False);
}
}
void XFE_PrefsMailFolderDialog::cb_folderClick(Widget,
XtPointer closure,
XtPointer callData)
{
XFE_PrefsMailFolderDialog *theDialog=(XFE_PrefsMailFolderDialog *)closure;
XmToggleButtonCallbackStruct *cbs =
(XmToggleButtonCallbackStruct *)callData;
theDialog->folderToggle(cbs);
}
void XFE_PrefsMailFolderDialog::cb_serverClick(Widget,
XtPointer closure,
XtPointer callData)
{
XFE_PrefsMailFolderDialog *theDialog=(XFE_PrefsMailFolderDialog *)closure;
XmToggleButtonCallbackStruct *cbs =
(XmToggleButtonCallbackStruct *)callData;
theDialog->serverToggle(cbs);
}
hide();
void XFE_PrefsMailFolderDialog::folderToggle(XmToggleButtonCallbackStruct *cbs)
{
XP_ASSERT(cbs);
m_folderDropdown->setSensitive(cbs->set);
if (cbs->set)
XmToggleButtonSetState(m_server_toggle, False, True);
}
void XFE_PrefsMailFolderDialog::serverToggle(XmToggleButtonCallbackStruct *cbs)
{
XP_ASSERT(cbs);
m_serverDropdown->setSensitive(cbs->set);
if (cbs->set)
XmToggleButtonSetState(m_folder_toggle, False, True);
}
MSG_FolderInfo *XFE_PrefsMailFolderDialog::prompt()
{
m_doneWithLoop=False;
show();
while (!m_doneWithLoop)
fe_EventLoop();
hide();
return m_retVal;
}