📄 savemgrc.c
字号:
return; } Boolean move = XtIsManaged(This->folderOpFrame) && XmToggleButtonGetState(This->folderMoveTB); if ( This->saveMsg ) This->SaveMsgToFolder(This->saveMsg, name, move); else This->SaveMsgsToFolder(*This->saveItemList, name, move);} // End FinishSaveFolder/*------------------------------------------------------------------------ * Method to save a single message to an unnamed file */voidSaveMgrC::SaveMsgToFile(MsgC* msg, Widget dialogParent, Boolean moveOk){ halApp->BusyCursor(True); if ( !saveFileWin ) BuildSaveFileWin(dialogParent);//// See if Move/Copy buttons are displayed// if ( moveOk ) { XtManageChild(fileOpFrame);//// Set move or copy depending on whether saved messages are automatically// deleted (save == move)// if ( ishApp->appPrefs->deleteSaved ) XmToggleButtonSetState(fileMoveTB, True, True); else XmToggleButtonSetState(fileCopyTB, True, True); } else { XtUnmanageChild(fileOpFrame); }//// Display dialog// saveMsg = msg; saveItemList->removeAll(); saveFileWin->Show(dialogParent); halApp->BusyCursor(False);} // End SaveMsgToFile/*------------------------------------------------------------------------ * Method to save several messages to an unnamed file */voidSaveMgrC::SaveMsgsToFile(VItemListC& msgList, Widget dialogParent, Boolean moveOk){ halApp->BusyCursor(True); if ( !saveFileWin ) BuildSaveFileWin(dialogParent);//// See if Move/Copy buttons are displayed// if ( moveOk ) { XtManageChild(fileOpFrame);//// Set move or copy depending on whether saved messages are automatically// deleted (save == move)// if ( ishApp->appPrefs->deleteSaved ) XmToggleButtonSetState(fileMoveTB, True, True); else XmToggleButtonSetState(fileCopyTB, True, True); } else { XtUnmanageChild(fileOpFrame); }//// Display dialog// saveMsg = NULL; *saveItemList = msgList; saveFileWin->Show(dialogParent); halApp->BusyCursor(False);} // End SaveMsgsToFile/*------------------------------------------------------------------------ * Method to build the save-to-file dialog */voidSaveMgrC::BuildSaveFileWin(Widget parent){ if ( saveFileWin ) return;//// Create dialog// saveFileWin = new FileChooserWinC(parent, "saveFileWin");//// Add pane for header saving query. Put it in the first position// WArgList args; args.PositionIndex(0); args.AllowResize(True); Widget headFrame = XmCreateFrame(saveFileWin->PanedWin(), "saveHdrFrame", ARGS); Widget headRadio = XmCreateRadioBox(headFrame, "saveHdrRadio", 0,0); headAllTB = XmCreateToggleButton(headRadio, "saveHdrAllTB", 0,0); headDispTB = XmCreateToggleButton(headRadio, "saveHdrDispTB", 0,0); headNoneTB = XmCreateToggleButton(headRadio, "saveHdrNoneTB", 0,0); XtManageChild(headAllTB); XtManageChild(headDispTB); XtManageChild(headNoneTB); XtManageChild(headRadio); // headFrame children XtManageChild(headFrame); // panedWin children saveFileWin->HandleHelp(headAllTB); saveFileWin->HandleHelp(headDispTB); saveFileWin->HandleHelp(headNoneTB); XmToggleButtonSetState(headNoneTB, True, True);//// Add pane for Move/Copy choices in the last position// Cardinal childCount; XtVaGetValues(saveFileWin->PanedWin(), XmNnumChildren, &childCount, NULL); args.Reset(); args.PositionIndex(childCount+1); args.ShadowThickness(0); args.AllowResize(True); fileOpFrame = XmCreateFrame(saveFileWin->PanedWin(), "opFrame", ARGS); args.Reset(); args.ChildType(XmFRAME_TITLE_CHILD); args.ChildHorizontalAlignment(XmALIGNMENT_CENTER); Widget radioFrame = XmCreateFrame(fileOpFrame, "radioFrame", ARGS); args.Reset(); args.Orientation(XmHORIZONTAL); args.Packing(XmPACK_TIGHT); Widget radio = XmCreateRadioBox(radioFrame, "opRadio", ARGS); fileMoveTB = XmCreateToggleButton(radio, "moveTB", 0,0); fileCopyTB = XmCreateToggleButton(radio, "copyTB", 0,0); XtManageChild(fileMoveTB); XtManageChild(fileCopyTB); XtManageChild(radio); // radioFrame children XtManageChild(radioFrame); // fileOpFrame children saveFileWin->HandleHelp(fileMoveTB); saveFileWin->HandleHelp(fileCopyTB); saveFileWin->SingleSelect(True); saveFileWin->AddVerifyCallback((CallbackFn*)VerifySaveFiles, this); saveFileWin->AddOkCallback ((CallbackFn*)FinishSaveFile, this); saveFileWin->HideList(); saveFileWin->SetDirectory("."); saveFileWin->SetDefaultDir("."); saveFileWin->ShowDirsInFileList(False); saveFileWin->ShowFilesInFileList(True);} // End BuildSaveFileWin/*--------------------------------------------------------------- * Callbacks to handle selection of file name for save */voidSaveMgrC::FinishSaveFile(StringListC *list, SaveMgrC *This){ StringC name = *((*list)[0]); if ( name.size() == 0 ) { StringC msg = "Please enter a file name."; set_invalid(This->saveFileWin->SelectTF(), True, True); halApp->PopupMessage(msg); This->saveFileWin->HideOk(False); return; }//// If the file already exists, see if they want it replaced or appended// if ( access(name, F_OK) == 0 ) {//// Make sure name is not a directory// if ( IsDir(name) ) { StringC errmsg(name); errmsg += " is a directory."; halApp->PopupMessage(errmsg); return; }//// See whether they want to replace or append// switch ( This->SaveToFileQuery(name) ) { case (QUERY_YES): // Means APPEND break; case (QUERY_NO): { // Means REPLACE int fd = open(name, O_WRONLY|O_TRUNC, 0); if ( fd > 0 ) close(fd); } break; case (QUERY_CANCEL): case (QUERY_NONE): default: return; } } // End if file already exists else if ( !MakeFile(name) ) return; Boolean move = XtIsManaged(This->fileOpFrame) && XmToggleButtonGetState(This->fileMoveTB); Boolean copyHead = !XmToggleButtonGetState(This->headNoneTB); Boolean allHead = XmToggleButtonGetState(This->headAllTB); if ( This->saveMsg ) This->SaveMsgToFile(This->saveMsg, name, move, copyHead, allHead); else This->SaveMsgsToFile(*This->saveItemList, name, move, copyHead, allHead);} // End FinishSaveFile/*--------------------------------------------------------------- * Callback routines to double check file list in file chooser */voidSaveMgrC::VerifySaveFolders(StringListC *list, SaveMgrC *This){ This->VerifySaveList(*list, This->saveFolderWin);}voidSaveMgrC::VerifySaveFiles(StringListC *list, SaveMgrC *This){ This->VerifySaveList(*list, This->saveFileWin);}voidSaveMgrC::VerifySaveList(StringListC& list, FileChooserWinC *win){ StringC dname = win->Directory(); if ( !win->UsingImap() ) { chdir(dname);//// Remove lock files and unwritable files// unsigned count = list.size(); for (int i=count-1; i>=0; i--) { StringC *name = list[i]; if ( name->EndsWith(".lock") || access(*name, W_OK) != 0 ) list.remove(i); } chdir(ishApp->startupDir); }//// Remove the current folder// if ( !dname.EndsWith("/") ) dname += "/"; int dlen = dname.size(); StringC name = ishApp->mainWin->curFolder->name;//// See if folder is in same directory as file chooser// if ( name.StartsWith(dname) ) { name.CutBeg(dname.size()); int index = list.indexOf(name); if ( index != list.NULL_INDEX ) list.remove(index); }} // End VerifySaveList/*------------------------------------------------------------------------ * Method to save a single message to a named file */voidSaveMgrC::SaveMsgToFile(MsgC* msg, const char *name, Boolean delAfter, Boolean copyHead, Boolean allHead){ ishApp->BusyCursor(True);//// Save the message// StringC msgStr("Message "); msgStr += msg->Number(); Boolean deleted = False; Boolean copied = msg->WriteFile(name, copyHead, allHead, /*statHead=*/False, /*addBlank*/False, /*protectFrom*/False); if ( copied ) { msg->SetSaved();//// Delete if requested// deleted = delAfter && ishApp->mainWin->DeleteMsg(msg);//// Display status// msgStr += " saved to "; msgStr += name; if ( deleted ) msgStr += " and deleted."; } // End if copied else { msgStr = " NOT saved."; } ishApp->Broadcast(msgStr); if ( msg->folder && msg->folder->active && msg->icon ) ishApp->mainWin->MsgVBox().Refresh(); ishApp->mainWin->UpdateTitle(); ishApp->BusyCursor(False);} // End SaveMsgToFile/*------------------------------------------------------------------------ * Method to save several messages to an open folder */voidSaveMgrC::SaveMsgsToFile(VItemListC& list, const char *name, Boolean delAfter, Boolean copyHead, Boolean allHead){ ishApp->BusyCursor(True);//// Save the messages// VItemListC saveList; unsigned count = list.size(); CharC nl("\n"); int i; for (i=0; i<count; i++) { MsgItemC *item = (MsgItemC*)list[i]; MsgC *msg = item->msg; Boolean copied = msg->WriteFile(name, copyHead, allHead, /*statHead=*/False, /*addBlank*/True, /*protectFrom*/False); if ( copied ) { msg->SetSaved(); saveList.add((VItemC*)item); } } // End for each message count = saveList.size();//// Delete saved messages if requested// Boolean deleted = (delAfter && count>0 && ishApp->mainWin->DeleteItems(saveList)); ishApp->mainWin->MsgVBox().Refresh();//// Build status message// StringC msgStr; if ( count > 0 ) { msgStr = "Message"; if ( count > 1 ) msgStr += 's'; msgStr += ' '; for (i=0; i<count; i++) { if ( i>0 ) msgStr += ", "; MsgItemC *item = (MsgItemC*)saveList[i]; msgStr += item->msg->Number(); } msgStr += " saved to "; msgStr += name; if ( deleted ) msgStr += " and deleted."; } else { msgStr = "NO messages saved"; } ishApp->Broadcast(msgStr); ishApp->mainWin->UpdateTitle(); ishApp->BusyCursor(False);} // End SaveMsgsToFile/*--------------------------------------------------------------- * Method to query for replace or append during save-to-file */QueryAnswerTSaveMgrC::SaveToFileQuery(const char *file){ static QueryAnswerT answer;//// Create the dialog if necessary// if ( !saveToFileQueryWin ) { halApp->BusyCursor(True); WArgList args; args.DialogStyle(XmDIALOG_FULL_APPLICATION_MODAL); if ( halApp->questionPM ) args.SymbolPixmap(halApp->questionPM); Widget w = XmCreateQuestionDialog(*halApp, "saveToFileQueryWin", ARGS); XtAddCallback(w, XmNokCallback, (XtCallbackProc)AnswerQuery, (XtPointer)&answer); XtAddCallback(w, XmNcancelCallback, (XtCallbackProc)AnswerQuery, (XtPointer)&answer); XtAddCallback(w, XmNhelpCallback, (XtCallbackProc)HalAppC::DoHelp, (char *) "helpcard"); Widget replacePB = XmCreatePushButton(w, "replacePB", 0,0); XtManageChild(replacePB); XtAddCallback(replacePB, XmNactivateCallback, (XtCallbackProc)AnswerQuery, (XtPointer)&answer);//// Trap window manager close function// XmAddWMProtocolCallback(XtParent(w), halApp->delWinAtom, (XtCallbackProc)WmClose, (caddr_t)&answer); saveToFileQueryWin = w; halApp->BusyCursor(False); } // End if save query dialog not created//// Add the file name to the message string// StringC msg = get_string(saveToFileQueryWin, "messageString", "$FILE exists."); msg.Replace("$FILE", file); WXmString wstr = (char *)msg; XtVaSetValues(saveToFileQueryWin, XmNmessageString, (XmString)wstr, NULL); XtManageChild(saveToFileQueryWin); XMapRaised(halApp->display, XtWindow(XtParent(saveToFileQueryWin)));//// Simulate the main event loop and wait for the answer// answer = QUERY_NONE; while ( answer == QUERY_NONE ) { XtAppProcessEvent(halApp->context, XtIMXEvent); XSync(halApp->display, False); } XtUnmanageChild(saveToFileQueryWin); XSync(halApp->display, False); XmUpdateDisplay(saveToFileQueryWin); return answer;} // End SaveToFileQuery
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -