summaryrefslogtreecommitdiff
path: root/amiga
diff options
context:
space:
mode:
authorChris Young <chris@unsatisfactorysoftware.co.uk>2008-09-27 20:55:11 +0000
committerChris Young <chris@unsatisfactorysoftware.co.uk>2008-09-27 20:55:11 +0000
commit713d3d365a6b5e4017429ae0151279fb71f89abb (patch)
tree562bf14465244df05e18ed07b546b9b238acf3ea /amiga
parent324cc53e87da771efb3778f0c48d235ff0d15e6c (diff)
downloadnetsurf-713d3d365a6b5e4017429ae0151279fb71f89abb.tar.gz
netsurf-713d3d365a6b5e4017429ae0151279fb71f89abb.tar.bz2
Experimental treeview implementation using listbrowser.gadget.
svn path=/trunk/netsurf/; revision=5447
Diffstat (limited to 'amiga')
-rwxr-xr-xamiga/gui.c48
-rwxr-xr-xamiga/object.h14
-rwxr-xr-xamiga/plotters.c5
-rwxr-xr-xamiga/tree.c287
-rwxr-xr-xamiga/tree.h26
5 files changed, 364 insertions, 16 deletions
diff --git a/amiga/gui.c b/amiga/gui.c
index 0041cb443..5504a28f0 100755
--- a/amiga/gui.c
+++ b/amiga/gui.c
@@ -59,6 +59,7 @@
#include <proto/datatypes.h>
#include <proto/icon.h>
#include <workbench/icon.h>
+#include "amiga/tree.h"
#ifdef WITH_HUBBUB
#include <hubbub/hubbub.h>
@@ -72,6 +73,7 @@
#include <proto/space.h>
#include <proto/popupmenu.h>
#include <proto/fuelgauge.h>
+#include <proto/clicktab.h>
#include <classes/window.h>
#include <gadgets/fuelgauge.h>
#include <gadgets/layout.h>
@@ -80,6 +82,7 @@
#include <gadgets/button.h>
#include <images/bitmap.h>
#include <gadgets/space.h>
+#include <gadgets/clicktab.h>
#include <classes/popupmenu.h>
#include <reaction/reaction_macros.h>
@@ -99,7 +102,6 @@ struct PopupMenuIFace *IPopupMenu = NULL;
struct BitMap *throbber = NULL;
ULONG throbber_width,throbber_height;
-bool win_destroyed = false;
static struct RastPort dummyrp;
struct IFFHandle *iffh = NULL;
@@ -195,6 +197,8 @@ void gui_init(int argc, char** argv)
}
}
+ win_destroyed = false;
+
options_read("Resources/Options");
verbose_log = option_verbose_log;
@@ -617,14 +621,28 @@ void ami_handle_msg(void)
break;
case WMHI_NEWSIZE:
- GetAttr(SPACE_AreaBox,gwin->gadgets[GID_BROWSER],(ULONG *)&bbox);
- browser_window_reformat(gwin->bw,bbox->Width,bbox->Height);
- gwin->redraw_required = true;
- //gui_window_redraw_window(gwin);
+ switch(node->Type)
+ {
+ case AMINS_WINDOW:
+ case AMINS_FRAME:
+ GetAttr(SPACE_AreaBox,gwin->gadgets[GID_BROWSER],(ULONG *)&bbox);
+ browser_window_reformat(gwin->bw,bbox->Width,bbox->Height);
+ gwin->redraw_required = true;
+ break;
+ }
break;
case WMHI_CLOSEWINDOW:
- browser_window_destroy(gwin->bw);
+ switch(node->Type)
+ {
+ case AMINS_TVWINDOW:
+ ami_tree_close((struct treeview_window *)gwin);
+ break;
+
+ default:
+ browser_window_destroy(gwin->bw);
+ break;
+ }
//destroywin=gwin;
break;
@@ -654,6 +672,9 @@ void ami_handle_msg(void)
if(gwin->throbber_frame)
ami_update_throbber(gwin);
+ if(gwin->c_h)
+ gui_window_place_caret(gwin,gwin->c_x,gwin->c_y,gwin->c_h);
+
node = nnode;
}
}
@@ -1776,17 +1797,24 @@ void ami_update_throbber(struct gui_window *g)
void gui_window_place_caret(struct gui_window *g, int x, int y, int height)
{
struct IBox *bbox;
+ ULONG xs,ys;
if(!g) return;
+ gui_window_remove_caret(g);
+ g->c_x = x;
+ g->c_y = y;
+ g->c_h = height;
+
GetAttr(SPACE_AreaBox,g->gadgets[GID_BROWSER],(ULONG *)&bbox);
+ GetAttr(SCROLLER_Top,g->objects[OID_HSCROLL],&xs);
+ x = x - bbox->Left +xs;
+
+ GetAttr(SCROLLER_Top,g->objects[OID_VSCROLL],&ys);
+ y = y - bbox->Top + ys;
SetAPen(g->win->RPort,3);
RectFill(g->win->RPort,x+bbox->Left,y+bbox->Top,x+bbox->Left+2,y+bbox->Top+height);
-
- g->c_x = x;
- g->c_y = y;
- g->c_h = height;
}
void gui_window_remove_caret(struct gui_window *g)
diff --git a/amiga/object.h b/amiga/object.h
index ee6b611ba..909edd468 100755
--- a/amiga/object.h
+++ b/amiga/object.h
@@ -21,11 +21,15 @@
#include <exec/lists.h>
-#define AMINS_CALLBACK 0
-#define AMINS_WINDOW 1
-#define AMINS_FRAME 2
-#define AMINS_DLWINDOW 3
-#define AMINS_LOGINWINDOW 3
+enum
+{
+ AMINS_CALLBACK,
+ AMINS_WINDOW,
+ AMINS_FRAME,
+ AMINS_DLWINDOW,
+ AMINS_LOGINWINDOW,
+ AMINS_TVWINDOW
+};
struct nsObject
{
diff --git a/amiga/plotters.c b/amiga/plotters.c
index 18ab1ec0a..d2422357b 100755
--- a/amiga/plotters.c
+++ b/amiga/plotters.c
@@ -248,6 +248,8 @@ bool ami_bitmap(int x, int y, int width, int height,
ri.BytesPerRow = bitmap->width * 4;
ri.RGBFormat = RGBFB_R8G8B8A8;
+/* check for black boxes under images! */
+/* disabled temporarily for SAM OS4.1
if((bitmap->width != width) || (bitmap->height != height))
{
struct BitMap *tbm;
@@ -279,8 +281,9 @@ bool ami_bitmap(int x, int y, int width, int height,
}
else
{
+*/
p96WritePixelArray((struct RenderInfo *)&ri,0,0,currp,x,y,width,height);
- }
+// }
return true;
}
diff --git a/amiga/tree.c b/amiga/tree.c
index 3b6d1d5db..78881c92f 100755
--- a/amiga/tree.c
+++ b/amiga/tree.c
@@ -17,6 +17,31 @@
*/
#include "desktop/tree.h"
+#include <proto/listbrowser.h>
+#include <proto/window.h>
+#include <proto/layout.h>
+#include <classes/window.h>
+#include <gadgets/listbrowser.h>
+#include <gadgets/layout.h>
+#include <reaction/reaction_macros.h>
+#include "amiga/gui.h"
+#include "content/urldb.h"
+#include <proto/exec.h>
+#include <assert.h>
+#include <proto/intuition.h>
+#include "amiga/tree.h"
+
+struct treeview_window {
+ struct Window *win;
+ Object *objects[OID_LAST];
+ struct Gadget *gadgets[GID_LAST];
+ struct nsObject *node;
+ ULONG pad[5];
+ struct tree *tree;
+ struct List *listbrowser_list;
+};
+
+void ami_add_elements(struct treeview_window *twin,struct node *root,WORD *gen);
void tree_initialise_redraw(struct tree *tree)
{
@@ -32,6 +57,45 @@ void tree_draw_line(int x, int y, int width, int height)
void tree_draw_node_element(struct tree *tree, struct node_element *element)
{
+/* add element to listbrowser list */
+
+ struct Node *lbnode;
+ struct treeview_window *twin = tree->handle;
+ struct node *tempnode;
+ int generation=1;
+ BOOL edit = FALSE;
+
+ tempnode = element->parent;
+ edit = tempnode->editable;
+
+ while(tempnode)
+ {
+ tempnode = tempnode->parent;
+ generation++;
+ }
+
+ switch (element->type) {
+ case NODE_ELEMENT_TEXT_PLUS_SPRITE:
+ case NODE_ELEMENT_TEXT:
+ if (lbnode = AllocListBrowserNode(3,
+// LBNA_UserData,nodetime,
+ LBNA_Generation,1,
+ LBNA_Column, 0,
+ LBNCA_CopyText,TRUE,
+ LBNCA_Text, element->text,
+ LBNCA_Editable,edit,
+ LBNA_Column, 1,
+ LBNCA_CopyText,TRUE,
+ LBNCA_Text, "",
+ LBNA_Column, 2,
+ LBNCA_CopyText,TRUE,
+ LBNCA_Text, "",
+ TAG_DONE))
+ {
+ AddTail(twin->listbrowser_list, lbnode);
+ }
+ break;
+ }
}
void tree_draw_node_expansion(struct tree *tree, struct node *node)
@@ -45,6 +109,61 @@ void tree_recalculate_node_element(struct node_element *element)
void tree_update_URL_node(struct node *node, const char *url,
const struct url_data *data)
{
+ struct node_element *element;
+ char buffer[256];
+
+ assert(node);
+
+ element = tree_find_element(node, TREE_ELEMENT_URL);
+ if (!element)
+ return;
+ if (data) {
+ /* node is linked, update */
+ assert(!node->editable);
+ if (!data->title)
+ urldb_set_url_title(url, url);
+
+ if (!data->title)
+ return;
+
+ node->data.text = data->title;
+ } else {
+ /* node is not linked, find data */
+ assert(node->editable);
+ data = urldb_get_url_data(element->text);
+ if (!data)
+ return;
+ }
+
+/* not implemented yet
+ if (element) {
+ sprintf(buffer, "small_%.3x", ro_content_filetype_from_type(data->type));
+ if (ro_gui_wimp_sprite_exists(buffer))
+ tree_set_node_sprite(node, buffer, buffer);
+ else
+ tree_set_node_sprite(node, "small_xxx", "small_xxx");
+ }
+*/
+
+ element = tree_find_element(node, TREE_ELEMENT_LAST_VISIT);
+ if (element) {
+ snprintf(buffer, 256, messages_get("TreeLast"),
+ (data->last_visit > 0) ?
+ ctime((time_t *)&data->last_visit) :
+ messages_get("TreeUnknown"));
+ if (data->last_visit > 0)
+ buffer[strlen(buffer) - 1] = '\0';
+ free((void *)element->text);
+ element->text = strdup(buffer);
+ }
+
+ element = tree_find_element(node, TREE_ELEMENT_VISITS);
+ if (element) {
+ snprintf(buffer, 256, messages_get("TreeVisits"),
+ data->visits);
+ free((void *)element->text);
+ element->text = strdup(buffer);
+ }
}
void tree_resized(struct tree *tree)
@@ -60,3 +179,171 @@ void tree_set_node_sprite(struct node *node, const char *sprite,
{
}
+void ami_open_tree(struct tree *tree)
+{
+ struct treeview_window *twin;
+ BOOL msel = TRUE;
+ static WORD gen=0;
+/* open window with listbrowser gadget added */
+
+ twin = AllocVec(sizeof(struct treeview_window),MEMF_CLEAR);
+ twin->listbrowser_list = AllocVec(sizeof(struct List),MEMF_CLEAR);
+
+ static struct ColumnInfo columninfo[] =
+ {
+ { 22,"Name", CIF_DRAGGABLE | CIF_SORTABLE},
+ { 5,"URL", CIF_DRAGGABLE },
+ { 5,"Visits", CIF_DRAGGABLE },
+ { -1, (STRPTR)~0, -1 }
+ };
+
+ if(tree->single_selection) msel = FALSE;
+
+ NewList(twin->listbrowser_list);
+
+ tree->handle = (void *)twin;
+ twin->tree = tree;
+ ami_add_elements(twin,twin->tree->root,&gen);
+
+ twin->objects[OID_MAIN] = WindowObject,
+ WA_ScreenTitle,nsscreentitle,
+ WA_Title, "treeview window",
+ WA_Activate, TRUE,
+ WA_DepthGadget, TRUE,
+ WA_DragBar, TRUE,
+ WA_CloseGadget, TRUE,
+ WA_SizeGadget, TRUE,
+ WA_CustomScreen,scrn,
+ WINDOW_SharedPort,sport,
+ WINDOW_IconifyGadget, TRUE,
+ WINDOW_Position, WPOS_CENTERSCREEN,
+ WINDOW_ParentGroup, twin->gadgets[GID_MAIN] = VGroupObject,
+ LAYOUT_AddChild, twin->gadgets[GID_TREEBROWSER] = ListBrowserObject,
+ GA_ID, GID_TREEBROWSER,
+ GA_RelVerify, TRUE,
+ GA_ReadOnly,FALSE,
+ LISTBROWSER_ColumnInfo, &columninfo,
+ LISTBROWSER_ColumnTitles, TRUE,
+ LISTBROWSER_Hierarchical,TRUE,
+// LISTBROWSER_TitleClickable,TRUE,
+ LISTBROWSER_AutoFit, TRUE,
+ LISTBROWSER_HorizontalProp, TRUE,
+ LISTBROWSER_Labels, twin->listbrowser_list,
+ LISTBROWSER_MultiSelect,msel,
+ ListBrowserEnd,
+ CHILD_NominalSize,TRUE,
+ EndGroup,
+ EndWindow;
+
+ twin->win = (struct Window *)RA_OpenWindow(twin->objects[OID_MAIN]);
+
+ twin->node = AddObject(window_list,AMINS_TVWINDOW);
+ twin->node->objstruct = twin;
+}
+
+/**
+ * Launches a node using all known methods.
+ *
+ * \param node the node to launch
+ * \return whether the node could be launched
+ */
+bool ami_tree_launch_node(struct tree *tree, struct node *node)
+{
+ struct node_element *element;
+
+ assert(node);
+
+ element = tree_find_element(node, TREE_ELEMENT_URL);
+ if (element) {
+ browser_window_create(element->text, NULL, 0, true, false);
+ return true;
+ }
+
+#ifdef WITH_SSL
+/* not implemented yet
+ element = tree_find_element(node, TREE_ELEMENT_SSL);
+ if (element) {
+ ro_gui_cert_open(tree, node);
+ return true;
+ }
+*/
+#endif
+
+ return false;
+}
+
+void ami_tree_close(struct tree *tree)
+{
+ struct treeview_window *twin = tree->handle;
+
+ DisposeObject(twin->objects[OID_MAIN]);
+ FreeListBrowserList(twin->listbrowser_list);
+ //free_browserlist(twin->listbrowser_list);
+ DelObject(twin->node);
+ win_destroyed = true;
+}
+
+void free_browserlist(struct List *list)
+{
+ struct Node *node, *nextnode;
+
+ if(IsListEmpty(list)) return;
+
+ node = list->lh_Head;
+ while (nextnode = node->ln_Succ)
+ {
+ FreeVec(node->ln_Name);
+ FreeListBrowserNode(node);
+ node = nextnode;
+ }
+}
+
+void ami_add_elements(struct treeview_window *twin,struct node *root,WORD *gen)
+{
+ struct Node *lbnode;
+ struct tree *tree = twin->tree;
+ struct node *tempnode;
+ int generation=1;
+ BOOL edit = FALSE;
+ struct node_element *element=NULL,*element2=NULL,*element3=NULL;
+ struct node *node;
+
+ *gen = *gen + 1;
+ for (node = root; node; node = node->next)
+ {
+ element = tree_find_element(node, TREE_ELEMENT_NAME);
+ if(!element) element = tree_find_element(node, TREE_ELEMENT_TITLE);
+// printf("node %lx url %s gen %ld\n",node,element->text,*gen);
+ element2 = tree_find_element(node, TREE_ELEMENT_URL);
+ element3 = tree_find_element(node, TREE_ELEMENT_VISITS);
+
+ switch (element->type) {
+ case NODE_ELEMENT_TEXT_PLUS_SPRITE:
+ case NODE_ELEMENT_TEXT:
+ if (lbnode = AllocListBrowserNode(3,
+// LBNA_UserData,nodetime,
+ LBNA_Generation,*gen,
+ LBNA_Column, 0,
+ LBNCA_CopyText,TRUE,
+ LBNCA_Text, element->text,
+ LBNCA_Editable,edit,
+ LBNA_Column, 1,
+ LBNCA_CopyText,TRUE,
+ LBNCA_Text, element2->text,
+ LBNA_Column, 2,
+ LBNCA_CopyText,TRUE,
+ LBNCA_Text, "",
+ TAG_DONE))
+ {
+ AddTail(twin->listbrowser_list, lbnode);
+ }
+ break;
+ }
+
+ if (node->child)
+ {
+ ami_add_elements(twin,node->child,gen);
+ }
+ }
+ *gen = *gen - 1;
+}
diff --git a/amiga/tree.h b/amiga/tree.h
new file mode 100755
index 000000000..832a91db2
--- /dev/null
+++ b/amiga/tree.h
@@ -0,0 +1,26 @@
+/*
+ * Copyright 2008 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
+
+void ami_open_tree(struct tree *tree);
+bool ami_tree_launch_node(struct tree *tree, struct node *node);
+void ami_tree_close(struct tree *tree);
+void free_browserlist(struct List *list);
+#endif