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 / ctl_set.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  2009-09-14  |  7.8 KB  |  294 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/basetypes.h>
  20. #include <vector>
  21.  
  22. class VDUISet : public VDUIWindow {
  23. public:
  24.     VDUISet();
  25.     ~VDUISet();
  26.  
  27.     bool Create(IVDUIParameters *pParams);
  28.     void PreLayoutBase(const VDUILayoutSpecs&);
  29.     void PostLayoutBase(const vduirect&);
  30.  
  31. protected:
  32.     int mnFillCount;
  33.     int mComponentWidth;
  34.     int mSpacing;
  35.     bool mbVertical;
  36. };
  37.  
  38. IVDUIWindow *VDCreateUISet() { return new VDUISet; }
  39.  
  40. VDUISet::VDUISet() {
  41.     mAlignX = nsVDUI::kFill;
  42.     mAlignY = nsVDUI::kFill;
  43. }
  44.  
  45. VDUISet::~VDUISet() {
  46. }
  47.  
  48. bool VDUISet::Create(IVDUIParameters *pParams) {
  49.     mSpacing = pParams->GetI(nsVDUI::kUIParam_Spacing, 0);
  50.     mbVertical = pParams->GetB(nsVDUI::kUIParam_IsVertical, false);
  51.     return VDUIWindow::Create(pParams);
  52. }
  53.  
  54. void VDUISet::PreLayoutBase(const VDUILayoutSpecs& parentConstraints) {
  55.     vduisize pad = mpBase->MapUnitsToPixels(vduisize(mSpacing, mSpacing));
  56. //    nsVDUI::eCompressType lastCompressType = nsVDUI::kCompressTypeLimit;
  57.  
  58.     mLayoutSpecs.minsize.w = 0;
  59.     mLayoutSpecs.minsize.h = 0;
  60.     mnFillCount = 0;
  61.  
  62.     const int spacing = mbVertical ? pad.h : pad.w;
  63.  
  64.     for(tChildren::iterator it = mChildren.begin(); it != mChildren.end(); ++it) {
  65.         IVDUIWindow *pControl = (*it);
  66.         nsVDUI::Alignment alignX, alignY;
  67. //        nsVDUI::eCompressType compressType = pControl->GetCompressType();
  68.  
  69. //        if (lastCompressType != compressType || lastCompressType == nsVDUI::kCompressNone)
  70.             if (mbVertical)
  71.                 mLayoutSpecs.minsize.h += spacing;
  72.             else
  73.                 mLayoutSpecs.minsize.w += spacing;
  74.  
  75. //        lastCompressType = compressType;
  76.  
  77.         pControl->GetAlignment(alignX, alignY);
  78.  
  79.         const nsVDUI::Alignment align = mbVertical ? alignY : alignX;
  80.  
  81.         if ((align & nsVDUI::kAlignTypeMask) == nsVDUI::kFill)
  82.             ++mnFillCount;
  83.         else {
  84.             pControl->PreLayout(parentConstraints);
  85.  
  86.             const VDUILayoutSpecs& specs = pControl->GetLayoutSpecs();
  87.  
  88.             if (mbVertical) {
  89.                 mLayoutSpecs.minsize.h += specs.minsize.h;
  90.                 if (mLayoutSpecs.minsize.w < specs.minsize.w)
  91.                     mLayoutSpecs.minsize.w = specs.minsize.w;
  92.             } else {
  93.                 mLayoutSpecs.minsize.w += specs.minsize.w;
  94.                 if (mLayoutSpecs.minsize.h < specs.minsize.h)
  95.                     mLayoutSpecs.minsize.h = specs.minsize.h;
  96.             }
  97.         }
  98.     }
  99.  
  100.     int fillSize = 0;
  101.     int fillLeft = mnFillCount;
  102.  
  103.     if (!mChildren.empty()) {
  104.         if (mbVertical) {
  105.             mLayoutSpecs.minsize.h -= spacing;
  106.             fillSize = parentConstraints.minsize.h - mLayoutSpecs.minsize.h;
  107.         } else {
  108.             mLayoutSpecs.minsize.w -= spacing;
  109.             fillSize = parentConstraints.minsize.w - mLayoutSpecs.minsize.w;
  110.         }
  111.     }
  112.  
  113.     if (fillSize < 0)
  114.         fillSize = 0;
  115.  
  116.     if (fillLeft) {
  117.         VDUILayoutSpecs constraints(parentConstraints);
  118.  
  119.         if (mbVertical)
  120.             constraints.minsize.h = fillSize / fillLeft;
  121.         else
  122.             constraints.minsize.w = fillSize / fillLeft;
  123.  
  124.         for(tChildren::iterator it2 = mChildren.begin(); it2 != mChildren.end(); ++it2) {
  125.             IVDUIWindow *pControl = (*it2);
  126.             nsVDUI::Alignment alignX, alignY;
  127.  
  128.             pControl->GetAlignment(alignX, alignY);
  129.  
  130.             if (((mbVertical ? alignY : alignX) & nsVDUI::kAlignTypeMask) == nsVDUI::kFill) {
  131.  
  132.                 pControl->PreLayout(constraints);
  133.  
  134.                 const VDUILayoutSpecs& specs = pControl->GetLayoutSpecs();
  135.  
  136.                 if (mbVertical) {
  137.                     mLayoutSpecs.minsize.h += specs.minsize.h;
  138.                     if (mLayoutSpecs.minsize.w < specs.minsize.w)
  139.                         mLayoutSpecs.minsize.w = specs.minsize.w;
  140.                 } else {
  141.                     mLayoutSpecs.minsize.w += specs.minsize.w;
  142.                     if (mLayoutSpecs.minsize.h < specs.minsize.h)
  143.                         mLayoutSpecs.minsize.h = specs.minsize.h;
  144.                 }
  145.             }
  146.         }
  147.     }
  148.  
  149.     // cache this since our minsize will be whacked by alignment specs
  150.     mComponentWidth = mbVertical ? mLayoutSpecs.minsize.h : mLayoutSpecs.minsize.w;
  151. }
  152.  
  153. void VDUISet::PostLayoutBase(const vduirect& target) {
  154.     VDUIWindow::PostLayoutBase(target);
  155.  
  156.     vduisize pad = mpBase->MapUnitsToPixels(vduisize(mSpacing, mSpacing));
  157. //    nsVDUI::eCompressType lastCompressType = nsVDUI::kCompressTypeLimit;
  158.  
  159.     int spacing        = mbVertical ? pad.h : pad.w;
  160.     int pos            = mbVertical ? target.top - spacing : target.left - spacing;
  161.     int spill        = mbVertical ? target.height() - mComponentWidth : target.width() - mComponentWidth;
  162.     int fillleft    = mnFillCount;
  163.  
  164.     for(tChildren::iterator it = mChildren.begin(); it != mChildren.end(); ++it) {
  165.         IVDUIWindow *pControl = (*it);
  166.         nsVDUI::Alignment alignX, alignY;
  167. //        nsVDUI::eCompressType compressType = pControl->GetCompressType();
  168.  
  169. //        if (lastCompressType != compressType || lastCompressType == nsVDUI::kCompressNone)
  170.             pos += spacing;
  171.  
  172. //        lastCompressType = compressType;
  173.  
  174.         pControl->GetAlignment(alignX, alignY);
  175.  
  176.         const VDUILayoutSpecs& specs = pControl->GetLayoutSpecs();
  177.         int size = mbVertical ? specs.minsize.h : specs.minsize.w;
  178.  
  179.         if (((mbVertical ? alignY : alignX) & nsVDUI::kAlignTypeMask) == nsVDUI::kFill) {
  180.             int span = (spill + fillleft - 1) / fillleft;
  181.  
  182.             size += span;
  183.             spill -= span;
  184.             --fillleft;
  185.         }
  186.  
  187.  
  188.         if (mbVertical)
  189.             pControl->PostLayout(vduirect(target.left, pos, target.right, pos+size));
  190.         else
  191.             pControl->PostLayout(vduirect(pos, target.top, pos+size, target.bottom));
  192.  
  193.         pos += size;
  194.     }
  195. }
  196.  
  197.  
  198. ///////////////////////////////////////////////////////////////////////////
  199.  
  200. class VDUIPageSet : public VDUIWindow, public IVDUIPageSet {
  201. public:
  202.     VDUIPageSet();
  203.     ~VDUIPageSet();
  204.  
  205.     void *AsInterface(uint32 id);
  206.  
  207.     void PreLayoutBase(const VDUILayoutSpecs&);
  208.     void PostLayoutBase(const vduirect&);
  209.  
  210.     int GetValue();
  211.     void SetValue(int value);
  212.  
  213.     void AddPage(int dialogID);
  214. protected:
  215.     int mCurrentPage;
  216.  
  217.     std::vector<int>    mPages;
  218. };
  219.  
  220. IVDUIWindow *VDCreateUIPageSet() { return new VDUIPageSet; }
  221.  
  222. VDUIPageSet::VDUIPageSet()
  223.     : mCurrentPage(-1)
  224. {
  225. }
  226.  
  227. VDUIPageSet::~VDUIPageSet() {
  228. }
  229.  
  230. void *VDUIPageSet::AsInterface(uint32 id) {
  231.     switch(id) {
  232.     case IVDUIPageSet::kTypeID:    return static_cast<IVDUIPageSet *>(this);
  233.     }
  234.  
  235.     return VDUIWindow::AsInterface(id);
  236. }
  237.  
  238. void VDUIPageSet::PreLayoutBase(const VDUILayoutSpecs& parentConstraints) {
  239.     if (!mChildren.empty()) {
  240.         IVDUIWindow *pWin = mChildren.front();
  241.  
  242.         pWin->PreLayout(parentConstraints);
  243.         mLayoutSpecs = pWin->GetLayoutSpecs();
  244.     }
  245. }
  246.  
  247. void VDUIPageSet::PostLayoutBase(const vduirect& target) {
  248.     VDUIWindow::PostLayoutBase(target);
  249.  
  250.     if (!mChildren.empty()) {
  251.         IVDUIWindow *pWin = mChildren.front();
  252.  
  253.         pWin->PostLayout(target);
  254.     }
  255. }
  256.  
  257. int VDUIPageSet::GetValue() {
  258.     return mCurrentPage;
  259. }
  260.  
  261. void VDUIPageSet::SetValue(int value) {
  262.     if (mCurrentPage == value)
  263.         return;
  264.  
  265.     mCurrentPage = value;
  266.  
  267.     // destroy children
  268.     while(!mChildren.empty()) {
  269.         IVDUIWindow *pChild = mChildren.back();
  270.         mChildren.pop_back();
  271.  
  272.         pChild->Shutdown();
  273.         pChild->Release();
  274.     }
  275.  
  276.     // create new dialog
  277.     if ((unsigned)value < mPages.size()) {
  278.         IVDUIWindow *pChildWin = VDCreateDialogFromResource(mPages[value], this);
  279.  
  280.         if (pChildWin)
  281.             pChildWin->GetBase()->ExecuteAllLinks();
  282.     }
  283.  
  284.     mpBase->Relayout();
  285.  
  286.     // send out value change notification
  287.     mpBase->DispatchEvent(this, mID, IVDUICallback::kEventSelect, mCurrentPage);
  288. }
  289.  
  290. void VDUIPageSet::AddPage(int dialogID) {
  291.     mPages.push_back(dialogID);
  292. }
  293.  
  294.