home *** CD-ROM | disk | FTP | other *** search
/ Stars of Shareware: Programmierung / SOURCE.mdf / programm / windows / c / fldrvw / desktop.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  1993-04-27  |  5.7 KB  |  253 lines

  1. /********************************************************************/
  2. /*            Folder View - Drag and drop directory viewer          */
  3. /*               Public Domain (P) 1992  Benjamin Cooley            */
  4. /*                fldrview.cpp - FolderView Main Module             */
  5. /********************************************************************/
  6.  
  7. /* Windows Libraries */
  8. #include <windows.h>
  9. #include <shellapi.h>
  10. #include <owl.h>
  11. #include <edit.h>
  12.  
  13. /* C Runtime Library */
  14. #include <stdio.h>
  15. #include <stdlib.h>
  16. #include <string.h>
  17. #include <mem.h>
  18. #include <dir.h>
  19. #include <ctype.h>
  20. #include <io.h>
  21. #include <time.h>
  22.  
  23. #pragma hdrstop
  24.  
  25. #include "deskrc.h"
  26.  
  27. HINSTANCE hInstance;
  28.  
  29. _CLASSDEF(TDesktopIcon)
  30.  
  31. PTDesktopIcon drives[26];
  32.  
  33. #define MAXFOLDERS (100)
  34. PTDesktopIcon folders[MAXFOLDERS];
  35. int numfolders = 0;
  36.  
  37. char progpath[MAXPATH];
  38. char fldrviewpath[MAXPATH];
  39. char fldrviewname[] = "FLDRVIEW.EXE";
  40.  
  41. BOOL quitting = FALSE;
  42.  
  43. /********************************************************************/
  44. /*                         FolderView Class                         */
  45. /********************************************************************/
  46.  
  47. #define TYPE_FIXED        (1)
  48. #define TYPE_REMOVABLE (2)
  49. #define TYPE_REMOTE       (3)
  50. #define TYPE_DIR       (4)
  51. #define TYPE_VIEW       (5)
  52.  
  53. class _CLASSTYPE TDesktopIcon : public TWindow
  54. {
  55.  
  56. public:
  57.     TDesktopIcon(int Atype, Pchar Atitle);
  58.     virtual ~TDesktopIcon();
  59.     TDesktopIcon(StreamableInit) : TWindow(NULL, "")
  60.      { Attr.Style |= WS_MINIMIZE; }
  61.  
  62.     static PTStreamable build() { return new TDesktopIcon(streamableInit); }
  63.  
  64. protected:
  65.     int type;
  66.  
  67.     TFolderView(StreamableInit s);
  68.     virtual Pvoid read(Ripstream is);
  69.     virtual void write(Ropstream os); 
  70.  
  71.     virtual Pchar GetClassName();
  72.     virtual void GetWindowClass(WNDCLASS &AWndClass);
  73.     virtual void WMNCPaint(RTMessage Msg) = [WM_FIRST + WM_NCPAINT];
  74.     virtual void WMEraseBkgnd(RTMessage Msg) = [WM_FIRST + WM_ERASEBKGND]
  75.      {}
  76.  
  77. private:
  78.     virtual const Pchar streamableName() const { return "FolderView"; }
  79.  
  80. };
  81.  
  82. TDesktopIcon::TDesktopIcon(int Atype, Pchar Atitle) :
  83.     TWindow(NULL, Atitle)
  84. {
  85.     type = Atype;
  86.     Attr.Style |= WS_MINIMIZE | WS_VISIBLE;
  87. }
  88.  
  89. TDesktopIcon::~TDesktopIcon()
  90. {
  91.     int c;
  92.  
  93.     for (c = 0; c < 26; c++)
  94.         if (drives[c] == this) drives[c] = NULL;
  95.  
  96.     for (c = 0; c < MAXFOLDERS; c++)
  97.         if (folders[c] == this) folders[c] = NULL;
  98.  
  99.     if ((type == TYPE_FIXED ||
  100.         type == TYPE_REMOVABLE ||
  101.         type == TYPE_REMOTE) && !quitting)
  102.     {
  103.         quitting = TRUE;
  104.         PostQuitMessage(0);
  105.     }
  106. }
  107.  
  108. Pchar TDesktopIcon::GetClassName()
  109. {
  110.     switch (type)
  111.     {
  112.       case TYPE_FIXED:
  113.         return "FVFIXED";
  114.       case TYPE_REMOVABLE:
  115.         return "FVREMOVABLE";
  116.       case TYPE_REMOTE:
  117.         return "FVREMOTE";
  118.       case TYPE_DIR:
  119.         return "FVDIR";
  120.       case TYPE_VIEW:
  121.         return "FVVIEW";
  122.     }
  123.     return TWindow::GetClassName();
  124. }
  125.  
  126. void TDesktopIcon::GetWindowClass(WNDCLASS &AWndClass)
  127. {
  128.     TWindow::GetWindowClass(AWndClass);
  129.  
  130.     switch (type)
  131.     {
  132.       case TYPE_FIXED:
  133.         AWndClass.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(ICO_Fixed));
  134.         break;
  135.       case TYPE_REMOVABLE:
  136.         AWndClass.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(ICO_Removable));
  137.         break;
  138.       case TYPE_REMOTE:
  139.         AWndClass.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(ICO_Remote));
  140.         break;
  141.       case TYPE_DIR:
  142.         AWndClass.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(ICO_Directory));
  143.         break;
  144.       case TYPE_VIEW:
  145.         AWndClass.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(ICO_View));
  146.         break;
  147.     }
  148. }
  149.  
  150. Pvoid TDesktopIcon::read(Ripstream is)
  151. {
  152.     char buf[81];
  153.     is.readString(buf, 81);
  154.     SetCaption(buf);
  155.     is >> type;
  156.  
  157.     return this;
  158. }
  159.  
  160. void TDesktopIcon::write(Ropstream os)
  161. {
  162.     os.writeString(Title);
  163.     os << type;
  164. }
  165.  
  166. #pragma argsused
  167. void TDesktopIcon::WMNCPaint(RTMessage Msg)
  168. {
  169.     if (IsIconic(HWindow))
  170.     {
  171.         DefWndProc(Msg);
  172.         return;
  173.     }
  174.  
  175.     if (type == TYPE_FIXED ||
  176.         type == TYPE_REMOVABLE ||
  177.         type == TYPE_REMOTE)
  178.     {
  179.         ShowWindow(HWindow, SW_SHOWMINIMIZED);
  180.         InvalidateRect(HWindow, NULL, TRUE);
  181.     }
  182.     else CloseWindow();
  183.  
  184.  
  185.     ShellExecute(this->HWindow, NULL,
  186.         fldrviewpath, Title, Title, SW_SHOWNORMAL);
  187. }
  188.  
  189. /********************************************************************/
  190. /*                           Main Program                           */
  191. /********************************************************************/
  192.  
  193. #pragma argsused
  194. int PASCAL WinMain(HANDLE hInstance, HANDLE hPrevInstance,
  195.   LPSTR lpCmdLine, int nCmdShow)
  196. {
  197.     MSG Message;
  198.  
  199.     ::hInstance = hInstance;
  200.  
  201.     if (hPrevInstance) return 0;
  202.  
  203.     TApplication MainApp("Desktop", hInstance, hPrevInstance,
  204.         lpCmdLine, nCmdShow);
  205.  
  206.   /* Get paths */
  207.     GetModuleFileName(hInstance, progpath, MAXPATH);
  208.     strcpy(fldrviewpath, progpath);
  209.     Pchar ptr = fldrviewpath + sizeof(fldrviewpath);
  210.     while (ptr != fldrviewpath && *ptr != '\\')
  211.         *ptr-- = NULL;
  212.     ptr++;
  213.     strcpy(ptr, fldrviewname);
  214.  
  215.     char drivename[] = "?:\\";
  216.     for (int c = 0; c < 25; c++)
  217.     {
  218.         *drivename = 'A' + c;
  219.         int type = GetDriveType(c);
  220.         if (type)
  221.         {
  222.             if (type == DRIVE_FIXED) type = TYPE_FIXED;
  223.               else if (type == DRIVE_REMOVABLE) type = TYPE_REMOVABLE;
  224.               else if (type == DRIVE_REMOTE) type = TYPE_REMOTE;
  225.               else type = 0;
  226.             if (type)
  227.             {
  228.                 drives[c] = new TDesktopIcon(type, drivename);
  229.                 MainApp.MakeWindow(drives[c]);
  230.                 drives[c]->Show(SW_SHOWMINIMIZED);
  231.             }
  232.         }
  233.     }
  234.  
  235.  
  236.     while (TRUE)
  237.     {
  238.         if (PeekMessage(&Message, 0, 0, 0, PM_REMOVE))
  239.         {
  240.             if ( Message.message == WM_QUIT ) break;
  241.             TranslateMessage(&Message);
  242.             DispatchMessage(&Message);
  243.         }
  244.     }
  245.  
  246.     for (c = 0; c < 26; c++)
  247.         if (drives[c]) delete drives[c];
  248.     for (c = 0; c < MAXFOLDERS; c++)
  249.         if (folders[c]) delete folders[c];
  250.  
  251.     return 0;
  252. }
  253.