/* -*- 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, 26 Nov 1996 */ // Classes in this file: // XFE_ComposeAttachLocationDialog // XFE_ComposeAttachFileDialog // #include "ComposeAttachDialog.h" #include "DesktopTypes.h" #include #include #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; }