/*
 * Top level resource file for Common Controls
 *
 * Copyright 1999 Bertho Stultiens
 * Copyright 1999 Eric Kohl
 *
 * 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 "comctl32.h"

LANGUAGE LANG_ENGLISH, SUBLANG_DEFAULT

STRINGTABLE
{
    IDS_CLOSE    "Close"
}

STRINGTABLE
{
    IDM_TODAY    "Today:"
    IDM_GOTODAY  "Go to today"
}

STRINGTABLE
{
    IDS_SEPARATOR "Separator"
}

STRINGTABLE
{
    HKY_NONE "#msgctxt#hotkey#None"
}

IDD_PROPSHEET DIALOG 0, 0, 220, 140
STYLE DS_CONTEXTHELP | DS_MODALFRAME | DS_3DLOOK | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE
CAPTION "Properties for %s"
FONT 8, "MS Shell Dlg"
BEGIN
  DEFPUSHBUTTON "OK",     IDOK,4,122,50,14, WS_TABSTOP | WS_GROUP
  PUSHBUTTON    "Cancel", IDCANCEL,58,122,50,14
  PUSHBUTTON    "&Apply", IDC_APPLY_BUTTON,112,122,50,14,WS_DISABLED
  PUSHBUTTON    "Help",   IDHELP,166,122,50,14,WS_TABSTOP|WS_GROUP
  CONTROL       "",       IDC_TABCONTROL,"SysTabControl32",WS_CLIPSIBLINGS|WS_GROUP|WS_TABSTOP|TCS_MULTILINE,4,4,212,114
END


IDD_WIZARD DIALOG 0, 0, 290, 159
STYLE DS_MODALFRAME | DS_3DLOOK | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE
CAPTION "Wizard"
FONT 8, "MS Shell Dlg"
BEGIN
  PUSHBUTTON    "< &Back", IDC_BACK_BUTTON,56,138,55,14
  DEFPUSHBUTTON "&Next >", IDC_NEXT_BUTTON,111,138,55,14
  DEFPUSHBUTTON "Finish",  IDC_FINISH_BUTTON,111,138,55,14
  PUSHBUTTON    "Cancel",  IDCANCEL,173,138,55,14
  PUSHBUTTON    "Help",    IDHELP,235,138,55,14,WS_GROUP
  LTEXT         "",        IDC_SUNKEN_LINE,7,129,278,1,SS_SUNKEN
  CONTROL       "",        IDC_TABCONTROL,"SysTabControl32",WS_CLIPSIBLINGS | WS_DISABLED,7,7,258,5
  LTEXT	        "",        IDC_SUNKEN_LINEHEADER,0,35,290,1,SS_LEFT | SS_SUNKEN | WS_CHILD | WS_VISIBLE
END


IDD_TBCUSTOMIZE DIALOG 10, 20, 395, 125
STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
CAPTION "Customize Toolbar"
FONT 8, "MS Shell Dlg"
BEGIN
  DEFPUSHBUTTON "&Close",     IDCANCEL,320,6,70,14
  PUSHBUTTON    "R&eset",     IDC_RESET_BTN,320,23,70,14
  PUSHBUTTON    "&Help",      IDC_HELP_BTN,320,40,70,14
  PUSHBUTTON    "Move &Up",   IDC_MOVEUP_BTN,320,74,70,14
  PUSHBUTTON    "Move &Down", IDC_MOVEDN_BTN,320,91,70,14
  LTEXT         "A&vailable buttons:", -1,4,5,120,10
  LISTBOX       IDC_AVAILBTN_LBOX,5,17,120,100, LBS_NOTIFY | LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_NOINTEGRALHEIGHT | LBS_DISABLENOSCROLL | WS_BORDER | WS_VSCROLL | WS_HSCROLL | WS_TABSTOP
  PUSHBUTTON    "&Add ->",    IDOK, 132, 42, 55, 14
  PUSHBUTTON    "<- &Remove", IDC_REMOVE_BTN,132,62,55,14
  LTEXT         "&Toolbar buttons:", -1,194,5,120,10
  LISTBOX       IDC_TOOLBARBTN_LBOX, 194,17,120,100,LBS_NOTIFY | LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_NOINTEGRALHEIGHT | LBS_DISABLENOSCROLL | WS_BORDER | WS_VSCROLL | WS_HSCROLL | WS_TABSTOP
END

LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL

#define WINE_FILEDESCRIPTION_STR "Wine Common Controls"
#define WINE_FILENAME_STR "comctl32.dll"
#define WINE_FILEVERSION COMCTL32_VERSION, COMCTL32_VERSION_MINOR, 4704, 1100
#define WINE_FILEVERSION_STR "5.81"
#define WINE_PRODUCTVERSION WINE_FILEVERSION
#define WINE_PRODUCTVERSION_STR WINE_FILEVERSION_STR

#include "wine/wine_common_ver.rc"

/* @makedep: comctl32.manifest */
WINE_MANIFEST RT_MANIFEST comctl32.manifest

/* @makedep: idt_check.bmp */
IDT_CHECK BITMAP idt_check.bmp

/* @makedep: idb_std_small.bmp */
IDB_STD_SMALL BITMAP idb_std_small.bmp

/* @makedep: idb_std_large.bmp */
IDB_STD_LARGE BITMAP idb_std_large.bmp

/* @makedep: idb_view_small.bmp */
IDB_VIEW_SMALL BITMAP idb_view_small.bmp

/* @makedep: idb_view_large.bmp */
IDB_VIEW_LARGE BITMAP idb_view_large.bmp

/* @makedep: idb_hist_small.bmp */
IDB_HIST_SMALL BITMAP idb_hist_small.bmp

/* @makedep: idb_hist_large.bmp */
IDB_HIST_LARGE BITMAP idb_hist_large.bmp

/* @makedep: idc_copy.cur */
IDC_COPY CURSOR idc_copy.cur

/* @makedep: idc_divider.cur */
IDC_DIVIDER CURSOR idc_divider.cur

/* @makedep: idc_divideropen.cur */
IDC_DIVIDEROPEN CURSOR idc_divideropen.cur

/* @makedep: idc_movebutton.cur */
IDC_MOVEBUTTON CURSOR idc_movebutton.cur

/* @makedep: idi_dragarrow.ico */
IDI_DRAGARROW ICON idi_dragarrow.ico

/* @makedep: idi_tt_info_sm.ico */
IDI_TT_INFO_SM ICON idi_tt_info_sm.ico

/* @makedep: idi_tt_warn_sm.ico */
IDI_TT_WARN_SM ICON idi_tt_warn_sm.ico

/* @makedep: idi_tt_error_sm.ico */
IDI_TT_ERROR_SM ICON idi_tt_error_sm.ico
