diff options
Diffstat (limited to 'amiga/tree.c')
-rwxr-xr-x | amiga/tree.c | 293 |
1 files changed, 267 insertions, 26 deletions
diff --git a/amiga/tree.c b/amiga/tree.c index b88444a91..e9333c54b 100755 --- a/amiga/tree.c +++ b/amiga/tree.c @@ -30,10 +30,17 @@ #include <assert.h> #include <proto/intuition.h> #include "amiga/tree.h" +#include <proto/button.h> +#include <gadgets/button.h> +#include <string.h> +#include "utils/messages.h" void ami_add_elements(struct treeview_window *twin,struct node *root,WORD *gen); bool ami_tree_launch_node(struct tree *tree, struct node *node); void free_browserlist(struct List *list); +void ami_move_node(struct treeview_window *twin,bool up); +void ami_new_bookmark(struct treeview_window *twin); +void ami_recreate_listbrowser(struct treeview_window *twin); void tree_initialise_redraw(struct tree *tree) { @@ -49,6 +56,8 @@ void tree_draw_line(int x, int y, int width, int height) void tree_draw_node_element(struct tree *tree, struct node_element *element) { + return; +#if 0 /* add element to listbrowser list */ struct Node *lbnode; @@ -88,10 +97,12 @@ void tree_draw_node_element(struct tree *tree, struct node_element *element) } break; } +#endif } void tree_draw_node_expansion(struct tree *tree, struct node *node) { + DebugPrintF("tree_draw_node_expansion\n"); } void tree_recalculate_node_element(struct node_element *element) @@ -104,9 +115,12 @@ void tree_update_URL_node(struct node *node, const char *url, struct node_element *element; char buffer[256]; + DebugPrintF("tree_update_URL_node\n"); + assert(node); element = tree_find_element(node, TREE_ELEMENT_URL); +DebugPrintF("%s\n",element->text); if (!element) return; if (data) { @@ -139,22 +153,22 @@ void tree_update_URL_node(struct node *node, const char *url, element = tree_find_element(node, TREE_ELEMENT_LAST_VISIT); if (element) { - snprintf(buffer, 256, messages_get("TreeLast"), + snprintf(buffer, 256, (char *)messages_get("TreeLast"), (data->last_visit > 0) ? ctime((time_t *)&data->last_visit) : - messages_get("TreeUnknown")); + (char *)messages_get("TreeUnknown")); if (data->last_visit > 0) buffer[strlen(buffer) - 1] = '\0'; free((void *)element->text); - element->text = strdup(buffer); + element->text = (char *)strdup(buffer); } element = tree_find_element(node, TREE_ELEMENT_VISITS); if (element) { - snprintf(buffer, 256, messages_get("TreeVisits"), + snprintf(buffer, 256, (char *)messages_get("TreeVisits"), data->visits); free((void *)element->text); - element->text = strdup(buffer); + element->text = (char *)strdup(buffer); } } @@ -171,15 +185,16 @@ void tree_set_node_sprite(struct node *node, const char *sprite, { } -void ami_open_tree(struct tree *tree) +void ami_open_tree(struct tree *tree,int type) { struct treeview_window *twin; - BOOL msel = TRUE; + BOOL msel = TRUE,nothl = TRUE; static WORD gen=0; + char *wintitle; if(tree->handle) { - twin = tree->handle; + twin = (struct treeview_window *)tree->handle; WindowToFront(twin->win); ActivateWindow(twin->win); return; @@ -192,12 +207,28 @@ void ami_open_tree(struct tree *tree) { { 22,"Name", CIF_DRAGGABLE | CIF_SORTABLE}, { 5,"URL", CIF_DRAGGABLE }, - { 5,"Visits", CIF_DRAGGABLE }, +// { 5,"Visits", CIF_DRAGGABLE }, { -1, (STRPTR)~0, -1 } }; if(tree->single_selection) msel = FALSE; + switch(type) + { + case AMI_TREE_HOTLIST: + nothl = FALSE; + wintitle = (char *)messages_get("Hotlist"); + break; + case AMI_TREE_COOKIES: + nothl = TRUE; + wintitle = (char *)messages_get("Cookies"); + break; + case AMI_TREE_HISTORY: + nothl = TRUE; + wintitle = (char *)messages_get("History"); + break; + } + NewList(twin->listbrowser_list); tree->handle = (void *)twin; @@ -206,7 +237,7 @@ void ami_open_tree(struct tree *tree) twin->objects[OID_MAIN] = WindowObject, WA_ScreenTitle,nsscreentitle, - WA_Title, "treeview window", + WA_Title,wintitle, WA_Activate, TRUE, WA_DepthGadget, TRUE, WA_DragBar, TRUE, @@ -216,24 +247,62 @@ void ami_open_tree(struct tree *tree) WINDOW_SharedPort,sport, WINDOW_UserData,twin, WINDOW_IconifyGadget, TRUE, - WINDOW_Position, WPOS_CENTERSCREEN, - WINDOW_ParentGroup, twin->gadgets[GID_MAIN] = VGroupObject, + 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_ColumnTitles, TRUE, LISTBROWSER_Hierarchical,TRUE, LISTBROWSER_Editable,TRUE, // LISTBROWSER_TitleClickable,TRUE, LISTBROWSER_AutoFit, TRUE, LISTBROWSER_HorizontalProp, TRUE, LISTBROWSER_Labels, twin->listbrowser_list, - LISTBROWSER_MultiSelect,msel, +// LISTBROWSER_MultiSelect,msel, LISTBROWSER_ShowSelected,TRUE, - ListBrowserEnd, + ListBrowserEnd, CHILD_NominalSize,TRUE, + LAYOUT_AddChild, HGroupObject, + LAYOUT_AddChild, twin->gadgets[GID_OPEN] = ButtonObject, + GA_ID,GID_OPEN, + GA_Text,messages_get("Open"), + GA_RelVerify,TRUE, + GA_Disabled,nothl, + ButtonEnd, + LAYOUT_AddChild, twin->gadgets[GID_NEWF] = ButtonObject, + GA_ID,GID_NEWF, + BUTTON_AutoButton,BAG_POPDRAWER, + GA_RelVerify,TRUE, + GA_Disabled,nothl, + ButtonEnd, + LAYOUT_AddChild, twin->gadgets[GID_NEWB] = ButtonObject, + GA_ID,GID_NEWB, + BUTTON_AutoButton,BAG_POPFILE, + GA_RelVerify,TRUE, + GA_Disabled,nothl, + ButtonEnd, + LAYOUT_AddChild, twin->gadgets[GID_UP] = ButtonObject, + GA_ID,GID_UP, + BUTTON_AutoButton,BAG_UPARROW, + GA_RelVerify,TRUE, + GA_Disabled,nothl, //(!tree->movable), + ButtonEnd, + LAYOUT_AddChild, twin->gadgets[GID_DOWN] = ButtonObject, + GA_ID,GID_DOWN, + BUTTON_AutoButton,BAG_DNARROW, + GA_RelVerify,TRUE, + GA_Disabled,nothl, //(!tree->movable), + ButtonEnd, + LAYOUT_AddChild, twin->gadgets[GID_DEL] = ButtonObject, + GA_ID,GID_DEL, + GA_Text,messages_get("Delete"), + GA_RelVerify,TRUE, + ButtonEnd, + EndGroup, + CHILD_WeightedHeight,0, EndGroup, EndWindow; @@ -276,7 +345,7 @@ bool ami_tree_launch_node(struct tree *tree, struct node *node) void ami_tree_close(struct treeview_window *twin) { - twin->tree->handle = NULL; + twin->tree->handle = 0; DisposeObject(twin->objects[OID_MAIN]); FreeListBrowserList(twin->listbrowser_list); FreeVec(twin->listbrowser_list); @@ -295,7 +364,7 @@ void free_browserlist(struct List *list) do { nextnode = GetSucc(node); - FreeVec(node->ln_Name); +// FreeVec(node->ln_Name); FreeListBrowserNode(node); } while(node = nextnode); } @@ -319,15 +388,23 @@ void ami_add_elements(struct treeview_window *twin,struct node *root,WORD *gen) if(!element) element = tree_find_element(node, TREE_ELEMENT_TITLE); if(element && element->text) { - text1 = element->text; + text1 = (char *)element->text; } -// printf("node %lx url %s gen %ld\n",node,element->text,*gen); +/* Really, the second column needs axing - relevant data should appear in an +area below the listview when items are selected */ + element2 = tree_find_element(node, TREE_ELEMENT_URL); + if(!element2) element2 = tree_find_element(node, TREE_ELEMENT_VALUE); + if(!element2) element2 = tree_find_element(node, TREE_ELEMENT_COMMENT); if(element2 && element2->text) { - text2 = element2->text; + text2 = (char *)element2->text; + } + else + { + text2 = ""; } // element = tree_find_element(node, TREE_ELEMENT_VISITS); @@ -351,12 +428,7 @@ void ami_add_elements(struct treeview_window *twin,struct node *root,WORD *gen) LBNCA_CopyText,TRUE, LBNCA_MaxChars,256, LBNCA_Text, text2, - LBNCA_Editable,node->editable, - LBNA_Column, 2, - LBNCA_CopyText,TRUE, - LBNCA_MaxChars,256, - LBNCA_Text,"", - LBNCA_Editable,node->editable, + LBNCA_Editable,FALSE, TAG_DONE)) { AddTail(twin->listbrowser_list, lbnode); @@ -376,10 +448,15 @@ BOOL ami_tree_event(struct treeview_window *twin) { /* return TRUE if window destroyed */ ULONG class,result,relevent = 0; + ULONG column; uint16 code; struct MenuItem *item; struct node *treenode; struct Node *lbnode; + struct node_element *element; + char *text; +// ULONG editcols[] = {TREE_ELEMENT_TITLE,TREE_ELEMENT_URL}; + static WORD gen=0; while((result = RA_HandleInput(twin->objects[OID_MAIN],&code)) != WMHI_LASTMSG) { @@ -402,7 +479,91 @@ BOOL ami_tree_event(struct treeview_window *twin) TAG_DONE); ami_tree_launch_node(twin->tree,treenode); break; + + case LBRE_EDIT: + GetAttrs(twin->gadgets[GID_TREEBROWSER], + LISTBROWSER_SelectedNode,(ULONG *)&lbnode, +// LISTBROWSER_RelColumn,(ULONG *)&column, + TAG_DONE); + + GetListBrowserNodeAttrs(lbnode, + LBNA_UserData,(ULONG *)&treenode, + TAG_DONE); + + element = tree_find_element(treenode,TREE_ELEMENT_TITLE); + GetListBrowserNodeAttrs(lbnode, + LBNA_Column,column, + LBNCA_Text,(ULONG *)&text, + TAG_DONE); + element->text = (char *)strdup(text); + tree_handle_node_element_changed(twin->tree, element); + break; + + case LBRE_HIDECHILDREN: + GetAttr(LISTBROWSER_SelectedNode,twin->gadgets[GID_TREEBROWSER],(ULONG *)&lbnode); + GetListBrowserNodeAttrs(lbnode, + LBNA_UserData,(ULONG *)&treenode, + TAG_DONE); + tree_set_node_expanded(twin->tree, treenode, false); + break; + + case LBRE_SHOWCHILDREN: + GetAttr(LISTBROWSER_SelectedNode,twin->gadgets[GID_TREEBROWSER],(ULONG *)&lbnode); + GetListBrowserNodeAttrs(lbnode, + LBNA_UserData,(ULONG *)&treenode, + TAG_DONE); + tree_set_node_expanded(twin->tree, treenode, true); + break; + } + break; + + case GID_OPEN: + GetAttr(LISTBROWSER_SelectedNode,twin->gadgets[GID_TREEBROWSER],(ULONG *)&lbnode); + GetListBrowserNodeAttrs(lbnode, + LBNA_UserData,(ULONG *)&treenode, + TAG_DONE); + ami_tree_launch_node(twin->tree,treenode); + break; + + case GID_NEWF: + GetAttr(LISTBROWSER_SelectedNode,twin->gadgets[GID_TREEBROWSER],(ULONG *)&lbnode); + if(lbnode) + { + GetListBrowserNodeAttrs(lbnode, + LBNA_UserData,(ULONG *)&treenode, + TAG_DONE); } + else + { + treenode = twin->tree->root; + } + + tree_create_folder_node(treenode,(char *)messages_get("TreeNewFolder")); + + ami_recreate_listbrowser(twin); + break; + + case GID_NEWB: + ami_new_bookmark(twin); + break; + + case GID_UP: + ami_move_node(twin,true); + break; + + case GID_DOWN: + ami_move_node(twin,false); + break; + + case GID_DEL: + GetAttr(LISTBROWSER_SelectedNode,twin->gadgets[GID_TREEBROWSER],(ULONG *)&lbnode); + GetListBrowserNodeAttrs(lbnode, + LBNA_UserData,(ULONG *)&treenode, + TAG_DONE); + tree_delete_node(twin->tree, treenode, true); +/* We are recreating the list from scratch as there is no obvious easy way + to delete children from a listbrowser list */ + ami_recreate_listbrowser(twin); break; } break; @@ -427,3 +588,83 @@ BOOL ami_tree_event(struct treeview_window *twin) } return FALSE; } + +void ami_move_node(struct treeview_window *twin,bool up) +{ + struct Node *lbnode = NULL; + struct node *treenode; + BOOL sel = FALSE; + + GetAttr(LISTBROWSER_SelectedNode,twin->gadgets[GID_TREEBROWSER],(ULONG *)&lbnode); + + if(lbnode) + { + GetListBrowserNodeAttrs(lbnode, + LBNA_UserData,(ULONG *)&treenode, + LBNA_Selected,(BOOL *)&sel, + TAG_DONE); + } + + if(sel) + { + tree_set_node_selected(twin->tree,treenode,true); + + tree_move_selected_nodes(twin->tree,treenode,up); + } + + tree_set_node_selected(twin->tree,treenode,false); + ami_recreate_listbrowser(twin); +} + +void ami_new_bookmark(struct treeview_window *twin) +{ + const struct url_data *data; + struct Node *lbnode; + struct node *treenode; + char *url,*title; + + GetAttr(LISTBROWSER_SelectedNode,twin->gadgets[GID_TREEBROWSER],(ULONG *)&lbnode); + if(lbnode) + { + GetListBrowserNodeAttrs(lbnode, + LBNA_UserData,(ULONG *)&treenode, + TAG_DONE); + } + else + { + treenode = twin->tree->root; + } + + url = (char *)strdup("http://www.netsurf-browser.org"); + title = (char *)messages_get("NewBookmark"); + + data = urldb_get_url_data(url); + if (!data) + { + urldb_add_url(url); + urldb_set_url_persistence(url,true); + data = urldb_get_url_data(url); + } + + if (data) + { + tree_create_URL_node(treenode,url,data,title); + ami_recreate_listbrowser(twin); + } +} + +void ami_recreate_listbrowser(struct treeview_window *twin) +{ + static WORD gen=0; + + SetGadgetAttrs(twin->gadgets[GID_TREEBROWSER],twin->win,NULL, + LISTBROWSER_Labels,~0, + TAG_DONE); + + FreeListBrowserList(twin->listbrowser_list); + ami_add_elements(twin,twin->tree->root,&gen); + + RefreshSetGadgetAttrs(twin->gadgets[GID_TREEBROWSER],twin->win,NULL, + LISTBROWSER_Labels,twin->listbrowser_list, + TAG_DONE); +} |