diff options
Diffstat (limited to 'amiga/tree.c')
-rwxr-xr-x | amiga/tree.c | 1313 |
1 files changed, 817 insertions, 496 deletions
diff --git a/amiga/tree.c b/amiga/tree.c index 7000fb76c..f01805314 100755 --- a/amiga/tree.c +++ b/amiga/tree.c @@ -1,5 +1,5 @@ /* - * Copyright 2008,2009 Chris Young <chris@unsatisfactorysoftware.co.uk> + * Copyright 2008, 2009 Chris Young <chris@unsatisfactorysoftware.co.uk> * * This file is part of NetSurf, http://www.netsurf-browser.org/ * @@ -16,13 +16,16 @@ * along with this program. If not, see <http://www.gnu.org/licenses/>. */ -#include "desktop/tree.h" -#include <proto/listbrowser.h> #include <proto/window.h> #include <proto/layout.h> +#include <proto/space.h> +#include <proto/label.h> +#include <proto/scroller.h> #include <classes/window.h> -#include <gadgets/listbrowser.h> +#include <gadgets/space.h> +#include <images/label.h> #include <gadgets/layout.h> +#include <gadgets/scroller.h> #include <reaction/reaction_macros.h> #include "amiga/gui.h" #include "content/urldb.h" @@ -36,222 +39,395 @@ #include "utils/messages.h" #include <proto/bitmap.h> #include <images/bitmap.h> +#include <proto/graphics.h> +#include <intuition/icclass.h> +#include <proto/asl.h> +#include <proto/utility.h> +#include <libraries/gadtools.h> +#include <proto/dos.h> +#include "amiga/utf8.h" +#include "desktop/cookies.h" +#include "desktop/history_global_core.h" +#include "desktop/hotlist.h" +#include "amiga/sslcert.h" +#include "utils/utils.h" + +#define AMI_TREE_MENU_ITEMS 19 + +struct treeview_window { + struct Window *win; + Object *objects[OID_LAST]; + struct Gadget *gadgets[GID_LAST]; + struct nsObject *node; + ULONG pad[5]; + int type; + struct NewMenu *menu; + char *menu_name[AMI_TREE_MENU_ITEMS]; + struct tree *tree; + struct Hook scrollerhook; + uint32 key_state; + uint32 mouse_state; + int drag_x; + int drag_y; + struct timeval lastclick; + int max_width; + int max_height; + struct gui_globals globals; + struct sslcert_session_data *ssl_data; +}; + +void ami_tree_draw(struct treeview_window *twin); +static void ami_tree_redraw_request(int x, int y, int width, int height, + void *data); +static void ami_tree_resized(struct tree *tree, int width, + int height, void *data); +static void ami_tree_scroll_visible(int y, int height, void *data); +static void ami_tree_get_window_dimensions(int *width, int *height, void *data); + +const struct treeview_table ami_tree_callbacks = { + .redraw_request = ami_tree_redraw_request, + .resized = ami_tree_resized, + .scroll_visible = ami_tree_scroll_visible, + .get_window_dimensions = ami_tree_get_window_dimensions +}; + +struct treeview_window *ami_tree_create(uint8 flags, + struct sslcert_session_data *ssl_data) +{ + struct treeview_window *twin; -struct Node *selectednode; -struct node *selectednode2; + twin = AllocVec(sizeof(struct treeview_window), + MEMF_PRIVATE | MEMF_CLEAR); + + if(!twin) + { + warn_user("NoMemory", 0); + return NULL; + } -void ami_add_elements(struct treeview_window *twin,struct node *root,WORD *gen); -bool ami_tree_launch_node(struct tree *tree, struct node *node); -void free_browserlist(struct List *list); -void ami_move_node(struct treeview_window *twin,int move); -void ami_new_bookmark(struct treeview_window *twin); -void ami_recreate_listbrowser(struct treeview_window *twin); + twin->ssl_data = ssl_data; -void tree_initialise_redraw(struct tree *tree) -{ + twin->tree = tree_create(flags, &ami_tree_callbacks, twin); + return twin; } -void tree_redraw_area(struct tree *tree, int x, int y, int width, int height) +void ami_tree_destroy(struct treeview_window *twin) { + tree_delete(twin->tree); + FreeVec(twin); } -void tree_draw_line(int x, int y, int width, int height) +struct tree *ami_tree_get_tree(struct treeview_window *twin) { + return twin->tree; } -void tree_draw_node_element(struct tree *tree, struct node_element *element) +void ami_tree_resized(struct tree *tree, int width, int height, void *data) { - return; -#if 0 -/* add element to listbrowser list */ + struct treeview_window *twin = data; + struct IBox *bbox; - struct Node *lbnode; - struct treeview_window *twin = tree->handle; - struct node *tempnode; - int generation=1; - BOOL edit = FALSE; + twin->max_height = height; + twin->max_width = width; - tempnode = element->parent; - edit = tempnode->editable; - - while(tempnode) + if(twin->win) { - tempnode = tempnode->parent; - generation++; - } + GetAttr(SPACE_AreaBox,twin->gadgets[GID_BROWSER],(ULONG *)&bbox); - switch (element->type) { - case NODE_ELEMENT_TEXT_PLUS_SPRITE: - case NODE_ELEMENT_TEXT: - if (lbnode = AllocListBrowserNode(3, -// LBNA_UserData,nodetime, - LBNA_Generation,1, - LBNA_Column, 0, - LBNCA_CopyText,TRUE, - LBNCA_Text, element->text, - LBNCA_Editable,edit, - LBNA_Column, 1, - LBNCA_CopyText,TRUE, - LBNCA_Text, "", - LBNA_Column, 2, - LBNCA_CopyText,TRUE, - LBNCA_Text, "", - TAG_DONE)) - { - AddTail(twin->listbrowser_list, lbnode); - } - break; + RefreshSetGadgetAttrs((APTR)twin->objects[OID_VSCROLL], twin->win, NULL, + SCROLLER_Total, height, + SCROLLER_Visible, bbox->Height, + TAG_DONE); + + RefreshSetGadgetAttrs((APTR)twin->objects[OID_HSCROLL], twin->win, NULL, + SCROLLER_Total, width, + SCROLLER_Visible, bbox->Width, + TAG_DONE); } -#endif } -void tree_draw_node_expansion(struct tree *tree, struct node *node) +/** + * Retrieves the dimensions of the window with the tree + * + * \param data user data assigned to the tree on tree creation + * \param width will be updated to window width if not NULL + * \param height will be updated to window height if not NULL + */ +void ami_tree_get_window_dimensions(int *width, int *height, void *data) { - DebugPrintF("tree_draw_node_expansion\n"); + struct treeview_window *twin = data; + struct IBox *bbox; + + GetAttr(SPACE_AreaBox,twin->gadgets[GID_BROWSER],(ULONG *)&bbox); + + if(width) *width = bbox->Width; + if(height) *height = bbox->Height; } -void tree_recalculate_node_element(struct node_element *element) +/** + * Translates a content_type to the name of a respective icon + * + * \param content_type content type + * \param buffer buffer for the icon name + */ +void tree_icon_name_from_content_type(char *buffer, content_type type) { + // TODO: design/acquire icons + switch (type) { + case CONTENT_HTML: + case CONTENT_TEXTPLAIN: + case CONTENT_CSS: +#if defined(WITH_MNG) || defined(WITH_PNG) + case CONTENT_PNG: +#endif +#ifdef WITH_MNG + case CONTENT_JNG: + case CONTENT_MNG: +#endif +#ifdef WITH_JPEG + case CONTENT_JPEG: +#endif +#ifdef WITH_GIF + case CONTENT_GIF: +#endif +#ifdef WITH_BMP + case CONTENT_BMP: + case CONTENT_ICO: +#endif +#ifdef WITH_NSSPRITE + case CONTENT_SPRITE: +#endif +#ifdef WITH_NS_SVG + case CONTENT_SVG: +#endif + default: + ami_get_theme_filename(buffer,"theme_list_content",true); + break; + } } -void tree_update_URL_node(struct node *node, const char *url, - const struct url_data *data) +/** + * Scrolls the tree to make an element visible + * + * \param y Y coordinate of the element + * \param height height of the element + * \param data user data assigned to the tree on tree creation + */ +void ami_tree_scroll_visible(int y, int height, void *data) { - struct node_element *element; - char buffer[256]; + ULONG sy, scrollset; + struct IBox *bbox; + struct treeview_window *twin = data; - assert(node); + GetAttr(SCROLLER_Top, twin->objects[OID_VSCROLL], (ULONG *)&sy); + GetAttr(SPACE_AreaBox,twin->gadgets[GID_BROWSER],(ULONG *)&bbox); - element = tree_find_element(node, TREE_ELEMENT_URL); + if((y > sy) && ((y + height) < (sy + bbox->Height))) return; - if (!element) - return; - if (data) { - /* node is linked, update */ - assert(!node->editable); - if (!data->title) - urldb_set_url_title(url, url); - - if (!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; - } + if((y <= sy) || (height > bbox->Height)) scrollset = (ULONG)y; + else scrollset = sy + (y + height) - (sy + bbox->Height); -/* 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, (char *)messages_get("TreeLast"), - (data->last_visit > 0) ? - ctime((time_t *)&data->last_visit) : - (char *)messages_get("TreeUnknown")); - if (data->last_visit > 0) - buffer[strlen(buffer) - 1] = '\0'; - free((void *)element->text); - element->text = (char *)strdup(buffer); - } + RefreshSetGadgetAttrs((APTR)twin->objects[OID_VSCROLL], twin->win, NULL, + SCROLLER_Top, scrollset, + TAG_DONE); - element = tree_find_element(node, TREE_ELEMENT_VISITS); - if (element) { - snprintf(buffer, 256, (char *)messages_get("TreeVisits"), - data->visits); - free((void *)element->text); - element->text = (char *)strdup(buffer); - } + ami_tree_draw(twin); } -void tree_resized(struct tree *tree) +void ami_tree_scroll(struct treeview_window *twin, int sx, int sy) { + int x, y; + + if(!twin) return; + if(sx<0) sx=0; + if(sy<0) sy=0; + + GetAttr(SCROLLER_Top, twin->objects[OID_HSCROLL], (ULONG *)&x); + GetAttr(SCROLLER_Top, twin->objects[OID_VSCROLL], (ULONG *)&y); + + RefreshSetGadgetAttrs((APTR)twin->objects[OID_VSCROLL], twin->win, NULL, + SCROLLER_Top, y + sy, + TAG_DONE); + + RefreshSetGadgetAttrs((APTR)twin->objects[OID_HSCROLL], twin->win, NULL, + SCROLLER_Top, x + sx, + TAG_DONE); + + ami_tree_draw(twin); } -void tree_set_node_sprite_folder(struct node *node) + +void ami_tree_scroller_hook(struct Hook *hook,Object *object,struct IntuiMessage *msg) { -} + ULONG gid,x,y; + struct treeview_window *twin = hook->h_Data; + struct IntuiWheelData *wheel; + + switch(msg->Class) + { + case IDCMP_IDCMPUPDATE: + gid = GetTagData( GA_ID, 0, msg->IAddress ); + + switch( gid ) + { + case OID_HSCROLL: + case OID_VSCROLL: + ami_tree_draw(twin); + break; + } + break; + + case IDCMP_EXTENDEDMOUSE: + if(msg->Code == IMSGCODE_INTUIWHEELDATA) + { + wheel = (struct IntuiWheelData *)msg->IAddress; + + ami_tree_scroll(twin, (wheel->WheelX * 20), (wheel->WheelY * 20)); + } + break; + } +} -void tree_set_node_sprite(struct node *node, const char *sprite, - const char *expanded) +void ami_tree_menu(struct treeview_window *twin) { + if(twin->menu) return; + + if(twin->menu = AllocVec(sizeof(struct NewMenu) * AMI_TREE_MENU_ITEMS, MEMF_CLEAR)) + { + twin->menu[0].nm_Type = NM_TITLE; + twin->menu_name[0] = ami_utf8_easy((char *)messages_get("Tree")); + twin->menu[0].nm_Label = twin->menu_name[0]; + + twin->menu[1].nm_Type = NM_ITEM; + twin->menu_name[1] = ami_utf8_easy((char *)messages_get("TreeExport")); + twin->menu[1].nm_Label = twin->menu_name[1]; + if(twin->type == AMI_TREE_COOKIES) + twin->menu[1].nm_Flags = NM_ITEMDISABLED; + twin->menu[1].nm_CommKey = "S"; + + twin->menu[2].nm_Type = NM_ITEM; + twin->menu[2].nm_Label = NM_BARLABEL; + + twin->menu[3].nm_Type = NM_ITEM; + twin->menu_name[3] = ami_utf8_easy((char *)messages_get("Expand")); + twin->menu[3].nm_Label = twin->menu_name[3]; + + twin->menu[4].nm_Type = NM_SUB; + twin->menu_name[4] = ami_utf8_easy((char *)messages_get("All")); + twin->menu[4].nm_Label = twin->menu_name[4]; + twin->menu[4].nm_CommKey = "+"; + + if(twin->type == AMI_TREE_COOKIES) + { + twin->menu_name[5] = ami_utf8_easy((char *)messages_get("Domains")); + twin->menu_name[6] = ami_utf8_easy((char *)messages_get("Cookies")); + } + else + { + twin->menu_name[5] = ami_utf8_easy((char *)messages_get("Folders")); + twin->menu_name[6] = ami_utf8_easy((char *)messages_get("Links")); + } + + twin->menu[5].nm_Type = NM_SUB; + twin->menu[5].nm_Label = twin->menu_name[5]; // tree-specific title + + twin->menu[6].nm_Type = NM_SUB; + twin->menu[6].nm_Label = twin->menu_name[6]; // tree-specific title + + twin->menu[7].nm_Type = NM_ITEM; + twin->menu_name[7] = ami_utf8_easy((char *)messages_get("Collapse")); + twin->menu[7].nm_Label = twin->menu_name[7]; + + twin->menu[8].nm_Type = NM_SUB; + twin->menu[8].nm_Label = twin->menu_name[4]; + twin->menu[8].nm_CommKey = "-"; + + twin->menu[9].nm_Type = NM_SUB; + twin->menu[9].nm_Label = twin->menu_name[5]; // tree-specific title + + twin->menu[10].nm_Type = NM_SUB; + twin->menu[10].nm_Label = twin->menu_name[6]; // tree-specific title + + twin->menu[11].nm_Type = NM_ITEM; + twin->menu[11].nm_Label = NM_BARLABEL; + + twin->menu[12].nm_Type = NM_ITEM; + twin->menu_name[12] = ami_utf8_easy((char *)messages_get("CloseWindow")); + twin->menu[12].nm_Label = twin->menu_name[12]; + twin->menu[12].nm_CommKey = "K"; + + twin->menu[13].nm_Type = NM_TITLE; + twin->menu_name[13] = ami_utf8_easy((char *)messages_get("Edit")); + twin->menu[13].nm_Label = twin->menu_name[13]; + + twin->menu[14].nm_Type = NM_ITEM; + twin->menu_name[14] = ami_utf8_easy((char *)messages_get("TreeDelete")); + twin->menu[14].nm_Label = twin->menu_name[14]; + twin->menu[14].nm_CommKey = "D"; + + twin->menu[15].nm_Type = NM_ITEM; + twin->menu[15].nm_Label = NM_BARLABEL; + + twin->menu[16].nm_Type = NM_ITEM; + twin->menu_name[16] = ami_utf8_easy((char *)messages_get("SelectAllNS")); + twin->menu[16].nm_Label = twin->menu_name[16]; + twin->menu[16].nm_CommKey = "A"; + + twin->menu[17].nm_Type = NM_ITEM; + twin->menu_name[17] = ami_utf8_easy((char *)messages_get("ClearNS")); + twin->menu[17].nm_Label = twin->menu_name[17]; + twin->menu[17].nm_CommKey = "Z"; + + twin->menu[18].nm_Type = NM_END; + } } -void ami_open_tree(struct tree *tree,int type) +void ami_tree_open(struct treeview_window *twin,int type) { - struct treeview_window *twin; BOOL msel = TRUE,nothl = TRUE,launchdisable=FALSE; static WORD gen=0; char *wintitle; char folderclosed[100],folderopen[100],item[100]; - if(tree->handle) + if(twin->win) { - twin = (struct treeview_window *)tree->handle; WindowToFront(twin->win); ActivateWindow(twin->win); return; } - twin = AllocVec(sizeof(struct treeview_window),MEMF_PRIVATE | MEMF_CLEAR); - twin->listbrowser_list = AllocVec(sizeof(struct List),MEMF_PRIVATE | MEMF_CLEAR); + twin->type = type; - static struct ColumnInfo columninfo[] = - { - { 80,"Name", CIF_DRAGGABLE | CIF_SORTABLE}, - { 20,"URL", CIF_DRAGGABLE }, -// { 5,"Visits", CIF_DRAGGABLE }, - { -1, (STRPTR)~0, -1 } - }; - - if(tree->single_selection) msel = FALSE; - - ami_get_theme_filename(&folderclosed,"theme_list_folder_closed"); - ami_get_theme_filename(&folderopen,"theme_list_folder_open"); - - switch(type) + switch(twin->type) { case AMI_TREE_HOTLIST: nothl = FALSE; wintitle = (char *)messages_get("Hotlist"); - ami_get_theme_filename(&item,"theme_list_bookmark"); break; case AMI_TREE_COOKIES: nothl = TRUE; launchdisable=TRUE; wintitle = (char *)messages_get("Cookies"); - ami_get_theme_filename(&item,"theme_list_cookie"); break; case AMI_TREE_HISTORY: nothl = TRUE; wintitle = (char *)messages_get("GlobalHistory"); - ami_get_theme_filename(&item,"theme_list_history"); break; case AMI_TREE_SSLCERT: nothl = TRUE; wintitle = (char *)messages_get("SSLCerts"); - ami_get_theme_filename(&item,"theme_list_sslcert"); break; } - NewList(twin->listbrowser_list); + twin->scrollerhook.h_Entry = (void *)ami_tree_scroller_hook; + twin->scrollerhook.h_Data = twin; - tree->handle = (void *)twin; - twin->tree = tree; - ami_add_elements(twin,twin->tree->root,&gen); + ami_init_layers(&twin->globals, scrn->Width, scrn->Height); + ami_tree_menu(twin); - twin->objects[OID_MAIN] = WindowObject, + if(type == AMI_TREE_SSLCERT) + { + twin->objects[OID_MAIN] = WindowObject, WA_ScreenTitle,nsscreentitle, WA_Title,wintitle, WA_Activate, TRUE, @@ -259,43 +435,77 @@ void ami_open_tree(struct tree *tree,int type) WA_DragBar, TRUE, WA_CloseGadget, TRUE, WA_SizeGadget, TRUE, + WA_Height, scrn->Height / 2, WA_CustomScreen,scrn, + WA_ReportMouse,TRUE, + WA_IDCMP,IDCMP_MOUSEMOVE | IDCMP_MOUSEBUTTONS | IDCMP_NEWSIZE | + IDCMP_RAWKEY | IDCMP_GADGETUP | IDCMP_IDCMPUPDATE | + IDCMP_EXTENDEDMOUSE, + WINDOW_HorizProp,1, + WINDOW_VertProp,1, + WINDOW_IDCMPHook,&twin->scrollerhook, + WINDOW_IDCMPHookBits,IDCMP_IDCMPUPDATE | IDCMP_EXTENDEDMOUSE, WINDOW_SharedPort,sport, WINDOW_UserData,twin, - WINDOW_IconifyGadget, TRUE, + /* WINDOW_NewMenu, twin->menu, -> No menu for SSL Cert */ + WINDOW_IconifyGadget, FALSE, WINDOW_Position, WPOS_CENTERSCREEN, WINDOW_ParentGroup, twin->gadgets[GID_MAIN] = VGroupObject, - LAYOUT_AddChild, twin->gadgets[GID_TREEBROWSER] = ListBrowserObject, - GA_ID, GID_TREEBROWSER, - GA_RelVerify, TRUE, - GA_ReadOnly,FALSE, - LISTBROWSER_ColumnInfo, &columninfo, -// LISTBROWSER_ColumnTitles, TRUE, - LISTBROWSER_Hierarchical,TRUE, - LISTBROWSER_Editable,TRUE, -// LISTBROWSER_TitleClickable,TRUE, - LISTBROWSER_AutoFit, TRUE, - LISTBROWSER_HorizontalProp, TRUE, - LISTBROWSER_Labels, twin->listbrowser_list, -// LISTBROWSER_MultiSelect,msel, - LISTBROWSER_ShowSelected,TRUE, - LISTBROWSER_ShowImage,BitMapObject, - BITMAP_SourceFile,folderclosed, - BITMAP_Screen,scrn, - BITMAP_Masking,TRUE, - BitMapEnd, - LISTBROWSER_HideImage,BitMapObject, - BITMAP_SourceFile,folderopen, - BITMAP_Screen,scrn, - BITMAP_Masking,TRUE, - BitMapEnd, - LISTBROWSER_LeafImage,BitMapObject, - BITMAP_SourceFile,item, - BITMAP_Screen,scrn, - BITMAP_Masking,TRUE, - BitMapEnd, - ListBrowserEnd, - CHILD_NominalSize,TRUE, + LAYOUT_AddImage, LabelObject, + LABEL_Text, messages_get("SSLError"), + LabelEnd, + LAYOUT_AddChild, twin->gadgets[GID_BROWSER] = SpaceObject, + GA_ID, GID_BROWSER, + SPACE_Transparent,TRUE, + SPACE_BevelStyle, BVS_DISPLAY, + SpaceEnd, + LAYOUT_AddChild, HGroupObject, + LAYOUT_AddChild, twin->gadgets[GID_OPEN] = ButtonObject, + GA_ID,GID_OPEN, + GA_Text,messages_get("Accept"), + GA_RelVerify,TRUE, + ButtonEnd, + LAYOUT_AddChild, twin->gadgets[GID_CANCEL] = ButtonObject, + GA_ID,GID_CANCEL, + GA_Text,messages_get("Reject"), + GA_RelVerify,TRUE, + ButtonEnd, + EndGroup, + CHILD_WeightedHeight,0, + EndGroup, + EndWindow; + } + else + { + twin->objects[OID_MAIN] = WindowObject, + WA_ScreenTitle,nsscreentitle, + WA_Title,wintitle, + WA_Activate, TRUE, + WA_DepthGadget, TRUE, + WA_DragBar, TRUE, + WA_CloseGadget, TRUE, + WA_SizeGadget, TRUE, + WA_Height, scrn->Height / 2, + WA_CustomScreen,scrn, + WA_ReportMouse,TRUE, + WA_IDCMP,IDCMP_MOUSEMOVE | IDCMP_MOUSEBUTTONS | IDCMP_NEWSIZE | + IDCMP_RAWKEY | IDCMP_GADGETUP | IDCMP_IDCMPUPDATE | + IDCMP_EXTENDEDMOUSE, + WINDOW_HorizProp,1, + WINDOW_VertProp,1, + WINDOW_IDCMPHook,&twin->scrollerhook, + WINDOW_IDCMPHookBits,IDCMP_IDCMPUPDATE | IDCMP_EXTENDEDMOUSE, + WINDOW_SharedPort,sport, + WINDOW_UserData,twin, + WINDOW_NewMenu, twin->menu, + WINDOW_IconifyGadget, FALSE, + WINDOW_Position, WPOS_CENTERSCREEN, + WINDOW_ParentGroup, twin->gadgets[GID_MAIN] = VGroupObject, + LAYOUT_AddChild, twin->gadgets[GID_BROWSER] = SpaceObject, + GA_ID, GID_BROWSER, + SPACE_Transparent,TRUE, + SPACE_BevelStyle, BVS_DISPLAY, + SpaceEnd, LAYOUT_AddChild, HGroupObject, LAYOUT_AddChild, twin->gadgets[GID_OPEN] = ButtonObject, GA_ID,GID_OPEN, @@ -315,24 +525,6 @@ void ami_open_tree(struct tree *tree,int type) GA_RelVerify,TRUE, GA_Disabled,nothl, ButtonEnd, - LAYOUT_AddChild, twin->gadgets[GID_LEFT] = ButtonObject, - GA_ID,GID_LEFT, - BUTTON_AutoButton,BAG_LFARROW, - GA_RelVerify,TRUE, - GA_Disabled,nothl, //(!tree->movable), - ButtonEnd, - LAYOUT_AddChild, twin->gadgets[GID_UP] = ButtonObject, - GA_ID,GID_UP, - BUTTON_AutoButton,BAG_UPARROW, - GA_RelVerify,TRUE, - GA_Disabled,nothl, //(!tree->movable), - ButtonEnd, - LAYOUT_AddChild, twin->gadgets[GID_DOWN] = ButtonObject, - GA_ID,GID_DOWN, - BUTTON_AutoButton,BAG_DNARROW, - GA_RelVerify,TRUE, - GA_Disabled,nothl, //(!tree->movable), - ButtonEnd, LAYOUT_AddChild, twin->gadgets[GID_DEL] = ButtonObject, GA_ID,GID_DEL, GA_Text,messages_get("TreeDelete"), @@ -342,161 +534,89 @@ void ami_open_tree(struct tree *tree,int type) CHILD_WeightedHeight,0, EndGroup, EndWindow; + } twin->win = (struct Window *)RA_OpenWindow(twin->objects[OID_MAIN]); - twin->node = AddObject(window_list,AMINS_TVWINDOW); - twin->node->objstruct = twin; -} - -/** - * 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; + GetAttr(WINDOW_HorizObject, twin->objects[OID_MAIN], + (ULONG *)&twin->objects[OID_HSCROLL]); + GetAttr(WINDOW_VertObject, twin->objects[OID_MAIN], + (ULONG *)&twin->objects[OID_VSCROLL]); - assert(node); + RefreshSetGadgetAttrs((APTR)twin->objects[OID_VSCROLL], twin->win, NULL, + GA_ID,OID_VSCROLL, + ICA_TARGET,ICTARGET_IDCMP, + TAG_DONE); - element = tree_find_element(node, TREE_ELEMENT_URL); - if (element) { - browser_window_create(element->text, NULL, 0, true, false); - return true; - } + RefreshSetGadgetAttrs((APTR)twin->objects[OID_HSCROLL], twin->win, NULL, + GA_ID,OID_HSCROLL, + ICA_TARGET,ICTARGET_IDCMP, + TAG_DONE); -/* not implemented yet - element = tree_find_element(node, TREE_ELEMENT_SSL); - if (element) { - ro_gui_cert_open(tree, node); - return true; - } -*/ + twin->node = AddObject(window_list,AMINS_TVWINDOW); + twin->node->objstruct = twin; - return false; + ami_tree_resized(twin->tree, twin->max_width, twin->max_height, twin); + tree_set_redraw(twin->tree, true); + ami_tree_draw(twin); } void ami_tree_close(struct treeview_window *twin) { - twin->tree->handle = 0; - DisposeObject(twin->objects[OID_MAIN]); - FreeListBrowserList(twin->listbrowser_list); - FreeVec(twin->listbrowser_list); - //free_browserlist(twin->listbrowser_list); - DelObject(twin->node); -} - -void free_browserlist(struct List *list) -{ - struct Node *node, *nextnode; - - if(IsListEmpty(list)) return; + int i; - node = GetHead(list); + tree_set_redraw(twin->tree, false); + twin->win = NULL; + DisposeObject(twin->objects[OID_MAIN]); + DelObjectNoFree(twin->node); + ami_free_layers(&twin->globals); - do - { - nextnode = GetSucc(node); -// FreeVec(node->ln_Name); - FreeListBrowserNode(node); - } while(node = nextnode); + for(i=0;i<AMI_TREE_MENU_ITEMS;i++) + { + if(twin->menu_name[i] && (twin->menu_name[i] != NM_BARLABEL)) ami_utf8_free(twin->menu_name[i]); + } + FreeVec(twin->menu); + twin->menu = NULL; + if(twin->type == AMI_TREE_SSLCERT) ami_ssl_free(twin); } -void ami_add_elements(struct treeview_window *twin,struct node *root,WORD *gen) +void ami_tree_update_quals(struct treeview_window *twin) { - struct Node *lbnode; - struct tree *tree = twin->tree; - struct node *tempnode; - int generation=1; - BOOL edit = FALSE; - struct node_element *element=NULL,*element2=NULL,*element3=NULL; - struct node *node; - ULONG flags = 0; - STRPTR text1 = "",text2 = "",text3 = ""; - - *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); - if(!element) element = tree_find_element(node, TREE_ELEMENT_SSL); - if(element && element->text) - { - text1 = (char *)element->text; - } + uint32 quals = 0; -/* Really, the second column needs axing - relevant data should appear in an -area below the listview when items are selected */ + GetAttr(WINDOW_Qualifier, twin->objects[OID_MAIN], (uint32 *)&quals); - 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); + twin->key_state = 0; - if(element2 && element2->text) - { - text2 = (char *)element2->text; - } - else - { - text2 = ""; - } + if((quals & IEQUALIFIER_LSHIFT) || (quals & IEQUALIFIER_RSHIFT)) + { + twin->key_state |= BROWSER_MOUSE_MOD_1; + } -// element = tree_find_element(node, TREE_ELEMENT_VISITS); - - flags = 0; - /*if(node->expanded) */ flags = LBFLG_SHOWCHILDREN; - if(node->folder) flags |= LBFLG_HASCHILDREN; - if(!node->parent) flags |= LBFLG_HIDDEN; - - switch (element->type) { - case NODE_ELEMENT_TEXT_PLUS_SPRITE: - case NODE_ELEMENT_TEXT: - if (lbnode = AllocListBrowserNode(3, - LBNA_UserData,node, - LBNA_Generation,*gen - 1, - LBNA_Selected,node->selected, - LBNA_Flags,flags, - LBNA_Column, 0, - LBNCA_CopyText,TRUE, - LBNCA_MaxChars,256, - LBNCA_Text, text1, - LBNCA_Editable,node->editable, - LBNA_Column, 1, - LBNCA_CopyText,TRUE, - LBNCA_MaxChars,256, - LBNCA_Text, text2, - LBNCA_Editable,FALSE, - TAG_DONE)) - { - AddTail(twin->listbrowser_list, lbnode); - if(node == selectednode2) selectednode = lbnode; - } - break; - } + if(quals & IEQUALIFIER_CONTROL) + { + twin->key_state |= BROWSER_MOUSE_MOD_2; + } - if (node->child) - { - ami_add_elements(twin,node->child,gen); - } + if((quals & IEQUALIFIER_LALT) || (quals & IEQUALIFIER_RALT)) + { + twin->key_state |= BROWSER_MOUSE_MOD_3; } - *gen = *gen - 1; } BOOL ami_tree_event(struct treeview_window *twin) { /* return TRUE if window destroyed */ - ULONG class,result,relevent = 0; - ULONG column; + ULONG class,result,storage = 0; uint16 code; struct MenuItem *item; - struct node *treenode; - struct Node *lbnode; - struct node_element *element; - char *text; -// ULONG editcols[] = {TREE_ELEMENT_TITLE,TREE_ELEMENT_URL}; - static WORD gen=0; + ULONG menunum=0,itemnum=0,subnum=0; + int xs, ys, x, y; + struct IBox *bbox; + struct timeval curtime; + struct InputEvent *ie; + int nskey; + char fname[1024]; while((result = RA_HandleInput(twin->objects[OID_MAIN],&code)) != WMHI_LASTMSG) { @@ -505,126 +625,386 @@ BOOL ami_tree_event(struct treeview_window *twin) case WMHI_GADGETUP: switch(result & WMHI_GADGETMASK) { - case GID_TREEBROWSER: - GetAttrs(twin->gadgets[GID_TREEBROWSER], - LISTBROWSER_RelEvent,&relevent, - TAG_DONE); - - switch(relevent) + case GID_OPEN: + if(twin->type == AMI_TREE_SSLCERT) { - case LBRE_DOUBLECLICK: - GetAttr(LISTBROWSER_SelectedNode,twin->gadgets[GID_TREEBROWSER],(ULONG *)&lbnode); - GetListBrowserNodeAttrs(lbnode, - LBNA_UserData,(ULONG *)&treenode, - TAG_DONE); - ami_tree_launch_node(twin->tree,treenode); - break; - - 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; + sslcert_accept(twin->ssl_data); + ami_tree_close(twin); + return TRUE; } + else tree_launch_selected(twin->tree); 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); + case GID_CANCEL: + sslcert_reject(twin->ssl_data); + ami_tree_close(twin); + return TRUE; 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); + hotlist_add_folder(); break; case GID_NEWB: - ami_new_bookmark(twin); + hotlist_add_entry(); break; - case GID_UP: - ami_move_node(twin,AMI_MOVE_UP); + case GID_DEL: + switch(twin->type) + { + case AMI_TREE_HISTORY: + history_global_delete_selected(); + break; + case AMI_TREE_COOKIES: + cookies_delete_selected(); + break; + case AMI_TREE_HOTLIST: + hotlist_delete_selected(); + break; + } break; + } + break; - case GID_DOWN: - ami_move_node(twin,AMI_MOVE_DOWN); - break; + case WMHI_MOUSEMOVE: + GetAttr(SPACE_AreaBox, twin->gadgets[GID_BROWSER], (ULONG *)&bbox); - case GID_LEFT: - ami_move_node(twin,AMI_MOVE_OUT); - break; + GetAttr(SCROLLER_Top, twin->objects[OID_HSCROLL], (ULONG *)&xs); + x = twin->win->MouseX - bbox->Left + xs; - case GID_DEL: - GetAttr(LISTBROWSER_SelectedNode,twin->gadgets[GID_TREEBROWSER],(ULONG *)&lbnode); - GetListBrowserNodeAttrs(lbnode, - LBNA_UserData,(ULONG *)&treenode, - TAG_DONE); - tree_delete_node(twin->tree, treenode, false); -/* We are recreating the list from scratch as there is no obvious easy way - to delete children from a listbrowser list */ - ami_recreate_listbrowser(twin); + GetAttr(SCROLLER_Top, twin->objects[OID_VSCROLL], (ULONG *)&ys); + y = twin->win->MouseY - bbox->Top + ys; + + 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) + { + tree_mouse_action(twin->tree, + BROWSER_MOUSE_DRAG_1 | twin->key_state, x, y); + twin->mouse_state = BROWSER_MOUSE_HOLDING_1 | + BROWSER_MOUSE_DRAG_ON; + if(twin->drag_x == 0) twin->drag_x = x; + if(twin->drag_y == 0) twin->drag_y = y; + + } + else if(twin->mouse_state & BROWSER_MOUSE_PRESS_2) + { + tree_mouse_action(twin->tree, + BROWSER_MOUSE_DRAG_2 | twin->key_state, x, y); + twin->mouse_state = BROWSER_MOUSE_HOLDING_2 | + BROWSER_MOUSE_DRAG_ON; + if(twin->drag_x == 0) twin->drag_x = x; + if(twin->drag_y == 0) twin->drag_y = y; + } + else + { + tree_mouse_action(twin->tree, + twin->mouse_state | twin->key_state, x, y); + } + } + twin->lastclick.tv_sec = 0; + twin->lastclick.tv_usec = 0; + break; + + case WMHI_MOUSEBUTTONS: + GetAttr(SPACE_AreaBox, twin->gadgets[GID_BROWSER], (ULONG *)&bbox); + GetAttr(SCROLLER_Top, twin->objects[OID_HSCROLL], (ULONG *)&xs); + x = twin->win->MouseX - bbox->Left + xs; + GetAttr(SCROLLER_Top, twin->objects[OID_VSCROLL], (ULONG *)&ys); + y = twin->win->MouseY - bbox->Top + ys; + + 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; + break; + case MIDDLEDOWN: + twin->mouse_state = BROWSER_MOUSE_PRESS_2; + break; + } + tree_mouse_action(twin->tree, + twin->mouse_state | twin->key_state, x, y); + } + + if(x < xs) x = xs; + if(y < ys) y = ys; + if(x >= bbox->Width + xs) x = bbox->Width + xs - 1; + if(y >= bbox->Height + ys) y = bbox->Height + ys - 1; + + switch(code) + { + case SELECTUP: + if(twin->mouse_state & BROWSER_MOUSE_PRESS_1) + { + CurrentTime(&curtime.tv_sec,&curtime.tv_usec); + + twin->mouse_state = BROWSER_MOUSE_CLICK_1; + + if(twin->lastclick.tv_sec) + { + if(DoubleClick(twin->lastclick.tv_sec, + twin->lastclick.tv_usec, + curtime.tv_sec, curtime.tv_usec)) + twin->mouse_state |= BROWSER_MOUSE_DOUBLE_CLICK; + } + tree_mouse_action(twin->tree, + twin->mouse_state | twin->key_state, x, y); + + if(twin->mouse_state & BROWSER_MOUSE_DOUBLE_CLICK) + { + twin->lastclick.tv_sec = 0; + twin->lastclick.tv_usec = 0; + } + else + { + twin->lastclick.tv_sec = curtime.tv_sec; + twin->lastclick.tv_usec = curtime.tv_usec; + } + } + else + { + tree_drag_end(twin->tree, twin->mouse_state, + twin->drag_x, twin->drag_y, x, y); + } + twin->mouse_state=0; + twin->drag_x = 0; + twin->drag_y = 0; + break; + case MIDDLEUP: + if(twin->mouse_state & BROWSER_MOUSE_PRESS_2) + { + tree_mouse_action(twin->tree, + BROWSER_MOUSE_CLICK_2 | twin->key_state, x, y); + } + else + { + tree_drag_end(twin->tree, twin->mouse_state, + twin->drag_x, twin->drag_y, x, y); + } + twin->mouse_state=0; + twin->drag_x = 0; + twin->drag_y = 0; break; } break; -/* no menus yet, copied in as will probably need it later + case WMHI_RAWKEY: + storage = result & WMHI_GADGETMASK; + + GetAttr(WINDOW_InputEvent,twin->objects[OID_MAIN],(ULONG *)&ie); + nskey = ami_key_to_nskey(storage, ie); + tree_keypress(twin->tree, nskey); + break; + case WMHI_MENUPICK: - item = ItemAddress(gwin->win->MenuStrip,code); + item = ItemAddress(twin->win->MenuStrip,code); while (code != MENUNULL) { - ami_menupick(code,gwin); + menunum = MENUNUM(code); + itemnum = ITEMNUM(code); + subnum = SUBNUM(code); + + switch(menunum) + { + case 0: // tree + switch(itemnum) + { + case 0: // export + if(AslRequestTags(savereq, + ASLFR_TitleText,messages_get("NetSurf"), + ASLFR_Screen,scrn, + ASLFR_InitialFile,"tree_export.html", + TAG_DONE)) + { + strlcpy(&fname,savereq->fr_Drawer,1024); + AddPart(fname,savereq->fr_File,1024); + ami_update_pointer(twin->win,GUI_POINTER_WAIT); + if(twin->type == AMI_TREE_HISTORY) + history_global_export(fname); + else if(twin->type == AMI_TREE_HOTLIST) + hotlist_export(fname); + ami_update_pointer(twin->win,GUI_POINTER_DEFAULT); + } + break; + + case 2: // expand + switch(subnum) + { + case 0: // all + switch(twin->type) + { + case AMI_TREE_HISTORY: + history_global_expand_all(); + break; + case AMI_TREE_COOKIES: + cookies_expand_all(); + break; + case AMI_TREE_HOTLIST: + hotlist_expand_all(); + break; + } + break; + + case 1: // lev 1 + switch(twin->type) + { + case AMI_TREE_HISTORY: + history_global_expand_directories(); + break; + case AMI_TREE_COOKIES: + cookies_expand_domains(); + break; + case AMI_TREE_HOTLIST: + hotlist_expand_directories(); + break; + } + break; + + case 2: // lev 2 + switch(twin->type) + { + case AMI_TREE_HISTORY: + history_global_expand_addresses(); + break; + case AMI_TREE_COOKIES: + cookies_expand_cookies(); + break; + case AMI_TREE_HOTLIST: + hotlist_expand_addresses(); + break; + } + break; + } + break; + + case 3: // collapse + switch(subnum) + { + case 0: // all + switch(twin->type) + { + case AMI_TREE_HISTORY: + history_global_collapse_all(); + break; + case AMI_TREE_COOKIES: + cookies_collapse_all(); + break; + case AMI_TREE_HOTLIST: + hotlist_collapse_all(); + break; + } + break; + + case 1: // lev 1 + switch(twin->type) + { + case AMI_TREE_HISTORY: + history_global_collapse_directories(); + break; + case AMI_TREE_COOKIES: + cookies_collapse_domains(); + break; + case AMI_TREE_HOTLIST: + hotlist_collapse_directories(); + break; + } + break; + + case 2: // lev 2 + switch(twin->type) + { + case AMI_TREE_HISTORY: + history_global_collapse_addresses(); + break; + case AMI_TREE_COOKIES: + cookies_collapse_cookies(); + break; + case AMI_TREE_HOTLIST: + hotlist_collapse_addresses(); + break; + } + break; + } + break; + + case 5: // close + ami_tree_close(twin); + return TRUE; + break; + } + break; + + case 1: // edit + switch(itemnum) + { + case 0: // delete + switch(twin->type) + { + case AMI_TREE_HISTORY: + history_global_delete_selected(); + break; + case AMI_TREE_COOKIES: + cookies_delete_selected(); + break; + case AMI_TREE_HOTLIST: + hotlist_delete_selected(); + break; + } + break; + + case 2: // select all + switch(twin->type) + { + case AMI_TREE_HISTORY: + history_global_select_all(); + break; + case AMI_TREE_COOKIES: + cookies_select_all(); + break; + case AMI_TREE_HOTLIST: + hotlist_select_all(); + break; + } + break; + + case 3: // clear + switch(twin->type) + { + case AMI_TREE_HISTORY: + history_global_clear_selection(); + break; + case AMI_TREE_COOKIES: + cookies_clear_selection(); + break; + case AMI_TREE_HOTLIST: + hotlist_clear_selection(); + break; + } + break; + } + break; + } + if(win_destroyed) break; code = item->NextSelect; } break; -*/ + + case WMHI_NEWSIZE: + ami_tree_draw(twin); + break; case WMHI_CLOSEWINDOW: + if(twin->type == AMI_TREE_SSLCERT) + sslcert_reject(twin->ssl_data); ami_tree_close(twin); return TRUE; break; @@ -633,103 +1013,44 @@ BOOL ami_tree_event(struct treeview_window *twin) return FALSE; } -void ami_move_node(struct treeview_window *twin,int move) +void ami_tree_draw(struct treeview_window *twin) { - struct Node *lbnode = NULL; - struct node *treenode,*moveto; - bool before; - - GetAttr(LISTBROWSER_SelectedNode,twin->gadgets[GID_TREEBROWSER],(ULONG *)&lbnode); - - if(!lbnode) return; - - GetListBrowserNodeAttrs(lbnode, - LBNA_UserData,(ULONG *)&treenode, -// for multiselects? LBNA_Selected,(BOOL *)&sel, - TAG_DONE); - - selectednode2 = treenode; + struct IBox *bbox; + int x, y; - tree_set_node_selected(twin->tree,twin->tree->root,false); - tree_set_node_selected(twin->tree,treenode,true); - - switch(move) - { - case AMI_MOVE_UP: - moveto = treenode->previous; - before = true; - break; - - case AMI_MOVE_DOWN: - moveto = treenode->next; - before = false; - break; - - case AMI_MOVE_OUT: - moveto = treenode->parent->previous; - before = false; - break; - } + if(!twin) return; - if(!moveto) return; + GetAttr(SCROLLER_Top, twin->objects[OID_HSCROLL], (ULONG *)&x); + GetAttr(SCROLLER_Top, twin->objects[OID_VSCROLL], (ULONG *)&y); + GetAttr(SPACE_AreaBox,twin->gadgets[GID_BROWSER],(ULONG *)&bbox); - tree_delink_node(treenode); - //tree_move_selected_nodes(twin->tree,moveto,before); - tree_link_node(moveto,treenode,before); - ami_recreate_listbrowser(twin); - selectednode2 = NULL; + ami_tree_redraw_request(x, y, bbox->Width, bbox->Height, twin); } -void ami_new_bookmark(struct treeview_window *twin) +void ami_tree_redraw_request(int x, int y, int width, int height, void *data) { - const struct url_data *data; - struct Node *lbnode; - struct node *treenode; - char *url,*title; + struct treeview_window *twin = data; + struct IBox *bbox; + int pos_x, pos_y; - GetAttr(LISTBROWSER_SelectedNode,twin->gadgets[GID_TREEBROWSER],(ULONG *)&lbnode); - if(lbnode) - { - GetListBrowserNodeAttrs(lbnode, - LBNA_UserData,(ULONG *)&treenode, - TAG_DONE); - } - else - { - treenode = twin->tree->root; - } + if(!twin->win) return; +// if(tree_get_redraw(twin->tree) == false) return; - url = (char *)strdup("http://www.netsurf-browser.org"); + ami_update_pointer(twin->win, GUI_POINTER_WAIT); + glob = &twin->globals; - data = urldb_get_url_data(url); - if (!data) - { - urldb_add_url(url); - urldb_set_url_persistence(url,true); - data = urldb_get_url_data(url); - } + GetAttr(SPACE_AreaBox,twin->gadgets[GID_BROWSER],(ULONG *)&bbox); + GetAttr(SCROLLER_Top, twin->objects[OID_HSCROLL], (ULONG *)&pos_x); + GetAttr(SCROLLER_Top, twin->objects[OID_VSCROLL], (ULONG *)&pos_y); - if (data) - { - title = data->title; - tree_create_URL_node(treenode,url,data,title); - ami_recreate_listbrowser(twin); - } -} - -void ami_recreate_listbrowser(struct treeview_window *twin) -{ - static WORD gen=0; + 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); - SetGadgetAttrs(twin->gadgets[GID_TREEBROWSER],twin->win,NULL, - LISTBROWSER_Labels,~0, - TAG_DONE); + tree_draw(twin->tree, -pos_x, -pos_y, x, y, width, height); - FreeListBrowserList(twin->listbrowser_list); - ami_add_elements(twin,twin->tree->root,&gen); + BltBitMapRastPort(twin->globals.bm, x - pos_x, y - pos_y, twin->win->RPort, + bbox->Left + x - pos_x, bbox->Top + y - pos_y, width, height, 0x0C0); - RefreshSetGadgetAttrs(twin->gadgets[GID_TREEBROWSER],twin->win,NULL, - LISTBROWSER_Labels,twin->listbrowser_list, - LISTBROWSER_SelectedNode,selectednode, - TAG_DONE); + ami_update_pointer(twin->win, GUI_POINTER_DEFAULT); + glob = &browserglob; } |