Mozilla/mozilla/cmd/xfe/src/ComposeAttachDialog.cpp
ltabb 8ed5afe62c Free the lizard
git-svn-id: svn://10.0.0.236/trunk@10 18797224-902f-48f8-a5cc-f745e15eee43
1998-03-28 02:44:41 +00:00

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;
}