/*
 * Copyright 2011 Jacek Caban for CodeWeavers
 *
 * 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

IDR_BROWSE_MAIN_MENU MENU
{
    POPUP "&File"
    {
        POPUP "&New"
        {
            MENUITEM "&Window",                 ID_BROWSE_NEW_WINDOW
        }
        MENUITEM "&Open...",                    ID_BROWSE_OPEN
        MENUITEM "&Save",                       ID_BROWSE_SAVE
        MENUITEM "Save &as...",                 ID_BROWSE_SAVE_AS
        MENUITEM SEPARATOR
        MENUITEM "Print &format...",            ID_BROWSE_PRINT_FORMAT
        MENUITEM "Pr&int...",                   ID_BROWSE_PRINT
        MENUITEM "Print previe&w",              ID_BROWSE_PRINT_PREVIEW
        MENUITEM SEPARATOR
        MENUITEM "&Properties",                 ID_BROWSE_PROPERTIES
        MENUITEM "&Close",                      ID_BROWSE_QUIT
    }
    POPUP "&View"
    {
        POPUP "&Toolbars"
        {
            MENUITEM "&Standard bar",           ID_BROWSE_BAR_STD
            MENUITEM "&Address bar",            ID_BROWSE_BAR_ADDR
        }
    }
    POPUP "&Favorites"
    {
        MENUITEM "&Add to Favorites...",        ID_BROWSE_ADDFAV
        MENUITEM SEPARATOR
    }
    POPUP "&Help"
    {
        MENUITEM "&About Internet Explorer", ID_BROWSE_ABOUT
    }
}

STRINGTABLE
{
    IDS_TB_BACK             "Back"
    IDS_TB_FORWARD          "Forward"
    IDS_TB_STOP             "Stop"
    IDS_TB_REFRESH          "Refresh"
    IDS_TB_HOME             "#msgctxt#home page#Home"
    IDS_TB_PRINT            "Print..."
}

STRINGTABLE
{
    IDS_ADDRESS             "Address"
}

STRINGTABLE
{
    IDS_FINDINGRESOURCE     "Searching for %s"
    IDS_BEGINDOWNLOADDATA   "Start downloading %s"
    IDS_ENDDOWNLOADDATA     "Downloading %s"
    IDS_SENDINGREQUEST      "Asking for %s"
}


IDD_BROWSE_OPEN DIALOG 10, 10, 200, 70
STYLE DS_MODALFRAME | WS_CAPTION
CAPTION "Open URL"
FONT 8, "MS Shell Dlg"
{
    LTEXT "Specify the URL you wish to open in Internet Explorer",-1, 35,5,160,25
    LTEXT "Open:", -1, 5, 32, 30, 15
    EDITTEXT IDC_BROWSE_OPEN_URL, 35, 30, 160, 13
    DEFPUSHBUTTON "OK", IDOK, 90, 50, 50, 14
    PUSHBUTTON "Cancel", IDCANCEL, 145, 50, 50, 14
}

LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL

#define WINE_FILEDESCRIPTION_STR "Internet Browser"
#define WINE_FILENAME_STR "ieframe.dll"
#define WINE_FILEVERSION 8,00,7601,17601
#define WINE_FILEVERSION_STR "8.00.7601.17601"
#define WINE_PRODUCTVERSION 8,00,7601,17601
#define WINE_PRODUCTVERSION_STR "8.00.7601.17601"
#define WINE_EXTRAVALUES VALUE "OLESelfRegister",""

#include "wine/wine_common_ver.rc"

/* @makedep: ietoolbar.bmp */
IDB_IETOOLBAR BITMAP ietoolbar.bmp

/* @makedep: ieframe.rgs */
2 WINE_REGISTRY ieframe.rgs
