[project @ 2005-03-20 14:57:19 by rjw]

Further work towards configurable toolbars.

svn path=/import/netsurf/; revision=1551
This commit is contained in:
Richard Wilson 2005-03-20 14:57:19 +00:00
parent 44f1f35436
commit 06419abcca
6 changed files with 415 additions and 167 deletions

View File

@ -5,7 +5,7 @@
* Copyright 2003 Phil Mellor <monkeyson@users.sourceforge.net> * Copyright 2003 Phil Mellor <monkeyson@users.sourceforge.net>
* Copyright 2004 James Bursa <bursa@users.sourceforge.net> * Copyright 2004 James Bursa <bursa@users.sourceforge.net>
* Copyright 2003 John M Bell <jmb202@ecs.soton.ac.uk> * Copyright 2003 John M Bell <jmb202@ecs.soton.ac.uk>
* Copyright 2004 Richard Wilson <not_ginger_matt@users.sourceforge.net> * Copyright 2005 Richard Wilson <info@tinct.net>
* Copyright 2004 Andrew Timmins <atimmins@blueyonder.co.uk> * Copyright 2004 Andrew Timmins <atimmins@blueyonder.co.uk>
*/ */
@ -157,7 +157,6 @@ static void ro_gui_handle_event(wimp_event_no event, wimp_block *block);
static void ro_gui_poll_queue(wimp_event_no event, wimp_block *block); static void ro_gui_poll_queue(wimp_event_no event, wimp_block *block);
static void ro_gui_null_reason_code(void); static void ro_gui_null_reason_code(void);
static void ro_gui_redraw_window_request(wimp_draw *redraw); static void ro_gui_redraw_window_request(wimp_draw *redraw);
static void ro_gui_open_window_request(wimp_open *open);
static void ro_gui_close_window_request(wimp_close *close); static void ro_gui_close_window_request(wimp_close *close);
static void ro_gui_pointer_leaving_window(wimp_leaving *leaving); static void ro_gui_pointer_leaving_window(wimp_leaving *leaving);
static void ro_gui_pointer_entering_window(wimp_entering *entering); static void ro_gui_pointer_entering_window(wimp_entering *entering);
@ -790,21 +789,33 @@ void ro_gui_redraw_window_request(wimp_draw *redraw)
ro_gui_url_complete_redraw(redraw); ro_gui_url_complete_redraw(redraw);
else if ((hotlist_tree) && (redraw->w == (wimp_w)hotlist_tree->handle)) else if ((hotlist_tree) && (redraw->w == (wimp_w)hotlist_tree->handle))
ro_gui_tree_redraw(redraw, hotlist_tree); ro_gui_tree_redraw(redraw, hotlist_tree);
else if ((global_history_tree) && (redraw->w == (wimp_w)global_history_tree->handle))
ro_gui_tree_redraw(redraw, global_history_tree);
else if ((hotlist_tree) && (hotlist_tree->toolbar) && else if ((hotlist_tree) && (hotlist_tree->toolbar) &&
(hotlist_tree->toolbar->toolbar_handle == redraw->w)) (hotlist_tree->toolbar->toolbar_handle == redraw->w))
ro_gui_theme_redraw(hotlist_tree->toolbar, redraw); ro_gui_theme_redraw(hotlist_tree->toolbar, redraw);
else if ((global_history_tree) && (redraw->w == (wimp_w)global_history_tree->handle)) else if ((hotlist_tree) && (hotlist_tree->toolbar) &&
ro_gui_tree_redraw(redraw, global_history_tree); (hotlist_tree->toolbar->editor) &&
(hotlist_tree->toolbar->editor->toolbar_handle == redraw->w))
ro_gui_theme_redraw(hotlist_tree->toolbar->editor, redraw);
else if ((global_history_tree) && (global_history_tree->toolbar) && else if ((global_history_tree) && (global_history_tree->toolbar) &&
(global_history_tree->toolbar->toolbar_handle == redraw->w)) (global_history_tree->toolbar->toolbar_handle == redraw->w))
ro_gui_theme_redraw(global_history_tree->toolbar, redraw); ro_gui_theme_redraw(global_history_tree->toolbar, redraw);
else if ((global_history_tree) && (global_history_tree->toolbar) &&
(global_history_tree->toolbar->editor) &&
(global_history_tree->toolbar->editor->toolbar_handle == redraw->w))
ro_gui_theme_redraw(global_history_tree->toolbar->editor, redraw);
else if (redraw->w == dialog_debug) else if (redraw->w == dialog_debug)
ro_gui_debugwin_redraw(redraw); ro_gui_debugwin_redraw(redraw);
else if ((g = ro_gui_window_lookup(redraw->w)) != NULL) else if ((g = ro_gui_window_lookup(redraw->w)) != NULL)
ro_gui_window_redraw(g, redraw); ro_gui_window_redraw(g, redraw);
else if ((g = ro_gui_toolbar_lookup(redraw->w)) != NULL) else if ((g = ro_gui_toolbar_lookup(redraw->w)) != NULL) {
ro_gui_theme_redraw(g->toolbar, redraw); if (g->toolbar->toolbar_handle == redraw->w)
else { ro_gui_theme_redraw(g->toolbar, redraw);
else if ((g->toolbar->editor) &&
(g->toolbar->editor->toolbar_handle == redraw->w))
ro_gui_theme_redraw(g->toolbar->editor, redraw);
} else {
ro_gui_dialog_redraw(redraw); ro_gui_dialog_redraw(redraw);
} }
} }
@ -927,8 +938,16 @@ void ro_gui_mouse_click(wimp_pointer *pointer)
else if ((hotlist_tree) && (hotlist_tree->toolbar) && else if ((hotlist_tree) && (hotlist_tree->toolbar) &&
(hotlist_tree->toolbar->toolbar_handle == pointer->w)) (hotlist_tree->toolbar->toolbar_handle == pointer->w))
ro_gui_tree_toolbar_click(pointer, hotlist_tree); ro_gui_tree_toolbar_click(pointer, hotlist_tree);
else if ((hotlist_tree) && (hotlist_tree->toolbar) &&
(hotlist_tree->toolbar->editor) &&
(hotlist_tree->toolbar->editor->toolbar_handle == pointer->w))
ro_gui_tree_toolbar_click(pointer, hotlist_tree);
else if ((global_history_tree) && (global_history_tree->toolbar) && else if ((global_history_tree) && (global_history_tree->toolbar) &&
(global_history_tree->toolbar->toolbar_handle == pointer->w)) (global_history_tree->toolbar->toolbar_handle == pointer->w))
ro_gui_tree_toolbar_click(pointer, global_history_tree);
else if ((global_history_tree) && (global_history_tree->toolbar) &&
(global_history_tree->toolbar->editor) &&
(global_history_tree->toolbar->editor->toolbar_handle == pointer->w))
ro_gui_tree_toolbar_click(pointer, global_history_tree); ro_gui_tree_toolbar_click(pointer, global_history_tree);
else if ((g = ro_gui_window_lookup(pointer->w)) != NULL) else if ((g = ro_gui_window_lookup(pointer->w)) != NULL)
ro_gui_window_click(g, pointer); ro_gui_window_click(g, pointer);

View File

