/*
 * Top level resource file for shell stuff
 *
 * Copyright 1998 Juergen Schmied
 *
 * 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
 */

#include "shresdef.h"

LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL

shv_accel ACCELERATORS
BEGIN
	VK_F5, FCIDM_SHVIEW_REFRESH, VIRTKEY
END

/* @makedep: document.ico */
IDI_SHELL_DOCUMENT ICON document.ico

/* @makedep: folder.ico */
IDI_SHELL_FOLDER ICON folder.ico

/* @makedep: folder_open.ico */
IDI_SHELL_FOLDER_OPEN ICON folder_open.ico

/* FIXME: Following three resources are not yet added */
/* @makedep: folder_open.ico */
IDI_SHELL_FOLDER_OPEN_SMALL ICON folder_open.ico
/* @makedep: folder_open.ico */
IDI_SHELL_FOLDER_OPEN_LARGE ICON folder_open.ico
/* @makedep: folder_open.ico */
IDI_SHELL_FOLDER_SMALL_XP ICON folder_open.ico

/* @makedep: floppy.ico */
IDI_SHELL_FLOPPY ICON floppy.ico

/* @makedep: drive.ico */
IDI_SHELL_DRIVE ICON drive.ico

/* @makedep: netdrive.ico */
IDI_SHELL_NETDRIVE ICON netdrive.ico

/* @makedep: netdrive2.ico */
IDI_SHELL_NETDRIVE2 ICON netdrive2.ico

/* @makedep: cdrom.ico */
IDI_SHELL_CDROM ICON cdrom.ico

/* @makedep: ramdisk.ico */
IDI_SHELL_RAMDISK ICON ramdisk.ico

/* @makedep: mycomputer.ico */
IDI_SHELL_MY_COMPUTER ICON mycomputer.ico

/* @makedep: printer.ico */
IDI_SHELL_PRINTER ICON printer.ico

/* @makedep: shortcut.ico */
IDI_SHELL_SHORTCUT ICON shortcut.ico

/* @makedep: desktop.ico */
IDI_SHELL_DESKTOP ICON desktop.ico

/* @makedep: trash_file.ico */
IDI_SHELL_FULL_RECYCLE_BIN ICON trash_file.ico

/* @makedep: trash_file.ico */
IDI_SHELL_TRASH_FILE ICON trash_file.ico

/* @makedep: delete.ico */
IDI_SHELL_CONFIRM_DELETE ICON delete.ico

/* @makedep: mydocs.ico */
IDI_SHELL_MY_DOCUMENTS ICON mydocs.ico

/* FIXME: Following resource is not yet added */
/* @makedep: mydocs.ico */
IDI_SHELL_MY_NETWORK_PLACES ICON mydocs.ico

/* @makedep: idb_tb_large.bmp */
IDB_TB_LARGE_LIGHT BITMAP idb_tb_large.bmp

/* @makedep: idb_tb_large.bmp */
IDB_TB_LARGE_DARK BITMAP idb_tb_large.bmp

/* @makedep: idb_tb_small.bmp */
IDB_TB_SMALL_LIGHT BITMAP idb_tb_small.bmp

/* @makedep: idb_tb_small.bmp */
IDB_TB_SMALL_DARK BITMAP idb_tb_small.bmp

/* @makedep: searching.avi */
IDR_AVI_SEARCHING AVI searching.avi

/* @makedep: searching.avi */
IDR_AVI_SEARCH AVI searching.avi

/* @makedep: searching.avi */
IDR_AVI_FILEMOVE AVI searching.avi

/* @makedep: searching.avi */
IDR_AVI_FILECOPY AVI searching.avi

/* @makedep: searching.avi */
IDR_AVI_FINDCOMPUTER AVI searching.avi

/* @makedep: searching.avi */
IDR_AVI_FILENUKE AVI searching.avi

/* @makedep: searching.avi */
IDR_AVI_FILEDELETE AVI searching.avi
