home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The World of Computer Software
/
World_Of_Computer_Software-02-385-Vol-1of3.iso
/
g
/
gina15.zip
/
demos
/
addr.C
< prev
next >
Wrap
C/C++ Source or Header
|
1992-02-27
|
14KB
|
502 lines
/* @(#)addr.C 1.8 7/29/91 */
#include <Gina/Gina.h>
#ifdef INCLUDE_SRC
#include "Gina.C"
#include "AddressView.C"
#endif
#include "KeySortCltn.h"
#include "ArrayOb.h"
#include "Assoc.h"
#include "OIOnih.h"
#include "Integer.h"
#include "Address.h"
#include "AddressView.h"
class AddressesApplication : public GnApplication {
public:
GnDocument *create_document ();
char * app_class () { return "Addresses" ; }
char * app_signature() { return "addresses" ; }
char * app_file_type() { return ".addresses" ; }
};
class AddressesDocument : public GnDocument {
public:
AddressesDocument();
virtual void create_windows(int new_width = 0, int new_height = 0);
virtual void wipe_out();
// Methods
void AddAddress(Address *);
void RemoveAddress(Address *);
void UpdatePosition(Address *);
void InitializeCollections();
// Callbacks (Menu Bar)
void DumpAddresses(caddr_t);
void AddOwnAddress(caddr_t);
void AddHundred(caddr_t);
void ListSorted(caddr_t);
// Callbacks (AddressView)
void AddFromView(caddr_t);
// Callbacks (Panel)
void ModeChanged(caddr_t);
void SortChanged(caddr_t);
void MoveNext(caddr_t);
void MovePrevious(caddr_t);
protected:
void UpdateButtons();
// Document IO
virtual Boolean write_to_stream ( ostream & );
virtual Boolean read_from_stream ( istream & );
// Data structures for the addresses
KeySortCltn *sort_by_name;
KeySortCltn *sort_by_city;
KeySortCltn *sort_by_street;
KeySortCltn *all_addresses;
KeySortCltn *current_collection;
ArrayOb *all_collections; // Needed for efficient Save/Restore
int current_position;
// Widgets
AddressView address_view;
GnRowColumn panel;
GnRadioButtonGroup mode_group;
GnRadioButtonGroup sort_group;
GnPushButton go_next;
GnPushButton go_previous;
GnScrollBar db_scroller;
// Items
GnWidgetItem *mode_item_add;
GnWidgetItem *mode_item_change;
GnWidgetItem *mode_item_browse;
GnWidgetItem *sort_item_unsorted;
GnWidgetItem *sort_item_name;
GnWidgetItem *sort_item_city;
GnWidgetItem *sort_item_street;
// Modes
GnWidgetItem *view_mode;
};
//---------------------------------------------------------------------
GnDocument *AddressesApplication ::
create_document ()
{
return new AddressesDocument;
}
AddressesDocument::AddressesDocument()
{
all_collections = new ArrayOb(5);
(*all_collections)[0] = new KeySortCltn;
(*all_collections)[1] = new KeySortCltn;
(*all_collections)[2] = new KeySortCltn;
(*all_collections)[3] = new KeySortCltn;
(*all_collections)[4] = (*all_collections)[3];
InitializeCollections();
}
void AddressesDocument::
InitializeCollections()
{
sort_by_name = (KeySortCltn *)(*all_collections)[0];
sort_by_city = (KeySortCltn *)(*all_collections)[1];
sort_by_street = (KeySortCltn *)(*all_collections)[2];
all_addresses = (KeySortCltn *)(*all_collections)[3];
current_collection = (KeySortCltn *)(*all_collections)[4];
current_position = current_collection->size() > 0 ? 0 : -1;
}
void AddressesDocument ::
create_windows(int new_width, int new_height)
{
main_shell = new GnDocumentShell( this, new_width, new_height);
main_shell->create(GnApplication::get()->get_application_shell(), "shell");
main_shell->add_menu_command("Testing", "Dump (cout)",
CALLBACK(AddressesDocument, DumpAddresses,
this));
main_shell->add_menu_command("Testing", "Add own address",
CALLBACK(AddressesDocument, AddOwnAddress,
this));
main_shell->add_menu_command("Testing", "Add 100 address",
CALLBACK(AddressesDocument, AddHundred,
this));
main_shell->add_menu_command("Testing", "List (sorted)",
CALLBACK(AddressesDocument, ListSorted,
this));
GnForm *main_form = new GnForm;
main_form->create(main_shell, "mainForm");
address_view.setR_leftAttachment(XmATTACH_FORM);
address_view.setR_topAttachment(XmATTACH_FORM);
address_view.setR_editable(True);
address_view.create(main_form, "addressView");
address_view.add_value_changed_callback(CALLBACK(AddressesDocument,
AddFromView, this));
GnSeparator *form_separator = new GnSeparator;
form_separator->setR_orientation(XmVERTICAL);
form_separator->setR_topAttachment(XmATTACH_FORM);
form_separator->setR_bottomAttachment(XmATTACH_FORM);
form_separator->setR_leftAttachment(XmATTACH_WIDGET);
form_separator->setR_leftWidget(&address_view);
form_separator->create(main_form, "formSeparator");
panel.setR_topAttachment(XmATTACH_FORM);
panel.setR_leftAttachment(XmATTACH_WIDGET);
panel.setR_leftWidget(form_separator);
panel.create(main_form, "panel");
mode_item_add = new GnWidgetItem(GnXMSTRING_LTOR("Add"), True);
mode_item_change = new GnWidgetItem(GnXMSTRING_LTOR("Change"));
mode_item_browse = new GnWidgetItem(GnXMSTRING_LTOR("Browse"));
mode_group.add(mode_item_add);
mode_group.add(mode_item_change);
mode_group.add(mode_item_browse);
mode_group.setR_orientation(XmVERTICAL);
mode_group.create(&panel, "modeGroup");
mode_group.add_selectionCallback(CALLBACK(AddressesDocument,
ModeChanged, this));
view_mode = mode_item_add;
GnSeparator *sep1 = new GnSeparator;
sep1->setR_orientation(XmHORIZONTAL);
sep1->create(&panel, "sep1");
sort_item_unsorted = new GnWidgetItem(GnXMSTRING_LTOR("Unsorted"));
sort_item_name = new GnWidgetItem(GnXMSTRING_LTOR("Sort by Name"));
sort_item_city = new GnWidgetItem(GnXMSTRING_LTOR("Sort by City"));
sort_item_street = new GnWidgetItem(GnXMSTRING_LTOR("Sort by Street"));
sort_group.add(sort_item_unsorted);
sort_group.add(sort_item_name);
sort_group.add(sort_item_city);
sort_group.add(sort_item_street);
sort_group.setR_orientation(XmVERTICAL);
sort_group.create(&panel, "sortGroup");
sort_group.add_selectionCallback(CALLBACK(AddressesDocument,
SortChanged, this));
GnSeparator *sep2 = new GnSeparator;
sep2->setR_orientation(XmHORIZONTAL);
sep2->create(&panel, "sep2");
go_previous.setR_labelString("Previous");
go_previous.setR_alignment(XmALIGNMENT_CENTER);
go_previous.create(&panel, "goPrevious");
go_previous.add_activateCallback(CALLBACK(AddressesDocument,
MovePrevious, this));
go_next.setR_labelString("Next");
go_next.setR_alignment(XmALIGNMENT_CENTER);
go_next.create(&panel, "goNext");
go_next.add_activateCallback(CALLBACK(AddressesDocument,
MoveNext, this));
db_scroller.setR_orientation(XmHORIZONTAL);
db_scroller.setR_minimum(0);
db_scroller.setR_maximum(1);
db_scroller.setR_sliderSize(1);
db_scroller.setR_value(0);
db_scroller.create(&panel, "dbScroller");
UpdateButtons();
}
void AddressesDocument::
AddAddress(Address *a)
{
Object *i_key = a->KeyNumber();
Object *n_key = a->LastName();
Object *c_key = a->CityCode();
Object *s_key = a->Street();
all_addresses->addAssoc(*i_key, *a);
sort_by_name->addAssoc(*n_key, *a);
sort_by_city->addAssoc(*c_key, *a);
sort_by_street->addAssoc(*s_key, *a);
UpdatePosition(a);
UpdateButtons();
set_modified(True);
}
void AddressesDocument::
RemoveAddress(Address *a)
{
}
void AddressesDocument::
UpdatePosition(Address *a)
{
if( current_collection == all_addresses )
current_position = current_collection->findIndexOf(*a->KeyNumber());
else
if( current_collection == sort_by_name )
current_position = current_collection->findIndexOf(*a->LastName());
else
if( current_collection == sort_by_city )
current_position = current_collection->findIndexOf(*a->City());
else
if( current_collection == sort_by_street )
current_position =
current_collection->findIndexOf(*a->Street());
else
Ensure(False);
}
void AddressesDocument::
UpdateButtons()
{
if( view_mode == mode_item_browse || view_mode == mode_item_change ) {
go_previous.setR_sensitive(current_position <= 0 ? False : True);
if(current_position == (current_collection->size() - 1))
go_next.setR_sensitive(False);
else
go_next.setR_sensitive(True);
} else {
go_previous.setR_sensitive(False);
go_next.setR_sensitive(False);
}
go_next.SetValues();
go_previous.SetValues();
db_scroller.setR_maximum(MAX((int)current_collection->size(), (int)1));
db_scroller.setR_value(current_position == -1 ? 0 : current_position);
db_scroller.SetValues();
}
void AddressesDocument::
ModeChanged(caddr_t call_data)
{
GnWidgetItemListIterator *it = (GnWidgetItemListIterator *)call_data;
Require((void *)it->item()->Value() == (void *)it->item());
GnWidgetItem *new_view_mode = it->item();
if( view_mode != new_view_mode ) {
if( new_view_mode == mode_item_browse ) {
if( view_mode == mode_item_add &&
current_collection->size() > 0 ) {
address_view.Show((Address *)current_collection
->valueAt(current_position));
}
address_view.setR_editable(False);
address_view.SetValues();
}
if( new_view_mode == mode_item_change ) {
if( view_mode == mode_item_add &&
current_collection->size() > 0 ) {
address_view.Show((Address *)current_collection
->valueAt(current_position));
}
address_view.setR_editable(True);
address_view.SetValues();
}
if( new_view_mode == mode_item_add ) {
address_view.Show(0);
address_view.setR_editable(True);
address_view.SetValues();
}
view_mode = new_view_mode;
UpdateButtons();
}
}
void AddressesDocument::
SortChanged(caddr_t call_data)
{
GnWidgetItemListIterator *it = (GnWidgetItemListIterator *)call_data;
Require((void *)it->item()->Value() == (void *)it->item());
GnWidgetItem *sel = it->item();
Address *obj_at;
// Take care if sort mode is changed when the database is empty
if( current_position >= 0 )
obj_at = (Address *)current_collection->valueAt(current_position);
// Find the new current collection
if( sel == sort_item_unsorted ) {
current_collection = all_addresses;
} else {
if( sel == sort_item_name ) {
current_collection = sort_by_name;
} else {
if( sel == sort_item_city ) {
current_collection = sort_by_city;
} else {
if( sel == sort_item_street ) {
current_collection = sort_by_street;
} else {
Ensure(False);
}
}
}
}
(*all_collections)[4] = current_collection;
if( current_position >= 0 )
UpdatePosition(obj_at);
UpdateButtons();
}
void AddressesDocument::
MoveNext(caddr_t)
{
current_position++;
address_view.Show((Address *)current_collection->valueAt(current_position));
UpdateButtons();
}
void AddressesDocument::
MovePrevious(caddr_t)
{
current_position--;
address_view.Show((Address *)current_collection->valueAt(current_position));
UpdateButtons();
}
void AddressesDocument::
DumpAddresses(caddr_t)
{
all_collections->dumpOn(cout);
cout.flush();
}
void AddressesDocument::
AddOwnAddress(caddr_t)
{
if( view_mode == mode_item_add ) {
Address *a = new Address(new String("Baecker"), new String("Andreas"),
new String("Goethealle"), new String("64"),
new String("Germany"), new String("5300"),
new String("Bonn"), new String("3"),
new String("+49-0228-460901"),
new String("baecker@gmdzi.gmd.de"),
new Date(), new Date(),
new Integer(current_collection->size()),
False);
Address *b = new Address(new String("Hornef"),
new String("Beatrix Mechthild Maria"),
new String("Saynstrasse"), new String("3"),
new String("Germany"), new String("5300"),
new String("Bonn"), new String("3"),
new String("+49-0228-484299"),
new String("bea@gmdzi.gmd.de"),
new Date(), new Date(),
new Integer(current_collection->size()),
False);
AddAddress(b);
AddAddress(a);
}
}
void AddressesDocument::
AddHundred(caddr_t)
{
if( view_mode == mode_item_add )
for( int i = 0; i < 50; i++)
AddOwnAddress((caddr_t) 0);
}
void AddressesDocument::
ListSorted(caddr_t)
{
Iterator it(*current_collection);
while( it++ ) {
((Assoc *)it())->value()->dumpOn(cout);
cout.flush();
}
}
void AddressesDocument::
AddFromView(caddr_t call_data)
{
Address *a = (Address *)call_data;
if( view_mode == mode_item_change ) {
// Remove address at current Position
RemoveAddress((Address *)current_collection->valueAt(current_position));
}
AddAddress(a);
if(view_mode == mode_item_add)
address_view.Show(0);
}
void AddressesDocument::
wipe_out()
{
}
Boolean AddressesDocument ::
write_to_stream( ostream &ofs )
{
all_collections->storeOn(OIOnihout(ofs));
return True;
}
Boolean AddressesDocument ::
read_from_stream ( istream &ifs )
{
delete sort_by_name;
delete sort_by_city;
delete sort_by_street;
delete all_addresses;
delete all_collections;
all_collections = ArrayOb::readFrom(OIOnihin(ifs));
InitializeCollections();
//all_collections->dumpOn(cout);
cout.flush();
if(current_collection->size() > 0) {
mode_item_browse->Selected(True);
view_mode = mode_item_browse;
address_view.setR_editable(False);
address_view.SetValues();
//current_collection->valueAt(current_position)->dumpOn(cout);
//cout.flush();
address_view.Show((Address *)current_collection->valueAt(current_position));
}
UpdateButtons();
return ifs.fail() ? False : True;
}
int main (unsigned int argc, char ** argv)
{
AddressesApplication aa;
aa.run ( argc, argv );
}