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

#pragma makedep po

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
