aboutsummaryrefslogtreecommitdiff
path: root/src/ui.cc
diff options
context:
space:
mode:
authorjcid <devnull@localhost>2007-10-07 00:36:34 +0200
committerjcid <devnull@localhost>2007-10-07 00:36:34 +0200
commit93715c46a99c96d6c866968312691ec9ab0f6a03 (patch)
tree573f19ec6aa740844f53a7c0eb7114f04096bf64 /src/ui.cc
Initial revision
Diffstat (limited to 'src/ui.cc')
-rw-r--r--src/ui.cc912
1 files changed, 912 insertions, 0 deletions
diff --git a/src/ui.cc b/src/ui.cc
new file mode 100644
index 00000000..54523b88
--- /dev/null
+++ b/src/ui.cc
@@ -0,0 +1,912 @@
+/*
+ * File: ui.cc
+ *
+ * Copyright (C) 2005 Jorge Arellano Cid <jcid@dillo.org>
+ *
+ * This program 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; either version 3 of the License, or
+ * (at your option) any later version.
+ */
+
+// UI for Dillo
+
+#include <stdlib.h>
+#include <stdio.h>
+
+#include <fltk/Window.h>
+#include <fltk/Widget.h>
+#include <fltk/Button.h>
+#include <fltk/HighlightButton.h>
+#include <fltk/Input.h>
+#include <fltk/Output.h>
+#include <fltk/run.h>
+#include <fltk/BarGroup.h>
+#include <fltk/PackedGroup.h>
+#include <fltk/xpmImage.h>
+#include <fltk/MultiImage.h>
+#include <fltk/events.h> // for mouse buttons
+#include <fltk/Box.h>
+#include <fltk/InvisibleBox.h>
+#include <fltk/PopupMenu.h>
+#include <fltk/Item.h>
+#include <fltk/Divider.h>
+
+#include "ui.hh"
+#include "msg.h"
+
+using namespace fltk;
+
+
+// Include image data
+#include "pixmaps.h"
+
+#include "uicmd.hh"
+
+/*
+ * Local sub class
+ * (Used to avoid certain shortcuts in the location bar)
+ */
+
+class NewInput : public Input {
+public:
+ NewInput (int x, int y, int w, int h, const char* l=0) :
+ Input(x,y,w,h,l) {};
+ int handle(int e);
+};
+
+/*
+ * Disable: UpKey, DownKey, PageUpKey, PageDownKey and CTRL+{o,HomeKey,EndKey}
+ */
+int NewInput::handle(int e)
+{
+ int k = event_key();
+ bool ctrl = event_state(CTRL);
+
+ _MSG("NewInput::handle event=%d", e);
+ if (ctrl && (k == 'o' || k == HomeKey || k == EndKey))
+ return 0;
+ if ((e == KEY || e == KEYUP) &&
+ k == UpKey || k == DownKey || k == PageUpKey || k == PageDownKey) {
+ _MSG(" {Up|Down|PgUp|PgDn} ret = 1\n");
+ // todo: one way to handle this is to send(SHORTCUT) to the viewport
+ // and return 1 here. A cleaner approach may be to ignore the event and
+ // only allow the location and render area to take focus.
+ //
+ // Currently, zero is returned, so the parent gets the event and moves
+ // focus to a button widget that's not interested in these keys;
+ // once this new widget is focused, Up and Down start to work.
+ return 0;
+
+ //this->window()->send(SHORTCUT);
+ //this->window()->send(e);
+ //return 1;
+ }
+ _MSG("\n");
+
+ return Input::handle(e);
+}
+
+//----------------------------------------------------------------------------
+
+/*
+ * Used to handle "paste" within the toolbar's Clear button.
+ */
+class NewHighlightButton : public HighlightButton {
+public:
+ NewHighlightButton(int x, int y, int w, int h, const char *l=0) :
+ HighlightButton(x,y,w,h,l) {};
+ int handle(int e);
+};
+
+int NewHighlightButton::handle(int e)
+{
+ if (e == PASTE) {
+ const char* t = event_text();
+ if (t && *t) {
+ a_UIcmd_set_location_text(this->window()->user_data(), t);
+ a_UIcmd_open_urlstr(this->window()->user_data(), t);
+ return 1;
+ }
+ }
+ return HighlightButton::handle(e);
+}
+
+//
+// Toolbar buttons -----------------------------------------------------------
+//
+//static const char *button_names[] = {
+// "Back", "Forward", "Home", "Reload", "Save", "Stop", "Bookmarks",
+// "Clear", "Search"
+//};
+
+//
+// Global event handler function ---------------------------------------------
+//
+int global_event_handler(int e, Window *win)
+{
+ int ret = 0;
+
+ if (e == SHORTCUT) {
+ if (event_state(CTRL)) {
+ if (event_key() == 'l') {
+ a_UIcmd_open_url_dialog(win->user_data());
+ ret = 1;
+ } else if (event_key() == 'n') {
+ a_UIcmd_browser_window_new(win->w(), win->h());
+ ret = 1;
+ } else if (event_key() == 'o') {
+ a_UIcmd_open_file(win->user_data());
+ ret = 1;
+ } else if (event_key() == 'q') {
+ a_UIcmd_close_bw(win->user_data());
+ ret = 1;
+ } else if (event_key() == 's') {
+ a_UIcmd_search_dialog(win->user_data());
+ ret = 1;
+ }
+ }
+
+ if (event_state(ALT) && event_key() == 'q') {
+ a_UIcmd_close_all_bw();
+ }
+ }
+ return ret;
+}
+
+//
+// Callback functions --------------------------------------------------------
+//
+
+/*
+ * Callback handler for the close window event.
+ */
+void close_window_cb(Widget *wid, void *data)
+{
+ a_UIcmd_close_bw(data);
+}
+
+/*
+ * Callback for the search button.
+ */
+static void search_cb(Widget *wid, void *data)
+{
+ int k = event_key();
+ if (k && k <= 7)
+ MSG("[Search], mouse button %d was pressed\n", k);
+
+ if (k == 1) {
+ a_UIcmd_search_dialog(wid->window()->user_data());
+ } else if (k == 2) {
+ ((UI*)data)->color_change_cb_i();
+ } else if (k == 3) {
+ ((UI*)data)->panel_cb_i();
+ }
+}
+
+/*
+ * Callback for the location's clear-button.
+ */
+void clear_cb(Widget *w, void *data)
+{
+ UI *ui = (UI*)data;
+
+ int k = event_key();
+ if (k && k <= 7)
+ MSG("[Clear], mouse button %d was pressed\n", k);
+ if (k == 1) {
+ ui->set_location("");
+ ui->focus_location();
+ } if (k == 2) {
+ ui->paste_url();
+ }
+}
+
+/*
+ * Change the color of the location bar.
+ *
+static void color_change_cb(Widget *wid, void *data)
+{
+ ((UI*)data)->color_change_cb_i();
+}
+ */
+
+
+/*
+ * Send the browser to the new URL in the location.
+ */
+void location_cb(Widget *wid, void *data)
+{
+ Input *i = (Input*)wid;
+
+ /* This test is necessary because WHEN_ENTER_KEY also includes
+ * other events we're not interested in */
+ if (event_key() == ReturnKey) {
+ a_UIcmd_open_urlstr(i->window()->user_data(), i->value());
+ }
+}
+
+
+/*
+ * Callback handler for button press on the panel
+ */
+void b1_cb(Widget *wid, void *cb_data)
+{
+ int bn = (int)cb_data;
+ int k = event_key();
+ if (k && k <= 7) {
+ _MSG("[%s], mouse button %d was pressed\n", button_names[bn], k);
+ MSG("mouse button %d was pressed\n", k);
+ }
+ switch (bn) {
+ case UI_BACK:
+ if (k == 1) {
+ a_UIcmd_back(wid->window()->user_data());
+ } else if (k == 3) {
+ a_UIcmd_back_popup(wid->window()->user_data());
+ }
+ break;
+ case UI_FORW:
+ if (k == 1) {
+ a_UIcmd_forw(wid->window()->user_data());
+ } else if (k == 3) {
+ a_UIcmd_forw_popup(wid->window()->user_data());
+ }
+ break;
+ case UI_HOME:
+ if (k == 1) {
+ a_UIcmd_home(wid->window()->user_data());
+ }
+ break;
+ case UI_RELOAD:
+ if (k == 1) {
+ a_UIcmd_reload(wid->window()->user_data());
+ }
+ break;
+ case UI_SAVE:
+ if (k == 1) {
+ a_UIcmd_save(wid->window()->user_data());
+ }
+ break;
+ case UI_STOP:
+ if (k == 1) {
+ a_UIcmd_stop(wid->window()->user_data());
+ }
+ break;
+ case UI_BOOK:
+ if (k == 1) {
+ a_UIcmd_book(wid->window()->user_data());
+ }
+ break;
+ default:
+ break;
+ }
+}
+
+/*
+ * Callback handler for fullscreen button press
+ */
+void fullscreen_cb(Widget *wid, void *data)
+{
+ ((UI*)data)->fullscreen_cb_i();
+}
+
+/*
+ * Callback for the bug meter button.
+ */
+void bugmeter_cb(Widget *w, void *data)
+{
+ int k = event_key();
+ if (k && k <= 7)
+ MSG("[BugMeter], mouse button %d was pressed\n", k);
+ if (k == 1) {
+ a_UIcmd_view_page_bugs(((UI*)data)->user_data());
+ } else if (k == 3) {
+ a_UIcmd_bugmeter_popup(((UI*)data)->user_data());
+ }
+}
+
+/*
+ * File menu item callback.
+ */
+void menu_cb(Widget* w, void*)
+{
+ Menu* menu = (Menu*)w;
+ Widget* item = menu->get_item();
+ MSG("Callback for %s, item is %s\n",
+ menu->label() ? menu->label() : "menu bar",
+ item ? item->label() ? item->label() : "unnamed" : "none");
+ //if (item) item->do_callback();
+ menu->value(-1);
+}
+
+//////////////////////////////////////////////////////////////////////////////
+// UI class methods
+//
+
+//----------------------------
+// Panel construction methods
+//----------------------------
+
+/*
+ * Create the archetipic browser buttons
+ */
+PackedGroup *UI::make_toolbar(int tw, int th)
+{
+ HighlightButton *b;
+ MultiImage *multi;
+ PackedGroup *p1=new PackedGroup(0,0,tw,th);
+ p1->begin();
+ Back = b = new HighlightButton(xpos, 0, bw, bh, (lbl) ? "Back" : 0);
+ ImgLeftIns = new xpmImage(Small_Icons ? left_si_xpm : left_i_xpm);
+ ImgLeftSens = new xpmImage(Small_Icons ? left_s_xpm : left_xpm);
+ multi = new MultiImage(*ImgLeftSens, INACTIVE_R, *ImgLeftIns);
+ b->image(multi);
+ b->tooltip("Previous page");
+ b->callback(b1_cb, (void *)UI_BACK);
+ HighlightButton::default_style->highlight_color(CuteColor);
+
+ Forw = b = new HighlightButton(xpos, 0, bw, bh, (lbl) ? "Forw" : 0);
+ ImgRightIns = new xpmImage(Small_Icons ? right_si_xpm : right_i_xpm);
+ ImgRightSens = new xpmImage(Small_Icons ? right_s_xpm : right_xpm);
+ multi = new MultiImage(*ImgRightSens, INACTIVE_R, *ImgRightIns);
+ b->image(multi);
+ b->tooltip("Next page");
+ b->callback(b1_cb, (void *)UI_FORW);
+
+ Home = b = new HighlightButton(xpos, 0, bw, bh, (lbl) ? "Home" : 0);
+ b->image(new xpmImage(Small_Icons ? home_s_xpm : home_xpm));
+ b->tooltip("Go to the Home page");
+ b->callback(b1_cb, (void *)UI_HOME);
+
+ Reload = b = new HighlightButton(xpos, 0, bw, bh, (lbl) ? "Reload" : 0);
+ b->image(new xpmImage(Small_Icons ? reload_s_xpm : reload_xpm));
+ b->tooltip("Reload");
+ b->callback(b1_cb, (void *)UI_RELOAD);
+
+ Save = b = new HighlightButton(xpos, 0, bw, bh, (lbl) ? "Save" : 0);
+ b->image(new xpmImage(Small_Icons ? save_s_xpm : save_xpm));
+ b->tooltip("Save this page");
+ b->callback(b1_cb, (void *)UI_SAVE);
+
+ Stop = b = new HighlightButton(xpos, 0, bw, bh, (lbl) ? "Stop" : 0);
+ ImgStopIns = new xpmImage(Small_Icons ? stop_si_xpm : stop_i_xpm);
+ ImgStopSens = new xpmImage(Small_Icons ? stop_s_xpm : stop_xpm);
+ multi = new MultiImage(*ImgStopSens, INACTIVE_R, *ImgStopIns);
+ b->image(multi);
+ b->tooltip("Stop loading");
+ b->callback(b1_cb, (void *)UI_STOP);
+
+ Bookmarks = b = new HighlightButton(xpos, 0, bw, bh, (lbl) ? "Book" : 0);
+ b->image(new xpmImage(Small_Icons ? bm_s_xpm : bm_xpm));
+ b->tooltip("View bookmarks");
+ b->callback(b1_cb, (void *)UI_BOOK);
+
+ p1->type(PackedGroup::ALL_CHILDREN_VERTICAL);
+ p1->end();
+
+ return p1;
+}
+
+/*
+ * Create the location box (Clear/Input/Search)
+ */
+PackedGroup *UI::make_location()
+{
+ Button *b;
+ PackedGroup *pg = new PackedGroup(0,0,0,0);
+ pg->begin();
+ Clear = b = new NewHighlightButton(2,2,16,22,0);
+ b->image(new xpmImage(new_s_xpm));
+ b->tooltip("Clear the URL box.\nMiddle-click to paste a URL.");
+ //b->callback(b1_cb, (void *)UI_CLEAR);
+ b->callback(clear_cb, (void *)this);
+
+ Input *i = Location = new NewInput(0,0,0,0,0);
+ i->tooltip("Location");
+ i->color(CuteColor);
+ i->when(WHEN_ENTER_KEY);
+ i->callback(location_cb, this);
+
+ Search = b = new HighlightButton(0,0,16,22,0);
+ b->image(new xpmImage(search_xpm));
+ b->tooltip("Search the Web");
+ //b->callback(b1_cb, (void *)UI_SEARCH);
+ b->callback(search_cb, (void *)this);
+
+ pg->type(PackedGroup::ALL_CHILDREN_VERTICAL);
+ pg->resizable(i);
+ pg->end();
+
+ return pg;
+}
+
+/*
+ * Create the progress bars
+ */
+PackedGroup *UI::make_progress_bars(int wide, int thin_up)
+{
+ PackedGroup *pg = new PackedGroup(0,0,0,0);
+ pg->begin();
+ // Images
+ IProg = new InvisibleBox(0,0,pr_w,0,
+ wide ? "Images\n0 of 0" : "0 of 0");
+ IProg->box(thin_up ? THIN_UP_BOX : EMBOSSED_BOX);
+ IProg->labelcolor(GRAY10);
+ // Page
+ PProg = new InvisibleBox(0,0,pr_w,0,
+ wide ? "Page\n0.0KB" : "0.0KB");
+ PProg->box(thin_up ? THIN_UP_BOX : EMBOSSED_BOX);
+ PProg->labelcolor(GRAY10);
+
+ pg->type(PackedGroup::ALL_CHILDREN_VERTICAL);
+ pg->end();
+
+ return pg;
+}
+
+/*
+ * Create the "File" menu
+ */
+Group *UI::make_menu(int tiny)
+{
+ Item *i;
+
+ PopupMenu *pm = new PopupMenu(2,2,30,fh-4, tiny ? "&F" : "&File");
+ pm->callback(menu_cb);
+ pm->begin();
+ i = new Item("&New Browser");
+ i->shortcut(CTRL+'n');
+ i = new Item("&Open File...");
+ i->shortcut(CTRL+'o');
+ i = new Item("Open UR&L...");
+ i->shortcut(CTRL+'l');
+ i = new Item("Close Window");
+ i->shortcut(CTRL+'q');
+ new Divider();
+ i = new Item("Exit Dillo");
+ i->shortcut(ALT+'q');
+
+ pm->end();
+
+ return pm;
+}
+
+/*
+ * Create the control panel
+ */
+Group *UI::make_panel(int ww)
+{
+ Widget *w;
+ Group *g1, *g2, *g3;
+ PackedGroup *pg;
+
+ if (PanelSize > P_large) {
+ PanelSize = P_tiny;
+ Small_Icons = !Small_Icons;
+ }
+
+ if (PanelSize == P_tiny) {
+ if (Small_Icons)
+ xpos = 0, bw = 22, bh = 22, fh = 0, lh = 22, lbl = 0, pr_w = 45;
+ else
+ xpos = 0, bw = 28, bh = 28, fh = 0, lh = 28, lbl = 0, pr_w = 45;
+ } else if (PanelSize == P_small) {
+ if (Small_Icons)
+ xpos = 0, bw = 20, bh = 20, fh = 0, lh = 20, lbl = 0, pr_w = 45;
+ else
+ xpos = 0, bw = 28, bh = 28, fh = 0, lh = 28, lbl = 0, pr_w = 45;
+ } else if (PanelSize == P_medium) {
+ if (Small_Icons)
+ xpos = 0, bw = 42, bh = 36, fh = 0, lh = 22, lbl = 1, pr_w = 60;
+ else
+ xpos = 0, bw = 45, bh = 45, fh = 0, lh = 28, lbl = 1, pr_w = 60;
+ } else { // P_large
+ if (Small_Icons)
+ xpos = 0, bw = 42, bh = 36, fh = 22, lh = 22, lbl = 1, pr_w = 60;
+ else
+ xpos = 0, bw = 45, bh = 45, fh = 28, lh = 28, lbl = 1, pr_w = 60;
+ }
+
+ if (PanelSize == P_tiny) {
+ g1 = new Group(0,0,ww,bh);
+ g1->begin();
+ // Toolbar
+ pg = make_toolbar(ww,bh);
+ pg->box(EMBOSSED_BOX);
+ //pg->box(BORDER_FRAME);
+ w = make_location();
+ pg->add(w);
+ pg->resizable(w);
+ w = make_progress_bars(0,1);
+ pg->add(w);
+
+ g1->resizable(pg);
+ g1->end();
+
+ } else {
+ g1 = new Group(0,0,ww,fh+lh+bh);
+ g1->begin();
+ // File menu
+ if (PanelSize == P_large) {
+ g2 = new Group(0,0,ww,fh);
+ g2->begin();
+ make_menu(0);
+ g2->box(EMBOSSED_BOX);
+ g2->end();
+ }
+
+ // Location
+ g2 = new Group(0,fh,ww,lh);
+ g2->begin();
+ pg = make_location();
+ pg->resize(ww,lh);
+ g2->resizable(pg);
+ g2->end();
+
+ // Toolbar
+ g3 = new Group(0,fh+lh,ww,bh);
+ g3->begin();
+ pg = make_toolbar(ww,bh);
+ //w = new InvisibleBox(0,0,0,0,"i n v i s i b l e");
+ w = new InvisibleBox(0,0,0,0,0);
+ pg->add(w);
+ pg->resizable(w);
+
+ if (PanelSize == P_small) {
+ w = make_progress_bars(0,0);
+ } else {
+ w = make_progress_bars(1,0);
+ }
+ pg->add(w);
+
+ g3->resizable(pg); // Better than 'w3' and it also works
+ pg->box(BORDER_FRAME);
+ //g3->box(EMBOSSED_BOX);
+ g3->end();
+
+ g1->resizable(g3);
+ g1->end();
+ }
+
+ return g1;
+}
+
+/*
+ * User Interface constructor
+ */
+UI::UI(int win_w, int win_h, const char* label) :
+ Window(win_w, win_h, label)
+{
+ int s_h = 20;
+ resizable(this);
+ begin();
+ TopGroup = this;
+
+ // Set handler for the close window event
+ // (the argument is set later via user_data())
+ TopGroup->callback(close_window_cb);
+
+ // Set some default values
+ //PanelSize = P_tiny, CuteColor = 26, Small_Icons = 0;
+ PanelSize = P_medium, CuteColor = 206, Small_Icons = 0;
+
+ // Control panel
+ Panel = make_panel(win_w);
+
+ // Render area
+ Main = new Widget(0,Panel->h(),win_w,win_h-Panel->h()-s_h,"Welcome...");
+ Main->box(FLAT_BOX);
+ Main->color(GRAY15);
+ Main->labelfont(HELVETICA_BOLD_ITALIC);
+ Main->labelsize(36);
+ Main->labeltype(SHADOW_LABEL);
+ Main->labelcolor(WHITE);
+ TopGroup->resizable(Main);
+ MainIdx = TopGroup->find(Main);
+
+ // Status Panel
+ StatusPanel = new Group(0, win_h-s_h, win_w, s_h, 0);
+ StatusPanel->begin();
+ // Status box
+ int bm_w = 16;
+ Status = new Output(0, 0, win_w-bm_w, s_h, 0);
+ Status->value("");
+ //Status->box(UP_BOX);
+ Status->box(THIN_DOWN_BOX);
+ Status->clear_click_to_focus();
+ Status->clear_tab_to_focus();
+ //Status->throw_focus();
+
+ // Bug Meter
+ BugMeter = new HighlightButton(win_w-bm_w,0,bm_w,s_h,0);
+ ImgMeterOK = new xpmImage(mini_ok_xpm);
+ ImgMeterBug = new xpmImage(mini_bug_xpm);
+ BugMeter->image(ImgMeterOK);
+ BugMeter->box(THIN_DOWN_BOX);
+ BugMeter->align(ALIGN_INSIDE|ALIGN_CLIP|ALIGN_LEFT);
+ BugMeter->tooltip("Show HTML bugs\n(right-click for menu)");
+ BugMeter->callback(bugmeter_cb, (void *)this);
+
+ StatusPanel->resizable(Status);
+ StatusPanel->end();
+
+ end();
+
+ // Make the full screen button (to be attached to the viewport later)
+ // TODO: attach to the viewport
+ FullScreen = new HighlightButton(0,0,15,15);
+ ImgFullScreenOn = new xpmImage(full_screen_on_xpm);
+ ImgFullScreenOff = new xpmImage(full_screen_off_xpm);
+ FullScreen->image(ImgFullScreenOn);
+ FullScreen->tooltip("Hide Controls");
+ FullScreen->callback(fullscreen_cb, (void *)this);
+
+ add_event_handler(global_event_handler);
+
+ //show();
+}
+
+/*
+ * FLTK event handler for this window.
+ */
+int UI::handle(int event)
+{
+ if (event == KEY || event == KEYUP) {
+ _MSG ("UI::handle %s key=%d\n",
+ event == KEY ? "KEY" : "KEYUP", event_key());
+ return 0;
+ }
+ return Window::handle(event);
+}
+
+
+//----------------------------
+// API for the User Interface
+//----------------------------
+
+/*
+ * Get the text from the location input-box.
+ */
+const char *UI::get_location()
+{
+ return Location->value();
+}
+
+/*
+ * Set a new URL in the location input-box.
+ */
+void UI::set_location(const char *str)
+{
+ Location->static_value("");
+ Location->insert(str);
+}
+
+/*
+ * Focus location entry.
+ */
+void UI::focus_location()
+{
+ Location->take_focus();
+}
+
+/*
+ * Set a new message in the status bar.
+ */
+void UI::set_status(const char *str)
+{
+ Status->value(str);
+}
+
+/*
+ * Set the page progress text
+ * cmd: 0 Deactivate, 1 Update, 2 Clear
+ */
+void UI::set_page_prog(size_t nbytes, int cmd)
+{
+ char str[32];
+
+ if (cmd == 0) {
+ PProg->deactivate();
+ } else {
+ PProg->activate();
+ if (cmd == 1) {
+ snprintf(str, 32, "%s%.1f KB",
+ (PanelSize == 0) ? "" : "Page\n", nbytes/1024.0);
+ } else if (cmd == 2) {
+ str[0] = '\0';
+ }
+ PProg->copy_label(str);
+ PProg->redraw_label();
+ }
+}
+
+/*
+ * Set the image progress text
+ * cmd: 0 Deactivate, 1 Update, 2 Clear
+ */
+void UI::set_img_prog(int n_img, int t_img, int cmd)
+{
+ char str[32];
+
+ if (cmd == 0) {
+ IProg->deactivate();
+ } else {
+ IProg->activate();
+ if (cmd == 1) {
+ snprintf(str, 32, "%s%d of %d",
+ (PanelSize == 0) ? "" : "Images\n", n_img, t_img);
+ } else if (cmd == 2) {
+ str[0] = '\0';
+ }
+ IProg->copy_label(str);
+ IProg->redraw_label();
+ }
+}
+
+/*
+ * Set the bug meter progress text
+ */
+void UI::set_bug_prog(int n_bug)
+{
+ char str[32];
+ int new_w = 16;
+
+ if (n_bug == 0) {
+ BugMeter->image(ImgMeterOK);
+ BugMeter->label("");
+ } else if (n_bug >= 1) {
+ if (n_bug == 1)
+ BugMeter->image(ImgMeterBug);
+ snprintf(str, 32, "%d", n_bug);
+ BugMeter->copy_label(str);
+ BugMeter->redraw_label();
+ new_w = strlen(str)*8 + 20;
+ }
+ Status->resize(0,0,StatusPanel->w()-new_w,Status->h());
+ BugMeter->resize(StatusPanel->w()-new_w, 0, new_w, BugMeter->h());
+ StatusPanel->init_sizes();
+}
+
+/*
+ * Customize the UI's panel (show/hide buttons)
+ */
+void UI::customize(int flags)
+{
+ Save->hide();
+}
+
+/*
+ * On-the-fly panel style change
+ */
+void UI::panel_cb_i()
+{
+ Group *NewPanel;
+
+ // Create a new Panel
+ ++PanelSize;
+ NewPanel = make_panel(TopGroup->w());
+ TopGroup->replace(*Panel, *NewPanel);
+ delete(Panel);
+ Panel = NewPanel;
+ // Scale the viewport
+ int p_h = Panel->h();
+ Main->resize(0, p_h, TopGroup->w(), TopGroup->h() - p_h - Status->h());
+ TopGroup->init_sizes();
+
+ Location->take_focus();
+}
+
+/*
+ * On-the-fly color style change
+ */
+void UI::color_change_cb_i()
+{
+ static int ncolor = 0, cols[] = {7,17,26,51,140,156,205,206,215,-1};
+
+ ncolor = (cols[ncolor+1] < 0) ? 0 : ncolor + 1;
+ CuteColor = cols[ncolor];
+ MSG("Location color %d\n", CuteColor);
+ Location->color(CuteColor);
+ Location->redraw();
+ HighlightButton::default_style->highlight_color(CuteColor);
+}
+
+/*
+ * Toggle the Control Panel out of the way
+ */
+void UI::fullscreen_cb_i()
+{
+#if 0
+ // Works, but for unknown reasons it resizes hidden widgets on "Maximize"
+ if (Panel->visible_r()) {
+ Panel->hide();
+ Status->hide();
+ // Scale the viewport
+ Main->resize(0, 0, TopGroup->w(), TopGroup->h());
+ TopGroup->init_sizes();
+ } else {
+ // Scale the viewport
+ int p_h = Panel->h();
+ Main->resize(0, p_h, TopGroup->w(), TopGroup->h() - p_h - Status->h());
+ Panel->show();
+ Status->show();
+ TopGroup->init_sizes();
+ }
+#else
+ if (Panel->w() != 0) {
+ Panel_h = Panel->h();
+ Status_h = Status->h();
+ Panel->resize(0, 0);
+ StatusPanel->resize(0, 0);
+ // Scale the viewport
+ Main->resize(0, 0, TopGroup->w(), TopGroup->h());
+ TopGroup->init_sizes();
+ } else {
+ Panel->resize(TopGroup->w(), Panel_h);
+ Main->resize(0,Panel_h,TopGroup->w(),TopGroup->h()-Panel_h-Status_h);
+ StatusPanel->resize(0,TopGroup->h()-Status_h, TopGroup->w(), Status_h);
+ TopGroup->init_sizes();
+ }
+#endif
+}
+
+/*
+ * Set 'nw' as the main render area widget
+ */
+void UI::set_render_layout(Widget &nw)
+{
+ // BUG: replace() is not working as it should.
+ // In our case, replacing the rendering area leaves the vertical
+ // scrollbar without events.
+ //
+ // We'll use a workaround in a_UIcmd_browser_window_new() instead.
+
+ TopGroup->replace(MainIdx, nw);
+ delete(Main);
+ Main = &nw;
+ //TopGroup->box(DOWN_BOX);
+ //TopGroup->box(BORDER_FRAME);
+ TopGroup->resizable(TopGroup->child(MainIdx));
+}
+
+/*
+ * Set the window title
+ */
+void UI::set_page_title(const char *label)
+{
+ char title[128];
+
+ snprintf(title, 128, "Dillo: %s", label);
+ this->copy_label(title);
+ this->redraw_label();
+}
+
+/*
+ * Set button sensitivity (Back/Forw/Stop)
+ */
+void UI::button_set_sens(UIButton btn, int sens)
+{
+ switch (btn) {
+ case UI_BACK:
+ (sens) ? Back->activate() : Back->deactivate();
+ break;
+ case UI_FORW:
+ (sens) ? Forw->activate() : Forw->deactivate();
+ break;
+ case UI_STOP:
+ (sens) ? Stop->activate() : Stop->deactivate();
+ break;
+ default:
+ break;
+ }
+}
+
+/*
+ * Paste a middle-click-selection into "Clear" button as URL
+ */
+void UI::paste_url()
+{
+ paste(*Clear, false);
+}
+