/* Resources for the common control unit test suite.
 *
 * Copyright 2006 Huw Davies
 * Copyright 2006 Mikolaj Zalewski
 *
 * 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 "windef.h"
#include "winuser.h"
#include "resources.h"

PROP_PAGE1 DIALOG 5, 43, 227, 215
STYLE  WS_POPUP | WS_CAPTION | WS_CLIPSIBLINGS | WS_VISIBLE
CAPTION "Page1"
FONT 8, "MS Shell Dlg"
{
 LTEXT "Test", -1, 10, 6, 100, 8
}

IDD_PROP_PAGE_INTRO DIALOG 5, 43, 227, 215
STYLE  WS_POPUP | WS_CAPTION | WS_CLIPSIBLINGS | WS_VISIBLE
CAPTION "Edit Control Page"
FONT 8, "MS Shell Dlg"
{
    LTEXT "This is a test property sheet!", -1, 10, 6, 100, 8
}

IDD_PROP_PAGE_EDIT DIALOG 5, 43, 227, 215
STYLE  WS_POPUP | WS_CAPTION | WS_CLIPSIBLINGS | WS_VISIBLE
CAPTION "Edit Control Page"
FONT 8, "MS Shell Dlg"
{
    EDITTEXT IDC_PS_EDIT1, 5, 5, 150, 140, WS_CHILD | WS_VISIBLE | WS_TABSTOP | ES_MULTILINE
    EDITTEXT IDC_PS_EDIT2, 5, 160, 150, 28, WS_CHILD | WS_VISIBLE | WS_TABSTOP | ES_MULTILINE
}

IDD_PROP_PAGE_RADIO DIALOG 5, 43, 227, 215
STYLE  WS_POPUP | WS_CAPTION | WS_CLIPSIBLINGS | WS_VISIBLE
CAPTION "Edit Control Page"
FONT 8, "MS Shell Dlg"
{
    CONTROL "Radio1", IDC_PS_RADIO1, "Button", BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP, 20, 20, 39, 10
    CONTROL "Radio2", IDC_PS_RADIO2, "Button", BS_AUTORADIOBUTTON, 20, 40, 39, 10
}

IDD_PROP_PAGE_EXIT DIALOG 5, 43, 227, 215
STYLE  WS_POPUP | WS_CAPTION | WS_CLIPSIBLINGS | WS_VISIBLE
CAPTION "Edit Control Page"
FONT 8, "MS Shell Dlg"
{
    LTEXT "This has been a test property sheet!", -1, 10, 6, 170, 8
}

IDD_PROP_PAGE_MESSAGE_TEST DIALOG  0, 0, 339, 179
STYLE DS_MODALFRAME | DS_3DLOOK | DS_CENTER | WS_CHILD | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
CAPTION "Message Test"
BEGIN
    LTEXT           "Some Text",-1,115,1,195,24
END

IDD_PROP_PAGE_ERROR DIALOG 0, 0, 100, 100
STYLE WS_POPUP | WS_CAPTION | WS_CLIPSIBLINGS | WS_VISIBLE
CLASS "Non-existing class"
FONT 8, "MS Shell Dlg"
{
}

STRINGTABLE 
{
    IDS_TBADD1           "abc"
    IDS_TBADD2           "|p|q|r"
    IDS_TBADD3           "*p*q*"
    IDS_TBADD4           "#p#q##"
    IDS_TBADD5           "|p||q|r|"
    IDS_TBADD7           "abracadabra"
}

/* @makedep: bmp128x15.bmp */
IDB_BITMAP_128x15 BITMAP bmp128x15.bmp

/* @makedep: bmp80x15.bmp */
IDB_BITMAP_80x15 BITMAP bmp80x15.bmp

IDD_PROP_PAGE_WITH_CUSTOM_DEFAULT_BUTTON DIALOG  5, 43, 227, 215
STYLE WS_CHILD | WS_DISABLED
FONT 8, "MS Shell Dlg"
{
    COMBOBOX        IDC_PS_COMBO1, 16, 68, 140, 14, CBS_DROPDOWN | WS_VSCROLL | WS_TABSTOP
    PUSHBUTTON      "Add", IDC_PS_PUSHBUTTON1, 164, 68, 40, 13
}
