1
0
mirror of https://github.com/samba-team/samba.git synced 2024-12-23 17:34:34 +03:00

regedit: Simplify notice dialogs, don't overwrite existing values.

Reviewed-by: Andreas Schneider <asn@samba.org>
Reviewed-by: Michael Adam <obnox@samba.org>
This commit is contained in:
C. Davis 2012-08-08 15:36:01 -07:00 committed by Michael Adam
parent 5cfbf7316c
commit e4ed97f9b3
3 changed files with 93 additions and 62 deletions

View File

@ -139,15 +139,14 @@ static void handle_tree_input(struct regedit *regedit, int c)
break;
case 'd':
case 'D': {
struct dialog *dia;
int sel;
node = item_userptr(current_item(regedit->keys->menu));
dia = dialog_confirm_new(regedit, "Delete Key",
sel = dialog_notice(regedit, DIA_CONFIRM,
"Delete Key",
regedit->main_window,
"Really delete key \"%s\"?",
node->name);
sel = dialog_modal_loop(dia);
mvwprintw(regedit->main_window, 1, 0, "Sel: %d", sel);
/* TODO */
break;
@ -200,14 +199,13 @@ static void handle_value_input(struct regedit *regedit, int c)
case 'D':
vitem = item_userptr(current_item(regedit->vl->menu));
if (vitem) {
struct dialog *dia;
int sel;
dia = dialog_confirm_new(regedit, "Delete Value",
sel = dialog_notice(regedit, DIA_CONFIRM,
"Delete Value",
regedit->main_window,
"Really delete value \"%s\"?",
vitem->value_name);
sel = dialog_modal_loop(dia);
if (sel == DIALOG_OK) {
ITEM *it = current_item(regedit->keys->menu);
struct tree_node *node = item_userptr(it);

View File

@ -197,39 +197,6 @@ struct dialog *dialog_choice_center_new(TALLOC_CTX *ctx, const char *title,
return dialog_choice_new(ctx, title, choices, nlines, ncols, y, x);
}
struct dialog *dialog_confirm_new(TALLOC_CTX *ctx, const char *title,
WINDOW *below, const char *msg, ...)
{
va_list ap;
struct dialog *dia;
char *str;
const char *choices[] = {
"Ok",
"Cancel",
NULL
};
int width;
va_start(ap, msg);
str = talloc_vasprintf(ctx, msg, ap);
va_end(ap);
if (str == NULL) {
return NULL;
}
width = strlen(str) + 2;
dia = dialog_choice_center_new(ctx, title, choices, 5, width, below);
if (dia == NULL) {
return NULL;
}
waddstr(dia->sub_window, str);
talloc_free(str);
return dia;
}
static int handle_menu_input(MENU *menu, int c)
{
ITEM *item;
@ -250,7 +217,7 @@ static int handle_menu_input(MENU *menu, int c)
return -1;
}
int dialog_modal_loop(struct dialog *dia)
static int modal_loop(struct dialog *dia)
{
int c;
int selection = -1;
@ -271,6 +238,43 @@ int dialog_modal_loop(struct dialog *dia)
return selection;
}
int dialog_notice(TALLOC_CTX *ctx, enum dialog_type type,
const char *title, WINDOW *below,
const char *msg, ...)
{
va_list ap;
struct dialog *dia;
char *str;
const char *choices[] = {
"Ok",
"Cancel",
NULL
};
int width;
va_start(ap, msg);
str = talloc_vasprintf(ctx, msg, ap);
va_end(ap);
if (str == NULL) {
return -1;
}
width = strlen(str) + 2;
if (type == DIA_ALERT) {
choices[1] = NULL;
}
dia = dialog_choice_center_new(ctx, title, choices, 5, width, below);
if (dia == NULL) {
return -1;
}
waddstr(dia->sub_window, str);
talloc_free(str);
return modal_loop(dia);
}
static void handle_form_input(FORM *frm, int c)
{
switch (c) {
@ -348,8 +352,6 @@ static WERROR fill_value_buffer(struct edit_dialog *edit,
}
set_field_buffer(edit->field[1], 0, tmp);
talloc_free(tmp);
set_field_type(edit->field[1], TYPE_REGEXP,
"^ *([0-9]+|0[xX][0-9a-fA-F]+) *$");
break;
}
case REG_SZ:
@ -414,8 +416,20 @@ static char *string_trim(TALLOC_CTX *ctx, const char *buf)
return str;
}
static bool value_exists(TALLOC_CTX *ctx, const struct registry_key *key,
const char *name)
{
uint32_t type;
DATA_BLOB blob;
WERROR rv;
rv = reg_key_get_value_by_name(ctx, key, name, &type, &blob);
return W_ERROR_IS_OK(rv);
}
static WERROR set_value(struct edit_dialog *edit, struct registry_key *key,
uint32_t type)
uint32_t type, bool new_value)
{
WERROR rv;
DATA_BLOB blob;
@ -425,9 +439,12 @@ static WERROR set_value(struct edit_dialog *edit, struct registry_key *key,
if (!buf) {
return WERR_OK;
}
if (!field_status(edit->field[1])) {
if (!new_value && !field_status(edit->field[1])) {
return WERR_OK;
}
if (new_value && value_exists(edit, key, name)) {
return WERR_FILE_EXISTS;
}
switch (type) {
case REG_DWORD: {
@ -543,13 +560,13 @@ WERROR dialog_edit_value(TALLOC_CTX *ctx, struct registry_key *key, uint32_t typ
}
talloc_set_destructor(edit, edit_dialog_free);
title = talloc_asprintf(edit, "Edit %s value", str_regtype(vitem->type));
title = talloc_asprintf(edit, "Edit %s value", str_regtype(type));
if (title == NULL) {
goto finish;
}
nlines = 9;
if (vitem->type == REG_MULTI_SZ) {
if (type == REG_MULTI_SZ) {
nlines += 4;
}
ncols = 50;
@ -568,7 +585,7 @@ WERROR dialog_edit_value(TALLOC_CTX *ctx, struct registry_key *key, uint32_t typ
/* data */
val_rows = 1;
if (vitem->type == REG_MULTI_SZ) {
if (type == REG_MULTI_SZ) {
val_rows += 4;
}
edit->field[1] = new_field(val_rows, ncols - 4, 4, 1, 0, 0);
@ -579,6 +596,10 @@ WERROR dialog_edit_value(TALLOC_CTX *ctx, struct registry_key *key, uint32_t typ
set_field_back(edit->field[1], A_REVERSE);
field_opts_off(edit->field[0], O_BLANK | O_AUTOSKIP | O_STATIC);
field_opts_off(edit->field[1], O_BLANK | O_AUTOSKIP | O_STATIC | O_WRAP);
if (type == REG_DWORD) {
set_field_type(edit->field[1], TYPE_REGEXP,
"^ *([0-9]+|0[xX][0-9a-fA-F]+) *$");
}
if (vitem) {
set_field_buffer(edit->field[0], 0, vitem->value_name);
@ -592,7 +613,8 @@ WERROR dialog_edit_value(TALLOC_CTX *ctx, struct registry_key *key, uint32_t typ
}
form_opts_off(edit->input, O_NL_OVERLOAD | O_BS_OVERLOAD);
edit->input_win = derwin(edit->dia->sub_window, nlines - 3, ncols - 3, 0, 0);
edit->input_win = derwin(edit->dia->sub_window, nlines - 3, ncols - 3,
0, 0);
if (edit->input_win == NULL) {
goto finish;
}
@ -623,7 +645,18 @@ WERROR dialog_edit_value(TALLOC_CTX *ctx, struct registry_key *key, uint32_t typ
handle_form_input(edit->input, c);
} else {
selection = handle_menu_input(edit->dia->choices, c);
if (selection != -1) {
if (selection == DIALOG_OK) {
rv = set_value(edit, key, type, vitem == NULL);
if (W_ERROR_EQUAL(rv, WERR_FILE_EXISTS)) {
dialog_notice(edit, DIA_ALERT,
"Value exists", below,
"Value name already exists.");
selection = -1;
} else {
goto finish;
}
} else if (selection == DIALOG_CANCEL) {
rv = WERR_OK;
goto finish;
}
}
@ -633,10 +666,6 @@ WERROR dialog_edit_value(TALLOC_CTX *ctx, struct registry_key *key, uint32_t typ
}
finish:
if (selection == DIALOG_OK) {
rv = set_value(edit, key, type);
}
talloc_free(edit);
return rv;

View File

@ -47,15 +47,19 @@ struct dialog *dialog_choice_center_new(TALLOC_CTX *ctx, const char *title,
const char **choices, int nlines,
int ncols, WINDOW *below);
struct dialog *dialog_confirm_new(TALLOC_CTX *ctx, const char *title,
WINDOW *below, const char *msg, ...);
enum dialog_type {
DIA_ALERT,
DIA_CONFIRM
};
enum dialog_selection {
DIALOG_OK = 0,
DIALOG_CANCEL = 1
};
int dialog_modal_loop(struct dialog *dia);
int dialog_notice(TALLOC_CTX *ctx, enum dialog_type type,
const char *title, WINDOW *below,
const char *msg, ...);
struct registry_key;
struct value_item;