/*
 * Program Manager
 *
 * Copyright 2009 Aurimas Fišeras <aurimas@gmail.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 "progman.h"

/* Menu */

/* UTF-8 */
#pragma code_page(65001)

LANGUAGE LANG_LITHUANIAN, SUBLANG_NEUTRAL

/* Dialog `New' */

DIALOG_NEW DIALOG 0, 0, 170, 65
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Nauja"
{
RADIOBUTTON   "",                 PM_NEW_GROUP,    10, 15,  10, 15
LTEXT         "Programų &grupė",   -1,    20, 18,  80, 15
RADIOBUTTON   "",                 PM_NEW_PROGRAM,  10, 35,  10, 15
LTEXT         "&Programa", -1,  20, 38,  80, 15
DEFPUSHBUTTON "Gerai",          IDOK,           105,  5,  60, 15, WS_TABSTOP
PUSHBUTTON    "Atsisakyti",      IDCANCEL,       105, 25,  60, 15, WS_TABSTOP
PUSHBUTTON    "&Žinynas",        PM_HELP,        105, 45,  60, 15, WS_TABSTOP
}

/* Dialog `Move' */

DIALOG_MOVE DIALOG 0, 0, 250, 65
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Perkelti programą"
{
LTEXT         "Perkelti programą:",    -1,            5,  5,  90, 15
LTEXT         "",                     PM_PROGRAM,         95,  5,  90, 15
LTEXT         "Iš grupės:", -1,            5, 13,  90, 15
LTEXT         "",                     PM_FROM_GROUP,      95, 13,  90, 15
LTEXT         "&Į grupę:",   PM_TO_GROUP_TXT,     5, 28, 140, 15
COMBOBOX                              PM_TO_GROUP,         5, 38, 140, 50, WS_TABSTOP | CBS_DROPDOWNLIST
DEFPUSHBUTTON "Gerai",              IDOK,              185,  5,  60, 15, WS_TABSTOP
PUSHBUTTON    "Atsisakyti",          IDCANCEL,          185, 25,  60, 15, WS_TABSTOP
PUSHBUTTON    "&Žinynas",            PM_HELP,           185, 45,  60, 15, WS_TABSTOP
}

/* Dialog `Copy' */

DIALOG_COPY DIALOG 0, 0, 250, 65
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Kopijuoti programą"
{
LTEXT         "Kopijuoti programą:",    -1,            5,  5,  90, 15
LTEXT         "",                     PM_PROGRAM,         95,  5,  90, 15
LTEXT         "Iš grupės:", -1,            5, 13,  90, 15
LTEXT         "",                     PM_FROM_GROUP,      95, 13,  90, 15
LTEXT         "&Į grupę:",   PM_TO_GROUP_TXT,     5, 28, 140, 15
COMBOBOX                              PM_TO_GROUP,         5, 38, 140, 50, WS_TABSTOP | CBS_DROPDOWNLIST
DEFPUSHBUTTON "Gerai",              IDOK,              185,  5,  60, 15, WS_TABSTOP
PUSHBUTTON    "Atsisakyti",          IDCANCEL,          185, 25,  60, 15, WS_TABSTOP
PUSHBUTTON    "&Žinynas",            PM_HELP,           185, 45,  60, 15, WS_TABSTOP
}

/* Dialog `Group attributes' */

DIALOG_GROUP DIALOG 0, 0, 230, 65
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Programų grupės atributai"
{
LTEXT     "&Aprašas:", PM_DESCRIPTION_TXT,   05, 18,  50, 10
EDITTEXT                            PM_DESCRIPTION,       60, 18,  90, 15, WS_TABSTOP
LTEXT     "&Grupės failas:",        PM_FILE_TXT,          05, 38,  50, 10
EDITTEXT                            PM_FILE,              60, 38,  90, 15, WS_TABSTOP
DEFPUSHBUTTON "Gerai",            IDOK,                155,  5,  60, 15, WS_TABSTOP
PUSHBUTTON    "Atsisakyti",        IDCANCEL,            155, 25,  60, 15, WS_TABSTOP
PUSHBUTTON    "&Žinynas",          PM_HELP,             155, 45,  60, 15, WS_TABSTOP
}

