/*
 * Internet control panel applet
 *
 * Copyright 2010 Detlef Riekenberg
 *
 * 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 "inetcpl.h"

LANGUAGE LANG_ENGLISH, SUBLANG_DEFAULT

STRINGTABLE
BEGIN
    IDS_CPL_NAME        "Internet Settings"
    IDS_CPL_INFO        "Configure Wine Internet Browser and related settings"
    IDS_SEC_SETTINGS    "Security settings for zone: "
    IDS_SEC_LEVEL0      "Custom"
    IDS_SEC_LEVEL1      "Very Low"
    IDS_SEC_LEVEL2      "Low"
    IDS_SEC_LEVEL3      "Medium"
    IDS_SEC_LEVEL4      "Increased"
    IDS_SEC_LEVEL5      "High"
END

/* "General" propsheet */
IDD_GENERAL DIALOG  0, 0, 320, 220
STYLE WS_CAPTION | WS_CHILD | WS_DISABLED
FONT 8, "MS Shell Dlg"
CAPTION "General"
BEGIN

    GROUPBOX    "Home page", IDC_STATIC, 4, 4, 312, 56
    LTEXT       "You can choose the address that will be used as your home page.",
                IDC_STATIC, 10, 14, 300, 10
    EDITTEXT    IDC_HOME_EDIT, 10, 26, 300, 12, WS_VISIBLE | ES_AUTOHSCROLL
    PUSHBUTTON  "&Current page", IDC_HOME_CURRENT, 58, 42, 80, 14
    PUSHBUTTON  "&Default page", IDC_HOME_DEFAULT, 144, 42, 80, 14
    PUSHBUTTON  "&Blank page", IDC_HOME_BLANK, 230, 42, 80, 14
    GROUPBOX    "Browsing history", IDC_STATIC, 4, 66, 312, 42
    LTEXT       "You can delete cached pages, cookies and other data.",
                IDC_STATIC, 10, 76, 300, 10
    PUSHBUTTON  "Delete &files...", IDC_HISTORY_DELETE, 144, 90, 80, 14
    PUSHBUTTON  "&Settings...", IDC_HISTORY_SETTINGS, 230, 90, 80, 14

END

/* "Delete browsing history" dialog */
IDD_DELETE_HISTORY DIALOG  0, 0, 250, 250
STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
FONT 8, "MS Shell Dlg"
CAPTION "Delete browsing history"
BEGIN

    AUTOCHECKBOX   "Temporary internet files\nCached copies of web pages, images and certificates.",
                    IDC_DELETE_TEMP_FILES, 10, 8, 230, 40, BS_TOP | BS_MULTILINE
    AUTOCHECKBOX   "Cookies\nFiles saved on your computer by websites, which store things like user preferences and login information.",
                    IDC_DELETE_COOKIES, 10, 48, 230, 40, BS_TOP | BS_MULTILINE
    AUTOCHECKBOX   "History\nList of websites you have accessed.",
                    IDC_DELETE_HISTORY, 10, 88, 230, 40, BS_TOP | BS_MULTILINE
    AUTOCHECKBOX   "Form data\nUsernames and other information you have entered into forms.",
                    IDC_DELETE_FORM_DATA, 10, 128, 230, 40, BS_TOP | BS_MULTILINE
    AUTOCHECKBOX   "Passwords\nSaved passwords you have entered into forms.",
                    IDC_DELETE_PASSWORDS, 10, 168, 230, 40, BS_TOP | BS_MULTILINE
    DEFPUSHBUTTON  "Cancel", IDCANCEL, 185, 230, 60, 15, WS_GROUP
    PUSHBUTTON     "Delete", IDOK, 120, 230, 60, 15, WS_GROUP

END

/* "Security" propsheet */
IDD_SECURITY DIALOG  0, 0, 320, 220
STYLE WS_CAPTION | WS_CHILD | WS_DISABLED
FONT 8, "MS Shell Dlg"
CAPTION "Security"
BEGIN

    CONTROL     "", IDC_SEC_LISTVIEW, "SysListView32",
                LVS_ICON | LVS_ALIGNLEFT | LVS_AUTOARRANGE | LVS_SINGLESEL | LVS_SHOWSELALWAYS | WS_BORDER | WS_VSCROLL,
                4, 4, 312, 58
    LTEXT       "", IDC_SEC_ZONE_INFO, 4, 68, 312, 20
    GROUPBOX    "", IDC_SEC_GROUP, 4, 88, 312, 126
    CONTROL     "", IDC_SEC_TRACKBAR, "msctls_trackbar32",
                TBS_VERT | TBS_AUTOTICKS | TBS_BOTH | TBS_REVERSED, 8, 98, 32, 100
    LTEXT       "", IDC_SEC_LEVEL, 48, 102, 180, 12
    LTEXT       "", IDC_SEC_LEVEL_INFO, 48, 114, 260, 80
END

/* "Content" propsheet */
IDD_CONTENT DIALOG  0, 0, 320, 220
STYLE WS_CAPTION | WS_CHILD | WS_DISABLED
FONT 8, "MS Shell Dlg"
CAPTION "Content"
BEGIN

    GROUPBOX    "Certificates", IDC_STATIC, 4, 4, 312, 50
    LTEXT       "Certificates are used for your personal identification and to identify certificate authorities and publishers.",
                IDC_STATIC, 58, 14, 252, 18
    PUSHBUTTON  "Certificates...", IDC_CERT, 146, 34, 80, 14
    PUSHBUTTON	"Publishers...", IDC_CERT_PUBLISHER, 230, 34, 80, 14

END

LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL

#define WINE_FILENAME_STR "inetcpl.cpl"
#define WINE_FILEDESCRIPTION_STR "Internet Control Panel"

/* Same Version as IE 8 on WinXP */
#define WINE_FILEVERSION      8,0,6001,18939
#define WINE_FILEVERSION_STR "8.00.6001.18939"

#define WINE_PRODUCTVERSION      8,0,6001,18939
#define WINE_PRODUCTVERSION_STR "8.00.6001.18939"

#include "wine/wine_common_ver.rc"
 
/* @makedep: inetcpl.ico */
ICO_MAIN ICON "inetcpl.ico"
ICO_INTERNET ICON "inetcpl.ico"
