400 lines
12 KiB
C++
400 lines
12 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.
|
|
*/
|
|
/*
|
|
ComposeAttachDialog.cpp -- compose attachment dialogs
|
|
Created: Alastair Gourlay(SGI) c/o Dora Hsu<dora@netscape.com>, 26 Nov 1996
|
|
*/
|
|
|
|
|
|
|
|
// Classes in this file:
|
|
// XFE_ComposeAttachLocationDialog
|
|
// XFE_ComposeAttachFileDialog
|
|
//
|
|
|
|
#include "ComposeAttachDialog.h"
|
|
#include "DesktopTypes.h"
|
|
#include <stdlib.h>
|
|
#include <Xm/XmAll.h>
|
|
#include "xfe.h"
|
|
#include "felocale.h"
|
|
|
|
#ifdef DEBUG_sgidev
|
|
#define XDEBUG(x) x
|
|
#else
|
|
#define XDEBUG(x)
|
|
#endif
|
|
|
|
//
|
|
// XFE_ComposeAttachLocationDialog
|
|
//
|
|
|
|
// callback stubs
|
|
|
|
void XFE_ComposeAttachLocationDialog::OkCb(Widget,XtPointer cd,XtPointer) {
|
|
XFE_ComposeAttachLocationDialog *ad=(XFE_ComposeAttachLocationDialog*)cd;
|
|
if (ad)
|
|
ad->okCb();
|
|
}
|
|
|
|
void XFE_ComposeAttachLocationDialog::ClearCb(Widget,XtPointer cd,XtPointer) {
|
|
XFE_ComposeAttachLocationDialog *ad=(XFE_ComposeAttachLocationDialog*)cd;
|
|
if (ad)
|
|
ad->clearCb();
|
|
}
|
|
|
|
void XFE_ComposeAttachLocationDialog::CancelCb(Widget,XtPointer cd,XtPointer) {
|
|
XFE_ComposeAttachLocationDialog *ad=(XFE_ComposeAttachLocationDialog*)cd;
|
|
if (ad)
|
|
ad->cancelCb();
|
|
}
|
|
|
|
// constructor
|
|
|
|
XFE_ComposeAttachLocationDialog::XFE_ComposeAttachLocationDialog(XFE_ComposeAttachFolderView *folder)
|
|
: XFE_Component()
|
|
{
|
|
_attachFolder=folder;
|
|
|
|
_parent=NULL;
|
|
_dialog=NULL;
|
|
_locationText=NULL;
|
|
}
|
|
|
|
XFE_ComposeAttachLocationDialog::~XFE_ComposeAttachLocationDialog()
|
|
{
|
|
}
|
|
|
|
void XFE_ComposeAttachLocationDialog::createWidgets(Widget parent)
|
|
{
|
|
_parent=parent;
|
|
|
|
Arg args[20];
|
|
int n;
|
|
|
|
Visual *v = 0;
|
|
Colormap cmap = 0;
|
|
Cardinal depth = 0;
|
|
|
|
Widget shell=parent;
|
|
while (!XtIsShell(shell)) shell=XtParent(shell);
|
|
XtVaGetValues(shell,XtNvisual,&v,XtNcolormap,&cmap,XtNdepth,&depth,NULL);
|
|
|
|
n=0;
|
|
XtSetArg (args[n], XmNvisual, v); n++;
|
|
XtSetArg (args[n], XmNdepth, depth); n++;
|
|
XtSetArg (args[n], XmNcolormap, cmap); n++;
|
|
XtSetArg (args[n], XmNautoUnmanage, False); n++;
|
|
XtSetArg (args[n], XmNdeleteResponse, XmUNMAP); n++;
|
|
XtSetArg (args[n], XmNdialogStyle, XmDIALOG_MODELESS); n++;
|
|
_dialog = XmCreateMessageDialog (_parent, "location_popup", args, n);
|
|
fe_UnmanageChild_safe(XmMessageBoxGetChild(_dialog,XmDIALOG_MESSAGE_LABEL));
|
|
fe_UnmanageChild_safe(XmMessageBoxGetChild(_dialog,XmDIALOG_SYMBOL_LABEL));
|
|
fe_UnmanageChild_safe(XmMessageBoxGetChild(_dialog,XmDIALOG_HELP_BUTTON));
|
|
XtAddCallback(_dialog,XmNunmapCallback,CancelCb,(XtPointer)this);
|
|
XtAddCallback(_dialog,XmNokCallback,OkCb,(XtPointer)this);
|
|
XtAddCallback(_dialog,XmNcancelCallback,CancelCb,(XtPointer)this);
|
|
|
|
Widget clearButton=XmCreatePushButtonGadget (_dialog,"clear",NULL,0);
|
|
XtAddCallback(clearButton,XmNactivateCallback,ClearCb,(XtPointer)this);
|
|
XtManageChild(clearButton);
|
|
|
|
Widget form=XmCreateForm(_dialog,"form",NULL,0);
|
|
|
|
Widget label=XmCreateLabelGadget(form,"label",NULL,0);
|
|
XtVaSetValues(label,
|
|
XmNtopAttachment, XmATTACH_FORM,
|
|
XmNbottomAttachment, XmATTACH_NONE,
|
|
XmNleftAttachment, XmATTACH_FORM,
|
|
XmNrightAttachment, XmATTACH_FORM,
|
|
NULL);
|
|
XtManageChild(label);
|
|
|
|
Widget locationLabel=XmCreateLabelGadget(form,"locationLabel",NULL,0);
|
|
XtVaSetValues(locationLabel,
|
|
XmNtopAttachment, XmATTACH_WIDGET,
|
|
XmNtopWidget, label,
|
|
XmNbottomAttachment, XmATTACH_NONE,
|
|
XmNleftAttachment, XmATTACH_FORM,
|
|
XmNrightAttachment, XmATTACH_NONE,
|
|
NULL);
|
|
XtManageChild(locationLabel);
|
|
|
|
_locationText=fe_CreateTextField(form,"locationText",NULL,0);
|
|
XtVaSetValues(_locationText,
|
|
XmNtopAttachment, XmATTACH_WIDGET,
|
|
XmNtopWidget, label,
|
|
XmNbottomAttachment, XmATTACH_NONE,
|
|
XmNleftAttachment, XmATTACH_WIDGET,
|
|
XmNleftWidget, locationLabel,
|
|
XmNrightAttachment, XmATTACH_FORM,
|
|
NULL);
|
|
if (fe_globalData.nonterminal_text_translations)
|
|
XtOverrideTranslations (_locationText, fe_globalData.nonterminal_text_translations);
|
|
XtAddCallback(_locationText,XmNactivateCallback,OkCb,(XtPointer)this);
|
|
XtManageChild(_locationText);
|
|
|
|
Dimension height;
|
|
XtVaGetValues(_locationText,XmNheight,&height,NULL);
|
|
XtVaSetValues(locationLabel,XmNheight,height,NULL);
|
|
|
|
XtManageChild(form);
|
|
|
|
fe_HackDialogTranslations(form);
|
|
|
|
XtVaSetValues(_dialog,XmNinitialFocus,form,NULL);
|
|
|
|
setBaseWidget(_dialog);
|
|
}
|
|
|
|
void XFE_ComposeAttachLocationDialog::show()
|
|
{
|
|
XFE_Component::show();
|
|
if (_dialog)
|
|
XMapRaised(XtDisplay(_dialog),XtWindow(XtParent(_dialog)));
|
|
}
|
|
|
|
//
|
|
// callback methods
|
|
//
|
|
|
|
void XFE_ComposeAttachLocationDialog::okCb()
|
|
{
|
|
char *url=fe_GetTextField(_locationText);
|
|
|
|
if (!url || strlen(url)==0) {
|
|
XtFree(url);
|
|
return;
|
|
}
|
|
|
|
// check for Netscape desktop file
|
|
char *desktopUrl=NULL;
|
|
char *attachUrl=url;
|
|
XFE_DesktopTypeTranslate(url,&desktopUrl,FALSE);
|
|
if (desktopUrl && strlen(desktopUrl)>0)
|
|
attachUrl=desktopUrl;
|
|
|
|
// validate final url and attach
|
|
if (XFE_ComposeAttachFolderView::validateAttachment(_dialog,attachUrl)) {
|
|
_attachFolder->addAttachment(attachUrl);
|
|
_attachFolder->scrollToItem(_attachFolder->numAttachments()-1);
|
|
hide();
|
|
}
|
|
|
|
if (desktopUrl)
|
|
XP_FREE(desktopUrl);
|
|
|
|
if (url)
|
|
XtFree(url);
|
|
}
|
|
|
|
void XFE_ComposeAttachLocationDialog::clearCb()
|
|
{
|
|
fe_SetTextFieldAndCallBack(_locationText,"");
|
|
XmProcessTraversal(_locationText,XmTRAVERSE_CURRENT);
|
|
}
|
|
|
|
void XFE_ComposeAttachLocationDialog::cancelCb()
|
|
{
|
|
hide();
|
|
}
|
|
|
|
|
|
|
|
|
|
//
|
|
// XFE_ComposeAttachFileDialog
|
|
//
|
|
|
|
// callback stubs
|
|
|
|
void XFE_ComposeAttachFileDialog::OkCb(Widget,XtPointer cd,XtPointer cb) {
|
|
XFE_ComposeAttachFileDialog *ad=(XFE_ComposeAttachFileDialog*)cd;
|
|
if (ad) {
|
|
char *filename=NULL;
|
|
XmFileSelectionBoxCallbackStruct *fcb=(XmFileSelectionBoxCallbackStruct*)cb;
|
|
if (fcb && fcb->value)
|
|
XmStringGetLtoR(fcb->value,XmSTRING_DEFAULT_CHARSET,&filename);
|
|
|
|
ad->okCb(filename);
|
|
|
|
if (filename)
|
|
XtFree(filename);
|
|
}
|
|
}
|
|
|
|
void XFE_ComposeAttachFileDialog::CancelCb(Widget,XtPointer cd,XtPointer) {
|
|
XFE_ComposeAttachFileDialog *ad=(XFE_ComposeAttachFileDialog*)cd;
|
|
if (ad)
|
|
ad->cancelCb();
|
|
}
|
|
|
|
void XFE_ComposeAttachFileDialog::SetFileAttachBinaryCb(Widget widget,XtPointer cd,XtPointer) {
|
|
XFE_ComposeAttachFileDialog *ad=(XFE_ComposeAttachFileDialog*)cd;
|
|
#ifdef DEBUG
|
|
printf("XFE_ComposeAttachFileDialog::SetFileAttachBinaryCb\n");
|
|
#endif
|
|
if (ad)
|
|
ad->setFileAttachBinaryCb(widget);
|
|
}
|
|
|
|
|
|
// constructor
|
|
|
|
XFE_ComposeAttachFileDialog::XFE_ComposeAttachFileDialog(XFE_ComposeAttachFolderView *folder)
|
|
: XFE_Component()
|
|
{
|
|
_attachFolder=folder;
|
|
|
|
_parent=NULL;
|
|
_dialog=NULL;
|
|
_attachEncodingMenu=NULL;
|
|
_attachBinaryButton=NULL;
|
|
}
|
|
|
|
XFE_ComposeAttachFileDialog::~XFE_ComposeAttachFileDialog()
|
|
{
|
|
}
|
|
|
|
void XFE_ComposeAttachFileDialog::createWidgets(Widget parent)
|
|
{
|
|
_parent=parent;
|
|
_dialog=_parent;
|
|
|
|
Arg args[20];
|
|
int n;
|
|
|
|
Visual *v = 0;
|
|
Colormap cmap = 0;
|
|
Cardinal depth = 0;
|
|
|
|
Widget shell=parent;
|
|
while (!XtIsShell(shell)) shell=XtParent(shell);
|
|
XtVaGetValues(shell,XtNvisual,&v,XtNcolormap,&cmap,XtNdepth,&depth,NULL);
|
|
|
|
n=0;
|
|
XtSetArg (args[n], XmNvisual, v); n++;
|
|
XtSetArg (args[n], XmNdepth, depth); n++;
|
|
XtSetArg (args[n], XmNcolormap, cmap); n++;
|
|
XtSetArg(args[n],XmNdeleteResponse,XmUNMAP);n++;
|
|
XtSetArg(args[n],XmNdialogStyle,XmDIALOG_MODELESS);n++;
|
|
XtSetArg(args[n],XmNfileTypeMask,XmFILE_REGULAR);n++;
|
|
_dialog=fe_CreateFileSelectionDialog(_parent,"fileBrowser",args,n);
|
|
#ifdef NO_HELP
|
|
fe_UnmanageChild_safe(XmSelectionBoxGetChild(_dialog,XmDIALOG_HELP_BUTTON));
|
|
#endif
|
|
|
|
XtAddCallback(_dialog,XmNokCallback,OkCb,(XtPointer)this);
|
|
XtAddCallback(_dialog,XmNcancelCallback,CancelCb,(XtPointer)this);
|
|
XtAddCallback(_dialog,XmNunmapCallback,CancelCb,(XtPointer)this);
|
|
|
|
// create selector for attachment transfer encoding
|
|
n=0;
|
|
XtSetArg(args[n],XmNshadowType,XmSHADOW_ETCHED_IN);n++;
|
|
Widget optionFrame=XmCreateFrame(_dialog,"encodingFrame",args,n);
|
|
|
|
n=0;
|
|
XtSetArg(args[n],XmNvisual,v);n++;
|
|
XtSetArg(args[n],XmNdepth,depth);n++;
|
|
XtSetArg(args[n],XmNcolormap,cmap);n++;
|
|
Widget optionPopup=XmCreatePulldownMenu(optionFrame,"optionPopup",args,n);
|
|
|
|
Widget attachAutoDetectButton=XmCreatePushButtonGadget(optionPopup,"attachAutoDetect",NULL,0);
|
|
XtAddCallback(attachAutoDetectButton, XmNactivateCallback, SetFileAttachBinaryCb, (XtPointer)this);
|
|
XtManageChild(attachAutoDetectButton);
|
|
_attachBinaryButton=XmCreatePushButtonGadget(optionPopup,"attachBinary",NULL,0);
|
|
XtAddCallback(_attachBinaryButton, XmNactivateCallback, SetFileAttachBinaryCb, (XtPointer)this);
|
|
XtManageChild(_attachBinaryButton);
|
|
|
|
n=0;
|
|
XtSetArg(args[n],XmNsubMenuId,optionPopup);n++;
|
|
if (fe_globalPrefs.file_attach_binary) {
|
|
XtSetArg(args[n],XmNmenuHistory,_attachBinaryButton);n++;
|
|
}
|
|
else {
|
|
XtSetArg(args[n],XmNmenuHistory,attachAutoDetectButton);n++;
|
|
}
|
|
_attachEncodingMenu=XmCreateOptionMenu(optionFrame,"optionMenu",args,n);
|
|
XtManageChild(_attachEncodingMenu);
|
|
|
|
XtManageChild(optionFrame);
|
|
|
|
fe_HackDialogTranslations(_dialog);
|
|
fe_NukeBackingStore(_dialog);
|
|
|
|
setBaseWidget(_dialog);
|
|
}
|
|
|
|
void XFE_ComposeAttachFileDialog::show()
|
|
{
|
|
XFE_Component::show();
|
|
if (_dialog)
|
|
XMapRaised(XtDisplay(_dialog),XtWindow(XtParent(_dialog)));
|
|
}
|
|
|
|
//
|
|
// callback methods
|
|
//
|
|
|
|
void XFE_ComposeAttachFileDialog::okCb(const char *filename)
|
|
{
|
|
if (!filename || strlen(filename)==0)
|
|
return;
|
|
|
|
// check for Netscape desktop file
|
|
char *desktopUrl=NULL;
|
|
const char *attachUrl=filename;
|
|
XFE_DesktopTypeTranslate(filename,&desktopUrl,FALSE);
|
|
if (desktopUrl && strlen(desktopUrl)>0)
|
|
attachUrl=desktopUrl;
|
|
|
|
// validate final url and attach
|
|
if (XFE_ComposeAttachFolderView::validateAttachment(_dialog,attachUrl)) {
|
|
// check whether user selected binary as the tranfer encoding
|
|
Boolean attach_binary=FALSE;
|
|
if (_attachEncodingMenu && _attachBinaryButton) {
|
|
Widget attachEncodingWidget=NULL;
|
|
XtVaGetValues(_attachEncodingMenu,XmNmenuHistory,&attachEncodingWidget,NULL);
|
|
attach_binary=(attachEncodingWidget==_attachBinaryButton)? TRUE:FALSE;
|
|
}
|
|
_attachFolder->addAttachment(attachUrl,FALSE,attach_binary);
|
|
_attachFolder->scrollToItem(_attachFolder->numAttachments()-1);
|
|
hide();
|
|
}
|
|
|
|
if (desktopUrl)
|
|
XP_FREE(desktopUrl);
|
|
}
|
|
|
|
void XFE_ComposeAttachFileDialog::cancelCb()
|
|
{
|
|
hide();
|
|
}
|
|
|
|
void XFE_ComposeAttachFileDialog::setFileAttachBinaryCb(XtPointer widget)
|
|
{
|
|
XP_Bool attach_binary;
|
|
|
|
if ((Widget)widget == _attachBinaryButton)
|
|
attach_binary = True;
|
|
else
|
|
attach_binary = False;
|
|
fe_globalPrefs.file_attach_binary = attach_binary;
|
|
}
|
|
|