home *** CD-ROM | disk | FTP | other *** search
/ Computer Shopper 275 / DPCS0111DVD.ISO / Toolkit / Audio-Visual / VirtualDub / Source / VirtualDub-1.9.10-src.7z / src / Dita / source / w32button.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  2009-09-14  |  7.1 KB  |  266 lines

  1. //    VirtualDub - Video processing and capture application
  2. //    Copyright (C) 1998-2004 Avery Lee
  3. //
  4. //    This program is free software; you can redistribute it and/or modify
  5. //    it under the terms of the GNU General Public License as published by
  6. //    the Free Software Foundation; either version 2 of the License, or
  7. //    (at your option) any later version.
  8. //
  9. //    This program is distributed in the hope that it will be useful,
  10. //    but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. //    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12. //    GNU General Public License for more details.
  13. //
  14. //    You should have received a copy of the GNU General Public License
  15. //    along with this program; if not, write to the Free Software
  16. //    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  17.  
  18. #include <stdafx.h>
  19. #include <vd2/Dita/w32control.h>
  20.  
  21. ///////////////////////////////////////////////////////////////////////////
  22. //
  23. //    VDUIButtonW32
  24. //
  25. ///////////////////////////////////////////////////////////////////////////
  26.  
  27. class VDUIButtonW32 : public VDUIControlW32 {
  28. public:
  29.     bool Create(IVDUIParameters *);
  30.  
  31.     void PreLayoutBase(const VDUILayoutSpecs& parentConstraints);
  32.  
  33.     void OnCommandCallback(UINT code);
  34. };
  35.  
  36. extern IVDUIWindow *VDCreateUIButton() { return new VDUIButtonW32; }
  37.  
  38. bool VDUIButtonW32::Create(IVDUIParameters *pParams) {
  39.     return CreateW32(pParams, "BUTTON", WS_TABSTOP);
  40. }
  41.  
  42. void VDUIButtonW32::PreLayoutBase(const VDUILayoutSpecs& parentConstraints) {
  43.     vduisize pad = mpBase->MapUnitsToPixels(vduisize(8,14));
  44.  
  45.     SIZE siz = SizeText(parentConstraints.minsize.w, pad.w, pad.h);
  46.  
  47.     mLayoutSpecs.minsize.w    = pad.w + siz.cx;
  48.  
  49.     // hack for non-command buttons
  50.     if ((mAlignY & nsVDUI::kAlignTypeMask) == nsVDUI::kFill)
  51.         mLayoutSpecs.minsize.h    = 0;
  52.     else
  53.         mLayoutSpecs.minsize.h    = pad.h;
  54. }
  55.  
  56. void VDUIButtonW32::OnCommandCallback(UINT code) {
  57.     if (code == BN_CLICKED) {
  58.         mpBase->ProcessActivation(this, mID);
  59.         mpBase->DispatchEvent(this, mID, IVDUICallback::kEventSelect, 0);
  60.     }
  61. }
  62.  
  63. ///////////////////////////////////////////////////////////////////////////
  64. //
  65. //    VDUICheckboxW32
  66. //
  67. ///////////////////////////////////////////////////////////////////////////
  68.  
  69. class VDUICheckboxW32 : public VDUIControlW32 {
  70. public:
  71.     bool Create(IVDUIParameters *);
  72.     void PreLayoutBase(const VDUILayoutSpecs& parentConstraints);
  73.     nsVDUI::CompressType GetCompressType();
  74.     int GetValue();
  75.     void SetValue(int);
  76.     void OnCommandCallback(UINT);
  77. };
  78.  
  79. extern IVDUIWindow *VDCreateUICheckbox() { return new VDUICheckboxW32; }
  80.  
  81. bool VDUICheckboxW32::Create(IVDUIParameters *pParams) {
  82.     return CreateW32(pParams, "BUTTON", BS_AUTOCHECKBOX|BS_TOP|BS_MULTILINE|WS_TABSTOP);
  83. }
  84.  
  85. void VDUICheckboxW32::PreLayoutBase(const VDUILayoutSpecs& parentConstraints) {
  86.     const vduisize pad = mpBase->MapUnitsToPixels(vduisize(14, 10));
  87.  
  88.     mLayoutSpecs.minsize.w = pad.w;
  89.     mLayoutSpecs.minsize.h = pad.h;
  90.  
  91.     SIZE siz = SizeText(parentConstraints.minsize.w - pad.w, pad.w, pad.h);
  92.  
  93.     siz.cy += 2*GetSystemMetrics(SM_CYEDGE);
  94.  
  95.     mLayoutSpecs.minsize.w += siz.cx;
  96.     if (mLayoutSpecs.minsize.h < siz.cy)
  97.         mLayoutSpecs.minsize.h = siz.cy;
  98. }
  99.  
  100. nsVDUI::CompressType VDUICheckboxW32::GetCompressType() {
  101.     return nsVDUI::kCompressCheckbox;
  102. }
  103.  
  104. int VDUICheckboxW32::GetValue() {
  105.     if (mhwnd)
  106.         return BST_CHECKED == SendMessage(mhwnd, BM_GETCHECK, 0, 0);
  107.  
  108.     return false;
  109. }
  110.  
  111. void VDUICheckboxW32::SetValue(int i) {
  112.     if (mhwnd)
  113.         SendMessage(mhwnd, BM_SETCHECK, i?BST_CHECKED:BST_UNCHECKED, 0);
  114.  
  115. }
  116.  
  117. void VDUICheckboxW32::OnCommandCallback(UINT code) {
  118.     if (code == BN_CLICKED) {
  119.         mpBase->ProcessValueChange(this, mID);
  120.         mpBase->DispatchEvent(this, mID, IVDUICallback::kEventSelect, GetValue());
  121.     }
  122. }
  123.  
  124. ///////////////////////////////////////////////////////////////////////////
  125. //
  126. //    VDUIOptionW32
  127. //
  128. ///////////////////////////////////////////////////////////////////////////
  129.  
  130. class VDUIOptionW32 : public VDUIControlW32 {
  131. public:
  132.     enum { kTypeID = 'optn' };
  133.  
  134.     VDUIOptionW32();
  135.     ~VDUIOptionW32();
  136.     void *AsInterface(uint32 id);
  137.     bool Create(IVDUIParameters *pParams);
  138.     void PreLayoutBase(const VDUILayoutSpecs& parentConstraints);
  139.     nsVDUI::CompressType GetCompressType();
  140.     int GetValue();
  141.     void SetValue(int i);
  142.     void OnCommandCallback(UINT code);
  143.  
  144. protected:
  145.     VDUIOptionW32    *mpBaseOption;
  146.     int    mnItems;
  147.     int mnSelected;
  148. };
  149.  
  150. IVDUIWindow *VDCreateUIOption() { return new VDUIOptionW32; }
  151.  
  152. VDUIOptionW32::VDUIOptionW32()
  153.     : mpBaseOption(NULL)
  154.     , mnItems(1)
  155.     , mnSelected(0)
  156. {
  157. }
  158.  
  159. VDUIOptionW32::~VDUIOptionW32() {
  160. }
  161.  
  162. void *VDUIOptionW32::AsInterface(uint32 id) {
  163.     if (id == kTypeID)    return static_cast<VDUIOptionW32 *>(this);
  164.  
  165.     return VDUIControlW32::AsInterface(id);
  166. }
  167.  
  168. bool VDUIOptionW32::Create(IVDUIParameters *pParams) {
  169.     IVDUIWindow *pWin = this;
  170.     
  171.     while(pWin = mpParent->GetPreviousChild(pWin)) {
  172.         mpBaseOption = vdpoly_cast<VDUIOptionW32 *>(pWin);
  173.         if (mpBaseOption) {
  174.             VDUIOptionW32 *pTrueBase = mpBaseOption->mpBaseOption;
  175.             if (pTrueBase)
  176.                 mpBaseOption = pTrueBase;
  177.             break;
  178.         }
  179.     }
  180.  
  181.     if (CreateW32(pParams, "BUTTON", mpBaseOption    ? (BS_AUTORADIOBUTTON|BS_TOP|BS_MULTILINE|WS_TABSTOP)
  182.                                                     : (BS_AUTORADIOBUTTON|BS_TOP|BS_MULTILINE|WS_GROUP)))
  183.     {
  184.         if (mpBaseOption)
  185.             ++mpBaseOption->mnItems;
  186.         else
  187.             SendMessage(mhwnd, BM_SETCHECK, BST_CHECKED, 0);
  188.  
  189.         return true;
  190.     }
  191.  
  192.     return false;
  193. }
  194.  
  195. void VDUIOptionW32::PreLayoutBase(const VDUILayoutSpecs& parentConstraints) {
  196.     vduisize pad = mpBase->MapUnitsToPixels(vduisize(14,10));
  197.  
  198.     mLayoutSpecs.minsize.w = pad.w;
  199.     mLayoutSpecs.minsize.h = pad.h;
  200.  
  201.     SIZE siz = SizeText(parentConstraints.minsize.w, pad.w, pad.h);
  202.  
  203.     siz.cy += 2*GetSystemMetrics(SM_CYEDGE);
  204.  
  205.     mLayoutSpecs.minsize.w += siz.cx;
  206.     if (mLayoutSpecs.minsize.h < siz.cy)
  207.         mLayoutSpecs.minsize.h = siz.cy;
  208. }
  209.  
  210. nsVDUI::CompressType VDUIOptionW32::GetCompressType() {
  211.     return nsVDUI::kCompressOption;
  212. }
  213.  
  214. int VDUIOptionW32::GetValue() {
  215.     VDASSERT(!mpBaseOption);
  216.  
  217.     return mnSelected;
  218. }
  219.  
  220. void VDUIOptionW32::SetValue(int i) {
  221.     VDASSERT(!mpBaseOption);
  222.  
  223.     if (i >= mnItems)
  224.         i = mnItems - 1;
  225.  
  226.     if (i < 0)
  227.         i = 0;
  228.  
  229.     if (mnSelected != i) {
  230.         mnSelected = i;
  231.         mpBase->ProcessValueChange(this, mID);
  232.  
  233.         if (mhwnd) {
  234.             // change me
  235.             SendMessage(mhwnd, BM_SETCHECK, (i==0) ? BST_CHECKED : BST_UNCHECKED, 0);
  236.  
  237.             // change others
  238.             for(IVDUIWindow *win = this; win; win = mpParent->GetNextChild(win)) {
  239.                 VDUIOptionW32 *opt = vdpoly_cast<VDUIOptionW32 *>(win);
  240.  
  241.                 if (opt && opt->mpBaseOption == this)
  242.                     SendMessage(opt->mhwnd, BM_SETCHECK, opt->mID - mID == i ? BST_CHECKED : BST_UNCHECKED, 0);
  243.             }
  244.         }
  245.     }
  246. }
  247.  
  248. void VDUIOptionW32::OnCommandCallback(UINT code) {
  249.     if (code == BN_CLICKED) {
  250.         if (SendMessage(mhwnd, BM_GETCHECK, 0, 0) == BST_CHECKED) {
  251.             int val = 0;
  252.             
  253.             if (mpBaseOption) {
  254.                 val = mID - mpBaseOption->mID;
  255.  
  256.                 mpBaseOption->mnSelected = val;
  257.                 mpBase->ProcessValueChange(mpBaseOption, mpBaseOption->mID);
  258.             } else {
  259.                 mnSelected = 0;
  260.                 mpBase->ProcessValueChange(this, mID);
  261.             }
  262.             mpBase->DispatchEvent(this, mID - val, IVDUICallback::kEventSelect, val);
  263.         }
  264.     }
  265. }
  266.