/** ** Requests information from the user to add a new prescription. ** Also adds new doctors / patients if these don't already exist. ** ** */ void localdb::AddPrescription() { // Set up dr_name and pt_ssn (doctor and patient) and get users input for doctor (we'll do patients soon..) std::string dr_name = userio::GetString("Name of doctor (or type 'list' to list all available): ", userio::NOFILTER); std::string pt_ssn; // Force it lowercase! ugh ... high overhead here, iterating through all of it... std::transform(dr_name.begin(),dr_name.end(), dr_name.begin(), ::tolower); // Alright, so if we got "list", we list all doctors and restart this method... if(dr_name.compare("list")==0) { ListPeople(DOCTOR); AddPrescription(); return; } else if(!doctors->count(dr_name)) { std::cout << "\nDoctor was not found in the database -- I will request some information needed for creation.\n"; AddPerson(DOCTOR); } // Now we'll do the exact same thing for the patient -- so get the users input for SSN pt_ssn = userio::GetString("Patient's SSN (or type 'list' to list all patients)", "^[a-z1-9]*", "numbers only"); // Alright, so if we got "list", we list all patients to let the user see available SSNs // then we ask once more ... if(pt_ssn.compare("list")==0) { ListPeople(PATIENT); pt_ssn = userio::GetString("Patient's SSN", "^[1-9]*", "numbers only"); } // If we couldn't find the patient in our list, we'll assume the user wants to add a new one... if(!patients->count(pt_ssn)) { std::cout << "\nPatient was not found in the database -- I will request some information needed for creation.\n"; AddPerson(PATIENT); } // Now we should be able to find the doctor, patient, and drug the user wanted. person* dr = &doctors->find(dr_name)->second; person* patient = &patients->find(pt_ssn)->second; medicine* drug = new medicine; *drug = SelectDrug(); // And with that, we can create a prescription ... prescription* p = new prescription(dr, patient, drug); // ... which we'll make sure to store StorePrescription(*p); }
int main() { person persona[MAX_PERSON]; int num = 0, choice = 1; DisplayMenu(); while (choice != 0) { cout << endl << "Enter command: "; cin >> choice; while (cin.fail()) { cout << "Invalid input, enter number 0-7:"; cin.clear(); cin.ignore(256, '\n'); cin >> choice; } if (choice == 0) { cout << "Goodbye" << endl; return 0; } if (choice == 1) DisplayMenu(); if (choice == 2) AddPerson(persona, &num); if (choice == 3) PrintPerson(persona, num); if (choice == 4) PrintAllPersons(persona, num); if (choice == 5) DeletePerson(persona, &num); if (choice == 6) ExportToFile(persona, num); if (choice == 7) ImportFromFile(persona, &num); } return 0; }
void InfoWindow::MessageReceived( BMessage* msg ) { switch( msg->what ) { case BEAIM_UPDATE_INFO: iView->UpdateDisplay( msg ); gotInfo = true; needsAway = needsAway || (msg->HasBool("away") && msg->FindBool("away")); if( needsAway && !askedAway ) AskAway(); if( needsAway && !gotAway ) statView->SetMessage( (char*)LangWithSuffix("IW_WAITING_FOR_AWAY",B_UTF8_ELLIPSIS) ); else { statView->SetMessage( (char*)Language.get("IM_GOT_INFO") ); statView->SetSpinner(false); } iView->Invalidate(); break; case BEAIM_UPDATE_AWAY_INFO: if( gotInfo ) { statView->SetMessage( (char*)Language.get("IM_GOT_INFO") ); statView->SetSpinner(false); } else statView->SetMessage( (char*)LangWithSuffix("IM_WAITING_FOR_INFO",B_UTF8_ELLIPSIS) ); EnableAwayMode(); iView->UpdateAwayDisplay( msg ); iView->Invalidate(); gotAway = true; break; case B_CANCEL: case BEAIM_CLOSE_WINDOW: QuitRequested(); Close(); break; case BEAIM_UPDATE_NAME_FORMAT: userName = AIMUser(msg->FindString("userid")); break; case BEAIM_ADD_BUDDY: AddPerson(); break; case BEAIM_REFRESH_LANG_STRINGS: RefreshLangStrings(); break; default: BWindow::MessageReceived( msg ); break; } }
/*********************************************************** * InitGUI ***********************************************************/ void HAddressView::InitGUI() { float divider = StringWidth(_("Subject:")) + 20; divider = max_c(divider , StringWidth(_("From:"))+20); divider = max_c(divider , StringWidth(_("To:"))+20); divider = max_c(divider , StringWidth(_("Bcc:"))+20); BRect rect = Bounds(); rect.top += 5; rect.left += 20 + divider; rect.right = Bounds().right - 5; rect.bottom = rect.top + 25; BTextControl *ctrl; ResourceUtils rutils; const char* name[] = {"to","subject","from","cc","bcc"}; for(int32 i = 0;i < 5;i++) { ctrl = new BTextControl(BRect(rect.left,rect.top ,(i == 1)?rect.right+divider:rect.right ,rect.bottom) ,name[i],"","",NULL ,B_FOLLOW_LEFT_RIGHT|B_FOLLOW_TOP,B_WILL_DRAW|B_NAVIGABLE); if(i == 1) { ctrl->SetLabel(_("Subject:")); ctrl->SetDivider(divider); ctrl->MoveBy(-divider,0); }else{ ctrl->SetDivider(0); } BMessage *msg = new BMessage(M_MODIFIED); msg->AddPointer("pointer",ctrl); ctrl->SetModificationMessage(msg); ctrl->SetEnabled(!fReadOnly); AddChild(ctrl); rect.OffsetBy(0,25); switch(i) { case 0: fTo = ctrl; break; case 1: fSubject = ctrl; break; case 2: fFrom = ctrl; fFrom->SetEnabled(false); fFrom->SetFlags(fFrom->Flags() & ~B_NAVIGABLE); break; case 3: fCc = ctrl; break; case 4: fBcc = ctrl; break; } } // BRect menuRect= Bounds(); menuRect.top += 5; menuRect.left += 22; menuRect.bottom = menuRect.top + 25; menuRect.right = menuRect.left + 16; BMenu *toMenu = new BMenu(_("To:")); BMenu *ccMenu = new BMenu(_("Cc:")); BMenu *bccMenu = new BMenu(_("Bcc:")); BQuery query; BVolume volume; BVolumeRoster().GetBootVolume(&volume); query.SetVolume(&volume); query.SetPredicate("((META:email=*)&&(BEOS:TYPE=application/x-person))"); if(!fReadOnly && query.Fetch() == B_OK) { BString addr[4],name,group,nick; entry_ref ref; BList peopleList; while(query.GetNextRef(&ref) == B_OK) { BNode node(&ref); if(node.InitCheck() != B_OK) continue; ReadNodeAttrString(&node,"META:name",&name); ReadNodeAttrString(&node,"META:email",&addr[0]); ReadNodeAttrString(&node,"META:email2",&addr[1]); ReadNodeAttrString(&node,"META:email3",&addr[2]); ReadNodeAttrString(&node,"META:email4",&addr[3]); ReadNodeAttrString(&node,"META:group",&group); ReadNodeAttrString(&node,"META:nickname",&nick); for(int32 i = 0;i < 4;i++) { if(addr[i].Length() > 0) { if(nick.Length() > 0) { nick += " <"; nick += addr[i]; nick += ">"; fAddrList.AddItem(strdup(nick.String())); } fAddrList.AddItem(strdup(addr[i].String())); BString title = name; title << " <" << addr[i] << ">"; AddPersonToList(peopleList,title.String(),group.String()); } } } // Sort people data peopleList.SortItems(HAddressView::SortPeople); // Build menus BTextControl *control[3] = {fTo,fCc,fBcc}; BMenu *menus[3] = {toMenu,ccMenu,bccMenu}; int32 count = peopleList.CountItems(); PersonData *data; bool needSeparator = false; bool hasSeparator = false; for(int32 k = 0;k < 3;k++) { for(int32 i = 0;i < count;i++) { BMessage *msg = new BMessage(M_ADDR_MSG); msg->AddPointer("pointer",control[k]); data = (PersonData*)peopleList.ItemAt(i); msg->AddString("email",data->email); if(needSeparator && !hasSeparator && strlen(data->group) == 0) { menus[k]->AddSeparatorItem(); hasSeparator = true; }else needSeparator = true; AddPerson(menus[k],data->email,data->group,msg,0,0); } hasSeparator = false; needSeparator = false; } // free all data while(count > 0) { data = (PersonData*)peopleList.RemoveItem(--count); free(data->email); free(data->group); delete data; } } BMenuField *field = new BMenuField(menuRect,"ToMenu","",toMenu, B_FOLLOW_TOP|B_FOLLOW_LEFT,B_WILL_DRAW); field->SetDivider(0); field->SetEnabled(!fReadOnly); AddChild(field); rect = menuRect; rect.OffsetBy(0,28); rect.left = Bounds().left + 5; rect.right = rect.left + 16; rect.top += 26; rect.bottom = rect.top + 16; ArrowButton *arrow = new ArrowButton(rect,"addr_arrow" ,new BMessage(M_EXPAND_ADDRESS)); AddChild(arrow); //==================== From menu BMenu *fromMenu = new BMenu(_("From:")); BPath path; ::find_directory(B_USER_SETTINGS_DIRECTORY,&path); path.Append(APP_NAME); path.Append("Accounts"); BDirectory dir(path.Path()); BEntry entry; status_t err = B_OK; int32 account_count = 0; while(err == B_OK) { if((err = dir.GetNextEntry(&entry)) == B_OK && !entry.IsDirectory()) { char name[B_FILE_NAME_LENGTH+1]; entry.GetName(name); BMessage *msg = new BMessage(M_ACCOUNT_CHANGE); msg->AddString("name",name); BMenuItem *item = new BMenuItem(name,msg); fromMenu->AddItem(item); item->SetTarget(this,Window()); account_count++; } } if(account_count != 0) { int32 smtp_account; ((HApp*)be_app)->Prefs()->GetData("smtp_account",&smtp_account); BMenuItem *item(NULL); if(account_count > smtp_account) item = fromMenu->ItemAt(smtp_account); if(!item) item = fromMenu->ItemAt(0); if(item) { ChangeAccount(item->Label()); item->SetMarked(true); } }else{ (new BAlert("",_("Could not find mail accounts"),_("OK"),NULL,NULL,B_WIDTH_AS_USUAL,B_INFO_ALERT))->Go(); Window()->PostMessage(B_QUIT_REQUESTED); } fromMenu->SetRadioMode(true); menuRect.OffsetBy(0,25*2); field = new BMenuField(menuRect,"FromMenu","",fromMenu, B_FOLLOW_TOP|B_FOLLOW_LEFT,B_WILL_DRAW); field->SetDivider(0); AddChild(field); //=================== CC menu menuRect.OffsetBy(0,25); field = new BMenuField(menuRect,"CcMenu","",ccMenu, B_FOLLOW_TOP|B_FOLLOW_LEFT,B_WILL_DRAW); field->SetDivider(0); field->SetEnabled(!fReadOnly); AddChild(field); //=================== BCC menu menuRect.OffsetBy(0,25); field = new BMenuField(menuRect,"BccMenu","",bccMenu, B_FOLLOW_TOP|B_FOLLOW_LEFT,B_WILL_DRAW); field->SetDivider(0); field->SetEnabled(!fReadOnly); AddChild(field); }
PeepsWindow::PeepsWindow(BMessenger target) : BWindow(BRect(50,50,600,470), "Mr. Peeps!", B_DOCUMENT_WINDOW, B_NOT_ZOOMABLE | B_NOT_H_RESIZABLE) { float wmin,wmax,hmin,hmax; GetSizeLimits(&wmin,&wmax,&hmin,&hmax); wmin=500; hmin=400; SetSizeLimits(wmin,wmax,hmin,hmax); ReadLocaleSettings(); if(fLocale.CountChars()>0) { locale_roster->SetLocale(fLocale.String()); gCurrentLocale=locale_roster->GetLocale(); } BRect r(Bounds()); BMessage *msg; r.bottom=20; BMenuBar *mb=new BMenuBar(r,"menubar"); AddChild(mb); fPeopleMenu=new BMenu(TRANSLATE("Person")); fPeopleMenu->AddItem(new BMenuItem(TRANSLATE("New"),new BMessage(M_ADD_PERSON),'N')); fPeopleMenu->AddSeparatorItem(); fPeopleMenu->AddItem(new BMenuItem(TRANSLATE("Previous"),new BMessage(M_PREV_ITEM),B_UP_ARROW)); fPeopleMenu->AddItem(new BMenuItem(TRANSLATE("Next"),new BMessage(M_NEXT_ITEM),B_DOWN_ARROW)); fPeopleMenu->AddSeparatorItem(); fActionsMenu=new BMenu(TRANSLATE("Actions")); // Submenu for sending e-mail BMenu *emailmenu=new BMenu(TRANSLATE("Send E-Mail to")); fEmailPersonalItem=new BMenuItem(TRANSLATE("Personal Address"),new BMessage(M_SEND_PERSONAL_EMAIL)); emailmenu->AddItem(fEmailPersonalItem); fEmailWorkItem=new BMenuItem(TRANSLATE("Work Address"),new BMessage(M_SEND_WORK_EMAIL)); emailmenu->AddItem(fEmailWorkItem); fEmailAltItem=new BMenuItem(TRANSLATE("Alternate Address"),new BMessage(M_SEND_ALT_EMAIL)); emailmenu->AddItem(fEmailAltItem); fActionsMenu->AddItem(emailmenu); // Submenu for sending e-mail BMenu *browsermenu=new BMenu(TRANSLATE("Go to Web Page")); fBrowseHomeItem=new BMenuItem(TRANSLATE("Personal Web Address"),new BMessage(M_BROWSE_WWW_HOME)); browsermenu->AddItem(fBrowseHomeItem); fBrowseWorkItem=new BMenuItem(TRANSLATE("Work Web Address"),new BMessage(M_BROWSE_WWW_WORK)); browsermenu->AddItem(fBrowseWorkItem); fBrowseAltItem=new BMenuItem(TRANSLATE("Alternate Web Address"),new BMessage(M_BROWSE_WWW_ALT)); browsermenu->AddItem(fBrowseAltItem); fActionsMenu->AddItem(browsermenu); fActionsMenu->AddSeparatorItem(); fPastePhotoItem=new BMenuItem(TRANSLATE("Paste Photo from Clipboard"),new BMessage(M_PASTE_IMAGE)); fActionsMenu->AddItem(fPastePhotoItem); fRemovePhotoItem=new BMenuItem(TRANSLATE("Remove Photo"),new BMessage(M_REMOVE_IMAGE)); fActionsMenu->AddItem(fRemovePhotoItem); fActionsMenu->AddSeparatorItem(); fActionsMenu->AddItem(new BMenuItem(TRANSLATE("Move To Trash"),new BMessage(M_DELETE_PERSON),'T')); fPeopleMenu->AddItem(fActionsMenu); fActionsMenu->SetEnabled(false); fPeopleMenu->AddSeparatorItem(); fPeopleMenu->AddItem(new BMenuItem(TRANSLATE("About..."),new BMessage(B_ABOUT_REQUESTED))); mb->AddItem(fPeopleMenu); fEditMenu=new BMenu(TRANSLATE("Edit")); fEditMenu->AddItem(new BMenuItem(TRANSLATE("Undo"),new BMessage(M_UNDO),'Z')); fEditMenu->AddSeparatorItem(); fEditMenu->AddItem(new BMenuItem(TRANSLATE("Cut"),new BMessage(M_CUT),'X')); fEditMenu->AddItem(new BMenuItem(TRANSLATE("Copy"),new BMessage(M_COPY),'C')); fEditMenu->AddItem(new BMenuItem(TRANSLATE("Paste"),new BMessage(M_PASTE),'V')); mb->AddItem(fEditMenu); fEditMenu->SetEnabled(false); fTabMenu=new BMenu(TRANSLATE("Tab")); fTabMenu->AddItem(new BMenuItem(TRANSLATE("Main"),new BMessage(M_TAB_1),'1')); fTabMenu->AddItem(new BMenuItem(TRANSLATE("Personal"),new BMessage(M_TAB_2),'2')); fTabMenu->AddItem(new BMenuItem(TRANSLATE("Work"),new BMessage(M_TAB_3),'3')); fTabMenu->AddItem(new BMenuItem(TRANSLATE("Instant Message"),new BMessage(M_TAB_4),'4')); fTabMenu->AddItem(new BMenuItem(TRANSLATE("Notes"),new BMessage(M_TAB_5),'5')); mb->AddItem(fTabMenu); fTabMenu->SetEnabled(false); BMessage *menumsg; BEntry toolentry; // Note that I don't just simply have a way to iterate over whatever's in a folder // because I want to control what tools are officially supported by Mr. Peeps! // It's not that I don't want anyone helping -- I just want quality control with // tool usability. fToolMenu=new BMenu(TRANSLATE("Tools")); toolentry.SetTo("/boot/home/config/settings/MrPeeps/PeopleMover"); if(toolentry.Exists()) { menumsg=new BMessage(M_RUN_TOOL); menumsg->AddString("signature","application/x-vnd.wgp-PeopleMover"); fToolPeopleMover=new BMenuItem(TRANSLATE("People Mover"),menumsg); fToolMenu->AddItem(fToolPeopleMover); } else fToolPeopleMover=NULL; toolentry.SetTo("/boot/home/config/settings/MrPeeps/PersonAtAGlance"); if(toolentry.Exists()) { menumsg=new BMessage(M_RUN_TOOL); menumsg->AddString("signature","application/x-vnd.wgp-PersonAtAGlance"); fToolPeopleAtAGlance=new BMenuItem(TRANSLATE("Person at a Glance"),menumsg); fToolPeopleAtAGlance->SetEnabled(false); fToolMenu->AddItem(fToolPeopleAtAGlance); } else fToolPeopleAtAGlance=NULL; toolentry.SetTo("/boot/home/config/settings/MrPeeps/VCardExport"); if(toolentry.Exists()) { menumsg=new BMessage(M_RUN_TOOL); menumsg->AddString("signature","application/x-vnd.wgp-VCardExport"); fToolVCardExport=new BMenuItem(TRANSLATE("Export Person to VCard"),menumsg); fToolVCardExport->SetEnabled(false); fToolMenu->AddItem(fToolVCardExport); } else fToolVCardExport=NULL; if(fToolMenu->CountItems()>0) { // PeopleMover does not require a selection, so if it is installed, allow the // user to select it. if(!fToolPeopleMover) fToolMenu->SetEnabled(false); mb->AddItem(fToolMenu); } else { delete fToolMenu; fToolMenu=NULL; } if(locale_roster->CountLocales()>1) { fLanguageMenu=new BMenu(TRANSLATE("Language")); fLanguageMenu->SetRadioMode(true); for(int32 i=0; i<locale_roster->CountLocales(); i++) { Locale *locale=locale_roster->LocaleAt(i); BMessage *langmsg=new BMessage(M_SET_LANGUAGE); langmsg->AddInt32("index",i); fLanguageMenu->AddItem(new BMenuItem(locale->Name(),langmsg)); } mb->AddItem(fLanguageMenu); BMenuItem *markeditem=fLanguageMenu->FindItem(fLocale.String()); if(markeditem) markeditem->SetMarked(true); } else fLanguageMenu=NULL; // set up left frame r.top+=mb->Bounds().bottom+1; r.bottom=Bounds().bottom; r.right=200; left_view=new BView(r, "left_view", B_FOLLOW_TOP_BOTTOM, B_WILL_DRAW); AddChild(left_view); // Check to see that all of the tabs will fit float tabwidth=left_view->StringWidth(TRANSLATE("Main"))+ left_view->StringWidth(TRANSLATE("Personal"))+ left_view->StringWidth(TRANSLATE("Work"))+ left_view->StringWidth(TRANSLATE("Instant Message"))+ left_view->StringWidth(TRANSLATE("Notes"))+120; r.left=201; if(tabwidth+r.left>Bounds().right) ResizeTo(tabwidth+r.left, Bounds().Height()); r.right=Bounds().right; fIntroView=new IntroView(r); AddChild(fIntroView); dataview=new DataView(fIntroView->Bounds()); fIntroView->AddChild(dataview); dataview->Hide(); // create list for left frame BRect tmp_rect=left_view->Bounds(); tmp_rect.right -= B_V_SCROLL_BAR_WIDTH; fPeopleList=new PeopleList(tmp_rect, "fPeopleList",dataview); // put scrolled list in left_view BScrollView *my_scroll=new BScrollView("scroll_people", fPeopleList, B_FOLLOW_TOP_BOTTOM, 0, false, true); left_view->AddChild(my_scroll); // open directory of people BDirectory people_dir(PEOPLE_FOLDER); msg=new BMessage(M_SET_STATUS); int32 refcount=people_dir.CountEntries(); msg->AddInt32("refcount",refcount); target.SendMessage(msg); if(refcount==0) fIntroView->SetNoPeopleMsg(true); // our variables for instantiation and garbage collection later entry_ref tmp_ref; BFile tmp_file; BString filename; while (people_dir.GetNextRef(&tmp_ref)==B_OK) { // variables for use here tmp_file.SetTo(&tmp_ref, B_READ_WRITE); if(tmp_file.ReadAttrString(PERSON_NAME,&filename)==B_OK) AddPerson(tmp_ref, false); target.SendMessage(new BMessage(M_UPDATE_STATUS)); } SortList(); fPeopleList->MakeFocus(true); node_ref nref; people_dir.GetNodeRef(&nref); watch_node(&nref, B_WATCH_NAME | B_WATCH_ATTR | B_WATCH_DIRECTORY,this); }
void PeepsWindow::MessageReceived(BMessage *msg) { switch(msg->what) { case B_ABOUT_REQUESTED: { be_app->PostMessage(msg); break; } case M_RUN_TOOL: { BString sig; if(msg->FindString("signature",&sig)==B_OK) { if(strcmp(sig.String(),"application/x-vnd.wgp-PeopleMover")==0) { be_roster->Launch(sig.String()); break; } // Get the filename for the currently-selected person int32 selection=fPeopleList->CurrentSelection(); if(selection<0) break; PeepsListItem *peepsitem=(PeepsListItem*)fPeopleList->ItemAt(selection); if(!peepsitem || peepsitem->IsGroup()) break; PersonItem *personitem=(PersonItem*)peepsitem; PersonData *persondata=personitem->GetData(); if(!persondata) break; entry_ref ref=persondata->FileRef(); BPath path(&ref); char *launchv[1]; launchv[0]=new char[255]; sprintf(launchv[0],"%s",path.Path()); be_roster->Launch(sig.String(),1,launchv,NULL); delete [] launchv[0]; } break; } case M_SHOW_ACTIONS: { uint32 buttons; BPoint pt; fPeopleList->GetMouse(&pt,&buttons,false); pt.x=(pt.x>5)?pt.x-5:0; pt.y=(pt.y>5)?pt.y-5:0; fPeopleList->ShowContextMenu(fPeopleList->ConvertToScreen(pt)); break; } case M_BITMAP_REMOVED: case M_PHOTO_MODIFIED: { fPeopleList->SaveImageData(); break; } case B_REFS_RECEIVED: case B_SIMPLE_DATA: { entry_ref ref; if(msg->FindRef("refs",0,&ref)==B_OK) { if(!IsPerson(ref)) { // Might be an image dropped on the photo view. find out which child is the // target BPoint pt; if(msg->FindPoint("_drop_offset",&pt)!=B_OK) break; BView *target=FindView(pt); if(!target || strcmp(target->Name(),"photoview")!=0) break; // This will set the image, if possible target->MessageReceived(msg); // Save the image data to a real file and attach the Person attributes // to it fPeopleList->SaveImageData(); } // Offer to move/copy file if not in People directory BDirectory dir,peopledir("/boot/home/people"); BEntry entry(&ref); entry.GetParent(&dir); if(dir!=peopledir) { BString refname(ref.name); BString errstr=TRANSLATE("%s is not currently stored in the People folder. Mr. Peeps! will not" " see it on startup unless it is stored there. Would you like to move it" " there?"); char errmsg[errstr.CountChars() - 2 + refname.CountChars() + 1]; sprintf(errmsg,errstr.String(),refname.String()); BAlert *alert=new BAlert("Mr. Peeps!",errmsg,TRANSLATE("Move"),TRANSLATE("Don't Move")); if(alert->Go()==0) { entry.MoveTo(&peopledir); entry.GetRef(&ref); } } if(!SelectPerson(ref)) AddPerson(ref,true); } break; } case M_PREV_ITEM: { if(fPeopleList->CountItems()==0) break; int32 selection=fPeopleList->CurrentSelection(); if(!fPeopleList->IsFocus()) { fPeopleList->MakeFocus(true); PeepsListItem *pitem=(PeepsListItem*)fPeopleList->ItemAt(selection); if(!pitem->IsGroup()) { fPeopleList->SyncData((PersonItem*)pitem); // fPeopleList->SaveData(); } fPeopleList->SaveData(); } if(selection>=0) { if(selection>0) fPeopleList->Select(selection-1); } else { fPeopleList->Select(0L); } break; } case M_NEXT_ITEM: { if(fPeopleList->CountItems()==0) break; int32 selection=fPeopleList->CurrentSelection(); if(!fPeopleList->IsFocus()) { fPeopleList->MakeFocus(true); PeepsListItem *pitem=(PeepsListItem*)fPeopleList->ItemAt(selection); if(!pitem->IsGroup()) { fPeopleList->SyncData((PersonItem*)pitem); // fPeopleList->SaveData(); } fPeopleList->SaveData(); } if(selection==fPeopleList->CountItems()-1 || selection<0) fPeopleList->Select(fPeopleList->CountItems()-1); else fPeopleList->Select(selection+1); break; } case M_MOD_DATA: case M_SAVE: { fPeopleList->SyncData(NULL); fPeopleList->SaveData(); break; } case M_ADD_PERSON: { entry_ref ref; status_t stat=CreatePerson(&ref); if(stat==B_FILE_EXISTS) { for(int32 i=0;i<gPeopleData.CountItems(); i++) { PersonData *pdata=(PersonData*)gPeopleData.ItemAt(i); if(BString(TRANSLATE("New Person")).ICompare(pdata->Name())==0) { int32 selection=fPeopleList->CurrentSelection(); if(selection>=0) { PeepsListItem *peepsitem=(PeepsListItem*)fPeopleList->ItemAt(selection); if(peepsitem && !peepsitem->IsGroup()) fPeopleList->Collapse(fPeopleList->Superitem(peepsitem)); } PersonItem *pitem=pdata->InstanceAt(0); GroupItem *gitem=(GroupItem*)fPeopleList->Superitem(pitem); if(!gitem->IsExpanded()) fPeopleList->Expand(gitem); fPeopleList->Select(fPeopleList->IndexOf(pitem)); fPeopleList->ScrollToSelection(); break; } } } else { // Add the current group to the New Person's file so that we end up staying // in the current group. if(stat==B_OK) { int32 selection=fPeopleList->CurrentSelection(); BString groupstr(TRANSLATE("Ungrouped")); if(selection>=0) { PeepsListItem *currentitem=(PeepsListItem*)fPeopleList->ItemAt(selection); if(currentitem->IsGroup()) groupstr=currentitem->Name(); else groupstr=((PersonItem*)currentitem)->Group(); } PersonData *pdata=new PersonData(ref); pdata->SetGroup(groupstr.String()); pdata->SetName(TRANSLATE("New Person")); pdata->SaveToFile(); delete pdata; AddPerson(ref,true); SortList(); SelectPerson(TRANSLATE("New Person")); dataview->SetFirstFieldFocus(); } } break; } case M_DELETE_PERSON: { int32 selection=fPeopleList->CurrentSelection(); if(selection<0) break; PeepsListItem *item=(PeepsListItem*)fPeopleList->ItemAt(selection); if(item->IsGroup()) DeleteGroup((GroupItem*)item); else { DeletePerson(((PersonItem*)item)->GetData()); } break; } case M_DISABLE_DELETE: { BMenuItem *item=fPeopleMenu->FindItem(TRANSLATE("Move To Trash")); if(item) item->SetEnabled(false); break; } case M_ENABLE_DELETE: { BMenuItem *item=fPeopleMenu->FindItem(TRANSLATE("Move To Trash")); if(item) item->SetEnabled(true); break; } case M_SET_LANGUAGE: { // Restart MrPeeps! gRestartApp=true; int32 language; if(msg->FindInt32("index",&language)!=B_OK) break; BMenuItem *item = fLanguageMenu->ItemAt(language); if(!item) break; fLocale = item->Label(); WriteLocaleSettings(); be_app->PostMessage(B_QUIT_REQUESTED); break; } case M_HANDLE_NO_SELECTION: { // This is the initial case. No selection means quite a few different // menu items are disabled. fTabMenu->SetEnabled(false); fEditMenu->SetEnabled(false); if(fToolPeopleAtAGlance) fToolPeopleAtAGlance->SetEnabled(false); if(fToolVCardExport) fToolVCardExport->SetEnabled(false); UpdateActions(true); break; } case M_HANDLE_GROUP_SELECTION: { // This is the initial case. No selection means quite a few different // menu items are disabled. fTabMenu->SetEnabled(false); fEditMenu->SetEnabled(true); if(fToolPeopleAtAGlance) fToolPeopleAtAGlance->SetEnabled(false); if(fToolVCardExport) fToolVCardExport->SetEnabled(false); UpdateActions(true); break; } case M_HANDLE_PERSON_SELECTION: { // This is the initial case. No selection means quite a few different // menu items are disabled. fTabMenu->SetEnabled(true); fEditMenu->SetEnabled(true); if(fToolPeopleAtAGlance) fToolPeopleAtAGlance->SetEnabled(true); if(fToolVCardExport) fToolVCardExport->SetEnabled(true); UpdateActions(false); break; } case M_SEND_PERSONAL_EMAIL: { if(dataview->Email()) { BMessage *emailmsg=new BMessage(M_SEND_EMAIL); emailmsg->AddString("address",dataview->Email()); be_app->PostMessage(emailmsg); } break; } case M_SEND_WORK_EMAIL: { if(dataview->WorkEmail()) { BMessage *emailmsg=new BMessage(M_SEND_EMAIL); emailmsg->AddString("address",dataview->WorkEmail()); be_app->PostMessage(emailmsg); } break; } case M_SEND_ALT_EMAIL: { if(dataview->Email3()) { BMessage *emailmsg=new BMessage(M_SEND_EMAIL); emailmsg->AddString("address",dataview->Email3()); be_app->PostMessage(emailmsg); } break; } case M_BROWSE_WWW_HOME: { if(dataview->URL()) { BMessage *wwwmsg=new BMessage(M_LAUNCH_BROWSER); wwwmsg->AddString("address",dataview->URL()); be_app->PostMessage(wwwmsg); } break; } case M_BROWSE_WWW_WORK: { if(dataview->WorkURL()) { BMessage *wwwmsg=new BMessage(M_LAUNCH_BROWSER); wwwmsg->AddString("address",dataview->WorkURL()); be_app->PostMessage(wwwmsg); } break; } case M_BROWSE_WWW_ALT: { if(dataview->OtherURL()) { BMessage *wwwmsg=new BMessage(M_LAUNCH_BROWSER); wwwmsg->AddString("address",dataview->OtherURL()); be_app->PostMessage(wwwmsg); } break; } case M_TAB_1: { fPeopleList->SyncData(); fPeopleList->SaveData(); dataview->ShowTab(0); if(!fPeopleList->IsFocus()) dataview->SetFirstFieldFocus(); break; } case M_TAB_2: { fPeopleList->SyncData(); fPeopleList->SaveData(); dataview->ShowTab(1); if(!fPeopleList->IsFocus()) dataview->SetFirstFieldFocus(); break; } case M_TAB_3: { fPeopleList->SyncData(); fPeopleList->SaveData(); dataview->ShowTab(2); if(!fPeopleList->IsFocus()) dataview->SetFirstFieldFocus(); break; } case M_TAB_4: { fPeopleList->SyncData(); fPeopleList->SaveData(); dataview->ShowTab(3); if(!fPeopleList->IsFocus()) dataview->SetFirstFieldFocus(); break; } case M_TAB_5: { fPeopleList->SyncData(); fPeopleList->SaveData(); dataview->ShowTab(4); if(!fPeopleList->IsFocus()) dataview->SetFirstFieldFocus(); break; } case M_UNDO: { dataview->UndoField(); break; } case M_CUT: { dataview->CutField(); break; } case M_COPY: { dataview->CopyField(); break; } case M_PASTE: { dataview->PasteField(); break; } case B_NODE_MONITOR: { HandleNodeMonitoring(msg); break; } default: { BWindow::MessageReceived(msg); break; } } }