/* Dialog `Program attributes' */

DIALOG_PROGRAM DIALOG 0, 0, 250, 105
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Programos atributai"
{
LTEXT         "&Aprašas:",  PM_DESCRIPTION_TXT,   05, 10,  80, 10
EDITTEXT                                   PM_DESCRIPTION,       90, 10,  80, 15, WS_TABSTOP
LTEXT         "Komandos &eilutė:", PM_COMMAND_LINE_TXT,  05, 25,  80, 10
EDITTEXT                                   PM_COMMAND_LINE,      90, 25,  80, 15, WS_TABSTOP
LTEXT         "&Veikiamasis katalogas:",    PM_DIRECTORY_TXT,     05, 40,  80, 10
EDITTEXT                                   PM_DIRECTORY,         90, 40,  80, 15, WS_TABSTOP
LTEXT         "&Klavišų kombinacija:",      PM_HOT_KEY_TXT,       05, 55,  80, 10
EDITTEXT                                   PM_HOT_KEY,           90, 55,  80, 15, WS_TABSTOP
ICON          "",                          PM_ICON,              20, 70
CHECKBOX      "",                          PM_SYMBOL,            90, 75,  10, 10, WS_TABSTOP
LTEXT         "&Suskleisti paleidus",       -1,             105, 75,  75, 10
DEFPUSHBUTTON "Gerai",                   IDOK,                175,  5,  70, 15, WS_TABSTOP
PUSHBUTTON    "Atsisakyti",               IDCANCEL,            175, 25,  70, 15, WS_TABSTOP
PUSHBUTTON    "Pari&nkti...",               PM_BROWSE,           175, 45,  70, 15, WS_TABSTOP
PUSHBUTTON    "Keisti &piktogramą...", PM_OTHER_SYMBOL,     175, 65,  70, 15, WS_TABSTOP
PUSHBUTTON    "&Žinynas",                 PM_HELP,             175, 85,  70, 15, WS_TABSTOP
}

/* Dialog `Symbol' */

DIALOG_SYMBOL DIALOG 0, 0, 200, 85
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Keisti piktogramą"
{
LTEXT     "&Failas:",    PM_ICON_FILE_TXT,    5, 15,  40, 10
EDITTEXT                         PM_ICON_FILE,       45, 15,  85, 15, WS_TABSTOP
LTEXT     "Dabartinė &piktograma:", PM_SYMBOL_LIST_TXT,  5, 30, 125, 10
COMBOBOX                         PM_SYMBOL_LIST,      5, 40, 125, 50,
   CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | CBS_OWNERDRAWFIXED | WS_TABSTOP
DEFPUSHBUTTON "Gerai",         IDOK,              135,  5,  60, 15, WS_TABSTOP
PUSHBUTTON    "Atsisakyti",     IDCANCEL,          135, 25,  60, 15, WS_TABSTOP
PUSHBUTTON    "Pari&nkti...",    PM_BROWSE,         135, 45,  60, 15, WS_TABSTOP
PUSHBUTTON    "&Žinynas",       PM_HELP,           135, 65,  60, 15, WS_TABSTOP
}

/* Dialog `Execute' */

DIALOG_EXECUTE DIALOG 0, 0, 200, 85
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Vykdyti programą"
{
LTEXT     "&Komandos eilutė:", -1,   05, 15, 120, 10
EDITTEXT                               PM_COMMAND, 05, 25, 120, 15, WS_TABSTOP
CHECKBOX      "",                      PM_SYMBOL,  05, 45,  10, 10, WS_TABSTOP
LTEXT         "&Suskleisti paleidus",   -1,   20, 45, 120, 10
DEFPUSHBUTTON "Gerai",               IDOK,      135,  5,  60, 15, WS_TABSTOP
PUSHBUTTON    "Atsisakyti",           IDCANCEL,  135, 25,  60, 15, WS_TABSTOP
PUSHBUTTON    "Pari&nkti...",          PM_BROWSE, 135, 45,  60, 15, WS_TABSTOP
PUSHBUTTON    "&Žinynas",             PM_HELP,   135, 65,  60, 15, WS_TABSTOP
}
