summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Young <chris@unsatisfactorysoftware.co.uk>2017-01-08 01:09:41 +0000
committerChris Young <chris@unsatisfactorysoftware.co.uk>2017-01-08 01:09:41 +0000
commitbf3ba5c97bac5aa79c43153311ea0d3d5945bd4d (patch)
tree54f0c8052fcd22130b7523b6b97f641a817a6d1c
parentd1693c27c0d9658b655c158a9652f87683719325 (diff)
parent01e116ee1f5603ef6adeb365f403563a684a47b4 (diff)
downloadnetsurf-bf3ba5c97bac5aa79c43153311ea0d3d5945bd4d.tar.gz
netsurf-bf3ba5c97bac5aa79c43153311ea0d3d5945bd4d.tar.bz2
Complete Amiga corewindow implementation and migration from old treeviews
Merge branch 'chris/amiga-corewindow'
-rw-r--r--desktop/global_history.c1
-rw-r--r--frontends/amiga/Makefile4
-rw-r--r--frontends/amiga/arexx.c5
-rw-r--r--frontends/amiga/bitmap.c1
-rw-r--r--frontends/amiga/cookies.c2
-rw-r--r--frontends/amiga/corewindow.c241
-rw-r--r--frontends/amiga/corewindow.h29
-rw-r--r--frontends/amiga/desktop-tree.c353
-rw-r--r--frontends/amiga/desktop-tree.h88
-rw-r--r--frontends/amiga/file.c3
-rw-r--r--frontends/amiga/file.h4
-rw-r--r--frontends/amiga/gui.c25
-rw-r--r--[-rwxr-xr-x]frontends/amiga/history.c449
-rw-r--r--[-rwxr-xr-x]frontends/amiga/history.h16
-rw-r--r--[-rwxr-xr-x]frontends/amiga/hotlist.c520
-rw-r--r--[-rwxr-xr-x]frontends/amiga/hotlist.h22
-rw-r--r--frontends/amiga/menu.c11
-rw-r--r--frontends/amiga/tree.c1484
-rwxr-xr-xfrontends/amiga/tree.h47
19 files changed, 1198 insertions, 2107 deletions
diff --git a/desktop/global_history.c b/desktop/global_history.c
index b6f488228..a19349f51 100644
--- a/desktop/global_history.c
+++ b/desktop/global_history.c
@@ -803,6 +803,7 @@ nserror global_history_fini(void)
/* Destroy the global history treeview */
err = treeview_destroy(gh_ctx.tree);
+ gh_ctx.tree = NULL;
/* Free global history treeview entry fields */
for (i = 0; i < N_FIELDS; i++)
diff --git a/frontends/amiga/Makefile b/frontends/amiga/Makefile
index aa60207e2..985a085fc 100644
--- a/frontends/amiga/Makefile
+++ b/frontends/amiga/Makefile
@@ -36,7 +36,7 @@ MESSAGES_FILTER=ami
# ----------------------------------------------------------------------------
# sources purely for the Amiga build
-S_FRONTEND := gui.c tree.c history.c hotlist.c schedule.c file.c \
+S_FRONTEND := gui.c history.c hotlist.c schedule.c file.c \
misc.c bitmap.c font.c filetype.c utf8.c login.c memory.c \
plotters.c object.c menu.c save_pdf.c arexx.c version.c \
cookies.c ctxmenu.c clipboard.c help.c font_scan.c \
@@ -46,7 +46,7 @@ S_FRONTEND := gui.c tree.c history.c hotlist.c schedule.c file.c \
stringview/stringview.c stringview/urlhistory.c rtg.c \
agclass/amigaguide_class.c os3support.c font_diskfont.c \
selectmenu.c hash/xxhash.c font_cache.c font_bullet.c \
- nsoption.c desktop-tree.c corewindow.c
+ nsoption.c corewindow.c
# This is the final source build list
# Note this is deliberately *not* expanded here as common and image
diff --git a/frontends/amiga/arexx.c b/frontends/amiga/arexx.c
index b9702287b..7bb2f5882 100644
--- a/frontends/amiga/arexx.c
+++ b/frontends/amiga/arexx.c
@@ -40,7 +40,6 @@
#include "amiga/gui.h"
#include "amiga/download.h"
#include "amiga/hotlist.h"
-#include "amiga/tree.h"
#include "amiga/libs.h"
#include "amiga/misc.h"
#include "amiga/theme.h"
@@ -665,9 +664,9 @@ RXHOOKF(rx_hotlist)
cmd->ac_RC = 0;
if(strcasecmp((char *)cmd->ac_ArgList[0], "OPEN") == 0) {
- ami_tree_open(hotlist_window, AMI_TREE_HOTLIST);
+ ami_hotlist_present();
} else if(strcasecmp((char *)cmd->ac_ArgList[0], "CLOSE") == 0) {
- ami_tree_close(hotlist_window);
+ ami_hotlist_close();
}
}
diff --git a/frontends/amiga/bitmap.c b/frontends/amiga/bitmap.c
index 5b5d6bb1e..5fc772ba3 100644
--- a/frontends/amiga/bitmap.c
+++ b/frontends/amiga/bitmap.c
@@ -706,7 +706,6 @@ struct BitMap *ami_bitmap_get_native(struct bitmap *bitmap,
int width, int height, struct BitMap *friendbm)
{
if(bitmap == NULL) return NULL;
- LOG("Getting native BitMap for %p", bitmap);
if(__builtin_expect(ami_plot_screen_is_palettemapped() == true, 0)) {
return ami_bitmap_get_palettemapped(bitmap, width, height, friendbm);
diff --git a/frontends/amiga/cookies.c b/frontends/amiga/cookies.c
index 18ca425ec..f428881a4 100644
--- a/frontends/amiga/cookies.c
+++ b/frontends/amiga/cookies.c
@@ -258,7 +258,7 @@ static void ami_cookies_menulabs(struct ami_menu_data **md)
ami_menu_alloc_item(md, AMI_COOKIE_M_SNAPSHOT, NM_ITEM, "SnapshotWindow", 0, "TBImages:list_hold",
ami_cookies_menu_item_project_snapshot, NULL, 0);
ami_menu_alloc_item(md, AMI_COOKIE_M_BAR_P2, NM_ITEM, NM_BARLABEL, 0, NULL, NULL, NULL, 0);
- ami_menu_alloc_item(md, AMI_COOKIE_M_CLOSE, NM_ITEM, "CloseWindow", 0, "TBImages:list_cancel",
+ ami_menu_alloc_item(md, AMI_COOKIE_M_CLOSE, NM_ITEM, "CloseWindow", 'K', "TBImages:list_cancel",
ami_cookies_menu_item_project_close, NULL, 0);
ami_menu_alloc_item(md, AMI_COOKIE_M_EDIT, NM_TITLE, "Edit", 0, NULL, NULL, NULL, 0);
diff --git a/frontends/amiga/corewindow.c b/frontends/amiga/corewindow.c
index 1bfc5375b..1bfd6c4c6 100644
--- a/frontends/amiga/corewindow.c
+++ b/frontends/amiga/corewindow.c
@@ -59,6 +59,7 @@
#include <reaction/reaction_macros.h>
#include "amiga/corewindow.h"
+#include "amiga/drag.h"
#include "amiga/memory.h"
#include "amiga/misc.h"
#include "amiga/object.h"
@@ -106,13 +107,27 @@ ami_cw_coord_amiga_to_ns(struct ami_corewindow *ami_cw, int *restrict x, int *re
/**
* check if mouse has moved since position was stored
+ * @param ami_cw corewindow
+ * @param x current x position
+ * @param y current y position
+ * @param click true to check since last click, false since last drag (press)
* @return true if it has, false otherwise
*/
static bool
-ami_cw_mouse_moved(struct ami_corewindow *ami_cw, int x, int y)
+ami_cw_mouse_moved(struct ami_corewindow *ami_cw, int x, int y, bool click)
{
- if(abs(x - ami_cw->mouse_x_click) > 5) return true;
- if(abs(y - ami_cw->mouse_y_click) > 5) return true;
+ int mx, my;
+
+ if(click == true) {
+ mx = ami_cw->mouse_x_click;
+ my = ami_cw->mouse_y_click;
+ } else {
+ mx = ami_cw->drag_x_start;
+ my = ami_cw->drag_y_start;
+ }
+
+ if(abs(x - mx) > 5) return true;
+ if(abs(y - my) > 5) return true;
return false;
}
@@ -137,11 +152,10 @@ ami_cw_mouse_pos(struct ami_corewindow *ami_cw, int *restrict x, int *restrict y
xm -= bbox->Left;
ym -= bbox->Top;
- ami_gui_free_space_box(bbox);
-
if((xm < 0) || (ym < 0) || (xm > bbox->Width) || (ym > bbox->Height))
return false;
+ ami_gui_free_space_box(bbox);
ami_cw_scroller_top(ami_cw, &xs, &ys);
xm += xs;
@@ -451,6 +465,78 @@ HOOKF(void, ami_cw_idcmp_hook, Object *, object, struct IntuiMessage *)
}
}
+/**
+ * Drag start
+ */
+static void
+ami_cw_drag_start(struct ami_corewindow *ami_cw, int x, int y)
+{
+ if(ami_cw->dragging == true) return;
+
+ ami_cw->dragging = true;
+ ami_cw->drag_x_start = x;
+ ami_cw->drag_y_start = y;
+
+ switch(ami_cw->drag_status) {
+ case CORE_WINDOW_DRAG_SELECTION:
+ break;
+
+ case CORE_WINDOW_DRAG_MOVE:
+ ami_drag_icon_show(ami_cw->win, "project");
+ break;
+
+ default:
+ break;
+ }
+}
+
+/**
+ * Drag progress
+ */
+static void
+ami_cw_drag_progress(struct ami_corewindow *ami_cw, int x, int y)
+{
+ if(ami_cw->dragging == false) return;
+
+ switch(ami_cw->drag_status) {
+ case CORE_WINDOW_DRAG_SELECTION:
+ break;
+
+ case CORE_WINDOW_DRAG_MOVE:
+ ami_drag_icon_move();
+ break;
+
+ default:
+ break;
+ }
+}
+
+/**
+ * Drag end
+ */
+static void
+ami_cw_drag_end(struct ami_corewindow *ami_cw, int x, int y)
+{
+ if(ami_cw->dragging == false) return;
+
+ switch(ami_cw->drag_status) {
+ case CORE_WINDOW_DRAG_SELECTION:
+ break;
+
+ case CORE_WINDOW_DRAG_MOVE:
+ ami_drag_icon_close(ami_cw->win);
+ if((ami_cw != ami_window_at_pointer(AMINS_COREWINDOW)) && (ami_cw->drag_end != NULL)) {
+ ami_cw->drag_end(ami_cw, scrn->MouseX, scrn->MouseY);
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ ami_cw->drag_status = CORE_WINDOW_DRAG_NONE;
+ ami_cw->dragging = false;
+}
/**
* Main event loop for our core window
@@ -479,66 +565,110 @@ ami_cw_event(void *w)
switch(result & WMHI_CLASSMASK) {
case WMHI_MOUSEMOVE:
- if(ami_cw_mouse_pos(ami_cw, &x, &y)) {
- key_state = ami_gui_get_quals(ami_cw->objects[GID_CW_WIN]);
- ami_cw->mouse(ami_cw, ami_cw->mouse_state | key_state, x, y);
+ if(ami_cw_mouse_pos(ami_cw, &x, &y) == true) {
+ if(ami_cw_mouse_moved(ami_cw, x, y, false)) {
+ if(ami_cw->mouse_state & BROWSER_MOUSE_PRESS_1) {
+ /* Start button 1 drag */
+ ami_cw->mouse(ami_cw, BROWSER_MOUSE_DRAG_1, x, y);
+ /* Replace PRESS with HOLDING and declare drag in progress */
+ ami_cw->mouse_state = BROWSER_MOUSE_HOLDING_1 | BROWSER_MOUSE_DRAG_ON;
+ } else if(ami_cw->mouse_state & BROWSER_MOUSE_PRESS_2) {
+ /* Start button 2 drag */
+ ami_cw->mouse(ami_cw, BROWSER_MOUSE_DRAG_2, x, y);
+ /* Replace PRESS with HOLDING and declare drag in progress */
+ ami_cw->mouse_state = BROWSER_MOUSE_HOLDING_2 | BROWSER_MOUSE_DRAG_ON;
+ }
+ key_state = ami_gui_get_quals(ami_cw->objects[GID_CW_WIN]);
+ ami_cw->mouse(ami_cw, ami_cw->mouse_state | key_state, x, y);
+ if(ami_cw->mouse_state & BROWSER_MOUSE_DRAG_ON) {
+ ami_cw_drag_start(ami_cw, x, y);
+ }
+ } else {
+ key_state = ami_gui_get_quals(ami_cw->objects[GID_CW_WIN]);
+ ami_cw->mouse(ami_cw, ami_cw->mouse_state | key_state, x, y);
+ }
}
+ ami_cw_drag_progress(ami_cw, x, y);
break;
case WMHI_MOUSEBUTTONS:
- if(ami_cw_mouse_pos(ami_cw, &x, &y) == false)
- break;
-
- key_state = ami_gui_get_quals(ami_cw->objects[GID_CW_WIN]);
-
- switch(code) {
- case SELECTDOWN:
- ami_cw->mouse_state = BROWSER_MOUSE_PRESS_1;
- break;
-
- case MIDDLEDOWN:
- ami_cw->mouse_state = BROWSER_MOUSE_PRESS_2;
- break;
-
- case SELECTUP:
- if(ami_cw->mouse_state & BROWSER_MOUSE_PRESS_1) {
- CurrentTime((ULONG *)&curtime.tv_sec, (ULONG *)&curtime.tv_usec);
-
- ami_cw->mouse_state = BROWSER_MOUSE_CLICK_1;
-
- if(ami_cw->lastclick.tv_sec) {
- if((ami_cw_mouse_moved(ami_cw, x, y) == false) &&
- (DoubleClick(ami_cw->lastclick.tv_sec,
- ami_cw->lastclick.tv_usec,
- curtime.tv_sec, curtime.tv_usec)))
- ami_cw->mouse_state |= BROWSER_MOUSE_DOUBLE_CLICK;
+ if(ami_cw_mouse_pos(ami_cw, &x, &y) == true) {
+ key_state = ami_gui_get_quals(ami_cw->objects[GID_CW_WIN]);
+ switch(code) {
+ case SELECTDOWN:
+ ami_cw->mouse_state = BROWSER_MOUSE_PRESS_1;
+ ami_cw->drag_x_start = x;
+ ami_cw->drag_y_start = y;
+ break;
+
+ case MIDDLEDOWN:
+ ami_cw->mouse_state = BROWSER_MOUSE_PRESS_2;
+ ami_cw->drag_x_start = x;
+ ami_cw->drag_y_start = y;
+ break;
+
+ case SELECTUP:
+ if(ami_cw->mouse_state & BROWSER_MOUSE_PRESS_1) {
+ CurrentTime((ULONG *)&curtime.tv_sec, (ULONG *)&curtime.tv_usec);
+
+ ami_cw->mouse_state = BROWSER_MOUSE_CLICK_1;
+
+ if(ami_cw->lastclick.tv_sec) {
+ if((ami_cw_mouse_moved(ami_cw, x, y, true) == false) &&
+ (DoubleClick(ami_cw->lastclick.tv_sec,
+ ami_cw->lastclick.tv_usec,
+ curtime.tv_sec, curtime.tv_usec)))
+ ami_cw->mouse_state |= BROWSER_MOUSE_DOUBLE_CLICK;
+ }
+
+ ami_cw->mouse_x_click = x;
+ ami_cw->mouse_y_click = y;
+
+ if(ami_cw->mouse_state & BROWSER_MOUSE_DOUBLE_CLICK) {
+ ami_cw->lastclick.tv_sec = 0;
+ ami_cw->lastclick.tv_usec = 0;
+ } else {
+ ami_cw->lastclick.tv_sec = curtime.tv_sec;
+ ami_cw->lastclick.tv_usec = curtime.tv_usec;
+ }
}
- ami_cw->mouse_x_click = x;
- ami_cw->mouse_y_click = y;
+ ami_cw->mouse(ami_cw, ami_cw->mouse_state | key_state, x, y);
+ ami_cw->mouse_state = BROWSER_MOUSE_HOVER;
+ break;
- if(ami_cw->mouse_state & BROWSER_MOUSE_DOUBLE_CLICK) {
- ami_cw->lastclick.tv_sec = 0;
- ami_cw->lastclick.tv_usec = 0;
- } else {
- ami_cw->lastclick.tv_sec = curtime.tv_sec;
- ami_cw->lastclick.tv_usec = curtime.tv_usec;
- }
- }
+ case MIDDLEUP:
+ if(ami_cw->mouse_state & BROWSER_MOUSE_PRESS_2)
+ ami_cw->mouse_state = BROWSER_MOUSE_CLICK_2;
- ami_cw->mouse(ami_cw, ami_cw->mouse_state | key_state, x, y);
- ami_cw->mouse_state = BROWSER_MOUSE_HOVER;
- break;
+ ami_cw->mouse(ami_cw, ami_cw->mouse_state | key_state, x, y);
+ ami_cw->mouse_state = BROWSER_MOUSE_HOVER;
+ break;
+ }
- case MIDDLEUP:
- if(ami_cw->mouse_state & BROWSER_MOUSE_PRESS_2)
- ami_cw->mouse_state = BROWSER_MOUSE_CLICK_2;
+ if(ami_cw->mouse_state == BROWSER_MOUSE_HOVER) {
+ ami_cw_drag_end(ami_cw, x, y);
+ }
- ami_cw->mouse(ami_cw, ami_cw->mouse_state | key_state, x, y);
- ami_cw->mouse_state = BROWSER_MOUSE_HOVER;
- break;
+ ami_cw->mouse(ami_cw, ami_cw->mouse_state | key_state, x, y);
+ } else {
+ /* event is happening away from our corewindow area */
+ switch(code) {
+ case SELECTUP:
+ case MIDDLEUP:
+ ami_cw->mouse_state = BROWSER_MOUSE_HOVER;
+ break;
+
+ default:
+ break;
+ }
+
+ if(ami_cw->mouse_state == BROWSER_MOUSE_HOVER) {
+ ami_cw_drag_end(ami_cw, x, y);
+ ami_cw->mouse(ami_cw, ami_cw->mouse_state | key_state,
+ ami_cw->drag_x_start, ami_cw->drag_y_start); // placate core
+ }
}
- ami_cw->mouse(ami_cw, ami_cw->mouse_state | key_state, x, y);
break;
case WMHI_RAWKEY:
@@ -722,9 +852,10 @@ nserror ami_corewindow_init(struct ami_corewindow *ami_cw)
ami_cw->scroll_x_visible = true;
ami_cw->scroll_y_visible = true;
ami_cw->in_border_scroll = false;
+ ami_cw->dragging = false;
/* allocate drawing area etc */
- ami_init_layers(&ami_cw->gg, 0, 0, false);
+ ami_init_layers(&ami_cw->gg, 100, 100, false); // force tiles to save memory
ami_cw->gg.shared_pens = ami_AllocMinList();
ami_cw->deferred_rects = NewObjList();
diff --git a/frontends/amiga/corewindow.h b/frontends/amiga/corewindow.h
index 17af2498a..cfcd7fc5e 100644
--- a/frontends/amiga/corewindow.h
+++ b/frontends/amiga/corewindow.h
@@ -58,6 +58,10 @@ struct ami_corewindow {
int mouse_y_click;
int mouse_state;
+ bool dragging;
+ int drag_x_start;
+ int drag_y_start;
+
bool close_window; // set to true to close the window during event loop
APTR deferred_rects_pool;
@@ -129,6 +133,31 @@ struct ami_corewindow {
BOOL (*event)(struct ami_corewindow *ami_cw, ULONG result);
/**
+ * callback for drag end on Amiga core window
+ * ie. a drag *from* this window to a different window
+ *
+ * \param ami_cw The Amiga core window structure.
+ * \param x mouse x position **in screen co-ordinates**
+ * \param y mouse y position **in screen co-ordinates**
+ * \return NSERROR_OK on success otherwise apropriate error code
+ */
+ nserror (*drag_end)(struct ami_corewindow *ami_cw, int x, int y);
+
+ /**
+ * callback for icon drop on Amiga core window
+ * ie. a drag has ended *above* this window
+ * \todo this may not be very flexible but serves our current purposes
+ *
+ * \param ami_cw The Amiga core window structure.
+ * \param url url of dropped icon
+ * \param title title of dropped icon
+ * \param x mouse x position **in screen co-ordinates**
+ * \param y mouse y position **in screen co-ordinates**
+ * \return NSERROR_OK on success otherwise apropriate error code
+ */
+ nserror (*icon_drop)(struct ami_corewindow *ami_cw, struct nsurl *url, const char *title, int x, int y);
+
+ /**
* callback to close an Amiga core window
*
* \param ami_cw The Amiga core window structure.
diff --git a/frontends/amiga/desktop-tree.c b/frontends/amiga/desktop-tree.c
deleted file mode 100644
index 3fb41edd5..000000000
--- a/frontends/amiga/desktop-tree.c
+++ /dev/null
@@ -1,353 +0,0 @@
-/*
- * Copyright 2004 Richard Wilson <not_ginger_matt@users.sourceforge.net>
- * Copyright 2009 Paul Blokus <paul_pl@users.sourceforge.net>
- *
- * 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/>.
- */
-
-/** \file
- * deprecated compatibility layer for new treeview modules. Do not use.
- */
-
-#include <assert.h>
-#include <stdbool.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "utils/log.h"
-#include "utils/messages.h"
-#include "utils/utils.h"
-#include "utils/nsoption.h"
-#include "netsurf/misc.h"
-#include "netsurf/browser_window.h"
-#include "netsurf/core_window.h"
-#include "content/content.h"
-#include "content/hlcache.h"
-#include "desktop/gui_internal.h"
-#include "desktop/treeview.h"
-#include "desktop/hotlist.h"
-#include "desktop/cookie_manager.h"
-#include "desktop/global_history.h"
-#include "desktop/sslcert_viewer.h"
-
-#include "amiga/desktop-tree.h"
-
-struct tree {
- unsigned int flags; /* Tree flags */
- tree_drag_type drag;
- const struct treeview_table *callbacks;
- void *client_data; /* User assigned data for the callbacks */
-};
-
-
-struct sslcert_session_data *ssl_current_session = NULL;
-const char *tree_hotlist_path = NULL;
-
-static void treeview_test_redraw_request(struct core_window *cw,
- const struct rect *r)
-{
- struct tree *tree = (struct tree *)cw;
-
- tree->callbacks->redraw_request(r->x0, r->y0,
- r->x1 - r->x0, r->y1 - r->y0,
- tree->client_data);
-}
-
-static void treeview_test_update_size(struct core_window *cw,
- int width, int height)
-{
- struct tree *tree = (struct tree *)cw;
-
- tree->callbacks->resized(tree, width, height, tree->client_data);
-}
-
-static void treeview_test_scroll_visible(struct core_window *cw,
- const struct rect *r)
-{
-}
-
-static void treeview_test_get_window_dimensions(struct core_window *cw,
- int *width, int *height)
-{
- struct tree *tree = (struct tree *)cw;
-
- tree->callbacks->get_window_dimensions(width, height,
- tree->client_data);
-}
-
-static void treeview_test_drag_status(struct core_window *cw,
- core_window_drag_status ds)
-{
- struct tree *tree = (struct tree *)cw;
-
- switch (ds) {
- case CORE_WINDOW_DRAG_NONE:
- tree->drag = TREE_NO_DRAG;
- break;
-
- case CORE_WINDOW_DRAG_SELECTION:
- tree->drag = TREE_SELECT_DRAG;
- break;
-
- case CORE_WINDOW_DRAG_MOVE:
- tree->drag = TREE_MOVE_DRAG;
- break;
-
- case CORE_WINDOW_DRAG_TEXT_SELECTION:
- tree->drag = TREE_TEXTAREA_DRAG;
- break;
-
- default:
- break;
- }
-}
-
-struct core_window_callback_table cw_t = {
- .redraw_request = treeview_test_redraw_request,
- .update_size = treeview_test_update_size,
- .scroll_visible = treeview_test_scroll_visible,
- .get_window_dimensions = treeview_test_get_window_dimensions,
- .drag_status = treeview_test_drag_status
-};
-
-static bool treeview_test_init(struct tree *tree)
-{
- nserror err;
-
- switch (tree->flags) {
- case TREE_COOKIES:
- err = cookie_manager_init(&cw_t, (struct core_window *)tree);
- if (err != NSERROR_OK)
- guit->misc->warning("Couldn't init new cookie manager.", 0);
- break;
- case TREE_HISTORY:
- err = global_history_init(&cw_t, (struct core_window *)tree);
- if (err != NSERROR_OK)
- guit->misc->warning("Couldn't init new global history.", 0);
- break;
- case TREE_HOTLIST:
- err = hotlist_init(tree_hotlist_path);
- if (err != NSERROR_OK)
- guit->misc->warning("Couldn't init new hotlist.", 0);
- err = hotlist_manager_init(&cw_t, (struct core_window *)tree);
- if (err != NSERROR_OK)
- guit->misc->warning("Couldn't init hotlist manager.", 0);
- break;
- case TREE_SSLCERT:
- assert(ssl_current_session == NULL &&
- "Call sslcert_viewer_init directly, "
- "this compat. layer can't cope with simultanious "
- "sslcert viewers");
- err = sslcert_viewer_init(&cw_t, (struct core_window *)tree,
- ssl_current_session);
- if (err != NSERROR_OK)
- guit->misc->warning("Couldn't init new sslcert viewer.", 0);
- break;
- }
-
- return true;
-}
-
-static bool treeview_test_fini(struct tree *tree)
-{
- nserror err;
-
- switch (tree->flags) {
- case TREE_COOKIES:
- err = cookie_manager_fini();
- if (err != NSERROR_OK)
- guit->misc->warning("Couldn't finalise cookie manager.", 0);
- break;
- case TREE_HISTORY:
- err = global_history_fini();
- if (err != NSERROR_OK)
- guit->misc->warning("Couldn't finalise cookie manager.", 0);
- break;
- case TREE_HOTLIST:
- err = hotlist_fini(tree_hotlist_path);
- if (err != NSERROR_OK)
- guit->misc->warning("Couldn't finalise hotlist.", 0);
- break;
- case TREE_SSLCERT:
- assert(ssl_current_session != NULL &&
- "Can't use sslcert window after sslcert_viewer_fini()");
- err = sslcert_viewer_fini(ssl_current_session);
- ssl_current_session = NULL;
- if (err != NSERROR_OK)
- guit->misc->warning("Couldn't finalise sslcert viewer.", 0);
- break;
- }
-
- return true;
-}
-
-static bool treeview_test_redraw(struct tree *tree, int x, int y,
- int clip_x, int clip_y, int clip_width, int clip_height,
- const struct redraw_context *ctx)
-{
- struct rect clip;
-
- clip.x0 = clip_x;
- clip.y0 = clip_y;
- clip.x1 = clip_x + clip_width;
- clip.y1 = clip_y + clip_height;
-
- switch (tree->flags) {
- case TREE_SSLCERT:
- if (ssl_current_session != NULL) {
- sslcert_viewer_redraw(ssl_current_session, x, y, &clip, ctx);
- }
- return true;
- case TREE_COOKIES:
- cookie_manager_redraw(x, y, &clip, ctx);
- return true;
- case TREE_HISTORY:
- global_history_redraw(x, y, &clip, ctx);
- return true;
- case TREE_HOTLIST:
- hotlist_redraw(x, y, &clip, ctx);
- return true;
- }
-
- return false;
-}
-
-static bool treeview_test_mouse_action(struct tree *tree,
- browser_mouse_state mouse, int x, int y)
-{
- switch (tree->flags) {
- case TREE_SSLCERT:
- assert(ssl_current_session != NULL &&
- "Can't use sslcert window after sslcert_viewer_fini()");
- sslcert_viewer_mouse_action(ssl_current_session, mouse, x, y);
- return true;
- case TREE_COOKIES:
- cookie_manager_mouse_action(mouse, x, y);
- return true;
- case TREE_HISTORY:
- global_history_mouse_action(mouse, x, y);
- return true;
- case TREE_HOTLIST:
- hotlist_mouse_action(mouse, x, y);
- return true;
- }
-
- return false;
-}
-
-static bool treeview_test_keypress(struct tree *tree, uint32_t key)
-{
- switch (tree->flags) {
- case TREE_SSLCERT:
- assert(ssl_current_session != NULL &&
- "Can't use sslcert window after sslcert_viewer_fini()");
- sslcert_viewer_keypress(ssl_current_session, key);
- return true;
- case TREE_COOKIES:
- cookie_manager_keypress(key);
- return true;
- case TREE_HISTORY:
- global_history_keypress(key);
- return true;
- case TREE_HOTLIST:
- hotlist_keypress(key);
- return true;
- }
-
- return false;
-}
-
-/* -------------------------------------------------------------------------- */
-
-/** deprecated compatibility layer for new treeview modules. Do not use. */
-struct tree *tree_create(unsigned int flags,
- const struct treeview_table *callbacks, void *client_data)
-{
- struct tree *tree;
-
- tree = calloc(sizeof(struct tree), 1);
- if (tree == NULL) {
- LOG("calloc failed");
- guit->misc->warning(messages_get_errorcode(NSERROR_NOMEM), 0);
- return NULL;
- }
-
- tree->flags = flags;
- tree->drag = TREE_NO_DRAG;
- tree->callbacks = callbacks;
- tree->client_data = client_data;
-
- treeview_test_init(tree);
-
- return tree;
-}
-
-/** deprecated compatibility layer for new treeview modules. Do not use. */
-void tree_delete(struct tree *tree)
-{
- treeview_test_fini(tree);
- free(tree);
-}
-
-/** deprecated compatibility layer for new treeview modules. Do not use. */
-void tree_draw(struct tree *tree, int x, int y,
- int clip_x, int clip_y, int clip_width, int clip_height,
- const struct redraw_context *ctx)
-{
- assert(tree != NULL);
-
- treeview_test_redraw(tree, x, y, clip_x, clip_y,
- clip_width, clip_height, ctx);
-}
-
-/** deprecated compatibility layer for new treeview modules. Do not use. */
-bool tree_mouse_action(struct tree *tree, browser_mouse_state mouse, int x,
- int y)
-{
- assert(tree != NULL);
-
- if (treeview_test_mouse_action(tree, mouse, x, y)) {
- return true;
- }
-
- return false;
-}
-
-/** deprecated compatibility layer for new treeview modules. Do not use. */
-void tree_drag_end(struct tree *tree, browser_mouse_state mouse, int x0, int y0,
- int x1, int y1)
-{
- assert(tree != NULL);
-
- treeview_test_mouse_action(tree, BROWSER_MOUSE_HOVER, x1, y1);
-}
-
-/** deprecated compatibility layer for new treeview modules. Do not use. */
-bool tree_keypress(struct tree *tree, uint32_t key)
-{
- if (treeview_test_keypress(tree, key)) {
- return true;
- }
-
- return false;
-}
-
-/** deprecated compatibility layer for new treeview modules. Do not use. */
-tree_drag_type tree_drag_status(struct tree *tree)
-{
- assert(tree != NULL);
- return tree->drag;
-}
diff --git a/frontends/amiga/desktop-tree.h b/frontends/amiga/desktop-tree.h
deleted file mode 100644
index f8864e167..000000000
--- a/frontends/amiga/desktop-tree.h
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- * Copyright 2004 Richard Wilson <not_ginger_matt@users.sourceforge.net>
- * Copyright 2009 Paul Blokus <paul_pl@users.sourceforge.net>
- *
- * 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/>.
- */
-
-/** \file
- * deprecated compatibility layer for new treeview modules. Do not use.
- */
-
-#ifndef _NETSURF_DESKTOP_TREE_H_
-#define _NETSURF_DESKTOP_TREE_H_
-
-#include <stdbool.h>
-#include <stdint.h>
-
-#include "netsurf/mouse.h"
-
-struct sslcert_session_data;
-struct tree;
-struct redraw_context;
-
-/**
- * Current ssl session data for treeview
- *
- * @todo FIXME global certificate treeview state must go away, this is
- * just wrong.
- */
-extern struct sslcert_session_data *ssl_current_session;
-extern const char *tree_hotlist_path;
-
-/* Tree flags */
-enum tree_flags {
- TREE_HISTORY,
- TREE_COOKIES,
- TREE_SSLCERT,
- TREE_HOTLIST
-};
-
-typedef enum {
- TREE_NO_DRAG = 0,
- TREE_SELECT_DRAG,
- TREE_MOVE_DRAG,
- TREE_TEXTAREA_DRAG, /** < A drag that is passed to a textarea */
- TREE_UNKNOWN_DRAG /** < A drag the tree itself won't handle */
-} tree_drag_type;
-
-/** callbacks to perform necessary operations on treeview. */
-struct treeview_table {
- void (*redraw_request)(int x, int y, int width, int height,
- void *data); /**< request a redraw. */
- void (*resized)(struct tree *tree, int width, int height,
- void *data); /**< resize treeview area. */
- void (*scroll_visible)(int y, int height, void *data); /**< scroll visible treeview area. */
- void (*get_window_dimensions)(int *width, int *height, void *data); /**< get dimensions of window */
-};
-
-struct tree *tree_create(unsigned int flags,
- const struct treeview_table *callbacks,
- void *client_data);
-
-/** deprecated compatibility layer for new treeview modules. Do not use. */
-void tree_delete(struct tree *tree);
-tree_drag_type tree_drag_status(struct tree *tree);
-void tree_draw(struct tree *tree, int x, int y,
- int clip_x, int clip_y, int clip_width, int clip_height,
- const struct redraw_context *ctx);
-bool tree_mouse_action(struct tree *tree, browser_mouse_state mouse,
- int x, int y);
-void tree_drag_end(struct tree *tree, browser_mouse_state mouse, int x0, int y0,
- int x1, int y1);
-bool tree_keypress(struct tree *tree, uint32_t key);
-
-
-#endif
diff --git a/frontends/amiga/file.c b/frontends/amiga/file.c
index 04f8e8aca..0fd43781d 100644
--- a/frontends/amiga/file.c
+++ b/frontends/amiga/file.c
@@ -46,6 +46,9 @@
static struct Hook aslhookfunc;
+struct FileRequester *filereq;
+struct FileRequester *savereq;
+
HOOKF(ULONG, ami_file_asl_mime_hook, struct FileRequester *, fr, struct AnchorPathOld *)
{
char fname[1024];
diff --git a/frontends/amiga/file.h b/frontends/amiga/file.h
index 29a76c477..9120fff61 100644
--- a/frontends/amiga/file.h
+++ b/frontends/amiga/file.h
@@ -21,8 +21,8 @@ struct hlcache_object;
struct selection;
struct gui_window_2;
-struct FileRequester *filereq;
-struct FileRequester *savereq;
+extern struct FileRequester *filereq;
+extern struct FileRequester *savereq;
enum {
AMINS_SAVE_SOURCE,
diff --git a/frontends/amiga/gui.c b/frontends/amiga/gui.c
index 9fce6813f..e27d10588 100644
--- a/frontends/amiga/gui.c
+++ b/frontends/amiga/gui.c
@@ -118,7 +118,6 @@
#include "desktop/searchweb.h"
/* NetSurf Amiga platform includes */
-#include "amiga/desktop-tree.h"
#include "amiga/gui.h"
#include "amiga/arexx.h"
#include "amiga/bitmap.h"
@@ -151,7 +150,6 @@
#include "amiga/search.h"
#include "amiga/selectmenu.h"
#include "amiga/theme.h"
-#include "amiga/tree.h"
#include "amiga/utf8.h"
#include "amiga/sslcert.h"
@@ -547,6 +545,17 @@ static void ami_set_screen_defaults(struct Screen *screen)
nsoption_default_set_int(cookies_window_xsize, width);
nsoption_default_set_int(cookies_window_ysize, height);
+ nsoption_default_set_int(history_window_ypos, top);
+ nsoption_default_set_int(history_window_xpos, left);
+ nsoption_default_set_int(history_window_xsize, width);
+ nsoption_default_set_int(history_window_ysize, height);
+
+ nsoption_default_set_int(hotlist_window_ypos, top);
+ nsoption_default_set_int(hotlist_window_xpos, left);
+ nsoption_default_set_int(hotlist_window_xsize, width);
+ nsoption_default_set_int(hotlist_window_ysize, height);
+
+
nsoption_default_set_int(window_x, 0);
nsoption_default_set_int(window_y, screen->BarHeight + 1);
nsoption_default_set_int(window_width, screen->Width);
@@ -1013,8 +1022,7 @@ static void gui_init2(int argc, char** argv)
}
/**/
- ami_hotlist_initialise(nsoption_charp(hotlist_file));
- ami_global_history_initialise();
+ hotlist_init(nsoption_charp(hotlist_file));
search_web_select_provider(nsoption_int(search_provider));
if (notalreadyrunning &&
@@ -3037,8 +3045,7 @@ static void gui_quit(void)
urldb_save(nsoption_charp(url_file));
urldb_save_cookies(nsoption_charp(cookie_file));
- ami_hotlist_free(nsoption_charp(hotlist_file));
- ami_global_history_free();
+ hotlist_fini(nsoption_charp(hotlist_file));
#ifdef __amigaos4__
if(IApplication && ami_appid)
UnregisterApplication(ami_appid, NULL);
@@ -3182,7 +3189,7 @@ static bool ami_gui_hotlist_add(void *userdata, int level, int item,
return true;
}
-static int ami_gui_hotlist_scan(struct tree *tree, struct List *speed_button_list, struct gui_window_2 *gwin)
+static int ami_gui_hotlist_scan(struct List *speed_button_list, struct gui_window_2 *gwin)
{
struct ami_gui_tb_userdata userdata;
userdata.gw = gwin;
@@ -3204,7 +3211,7 @@ static void ami_gui_hotlist_toolbar_add(struct gui_window_2 *gwin)
NewList(&gwin->hotlist_toolbar_list);
- if(ami_gui_hotlist_scan(ami_tree_get_tree(hotlist_window), &gwin->hotlist_toolbar_list, gwin) > 0) {
+ if(ami_gui_hotlist_scan(&gwin->hotlist_toolbar_list, gwin) > 0) {
gwin->objects[GID_HOTLIST] =
SpeedBarObj,
GA_ID, GID_HOTLIST,
@@ -3303,7 +3310,7 @@ static void ami_gui_hotlist_toolbar_update(struct gui_window_2 *gwin)
ami_gui_hotlist_toolbar_free(gwin, &gwin->hotlist_toolbar_list);
- if(ami_gui_hotlist_scan(ami_tree_get_tree(hotlist_window), &gwin->hotlist_toolbar_list, gwin) > 0) {
+ if(ami_gui_hotlist_scan(&gwin->hotlist_toolbar_list, gwin) > 0) {
SetGadgetAttrs((struct Gadget *)gwin->objects[GID_HOTLIST],
gwin->win, NULL,
SPEEDBAR_Buttons, &gwin->hotlist_toolbar_list,
diff --git a/frontends/amiga/history.c b/frontends/amiga/history.c
index 2287c7069..f326f917a 100755..100644
--- a/frontends/amiga/history.c
+++ b/frontends/amiga/history.c
@@ -1,5 +1,5 @@
/*
- * Copyright 2008, 2009 Chris Young <chris@unsatisfactorysoftware.co.uk>
+ * Copyright 2017 Chris Young <chris@unsatisfactorysoftware.co.uk>
*
* This file is part of NetSurf, http://www.netsurf-browser.org/
*
@@ -16,28 +16,449 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
+/**
+ * \file
+ * Implementation of Amiga global history viewer using core windows.
+ */
+
+#include <stdint.h>
+#include <stdlib.h>
#include <stdbool.h>
-#include <proto/exec.h>
+#include <string.h>
+
+#include <proto/asl.h>
+#include <proto/dos.h>
+#include <proto/intuition.h>
+
+#include <classes/window.h>
+#include <gadgets/layout.h>
+#include <gadgets/space.h>
-#include "utils/errors.h"
-#include "netsurf/mouse.h"
-#include "netsurf/window.h"
+#include <reaction/reaction_macros.h>
+#include "desktop/global_history.h"
+#include "netsurf/browser_window.h"
+#include "netsurf/keypress.h"
+#include "netsurf/plotters.h"
+#include "utils/log.h"
+#include "utils/messages.h"
+#include "utils/nsoption.h"
+
+#include "amiga/corewindow.h"
+#include "amiga/drag.h"
+#include "amiga/file.h"
#include "amiga/history.h"
-#include "amiga/tree.h"
-#include "amiga/tree.h"
+#include "amiga/libs.h"
+#include "amiga/theme.h"
+#include "amiga/utf8.h"
+
+enum {
+ /* Project menu */
+ AMI_HISTORY_M_PROJECT = 0,
+ AMI_HISTORY_M_EXPORT,
+ AMI_HISTORY_M_BAR_P1,
+ AMI_HISTORY_M_EXPAND,
+ AMI_HISTORY_M_EXPAND_ALL,
+ AMI_HISTORY_M_EXPAND_FOLDERS,
+ AMI_HISTORY_M_EXPAND_LINKS,
+ AMI_HISTORY_M_COLLAPSE,
+ AMI_HISTORY_M_COLLAPSE_ALL,
+ AMI_HISTORY_M_COLLAPSE_FOLDERS,
+ AMI_HISTORY_M_COLLAPSE_LINKS,
+ AMI_HISTORY_M_BAR_P2,
+ AMI_HISTORY_M_SNAPSHOT,
+ AMI_HISTORY_M_BAR_P3,
+ AMI_HISTORY_M_CLOSE,
+ /* Edit menu */
+ AMI_HISTORY_M_EDIT,
+ AMI_HISTORY_M_SELECTALL,
+ AMI_HISTORY_M_CLEAR,
+ AMI_HISTORY_M_BAR_E1,
+ AMI_HISTORY_M_DELETE,
+ AMI_HISTORY_M_LAST
+};
+
+/**
+ * Amiga history viewer window context
+ */
+struct ami_history_global_window {
+ /** Amiga core window context */
+ struct ami_corewindow core;
+
+ struct ami_menu_data *menu_data[AMI_HISTORY_M_LAST + 1];
+ struct Menu *imenu; /* Intuition menu */
+};
+
+static struct ami_history_global_window *history_window = NULL;
+
+
+static void
+ami_history_global_menu_free(struct ami_history_global_window *history_win)
+{
+ SetAttrs(history_win->core.objects[GID_CW_WIN],
+ WINDOW_MenuStrip, NULL,
+ TAG_DONE);
+
+ ami_menu_free_menu(history_win->menu_data, AMI_HISTORY_M_LAST, history_win->imenu);
+}
+
+/**
+ * destroy a previously created history view
+ */
+static void
+ami_history_global_destroy(struct ami_corewindow *ami_cw)
+{
+ nserror res;
+
+ if(history_window == NULL)
+ return;
+
+ res = global_history_fini();
+ if (res == NSERROR_OK) {
+ ami_history_global_menu_free(history_window);
+ res = ami_corewindow_fini(&history_window->core); /* closes the window for us, frees history_win */
+ history_window = NULL;
+ }
+}
+
+
+/**
+ * callback for mouse action for history viewer on core window
+ *
+ * \param ami_cw The Amiga core window structure.
+ * \param mouse_state netsurf mouse state on event
+ * \param x location of event
+ * \param y location of event
+ * \return NSERROR_OK on success otherwise apropriate error code
+ */
+static nserror
+ami_history_global_mouse(struct ami_corewindow *ami_cw,
+ browser_mouse_state mouse_state,
+ int x, int y)
+{
+ global_history_mouse_action(mouse_state, x, y);
+
+ return NSERROR_OK;
+}
+
+/**
+ * callback for keypress for history viewer on core window
+ *
+ * \param ami_cw The Amiga core window structure.
+ * \param nskey The netsurf key code
+ * \return NSERROR_OK on success otherwise apropriate error code
+ */
+static nserror
+ami_history_global_key(struct ami_corewindow *ami_cw, uint32_t nskey)
+{
+ if (global_history_keypress(nskey)) {
+ return NSERROR_OK;
+ }
+ return NSERROR_NOT_IMPLEMENTED;
+}
+
+/**
+ * callback on draw event for history viewer on core window
+ *
+ * \param ami_cw The Amiga core window structure.
+ * \param r The rectangle of the window that needs updating.
+ * \param ctx The drawing context
+ * \return NSERROR_OK on success otherwise apropriate error code
+ */
+static nserror
+ami_history_global_draw(struct ami_corewindow *ami_cw, int x, int y, struct rect *r, struct redraw_context *ctx)
+{
+ global_history_redraw(x, y, r, ctx);
+
+ return NSERROR_OK;
+}
+
+/**
+ * callback on drag end for history viewer
+ *
+ * \param ami_cw The Amiga core window structure.
+ * \param x mouse x co-ordinate
+ * \param y mouse y co-ordinate
+ * \return NSERROR_OK on success otherwise apropriate error code
+ */
+static nserror
+ami_history_global_drag_end(struct ami_corewindow *ami_cw, int x, int y)
+{
+ struct nsurl *url = NULL;
+ const char *title = NULL;
+ bool ok = false;
+ struct gui_window_2 *gwin;
+ struct ami_corewindow *cw;
+
+ if(global_history_has_selection()) {
+ ok = global_history_get_selection(&url, &title);
+ }
+
+ if((ok == false) || (url == NULL)) {
+ DisplayBeep(scrn);
+ } else if(url) {
+ if((gwin = ami_window_at_pointer(AMINS_WINDOW))) {
+ browser_window_navigate(gwin->gw->bw,
+ url,
+ NULL,
+ BW_NAVIGATE_HISTORY,
+ NULL,
+ NULL,
+ NULL);
+ } else if((cw = (struct ami_corewindow *)ami_window_at_pointer(AMINS_COREWINDOW)) &&
+ (ami_cw->icon_drop != NULL)) {
+ cw->icon_drop(cw, url, title, x, y);
+ }
+ }
+ return NSERROR_OK;
+}
+
+/**
+ * menu stuff
+ */
+
+ /* menu hook functions */
+HOOKF(void, ami_history_global_menu_item_project_export, APTR, window, struct IntuiMessage *)
+{
+ char fname[1024];
+ struct ami_corewindow *ami_cw;
+ GetAttr(WINDOW_UserData, (Object *)window, (ULONG *)&ami_cw);
+
+ if(AslRequestTags(savereq,
+ ASLFR_Window, ami_cw->win,
+ ASLFR_SleepWindow, TRUE,
+ ASLFR_TitleText, messages_get("NetSurf"),
+ ASLFR_Screen, scrn,
+ ASLFR_InitialFile, "history.html",
+ TAG_DONE)) {
+ strlcpy(fname, savereq->fr_Drawer, 1024);
+ AddPart(fname, savereq->fr_File, 1024);
+ ami_update_pointer(ami_cw->win, GUI_POINTER_WAIT);
+ global_history_export(fname, NULL);
+ ami_update_pointer(ami_cw->win, GUI_POINTER_DEFAULT);
+ }
+}
+
+HOOKF(void, ami_history_global_menu_item_project_expand_all, APTR, window, struct IntuiMessage *)
+{
+ global_history_expand(false);
+}
+
+HOOKF(void, ami_history_global_menu_item_project_expand_folders, APTR, window, struct IntuiMessage *)
+{
+ global_history_expand(true);
+}
+
+HOOKF(void, ami_history_global_menu_item_project_expand_links, APTR, window, struct IntuiMessage *)
+{
+ global_history_expand(false);
+}
+
+HOOKF(void, ami_history_global_menu_item_project_collapse_all, APTR, window, struct IntuiMessage *)
+{
+ global_history_contract(true);
+}
+
+HOOKF(void, ami_history_global_menu_item_project_collapse_folders, APTR, window, struct IntuiMessage *)
+{
+ global_history_contract(true);
+}
+
+HOOKF(void, ami_history_global_menu_item_project_collapse_links, APTR, window, struct IntuiMessage *)
+{
+ global_history_contract(false);
+}
+
+HOOKF(void, ami_history_global_menu_item_project_snapshot, APTR, window, struct IntuiMessage *)
+{
+ struct ami_corewindow *ami_cw;
+ GetAttr(WINDOW_UserData, (Object *)window, (ULONG *)&ami_cw);
+
+ nsoption_set_int(history_window_ypos, ami_cw->win->TopEdge);
+ nsoption_set_int(history_window_xpos, ami_cw->win->LeftEdge);
+ nsoption_set_int(history_window_xsize, ami_cw->win->Width);
+ nsoption_set_int(history_window_ysize, ami_cw->win->Height);
+}
+
+HOOKF(void, ami_history_global_menu_item_project_close, APTR, window, struct IntuiMessage *)
+{
+ struct ami_corewindow *ami_cw;
+ GetAttr(WINDOW_UserData, (Object *)window, (ULONG *)&ami_cw);
+
+ ami_cw->close_window = true;
+}
+
+HOOKF(void, ami_history_global_menu_item_edit_select_all, APTR, window, struct IntuiMessage *)
+{
+ global_history_keypress(NS_KEY_SELECT_ALL);
+}
+
+HOOKF(void, ami_history_global_menu_item_edit_clear, APTR, window, struct IntuiMessage *)
+{
+ global_history_keypress(NS_KEY_CLEAR_SELECTION);
+}
-struct treeview_window *global_history_window = NULL;
+HOOKF(void, ami_history_global_menu_item_edit_delete, APTR, window, struct IntuiMessage *)
+{
+ global_history_keypress(NS_KEY_DELETE_LEFT);
+}
+
+
+/* menu setup */
+
+static void ami_history_global_menulabs(struct ami_menu_data **md)
+{
+ ami_menu_alloc_item(md, AMI_HISTORY_M_PROJECT, NM_TITLE, "Tree", 0, NULL, NULL, NULL, 0);
+ ami_menu_alloc_item(md, AMI_HISTORY_M_EXPORT, NM_ITEM, "TreeExport", 'S', "TBImages:list_save",
+ ami_history_global_menu_item_project_export, NULL, 0);
+ ami_menu_alloc_item(md, AMI_HISTORY_M_BAR_P1, NM_ITEM, NM_BARLABEL, 0, NULL, NULL, NULL, 0);
+ ami_menu_alloc_item(md, AMI_HISTORY_M_EXPAND, NM_ITEM, "Expand", 0, "TBImages:list_folderunfold", NULL, NULL, 0);
+ ami_menu_alloc_item(md, AMI_HISTORY_M_EXPAND_ALL, NM_SUB, "All", '+', NULL,
+ ami_history_global_menu_item_project_expand_all, NULL, 0);
+ ami_menu_alloc_item(md, AMI_HISTORY_M_EXPAND_FOLDERS, NM_SUB, "Folders", 0, NULL,
+ ami_history_global_menu_item_project_expand_folders, NULL, 0);
+ ami_menu_alloc_item(md, AMI_HISTORY_M_EXPAND_LINKS, NM_SUB, "Links", 0, NULL,
+ ami_history_global_menu_item_project_expand_links, NULL, 0);
+ ami_menu_alloc_item(md, AMI_HISTORY_M_COLLAPSE, NM_ITEM, "Collapse", 0, "TBImages:list_folderfold", NULL, NULL, 0);
+ ami_menu_alloc_item(md, AMI_HISTORY_M_COLLAPSE_ALL, NM_SUB, "All", '-', NULL,
+ ami_history_global_menu_item_project_collapse_all, NULL, 0);
+ ami_menu_alloc_item(md, AMI_HISTORY_M_COLLAPSE_FOLDERS, NM_SUB, "Folders", 0, NULL,
+ ami_history_global_menu_item_project_collapse_folders, NULL, 0);
+ ami_menu_alloc_item(md, AMI_HISTORY_M_COLLAPSE_LINKS, NM_SUB, "Links", 0, NULL,
+ ami_history_global_menu_item_project_collapse_links, NULL, 0);
+ ami_menu_alloc_item(md, AMI_HISTORY_M_BAR_P2, NM_ITEM, NM_BARLABEL, 0, NULL, NULL, NULL, 0);
+ ami_menu_alloc_item(md, AMI_HISTORY_M_SNAPSHOT, NM_ITEM, "SnapshotWindow", 0, "TBImages:list_hold",
+ ami_history_global_menu_item_project_snapshot, NULL, 0);
+ ami_menu_alloc_item(md, AMI_HISTORY_M_BAR_P3, NM_ITEM, NM_BARLABEL, 0, NULL, NULL, NULL, 0);
+ ami_menu_alloc_item(md, AMI_HISTORY_M_CLOSE, NM_ITEM, "CloseWindow", 'K', "TBImages:list_cancel",
+ ami_history_global_menu_item_project_close, NULL, 0);
+
+ ami_menu_alloc_item(md, AMI_HISTORY_M_EDIT, NM_TITLE, "Edit", 0, NULL, NULL, NULL, 0);
+ ami_menu_alloc_item(md, AMI_HISTORY_M_SELECTALL, NM_ITEM, "SelectAllNS", 'A', NSA_SPACE,
+ ami_history_global_menu_item_edit_select_all, NULL, 0);
+ ami_menu_alloc_item(md, AMI_HISTORY_M_CLEAR, NM_ITEM, "ClearNS", 0, NSA_SPACE,
+ ami_history_global_menu_item_edit_clear, NULL, 0);
+ ami_menu_alloc_item(md, AMI_HISTORY_M_BAR_E1, NM_ITEM, NM_BARLABEL, 0, NULL, NULL, NULL, 0);
+ ami_menu_alloc_item(md, AMI_HISTORY_M_DELETE, NM_ITEM, "TreeDelete", 0, "TBImages:list_delete",
+ ami_history_global_menu_item_edit_delete, NULL, 0);
+
+ ami_menu_alloc_item(md, AMI_HISTORY_M_LAST, NM_END, NULL, 0, NULL, NULL, NULL, 0);
+}
+
+static struct Menu *
+ami_history_global_menu_create(struct ami_history_global_window *history_win)
+{
+ ami_history_global_menulabs(history_win->menu_data);
+ history_win->imenu = ami_menu_layout(history_win->menu_data, AMI_HISTORY_M_LAST);
+ if(history_win->imenu == NULL) return NULL;
+
+ return history_win->imenu;
+}
-void ami_global_history_initialise(void)
+
+static nserror
+ami_history_global_create_window(struct ami_history_global_window *history_win)
{
- global_history_window = ami_tree_create(TREE_HISTORY, NULL);
+ struct ami_corewindow *ami_cw = (struct ami_corewindow *)&history_win->core;
+
+ ami_cw->objects[GID_CW_WIN] = WindowObj,
+ WA_ScreenTitle, ami_gui_get_screen_title(),
+ WA_Title, ami_cw->wintitle,
+ WA_Activate, TRUE,
+ WA_DepthGadget, TRUE,
+ WA_DragBar, TRUE,
+ WA_CloseGadget, TRUE,
+ WA_SizeGadget, TRUE,
+ WA_SizeBRight, TRUE,
+ WA_Top, nsoption_int(history_window_ypos),
+ WA_Left, nsoption_int(history_window_xpos),
+ WA_Width, nsoption_int(history_window_xsize),
+ WA_Height, nsoption_int(history_window_ysize),
+ WA_PubScreen, scrn,
+ WA_ReportMouse, TRUE,
+ WA_IDCMP, IDCMP_MOUSEMOVE | IDCMP_MOUSEBUTTONS | IDCMP_NEWSIZE |
+ IDCMP_RAWKEY | IDCMP_GADGETUP | IDCMP_IDCMPUPDATE |
+ IDCMP_EXTENDEDMOUSE | IDCMP_SIZEVERIFY,
+ WINDOW_IDCMPHook, &ami_cw->idcmp_hook,
+ WINDOW_IDCMPHookBits, IDCMP_IDCMPUPDATE | IDCMP_EXTENDEDMOUSE,
+ WINDOW_SharedPort, sport,
+ WINDOW_HorizProp, 1,
+ WINDOW_VertProp, 1,
+ WINDOW_UserData, history_win,
+ WINDOW_MenuStrip, ami_history_global_menu_create(history_win),
+ WINDOW_MenuUserData, WGUD_HOOK,
+ WINDOW_IconifyGadget, FALSE,
+ WINDOW_Position, WPOS_CENTERSCREEN,
+ WINDOW_ParentGroup, ami_cw->objects[GID_CW_MAIN] = LayoutVObj,
+ LAYOUT_AddChild, ami_cw->objects[GID_CW_DRAW] = SpaceObj,
+ GA_ID, GID_CW_DRAW,
+ SPACE_Transparent, TRUE,
+ SPACE_BevelStyle, BVS_DISPLAY,
+ GA_RelVerify, TRUE,
+ SpaceEnd,
+ EndGroup,
+ EndWindow;
- if(!global_history_window) return;
+ if(ami_cw->objects[GID_CW_WIN] == NULL) {
+ return NSERROR_NOMEM;
+ }
+
+ return NSERROR_OK;
}
-void ami_global_history_free()
+/* exported interface documented in amiga/cookies.h */
+nserror ami_history_global_present(void)
{
- ami_tree_destroy(global_history_window);
- global_history_window = NULL;
+ struct ami_history_global_window *ncwin;
+ nserror res;
+
+ if(history_window != NULL) {
+ //windowtofront()
+ return NSERROR_OK;
+ }
+
+ ncwin = calloc(1, sizeof(struct ami_history_global_window));
+ if (ncwin == NULL) {
+ return NSERROR_NOMEM;
+ }
+
+ ncwin->core.wintitle = ami_utf8_easy((char *)messages_get("GlobalHistory"));
+
+ res = ami_history_global_create_window(ncwin);
+ if (res != NSERROR_OK) {
+ LOG("SSL UI builder init failed");
+ ami_utf8_free(ncwin->core.wintitle);
+ free(ncwin);
+ return res;
+ }
+
+ /* initialise Amiga core window */
+ ncwin->core.draw = ami_history_global_draw;
+ ncwin->core.key = ami_history_global_key;
+ ncwin->core.mouse = ami_history_global_mouse;
+ ncwin->core.close = ami_history_global_destroy;
+ ncwin->core.event = NULL;
+ ncwin->core.drag_end = ami_history_global_drag_end;
+ ncwin->core.icon_drop = NULL;
+
+ res = ami_corewindow_init(&ncwin->core);
+ if (res != NSERROR_OK) {
+ ami_utf8_free(ncwin->core.wintitle);
+ DisposeObject(ncwin->core.objects[GID_CW_WIN]);
+ free(ncwin);
+ return res;
+ }
+
+ res = global_history_init(ncwin->core.cb_table, (struct core_window *)ncwin);
+ if (res != NSERROR_OK) {
+ ami_utf8_free(ncwin->core.wintitle);
+ DisposeObject(ncwin->core.objects[GID_CW_WIN]);
+ free(ncwin);
+ return res;
+ }
+
+ history_window = ncwin;
+
+ return NSERROR_OK;
}
+
diff --git a/frontends/amiga/history.h b/frontends/amiga/history.h
index 47e00ed10..67ab670b7 100755..100644
--- a/frontends/amiga/history.h
+++ b/frontends/amiga/history.h
@@ -1,5 +1,5 @@
/*
- * Copyright 2008,2009 Chris Young <chris@unsatisfactorysoftware.co.uk>
+ * Copyright 2017 Chris Young <chris@unsatisfactorysoftware.co.uk>
*
* This file is part of NetSurf, http://www.netsurf-browser.org/
*
@@ -16,14 +16,10 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#ifndef AMIGA_HISTORY_H
-#define AMIGA_HISTORY_H
-#include "amiga/desktop-tree.h"
+#ifndef AMIGA_HISTORY_GLOBAL_H
+#define AMIGA_HISTORY_GLOBAL_H
-#define GLOBAL_HISTORY_RECENT_URLS 16
-
-void ami_global_history_initialise(void);
-void ami_global_history_free(void);
-
-extern struct treeview_window *global_history_window;
+/** Open the global history viewer */
+nserror ami_history_global_present(void);
#endif
+
diff --git a/frontends/amiga/hotlist.c b/frontends/amiga/hotlist.c
index fc2342d73..a0fd30333 100755..100644
--- a/frontends/amiga/hotlist.c
+++ b/frontends/amiga/hotlist.c
@@ -1,5 +1,5 @@
/*
- * Copyright 2008, 2009 Chris Young <chris@unsatisfactorysoftware.co.uk>
+ * Copyright 2008, 2009, 2017 Chris Young <chris@unsatisfactorysoftware.co.uk>
*
* This file is part of NetSurf, http://www.netsurf-browser.org/
*
@@ -16,16 +16,84 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
+/**
+ * \file
+ * Implementation of Amiga hotlist viewer using core windows.
+ */
+
+#include <stdint.h>
+#include <stdlib.h>
+#include <stdbool.h>
#include <string.h>
-#include <proto/exec.h>
-#include "utils/nsurl.h"
+#include <proto/asl.h>
+#include <proto/dos.h>
+#include <proto/intuition.h>
+
+#include <classes/window.h>
+#include <gadgets/layout.h>
+#include <gadgets/space.h>
+
+#include <reaction/reaction_macros.h>
+
#include "desktop/hotlist.h"
-#include "netsurf/mouse.h"
-#include "netsurf/window.h"
+#include "netsurf/browser_window.h"
+#include "netsurf/keypress.h"
+#include "netsurf/plotters.h"
+#include "utils/log.h"
+#include "utils/messages.h"
+#include "utils/nsoption.h"
+#include "amiga/corewindow.h"
+#include "amiga/drag.h"
+#include "amiga/file.h"
#include "amiga/hotlist.h"
-#include "amiga/tree.h"
+#include "amiga/libs.h"
+#include "amiga/theme.h"
+#include "amiga/utf8.h"
+
+enum {
+ /* Project menu */
+ AMI_HOTLIST_M_PROJECT = 0,
+ AMI_HOTLIST_M_EXPORT,
+ AMI_HOTLIST_M_BAR_P1,
+ AMI_HOTLIST_M_EXPAND,
+ AMI_HOTLIST_M_EXPAND_ALL,
+ AMI_HOTLIST_M_EXPAND_FOLDERS,
+ AMI_HOTLIST_M_EXPAND_LINKS,
+ AMI_HOTLIST_M_COLLAPSE,
+ AMI_HOTLIST_M_COLLAPSE_ALL,
+ AMI_HOTLIST_M_COLLAPSE_FOLDERS,
+ AMI_HOTLIST_M_COLLAPSE_LINKS,
+ AMI_HOTLIST_M_BAR_P2,
+ AMI_HOTLIST_M_SNAPSHOT,
+ AMI_HOTLIST_M_BAR_P3,
+ AMI_HOTLIST_M_CLOSE,
+ /* Edit menu */
+ AMI_HOTLIST_M_EDIT,
+ AMI_HOTLIST_M_NEWFOLDER,
+ AMI_HOTLIST_M_NEWLINK,
+ AMI_HOTLIST_M_EDIT_EDIT,
+ AMI_HOTLIST_M_BAR_E1,
+ AMI_HOTLIST_M_SELECTALL,
+ AMI_HOTLIST_M_CLEAR,
+ AMI_HOTLIST_M_BAR_E2,
+ AMI_HOTLIST_M_DELETE,
+ AMI_HOTLIST_M_LAST
+};
+
+/**
+ * Amiga hotlist viewer window context
+ */
+struct ami_hotlist_window {
+ /** Amiga core window context */
+ struct ami_corewindow core;
+
+ struct ami_menu_data *menu_data[AMI_HOTLIST_M_LAST + 1];
+ struct Menu *imenu; /* Intuition menu */
+};
+
+static struct ami_hotlist_window *hotlist_window = NULL;
struct ami_hotlist_ctx {
void *userdata;
@@ -37,22 +105,7 @@ struct ami_hotlist_ctx {
bool (*cb)(void *userdata, int level, int item, const char *title, nsurl *url, bool folder);
};
-struct treeview_window *hotlist_window = NULL;
-
-void ami_hotlist_initialise(const char *hotlist_file)
-{
- tree_hotlist_path = hotlist_file;
- hotlist_window = ami_tree_create(TREE_HOTLIST, NULL);
- if(!hotlist_window) return;
-}
-
-void ami_hotlist_free(const char *hotlist_file)
-{
- ami_tree_destroy(hotlist_window);
- hotlist_window = NULL;
-}
-
-
+/** hotlist scanner */
static nserror ami_hotlist_folder_enter_cb(void *ctx, const char *title)
{
struct ami_hotlist_ctx *menu_ctx = (struct ami_hotlist_ctx *)ctx;
@@ -118,3 +171,426 @@ nserror ami_hotlist_scan(void *userdata, int first_item, const char *folder,
return error;
}
+
+
+/**
+ * callback for mouse action for hotlist viewer on core window
+ *
+ * \param ami_cw The Amiga core window structure.
+ * \param mouse_state netsurf mouse state on event
+ * \param x location of event
+ * \param y location of event
+ * \return NSERROR_OK on success otherwise apropriate error code
+ */
+static nserror
+ami_hotlist_mouse(struct ami_corewindow *ami_cw,
+ browser_mouse_state mouse_state,
+ int x, int y)
+{
+ hotlist_mouse_action(mouse_state, x, y);
+
+ return NSERROR_OK;
+}
+
+/**
+ * callback for keypress for hotlist viewer on core window
+ *
+ * \param ami_cw The Amiga core window structure.
+ * \param nskey The netsurf key code
+ * \return NSERROR_OK on success otherwise apropriate error code
+ */
+static nserror
+ami_hotlist_key(struct ami_corewindow *ami_cw, uint32_t nskey)
+{
+ if (hotlist_keypress(nskey)) {
+ return NSERROR_OK;
+ }
+ return NSERROR_NOT_IMPLEMENTED;
+}
+
+/**
+ * callback on draw event for hotlist viewer on core window
+ *
+ * \param ami_cw The Amiga core window structure.
+ * \param r The rectangle of the window that needs updating.
+ * \param ctx The drawing context
+ * \return NSERROR_OK on success otherwise apropriate error code
+ */
+static nserror
+ami_hotlist_draw(struct ami_corewindow *ami_cw, int x, int y, struct rect *r, struct redraw_context *ctx)
+{
+ hotlist_redraw(x, y, r, ctx);
+
+ return NSERROR_OK;
+}
+
+/**
+ * callback for drag end on Amiga core window
+ * ie. a drag *from* this window has ended
+ *
+ * \param ami_cw The Amiga core window structure.
+ * \param x mouse x co-ordinate
+ * \param y mouse y co-ordinate
+ * \return NSERROR_OK on success otherwise apropriate error code
+ */
+static nserror
+ami_hotlist_drag_end(struct ami_corewindow *ami_cw, int x, int y)
+{
+ nsurl *url = NULL;
+ const char *title = NULL;
+ bool ok = false;
+ struct gui_window_2 *gwin;
+ struct ami_corewindow *cw;
+
+ if(hotlist_has_selection()) {
+ ok = hotlist_get_selection(&url, &title);
+ }
+
+ if((ok == false) || (url == NULL)) {
+ DisplayBeep(scrn);
+ } else if(url) {
+ if((gwin = ami_window_at_pointer(AMINS_WINDOW))) {
+ browser_window_navigate(gwin->gw->bw,
+ url,
+ NULL,
+ BW_NAVIGATE_HISTORY,
+ NULL,
+ NULL,
+ NULL);
+ } else if((cw = (struct ami_corewindow *)ami_window_at_pointer(AMINS_COREWINDOW)) &&
+ (ami_cw->icon_drop != NULL)) {
+ cw->icon_drop(cw, url, title, x, y);
+ }
+ }
+ return NSERROR_OK;
+}
+
+/**
+ * callback for icon drop on Amiga core window
+ * ie. a drag has ended *above* this window
+ * \todo this may not be very flexible but serves our current purposes
+ *
+ * \param ami_cw The Amiga core window structure.
+ * \param url url of dropped icon
+ * \param title title of dropped icon
+ * \param x mouse x co-ordinate
+ * \param y mouse y co-ordinate
+ * \return NSERROR_OK on success otherwise apropriate error code
+ */
+static nserror
+ami_hotlist_icon_drop(struct ami_corewindow *ami_cw, struct nsurl *url, const char *title, int x, int y)
+{
+ hotlist_add_entry(url, title, true, y);
+ return NSERROR_OK;
+}
+
+/**
+ * menu stuff
+ */
+
+static void
+ami_hotlist_menu_free(struct ami_hotlist_window *hotlist_win)
+{
+ SetAttrs(hotlist_win->core.objects[GID_CW_WIN],
+ WINDOW_MenuStrip, NULL,
+ TAG_DONE);
+
+ ami_menu_free_menu(hotlist_win->menu_data, AMI_HOTLIST_M_LAST, hotlist_win->imenu);
+}
+
+ /* menu hook functions */
+HOOKF(void, ami_hotlist_menu_item_project_export, APTR, window, struct IntuiMessage *)
+{
+ char fname[1024];
+ struct ami_corewindow *ami_cw;
+ GetAttr(WINDOW_UserData, (Object *)window, (ULONG *)&ami_cw);
+
+ if(AslRequestTags(savereq,
+ ASLFR_Window, ami_cw->win,
+ ASLFR_SleepWindow, TRUE,
+ ASLFR_TitleText, messages_get("NetSurf"),
+ ASLFR_Screen, scrn,
+ ASLFR_InitialFile, "hotlist.html",
+ TAG_DONE)) {
+ strlcpy(fname, savereq->fr_Drawer, 1024);
+ AddPart(fname, savereq->fr_File, 1024);
+ ami_update_pointer(ami_cw->win, GUI_POINTER_WAIT);
+ hotlist_export(fname, NULL);
+ ami_update_pointer(ami_cw->win, GUI_POINTER_DEFAULT);
+ }
+}
+
+HOOKF(void, ami_hotlist_menu_item_project_expand_all, APTR, window, struct IntuiMessage *)
+{
+ hotlist_expand(false);
+}
+
+HOOKF(void, ami_hotlist_menu_item_project_expand_folders, APTR, window, struct IntuiMessage *)
+{
+ hotlist_expand(true);
+}
+
+HOOKF(void, ami_hotlist_menu_item_project_expand_links, APTR, window, struct IntuiMessage *)
+{
+ hotlist_expand(false);
+}
+
+HOOKF(void, ami_hotlist_menu_item_project_collapse_all, APTR, window, struct IntuiMessage *)
+{
+ hotlist_contract(true);
+}
+
+HOOKF(void, ami_hotlist_menu_item_project_collapse_folders, APTR, window, struct IntuiMessage *)
+{
+ hotlist_contract(true);
+}
+
+HOOKF(void, ami_hotlist_menu_item_project_collapse_links, APTR, window, struct IntuiMessage *)
+{
+ hotlist_contract(false);
+}
+
+HOOKF(void, ami_hotlist_menu_item_project_snapshot, APTR, window, struct IntuiMessage *)
+{
+ struct ami_corewindow *ami_cw;
+ GetAttr(WINDOW_UserData, (Object *)window, (ULONG *)&ami_cw);
+
+ nsoption_set_int(hotlist_window_ypos, ami_cw->win->TopEdge);
+ nsoption_set_int(hotlist_window_xpos, ami_cw->win->LeftEdge);
+ nsoption_set_int(hotlist_window_xsize, ami_cw->win->Width);
+ nsoption_set_int(hotlist_window_ysize, ami_cw->win->Height);
+}
+
+HOOKF(void, ami_hotlist_menu_item_project_close, APTR, window, struct IntuiMessage *)
+{
+ struct ami_corewindow *ami_cw;
+ GetAttr(WINDOW_UserData, (Object *)window, (ULONG *)&ami_cw);
+
+ ami_cw->close_window = true;
+}
+
+HOOKF(void, ami_hotlist_menu_item_edit_newfolder, APTR, window, struct IntuiMessage *)
+{
+ hotlist_add_folder(NULL, false, 0);
+}
+
+HOOKF(void, ami_hotlist_menu_item_edit_newlink, APTR, window, struct IntuiMessage *)
+{
+ hotlist_add_entry(NULL, NULL, false, 0);
+}
+
+HOOKF(void, ami_hotlist_menu_item_edit_edit, APTR, window, struct IntuiMessage *)
+{
+ hotlist_edit_selection();
+}
+
+HOOKF(void, ami_hotlist_menu_item_edit_select_all, APTR, window, struct IntuiMessage *)
+{
+ hotlist_keypress(NS_KEY_SELECT_ALL);
+}
+
+HOOKF(void, ami_hotlist_menu_item_edit_clear, APTR, window, struct IntuiMessage *)
+{
+ hotlist_keypress(NS_KEY_CLEAR_SELECTION);
+}
+
+HOOKF(void, ami_hotlist_menu_item_edit_delete, APTR, window, struct IntuiMessage *)
+{
+ hotlist_keypress(NS_KEY_DELETE_LEFT);
+}
+
+
+/* menu setup */
+
+static void ami_hotlist_menulabs(struct ami_menu_data **md)
+{
+ ami_menu_alloc_item(md, AMI_HOTLIST_M_PROJECT, NM_TITLE, "Tree", 0, NULL, NULL, NULL, 0);
+ ami_menu_alloc_item(md, AMI_HOTLIST_M_EXPORT, NM_ITEM, "TreeExport", 'S', "TBImages:list_save",
+ ami_hotlist_menu_item_project_export, NULL, 0);
+ ami_menu_alloc_item(md, AMI_HOTLIST_M_BAR_P1, NM_ITEM, NM_BARLABEL, 0, NULL, NULL, NULL, 0);
+ ami_menu_alloc_item(md, AMI_HOTLIST_M_EXPAND, NM_ITEM, "Expand", 0, "TBImages:list_folderunfold", NULL, NULL, 0);
+ ami_menu_alloc_item(md, AMI_HOTLIST_M_EXPAND_ALL, NM_SUB, "All", '+', NULL,
+ ami_hotlist_menu_item_project_expand_all, NULL, 0);
+ ami_menu_alloc_item(md, AMI_HOTLIST_M_EXPAND_FOLDERS, NM_SUB, "Folders", 0, NULL,
+ ami_hotlist_menu_item_project_expand_folders, NULL, 0);
+ ami_menu_alloc_item(md, AMI_HOTLIST_M_EXPAND_LINKS, NM_SUB, "Links", 0, NULL,
+ ami_hotlist_menu_item_project_expand_links, NULL, 0);
+ ami_menu_alloc_item(md, AMI_HOTLIST_M_COLLAPSE, NM_ITEM, "Collapse", 0, "TBImages:list_folderfold", NULL, NULL, 0);
+ ami_menu_alloc_item(md, AMI_HOTLIST_M_COLLAPSE_ALL, NM_SUB, "All", '-', NULL,
+ ami_hotlist_menu_item_project_collapse_all, NULL, 0);
+ ami_menu_alloc_item(md, AMI_HOTLIST_M_COLLAPSE_FOLDERS, NM_SUB, "Folders", 0, NULL,
+ ami_hotlist_menu_item_project_collapse_folders, NULL, 0);
+ ami_menu_alloc_item(md, AMI_HOTLIST_M_COLLAPSE_LINKS, NM_SUB, "Links", 0, NULL,
+ ami_hotlist_menu_item_project_collapse_links, NULL, 0);
+ ami_menu_alloc_item(md, AMI_HOTLIST_M_BAR_P2, NM_ITEM, NM_BARLABEL, 0, NULL, NULL, NULL, 0);
+ ami_menu_alloc_item(md, AMI_HOTLIST_M_SNAPSHOT, NM_ITEM, "SnapshotWindow", 0, "TBImages:list_hold",
+ ami_hotlist_menu_item_project_snapshot, NULL, 0);
+ ami_menu_alloc_item(md, AMI_HOTLIST_M_BAR_P3, NM_ITEM, NM_BARLABEL, 0, NULL, NULL, NULL, 0);
+ ami_menu_alloc_item(md, AMI_HOTLIST_M_CLOSE, NM_ITEM, "CloseWindow", 'K', "TBImages:list_cancel",
+ ami_hotlist_menu_item_project_close, NULL, 0);
+
+ ami_menu_alloc_item(md, AMI_HOTLIST_M_EDIT, NM_TITLE, "Edit", 0, NULL, NULL, NULL, 0);
+
+ ami_menu_alloc_item(md, AMI_HOTLIST_M_NEWFOLDER, NM_ITEM, "TreeNewFolder", 'N', "TBImages:list_drawer",
+ ami_hotlist_menu_item_edit_newfolder, NULL, 0);
+ ami_menu_alloc_item(md, AMI_HOTLIST_M_NEWLINK, NM_ITEM, "TreeNewLink", 0, "TBImages:list_favouriteadd",
+ ami_hotlist_menu_item_edit_newlink, NULL, 0);
+ ami_menu_alloc_item(md, AMI_HOTLIST_M_EDIT_EDIT, NM_ITEM, "TreeEdit", 'E', "TBImages:list_edit",
+ ami_hotlist_menu_item_edit_edit, NULL, 0);
+ ami_menu_alloc_item(md, AMI_HOTLIST_M_BAR_E1, NM_ITEM, NM_BARLABEL, 0, NULL, NULL, NULL, 0);
+ ami_menu_alloc_item(md, AMI_HOTLIST_M_SELECTALL, NM_ITEM, "SelectAllNS", 'A', NSA_SPACE,
+ ami_hotlist_menu_item_edit_select_all, NULL, 0);
+ ami_menu_alloc_item(md, AMI_HOTLIST_M_CLEAR, NM_ITEM, "ClearNS", 0, NSA_SPACE,
+ ami_hotlist_menu_item_edit_clear, NULL, 0);
+ ami_menu_alloc_item(md, AMI_HOTLIST_M_BAR_E2, NM_ITEM, NM_BARLABEL, 0, NULL, NULL, NULL, 0);
+ ami_menu_alloc_item(md, AMI_HOTLIST_M_DELETE, NM_ITEM, "TreeDelete", 0, "TBImages:list_delete",
+ ami_hotlist_menu_item_edit_delete, NULL, 0);
+
+ ami_menu_alloc_item(md, AMI_HOTLIST_M_LAST, NM_END, NULL, 0, NULL, NULL, NULL, 0);
+}
+
+static struct Menu *
+ami_hotlist_menu_create(struct ami_hotlist_window *hotlist_win)
+{
+ ami_hotlist_menulabs(hotlist_win->menu_data);
+ hotlist_win->imenu = ami_menu_layout(hotlist_win->menu_data, AMI_HOTLIST_M_LAST);
+ if(hotlist_win->imenu == NULL) return NULL;
+
+ return hotlist_win->imenu;
+}
+
+
+static nserror
+ami_hotlist_create_window(struct ami_hotlist_window *hotlist_win)
+{
+ struct ami_corewindow *ami_cw = (struct ami_corewindow *)&hotlist_win->core;
+
+ ami_cw->objects[GID_CW_WIN] = WindowObj,
+ WA_ScreenTitle, ami_gui_get_screen_title(),
+ WA_Title, ami_cw->wintitle,
+ WA_Activate, TRUE,
+ WA_DepthGadget, TRUE,
+ WA_DragBar, TRUE,
+ WA_CloseGadget, TRUE,
+ WA_SizeGadget, TRUE,
+ WA_SizeBRight, TRUE,
+ WA_Top, nsoption_int(hotlist_window_ypos),
+ WA_Left, nsoption_int(hotlist_window_xpos),
+ WA_Width, nsoption_int(hotlist_window_xsize),
+ WA_Height, nsoption_int(hotlist_window_ysize),
+ WA_PubScreen, scrn,
+ WA_ReportMouse, TRUE,
+ WA_IDCMP, IDCMP_MOUSEMOVE | IDCMP_MOUSEBUTTONS | IDCMP_NEWSIZE |
+ IDCMP_RAWKEY | IDCMP_GADGETUP | IDCMP_IDCMPUPDATE |
+ IDCMP_EXTENDEDMOUSE | IDCMP_SIZEVERIFY,
+ WINDOW_IDCMPHook, &ami_cw->idcmp_hook,
+ WINDOW_IDCMPHookBits, IDCMP_IDCMPUPDATE | IDCMP_EXTENDEDMOUSE,
+ WINDOW_SharedPort, sport,
+ WINDOW_HorizProp, 1,
+ WINDOW_VertProp, 1,
+ WINDOW_UserData, hotlist_win,
+ WINDOW_MenuStrip, ami_hotlist_menu_create(hotlist_win),
+ WINDOW_MenuUserData, WGUD_HOOK,
+ WINDOW_IconifyGadget, FALSE,
+ WINDOW_Position, WPOS_CENTERSCREEN,
+ WINDOW_ParentGroup, ami_cw->objects[GID_CW_MAIN] = LayoutVObj,
+ LAYOUT_AddChild, ami_cw->objects[GID_CW_DRAW] = SpaceObj,
+ GA_ID, GID_CW_DRAW,
+ SPACE_Transparent, TRUE,
+ SPACE_BevelStyle, BVS_DISPLAY,
+ GA_RelVerify, TRUE,
+ SpaceEnd,
+ EndGroup,
+ EndWindow;
+
+ if(ami_cw->objects[GID_CW_WIN] == NULL) {
+ return NSERROR_NOMEM;
+ }
+
+ return NSERROR_OK;
+}
+
+/**
+ * destroy a previously created hotlist view
+ */
+static void
+ami_hotlist_destroy(struct ami_corewindow *ami_cw)
+{
+ nserror res;
+
+ if(hotlist_window == NULL)
+ return;
+
+ res = hotlist_manager_fini();
+ if (res == NSERROR_OK) {
+ ami_hotlist_menu_free(hotlist_window);
+ res = ami_corewindow_fini(&hotlist_window->core); /* closes the window for us, frees hotlist_win */
+ hotlist_window = NULL;
+ }
+
+ ami_gui_hotlist_update_all();
+}
+
+
+/* exported interface documented in amiga/hotlist.h */
+nserror ami_hotlist_present(void)
+{
+ struct ami_hotlist_window *ncwin;
+ nserror res;
+
+ if(hotlist_window != NULL) {
+ //windowtofront()
+ return NSERROR_OK;
+ }
+
+ ncwin = calloc(1, sizeof(struct ami_hotlist_window));
+ if (ncwin == NULL) {
+ return NSERROR_NOMEM;
+ }
+
+ ncwin->core.wintitle = ami_utf8_easy((char *)messages_get("Hotlist"));
+
+ res = ami_hotlist_create_window(ncwin);
+ if (res != NSERROR_OK) {
+ LOG("SSL UI builder init failed");
+ ami_utf8_free(ncwin->core.wintitle);
+ free(ncwin);
+ return res;
+ }
+
+ /* initialise Amiga core window */
+ ncwin->core.draw = ami_hotlist_draw;
+ ncwin->core.key = ami_hotlist_key;
+ ncwin->core.mouse = ami_hotlist_mouse;
+ ncwin->core.close = ami_hotlist_destroy;
+ ncwin->core.event = NULL;
+ ncwin->core.drag_end = ami_hotlist_drag_end;
+ ncwin->core.icon_drop = ami_hotlist_icon_drop;
+
+ res = ami_corewindow_init(&ncwin->core);
+ if (res != NSERROR_OK) {
+ ami_utf8_free(ncwin->core.wintitle);
+ DisposeObject(ncwin->core.objects[GID_CW_WIN]);
+ free(ncwin);
+ return res;
+ }
+
+ res = hotlist_manager_init(ncwin->core.cb_table, (struct core_window *)ncwin);
+ if (res != NSERROR_OK) {
+ ami_utf8_free(ncwin->core.wintitle);
+ DisposeObject(ncwin->core.objects[GID_CW_WIN]);
+ free(ncwin);
+ return res;
+ }
+
+ hotlist_window = ncwin;
+
+ return NSERROR_OK;
+}
+
+/* exported interface documented in amiga/hotlist.h */
+void ami_hotlist_close(void)
+{
+ ami_hotlist_destroy((struct ami_corewindow *)hotlist_window);
+}
+
diff --git a/frontends/amiga/hotlist.h b/frontends/amiga/hotlist.h
index 113a2d1c0..588a72de8 100755..100644
--- a/frontends/amiga/hotlist.h
+++ b/frontends/amiga/hotlist.h
@@ -1,5 +1,5 @@
/*
- * Copyright 2008, 2009 Chris Young <chris@unsatisfactorysoftware.co.uk>
+ * Copyright 2017 Chris Young <chris@unsatisfactorysoftware.co.uk>
*
* This file is part of NetSurf, http://www.netsurf-browser.org/
*
@@ -19,16 +19,18 @@
#ifndef AMIGA_HOTLIST_H
#define AMIGA_HOTLIST_H
-struct nsurl;
-struct treeview_window;
+#include "utils/nsurl.h"
-extern struct treeview_window *hotlist_window;
-
-void ami_hotlist_initialise(const char *hotlist_file);
-
-void ami_hotlist_free(const char *hotlist_file);
-
-nserror ami_hotlist_scan(void *userdata, int first_item, const char *folder, bool (*cb_add_item)(void *userdata, int level, int item, const char *title, struct nsurl *url, bool folder));
+/** Open the hotlist viewer */
+nserror ami_hotlist_present(void);
+/** Close the hotlist viewer
+ * normally this shouldn't be used; only exists for ARexx use
+ */
+void ami_hotlist_close(void);
+/** Scan the hotlist */
+nserror ami_hotlist_scan(void *userdata, int first_item, const char *folder,
+ bool (*cb_add_item)(void *userdata, int level, int item, const char *title, nsurl *url, bool folder));
#endif
+
diff --git a/frontends/amiga/menu.c b/frontends/amiga/menu.c
index d88139d9f..d8159323e 100644
--- a/frontends/amiga/menu.c
+++ b/frontends/amiga/menu.c
@@ -73,7 +73,6 @@
#include "amiga/print.h"
#include "amiga/search.h"
#include "amiga/theme.h"
-#include "amiga/tree.h"
#include "amiga/utf8.h"
#include "amiga/schedule.h"
@@ -106,7 +105,7 @@ static bool menu_glyphs_loaded = false;
const char * const netsurf_version;
const char * const verdate;
-static nserror ami_menu_scan(struct tree *tree, struct ami_menu_data **md);
+static nserror ami_menu_scan(struct ami_menu_data **md);
void ami_menu_arexx_scan(struct ami_menu_data **md);
void ami_menu_set_check_toggled(void)
@@ -362,7 +361,7 @@ HOOKF(void, ami_menu_item_browser_localhistory, APTR, window, struct IntuiMessag
HOOKF(void, ami_menu_item_browser_globalhistory, APTR, window, struct IntuiMessage *)
{
- ami_tree_open(global_history_window,AMI_TREE_HISTORY);
+ ami_history_global_present();
}
HOOKF(void, ami_menu_item_browser_cookies, APTR, window, struct IntuiMessage *)
@@ -456,7 +455,7 @@ HOOKF(void, ami_menu_item_hotlist_add, APTR, window, struct IntuiMessage *)
HOOKF(void, ami_menu_item_hotlist_show, APTR, window, struct IntuiMessage *)
{
- ami_tree_open(hotlist_window, AMI_TREE_HOTLIST);
+ ami_hotlist_present();
}
HOOKF(void, ami_menu_item_hotlist_entries, APTR, window, struct IntuiMessage *)
@@ -992,7 +991,7 @@ void ami_menu_free_menu(struct ami_menu_data **md, int max, struct Menu *imenu)
struct Menu *ami_menu_create(struct gui_window_2 *gwin)
{
ami_init_menulabs(gwin->menu_data);
- ami_menu_scan(ami_tree_get_tree(hotlist_window), gwin->menu_data); //\todo this needs to be MenuClass created
+ ami_menu_scan(gwin->menu_data); //\todo this needs to be MenuClass created
ami_menu_arexx_scan(gwin->menu_data);
gwin->imenu = ami_menu_layout(gwin->menu_data, AMI_MENU_AREXX_MAX);
@@ -1092,7 +1091,7 @@ static bool ami_menu_hotlist_add(void *userdata, int level, int item, const char
return true;
}
-static nserror ami_menu_scan(struct tree *tree, struct ami_menu_data **md)
+static nserror ami_menu_scan(struct ami_menu_data **md)
{
return ami_hotlist_scan((void *)md, AMI_MENU_HOTLIST, messages_get("HotlistMenu"), ami_menu_hotlist_add);
}
diff --git a/frontends/amiga/tree.c b/frontends/amiga/tree.c
deleted file mode 100644
index b9747c095..000000000
--- a/frontends/amiga/tree.c
+++ /dev/null
@@ -1,1484 +0,0 @@
-/*
- * Copyright 2008 - 2013 Chris Young <chris@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/>.
- */
-
-#include "amiga/os3support.h"
-
-#include <stdlib.h>
-#include <proto/window.h>
-#include <proto/layout.h>
-#include <proto/space.h>
-#include <proto/label.h>
-#include <proto/scroller.h>
-#include <proto/exec.h>
-#include <proto/intuition.h>
-#include <proto/button.h>
-#include <proto/bitmap.h>
-#include <proto/graphics.h>
-#include <proto/asl.h>
-#include <proto/utility.h>
-#include <proto/dos.h>
-
-#include <libraries/gadtools.h>
-#include <gadgets/button.h>
-#include <classes/window.h>
-#include <gadgets/space.h>
-#include <images/label.h>
-#include <images/bitmap.h>
-#include <gadgets/layout.h>
-#include <gadgets/scroller.h>
-#include <reaction/reaction_macros.h>
-#include <intuition/icclass.h>
-#ifdef __amigaos4__
-#include <graphics/blitattr.h>
-#endif
-
-#include <assert.h>
-#include <string.h>
-
-#include "utils/nsoption.h"
-#include "utils/utils.h"
-#include "utils/messages.h"
-#include "netsurf/browser_window.h"
-#include "netsurf/window.h"
-#include "netsurf/keypress.h"
-#include "content/llcache.h"
-#include "desktop/cookie_manager.h"
-#include "desktop/global_history.h"
-#include "desktop/hotlist.h"
-#include "desktop/sslcert_viewer.h"
-
-#include "amiga/gui.h"
-#include "amiga/tree.h"
-#include "amiga/file.h"
-#include "amiga/libs.h"
-#include "amiga/misc.h"
-#include "amiga/utf8.h"
-#include "amiga/sslcert.h"
-#include "amiga/drag.h" /* drag icon stuff */
-#include "amiga/theme.h" /* pointers */
-#include "amiga/filetype.h"
-#include "amiga/schedule.h"
-#include "amiga/plotters.h"
-
-#define AMI_TREE_MENU_ITEMS 26
-#define AMI_TREE_MENU_NEWDIR FULLMENUNUM(1,0,0)
-#define AMI_TREE_MENU_NEWURL FULLMENUNUM(1,1,0)
-#define AMI_TREE_MENU_EDIT FULLMENUNUM(1,3,0)
-#define AMI_TREE_MENU_DELETE FULLMENUNUM(1,5,0)
-#define AMI_TREE_MENU_CLEAR FULLMENUNUM(1,8,0)
-
-enum {
- GID_OPEN = GID_LAST,
- GID_TREE_LAST
-};
-
-
-struct treeview_window {
- struct ami_generic_window w;
- struct Window *win;
- Object *objects[GID_TREE_LAST];
- 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;
- char *wintitle;
- char *sslerr;
- char *sslaccept;
- char *sslreject;
- struct MinList *shared_pens;
-};
-
-struct ami_tree_redraw_req {
- int x;
- int y;
- int width;
- int height;
- struct treeview_window *twin;
-};
-
-static BOOL ami_tree_event(void *w);
-
-static const struct ami_win_event_table ami_tree_table = {
- ami_tree_event,
- ami_tree_close,
-};
-
-#if 0
-void ami_tree_draw(struct treeview_window *twin);
-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);
-#endif
-
-void ami_tree_destroy(struct treeview_window *twin)
-{
- tree_delete(twin->tree);
- free(twin->shared_pens);
- free(twin);
-}
-
-struct tree *ami_tree_get_tree(struct treeview_window *twin)
-{
- return twin->tree;
-}
-
-static void ami_tree_resized(struct tree *tree, int width, int height, void *data)
-{
- struct treeview_window *twin = data;
- struct IBox *bbox;
-
- twin->max_height = height;
- twin->max_width = width;
-
- if(twin->win)
- {
- if(ami_gui_get_space_box(twin->objects[GID_BROWSER], &bbox) != NSERROR_OK) {
- amiga_warn_user("NoMemory", "");
- return;
- }
-
- if(height == -1) {
- SetAttrs((APTR)twin->objects[OID_MAIN],
- WINDOW_VertProp, -1,
- TAG_DONE);
- } else {
- RefreshSetGadgetAttrs((APTR)twin->objects[OID_VSCROLL], twin->win, NULL,
- SCROLLER_Total, height,
- SCROLLER_Visible, bbox->Height,
- TAG_DONE);
- }
-
- if(width == -1) {
- SetAttrs((APTR)twin->objects[OID_MAIN],
- WINDOW_HorizProp, -1,
- TAG_DONE);
- } else {
- RefreshSetGadgetAttrs((APTR)twin->objects[OID_HSCROLL], twin->win, NULL,
- SCROLLER_Total, width,
- SCROLLER_Visible, bbox->Width,
- TAG_DONE);
- }
- ami_gui_free_space_box(bbox);
- }
-}
-
-/**
- * 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
- */
-static void ami_tree_get_window_dimensions(int *width, int *height, void *data)
-{
- struct treeview_window *twin = data;
- struct IBox *bbox;
-
- if(ami_gui_get_space_box(twin->objects[GID_BROWSER], &bbox) != NSERROR_OK) {
- amiga_warn_user("NoMemory", "");
- return;
- }
-
- if(width) *width = bbox->Width;
- if(height) *height = bbox->Height;
-
- ami_gui_free_space_box(bbox);
-}
-
-static void ami_tree_redraw_req_dr(void *p)
-{
- struct ami_tree_redraw_req *atrr_data = (struct ami_tree_redraw_req *)p;
- int x = atrr_data->x;
- int y = atrr_data->y;
- int width = atrr_data->width;
- int height = atrr_data->height;
- struct treeview_window *twin = atrr_data->twin;
- struct IBox *bbox;
- int pos_x, pos_y;
- struct RastPort *temprp;
- struct redraw_context ctx = {
- .interactive = true,
- .background_images = true,
- .plot = &amiplot
- };
-
- if(!twin->win) return;
-
- ami_update_pointer(twin->win, GUI_POINTER_WAIT);
-
- glob = &twin->globals;
- temprp = glob->rp;
- glob->rp = twin->win->RPort;
-
- GetAttr(SCROLLER_Top, twin->objects[OID_HSCROLL], (ULONG *)&pos_x);
- GetAttr(SCROLLER_Top, twin->objects[OID_VSCROLL], (ULONG *)&pos_y);
-
- if(ami_gui_get_space_box(twin->objects[GID_BROWSER], &bbox) != NSERROR_OK) {
- amiga_warn_user("NoMemory", "");
- free(atrr_data);
- return;
- }
-
- x += bbox->Left;
- y += bbox->Top;
-
- 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);
-
- if(x < pos_x) {
- width -= pos_x - x;
- x = pos_x;
- }
-
- if(y < pos_y) {
- height -= pos_y - y;
- y = pos_y;
- }
-
- tree_draw(twin->tree, bbox->Left - pos_x, bbox->Top - pos_y,
- atrr_data->x, atrr_data->y,
- atrr_data->width, atrr_data->height, &ctx);
-
- free(atrr_data);
- ami_gui_free_space_box(bbox);
- ami_update_pointer(twin->win, GUI_POINTER_DEFAULT);
- ami_clearclipreg(glob);
- glob->rp = temprp;
- ami_gui_set_default_gg();
-}
-
-static void ami_tree_redraw_req(void *p)
-{
- struct ami_tree_redraw_req *atrr_data = (struct ami_tree_redraw_req *)p;
- int x = atrr_data->x;
- int y = atrr_data->y;
- int width = atrr_data->width;
- int height = atrr_data->height;
- struct treeview_window *twin = atrr_data->twin;
- struct IBox *bbox;
- int pos_x, pos_y;
- int tile_x, tile_y, tile_w, tile_h;
- struct redraw_context ctx = {
- .interactive = true,
- .background_images = true,
- .plot = &amiplot
- };
-
- free(atrr_data);
-
- if(!twin->win) return;
-
- ami_update_pointer(twin->win, GUI_POINTER_WAIT);
-
- glob = &twin->globals;
-
- GetAttr(SCROLLER_Top, twin->objects[OID_HSCROLL], (ULONG *)&pos_x);
- GetAttr(SCROLLER_Top, twin->objects[OID_VSCROLL], (ULONG *)&pos_y);
-
- if(ami_gui_get_space_box(twin->objects[GID_BROWSER], &bbox) != NSERROR_OK) {
- amiga_warn_user("NoMemory", "");
- return;
- }
-
- 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);
-
- if(x < pos_x) {
- width -= pos_x - x;
- x = pos_x;
- }
-
- if(y < pos_y) {
- height -= pos_y - y;
- y = pos_y;
- }
-
- for(tile_y = y; tile_y < (y + height); tile_y += nsoption_int(redraw_tile_size_y)) {
- tile_h = nsoption_int(redraw_tile_size_y);
- if(((y + height) - tile_y) < nsoption_int(redraw_tile_size_y))
- tile_h = (y + height) - tile_y;
-
- for(tile_x = x; tile_x < (x + width); tile_x += nsoption_int(redraw_tile_size_x)) {
- tile_w = nsoption_int(redraw_tile_size_x);
- if(((x + width) - tile_x) < nsoption_int(redraw_tile_size_x))
- tile_w = (x + width) - tile_x;
-
- tree_draw(twin->tree, - tile_x, - tile_y,
- tile_x, tile_y, tile_w, tile_h, &ctx);
-#ifdef __amigaos4__
- BltBitMapTags(BLITA_SrcType, BLITT_BITMAP,
- BLITA_Source, twin->globals.bm,
- BLITA_SrcX, 0,
- BLITA_SrcY, 0,
- BLITA_DestType, BLITT_RASTPORT,
- BLITA_Dest, twin->win->RPort,
- BLITA_DestX, bbox->Left + tile_x - pos_x,
- BLITA_DestY, bbox->Top + tile_y - pos_y,
- BLITA_Width, tile_w,
- BLITA_Height, tile_h,
- TAG_DONE);
-#else
- BltBitMapRastPort(twin->globals.bm, 0, 0,
- twin->win->RPort, bbox->Left + tile_x - pos_x, bbox->Top + tile_y - pos_y,
- tile_w, tile_h, 0xC0);
-#endif
- }
- }
-
- ami_gui_free_space_box(bbox);
- ami_update_pointer(twin->win, GUI_POINTER_DEFAULT);
- ami_clearclipreg(glob);
- ami_gui_set_default_gg();
-}
-
-static void ami_tree_redraw_request(int x, int y, int width, int height, void *data)
-{
- struct ami_tree_redraw_req *atrr_data = malloc(sizeof(struct ami_tree_redraw_req));
-
- atrr_data->x = x;
- atrr_data->y = y;
- atrr_data->width = width;
- atrr_data->height = height;
- atrr_data->twin = (struct treeview_window *)data;
-
- /** /todo Queue these requests properly like the main browser code does
- **/
-
- if(nsoption_bool(direct_render) == false)
- ami_schedule(0, ami_tree_redraw_req, atrr_data);
- else
- ami_schedule(0, ami_tree_redraw_req_dr, atrr_data);
-}
-
-static void ami_tree_draw(struct treeview_window *twin)
-{
- struct IBox *bbox;
- int x, y;
-
- if(!twin) return;
-
- GetAttr(SCROLLER_Top, twin->objects[OID_HSCROLL], (ULONG *)&x);
- GetAttr(SCROLLER_Top, twin->objects[OID_VSCROLL], (ULONG *)&y);
-
- if(ami_gui_get_space_box(twin->objects[GID_BROWSER], &bbox) != NSERROR_OK) {
- amiga_warn_user("NoMemory", "");
- return;
- }
-
- ami_tree_redraw_request(x, y, bbox->Width, bbox->Height, twin);
-
- ami_gui_free_space_box(bbox);
-}
-
-/**
- * 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
- */
-static void ami_tree_scroll_visible(int y, int height, void *data)
-{
- int sy, scrollset;
- struct IBox *bbox;
- struct treeview_window *twin = data;
-
- GetAttr(SCROLLER_Top, twin->objects[OID_VSCROLL], (ULONG *)&sy);
- if(ami_gui_get_space_box(twin->objects[GID_BROWSER], &bbox) != NSERROR_OK) {
- amiga_warn_user("NoMemory", "");
- return;
- }
-
- if((y > sy) && ((y + height) < (sy + bbox->Height))) {
- ami_gui_free_space_box(bbox);
- return;
- }
-
- if((y <= sy) || (height > bbox->Height)) scrollset = (ULONG)y;
- else scrollset = sy + (y + height) - (sy + bbox->Height);
-
- RefreshSetGadgetAttrs((APTR)twin->objects[OID_VSCROLL], twin->win, NULL,
- SCROLLER_Top, scrollset,
- TAG_DONE);
-
- ami_gui_free_space_box(bbox);
- ami_tree_draw(twin);
-}
-
-static void ami_tree_scroll(struct treeview_window *twin, int sx, int sy)
-{
- int x, y;
-
- if(!twin) return;
-
- GetAttr(SCROLLER_Top, twin->objects[OID_HSCROLL], (ULONG *)&x);
- GetAttr(SCROLLER_Top, twin->objects[OID_VSCROLL], (ULONG *)&y);
-
- x += sx;
- y += sy;
-
- if(y < 0) y = 0;
- if(x < 0) x = 0;
-
- RefreshSetGadgetAttrs((APTR)twin->objects[OID_VSCROLL], twin->win, NULL,
- SCROLLER_Top, y,
- TAG_DONE);
-
- RefreshSetGadgetAttrs((APTR)twin->objects[OID_HSCROLL], twin->win, NULL,
- SCROLLER_Top, x,
- TAG_DONE);
-
- ami_tree_draw(twin);
-}
-
-static void ami_tree_drag_icon_show(struct treeview_window *twin)
-{
- const char *type = "project";
- nsurl *url = NULL;
- const char *title = NULL;
-
- if((twin->type == AMI_TREE_COOKIES) ||
- (twin->type == AMI_TREE_SSLCERT)) return; /* No permissable drag operations */
-
- if((tree_drag_status(twin->tree) == TREE_SELECT_DRAG) ||
- (tree_drag_status(twin->tree) == TREE_TEXTAREA_DRAG))
- return;
-
- if((twin->type == AMI_TREE_HOTLIST) && (hotlist_has_selection())) {
- hotlist_get_selection(&url, &title);
- } else if((twin->type == AMI_TREE_HISTORY) && (global_history_has_selection())) {
- global_history_get_selection(&url, &title);
- }
-
- if(title && (url == NULL))
- {
- ami_drag_icon_show(twin->win, "drawer");
- }
- else
- {
- ami_drag_icon_show(twin->win, type);
- }
-}
-
-static void ami_tree_drag_end(struct treeview_window *twin, int x, int y)
-{
- struct gui_window_2 *gwin;
- struct treeview_window *tw;
- BOOL drag;
- nsurl *url = NULL;
- const char *title = NULL;
- bool ok = false;
-
- if((drag = ami_drag_in_progress())) ami_drag_icon_close(twin->win);
-
- if(drag && (twin != ami_window_at_pointer(AMINS_TVWINDOW)))
- {
- if((twin->type == AMI_TREE_HOTLIST) && (hotlist_has_selection())) {
- ok = hotlist_get_selection(&url, &title);
- } else if((twin->type == AMI_TREE_HISTORY) && (global_history_has_selection())) {
- ok = global_history_get_selection(&url, &title);
- }
-
- if((ok == false) || (url == NULL)) {
- DisplayBeep(scrn);
- } else if(url) {
- if((gwin = ami_window_at_pointer(AMINS_WINDOW))) {
- browser_window_navigate(gwin->gw->bw,
- url,
- NULL,
- BW_NAVIGATE_HISTORY,
- NULL,
- NULL,
- NULL);
- } else if((tw = ami_window_at_pointer(AMINS_TVWINDOW)) &&
- (tw != twin) && (tw->type == AMI_TREE_HOTLIST)) {
- hotlist_add_entry(url, title, true, y);
- }
- }
- tree_mouse_action(twin->tree, twin->mouse_state | twin->key_state,
- twin->drag_x, twin->drag_y); /* Keep the tree happy */
- tree_drag_end(twin->tree, twin->mouse_state,
- twin->drag_x, twin->drag_y,
- twin->drag_x, twin->drag_y); /* Keep the tree happier */
- } else {
- if(tree_drag_status(twin->tree) == TREE_UNKNOWN_DRAG)
- DisplayBeep(scrn);
-
- tree_drag_end(twin->tree, twin->mouse_state,
- twin->drag_x, twin->drag_y, x, y);
- }
-}
-
-HOOKF(void, ami_tree_scroller_hook, Object *, object, struct IntuiMessage *)
-{
- ULONG gid;
- struct treeview_window *twin = hook->h_Data;
- struct IntuiWheelData *wheel;
-
- 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;
-#ifdef __amigaos4__
- case IDCMP_EXTENDEDMOUSE:
- if(msg->Code == IMSGCODE_INTUIWHEELDATA)
- {
- wheel = (struct IntuiWheelData *)msg->IAddress;
-
- ami_tree_scroll(twin, (wheel->WheelX * 20), (wheel->WheelY * 20));
- }
- break;
-#endif
- }
-}
-
-static void ami_tree_menu(struct treeview_window *twin)
-{
- if(twin->menu) return;
-
- if((twin->menu = calloc(1, sizeof(struct NewMenu) * AMI_TREE_MENU_ITEMS))) {
- 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("SnapshotWindow"));
- twin->menu[12].nm_Label = twin->menu_name[12];
-
- twin->menu[13].nm_Type = NM_ITEM;
- twin->menu[13].nm_Label = NM_BARLABEL;
-
- twin->menu[14].nm_Type = NM_ITEM;
- twin->menu_name[14] = ami_utf8_easy((char *)messages_get("CloseWindow"));
- twin->menu[14].nm_Label = twin->menu_name[14];
- twin->menu[14].nm_CommKey = "K";
-
- twin->menu[15].nm_Type = NM_TITLE;
- twin->menu_name[15] = ami_utf8_easy((char *)messages_get("Edit"));
- twin->menu[15].nm_Label = twin->menu_name[15];
-
- twin->menu[16].nm_Type = NM_ITEM;
- twin->menu_name[16] = ami_utf8_easy((char *)messages_get("TreeNewFolder"));
- twin->menu[16].nm_Label = twin->menu_name[16];
- twin->menu[16].nm_CommKey = "N";
-
- twin->menu[17].nm_Type = NM_ITEM;
- twin->menu_name[17] = ami_utf8_easy((char *)messages_get("TreeNewLink"));
- twin->menu[17].nm_Label = twin->menu_name[17];
-
- twin->menu[18].nm_Type = NM_ITEM;
- twin->menu[18].nm_Label = NM_BARLABEL;
-
- twin->menu[19].nm_Type = NM_ITEM;
- twin->menu_name[19] = ami_utf8_easy((char *)messages_get("TreeEdit"));
- twin->menu[19].nm_Label = twin->menu_name[19];
- twin->menu[19].nm_CommKey = "E";
-
- twin->menu[20].nm_Type = NM_ITEM;
- twin->menu[20].nm_Label = NM_BARLABEL;
-
- twin->menu[21].nm_Type = NM_ITEM;
- twin->menu_name[21] = ami_utf8_easy((char *)messages_get("TreeDelete"));
- twin->menu[21].nm_Label = twin->menu_name[21];
- twin->menu[21].nm_CommKey = "D";
-
- twin->menu[22].nm_Type = NM_ITEM;
- twin->menu[22].nm_Label = NM_BARLABEL;
-
- twin->menu[23].nm_Type = NM_ITEM;
- twin->menu_name[23] = ami_utf8_easy((char *)messages_get("SelectAllNS"));
- twin->menu[23].nm_Label = twin->menu_name[23];
- twin->menu[23].nm_CommKey = "A";
-
- twin->menu[24].nm_Type = NM_ITEM;
- twin->menu_name[24] = ami_utf8_easy((char *)messages_get("ClearNS"));
- twin->menu[24].nm_Label = twin->menu_name[24];
-
- twin->menu[25].nm_Type = NM_END;
- twin->menu_name[25] = NULL;
- }
-}
-
-static void ami_tree_update_buttons(struct treeview_window *twin)
-{
- if(twin->type == AMI_TREE_SSLCERT) return;
- if(twin->menu == NULL) return;
-
- if(twin->type != AMI_TREE_HOTLIST) {
- OffMenu(twin->win, AMI_TREE_MENU_NEWDIR);
- OffMenu(twin->win, AMI_TREE_MENU_NEWURL);
- }
-
- if((twin->type == AMI_TREE_HOTLIST) && (hotlist_has_selection())) {
- OnMenu(twin->win, AMI_TREE_MENU_EDIT);
- } else {
- OffMenu(twin->win, AMI_TREE_MENU_EDIT);
- }
-
- if(((twin->type == AMI_TREE_HOTLIST) && (hotlist_has_selection())) ||
- ((twin->type == AMI_TREE_COOKIES) && (cookie_manager_has_selection())) ||
- ((twin->type == AMI_TREE_HISTORY) && (global_history_has_selection()))) {
- OnMenu(twin->win, AMI_TREE_MENU_DELETE);
- OnMenu(twin->win, AMI_TREE_MENU_CLEAR);
- } else {
- OffMenu(twin->win, AMI_TREE_MENU_DELETE);
- OffMenu(twin->win, AMI_TREE_MENU_CLEAR);
- }
-}
-
-void ami_tree_open(struct treeview_window *twin,int type)
-{
- if(twin->win)
- {
- WindowToFront(twin->win);
- ActivateWindow(twin->win);
- return;
- }
-
- twin->type = type;
-
- switch(twin->type)
- {
- case AMI_TREE_HOTLIST:
- twin->wintitle = ami_utf8_easy((char *)messages_get("Hotlist"));
- break;
- case AMI_TREE_COOKIES:
- twin->wintitle = ami_utf8_easy((char *)messages_get("Cookies"));
- break;
- case AMI_TREE_HISTORY:
- twin->wintitle = ami_utf8_easy((char *)messages_get("GlobalHistory"));
- break;
- case AMI_TREE_SSLCERT:
- twin->wintitle = ami_utf8_easy((char *)messages_get("SSLCerts"));
- twin->sslerr = ami_utf8_easy((char *)messages_get("SSLError"));
- twin->sslaccept = ami_utf8_easy((char *)messages_get("SSL_Certificate_Accept"));
- twin->sslreject = ami_utf8_easy((char *)messages_get("SSL_Certificate_Reject"));
- break;
- }
-
- twin->scrollerhook.h_Entry = (void *)ami_tree_scroller_hook;
- twin->scrollerhook.h_Data = twin;
-
- ami_init_layers(&twin->globals, 0, 0, false);
- ami_tree_menu(twin);
-
- if(type == AMI_TREE_SSLCERT)
- {
- twin->objects[OID_MAIN] = WindowObj,
- WA_ScreenTitle, ami_gui_get_screen_title(),
- WA_Title, twin->wintitle,
- WA_Activate, TRUE,
- WA_DepthGadget, TRUE,
- WA_DragBar, TRUE,
- WA_CloseGadget, TRUE,
- WA_SizeGadget, TRUE,
- WA_SizeBRight, TRUE,
- WA_Height, scrn->Height / 2,
- WA_PubScreen,scrn,
- WA_ReportMouse,TRUE,
- WA_IDCMP, IDCMP_MOUSEMOVE | IDCMP_MOUSEBUTTONS | IDCMP_NEWSIZE |
- IDCMP_RAWKEY | IDCMP_GADGETUP | IDCMP_IDCMPUPDATE |
- IDCMP_EXTENDEDMOUSE | IDCMP_SIZEVERIFY,
- 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, -> No menu for SSL Cert */
- WINDOW_IconifyGadget, FALSE,
- WINDOW_Position, WPOS_CENTERSCREEN,
- WINDOW_ParentGroup, twin->objects[GID_MAIN] = LayoutVObj,
- LAYOUT_AddImage, LabelObj,
- LABEL_Text, twin->sslerr,
- LabelEnd,
- LAYOUT_AddChild, twin->objects[GID_BROWSER] = SpaceObj,
- GA_ID, GID_BROWSER,
- SPACE_Transparent,TRUE,
- SPACE_BevelStyle, BVS_DISPLAY,
- SpaceEnd,
- LAYOUT_AddChild, LayoutHObj,
- LAYOUT_AddChild, twin->objects[GID_OPEN] = ButtonObj,
- GA_ID,GID_OPEN,
- GA_Text, twin->sslaccept,
- GA_RelVerify,TRUE,
- ButtonEnd,
- LAYOUT_AddChild, twin->objects[GID_CANCEL] = ButtonObj,
- GA_ID,GID_CANCEL,
- GA_Text, twin->sslreject,
- GA_RelVerify,TRUE,
- ButtonEnd,
- EndGroup,
- CHILD_WeightedHeight,0,
- EndGroup,
- EndWindow;
- }
- else
- {
- ULONG width = scrn->Width / 2;
- ULONG height = scrn->Height / 2;
- ULONG top = (scrn->Height / 2) - (height / 2);
- ULONG left = (scrn->Width / 2) - (width / 2);
-
- if((type == AMI_TREE_HOTLIST) && (nsoption_int(hotlist_window_xsize) > 0))
- {
- top = nsoption_int(hotlist_window_ypos);
- left = nsoption_int(hotlist_window_xpos);
- width = nsoption_int(hotlist_window_xsize);
- height = nsoption_int(hotlist_window_ysize);
- }
- else if((type == AMI_TREE_HISTORY) && (nsoption_int(history_window_xsize) > 0))
- {
- top = nsoption_int(history_window_ypos);
- left = nsoption_int(history_window_xpos);
- width = nsoption_int(history_window_xsize);
- height = nsoption_int(history_window_ysize);
- }
- else if((type == AMI_TREE_COOKIES) && (nsoption_int(cookies_window_xsize) > 0))
- {
- top = nsoption_int(cookies_window_ypos);
- left = nsoption_int(cookies_window_xpos);
- width = nsoption_int(cookies_window_xsize);
- height = nsoption_int(cookies_window_ysize);
- }
-
- twin->objects[OID_MAIN] = WindowObj,
- WA_ScreenTitle, ami_gui_get_screen_title(),
- WA_Title, twin->wintitle,
- WA_Activate, TRUE,
- WA_DepthGadget, TRUE,
- WA_DragBar, TRUE,
- WA_CloseGadget, TRUE,
- WA_SizeGadget, TRUE,
- WA_SizeBRight, TRUE,
- WA_Top, top,
- WA_Left, left,
- WA_Width, width,
- WA_Height, height,
- WA_PubScreen,scrn,
- WA_ReportMouse,TRUE,
- WA_IDCMP, IDCMP_MOUSEMOVE | IDCMP_MOUSEBUTTONS | IDCMP_NEWSIZE |
- IDCMP_RAWKEY | IDCMP_GADGETUP | IDCMP_IDCMPUPDATE |
- IDCMP_EXTENDEDMOUSE | IDCMP_SIZEVERIFY | IDCMP_INTUITICKS,
- 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->objects[GID_MAIN] = LayoutVObj,
- LAYOUT_AddChild, twin->objects[GID_BROWSER] = SpaceObj,
- GA_ID, GID_BROWSER,
- SPACE_Transparent,TRUE,
- SPACE_BevelStyle, BVS_DISPLAY,
- SpaceEnd,
- EndGroup,
- EndWindow;
- }
-
- twin->win = (struct Window *)RA_OpenWindow(twin->objects[OID_MAIN]);
-
- GetAttr(WINDOW_HorizObject, twin->objects[OID_MAIN],
- (ULONG *)&twin->objects[OID_HSCROLL]);
- GetAttr(WINDOW_VertObject, twin->objects[OID_MAIN],
- (ULONG *)&twin->objects[OID_VSCROLL]);
-
- RefreshSetGadgetAttrs((APTR)twin->objects[OID_VSCROLL], twin->win, NULL,
- GA_ID,OID_VSCROLL,
- ICA_TARGET,ICTARGET_IDCMP,
- TAG_DONE);
-
- RefreshSetGadgetAttrs((APTR)twin->objects[OID_HSCROLL], twin->win, NULL,
- GA_ID,OID_HSCROLL,
- ICA_TARGET,ICTARGET_IDCMP,
- TAG_DONE);
-
- ami_gui_win_list_add(twin, AMINS_TVWINDOW, &ami_tree_table);
-
- ami_tree_update_buttons(twin);
- ami_tree_resized(twin->tree, twin->max_width, twin->max_height, twin);
- ami_tree_draw(twin);
-}
-
-void ami_tree_close(void *w)
-{
- struct treeview_window *twin = (struct treeview_window *)w;
- int i;
-
- twin->win = NULL;
- DisposeObject(twin->objects[OID_MAIN]);
- ami_gui_win_list_remove(twin);
- ami_plot_release_pens(twin->shared_pens);
- 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]);
- twin->menu_name[i] = NULL;
- }
-
- free(twin->menu);
- twin->menu = NULL;
- ami_utf8_free(twin->wintitle);
- twin->wintitle = NULL;
- if(twin->type == AMI_TREE_SSLCERT) {
- ami_utf8_free(twin->sslerr);
- ami_utf8_free(twin->sslaccept);
- ami_utf8_free(twin->sslreject);
- //ami_ssl_free(twin);
- }
-
- if(twin->type == AMI_TREE_HOTLIST)
- ami_gui_hotlist_update_all();
-}
-
-static void ami_tree_update_quals(struct treeview_window *twin)
-{
- uint32 quals = 0;
-#ifdef __amigaos4__
- GetAttr(WINDOW_Qualifier, twin->objects[OID_MAIN], (uint32 *)&quals);
-#else
-#warning FIXME not reading qualifiers on OS3
-#endif
- twin->key_state = 0;
-
- if((quals & IEQUALIFIER_LSHIFT) || (quals & IEQUALIFIER_RSHIFT))
- {
- twin->key_state |= BROWSER_MOUSE_MOD_1;
- }
-
- if(quals & IEQUALIFIER_CONTROL)
- {
- twin->key_state |= BROWSER_MOUSE_MOD_2;
- }
-
- if((quals & IEQUALIFIER_LALT) || (quals & IEQUALIFIER_RALT))
- {
- twin->key_state |= BROWSER_MOUSE_MOD_3;
- }
-}
-
-static BOOL ami_tree_event(void *w)
-{
- /* return TRUE if window destroyed */
- struct treeview_window *twin = (struct treeview_window *)w;
- ULONG result,storage = 0;
- uint16 code;
- struct MenuItem *item;
- 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];
- static int drag_x_move = 0, drag_y_move = 0;
-
- while((result = RA_HandleInput(twin->objects[OID_MAIN],&code)) != WMHI_LASTMSG)
- {
- switch(result & WMHI_CLASSMASK) // class
- {
- case WMHI_GADGETUP:
- switch(result & WMHI_GADGETMASK)
- {
- case GID_OPEN:
- sslcert_viewer_accept(twin->ssl_data);
- ami_tree_close(twin);
- return TRUE;
- break;
-
- case GID_CANCEL:
- sslcert_viewer_reject(twin->ssl_data);
- ami_tree_close(twin);
- return TRUE;
- break;
- }
- break;
-
- case WMHI_MOUSEMOVE:
- drag_x_move = 0;
- drag_y_move = 0;
-
- if(ami_gui_get_space_box(twin->objects[GID_BROWSER], &bbox) != NSERROR_OK) {
- amiga_warn_user("NoMemory", "");
- break;
- }
-
- 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;
-
- if(twin->mouse_state & BROWSER_MOUSE_DRAG_ON)
- {
- ami_drag_icon_move();
-
- if((twin->win->MouseX < bbox->Left) &&
- ((twin->win->MouseX - bbox->Left) > -AMI_DRAG_THRESHOLD))
- drag_x_move = twin->win->MouseX - bbox->Left;
- if((twin->win->MouseX > (bbox->Left + bbox->Width)) &&
- ((twin->win->MouseX - (bbox->Left + bbox->Width)) < AMI_DRAG_THRESHOLD))
- drag_x_move = twin->win->MouseX - (bbox->Left + bbox->Width);
- if((twin->win->MouseY < bbox->Top) &&
- ((twin->win->MouseY - bbox->Top) > -AMI_DRAG_THRESHOLD))
- drag_y_move = twin->win->MouseY - bbox->Top;
- if((twin->win->MouseY > (bbox->Top + bbox->Height)) &&
- ((twin->win->MouseY - (bbox->Top + bbox->Height)) < AMI_DRAG_THRESHOLD))
- drag_y_move = twin->win->MouseY - (bbox->Top + bbox->Height);
-
- tree_mouse_action(twin->tree, twin->mouse_state | twin->key_state, x, y);
- }
-
- if((x >= xs) && (y >= ys) && (x < bbox->Width + xs) &&
- (y < bbox->Height + ys))
- {
- ami_tree_update_quals(twin);
-
- if(twin->mouse_state & BROWSER_MOUSE_PRESS_1)
- {
- if((abs(x - twin->drag_x) + abs(y - twin->drag_y)) > 2)
- {
- 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;
- ami_tree_drag_icon_show(twin);
- }
- }
- else if(twin->mouse_state & BROWSER_MOUSE_PRESS_2)
- {
- if((abs(x - twin->drag_x) + abs(y - twin->drag_y)) > 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;
- ami_tree_drag_icon_show(twin);
- }
- }
- }
- ami_gui_free_space_box(bbox);
-
- twin->lastclick.tv_sec = 0;
- twin->lastclick.tv_usec = 0;
- break;
-
- case WMHI_MOUSEBUTTONS:
- if(ami_gui_get_space_box((Object *)twin->objects[GID_BROWSER], &bbox) != NSERROR_OK) {
- amiga_warn_user("NoMemory", "");
- break;
- }
-
- 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;
-
- ami_tree_update_quals(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;
- if(twin->drag_x == 0) twin->drag_x = x;
- if(twin->drag_y == 0) twin->drag_y = y;
- break;
- case MIDDLEDOWN:
- twin->mouse_state = BROWSER_MOUSE_PRESS_2;
- if(twin->drag_x == 0) twin->drag_x = x;
- if(twin->drag_y == 0) twin->drag_y = y;
- break;
- case MENUDOWN:
-#if 0
- if(tree_node_has_selection(tree_get_root(twin->tree)) == false)
- {
- tree_set_node_selected_at(twin->tree, x, y, true);
- }
- ami_context_menu_show_tree(twin->tree, twin->win, twin->type);
-#endif
- break;
- }
- }
-
- 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;
-
- ami_gui_free_space_box(bbox);
-
- switch(code)
- {
- case SELECTUP:
- if(twin->mouse_state & BROWSER_MOUSE_PRESS_1)
- {
- CurrentTime((ULONG *)&curtime.tv_sec, (ULONG *)&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 ami_tree_drag_end(twin, 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)
- {
- CurrentTime((ULONG *)&curtime.tv_sec, (ULONG *)&curtime.tv_usec);
-
- twin->mouse_state = BROWSER_MOUSE_CLICK_2;
-
- 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 ami_tree_drag_end(twin, x, y);
-
- twin->mouse_state=0;
- twin->drag_x = 0;
- twin->drag_y = 0;
- break;
-
- case SELECTDOWN:
- case MIDDLEDOWN:
- tree_mouse_action(twin->tree,
- twin->mouse_state | twin->key_state, x, y);
- break;
- }
- ami_tree_update_buttons(twin);
- break;
-
- 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);
- if(nskey == NS_KEY_COPY_SELECTION) {
- /* if we've copied a selection we need to clear it - style guide rules */
- tree_keypress(twin->tree, NS_KEY_CLEAR_SELECTION);
- }
- break;
-
- case WMHI_MENUPICK:
- item = ItemAddress(twin->win->MenuStrip,code);
- while (code != MENUNULL)
- {
- menunum = MENUNUM(code);
- itemnum = ITEMNUM(code);
- subnum = SUBNUM(code);
-
- switch(menunum)
- {
- case 0: // tree
- switch(itemnum)
- {
- case 0: // export
- if(AslRequestTags(savereq,
- ASLFR_Window, twin->win,
- ASLFR_SleepWindow, TRUE,
- 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)
- global_history_export(fname, NULL);
- else if(twin->type == AMI_TREE_HOTLIST)
- hotlist_export(fname, NULL);
- ami_update_pointer(twin->win, GUI_POINTER_DEFAULT);
- }
- break;
-
- case 2: // expand
- switch(subnum)
- {
- case 0: // all
- switch(twin->type)
- {
- case AMI_TREE_HISTORY:
- global_history_expand(false);
- break;
- case AMI_TREE_COOKIES:
- cookie_manager_expand(false);
- break;
- case AMI_TREE_HOTLIST:
- hotlist_expand(false);
- break;
- }
- break;
-
- case 1: // lev 1
- switch(twin->type)
- {
- case AMI_TREE_HISTORY:
- global_history_expand(true);
- break;
- case AMI_TREE_COOKIES:
- cookie_manager_expand(true);
- break;
- case AMI_TREE_HOTLIST:
- hotlist_expand(true);
- break;
- }
- break;
-
- case 2: // lev 2
- switch(twin->type)
- {
- case AMI_TREE_HISTORY:
- global_history_expand(false);
- break;
- case AMI_TREE_COOKIES:
- cookie_manager_expand(false);
- break;
- case AMI_TREE_HOTLIST:
- hotlist_expand(false);
- break;
- }
- break;
- }
- break;
-
- case 3: // collapse
- switch(subnum)
- {
- case 0: // all
- switch(twin->type)
- {
- case AMI_TREE_HISTORY:
- global_history_contract(true);
- break;
- case AMI_TREE_COOKIES:
- cookie_manager_contract(true);
- break;
- case AMI_TREE_HOTLIST:
- hotlist_contract(true);
- break;
- }
- break;
-
- case 1: // lev 1
- switch(twin->type)
- {
- case AMI_TREE_HISTORY:
- global_history_contract(true);
- break;
- case AMI_TREE_COOKIES:
- cookie_manager_contract(true);
- break;
- case AMI_TREE_HOTLIST:
- hotlist_contract(true);
- break;
- }
- break;
-
- case 2: // lev 2
- switch(twin->type)
- {
- case AMI_TREE_HISTORY:
- global_history_contract(false);
- break;
- case AMI_TREE_COOKIES:
- cookie_manager_contract(false);
- break;
- case AMI_TREE_HOTLIST:
- hotlist_contract(false);
- break;
- }
- break;
- }
- break;
-
- case 5: // snapshot
- switch(twin->type)
- {
- case AMI_TREE_HISTORY:
- nsoption_set_int(history_window_ypos, twin->win->TopEdge);
- nsoption_set_int(history_window_xpos, twin->win->LeftEdge);
- nsoption_set_int(history_window_xsize, twin->win->Width);
- nsoption_set_int(history_window_ysize, twin->win->Height);
- break;
- case AMI_TREE_COOKIES:
- nsoption_set_int(cookies_window_ypos, twin->win->TopEdge);
- nsoption_set_int(cookies_window_xpos, twin->win->LeftEdge);
- nsoption_set_int(cookies_window_xsize, twin->win->Width);
- nsoption_set_int(cookies_window_ysize, twin->win->Height);
- break;
- case AMI_TREE_HOTLIST:
- nsoption_set_int(hotlist_window_ypos, twin->win->TopEdge);
- nsoption_set_int(hotlist_window_xpos, twin->win->LeftEdge);
- nsoption_set_int(hotlist_window_xsize, twin->win->Width);
- nsoption_set_int(hotlist_window_ysize, twin->win->Height);
- break;
- }
- break;
-
- case 7: // close
- ami_tree_close(twin);
- return TRUE;
- break;
- }
- break;
-
- case 1: // edit
- switch(itemnum)
- {
- case 0: // new folder
- hotlist_add_folder(NULL, false, 0);
- break;
-
- case 1: // new entry
- hotlist_add_entry(NULL, NULL, false, 0);
- break;
-
- case 3: // edit
- hotlist_edit_selection();
- break;
-
- case 5: // delete
- switch(twin->type)
- {
- case AMI_TREE_HISTORY:
- global_history_keypress(NS_KEY_DELETE_LEFT);
- break;
- case AMI_TREE_COOKIES:
- cookie_manager_keypress(NS_KEY_DELETE_LEFT);
- break;
- case AMI_TREE_HOTLIST:
- hotlist_keypress(NS_KEY_DELETE_LEFT);
- break;
- }
- ami_tree_update_buttons(twin);
- break;
-
- case 7: // select all
- switch(twin->type)
- {
- case AMI_TREE_HISTORY:
- global_history_keypress(NS_KEY_SELECT_ALL);
- break;
- case AMI_TREE_COOKIES:
- cookie_manager_keypress(NS_KEY_SELECT_ALL);
- break;
- case AMI_TREE_HOTLIST:
- hotlist_keypress(NS_KEY_SELECT_ALL);
- break;
- }
- ami_tree_update_buttons(twin);
- break;
-
- case 8: // clear
- switch(twin->type)
- {
- case AMI_TREE_HISTORY:
- global_history_keypress(NS_KEY_CLEAR_SELECTION);
- break;
- case AMI_TREE_COOKIES:
- cookie_manager_keypress(NS_KEY_CLEAR_SELECTION);
- break;
- case AMI_TREE_HOTLIST:
- hotlist_keypress(NS_KEY_CLEAR_SELECTION);
- break;
- }
- ami_tree_update_buttons(twin);
- break;
- }
- break;
- }
-
- code = item->NextSelect;
- }
- break;
-
- case WMHI_NEWSIZE:
- ami_tree_resized(twin->tree, twin->max_width, twin->max_height, twin);
- ami_tree_draw(twin);
- break;
-
- case WMHI_CLOSEWINDOW:
- if(twin->type == AMI_TREE_SSLCERT)
- sslcert_viewer_reject(twin->ssl_data);
- ami_tree_close(twin);
- return TRUE;
- break;
- }
- }
-
- if(drag_x_move || drag_y_move)
- ami_tree_scroll(twin, drag_x_move, drag_y_move);
-
- return FALSE;
-}
-
-
-
-
-
-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(int flags,
- struct sslcert_session_data *ssl_data)
-{
- struct treeview_window *twin;
-
- twin = calloc(1, sizeof(struct treeview_window));
-
- if(!twin)
- {
- amiga_warn_user("NoMemory", 0);
- return NULL;
- }
-
- twin->shared_pens = ami_AllocMinList();
- twin->globals.shared_pens = twin->shared_pens;
-
- twin->ssl_data = ssl_data;
- twin->tree = tree_create(flags, &ami_tree_callbacks, twin);
-
- return twin;
-}
-
diff --git a/frontends/amiga/tree.h b/frontends/amiga/tree.h
deleted file mode 100755
index a8cada58d..000000000
--- a/frontends/amiga/tree.h
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Copyright 2008, 2009 Chris Young <chris@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_TREE_H
-#define AMIGA_TREE_H
-
-#include <exec/types.h>
-#include <intuition/classusr.h>
-#include "amiga/os3support.h"
-#include "amiga/desktop-tree.h"
-
-struct treeview_window;
-
-enum
-{
- AMI_TREE_HOTLIST,
- AMI_TREE_HISTORY,
- AMI_TREE_COOKIES,
- AMI_TREE_SSLCERT
-};
-
-struct treeview_window *ami_tree_create(int 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_tree_open(struct treeview_window *twin,int type);
-void ami_tree_close(void *w); /* for Arexx interface only */
-
-extern const struct treeview_table ami_tree_callbacks;
-
-#endif