/*
 * Winedbg resources
 *
 * Copyright 2008 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 "resource.h"

LANGUAGE LANG_ENGLISH, SUBLANG_DEFAULT

IDM_DEBUG_POPUP MENU
BEGIN
    POPUP ""
    BEGIN
        MENUITEM "&Debug", ID_DEBUG
    END
END

STRINGTABLE
BEGIN
    IDS_AUTO_CAPTION     "Wine program crash"
    IDS_INVALID_PARAMS   "Internal errors - invalid parameters received"
    IDS_UNIDENTIFIED     "(unidentified)"
END

IDD_CRASH_DLG DIALOGEX 100, 100, 273, 175
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Program Error"
FONT 8, "Tahoma"
BEGIN
    LTEXT           "",IDC_STATIC_BG,0,0,273,52,WS_BORDER,0
    LTEXT           "The program %s has encountered a serious problem and needs \
                    to close. We are sorry for the inconvenience.",
                    IDC_STATIC_TXT1,27,10,224,30
    CONTROL         "This can be caused by a problem in the program or a deficiency in Wine. \
                    You may want to check the <a href=\"http://appdb.winehq.org\">Application Database</a> for tips about running \
                    this application.\n\n\
                    If this problem is not present under Windows and has not been reported \
                    yet, you can <a href=\"http://wiki.winehq.org/Bugs\">file a bug report</a>.",IDC_STATIC_TXT2,"SysLink",0,27,60,224,100
    DEFPUSHBUTTON   "Close", IDOK, 205, 151, 60, 16, WS_TABSTOP
END
