/*
 * 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"

#pragma makedep po

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
