home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / vos2-121.zip / v / examp / mycmdwin.cpp < prev    next >
C/C++ Source or Header  |  1998-11-13  |  11KB  |  405 lines

  1. //=======================================================================
  2. //  mycmdwin.cxx:     Source file for app cmdwin class
  3. //  Copyright (C) 1995  Bruce E. Wampler
  4. //
  5. //  This program is part of the V C++ GUI Framework example programs.
  6. //
  7. //  This program is free software; you can redistribute it and/or modify
  8. //  it under the terms of the GNU General Public License as published by
  9. //  the Free Software Foundation; either version 2 of the License, or
  10. //  (at your option) any later version.
  11. //
  12. //  This program is distributed in the hope that it will be useful,
  13. //  but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. //  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15. //  GNU General Public License for more details.
  16. //
  17. //  You should have received a copy of the GNU General Public License
  18. //  (see COPYING) along with this program; if not, write to the Free
  19. //  Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  20. //=======================================================================
  21.  
  22. #include <v/vnotice.h>    // so we can use notice
  23. #include <v/vkeys.h>    // to map keys
  24. #include <v/vpen.h>
  25. #include <v/vfilesel.h>
  26. #include <v/vutil.h>
  27.  
  28. #include "mycmdwin.h"    // our header
  29.  
  30. //    Start defines for the main window with 100
  31.  
  32. #define m_CheckMe 100
  33. #define m_CopySens 101
  34. #define m_Dialog 102
  35. #define m_ModalDialog 103
  36. #define m_Clear 104
  37.  
  38. #define m_LineWidth 105
  39. #define m_ChangePen 106
  40.  
  41.     // Define the pulldown menus
  42.     static vMenu FileMenu[] =
  43.       {
  44.     {"New", M_New, isSens, notChk, noKeyLbl, noKey, noSub},
  45.     {"Open", M_Open, isSens, notChk, noKeyLbl, noKey, noSub},
  46.     {"Save", M_Save, notSens, notChk, noKeyLbl, noKey, noSub},
  47.     {"Save As", M_SaveAs, notSens, notChk, noKeyLbl, noKey, noSub},
  48. #ifdef vDEBUG
  49.     {"-", M_Line, notSens, notChk, noKeyLbl, noKey, noSub},
  50.     {"Debug", M_SetDebug, isSens, notChk, noKeyLbl, noKey, noSub},
  51. #endif
  52.     {"-", M_Line, notSens, notChk, noKeyLbl, noKey, noSub},
  53.     {"Exit", M_Exit, isSens, notChk, noKeyLbl, noKey, noSub},
  54.     {NULL}
  55.       };
  56.  
  57.     static vMenu EditMenu[] =
  58.       {
  59.     {"Cut", M_Cut, notSens, notChk, noKeyLbl, noKey, noSub},
  60.     {"Copy", M_Copy, notSens, notChk, noKeyLbl, noKey, noSub},
  61.     {"Paste", M_Paste, notSens, notChk, noKeyLbl, noKey, noSub},
  62.     {NULL}
  63.       };
  64.  
  65.     static vMenu TestMenu[] =
  66.       {
  67.     {"CheckMe", m_CheckMe, isSens, notChk, noKeyLbl, noKey, noSub},
  68.     {"Copy Sensitive", m_CopySens, isSens, notChk, noKeyLbl, noKey, noSub},
  69.     {"Dialog", m_Dialog, isSens, notChk, noKeyLbl, noKey, noSub},
  70.     {"Modal Dialog", m_ModalDialog, isSens, notChk, noKeyLbl, noKey, noSub},
  71.         {NULL}
  72.       };
  73.  
  74.     // Define a standard menu
  75.     vMenu StandardMenu[] =
  76.       {
  77.     {"File", M_File, isSens, notUsed, notUsed, noKey, &FileMenu[0]},
  78.         // the File menu
  79.     {"Edit", M_Edit, isSens, notUsed, notUsed, noKey, &EditMenu[0]},
  80.         // the Edit menu
  81.     {"Test", M_Test, isSens, notUsed, notUsed, noKey, &TestMenu[0]},
  82.         // the Test menu
  83.     {NULL}
  84.       };
  85.  
  86.     static int minMaxStep[3] = {1, 20, 1};
  87.     // Define a button bar, usually with something useful
  88.     static CommandObject CommandBar[] =
  89.       {
  90.     {C_Button, M_Copy, M_Copy, "Copy",NoList,CA_None,notSens,NoFrame,0,0},
  91.     {C_Button, m_Clear, m_Clear, "Clear",NoList,CA_None,isSens,NoFrame,0,0},
  92.  
  93.     {C_Label, 999, 0 ,"Width:",NoList,CA_None, isSens, NoFrame,0,0},
  94.     {C_Spinner,m_LineWidth,1,"",(void*)&minMaxStep[0],CA_None,isSens,NoFrame,0,0},
  95.     {C_Button, m_ChangePen, m_ChangePen, "      Pen: ",NoList,
  96.         CA_None,isSens,NoFrame,0,0},
  97.  
  98. #define vC_Size 12
  99. #include<v/vcb2x8.h>
  100.  
  101.     {C_ColorButton, M_Exit, M_Exit, "Exit", &vStdColors[vC_Red],CA_None,isSens,NoFrame, 0, 0},
  102.  
  103.     {C_EndOfList,0,0,0,0,CA_None,0,0,0}
  104.       };
  105.  
  106. #define m_cmdMsg 110
  107. #define m_cmdCount 111
  108. #define m_keyMsg 112
  109. #define m_keyVal 113
  110.  
  111.     // Define a simple status bar
  112.     static vStatus StatBar[] =
  113.       {
  114.     {"Commands issued: ", m_cmdMsg, CA_NoBorder, isSens, 0},
  115.     {"   ", m_cmdCount, CA_None, isSens, 0},
  116.     {"Last keypress: ", m_keyMsg, CA_NoBorder, isSens, 0},
  117.     {"   ", m_keyVal, CA_None, isSens, 0},
  118.     {0,0,0,0,0}
  119.       };
  120.  
  121.     static char* filter[] =
  122.       {
  123.         "*",
  124.         "*.txt",
  125.         "*.c *.cxx *.h",
  126.         0
  127.       };
  128.     int fi = 0;
  129.     int copy_sens = 0;            // for tracking copy sensitive
  130.  
  131. //====================>>> myCmdWindow::myCmdWindow <<<====================
  132.   myCmdWindow::myCmdWindow(char* name, int width, int height) :
  133.     vCmdWindow(name, width, height)
  134.   {
  135.     UserDebug1(Constructor,"myCmdWindow::myCmdWindow(%s) Constructor\n",name)
  136.  
  137.     // The "Standard" window will consist of a menubar, a canvas,
  138.     // an optional button bar, and an optional status bar.
  139.  
  140.     // First, create and add the proper panes to the CmdWindow
  141.     // Note: there must be a correspondint delete in the destructor
  142.  
  143.     // The Menu Bar
  144.     myMenu = new vMenuPane(StandardMenu);    // the standard menu
  145.     AddPane(myMenu);                // add pane to window
  146.  
  147.     // The Canvas
  148.     myCanvas = new myCanvasPane;        // a new canvas pane
  149.     AddPane(myCanvas);                // add the pane to window
  150.  
  151.     // The command pane
  152.     myCmdPane = new vCommandPane(CommandBar);
  153.     AddPane(myCmdPane);
  154.  
  155.     // The Status Bar
  156.     myStatus = new vStatusPane(StatBar);    // a new status bar
  157.     AddPane(myStatus);            // add pane to window
  158.  
  159.     // Now, cerate whatever dialogs and windows this app defines.
  160.  
  161.     // Create instance of myDialog, and define default commands
  162.     sampleDialog = new myDialog(this);
  163.  
  164.     // Create instance of myModalDialog, and define default commands
  165.     sampleModalDialog = new myModalDialog(this);
  166.     
  167.     // FINALLY, after all the panes have been constructed and
  168.     // added, we must show the window!
  169.  
  170.     changePen = 1;        // we are changing pen
  171.     ShowWindow();
  172.   }
  173.  
  174. //====================>>> myCmdWindow::myCmdWindow <<<====================
  175.   myCmdWindow::myCmdWindow(const myCmdWindow& w) : vCmdWindow(w)
  176.   {
  177.     // This copy constructor is used to support the shallow destructor
  178.     // convention used by the V framework.
  179.  
  180.     UserDebug(Constructor,"myCmdWindow::myCmdWindow() Copy constructor\n")
  181.     vSysError("myCmdWindow: V does not support copy constructors");
  182.   }
  183.  
  184. //====================>>> myCmdWindow::~myCmdWindow <<<====================
  185.   myCmdWindow::~myCmdWindow()
  186.   {
  187.     UserDebug(Destructor,"myCmdWindow::~myCmdWindow() destructor\n")
  188.  
  189.     // Now put a delete for each new in the constructor.
  190.  
  191.     delete myMenu;
  192.     delete myCanvas;
  193.     delete myStatus;
  194.     delete myCmdPane;
  195.     delete sampleDialog;
  196.     delete sampleModalDialog;
  197.   }
  198.  
  199. //====================>>> myCmdWindow::KeyIn <<<====================
  200.   void myCmdWindow::KeyIn(vKey keysym, unsigned int shift)
  201.   {
  202.     static char ctrl[] = "^X ";
  203.     static char chr[] = " X ";
  204.  
  205.     if (vk_IsModifier(keysym))
  206.     SetString(m_keyVal, "mod");    // change status bar
  207.     else if (keysym < ' ')        // ctrl char
  208.       {
  209.     ctrl[1] = keysym + '@';
  210.     SetString(m_keyVal, ctrl);    // change status bar
  211.       }
  212.     else if (keysym < 128)        // normal printable char
  213.       {
  214.     chr[1] = keysym;
  215.     SetString(m_keyVal, chr);    // change status bar
  216.       }
  217.     else 
  218.     SetString(m_keyVal, "+++");    // change status bar
  219.   }
  220.  
  221. //====================>>> myCmdWindow::WindowCommand <<<====================
  222.   void myCmdWindow::WindowCommand(ItemVal id, ItemVal val, CmdType cType)
  223.   {
  224.     // route all commands through here - menus and buttons
  225.  
  226.     static int cmdCount = 0;
  227.  
  228.     vNoticeDialog note(this);        // Used for default actions
  229.  
  230.     char buff[20];            // buff for status
  231.  
  232.     ++cmdCount;                // count commands that have been issued
  233.     IntToStr(cmdCount,buff);
  234.     SetString(m_cmdCount, buff);    // change status bar
  235.  
  236.     UserDebug1(CmdEvents,"myCmdWindow:WindowCommand(%d)\n",id)
  237.  
  238.     switch (id)
  239.       {
  240.     case M_New:
  241.       {
  242.         note.Notice("New");
  243.         theApp->NewAppWin(0,"",250,100);    // call our NewAppWin method
  244.         break;
  245.       }
  246.  
  247.     case M_Open:
  248.       {
  249.         static char name[100] = ""; // start out with null name
  250.             vFileSelect fsel(this);     // make an instance
  251.     
  252.  
  253.             int oans = fsel.FileSelect("Open file",name,99,filter,fi);
  254.  
  255.             vNoticeDialog fsnote(this); // make an instance
  256.  
  257.             if (oans && *name)
  258.               {
  259.                 SetTitle(name);
  260.                 (void)note.Notice(name);
  261.               }
  262.             else
  263.                 (void)note.Notice("No file name input.");
  264.  
  265.         break;
  266.       }
  267.  
  268.     case M_Save:
  269.       {
  270.         note.Notice("Save");
  271.         break;
  272.       }
  273.  
  274.     case M_SaveAs:
  275.       {
  276.         note.Notice("Save As");
  277.         break;
  278.       }
  279.  
  280.         // For case M_SetDebug, Vigr should generate following code,
  281.     // including vDEBUG #ifdef
  282.  
  283. #ifdef vDEBUG
  284.     case M_SetDebug:
  285.       {
  286.         vDebugDialog debug(this);
  287.         debug.SetDebug();        // select debug
  288.  
  289.         break;
  290.       }
  291. #endif
  292.  
  293.     case M_Exit:
  294.       {
  295.         theApp->Exit();        // Standard action for Exit
  296.         break;
  297.       }
  298.  
  299.     case M_Cut:
  300.       {
  301.         note.Notice("Cut");
  302.         break;
  303.       }
  304.  
  305.     case M_Copy:
  306.       {
  307.         note.Notice("Copy");
  308.         break;
  309.       }
  310.  
  311.     case M_Paste:
  312.       {
  313.         note.Notice("Paste");
  314.         break;
  315.       }
  316.  
  317.     case m_CheckMe:
  318.       {
  319.         // This code would be supplied by the user, not Vigr
  320.  
  321.         ItemVal curval = GetValue(id);
  322.  
  323.         SetValue(m_CheckMe,!curval,Checked);
  324.         if (curval)
  325.         SetString(m_CheckMe,"Check Me");
  326.         else
  327.         SetString(m_CheckMe,"UnChk Me");
  328.  
  329.         break;
  330.       }
  331.  
  332.     case m_CopySens:
  333.       {
  334.         // This code would be supplied by the user, not Vigr
  335.         copy_sens = !copy_sens;
  336.         SetValue(M_Copy,copy_sens,Sensitive);
  337.  
  338.         break;
  339.       }
  340.  
  341.     case m_Dialog:
  342.       {
  343.         // Ideally, Vigr will generate the following code, too:
  344.         if (!sampleDialog->IsDisplayed())    // not twice!
  345.         sampleDialog->ShowDialog("Sample Modeless Dialog");
  346.         break;
  347.       }
  348.  
  349.     case m_ModalDialog:
  350.       {
  351.         // Ideally, Vigr will generate the following code, too:
  352.         ItemVal rval, rid;
  353.         if (!sampleModalDialog->IsDisplayed())    // not twice!
  354.         rid = sampleModalDialog->ShowModalDialog("Sample Modal",rval);
  355.         break;
  356.       }
  357.  
  358.     case m_ChangePen:
  359.       {
  360.         if (changePen)
  361.           {
  362.         SetString(m_ChangePen,"Background:");
  363.         changePen = 0;
  364.           }
  365.         else
  366.           {
  367.         SetString(m_ChangePen,"      Pen: ");
  368.         changePen = 1;
  369.           }
  370.         break;
  371.       }
  372.  
  373.     case m_LineWidth:
  374.       {
  375.         _pen.SetWidth(val);
  376.         myCanvas->SetPen(_pen);
  377.         break;
  378.       }
  379.  
  380.     case m_Clear:
  381.       {
  382.         myCanvas->Clear();
  383.         break;
  384.       }
  385.  
  386.     default:        // route unhandled commands up
  387.       {
  388.         if (id >= M_Black && id <= M_White)
  389.           {
  390.         if (changePen)
  391.           {
  392.             _pen.SetColor(vStdColors[val]);
  393.             myCanvas->SetPen(_pen);
  394.           }
  395.         else
  396.             myCanvas->SetBackground(vStdColors[val]);
  397.           }
  398.         else
  399.         vCmdWindow::WindowCommand(id, val, cType);
  400.         break;
  401.       }
  402.         
  403.       }
  404.   }
  405.