/**
 ** 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);
}
Exemple #2
0
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;
}
Exemple #3
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;
		}
	}
}