/*
 * Copyright 2000 Martin Fuchs
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */

#define WIN32_LEAN_AND_MEAN
#define WIN32_EXTRA_LEAN
#define NOSERVICE
#define NOMCX
#define NOIME
#define NOCOMM
#define NOKANJI
#define NORPC
#define NOPROXYSTUB
#define NOIMAGE
#define NOTAPE

#ifdef UNICODE
#define	_UNICODE
#include <wchar.h>
#endif

#include <windows.h>
#include <windowsx.h>
#include <commctrl.h>
#include <shellapi.h>
#include <stdlib.h>
#include <stdio.h>
#include <tchar.h>
#include <ctype.h>

#ifdef _MSC_VER
#include <malloc.h>	/* for alloca() */
#endif

#ifndef FILE_ATTRIBUTE_NOT_CONTENT_INDEXED
#define FILE_ATTRIBUTE_ENCRYPTED            0x00000040
#define FILE_ATTRIBUTE_SPARSE_FILE          0x00000200
#define FILE_ATTRIBUTE_REPARSE_POINT        0x00000400
#define FILE_ATTRIBUTE_NOT_CONTENT_INDEXED  0x00002000
#endif


#ifdef	_DEBUG
#define	ASSERT(x)	{if (!(x)) DebugBreak();}
#else
#define	ASSERT(x)	/* nothing */
#endif

#ifdef _MSC_VER
#define	LONGLONGARG _T("I64")
#else
#define	LONGLONGARG _T("L")
#endif

#define	BUFFER_LEN	1024


enum IMAGE {
	IMG_NONE=-1,	IMG_FILE=0,			IMG_DOCUMENT,	IMG_EXECUTABLE,
	IMG_FOLDER,		IMG_OPEN_FOLDER,	IMG_FOLDER_PLUS,IMG_OPEN_PLUS,	IMG_OPEN_MINUS,
	IMG_FOLDER_UP,	IMG_FOLDER_CUR
};

#define	IMAGE_WIDTH			16
#define	IMAGE_HEIGHT		13
#define	SPLIT_WIDTH			5

#define IDW_STATUSBAR		0x100
#define IDW_TOOLBAR			0x101
#define IDW_DRIVEBAR		0x102
#define	IDW_FIRST_CHILD		0xC000	/*0x200*/

#define IDW_TREE_LEFT		3
#define IDW_TREE_RIGHT		6
#define IDW_HEADER_LEFT		2
#define IDW_HEADER_RIGHT	5

#define	WM_DISPATCH_COMMAND	0xBF80

#define	COLOR_COMPRESSED	RGB(0,0,255)
#define	COLOR_SELECTION		RGB(0,0,128)

#ifdef _NO_EXTENSIONS
#define	COLOR_SPLITBAR		WHITE_BRUSH
#else
#define	COLOR_SPLITBAR		LTGRAY_BRUSH
#endif

#define	WINEFILEFRAME		_T("WFS_Frame")
#define	WINEFILETREE		_T("WFS_Tree")
#define	WINEFILEDRIVES		_T("WFS_Drives")
#define	WINEFILEMDICLIENT	_T("WFS_MdiClient")

#define	FRM_CALC_CLIENT		0xBF83
#define	Frame_CalcFrameClient(hwnd, prt) ((BOOL)SNDMSG(hwnd, FRM_CALC_CLIENT, 0, (LPARAM)(PRECT)prt))


#ifndef _NO_EXTENSIONS
#define	_SHELL_FOLDERS

#include <objbase.h>
#include <shlobj.h>
#endif


typedef struct
{
  HANDLE	hInstance;
  HACCEL	haccel;
  ATOM			hframeClass;
  HWND			hwndParent;

  HWND		hMainWnd;
  HMENU		hMenuFrame;
  HMENU		hWindowsMenu;
  HMENU		hLanguageMenu;
  HMENU		hMenuView;
  HMENU		hMenuOptions;
  HWND		hmdiclient;
  HWND		hstatusbar;
  HWND		htoolbar;
  HWND		hdrivebar;
  HFONT		hfont;

  TCHAR		num_sep;
  SIZE		spaceSize;
  HIMAGELIST himl;

  TCHAR		drives[BUFFER_LEN];
  BOOL		prescan_node;	/*TODO*/

  UINT		wStringTableOffset;

#ifdef _SHELL_FOLDERS
  IShellFolder*	iDesktop;
  IMalloc*		iMalloc;
  UINT			cfStrFName;
#endif
} WINEFILE_GLOBALS;

extern WINEFILE_GLOBALS Globals;

#ifdef UNICODE
extern void _wsplitpath(const WCHAR* path, WCHAR* drv, WCHAR* dir, WCHAR* name, WCHAR* ext);
#else
extern void _splitpath(const CHAR* path, CHAR* drv, CHAR* dir, CHAR* name, CHAR* ext);
#endif
