From d21447d096a320a08b3efb2b8768fad0dcdcfd64 Mon Sep 17 00:00:00 2001 From: Vincent Sanders Date: Thu, 5 May 2016 22:28:51 +0100 Subject: move frontends into sub directory --- frontends/amiga/drag.c | 352 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 352 insertions(+) create mode 100644 frontends/amiga/drag.c (limited to 'frontends/amiga/drag.c') diff --git a/frontends/amiga/drag.c b/frontends/amiga/drag.c new file mode 100644 index 000000000..67d17223e --- /dev/null +++ b/frontends/amiga/drag.c @@ -0,0 +1,352 @@ +/* + * Copyright 2010 Chris Young + * + * 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 . + */ +#ifdef __amigaos4__ +#include + +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include "utils/errors.h" +#include "utils/log.h" +#include "utils/messages.h" +#include "utils/utils.h" +#include "utils/nsoption.h" +#include "content/hlcache.h" +#include "desktop/mouse.h" + +#include "amiga/bitmap.h" +#include "amiga/clipboard.h" +#include "amiga/download.h" +#include "amiga/drag.h" +#include "amiga/file.h" +#include "amiga/filetype.h" +#include "amiga/gui.h" +#include "amiga/theme.h" + + +struct Window *drag_icon = NULL; +ULONG drag_icon_width; +ULONG drag_icon_height; +BOOL drag_in_progress = FALSE; + +void gui_drag_save_object(struct gui_window *g, struct hlcache_handle *c, + gui_save_type type) +{ + const char *filetype = NULL; + + /* Check we are running on Workbench */ + if(nsoption_charp(pubscreen_name) == NULL) return; + if(strcmp(nsoption_charp(pubscreen_name), "Workbench")) return; + + switch(type) { + case GUI_SAVE_OBJECT_ORIG: // object + case GUI_SAVE_SOURCE: + filetype = ami_mime_content_to_filetype(c); + break; + case GUI_SAVE_COMPLETE: + filetype = "drawer"; + break; + case GUI_SAVE_OBJECT_NATIVE: +#ifdef WITH_NS_SVG + if(ami_mime_compare(c, "svg") == true) + { + filetype = "dr2d"; + } + else +#endif + { + filetype = "ilbm"; + } + break; + + default: + break; + } + + ami_drag_icon_show(g->shared->win, filetype); + + drag_save_data = c; + drag_save_gui = g; + drag_save = type; +} + +void gui_drag_save_selection(struct gui_window *g, const char *selection) +{ + ami_drag_icon_show(g->shared->win, "ascii"); + + ami_autoscroll = TRUE; + drag_save_data = g; + drag_save = GUI_SAVE_TEXT_SELECTION; +} + +void ami_drag_save(struct Window *win) +{ + ULONG which = WBO_NONE, type; + char path[1025], dpath[1025]; + + ami_drag_icon_close(NULL); + ami_autoscroll = FALSE; + + if(nsoption_charp(pubscreen_name) && (strcmp(nsoption_charp(pubscreen_name),"Workbench") == 0)) + { + which = WhichWorkbenchObject(NULL,scrn->MouseX,scrn->MouseY, + WBOBJA_Type,&type, + WBOBJA_FullPath,&path, + WBOBJA_FullPathSize,1024, + WBOBJA_DrawerPath,&dpath, + WBOBJA_DrawerPathSize,1024, + TAG_DONE); + } + + if((which == WBO_DRAWER) || ((which == WBO_ICON) && (type > WBDRAWER))) + { + strcpy(path,dpath); + } + else if(which == WBO_NONE) + { + if(drag_save == GUI_SAVE_TEXT_SELECTION) + ami_drag_selection((struct gui_window *)drag_save_data); + else DisplayBeep(scrn); + + drag_save = 0; + drag_save_data = NULL; + return; + } + + if(path[0] == '\0') + { + DisplayBeep(scrn); + drag_save = 0; + drag_save_data = NULL; + return; + } + + ami_update_pointer(win, GUI_POINTER_WAIT); + + switch(drag_save) + { + case GUI_SAVE_OBJECT_ORIG: // object + case GUI_SAVE_SOURCE: + { + struct hlcache_handle *c = drag_save_data; + + AddPart(path, content_get_title(c), 1024); + ami_file_save(AMINS_SAVE_SOURCE, path, win, c, NULL, NULL); + } + break; + + case GUI_SAVE_TEXT_SELECTION: // selection + AddPart(path,"netsurf_text_selection",1024); + struct gui_window *g = (struct gui_window *) drag_save_data; + ami_file_save(AMINS_SAVE_SELECTION, path, win, NULL, NULL, g->bw); + break; + + case GUI_SAVE_COMPLETE: + { + struct hlcache_handle *c = drag_save_data; + + AddPart(path, content_get_title(c), 1024); + ami_file_save(AMINS_SAVE_COMPLETE, path, win, c, drag_save_gui->favicon, NULL); + } + break; + + case GUI_SAVE_OBJECT_NATIVE: + { + hlcache_handle *c = drag_save_data; + AddPart(path, content_get_title(c), 1024); + + ami_file_save(AMINS_SAVE_IFF, path, win, c, NULL, NULL); + } + break; + + default: + LOG("Unsupported drag save operation %d", drag_save); + break; + } + + drag_save = 0; + drag_save_data = NULL; + + ami_update_pointer(win, GUI_POINTER_DEFAULT); +} + +void ami_drag_icon_show(struct Window *win, const char *type) +{ + struct DiskObject *dobj = NULL; + ULONG width, height; + int deftype = WBPROJECT; + + drag_in_progress = TRUE; + + if(nsoption_bool(drag_save_icons) == false) + { + ami_update_pointer(win, AMI_GUI_POINTER_DRAG); + return; + } + else + { + ami_update_pointer(win, GUI_POINTER_DEFAULT); + } + + if(!strcmp(type, "drawer")) deftype = WBDRAWER; + + dobj = GetIconTags(NULL, ICONGETA_GetDefaultName, type, + ICONGETA_GetDefaultType, deftype, + TAG_DONE); + + IconControl(dobj, + ICONCTRLA_GetWidth,&width, + ICONCTRLA_GetHeight,&height, + TAG_DONE); + + drag_icon_width = width; + drag_icon_height = height; + + drag_icon = OpenWindowTags(NULL, + WA_Left, scrn->MouseX - (width/2), + WA_Top, scrn->MouseY - (height/2), + WA_Width, width, + WA_Height, height, + WA_PubScreen, scrn, + WA_Borderless, TRUE, + WA_ToolBox, TRUE, + WA_StayTop, TRUE, + WA_Opaqueness, 128, + WA_OverrideOpaqueness, TRUE, + TAG_DONE); + +/* probably need layouticon and drawinfo stuff too */ + + DrawIconState(drag_icon->RPort, dobj, NULL, 0, 0, IDS_NORMAL, + ICONDRAWA_Frameless, TRUE, + ICONDRAWA_Borderless, TRUE, + TAG_DONE); +} + +void ami_drag_icon_move(void) +{ + if(drag_icon == NULL) return; + + ChangeWindowBox(drag_icon, scrn->MouseX - (drag_icon_width / 2), + scrn->MouseY - (drag_icon_height / 2), + drag_icon_width, drag_icon_height); +} + +/** + * Close the drag icon (invisible) window if it is open + * + * \param win pointer to window to clear drag pointer + */ + +void ami_drag_icon_close(struct Window *win) +{ + if(drag_icon) CloseWindow(drag_icon); + if(win) ami_update_pointer(win, GUI_POINTER_DEFAULT); + drag_icon = NULL; + drag_in_progress = FALSE; +} + +BOOL ami_drag_in_progress(void) +{ + return drag_in_progress; +} + +static void *ami_find_gwin_by_id(struct Window *win, uint32 type) +{ + struct nsObject *node, *nnode; + struct gui_window_2 *gwin; + + if(!IsMinListEmpty(window_list)) + { + node = (struct nsObject *)GetHead((struct List *)window_list); + + do + { + nnode=(struct nsObject *)GetSucc((struct Node *)node); + + if(node->Type == type) + { + gwin = node->objstruct; + if(win == gwin->win) return gwin; + } + } while((node = nnode)); + } + return NULL; +} + +void *ami_window_at_pointer(int type) +{ + struct Layer *layer; + + LockLayerInfo(&scrn->LayerInfo); + + layer = WhichLayer(&scrn->LayerInfo, scrn->MouseX, scrn->MouseY); + + UnlockLayerInfo(&scrn->LayerInfo); + + if(layer) return ami_find_gwin_by_id(layer->Window, type); + else return NULL; +} + +#else +#include "amiga/drag.h" + +void gui_drag_save_object(struct gui_window *g, struct hlcache_handle *c, + gui_save_type type) +{ +} + +void gui_drag_save_selection(struct gui_window *g, const char *selection) +{ +} + +void ami_drag_save(struct Window *win) +{ +} + +void ami_drag_icon_show(struct Window *win, const char *type) +{ +} + +void ami_drag_icon_close(struct Window *win) +{ +} + +void ami_drag_icon_move(void) +{ +} + +BOOL ami_drag_in_progress(void) +{ + return FALSE; +} + +void *ami_window_at_pointer(int type) +{ + return NULL; +} +#endif + -- cgit v1.2.3