home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / dokpr1.zip / lomos / lomos.cpp < prev    next >
Text File  |  1995-11-09  |  13KB  |  400 lines

  1. #define INCL_WIN
  2. #define INCL_DOS
  3. #include <os2.h>
  4.  
  5. #include <stdlib.h>
  6. #include <stdio.h>
  7. #include <memory.h>
  8. #include <string.h>
  9. #include "loandet.h"
  10. #include "lomos.h"
  11. #include "sampcont.h"
  12.  
  13. #define WM_NEW WM_USER
  14. #define WM_OPENFILE WM_USER+1
  15.  
  16.  
  17. MSampleController *MyMesa;
  18. Loan * currloan;
  19.  
  20. // the icon stuck in the dlgs upper corner and displayed when minimized
  21. HPOINTER prtIcon;
  22.  
  23. // this updates all of the fields in the window.  Ideally, when something
  24. // changed, we'd just update what changed, but this is easier to deal with
  25. void updateWindow(HWND hw,Loan * theLoan)
  26. {
  27.    char *str;
  28.    int listidx;
  29.  
  30.    str=theLoan->LoanID();
  31.    WinSetWindowText(WinWindowFromID(hw,DID_LOANID),str);
  32.    delete str;
  33.  
  34.    str=theLoan->AppDate();
  35.    WinSetWindowText(WinWindowFromID(hw,DID_APPDATE),str);
  36.    delete str;
  37.  
  38.    str=theLoan->RepID();
  39.    WinSetWindowText(WinWindowFromID(hw,DID_REP),str);
  40.    delete str;
  41.  
  42.    str=theLoan->Name();
  43.    WinSetWindowText(WinWindowFromID(hw,DID_APPNAME),str);
  44.    delete str;
  45.  
  46.    str=theLoan->SSNo();
  47.    WinSetWindowText(WinWindowFromID(hw,DID_SSNO),str);
  48.    delete str;
  49.  
  50.    str=theLoan->Type();
  51.    listidx = (int)WinSendDlgItemMsg(hw,DID_TYPE,
  52.                                        LM_SEARCHSTRING,(MPARAM)NULL,str);
  53.    WinSendDlgItemMsg(hw, DID_TYPE, 
  54.                          LM_SETTOPINDEX, (MPARAM)listidx, (MPARAM)NULL);
  55.    delete str;
  56.  
  57.    str=theLoan->Amount();
  58.    WinSetWindowText(WinWindowFromID(hw,DID_AMOUNT),str);
  59.    delete str;
  60.  
  61.    str=theLoan->Rate();
  62.    WinSetWindowText(WinWindowFromID(hw,DID_RATE),str);
  63.    delete str;
  64.  
  65.    str=theLoan->StDate();
  66.    WinSetWindowText(WinWindowFromID(hw,DID_STDATE),str);
  67.    delete str;
  68.  
  69.    str=theLoan->Duration();
  70.    WinSetWindowText(WinWindowFromID(hw,DID_DURATION),str);
  71.    delete str;
  72.  
  73.    str=theLoan->Periodicity();
  74.    listidx = (int)WinSendDlgItemMsg(hw,DID_PERIODICITY,
  75.                                        LM_SEARCHSTRING,(MPARAM)NULL,str);
  76.    WinSendDlgItemMsg(hw, DID_PERIODICITY,
  77.                          LM_SETTOPINDEX, (MPARAM)listidx, (MPARAM)NULL);
  78.    delete str;
  79.  
  80.   }
  81.  
  82.  
  83. // this is the window procedure that handles the loan
  84. MRESULT EXPENTRY LoanProc(HWND hw,ULONG msg,MPARAM mp1,MPARAM mp2)
  85. {
  86.    // the pointer to the loan is stored in the first window ULONG
  87.    // so we'll query that first thing
  88.    Loan *theLoan=(Loan *) WinQueryWindowULong(hw,QWL_USER);
  89.    char buffer[10000];
  90.    char buffer2[1000];
  91.    char *ptr;
  92.    int select;
  93.  
  94.    switch (msg) {
  95.    case WM_INITDLG:
  96.          WinSendDlgItemMsg(hw,DID_TYPE,
  97.                            LM_INSERTITEM,(MPARAM)LIT_END,"Student");
  98.          WinSendDlgItemMsg(hw,DID_TYPE,
  99.                            LM_INSERTITEM,(MPARAM)LIT_END,"Personal");
  100.          WinSendDlgItemMsg(hw,DID_TYPE,
  101.                            LM_INSERTITEM,(MPARAM)LIT_END,"Business");
  102.          WinSendDlgItemMsg(hw,DID_PERIODICITY,
  103.                            LM_INSERTITEM,(MPARAM)LIT_END,"Weekly");
  104.          WinSendDlgItemMsg(hw,DID_PERIODICITY,
  105.                            LM_INSERTITEM,(MPARAM)LIT_END,"Monthly");
  106.          break;
  107.    case WM_NEW:
  108.       // we're creating a new Loan so we'll just new it without a file name
  109.           theLoan=new Loan(hw);
  110.       // set the first user ULONG to theLoan
  111.           WinSetWindowULong(hw,QWL_USER,(ULONG)theLoan);
  112.       // update the window to reflect the new values
  113.           updateWindow(hw,theLoan);
  114.           break;
  115.    case WM_OPENFILE:
  116.           {
  117.          // for this, we'll pop up a standard dialog box asking for the filename
  118.             FILEDLG fdg;
  119.             char *types[2]={"Mesa Workbook File",NULL};
  120.             char *type="Mesa Workbook File";
  121.  
  122.             memset(&fdg,0,sizeof(FILEDLG));
  123.             fdg.cbSize=sizeof(FILEDLG);
  124.             fdg.fl=FDS_CENTER | FDS_OPEN_DIALOG;
  125.             fdg.pszIType = ( PSZ )type;
  126.             fdg.papszITypeList = ( PAPSZ )types;
  127.             WinFileDlg(HWND_DESKTOP,hw,&fdg);
  128.             if(fdg.lReturn == DID_OK) {
  129.                // create a new loan and have it load it's info from the selected file
  130.                theLoan=new Loan(fdg.szFullFile,hw);
  131.                // set the window ULONG to the PO
  132.                WinSetWindowULong(hw,QWL_USER,(ULONG)theLoan);
  133.                // update the window to reflect the new values
  134.                updateWindow(hw,theLoan);
  135.             } else WinDismissDlg(hw,DID_CANCEL);
  136.           }
  137.       break;
  138.    
  139.    case WM_CONTROL:
  140.      switch (SHORT1FROMMP(mp1)) {
  141.      case DID_LOANID:
  142.           if (SHORT2FROMMP(mp1) == EN_KILLFOCUS) {
  143.              WinQueryDlgItemText(hw,DID_LOANID,sizeof(buffer),buffer);
  144.              theLoan->setLoanID(buffer);
  145.           } /* endif */
  146.         break;
  147.      case DID_APPDATE:
  148.           if (SHORT2FROMMP(mp1) == EN_KILLFOCUS) {
  149.              WinQueryDlgItemText(hw,DID_APPDATE,sizeof(buffer),buffer);
  150.              theLoan->setAppDate(buffer);
  151.              ptr=theLoan->AppDate();
  152.              WinSetWindowText(WinWindowFromID(hw,DID_APPDATE),ptr);
  153.              delete ptr;
  154.            } /* endif */
  155.         break;
  156.      case DID_REP:
  157.           if (SHORT2FROMMP(mp1) == EN_KILLFOCUS) {
  158.              WinQueryDlgItemText(hw,DID_REP,sizeof(buffer),buffer);
  159.              theLoan->setRepID(buffer);
  160.           } /* endif */
  161.         break;
  162.      case DID_APPNAME:
  163.           if (SHORT2FROMMP(mp1) == EN_KILLFOCUS) {
  164.              WinQueryDlgItemText(hw,DID_APPNAME,sizeof(buffer),buffer);
  165.              theLoan->setName(buffer);
  166.           } /* endif */
  167.         break;
  168.      case DID_SSNO:
  169.           if (SHORT2FROMMP(mp1) == EN_KILLFOCUS) {
  170.              WinQueryDlgItemText(hw,DID_SSNO,sizeof(buffer),buffer);
  171.              theLoan->setSSNo(buffer);
  172.           } /* endif */
  173.         break;
  174.      case DID_TYPE:
  175.          if (SHORT2FROMMP(mp1) == LN_ENTER) {
  176.             select=(int)WinSendDlgItemMsg(hw,DID_TYPE,LM_QUERYSELECTION,(MPARAM)NULL,0L);
  177.             WinSendDlgItemMsg(hw,DID_TYPE,LM_QUERYITEMTEXT,MPFROM2SHORT(select,sizeof(buffer)),buffer);
  178.             theLoan->setType(buffer);
  179.          }
  180.          break;
  181.      case DID_AMOUNT:
  182.           if (SHORT2FROMMP(mp1) == EN_KILLFOCUS) {
  183.              WinQueryDlgItemText(hw,DID_AMOUNT,sizeof(buffer),buffer);
  184.              theLoan->setAmount(buffer);
  185.              ptr=theLoan->Amount();
  186.              WinSetWindowText(WinWindowFromID(hw,DID_AMOUNT),ptr);
  187.              delete ptr;
  188.           } /* endif */
  189.         break;
  190.      case DID_RATE:
  191.           if (SHORT2FROMMP(mp1) == EN_KILLFOCUS) {
  192.              WinQueryDlgItemText(hw,DID_RATE,sizeof(buffer),buffer);
  193.              theLoan->setRate(buffer);
  194.              ptr=theLoan->Rate();
  195.              WinSetWindowText(WinWindowFromID(hw,DID_RATE),ptr);
  196.              delete ptr;
  197.           } /* endif */
  198.         break;
  199.      case DID_STDATE:
  200.           if (SHORT2FROMMP(mp1) == EN_KILLFOCUS) {
  201.              WinQueryDlgItemText(hw,DID_STDATE,sizeof(buffer),buffer);
  202.              theLoan->setStDate(buffer);
  203.              ptr=theLoan->StDate();
  204.              WinSetWindowText(WinWindowFromID(hw,DID_STDATE),ptr);
  205.              delete ptr;
  206.            } /* endif */
  207.         break;
  208.      case DID_DURATION:
  209.           if (SHORT2FROMMP(mp1) == EN_KILLFOCUS) {
  210.              WinQueryDlgItemText(hw,DID_DURATION,sizeof(buffer),buffer);
  211.              theLoan->setDuration(buffer);
  212.           } /* endif */
  213.         break;
  214.      case DID_PERIODICITY:
  215.          if (SHORT2FROMMP(mp1) == LN_ENTER) {
  216.             select=(int)WinSendDlgItemMsg(hw,DID_PERIODICITY,LM_QUERYSELECTION,(MPARAM)NULL,0L);
  217.             WinSendDlgItemMsg(hw,DID_PERIODICITY,LM_QUERYITEMTEXT,MPFROM2SHORT(select,sizeof(buffer)),buffer);
  218.             theLoan->setPeriodicity(buffer);
  219.          }
  220.          break;
  221.  
  222.    }
  223.    case WM_COMMAND:
  224.       switch (LOUSHORT(mp1)) {
  225.       case DID_OK:
  226.          ptr=theLoan->fileName();
  227.          if (strcmp(ptr,"")==0) {
  228.             FILEDLG fdg;
  229.             memset(&fdg,0,sizeof(FILEDLG));
  230.             fdg.cbSize=sizeof(FILEDLG);
  231.             fdg.fl=FDS_CENTER | FDS_SAVEAS_DIALOG;
  232.             WinFileDlg(HWND_DESKTOP,hw,&fdg);
  233.             if(fdg.lReturn == DID_OK) {
  234.                theLoan->setFileName(fdg.szFullFile);
  235.             }
  236.             else
  237.                break;
  238.          }
  239.          delete ptr;
  240.          theLoan->save();
  241.          delete theLoan;
  242.          WinDismissDlg(hw,DID_OK);
  243.          break;
  244.       case DID_CANCEL:
  245.          delete theLoan;
  246.          WinDismissDlg(hw,DID_CANCEL);
  247.          break;
  248.       case DID_SHEETVIEW:     
  249. //         WinSetWindowPos(hw, 0, 6,35, 630, 400, SWP_SIZE);
  250.          theLoan->displaySheetView(hw);
  251.          updateWindow(hw,theLoan);
  252.          break;
  253.       default:
  254.         return WinDefDlgProc(hw,msg,mp1,mp2);
  255.       } 
  256.       break;
  257.    case LO_CONTENTSCHANGED:
  258.    case LO_RESETVIEW:
  259.    case LO_REDISPLAY:
  260.       if (theLoan->isInSheetView()) {
  261.          updateWindow(hw,theLoan);
  262.       }
  263.       break;
  264.    default:
  265.      return WinDefDlgProc(hw,msg,mp1,mp2);
  266.    }
  267.    return (MRESULT)FALSE;
  268. }
  269.  
  270.  
  271. // this procedure processes the messages sent to the main application window
  272. // this includes menu items (which are usually just forwarded to the appropriate
  273. // loan) and painting.
  274. MRESULT EXPENTRY LoanAmortizationSysProc(HWND hw,ULONG msg,MPARAM mp1,MPARAM mp2)
  275. {
  276.    HWND hwnddlg;
  277.     
  278.    switch( msg ) {
  279.    case WM_COMMAND:
  280.      {
  281.      switch( SHORT1FROMMP( mp1 ) ) {
  282.      // the File->New PO  menu item.  It loads the dialog from the resources
  283.      // and sends it the NEW po message to tell it to create a new PO
  284.      case MID_FILE_NEW:
  285.           hwnddlg=WinLoadDlg(hw,hw,LoanProc,NULL,IDD_LOAN_AMORTIZATION,0L);
  286.            // send it the new message
  287.           WinSendMsg(hwnddlg,WM_NEW,0L,0L);
  288.           // show the window
  289.           WinShowWindow(hwnddlg,TRUE);
  290.         break;
  291.  
  292.      // the File->Open menu item.  It loads the dialog from the resources and
  293.      // sends it the Open message to have it open an existing PO.
  294.      case MID_FILE_OPEN:
  295.           hwnddlg=WinLoadDlg(hw,hw,LoanProc,NULL,IDD_LOAN_AMORTIZATION,0L);
  296.            // tell it to open a file
  297.           WinSendMsg(hwnddlg,WM_OPENFILE,0L,0L);
  298.           // show it
  299.           WinShowWindow(hwnddlg,TRUE);
  300.         break;
  301.  
  302.      case MID_FILE_SAVE:
  303.         break;
  304.      case MID_FILE_SAVEAS:
  305.         break;
  306.      case MID_FILE_PRINT:
  307.         break;
  308.  
  309.       // close the window if the exit menu option is selected
  310.      case MID_FILE_EXIT:
  311.         WinPostMsg(hw,WM_CLOSE,0L,0L);
  312.         break;
  313.      default:
  314.         return WinDefWindowProc( hw, msg, mp1, mp2 );
  315.      }
  316.         
  317.    }  // the WM_COMMAND message
  318.       break;
  319.  
  320.  
  321.    // general window stuff
  322.    case WM_ERASEBACKGROUND:
  323.        return (MRESULT)TRUE;
  324.  
  325.     case WM_PAINT:
  326.        {
  327.           HPS hps=WinBeginPaint(hw,0,0);
  328.           RECTL re;
  329.           WinQueryWindowRect(hw,&re);
  330.           WinFillRect(hps,&re,CLR_WHITE);
  331.           WinEndPaint(hps);
  332.           return 0L;
  333.        }
  334.  
  335.     default:
  336.         return WinDefWindowProc( hw, msg, mp1, mp2 );
  337.     }    // the outer-switch statement
  338.     
  339.     return 0;
  340. }
  341.  
  342.  
  343.  
  344. int main(int argc,char *argv[])
  345. {
  346.     HMQ    hmq;
  347.    QMSG  qmsg;
  348.     HAB    theHAB;
  349.     int enable;
  350.    HWND frame,client=NULLHANDLE;
  351.    int rc=0;
  352.  
  353.    ULONG frameFlags = FCF_TITLEBAR | FCF_MENU | FCF_SYSMENU | FCF_SIZEBORDER |
  354.                       FCF_MINMAX  | FCF_SHELLPOSITION | FCF_TASKLIST;
  355.     
  356.     theHAB = WinInitialize(0);
  357.     hmq = WinCreateMsgQueue(theHAB,256);
  358.    rc=WinRegisterClass(theHAB,"CLIENT",LoanAmortizationSysProc,0,0);
  359.     
  360.     // initialize the function parser
  361.     MGController :: setupFuncs();
  362.     
  363.     // create a Mesa Controller
  364.     MyMesa = new MSampleController("None",enable,theHAB,1);
  365.     
  366.     // set it up
  367.     MyMesa -> setUp();
  368.     
  369.     // load AddIn's
  370.     MyMesa -> setupAddIns();
  371.  
  372.    // create the frame window
  373.    frame=WinCreateStdWindow(HWND_DESKTOP,WS_VISIBLE,&frameFlags,"CLIENT",
  374.                      "Loan Amortization System",0,0,ID_APPNAME,
  375.                      &client);
  376.  
  377.    // load the pointer used by the client windows
  378.    prtIcon=WinLoadPointer(HWND_DESKTOP,NULL,1);
  379.  
  380.    // run the application
  381.    while (WinGetMsg(theHAB,&qmsg,0,0,0)) {
  382.          WinDispatchMsg(theHAB,&qmsg);
  383.    } /* endwhile */
  384.  
  385.    //destroy the message queue when done
  386.     WinDestroyMsgQueue(hmq);
  387.  
  388.     // clean up the controller
  389.     MyMesa -> cleanUp();
  390.     
  391.     // and make it go away
  392. //    delete MyMesa;
  393.     
  394.     // wait for threads to end
  395.     DosSleep(750);
  396.     
  397.    // outa here!
  398.     WinTerminate(theHAB);
  399. }
  400.