home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1997 January: Mac OS SDK / Dev.CD Jan 97 SDK2.toast / Development Kits (Disc 2) / OpenDoc Development Framework / ODFDev / Form / Sources / Content.cpp < prev    next >
Encoding:
Text File  |  1996-09-17  |  15.2 KB  |  521 lines  |  [TEXT/MPS ]

  1. //========================================================================================
  2. //
  3. //    File:                Content.cpp
  4. //    Release Version:    $ ODF 2 $
  5. //
  6. //    Copyright:    (c) 1993 - 1996 by Apple Computer, Inc., all rights reserved.
  7. //
  8. //========================================================================================
  9.  
  10. #include "Form.hpp"
  11.  
  12. #ifndef CONTENT_H
  13. #include "Content.h"
  14. #endif
  15.  
  16. #ifndef DEFINES_K
  17. #include "Defines.k"
  18. #endif
  19.  
  20. // ----- Framework Includes -----
  21.  
  22. #ifndef FWPART_H
  23. #include "FWPart.h"
  24. #endif
  25.  
  26. #ifndef FWFRAME_H
  27. #include "FWFrame.h"
  28. #endif
  29.  
  30. #ifndef FWKIND_H
  31. #include "FWKind.h"
  32. #endif
  33.  
  34. #ifndef FWEDVIEW_H
  35. #include "FWEdView.h"
  36. #endif
  37.  
  38. #ifndef FWBUTTON_H
  39. #include "FWButton.h"
  40. #endif
  41.  
  42. #ifndef FWPOPUP_H
  43. #include "FWPopup.h"
  44. #endif
  45.  
  46. #ifndef FWSUSINK_H
  47. #include "FWSUSink.h"
  48. #endif
  49.  
  50. #ifndef FWSUUTIL_H
  51. #include "FWSUUtil.h"
  52. #endif
  53.  
  54. // ----- Foundation Includes -----
  55.  
  56. #ifndef FWSTREAM_H
  57. #include "FWStream.h"
  58. #endif
  59.  
  60.  
  61.  
  62. //========================================================================================
  63. // Runtime Information
  64. //========================================================================================
  65.  
  66. #ifdef FW_BUILD_MAC
  67. #pragma segment odfform
  68. #endif
  69.  
  70. //========================================================================================
  71. //    class CFormContent
  72. //========================================================================================
  73.  
  74. FW_DEFINE_CLASS_M2(CFormContent, FW_CContent, FW_MReceiver)
  75. FW_DEFINE_AUTO(CFormContent)
  76.  
  77. //----------------------------------------------------------------------------------------
  78. //    CFormContent::CFormContent
  79. //----------------------------------------------------------------------------------------
  80.  
  81. CFormContent::CFormContent(Environment* ev, FW_CPart* formPart) :
  82.     FW_CContent(ev, formPart),
  83.     fFirstName(),
  84.     fLastName(),
  85.     fMemberName(),
  86.     fEMailAddress(),
  87.     fComments(),
  88.     fSubscribeCheckboxState(1),
  89.     f14400RadioState(1),
  90.     f28800RadioState(0),
  91.     fFasterRadioState(0),
  92.     fBrowseMenuItem(0),
  93.     fOnlineMenuItem(0),
  94.     fWordOfMouthRadioState(1),
  95.     fHyperLinkRadioState(0),
  96.     fMacTechRadioState(0),
  97.     fMagazineRadioState(0),
  98.     fOtherRadioState(0),
  99.     fYesRadioState(1),
  100.     fNoRadioState(0)
  101. {
  102. }
  103.  
  104. //----------------------------------------------------------------------------------------
  105. //    CFormContent::ExternalizeKind
  106. //----------------------------------------------------------------------------------------
  107.  
  108. void CFormContent::ExternalizeKind(Environment* ev,
  109.                                 ODStorageUnit* storageUnit,
  110.                                 FW_CKind* kind,
  111.                                 FW_StorageKinds storageKind,
  112.                                 FW_CPromise* promise,
  113.                                 FW_CCloneInfo* cloneInfo)
  114. {
  115. FW_UNUSED(storageKind);
  116. FW_UNUSED(promise);
  117. FW_UNUSED(cloneInfo);
  118.     if (kind->IsPartKind(ev))
  119.     {            
  120.         FW_PStorageUnitSink sink(ev, storageUnit, kODPropContents, kind->GetType(ev));
  121.         FW_CWritableStream stream(sink);
  122.         
  123.         stream << fFirstName << fLastName << fMemberName << fEMailAddress << fComments
  124.             << fSubscribeCheckboxState << f14400RadioState << f28800RadioState
  125.             << fFasterRadioState << fBrowseMenuItem << fOnlineMenuItem
  126.             << fWordOfMouthRadioState << fHyperLinkRadioState << fMacTechRadioState
  127.             << fMagazineRadioState << fOtherRadioState;
  128.  
  129.         FW_SUDeleteEndOfFocusedValue(ev, storageUnit);
  130.     }
  131. }
  132.  
  133. //----------------------------------------------------------------------------------------
  134. //    CFormContent::InternalizeKind
  135. //----------------------------------------------------------------------------------------
  136.  
  137. FW_Boolean CFormContent::InternalizeKind(Environment* ev,
  138.                                         ODStorageUnit* storageUnit,
  139.                                         FW_CKind* kind,
  140.                                         FW_StorageKinds storageKind,
  141.                                         FW_CCloneInfo* cloneInfo)
  142. {
  143. FW_UNUSED(cloneInfo);
  144.     FW_Boolean result = false;
  145.     
  146.     if (kind->IsPartKind(ev))
  147.     {
  148.         FW_PStorageUnitSink sink(ev, storageUnit, kODPropContents, kind->GetType(ev));
  149.         FW_CReadableStream stream(sink);
  150.         
  151.         stream >> fFirstName >> fLastName >> fMemberName >> fEMailAddress >> fComments
  152.             >> fSubscribeCheckboxState >> f14400RadioState >> f28800RadioState
  153.             >> fFasterRadioState >> fBrowseMenuItem >> fOnlineMenuItem
  154.             >> fWordOfMouthRadioState >> fHyperLinkRadioState >> fMacTechRadioState
  155.             >> fMagazineRadioState >> fOtherRadioState;
  156.         
  157.         ExportToViews(ev, GetPart(ev)->GetLastActiveFrame(ev));
  158.         result = true;
  159.     }
  160.     else
  161.         FW_DEBUG_MESSAGE("CFormContent::InternalizeKind - Unknown type");
  162.         
  163.     if (result && storageKind != FW_kPartStorage)
  164.         GetPart(ev)->Changed(ev);
  165.         
  166.     return result;
  167. }
  168.  
  169. //----------------------------------------------------------------------------------------
  170. //    CFormContent::HandleNotification
  171. //----------------------------------------------------------------------------------------
  172.  
  173. void CFormContent::HandleNotification(Environment* ev, const FW_CNotification& notification)
  174. {
  175.     FW_MNotifier* notifier = notification.GetNotifier();
  176.     
  177.     switch (notification.GetMessage())
  178.     {
  179.         case FW_kChangedMsg:
  180.             {
  181.                 FW_CEditView* editView = FW_DYNAMIC_CAST(FW_CEditView, notifier);
  182.                 FW_ASSERT(editView);
  183.                 GetEditViewText(ev, editView->GetFrame(ev), editView->GetViewID(ev));
  184.             }
  185.             break;
  186.         
  187.         case FW_kButtonPressedMsg:
  188.         case FW_kRadioClusterMsg:
  189.         case FW_kPopupClickedMsg:
  190.             {
  191.                 FW_CControl* control = FW_DYNAMIC_CAST(FW_CControl, notifier);
  192.                 FW_ASSERT(control);
  193.                 GetControlValue(ev, control->GetFrame(ev), control->GetViewID(ev));
  194.             }
  195.             break;
  196.             
  197.         default:
  198.             break;
  199.     }    
  200. }
  201.  
  202.  
  203. //----------------------------------------------------------------------------------------
  204. //    CFormContent::AddViewInterests
  205. //----------------------------------------------------------------------------------------
  206.  
  207. void CFormContent::AddViewInterests(Environment* ev, FW_CFrame* frame)
  208. {
  209.     FW_CEditView*     editView;
  210.     FW_CButton*     buttonView;
  211.     FW_CPopupMenu*    popupMenu;
  212.     
  213.     editView = FW_DYNAMIC_CAST(FW_CEditView, frame->FindViewByID(ev, kFirstNameEdViewID));
  214.     FW_ASSERT(editView);
  215.     AddInterest(FW_CInterest(editView, FW_kChangedMsg));
  216.  
  217.     editView = FW_DYNAMIC_CAST(FW_CEditView, frame->FindViewByID(ev, kLastNameEdViewID));
  218.     FW_ASSERT(editView);
  219.     AddInterest(FW_CInterest(editView, FW_kChangedMsg));
  220.  
  221.     editView = FW_DYNAMIC_CAST(FW_CEditView, frame->FindViewByID(ev, kMemberNameEdViewID));
  222.     FW_ASSERT(editView);
  223.     AddInterest(FW_CInterest(editView, FW_kChangedMsg));
  224.  
  225.     editView = FW_DYNAMIC_CAST(FW_CEditView, frame->FindViewByID(ev, kEMailEdViewID));
  226.     FW_ASSERT(editView);
  227.     AddInterest(FW_CInterest(editView, FW_kChangedMsg));
  228.  
  229.     editView = FW_DYNAMIC_CAST(FW_CEditView, frame->FindViewByID(ev, kCommentsEdViewID));
  230.     FW_ASSERT(editView);
  231.     AddInterest(FW_CInterest(editView, FW_kChangedMsg));
  232.  
  233.     buttonView = FW_DYNAMIC_CAST(FW_CButton, frame->FindViewByID(ev, k14400RadioID));
  234.     FW_ASSERT(buttonView);
  235.     AddInterest(FW_CInterest(buttonView, FW_kRadioClusterMsg));
  236.  
  237.     buttonView = FW_DYNAMIC_CAST(FW_CButton, frame->FindViewByID(ev, k28800RadioID));
  238.     FW_ASSERT(buttonView);
  239.     AddInterest(FW_CInterest(buttonView, FW_kRadioClusterMsg));
  240.  
  241.     buttonView = FW_DYNAMIC_CAST(FW_CButton, frame->FindViewByID(ev, kFasterRadioID));
  242.     FW_ASSERT(buttonView);
  243.     AddInterest(FW_CInterest(buttonView, FW_kRadioClusterMsg));
  244.  
  245.     popupMenu = FW_DYNAMIC_CAST(FW_CPopupMenu, frame->FindViewByID(ev, kBrowseTimePopupID));
  246.     FW_ASSERT(popupMenu);
  247.     AddInterest(FW_CInterest(popupMenu, FW_kPopupClickedMsg));
  248.     
  249.     popupMenu = FW_DYNAMIC_CAST(FW_CPopupMenu, frame->FindViewByID(ev, kOnlineTimePopupID));
  250.     FW_ASSERT(popupMenu);
  251.     AddInterest(FW_CInterest(popupMenu, FW_kPopupClickedMsg));
  252.  
  253.     buttonView = FW_DYNAMIC_CAST(FW_CButton, frame->FindViewByID(ev, kWordOfMouthRadioID));
  254.     FW_ASSERT(buttonView);
  255.     AddInterest(FW_CInterest(buttonView, FW_kRadioClusterMsg));
  256.  
  257.     buttonView = FW_DYNAMIC_CAST(FW_CButton, frame->FindViewByID(ev, kHyperLinkRadioID));
  258.     FW_ASSERT(buttonView);
  259.     AddInterest(FW_CInterest(buttonView, FW_kRadioClusterMsg));
  260.  
  261.     buttonView = FW_DYNAMIC_CAST(FW_CButton, frame->FindViewByID(ev, kMacTechRadioID));
  262.     FW_ASSERT(buttonView);
  263.     AddInterest(FW_CInterest(buttonView, FW_kRadioClusterMsg));
  264.  
  265.     buttonView = FW_DYNAMIC_CAST(FW_CButton, frame->FindViewByID(ev, kMagazineRadioID));
  266.     FW_ASSERT(buttonView);
  267.     AddInterest(FW_CInterest(buttonView, FW_kRadioClusterMsg));
  268.     
  269.     buttonView = FW_DYNAMIC_CAST(FW_CButton, frame->FindViewByID(ev, kOtherRadioID));
  270.     FW_ASSERT(buttonView);
  271.     AddInterest(FW_CInterest(buttonView, FW_kRadioClusterMsg));
  272.     
  273.     // we're not interested in the state of the yes/no buttons...yes is always
  274.     // on and no is always off.
  275. }
  276.  
  277. //----------------------------------------------------------------------------------------
  278. //    CFormContent::ImportFromViews
  279. //----------------------------------------------------------------------------------------
  280.  
  281. void CFormContent::ImportFromViews(Environment* ev, FW_CFrame* frame)
  282. {
  283.     FW_ASSERT(false);
  284.     FW_ASSERT(frame != NULL);
  285.         // may not have views if the frame is in limbo and views have been deleted
  286.     if (frame->HasSubViews(ev))
  287.     {
  288.         GetEditViewText(ev, frame, kFirstNameEdViewID);
  289.         GetEditViewText(ev, frame, kLastNameEdViewID);
  290.         GetEditViewText(ev, frame, kMemberNameEdViewID);
  291.         GetEditViewText(ev, frame, kEMailEdViewID);
  292.         GetEditViewText(ev, frame, kCommentsEdViewID);
  293.         GetEditViewText(ev, frame, kFirstNameEdViewID);
  294.         GetEditViewText(ev, frame, kFirstNameEdViewID);
  295.         GetEditViewText(ev, frame, kFirstNameEdViewID);
  296.  
  297.         GetControlValue(ev, frame, kSubscribeCheckID);
  298.         GetControlValue(ev, frame, k14400RadioID);
  299.         GetControlValue(ev, frame, k28800RadioID);
  300.         GetControlValue(ev, frame, kFasterRadioID);
  301.         GetControlValue(ev, frame, kBrowseTimePopupID);
  302.         GetControlValue(ev, frame, kOnlineTimePopupID);
  303.         GetControlValue(ev, frame, kWordOfMouthRadioID);
  304.         GetControlValue(ev, frame, kHyperLinkRadioID);
  305.         GetControlValue(ev, frame, kMacTechRadioID);
  306.         GetControlValue(ev, frame, kMagazineRadioID);
  307.         GetControlValue(ev, frame, kOtherRadioID);
  308.         // we don't import the yes/no buttons...their values don't change
  309.     }
  310. }
  311.  
  312. //----------------------------------------------------------------------------------------
  313. //    CFormContent::ExportToViews
  314. //----------------------------------------------------------------------------------------
  315.  
  316. void CFormContent::ExportToViews(Environment* ev, FW_CFrame* frame)
  317. {
  318.     if (frame && frame->HasSubViews(ev))
  319.     {
  320.         SetEditViewText(ev, frame, kFirstNameEdViewID);
  321.         SetEditViewText(ev, frame, kLastNameEdViewID);
  322.         SetEditViewText(ev, frame, kMemberNameEdViewID);
  323.         SetEditViewText(ev, frame, kEMailEdViewID);
  324.         SetEditViewText(ev, frame, kCommentsEdViewID);
  325.         SetEditViewText(ev, frame, kFirstNameEdViewID);
  326.         SetEditViewText(ev, frame, kFirstNameEdViewID);
  327.         SetEditViewText(ev, frame, kFirstNameEdViewID);
  328.  
  329.         SetControlValue(ev, frame, kSubscribeCheckID);
  330.         SetControlValue(ev, frame, k14400RadioID);
  331.         SetControlValue(ev, frame, k28800RadioID);
  332.         SetControlValue(ev, frame, kFasterRadioID);
  333.         SetControlValue(ev, frame, kBrowseTimePopupID);
  334.         SetControlValue(ev, frame, kOnlineTimePopupID);
  335.         SetControlValue(ev, frame, kWordOfMouthRadioID);
  336.         SetControlValue(ev, frame, kHyperLinkRadioID);
  337.         SetControlValue(ev, frame, kMacTechRadioID);
  338.         SetControlValue(ev, frame, kMagazineRadioID);
  339.         SetControlValue(ev, frame, kOtherRadioID);
  340.         SetControlValue(ev, frame, kYesRadioID);
  341.         SetControlValue(ev, frame, kNoRadioID);
  342.     }
  343. }
  344.  
  345. //----------------------------------------------------------------------------------------
  346. //    CFormContent::GetEditViewText
  347. //----------------------------------------------------------------------------------------
  348.  
  349. void CFormContent::GetEditViewText(Environment* ev, 
  350.                                 FW_CFrame* frame,
  351.                                 ODID viewID)
  352. {
  353.     FW_CString* string = ViewIDToStringAddress(viewID);    
  354.     FW_CEditView* editView = FW_DYNAMIC_CAST(FW_CEditView, frame->FindViewByID(ev, viewID));
  355.     FW_ASSERT(editView);
  356.     
  357.     FW_CString editViewText = editView->GetText(ev);
  358.     if (*string != editViewText)
  359.     {
  360.         *string = editViewText;
  361.         GetPart(ev)->Changed(ev);
  362.     }
  363. }
  364.  
  365. //----------------------------------------------------------------------------------------
  366. //    CFormContent::SetEditViewText
  367. //----------------------------------------------------------------------------------------
  368.  
  369. void CFormContent::SetEditViewText(Environment* ev,
  370.                                 FW_CFrame* frame,
  371.                                 ODID viewID)
  372. {
  373.     FW_CString* string = ViewIDToStringAddress(viewID);
  374.     FW_CEditView* editView = FW_DYNAMIC_CAST(FW_CEditView, frame->FindViewByID(ev, viewID));
  375.     FW_ASSERT(editView);
  376.     editView->SetText(ev, *string);
  377. }
  378.  
  379. //----------------------------------------------------------------------------------------
  380. //    CFormContent::GetControlValue
  381. //----------------------------------------------------------------------------------------
  382.  
  383. void CFormContent::GetControlValue(Environment* ev,
  384.                                 FW_CFrame* frame,
  385.                                 ODID viewID)
  386. {
  387.     FW_ControlValue* value = ViewIDToControlValueAddress(viewID);
  388.     FW_CControl* control = FW_DYNAMIC_CAST(FW_CControl, frame->FindViewByID(ev, viewID));
  389.     FW_ASSERT(control);
  390.     FW_ControlValue controlViewValue = control->GetValue(ev);
  391.     
  392.     if (*value != controlViewValue)
  393.     {
  394.         *value = controlViewValue;
  395.         GetPart(ev)->Changed(ev);
  396.     }
  397. }
  398.  
  399. //----------------------------------------------------------------------------------------
  400. //    CFormContent::SetControlValue
  401. //----------------------------------------------------------------------------------------
  402.  
  403. void CFormContent::SetControlValue(Environment* ev,
  404.                                 FW_CFrame* frame,
  405.                                 ODID viewID)
  406. {
  407.     FW_ControlValue value = *(ViewIDToControlValueAddress(viewID));
  408.     FW_CControl* control = FW_DYNAMIC_CAST(FW_CControl, frame->FindViewByID(ev, viewID));
  409.     FW_ASSERT(control);
  410.     control->SetValue(ev, value);
  411. }
  412.  
  413. //----------------------------------------------------------------------------------------
  414. //    CFormContent::ViewIDToStringAddress
  415. //----------------------------------------------------------------------------------------
  416.  
  417. FW_CString* CFormContent::ViewIDToStringAddress(ODID viewID)
  418. {
  419.     FW_CString* string;
  420.     
  421.     switch (viewID)
  422.     {
  423.         case kFirstNameEdViewID:
  424.             string = &fFirstName;
  425.             break;
  426.         
  427.         case kLastNameEdViewID:
  428.             string = &fLastName;
  429.             break;
  430.             
  431.         case kMemberNameEdViewID:
  432.             string = &fMemberName;
  433.             break;
  434.             
  435.         case kEMailEdViewID:
  436.             string = &fEMailAddress;
  437.             break;
  438.             
  439.         case kCommentsEdViewID:
  440.             string = &fComments;
  441.             break;
  442.             
  443.         default:
  444.             string = NULL;
  445.             break;
  446.     }
  447.     
  448.     FW_ASSERT(string);
  449.     return string;
  450. }
  451.  
  452. //----------------------------------------------------------------------------------------
  453. //    CFormContent::ViewIDToControlValueAddress
  454. //----------------------------------------------------------------------------------------
  455.  
  456. FW_ControlValue* CFormContent::ViewIDToControlValueAddress(ODID viewID)
  457. {    
  458.     FW_ControlValue* value;
  459.     
  460.     switch (viewID)
  461.     {
  462.         case kSubscribeCheckID:
  463.             value = &fSubscribeCheckboxState;
  464.             break;
  465.             
  466.         case k14400RadioID:
  467.             value = &f14400RadioState;
  468.             break;
  469.             
  470.         case k28800RadioID:
  471.             value = &f28800RadioState;
  472.             break;
  473.             
  474.         case kFasterRadioID:
  475.             value = &fFasterRadioState;
  476.             break;
  477.             
  478.         case kBrowseTimePopupID:
  479.             value = &fBrowseMenuItem;
  480.             break;
  481.             
  482.         case kOnlineTimePopupID:
  483.             value = &fOnlineMenuItem;
  484.             break;
  485.             
  486.         case kWordOfMouthRadioID:
  487.             value = &fWordOfMouthRadioState;
  488.             break;
  489.             
  490.         case kHyperLinkRadioID:
  491.             value = &fHyperLinkRadioState;
  492.             break;
  493.             
  494.         case kMacTechRadioID:
  495.             value = &fMacTechRadioState;
  496.             break;
  497.             
  498.         case kMagazineRadioID:
  499.             value = &fMagazineRadioState;
  500.             break;
  501.             
  502.         case kOtherRadioID:
  503.             value = &fOtherRadioState;
  504.             break;
  505.             
  506.         case kYesRadioID:
  507.             value = &fYesRadioState;
  508.             break;
  509.             
  510.         case kNoRadioID:
  511.             value = &fNoRadioState;
  512.             break;
  513.             
  514.         default:
  515.             value = NULL;
  516.             break;
  517.     }
  518.     FW_ASSERT(value);
  519.     return value;
  520. }
  521.