/*
 * 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)"
    IDS_TEXT_FILES,      "Text files (*.txt)"
    IDS_ALL_FILES,       "All files (*.*)"
    IDS_SAVE_ERROR,      "Saving failed"
    IDS_LOADING,         "Loading detailed information, please wait..."
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, "MS Shell Dlg"
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.",
                    IDC_STATIC_TXT2,"SysLink",0,27,60,224,100
    DEFPUSHBUTTON   "Close", IDOK, 205, 151, 60, 16, WS_TABSTOP
    PUSHBUTTON      "Show &Details", ID_DETAILS, 140, 151, 60, 16, WS_TABSTOP
END

IDD_DETAILS_DLG DIALOGEX 100, 100, 300, 240
STYLE DS_SETFONT | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME | WS_VISIBLE
CAPTION "Program Error Details"
FONT 8, "MS Shell Dlg"
BEGIN
    EDITTEXT        IDC_CRASH_TXT, 4, 4, 292, 172, ES_MULTILINE | ES_READONLY | WS_HSCROLL | WS_VSCROLL, WS_TABSTOP
    CONTROL         "If this problem is not present under Windows and has not been reported yet, \
                     you can save the detailed information to a file using the \"Save As\" button, \
                     then <a href=\"http://wiki.winehq.org/Bugs\">file a bug report</a> \
                     and attach that file to the report.",
                    IDC_STATIC_TXT2,"SysLink",0,6,185,288,32
    DEFPUSHBUTTON   "Close", IDOK, 226, 220, 70, 16, WS_TABSTOP
    PUSHBUTTON      "&Save As...", ID_SAVEAS, 152, 220, 70, 16, WS_TABSTOP
END
