Commit 4e6938ca authored by David Brown's avatar David Brown
Browse files

Choices 'fakepage' display added.

parent 2e86b9d4
No preview for this file type
......@@ -47,9 +47,11 @@
#include "Encoding.h"
#include "FetchPage.h"
#include "FontManage.h"
#include "History.h"
#include "Menus.h"
#include "NestWimp.h"
#include "Redraw.h"
#include "Save.h"
#include "URLutils.h"
#include "Windows.h"
......@@ -58,6 +60,9 @@
/* Locals */
char *consonant = "bcdfghijklmnopqrstuvwxyz";
char *vowel = "aeiou";
static int * subwindows = NULL;
static ObjectId current_subwindow = CDSubNone;
static ObjectId colourdbox_id = 0;
......@@ -65,6 +70,8 @@ static ObjectId colourdbox_id = 0;
static int save_ticked = -1;
static int disp_ticked = -1;
static int choices_modechanged = 0;
global_choices * new_choices = NULL;
ObjectId choices_windowid = 0;
......@@ -86,7 +93,9 @@ static int choices_display_m_button_handler(int eventcode, Toolbox
static int choices_save_m_button_handler (int eventcode, ToolboxEvent * event, IdBlock * idb, void * handle);
static int choices_display_m_click_handler (int eventcode, ToolboxEvent * event, IdBlock * idb, void * handle);
static int choices_save_m_click_handler (int eventcode, ToolboxEvent * event, IdBlock * idb, void * handle);
static int choices_option_state_handler (int eventcode, ToolboxEvent * event, IdBlock * idb, void * handle);
static int choices_redraw_fakepage_handler (int eventcode, WimpPollBlock * event, IdBlock * id_block, void * handle);
static int choices_open_choice_window (int eventcode, WimpPollBlock * event, IdBlock * id_block, void * handle);
static _kernel_oserror * choices_colour_set_component (ObjectId window, ComponentId component, int colour);
static _kernel_oserror * choices_set_save_field (ObjectId obj, ComponentId comp, int state);
static _kernel_oserror * choices_set_display_field (ObjectId obj, ComponentId comp, int state);
......@@ -117,18 +126,18 @@ static _kernel_oserror * choices_show_subwindow(ObjectId choices_window, int sub
int window_handle;
int vwidth, hheight;
if (current_subwindow != CDSubNone)
if (current_subwindow != CDSubNone && current_subwindow != subwindow)
{
/* remove the current subwindow */
RetError(toolbox_hide_object(0, subwindows[current_subwindow]));
current_subwindow = CDSubNone;
}
if (subwindow == CDSubNone || !(subwindows[subwindow]) || subwindow == current_subwindow)
if (subwindow == CDSubNone || !(subwindows[subwindow]))
{
/* Have not been asked to open a new subwindow */
current_subwindow = CDSubNone;
return NULL;
}
......@@ -229,6 +238,8 @@ int choices_to_be_shown(int eventcode, ToolboxEvent * event, IdBlock * idb, void
if (tl & (1u<<29)) Printf("choices_to_be_shown: Called\n");
#endif
if (choices_windowid) return 1;
choices_windowid = idb->self_id;
/* Allocate block for holding subwindows ObjectIds */
......@@ -290,7 +301,10 @@ int choices_to_be_shown(int eventcode, ToolboxEvent * event, IdBlock * idb, void
if (!e) e = event_register_toolbox_handler(-1, ECD_HiSaveBt, choices_save_m_button_handler, NULL);
if (!e) e = event_register_toolbox_handler(-1, ECDSaveMenuClick, choices_save_m_click_handler, NULL);
if (!e) e = event_register_toolbox_handler(-1, ECDDispMenuClick, choices_display_m_click_handler, NULL);
if (!e) e = event_register_toolbox_handler(subwindows[CDSubBrowseDefaults], OptionButton_StateChanged, choices_option_state_handler, NULL);
if (!e) e = event_register_wimp_handler(*(subwindows + CDSubColours), Wimp_ERedrawWindow, choices_redraw_fakepage_handler, NULL);
if (!e) e = event_register_wimp_handler(idb->self_id, Wimp_EOpenWindow, choices_open_choice_window, NULL);
/* Deal with errors */
if (e)
......@@ -307,6 +321,10 @@ int choices_to_be_shown(int eventcode, ToolboxEvent * event, IdBlock * idb, void
event_deregister_toolbox_handler(-1, ECD_HiSaveBt, choices_save_m_button_handler, NULL);
event_deregister_toolbox_handler(-1, ECDSaveMenuClick, choices_save_m_click_handler, NULL);
event_deregister_toolbox_handler(-1, ECDDispMenuClick, choices_display_m_click_handler, NULL);
event_deregister_toolbox_handler(subwindows[CDSubBrowseDefaults], OptionButton_StateChanged, choices_option_state_handler, NULL);
event_deregister_wimp_handler(*(subwindows + CDSubColours), Wimp_ERedrawWindow, choices_redraw_fakepage_handler, NULL);
event_deregister_wimp_handler(idb->self_id, Wimp_EOpenWindow, choices_open_choice_window, NULL);
ChkError(e);
}
......@@ -379,6 +397,12 @@ int choices_hidden(int eventcode, ToolboxEvent * event, IdBlock * idb, void * ha
event_deregister_toolbox_handler(-1, ECD_HiSaveBt, choices_save_m_button_handler, NULL);
event_deregister_toolbox_handler(-1, ECDSaveMenuClick, choices_save_m_click_handler, NULL);
event_deregister_toolbox_handler(-1, ECDDispMenuClick, choices_display_m_click_handler, NULL);
event_deregister_toolbox_handler(subwindows[CDSubBrowseDefaults], OptionButton_StateChanged, choices_option_state_handler, NULL);
event_deregister_wimp_handler(*(subwindows + CDSubColours), Wimp_ERedrawWindow, choices_redraw_fakepage_handler, NULL);
event_deregister_wimp_handler(idb->self_id, Wimp_EOpenWindow, choices_open_choice_window, NULL);
choices_windowid = 0;
return 1;
}
......@@ -536,18 +560,6 @@ static _kernel_oserror * choices_get_contents(void)
show_error_ret(make_no_memory_error(17));
}
}
e = optionbutton_get_state(0, subwindows[CDSubBrowseDefaults], CD_UnderlineLinks, &state);
if (!e) new_choices->underline_links = !!state;
e = optionbutton_get_state(0, subwindows[CDSubBrowseDefaults], CD_UseDocColours, &state);
if (!e) new_choices->use_source_cols = !!state;
e = optionbutton_get_state(0, subwindows[CDSubBrowseDefaults], CD_ShowForeground, &state);
if (!e) new_choices->show_foreground = !!state;
e = optionbutton_get_state(0, subwindows[CDSubBrowseDefaults], CD_ShowBackground, &state);
if (!e) new_choices->show_background = !!state;
}
if (subwindows[CDSubWindows])
......@@ -936,7 +948,7 @@ static int choices_colour_closed_handler(int eventcode, ToolboxEvent * event, Id
}
/*************************************************/
/* choices_colour_closed_handler() */
/* choices_colour_selected_handler() */
/* */
/* Called when the a colour is selected in the */
/* colour dialogue box. */
......@@ -962,13 +974,19 @@ static int choices_colour_selected_handler(int eventcode, ToolboxEvent * event,
break;
}
show_error_ret(choices_colour_set_component(idb->parent_id, idb->parent_component-1, cevent->colour_block[0]));
/* Don't bother with errors as colour display field might not exist */
choices_colour_set_component(idb->parent_id, idb->parent_component-1, cevent->colour_block[0]);
/* Don't bother with errors as fake page display might not exist */
button_set_flags(0, idb->parent_id, CD_FakePage, 0, 0);
return 1;
}
/*************************************************/
/* choices_colour_closed_handler() */
/* choices_colour_set_component() */
/* */
/* Sets the validation string of a button to be */
/* slabbed in and have the background colour */
......@@ -1210,6 +1228,13 @@ static _kernel_oserror * choices_set_display_field(ObjectId obj, ComponentId com
/*************************************************/
/* choices_display_m_click_handler() */
/* */
/* Called when there is a selection in the */
/* display menu. Sets the selected menu item to */
/* be ticked, unticks the previously ticked */
/* entry sets appropriate new_choices field and */
/* updates the display field of the component */
/* with component number 1 less than the menus */
/* parent. */
/*************************************************/
static int choices_display_m_click_handler(int eventcode, ToolboxEvent * event, IdBlock * idb, void * handle)
......@@ -1239,6 +1264,13 @@ static int choices_display_m_click_handler(int eventcode, ToolboxEvent * event,
/*************************************************/
/* choices_save_m_click_handler() */
/* */
/* Called when there is a selection in the save */
/* menu. Sets the selected menu item to be */
/* ticked, unticks the previously ticked entry */
/* sets appropriate new_choices field and */
/* updates the display field of the component */
/* with component number 1 less than the menus */
/* parent. */
/*************************************************/
static int choices_save_m_click_handler(int eventcode, ToolboxEvent * event, IdBlock * idb, void * handle)
......@@ -1264,3 +1296,370 @@ static int choices_save_m_click_handler(int eventcode, ToolboxEvent * event, IdB
return 1;
}
/*************************************************/
/* choices_draw_string() */
/* */
/* Writes a string on the screen using the */
/* passed font handle, it underlines the text if */
/* required. It also returns the position to */
/* paint the next string following this one. */
/* */
/* Parameters: font handle */
/* */
/* string to print */
/* */
/* xposition on screen (os coords) */
/* */
/* yposition on screen (os coords) */
/* */
/* 0 - don't underline */
/* non 0 - underline */
/* */
/* foreground colour */
/* */
/* background colour */
/* */
/* pointer to int to return x */
/* position in */
/*************************************************/
static _kernel_oserror * choices_draw_string(fm_face h,
char *string,
int xpos,
int ypos,
int underline,
int forecolour,
int backcolour,
int *newxpos)
{
int width, nochars;
fm_set_font_colour(h, forecolour, backcolour);
fm_get_string_width(h, string, 0x1000000, strlen(string), -1, &nochars, &width);
convert_to_os(width, &width);
/* The next string must be plotted straight after this string */
*newxpos = xpos + width;
fm_puts(h, xpos, ypos, string, 1, 0);
if (underline)
{
redraw_set_colour(forecolour);
bbc_move(xpos, ypos - 7);
bbc_draw(*newxpos, ypos - 7);
}
return NULL;
}
/*************************************************/
/* choices_write_crap() */
/* */
/* Writes a string of readable rubbish on the */
/* screen using the passed font handle. It also */
/* returns the position to paint the next string */
/* following this one. */
/* */
/* Parameters: font handle */
/* */
/* xposition on screen (os coords) */
/* */
/* yposition on screen (os coords) */
/* */
/* Approximate x position to stop */
/* printing at (os coords) */
/* */
/* foreground colour */
/* */
/* background colour */
/* */
/* pointer to int to return x */
/* position in */
/* */
/* Random seed for string to print */
/* (If you pass the same seed the */
/* string should be the same) */
/*************************************************/
static _kernel_oserror * choices_write_crap(fm_face h,
int xpos,
int ypos,
int maxxish,
int forecolour,
int backcolour,
int *newxpos,
int seed)
{
char ministring[5];
int chars = 0;
int spcwidth, width, nochars;
fm_set_font_colour(h, forecolour, backcolour);
srand(seed);
fm_get_string_width(h, " ", 0x1000000, 1, -1, &nochars, &width);
convert_to_os(width, &spcwidth);
xpos += spcwidth;
while(xpos < maxxish)
{
ministring[0] = consonant[rand()%sizeof(consonant)];
ministring[1] = vowel[rand()%sizeof(vowel)];
if (rand()%2)
{
ministring[2] = consonant[rand()%sizeof(consonant)];
ministring[3] = vowel[rand()%sizeof(vowel)];
ministring[4] = 0;
}
else
{
ministring[2] = 0;
}
fm_puts(h, xpos, ypos, ministring, 1, 0);
fm_get_string_width(h, ministring, 0x1000000, strlen(ministring), -1, &nochars, &width);
convert_to_os(width, &width);
xpos += width;
chars++;
if (chars > rand()%2 || xpos >= maxxish)
{
chars = 0;
xpos += spcwidth;
}
}
*newxpos = xpos;
return NULL;
}
/*************************************************/
/* choices_redraw_fakepage_handler() */
/* */
/* Redraws the fake page in the colour selection */
/* dbox. */
/*************************************************/
static int choices_redraw_fakepage_handler(int eventcode, WimpPollBlock * event, IdBlock * idb, void * handle)
{
_kernel_oserror * e = NULL;
WimpRedrawWindowBlock block;
WimpGetWindowStateBlock state;
int more, ypos, xtarget, ptsize, gadsize, xstart;
int fontheight = 0;
int gotfont = 0;
BBox icon_coords, fbox;
fm_face h = 0;
block.window_handle = event->redraw_window_request.window_handle;
state.window_handle = event->redraw_window_request.window_handle;
e = wimp_get_window_state(&state);
show_error_ret(e);
if (!e) e = gadget_get_bbox(0, idb->self_id, CD_FakePage, &icon_coords);
gadsize = icon_coords.ymax - icon_coords.ymin;
xstart = gadsize / 8;
if (e)
{
/* Gadget doesn't exist or something strange happened trying */
/* to get window state so just do a simple redraw loop to */
/* keep the wimp happy. */
ChkError(wimp_redraw_window(&block, &more));
while (more && !e) e = wimp_get_rectangle(&block, &more);
return 1;
}
coords_box_toscreen(&icon_coords, (WimpRedrawWindowBlock *) &state);
/* Start the redraw loop */
ChkError(wimp_redraw_window(&block, &more));
while (more && !e)
{
/* Clip the redraw area to only take in the gadget */
if (set_graphics_intersection(&icon_coords, &block.redraw_area))
{
/* Only claim the font if it is required */
if (!gotfont)
{
/* Find default browser font, the font manager will return system */
/* font if it is configured. */
/* Find a 1000 subpoint (big) version of default browser font to scale against */
h = fm_find_font(NULL, "serif", 1000, 1000, 0, 0);
ChkError(fm_font_box(h, &fbox));
fm_lose_font(NULL, h);
fontheight = fbox.ymax - fbox.ymin;
/* Find a version of the default browser font with a */
/* point size which will allow an appropriate number */
/* of lines in the fake page display. */
#ifdef ChoiceUseSelected
ptsize = ((gadsize * 1000 / 5) / fontheight);
#else
ptsize = ((gadsize * 1000 / 4) / fontheight);
#endif
h = fm_find_font(NULL, "serif", ptsize, ptsize, 0, 0);
ChkError(fm_font_box(h, &fbox));
fontheight = fbox.ymax - fbox.ymin;
gotfont = 1;
}
/* Fake browser drawing code is here */
/* Fill background with background colour */
redraw_set_colour(new_choices->background_colour);
ChkError(bbc_rectanglefill(icon_coords.xmin, icon_coords.ymin, icon_coords.xmax - icon_coords.xmin, icon_coords.ymax - icon_coords.ymin));
xtarget = icon_coords.xmin - 32;
ypos = icon_coords.ymax - fontheight / 3;
/* Display the top line of the fake page display */
ChkError(choices_write_crap(h, xtarget, ypos, icon_coords.xmax, new_choices->text_colour, new_choices->background_colour, &xtarget, 1));
ypos -= fontheight;
xtarget = icon_coords.xmin - 32;
/* Display the new link line of the fake page display */
ChkError(choices_write_crap(h, xtarget, ypos, icon_coords.xmin+xstart, new_choices->text_colour, new_choices->background_colour, &xtarget, 2));
ChkError(choices_draw_string(h, "new", xtarget, ypos, new_choices->underline_links, new_choices->link_colour, new_choices->background_colour, &xtarget));
ChkError(choices_write_crap(h, xtarget, ypos, icon_coords.xmax, new_choices->text_colour, new_choices->background_colour, &xtarget, 3));
ypos -= fontheight;
xtarget = icon_coords.xmin - 32;
/* Display the new followed line of the fake page display */
ChkError(choices_write_crap(h, xtarget, ypos, icon_coords.xmin+xstart, new_choices->text_colour, new_choices->background_colour, &xtarget, 4));
ChkError(choices_draw_string(h, "followed", xtarget, ypos, new_choices->underline_links, new_choices->used_colour, new_choices->background_colour, &xtarget));
ChkError(choices_write_crap(h, xtarget, ypos, icon_coords.xmax, new_choices->text_colour, new_choices->background_colour, &xtarget, 5));
ypos -= fontheight;
xtarget = icon_coords.xmin - 32;
/* Display the highlighted link line of the fake page display */
ChkError(choices_write_crap(h, xtarget, ypos, icon_coords.xmin+xstart, new_choices->text_colour, new_choices->background_colour, &xtarget, 6));
ChkError(choices_draw_string(h, "highlighted", xtarget, ypos, new_choices->underline_links, new_choices->followed_colour, new_choices->background_colour, &xtarget));
ChkError(choices_write_crap(h, xtarget, ypos, icon_coords.xmax, new_choices->text_colour, new_choices->background_colour, &xtarget, 7));
ypos -= fontheight;
xtarget = icon_coords.xmin - 32;
/* Display the selected link line of the fake page display */
#ifdef ChoiceUseSelected
ChkError(choices_write_crap(h, xtarget, ypos, icon_coords.xmin+xstart, new_choices->text_colour, new_choices->background_colour, &xtarget, 12));
ChkError(choices_draw_string(h, "selected", xtarget, ypos, new_choices->underline_links, new_choices->selected_colour, new_choices->background_colour, &xtarget));
ChkError(choices_write_crap(h, xtarget, ypos, icon_coords.xmax, new_choices->text_colour, new_choices->background_colour, &xtarget, 9));
ypos -= fontheight;
xtarget = icon_coords.xmin - 32;
#endif
/* Display the bottom line of the fake page display */
ChkError(choices_write_crap(h, xtarget, ypos, icon_coords.xmax, new_choices->text_colour, new_choices->background_colour, &xtarget, 10));
}
restore_graphics_intersection(&block.redraw_area);
/* Get the next redraw rectangle */
if (!e) e = wimp_get_rectangle(&block, &more);
}
if (gotfont) fm_lose_font(NULL, h);
return 1;
}
/*************************************************/
/* choices_option_state_handler() */
/* */
/* Called when an option button has its state */
/* changed by being clicked on. Sets or unsets */
/* the relevant flag in new_choices and causes */
/* redraws where necessary. */
/*************************************************/
static int choices_option_state_handler(int eventcode, ToolboxEvent * event, IdBlock * idb, void * handle)
{
int state;
ChkError(optionbutton_get_state(0, idb->self_id, idb->self_component, &state));
switch(idb->self_component)
{
case CD_UnderlineLinks:
{
new_choices->underline_links = !!state;
/* Don't bother with errors as fake page display might not exist */
if (subwindows[CDSubColours])
{
button_set_flags(0, subwindows[CDSubColours], CD_FakePage, 0, 0);
}
break;
}
case CD_UseDocColours: new_choices->use_source_cols = !!state; break;
case CD_ShowForeground: new_choices->show_foreground = !!state; break;
case CD_ShowBackground: new_choices->show_background = !!state; break;
}
return 1;
}
/*************************************************/
/* choices_mode_change() */
/* */
/* Called on every mode change event. Records */
/* that a mode change has taken place for use */
/* with the choices_open_choice_window function. */
/*************************************************/
_kernel_oserror * choices_mode_change(void)
{
choices_modechanged = 1;
return NULL;
}
/*************************************************/
/* choices_open_choice_window() */
/* */
/* Called whenever the choices window needs to */
/* be moved and specifically on mode changes so */
/* the current sub window can be positioned */
/* correctly dealing with rounding errors */
/* between modes of different aspect ratio. */
/*************************************************/
static int choices_open_choice_window(int eventcode, WimpPollBlock * event, IdBlock * idb, void * handle)
{
toolbox_show_object(0, idb->self_id, Toolbox_ShowObject_FullSpec, &(event->open_window_request.visible_area), 0, -1);
if (choices_modechanged)
{
choices_show_subwindow(idb->self_id, current_subwindow);
choices_modechanged = 0;
}
return 1;
}
......@@ -51,6 +51,7 @@
#include "Browser.h"
#include "ChoiceDefs.h"
#include "Choices.h"
#include "FetchPage.h"
#include "Filetypes.h"
#include "FontManage.h"
......@@ -242,6 +243,7 @@ int handle_messages(WimpMessage * m, void * handle)
}
ChkError(windows_initialise_tool_sizes());
ChkError(choices_mode_change());
}
break;
......
......@@ -23,6 +23,11 @@
/* History: 23-Sep-97: Created. */
/***************************************************/
/* Define this if you want to display the Selected colour */
/* in the faked page. */
#define ChoiceUseSelected
/* Choices main dialogue component IDs */
#define CDSet 0x2600
......@@ -113,9 +118,14 @@
#define CD_FolwColourBt 0x2699
#define CD_SlctColour 0x269a
#define CD_SlctColourBt 0x269b
#define CD_FakePage 0x269c
/* In fonts subwindow */
#define CD_Fontsbits 0x26b0
/* In hotlist subwindow */
#define CD_HlSaveDisp 0x26d0
#define CD_HlSaveBt 0x26d1
#define CD_HlDispDisp 0x26d2
......@@ -123,6 +133,8 @@
#define CD_HlAutoOpen 0x26d4
#define CD_HlAutoScroll 0x26d5
/* In history subwindow */
#define CD_HiSaveDisp 0x26f0
#define CD_HiSaveBt 0x26f1
#define CD_HiDispDisp 0x26f2
......@@ -147,3 +159,4 @@ extern ObjectId choices_windowid;
int choices_to_be_shown (int eventcode, ToolboxEvent * event, IdBlock * idb, void * handle);
int choices_hidden (int eventcode, ToolboxEvent * event, IdBlock * idb, void * handle);
_kernel_oserror * choices_set_encoding_field (void);
_kernel_oserror * choices_mode_change (void);
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment