/*
 * Copyright 2010 Alexander N. Sørnes <alex@thehandofagony.com>
 *
 * 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

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,25, 5, 150,15
    LTEXT "Open:", -1, 2, 32, 20, 15
    EDITTEXT IDC_BROWSE_OPEN_URL, 25, 30, 160, 13
    DEFPUSHBUTTON "&OK", IDOK, 25, 50, 50, 15
    PUSHBUTTON "&Cancel", IDCANCEL, 85, 50, 50, 15
}

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             "Home"
    IDS_TB_PRINT            "Print"
}

STRINGTABLE
{
    IDS_ADDRESS             "Address"
}
