/*
 * Copyright 2000 Uwe Bonnes
 *
 * 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 "comctl32.h"

#pragma code_page(65001)

LANGUAGE LANG_GERMAN, SUBLANG_NEUTRAL

STRINGTABLE DISCARDABLE
{
     IDS_CLOSE    "Schließen"
}

STRINGTABLE DISCARDABLE
{
     IDM_TODAY    "Heute:"
     IDM_GOTODAY  "Gehe zu Heute"
}

STRINGTABLE DISCARDABLE
{
    IDS_SEPARATOR "Trennzeichen"
}

STRINGTABLE DISCARDABLE
{
    HKY_NONE "Keiner"
}

IDD_PROPSHEET DIALOG DISCARDABLE 0, 0, 220, 140
STYLE DS_CONTEXTHELP | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE
CAPTION "Eigenschaften für %s"
FONT 8, "MS Shell Dlg"
BEGIN
  DEFPUSHBUTTON "&OK",        IDOK,4,122,50,14, WS_TABSTOP | WS_GROUP
  PUSHBUTTON    "A&bbrechen", IDCANCEL,58,122,50,14
  PUSHBUTTON    "&Anwenden",  IDC_APPLY_BUTTON,112,122,50,14,WS_DISABLED
  PUSHBUTTON    "&Hilfe",     IDHELP,166,122,50,14,WS_TABSTOP|WS_GROUP
  CONTROL       "Tab",        IDC_TABCONTROL,"SysTabControl32",WS_CLIPSIBLINGS|WS_GROUP|WS_TABSTOP|TCS_MULTILINE,4,4,212,114
END


IDD_WIZARD DIALOG DISCARDABLE 0, 0, 290, 159
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE
CAPTION "Wizard"
FONT 8, "MS Shell Dlg"
BEGIN
  PUSHBUTTON    "< &Zurück", IDC_BACK_BUTTON,71,138,50,14
  DEFPUSHBUTTON "&Weiter >", IDC_NEXT_BUTTON,121,138,50,14
  DEFPUSHBUTTON "&Fertig",   IDC_FINISH_BUTTON,121,138,50,14
  PUSHBUTTON    "Abbrechen", IDCANCEL,178,138,50,14
  PUSHBUTTON    "&Hilfe",     IDHELP,235,138,50,14,WS_GROUP
  LTEXT         "",          IDC_SUNKEN_LINE,7,129,278,1,SS_SUNKEN
  CONTROL       "Tab",       IDC_TABCONTROL,"SysTabControl32",WS_CLIPSIBLINGS | WS_DISABLED,7,7,258,5
  LTEXT	        "",        IDC_SUNKEN_LINEHEADER,0,35,290,1,SS_LEFT | SS_SUNKEN | WS_CHILD | WS_VISIBLE
END


IDD_TBCUSTOMIZE DIALOG DISCARDABLE 10, 20, 357, 125
STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
CAPTION "Toolbar einrichten"
FONT 8, "MS Shell Dlg"
BEGIN
  DEFPUSHBUTTON "&Schließen",               IDCANCEL,308,6,44,14
  PUSHBUTTON    "&Zurücksetzen",            IDC_RESET_BTN,308,23,44,14
  PUSHBUTTON    "&Hilfe",                   IDC_HELP_BTN,308,40,44,14
  PUSHBUTTON    "Nach &Oben verschieben",   IDC_MOVEUP_BTN,308,74,44,14
  PUSHBUTTON    "Nach &Unten verschieben",  IDC_MOVEDN_BTN,308,91,44,14
  LTEXT         "&Vorhandene Knöpfe:", -1,4,5,84,10
  LISTBOX       IDC_AVAILBTN_LBOX,4,17,120,100, LBS_NOTIFY | LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_NOINTEGRALHEIGHT | LBS_DISABLENOSCROLL | WS_BORDER | WS_VSCROLL | WS_HSCROLL | WS_TABSTOP
  PUSHBUTTON    "H&inzufügen ->",           IDOK, 131, 42, 44, 14
  PUSHBUTTON    "<- &Löschen",              IDC_REMOVE_BTN,131,62,44,14
  LTEXT         "&Toolbarknöpfe:", -1,182,5,78,10
  LISTBOX       IDC_TOOLBARBTN_LBOX, 182,17,120,100,LBS_NOTIFY | LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_NOINTEGRALHEIGHT | LBS_DISABLENOSCROLL | WS_BORDER | WS_VSCROLL | WS_HSCROLL | WS_TABSTOP
END
