/*
 * 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, 400, 340
STYLE DS_SETFONT | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_VISIBLE
CAPTION "Program Error Details"
FONT 8, "MS Shell Dlg"
BEGIN
    EDITTEXT        IDC_CRASH_TXT, 4, 4, 392, 272, 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,285,388,32
    DEFPUSHBUTTON   "Close", IDOK, 326, 320, 70, 16, WS_TABSTOP
    PUSHBUTTON      "&Save As...", ID_SAVEAS, 252, 320, 70, 16, WS_TABSTOP
END
