from sample code
git-svn-id: file:///srv/svn/repos/haiku/trunk/current@1676 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -0,0 +1,13 @@
|
||||
SubDir OBOS_TOP src apps people ;
|
||||
|
||||
AddResources People : People.rsrc ;
|
||||
|
||||
App People : main.cpp
|
||||
PeopleApp.cpp
|
||||
PeopleView.cpp
|
||||
PeopleWindow.cpp
|
||||
TTextControl.cpp
|
||||
;
|
||||
|
||||
LinkSharedOSLibs People : be tracker ;
|
||||
|
||||
@@ -0,0 +1,31 @@
|
||||
----------------------
|
||||
Be Sample Code License
|
||||
----------------------
|
||||
|
||||
Copyright 1991-1999, Be Incorporated.
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions
|
||||
are met:
|
||||
|
||||
1. Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions, and the following disclaimer.
|
||||
|
||||
2. Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions, and the following disclaimer in the
|
||||
documentation and/or other materials provided with the distribution.
|
||||
|
||||
3. The name of the author may not be used to endorse or promote products
|
||||
derived from this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR
|
||||
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||
OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
|
||||
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
|
||||
AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
|
||||
TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
Binary file not shown.
@@ -0,0 +1,386 @@
|
||||
//--------------------------------------------------------------------
|
||||
//
|
||||
// PeopleApp.cpp
|
||||
//
|
||||
// Written by: Robert Polic
|
||||
//
|
||||
//--------------------------------------------------------------------
|
||||
/*
|
||||
Copyright 1999, Be Incorporated. All Rights Reserved.
|
||||
This file may be used under the terms of the Be Sample Code License.
|
||||
*/
|
||||
|
||||
#include <Bitmap.h>
|
||||
#include <Directory.h>
|
||||
#include <Volume.h>
|
||||
#include <VolumeRoster.h>
|
||||
#include <Path.h>
|
||||
#include <FindDirectory.h>
|
||||
#include <Screen.h>
|
||||
#include <fs_index.h>
|
||||
#include <string.h>
|
||||
#include <Alert.h>
|
||||
|
||||
|
||||
#include "PeopleApp.h"
|
||||
#include "PeopleWindow.h"
|
||||
#include "PersonIcons.h"
|
||||
|
||||
//====================================================================
|
||||
|
||||
TPeopleApp::TPeopleApp(void)
|
||||
:BApplication(APP_SIG)
|
||||
{
|
||||
bool valid = FALSE;
|
||||
const char *str;
|
||||
int32 index = 0;
|
||||
BBitmap large_icon(BRect(0, 0, B_LARGE_ICON - 1, B_LARGE_ICON - 1), B_COLOR_8_BIT);
|
||||
BBitmap mini_icon(BRect(0, 0, B_MINI_ICON - 1, B_MINI_ICON - 1), B_COLOR_8_BIT);
|
||||
BDirectory dir;
|
||||
BEntry entry;
|
||||
BMessage msg;
|
||||
BMessage info;
|
||||
BMimeType mime;
|
||||
BPath path;
|
||||
BPoint pos;
|
||||
BVolume vol;
|
||||
BVolumeRoster roster;
|
||||
// TPeopleWindow *window;
|
||||
|
||||
fHaveWindow = FALSE;
|
||||
|
||||
fPosition.Set(6, TITLE_BAR_HEIGHT, 6 + WIND_WIDTH, TITLE_BAR_HEIGHT + WIND_HEIGHT);
|
||||
pos = fPosition.LeftTop();
|
||||
|
||||
find_directory(B_USER_SETTINGS_DIRECTORY, &path, true);
|
||||
dir.SetTo(path.Path());
|
||||
if (dir.FindEntry("People_data", &entry) == B_NO_ERROR) {
|
||||
fPrefs = new BFile(&entry, O_RDWR);
|
||||
if (fPrefs->InitCheck() == B_NO_ERROR) {
|
||||
fPrefs->Read(&pos, sizeof(BPoint));
|
||||
if (BScreen(B_MAIN_SCREEN_ID).Frame().Contains(pos))
|
||||
fPosition.OffsetTo(pos);
|
||||
}
|
||||
}
|
||||
else {
|
||||
fPrefs = new BFile();
|
||||
if (dir.CreateFile("People_data", fPrefs) != B_NO_ERROR) {
|
||||
delete fPrefs;
|
||||
fPrefs = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
roster.GetBootVolume(&vol);
|
||||
fs_create_index(vol.Device(), P_NAME, B_STRING_TYPE, 0);
|
||||
fs_create_index(vol.Device(), P_COMPANY, B_STRING_TYPE, 0);
|
||||
fs_create_index(vol.Device(), P_ADDRESS, B_STRING_TYPE, 0);
|
||||
fs_create_index(vol.Device(), P_CITY, B_STRING_TYPE, 0);
|
||||
fs_create_index(vol.Device(), P_STATE, B_STRING_TYPE, 0);
|
||||
fs_create_index(vol.Device(), P_ZIP, B_STRING_TYPE, 0);
|
||||
fs_create_index(vol.Device(), P_COUNTRY, B_STRING_TYPE, 0);
|
||||
fs_create_index(vol.Device(), P_HPHONE, B_STRING_TYPE, 0);
|
||||
fs_create_index(vol.Device(), P_WPHONE, B_STRING_TYPE, 0);
|
||||
fs_create_index(vol.Device(), P_FAX, B_STRING_TYPE, 0);
|
||||
fs_create_index(vol.Device(), P_EMAIL, B_STRING_TYPE, 0);
|
||||
fs_create_index(vol.Device(), P_URL, B_STRING_TYPE, 0);
|
||||
fs_create_index(vol.Device(), P_GROUP, B_STRING_TYPE, 0);
|
||||
fs_create_index(vol.Device(), P_NICKNAME, B_STRING_TYPE, 0);
|
||||
|
||||
// install person mime type
|
||||
mime.SetType(B_PERSON_MIMETYPE);
|
||||
if (mime.IsInstalled()) {
|
||||
if (mime.GetAttrInfo(&info) == B_NO_ERROR) {
|
||||
while (info.FindString("attr:name", index++, &str) == B_NO_ERROR) {
|
||||
if (!strcmp(str, P_NAME)) {
|
||||
valid = TRUE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!valid)
|
||||
mime.Delete();
|
||||
}
|
||||
}
|
||||
if (!valid) {
|
||||
mime.Install();
|
||||
large_icon.SetBits(kLargePersonIcon, large_icon.BitsLength(), 0, B_COLOR_8_BIT);
|
||||
mini_icon.SetBits(kSmallPersonIcon, mini_icon.BitsLength(), 0, B_COLOR_8_BIT);
|
||||
mime.SetShortDescription("Person");
|
||||
mime.SetLongDescription("Contact information for a person.");
|
||||
mime.SetIcon(&large_icon, B_LARGE_ICON);
|
||||
mime.SetIcon(&mini_icon, B_MINI_ICON);
|
||||
mime.SetPreferredApp(APP_SIG);
|
||||
|
||||
// add relevant person fields to meta-mime type
|
||||
msg.AddString("attr:public_name", "Contact Name");
|
||||
msg.AddString("attr:name", P_NAME);
|
||||
msg.AddInt32("attr:type", B_STRING_TYPE);
|
||||
msg.AddBool("attr:viewable", true);
|
||||
msg.AddBool("attr:editable", true);
|
||||
msg.AddInt32("attr:width", 120);
|
||||
msg.AddInt32("attr:alignment", B_ALIGN_LEFT);
|
||||
msg.AddBool("attr:extra", false);
|
||||
|
||||
msg.AddString("attr:public_name", "Company");
|
||||
msg.AddString("attr:name", P_COMPANY);
|
||||
msg.AddInt32("attr:type", B_STRING_TYPE);
|
||||
msg.AddBool("attr:viewable", true);
|
||||
msg.AddBool("attr:editable", true);
|
||||
msg.AddInt32("attr:width", 120);
|
||||
msg.AddInt32("attr:alignment", B_ALIGN_LEFT);
|
||||
msg.AddBool("attr:extra", false);
|
||||
|
||||
msg.AddString("attr:public_name", "Address");
|
||||
msg.AddString("attr:name", P_ADDRESS);
|
||||
msg.AddInt32("attr:type", B_STRING_TYPE);
|
||||
msg.AddBool("attr:viewable", true);
|
||||
msg.AddBool("attr:editable", true);
|
||||
msg.AddInt32("attr:width", 120);
|
||||
msg.AddInt32("attr:alignment", B_ALIGN_LEFT);
|
||||
msg.AddBool("attr:extra", false);
|
||||
|
||||
msg.AddString("attr:public_name", "City");
|
||||
msg.AddString("attr:name", P_CITY);
|
||||
msg.AddInt32("attr:type", B_STRING_TYPE);
|
||||
msg.AddBool("attr:viewable", true);
|
||||
msg.AddBool("attr:editable", true);
|
||||
msg.AddInt32("attr:width", 90);
|
||||
msg.AddInt32("attr:alignment", B_ALIGN_LEFT);
|
||||
msg.AddBool("attr:extra", false);
|
||||
|
||||
msg.AddString("attr:public_name", "State");
|
||||
msg.AddString("attr:name", P_STATE);
|
||||
msg.AddInt32("attr:type", B_STRING_TYPE);
|
||||
msg.AddBool("attr:viewable", true);
|
||||
msg.AddBool("attr:editable", true);
|
||||
msg.AddInt32("attr:width", 50);
|
||||
msg.AddInt32("attr:alignment", B_ALIGN_LEFT);
|
||||
msg.AddBool("attr:extra", false);
|
||||
|
||||
msg.AddString("attr:public_name", "Zip");
|
||||
msg.AddString("attr:name", P_ZIP);
|
||||
msg.AddInt32("attr:type", B_STRING_TYPE);
|
||||
msg.AddBool("attr:viewable", true);
|
||||
msg.AddBool("attr:editable", true);
|
||||
msg.AddInt32("attr:width", 50);
|
||||
msg.AddInt32("attr:alignment", B_ALIGN_LEFT);
|
||||
msg.AddBool("attr:extra", false);
|
||||
|
||||
msg.AddString("attr:public_name", "Country");
|
||||
msg.AddString("attr:name", P_COUNTRY);
|
||||
msg.AddInt32("attr:type", B_STRING_TYPE);
|
||||
msg.AddBool("attr:viewable", true);
|
||||
msg.AddBool("attr:editable", true);
|
||||
msg.AddInt32("attr:width", 120);
|
||||
msg.AddInt32("attr:alignment", B_ALIGN_LEFT);
|
||||
msg.AddBool("attr:extra", false);
|
||||
|
||||
msg.AddString("attr:public_name", "Home Phone");
|
||||
msg.AddString("attr:name", P_HPHONE);
|
||||
msg.AddInt32("attr:type", B_STRING_TYPE);
|
||||
msg.AddBool("attr:viewable", true);
|
||||
msg.AddBool("attr:editable", true);
|
||||
msg.AddInt32("attr:width", 90);
|
||||
msg.AddInt32("attr:alignment", B_ALIGN_LEFT);
|
||||
msg.AddBool("attr:extra", false);
|
||||
|
||||
msg.AddString("attr:public_name", "Work Phone");
|
||||
msg.AddString("attr:name", P_WPHONE);
|
||||
msg.AddInt32("attr:type", B_STRING_TYPE);
|
||||
msg.AddBool("attr:viewable", true);
|
||||
msg.AddBool("attr:editable", true);
|
||||
msg.AddInt32("attr:width", 90);
|
||||
msg.AddInt32("attr:alignment", B_ALIGN_LEFT);
|
||||
msg.AddBool("attr:extra", false);
|
||||
|
||||
msg.AddString("attr:public_name", "Fax");
|
||||
msg.AddString("attr:name", P_FAX);
|
||||
msg.AddInt32("attr:type", B_STRING_TYPE);
|
||||
msg.AddBool("attr:viewable", true);
|
||||
msg.AddBool("attr:editable", true);
|
||||
msg.AddInt32("attr:width", 90);
|
||||
msg.AddInt32("attr:alignment", B_ALIGN_LEFT);
|
||||
msg.AddBool("attr:extra", false);
|
||||
|
||||
msg.AddString("attr:public_name", "E-mail");
|
||||
msg.AddString("attr:name", P_EMAIL);
|
||||
msg.AddInt32("attr:type", B_STRING_TYPE);
|
||||
msg.AddBool("attr:viewable", true);
|
||||
msg.AddBool("attr:editable", true);
|
||||
msg.AddInt32("attr:width", 120);
|
||||
msg.AddInt32("attr:alignment", B_ALIGN_LEFT);
|
||||
msg.AddBool("attr:extra", false);
|
||||
|
||||
msg.AddString("attr:public_name", "URL");
|
||||
msg.AddString("attr:name", P_URL);
|
||||
msg.AddInt32("attr:type", B_STRING_TYPE);
|
||||
msg.AddBool("attr:viewable", true);
|
||||
msg.AddBool("attr:editable", true);
|
||||
msg.AddInt32("attr:width", 120);
|
||||
msg.AddInt32("attr:alignment", B_ALIGN_LEFT);
|
||||
msg.AddBool("attr:extra", false);
|
||||
|
||||
msg.AddString("attr:public_name", "Group");
|
||||
msg.AddString("attr:name", P_GROUP);
|
||||
msg.AddInt32("attr:type", B_STRING_TYPE);
|
||||
msg.AddBool("attr:viewable", true);
|
||||
msg.AddBool("attr:editable", true);
|
||||
msg.AddInt32("attr:width", 120);
|
||||
msg.AddInt32("attr:alignment", B_ALIGN_LEFT);
|
||||
msg.AddBool("attr:extra", false);
|
||||
|
||||
msg.AddString("attr:public_name", "Nickname");
|
||||
msg.AddString("attr:name", P_NICKNAME);
|
||||
msg.AddInt32("attr:type", B_STRING_TYPE);
|
||||
msg.AddBool("attr:viewable", true);
|
||||
msg.AddBool("attr:editable", true);
|
||||
msg.AddInt32("attr:width", 120);
|
||||
msg.AddInt32("attr:alignment", B_ALIGN_LEFT);
|
||||
msg.AddBool("attr:extra", false);
|
||||
|
||||
mime.SetAttrInfo(&msg);
|
||||
}
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------
|
||||
|
||||
TPeopleApp::~TPeopleApp(void)
|
||||
{
|
||||
if (fPrefs)
|
||||
delete fPrefs;
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------
|
||||
|
||||
void TPeopleApp::AboutRequested(void)
|
||||
{
|
||||
(new BAlert("", "...by Robert Polic", "Big Deal"))->Go();
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------
|
||||
|
||||
void TPeopleApp::ArgvReceived(int32 argc, char **argv)
|
||||
{
|
||||
char *arg;
|
||||
int32 index;
|
||||
int32 loop;
|
||||
TPeopleWindow *window = NULL;
|
||||
|
||||
for (loop = 1; loop < argc; loop++) {
|
||||
arg = argv[loop];
|
||||
if (!strncmp(P_NAME, arg, strlen(P_NAME)))
|
||||
index = F_NAME;
|
||||
else if (!strncmp(P_COMPANY, arg, strlen(P_COMPANY)))
|
||||
index = F_COMPANY;
|
||||
else if (!strncmp(P_ADDRESS, arg, strlen(P_ADDRESS)))
|
||||
index = F_ADDRESS;
|
||||
else if (!strncmp(P_CITY, arg, strlen(P_CITY)))
|
||||
index = F_CITY;
|
||||
else if (!strncmp(P_STATE, arg, strlen(P_STATE)))
|
||||
index = F_STATE;
|
||||
else if (!strncmp(P_ZIP, arg, strlen(P_ZIP)))
|
||||
index = F_ZIP;
|
||||
else if (!strncmp(P_COUNTRY, arg, strlen(P_COUNTRY)))
|
||||
index = F_COUNTRY;
|
||||
else if (!strncmp(P_HPHONE, arg, strlen(P_HPHONE)))
|
||||
index = F_HPHONE;
|
||||
else if (!strncmp(P_WPHONE, arg, strlen(P_WPHONE)))
|
||||
index = F_WPHONE;
|
||||
else if (!strncmp(P_FAX, arg, strlen(P_FAX)))
|
||||
index = F_FAX;
|
||||
else if (!strncmp(P_EMAIL, arg, strlen(P_EMAIL)))
|
||||
index = F_EMAIL;
|
||||
else if (!strncmp(P_URL, arg, strlen(P_URL)))
|
||||
index = F_URL;
|
||||
else if (!strncmp(P_GROUP, arg, strlen(P_GROUP)))
|
||||
index = F_GROUP;
|
||||
else if (!strncmp(P_NICKNAME, arg, strlen(P_NICKNAME)))
|
||||
index = F_NICKNAME;
|
||||
else
|
||||
index = F_END;
|
||||
|
||||
if (index != F_END) {
|
||||
if (!window)
|
||||
window = NewWindow();
|
||||
while(*arg != ' ')
|
||||
arg++;
|
||||
arg++;
|
||||
window->SetField(index, arg);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------
|
||||
|
||||
void TPeopleApp::MessageReceived(BMessage *msg)
|
||||
{
|
||||
switch (msg->what) {
|
||||
case M_NEW:
|
||||
NewWindow();
|
||||
break;
|
||||
|
||||
default:
|
||||
BApplication::MessageReceived(msg);
|
||||
}
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------
|
||||
|
||||
void TPeopleApp::RefsReceived(BMessage *msg)
|
||||
{
|
||||
int32 item = 0;
|
||||
BFile file;
|
||||
entry_ref ref;
|
||||
TPeopleWindow *window;
|
||||
|
||||
while (msg->HasRef("refs", item)) {
|
||||
msg->FindRef("refs", item++, &ref);
|
||||
if ((window = FindWindow(ref)))
|
||||
window->Activate(TRUE);
|
||||
else {
|
||||
file.SetTo(&ref, O_RDONLY);
|
||||
if (file.InitCheck() == B_NO_ERROR)
|
||||
NewWindow(&ref);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------
|
||||
|
||||
void TPeopleApp::ReadyToRun(void)
|
||||
{
|
||||
if (!fHaveWindow)
|
||||
NewWindow();
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------
|
||||
|
||||
TPeopleWindow* TPeopleApp::NewWindow(entry_ref *ref)
|
||||
{
|
||||
TPeopleWindow *window;
|
||||
|
||||
window = new TPeopleWindow(fPosition, "New Person", ref);
|
||||
window->Show();
|
||||
fHaveWindow = TRUE;
|
||||
fPosition.OffsetBy(20, 20);
|
||||
|
||||
if (fPosition.bottom > BScreen(B_MAIN_SCREEN_ID).Frame().bottom)
|
||||
fPosition.OffsetTo(fPosition.left, TITLE_BAR_HEIGHT);
|
||||
if (fPosition.right > BScreen(B_MAIN_SCREEN_ID).Frame().right)
|
||||
fPosition.OffsetTo(6, fPosition.top);
|
||||
|
||||
return window;
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------
|
||||
|
||||
TPeopleWindow* TPeopleApp::FindWindow(entry_ref ref)
|
||||
{
|
||||
int32 index = 0;
|
||||
TPeopleWindow *window;
|
||||
|
||||
while ((window = (TPeopleWindow *)WindowAt(index++))) {
|
||||
if ((window->FindView("PeopleView")) && (window->fRef) && (*(window->fRef) == ref))
|
||||
return window;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
@@ -0,0 +1,73 @@
|
||||
//--------------------------------------------------------------------
|
||||
//
|
||||
// PeopleApp.h
|
||||
//
|
||||
// Written by: Robert Polic
|
||||
//
|
||||
//--------------------------------------------------------------------
|
||||
/*
|
||||
Copyright 1999, Be Incorporated. All Rights Reserved.
|
||||
This file may be used under the terms of the Be Sample Code License.
|
||||
*/
|
||||
|
||||
#ifndef PEOPLEAPP_H
|
||||
#define PEOPLEAPP_H
|
||||
|
||||
#define B_PERSON_MIMETYPE "application/x-person"
|
||||
#define APP_SIG "application/x-vnd.Be-PEPL"
|
||||
|
||||
#define P_NAME "META:name"
|
||||
#define P_NICKNAME "META:nickname"
|
||||
#define P_COMPANY "META:company"
|
||||
#define P_ADDRESS "META:address"
|
||||
#define P_CITY "META:city"
|
||||
#define P_STATE "META:state"
|
||||
#define P_ZIP "META:zip"
|
||||
#define P_COUNTRY "META:country"
|
||||
#define P_HPHONE "META:hphone"
|
||||
#define P_WPHONE "META:wphone"
|
||||
#define P_FAX "META:fax"
|
||||
#define P_EMAIL "META:email"
|
||||
#define P_URL "META:url"
|
||||
#define P_GROUP "META:group"
|
||||
|
||||
enum MESSAGES {M_NEW = 128, M_SAVE, M_SAVE_AS, M_REVERT,
|
||||
M_UNDO, M_SELECT, M_GROUP_MENU, M_DIRTY,
|
||||
M_NAME, M_NICKNAME, M_COMPANY, M_ADDRESS,
|
||||
M_CITY, M_STATE, M_ZIP, M_COUNTRY, M_HPHONE,
|
||||
M_WPHONE, M_FAX, M_EMAIL, M_URL, M_GROUP};
|
||||
|
||||
enum FIELDS {F_NAME = 0, F_NICKNAME, F_COMPANY, F_ADDRESS,
|
||||
F_CITY, F_STATE, F_ZIP, F_COUNTRY, F_HPHONE,
|
||||
F_WPHONE, F_FAX, F_EMAIL, F_URL, F_GROUP, F_END};
|
||||
|
||||
class TPeopleWindow;
|
||||
|
||||
|
||||
//====================================================================
|
||||
|
||||
#include <Application.h>
|
||||
|
||||
class TPeopleApp : public BApplication {
|
||||
|
||||
private:
|
||||
|
||||
bool fHaveWindow;
|
||||
BRect fPosition;
|
||||
|
||||
public:
|
||||
|
||||
BFile *fPrefs;
|
||||
|
||||
TPeopleApp(void);
|
||||
~TPeopleApp(void);
|
||||
virtual void AboutRequested(void);
|
||||
virtual void ArgvReceived(int32, char**);
|
||||
virtual void MessageReceived(BMessage*);
|
||||
virtual void RefsReceived(BMessage*);
|
||||
virtual void ReadyToRun(void);
|
||||
TPeopleWindow *FindWindow(entry_ref);
|
||||
TPeopleWindow *NewWindow(entry_ref* = NULL);
|
||||
};
|
||||
|
||||
#endif /* PEOPLEAPP_H */
|
||||
@@ -0,0 +1,538 @@
|
||||
//--------------------------------------------------------------------
|
||||
//
|
||||
// PeopleView.cpp
|
||||
//
|
||||
// Written by: Robert Polic
|
||||
//
|
||||
//--------------------------------------------------------------------
|
||||
/*
|
||||
Copyright 1999, Be Incorporated. All Rights Reserved.
|
||||
This file may be used under the terms of the Be Sample Code License.
|
||||
*/
|
||||
|
||||
#include <fs_attr.h>
|
||||
#include <Window.h>
|
||||
#include <Box.h>
|
||||
#include <MenuField.h>
|
||||
#include <MenuItem.h>
|
||||
#include <PopUpMenu.h>
|
||||
#include <Query.h>
|
||||
#include <VolumeRoster.h>
|
||||
#include <malloc.h>
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#include "PeopleView.h"
|
||||
#include "TTextControl.h"
|
||||
|
||||
//====================================================================
|
||||
|
||||
TPeopleView::TPeopleView(BRect rect, char *title, entry_ref *ref)
|
||||
:BView(rect, title, B_FOLLOW_ALL, B_WILL_DRAW)
|
||||
{
|
||||
if (ref)
|
||||
fFile = new BFile(ref, O_RDWR);
|
||||
else
|
||||
fFile = NULL;
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------
|
||||
|
||||
TPeopleView::~TPeopleView(void)
|
||||
{
|
||||
if (fFile)
|
||||
delete fFile;
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------
|
||||
|
||||
void TPeopleView::AttachedToWindow(void)
|
||||
{
|
||||
char *text;
|
||||
float offset;
|
||||
BBox *box;
|
||||
BFont font = *be_plain_font;
|
||||
BMenuField *field;
|
||||
BRect r;
|
||||
rgb_color c;
|
||||
attr_info info;
|
||||
|
||||
c.red = c.green = c.blue = VIEW_COLOR;
|
||||
SetViewColor(c);
|
||||
|
||||
r = Bounds();
|
||||
r.InsetBy(-1, -1);
|
||||
box = new BBox(r);
|
||||
AddChild(box);
|
||||
|
||||
offset = font.StringWidth(HPHONE_TEXT) + 18;
|
||||
|
||||
text = (char *)malloc(1);
|
||||
text[0] = 0;
|
||||
r.Set(offset - font.StringWidth(NAME_TEXT) - 11, NAME_V,
|
||||
NAME_H + NAME_WIDTH, NAME_V + TEXT_HEIGHT);
|
||||
if (fFile) {
|
||||
if (fFile->GetAttrInfo(P_NAME, &info) == B_NO_ERROR) {
|
||||
text = (char *)realloc(text, info.size);
|
||||
fFile->ReadAttr(P_NAME, B_STRING_TYPE, 0, text, info.size);
|
||||
}
|
||||
}
|
||||
fField[F_NAME] = new TTextControl(r, NAME_TEXT, 256,
|
||||
text, M_DIRTY, M_NAME);
|
||||
fField[F_NAME]->SetTarget(this);
|
||||
box->AddChild(fField[F_NAME]);
|
||||
|
||||
text = (char *)realloc(text, 1);
|
||||
text[0] = 0;
|
||||
r.Set(offset - font.StringWidth(NICKNAME_TEXT) - 11, NICKNAME_V,
|
||||
NICKNAME_H + NICKNAME_WIDTH, NICKNAME_V + TEXT_HEIGHT);
|
||||
if (fFile) {
|
||||
if (fFile->GetAttrInfo(P_NICKNAME, &info) == B_NO_ERROR) {
|
||||
text = (char *)realloc(text, info.size);
|
||||
fFile->ReadAttr(P_NICKNAME, B_STRING_TYPE, 0, text, info.size);
|
||||
}
|
||||
}
|
||||
fField[F_NICKNAME] = new TTextControl(r, NICKNAME_TEXT, 256,
|
||||
text, M_DIRTY, M_NICKNAME);
|
||||
fField[F_NICKNAME]->SetTarget(this);
|
||||
box->AddChild(fField[F_NICKNAME]);
|
||||
|
||||
text = (char *)realloc(text, 1);
|
||||
text[0] = 0;
|
||||
r.Set(offset - font.StringWidth(COMPANY_TEXT) - 11, COMPANY_V,
|
||||
COMPANY_H + COMPANY_WIDTH, COMPANY_V + TEXT_HEIGHT);
|
||||
if (fFile) {
|
||||
if (fFile->GetAttrInfo(P_COMPANY, &info) == B_NO_ERROR) {
|
||||
text = (char *)realloc(text, info.size);
|
||||
fFile->ReadAttr(P_COMPANY, B_STRING_TYPE, 0, text, info.size);
|
||||
}
|
||||
}
|
||||
fField[F_COMPANY] = new TTextControl(r, COMPANY_TEXT, 256,
|
||||
text, M_DIRTY, M_COMPANY);
|
||||
fField[F_COMPANY]->SetTarget(this);
|
||||
box->AddChild(fField[F_COMPANY]);
|
||||
|
||||
text = (char *)realloc(text, 1);
|
||||
text[0] = 0;
|
||||
r.Set(offset - font.StringWidth(ADDRESS_TEXT) - 11, ADDRESS_V,
|
||||
ADDRESS_H + ADDRESS_WIDTH, ADDRESS_V + TEXT_HEIGHT);
|
||||
if (fFile) {
|
||||
if (fFile->GetAttrInfo(P_ADDRESS, &info) == B_NO_ERROR) {
|
||||
text = (char *)realloc(text, info.size);
|
||||
fFile->ReadAttr(P_ADDRESS, B_STRING_TYPE, 0, text, info.size);
|
||||
}
|
||||
}
|
||||
fField[F_ADDRESS] = new TTextControl(r, ADDRESS_TEXT, 256,
|
||||
text, M_DIRTY, M_ADDRESS);
|
||||
fField[F_ADDRESS]->SetTarget(this);
|
||||
box->AddChild(fField[F_ADDRESS]);
|
||||
|
||||
text = (char *)realloc(text, 1);
|
||||
text[0] = 0;
|
||||
r.Set(offset - font.StringWidth(CITY_TEXT) - 11, CITY_V,
|
||||
CITY_H + CITY_WIDTH, CITY_V + TEXT_HEIGHT);
|
||||
if (fFile) {
|
||||
if (fFile->GetAttrInfo(P_CITY, &info) == B_NO_ERROR) {
|
||||
text = (char *)realloc(text, info.size);
|
||||
fFile->ReadAttr(P_CITY, B_STRING_TYPE, 0, text, info.size);
|
||||
}
|
||||
}
|
||||
fField[F_CITY] = new TTextControl(r, CITY_TEXT, 256,
|
||||
text, M_DIRTY, M_CITY);
|
||||
fField[F_CITY]->SetTarget(this);
|
||||
box->AddChild(fField[F_CITY]);
|
||||
|
||||
text = (char *)realloc(text, 1);
|
||||
text[0] = 0;
|
||||
r.Set(offset - font.StringWidth(STATE_TEXT) - 11, STATE_V,
|
||||
STATE_H + STATE_WIDTH, STATE_V + TEXT_HEIGHT);
|
||||
if (fFile) {
|
||||
if (fFile->GetAttrInfo(P_STATE, &info) == B_NO_ERROR) {
|
||||
text = (char *)realloc(text, info.size);
|
||||
fFile->ReadAttr(P_STATE, B_STRING_TYPE, 0, text, info.size);
|
||||
}
|
||||
}
|
||||
fField[F_STATE] = new TTextControl(r, STATE_TEXT, 256,
|
||||
text, M_DIRTY, M_STATE);
|
||||
fField[F_STATE]->SetTarget(this);
|
||||
box->AddChild(fField[F_STATE]);
|
||||
|
||||
text = (char *)realloc(text, 1);
|
||||
text[0] = 0;
|
||||
r.Set(ZIP_H + 11, ZIP_V,
|
||||
ZIP_H + ZIP_WIDTH, ZIP_V + TEXT_HEIGHT);
|
||||
if (fFile) {
|
||||
if (fFile->GetAttrInfo(P_ZIP, &info) == B_NO_ERROR) {
|
||||
text = (char *)realloc(text, info.size);
|
||||
fFile->ReadAttr(P_ZIP, B_STRING_TYPE, 0, text, info.size);
|
||||
}
|
||||
}
|
||||
fField[F_ZIP] = new TTextControl(r, ZIP_TEXT, 256,
|
||||
text, M_DIRTY, M_ZIP);
|
||||
fField[F_ZIP]->SetTarget(this);
|
||||
box->AddChild(fField[F_ZIP]);
|
||||
|
||||
text = (char *)realloc(text, 1);
|
||||
text[0] = 0;
|
||||
r.Set(offset - font.StringWidth(COUNTRY_TEXT) - 11, COUNTRY_V,
|
||||
COUNTRY_H + COUNTRY_WIDTH, COUNTRY_V + TEXT_HEIGHT);
|
||||
if (fFile) {
|
||||
if (fFile->GetAttrInfo(P_COUNTRY, &info) == B_NO_ERROR) {
|
||||
text = (char *)realloc(text, info.size);
|
||||
fFile->ReadAttr(P_COUNTRY, B_STRING_TYPE, 0, text, info.size);
|
||||
}
|
||||
}
|
||||
fField[F_COUNTRY] = new TTextControl(r, COUNTRY_TEXT, 256,
|
||||
text, M_DIRTY, M_COUNTRY);
|
||||
fField[F_COUNTRY]->SetTarget(this);
|
||||
box->AddChild(fField[F_COUNTRY]);
|
||||
|
||||
text = (char *)realloc(text, 1);
|
||||
text[0] = 0;
|
||||
r.Set(offset - font.StringWidth(HPHONE_TEXT) - 11, HPHONE_V,
|
||||
HPHONE_H + HPHONE_WIDTH, HPHONE_V + TEXT_HEIGHT);
|
||||
if (fFile) {
|
||||
if (fFile->GetAttrInfo(P_HPHONE, &info) == B_NO_ERROR) {
|
||||
text = (char *)realloc(text, info.size);
|
||||
fFile->ReadAttr(P_HPHONE, B_STRING_TYPE, 0, text, info.size);
|
||||
}
|
||||
}
|
||||
fField[F_HPHONE] = new TTextControl(r, HPHONE_TEXT, 256,
|
||||
text, M_DIRTY, M_HPHONE);
|
||||
fField[F_HPHONE]->SetTarget(this);
|
||||
box->AddChild(fField[F_HPHONE]);
|
||||
|
||||
text = (char *)realloc(text, 1);
|
||||
text[0] = 0;
|
||||
r.Set(offset - font.StringWidth(WPHONE_TEXT) - 11, WPHONE_V,
|
||||
WPHONE_H + WPHONE_WIDTH, WPHONE_V + TEXT_HEIGHT);
|
||||
if (fFile) {
|
||||
if (fFile->GetAttrInfo(P_WPHONE, &info) == B_NO_ERROR) {
|
||||
text = (char *)realloc(text, info.size);
|
||||
fFile->ReadAttr(P_WPHONE, B_STRING_TYPE, 0, text, info.size);
|
||||
}
|
||||
}
|
||||
fField[F_WPHONE] = new TTextControl(r, WPHONE_TEXT, 256,
|
||||
text, M_DIRTY, M_WPHONE);
|
||||
fField[F_WPHONE]->SetTarget(this);
|
||||
box->AddChild(fField[F_WPHONE]);
|
||||
|
||||
text = (char *)realloc(text, 1);
|
||||
text[0] = 0;
|
||||
r.Set(offset - font.StringWidth(FAX_TEXT) - 11, FAX_V,
|
||||
FAX_H + FAX_WIDTH, FAX_V + TEXT_HEIGHT);
|
||||
if (fFile) {
|
||||
if (fFile->GetAttrInfo(P_FAX, &info) == B_NO_ERROR) {
|
||||
text = (char *)realloc(text, info.size);
|
||||
fFile->ReadAttr(P_FAX, B_STRING_TYPE, 0, text, info.size);
|
||||
}
|
||||
}
|
||||
fField[F_FAX] = new TTextControl(r, FAX_TEXT, 256,
|
||||
text, M_DIRTY, M_FAX);
|
||||
fField[F_FAX]->SetTarget(this);
|
||||
box->AddChild(fField[F_FAX]);
|
||||
|
||||
text = (char *)realloc(text, 1);
|
||||
text[0] = 0;
|
||||
r.Set(offset - font.StringWidth(EMAIL_TEXT) - 11, EMAIL_V,
|
||||
EMAIL_H + EMAIL_WIDTH, EMAIL_V + TEXT_HEIGHT);
|
||||
if (fFile) {
|
||||
if (fFile->GetAttrInfo(P_EMAIL, &info) == B_NO_ERROR) {
|
||||
text = (char *)realloc(text, info.size);
|
||||
fFile->ReadAttr(P_EMAIL, B_STRING_TYPE, 0, text, info.size);
|
||||
}
|
||||
}
|
||||
fField[F_EMAIL] = new TTextControl(r, EMAIL_TEXT, 256,
|
||||
text, M_DIRTY, M_EMAIL);
|
||||
fField[F_EMAIL]->SetTarget(this);
|
||||
box->AddChild(fField[F_EMAIL]);
|
||||
|
||||
text = (char *)realloc(text, 1);
|
||||
text[0] = 0;
|
||||
r.Set(offset - font.StringWidth(URL_TEXT) - 11, URL_V,
|
||||
URL_H + URL_WIDTH, URL_V + TEXT_HEIGHT);
|
||||
if (fFile) {
|
||||
if (fFile->GetAttrInfo(P_URL, &info) == B_NO_ERROR) {
|
||||
text = (char *)realloc(text, info.size);
|
||||
fFile->ReadAttr(P_URL, B_STRING_TYPE, 0, text, info.size);
|
||||
}
|
||||
}
|
||||
fField[F_URL] = new TTextControl(r, URL_TEXT, 256,
|
||||
text, M_DIRTY, M_URL);
|
||||
fField[F_URL]->SetTarget(this);
|
||||
box->AddChild(fField[F_URL]);
|
||||
|
||||
text = (char *)realloc(text, 1);
|
||||
text[0] = 0;
|
||||
r.Set(offset - 11, GROUP_V,
|
||||
GROUP_H + GROUP_WIDTH, GROUP_V + TEXT_HEIGHT);
|
||||
if (fFile) {
|
||||
if (fFile->GetAttrInfo(P_GROUP, &info) == B_NO_ERROR) {
|
||||
text = (char *)realloc(text, info.size);
|
||||
fFile->ReadAttr(P_GROUP, B_STRING_TYPE, 0, text, info.size);
|
||||
}
|
||||
}
|
||||
fField[F_GROUP] = new TTextControl(r, "", 256,
|
||||
text, M_DIRTY, M_GROUP);
|
||||
fField[F_GROUP]->SetTarget(this);
|
||||
box->AddChild(fField[F_GROUP]);
|
||||
free(text);
|
||||
|
||||
r.right = r.left + 3;
|
||||
r.left = r.right - font.StringWidth(GROUP_TEXT) - 20;
|
||||
r.top -= 1;
|
||||
fGroups = new BPopUpMenu("Group");
|
||||
fGroups->SetRadioMode(FALSE);
|
||||
field = new BMenuField(r, "", "", fGroups);
|
||||
field->SetDivider(0.0);
|
||||
field->SetFont(&font);
|
||||
field->SetEnabled(TRUE);
|
||||
box->AddChild(field);
|
||||
|
||||
fField[F_NAME]->MakeFocus();
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------
|
||||
|
||||
void TPeopleView::MessageReceived(BMessage* msg)
|
||||
{
|
||||
int32 loop;
|
||||
BTextView *text;
|
||||
|
||||
switch (msg->what) {
|
||||
case M_SAVE:
|
||||
Save();
|
||||
break;
|
||||
|
||||
case M_REVERT:
|
||||
for (loop = 0; loop < F_END; loop++)
|
||||
fField[loop]->Revert();
|
||||
break;
|
||||
|
||||
case M_SELECT:
|
||||
for (loop = 0; loop < F_END; loop++) {
|
||||
text = (BTextView *)fField[loop]->ChildAt(0);
|
||||
if (text->IsFocus()) {
|
||||
text->Select(0, text->TextLength());
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------
|
||||
|
||||
void TPeopleView::BuildGroupMenu(void)
|
||||
{
|
||||
char *offset;
|
||||
char str[256];
|
||||
char *text;
|
||||
char *text1;
|
||||
int32 count = 0;
|
||||
int32 index;
|
||||
BEntry entry;
|
||||
BFile file;
|
||||
BMessage *msg;
|
||||
BMenuItem *item;
|
||||
BQuery query;
|
||||
BVolume vol;
|
||||
BVolumeRoster volume;
|
||||
attr_info info;
|
||||
|
||||
while ((item = fGroups->ItemAt(0))) {
|
||||
fGroups->RemoveItem(item);
|
||||
delete item;
|
||||
}
|
||||
|
||||
volume.GetBootVolume(&vol);
|
||||
query.SetVolume(&vol);
|
||||
sprintf(str, "%s=*", P_GROUP);
|
||||
query.SetPredicate(str);
|
||||
query.Fetch();
|
||||
|
||||
while (query.GetNextEntry(&entry) == B_NO_ERROR) {
|
||||
file.SetTo(&entry, O_RDONLY);
|
||||
if ((file.InitCheck() == B_NO_ERROR) &&
|
||||
(file.GetAttrInfo(P_GROUP, &info) == B_NO_ERROR) &&
|
||||
(info.size > 1)) {
|
||||
text = (char *)malloc(info.size);
|
||||
text1 = text;
|
||||
file.ReadAttr(P_GROUP, B_STRING_TYPE, 0, text, info.size);
|
||||
while (1) {
|
||||
if ((offset = strstr(text, ",")))
|
||||
*offset = 0;
|
||||
if (!fGroups->FindItem(text)) {
|
||||
index = 0;
|
||||
while ((item = fGroups->ItemAt(index))) {
|
||||
if (strcmp(text, item->Label()) < 0)
|
||||
break;
|
||||
index++;
|
||||
}
|
||||
msg = new BMessage(M_GROUP_MENU);
|
||||
msg->AddString("group", text);
|
||||
fGroups->AddItem(new BMenuItem(text, msg), index);
|
||||
count++;
|
||||
}
|
||||
if (offset) {
|
||||
text = offset + 1;
|
||||
while (*text == ' ')
|
||||
text++;
|
||||
}
|
||||
else
|
||||
break;
|
||||
}
|
||||
free(text1);
|
||||
}
|
||||
}
|
||||
|
||||
if (!count) {
|
||||
fGroups->AddItem(item = new BMenuItem("none", new BMessage(M_GROUP_MENU)));
|
||||
item->SetEnabled(FALSE);
|
||||
}
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------
|
||||
|
||||
bool TPeopleView::CheckSave(void)
|
||||
{
|
||||
int32 loop;
|
||||
|
||||
for (loop = 0; loop < F_END; loop++)
|
||||
if (fField[loop]->Changed())
|
||||
return TRUE;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------
|
||||
|
||||
const char* TPeopleView::GetField(int32 index)
|
||||
{
|
||||
if (index < F_END)
|
||||
return fField[index]->Text();
|
||||
else
|
||||
return NULL;
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------
|
||||
|
||||
void TPeopleView::NewFile(entry_ref *ref)
|
||||
{
|
||||
if (fFile)
|
||||
delete fFile;
|
||||
fFile = new BFile(ref, O_RDWR);
|
||||
Save();
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------
|
||||
|
||||
void TPeopleView::Save(void)
|
||||
{
|
||||
const char *text;
|
||||
|
||||
text = fField[F_NAME]->Text();
|
||||
fFile->WriteAttr(P_NAME, B_STRING_TYPE, 0, text, strlen(text) + 1);
|
||||
fField[F_NAME]->Update();
|
||||
|
||||
text = fField[F_COMPANY]->Text();
|
||||
fFile->WriteAttr(P_COMPANY, B_STRING_TYPE, 0, text, strlen(text) + 1);
|
||||
fField[F_COMPANY]->Update();
|
||||
|
||||
text = fField[F_ADDRESS]->Text();
|
||||
fFile->WriteAttr(P_ADDRESS, B_STRING_TYPE, 0, text, strlen(text) + 1);
|
||||
fField[F_ADDRESS]->Update();
|
||||
|
||||
text = fField[F_CITY]->Text();
|
||||
fFile->WriteAttr(P_CITY, B_STRING_TYPE, 0, text, strlen(text) + 1);
|
||||
fField[F_CITY]->Update();
|
||||
|
||||
text = fField[F_STATE]->Text();
|
||||
fFile->WriteAttr(P_STATE, B_STRING_TYPE, 0, text, strlen(text) + 1);
|
||||
fField[F_STATE]->Update();
|
||||
|
||||
text = fField[F_ZIP]->Text();
|
||||
fFile->WriteAttr(P_ZIP, B_STRING_TYPE, 0, text, strlen(text) + 1);
|
||||
fField[F_ZIP]->Update();
|
||||
|
||||
text = fField[F_COUNTRY]->Text();
|
||||
fFile->WriteAttr(P_COUNTRY, B_STRING_TYPE, 0, text, strlen(text) + 1);
|
||||
fField[F_COUNTRY]->Update();
|
||||
|
||||
text = fField[F_HPHONE]->Text();
|
||||
fFile->WriteAttr(P_HPHONE, B_STRING_TYPE, 0, text, strlen(text) + 1);
|
||||
fField[F_HPHONE]->Update();
|
||||
|
||||
text = fField[F_WPHONE]->Text();
|
||||
fFile->WriteAttr(P_WPHONE, B_STRING_TYPE, 0, text, strlen(text) + 1);
|
||||
fField[F_WPHONE]->Update();
|
||||
|
||||
text = fField[F_FAX]->Text();
|
||||
fFile->WriteAttr(P_FAX, B_STRING_TYPE, 0, text, strlen(text) + 1);
|
||||
fField[F_FAX]->Update();
|
||||
|
||||
text = fField[F_EMAIL]->Text();
|
||||
fFile->WriteAttr(P_EMAIL, B_STRING_TYPE, 0, text, strlen(text) + 1);
|
||||
fField[F_EMAIL]->Update();
|
||||
|
||||
text = fField[F_URL]->Text();
|
||||
fFile->WriteAttr(P_URL, B_STRING_TYPE, 0, text, strlen(text) + 1);
|
||||
fField[F_URL]->Update();
|
||||
|
||||
text = fField[F_GROUP]->Text();
|
||||
fFile->WriteAttr(P_GROUP, B_STRING_TYPE, 0, text, strlen(text) + 1);
|
||||
fField[F_GROUP]->Update();
|
||||
|
||||
text = fField[F_NICKNAME]->Text();
|
||||
fFile->WriteAttr(P_NICKNAME, B_STRING_TYPE, 0, text, strlen(text) + 1);
|
||||
fField[F_NICKNAME]->Update();
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------
|
||||
|
||||
void TPeopleView::SetField(int32 index, char *data, bool update)
|
||||
{
|
||||
int32 end;
|
||||
int32 start;
|
||||
BTextView *text;
|
||||
|
||||
Window()->Lock();
|
||||
if (update) {
|
||||
fField[index]->SetText(data);
|
||||
fField[index]->Update();
|
||||
}
|
||||
else {
|
||||
text = (BTextView *)fField[index]->ChildAt(0);
|
||||
text->GetSelection(&start, &end);
|
||||
if (start != end) {
|
||||
text->Delete();
|
||||
text->Insert(data);
|
||||
}
|
||||
else if ((end = text->TextLength())) {
|
||||
text->Select(end, end);
|
||||
text->Insert(",");
|
||||
text->Insert(data);
|
||||
text->Select(text->TextLength(), text->TextLength());
|
||||
}
|
||||
else
|
||||
fField[index]->SetText(data);
|
||||
}
|
||||
Window()->Unlock();
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------
|
||||
|
||||
bool TPeopleView::TextSelected(void)
|
||||
{
|
||||
int32 end;
|
||||
int32 loop;
|
||||
int32 start;
|
||||
BTextView *text;
|
||||
|
||||
for (loop = 0; loop < F_END; loop++) {
|
||||
text = (BTextView *)fField[loop]->ChildAt(0);
|
||||
text->GetSelection(&start, &end);
|
||||
if (start != end)
|
||||
return TRUE;
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
@@ -0,0 +1,106 @@
|
||||
//--------------------------------------------------------------------
|
||||
//
|
||||
// PeopleView.h
|
||||
//
|
||||
// Written by: Robert Polic
|
||||
//
|
||||
//--------------------------------------------------------------------
|
||||
/*
|
||||
Copyright 1999, Be Incorporated. All Rights Reserved.
|
||||
This file may be used under the terms of the Be Sample Code License.
|
||||
*/
|
||||
|
||||
#ifndef PEOPLEVIEW_H
|
||||
#define PEOPLEVIEW_H
|
||||
|
||||
#include "PeopleApp.h"
|
||||
|
||||
#define TEXT_HEIGHT 16
|
||||
#define NAME_H 10
|
||||
#define NAME_V 10
|
||||
#define NAME_WIDTH 300
|
||||
#define NAME_TEXT "Name"
|
||||
#define NICKNAME_H 10
|
||||
#define NICKNAME_V (NAME_V + 25)
|
||||
#define NICKNAME_WIDTH 300
|
||||
#define NICKNAME_TEXT "Nickname"
|
||||
#define COMPANY_H 10
|
||||
#define COMPANY_V (NICKNAME_V + 25)
|
||||
#define COMPANY_WIDTH 300
|
||||
#define COMPANY_TEXT "Company"
|
||||
#define ADDRESS_H 10
|
||||
#define ADDRESS_V (COMPANY_V + 25)
|
||||
#define ADDRESS_WIDTH 300
|
||||
#define ADDRESS_TEXT "Address"
|
||||
#define CITY_H 10
|
||||
#define CITY_V (ADDRESS_V + 25)
|
||||
#define CITY_WIDTH 300
|
||||
#define CITY_TEXT "City"
|
||||
#define STATE_H 10
|
||||
#define STATE_V (CITY_V + 25)
|
||||
#define STATE_WIDTH 175
|
||||
#define STATE_TEXT "State"
|
||||
#define ZIP_H (STATE_H + STATE_WIDTH)
|
||||
#define ZIP_V (CITY_V + 25)
|
||||
#define ZIP_WIDTH 125
|
||||
#define ZIP_TEXT "Zip"
|
||||
#define COUNTRY_H 10
|
||||
#define COUNTRY_V (ZIP_V + 25)
|
||||
#define COUNTRY_WIDTH 300
|
||||
#define COUNTRY_TEXT "Country"
|
||||
#define HPHONE_H 10
|
||||
#define HPHONE_V (COUNTRY_V + 25)
|
||||
#define HPHONE_WIDTH 300
|
||||
#define HPHONE_TEXT "Home Phone"
|
||||
#define WPHONE_H 10
|
||||
#define WPHONE_V (HPHONE_V + 25)
|
||||
#define WPHONE_WIDTH 300
|
||||
#define WPHONE_TEXT "Work Phone"
|
||||
#define FAX_H 10
|
||||
#define FAX_V (WPHONE_V + 25)
|
||||
#define FAX_WIDTH 300
|
||||
#define FAX_TEXT "Fax"
|
||||
#define EMAIL_H 10
|
||||
#define EMAIL_V (FAX_V + 25)
|
||||
#define EMAIL_WIDTH 300
|
||||
#define EMAIL_TEXT "E-mail"
|
||||
#define URL_H 10
|
||||
#define URL_V (EMAIL_V + 25)
|
||||
#define URL_WIDTH 300
|
||||
#define URL_TEXT "URL"
|
||||
#define GROUP_H 10
|
||||
#define GROUP_V (URL_V + 25)
|
||||
#define GROUP_WIDTH 300
|
||||
#define GROUP_TEXT "Group"
|
||||
|
||||
#define VIEW_COLOR 216
|
||||
|
||||
class TTextControl;
|
||||
|
||||
|
||||
//====================================================================
|
||||
|
||||
class TPeopleView : public BView {
|
||||
|
||||
private:
|
||||
|
||||
BFile *fFile;
|
||||
BPopUpMenu *fGroups;
|
||||
TTextControl *fField[F_END];
|
||||
|
||||
public:
|
||||
|
||||
TPeopleView(BRect, char*, entry_ref*);
|
||||
~TPeopleView(void);
|
||||
virtual void AttachedToWindow(void);
|
||||
virtual void MessageReceived(BMessage*);
|
||||
void BuildGroupMenu(void);
|
||||
bool CheckSave(void);
|
||||
const char* GetField(int32);
|
||||
void NewFile(entry_ref*);
|
||||
void Save(void);
|
||||
void SetField(int32, char*, bool);
|
||||
bool TextSelected(void);
|
||||
};
|
||||
|
||||
#endif /* PEOPLEVIEW_H */
|
||||
@@ -0,0 +1,285 @@
|
||||
//--------------------------------------------------------------------
|
||||
//
|
||||
// PeopleWindow.cpp
|
||||
//
|
||||
// Written by: Robert Polic
|
||||
//
|
||||
//--------------------------------------------------------------------
|
||||
/*
|
||||
Copyright 1999, Be Incorporated. All Rights Reserved.
|
||||
This file may be used under the terms of the Be Sample Code License.
|
||||
*/
|
||||
|
||||
#include <MenuBar.h>
|
||||
#include <MenuItem.h>
|
||||
#include <FilePanel.h>
|
||||
#include <NodeInfo.h>
|
||||
#include <stdio.h>
|
||||
#include <Alert.h>
|
||||
#include <Path.h>
|
||||
#include <FindDirectory.h>
|
||||
#include <Font.h>
|
||||
#include <Clipboard.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "PeopleApp.h"
|
||||
#include "PeopleView.h"
|
||||
#include "PeopleWindow.h"
|
||||
|
||||
//====================================================================
|
||||
|
||||
TPeopleWindow::TPeopleWindow(BRect rect, char *title, entry_ref *ref)
|
||||
:BWindow(rect, title, B_TITLED_WINDOW, B_NOT_RESIZABLE |
|
||||
B_NOT_ZOOMABLE)
|
||||
{
|
||||
BMenu *menu;
|
||||
BMenuBar *menu_bar;
|
||||
BMenuItem *item;
|
||||
BRect r;
|
||||
|
||||
fPanel = NULL;
|
||||
|
||||
r.Set(0, 0, 32767, 15);
|
||||
menu_bar = new BMenuBar(r, "");
|
||||
menu = new BMenu("File");
|
||||
menu->AddItem(item = new BMenuItem("New Person", new BMessage(M_NEW), 'N'));
|
||||
item->SetTarget(NULL, be_app);
|
||||
menu->AddItem(new BMenuItem("Close", new BMessage(B_CLOSE_REQUESTED), 'W'));
|
||||
menu->AddSeparatorItem();
|
||||
menu->AddItem(fSave = new BMenuItem("Save", new BMessage(M_SAVE), 'S'));
|
||||
fSave->SetEnabled(FALSE);
|
||||
menu->AddItem(new BMenuItem("Save As"B_UTF8_ELLIPSIS, new BMessage(M_SAVE_AS)));
|
||||
menu->AddItem(fRevert = new BMenuItem("Revert", new BMessage(M_REVERT), 'R'));
|
||||
fRevert->SetEnabled(FALSE);
|
||||
menu->AddSeparatorItem();
|
||||
menu->AddItem(new BMenuItem("Quit", new BMessage(B_QUIT_REQUESTED), 'Q'));
|
||||
menu_bar->AddItem(menu);
|
||||
|
||||
menu = new BMenu("Edit");
|
||||
menu->AddItem(fUndo = new BMenuItem("Undo", new BMessage(M_UNDO), 'Z'));
|
||||
menu->AddSeparatorItem();
|
||||
menu->AddItem(fCut = new BMenuItem("Cut", new BMessage(B_CUT), 'X'));
|
||||
fCut->SetTarget(NULL, this);
|
||||
menu->AddItem(fCopy = new BMenuItem("Copy", new BMessage(B_COPY), 'C'));
|
||||
fCopy->SetTarget(NULL, this);
|
||||
menu->AddItem(fPaste = new BMenuItem("Paste", new BMessage(B_PASTE), 'V'));
|
||||
fPaste->SetTarget(NULL, this);
|
||||
menu->AddItem(item = new BMenuItem("Select All", new BMessage(M_SELECT), 'A'));
|
||||
item->SetTarget(NULL, this);
|
||||
menu_bar->AddItem(menu);
|
||||
AddChild(menu_bar);
|
||||
|
||||
if (ref) {
|
||||
fRef = new entry_ref(*ref);
|
||||
SetTitle(ref->name);
|
||||
}
|
||||
else
|
||||
fRef = NULL;
|
||||
|
||||
r = Frame();
|
||||
r.OffsetTo(0, menu_bar->Bounds().bottom + 1);
|
||||
fView = new TPeopleView(r, "PeopleView", fRef);
|
||||
|
||||
ResizeBy(0, menu_bar->Bounds().bottom + 1);
|
||||
Lock();
|
||||
AddChild(fView);
|
||||
Unlock();
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------
|
||||
|
||||
TPeopleWindow::~TPeopleWindow(void)
|
||||
{
|
||||
if (fRef)
|
||||
delete fRef;
|
||||
if (fPanel)
|
||||
delete fPanel;
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------
|
||||
|
||||
void TPeopleWindow::MenusBeginning(void)
|
||||
{
|
||||
bool enabled;
|
||||
|
||||
enabled = fView->CheckSave();
|
||||
fSave->SetEnabled(enabled);
|
||||
fRevert->SetEnabled(enabled);
|
||||
|
||||
fUndo->SetEnabled(FALSE);
|
||||
enabled = fView->TextSelected();
|
||||
fCut->SetEnabled(enabled);
|
||||
fCopy->SetEnabled(enabled);
|
||||
|
||||
be_clipboard->Lock();
|
||||
fPaste->SetEnabled(be_clipboard->Data()->HasData("text/plain", B_MIME_TYPE));
|
||||
be_clipboard->Unlock();
|
||||
|
||||
fView->BuildGroupMenu();
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------
|
||||
|
||||
void TPeopleWindow::MessageReceived(BMessage* msg)
|
||||
{
|
||||
char str[256];
|
||||
entry_ref dir;
|
||||
BDirectory directory;
|
||||
BEntry entry;
|
||||
BFile file;
|
||||
BNodeInfo *node;
|
||||
|
||||
switch(msg->what) {
|
||||
case M_SAVE:
|
||||
if (!fRef) {
|
||||
SaveAs();
|
||||
break;
|
||||
}
|
||||
case M_REVERT:
|
||||
case M_SELECT:
|
||||
fView->MessageReceived(msg);
|
||||
break;
|
||||
|
||||
case M_SAVE_AS:
|
||||
SaveAs();
|
||||
break;
|
||||
|
||||
case M_GROUP_MENU:
|
||||
{
|
||||
char *name = NULL;
|
||||
msg->FindString("group", (const char **)&name);
|
||||
fView->SetField(F_GROUP, name, FALSE);
|
||||
break;
|
||||
}
|
||||
case B_SAVE_REQUESTED:
|
||||
if (msg->FindRef("directory", &dir) == B_NO_ERROR) {
|
||||
const char *name = NULL;
|
||||
msg->FindString("name", &name);
|
||||
directory.SetTo(&dir);
|
||||
if (directory.InitCheck() == B_NO_ERROR) {
|
||||
directory.CreateFile(name, &file);
|
||||
if (file.InitCheck() == B_NO_ERROR) {
|
||||
node = new BNodeInfo(&file);
|
||||
node->SetType("application/x-person");
|
||||
delete node;
|
||||
|
||||
directory.FindEntry(name, &entry);
|
||||
entry.GetRef(&dir);
|
||||
if (fRef)
|
||||
delete fRef;
|
||||
fRef = new entry_ref(dir);
|
||||
SetTitle(fRef->name);
|
||||
fView->NewFile(fRef);
|
||||
}
|
||||
else {
|
||||
sprintf(str, "Could not create %s.", name);
|
||||
(new BAlert("", str, "Sorry"))->Go();
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
BWindow::MessageReceived(msg);
|
||||
}
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------
|
||||
|
||||
bool TPeopleWindow::QuitRequested(void)
|
||||
{
|
||||
int32 count = 0;
|
||||
int32 index = 0;
|
||||
BPoint pos;
|
||||
BRect r;
|
||||
status_t result;
|
||||
TPeopleWindow *window;
|
||||
|
||||
if (fView->CheckSave()) {
|
||||
result = (new BAlert("", "Save changes before quitting?",
|
||||
"Cancel", "Quit", "Save"))->Go();
|
||||
if (result == 2) {
|
||||
if (fRef)
|
||||
fView->Save();
|
||||
else {
|
||||
SaveAs();
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
else if (result == 0)
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
while ((window = (TPeopleWindow *)be_app->WindowAt(index++))) {
|
||||
if (window->FindView("PeopleView"))
|
||||
count++;
|
||||
}
|
||||
|
||||
if (count == 1) {
|
||||
r = Frame();
|
||||
pos = r.LeftTop();
|
||||
if (((TPeopleApp*)be_app)->fPrefs) {
|
||||
((TPeopleApp*)be_app)->fPrefs->Seek(0, 0);
|
||||
((TPeopleApp*)be_app)->fPrefs->Write(&pos, sizeof(BPoint));
|
||||
}
|
||||
be_app->PostMessage(B_QUIT_REQUESTED);
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------
|
||||
|
||||
void TPeopleWindow::DefaultName(char *name)
|
||||
{
|
||||
strncpy(name, fView->GetField(F_NAME), B_FILE_NAME_LENGTH);
|
||||
while (*name) {
|
||||
if (*name == '/')
|
||||
*name = '-';
|
||||
name++;
|
||||
}
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------
|
||||
|
||||
void TPeopleWindow::SetField(int32 index, char *text)
|
||||
{
|
||||
fView->SetField(index, text, TRUE);
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------
|
||||
|
||||
void TPeopleWindow::SaveAs(void)
|
||||
{
|
||||
char name[B_FILE_NAME_LENGTH];
|
||||
BDirectory dir;
|
||||
BEntry entry;
|
||||
BMessenger window(this);
|
||||
BPath path;
|
||||
|
||||
DefaultName(name);
|
||||
if (!fPanel) {
|
||||
fPanel = new BFilePanel(B_SAVE_PANEL, &window);
|
||||
fPanel->SetSaveText(name);
|
||||
find_directory(B_USER_DIRECTORY, &path, true);
|
||||
dir.SetTo(path.Path());
|
||||
if (dir.FindEntry("people", &entry) == B_NO_ERROR)
|
||||
fPanel->SetPanelDirectory(&entry);
|
||||
else if (dir.CreateDirectory("people", &dir) == B_NO_ERROR) {
|
||||
dir.GetEntry(&entry);
|
||||
fPanel->SetPanelDirectory(&entry);
|
||||
}
|
||||
}
|
||||
else if (fPanel->Window()->Lock()) {
|
||||
if (!fPanel->Window()->IsHidden())
|
||||
fPanel->Window()->Activate();
|
||||
else
|
||||
fPanel->SetSaveText(name);
|
||||
fPanel->Window()->Unlock();
|
||||
}
|
||||
|
||||
if (fPanel->Window()->Lock()) {
|
||||
if (fPanel->Window()->IsHidden())
|
||||
fPanel->Window()->Show();
|
||||
fPanel->Window()->Unlock();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,54 @@
|
||||
//--------------------------------------------------------------------
|
||||
//
|
||||
// PeopleWindow.h
|
||||
//
|
||||
// Written by: Robert Polic
|
||||
//
|
||||
//--------------------------------------------------------------------
|
||||
/*
|
||||
Copyright 1999, Be Incorporated. All Rights Reserved.
|
||||
This file may be used under the terms of the Be Sample Code License.
|
||||
*/
|
||||
|
||||
#ifndef PEOPLEWINDOW_H
|
||||
#define PEOPLEWINDOW_H
|
||||
|
||||
#define TITLE_BAR_HEIGHT 25
|
||||
#define WIND_WIDTH 321
|
||||
#define WIND_HEIGHT 340
|
||||
|
||||
class TPeopleView;
|
||||
class BFilePanel;
|
||||
class BMenuItem;
|
||||
|
||||
#include <Window.h>
|
||||
//====================================================================
|
||||
|
||||
class TPeopleWindow : public BWindow {
|
||||
|
||||
private:
|
||||
|
||||
BFilePanel *fPanel;
|
||||
BMenuItem *fCopy;
|
||||
BMenuItem *fCut;
|
||||
BMenuItem *fPaste;
|
||||
BMenuItem *fRevert;
|
||||
BMenuItem *fSave;
|
||||
BMenuItem *fUndo;
|
||||
TPeopleView *fView;
|
||||
|
||||
public:
|
||||
|
||||
entry_ref *fRef;
|
||||
|
||||
TPeopleWindow(BRect, char*, entry_ref*);
|
||||
~TPeopleWindow(void);
|
||||
virtual void MenusBeginning(void);
|
||||
virtual void MessageReceived(BMessage*);
|
||||
virtual bool QuitRequested(void);
|
||||
void DefaultName(char*);
|
||||
void SetField(int32, char*);
|
||||
void SaveAs(void);
|
||||
};
|
||||
|
||||
#endif /* PEOPLEWINDOW_H */
|
||||
@@ -0,0 +1,97 @@
|
||||
//--------------------------------------------------------------------
|
||||
//
|
||||
// PersonIcons.h
|
||||
//
|
||||
// Written by: Robert Polic
|
||||
//
|
||||
//--------------------------------------------------------------------
|
||||
/*
|
||||
Copyright 1999, Be Incorporated. All Rights Reserved.
|
||||
This file may be used under the terms of the Be Sample Code License.
|
||||
*/
|
||||
|
||||
const uint8 kLargePersonIcon [] = {
|
||||
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
|
||||
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
|
||||
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
|
||||
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
|
||||
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
|
||||
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
|
||||
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x02,0x02,0x00,0x08,0xff,0xff,
|
||||
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
|
||||
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x04,0x1b,0x18,0x11,0x08,0x02,0xff,
|
||||
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
|
||||
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x04,0x1b,0x3f,0x3f,0x1b,0x15,0x09,0x00,
|
||||
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
|
||||
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x02,0x1b,0x3f,0x3f,0x1b,0x15,0x0b,0x00,
|
||||
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
|
||||
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x04,0x15,0x1c,0x1b,0x18,0x11,0x08,0x00,
|
||||
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
|
||||
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x02,0x08,0x15,0x16,0x15,0x0b,0x08,0x00,
|
||||
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
|
||||
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0xf9,0x00,0x0a,0x0b,0x08,0x0b,0x00,0xff,
|
||||
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
|
||||
0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x3f,0xf9,0x7d,0x00,0x00,0x00,0x00,0x7d,0x00,
|
||||
0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
|
||||
0xff,0xff,0xff,0xff,0xff,0xff,0x00,0xf9,0x3f,0x3f,0x7d,0x7d,0x7d,0x7d,0x7d,0x7d,
|
||||
0xf9,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
|
||||
0xff,0xff,0xff,0xff,0xff,0xff,0x00,0xf9,0xf9,0xf9,0x3f,0x3f,0xf9,0xf9,0xf9,0xf9,
|
||||
0x7d,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
|
||||
0xff,0xff,0xff,0xff,0xff,0xff,0x00,0xf9,0xf9,0xf9,0xf9,0xf9,0x3f,0x3f,0xf9,0x7d,
|
||||
0x7d,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
|
||||
0xff,0xff,0xff,0xff,0xff,0xff,0x00,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x7d,0x7d,
|
||||
0x7d,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
|
||||
0xff,0xff,0xff,0xff,0xff,0xff,0x00,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x7d,0x7d,
|
||||
0x7d,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
|
||||
0xff,0xff,0xff,0xff,0xff,0xff,0x00,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x7d,0x7d,
|
||||
0x7d,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
|
||||
0xff,0xff,0xff,0xff,0xff,0xff,0x00,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x7d,0x7d,
|
||||
0x7d,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
|
||||
0xff,0xff,0xff,0xff,0xff,0xff,0x00,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x7d,0x7d,
|
||||
0x7d,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
|
||||
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x7d,0x7d,
|
||||
0xc5,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
|
||||
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0x7d,0xc5,
|
||||
0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
|
||||
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0xf9,0xf9,0xc5,0xf9,0xf9,0xf9,0xc5,0xc5,
|
||||
0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
|
||||
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0xf9,0xf9,0xc5,0xf9,0xf9,0xc5,0xc5,0x7d,
|
||||
0x00,0x0a,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
|
||||
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0xf9,0xf9,0xc5,0xf9,0xf9,0x7d,0x7d,0x7d,
|
||||
0x00,0x0a,0x0b,0x0a,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
|
||||
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0xf9,0xf9,0xc5,0xf9,0xf9,0x7d,0x7d,0x7d,
|
||||
0x00,0x0a,0x0b,0x0a,0x0b,0x0b,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
|
||||
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0xf9,0xf9,0xc5,0xf9,0xf9,0x7d,0x7d,0x7d,
|
||||
0x00,0x0a,0x0b,0x0a,0x0b,0x0b,0x0a,0x0b,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
|
||||
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0xf9,0xf9,0xc5,0xf9,0xf9,0x7d,0x7d,0x7d,
|
||||
0x00,0x0a,0x0b,0x0a,0x0b,0x0b,0x0a,0x0b,0x0b,0x0a,0xff,0xff,0xff,0xff,0xff,0xff,
|
||||
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0xf9,0xf9,0xc5,0xf9,0xf9,0x7d,0x7d,0x7d,
|
||||
0x00,0x0a,0x0b,0x0a,0x0b,0x0b,0x0a,0x0b,0x0b,0x0a,0xff,0xff,0xff,0xff,0xff,0xff,
|
||||
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0xf9,0xf9,0xc5,0xf9,0xf9,0x7d,0x7d,0x7d,
|
||||
0x00,0x0a,0x0b,0x0a,0x0b,0x0b,0x0a,0x0b,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
|
||||
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0xf9,0xc5,0xf9,0xf9,0x7d,0x7d,0x7d,
|
||||
0x00,0x0a,0x0b,0x0a,0x0b,0x0b,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
|
||||
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0xf9,0xf9,0x7d,0x7d,0x00,
|
||||
0x0a,0x0b,0x0a,0x0b,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
|
||||
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x0a,
|
||||
0x0b,0x0a,0x0b,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff
|
||||
};
|
||||
|
||||
const uint8 kSmallPersonIcon [] = {
|
||||
0xff,0xff,0xff,0xff,0xff,0x02,0x02,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
|
||||
0xff,0xff,0xff,0xff,0x04,0x15,0x1e,0x15,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
|
||||
0xff,0xff,0xff,0xff,0x02,0x1d,0x1e,0x1c,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
|
||||
0xff,0xff,0xff,0xff,0x00,0x15,0x1b,0x16,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
|
||||
0xff,0xff,0xff,0x00,0xfa,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,
|
||||
0xff,0xff,0xff,0x00,0xf9,0xf9,0xfa,0xfa,0xfa,0xfa,0x00,0xff,0xff,0xff,0xff,0xff,
|
||||
0xff,0xff,0xff,0x00,0xf9,0xf9,0xf9,0xf9,0x7d,0x7d,0x00,0xff,0xff,0xff,0xff,0xff,
|
||||
0xff,0xff,0xff,0x00,0xf9,0xf9,0xf9,0xf9,0x7d,0x7d,0x00,0xff,0xff,0xff,0xff,0xff,
|
||||
0xff,0xff,0xff,0x00,0xf9,0xf9,0xf9,0xf9,0x7d,0x7d,0x00,0xff,0xff,0xff,0xff,0xff,
|
||||
0xff,0xff,0xff,0xff,0x00,0xf9,0xf9,0xf9,0x7d,0x7d,0x00,0xff,0xff,0xff,0xff,0xff,
|
||||
0xff,0xff,0xff,0xff,0x00,0xf9,0xf9,0x7d,0x7d,0x00,0xff,0xff,0xff,0xff,0xff,0xff,
|
||||
0xff,0xff,0xff,0xff,0x00,0xf9,0xf9,0x7d,0x7d,0x00,0xff,0xff,0xff,0xff,0xff,0xff,
|
||||
0xff,0xff,0xff,0xff,0x00,0xf9,0xf9,0x7d,0x7d,0x00,0xff,0xff,0xff,0xff,0xff,0xff,
|
||||
0xff,0xff,0xff,0xff,0x00,0xf9,0xf9,0x7d,0x7d,0x00,0x0a,0x0b,0xff,0xff,0xff,0xff,
|
||||
0xff,0xff,0xff,0xff,0x00,0x00,0xf9,0x7d,0x7d,0x00,0x0a,0x0b,0x0a,0xff,0xff,0xff,
|
||||
0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x0a,0x0b,0x0a,0x0b,0xff,0xff,0xff
|
||||
};
|
||||
@@ -0,0 +1,15 @@
|
||||
People -- README
|
||||
|
||||
This directory contains the source code for building
|
||||
the standard People application that ships with BeOS.
|
||||
You can use this application to create Person records,
|
||||
which can be dropped into BeMail headers (see the
|
||||
BeOS User's Guide Chap. 4: Sending Mail) and other
|
||||
applications.
|
||||
|
||||
Ostensibly, this application reveals how the Person
|
||||
record is stored, but it also demonstrates how to
|
||||
use the BeOS file type database in an application.
|
||||
|
||||
Owen Smith <[email protected]>
|
||||
July 1998
|
||||
@@ -0,0 +1,76 @@
|
||||
//--------------------------------------------------------------------
|
||||
//
|
||||
// TTextControl.cpp
|
||||
//
|
||||
// Written by: Robert Polic
|
||||
//
|
||||
//--------------------------------------------------------------------
|
||||
/*
|
||||
Copyright 1999, Be Incorporated. All Rights Reserved.
|
||||
This file may be used under the terms of the Be Sample Code License.
|
||||
*/
|
||||
|
||||
#include <string.h>
|
||||
#include <malloc.h>
|
||||
#include <Font.h>
|
||||
|
||||
#include "TTextControl.h"
|
||||
|
||||
//====================================================================
|
||||
|
||||
TTextControl::TTextControl(BRect r, char *label, int32 length,
|
||||
char *text, int32 mod_msg, int32 msg)
|
||||
:BTextControl(r, "", label, text, new BMessage(msg))
|
||||
{
|
||||
SetModificationMessage(new BMessage(mod_msg));
|
||||
|
||||
fLabel = (char *)malloc(strlen(label) + 1);
|
||||
strcpy(fLabel, label);
|
||||
fOriginal = (char *)malloc(strlen(text) + 1);
|
||||
strcpy(fOriginal, text);
|
||||
fLength = length;
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------
|
||||
|
||||
TTextControl::~TTextControl(void)
|
||||
{
|
||||
free(fLabel);
|
||||
free(fOriginal);
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------
|
||||
|
||||
void TTextControl::AttachedToWindow(void)
|
||||
{
|
||||
BTextView *text;
|
||||
|
||||
BTextControl::AttachedToWindow();
|
||||
|
||||
SetDivider(StringWidth(fLabel) + 7);
|
||||
text = (BTextView *)ChildAt(0);
|
||||
text->SetMaxBytes(fLength - 1);
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------
|
||||
|
||||
bool TTextControl::Changed(void)
|
||||
{
|
||||
return strcmp(fOriginal, Text());
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------
|
||||
|
||||
void TTextControl::Revert(void)
|
||||
{
|
||||
if (Changed())
|
||||
SetText(fOriginal);
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------
|
||||
|
||||
void TTextControl::Update(void)
|
||||
{
|
||||
fOriginal = (char *)realloc(fOriginal, strlen(Text()) + 1);
|
||||
strcpy(fOriginal, Text());
|
||||
}
|
||||
@@ -0,0 +1,36 @@
|
||||
//--------------------------------------------------------------------
|
||||
//
|
||||
// TextControl.h
|
||||
//
|
||||
// Written by: Robert Polic
|
||||
//
|
||||
//--------------------------------------------------------------------
|
||||
/*
|
||||
Copyright 1999, Be Incorporated. All Rights Reserved.
|
||||
This file may be used under the terms of the Be Sample Code License.
|
||||
*/
|
||||
|
||||
#ifndef TEXTCONTROL_H
|
||||
#define TEXTCONTROL_H
|
||||
|
||||
#include <TextControl.h>
|
||||
|
||||
class TTextControl : public BTextControl {
|
||||
|
||||
private:
|
||||
|
||||
char *fLabel;
|
||||
char *fOriginal;
|
||||
int32 fLength;
|
||||
|
||||
public:
|
||||
|
||||
TTextControl(BRect, char*, int32, char*, int32, int32);
|
||||
~TTextControl(void);
|
||||
virtual void AttachedToWindow(void);
|
||||
bool Changed(void);
|
||||
void Revert(void);
|
||||
void Update(void);
|
||||
};
|
||||
|
||||
#endif /* TEXTCONTROL_H */
|
||||
@@ -0,0 +1,24 @@
|
||||
//--------------------------------------------------------------------
|
||||
//
|
||||
// main.cpp
|
||||
//
|
||||
// Written by: Robert Polic
|
||||
//
|
||||
//--------------------------------------------------------------------
|
||||
/*
|
||||
Copyright 1999, Be Incorporated. All Rights Reserved.
|
||||
This file may be used under the terms of the Be Sample Code License.
|
||||
*/
|
||||
|
||||
#include "PeopleApp.h"
|
||||
|
||||
int main(void)
|
||||
{
|
||||
TPeopleApp *app;
|
||||
|
||||
app = new TPeopleApp();
|
||||
app->Run();
|
||||
|
||||
delete app;
|
||||
return B_NO_ERROR;
|
||||
}
|
||||
Reference in New Issue
Block a user