📄 sortprefwinc.c
字号:
wlist[0] = thread.atb; wlist[1] = thread.dtb; XtManageChildren(wlist, 2); // threadRadio children XtManageChild(threadRadio); // threadSortFrame children wlist[0] = thread.tb; wlist[1] = threadSortFrame; XtManageChildren(wlist, 2); // threadForm children XtManageChild(threadForm); // threadFrame children XmToggleButtonSetState(thread.tb, False, False); XmToggleButtonSetState(thread.atb, True, False); XmToggleButtonSetState(thread.dtb, False, False);//// Add buttons for specifying the folders to which this sort is to apply//// folderFrame// Radio folderRadio// ToggleButton folderCurTB// ToggleButton folderSelTB// ToggleButton folderAllTB// ToggleButton folderDefTB// args.Reset(); args.Orientation(XmVERTICAL); args.Packing(XmPACK_TIGHT); Widget folderRadio = XmCreateRadioBox(folderFrame, "folderRadio", ARGS); folderCurTB = XmCreateToggleButton(folderRadio, "folderCurTB", 0,0); folderSelTB = XmCreateToggleButton(folderRadio, "folderSelTB", 0,0); folderAllTB = XmCreateToggleButton(folderRadio, "folderAllTB", 0,0); folderDefTB = XmCreateToggleButton(folderRadio, "folderDefTB", 0,0); wlist[0] = folderCurTB; wlist[1] = folderSelTB; wlist[2] = folderAllTB; wlist[3] = folderDefTB; XtManageChildren(wlist, 4); // folderRadio children XtManageChild(folderRadio); // folderFrame children wlist[0] = *keyRC; wlist[1] = threadFrame; wlist[2] = folderFrame; XtManageChildren(wlist, 3); // appForm children HandleHelp(); XmToggleButtonSetState(folderDefTB, True, True);} // End constructor/*--------------------------------------------------------------- * Destructor */SortPrefWinC::~SortPrefWinC(){ delete keyRC;}/*--------------------------------------------------------------- * Display the dialog using the information from the specified sort * manager. */voidSortPrefWinC::Show(SortMgrC *sortMgr){//// Turn off all keys// XmToggleButtonSetState(thread.tb, False, False); XmToggleButtonSetState(number.tb, False, False); XmToggleButtonSetState(status.tb, False, False); XmToggleButtonSetState(sender.tb, False, False); XmToggleButtonSetState(to.tb, False, False); XmToggleButtonSetState(subject.tb, False, False); XmToggleButtonSetState(date.tb, False, False); XmToggleButtonSetState(lines.tb, False, False); XmToggleButtonSetState(bytes.tb, False, False);//// Initialize key states// SortKeyListC& keyList = sortMgr->KeyList(); unsigned count = keyList.size(); for (int i=0; i<count; i++) { MailSortKeyC *key = (MailSortKeyC*)keyList[i]; Boolean ascend = (key->Dir() == SortKeyC::ASCENDING);//// Initialize the state of the toggle buttons// switch (key->Type()) { case (MailSortKeyC::NUMBER): XmToggleButtonSetState(number.tb, True, False); XmToggleButtonSetState(number.atb, ascend, False); XmToggleButtonSetState(number.dtb, !ascend, False); selectedList.add(number.tb); break; case (MailSortKeyC::STATUS): XmToggleButtonSetState(status.tb, True, False); XmToggleButtonSetState(status.atb, ascend, False); XmToggleButtonSetState(status.dtb, !ascend, False); selectedList.add(status.tb); break; case (MailSortKeyC::SENDER): XmToggleButtonSetState(sender.tb, True, False); XmToggleButtonSetState(sender.atb, ascend, False); XmToggleButtonSetState(sender.dtb, !ascend, False); selectedList.add(sender.tb); break; case (MailSortKeyC::TO): XmToggleButtonSetState(to.tb, True, False); XmToggleButtonSetState(to.atb, ascend, False); XmToggleButtonSetState(to.dtb, !ascend, False); selectedList.add(to.tb); break; case (MailSortKeyC::SUBJECT): XmToggleButtonSetState(subject.tb, True, False); XmToggleButtonSetState(subject.atb, ascend, False); XmToggleButtonSetState(subject.dtb, !ascend, False); selectedList.add(subject.tb); break; case (MailSortKeyC::DATE): XmToggleButtonSetState(date.tb, True, False); XmToggleButtonSetState(date.atb, ascend, False); XmToggleButtonSetState(date.dtb, !ascend, False); selectedList.add(date.tb); break; case (MailSortKeyC::LINES): XmToggleButtonSetState(lines.tb, True, False); XmToggleButtonSetState(lines.atb, ascend, False); XmToggleButtonSetState(lines.dtb, !ascend, False); selectedList.add(lines.tb); break; case (MailSortKeyC::BYTES): XmToggleButtonSetState(bytes.tb, True, False); XmToggleButtonSetState(bytes.atb, ascend, False); XmToggleButtonSetState(bytes.dtb, !ascend, False); selectedList.add(bytes.tb); break; case (MailSortKeyC::THREAD): break; } // End switch sort key type } // End for each sort key if ( sortMgr->Threaded() ) { Boolean ascend = sortMgr->ThreadDir(); XmToggleButtonSetState(thread.tb, True, False); XmToggleButtonSetState(thread.atb, ascend, False); XmToggleButtonSetState(thread.dtb, !ascend, False); selectedList.add(thread.tb); } UpdateOrderLabels();//// Initialize how this is to be applied// if ( sortMgr == ishApp->mainWin->sortMgr ) XmToggleButtonSetState(folderDefTB, True, True); else XmToggleButtonSetState(folderCurTB, True, True); OptWinC::Show();} // End Show/*--------------------------------------------------------------- * Method to apply settings */BooleanSortPrefWinC::Apply(){ SortPrefC *prefs = ishApp->sortPrefs; BusyCursor(True);//// Build the string for this sort// RegexC tmp; StringC *oldKeys; StringC keyStr; BuildKeyString(keyStr); ishApp->Broadcast(""); Boolean sortCurrent = False;//// See if this sort applies to the current folder only// if ( XmToggleButtonGetState(folderCurTB) ) { ishApp->mainWin->curFolder->Sort(keyStr); sortCurrent = True;//// Add this sort to the dictionary// tmp = ishApp->mainWin->curFolder->name; oldKeys = prefs->folderSortKeys.definitionOf(tmp); if ( oldKeys ) *oldKeys = keyStr; else prefs->folderSortKeys.add(tmp, keyStr); } else if ( XmToggleButtonGetState(folderSelTB) ) {//// Loop through folders// VItemListC& slist = ishApp->mainWin->FolderVBox().SelItems(); if ( slist.size() == 0 ) { StringC errmsg("No folders are selected."); PopupMessage(errmsg); BusyCursor(False); return False; } FolderListC& flist = ishApp->folderPrefs->OpenFolders(); u_int fcount = flist.size(); for (int i=0; i<fcount; i++) { FolderC *folder = flist[i]; if ( slist.includes(folder->icon) ) { folder->Sort(keyStr); if ( folder == ishApp->mainWin->curFolder ) sortCurrent = True;//// Add this sort to the dictionary// tmp = folder->name; oldKeys = prefs->folderSortKeys.definitionOf(tmp); if ( oldKeys ) *oldKeys = keyStr; else prefs->folderSortKeys.add(tmp, keyStr); } } } else { if ( XmToggleButtonGetState(folderAllTB) ) {//// Clear out the folder sort keys// prefs->folderSortKeys.removeAll();//// Loop through folders, removing any sort managers// FolderListC *list = &ishApp->folderPrefs->OpenFolders(); u_int count = list->size(); int i; for (i=0; i<count; i++) { FolderC *folder = (*list)[i]; folder->SetSortMgr(NULL); } list = &ishApp->folderPrefs->FileFolders(); count = list->size(); for (i=0; i<count; i++) { FolderC *folder = (*list)[i]; folder->SetSortMgr(NULL); } } // End if updating all folders//// Update the sort manager for the main window// ishApp->mainWin->sortMgr->Set(keyStr); prefs->sortKeys = keyStr; sortCurrent = True; } if ( sortCurrent ) { ishApp->mainWin->MsgVBox().Sort(); ishApp->mainWin->MsgVBox().Refresh(); if ( keyStr.size() > 0 ) ishApp->Broadcast("Messages sorted"); }//// Write prefs// prefs->WriteDatabase(); if ( applyAll ) prefs->WriteFile(); BusyCursor(False); return True;} // End Apply/*--------------------------------------------------------------- * Method to build the key string for this sort */voidSortPrefWinC::BuildKeyString(StringC& keyStr){ keyStr.Clear();//// Loop through the selected keys// u_int count = selectedList.size(); for (int i=0; i<count; i++) { Widget tb = *selectedList[i];//// See which key struct this one belongs to// KeyStruct *key = NULL; if ( tb == thread.tb ) key = &thread; else if ( tb == number.tb ) key = &number; else if ( tb == status.tb ) key = &status; else if ( tb == sender.tb ) key = &sender; else if ( tb == to.tb ) key = &to; else if ( tb == subject.tb ) key = &subject; else if ( tb == date.tb ) key = &date; else if ( tb == lines.tb ) key = &lines; else if ( tb == bytes.tb ) key = &bytes; if ( key ) { if ( i > 0 ) keyStr += ' '; keyStr += key->name; if ( XmToggleButtonGetState(key->dtb) ) keyStr += "(D)"; else keyStr += "(A)"; } // End if we have a key struct } // End for each selected key} // End BuildKeyString/*--------------------------------------------------------------- * Method to update the labels displaying the order in which the * sort keys were selected. */voidSortPrefWinC::UpdateOrderLabels(){//// Check each key struct//// UpdateOrderLabel(thread); UpdateOrderLabel(number); UpdateOrderLabel(status); UpdateOrderLabel(sender); UpdateOrderLabel(to); UpdateOrderLabel(subject); UpdateOrderLabel(date); UpdateOrderLabel(lines); UpdateOrderLabel(bytes);} // End UpdateOrderLabelsvoidSortPrefWinC::UpdateOrderLabel(KeyStruct key){//// Loop through the selected list until we get to the requested key// Don't count the thread key// u_int count = selectedList.size(); int index = 1; StringC str; for (int i=0; i<count; i++) { Widget tb = *selectedList[i]; if ( tb == key.tb ) { str += index; i = count; } else if ( tb != thread.tb ) index++; } if ( str.size() == 0 ) str = " "; WXmString wstr = (char*)str; XtVaSetValues(key.label, XmNlabelString, (XmString)wstr, NULL);} // End UpdateOrderLabel/*--------------------------------------------------------------- * Callback routine to handle press of a sort key button */voidSortPrefWinC::ToggleKey(Widget w, SortPrefWinC *This, XmToggleButtonCallbackStruct *tb){//// Add this button to or remove if from the list of selected buttons// if ( tb->set ) This->selectedList.add(w); else This->selectedList.remove(w);//// Re-number the keys// This->UpdateOrderLabels();} // End ToggleKey/*--------------------------------------------------------------- * Callback routines to handle press of a direction toggle button */voidSortPrefWinC::ToggleDir(Widget w, SortPrefWinC *This, XmToggleButtonCallbackStruct *tb){ if ( !tb->set ) return;//// See which key struct this one belongs to// KeyStruct *key = NULL; if ( w == This->thread.atb || w == This->thread.dtb ) key = &This->thread; else if ( w == This->number.atb || w == This->number.dtb ) key = &This->number; else if ( w == This->status.atb || w == This->status.dtb ) key = &This->status; else if ( w == This->sender.atb || w == This->sender.dtb ) key = &This->sender; else if ( w == This->to.atb || w == This->to.dtb ) key = &This->to; else if ( w == This->subject.atb || w == This->subject.dtb ) key = &This->subject; else if ( w == This->date.atb || w == This->date.dtb ) key = &This->date; else if ( w == This->lines.atb || w == This->lines.dtb ) key = &This->lines; else if ( w == This->bytes.atb || w == This->bytes.dtb ) key = &This->bytes; if ( !key ) return;//// Select the key if not already selected// XmToggleButtonSetState(key->tb, True, True);} // End ToggleDir
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -