Added files
Index: amiga/sslcert.h
===================================================================
--- /dev/null 2009-04-16 19:17:07.000000000 +0100
+++ amiga/sslcert.h 2010-09-23 22:28:49.000000000 +0100
@@ -0,0 +1,24 @@
+/*
+ * Copyright 2009 Chris Young <chris(a)unsatisfactorysoftware.co.uk>
+ *
+ * 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 <
http://www.gnu.org/licenses/>.
+ */
+
+#ifndef AMIGA_SSLCERT_H
+#define AMIGA_SSLCERT_H
+#include "desktop/sslcert.h"
+
+void ami_ssl_free(struct treeview_window *twin);
+#endif
Index: amiga/resources/Themes/Default/directory.png
===================================================================
Binary files /dev/null and amiga/resources/Themes/Default/directory.png differ
Index: amiga/resources/Themes/Default/content.png
===================================================================
Binary files /dev/null and amiga/resources/Themes/Default/content.png differ
Changed files
cookies.c | 149 ----
cookies.h | 5
gui.c | 83 +-
gui.h | 12
history.c | 357 -----------
history.h | 3
hotlist.c | 135 ----
hotlist.h | 9
menu.c | 214 ++++--
menu.h | 12
object.c | 14
object.h | 1
options.h | 3
plotters.c | 20
resources/Themes/AISS/Theme | 8
resources/Themes/Default/Theme | 8
sslcert.c | 217 ------
tree.c | 1305 +++++++++++++++++++++++++----------------
tree.h | 29
19 files changed, 1104 insertions(+), 1480 deletions(-)
Index: amiga/options.h
===================================================================
--- amiga/options.h (revision 10834)
+++ amiga/options.h (working copy)
@@ -34,7 +34,6 @@
extern bool option_use_os_pointers;
extern bool option_new_tab_active;
extern bool option_kiosk_mode;
-extern char *option_recent_file;
extern char *option_search_engines_file;
extern char *option_search_ico_file;
extern char *option_arexx_dir;
@@ -68,7 +67,6 @@
bool option_use_os_pointers = true; \
bool option_new_tab_active = false; \
bool option_kiosk_mode = false; \
-char *option_recent_file = 0; \
char *option_search_engines_file = 0; \
char *option_search_ico_file = 0; \
char *option_arexx_dir = 0; \
@@ -102,7 +100,6 @@
{ "os_mouse_pointers", OPTION_BOOL, &option_use_os_pointers}, \
{ "new_tab_is_active", OPTION_BOOL, &option_new_tab_active}, \
{ "kiosk_mode", OPTION_BOOL, &option_kiosk_mode}, \
-{ "recent_file", OPTION_STRING, &option_recent_file }, \
{ "search_engines_file", OPTION_STRING, &option_search_engines_file }, \
{ "search_ico_file", OPTION_STRING, &option_search_ico_file }, \
{ "arexx_dir", OPTION_STRING, &option_arexx_dir }, \
Index: amiga/history.c
===================================================================
--- amiga/history.c (revision 10834)
+++ amiga/history.c (working copy)
@@ -1,6 +1,5 @@
/*
- * Copyright 2005 Richard Wilson <info(a)tinct.net>
- * Copyright 2008 Chris Young <chris(a)unsatisfactorysoftware.co.uk>
+ * Copyright 2008, 2009 Chris Young <chris(a)unsatisfactorysoftware.co.uk>
*
* This file is part of NetSurf,
http://www.netsurf-browser.org/
*
@@ -17,362 +16,24 @@
* along with this program. If not, see <
http://www.gnu.org/licenses/>.
*/
-#include "desktop/browser.h"
#include "amiga/history.h"
#include "amiga/tree.h"
-#include "content/urldb.h"
-#include <proto/dos.h>
-#include "amiga/options.h"
+#include "desktop/history_global_core.h"
#include <proto/exec.h>
-#include <assert.h>
-#include <utils/log.h>
+#include "amiga/tree.h"
-#define MAXIMUM_URL_LENGTH 1024
-#define MAXIMUM_BASE_NODES 16
-
-static struct node *global_history_base_node[MAXIMUM_BASE_NODES];
-static int global_history_base_node_time[MAXIMUM_BASE_NODES];
-static int global_history_base_node_count = 0;
-
-static char *global_history_recent_url[GLOBAL_HISTORY_RECENT_URLS];
-static int global_history_recent_count = 0;
-
-static bool global_history_init;
-
-static struct node *ami_global_history_find(const char *url);
-static bool global_history_add_internal(const char *url,
- const struct url_data *data);
-void ami_global_history_initialise_node(const char *title,
- time_t base, int days_back);
-void ami_global_history_initialise_nodes(void);
-
void ami_global_history_initialise(void)
{
- char s[MAXIMUM_URL_LENGTH];
- BPTR *fp;
+ global_history_window = ami_tree_create(history_global_get_tree_flags(), NULL);
-// if(global_history_tree) return;
+ if(!global_history_window) return;
- /* Create an empty tree */
- global_history_tree = AllocVec(sizeof(struct tree), MEMF_CLEAR | MEMF_PRIVATE);
- if (!global_history_tree) {
- warn_user("NoMemory", 0);
- return;
- }
- global_history_tree->root = tree_create_folder_node(NULL, "Root");
- if (!global_history_tree->root) {
- warn_user("NoMemory", 0);
- FreeVec(global_history_tree);
- global_history_tree = NULL;
- }
- global_history_tree->root->expanded = true;
- ami_global_history_initialise_nodes();
- global_history_tree->movable = false;
-
- /* load recent URLs */
- fp = FOpen(option_recent_file, MODE_OLDFILE,0);
- if (!fp)
- LOG(("Failed to open file '%s' for reading",
- option_recent_file));
- else {
- while (FGets(fp,s, MAXIMUM_URL_LENGTH)) {
- if (s[strlen(s) - 1] == '\n')
- s[strlen(s) - 1] = '\0';
- global_history_add_recent(s);
- }
- FClose(fp);
- }
-
- global_history_init = true;
- urldb_iterate_entries(global_history_add_internal);
- global_history_init = false;
- tree_initialise(global_history_tree);
-
+ history_global_initialise(ami_tree_get_tree(global_history_window));
}
-void global_history_add(const char *url)
-{
- const struct url_data *data;
-
- data = urldb_get_url_data(url);
- if (!data)
- return;
-
- global_history_add_internal(url, data);
-}
-
-/**
- * Internal routine to actually perform global history addition
- *
- * \param url The URL to add
- * \param data URL data associated with URL
- * \return true (for urldb_iterate_entries)
- */
-bool global_history_add_internal(const char *url,
- const struct url_data *data)
-{
- int i, j;
- struct node *parent = NULL;
- struct node *link;
- struct node *node;
- bool before = false;
- int visit_date;
-
- assert(url && data);
-
- visit_date = data->last_visit;
-
- /* find parent node */
- for (i = 0; i < global_history_base_node_count; i++) {
- if (global_history_base_node_time[i] <= visit_date) {
- parent = global_history_base_node[i];
- break;
- }
- }
-
- /* the entry is too old to care about */
- if (!parent)
- return true;
-
- if (parent->deleted) {
- /* parent was deleted, so find place to insert it */
- link = global_history_tree->root;
-
- for (j = global_history_base_node_count - 1; j >= 0; j--) {
- if (!global_history_base_node[j]->deleted &&
- global_history_base_node_time[j] >
- global_history_base_node_time[i]) {
- link = global_history_base_node[j];
- before = true;
- break;
- }
- }
-
- tree_set_node_selected(global_history_tree,
- parent, false);
- tree_set_node_expanded(global_history_tree,
- parent, false);
- tree_link_node(link, parent, before);
-/*
- if (!global_history_init) {
- tree_recalculate_node(global_history_tree, parent, true);
- tree_recalculate_node_positions(global_history_tree,
- global_history_tree->root);
- tree_redraw_area(global_history_tree,
- 0, 0, 16384, 16384);
- }
-*/
- }
-
- /* find any previous occurance */
-
- if (!global_history_init) {
- node = ami_global_history_find(url);
- if (node) {
- /* \todo: calculate old/new positions and redraw
- * only the relevant portion */
-/*
- tree_redraw_area(global_history_tree,
- 0, 0, 16384, 16384);
-*/
- tree_update_URL_node(node, url, data);
- tree_delink_node(node);
- tree_link_node(parent, node, false);
- tree_handle_node_changed(global_history_tree,
- node, false, true);
- return true;
- }
- }
-
- /* Add the node at the bottom */
- node = tree_create_URL_node_shared(parent, url, data);
- if ((!global_history_init) && (node)) {
-/*
- tree_redraw_area(global_history_tree,
- node->box.x - NODE_INSTEP,
- 0, NODE_INSTEP, 16384);
-*/
- tree_handle_node_changed(global_history_tree, node,
- true, false);
- }
-
- return true;
-}
-
-/**
- * Find an entry in the global history
- *
- * \param url The URL to find
- * \return Pointer to node, or NULL if not found
- */
-struct node *ami_global_history_find(const char *url)
-{
- int i;
- struct node *node;
- struct node_element *element;
-
- for (i = 0; i < global_history_base_node_count; i++) {
- if (!global_history_base_node[i]->deleted) {
- for (node = global_history_base_node[i]->child;
- node; node = node->next) {
- element = tree_find_element(node,
- TREE_ELEMENT_URL);
- if ((element) && !strcmp(url, element->text))
- return node;
- }
- }
- }
- return NULL;
-}
-
-/**
- * Saves the global history's recent URL data.
- */
-void ami_global_history_save(void)
-{
- BPTR *fp;
- int i;
-
- /* save recent URLs */
- fp = fopen(option_recent_file, "w");
- if (!fp)
- LOG(("Failed to open file '%s' for writing",
- option_recent_file));
- else {
- for (i = global_history_recent_count - 1; i >= 0; i--)
- if (strlen(global_history_recent_url[i]) <
- MAXIMUM_URL_LENGTH)
- fprintf(fp, "%s\n",
- global_history_recent_url[i]);
- fclose(fp);
- }
-}
-
-void global_history_add_recent(const char *url)
-{
- int i;
- int j = -1;
- char *current;
-
- /* try to find a string already there */
- for (i = 0; i < global_history_recent_count; i++)
- if (global_history_recent_url[i] &&
- !strcmp(global_history_recent_url[i], url))
- j = i;
-
- /* already at head of list */
- if (j == 0)
- return;
-
- if (j < 0) {
- /* add to head of list */
- free(global_history_recent_url[
- GLOBAL_HISTORY_RECENT_URLS - 1]);
- memmove(&global_history_recent_url[1],
- &global_history_recent_url[0],
- (GLOBAL_HISTORY_RECENT_URLS - 1) *
- sizeof(char *));
- global_history_recent_url[0] = strdup(url);
- global_history_recent_count++;
- if (global_history_recent_count > GLOBAL_HISTORY_RECENT_URLS)
- global_history_recent_count =
- GLOBAL_HISTORY_RECENT_URLS;
-/*
- if (global_history_recent_count == 1)
- ro_gui_window_prepare_navigate_all();
-*/
- } else {
- /* move to head of list */
- current = global_history_recent_url[j];
- for (i = j; i > 0; i--)
- global_history_recent_url[i] =
- global_history_recent_url[i - 1];
- global_history_recent_url[0] = current;
- }
-}
-
-/**
- * Gets details of the currently used URL list.
- *
- * \param count set to the current number of entries in the URL array on exit
- * \return the current URL array
- */
-char **global_history_get_recent(int *count)
-{
- *count = global_history_recent_count;
- return global_history_recent_url;
-}
-
void ami_global_history_free()
{
- FreeVec(global_history_tree);
+ history_global_cleanup();
+ ami_tree_destroy(global_history_window);
+ global_history_window = NULL;
}
-
-/**
- * Initialises the base nodes
- */
-void ami_global_history_initialise_nodes(void)
-{
- struct tm *full_time;
- time_t t;
- int weekday;
- int i;
-
- /* get the current time */
- t = time(NULL);
- if (t == -1)
- return;
-
- /* get the time at the start of today */
- full_time = localtime(&t);
- weekday = full_time->tm_wday;
- full_time->tm_sec = 0;
- full_time->tm_min = 0;
- full_time->tm_hour = 0;
- t = mktime(full_time);
- if (t == -1)
- return;
-
- ami_global_history_initialise_node((char *)messages_get("DateToday"), t, 0);
- if (weekday > 0)
- ami_global_history_initialise_node(
- (char *)messages_get("DateYesterday"), t, -1);
- for (i = 2; i <= weekday; i++)
- ami_global_history_initialise_node(NULL, t, -i);
- ami_global_history_initialise_node((char *)messages_get("Date1Week"),
- t, -weekday - 7);
- ami_global_history_initialise_node((char *)messages_get("Date2Week"),
- t, -weekday - 14);
- ami_global_history_initialise_node((char *)messages_get("Date3Week"),
- t, -weekday - 21);
-}
-
-/**
- * Create and initialise a node
- */
-void ami_global_history_initialise_node(const char *title,
- time_t base, int days_back)
-{
- struct tm *full_time;
- char buffer[64];
- struct node *node;
-
- base += days_back * 60 * 60 * 24;
- if (!title) {
- full_time = localtime(&base);
- strftime((char *)&buffer, (size_t)64, "%A", full_time);
- node = tree_create_folder_node(NULL, buffer);
- } else
- node = tree_create_folder_node(NULL, title);
-
- if (!node)
- return;
-
- node->retain_in_memory = true;
- node->deleted = true;
- node->editable = false;
- global_history_base_node[global_history_base_node_count] = node;
- global_history_base_node_time[global_history_base_node_count] = base;
- global_history_base_node_count++;
-}
-
Index: amiga/history.h
===================================================================
--- amiga/history.h (revision 10834)
+++ amiga/history.h (working copy)
@@ -19,11 +19,12 @@
#ifndef AMIGA_HISTORY_H
#define AMIGA_HISTORY_H
#include "desktop/tree.h"
+#include "desktop/history_global_core.h"
#define GLOBAL_HISTORY_RECENT_URLS 16
void ami_global_history_initialise(void);
void ami_global_history_free(void);
-struct tree *global_history_tree;
+struct treeview_window *global_history_window;
#endif
Index: amiga/sslcert.c
===================================================================
--- amiga/sslcert.c (revision 10834)
+++ amiga/sslcert.c (working copy)
@@ -16,224 +16,29 @@
* along with this program. If not, see <
http://www.gnu.org/licenses/>.
*/
-#include <assert.h>
-#include <string.h>
-#include <proto/dos.h>
#include <proto/exec.h>
-#include <proto/utility.h>
-#include "utils/errors.h"
-#include "utils/utils.h"
-#include "utils/messages.h"
-#include "content/urldb.h"
-#include "content/fetch.h"
-#include "desktop/tree.h"
#include "amiga/tree.h"
-#include "amiga/gui.h"
+#include "amiga/sslcert.h"
-struct session_data {
- struct session_cert *certs;
- unsigned long num;
- nserror (*cb)(bool proceed, void *pw);
- void *cbpw;
- char *url;
- struct tree *tree;
-};
-struct session_cert {
- char version[16], valid_from[32], valid_to[32], type[8], serial[32];
- char *issuer_t;
- char *subject_t;
- uintptr_t issuer;
- uintptr_t subject;
-};
-
-void ami_gui_cert_close(struct session_data *data);
-bool ami_gui_cert_apply(struct session_data *session);
-
void gui_cert_verify(const char *url,
const struct ssl_cert_info *certs, unsigned long num,
nserror (*cb)(bool proceed, void *pw), void *cbpw)
{
- const struct ssl_cert_info *from;
- struct session_cert *to;
- struct session_data *data;
- struct tree *tree;
- struct node *node;
- long i;
- STRPTR yesorno,reqcontents;
- int res = 0;
- struct treeview_window *twin;
+ struct sslcert_session_data *data;
+ struct treeview_window *ssl_window;
- assert(certs);
+ data = sslcert_create_session_data(num, bw, content_get_url(c),
+ cb. cbpw);
- /* copy the certificate information */
- data = calloc(1, sizeof(struct session_data));
- if (!data) {
- warn_user("NoMemory", 0);
- return;
- }
- data->url = strdup(url);
- if (!data->url) {
- free(data);
- warn_user("NoMemory", 0);
- return;
- }
- data->cb = cb;
- data->cbpw = cbpw;
- data->num = num;
- data->certs = calloc(num, sizeof(struct session_cert));
- if (!data->certs) {
- free(data->url);
- free(data);
- warn_user("NoMemory", 0);
- return;
- }
- for (i = 0; i < (long)num; i++) {
- to = &data->certs[i];
- from = &certs[i];
- to->subject_t = strdup(from->subject);
- to->issuer_t = strdup(from->issuer);
- if ((!to->subject_t) || (!to->issuer_t)) {
- for (; i >= 0; i--) {
- to = &data->certs[i];
- free(to->subject_t);
- free(to->issuer_t);
- }
- free(data->certs);
- free(data->url);
- free(data);
- warn_user("NoMemory", 0);
- return;
- }
- snprintf(to->version, sizeof data->certs->version, "%ld",
- from->version);
- snprintf(to->valid_from, sizeof data->certs->valid_from, "%s",
- from->not_before);
- snprintf(to->type, sizeof data->certs->type, "%d",
- from->cert_type);
- snprintf(to->valid_to, sizeof data->certs->valid_to, "%s",
- from->not_after);
- snprintf(to->serial, sizeof data->certs->serial, "%ld",
- from->serial);
- }
+ ssl_window = ami_tree_create(sslcert_get_tree_flags(), data);
+ if(!ssl_window) return;
- tree = calloc(sizeof(struct tree), 1);
- if (!tree) {
- //ro_gui_cert_close(ssl_w);
- warn_user("NoMemory", 0);
- return;
- }
- tree->root = tree_create_folder_node(NULL, "Root");
- if (!tree->root) {
-// ro_gui_cert_close(ssl_w);
- warn_user("NoMemory", 0);
- free(tree);
- tree = NULL;
- return;
- }
- tree->root->expanded = true;
- tree->handle = 0;
- tree->movable = false;
- tree->no_drag = true;
- tree->no_vscroll = true;
- tree->no_furniture = true;
- tree->single_selection = true;
- data->tree = tree;
+ sslcert_load_tree(ami_tree_get_tree(ssl_window), certs, data);
- /* put the SSL names in the tree */
- for (i = 0; i < (long)num; i++) {
- node = tree_create_leaf_node(tree->root, certs[i].subject);
- if (node) {
- node->data.data = TREE_ELEMENT_SSL;
- tree_set_node_sprite(node, "small_xxx", "small_xxx");
- }
- }
- tree_initialise(tree);
-
- ami_open_tree(tree,AMI_TREE_SSLCERT);
- twin = (struct treeview_window *)data->tree->handle;
-
- if(yesorno =
ASPrintf("%s|%s",messages_get("Accept"),messages_get("Reject")))
- {
- if(reqcontents = ASPrintf("%s\n\n%s: %s\n%s: %s\n%s: %s\n%s: %s\n%s: %s",
- messages_get("SSLError"),
- messages_get("Subject"),
- to->subject_t,
- messages_get("Issuer"),
- to->issuer_t,
- messages_get("Version"),
- to->version,
- messages_get("ValidFrom"),
- to->valid_from,
- messages_get("ValidTo"),
- to->valid_to))
- {
- res = TimedDosRequesterTags(TDR_ImageType,TDRIMAGE_QUESTION,
- TDR_Window,twin->win,
- TDR_TitleString,messages_get("NetSurf"),
- TDR_GadgetString,yesorno,
- TDR_FormatString,reqcontents,
- TAG_DONE);
-
- FreeVec(reqcontents);
- }
-
- FreeVec(yesorno);
- }
-
- if(res == 1)
- {
- ami_gui_cert_apply(data);
- }
- ami_gui_cert_close(data);
-
+ ami_tree_open(ssl_window, AMI_TREE_SSLCERT);
}
-void ami_gui_cert_close(struct session_data *data)
+void ami_ssl_free(struct treeview_window *twin)
{
- unsigned long i;
-
- if(data->tree->handle)
- {
- ami_tree_close((struct treeview_window *)data->tree->handle);
- win_destroyed = true;
- }
-
- assert(data);
-
-/*
- for (i = 0; i < data->num; i++) {
- if (data->certs[i].subject)
- textarea_destroy(data->certs[i].subject);
- if (data->certs[i].issuer)
- textarea_destroy(data->certs[i].issuer);
- }
-*/
-
- /* Send failure if callback exists */
- if (data->cb != NULL)
- data->cb(false, data->cbpw);
-
- if (data->tree) {
- tree_delete_node(data->tree, data->tree->root, false);
- free(data->tree);
- }
-
- free(data->certs);
- free(data->url);
- free(data);
+ ami_tree_destroy(twin);
}
-
-bool ami_gui_cert_apply(struct session_data *session)
-{
- assert(session);
-
- urldb_set_cert_permissions(session->url, true);
-
- session->cb(true, session->cbpw);
-
- /* Invalidate callback */
- session->cb = NULL;
- session->cbpw = NULL;
-
- return true;
-}
Index: amiga/hotlist.c
===================================================================
--- amiga/hotlist.c (revision 10834)
+++ amiga/hotlist.c (working copy)
@@ -1,5 +1,4 @@
/*
- * Copyright 2004, 2005 Richard Wilson <info(a)tinct.net>
* Copyright 2008, 2009 Chris Young <chris(a)unsatisfactorysoftware.co.uk>
*
* This file is part of NetSurf,
http://www.netsurf-browser.org/
@@ -17,137 +16,25 @@
* along with this program. If not, see <
http://www.gnu.org/licenses/>.
*/
-#include "desktop/browser.h"
-#include "desktop/tree.h"
#include <proto/exec.h>
-#include "content/urldb.h"
#include "amiga/hotlist.h"
+#include "desktop/hotlist.h"
+#include "amiga/options.h"
#include "amiga/tree.h"
-void ami_gui_hotlist_visited(hlcache_handle *content, struct tree *tree,
- struct node *node);
-
-static const struct {
- const char *url;
- const char *msg_key;
-} default_entries[] = {
- { "http://www.netsurf-browser.org/", "HotlistHomepage" },
- { "http://www.netsurf-browser.org/downloads/amiga/",
"HotlistTestBuild" },
- { "http://www.netsurf-browser.org/documentation/",
"HotlistDocumentation" },
- { "http://sourceforge.net/tracker/?atid=464312&group_id=51719",
- "HotlistBugTracker" },
- { "http://sourceforge.net/tracker/?atid=464315&group_id=51719",
- "HotlistFeatureRequest" },
- { "http://www.unsatisfactorysoftware.co.uk/",
- "Unsatisfactory Software" }
-};
-#define ENTRIES_COUNT (sizeof(default_entries) / sizeof(default_entries[0]))
-
-void hotlist_visited(hlcache_handle *c)
+void ami_hotlist_initialise(void)
{
- if ((!c) || (!content_get_url(c)) || (!hotlist))
- return;
- ami_gui_hotlist_visited(c, hotlist, hotlist->root);
-}
+ hotlist_window = ami_tree_create(hotlist_get_tree_flags(), NULL);
-/**
- * Informs the hotlist that some content has been visited
- *
- * \param content the content visited
- * \param tree the tree to find the URL data from
- * \param node the node to update siblings and children of
- */
-void ami_gui_hotlist_visited(hlcache_handle *content, struct tree *tree,
- struct node *node)
-{
- struct node_element *element;
+ if(!hotlist_window) return;
- for (; node; node = node->next) {
- if (!node->folder) {
- element = tree_find_element(node, TREE_ELEMENT_URL);
- if ((element) && (!strcmp(element->text,
- content_get_url(content)))) {
- tree_update_URL_node(node, content_get_url(content), NULL);
- tree_handle_node_changed(tree, node, true,
- false);
- }
- }
- if (node->child)
- ami_gui_hotlist_visited(content, tree, node->child);
- }
+ hotlist_initialise(ami_tree_get_tree(hotlist_window),
+ option_hotlist_file);
}
-void ami_hotlist_init(struct tree **hotlist)
+void ami_hotlist_free()
{
- struct tree *hotlist_tree;
- struct node *node;
- int i;
- const struct url_data *data;
-
- *hotlist = AllocVec(sizeof(struct tree),MEMF_PRIVATE | MEMF_CLEAR);
- hotlist_tree = *hotlist;
-
- if (!hotlist_tree) {
- warn_user("NoMemory", 0);
- return;
- }
-
- hotlist_tree->root = tree_create_folder_node(NULL, "Root");
- if (!hotlist_tree->root) {
- warn_user("NoMemory", 0);
- FreeVec(hotlist_tree);
- hotlist_tree = NULL;
- }
-
- hotlist_tree->root->expanded = true;
-
- node = tree_create_folder_node(hotlist_tree->root, "Menu");
- if (!node)
- node = hotlist_tree->root;
-
- node = tree_create_folder_node(node, "NetSurf");
- if (!node)
- node = hotlist_tree->root;
-
- for (i = 0; i != ENTRIES_COUNT; i++) {
- data = urldb_get_url_data(default_entries[i].url);
- if (!data) {
- urldb_add_url(default_entries[i].url);
- urldb_set_url_persistence(
- default_entries[i].url,
- true);
- data = urldb_get_url_data(
- default_entries[i].url);
- }
- if (data) {
- tree_create_URL_node(node,
- default_entries[i].url, data,
- messages_get(default_entries[i].msg_key));
- }
- }
-
- tree_initialise(hotlist_tree);
+ hotlist_cleanup(option_hotlist_file);
+ ami_tree_destroy(hotlist_window);
+ hotlist_window = NULL;
}
-
-void ami_hotlist_add(struct node *node, struct hlcache_handle *c)
-{
- const struct url_data *data;
-
- data = urldb_get_url_data(content_get_url(c));
- if (!data)
- {
- urldb_add_url(content_get_url(c));
- urldb_set_url_persistence(content_get_url(c),true);
- data = urldb_get_url_data(content_get_url(c));
- }
-
- if (data)
- {
- tree_create_URL_node(node,content_get_url(c),data,content_get_title(c));
- }
-
- tree_handle_node_changed(hotlist,node,false,true);
-
- if(hotlist->handle)
- ami_recreate_listbrowser((struct treeview_window *)hotlist->handle);
-}
Index: amiga/hotlist.h
===================================================================
--- amiga/hotlist.h (revision 10834)
+++ amiga/hotlist.h (working copy)
@@ -1,5 +1,5 @@
/*
- * Copyright 2008 Chris Young <chris(a)unsatisfactorysoftware.co.uk>
+ * Copyright 2008, 2009 Chris Young <chris(a)unsatisfactorysoftware.co.uk>
*
* This file is part of NetSurf,
http://www.netsurf-browser.org/
*
@@ -19,9 +19,10 @@
#ifndef AMIGA_HOTLIST_H
#define AMIGA_HOTLIST_H
#include "desktop/tree.h"
+#include "amiga/tree.h"
-void ami_hotlist_init(struct tree **hotlist);
-void ami_hotlist_add(struct node *node, struct hlcache_handle *c);
+void ami_hotlist_initialise(void);
+void ami_hotlist_free(void);
-struct tree *hotlist;
+struct treeview_window *hotlist_window;
#endif
Index: amiga/cookies.c
===================================================================
--- amiga/cookies.c (revision 10834)
+++ amiga/cookies.c (working copy)
@@ -1,6 +1,5 @@
/*
- * Copyright 2006 Richard Wilson <info(a)tinct.net>
- * Copyright 2008 Chris Young <chris(a)unsatisfactorysoftware.co.uk>
+ * Copyright 2008, 2009 Chris Young <chris(a)unsatisfactorysoftware.co.uk>
*
* This file is part of NetSurf,
http://www.netsurf-browser.org/
*
@@ -17,151 +16,23 @@
* along with this program. If not, see <
http://www.gnu.org/licenses/>.
*/
-/** \file
- * Cookies (implementation).
- */
-
-#include <string.h>
-#include "content/urldb.h"
-#include "desktop/cookies.h"
-#include "desktop/tree.h"
-#include "utils/messages.h"
-#include "utils/log.h"
-#include "amiga/cookies.h"
#include <proto/exec.h>
-#include <assert.h>
-#include "utils/utils.h"
+#include "amiga/cookies.h"
+#include "desktop/cookies.h"
+#include "amiga/tree.h"
-static bool cookies_init;
-
-struct node *ami_cookies_find(const char *url);
-
-/**
- * Initialise cookies tree
- */
void ami_cookies_initialise(void)
{
- if(cookies_tree) return;
+ cookies_window = ami_tree_create(cookies_get_tree_flags(), NULL);
- /* Create an empty tree */
- cookies_tree = AllocVec(sizeof(struct tree),MEMF_CLEAR | MEMF_PRIVATE);
- if (!cookies_tree) {
- warn_user("NoMemory", 0);
- return;
- }
- cookies_tree->root = tree_create_folder_node(NULL, "Root");
- if (!cookies_tree->root) {
- warn_user("NoMemory", 0);
- FreeVec(cookies_tree);
- cookies_tree = NULL;
- }
- cookies_tree->root->expanded = true;
- cookies_tree->movable = false;
- cookies_tree->no_drag = true;
+ if(!cookies_window) return;
- cookies_init = true;
- urldb_iterate_cookies(cookies_update);
- cookies_init = false;
- tree_initialise(cookies_tree);
+ cookies_initialise(ami_tree_get_tree(cookies_window));
}
-/**
- * Perform cookie addition
- *
- * \param data Cookie data for a domain, or NULL
- * \return true (for urldb_iterate_entries)
- */
-bool cookies_update(const char *domain, const struct cookie_data *data)
-{
- struct node *parent;
- struct node *node = NULL;
- struct node *child;
- struct node *add;
- const struct cookie_data *cookie = NULL;
- bool expanded;
-
- assert(domain);
-
- /* check if we're a domain, and add get the first cookie */
- if (data)
- for (cookie = data; cookie->prev; cookie = cookie->prev);
-
- if (!cookies_init) {
- node = ami_cookies_find(domain);
- if (node) {
- /* mark as deleted so we don't remove the cookies */
- expanded = node->expanded;
- for (child = node->child; child; child = child->next)
- child->deleted = true;
- if (node->child)
- tree_delete_node(cookies_tree, node->child,
- true);
- /* deleting will have contracted our node */
- node->expanded = expanded;
- }
- if (!data) {
- if (!node)
- return true;
- tree_delete_node(cookies_tree, node, false);
- tree_handle_node_changed(cookies_tree,
- cookies_tree->root, true, false);
- return true;
- }
- }
-
- if (!node) {
- for (parent = cookies_tree->root->child; parent;
- parent = parent->next) {
- if (strcmp(domain, parent->data.text) == 0)
- break;
- }
- if (!parent) {
- node = tree_create_folder_node(cookies_tree->root,
- domain);
- } else {
- node = parent;
- }
- }
- if (!node)
- return true;
- node->editable = false;
-
- for (; cookie; cookie = cookie->next) {
- add = tree_create_cookie_node(node, cookie);
- if (add && !cookies_init)
- tree_handle_node_changed(cookies_tree, add,
- true, false);
- }
- if (!cookies_init) {
- tree_handle_node_changed(cookies_tree, node,
- true, false);
-/*
- tree_redraw_area(cookies_tree,
- node->box.x - NODE_INSTEP,
- 0, NODE_INSTEP, 16384);
-*/
- }
- return true;
-}
-
-/**
- * Find an entry in the cookie tree
- *
- * \param url The URL to find
- * \return Pointer to node, or NULL if not found
- */
-struct node *ami_cookies_find(const char *url)
-{
- struct node *node;
-
- for (node = cookies_tree->root->child; node; node = node->next) {
- if (!strcmp(url, node->data.text))
- return node;
- }
- return NULL;
-}
-
void ami_cookies_free()
{
- FreeVec(cookies_tree);
+ cookies_cleanup();
+ ami_tree_destroy(cookies_window);
+ cookies_window = NULL;
}
Index: amiga/tree.c
===================================================================
--- amiga/tree.c (revision 10834)
+++ amiga/tree.c (working copy)
@@ -1,5 +1,5 @@
/*
- * Copyright 2008,2009 Chris Young <chris(a)unsatisfactorysoftware.co.uk>
+ * Copyright 2008, 2009 Chris Young <chris(a)unsatisfactorysoftware.co.uk>
*
* This file is part of NetSurf,
http://www.netsurf-browser.org/
*
@@ -16,13 +16,16 @@
* along with this program. If not, see <
http://www.gnu.org/licenses/>.
*/
-#include "desktop/tree.h"
-#include <proto/listbrowser.h>
#include <proto/window.h>
#include <proto/layout.h>
+#include <proto/space.h>
+#include <proto/label.h>
+#include <proto/scroller.h>
#include <classes/window.h>
-#include <gadgets/listbrowser.h>
+#include <gadgets/space.h>
+#include <images/label.h>
#include <gadgets/layout.h>
+#include <gadgets/scroller.h>
#include <reaction/reaction_macros.h>
#include "amiga/gui.h"
#include "content/urldb.h"
@@ -36,222 +39,395 @@
#include "utils/messages.h"
#include <proto/bitmap.h>
#include <images/bitmap.h>
+#include <proto/graphics.h>
+#include <intuition/icclass.h>
+#include <proto/asl.h>
+#include <proto/utility.h>
+#include <libraries/gadtools.h>
+#include <proto/dos.h>
+#include "amiga/utf8.h"
+#include "desktop/cookies.h"
+#include "desktop/history_global_core.h"
+#include "desktop/hotlist.h"
+#include "amiga/sslcert.h"
+#include "utils/utils.h"
-struct Node *selectednode;
-struct node *selectednode2;
+#define AMI_TREE_MENU_ITEMS 19
-void ami_add_elements(struct treeview_window *twin,struct node *root,WORD *gen);
-bool ami_tree_launch_node(struct tree *tree, struct node *node);
-void free_browserlist(struct List *list);
-void ami_move_node(struct treeview_window *twin,int move);
-void ami_new_bookmark(struct treeview_window *twin);
-void ami_recreate_listbrowser(struct treeview_window *twin);
+struct treeview_window {
+ struct Window *win;
+ Object *objects[OID_LAST];
+ struct Gadget *gadgets[GID_LAST];
+ struct nsObject *node;
+ ULONG pad[5];
+ int type;
+ struct NewMenu *menu;
+ char *menu_name[AMI_TREE_MENU_ITEMS];
+ struct tree *tree;
+ struct Hook scrollerhook;
+ uint32 key_state;
+ uint32 mouse_state;
+ int drag_x;
+ int drag_y;
+ struct timeval lastclick;
+ int max_width;
+ int max_height;
+ struct gui_globals globals;
+ struct sslcert_session_data *ssl_data;
+};
-void tree_initialise_redraw(struct tree *tree)
+void ami_tree_draw(struct treeview_window *twin);
+static void ami_tree_redraw_request(int x, int y, int width, int height,
+ void *data);
+static void ami_tree_resized(struct tree *tree, int width,
+ int height, void *data);
+static void ami_tree_scroll_visible(int y, int height, void *data);
+static void ami_tree_get_window_dimensions(int *width, int *height, void *data);
+
+const struct treeview_table ami_tree_callbacks = {
+ .redraw_request = ami_tree_redraw_request,
+ .resized = ami_tree_resized,
+ .scroll_visible = ami_tree_scroll_visible,
+ .get_window_dimensions = ami_tree_get_window_dimensions
+};
+
+struct treeview_window *ami_tree_create(uint8 flags,
+ struct sslcert_session_data *ssl_data)
{
+ struct treeview_window *twin;
+
+ twin = AllocVec(sizeof(struct treeview_window),
+ MEMF_PRIVATE | MEMF_CLEAR);
+
+ if(!twin)
+ {
+ warn_user("NoMemory", 0);
+ return NULL;
+ }
+
+ twin->ssl_data = ssl_data;
+
+ twin->tree = tree_create(flags, &ami_tree_callbacks, twin);
+ return twin;
}
-void tree_redraw_area(struct tree *tree, int x, int y, int width, int height)
+void ami_tree_destroy(struct treeview_window *twin)
{
+ tree_delete(twin->tree);
+ FreeVec(twin);
}
-void tree_draw_line(int x, int y, int width, int height)
+struct tree *ami_tree_get_tree(struct treeview_window *twin)
{
+ return twin->tree;
}
-void tree_draw_node_element(struct tree *tree, struct node_element *element)
+void ami_tree_resized(struct tree *tree, int width, int height, void *data)
{
- return;
-#if 0
-/* add element to listbrowser list */
+ struct treeview_window *twin = data;
+ struct IBox *bbox;
- struct Node *lbnode;
- struct treeview_window *twin = tree->handle;
- struct node *tempnode;
- int generation=1;
- BOOL edit = FALSE;
+ twin->max_height = height;
+ twin->max_width = width;
- tempnode = element->parent;
- edit = tempnode->editable;
-
- while(tempnode)
+ if(twin->win)
{
- tempnode = tempnode->parent;
- generation++;
- }
+ GetAttr(SPACE_AreaBox,twin->gadgets[GID_BROWSER],(ULONG *)&bbox);
- switch (element->type) {
- case NODE_ELEMENT_TEXT_PLUS_SPRITE:
- case NODE_ELEMENT_TEXT:
- if (lbnode = AllocListBrowserNode(3,
-// LBNA_UserData,nodetime,
- LBNA_Generation,1,
- LBNA_Column, 0,
- LBNCA_CopyText,TRUE,
- LBNCA_Text, element->text,
- LBNCA_Editable,edit,
- LBNA_Column, 1,
- LBNCA_CopyText,TRUE,
- LBNCA_Text, "",
- LBNA_Column, 2,
- LBNCA_CopyText,TRUE,
- LBNCA_Text, "",
- TAG_DONE))
- {
- AddTail(twin->listbrowser_list, lbnode);
- }
- break;
+ RefreshSetGadgetAttrs((APTR)twin->objects[OID_VSCROLL], twin->win, NULL,
+ SCROLLER_Total, height,
+ SCROLLER_Visible, bbox->Height,
+ TAG_DONE);
+
+ RefreshSetGadgetAttrs((APTR)twin->objects[OID_HSCROLL], twin->win, NULL,
+ SCROLLER_Total, width,
+ SCROLLER_Visible, bbox->Width,
+ TAG_DONE);
}
-#endif
}
-void tree_draw_node_expansion(struct tree *tree, struct node *node)
+/**
+ * Retrieves the dimensions of the window with the tree
+ *
+ * \param data user data assigned to the tree on tree creation
+ * \param width will be updated to window width if not NULL
+ * \param height will be updated to window height if not NULL
+ */
+void ami_tree_get_window_dimensions(int *width, int *height, void *data)
{
- DebugPrintF("tree_draw_node_expansion\n");
+ struct treeview_window *twin = data;
+ struct IBox *bbox;
+
+ GetAttr(SPACE_AreaBox,twin->gadgets[GID_BROWSER],(ULONG *)&bbox);
+
+ if(width) *width = bbox->Width;
+ if(height) *height = bbox->Height;
}
-void tree_recalculate_node_element(struct node_element *element)
+/**
+ * Translates a content_type to the name of a respective icon
+ *
+ * \param content_type content type
+ * \param buffer buffer for the icon name
+ */
+void tree_icon_name_from_content_type(char *buffer, content_type type)
{
+ // TODO: design/acquire icons
+ switch (type) {
+ case CONTENT_HTML:
+ case CONTENT_TEXTPLAIN:
+ case CONTENT_CSS:
+#if defined(WITH_MNG) || defined(WITH_PNG)
+ case CONTENT_PNG:
+#endif
+#ifdef WITH_MNG
+ case CONTENT_JNG:
+ case CONTENT_MNG:
+#endif
+#ifdef WITH_JPEG
+ case CONTENT_JPEG:
+#endif
+#ifdef WITH_GIF
+ case CONTENT_GIF:
+#endif
+#ifdef WITH_BMP
+ case CONTENT_BMP:
+ case CONTENT_ICO:
+#endif
+#ifdef WITH_NSSPRITE
+ case CONTENT_SPRITE:
+#endif
+#ifdef WITH_NS_SVG
+ case CONTENT_SVG:
+#endif
+ default:
+ ami_get_theme_filename(buffer,"theme_list_content",true);
+ break;
+ }
}
-void tree_update_URL_node(struct node *node, const char *url,
- const struct url_data *data)
+/**
+ * Scrolls the tree to make an element visible
+ *
+ * \param y Y coordinate of the element
+ * \param height height of the element
+ * \param data user data assigned to the tree on tree creation
+ */
+void ami_tree_scroll_visible(int y, int height, void *data)
{
- struct node_element *element;
- char buffer[256];
+ ULONG sy, scrollset;
+ struct IBox *bbox;
+ struct treeview_window *twin = data;
- assert(node);
+ GetAttr(SCROLLER_Top, twin->objects[OID_VSCROLL], (ULONG *)&sy);
+ GetAttr(SPACE_AreaBox,twin->gadgets[GID_BROWSER],(ULONG *)&bbox);
- element = tree_find_element(node, TREE_ELEMENT_URL);
+ if((y > sy) && ((y + height) < (sy + bbox->Height))) return;
- if (!element)
- return;
- if (data) {
- /* node is linked, update */
- assert(!node->editable);
- if (!data->title)
- urldb_set_url_title(url, url);
+ if((y <= sy) || (height > bbox->Height)) scrollset = (ULONG)y;
+ else scrollset = sy + (y + height) - (sy + bbox->Height);
- if (!data->title)
- return;
+ RefreshSetGadgetAttrs((APTR)twin->objects[OID_VSCROLL], twin->win, NULL,
+ SCROLLER_Top, scrollset,
+ TAG_DONE);
- node->data.text = data->title;
- } else {
- /* node is not linked, find data */
- assert(node->editable);
- data = urldb_get_url_data(element->text);
- if (!data)
- return;
- }
+ ami_tree_draw(twin);
+}
-/* not implemented yet
- if (element) {
- sprintf(buffer, "small_%.3x", ro_content_filetype_from_type(data->type));
- if (ro_gui_wimp_sprite_exists(buffer))
- tree_set_node_sprite(node, buffer, buffer);
- else
- tree_set_node_sprite(node, "small_xxx", "small_xxx");
- }
-*/
+void ami_tree_scroll(struct treeview_window *twin, int sx, int sy)
+{
+ int x, y;
- element = tree_find_element(node, TREE_ELEMENT_LAST_VISIT);
- if (element) {
- snprintf(buffer, 256, (char *)messages_get("TreeLast"),
- (data->last_visit > 0) ?
- ctime((time_t *)&data->last_visit) :
- (char *)messages_get("TreeUnknown"));
- if (data->last_visit > 0)
- buffer[strlen(buffer) - 1] = '\0';
- free((void *)element->text);
- element->text = (char *)strdup(buffer);
- }
+ if(!twin) return;
+ if(sx<0) sx=0;
+ if(sy<0) sy=0;
- element = tree_find_element(node, TREE_ELEMENT_VISITS);
- if (element) {
- snprintf(buffer, 256, (char *)messages_get("TreeVisits"),
- data->visits);
- free((void *)element->text);
- element->text = (char *)strdup(buffer);
- }
+ GetAttr(SCROLLER_Top, twin->objects[OID_HSCROLL], (ULONG *)&x);
+ GetAttr(SCROLLER_Top, twin->objects[OID_VSCROLL], (ULONG *)&y);
+
+ RefreshSetGadgetAttrs((APTR)twin->objects[OID_VSCROLL], twin->win, NULL,
+ SCROLLER_Top, y + sy,
+ TAG_DONE);
+
+ RefreshSetGadgetAttrs((APTR)twin->objects[OID_HSCROLL], twin->win, NULL,
+ SCROLLER_Top, x + sx,
+ TAG_DONE);
+
+ ami_tree_draw(twin);
}
-void tree_resized(struct tree *tree)
+
+void ami_tree_scroller_hook(struct Hook *hook,Object *object,struct IntuiMessage *msg)
{
-}
+ ULONG gid,x,y;
+ struct treeview_window *twin = hook->h_Data;
+ struct IntuiWheelData *wheel;
-void tree_set_node_sprite_folder(struct node *node)
+ switch(msg->Class)
+ {
+ case IDCMP_IDCMPUPDATE:
+ gid = GetTagData( GA_ID, 0, msg->IAddress );
+
+ switch( gid )
+ {
+ case OID_HSCROLL:
+ case OID_VSCROLL:
+ ami_tree_draw(twin);
+ break;
+ }
+ break;
+
+ case IDCMP_EXTENDEDMOUSE:
+ if(msg->Code == IMSGCODE_INTUIWHEELDATA)
+ {
+ wheel = (struct IntuiWheelData *)msg->IAddress;
+
+ ami_tree_scroll(twin, (wheel->WheelX * 20), (wheel->WheelY * 20));
+ }
+ break;
+ }
+}
+
+void ami_tree_menu(struct treeview_window *twin)
{
-}
+ if(twin->menu) return;
-void tree_set_node_sprite(struct node *node, const char *sprite,
- const char *expanded)
-{
+ if(twin->menu = AllocVec(sizeof(struct NewMenu) * AMI_TREE_MENU_ITEMS, MEMF_CLEAR))
+ {
+ twin->menu[0].nm_Type = NM_TITLE;
+ twin->menu_name[0] = ami_utf8_easy((char *)messages_get("Tree"));
+ twin->menu[0].nm_Label = twin->menu_name[0];
+
+ twin->menu[1].nm_Type = NM_ITEM;
+ twin->menu_name[1] = ami_utf8_easy((char *)messages_get("TreeExport"));
+ twin->menu[1].nm_Label = twin->menu_name[1];
+ if(twin->type == AMI_TREE_COOKIES)
+ twin->menu[1].nm_Flags = NM_ITEMDISABLED;
+ twin->menu[1].nm_CommKey = "S";
+
+ twin->menu[2].nm_Type = NM_ITEM;
+ twin->menu[2].nm_Label = NM_BARLABEL;
+
+ twin->menu[3].nm_Type = NM_ITEM;
+ twin->menu_name[3] = ami_utf8_easy((char *)messages_get("Expand"));
+ twin->menu[3].nm_Label = twin->menu_name[3];
+
+ twin->menu[4].nm_Type = NM_SUB;
+ twin->menu_name[4] = ami_utf8_easy((char *)messages_get("All"));
+ twin->menu[4].nm_Label = twin->menu_name[4];
+ twin->menu[4].nm_CommKey = "+";
+
+ if(twin->type == AMI_TREE_COOKIES)
+ {
+ twin->menu_name[5] = ami_utf8_easy((char *)messages_get("Domains"));
+ twin->menu_name[6] = ami_utf8_easy((char *)messages_get("Cookies"));
+ }
+ else
+ {
+ twin->menu_name[5] = ami_utf8_easy((char *)messages_get("Folders"));
+ twin->menu_name[6] = ami_utf8_easy((char *)messages_get("Links"));
+ }
+
+ twin->menu[5].nm_Type = NM_SUB;
+ twin->menu[5].nm_Label = twin->menu_name[5]; // tree-specific title
+
+ twin->menu[6].nm_Type = NM_SUB;
+ twin->menu[6].nm_Label = twin->menu_name[6]; // tree-specific title
+
+ twin->menu[7].nm_Type = NM_ITEM;
+ twin->menu_name[7] = ami_utf8_easy((char *)messages_get("Collapse"));
+ twin->menu[7].nm_Label = twin->menu_name[7];
+
+ twin->menu[8].nm_Type = NM_SUB;
+ twin->menu[8].nm_Label = twin->menu_name[4];
+ twin->menu[8].nm_CommKey = "-";
+
+ twin->menu[9].nm_Type = NM_SUB;
+ twin->menu[9].nm_Label = twin->menu_name[5]; // tree-specific title
+
+ twin->menu[10].nm_Type = NM_SUB;
+ twin->menu[10].nm_Label = twin->menu_name[6]; // tree-specific title
+
+ twin->menu[11].nm_Type = NM_ITEM;
+ twin->menu[11].nm_Label = NM_BARLABEL;
+
+ twin->menu[12].nm_Type = NM_ITEM;
+ twin->menu_name[12] = ami_utf8_easy((char *)messages_get("CloseWindow"));
+ twin->menu[12].nm_Label = twin->menu_name[12];
+ twin->menu[12].nm_CommKey = "K";
+
+ twin->menu[13].nm_Type = NM_TITLE;
+ twin->menu_name[13] = ami_utf8_easy((char *)messages_get("Edit"));
+ twin->menu[13].nm_Label = twin->menu_name[13];
+
+ twin->menu[14].nm_Type = NM_ITEM;
+ twin->menu_name[14] = ami_utf8_easy((char *)messages_get("TreeDelete"));
+ twin->menu[14].nm_Label = twin->menu_name[14];
+ twin->menu[14].nm_CommKey = "D";
+
+ twin->menu[15].nm_Type = NM_ITEM;
+ twin->menu[15].nm_Label = NM_BARLABEL;
+
+ twin->menu[16].nm_Type = NM_ITEM;
+ twin->menu_name[16] = ami_utf8_easy((char *)messages_get("SelectAllNS"));
+ twin->menu[16].nm_Label = twin->menu_name[16];
+ twin->menu[16].nm_CommKey = "A";
+
+ twin->menu[17].nm_Type = NM_ITEM;
+ twin->menu_name[17] = ami_utf8_easy((char *)messages_get("ClearNS"));
+ twin->menu[17].nm_Label = twin->menu_name[17];
+ twin->menu[17].nm_CommKey = "Z";
+
+ twin->menu[18].nm_Type = NM_END;
+ }
}
-void ami_open_tree(struct tree *tree,int type)
+void ami_tree_open(struct treeview_window *twin,int type)
{
- struct treeview_window *twin;
BOOL msel = TRUE,nothl = TRUE,launchdisable=FALSE;
static WORD gen=0;
char *wintitle;
char folderclosed[100],folderopen[100],item[100];
- if(tree->handle)
+ if(twin->win)
{
- twin = (struct treeview_window *)tree->handle;
WindowToFront(twin->win);
ActivateWindow(twin->win);
return;
}
- twin = AllocVec(sizeof(struct treeview_window),MEMF_PRIVATE | MEMF_CLEAR);
- twin->listbrowser_list = AllocVec(sizeof(struct List),MEMF_PRIVATE | MEMF_CLEAR);
+ twin->type = type;
- static struct ColumnInfo columninfo[] =
+ switch(twin->type)
{
- { 80,"Name", CIF_DRAGGABLE | CIF_SORTABLE},
- { 20,"URL", CIF_DRAGGABLE },
-// { 5,"Visits", CIF_DRAGGABLE },
- { -1, (STRPTR)~0, -1 }
- };
-
- if(tree->single_selection) msel = FALSE;
-
- ami_get_theme_filename(&folderclosed,"theme_list_folder_closed");
- ami_get_theme_filename(&folderopen,"theme_list_folder_open");
-
- switch(type)
- {
case AMI_TREE_HOTLIST:
nothl = FALSE;
wintitle = (char *)messages_get("Hotlist");
- ami_get_theme_filename(&item,"theme_list_bookmark");
break;
case AMI_TREE_COOKIES:
nothl = TRUE;
launchdisable=TRUE;
wintitle = (char *)messages_get("Cookies");
- ami_get_theme_filename(&item,"theme_list_cookie");
break;
case AMI_TREE_HISTORY:
nothl = TRUE;
wintitle = (char *)messages_get("GlobalHistory");
- ami_get_theme_filename(&item,"theme_list_history");
break;
case AMI_TREE_SSLCERT:
nothl = TRUE;
wintitle = (char *)messages_get("SSLCerts");
- ami_get_theme_filename(&item,"theme_list_sslcert");
break;
}
- NewList(twin->listbrowser_list);
+ twin->scrollerhook.h_Entry = (void *)ami_tree_scroller_hook;
+ twin->scrollerhook.h_Data = twin;
- tree->handle = (void *)twin;
- twin->tree = tree;
- ami_add_elements(twin,twin->tree->root,&gen);
+ ami_init_layers(&twin->globals, scrn->Width, scrn->Height);
+ ami_tree_menu(twin);
- twin->objects[OID_MAIN] = WindowObject,
+ if(type == AMI_TREE_SSLCERT)
+ {
+ twin->objects[OID_MAIN] = WindowObject,
WA_ScreenTitle,nsscreentitle,
WA_Title,wintitle,
WA_Activate, TRUE,
@@ -259,46 +435,80 @@
WA_DragBar, TRUE,
WA_CloseGadget, TRUE,
WA_SizeGadget, TRUE,
+ WA_Height, scrn->Height / 2,
WA_CustomScreen,scrn,
+ WA_ReportMouse,TRUE,
+ WA_IDCMP,IDCMP_MOUSEMOVE | IDCMP_MOUSEBUTTONS | IDCMP_NEWSIZE |
+ IDCMP_RAWKEY | IDCMP_GADGETUP | IDCMP_IDCMPUPDATE |
+ IDCMP_EXTENDEDMOUSE,
+ WINDOW_HorizProp,1,
+ WINDOW_VertProp,1,
+ WINDOW_IDCMPHook,&twin->scrollerhook,
+ WINDOW_IDCMPHookBits,IDCMP_IDCMPUPDATE | IDCMP_EXTENDEDMOUSE,
WINDOW_SharedPort,sport,
WINDOW_UserData,twin,
- WINDOW_IconifyGadget, TRUE,
+ /* WINDOW_NewMenu, twin->menu, -> No menu for SSL Cert */
+ WINDOW_IconifyGadget, FALSE,
WINDOW_Position, WPOS_CENTERSCREEN,
WINDOW_ParentGroup, twin->gadgets[GID_MAIN] = VGroupObject,
- LAYOUT_AddChild, twin->gadgets[GID_TREEBROWSER] = ListBrowserObject,
- GA_ID, GID_TREEBROWSER,
- GA_RelVerify, TRUE,
- GA_ReadOnly,FALSE,
- LISTBROWSER_ColumnInfo, &columninfo,
-// LISTBROWSER_ColumnTitles, TRUE,
- LISTBROWSER_Hierarchical,TRUE,
- LISTBROWSER_Editable,TRUE,
-// LISTBROWSER_TitleClickable,TRUE,
- LISTBROWSER_AutoFit, TRUE,
- LISTBROWSER_HorizontalProp, TRUE,
- LISTBROWSER_Labels, twin->listbrowser_list,
-// LISTBROWSER_MultiSelect,msel,
- LISTBROWSER_ShowSelected,TRUE,
- LISTBROWSER_ShowImage,BitMapObject,
- BITMAP_SourceFile,folderclosed,
- BITMAP_Screen,scrn,
- BITMAP_Masking,TRUE,
- BitMapEnd,
- LISTBROWSER_HideImage,BitMapObject,
- BITMAP_SourceFile,folderopen,
- BITMAP_Screen,scrn,
- BITMAP_Masking,TRUE,
- BitMapEnd,
- LISTBROWSER_LeafImage,BitMapObject,
- BITMAP_SourceFile,item,
- BITMAP_Screen,scrn,
- BITMAP_Masking,TRUE,
- BitMapEnd,
- ListBrowserEnd,
- CHILD_NominalSize,TRUE,
+ LAYOUT_AddImage, LabelObject,
+ LABEL_Text, messages_get("SSLError"),
+ LabelEnd,
+ LAYOUT_AddChild, twin->gadgets[GID_BROWSER] = SpaceObject,
+ GA_ID, GID_BROWSER,
+ SPACE_Transparent,TRUE,
+ SPACE_BevelStyle, BVS_DISPLAY,
+ SpaceEnd,
LAYOUT_AddChild, HGroupObject,
LAYOUT_AddChild, twin->gadgets[GID_OPEN] = ButtonObject,
GA_ID,GID_OPEN,
+ GA_Text,messages_get("Accept"),
+ GA_RelVerify,TRUE,
+ ButtonEnd,
+ LAYOUT_AddChild, twin->gadgets[GID_CANCEL] = ButtonObject,
+ GA_ID,GID_CANCEL,
+ GA_Text,messages_get("Reject"),
+ GA_RelVerify,TRUE,
+ ButtonEnd,
+ EndGroup,
+ CHILD_WeightedHeight,0,
+ EndGroup,
+ EndWindow;
+ }
+ else
+ {
+ twin->objects[OID_MAIN] = WindowObject,
+ WA_ScreenTitle,nsscreentitle,
+ WA_Title,wintitle,
+ WA_Activate, TRUE,
+ WA_DepthGadget, TRUE,
+ WA_DragBar, TRUE,
+ WA_CloseGadget, TRUE,
+ WA_SizeGadget, TRUE,
+ WA_Height, scrn->Height / 2,
+ WA_CustomScreen,scrn,
+ WA_ReportMouse,TRUE,
+ WA_IDCMP,IDCMP_MOUSEMOVE | IDCMP_MOUSEBUTTONS | IDCMP_NEWSIZE |
+ IDCMP_RAWKEY | IDCMP_GADGETUP | IDCMP_IDCMPUPDATE |
+ IDCMP_EXTENDEDMOUSE,
+ WINDOW_HorizProp,1,
+ WINDOW_VertProp,1,
+ WINDOW_IDCMPHook,&twin->scrollerhook,
+ WINDOW_IDCMPHookBits,IDCMP_IDCMPUPDATE | IDCMP_EXTENDEDMOUSE,
+ WINDOW_SharedPort,sport,
+ WINDOW_UserData,twin,
+ WINDOW_NewMenu, twin->menu,
+ WINDOW_IconifyGadget, FALSE,
+ WINDOW_Position, WPOS_CENTERSCREEN,
+ WINDOW_ParentGroup, twin->gadgets[GID_MAIN] = VGroupObject,
+ LAYOUT_AddChild, twin->gadgets[GID_BROWSER] = SpaceObject,
+ GA_ID, GID_BROWSER,
+ SPACE_Transparent,TRUE,
+ SPACE_BevelStyle, BVS_DISPLAY,
+ SpaceEnd,
+ LAYOUT_AddChild, HGroupObject,
+ LAYOUT_AddChild, twin->gadgets[GID_OPEN] = ButtonObject,
+ GA_ID,GID_OPEN,
GA_Text,messages_get("TreeLaunch"),
GA_RelVerify,TRUE,
GA_Disabled,launchdisable,
@@ -315,24 +525,6 @@
GA_RelVerify,TRUE,
GA_Disabled,nothl,
ButtonEnd,
- LAYOUT_AddChild, twin->gadgets[GID_LEFT] = ButtonObject,
- GA_ID,GID_LEFT,
- BUTTON_AutoButton,BAG_LFARROW,
- GA_RelVerify,TRUE,
- GA_Disabled,nothl, //(!tree->movable),
- ButtonEnd,
- LAYOUT_AddChild, twin->gadgets[GID_UP] = ButtonObject,
- GA_ID,GID_UP,
- BUTTON_AutoButton,BAG_UPARROW,
- GA_RelVerify,TRUE,
- GA_Disabled,nothl, //(!tree->movable),
- ButtonEnd,
- LAYOUT_AddChild, twin->gadgets[GID_DOWN] = ButtonObject,
- GA_ID,GID_DOWN,
- BUTTON_AutoButton,BAG_DNARROW,
- GA_RelVerify,TRUE,
- GA_Disabled,nothl, //(!tree->movable),
- ButtonEnd,
LAYOUT_AddChild, twin->gadgets[GID_DEL] = ButtonObject,
GA_ID,GID_DEL,
GA_Text,messages_get("TreeDelete"),
@@ -342,161 +534,89 @@
CHILD_WeightedHeight,0,
EndGroup,
EndWindow;
+ }
twin->win = (struct Window *)RA_OpenWindow(twin->objects[OID_MAIN]);
- twin->node = AddObject(window_list,AMINS_TVWINDOW);
- twin->node->objstruct = twin;
-}
+ GetAttr(WINDOW_HorizObject, twin->objects[OID_MAIN],
+ (ULONG *)&twin->objects[OID_HSCROLL]);
+ GetAttr(WINDOW_VertObject, twin->objects[OID_MAIN],
+ (ULONG *)&twin->objects[OID_VSCROLL]);
-/**
- * Launches a node using all known methods.
- *
- * \param node the node to launch
- * \return whether the node could be launched
- */
-bool ami_tree_launch_node(struct tree *tree, struct node *node)
-{
- struct node_element *element;
+ RefreshSetGadgetAttrs((APTR)twin->objects[OID_VSCROLL], twin->win, NULL,
+ GA_ID,OID_VSCROLL,
+ ICA_TARGET,ICTARGET_IDCMP,
+ TAG_DONE);
- assert(node);
+ RefreshSetGadgetAttrs((APTR)twin->objects[OID_HSCROLL], twin->win, NULL,
+ GA_ID,OID_HSCROLL,
+ ICA_TARGET,ICTARGET_IDCMP,
+ TAG_DONE);
- element = tree_find_element(node, TREE_ELEMENT_URL);
- if (element) {
- browser_window_create(element->text, NULL, 0, true, false);
- return true;
- }
+ twin->node = AddObject(window_list,AMINS_TVWINDOW);
+ twin->node->objstruct = twin;
-/* not implemented yet
- element = tree_find_element(node, TREE_ELEMENT_SSL);
- if (element) {
- ro_gui_cert_open(tree, node);
- return true;
- }
-*/
-
- return false;
+ ami_tree_resized(twin->tree, twin->max_width, twin->max_height, twin);
+ tree_set_redraw(twin->tree, true);
+ ami_tree_draw(twin);
}
void ami_tree_close(struct treeview_window *twin)
{
- twin->tree->handle = 0;
+ int i;
+
+ tree_set_redraw(twin->tree, false);
+ twin->win = NULL;
DisposeObject(twin->objects[OID_MAIN]);
- FreeListBrowserList(twin->listbrowser_list);
- FreeVec(twin->listbrowser_list);
- //free_browserlist(twin->listbrowser_list);
- DelObject(twin->node);
+ DelObjectNoFree(twin->node);
+ ami_free_layers(&twin->globals);
+
+ for(i=0;i<AMI_TREE_MENU_ITEMS;i++)
+ {
+ if(twin->menu_name[i] && (twin->menu_name[i] != NM_BARLABEL))
ami_utf8_free(twin->menu_name[i]);
+ }
+ FreeVec(twin->menu);
+ twin->menu = NULL;
+ if(twin->type == AMI_TREE_SSLCERT) ami_ssl_free(twin);
}
-void free_browserlist(struct List *list)
+void ami_tree_update_quals(struct treeview_window *twin)
{
- struct Node *node, *nextnode;
+ uint32 quals = 0;
- if(IsListEmpty(list)) return;
+ GetAttr(WINDOW_Qualifier, twin->objects[OID_MAIN], (uint32 *)&quals);
- node = GetHead(list);
+ twin->key_state = 0;
- do
- {
- nextnode = GetSucc(node);
-// FreeVec(node->ln_Name);
- FreeListBrowserNode(node);
- } while(node = nextnode);
-}
+ if((quals & IEQUALIFIER_LSHIFT) || (quals & IEQUALIFIER_RSHIFT))
+ {
+ twin->key_state |= BROWSER_MOUSE_MOD_1;
+ }
-void ami_add_elements(struct treeview_window *twin,struct node *root,WORD *gen)
-{
- struct Node *lbnode;
- struct tree *tree = twin->tree;
- struct node *tempnode;
- int generation=1;
- BOOL edit = FALSE;
- struct node_element *element=NULL,*element2=NULL,*element3=NULL;
- struct node *node;
- ULONG flags = 0;
- STRPTR text1 = "",text2 = "",text3 = "";
+ if(quals & IEQUALIFIER_CONTROL)
+ {
+ twin->key_state |= BROWSER_MOUSE_MOD_2;
+ }
- *gen = *gen + 1;
- for (node = root; node; node = node->next)
+ if((quals & IEQUALIFIER_LALT) || (quals & IEQUALIFIER_RALT))
{
- element = tree_find_element(node, TREE_ELEMENT_NAME);
- if(!element) element = tree_find_element(node, TREE_ELEMENT_TITLE);
- if(!element) element = tree_find_element(node, TREE_ELEMENT_SSL);
- if(element && element->text)
- {
- text1 = (char *)element->text;
- }
-
-/* Really, the second column needs axing - relevant data should appear in an
-area below the listview when items are selected */
-
- element2 = tree_find_element(node, TREE_ELEMENT_URL);
- if(!element2) element2 = tree_find_element(node, TREE_ELEMENT_VALUE);
- if(!element2) element2 = tree_find_element(node, TREE_ELEMENT_COMMENT);
-
- if(element2 && element2->text)
- {
- text2 = (char *)element2->text;
- }
- else
- {
- text2 = "";
- }
-
-// element = tree_find_element(node, TREE_ELEMENT_VISITS);
-
- flags = 0;
- /*if(node->expanded) */ flags = LBFLG_SHOWCHILDREN;
- if(node->folder) flags |= LBFLG_HASCHILDREN;
- if(!node->parent) flags |= LBFLG_HIDDEN;
-
- switch (element->type) {
- case NODE_ELEMENT_TEXT_PLUS_SPRITE:
- case NODE_ELEMENT_TEXT:
- if (lbnode = AllocListBrowserNode(3,
- LBNA_UserData,node,
- LBNA_Generation,*gen - 1,
- LBNA_Selected,node->selected,
- LBNA_Flags,flags,
- LBNA_Column, 0,
- LBNCA_CopyText,TRUE,
- LBNCA_MaxChars,256,
- LBNCA_Text, text1,
- LBNCA_Editable,node->editable,
- LBNA_Column, 1,
- LBNCA_CopyText,TRUE,
- LBNCA_MaxChars,256,
- LBNCA_Text, text2,
- LBNCA_Editable,FALSE,
- TAG_DONE))
- {
- AddTail(twin->listbrowser_list, lbnode);
- if(node == selectednode2) selectednode = lbnode;
- }
- break;
- }
-
- if (node->child)
- {
- ami_add_elements(twin,node->child,gen);
- }
+ twin->key_state |= BROWSER_MOUSE_MOD_3;
}
- *gen = *gen - 1;
}
BOOL ami_tree_event(struct treeview_window *twin)
{
/* return TRUE if window destroyed */
- ULONG class,result,relevent = 0;
- ULONG column;
+ ULONG class,result,storage = 0;
uint16 code;
struct MenuItem *item;
- struct node *treenode;
- struct Node *lbnode;
- struct node_element *element;
- char *text;
-// ULONG editcols[] = {TREE_ELEMENT_TITLE,TREE_ELEMENT_URL};
- static WORD gen=0;
+ ULONG menunum=0,itemnum=0,subnum=0;
+ int xs, ys, x, y;
+ struct IBox *bbox;
+ struct timeval curtime;
+ struct InputEvent *ie;
+ int nskey;
+ char fname[1024];
while((result = RA_HandleInput(twin->objects[OID_MAIN],&code)) != WMHI_LASTMSG)
{
@@ -505,126 +625,386 @@
case WMHI_GADGETUP:
switch(result & WMHI_GADGETMASK)
{
- case GID_TREEBROWSER:
- GetAttrs(twin->gadgets[GID_TREEBROWSER],
- LISTBROWSER_RelEvent,&relevent,
- TAG_DONE);
-
- switch(relevent)
+ case GID_OPEN:
+ if(twin->type == AMI_TREE_SSLCERT)
{
- case LBRE_DOUBLECLICK:
- GetAttr(LISTBROWSER_SelectedNode,twin->gadgets[GID_TREEBROWSER],(ULONG
*)&lbnode);
- GetListBrowserNodeAttrs(lbnode,
- LBNA_UserData,(ULONG *)&treenode,
- TAG_DONE);
- ami_tree_launch_node(twin->tree,treenode);
- break;
+ sslcert_accept(twin->ssl_data);
+ ami_tree_close(twin);
+ return TRUE;
+ }
+ else tree_launch_selected(twin->tree);
+ break;
- case LBRE_EDIT:
- GetAttrs(twin->gadgets[GID_TREEBROWSER],
- LISTBROWSER_SelectedNode,(ULONG *)&lbnode,
-// LISTBROWSER_RelColumn,(ULONG *)&column,
- TAG_DONE);
+ case GID_CANCEL:
+ sslcert_reject(twin->ssl_data);
+ ami_tree_close(twin);
+ return TRUE;
+ break;
- GetListBrowserNodeAttrs(lbnode,
- LBNA_UserData,(ULONG *)&treenode,
- TAG_DONE);
+ case GID_NEWF:
+ hotlist_add_folder();
+ break;
- element = tree_find_element(treenode,TREE_ELEMENT_TITLE);
- GetListBrowserNodeAttrs(lbnode,
- LBNA_Column,column,
- LBNCA_Text,(ULONG *)&text,
- TAG_DONE);
- element->text = (char *)strdup(text);
- tree_handle_node_element_changed(twin->tree, element);
- break;
+ case GID_NEWB:
+ hotlist_add_entry();
+ break;
- case LBRE_HIDECHILDREN:
- GetAttr(LISTBROWSER_SelectedNode,twin->gadgets[GID_TREEBROWSER],(ULONG
*)&lbnode);
- GetListBrowserNodeAttrs(lbnode,
- LBNA_UserData,(ULONG *)&treenode,
- TAG_DONE);
- tree_set_node_expanded(twin->tree, treenode, false);
+ case GID_DEL:
+ switch(twin->type)
+ {
+ case AMI_TREE_HISTORY:
+ history_global_delete_selected();
break;
-
- case LBRE_SHOWCHILDREN:
- GetAttr(LISTBROWSER_SelectedNode,twin->gadgets[GID_TREEBROWSER],(ULONG
*)&lbnode);
- GetListBrowserNodeAttrs(lbnode,
- LBNA_UserData,(ULONG *)&treenode,
- TAG_DONE);
- tree_set_node_expanded(twin->tree, treenode, true);
+ case AMI_TREE_COOKIES:
+ cookies_delete_selected();
break;
+ case AMI_TREE_HOTLIST:
+ hotlist_delete_selected();
+ break;
}
break;
+ }
+ break;
- case GID_OPEN:
- GetAttr(LISTBROWSER_SelectedNode,twin->gadgets[GID_TREEBROWSER],(ULONG
*)&lbnode);
- GetListBrowserNodeAttrs(lbnode,
- LBNA_UserData,(ULONG *)&treenode,
- TAG_DONE);
- ami_tree_launch_node(twin->tree,treenode);
- break;
+ case WMHI_MOUSEMOVE:
+ GetAttr(SPACE_AreaBox, twin->gadgets[GID_BROWSER], (ULONG *)&bbox);
- case GID_NEWF:
- GetAttr(LISTBROWSER_SelectedNode,twin->gadgets[GID_TREEBROWSER],(ULONG
*)&lbnode);
- if(lbnode)
- {
- GetListBrowserNodeAttrs(lbnode,
- LBNA_UserData,(ULONG *)&treenode,
- TAG_DONE);
- }
- else
- {
- treenode = twin->tree->root;
- }
+ GetAttr(SCROLLER_Top, twin->objects[OID_HSCROLL], (ULONG *)&xs);
+ x = twin->win->MouseX - bbox->Left + xs;
- tree_create_folder_node(treenode,(char *)messages_get("TreeNewFolder"));
+ GetAttr(SCROLLER_Top, twin->objects[OID_VSCROLL], (ULONG *)&ys);
+ y = twin->win->MouseY - bbox->Top + ys;
- ami_recreate_listbrowser(twin);
- break;
+ if((x >= xs) && (y >= ys) && (x < bbox->Width + xs)
&&
+ (y < bbox->Height + ys))
+ {
+ ami_tree_update_quals(twin);
- case GID_NEWB:
- ami_new_bookmark(twin);
- break;
+ if(twin->mouse_state & BROWSER_MOUSE_PRESS_1)
+ {
+ tree_mouse_action(twin->tree,
+ BROWSER_MOUSE_DRAG_1 | twin->key_state, x, y);
+ twin->mouse_state = BROWSER_MOUSE_HOLDING_1 |
+ BROWSER_MOUSE_DRAG_ON;
+ if(twin->drag_x == 0) twin->drag_x = x;
+ if(twin->drag_y == 0) twin->drag_y = y;
- case GID_UP:
- ami_move_node(twin,AMI_MOVE_UP);
- break;
+ }
+ else if(twin->mouse_state & BROWSER_MOUSE_PRESS_2)
+ {
+ tree_mouse_action(twin->tree,
+ BROWSER_MOUSE_DRAG_2 | twin->key_state, x, y);
+ twin->mouse_state = BROWSER_MOUSE_HOLDING_2 |
+ BROWSER_MOUSE_DRAG_ON;
+ if(twin->drag_x == 0) twin->drag_x = x;
+ if(twin->drag_y == 0) twin->drag_y = y;
+ }
+ else
+ {
+ tree_mouse_action(twin->tree,
+ twin->mouse_state | twin->key_state, x, y);
+ }
+ }
+ twin->lastclick.tv_sec = 0;
+ twin->lastclick.tv_usec = 0;
+ break;
- case GID_DOWN:
- ami_move_node(twin,AMI_MOVE_DOWN);
- break;
+ case WMHI_MOUSEBUTTONS:
+ GetAttr(SPACE_AreaBox, twin->gadgets[GID_BROWSER], (ULONG *)&bbox);
+ GetAttr(SCROLLER_Top, twin->objects[OID_HSCROLL], (ULONG *)&xs);
+ x = twin->win->MouseX - bbox->Left + xs;
+ GetAttr(SCROLLER_Top, twin->objects[OID_VSCROLL], (ULONG *)&ys);
+ y = twin->win->MouseY - bbox->Top + ys;
- case GID_LEFT:
- ami_move_node(twin,AMI_MOVE_OUT);
- break;
+ ami_tree_update_quals(twin);
- case GID_DEL:
- GetAttr(LISTBROWSER_SelectedNode,twin->gadgets[GID_TREEBROWSER],(ULONG
*)&lbnode);
- GetListBrowserNodeAttrs(lbnode,
- LBNA_UserData,(ULONG *)&treenode,
- TAG_DONE);
- tree_delete_node(twin->tree, treenode, false);
-/* We are recreating the list from scratch as there is no obvious easy way
- to delete children from a listbrowser list */
- ami_recreate_listbrowser(twin);
+ if((x >= xs) && (y >= ys) && (x < bbox->Width + xs)
&&
+ (y < bbox->Height + ys))
+ {
+ switch(code)
+ {
+ case SELECTDOWN:
+ twin->mouse_state = BROWSER_MOUSE_PRESS_1;
+ break;
+ case MIDDLEDOWN:
+ twin->mouse_state = BROWSER_MOUSE_PRESS_2;
+ break;
+ }
+ tree_mouse_action(twin->tree,
+ twin->mouse_state | twin->key_state, x, y);
+ }
+
+ if(x < xs) x = xs;
+ if(y < ys) y = ys;
+ if(x >= bbox->Width + xs) x = bbox->Width + xs - 1;
+ if(y >= bbox->Height + ys) y = bbox->Height + ys - 1;
+
+ switch(code)
+ {
+ case SELECTUP:
+ if(twin->mouse_state & BROWSER_MOUSE_PRESS_1)
+ {
+ CurrentTime(&curtime.tv_sec,&curtime.tv_usec);
+
+ twin->mouse_state = BROWSER_MOUSE_CLICK_1;
+
+ if(twin->lastclick.tv_sec)
+ {
+ if(DoubleClick(twin->lastclick.tv_sec,
+ twin->lastclick.tv_usec,
+ curtime.tv_sec, curtime.tv_usec))
+ twin->mouse_state |= BROWSER_MOUSE_DOUBLE_CLICK;
+ }
+ tree_mouse_action(twin->tree,
+ twin->mouse_state | twin->key_state, x, y);
+
+ if(twin->mouse_state & BROWSER_MOUSE_DOUBLE_CLICK)
+ {
+ twin->lastclick.tv_sec = 0;
+ twin->lastclick.tv_usec = 0;
+ }
+ else
+ {
+ twin->lastclick.tv_sec = curtime.tv_sec;
+ twin->lastclick.tv_usec = curtime.tv_usec;
+ }
+ }
+ else
+ {
+ tree_drag_end(twin->tree, twin->mouse_state,
+ twin->drag_x, twin->drag_y, x, y);
+ }
+ twin->mouse_state=0;
+ twin->drag_x = 0;
+ twin->drag_y = 0;
break;
+ case MIDDLEUP:
+ if(twin->mouse_state & BROWSER_MOUSE_PRESS_2)
+ {
+ tree_mouse_action(twin->tree,
+ BROWSER_MOUSE_CLICK_2 | twin->key_state, x, y);
+ }
+ else
+ {
+ tree_drag_end(twin->tree, twin->mouse_state,
+ twin->drag_x, twin->drag_y, x, y);
+ }
+ twin->mouse_state=0;
+ twin->drag_x = 0;
+ twin->drag_y = 0;
+ break;
}
break;
-/* no menus yet, copied in as will probably need it later
+ case WMHI_RAWKEY:
+ storage = result & WMHI_GADGETMASK;
+
+ GetAttr(WINDOW_InputEvent,twin->objects[OID_MAIN],(ULONG *)&ie);
+ nskey = ami_key_to_nskey(storage, ie);
+ tree_keypress(twin->tree, nskey);
+ break;
+
case WMHI_MENUPICK:
- item = ItemAddress(gwin->win->MenuStrip,code);
+ item = ItemAddress(twin->win->MenuStrip,code);
while (code != MENUNULL)
{
- ami_menupick(code,gwin);
+ menunum = MENUNUM(code);
+ itemnum = ITEMNUM(code);
+ subnum = SUBNUM(code);
+
+ switch(menunum)
+ {
+ case 0: // tree
+ switch(itemnum)
+ {
+ case 0: // export
+ if(AslRequestTags(savereq,
+ ASLFR_TitleText,messages_get("NetSurf"),
+ ASLFR_Screen,scrn,
+ ASLFR_InitialFile,"tree_export.html",
+ TAG_DONE))
+ {
+ strlcpy(&fname,savereq->fr_Drawer,1024);
+ AddPart(fname,savereq->fr_File,1024);
+ ami_update_pointer(twin->win,GUI_POINTER_WAIT);
+ if(twin->type == AMI_TREE_HISTORY)
+ history_global_export(fname);
+ else if(twin->type == AMI_TREE_HOTLIST)
+ hotlist_export(fname);
+ ami_update_pointer(twin->win,GUI_POINTER_DEFAULT);
+ }
+ break;
+
+ case 2: // expand
+ switch(subnum)
+ {
+ case 0: // all
+ switch(twin->type)
+ {
+ case AMI_TREE_HISTORY:
+ history_global_expand_all();
+ break;
+ case AMI_TREE_COOKIES:
+ cookies_expand_all();
+ break;
+ case AMI_TREE_HOTLIST:
+ hotlist_expand_all();
+ break;
+ }
+ break;
+
+ case 1: // lev 1
+ switch(twin->type)
+ {
+ case AMI_TREE_HISTORY:
+ history_global_expand_directories();
+ break;
+ case AMI_TREE_COOKIES:
+ cookies_expand_domains();
+ break;
+ case AMI_TREE_HOTLIST:
+ hotlist_expand_directories();
+ break;
+ }
+ break;
+
+ case 2: // lev 2
+ switch(twin->type)
+ {
+ case AMI_TREE_HISTORY:
+ history_global_expand_addresses();
+ break;
+ case AMI_TREE_COOKIES:
+ cookies_expand_cookies();
+ break;
+ case AMI_TREE_HOTLIST:
+ hotlist_expand_addresses();
+ break;
+ }
+ break;
+ }
+ break;
+
+ case 3: // collapse
+ switch(subnum)
+ {
+ case 0: // all
+ switch(twin->type)
+ {
+ case AMI_TREE_HISTORY:
+ history_global_collapse_all();
+ break;
+ case AMI_TREE_COOKIES:
+ cookies_collapse_all();
+ break;
+ case AMI_TREE_HOTLIST:
+ hotlist_collapse_all();
+ break;
+ }
+ break;
+
+ case 1: // lev 1
+ switch(twin->type)
+ {
+ case AMI_TREE_HISTORY:
+ history_global_collapse_directories();
+ break;
+ case AMI_TREE_COOKIES:
+ cookies_collapse_domains();
+ break;
+ case AMI_TREE_HOTLIST:
+ hotlist_collapse_directories();
+ break;
+ }
+ break;
+
+ case 2: // lev 2
+ switch(twin->type)
+ {
+ case AMI_TREE_HISTORY:
+ history_global_collapse_addresses();
+ break;
+ case AMI_TREE_COOKIES:
+ cookies_collapse_cookies();
+ break;
+ case AMI_TREE_HOTLIST:
+ hotlist_collapse_addresses();
+ break;
+ }
+ break;
+ }
+ break;
+
+ case 5: // close
+ ami_tree_close(twin);
+ return TRUE;
+ break;
+ }
+ break;
+
+ case 1: // edit
+ switch(itemnum)
+ {
+ case 0: // delete
+ switch(twin->type)
+ {
+ case AMI_TREE_HISTORY:
+ history_global_delete_selected();
+ break;
+ case AMI_TREE_COOKIES:
+ cookies_delete_selected();
+ break;
+ case AMI_TREE_HOTLIST:
+ hotlist_delete_selected();
+ break;
+ }
+ break;
+
+ case 2: // select all
+ switch(twin->type)
+ {
+ case AMI_TREE_HISTORY:
+ history_global_select_all();
+ break;
+ case AMI_TREE_COOKIES:
+ cookies_select_all();
+ break;
+ case AMI_TREE_HOTLIST:
+ hotlist_select_all();
+ break;
+ }
+ break;
+
+ case 3: // clear
+ switch(twin->type)
+ {
+ case AMI_TREE_HISTORY:
+ history_global_clear_selection();
+ break;
+ case AMI_TREE_COOKIES:
+ cookies_clear_selection();
+ break;
+ case AMI_TREE_HOTLIST:
+ hotlist_clear_selection();
+ break;
+ }
+ break;
+ }
+ break;
+ }
+
if(win_destroyed) break;
code = item->NextSelect;
}
break;
-*/
+ case WMHI_NEWSIZE:
+ ami_tree_draw(twin);
+ break;
+
case WMHI_CLOSEWINDOW:
+ if(twin->type == AMI_TREE_SSLCERT)
+ sslcert_reject(twin->ssl_data);
ami_tree_close(twin);
return TRUE;
break;
@@ -633,103 +1013,44 @@
return FALSE;
}
-void ami_move_node(struct treeview_window *twin,int move)
+void ami_tree_draw(struct treeview_window *twin)
{
- struct Node *lbnode = NULL;
- struct node *treenode,*moveto;
- bool before;
+ struct IBox *bbox;
+ int x, y;
- GetAttr(LISTBROWSER_SelectedNode,twin->gadgets[GID_TREEBROWSER],(ULONG
*)&lbnode);
+ if(!twin) return;
- if(!lbnode) return;
+ GetAttr(SCROLLER_Top, twin->objects[OID_HSCROLL], (ULONG *)&x);
+ GetAttr(SCROLLER_Top, twin->objects[OID_VSCROLL], (ULONG *)&y);
+ GetAttr(SPACE_AreaBox,twin->gadgets[GID_BROWSER],(ULONG *)&bbox);
- GetListBrowserNodeAttrs(lbnode,
- LBNA_UserData,(ULONG *)&treenode,
-// for multiselects? LBNA_Selected,(BOOL *)&sel,
- TAG_DONE);
-
- selectednode2 = treenode;
-
- tree_set_node_selected(twin->tree,twin->tree->root,false);
- tree_set_node_selected(twin->tree,treenode,true);
-
- switch(move)
- {
- case AMI_MOVE_UP:
- moveto = treenode->previous;
- before = true;
- break;
-
- case AMI_MOVE_DOWN:
- moveto = treenode->next;
- before = false;
- break;
-
- case AMI_MOVE_OUT:
- moveto = treenode->parent->previous;
- before = false;
- break;
- }
-
- if(!moveto) return;
-
- tree_delink_node(treenode);
- //tree_move_selected_nodes(twin->tree,moveto,before);
- tree_link_node(moveto,treenode,before);
- ami_recreate_listbrowser(twin);
- selectednode2 = NULL;
+ ami_tree_redraw_request(x, y, bbox->Width, bbox->Height, twin);
}
-void ami_new_bookmark(struct treeview_window *twin)
+void ami_tree_redraw_request(int x, int y, int width, int height, void *data)
{
- const struct url_data *data;
- struct Node *lbnode;
- struct node *treenode;
- char *url,*title;
+ struct treeview_window *twin = data;
+ struct IBox *bbox;
+ int pos_x, pos_y;
- GetAttr(LISTBROWSER_SelectedNode,twin->gadgets[GID_TREEBROWSER],(ULONG
*)&lbnode);
- if(lbnode)
- {
- GetListBrowserNodeAttrs(lbnode,
- LBNA_UserData,(ULONG *)&treenode,
- TAG_DONE);
- }
- else
- {
- treenode = twin->tree->root;
- }
+ if(!twin->win) return;
+// if(tree_get_redraw(twin->tree) == false) return;
- url = (char *)strdup("http://www.netsurf-browser.org");
+ ami_update_pointer(twin->win, GUI_POINTER_WAIT);
+ glob = &twin->globals;
- data = urldb_get_url_data(url);
- if (!data)
- {
- urldb_add_url(url);
- urldb_set_url_persistence(url,true);
- data = urldb_get_url_data(url);
- }
+ GetAttr(SPACE_AreaBox,twin->gadgets[GID_BROWSER],(ULONG *)&bbox);
+ GetAttr(SCROLLER_Top, twin->objects[OID_HSCROLL], (ULONG *)&pos_x);
+ GetAttr(SCROLLER_Top, twin->objects[OID_VSCROLL], (ULONG *)&pos_y);
- if (data)
- {
- title = data->title;
- tree_create_URL_node(treenode,url,data,title);
- ami_recreate_listbrowser(twin);
- }
-}
+ if(x - pos_x + width > bbox->Width) width = bbox->Width - (x - pos_x);
+ if(y - pos_y + height > bbox->Height) height = bbox->Height - (y - pos_y);
-void ami_recreate_listbrowser(struct treeview_window *twin)
-{
- static WORD gen=0;
+ tree_draw(twin->tree, -pos_x, -pos_y, x, y, width, height);
- SetGadgetAttrs(twin->gadgets[GID_TREEBROWSER],twin->win,NULL,
- LISTBROWSER_Labels,~0,
- TAG_DONE);
+ BltBitMapRastPort(twin->globals.bm, x - pos_x, y - pos_y, twin->win->RPort,
+ bbox->Left + x - pos_x, bbox->Top + y - pos_y, width, height, 0x0C0);
- FreeListBrowserList(twin->listbrowser_list);
- ami_add_elements(twin,twin->tree->root,&gen);
-
- RefreshSetGadgetAttrs(twin->gadgets[GID_TREEBROWSER],twin->win,NULL,
- LISTBROWSER_Labels,twin->listbrowser_list,
- LISTBROWSER_SelectedNode,selectednode,
- TAG_DONE);
+ ami_update_pointer(twin->win, GUI_POINTER_DEFAULT);
+ glob = &browserglob;
}
Index: amiga/cookies.h
===================================================================
--- amiga/cookies.h (revision 10834)
+++ amiga/cookies.h (working copy)
@@ -1,5 +1,5 @@
/*
- * Copyright 2008 Chris Young <chris(a)unsatisfactorysoftware.co.uk>
+ * Copyright 2008, 2009 Chris Young <chris(a)unsatisfactorysoftware.co.uk>
*
* This file is part of NetSurf,
http://www.netsurf-browser.org/
*
@@ -19,9 +19,10 @@
#ifndef AMIGA_COOKIES_H
#define AMIGA_COOKIES_H
#include "desktop/tree.h"
+#include "amiga/tree.h"
void ami_cookies_initialise(void);
void ami_cookies_free(void);
-struct tree *cookies_tree;
+struct treeview_window *cookies_window;
#endif
Index: amiga/tree.h
===================================================================
--- amiga/tree.h (revision 10834)
+++ amiga/tree.h (working copy)
@@ -1,5 +1,5 @@
/*
- * Copyright 2008 Chris Young <chris(a)unsatisfactorysoftware.co.uk>
+ * Copyright 2008, 2009 Chris Young <chris(a)unsatisfactorysoftware.co.uk>
*
* This file is part of NetSurf,
http://www.netsurf-browser.org/
*
@@ -22,15 +22,10 @@
#include <exec/types.h>
#include <intuition/classusr.h>
#include "amiga/gui.h"
+#include "desktop/tree.h"
+#include "desktop/sslcert.h"
-struct treeview_window {
- struct nsObject *node;
- struct Window *win;
- Object *objects[OID_LAST];
- struct Gadget *gadgets[GID_LAST];
- struct tree *tree;
- struct List *listbrowser_list;
-};
+struct treeview_window;
enum
{
@@ -40,15 +35,15 @@
AMI_TREE_SSLCERT
};
-enum
-{
- AMI_MOVE_UP,
- AMI_MOVE_DOWN,
- AMI_MOVE_OUT
-};
+struct treeview_window *ami_tree_create(uint8 flags,
+ struct sslcert_session_data *ssl_data);
+void ami_tree_destroy(struct treeview_window *twin);
+struct tree *ami_tree_get_tree(struct treeview_window *twin);
-void ami_open_tree(struct tree *tree,int type);
+void ami_tree_open(struct treeview_window *twin,int type);
void ami_tree_close(struct treeview_window *twin);
BOOL ami_tree_event(struct treeview_window *twin);
-void ami_recreate_listbrowser(struct treeview_window *twin);
+
+extern const struct treeview_table ami_tree_callbacks;
+
#endif
Index: amiga/menu.c
===================================================================
--- amiga/menu.c (revision 10834)
+++ amiga/menu.c (working copy)
@@ -41,6 +41,11 @@
#include "amiga/iff_dr2d.h"
#include "amiga/clipboard.h"
#include "amiga/gui_options.h"
+#include "desktop/tree_url_node.h"
+#include <classes/window.h>
+#include <proto/intuition.h>
+#include "desktop/hotlist.h"
+#include <proto/gadtools.h>
#include "amiga/print.h"
#include "amiga/download.h"
@@ -61,29 +66,37 @@
const char * const verdate;
static struct Hook aslhookfunc;
-void ami_menu_scan(struct tree *tree,struct NewMenu *menu);
-void ami_menu_scan_2(struct tree *tree,struct node *root,WORD *gen,ULONG *item,struct
NewMenu *menu);
-void ami_menu_arexx_scan(struct NewMenu *menu);
+ULONG ami_menu_scan(struct tree *tree, bool count, struct gui_window_2 *gwin);
+void ami_menu_scan_2(struct tree *tree, struct node *root, WORD *gen,
+ ULONG *item, bool count, struct gui_window_2 *gwin);
+void ami_menu_arexx_scan(struct gui_window_2 *gwin);
static const ULONG ami_asl_mime_hook(struct Hook *mh,struct FileRequester *fr,struct
AnchorPathOld *ap);
-void ami_free_menulabs(void)
+void ami_free_menulabs(struct gui_window_2 *gwin)
{
int i;
- for(i=0;i<=AMI_MENU_MAX;i++)
+ for(i=0;i<=AMI_MENU_AREXX_MAX;i++)
{
- if(menulab[i] && (menulab[i] != NM_BARLABEL)) ami_utf8_free(menulab[i]);
+ if(gwin->menulab[i] && (gwin->menulab[i] != NM_BARLABEL))
+ ami_utf8_free(gwin->menulab[i]);
+
+ gwin->menulab[i] = NULL;
+ gwin->menukey[i] = 0;
}
- for(i=AMI_MENU_MAX+1;i<=AMI_MENU_AREXX_MAX;i++)
- {
- if(menulab[i] && (menulab[i] != NM_BARLABEL)) free(menulab[i]);
- }
+ FreeVec(gwin->menutype);
+ FreeVec(gwin->menu);
+
+ gwin->menutype = NULL;
+ gwin->menu = NULL;
}
-void ami_init_menulabs(void)
+void ami_init_menulabs(struct gui_window_2 *gwin)
{
+ int i;
+
menulab[0] = ami_utf8_easy((char *)messages_get("Project"));
menulab[1] = ami_utf8_easy((char *)messages_get("NewWindowNS"));
menulab[2] = ami_utf8_easy((char *)messages_get("NewTab"));
@@ -128,18 +141,52 @@
menulab[41] = ami_utf8_easy((char *)messages_get("HotlistShowNS"));
menulab[42] = NM_BARLABEL;
- menulab[AMI_MENU_HOTLIST_MAX] = ami_utf8_easy((char
*)messages_get("Settings"));
- menulab[AMI_MENU_HOTLIST_MAX+1] = ami_utf8_easy((char
*)messages_get("SettingsEdit"));
- menulab[AMI_MENU_HOTLIST_MAX+2] = NM_BARLABEL;
- menulab[AMI_MENU_HOTLIST_MAX+3] = ami_utf8_easy((char
*)messages_get("SnapshotWindow"));
- menulab[AMI_MENU_HOTLIST_MAX+4] = ami_utf8_easy((char
*)messages_get("SettingsSave"));
- menulab[AMI_MENU_HOTLIST_MAX+5] = ami_utf8_easy((char
*)messages_get("ARexx"));
- menulab[AMI_MENU_HOTLIST_MAX+6] = ami_utf8_easy((char
*)messages_get("ARexxExecute"));
- menulab[AMI_MENU_HOTLIST_MAX+7] = NM_BARLABEL;
+ gwin->menutype = AllocVec(AMI_MENU_AREXX_MAX + 1, MEMF_PRIVATE | MEMF_CLEAR);
+
+ for(i=0;i <= AMI_MENU_AREXX_MAX;i++)
+ {
+ gwin->menutype[i] = NM_IGNORE;
+ gwin->menulab[i] = NULL;
+ }
+
+ gwin->menutype[AMI_MENU_HOTLIST_MAX + 1] = NM_TITLE;
+ gwin->menulab[AMI_MENU_HOTLIST_MAX + 1] = ami_utf8_easy((char
*)messages_get("Settings"));
+ gwin->menutype[AMI_MENU_HOTLIST_MAX + 2] = NM_ITEM;
+ gwin->menulab[AMI_MENU_HOTLIST_MAX + 2] = ami_utf8_easy((char
*)messages_get("SettingsEdit"));
+ gwin->menutype[AMI_MENU_HOTLIST_MAX + 3] = NM_ITEM;
+ gwin->menulab[AMI_MENU_HOTLIST_MAX + 3] = NM_BARLABEL;
+ gwin->menutype[AMI_MENU_HOTLIST_MAX + 4] = NM_ITEM;
+ gwin->menulab[AMI_MENU_HOTLIST_MAX + 4] = ami_utf8_easy((char
*)messages_get("SnapshotWindow"));
+ gwin->menutype[AMI_MENU_HOTLIST_MAX + 5] = NM_ITEM;
+ gwin->menulab[AMI_MENU_HOTLIST_MAX + 5] = ami_utf8_easy((char
*)messages_get("SettingsSave"));
+ gwin->menutype[AMI_MENU_HOTLIST_MAX + 6] = NM_TITLE;
+ gwin->menulab[AMI_MENU_HOTLIST_MAX + 6] = ami_utf8_easy((char
*)messages_get("ARexx"));
+ gwin->menutype[AMI_MENU_HOTLIST_MAX + 7] = NM_ITEM;
+ gwin->menulab[AMI_MENU_HOTLIST_MAX + 7] = ami_utf8_easy((char
*)messages_get("ARexxExecute"));
+ gwin->menutype[AMI_MENU_HOTLIST_MAX + 8] = NM_ITEM;
+ gwin->menulab[AMI_MENU_HOTLIST_MAX + 8] = NM_BARLABEL;
+
+ gwin->menutype[AMI_MENU_AREXX_MAX] = NM_END;
}
-struct NewMenu *ami_create_menu(ULONG type)
+void ami_menu_refresh(struct gui_window_2 *gwin)
{
+ SetAttrs(gwin->objects[OID_MAIN],
+ WINDOW_NewMenu, NULL,
+ TAG_DONE);
+
+ ami_free_menulabs(gwin);
+ ami_create_menu(BROWSER_WINDOW_NORMAL, gwin);
+
+ SetAttrs(gwin->objects[OID_MAIN],
+ WINDOW_NewMenu, gwin->menu,
+ TAG_DONE);
+
+ schedule(6000,(void *)ami_menu_refresh,gwin);
+}
+
+struct NewMenu *ami_create_menu(ULONG type, struct gui_window_2 *gwin)
+{
int i;
ULONG menuflags = 0;
STATIC struct NewMenu menu[] = {
@@ -257,30 +304,36 @@
{ NM_END,0,0,0,0,0,},
};
+ ami_init_menulabs(gwin);
+ gwin->menu = AllocVec(sizeof(struct NewMenu) * (AMI_MENU_AREXX_MAX + 1),
MEMF_CLEAR);
+
if(type != BROWSER_WINDOW_NORMAL)
{
menuflags = NM_ITEMDISABLED;
}
- for(i=0;i<=AMI_MENU_MAX;i++)
+ for(i=0;i<=AMI_MENU_AREXX_MAX;i++)
{
- menu[i].nm_Label = menulab[i];
+ gwin->menu[i].nm_Type = gwin->menutype[i];
+ gwin->menu[i].nm_Label = gwin->menulab[i];
+ if(gwin->menukey[i]) gwin->menu[i].nm_CommKey = &gwin->menukey[i];
+ gwin->menu[i].nm_Flags = 0;
}
- menu[1].nm_Flags = menuflags;
- menu[2].nm_Flags = menuflags;
- menu[12].nm_Flags = menuflags;
- menu[13].nm_Flags = menuflags;
+ gwin->menu[1].nm_Flags = menuflags;
+ gwin->menu[2].nm_Flags = menuflags;
+ gwin->menu[12].nm_Flags = menuflags;
+ gwin->menu[13].nm_Flags = menuflags;
#ifndef WITH_PDF_EXPORT
- menu[9].nm_Flags = NM_ITEMDISABLED;
+ gwin->menu[9].nm_Flags = NM_ITEMDISABLED;
#endif
+ ami_menu_scan(ami_tree_get_tree(hotlist_window), false, gwin);
+ ami_menu_arexx_scan(gwin);
+
if(!menualreadyinit)
{
- ami_menu_scan(hotlist,menu);
- ami_menu_arexx_scan(&menu);
-
aslhookfunc.h_Entry = (void *)&ami_asl_mime_hook;
aslhookfunc.h_SubEntry = NULL;
aslhookfunc.h_Data = NULL;
@@ -288,10 +341,16 @@
menualreadyinit = TRUE;
}
- return(menu);
+/* Set up scheduler to refresh the hotlist menu
+ Disabled as it causes everything to slow down to a halt after
+ several iterations
+ schedule(6000,(void *)ami_menu_refresh,gwin);
+*/
+
+ return(gwin->menu);
}
-void ami_menu_arexx_scan(struct NewMenu *menu)
+void ami_menu_arexx_scan(struct gui_window_2 *gwin)
{
int item = AMI_MENU_AREXX;
BPTR lock = 0;
@@ -328,18 +387,18 @@
if(EAD_IS_FILE(ead))
{
- menu[item].nm_Type = NM_ITEM;
+ gwin->menu[item].nm_Type = NM_ITEM;
if(ead->ed_Comment[0] != '\0')
{
- menulab[item] = (char *)strdup(ead->ed_Comment);
+ gwin->menulab[item] = (char *)strdup(ead->ed_Comment);
}
else
{
- menulab[item] = (char *)strdup(ead->ed_Name);
+ gwin->menulab[item] = (char *)strdup(ead->ed_Name);
}
- menu[item].nm_Label = menulab[item];
- menu[item].nm_UserData = (char *)strdup(ead->ed_Name);
+ gwin->menu[item].nm_Label = gwin->menulab[item];
+ gwin->menu[item].nm_UserData = (char *)strdup(ead->ed_Name);
item++;
}
@@ -351,31 +410,37 @@
}
UnLock(lock);
}
+
+ gwin->menu[item].nm_Type = NM_END;
+ gwin->menu[item].nm_Label = NULL;
}
-void ami_menu_scan(struct tree *tree,struct NewMenu *menu)
+ULONG ami_menu_scan(struct tree *tree, bool count, struct gui_window_2 *gwin)
{
- struct node *root = tree->root->child;
- struct node_element *element=NULL;
+ struct node *root = tree_node_get_child(tree_get_root(tree));
struct node *node;
+ struct node_element *element;
static WORD gen = 0;
static ULONG item;
item = AMI_MENU_HOTLIST;
- for (node = root; node; node = node->next)
+ for (node = root; node; node = tree_node_get_next(node))
{
- element = tree_find_element(node, TREE_ELEMENT_NAME);
- if(!element) element = tree_find_element(node, TREE_ELEMENT_TITLE);
- if(element && (strcmp(element->text,"Menu")==0))
+ element = tree_node_find_element(node, TREE_ELEMENT_TITLE, NULL);
+ if(!element) element = tree_node_find_element(node, TREE_ELEMENT_TITLE, NULL);
+ if(element &&
(strcmp(tree_node_element_get_text(element),"Menu")==0))
{
// found menu
- ami_menu_scan_2(tree,node->child,&gen,&item,menu);
+ ami_menu_scan_2(tree,tree_node_get_child(node),&gen,&item,count,gwin);
}
}
+
+ return(item - AMI_MENU_HOTLIST);
}
-void ami_menu_scan_2(struct tree *tree,struct node *root,WORD *gen,ULONG *item,struct
NewMenu *menu)
+void ami_menu_scan_2(struct tree *tree,struct node *root,WORD *gen,
+ ULONG *item, bool count, struct gui_window_2 *gwin)
{
struct node *tempnode;
struct node_element *element=NULL;
@@ -383,38 +448,39 @@
*gen = *gen + 1;
- for (node = root; node; node = node->next)
+ for (node = root; node; node = tree_node_get_next(node))
{
- element = tree_find_element(node, TREE_ELEMENT_TITLE);
-
if((*gen > 0) && (*gen < 3))
{
- if(*item >= AMI_MENU_HOTLIST_MAX) return;
+// if(*item >= AMI_MENU_HOTLIST_MAX) return;
- if(*gen == 1) menu[*item].nm_Type = NM_ITEM;
- if(*gen == 2) menu[*item].nm_Type = NM_SUB;
-
- if(strcmp(element->text,"--"))
+ if(!count)
{
- menulab[*item] = ami_utf8_easy((char *)element->text);
- }
- else
- {
- menulab[*item] = NM_BARLABEL;
- }
+ if(*gen == 1) gwin->menu[*item].nm_Type = NM_ITEM;
+ if(*gen == 2) gwin->menu[*item].nm_Type = NM_SUB;
- menu[*item].nm_Label = menulab[*item];
+ if(strcmp(tree_url_node_get_title(node),"--"))
+ {
+ gwin->menulab[*item] = ami_utf8_easy((char *)tree_url_node_get_title(node));
+ }
+ else
+ {
+ gwin->menulab[*item] = NM_BARLABEL;
+ }
- element = tree_find_element(node, TREE_ELEMENT_URL);
- if(element && element->text) menu[*item].nm_UserData = (void
*)element->text;
- if(node->folder && (!node->child)) menu[*item].nm_Flags =
NM_ITEMDISABLED;
+ gwin->menu[*item].nm_Label = gwin->menulab[*item];
+ gwin->menu[*item].nm_UserData = (void *)tree_url_node_get_url(node);
+ if(tree_node_is_folder(node) && (!tree_node_get_child(node)))
+ gwin->menu[*item].nm_Flags = NM_ITEMDISABLED;
+ }
+
*item = *item + 1;
}
- if (node->child)
+ if (tree_node_get_child(node))
{
- ami_menu_scan_2(tree,node->child,gen,item,menu);
+ ami_menu_scan_2(tree,tree_node_get_child(node),gen,item,count,gwin);
}
}
@@ -698,11 +764,11 @@
break;
case 3: // global history
- ami_open_tree(global_history_tree,AMI_TREE_HISTORY);
+ ami_tree_open(global_history_window,AMI_TREE_HISTORY);
break;
case 5: // cookies tree
- ami_open_tree(cookies_tree,AMI_TREE_COOKIES);
+ ami_tree_open(cookies_window,AMI_TREE_COOKIES);
break;
case 7: // size
@@ -736,12 +802,18 @@
switch(itemnum)
{
case 0: // add
- ami_hotlist_add(hotlist->root,gwin->bw->current_content);
- options_save_tree(hotlist,option_hotlist_file,messages_get("TreeHotlist"));
+ if (bw == NULL ||
+ bw->current_content
+ == NULL ||
+ bw->current_content->url
+ == NULL)
+ break;
+ hotlist_add_page(gwin->bw->
+ current_content->url);
break;
case 1: // show
- ami_open_tree(hotlist,AMI_TREE_HOTLIST);
+ ami_tree_open(hotlist_window, AMI_TREE_HOTLIST);
break;
default: // bookmarks
Index: amiga/menu.h
===================================================================
--- amiga/menu.h (revision 10834)
+++ amiga/menu.h (working copy)
@@ -19,12 +19,12 @@
#ifndef AMIGA_MENU_H
#define AMIGA_MENU_H
#include <exec/types.h>
-#include "amiga/gui.h"
#include <intuition/intuition.h>
/* Number of hotlist items, menu structure needs to be changed in ami_create_menu()
* if this value is changed. */
-#define AMI_HOTLIST_ITEMS 40
+#define AMI_HOTLIST_ITEMS 60
+//gwin->hotlist_items
/* Maximum number of menu items - first value is number of static items
* (ie. everything not intially defined as NM_IGNORE) */
@@ -61,11 +61,11 @@
#define AMI_MENU_CLEAR FULLMENUNUM(1,5,0)
#define AMI_MENU_FIND FULLMENUNUM(2,0,0)
-char *menulab[AMI_MENU_AREXX_MAX+1];
+struct gui_window_2;
-struct NewMenu *ami_create_menu(ULONG type);
-void ami_init_menulabs(void);
-void ami_free_menulabs(void);
+void ami_free_menulabs(struct gui_window_2 *gwin);
+struct NewMenu *ami_create_menu(ULONG type, struct gui_window_2 *gwin);
+void ami_menu_refresh(struct gui_window_2 *gwin);
void ami_menupick(ULONG code,struct gui_window_2 *gwin,struct MenuItem *item);
void ami_menu_update_disabled(struct gui_window *g, hlcache_handle *c);
#endif
Index: amiga/gui.c
===================================================================
--- amiga/gui.c (revision 10834)
+++ amiga/gui.c (working copy)
@@ -143,6 +143,8 @@
struct MsgPort *applibport = NULL;
ULONG applibsig = 0;
+const char tree_directory_icon_name[100];
+const char tree_content_icon_name[100];
extern colour scroll_widget_fg_colour;
extern colour scroll_widget_bg_colour;
extern colour scroll_widget_arrow_colour;
@@ -324,9 +326,6 @@
if((!option_url_file) || (option_url_file[0] == '\0'))
option_url_file = (char *)strdup("PROGDIR:Resources/URLs");
- if((!option_recent_file) || (option_recent_file[0] == '\0'))
- option_recent_file = (char *)strdup("PROGDIR:Resources/Recent");
-
/*
if((!option_cookie_jar) || (option_cookie_jar[0] == '\0'))
option_cookie_jar = (char *)strdup("PROGDIR:Resources/CookieJar");
@@ -462,15 +461,6 @@
urldb_load(option_url_file);
urldb_load_cookies(option_cookie_file);
- if(lock = Lock(option_hotlist_file,SHARED_LOCK))
- {
- UnLock(lock);
- hotlist = options_load_tree(option_hotlist_file);
- }
-
- if(!hotlist) ami_hotlist_init(&hotlist);
- ami_global_history_initialise();
- ami_cookies_initialise();
save_complete_init();
ami_theme_init();
ami_init_mouse_pointers();
@@ -567,6 +557,18 @@
notalreadyrunning = ami_arexx_init();
+ /* Treeview init code ends up calling a font function which needs this */
+ browserglob.scale = 1.0;
+ glob = &browserglob;
+ /**/
+
+ ami_get_theme_filename(&tree_directory_icon_name,"theme_list_folder",true);
+ ami_get_theme_filename(&tree_content_icon_name,"theme_list_content",true);
+ ami_hotlist_initialise();
+ ami_cookies_initialise();
+ ami_global_history_initialise();
+ sslcert_init();
+
search_web_provider_details(option_search_provider);
if(argc) // argc==0 is started from wb
@@ -1326,7 +1328,7 @@
case 'h':
if(option_kiosk_mode == false)
- ami_open_tree(hotlist,AMI_TREE_HOTLIST);
+ ami_tree_open(hotlist_window, AMI_TREE_HOTLIST);
break;
/* The following aren't available from the menu at the moment */
@@ -1996,11 +1998,10 @@
urldb_save(option_url_file);
urldb_save_cookies(option_cookie_file);
- options_save_tree(hotlist,option_hotlist_file,messages_get("TreeHotlist"));
- void ami_global_history_save();
-
+ ami_hotlist_free();
ami_cookies_free();
ami_global_history_free();
+ sslcert_cleanup();
hubbub_finalise(ns_realloc,NULL);
@@ -2027,7 +2028,6 @@
FreeVec(nsscreentitle);
if(option_context_menu) ami_context_menu_free();
- ami_free_menulabs();
ami_mouse_pointers_free();
ami_clipboard_free();
@@ -2351,7 +2351,7 @@
{
ULONG addtabclosegadget = TAG_IGNORE;
- menu = ami_create_menu(bw->browser_window_type);
+ menu = ami_create_menu(bw->browser_window_type, gwin->shared);
NewList(&gwin->shared->tab_list);
gwin->tab_node = AllocClickTabNode(TNA_Text,messages_get("NetSurf"),
@@ -2383,28 +2383,28 @@
gwin->shared->helphints[GID_ADDTAB] =
remove_escape_chars(messages_get("HelpAddTab"), true);
- ami_get_theme_filename(nav_west,"theme_nav_west");
- ami_get_theme_filename(nav_west_s,"theme_nav_west_s");
- ami_get_theme_filename(nav_west_g,"theme_nav_west_g");
- ami_get_theme_filename(nav_east,"theme_nav_east");
- ami_get_theme_filename(nav_east_s,"theme_nav_east_s");
- ami_get_theme_filename(nav_east_g,"theme_nav_east_g");
- ami_get_theme_filename(stop,"theme_stop");
- ami_get_theme_filename(stop_s,"theme_stop_s");
- ami_get_theme_filename(stop_g,"theme_stop_g");
- ami_get_theme_filename(reload,"theme_reload");
- ami_get_theme_filename(reload_s,"theme_reload_s");
- ami_get_theme_filename(reload_g,"theme_reload_g");
- ami_get_theme_filename(home,"theme_home");
- ami_get_theme_filename(home_s,"theme_home_s");
- ami_get_theme_filename(home_g,"theme_home_g");
- ami_get_theme_filename(closetab,"theme_closetab");
- ami_get_theme_filename(closetab_s,"theme_closetab_s");
- ami_get_theme_filename(closetab_g,"theme_closetab_g");
- ami_get_theme_filename(addtab,"theme_addtab");
- ami_get_theme_filename(addtab_s,"theme_addtab_s");
- ami_get_theme_filename(addtab_g,"theme_addtab_g");
- ami_get_theme_filename(tabthrobber,"theme_tab_loading");
+ ami_get_theme_filename(nav_west,"theme_nav_west",false);
+ ami_get_theme_filename(nav_west_s,"theme_nav_west_s",false);
+ ami_get_theme_filename(nav_west_g,"theme_nav_west_g",false);
+ ami_get_theme_filename(nav_east,"theme_nav_east",false);
+ ami_get_theme_filename(nav_east_s,"theme_nav_east_s",false);
+ ami_get_theme_filename(nav_east_g,"theme_nav_east_g",false);
+ ami_get_theme_filename(stop,"theme_stop",false);
+ ami_get_theme_filename(stop_s,"theme_stop_s",false);
+ ami_get_theme_filename(stop_g,"theme_stop_g",false);
+ ami_get_theme_filename(reload,"theme_reload",false);
+ ami_get_theme_filename(reload_s,"theme_reload_s",false);
+ ami_get_theme_filename(reload_g,"theme_reload_g",false);
+ ami_get_theme_filename(home,"theme_home",false);
+ ami_get_theme_filename(home_s,"theme_home_s",false);
+ ami_get_theme_filename(home_g,"theme_home_g",false);
+ ami_get_theme_filename(closetab,"theme_closetab",false);
+ ami_get_theme_filename(closetab_s,"theme_closetab_s",false);
+ ami_get_theme_filename(closetab_g,"theme_closetab_g",false);
+ ami_get_theme_filename(addtab,"theme_addtab",false);
+ ami_get_theme_filename(addtab_s,"theme_addtab_s",false);
+ ami_get_theme_filename(addtab_g,"theme_addtab_g",false);
+ ami_get_theme_filename(tabthrobber,"theme_tab_loading",false);
gwin->shared->objects[GID_ADDTAB_BM] = BitMapObject,
BITMAP_SourceFile, addtab,
@@ -2476,7 +2476,7 @@
IDCMP_GADGETUP | IDCMP_IDCMPUPDATE |
IDCMP_ACTIVEWINDOW | IDCMP_INTUITICKS |
IDCMP_EXTENDEDMOUSE | IDCMP_GADGETDOWN,
- WINDOW_NewMenu,menu,
+ WINDOW_NewMenu,gwin->shared->menu,
WINDOW_VertProp,1,
WINDOW_IDCMPHook,&gwin->shared->scrollerhook,
WINDOW_IDCMPHookBits,IDCMP_IDCMPUPDATE |
@@ -2928,6 +2928,7 @@
DisposeObject(g->shared->objects[OID_MAIN]);
+ ami_free_menulabs(g->shared);
free(g->shared->wintitle);
ami_utf8_free(g->shared->status);
FreeVec(g->shared->svbuffer);
Index: amiga/gui.h
===================================================================
--- amiga/gui.h (revision 10834)
+++ amiga/gui.h (working copy)
@@ -23,8 +23,10 @@
#include <intuition/classusr.h>
#include "desktop/browser.h"
#include <dos/dos.h>
+#include <devices/inputevent.h>
#include "desktop/gui.h"
#include "amiga/plotters.h"
+#include "amiga/menu.h"
enum
{
@@ -56,11 +58,7 @@
GID_PASS,
GID_LOGIN,
GID_CANCEL,
- GID_TREEBROWSER,
GID_OPEN,
- GID_LEFT,
- GID_UP,
- GID_DOWN,
GID_NEWF,
GID_NEWB,
GID_DEL,
@@ -98,6 +96,11 @@
ULONG oldv;
bool redraw_scroll;
bool new_content;
+ char *menulab[AMI_MENU_AREXX_MAX + 1];
+ char menukey[AMI_MENU_AREXX_MAX + 1];
+ UBYTE *menutype;
+ struct NewMenu *menu;
+ ULONG hotlist_items;
char *svbuffer;
char *status;
char *wintitle;
@@ -127,6 +130,7 @@
void ami_quit_netsurf(void);
void ami_do_redraw(struct gui_window_2 *g);
STRPTR ami_locale_langs(void);
+int ami_key_to_nskey(ULONG keycode, struct InputEvent *ie);
struct box *ami_text_box_at_point(struct gui_window_2 *gwin, ULONG *x, ULONG *y);
struct gui_window_2 *ami_window_at_pointer(void);
Index: amiga/object.c
===================================================================
--- amiga/object.c (revision 10834)
+++ amiga/object.c (working copy)
@@ -48,14 +48,24 @@
return(dtzo);
}
-void DelObject(struct nsObject *dtzo)
+void DelObjectInternal(struct nsObject *dtzo, BOOL free_obj)
{
Remove((struct Node *)dtzo);
- if(dtzo->objstruct) FreeVec(dtzo->objstruct);
+ if(dtzo->objstruct && free_obj) FreeVec(dtzo->objstruct);
FreeVec(dtzo);
dtzo = NULL;
}
+void DelObject(struct nsObject *dtzo)
+{
+ DelObjectInternal(dtzo, TRUE);
+}
+
+void DelObjectNoFree(struct nsObject *dtzo)
+{
+ DelObjectInternal(dtzo, FALSE);
+}
+
void FreeObjList(struct MinList *objlist)
{
struct nsObject *node;
Index: amiga/object.h
===================================================================
--- amiga/object.h (revision 10834)
+++ amiga/object.h (working copy)
@@ -48,6 +48,7 @@
struct MinList *NewObjList(void);
struct nsObject *AddObject(struct MinList *objlist,ULONG otype);
void DelObject(struct nsObject *dtzo);
+void DelObjectNoFree(struct nsObject *dtzo);
void FreeObjList(struct MinList *objlist);
#endif
Index: amiga/plotters.c
===================================================================
--- amiga/plotters.c (revision 10834)
+++ amiga/plotters.c (working copy)
@@ -91,7 +91,7 @@
void ami_cairo_set_solid(cairo_t *cr)
{
double dashes = 0;
-
+
cairo_set_dash(glob->cr, &dashes, 0, 0);
}
@@ -240,7 +240,7 @@
glob->rp.LinePtrn = PATT_DASH;
break;
}
-
+
SetRPAttrs(&glob->rp,
RPTAG_APenColor,
p96EncodeColor(RGBFB_A8B8G8R8, style->stroke_colour),
@@ -272,7 +272,7 @@
break;
}
- if (style->stroke_width == 0)
+ if (style->stroke_width == 0)
cairo_set_line_width(glob->cr, 1);
else
cairo_set_line_width(glob->cr, style->stroke_width);
@@ -337,13 +337,17 @@
break;
}
- if (style->stroke_width == 0)
+ if (style->stroke_width == 0)
cairo_set_line_width(glob->cr, 1);
else
cairo_set_line_width(glob->cr, style->stroke_width);
- cairo_move_to(glob->cr, x0 + 0.5, y0 + 0.5);
- cairo_line_to(glob->cr, x1 + 0.5, y1 + 0.5);
+ /* core expects horizontal and vertical lines to be on pixels, not
+ * between pixels */
+ cairo_move_to(current_cr, (x0 == x1) ? x0 + 0.5 : x0,
+ (y0 == y1) ? y0 + 0.5 : y0);
+ cairo_line_to(current_cr, (x0 == x1) ? x1 + 0.5 : x1,
+ (y0 == y1) ? y1 + 0.5 : y1);
cairo_stroke(glob->cr);
#endif
return true;
@@ -426,7 +430,7 @@
return true;
}
-bool ami_text(int x, int y, const char *text, size_t length,
+bool ami_text(int x, int y, const char *text, size_t length,
const plot_font_style_t *fstyle)
{
#ifdef AMI_PLOTTER_DEBUG
@@ -459,7 +463,7 @@
p96EncodeColor(RGBFB_A8B8G8R8, style->stroke_colour),
TAG_DONE);
- DrawEllipse(&glob->rp,x,y,radius,radius);
+ DrawEllipse(&glob->rp,x,y,radius,radius);
}
#else
if (style->fill_type != PLOT_OP_TYPE_NONE) {
Index: amiga/resources/Themes/AISS/Theme
===================================================================
--- amiga/resources/Themes/AISS/Theme (revision 10834)
+++ amiga/resources/Themes/AISS/Theme (working copy)
@@ -24,12 +24,8 @@
theme_addtab:*TBImages:list_add
theme_addtab_s:*TBImages:list_add
theme_addtab_g:*TBImages:list_add
-theme_list_folder_closed:*TBImages:list_folderfold
-theme_list_folder_open:*TBImages:list_folderunfold
-theme_list_bookmark:*TBImages:list_bookmark
-theme_list_cookie:*TBImages:list_abstract
-theme_list_history:*TBImages:list_archive
-theme_list_sslcert:*TBImages:list_crypt
+theme_list_folder:*TBImages:list_drawer
+theme_list_content:*TBImages:list_abstract
theme_throbber:Throbber
theme_throbber_frames:13
theme_throbber_delay:100
Index: amiga/resources/Themes/Default/Theme
===================================================================
--- amiga/resources/Themes/Default/Theme (revision 10834)
+++ amiga/resources/Themes/Default/Theme (working copy)
@@ -37,12 +37,8 @@
theme_addtab:
theme_addtab_s:
theme_addtab_g:
-theme_list_folder_closed:
-theme_list_folder_open:
-theme_list_bookmark:
-theme_list_cookie:
-theme_list_history:
-theme_list_sslcert:
+theme_list_folder:directory.png
+theme_list_content:content.png
theme_throbber:Throbber
theme_throbber_frames:9
theme_throbber_delay:100
Conflicted files
Removed files