@ -53,7 +53,6 @@ static void build_languages_menu(void);
static void ro_gui_menu_toolbar_submenu_selection(int index); static void ro_gui_menu_toolbar_submenu_selection(int index);
static void ro_gui_menu_prepare_images(void); static void ro_gui_menu_prepare_images(void);
static void ro_gui_menu_prepare_window(void); static void ro_gui_menu_prepare_window(void);
static void ro_gui_menu_prepare_theme(void);
static void ro_gui_menu_prepare_toolbars(struct toolbar *toolbar); static void ro_gui_menu_prepare_toolbars(struct toolbar *toolbar);
static void ro_gui_menu_prepare_render(void); static void ro_gui_menu_prepare_render(void);
static void ro_gui_menu_prepare_help(int forced); static void ro_gui_menu_prepare_help(int forced);
@ -746,7 +745,10 @@ void ro_gui_create_menu(wimp_menu *menu, int x, int y, struct gui_window *g)
current_toolbar = g->toolbar; current_toolbar = g->toolbar;
} else if (menu == toolbar_menu) { } else if (menu == toolbar_menu) {
ro_gui_menu_prepare_theme(); ro_gui_menu_prepare_toolbars(current_toolbar);
toolbar_menu->entries[1].menu_flags &= ~wimp_MENU_TICKED;
if (current_toolbar->editor)
toolbar_menu->entries[1].menu_flags |= wimp_MENU_TICKED;
} else if (menu == hotlist_menu) { } else if (menu == hotlist_menu) {
ro_gui_menu_prepare_hotlist(); ro_gui_menu_prepare_hotlist();
current_toolbar = hotlist_tree->toolbar; current_toolbar = hotlist_tree->toolbar;
@ -861,8 +863,8 @@ void ro_gui_menu_selection(wimp_selection *selection)
ro_gui_menu_toolbar_submenu_selection(selection->items[1]); ro_gui_menu_toolbar_submenu_selection(selection->items[1]);
break; break;
case 1: /* Edit toolbar */ case 1: /* Edit toolbar */
current_toolbar->locked = !current_toolbar->locked; ro_gui_theme_toggle_edit(current_toolbar);
ro_gui_menu_prepare_theme(); ro_gui_menu_prepare_toolbars(current_toolbar);
break; break;
} }
} else if (current_menu == hotlist_menu) { } else if (current_menu == hotlist_menu) {
@ -1241,7 +1243,7 @@ void ro_gui_menu_toolbar_submenu_selection(int index) {
current_toolbar->display_status = !current_toolbar->display_status; current_toolbar->display_status = !current_toolbar->display_status;
break; break;
} }
ro_gui_menu_prepare_theme(); ro_gui_menu_prepare_toolbars(current_toolbar);
current_toolbar->reformat_buttons = true; current_toolbar->reformat_buttons = true;
height = current_toolbar->height; height = current_toolbar->height;
ro_gui_theme_process_toolbar(current_toolbar, -1); ro_gui_theme_process_toolbar(current_toolbar, -1);
@ -1657,20 +1659,19 @@ void ro_gui_prepare_navigate(struct gui_window *gui) {
} }
} }
if (t) { if (t) {
if (h) { if ((h) && (!t->editor)) {
ro_gui_set_icon_shaded_state(t->toolbar_handle, ICON_TOOLBAR_BACK, ro_gui_set_icon_shaded_state(t->toolbar_handle, ICON_TOOLBAR_BACK,
!history_back_available(h)); !history_back_available(h));
ro_gui_set_icon_shaded_state(t->toolbar_handle, ICON_TOOLBAR_FORWARD, ro_gui_set_icon_shaded_state(t->toolbar_handle, ICON_TOOLBAR_FORWARD,
!history_forward_available(h)); !history_forward_available(h));
ro_gui_set_icon_shaded_state(t->toolbar_handle, ICON_TOOLBAR_HISTORY, ro_gui_set_icon_shaded_state(t->toolbar_handle, ICON_TOOLBAR_HISTORY,
!(c || history_back_available(h) || history_forward_available(h))); !(c || history_back_available(h) || history_forward_available(h)));
} else { } else {
ro_gui_set_icon_shaded_state(t->toolbar_handle, ICON_TOOLBAR_BACK, true); ro_gui_set_icon_shaded_state(t->toolbar_handle, ICON_TOOLBAR_BACK, !t->editor);
ro_gui_set_icon_shaded_state(t->toolbar_handle, ICON_TOOLBAR_FORWARD, true); ro_gui_set_icon_shaded_state(t->toolbar_handle, ICON_TOOLBAR_FORWARD, !t->editor);
ro_gui_set_icon_shaded_state(t->toolbar_handle, ICON_TOOLBAR_HISTORY, true); ro_gui_set_icon_shaded_state(t->toolbar_handle, ICON_TOOLBAR_HISTORY, !t->editor);
} }
ro_gui_set_icon_shaded_state(t->toolbar_handle, ICON_TOOLBAR_BOOKMARK, !hotlist_tree); ro_gui_set_icon_shaded_state(t->toolbar_handle, ICON_TOOLBAR_BOOKMARK, (!hotlist_tree && !t->editor));
global_history_get_recent(&suggestions); global_history_get_recent(&suggestions);
ro_gui_set_icon_shaded_state(t->toolbar_handle, ICON_TOOLBAR_SUGGEST, (suggestions <= 0)); ro_gui_set_icon_shaded_state(t->toolbar_handle, ICON_TOOLBAR_SUGGEST, (suggestions <= 0));
} }
@ -1682,7 +1683,7 @@ void ro_gui_prepare_navigate(struct gui_window *gui) {
if (t) ro_gui_set_icon_shaded_state(t->toolbar_handle, ICON_TOOLBAR_RELOAD, false); if (t) ro_gui_set_icon_shaded_state(t->toolbar_handle, ICON_TOOLBAR_RELOAD, false);
} else { } else {
if (update_menu) browser_navigate_menu->entries[3].icon_flags |= wimp_ICON_SHADED; if (update_menu) browser_navigate_menu->entries[3].icon_flags |= wimp_ICON_SHADED;
if (t) ro_gui_set_icon_shaded_state(t->toolbar_handle, ICON_TOOLBAR_RELOAD, true); if (t) ro_gui_set_icon_shaded_state(t->toolbar_handle, ICON_TOOLBAR_RELOAD, !t->editor);
} }
if (bw->loading_content || (bw->current_content && if (bw->loading_content || (bw->current_content &&
bw->current_content->status != CONTENT_STATUS_DONE)) { bw->current_content->status != CONTENT_STATUS_DONE)) {
@ -1690,27 +1691,22 @@ void ro_gui_prepare_navigate(struct gui_window *gui) {
if (t) ro_gui_set_icon_shaded_state(t->toolbar_handle, ICON_TOOLBAR_STOP, false); if (t) ro_gui_set_icon_shaded_state(t->toolbar_handle, ICON_TOOLBAR_STOP, false);
} else { } else {
if (update_menu) browser_navigate_menu->entries[4].icon_flags |= wimp_ICON_SHADED; if (update_menu) browser_navigate_menu->entries[4].icon_flags |= wimp_ICON_SHADED;
if (t) ro_gui_set_icon_shaded_state(t->toolbar_handle, ICON_TOOLBAR_STOP, true); if (t) ro_gui_set_icon_shaded_state(t->toolbar_handle, ICON_TOOLBAR_STOP, !t->editor);
} }
/* Set the scale view icon /* Set the scale view icon
*/ */
if (c) { if (update_menu) {
if (update_menu) menu.entries[0].icon_flags &= ~wimp_ICON_SHADED; if (c)
if (t) { menu.entries[0].icon_flags &= ~wimp_ICON_SHADED;
ro_gui_set_icon_shaded_state(t->toolbar_handle, ICON_TOOLBAR_SEARCH, false); else
ro_gui_set_icon_shaded_state(t->toolbar_handle, ICON_TOOLBAR_SCALE, false); menu.entries[0].icon_flags |= wimp_ICON_SHADED;
ro_gui_set_icon_shaded_state(t->toolbar_handle, ICON_TOOLBAR_SAVE, false); }
ro_gui_set_icon_shaded_state(t->toolbar_handle, ICON_TOOLBAR_PRINT, false); if (t) {
} ro_gui_set_icon_shaded_state(t->toolbar_handle, ICON_TOOLBAR_SEARCH, (!c && !t->editor));
} else { ro_gui_set_icon_shaded_state(t->toolbar_handle, ICON_TOOLBAR_SCALE, (!c && !t->editor));
if (update_menu) menu.entries[0].icon_flags |= wimp_ICON_SHADED; ro_gui_set_icon_shaded_state(t->toolbar_handle, ICON_TOOLBAR_SAVE, (!c && !t->editor));
if (t) { ro_gui_set_icon_shaded_state(t->toolbar_handle, ICON_TOOLBAR_PRINT, (!c && !t->editor));
ro_gui_set_icon_shaded_state(t->toolbar_handle, ICON_TOOLBAR_SEARCH, true);
ro_gui_set_icon_shaded_state(t->toolbar_handle, ICON_TOOLBAR_SCALE, true);
ro_gui_set_icon_shaded_state(t->toolbar_handle, ICON_TOOLBAR_SAVE, true);
ro_gui_set_icon_shaded_state(t->toolbar_handle, ICON_TOOLBAR_PRINT, true);
}
} }
/* Check if we've changed our menu state /* Check if we've changed our menu state
@ -1819,20 +1815,6 @@ static void ro_gui_menu_prepare_window(void) {
} }
/**
* Update toolbar menu status
*/
static void ro_gui_menu_prepare_theme(void) {
if (!current_toolbar) return;
ro_gui_menu_prepare_toolbars(current_toolbar);
if (current_toolbar->locked) {
toolbar_menu->entries[1].menu_flags |= wimp_MENU_TICKED;
} else {
toolbar_menu->entries[1].menu_flags &= ~wimp_MENU_TICKED;
}
}
/** /**
* Update toolbar menu status * Update toolbar menu status
*/ */
@ -1846,6 +1828,10 @@ static void ro_gui_menu_prepare_toolbars(struct toolbar *toolbar) {
browser_toolbar_menu->entries[index].icon_flags &= ~wimp_ICON_SHADED; browser_toolbar_menu->entries[index].icon_flags &= ~wimp_ICON_SHADED;
browser_toolbar_menu->entries[index].menu_flags &= ~wimp_MENU_TICKED; browser_toolbar_menu->entries[index].menu_flags &= ~wimp_MENU_TICKED;
} }
if (toolbar->editor) {
browser_toolbar_menu->entries[0].icon_flags |= wimp_ICON_SHADED;
browser_toolbar_menu->entries[0].menu_flags |= wimp_MENU_TICKED;
}
if ((toolbar->descriptor) && (toolbar->descriptor->theme)) { if ((toolbar->descriptor) && (toolbar->descriptor->theme)) {
if (toolbar->display_buttons) browser_toolbar_menu->entries[0].menu_flags |= wimp_MENU_TICKED; if (toolbar->display_buttons) browser_toolbar_menu->entries[0].menu_flags |= wimp_MENU_TICKED;
if (toolbar->display_throbber) browser_toolbar_menu->entries[2].menu_flags |= wimp_MENU_TICKED; if (toolbar->display_throbber) browser_toolbar_menu->entries[2].menu_flags |= wimp_MENU_TICKED;
@ -1911,14 +1897,25 @@ void ro_gui_menu_prepare_hotlist(void) {
} }
if (hotlist_toolbar) { if (hotlist_toolbar) {
ro_gui_set_icon_shaded_state(hotlist_toolbar->toolbar_handle, if (hotlist_toolbar->editor) {
ICON_TOOLBAR_OPEN, !hotlist_tree->root->child); ro_gui_set_icon_shaded_state(hotlist_toolbar->toolbar_handle,
ro_gui_set_icon_shaded_state(hotlist_toolbar->toolbar_handle, ICON_TOOLBAR_OPEN, false);
ICON_TOOLBAR_EXPAND, !hotlist_tree->root->child); ro_gui_set_icon_shaded_state(hotlist_toolbar->toolbar_handle,
ro_gui_set_icon_shaded_state(hotlist_toolbar->toolbar_handle, ICON_TOOLBAR_EXPAND, false);
ICON_TOOLBAR_DELETE, !selection); ro_gui_set_icon_shaded_state(hotlist_toolbar->toolbar_handle,
ro_gui_set_icon_shaded_state(hotlist_toolbar->toolbar_handle, ICON_TOOLBAR_DELETE, false);
ICON_TOOLBAR_LAUNCH, !selection); ro_gui_set_icon_shaded_state(hotlist_toolbar->toolbar_handle,
ICON_TOOLBAR_LAUNCH, false);
} else {
ro_gui_set_icon_shaded_state(hotlist_toolbar->toolbar_handle,
ICON_TOOLBAR_OPEN, !hotlist_tree->root->child);
ro_gui_set_icon_shaded_state(hotlist_toolbar->toolbar_handle,
ICON_TOOLBAR_EXPAND, !hotlist_tree->root->child);
ro_gui_set_icon_shaded_state(hotlist_toolbar->toolbar_handle,
ICON_TOOLBAR_DELETE, !selection);
ro_gui_set_icon_shaded_state(hotlist_toolbar->toolbar_handle,
ICON_TOOLBAR_LAUNCH, !selection);
}
} }
if (selection) { if (selection) {
@ -1975,14 +1972,25 @@ void ro_gui_menu_prepare_global_history(void) {
} }
if (global_history_toolbar) { if (global_history_toolbar) {
ro_gui_set_icon_shaded_state(global_history_toolbar->toolbar_handle, if (global_history_toolbar->editor) {
ICON_TOOLBAR_OPEN, !global_history_tree->root->child); ro_gui_set_icon_shaded_state(global_history_toolbar->toolbar_handle,
ro_gui_set_icon_shaded_state(global_history_toolbar->toolbar_handle, ICON_TOOLBAR_OPEN, false);
ICON_TOOLBAR_EXPAND, !global_history_tree->root->child); ro_gui_set_icon_shaded_state(global_history_toolbar->toolbar_handle,
ro_gui_set_icon_shaded_state(global_history_toolbar->toolbar_handle, ICON_TOOLBAR_EXPAND, false);
ICON_TOOLBAR_DELETE, !selection); ro_gui_set_icon_shaded_state(global_history_toolbar->toolbar_handle,
ro_gui_set_icon_shaded_state(global_history_toolbar->toolbar_handle, ICON_TOOLBAR_DELETE, false);
ICON_TOOLBAR_LAUNCH, !selection); ro_gui_set_icon_shaded_state(global_history_toolbar->toolbar_handle,
ICON_TOOLBAR_LAUNCH, false);
} else {
ro_gui_set_icon_shaded_state(global_history_toolbar->toolbar_handle,
ICON_TOOLBAR_OPEN, !global_history_tree->root->child);
ro_gui_set_icon_shaded_state(global_history_toolbar->toolbar_handle,
ICON_TOOLBAR_EXPAND, !global_history_tree->root->child);
ro_gui_set_icon_shaded_state(global_history_toolbar->toolbar_handle,
ICON_TOOLBAR_DELETE, !selection);
ro_gui_set_icon_shaded_state(global_history_toolbar->toolbar_handle,
ICON_TOOLBAR_LAUNCH, !selection);
}
} }
if (selection) { if (selection) {

View File

@ -570,6 +570,7 @@ void ro_gui_theme_redraw(struct toolbar *toolbar, wimp_draw *redraw) {
struct toolbar_icon *icon; struct toolbar_icon *icon;
osbool more = wimp_redraw_window(redraw); osbool more = wimp_redraw_window(redraw);
wimp_icon separator_icon; wimp_icon separator_icon;
os_error *error;
bool perform_redraw = false; bool perform_redraw = false;
/* Set up the icon /* Set up the icon
@ -586,7 +587,7 @@ void ro_gui_theme_redraw(struct toolbar *toolbar, wimp_draw *redraw) {
separator_icon.extent.y1 = toolbar->height; separator_icon.extent.y1 = toolbar->height;
perform_redraw = true; perform_redraw = true;
} }
perform_redraw &= toolbar->display_buttons; perform_redraw &= toolbar->display_buttons || toolbar->editor;
while (more) { while (more) {
if (perform_redraw) { if (perform_redraw) {
@ -597,8 +598,14 @@ void ro_gui_theme_redraw(struct toolbar *toolbar, wimp_draw *redraw) {
wimp_plot_icon(&separator_icon); wimp_plot_icon(&separator_icon);
} }
} }
} }
more = wimp_get_rectangle(redraw); error = xwimp_get_rectangle(redraw, &more);
if (error) {
LOG(("xwimp_get_rectangle: 0x%x: %s",
error->errnum, error->errmess));
warn_user("WimpError", error->errmess);
return;
}
} }
} }
@ -714,6 +721,29 @@ struct toolbar *ro_gui_theme_create_toolbar(struct theme_descriptor *descriptor,
ro_gui_theme_add_toolbar_icon(toolbar, "open", ICON_TOOLBAR_OPEN); ro_gui_theme_add_toolbar_icon(toolbar, "open", ICON_TOOLBAR_OPEN);
ro_gui_theme_add_toolbar_icon(toolbar, "expand", ICON_TOOLBAR_EXPAND); ro_gui_theme_add_toolbar_icon(toolbar, "expand", ICON_TOOLBAR_EXPAND);
break; break;
case THEME_BROWSER_EDIT_TOOLBAR:
ro_gui_theme_add_toolbar_icon(toolbar, "back", ICON_TOOLBAR_BACK);
ro_gui_theme_add_toolbar_icon(toolbar, "forward", ICON_TOOLBAR_FORWARD);
ro_gui_theme_add_toolbar_icon(toolbar, "stop", ICON_TOOLBAR_STOP);
ro_gui_theme_add_toolbar_icon(toolbar, "reload", ICON_TOOLBAR_RELOAD);
ro_gui_theme_add_toolbar_icon(toolbar, "home", ICON_TOOLBAR_HOME);
ro_gui_theme_add_toolbar_icon(toolbar, "search", ICON_TOOLBAR_SEARCH);
ro_gui_theme_add_toolbar_icon(toolbar, "history", ICON_TOOLBAR_HISTORY);
ro_gui_theme_add_toolbar_icon(toolbar, "scale", ICON_TOOLBAR_SCALE);
ro_gui_theme_add_toolbar_icon(toolbar, "hotlist", ICON_TOOLBAR_BOOKMARK);
ro_gui_theme_add_toolbar_icon(toolbar, "save", ICON_TOOLBAR_SAVE);
ro_gui_theme_add_toolbar_icon(toolbar, "print", ICON_TOOLBAR_PRINT);
ro_gui_theme_add_toolbar_icon(toolbar, NULL, -1);
break;
case THEME_HOTLIST_EDIT_TOOLBAR:
ro_gui_theme_add_toolbar_icon(toolbar, "create", ICON_TOOLBAR_CREATE);
case THEME_HISTORY_EDIT_TOOLBAR:
ro_gui_theme_add_toolbar_icon(toolbar, "delete", ICON_TOOLBAR_DELETE);
ro_gui_theme_add_toolbar_icon(toolbar, "launch", ICON_TOOLBAR_LAUNCH);
ro_gui_theme_add_toolbar_icon(toolbar, "open", ICON_TOOLBAR_OPEN);
ro_gui_theme_add_toolbar_icon(toolbar, "expand", ICON_TOOLBAR_EXPAND);
ro_gui_theme_add_toolbar_icon(toolbar, NULL, -1);
break;
} }
/* Claim the memory for our Wimp indirection /* Claim the memory for our Wimp indirection
@ -756,6 +786,7 @@ bool ro_gui_theme_update_toolbar(struct theme_descriptor *descriptor, struct too
struct toolbar_icon *toolbar_icon; struct toolbar_icon *toolbar_icon;
int width, max_icon; int width, max_icon;
wimp_icon_flags icon_flags; wimp_icon_flags icon_flags;
struct gui_window *g;
if (!toolbar) return false; if (!toolbar) return false;
/* Set the theme and window sprite area /* Set the theme and window sprite area
@ -785,6 +816,12 @@ bool ro_gui_theme_update_toolbar(struct theme_descriptor *descriptor, struct too
} else { } else {
theme_toolbar_window.work_bg = wimp_COLOUR_VERY_LIGHT_GREY; theme_toolbar_window.work_bg = wimp_COLOUR_VERY_LIGHT_GREY;
} }
theme_toolbar_window.work_flags &= ~wimp_ICON_BUTTON_TYPE;
if ((toolbar->editor) || (toolbar->type == THEME_HOTLIST_EDIT_TOOLBAR) ||
(toolbar->type == THEME_HISTORY_EDIT_TOOLBAR) ||
(toolbar->type == THEME_BROWSER_EDIT_TOOLBAR))
theme_toolbar_window.work_flags |= (wimp_BUTTON_CLICK_DRAG << wimp_ICON_BUTTON_TYPE_SHIFT);
theme_toolbar_window.flags &= ~wimp_WINDOW_AUTO_REDRAW; theme_toolbar_window.flags &= ~wimp_WINDOW_AUTO_REDRAW;
theme_toolbar_window.flags |= wimp_WINDOW_NO_BOUNDS; theme_toolbar_window.flags |= wimp_WINDOW_NO_BOUNDS;
theme_toolbar_window.xmin = 1; theme_toolbar_window.xmin = 1;
@ -809,9 +846,9 @@ bool ro_gui_theme_update_toolbar(struct theme_descriptor *descriptor, struct too
/* Create the basic icons /* Create the basic icons
*/ */
if (toolbar->type == THEME_HOTLIST_TOOLBAR) if ((toolbar->type == THEME_HOTLIST_TOOLBAR) || (toolbar->type == THEME_HOTLIST_EDIT_TOOLBAR))
max_icon = ICON_TOOLBAR_HOTLIST_LAST; max_icon = ICON_TOOLBAR_HOTLIST_LAST;
else if (toolbar->type == THEME_HISTORY_TOOLBAR) else if ((toolbar->type == THEME_HISTORY_TOOLBAR) || (toolbar->type == THEME_HISTORY_EDIT_TOOLBAR))
max_icon = ICON_TOOLBAR_HISTORY_LAST; max_icon = ICON_TOOLBAR_HISTORY_LAST;
else else
max_icon = ICON_TOOLBAR_URL; max_icon = ICON_TOOLBAR_URL;
@ -819,8 +856,13 @@ bool ro_gui_theme_update_toolbar(struct theme_descriptor *descriptor, struct too
new_icon.icon.data.indirected_text.size = 1; new_icon.icon.data.indirected_text.size = 1;
new_icon.icon.flags = wimp_ICON_TEXT | wimp_ICON_SPRITE | new_icon.icon.flags = wimp_ICON_TEXT | wimp_ICON_SPRITE |
wimp_ICON_INDIRECTED | wimp_ICON_HCENTRED | wimp_ICON_INDIRECTED | wimp_ICON_HCENTRED |
wimp_ICON_VCENTRED | wimp_ICON_VCENTRED;
(wimp_BUTTON_CLICK << wimp_ICON_BUTTON_TYPE_SHIFT); if ((toolbar->editor) || (toolbar->type == THEME_HOTLIST_EDIT_TOOLBAR) ||
(toolbar->type == THEME_HISTORY_EDIT_TOOLBAR) ||
(toolbar->type == THEME_BROWSER_EDIT_TOOLBAR))
new_icon.icon.flags |= (wimp_BUTTON_NEVER << wimp_ICON_BUTTON_TYPE_SHIFT);
else
new_icon.icon.flags |= (wimp_BUTTON_CLICK << wimp_ICON_BUTTON_TYPE_SHIFT);
if (toolbar->descriptor) if (toolbar->descriptor)
new_icon.icon.flags |= (toolbar->descriptor->browser_background new_icon.icon.flags |= (toolbar->descriptor->browser_background
<< wimp_ICON_BG_COLOUR_SHIFT); << wimp_ICON_BG_COLOUR_SHIFT);
@ -884,11 +926,11 @@ bool ro_gui_theme_update_toolbar(struct theme_descriptor *descriptor, struct too
return false; return false;
} }
/* Now the URL suggestion icon /* Now the URL suggestion icon
*/ */
new_icon.icon.data.indirected_text.text = theme_null_text_string; new_icon.icon.data.indirected_text.text = theme_null_text_string;
new_icon.icon.data.indirected_text.size = 1; new_icon.icon.data.indirected_text.size = 1;
new_icon.icon.flags = icon_flags; new_icon.icon.flags = icon_flags | (wimp_BUTTON_CLICK << wimp_ICON_BUTTON_TYPE_SHIFT);
if (toolbar->suggest) if (toolbar->suggest)
new_icon.icon.data.indirected_text.validation = toolbar->suggest->validation; new_icon.icon.data.indirected_text.validation = toolbar->suggest->validation;
else else
@ -980,6 +1022,24 @@ bool ro_gui_theme_update_toolbar(struct theme_descriptor *descriptor, struct too
toolbar->toolbar_current = -1; toolbar->toolbar_current = -1;
toolbar->status_current = -1; toolbar->status_current = -1;
ro_gui_theme_process_toolbar(toolbar, width); ro_gui_theme_process_toolbar(toolbar, width);
/* Keep menus up to date etc
*/
switch (toolbar->type) {
case THEME_BROWSER_TOOLBAR:
g = ro_gui_window_lookup(toolbar->parent_handle);
if (g)
ro_gui_prepare_navigate(g);
break;
case THEME_HOTLIST_TOOLBAR:
ro_gui_menu_prepare_hotlist();
break;
case THEME_HISTORY_TOOLBAR:
ro_gui_menu_prepare_global_history();
break;
default:
break;
}
return true; return true;
} }
@ -995,12 +1055,16 @@ bool ro_gui_theme_attach_toolbar(struct toolbar *toolbar, wimp_w parent) {
wimp_outline outline; wimp_outline outline;
wimp_window_state state; wimp_window_state state;
int height; int height;
int full_height;
os_error *error;
if (!toolbar) return false; if (!toolbar) return false;
/* Attach/close the window /* Attach/close the windows
*/ */
toolbar->parent_handle = parent; toolbar->parent_handle = parent;
height = ro_gui_theme_toolbar_height(toolbar); height = ro_gui_theme_toolbar_height(toolbar);
full_height = ro_gui_theme_toolbar_full_height(toolbar);
if (height > 0) { if (height > 0) {
outline.w = parent; outline.w = parent;
xwimp_get_window_outline(&outline); xwimp_get_window_outline(&outline);
@ -1010,8 +1074,8 @@ bool ro_gui_theme_attach_toolbar(struct toolbar *toolbar, wimp_w parent) {
state.visible.x1 = outline.outline.x1 - 2; state.visible.x1 = outline.outline.x1 - 2;
state.visible.y0 = state.visible.y1 - height + 2; state.visible.y0 = state.visible.y1 - height + 2;
state.xscroll = 0; state.xscroll = 0;
state.yscroll = toolbar->height; /* clipped by WIMP to extent */ state.yscroll = toolbar->height - 2; /* clipped by the WIMP */
xwimp_open_window_nested((wimp_open *)&state, parent, error = xwimp_open_window_nested((wimp_open *)&state, parent,
wimp_CHILD_LINKS_PARENT_VISIBLE_BOTTOM_OR_LEFT wimp_CHILD_LINKS_PARENT_VISIBLE_BOTTOM_OR_LEFT
<< wimp_CHILD_XORIGIN_SHIFT | << wimp_CHILD_XORIGIN_SHIFT |
wimp_CHILD_LINKS_PARENT_VISIBLE_TOP_OR_RIGHT wimp_CHILD_LINKS_PARENT_VISIBLE_TOP_OR_RIGHT
@ -1024,6 +1088,36 @@ bool ro_gui_theme_attach_toolbar(struct toolbar *toolbar, wimp_w parent) {
<< wimp_CHILD_RS_EDGE_SHIFT | << wimp_CHILD_RS_EDGE_SHIFT |
wimp_CHILD_LINKS_PARENT_VISIBLE_TOP_OR_RIGHT wimp_CHILD_LINKS_PARENT_VISIBLE_TOP_OR_RIGHT
<< wimp_CHILD_TS_EDGE_SHIFT); << wimp_CHILD_TS_EDGE_SHIFT);
if (error) {
LOG(("xwimp_open_window_nested: 0x%x: %s",
error->errnum, error->errmess));
warn_user("WimpError", error->errmess);
return false;
}
if (toolbar->editor) {
state.w = toolbar->editor->toolbar_handle;
state.visible.y1 -= toolbar->height;
state.yscroll = toolbar->editor->height - 2;
error = xwimp_open_window_nested((wimp_open *)&state, toolbar->toolbar_handle,
wimp_CHILD_LINKS_PARENT_VISIBLE_BOTTOM_OR_LEFT
<< wimp_CHILD_XORIGIN_SHIFT |
wimp_CHILD_LINKS_PARENT_VISIBLE_TOP_OR_RIGHT
<< wimp_CHILD_YORIGIN_SHIFT |
wimp_CHILD_LINKS_PARENT_VISIBLE_BOTTOM_OR_LEFT
<< wimp_CHILD_LS_EDGE_SHIFT |
wimp_CHILD_LINKS_PARENT_VISIBLE_TOP_OR_RIGHT
<< wimp_CHILD_BS_EDGE_SHIFT |
wimp_CHILD_LINKS_PARENT_VISIBLE_TOP_OR_RIGHT
<< wimp_CHILD_RS_EDGE_SHIFT |
wimp_CHILD_LINKS_PARENT_VISIBLE_TOP_OR_RIGHT
<< wimp_CHILD_TS_EDGE_SHIFT);
if (error) {
LOG(("xwimp_open_window_nested: 0x%x: %s",
error->errnum, error->errmess));
warn_user("WimpError", error->errmess);
return false;
}
}
} else { } else {
xwimp_close_window(toolbar->toolbar_handle); xwimp_close_window(toolbar->toolbar_handle);
} }
@ -1089,7 +1183,6 @@ bool ro_gui_theme_process_toolbar(struct toolbar *toolbar, int width) {
wimp_caret caret; wimp_caret caret;
os_box extent = { 0, 0, 0, 0 }; os_box extent = { 0, 0, 0, 0 };
os_error *error; os_error *error;
wimp_w parent = NULL;
wimp_outline outline; wimp_outline outline;
wimp_window_state state; wimp_window_state state;
int height = -1; int height = -1;
@ -1102,50 +1195,24 @@ bool ro_gui_theme_process_toolbar(struct toolbar *toolbar, int width) {
int old_height = toolbar->height; int old_height = toolbar->height;
int old_width = toolbar->toolbar_current; int old_width = toolbar->toolbar_current;
struct toolbar_icon *toolbar_icon; struct toolbar_icon *toolbar_icon;
struct toolbar_icon *last_icon = NULL;
bool visible_icon = false; bool visible_icon = false;
int collapse_height;
/* Disable lone separators
*/
if (toolbar->reformat_buttons) {
visible_icon = false;
toolbar_icon = toolbar->icon;
while (toolbar_icon) {
if (toolbar_icon->icon_number < 0) {
toolbar_icon->display = visible_icon;
visible_icon = false;
} else if (toolbar_icon->width > 0) {
visible_icon |= toolbar_icon->display;
}
if (toolbar_icon->display) last_icon = toolbar_icon;
toolbar_icon = toolbar_icon->next;
}
if ((last_icon) && (last_icon->icon_number < 0)) {
last_icon->display = false;
}
visible_icon = false;
}
/* Find the parent window handle if we need to process the status window, /* Find the parent window handle if we need to process the status window,
or the caller has requested we calculate the width ourself. or the caller has requested we calculate the width ourself.
*/ */
if ((width == -1) || ((toolbar->status_handle) && (toolbar->display_status))) { if ((toolbar->parent_handle) && ((width == -1) ||
parent = toolbar->parent_handle; ((toolbar->status_handle) && (toolbar->display_status)))) {
outline.w = toolbar->parent_handle;
/* Get the window outline width error = xwimp_get_window_outline(&outline);
*/ if (error) {
if (width == -1) { LOG(("xwimp_get_window_outline: 0x%x: %s",
if (!parent) return false; error->errnum, error->errmess));
outline.w = toolbar->parent_handle; warn_user("WimpError", error->errmess);
error = xwimp_get_window_outline(&outline); return false;
if (error) {
LOG(("xwimp_get_window_outline: 0x%x: %s",
error->errnum, error->errmess));
warn_user("WimpError", error->errmess);
return false;
}
width = outline.outline.x1 - outline.outline.x0 - 2;
} }
if (width == -1)
width = outline.outline.x1 - outline.outline.x0 - 2;
} }
/* Find the parent visible height to clip our toolbar height to /* Find the parent visible height to clip our toolbar height to
@ -1179,10 +1246,12 @@ bool ro_gui_theme_process_toolbar(struct toolbar *toolbar, int width) {
xwimp_force_redraw(toolbar->parent_handle, xwimp_force_redraw(toolbar->parent_handle,
0, -16384, 16384, 16384); 0, -16384, 16384, 16384);
toolbar->max_height = height; toolbar->max_height = height;
collapse_height = toolbar->height +
(toolbar->editor ? toolbar->editor->height : 0);
ro_gui_theme_attach_toolbar(toolbar, toolbar->parent_handle); ro_gui_theme_attach_toolbar(toolbar, toolbar->parent_handle);
if ((state.flags & wimp_WINDOW_SIZE_ICON) && if ((state.flags & wimp_WINDOW_SIZE_ICON) &&
!(state.flags & wimp_WINDOW_HSCROLL) && !(state.flags & wimp_WINDOW_HSCROLL) &&
(toolbar->height > toolbar->max_height)) (collapse_height > toolbar->max_height))
xwimp_force_redraw(toolbar->parent_handle, xwimp_force_redraw(toolbar->parent_handle,
0, -16384, 16384, 16384); 0, -16384, 16384, 16384);
} }
@ -1213,7 +1282,7 @@ bool ro_gui_theme_process_toolbar(struct toolbar *toolbar, int width) {
/* Get the minimum height of the icons /* Get the minimum height of the icons
*/ */
bottom_edge = left_edge; bottom_edge = left_edge;
if ((toolbar->display_buttons) && (toolbar->descriptor) && if ((toolbar->display_buttons || toolbar->editor) && (toolbar->descriptor) &&
(toolbar->descriptor->theme)) { (toolbar->descriptor->theme)) {
toolbar_icon = toolbar->icon; toolbar_icon = toolbar->icon;
while (toolbar_icon) { while (toolbar_icon) {
@ -1251,10 +1320,12 @@ bool ro_gui_theme_process_toolbar(struct toolbar *toolbar, int width) {
} }
} }
if (toolbar->height != 0)
toolbar->height += 2;
if (toolbar->reformat_buttons) { if (toolbar->reformat_buttons) {
/* Hide the URL bar if we should /* Hide the URL bar if we should
*/ */
if (!toolbar->display_url) { if ((!toolbar->display_url) && (toolbar->type == THEME_BROWSER_TOOLBAR)) {
if (!xwimp_get_caret_position(&caret)) { if (!xwimp_get_caret_position(&caret)) {
if ((caret.w == toolbar->toolbar_handle) && if ((caret.w == toolbar->toolbar_handle) &&
(caret.i == ICON_TOOLBAR_URL)) { (caret.i == ICON_TOOLBAR_URL)) {
@ -1271,9 +1342,10 @@ bool ro_gui_theme_process_toolbar(struct toolbar *toolbar, int width) {
0, -16384, 0, -16384); 0, -16384, 0, -16384);
xwimp_resize_icon(toolbar->toolbar_handle, ICON_TOOLBAR_SUGGEST, xwimp_resize_icon(toolbar->toolbar_handle, ICON_TOOLBAR_SUGGEST,
0, -16384, 0, -16384); 0, -16384, 0, -16384);
} else if (toolbar->type == THEME_BROWSER_TOOLBAR) {
ro_gui_set_icon_shaded_state(toolbar->toolbar_handle, ICON_TOOLBAR_URL,
!toolbar->display_url);
} }
ro_gui_set_icon_shaded_state(toolbar->toolbar_handle, ICON_TOOLBAR_URL,
!toolbar->display_url);
xwimp_force_redraw(toolbar->toolbar_handle, xwimp_force_redraw(toolbar->toolbar_handle,
0, 0, 16384, 16384); 0, 0, 16384, 16384);
@ -1281,8 +1353,9 @@ bool ro_gui_theme_process_toolbar(struct toolbar *toolbar, int width) {
*/ */
toolbar_icon = toolbar->icon; toolbar_icon = toolbar->icon;
while (toolbar_icon) { while (toolbar_icon) {
if ((toolbar->display_buttons) && (toolbar_icon->display) if ((toolbar->display_buttons || toolbar->editor) &&
&& (toolbar_icon->width > 0)) { (toolbar_icon->display)
&& (toolbar_icon->width > 0)) {
visible_icon = true; visible_icon = true;
bottom_edge = (toolbar->height - bottom_edge = (toolbar->height -
toolbar_icon->height) / 2; toolbar_icon->height) / 2;
@ -1305,12 +1378,11 @@ bool ro_gui_theme_process_toolbar(struct toolbar *toolbar, int width) {
} }
if (toolbar->height != 0) toolbar->height += 2;
if (toolbar->type == THEME_BROWSER_TOOLBAR) { if (toolbar->type == THEME_BROWSER_TOOLBAR) {
/* Move the URL bar /* Move the URL bar
*/ */
if (toolbar->display_url) { if (toolbar->display_url) {
if (toolbar->suggest) { if (toolbar->suggest) {
xwimp_resize_icon(toolbar->toolbar_handle, ICON_TOOLBAR_URL, xwimp_resize_icon(toolbar->toolbar_handle, ICON_TOOLBAR_URL,
left_edge, (toolbar->height / 2) - 26, left_edge, (toolbar->height / 2) - 26,
right_edge - toolbar->suggest->width - 8, right_edge - toolbar->suggest->width - 8,
@ -1323,7 +1395,7 @@ bool ro_gui_theme_process_toolbar(struct toolbar *toolbar, int width) {
xwimp_force_redraw(toolbar->toolbar_handle, xwimp_force_redraw(toolbar->toolbar_handle,
right_edge - toolbar->suggest->width - 8, 0, right_edge - toolbar->suggest->width - 8, 0,
16384, 16384); 16384, 16384);
} else { } else {
xwimp_resize_icon(toolbar->toolbar_handle, ICON_TOOLBAR_URL, xwimp_resize_icon(toolbar->toolbar_handle, ICON_TOOLBAR_URL,
left_edge, (toolbar->height / 2) - 26, left_edge, (toolbar->height / 2) - 26,
right_edge, (toolbar->height / 2) + 26); right_edge, (toolbar->height / 2) + 26);
@ -1368,19 +1440,18 @@ bool ro_gui_theme_process_toolbar(struct toolbar *toolbar, int width) {
toolbar->toolbar_current = width; toolbar->toolbar_current = width;
if (toolbar->reformat_buttons) { if (toolbar->reformat_buttons) {
extent.x1 = 16384; extent.x1 = 16384;
extent.y0 = 0; extent.y0 = (toolbar->editor ? -toolbar->editor->height : 0);
extent.y1 = toolbar->height - 2; extent.y1 = toolbar->height - 2;
xwimp_set_extent(toolbar->toolbar_handle, &extent); xwimp_set_extent(toolbar->toolbar_handle, &extent);
if ((parent) && (old_height != toolbar->height)) { if ((toolbar->parent_handle) && (old_height != toolbar->height))
ro_gui_theme_attach_toolbar(toolbar, parent); ro_gui_theme_attach_toolbar(toolbar, toolbar->parent_handle);
}
} }
toolbar->reformat_buttons = false; toolbar->reformat_buttons = false;
} }
/* Reformat the status bar /* Reformat the status bar
*/ */
if ((toolbar->status_handle) && (parent)) { if ((toolbar->status_handle) && (toolbar->parent_handle)) {
/* Get the current state /* Get the current state
*/ */
state.w = toolbar->status_handle; state.w = toolbar->status_handle;
@ -1400,13 +1471,15 @@ bool ro_gui_theme_process_toolbar(struct toolbar *toolbar, int width) {
} else { } else {
/* Get the status bar height/width /* Get the status bar height/width
*/ */
status_max = width - ro_get_vscroll_width(parent); status_max = width - ro_get_vscroll_width(toolbar->parent_handle);
status_size = (status_max * toolbar->status_width) / 10000; status_size = (status_max * toolbar->status_width) / 10000;
if (status_size < 12) status_size = 12; if (status_size < 12) status_size = 12;
status_height = ro_get_hscroll_height(parent) - 2; status_height = ro_get_hscroll_height(toolbar->parent_handle) - 2;
/* Update the extent /* Update the extent
*/ */
extent.x0 = 0;
extent.y0 = 0;
extent.x1 = status_max; extent.x1 = status_max;
extent.y1 = status_height - 2; extent.y1 = status_height - 2;
xwimp_set_extent(toolbar->status_handle, &extent); xwimp_set_extent(toolbar->status_handle, &extent);
@ -1421,7 +1494,7 @@ bool ro_gui_theme_process_toolbar(struct toolbar *toolbar, int width) {
state.visible.x1 = outline.outline.x0 + status_size; state.visible.x1 = outline.outline.x0 + status_size;
state.visible.y0 = outline.outline.y0 - status_height; state.visible.y0 = outline.outline.y0 - status_height;
state.visible.y1 = outline.outline.y0 - 2; state.visible.y1 = outline.outline.y0 - 2;
xwimp_open_window_nested((wimp_open *)&state, parent, xwimp_open_window_nested((wimp_open *)&state, toolbar->parent_handle,
wimp_CHILD_LINKS_PARENT_VISIBLE_BOTTOM_OR_LEFT wimp_CHILD_LINKS_PARENT_VISIBLE_BOTTOM_OR_LEFT
<< wimp_CHILD_XORIGIN_SHIFT | << wimp_CHILD_XORIGIN_SHIFT |
wimp_CHILD_LINKS_PARENT_VISIBLE_BOTTOM_OR_LEFT wimp_CHILD_LINKS_PARENT_VISIBLE_BOTTOM_OR_LEFT
@ -1469,6 +1542,13 @@ void ro_gui_theme_destroy_toolbar(struct toolbar *toolbar) {
struct toolbar_icon *next_icon; struct toolbar_icon *next_icon;
if (!toolbar) return; if (!toolbar) return;
/* Destroy our editor
*/
if (toolbar->editor) {
toolbar->editor = NULL;
ro_gui_theme_destroy_toolbar(toolbar->editor);
}
/* Delete our windows /* Delete our windows
*/ */
if (toolbar->toolbar_handle) if (toolbar->toolbar_handle)
@ -1492,6 +1572,130 @@ void ro_gui_theme_destroy_toolbar(struct toolbar *toolbar) {
} }
/**
* Toggles the toolbar editing mode
*
* \param toolbar the toolbar to toggle editing for
*/
void ro_gui_theme_toggle_edit(struct toolbar *toolbar) {
int height;
struct gui_window *g = NULL;
wimp_window_state state;
os_error *error;
if (!toolbar)
return;
if ((toolbar->type == THEME_BROWSER_TOOLBAR) && (toolbar->parent_handle))
g = ro_gui_window_lookup(toolbar->parent_handle);
if (toolbar->editor) {
/* todo: save options */
height = toolbar->editor->height;
ro_gui_theme_destroy_toolbar(toolbar->editor);
toolbar->editor = NULL;
ro_gui_theme_update_toolbar(toolbar->descriptor, toolbar);
switch (toolbar->type) {
case THEME_BROWSER_TOOLBAR:
if (g)
ro_gui_window_update_dimensions(g, height);
break;
default:
if (toolbar->parent_handle)
xwimp_force_redraw(toolbar->parent_handle,
0, -16384, 16384, 16384);
break;
}
} else {
/* create/initialise the toolbar editor */
switch (toolbar->type) {
case THEME_BROWSER_TOOLBAR:
toolbar->editor = ro_gui_theme_create_toolbar(toolbar->descriptor,
THEME_BROWSER_EDIT_TOOLBAR);
break;
case THEME_HOTLIST_TOOLBAR:
toolbar->editor = ro_gui_theme_create_toolbar(toolbar->descriptor,
THEME_HOTLIST_EDIT_TOOLBAR);
break;
case THEME_HISTORY_TOOLBAR:
toolbar->editor = ro_gui_theme_create_toolbar(toolbar->descriptor,
THEME_HISTORY_EDIT_TOOLBAR);
break;
default:
return;
}
if (!toolbar->editor) {
LOG(("Unable to create toolbar editor"));
return;
}
ro_gui_theme_update_toolbar(toolbar->descriptor, toolbar);
switch (toolbar->type) {
case THEME_BROWSER_TOOLBAR:
if (g)
ro_gui_window_update_dimensions(g, -toolbar->editor->height);
break;
default:
if (toolbar->parent_handle) {
state.w = toolbar->parent_handle;
error = xwimp_get_window_state(&state);
if (error) {
LOG(("xwimp_get_window_state: 0x%x: %s",
error->errnum, error->errmess));
warn_user("WimpError", error->errmess);
return;
}
ro_gui_open_window_request((wimp_open *)&state);
xwimp_force_redraw(toolbar->parent_handle,
0, -16384, 16384, 16384);
}
break;
}
ro_gui_theme_process_toolbar(toolbar, -1);
ro_gui_theme_toolbar_editor_sync(toolbar);
}
}
/**
* Synchronise a toolbar window with the associated editor.
*
* \param toolbar the toolbar to synchronise
*/
void ro_gui_theme_toolbar_editor_sync(struct toolbar *toolbar) {
struct toolbar_icon *icon;
struct toolbar_icon *icon_edit;
if ((!toolbar) || (!toolbar->editor))
return;
for (icon = toolbar->icon; icon; icon = icon->next)
if ((icon->icon_number >= 0) && (icon->width > 0))
for (icon_edit = toolbar->editor->icon; icon_edit; icon_edit = icon_edit->next)
if (icon_edit->icon_number == icon->icon_number)
ro_gui_set_icon_shaded_state(toolbar->editor->toolbar_handle,
icon_edit->icon_number, icon->display);
}
/**
* Handle a toolbar click during an editor session
*
* \param toolbar the base toolbar (ie not editor) to respond to a click for
* \param pointer the WIMP pointer details
*/
void ro_gui_theme_toolbar_editor_click(struct toolbar *toolbar, wimp_pointer *pointer) {
}
/**
* Handle the end of a drag
*
* \param drag the details for the drag end
*/
void ro_gui_theme_toolbar_editor_drag_end(wimp_dragged *drag) {
}
/** /**
* Adds a toolbar icon to the end of a toolbar * Adds a toolbar icon to the end of a toolbar
* *
@ -1570,7 +1774,7 @@ void ro_gui_theme_update_toolbar_icon(struct toolbar *toolbar, struct toolbar_ic
toolbar->descriptor->theme->sprite_area, (osspriteop_id)icon->name, toolbar->descriptor->theme->sprite_area, (osspriteop_id)icon->name,
&dimensions.x, &dimensions.y, 0, &mode); &dimensions.x, &dimensions.y, 0, &mode);
/* fallback to user area just for 'gright' */ /* fallback to user area just for 'gright' */
if ((error) && (!strcmp(icon->name, "gright"))) if ((error) && (!strcmp(icon->name, "gright")))
error = xwimpspriteop_read_sprite_info(icon->name, error = xwimpspriteop_read_sprite_info(icon->name,
&dimensions.x, &dimensions.y, 0, &mode); &dimensions.x, &dimensions.y, 0, &mode);
@ -1614,21 +1818,11 @@ void ro_gui_theme_destroy_toolbar_icon(struct toolbar_icon *icon) {
*/ */
struct toolbar_icon *ro_gui_theme_toolbar_get_icon(struct toolbar *toolbar, int x, int y) { struct toolbar_icon *ro_gui_theme_toolbar_get_icon(struct toolbar *toolbar, int x, int y) {
struct toolbar_icon *icon; struct toolbar_icon *icon;
icon = toolbar->icon;
/* FINISH ME */ for (icon = toolbar->icon; icon; icon = icon->next)
if ((icon->display) && (icon->x <= x) && (icon->y <= y) &&
(icon->x + icon->width > x) &&
(icon->y + icon->height > y))
return icon;
return NULL; return NULL;
} }
/**
* Returns whether a separator can follow the specified icon
*
* \param icon the icon to check
* \return whether a separator can follow
*/
bool ro_gui_theme_toolbar_separator_following(struct toolbar_icon *icon) {
while (icon) {
if (icon->display) return (icon->width > 0);
icon = icon->next;
}
return false;
}

View File

@ -17,7 +17,10 @@
typedef enum { typedef enum {
THEME_BROWSER_TOOLBAR, THEME_BROWSER_TOOLBAR,
THEME_HOTLIST_TOOLBAR, THEME_HOTLIST_TOOLBAR,
THEME_HISTORY_TOOLBAR THEME_HISTORY_TOOLBAR,
THEME_BROWSER_EDIT_TOOLBAR,
THEME_HOTLIST_EDIT_TOOLBAR,
THEME_HISTORY_EDIT_TOOLBAR
} toolbar_type; } toolbar_type;
struct theme_file_header { struct theme_file_header {
@ -78,7 +81,7 @@ struct toolbar {
struct toolbar_icon *suggest; /**< suggestion toolbar icon (read only) */ struct toolbar_icon *suggest; /**< suggestion toolbar icon (read only) */
struct theme_descriptor *descriptor; /**< theme descriptor (read only) */ struct theme_descriptor *descriptor; /**< theme descriptor (read only) */
toolbar_type type; /**< toolbar type (read only) */ toolbar_type type; /**< toolbar type (read only) */
bool locked; /**< toolbar is locked from editing */ struct toolbar *editor; /**< toolbar editor */
}; };
struct theme_descriptor { struct theme_descriptor {
@ -118,9 +121,17 @@ void ro_gui_theme_resize_toolbar_status(struct toolbar *toolbar);
bool ro_gui_theme_process_toolbar(struct toolbar *toolbar, int width); bool ro_gui_theme_process_toolbar(struct toolbar *toolbar, int width);
void ro_gui_theme_destroy_toolbar(struct toolbar *toolbar); void ro_gui_theme_destroy_toolbar(struct toolbar *toolbar);
struct toolbar_icon *ro_gui_theme_toolbar_get_icon(struct toolbar *toolbar, int x, int y); void ro_gui_theme_toggle_edit(struct toolbar *toolbar);
bool ro_gui_theme_toolbar_separator_following(struct toolbar_icon *icon); void ro_gui_theme_toolbar_editor_sync(struct toolbar *toolbar);
void ro_gui_theme_toolbar_editor_click(struct toolbar *toolbar, wimp_pointer *pointer);
void ro_gui_theme_toolbar_editor_drag_end(wimp_dragged *drag);
#define ro_gui_theme_toolbar_height(toolbar) toolbar->height > toolbar->max_height ? \ struct toolbar_icon *ro_gui_theme_toolbar_get_icon(struct toolbar *toolbar, int x, int y);
toolbar->max_height : toolbar->height
#define ro_gui_theme_toolbar_height(toolbar) toolbar->height + \
(toolbar->editor ? toolbar->editor->height : 0) > toolbar->max_height ? \
toolbar->max_height : toolbar->height + \
(toolbar->editor ? toolbar->editor->height : 0)
#define ro_gui_theme_toolbar_full_height(toolbar) toolbar->height + \
(toolbar->editor ? toolbar->editor->height : 0)
#endif #endif

View File

@ -830,6 +830,11 @@ void ro_gui_tree_toolbar_click(wimp_pointer* pointer, struct tree *tree) {
return; return;
} }
if ((pointer->i < 0) && (current_toolbar)) {
ro_gui_theme_toolbar_editor_click(tree->toolbar, pointer);
return;
}
switch (pointer->i) { switch (pointer->i) {
case ICON_TOOLBAR_CREATE: case ICON_TOOLBAR_CREATE:
node = tree_create_folder_node(tree->root, node = tree_create_folder_node(tree->root,
@ -1037,6 +1042,8 @@ void ro_gui_tree_show(struct tree *tree) {
/* Cancel any editing /* Cancel any editing
*/ */
if ((tree->toolbar) && (tree->toolbar->editor))
ro_gui_theme_toggle_edit(tree->toolbar);
ro_gui_tree_stop_edit(tree); ro_gui_tree_stop_edit(tree);
/* Set the default state /* Set the default state

View File

@ -726,7 +726,7 @@ void gui_window_set_scroll(struct gui_window *g, int sx, int sy)
state.xscroll = sx * 2; state.xscroll = sx * 2;
state.yscroll = -sy * 2; state.yscroll = -sy * 2;
if (g->toolbar) if (g->toolbar)
state.yscroll += g->toolbar->height; state.yscroll += ro_gui_theme_toolbar_full_height(g->toolbar);
ro_gui_window_open(g, (wimp_open *) &state); ro_gui_window_open(g, (wimp_open *) &state);
} }
@ -784,7 +784,7 @@ void gui_window_set_extent(struct gui_window *g, int width, int height)
/* account for toolbar height, if present */ /* account for toolbar height, if present */
if (g->toolbar) if (g->toolbar)
toolbar_height = g->toolbar->height; toolbar_height = ro_gui_theme_toolbar_full_height(g->toolbar);
if (width < state.visible.x1 - state.visible.x0) if (width < state.visible.x1 - state.visible.x0)
width = state.visible.x1 - state.visible.x0; width = state.visible.x1 - state.visible.x0;
@ -893,7 +893,6 @@ void ro_gui_window_update_theme(void) {
ro_gui_window_update_dimensions(g, height - ro_gui_window_update_dimensions(g, height -
ro_gui_theme_toolbar_height(g->toolbar)); ro_gui_theme_toolbar_height(g->toolbar));
} }
ro_gui_prepare_navigate(g);
} }
} }
if ((hotlist_tree) && (hotlist_tree->toolbar)) { if ((hotlist_tree) && (hotlist_tree->toolbar)) {
@ -985,7 +984,7 @@ void ro_gui_window_open(struct gui_window *g, wimp_open *open)
/* account for toolbar height, if present */ /* account for toolbar height, if present */
if (g->toolbar) if (g->toolbar)
toolbar_height = g->toolbar->height; toolbar_height = ro_gui_theme_toolbar_full_height(g->toolbar);
height -= toolbar_height; height -= toolbar_height;
/* The height should be no less than the content height /* The height should be no less than the content height
@ -1113,9 +1112,12 @@ struct gui_window *ro_gui_window_lookup(wimp_w window)
struct gui_window *ro_gui_toolbar_lookup(wimp_w window) struct gui_window *ro_gui_toolbar_lookup(wimp_w window)
{ {
struct gui_window *g; struct gui_window *g;
for (g = window_list; g; g = g->next) for (g = window_list; g; g = g->next) {
if (g->toolbar && g->toolbar->toolbar_handle == window) if ((g->toolbar) && ((g->toolbar->toolbar_handle == window) ||
((g->toolbar->editor) &&
(g->toolbar->editor->toolbar_handle == window))))
return g; return g;
}
return 0; return 0;
} }
@ -1194,6 +1196,13 @@ void ro_gui_toolbar_click(struct gui_window *g, wimp_pointer *pointer)
pointer->pos.y, g); pointer->pos.y, g);
return; return;
} }
/* Handle toolbar edits
*/
if (pointer->i < 0) {
ro_gui_theme_toolbar_editor_click(g->toolbar, pointer);
return;
}
/* Handle the buttons appropriately /* Handle the buttons appropriately
*/ */
@ -1723,7 +1732,7 @@ bool ro_gui_window_keypress(struct gui_window *g, int key, bool toolbar)
wimp_get_window_state(&state); wimp_get_window_state(&state);
y = state.visible.y1 - state.visible.y0 - 32; y = state.visible.y1 - state.visible.y0 - 32;
if (g->toolbar) if (g->toolbar)
y -= g->toolbar->height; y -= ro_gui_theme_toolbar_full_height(g->toolbar);
switch (key) { switch (key) {
case wimp_KEY_UP: case wimp_KEY_UP:
@ -1765,7 +1774,7 @@ void ro_gui_scroll_request(wimp_scroll *scroll)
x = scroll->visible.x1 - scroll->visible.x0 - 32; x = scroll->visible.x1 - scroll->visible.x0 - 32;
y = scroll->visible.y1 - scroll->visible.y0 - 32; y = scroll->visible.y1 - scroll->visible.y0 - 32;
if (g->toolbar) if (g->toolbar)
y -= g->toolbar->height; y -= ro_gui_theme_toolbar_full_height(g->toolbar);
switch (scroll->xmin) { switch (scroll->xmin) {
case wimp_SCROLL_PAGE_LEFT: case wimp_SCROLL_PAGE_LEFT: