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 / w32listbox.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  2009-09-14  |  6.3 KB  |  245 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/system/w32assist.h>
  20. #include <windows.h>
  21. #include <commctrl.h>
  22. #include <vector>
  23.  
  24. #include <vd2/Dita/w32control.h>
  25.  
  26. class VDUIListBoxW32 : public VDUIControlW32, public IVDUIList {
  27. public:
  28.     VDUIListBoxW32();
  29.  
  30.     void *AsInterface(uint32 id);
  31.  
  32.     bool Create(IVDUIParameters *);
  33.     void PreLayoutBaseW32(const VDUILayoutSpecs&);
  34.  
  35.     int GetValue();
  36.     void SetValue(int);
  37.  
  38. protected:
  39.     void Clear();
  40.     int GetItemCount();
  41.     uintptr GetItemData(int index);
  42.     void SetItemData(int index, uintptr data);
  43.     int AddItem(const wchar_t *text, uintptr data = 0);
  44.  
  45.     void OnCommandCallback(UINT code);
  46.  
  47.     int mSelected;
  48. };
  49.  
  50. extern IVDUIWindow *VDCreateUIListBox() { return new VDUIListBoxW32; }
  51.  
  52. VDUIListBoxW32::VDUIListBoxW32()
  53.     : mSelected(-1)
  54. {
  55. }
  56.  
  57. void *VDUIListBoxW32::AsInterface(uint32 id) {
  58.     if (id == IVDUIList::kTypeID) return static_cast<IVDUIList *>(this);
  59.  
  60.     return VDUIControlW32::AsInterface(id);
  61. }
  62.  
  63. bool VDUIListBoxW32::Create(IVDUIParameters *pParameters) {
  64.     return CreateW32(pParameters, "LISTBOX", LBS_NOTIFY|LBS_NOINTEGRALHEIGHT|WS_TABSTOP|WS_VSCROLL);
  65. }
  66.  
  67. void VDUIListBoxW32::PreLayoutBaseW32(const VDUILayoutSpecs& parentConstraints) {
  68. }
  69.  
  70. void VDUIListBoxW32::Clear() {
  71.     SendMessage(mhwnd, LB_RESETCONTENT, 0, 0);
  72. }
  73.  
  74. int VDUIListBoxW32::GetItemCount() {
  75.     LRESULT lr = SendMessage(mhwnd, LB_GETCOUNT, 0, 0);
  76.  
  77.     VDASSERT(lr != LB_ERR);
  78.  
  79.     return lr == LB_ERR ? 0 : (int)lr;
  80. }
  81.  
  82. uintptr VDUIListBoxW32::GetItemData(int index) {
  83.     return SendMessage(mhwnd, LB_GETITEMDATA, index, 0);
  84. }
  85.  
  86. void VDUIListBoxW32::SetItemData(int index, uintptr data) {
  87.     SendMessage(mhwnd, LB_SETITEMDATA, index, (LPARAM)data);
  88. }
  89.  
  90. int VDUIListBoxW32::AddItem(const wchar_t *text, uintptr data) {
  91.     int idx;
  92.  
  93.     if (VDIsWindowsNT())
  94.         idx = (int)SendMessageW(mhwnd, LB_ADDSTRING, 0, (LPARAM)text);
  95.     else
  96.         idx = (int)SendMessageA(mhwnd, LB_ADDSTRING, 0, (LPARAM)VDTextWToA(text).c_str());
  97.  
  98.     if (idx >= 0)
  99.         SendMessage(mhwnd, LB_SETITEMDATA, (WPARAM)idx, (LPARAM)data);
  100.  
  101.     return idx;
  102. }
  103.  
  104. void VDUIListBoxW32::OnCommandCallback(UINT code) {
  105.        if (code == LBN_SELCHANGE) {
  106.            int iSel = (int)SendMessage(mhwnd, LB_GETCURSEL, 0, 0);
  107.  
  108.            if (iSel != mSelected) {
  109.                mSelected = iSel;
  110.  
  111.             mpBase->ProcessValueChange(this, mID);
  112.                mpBase->DispatchEvent(this, mID, IVDUICallback::kEventSelect, mSelected);
  113.            }
  114.     }
  115. }
  116.  
  117. int VDUIListBoxW32::GetValue() {
  118.     return mSelected;
  119. }
  120.  
  121. void VDUIListBoxW32::SetValue(int value) {
  122.     mSelected = value;        // prevents recursion
  123.     SendMessage(mhwnd, LB_SETCURSEL, value, 0);
  124. }
  125.  
  126.  
  127. ///////////////////////////////////////////////////////////////////////////
  128.  
  129. class VDUIComboBoxW32 : public VDUIControlW32, public IVDUIList {
  130. public:
  131.     VDUIComboBoxW32();
  132.  
  133.     void *AsInterface(uint32 id);
  134.  
  135.     bool Create(IVDUIParameters *);
  136.     void SetArea(const vduirect&);
  137.     void PreLayoutBaseW32(const VDUILayoutSpecs&);
  138.  
  139.     int GetValue();
  140.     void SetValue(int);
  141.  
  142. protected:
  143.     void Clear();
  144.     int GetItemCount();
  145.     uintptr GetItemData(int index);
  146.     void SetItemData(int index, uintptr data);
  147.     int AddItem(const wchar_t *text, uintptr data);
  148.  
  149.     void OnCommandCallback(UINT code);
  150.  
  151.     int mSelected;
  152.     int mHeight;
  153. };
  154.  
  155. extern IVDUIWindow *VDCreateUIComboBox() { return new VDUIComboBoxW32; }
  156.  
  157. VDUIComboBoxW32::VDUIComboBoxW32()
  158.     : mSelected(-1)
  159. {
  160. }
  161.  
  162. void *VDUIComboBoxW32::AsInterface(uint32 id) {
  163.     if (id == IVDUIList::kTypeID) return static_cast<IVDUIList *>(this);
  164.  
  165.     return VDUIControlW32::AsInterface(id);
  166. }
  167.  
  168. bool VDUIComboBoxW32::Create(IVDUIParameters *pParameters) {
  169.     if (!CreateW32(pParameters, "COMBOBOX", CBS_DROPDOWNLIST|WS_TABSTOP|WS_VSCROLL))
  170.         return false;
  171.  
  172.     RECT r;
  173.     GetClientRect(mhwnd, &r);
  174.     mHeight = r.bottom - r.top;
  175.  
  176.     return true;
  177. }
  178.  
  179. void VDUIComboBoxW32::SetArea(const vduirect& pos) {
  180.     SetWindowPos(mhwnd, NULL, pos.left, pos.top, pos.width(), mHeight*5, SWP_NOZORDER|SWP_NOACTIVATE);    // FIXME
  181.     VDUIWindow::SetArea(pos);
  182. }
  183.  
  184. void VDUIComboBoxW32::PreLayoutBaseW32(const VDUILayoutSpecs& parentConstraints) {
  185.     mLayoutSpecs.minsize.w = GetSystemMetrics(SM_CXVSCROLL);
  186.     mLayoutSpecs.minsize.h = mHeight;
  187. }
  188.  
  189. void VDUIComboBoxW32::Clear() {
  190.     SendMessage(mhwnd, CB_RESETCONTENT, 0, 0);
  191. }
  192.  
  193. int VDUIComboBoxW32::GetItemCount() {
  194.     LRESULT lr = SendMessage(mhwnd, CB_GETCOUNT, 0, 0);
  195.  
  196.     VDASSERT(lr != CB_ERR);
  197.  
  198.     return (lr == CB_ERR) ? 0 : (int)lr;
  199. }
  200.  
  201. uintptr VDUIComboBoxW32::GetItemData(int index) {
  202.     return (uintptr)SendMessage(mhwnd, CB_GETITEMDATA, index, 0);
  203. }
  204.  
  205. void VDUIComboBoxW32::SetItemData(int index, uintptr data) {
  206.     SendMessage(mhwnd, CB_SETITEMDATA, index, (LPARAM)data);
  207. }
  208.  
  209. int VDUIComboBoxW32::AddItem(const wchar_t *text, uintptr data) {
  210.     int sel;
  211.  
  212.     if (VDIsWindowsNT())
  213.         sel = (int)SendMessageW(mhwnd, CB_ADDSTRING, 0, (LPARAM)text);
  214.     else
  215.         sel = (int)SendMessageA(mhwnd, CB_ADDSTRING, 0, (LPARAM)VDTextWToA(text).c_str());
  216.  
  217.     if (sel >= 0)
  218.         SendMessage(mhwnd, CB_SETITEMDATA, (WPARAM)sel, (LPARAM)data);
  219.  
  220.     return sel;
  221. }
  222.  
  223. void VDUIComboBoxW32::OnCommandCallback(UINT code) {
  224.        if (code == CBN_SELCHANGE) {
  225.            int iSel = (int)SendMessage(mhwnd, CB_GETCURSEL, 0, 0);
  226.  
  227.            if (iSel != mSelected) {
  228.                mSelected = iSel;
  229.  
  230.             mpBase->ProcessValueChange(this, mID);
  231.                mpBase->DispatchEvent(this, mID, IVDUICallback::kEventSelect, mSelected);
  232.            }
  233.     }
  234. }
  235.  
  236. int VDUIComboBoxW32::GetValue() {
  237.     return mSelected;
  238. }
  239.  
  240. void VDUIComboBoxW32::SetValue(int value) {
  241.     mSelected = value;        // prevents recursion
  242.     SendMessage(mhwnd, CB_SETCURSEL, value, 0);
  243. }
  244.  
  245.