home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / ctcoll95.zip / UNIVERSE / PROBE.CPP < prev    next >
Text File  |  1995-03-20  |  15KB  |  394 lines

  1.  
  2. #include <containe.h>
  3. #include <applicat.h>
  4. #include <dialog.h>
  5. #include <framewin.h>
  6. #include <dc.h>
  7. #include <gdiobjec.h>
  8.  
  9. #include <string.h>
  10.  
  11.  
  12.  
  13. // MENU & COMMANDS
  14. #define IDM_PROBE              1
  15. #define IDCM_DEMOCONTAINER    101
  16.  
  17. // MAIN DIALOGS
  18. #define IDDLG_CONTAINER        2
  19.  
  20. #define IDCT_CONTAINER       101
  21.  
  22. #define IDICO_FULL             1
  23. #define IDICO_MINI             2
  24.  
  25.  
  26.  
  27. #define IDRB_VIEWICONS                  201
  28. #define IDRB_VIEWMINIICONS              202
  29. #define IDRB_VIEWICONTREE               203
  30.  
  31. #define IDRB_VIEWTEXT                   211
  32. #define IDRB_VIEWTEXTFLOWED             212
  33. #define IDRB_VIEWTEXTTREE               213
  34.  
  35. #define IDRB_VIEWNAMES                  221
  36. #define IDRB_VIEWMININAMES              222
  37. #define IDRB_VIEWNAMESFLOWED            223
  38. #define IDRB_VIEWMININAMESFLOWED        224
  39.  
  40. #define IDRB_VIEWDETAILS                231
  41. #define IDRB_VIEWDETAILSTITLES          232
  42.  
  43. #define IDCB_CONTAINERTITLE             401
  44.  
  45. #define IDRB_SELSINGLE                  301
  46. #define IDRB_SELEXTENDED                302
  47. #define IDRB_SELMULTIPLE                303
  48.  
  49. #define IDB_SORTAZ                      801
  50. #define IDB_SORTZA                      802
  51. #define IDB_ANYTEST                     803
  52.  
  53. #define IDB_TREESAMPLE                  807
  54. #define IDB_ICONSAMPLE                  808
  55. #define IDB_DETAILSAMPLE                809
  56.  
  57.  
  58.  
  59.  
  60. class TDlgContainer : public TDialog
  61.      {
  62.         public:        TContainer   *pIContainer;
  63.                        RECORDCNR   *pRCpred;
  64.                        RECORDCNR   *pRClevel;
  65.                        FIELDINFO    *pFI;
  66.                        char         *pszFonts;
  67.                        ULONG         dwOfs,dwIdx;
  68.                        ULONG         ulAve[1024];
  69.                        ULONG         ulMax[1024];
  70.                        HICON         hico[1024];
  71.                        TIcon        *pBig;
  72.                        TIcon        *pMini;
  73.                        TIcon        *pPlus;
  74.                        TIcon        *pMinus;
  75.  
  76.         public:        TDlgContainer (TWindow *parent, TResId resID, TModule *module = 0)
  77.                       :TDialog (parent, resID, module) {}
  78.  
  79.         protected:     BOOL CanClose();
  80.                        void SetupWindow();
  81.                       // VIEWS
  82.                        void RBViewIcons() { pIContainer->SetIconView(); };
  83.                        void RBViewMiniIcons() { pIContainer->SetIconView(TRUE); };
  84.                        void RBViewIconTree() { pIContainer->SetIconView(FALSE,TRUE); }
  85.                        void RBViewText() { pIContainer->SetTextView(); }
  86.                        void RBViewTextFlowed() { pIContainer->SetTextView(TRUE); };
  87.                        void RBViewTextTree() { pIContainer->SetTextView(FALSE,TRUE); };
  88.                        void RBViewNames() { pIContainer->SetNameView(); };
  89.                        void RBViewMiniNames() { pIContainer->SetNameView(TRUE); };
  90.                        void RBViewNamesFlowed() { pIContainer->SetNameView(FALSE,TRUE); };
  91.                        void RBViewMiniNamesFlowed() { pIContainer->SetNameView(TRUE,TRUE); };
  92.                        void RBViewDetails() { pIContainer->SetDetailView(); };
  93.                        void RBViewDetailsTitles() { pIContainer->SetDetailView(TRUE); };
  94.                       // MISC
  95.                        void CBContainerTitle();
  96.                       // SELECTION
  97.                        void RBSelSingle() { pIContainer->SetSingleSelection(); };
  98.                        void RBSelExtended() { pIContainer->SetExtendedSelection(); };
  99.                        void RBSelMultiple() { pIContainer->SetMultipleSelection(); };
  100.                       // SORT
  101.                        void BtnSortAZ() { pIContainer->SetSortMode(1); pIContainer->Sort(); }
  102.                        void BtnSortZA() { pIContainer->SetSortMode(-1); pIContainer->Sort(); }
  103.                        void BtnAnyTest();
  104.                       // SAMPLE
  105.                        void BtnTreeSample();
  106.                        void BtnIconSample();
  107.                        void BtnDetailSample();
  108.                       // DECLARE RESPONSE TABLE
  109.                        DECLARE_RESPONSE_TABLE(TDlgContainer);
  110.      };
  111.  
  112.  
  113.  
  114. DEFINE_RESPONSE_TABLE1(TDlgContainer,TDialog)
  115.   EV_COMMAND (IDRB_VIEWICONS,RBViewIcons),
  116.   EV_COMMAND (IDRB_VIEWMINIICONS,RBViewMiniIcons),
  117.   EV_COMMAND (IDRB_VIEWICONTREE,RBViewIconTree),
  118.   EV_COMMAND (IDRB_VIEWTEXT,RBViewText),
  119.   EV_COMMAND (IDRB_VIEWTEXTFLOWED,RBViewTextFlowed),
  120.   EV_COMMAND (IDRB_VIEWTEXTTREE,RBViewTextTree),
  121.   EV_COMMAND (IDRB_VIEWNAMES,RBViewNames),
  122.   EV_COMMAND (IDRB_VIEWMININAMES,RBViewMiniNames),
  123.   EV_COMMAND (IDRB_VIEWNAMESFLOWED,RBViewNamesFlowed),
  124.   EV_COMMAND (IDRB_VIEWMININAMESFLOWED,RBViewMiniNamesFlowed),
  125.   EV_COMMAND (IDRB_VIEWDETAILS,RBViewDetails),
  126.   EV_COMMAND (IDRB_VIEWDETAILSTITLES,RBViewDetailsTitles),
  127.   EV_COMMAND (IDRB_SELSINGLE,RBSelSingle),
  128.   EV_COMMAND (IDRB_SELEXTENDED,RBSelExtended),
  129.   EV_COMMAND (IDRB_SELMULTIPLE,RBSelMultiple),
  130.   EV_COMMAND (IDB_SORTAZ,BtnSortAZ),
  131.   EV_COMMAND (IDB_SORTZA,BtnSortZA),
  132.   EV_COMMAND (IDCB_CONTAINERTITLE,CBContainerTitle),
  133.   EV_COMMAND (IDB_ANYTEST,BtnAnyTest),
  134.   EV_COMMAND (IDB_TREESAMPLE,BtnTreeSample),
  135.   EV_COMMAND (IDB_ICONSAMPLE,BtnIconSample),
  136.   EV_COMMAND (IDB_DETAILSAMPLE,BtnDetailSample),
  137. END_RESPONSE_TABLE;
  138.  
  139.  
  140.  
  141.  
  142. void TDlgContainer::CBContainerTitle()
  143. {
  144.   IsDlgButtonChecked(IDCB_CONTAINERTITLE)
  145.     ?  pIContainer->SetTitle ("Some Fonts...")
  146.     :  pIContainer->SetTitle();
  147. }
  148.  
  149. BOOL TDlgContainer::CanClose()
  150. {
  151.   pIContainer->RemoveRecord();
  152.   pIContainer->RemoveDetail();
  153.   delete pIContainer;
  154.   free (pszFonts);
  155.   delete pBig;
  156.   delete pMini;
  157.   delete pPlus;
  158.   delete pMinus;
  159.  // CLOSE
  160.   return (TRUE);
  161. }
  162.  
  163.  
  164.  
  165. char  chFirst;
  166. BOOL  fWithExt;
  167.  
  168.  
  169. static int CALLBACK EnumFontsProc (LOGFONT *lplf, TEXTMETRIC *tm, ULONG, LPARAM lpData)
  170. {
  171.   TDlgContainer        *pDlg;
  172.   int                   iLen;
  173.   RECORDEXT             RE;
  174.   RECORDEXT            *pRE;
  175.  
  176.   if (lplf->lfFaceName[0] != chFirst) return (1);
  177.   pDlg = (TDlgContainer*)lpData;
  178.  // FONTNAME BUFFER
  179.   iLen = strlen(lplf->lfFaceName);
  180.   memcpy (&pDlg->pszFonts[pDlg->dwOfs],lplf->lfFaceName,iLen);
  181.  // ERWEITERUNGS-RECORD KLARMACHEN
  182.   pRE = NULL;
  183.   if (fWithExt)
  184.     {
  185.       pDlg->ulAve[pDlg->dwIdx] = tm->tmAveCharWidth;
  186.       pDlg->ulMax[pDlg->dwIdx] = tm->tmMaxCharWidth;
  187.       pDlg->hico[pDlg->dwIdx] = HICON(*pDlg->pBig);
  188.       RE.ulAve = pDlg->ulAve[pDlg->dwIdx];
  189.       RE.ulMax = pDlg->ulMax[pDlg->dwIdx];
  190.       RE.hico = pDlg->hico[pDlg->dwIdx];
  191.       pDlg->dwIdx++;
  192.       pRE = &RE;
  193.     }
  194.  // RECORD EINFÜGEN
  195.   pDlg->pIContainer->InsertRecord (pDlg->pRClevel,      // ebene oder NULL für erste ebene
  196.                                    pDlg->pRCpred,       // vorgänger-record
  197.                                    pRE,                 // zeiger auf erweiterung oder NULL
  198.                                    &pDlg->pszFonts[pDlg->dwOfs],  // fontname - icon text
  199.                                    &TPoint(0,0),        // egal, da AUTOPOSITION !
  200.                                    pDlg->pBig,          // großer standard-icon
  201.                                    pDlg->pMini);        // kleiner mini-icon
  202.  // HINTER DEN LETZTEN EINGEFÜGTEN RECORD SOLL AUCH GLEICH DER NÄCHSTE EINGEFÜGT WERDEN
  203.   pDlg->pRCpred = pDlg->pIContainer->GetLastRecord();
  204.  // UPDATE OFFSET FOR NAME BUFFER
  205.   pDlg->dwOfs += (iLen+1);
  206.  // RETURN
  207.   return 1;
  208. }
  209.  
  210.  
  211.  
  212.  
  213. void TDlgContainer::BtnIconSample()
  214. {
  215.   TScreenDC     dc;
  216.  
  217.   memset (pszFonts,0x00,32000);
  218.   dwOfs = 0;
  219.   pIContainer->RemoveRecord();
  220.   pIContainer->RemoveDetail();
  221.   pIContainer->SetAutoPosition(TRUE);
  222.  // RECORDS EINFÜGEN. DAS GEHT RECHT EINFACH, DA ALLE
  223.  // ICONS AUF DER ROOT-EBENE EINGEFÜGT WERDEN. MAN
  224.  // BENÖTIGT DESWEGEN AUCH KEINEN PARENT.
  225.   pRCpred = NULL;                             // beginn signalisieren, "1ter" record
  226.   pRClevel = NULL;                            // erste ebene, also NULL
  227. //  chFirst = 'F';                              // alle fonts mit einem 'F' einfügen
  228.   fWithExt = FALSE;                           // keine zusätzlichen details
  229.   dc.EnumFonts (0,(OLDFONTENUMPROC)EnumFontsProc,this);
  230.  // DAMIT WIR IN DER DETAIL-VIEW AUCH WAS SEHEN KÖNNEN,
  231.  // LEGEN WIR DIE ERSTE UND EINZIGE SPALTE FEST. HIER
  232.  // WERDEN DANN UNTEREINANDER ALLE FONTNAMEN ANGEZEIGT.
  233.   pIContainer->InsertDetail (NULL,"F...-Fonts");
  234. }
  235.  
  236.  
  237. void TDlgContainer::BtnTreeSample()
  238. {
  239.   TScreenDC     dc;
  240.  
  241.   memset (pszFonts,0x00,32000);
  242.   dwOfs = 0;
  243.   pIContainer->RemoveRecord();
  244.   pIContainer->RemoveDetail();
  245.   pIContainer->SetTreeIndent(30);
  246.   pIContainer->SetTreeLine(1,TRUE);
  247.   pIContainer->SetTreeIcons (pMinus,pPlus);
  248.  // BEGINN DES ERSTEN ASTES
  249.   pIContainer->InsertRecord( NULL,            // erste ebene
  250.                              NULL,            // kein vorgänger
  251.                              NULL,            // erweiterung nicht notwendig
  252.                              "F-Fonts",       // icon text, also ast-text
  253.                              &TPoint(0,0),    // egal, da autoposition
  254.                              pBig,            // großer standard-icon
  255.                              pMini);          // kleiner mini-icon
  256.  // UND JETZT DIE FONTNAMEN AN DEN AST HÄNGEN
  257.   pRCpred = NULL;                             // beginn signalisieren, "1ter" record
  258.   pRClevel = pIContainer->GetLastRecord();    // eingefügter record ist nächste ebene !
  259. //  chFirst = 'F';                              // fonts mit einem 'F' einfügen
  260.   fWithExt = FALSE;                           // keine zusätzlichen details
  261.   dc.EnumFonts (0,(OLDFONTENUMPROC)EnumFontsProc,this);
  262.  
  263.  // BEGINN DES ZWEITEN ASTES
  264.   pIContainer->InsertRecord (NULL,                      // erste ebene
  265.                              pRClevel,                  // vorgänger auf der ersten ebene !!!
  266.                              NULL,                      // erweiterung nicht notwendig
  267.                              "S-Fonts",                 // icon text, also ast-text
  268.                              &TPoint(0,0),              // egal
  269.                              pBig,                      // großer standard-icon
  270.                              pMini);                    // kleiner mini-icon
  271.  // UND JETZT DIE FONTNAMEN AN DEN AST HÄNGEN
  272.   pRCpred = NULL;                              // beginn signalisieren, "1ter" record
  273.   pRClevel = pIContainer->GetLastRecord();     // eingefügter record ist nächste ebene !
  274.   chFirst = 'S';                               // fonts mit einem 'S' einfügen
  275.   fWithExt = FALSE;                            // keine zusätzlichen details
  276.   dc.EnumFonts (0,(OLDFONTENUMPROC)EnumFontsProc,this);
  277.  // AST-NAMEN IN DER DETAIL-VIEW ANZEIGEN.
  278.   pIContainer->InsertDetail (NULL,"Äste");
  279. }
  280.  
  281.  
  282. void TDlgContainer::BtnDetailSample()
  283. {
  284.   TScreenDC     dc;
  285.  
  286.   memset (pszFonts,0x00,32000);
  287.   dwOfs = 0;
  288.   pIContainer->RemoveRecord();
  289.   pIContainer->RemoveDetail();
  290.  // RECORDS EINFÜGEN WIE BEIM ICON-SAMPLE.
  291.  // JETZT WIRD ABER ZUSÄTZLICH DER ERWEITERUNGS-RECORD
  292.  // GEFÜLLT, DAMIT DIE DETAIL-VIEW AUCH WAS HERGIBT.
  293.  // IN ALLEN ANDEREN VIEWS WERDEN DIESE ZUSÄTZLICHEN
  294.  // INFORMATIONEN LOGISCHERWEISE NICHT ANGEZEIGT.
  295.   pRCpred = NULL;                             // beginn signalisieren, "1ter" record
  296.   pRClevel = NULL;                            // erste ebene
  297.   chFirst = 'F';                              // alle fonts mit einem 'F' einfügen
  298.   fWithExt = TRUE; dwIdx = 0;                 // zuätzliche details für detail-view
  299.   dc.EnumFonts (0,(OLDFONTENUMPROC)EnumFontsProc,this);
  300.  // IN DER DETAIL-VIEW WIRD ZUSÄTZLICH AUF DIE FELDER DES
  301.  // ERWEITERUNGS-RECORDS ZUGEGRIFFEN. DIE ERSTE SPALTE
  302.  // GIBT - WIE IMMER - DIE FONTNAMEN AN. DIE PARAMETER FÜR
  303.  // DIE ERSTE SPALTE SIND EIGENTLICH ÜBERFLÜSSIG, DA SIE DEN
  304.  // STANDARD DARSTELLEN. ABER FÜR'S VERSTÄNDNIS SEIEN SIE HIER
  305.  // NOCH MAL ANGEGEBEN.
  306.   pIContainer->InsertDetail (NULL,"F...-Fonts",FIELDOFFSET(RECORDCNR,RecordCore.pszText),'S',200);
  307.   pFI = pIContainer->GetLastDetail();
  308.   pIContainer->SetLastSplitColumn(pFI);
  309.   pIContainer->InsertDetail (pFI,"AveCharWidth",FIELDOFFSET(RECORDCNR,RecordExt.ulAve),'U',100,'R');
  310.   pFI = pIContainer->GetLastDetail();
  311.   pIContainer->InsertDetail (pFI,"MaxCharWidth",FIELDOFFSET(RECORDCNR,RecordExt.ulMax),'U',100,'R');
  312.   pFI = pIContainer->GetLastDetail();
  313.   pIContainer->InsertDetail (pFI,"Ein Icon",FIELDOFFSET(RECORDCNR,RecordExt.hico),'B');
  314.  // SPIELEN MIT DEM SPLIT WINDOW
  315.   pIContainer->SetSplitBar(50);
  316. }
  317.  
  318.  
  319. void TDlgContainer::SetupWindow()
  320. {
  321.   TDialog::SetupWindow();
  322.  // MEMORY FOR FONT NAMES
  323.   pszFonts = (char *)malloc(32000);
  324.  // ICONS
  325.   pBig = new TIcon (GetModule()->GetInstance(),IDICO_FULL);
  326.   pMini = new TIcon (GetModule()->GetInstance(),IDICO_MINI);
  327.   pPlus = new TIcon (GetModule()->GetInstance(),11);
  328.   pMinus = new TIcon (GetModule()->GetInstance(),12);
  329.  // CREATE CONTAINER-OBJECT
  330.   pIContainer = new TContainer(this,IDCT_CONTAINER);
  331.   pIContainer->Create();
  332.  // SET DEFAULT VIEW & SELECTION
  333.   pIContainer->SetIconView();
  334.   CheckDlgButton (IDRB_VIEWICONS,1);
  335.   pIContainer->SetSingleSelection();
  336.   CheckDlgButton (IDRB_SELSINGLE,1);
  337. }
  338.  
  339.  
  340.  
  341. void TDlgContainer::BtnAnyTest()
  342. {
  343.   pIContainer->ScrollSplitWindow (TRUE,100);
  344. }
  345.  
  346.  
  347.  
  348.  
  349.  
  350. class TWinProbe : public TFrameWindow
  351.      {
  352.         public:     TDlgContainer *pIDlgContainer;
  353.  
  354.         public:          TWinProbe (TWindow *parent, const char far *title = 0);
  355.         protected:  void CmDemoContainer ();
  356.                     DECLARE_RESPONSE_TABLE(TWinProbe);
  357.      };
  358.  
  359. DEFINE_RESPONSE_TABLE1(TWinProbe,TFrameWindow)
  360.   EV_COMMAND (IDCM_DEMOCONTAINER,CmDemoContainer),
  361. END_RESPONSE_TABLE;
  362.  
  363. void TWinProbe::CmDemoContainer()
  364. {
  365.   pIDlgContainer = new TDlgContainer (this,IDDLG_CONTAINER);
  366.   pIDlgContainer->Execute();
  367.   delete pIDlgContainer;
  368. }
  369.  
  370.  
  371. TWinProbe::TWinProbe (TWindow *parent, const char far *title)
  372.           :TFrameWindow (parent, title, 0, FALSE, 0)
  373. {
  374.   Init (parent,FALSE);
  375. }
  376.  
  377. class TAppProbe : public TApplication
  378.      {
  379.         public:          TAppProbe() : TApplication() {}
  380.                     void InitMainWindow();
  381.      };
  382.  
  383. void TAppProbe::InitMainWindow()
  384. {
  385.   SetMainWindow (new TWinProbe(0, "c't - Container Demo"));
  386.   GetMainWindow()->AssignMenu (IDM_PROBE);
  387. }
  388.  
  389. int OwlMain(int /*argc*/, char* /*argv*/ [])
  390. {
  391.   return TAppProbe().Run();
  392. }
  393.  
  394.