home *** CD-ROM | disk | FTP | other *** search
/ Power GUI Programming with VisualAge C++ / powergui.iso / trialva / ibmcppw / samples / visbuild / oasearch / contrctr.cpv < prev    next >
Encoding:
Text File  |  1996-02-20  |  16.3 KB  |  530 lines

  1. /******************************************************************************
  2. * .FILE:        contrctr.cpv                                                  *
  3. *                                                                             *
  4. * .DESCRIPTION: Implementation of additional member functions for the class   *
  5. *               OAContractor                                                  *
  6. *                                                                             *
  7. * .CLASSES:                                                                   *
  8. *                                                                             *
  9. * .COPYRIGHT:                                                                 *
  10. *    Licensed Material - Program-Property of IBM                              *
  11. *    (C) Copyright IBM Corp. 1992, 1995, 1996 - All Rights Reserved           *
  12. *                                                                             *
  13. * .DISCLAIMER:                                                                *
  14. *   The following [enclosed] code is sample code created by IBM               *
  15. *   Corporation.  This sample code is not part of any standard IBM product    *
  16. *   and is provided to you solely for the purpose of assisting you in the     *
  17. *   development of your applications.  The code is provided 'AS IS',          *
  18. *   without warranty of any kind.  IBM shall not be liable for any damages    *
  19. *   arising out of your use of the sample code, even if they have been        *
  20. *   advised of the possibility of such damages.                               *
  21. *                                                                             *
  22. * .NOTE: WE RECOMMEND USING A FIXED SPACE FONT TO LOOK AT THE SOURCE          *
  23. *                                                                             *
  24. ******************************************************************************/
  25. // Default Part Code Generation begins here...
  26. INotificationId OAContractor::contractorIDId = "OAContractor::contractorID";
  27. INotificationId OAContractor::lastNameId = "OAContractor::lastName";
  28. INotificationId OAContractor::firstNameId = "OAContractor::firstName";
  29. INotificationId OAContractor::middleInitialId = "OAContractor::middleInitial";
  30. INotificationId OAContractor::homeStreetId = "OAContractor::homeStreet";
  31. INotificationId OAContractor::homeCityId = "OAContractor::homeCity";
  32. INotificationId OAContractor::homeStateId = "OAContractor::homeState";
  33. INotificationId OAContractor::homeZipId = "OAContractor::homeZip";
  34. INotificationId OAContractor::phoneNumberId = "OAContractor::phoneNumber";
  35. INotificationId OAContractor::startDateId = "OAContractor::startDate";
  36. INotificationId OAContractor::endDateId = "OAContractor::endDate";
  37. INotificationId OAContractor::activeStatusId = "OAContractor::activeStatus";
  38. INotificationId OAContractor::currentContractId = "OAContractor::currentContract";
  39. INotificationId OAContractor::IDvalidId = "OAContractor::IDvalid";
  40.  
  41. // Added after OS2 GA
  42. INotificationId OAContractor::qryFoundId = "OAContractor::qryFound";
  43.  
  44. IString OAContractor::contractorID() const
  45. {
  46.   return iContractorID;
  47. }
  48.  
  49. OAContractor & OAContractor::setContractorID()
  50. {
  51.   IString tempString = iFirstName+iMiddleInitial+iLastName;
  52.   if (iContractorID != tempString)
  53.   {
  54.     iContractorID = tempString;
  55.     notifyObservers(INotificationEvent(OAContractor::contractorIDId, *this));
  56.  
  57. //  Test for string with nontrivial content;  needed for clear() call
  58.     if (iContractorID.length() > 5)
  59.        enableIDvalid(true);
  60.  
  61.   } // endif
  62.  
  63.   return *this;
  64. }
  65.  
  66. IString OAContractor::lastName() const
  67. {
  68.   return iLastName;
  69. }
  70.  
  71. OAContractor & OAContractor::setLastName(const IString & aLastName)
  72. {
  73.   if (iLastName != aLastName)
  74.   {
  75.     iLastName = aLastName;
  76.     notifyObservers(INotificationEvent(OAContractor::lastNameId, *this));
  77.     enableIDvalid(false);
  78.  
  79.   } // endif
  80.   return *this;
  81. }
  82.  
  83. IString OAContractor::firstName() const
  84. {
  85.   return iFirstName;
  86. }
  87.  
  88. OAContractor & OAContractor::setFirstName(const IString & aFirstName)
  89. {
  90.   if (iFirstName != aFirstName)
  91.   {
  92.     iFirstName = aFirstName;
  93.     notifyObservers(INotificationEvent(OAContractor::firstNameId, *this));
  94.     enableIDvalid(false);
  95.  
  96.   } // endif
  97.   return *this;
  98. }
  99.  
  100. IString OAContractor::middleInitial() const
  101. {
  102.   return iMiddleInitial;
  103. }
  104.  
  105. OAContractor & OAContractor::setMiddleInitial(const IString & aMiddleInitial)
  106. {
  107.   if (iMiddleInitial != aMiddleInitial)
  108.   {
  109.     iMiddleInitial = aMiddleInitial;
  110.     notifyObservers(INotificationEvent(OAContractor::middleInitialId, *this));
  111.     enableIDvalid(false);
  112.  
  113.   } // endif
  114.  
  115.   return *this;
  116. }
  117.  
  118. IString OAContractor::homeStreet() const
  119. {
  120.   return iHomeStreet;
  121. }
  122.  
  123. OAContractor & OAContractor::setHomeStreet(const IString & aHomeStreet)
  124. {
  125.   if (iHomeStreet != aHomeStreet)
  126.   {
  127.     iHomeStreet = aHomeStreet;
  128.     notifyObservers(INotificationEvent(OAContractor::homeStreetId, *this));
  129.   } // endif
  130.   return *this;
  131. }
  132.  
  133. IString OAContractor::homeCity() const
  134. {
  135.   return iHomeCity;
  136. }
  137.  
  138. OAContractor & OAContractor::setHomeCity(const IString & aHomeCity)
  139. {
  140.   if (iHomeCity != aHomeCity)
  141.   {
  142.     iHomeCity = aHomeCity;
  143.     notifyObservers(INotificationEvent(OAContractor::homeCityId, *this));
  144.   } // endif
  145.   return *this;
  146. }
  147.  
  148. IString OAContractor::homeState() const
  149. {
  150.   return iHomeState;
  151. }
  152.  
  153. OAContractor & OAContractor::setHomeState(const IString & aHomeState)
  154. {
  155.   if (iHomeState != aHomeState)
  156.   {
  157.     iHomeState = aHomeState;
  158.     notifyObservers(INotificationEvent(OAContractor::homeStateId, *this));
  159.   } // endif
  160.   return *this;
  161. }
  162.  
  163. IString OAContractor::homeZip() const
  164. {
  165.   return iHomeZip;
  166. }
  167.  
  168. OAContractor & OAContractor::setHomeZip(const IString & aHomeZip)
  169. {
  170.   if (iHomeZip != aHomeZip)
  171.   {
  172.     iHomeZip = aHomeZip;
  173.     notifyObservers(INotificationEvent(OAContractor::homeZipId, *this));
  174.   } // endif
  175.   return *this;
  176. }
  177.  
  178. IString OAContractor::phoneNumber() const
  179. {
  180.   return iPhoneNumber;
  181. }
  182.  
  183. OAContractor & OAContractor::setPhoneNumber(const IString & aPhoneNumber)
  184. {
  185.   if (iPhoneNumber != aPhoneNumber)
  186.   {
  187.     iPhoneNumber = aPhoneNumber;
  188.     notifyObservers(INotificationEvent(OAContractor::phoneNumberId, *this));
  189.   } // endif
  190.   return *this;
  191. }
  192.  
  193. IString OAContractor::startDate() const
  194. {
  195.   return iStartDate;
  196. }
  197.  
  198. OAContractor & OAContractor::setStartDate(const IString & aStartDate)
  199. {
  200.   if (iStartDate != aStartDate)
  201.   {
  202.     iStartDate = aStartDate;
  203.     notifyObservers(INotificationEvent(OAContractor::startDateId, *this));
  204.   } // endif
  205.   return *this;
  206. }
  207.  
  208. IString OAContractor::endDate() const
  209. {
  210.   return iEndDate;
  211. }
  212.  
  213. OAContractor & OAContractor::setEndDate(const IString & aEndDate)
  214. {
  215.   if (iEndDate != aEndDate)
  216.   {
  217.     iEndDate = aEndDate;
  218.     notifyObservers(INotificationEvent(OAContractor::endDateId, *this));
  219.   } // endif
  220.   return *this;
  221. }
  222.  
  223. Boolean OAContractor::isActiveStatus() const
  224. {
  225.   return iActiveStatus;
  226. }
  227.  
  228. OAContractor & OAContractor::enableActiveStatus(const Boolean enable)
  229. {
  230.   if (iActiveStatus != enable)
  231.   {
  232.     iActiveStatus = enable;
  233.     notifyObservers(INotificationEvent(OAContractor::activeStatusId, *this));
  234.   } // endif
  235.   return *this;
  236. }
  237.  
  238. // Start boolean string enabler
  239.  
  240. OAContractor & OAContractor::enableActiveStatus(const IString & status)
  241. {
  242.   Boolean tempBoolean = iActiveStatus;
  243.   if (status == "yes") iActiveStatus = true;
  244.   if (status == "no") iActiveStatus = false;
  245.   if (tempBoolean != iActiveStatus)
  246.   {
  247.     notifyObservers(INotificationEvent(OAContractor::activeStatusId, *this));
  248.   }
  249.  
  250.   return *this;
  251. }
  252.  
  253. // End boolean string enabler
  254.  
  255. IString OAContractor::currentContract() const
  256. {
  257.   return iCurrentContract;
  258. }
  259.  
  260. OAContractor & OAContractor::setCurrentContract(const IString & aCurrentContract)
  261. {
  262.   if (iCurrentContract != aCurrentContract)
  263.   {
  264.     iCurrentContract = aCurrentContract;
  265.     notifyObservers(INotificationEvent(OAContractor::currentContractId, *this));
  266.   } // endif
  267.   return *this;
  268. }
  269.  
  270. // Default Part Code Generation ends here.
  271.  
  272. OAContractor & OAContractor::getContractor()
  273. {
  274.  
  275. // Start data access code
  276.  
  277.   IProfile *p = new IProfile("contrctr.ini");
  278.  
  279. // Needed for Windows implementation
  280.  
  281.    primeData(*p);
  282.  
  283. // Refresh the value of contractor ID if not already done
  284.  
  285.    if (!isIDvalid())
  286.       setContractorID();
  287.  
  288. // Check for this contractor ID in the profile collection
  289.  
  290.   if (!p->containsKeyName("contractorID", iContractorID))
  291.   {
  292.   delete p;
  293.   throw IException("A record was not found for this contractor.");
  294.   return *this;
  295.   }
  296.  
  297. // If other data exists for this contractor,
  298. // set the corresponding contractor attributes
  299.  
  300.   if (p->containsKeyName("lastName", iContractorID))
  301.     setLastName(p->elementWithKey("lastName", iContractorID));
  302.   if (p->containsKeyName("firstName", iContractorID))
  303.     setFirstName(p->elementWithKey("firstName", iContractorID));
  304.   if (p->containsKeyName("middleInitial", iContractorID))
  305.     setMiddleInitial(p->elementWithKey("middleInitial", iContractorID));
  306.   if (p->containsKeyName("homeStreet", iContractorID))
  307.     setHomeStreet(p->elementWithKey("homeStreet", iContractorID));
  308.   if (p->containsKeyName("homeCity", iContractorID))
  309.     setHomeCity(p->elementWithKey("homeCity", iContractorID));
  310.   if (p->containsKeyName("homeState", iContractorID))
  311.     setHomeState(p->elementWithKey("homeState", iContractorID));
  312.   if (p->containsKeyName("homeZip", iContractorID))
  313.     setHomeZip(p->elementWithKey("homeZip", iContractorID));
  314.   if (p->containsKeyName("phoneNumber", iContractorID))
  315.     setPhoneNumber(p->elementWithKey("phoneNumber", iContractorID));
  316.   if (p->containsKeyName("startDate", iContractorID))
  317.     setStartDate(p->elementWithKey("startDate", iContractorID));
  318.   if (p->containsKeyName("endDate", iContractorID))
  319.     setEndDate(p->elementWithKey("endDate", iContractorID));
  320.   if (p->containsKeyName("currentContract", iContractorID))
  321.     setCurrentContract(p->elementWithKey("currentContract", iContractorID));
  322.  
  323. // Call overloaded set member function using string parameter
  324.  
  325.   if (p->containsKeyName("activeStatus", iContractorID))
  326.     enableActiveStatus(p->elementWithKey("activeStatus", iContractorID));
  327.  
  328.   delete p;
  329.  
  330. // End data access code
  331.  
  332. // Execute event to trigger instantiation of OAContractorView
  333.   notifyObservers(INotificationEvent(qryFoundId, *this));
  334.  
  335.   return *this;
  336. }
  337.  
  338. OAContractor & OAContractor::putContractor()
  339. {
  340.  
  341. // Start data entry code
  342.  
  343.   IProfile *p = new IProfile("contrctr.ini");
  344.  
  345. // Needed for Windows implementation
  346.  
  347.    primeData(*p);
  348.  
  349. // Refresh the value of contractor ID if not already done
  350.  
  351.   if (!isIDvalid())
  352.      setContractorID();
  353.  
  354.   p->addOrReplaceElementWithKey("contractorID", contractorID(), iContractorID);
  355.  
  356. // If other data about this contractor exists, update it in the database
  357.  
  358.   if (iLastName.length()>0)
  359.     p->addOrReplaceElementWithKey("lastName", lastName(), iContractorID);
  360.   if (iFirstName.length()>0)
  361.     p->addOrReplaceElementWithKey("firstName", firstName(), iContractorID);
  362.   if (iMiddleInitial.length()>0)
  363.     p->addOrReplaceElementWithKey("middleInitial", middleInitial(), iContractorID);
  364.   if (iHomeStreet.length()>0)
  365.     p->addOrReplaceElementWithKey("homeStreet", homeStreet(), iContractorID);
  366.   if (iHomeCity.length()>0)
  367.     p->addOrReplaceElementWithKey("homeCity", homeCity(), iContractorID);
  368.   if (iHomeState.length()>0)
  369.     p->addOrReplaceElementWithKey("homeState", homeState(), iContractorID);
  370.   if (iHomeZip.length()>0)
  371.     p->addOrReplaceElementWithKey("homeZip", homeZip(), iContractorID);
  372.   if (iPhoneNumber.length()>0)
  373.     p->addOrReplaceElementWithKey("phoneNumber", phoneNumber(), iContractorID);
  374.   if (iStartDate.length()>0)
  375.     p->addOrReplaceElementWithKey("startDate", startDate(), iContractorID);
  376.   if (iEndDate.length()>0)
  377.     p->addOrReplaceElementWithKey("endDate", endDate(), iContractorID);
  378.   if (iCurrentContract.length()>0)
  379.     p->addOrReplaceElementWithKey("currentContract", currentContract(), iContractorID);
  380.   if (isActiveStatus())
  381.   {
  382.     p->addOrReplaceElementWithKey("activeStatus", "yes", iContractorID);
  383.   }
  384.   else
  385.   {
  386.     p->addOrReplaceElementWithKey("activeStatus", "no", iContractorID);
  387.   }
  388.  
  389.   delete p;
  390.  
  391. // End data entry code
  392.  
  393.   return *this;
  394. }
  395.  
  396. OAContractor & OAContractor::parseName(const IString & aName)
  397. {
  398.  
  399. // aName is supplied by user in OAQueryContractor
  400.  
  401. // Test for missing information in newly entered name
  402.  
  403.   if (aName.numWords()!= 3)
  404.   {
  405.   enableIDvalid(false);
  406.   throw IException("The name you entered is incomplete. Enter first name, middle initial, and last name.");
  407.   return *this;
  408.   }
  409.  
  410. // Set name attributes and derive contractorID attribute
  411.  
  412.   clear();
  413.   setFirstName(aName.word(1));
  414.   setMiddleInitial(aName.word(2));
  415.   setLastName(aName.word(3));
  416.   setContractorID();
  417.  
  418. // End added code
  419.  
  420.   return *this;
  421. }
  422. OAContractor & OAContractor::refreshID()
  423. {
  424. // Test for missing name information
  425. // Necessary for synchronizing contractorID attributes
  426.  
  427.   Boolean tempLast = iLastName.isWhiteSpace() || (iLastName.length()==0);
  428.   Boolean tempFirst = iFirstName.isWhiteSpace() || (iFirstName.length()==0);
  429.   Boolean tempMiddle = iMiddleInitial.isWhiteSpace() || (iMiddleInitial.length()==0);
  430.  
  431.   if (tempLast || tempFirst || tempMiddle)
  432.   {
  433.   throw IException("The contractor's name is incomplete. Complete all name fields and try again.");
  434.   }
  435.  
  436.   setContractorID();
  437.  
  438.   return *this;
  439. }
  440. // Copy constructor
  441.  
  442. OAContractor::OAContractor(const OAContractor & aContractor)
  443.   : IStandardNotifier(aContractor),
  444.   iContractorID(aContractor.contractorID()),
  445.   iLastName(aContractor.lastName()),
  446.   iFirstName(aContractor.firstName()),
  447.   iMiddleInitial(aContractor.middleInitial()),
  448.   iHomeStreet(aContractor.homeStreet()),
  449.   iHomeCity(aContractor.homeCity()),
  450.   iHomeState(aContractor.homeState()),
  451.   iHomeZip(aContractor.homeZip()),
  452.   iPhoneNumber(aContractor.phoneNumber()),
  453.   iStartDate(aContractor.startDate()),
  454.   iEndDate(aContractor.endDate()),
  455.   iActiveStatus(aContractor.isActiveStatus()),
  456.   iCurrentContract(aContractor.currentContract()),
  457.   iIDvalid(aContractor.isIDvalid())
  458.   {
  459.     enableNotification();
  460.   }
  461.  
  462. // ID Validation flag getter and setter
  463.  
  464. Boolean OAContractor::isIDvalid () const
  465. {
  466.    return iIDvalid;
  467. }
  468.  
  469. OAContractor & OAContractor::enableIDvalid(const Boolean enable)
  470. {
  471.   if (iIDvalid != enable)
  472.   {
  473.     iIDvalid = enable;
  474.     if (enable==true)
  475.        notifyObservers(INotificationEvent(OAContractor::IDvalidId, *this, true, (void*)&iContractorID));
  476.     else
  477.        notifyObservers(INotificationEvent(OAContractor::IDvalidId, *this));
  478.   } // endif
  479.   return *this;
  480. }
  481.  
  482. void OAContractor::clear()
  483. {
  484. // Name/ID resets not really needed for parseName() call,
  485. // but they are included just in case you want to use this
  486. // function somewhere else
  487.  
  488.    setFirstName("");            // embeds enableIDvalid(false) call
  489.    setMiddleInitial("");
  490.    setLastName("");
  491.    setContractorID();
  492.  
  493.    setHomeStreet("");
  494.    setHomeCity("");
  495.    setHomeState("");
  496.    setHomeZip("");
  497.    setPhoneNumber("");
  498.    setStartDate("");
  499.    setEndDate("");
  500.    enableActiveStatus(false);
  501.    setCurrentContract("");
  502. }
  503.  
  504. // Prime profile instance in Windows with data
  505.  
  506. OAContractor & OAContractor::primeData(IProfile & aDatabase) {
  507.  
  508.   IString tempKey = "SusanGCarpenter";
  509.  
  510. // Windows does not read from .ini files.
  511. // It uses a central registry,
  512. // so load initial contractor data into the registry.
  513.  
  514.   aDatabase.addOrReplaceElementWithKey("contractorID","SusanGCarpenter",tempKey);
  515.   aDatabase.addOrReplaceElementWithKey("lastName","Carpenter",tempKey);
  516.   aDatabase.addOrReplaceElementWithKey("firstName","Susan",tempKey);
  517.   aDatabase.addOrReplaceElementWithKey("middleInitial","G",tempKey);
  518.   aDatabase.addOrReplaceElementWithKey("homeStreet","123 Sesame Street",tempKey);
  519.   aDatabase.addOrReplaceElementWithKey("homeCity","Raleigh",tempKey);
  520.   aDatabase.addOrReplaceElementWithKey("homeState","NC",tempKey);
  521.   aDatabase.addOrReplaceElementWithKey("homeZip","27506-1234",tempKey);
  522.   aDatabase.addOrReplaceElementWithKey("phoneNumber","919-555-1234",tempKey);
  523.   aDatabase.addOrReplaceElementWithKey("startDate","12/01/95",tempKey);
  524.   aDatabase.addOrReplaceElementWithKey("endDate","12/31/96",tempKey);
  525.   aDatabase.addOrReplaceElementWithKey("currentContract","123456",tempKey);
  526.   aDatabase.addOrReplaceElementWithKey("activeStatus","no",tempKey);
  527.  
  528.   return *this;
  529. }
  530.