📄 readwinp.c
字号:
/* * $Id: ReadWinP.C,v 1.5 2000/08/07 11:05:17 evgeny Exp $ * * Copyright (c) 1994 HAL Computer Systems International, Ltd. * * HAL COMPUTER SYSTEMS INTERNATIONAL, LTD. * 1315 Dell Avenue * Campbell, CA 95008 * * Author: Greg Hilton * Contributors: Tom Lang, Frank Bieser, and others * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * http://www.gnu.org/copyleft/gpl.html * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */#include <config.h>#include "ReadWinP.h"#include "ReadWinC.h"#include "QuickMenu.h"#include "IshAppC.h"#include "AppPrefC.h"#include "FolderPrefC.h"#include "ReadPrefC.h"#include "ReplyPrefC.h"#include "SaveMgrC.h"#include "HeaderC.h"#include "HeaderValC.h"#include "HeadPrefC.h"#include "MsgC.h"#include "MainWinC.h"#include "FolderC.h"#include "ButtonMgrC.h"#include "MsgPartC.h"#include "ReadIconC.h"#include "Mailcap.h"#include "ParamC.h"#include "LocalTextWinC.h"#include "PipeWinC.h"#include "PrintWinC.h"#include "LoginWinC.h"#include "MsgItemC.h"#include "FileChooserWinC.h"#include "SortMgrC.h"#include "SendWinC.h"#include "reading.xpm"#include <hgl/WArgList.h>#include <hgl/rsrc.h>#include <hgl/WXmString.h>#include <hgl/MimeRichTextC.h>#include <hgl/CharC.h>#include <hgl/PixmapC.h>#include <hgl/VBoxC.h>#include <Xm/CascadeB.h>#include <Xm/PushB.h>#include <Xm/RowColumn.h>#include <Xm/Separator.h>#include <Xm/ToggleB.h>#include <Xm/Form.h>#include <Xm/Label.h>#include <Xm/PanedW.h>#include <Xm/AtomMgr.h>#include <signal.h> // For kill#define CreatePB XmCreatePushButtonPtrListC *ReadWinP::displayPixmaps = NULL;PtrListC *ReadWinP::fetchDataList = NULL;PtrListC *ReadWinP::fetchPixmaps = NULL;/*--------------------------------------------------------------- * Constructor */ReadWinP::ReadWinP(ReadWinC *rw){ pub = rw; msgHeadText = NULL; msgBodyText = NULL; readIcon = NULL; viewType = ishApp->readPrefs->viewType; recentMenuTime = 0; pipeWin = NULL; printWin = NULL; loginWin = NULL; savePartWin = NULL; editWin = NULL; if ( !displayPixmaps ) { displayPixmaps = new PtrListC; fetchDataList = new PtrListC; fetchPixmaps = new PtrListC; }}/*--------------------------------------------------------------- * Destructor */ReadWinP::~ReadWinP(){//// Kill any display processes still running// u_int count = displayDataList.size(); int i; for (i=0; i<count; i++) { DisplayDataT *data = (DisplayDataT*)*displayDataList[i]; if ( kill(-data->pid, 0) == 0 ) kill(-data->pid, SIGKILL); }//// Delete local text windows// count = textWinList.size(); for (i=0; i<count; i++) { LocalTextWinC *tw = (LocalTextWinC*)*textWinList[i]; delete tw; }//// Delete local message windows// count = msgWinList.size(); for (i=0; i<count; i++) { ReadWinC *rw = (ReadWinC*)*msgWinList[i]; delete rw; } delete pipeWin; delete printWin; delete loginWin; delete savePartWin; delete editWin; delete msgHeadText; delete msgBodyText; delete readIcon; if ( ishApp->exiting ) {//// Kill any retrieval processes still running// count = fetchDataList->size(); for (i=count-1; i>=0; i--) { FetchDataT *data = (FetchDataT*)*(*fetchDataList)[i]; if ( kill(-data->pid, 0) == 0 ) kill(-data->pid, SIGKILL); } count = displayPixmaps->size(); for (i=0; i<count; i++) { PixmapC *pm = (PixmapC*)*(*displayPixmaps)[i]; delete pm; } count = fetchPixmaps->size(); for (i=0; i<count; i++) { PixmapC *pm = (PixmapC*)*(*fetchPixmaps)[i]; delete pm; } } // End if exiting} // End destructor/*--------------------------------------------------------------- * Method to build menu hierarchy */voidReadWinP::BuildMenus(){ pub->AddMenuBar(); BuildFileMenu(); BuildReplyMenu(); BuildOptMenu(); if ( pub->fullFunction ) pub->AddHelpMenu();}/*--------------------------------------------------------------- * Method to build file menu hierarchy */voidReadWinP::BuildFileMenu(){ Cardinal wcount; Widget wlist[16]; WArgList args;//// Create filePD hierarchy//// filePD// CascadeButton fileNextCB// PulldownMenu fileNextPD// CascadeButton filePrevCB// PulldownMenu filePrevPD// CascadeButton fileSaveCB// PulldownMenu fileSavePD// PushButton filePrintPB// CascadeButton fileFilterCB// PulldownMenu fileFilterPD// Separator fileSep1// PushButton fileUndeletePB// PushButton fileDeletePB// PushButton fileDelClosePB// Separator fileSep2// PushButton fileClosePB// Widget fileNextCB; Widget filePrevCB; if ( pub->fullFunction ) { fileNextCB = XmCreateCascadeButton(pub->filePD, "fileNextCB", 0,0); filePrevCB = XmCreateCascadeButton(pub->filePD, "filePrevCB", 0,0); } else { fileNextPB = XmCreatePushButton(pub->filePD, "fileNextPB", 0,0); filePrevPB = XmCreatePushButton(pub->filePD, "filePrevPB", 0,0); } Widget fileSaveCB = XmCreateCascadeButton(pub->filePD, "fileSaveCB", 0,0); filePrintPB = XmCreatePushButton (pub->filePD, "filePrintPB", 0,0); Widget fileFilterCB = XmCreateCascadeButton(pub->filePD, "fileFilterCB",0,0); Widget fileSep1 = XmCreateSeparator (pub->filePD, "fileSep1", 0,0); Widget fileSep2; if ( pub->fullFunction ) { fileUndeletePB = XmCreatePushButton(pub->filePD, "fileUndeletePB", 0,0); fileDeletePB = XmCreatePushButton(pub->filePD, "fileDeletePB", 0,0); fileDelClosePB = XmCreatePushButton(pub->filePD, "fileDelClosePB", 0,0); fileSep2 = XmCreateSeparator (pub->filePD, "fileSep2", 0,0); } Widget fileClosePB = XmCreatePushButton(pub->filePD, "fileClosePB", 0,0); wcount = 0; wlist[wcount++] = fileSaveCB; wlist[wcount++] = filePrintPB; wlist[wcount++] = fileFilterCB; wlist[wcount++] = fileSep1; if ( pub->fullFunction ) { wlist[wcount++] = fileNextCB; wlist[wcount++] = filePrevCB; wlist[wcount++] = fileUndeletePB; wlist[wcount++] = fileDeletePB; wlist[wcount++] = fileDelClosePB; wlist[wcount++] = fileSep2; } else { wlist[wcount++] = fileNextPB; wlist[wcount++] = filePrevPB; } wlist[wcount++] = fileClosePB; XtManageChildren(wlist, wcount);//// Create fileNextPD hierarchy//// fileNextPD// PushButton fileNextPB// PushButton fileNextUnreadPB// PushButton fileNextSenderPB// PushButton fileNextSubjectPB// if ( pub->fullFunction ) { Widget fileNextPD = XmCreatePulldownMenu (pub->filePD, "fileNextPD", 0,0); fileNextPB = CreatePB(fileNextPD, "fileNextPB", 0,0); fileNextUnreadPB = CreatePB(fileNextPD, "fileNextUnreadPB", 0,0); fileNextSenderPB = CreatePB(fileNextPD, "fileNextSenderPB", 0,0); fileNextSubjectPB = CreatePB(fileNextPD, "fileNextSubjectPB", 0,0); wcount = 0; wlist[wcount++] = fileNextPB; wlist[wcount++] = fileNextUnreadPB; wlist[wcount++] = fileNextSenderPB; wlist[wcount++] = fileNextSubjectPB; XtManageChildren(wlist, wcount); // fileNextPD children XtVaSetValues(fileNextCB, XmNsubMenuId, fileNextPD, NULL); }//// Create filePrevPD hierarchy//// filePrevPD// PushButton filePrevPB// PushButton filePrevUnreadPB// PushButton filePrevSenderPB// PushButton filePrevSubjectPB// if ( pub->fullFunction ) { Widget filePrevPD = XmCreatePulldownMenu (pub->filePD, "filePrevPD", 0,0); filePrevPB = CreatePB(filePrevPD, "filePrevPB", 0,0); filePrevUnreadPB = CreatePB(filePrevPD, "filePrevUnreadPB", 0,0); filePrevSenderPB = CreatePB(filePrevPD, "filePrevSenderPB", 0,0); filePrevSubjectPB = CreatePB(filePrevPD, "filePrevSubjectPB", 0,0); wlist[0] = filePrevPB; wlist[1] = filePrevUnreadPB; wlist[2] = filePrevSenderPB; wlist[3] = filePrevSubjectPB; XtManageChildren(wlist, 4); // filePrevPD children XtVaSetValues(filePrevCB, XmNsubMenuId, filePrevPD, NULL); }//// Create fileSavePD hierarchy//// fileSavePD// PushButton fileSavePB// CascadeButton fileSaveRecentCB// CascadeButton fileSaveQuickCB// PushButton fileSaveSelPB// PushButton fileSaveToPB// PushButton fileSaveToFilePB// Widget fileSavePD = XmCreatePulldownMenu(pub->filePD, "fileSavePD", 0,0); fileSavePB = XmCreatePushButton(fileSavePD, "fileSavePB", 0,0); fileSaveRecentCB = XmCreateCascadeButton(fileSavePD, "fileSaveRecentCB", 0,0); fileSaveRecentPD = XmCreatePulldownMenu(fileSavePD, "fileSaveRecentPD", 0,0); XtVaSetValues(fileSaveRecentCB, XmNsubMenuId, fileSaveRecentPD, NULL);//// Add a data structure and a pulldown menu for the quick function// QuickInfoT *cbData = new QuickInfoT; if ( (!ishApp->appPrefs->usingImap) || (!ishApp->folderPrefs->UsingLocal()) ) cbData->dir = ishApp->appPrefs->FolderDir(); else cbData->dir = ""; cbData->menu = XmCreatePulldownMenu(fileSavePD, "quickPD", 0,0); cbData->menuTime = 0; args.Reset(); args.UserData(cbData); args.SubMenuId(cbData->menu); fileSaveQuickCB = XmCreateCascadeButton(fileSavePD, "fileSaveQuickCB", ARGS); fileSaveSelPB = XmCreatePushButton(fileSavePD, "fileSaveSelPB", 0,0); fileSaveToPB = XmCreatePushButton(fileSavePD, "fileSaveToPB", 0,0); fileSaveToFilePB = XmCreatePushButton(fileSavePD, "fileSaveToFilePB", 0,0); wcount = 0; wlist[wcount++] = fileSavePB; wlist[wcount++] = fileSaveRecentCB; wlist[wcount++] = fileSaveQuickCB; wlist[wcount++] = fileSaveSelPB; wlist[wcount++] = fileSaveToPB; wlist[wcount++] = fileSaveToFilePB; XtManageChildren(wlist, wcount); // fileSavePD children XtVaSetValues(fileSaveCB, XmNsubMenuId, fileSavePD, NULL);//// Create fileFilterPD hierarchy//// fileFilterPD// PushButton fileMimePB// PushButton fileDecryptPB// PushButton fileAuthPB// PushButton fileEditPB// PushButton filePipePB// Widget fileFilterPD = XmCreatePulldownMenu(pub->filePD, "fileFilterPD", 0,0); if ( pub->fullFunction ) fileMimePB = XmCreatePushButton (fileFilterPD, "fileMimePB", 0,0); Widget fileDecryptPB = XmCreatePushButton(fileFilterPD, "fileDecryptPB",0,0); Widget fileAuthPB = XmCreatePushButton(fileFilterPD, "fileAuthPB", 0,0); Widget fileEditPB; if ( pub->fullFunction ) fileEditPB = XmCreatePushButton (fileFilterPD, "fileEditPB", 0,0); filePipePB = XmCreatePushButton(fileFilterPD, "filePipePB", 0,0); wcount = 0; wlist[wcount++] = fileDecryptPB; wlist[wcount++] = fileAuthPB; wlist[wcount++] = filePipePB; if ( pub->fullFunction ) { wlist[wcount++] = fileMimePB; wlist[wcount++] = fileEditPB; } XtManageChildren(wlist, wcount); XtVaSetValues(fileFilterCB, XmNsubMenuId, fileFilterPD, NULL);//// Set initial sensitivities// XtSetSensitive(fileSavePB, False); XtSetSensitive(fileSaveSelPB, False); XtSetSensitive(fileSaveToPB, False); XtSetSensitive(fileSaveToFilePB, False); XtSetSensitive(fileSaveRecentCB, False); XtSetSensitive(fileSaveQuickCB, False); XtSetSensitive(filePrintPB, False); XtSetSensitive(filePipePB, False); if ( pub->fullFunction ) { XtSetSensitive(fileMimePB, False); XtSetSensitive(fileUndeletePB, False); XtSetSensitive(fileDeletePB, False); XtSetSensitive(fileDelClosePB, False); }//// Add callbacks// //AddCascading(fileSaveRecentCB, PrepareRecentMenu, this); AddCascading(fileSaveQuickCB, PrepareQuickMenu, this); AddActivate(fileNextPB, DoNext, this); AddActivate(filePrevPB, DoPrev, this); if ( pub->fullFunction ) { AddActivate(fileNextUnreadPB, DoNextUnread, this); AddActivate(fileNextSenderPB, DoNextSender, this); AddActivate(fileNextSubjectPB, DoNextSubject, this); AddActivate(filePrevUnreadPB, DoPrevUnread, this); AddActivate(filePrevSenderPB, DoPrevSender, this); AddActivate(filePrevSubjectPB, DoPrevSubject, this); } AddActivate(fileSavePB, DoSave, this); AddActivate(fileSaveSelPB, DoSaveSel, this); AddActivate(fileSaveToPB, DoSaveTo, this); AddActivate(fileSaveToFilePB, DoSaveToFile, this); AddActivate(filePrintPB, DoPrint, this); AddActivate(filePipePB, DoPipe, this); AddActivate(fileDecryptPB, DoDecrypt, this); AddActivate(fileAuthPB, DoAuth, this); if ( pub->fullFunction ) { AddActivate(fileMimePB, DoSunToMime, this); AddActivate(fileEditPB, DoEdit, this); AddActivate(fileUndeletePB, DoUndelete, this); AddActivate(fileDeletePB, DoDelete, this); AddActivate(fileDelClosePB, DoDelClose, this); } AddActivate(fileClosePB, DoClose, this); pub->AddHideCallback((CallbackFn*)DoHide, NULL);} // End BuildFileMenu/*--------------------------------------------------------------- * Method to build reply menu hierarchy */voidReadWinP::BuildReplyMenu(){ Cardinal wcount; Widget wlist[10];//// Create cascade button and pulldown menu// replyCB = XmCreateCascadeButton(pub->menuBar, "replyCB", 0,0); Widget replyPD = XmCreatePulldownMenu (pub->menuBar, "replyPD", 0,0); XtVaSetValues(replyCB, XmNsubMenuId, replyPD, NULL); XtManageChild(replyCB); XtSetSensitive(replyCB, False);//// Create replyPD hierarchy//// replyPD// PushButton replyPB// PushButton replyIncPB// PushButton replyAllPB// PushButton replyAllIncPB// Separator replySep1// PushButton forwardPB// PushButton forward822PB// PushButton resendPB// Widget replyPB = XmCreatePushButton(replyPD, "replyPB", 0,0); Widget replyIncPB = XmCreatePushButton(replyPD, "replyIncPB", 0,0); Widget replyAllPB = XmCreatePushButton(replyPD, "replyAllPB", 0,0); Widget replyAllIncPB = XmCreatePushButton(replyPD, "replyAllIncPB", 0,0); Widget replySep1 = XmCreateSeparator (replyPD, "replySep1", 0,0); Widget forwardPB = XmCreatePushButton(replyPD, "forwardPB", 0,0);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -