home *** CD-ROM | disk | FTP | other *** search
- /********************************************************************/
- /* Folder View - Drag and drop directory viewer */
- /* Public Domain (P) 1992 Benjamin Cooley */
- /* fldrview.cpp - FolderView Main Module */
- /********************************************************************/
-
- /* Windows Libraries */
- #include <windows.h>
- #include <shellapi.h>
- #include <owl.h>
- #include <edit.h>
-
- /* C Runtime Library */
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <mem.h>
- #include <dir.h>
- #include <ctype.h>
- #include <io.h>
- #include <time.h>
-
- #pragma hdrstop
-
- #include "deskrc.h"
-
- HINSTANCE hInstance;
-
- _CLASSDEF(TDesktopIcon)
-
- PTDesktopIcon drives[26];
-
- #define MAXFOLDERS (100)
- PTDesktopIcon folders[MAXFOLDERS];
- int numfolders = 0;
-
- char progpath[MAXPATH];
- char fldrviewpath[MAXPATH];
- char fldrviewname[] = "FLDRVIEW.EXE";
-
- BOOL quitting = FALSE;
-
- /********************************************************************/
- /* FolderView Class */
- /********************************************************************/
-
- #define TYPE_FIXED (1)
- #define TYPE_REMOVABLE (2)
- #define TYPE_REMOTE (3)
- #define TYPE_DIR (4)
- #define TYPE_VIEW (5)
-
- class _CLASSTYPE TDesktopIcon : public TWindow
- {
-
- public:
- TDesktopIcon(int Atype, Pchar Atitle);
- virtual ~TDesktopIcon();
- TDesktopIcon(StreamableInit) : TWindow(NULL, "")
- { Attr.Style |= WS_MINIMIZE; }
-
- static PTStreamable build() { return new TDesktopIcon(streamableInit); }
-
- protected:
- int type;
-
- TFolderView(StreamableInit s);
- virtual Pvoid read(Ripstream is);
- virtual void write(Ropstream os);
-
- virtual Pchar GetClassName();
- virtual void GetWindowClass(WNDCLASS &AWndClass);
- virtual void WMNCPaint(RTMessage Msg) = [WM_FIRST + WM_NCPAINT];
- virtual void WMEraseBkgnd(RTMessage Msg) = [WM_FIRST + WM_ERASEBKGND]
- {}
-
- private:
- virtual const Pchar streamableName() const { return "FolderView"; }
-
- };
-
- TDesktopIcon::TDesktopIcon(int Atype, Pchar Atitle) :
- TWindow(NULL, Atitle)
- {
- type = Atype;
- Attr.Style |= WS_MINIMIZE | WS_VISIBLE;
- }
-
- TDesktopIcon::~TDesktopIcon()
- {
- int c;
-
- for (c = 0; c < 26; c++)
- if (drives[c] == this) drives[c] = NULL;
-
- for (c = 0; c < MAXFOLDERS; c++)
- if (folders[c] == this) folders[c] = NULL;
-
- if ((type == TYPE_FIXED ||
- type == TYPE_REMOVABLE ||
- type == TYPE_REMOTE) && !quitting)
- {
- quitting = TRUE;
- PostQuitMessage(0);
- }
- }
-
- Pchar TDesktopIcon::GetClassName()
- {
- switch (type)
- {
- case TYPE_FIXED:
- return "FVFIXED";
- case TYPE_REMOVABLE:
- return "FVREMOVABLE";
- case TYPE_REMOTE:
- return "FVREMOTE";
- case TYPE_DIR:
- return "FVDIR";
- case TYPE_VIEW:
- return "FVVIEW";
- }
- return TWindow::GetClassName();
- }
-
- void TDesktopIcon::GetWindowClass(WNDCLASS &AWndClass)
- {
- TWindow::GetWindowClass(AWndClass);
-
- switch (type)
- {
- case TYPE_FIXED:
- AWndClass.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(ICO_Fixed));
- break;
- case TYPE_REMOVABLE:
- AWndClass.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(ICO_Removable));
- break;
- case TYPE_REMOTE:
- AWndClass.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(ICO_Remote));
- break;
- case TYPE_DIR:
- AWndClass.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(ICO_Directory));
- break;
- case TYPE_VIEW:
- AWndClass.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(ICO_View));
- break;
- }
- }
-
- Pvoid TDesktopIcon::read(Ripstream is)
- {
- char buf[81];
- is.readString(buf, 81);
- SetCaption(buf);
- is >> type;
-
- return this;
- }
-
- void TDesktopIcon::write(Ropstream os)
- {
- os.writeString(Title);
- os << type;
- }
-
- #pragma argsused
- void TDesktopIcon::WMNCPaint(RTMessage Msg)
- {
- if (IsIconic(HWindow))
- {
- DefWndProc(Msg);
- return;
- }
-
- if (type == TYPE_FIXED ||
- type == TYPE_REMOVABLE ||
- type == TYPE_REMOTE)
- {
- ShowWindow(HWindow, SW_SHOWMINIMIZED);
- InvalidateRect(HWindow, NULL, TRUE);
- }
- else CloseWindow();
-
-
- ShellExecute(this->HWindow, NULL,
- fldrviewpath, Title, Title, SW_SHOWNORMAL);
- }
-
- /********************************************************************/
- /* Main Program */
- /********************************************************************/
-
- #pragma argsused
- int PASCAL WinMain(HANDLE hInstance, HANDLE hPrevInstance,
- LPSTR lpCmdLine, int nCmdShow)
- {
- MSG Message;
-
- ::hInstance = hInstance;
-
- if (hPrevInstance) return 0;
-
- TApplication MainApp("Desktop", hInstance, hPrevInstance,
- lpCmdLine, nCmdShow);
-
- /* Get paths */
- GetModuleFileName(hInstance, progpath, MAXPATH);
- strcpy(fldrviewpath, progpath);
- Pchar ptr = fldrviewpath + sizeof(fldrviewpath);
- while (ptr != fldrviewpath && *ptr != '\\')
- *ptr-- = NULL;
- ptr++;
- strcpy(ptr, fldrviewname);
-
- char drivename[] = "?:\\";
- for (int c = 0; c < 25; c++)
- {
- *drivename = 'A' + c;
- int type = GetDriveType(c);
- if (type)
- {
- if (type == DRIVE_FIXED) type = TYPE_FIXED;
- else if (type == DRIVE_REMOVABLE) type = TYPE_REMOVABLE;
- else if (type == DRIVE_REMOTE) type = TYPE_REMOTE;
- else type = 0;
- if (type)
- {
- drives[c] = new TDesktopIcon(type, drivename);
- MainApp.MakeWindow(drives[c]);
- drives[c]->Show(SW_SHOWMINIMIZED);
- }
- }
- }
-
-
- while (TRUE)
- {
- if (PeekMessage(&Message, 0, 0, 0, PM_REMOVE))
- {
- if ( Message.message == WM_QUIT ) break;
- TranslateMessage(&Message);
- DispatchMessage(&Message);
- }
- }
-
- for (c = 0; c < 26; c++)
- if (drives[c]) delete drives[c];
- for (c = 0; c < MAXFOLDERS; c++)
- if (folders[c]) delete folders[c];
-
- return 0;
- }
-