From d21447d096a320a08b3efb2b8768fad0dcdcfd64 Mon Sep 17 00:00:00 2001 From: Vincent Sanders Date: Thu, 5 May 2016 22:28:51 +0100 Subject: move frontends into sub directory --- frontends/riscos/configure/con_theme.c | 420 +++++++++++++++++++++++++++++++++ 1 file changed, 420 insertions(+) create mode 100644 frontends/riscos/configure/con_theme.c (limited to 'frontends/riscos/configure/con_theme.c') diff --git a/frontends/riscos/configure/con_theme.c b/frontends/riscos/configure/con_theme.c new file mode 100644 index 000000000..fb0d3dfb0 --- /dev/null +++ b/frontends/riscos/configure/con_theme.c @@ -0,0 +1,420 @@ +/* + * Copyright 2006 Richard Wilson + * + * This file is part of NetSurf, http://www.netsurf-browser.org/ + * + * NetSurf is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * NetSurf 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include +#include +#include +#include +#include +#include + +#include "utils/config.h" +#include "utils/nsoption.h" +#include "utils/log.h" +#include "utils/messages.h" + +#include "riscos/gui.h" +#include "riscos/configure/configure.h" +#include "riscos/configure.h" +#include "riscos/dialog.h" +#include "riscos/menus.h" +#include "riscos/theme.h" +#include "riscos/toolbar.h" +#include "riscos/url_complete.h" +#include "riscos/wimp.h" +#include "riscos/wimp_event.h" +#include "riscos/wimputils.h" + + +#define THEME_PANE_AREA 0 +#define THEME_DEFAULT_BUTTON 2 +#define THEME_CANCEL_BUTTON 3 +#define THEME_OK_BUTTON 4 + +struct toolbar_display { + struct toolbar *toolbar; + struct theme_descriptor *descriptor; + int icon_number; + struct toolbar_display *next; +}; + +static wimp_window theme_pane_definition = { + {0, 0, 16, 16}, + 0, + 0, + wimp_TOP, + wimp_WINDOW_NEW_FORMAT | wimp_WINDOW_VSCROLL | wimp_WINDOW_AUTO_REDRAW, + wimp_COLOUR_BLACK, + wimp_COLOUR_LIGHT_GREY, + wimp_COLOUR_LIGHT_GREY, + wimp_COLOUR_VERY_LIGHT_GREY, + wimp_COLOUR_DARK_GREY, + wimp_COLOUR_MID_LIGHT_GREY, + wimp_COLOUR_CREAM, + 0, + {0, -16384, 16384, 0}, + wimp_ICON_TEXT | wimp_ICON_HCENTRED | wimp_ICON_VCENTRED, + wimp_BUTTON_CLICK << wimp_ICON_BUTTON_TYPE_SHIFT, + wimpspriteop_AREA, + 1, + 1, + {""}, + 0, + {} +}; + + +static wimp_w theme_pane; +static struct theme_descriptor *theme_list = NULL; +static struct toolbar_display *toolbars = NULL; +static char theme_radio_validation[] = "Sradiooff,radioon"; +static char theme_null_validation[] = ""; +static char theme_line_validation[] = "R2"; + +static bool ro_gui_options_theme_ok(wimp_w w); +static bool ro_gui_options_theme_click(wimp_pointer *pointer); +static void ro_gui_options_theme_load(void); +static void ro_gui_options_theme_free(void); + +bool ro_gui_options_theme_initialise(wimp_w w) +{ + wimp_window_state state; + wimp_icon_state icon_state; + os_error *error; + struct theme_descriptor *theme_choice; + struct toolbar_display *toolbar; + + /* only allow one instance for now*/ + if (theme_pane) + return false; + error = xwimp_create_window(&theme_pane_definition, &theme_pane); + if (error) { + LOG("xwimp_create_window: 0x%x: %s", error->errnum, error->errmess); + return false; + } + state.w = w; + error = xwimp_get_window_state(&state); + if (error) { + LOG("xwimp_get_window_state: 0x%x: %s", error->errnum, error->errmess); + return false; + } + icon_state.w = w; + icon_state.i = THEME_PANE_AREA; + error = xwimp_get_icon_state(&icon_state); + if (error) { + LOG("xwimp_get_icon_state: 0x%x: %s", error->errnum, error->errmess); + return false; + } + state.w = theme_pane; + state.visible.x1 = state.visible.x0 + icon_state.icon.extent.x1 - 16 - + ro_get_vscroll_width(theme_pane); + state.visible.x0 += icon_state.icon.extent.x0 + 16; + state.visible.y0 = state.visible.y1 + icon_state.icon.extent.y0 + 16; + state.visible.y1 += icon_state.icon.extent.y1 - 28; + LOG("Y0 = %i, y1 = %i", icon_state.icon.extent.y0, icon_state.icon.extent.y1); + error = xwimp_open_window_nested(PTR_WIMP_OPEN(&state), w, + 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); + return false; + } + + /* load themes */ + ro_gui_options_theme_load(); + + /* set the current selection */ + theme_choice = ro_gui_theme_find(nsoption_charp(theme)); + if (!theme_choice) + theme_choice = ro_gui_theme_find("Aletheia"); + for (toolbar = toolbars; toolbar; toolbar = toolbar->next) + ro_gui_set_icon_selected_state(theme_pane, toolbar->icon_number, + (toolbar->descriptor == theme_choice)); + ro_gui_wimp_event_memorise(theme_pane); + ro_gui_wimp_event_set_help_prefix(theme_pane, "HelpThemePConfig"); + + ro_gui_wimp_event_register_mouse_click(w, ro_gui_options_theme_click); + ro_gui_wimp_event_register_cancel(w, THEME_CANCEL_BUTTON); + ro_gui_wimp_event_register_ok(w, THEME_OK_BUTTON, + ro_gui_options_theme_ok); + ro_gui_wimp_event_set_help_prefix(w, "HelpThemeConfig"); + ro_gui_wimp_event_memorise(w); + + return true; +} + +void ro_gui_options_theme_finalise(wimp_w w) +{ + ro_gui_options_theme_free(); + if (theme_pane) { + os_error *error; + ro_gui_wimp_event_finalise(theme_pane); + error = xwimp_delete_window(theme_pane); + if (error) { + LOG("xwimp_delete_window: 0x%x: %s", error->errnum, error->errmess); + ro_warn_user("WimpError", error->errmess); + } + theme_pane = 0; + } + ro_gui_wimp_event_finalise(w); +} + +bool ro_gui_options_theme_ok(wimp_w w) +{ + struct toolbar_display *toolbar; + struct theme_descriptor *theme_new = NULL; + + /* find the current selection */ + for (toolbar = toolbars; toolbar; toolbar = toolbar->next) { + if (ro_gui_get_icon_selected_state(theme_pane, toolbar->icon_number)) { + theme_new = toolbar->descriptor; + break; + } + } + + /* set the options */ + if (theme_new) { + nsoption_set_charp(theme, strdup(theme_new->leafname)); + ro_gui_theme_apply(theme_new); + } else { + nsoption_set_charp(theme, NULL); + } + ro_gui_save_options(); + + /* store the pane status */ + ro_gui_wimp_event_memorise(theme_pane); + return true; +} + +bool ro_gui_options_theme_click(wimp_pointer *pointer) +{ + struct theme_descriptor *theme_default; + struct toolbar_display *toolbar; + + switch (pointer->i) { + case THEME_DEFAULT_BUTTON: + theme_default = ro_gui_theme_find("Aletheia"); + for (toolbar = toolbars; toolbar; toolbar = toolbar->next) + ro_gui_set_icon_selected_state(theme_pane, + toolbar->icon_number, + (toolbar->descriptor == theme_default)); + break; + case THEME_CANCEL_BUTTON: + ro_gui_wimp_event_restore(theme_pane); + break; + case THEME_OK_BUTTON: + ro_gui_wimp_event_memorise(theme_pane); + break; + } + return false; +} + +void ro_gui_options_theme_load(void) +{ + os_error *error; + os_box extent = { 0, 0, 0, 0 }; + struct theme_descriptor *descriptor; + struct toolbar_display *link; + struct toolbar_display *toolbar_display; + struct toolbar *toolbar; + wimp_icon_create new_icon; + wimp_window_state state; + int parent_width, nested_y, min_extent, base_extent; + int *radio_icons, *radio_set; + int theme_count; + + /* delete our old list and get/open a new one */ + ro_gui_options_theme_free(); + theme_list = ro_gui_theme_get_available(); + ro_gui_theme_open(theme_list, true); + + /* create toolbars for each theme */ + theme_count = 0; + descriptor = theme_list; + while (descriptor != NULL) { + /* try to create a toolbar */ + toolbar = ro_toolbar_create(descriptor, NULL, + THEME_STYLE_BROWSER_TOOLBAR, + TOOLBAR_FLAGS_DISPLAY, NULL, NULL, NULL); + if (toolbar != NULL) { + ro_toolbar_add_buttons(toolbar, brower_toolbar_buttons, + nsoption_charp(toolbar_browser)); + ro_toolbar_add_url(toolbar); + ro_toolbar_add_throbber(toolbar); + ro_toolbar_rebuild(toolbar); + toolbar_display = calloc(sizeof(struct toolbar_display), 1); + if (!toolbar_display) { + LOG("No memory for calloc()"); + ro_warn_user("NoMemory", 0); + return; + } + toolbar_display->toolbar = toolbar; + toolbar_display->descriptor = descriptor; + if (!toolbars) { + toolbars = toolbar_display; + } else { + link = toolbars; + while (link->next) link = link->next; + link->next = toolbar_display; + } + theme_count++; + } + descriptor = descriptor->next; + } + + /* nest the toolbars */ + state.w = theme_pane; + error = xwimp_get_window_state(&state); + if (error) { + LOG("xwimp_get_window_state: 0x%x: %s", error->errnum, error->errmess); + ro_warn_user("WimpError", error->errmess); + return; + } + + parent_width = state.visible.x1 - state.visible.x0; + min_extent = state.visible.y0 - state.visible.y1; + nested_y = 0; + base_extent = state.visible.y1 - state.yscroll; + extent.x1 = parent_width; + link = toolbars; + new_icon.w = theme_pane; + new_icon.icon.flags = wimp_ICON_TEXT | wimp_ICON_INDIRECTED | + wimp_ICON_VCENTRED | + (wimp_COLOUR_BLACK << wimp_ICON_FG_COLOUR_SHIFT) | + (wimp_COLOUR_VERY_LIGHT_GREY << wimp_ICON_BG_COLOUR_SHIFT); + while (link) { + /* update the toolbar */ + int item_height = 44 + 44 + 16; + if (link->next) item_height += 16; + ro_toolbar_process(link->toolbar, parent_width, false); + extent.y0 = nested_y - + ro_toolbar_height(link->toolbar) - + item_height; + if (link->next) extent.y0 -= 16; + if (extent.y0 > min_extent) extent.y0 = min_extent; + xwimp_set_extent(theme_pane, &extent); + + /* create the descriptor icons and separator line */ + new_icon.icon.extent.x0 = 8; + new_icon.icon.extent.x1 = parent_width - 8; + new_icon.icon.flags &= ~wimp_ICON_BORDER; + new_icon.icon.flags |= wimp_ICON_SPRITE; + new_icon.icon.extent.y1 = nested_y - + ro_toolbar_height(link->toolbar) - 8; + new_icon.icon.extent.y0 = nested_y - + ro_toolbar_height(link->toolbar) - 52; + new_icon.icon.data.indirected_text_and_sprite.text = + (char *)&link->descriptor->name; + new_icon.icon.data.indirected_text_and_sprite.size = + strlen(link->descriptor->name) + 1; + new_icon.icon.data.indirected_text_and_sprite.validation = + theme_radio_validation; + new_icon.icon.flags |= (wimp_BUTTON_RADIO << + wimp_ICON_BUTTON_TYPE_SHIFT); + xwimp_create_icon(&new_icon, &link->icon_number); + new_icon.icon.flags &= ~wimp_ICON_SPRITE; + new_icon.icon.extent.x0 = 52; + new_icon.icon.extent.y1 -= 44; + new_icon.icon.extent.y0 -= 44; + new_icon.icon.data.indirected_text.text = + (char *)&link->descriptor->author; + new_icon.icon.data.indirected_text.size = + strlen(link->descriptor->author) + 1; + new_icon.icon.data.indirected_text.validation = + theme_null_validation; + new_icon.icon.flags &= ~(wimp_BUTTON_RADIO << + wimp_ICON_BUTTON_TYPE_SHIFT); + xwimp_create_icon(&new_icon, 0); + if (link->next) { + new_icon.icon.flags |= wimp_ICON_BORDER; + new_icon.icon.extent.x0 = -8; + new_icon.icon.extent.x1 = parent_width + 8; + new_icon.icon.extent.y1 -= 52; + new_icon.icon.extent.y0 = new_icon.icon.extent.y1 - 8; + new_icon.icon.data.indirected_text.text = + theme_null_validation; + new_icon.icon.data.indirected_text.validation = + theme_line_validation; + new_icon.icon.data.indirected_text.size = 1; + xwimp_create_icon(&new_icon, 0); + } + + /* nest the toolbar window */ + state.w = ro_toolbar_get_window(link->toolbar); + state.yscroll = 0; + state.visible.y1 = nested_y + base_extent; + state.visible.y0 = state.visible.y1 - + ro_toolbar_height(link->toolbar) + 2; + xwimp_open_window_nested(PTR_WIMP_OPEN(&state), theme_pane, + wimp_CHILD_LINKS_PARENT_WORK_AREA + << wimp_CHILD_BS_EDGE_SHIFT | + wimp_CHILD_LINKS_PARENT_WORK_AREA + << wimp_CHILD_TS_EDGE_SHIFT); + + /* continue processing */ + nested_y -= ro_toolbar_height(link->toolbar) + + item_height; + link = link->next; + } + + /* set the icons as radios */ + radio_icons = (int *)calloc(theme_count + 1, sizeof(int)); + radio_set = radio_icons; + for (link = toolbars; link; link = link->next) + *radio_set++ = link->icon_number; + *radio_set = -1; + ro_gui_wimp_event_register_radio(theme_pane, radio_icons); + + /* update our display */ + xwimp_force_redraw(theme_pane, 0, -16384, 16384, 16384); +} + +void ro_gui_options_theme_free(void) +{ + struct toolbar_display *toolbar; + struct toolbar_display *next_toolbar; + + /* free all our toolbars */ + next_toolbar = toolbars; + while ((toolbar = next_toolbar) != NULL) { + next_toolbar = toolbar->next; + xwimp_delete_icon(theme_pane, toolbar->icon_number); + xwimp_delete_icon(theme_pane, toolbar->icon_number + 1); + if (next_toolbar) + xwimp_delete_icon(theme_pane, + toolbar->icon_number + 2); + ro_toolbar_destroy(toolbar->toolbar); + free(toolbar); + } + toolbars = NULL; + + /* close all our themes */ + if (theme_list) + ro_gui_theme_close(theme_list, true); + theme_list = NULL; +} -- cgit v1.2.3