/*
 * Program Manager
 *
 * Copyright 1996 Ulrich Schmid
 * Copyright 2002 Sylvain Petreolle
 * Copyright 2010 Claudia Cotună
 *                Michael Stefaniuc
 *
 * 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"

LANGUAGE LANG_ROMANIAN, SUBLANG_NEUTRAL

#pragma code_page(65001)

/* Dialog `New' */

DIALOG_NEW DIALOG 0, 0, 170, 65
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Nou"
{
RADIOBUTTON   "",               PM_NEW_GROUP, 10, 15, 10, 15
LTEXT         "&Grup programe", -1, 20, 18, 80, 15
RADIOBUTTON   "",               PM_NEW_PROGRAM, 10, 35, 10, 15
LTEXT         "&Program",       -1, 20, 38, 80, 15
DEFPUSHBUTTON "OK",             IDOK, 105, 5, 60, 15, WS_TABSTOP
PUSHBUTTON    "Renunță",        IDCANCEL, 105, 25, 60, 15, WS_TABSTOP
PUSHBUTTON    "A&jutor",        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 "Mutare program"
{
LTEXT         "Mutare program:", -1, 5, 5, 90, 15
LTEXT         "",               PM_PROGRAM, 95, 5, 90, 15
LTEXT         "Din grupul:",    -1, 5, 13, 90, 15
LTEXT         "",               PM_FROM_GROUP, 95, 13, 90, 15
LTEXT         "În &grupul:",    PM_TO_GROUP_TXT, 5, 28, 140, 15
COMBOBOX                        PM_TO_GROUP, 5, 38, 140, 50, WS_TABSTOP | CBS_DROPDOWNLIST
DEFPUSHBUTTON "OK",             IDOK, 185, 5, 60, 15, WS_TABSTOP
PUSHBUTTON    "Renunță",        IDCANCEL, 185, 25, 60, 15, WS_TABSTOP
PUSHBUTTON    "A&jutor",        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 "Copiere program"
{
LTEXT         "Copiere program:", -1, 5, 5, 90, 15
LTEXT         "",               PM_PROGRAM, 95, 5, 90, 15
LTEXT         "Din grupul:",    -1, 5, 13, 90, 15
LTEXT         "",               PM_FROM_GROUP, 95, 13, 90, 15
LTEXT         "În &grupul:",    PM_TO_GROUP_TXT, 5, 28, 140, 15
COMBOBOX                        PM_TO_GROUP, 5, 38, 140, 50, WS_TABSTOP | CBS_DROPDOWNLIST
DEFPUSHBUTTON "OK",             IDOK, 185, 5, 60, 15, WS_TABSTOP
PUSHBUTTON    "Renunță",        IDCANCEL, 185, 25, 60, 15, WS_TABSTOP
PUSHBUTTON    "A&jutor",        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 "Atributele grupului de programe"
{
LTEXT         "&Descriere:",    PM_DESCRIPTION_TXT, 05, 18, 50, 10
EDITTEXT                        PM_DESCRIPTION, 60, 18, 90, 15, WS_TABSTOP
LTEXT         "Fișier &grup:",  PM_FILE_TXT, 05, 38, 50, 10
EDITTEXT                        PM_FILE, 60, 38, 90, 15, WS_TABSTOP
DEFPUSHBUTTON "OK",             IDOK, 155, 5, 60, 15, WS_TABSTOP
PUSHBUTTON    "Renunță",        IDCANCEL, 155, 25, 60, 15, WS_TABSTOP
PUSHBUTTON    "A&jutor",        PM_HELP, 155, 45, 60, 15, WS_TABSTOP
}

/* Dialog `Program attributes' */

DIALOG_PROGRAM DIALOG 0, 0, 270, 105
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Atributele programului"
{
LTEXT         "&Descriere:",    PM_DESCRIPTION_TXT, 05, 10, 60, 10
EDITTEXT                        PM_DESCRIPTION, 80, 10, 90, 15, WS_TABSTOP
LTEXT         "Linie de &comandă:", PM_COMMAND_LINE_TXT, 05, 25, 60, 10
EDITTEXT                        PM_COMMAND_LINE, 80, 25, 90, 15, WS_TABSTOP
LTEXT         "Director de &lucru:", PM_DIRECTORY_TXT, 05, 40, 60, 10
EDITTEXT                        PM_DIRECTORY, 80, 40, 90, 15, WS_TABSTOP
LTEXT         "Com&binație de taste:", PM_HOT_KEY_TXT, 05, 55, 70, 10
EDITTEXT                        PM_HOT_KEY, 80, 55, 90, 15, WS_TABSTOP
ICON          "",               PM_ICON, 20, 70
CHECKBOX      "",               PM_SYMBOL, 80, 75, 10, 10, WS_TABSTOP
LTEXT         "&Minimizează la lansare", -1, 95, 75, 95, 10
DEFPUSHBUTTON "OK",             IDOK, 185, 5, 80, 15, WS_TABSTOP
PUSHBUTTON    "Renunță",        IDCANCEL, 185, 25, 80, 15, WS_TABSTOP
PUSHBUTTON    "Na&vigare...",   PM_BROWSE, 185, 45, 80, 15, WS_TABSTOP
PUSHBUTTON    "Schimbare p&ictogramă...", PM_OTHER_SYMBOL, 185, 65, 80, 15, WS_TABSTOP
PUSHBUTTON    "A&jutor",        PM_HELP, 185, 85, 80, 15, WS_TABSTOP
}

/* Dialog `Symbol' */

DIALOG_SYMBOL DIALOG 0, 0, 215, 85
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Schimbare pictogramă"
{
LTEXT     "Nume de &fișier:",   PM_ICON_FILE_TXT, 5, 15, 50, 10
EDITTEXT                        PM_ICON_FILE, 60, 15, 85, 15, WS_TABSTOP
LTEXT     "P&ictogramă curentă:", PM_SYMBOL_LIST_TXT, 5, 35, 125, 10
COMBOBOX                        PM_SYMBOL_LIST, 5, 45, 140, 50,
                                CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | CBS_OWNERDRAWFIXED | WS_TABSTOP
DEFPUSHBUTTON "OK",             IDOK, 150, 5, 60, 15, WS_TABSTOP
PUSHBUTTON    "Renunță",        IDCANCEL, 150, 25, 60, 15, WS_TABSTOP
PUSHBUTTON    "Na&vigare...",   PM_BROWSE, 150, 45, 60, 15, WS_TABSTOP
PUSHBUTTON    "A&jutor",        PM_HELP, 150, 65, 60, 15, WS_TABSTOP
}

/* Dialog `Execute' */

DIALOG_EXECUTE DIALOG 0, 0, 200, 85
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Executare program"
{
LTEXT         "&Linie de comandă:", -1, 05, 15, 120, 10
EDITTEXT                        PM_COMMAND, 05, 25, 120, 15, WS_TABSTOP
CHECKBOX      "",               PM_SYMBOL, 05, 45, 10, 10, WS_TABSTOP
LTEXT         "&Minimizează la lansare", -1, 20, 45, 120, 10
DEFPUSHBUTTON "OK",             IDOK, 135, 5, 60, 15, WS_TABSTOP
PUSHBUTTON    "Renunță",        IDCANCEL, 135, 25, 60, 15, WS_TABSTOP
PUSHBUTTON    "Na&vigare...",   PM_BROWSE, 135, 45, 60, 15, WS_TABSTOP
PUSHBUTTON    "A&jutor",        PM_HELP, 135, 65, 60, 15, WS_TABSTOP
}
