From 318869e90e26da3a90a294ad6fa7a7a3ba9fcb5a Mon Sep 17 00:00:00 2001 From: James Bursa Date: Thu, 26 Feb 2004 00:44:42 +0000 Subject: [project @ 2004-02-26 00:44:42 by bursa] Implement drag saving of drawfiles and clean up drag/drop/save code. svn path=/import/netsurf/; revision=568 --- riscos/save.c | 126 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 126 insertions(+) create mode 100644 riscos/save.c (limited to 'riscos/save.c') diff --git a/riscos/save.c b/riscos/save.c new file mode 100644 index 000000000..b7adf6fb4 --- /dev/null +++ b/riscos/save.c @@ -0,0 +1,126 @@ +/* + * This file is part of NetSurf, http://netsurf.sourceforge.net/ + * Licensed under the GNU General Public License, + * http://www.opensource.org/licenses/gpl-license + * Copyright 2004 James Bursa + */ + +/** \file + * Save dialog and drag and drop saving (implementation). + */ + +#include +#include +#include "oslib/dragasprite.h" +#include "oslib/wimp.h" +#include "netsurf/riscos/gui.h" +#include "netsurf/riscos/save_draw.h" +#include "netsurf/utils/log.h" +#include "netsurf/utils/messages.h" +#include "netsurf/utils/utils.h" + +gui_save_type gui_current_save_type; + + +/** + * Handle clicks in the save dialog. + */ + +void ro_gui_save_click(wimp_pointer *pointer) +{ + switch (pointer->i) { + case ICON_SAVE_ICON: + if (pointer->buttons == wimp_DRAG_SELECT) { + gui_current_drag_type = GUI_DRAG_SAVE; + ro_gui_drag_icon(pointer); + } + break; + } +} + + +/** + * Start drag of icon under the pointer. + */ + +void ro_gui_drag_icon(wimp_pointer *pointer) +{ + char *sprite; + os_box box = { pointer->pos.x - 34, pointer->pos.y - 34, + pointer->pos.x + 34, pointer->pos.y + 34 }; + os_error *error; + + if (pointer->i == -1) + return; + + sprite = ro_gui_get_icon_string(pointer->w, pointer->i); + + error = xdragasprite_start(dragasprite_HPOS_CENTRE | + dragasprite_VPOS_CENTRE | + dragasprite_BOUND_POINTER | + dragasprite_DROP_SHADOW, + (osspriteop_area *) 1, sprite, &box, 0); + if (error) { + LOG(("0x%x: %s", error->errnum, error->errmess)); + warn_user(error->errmess); + } +} + + +/** + * Handle User_Drag_Box event for a drag from the save dialog. + */ + +void ro_gui_save_drag_end(wimp_dragged *drag) +{ + wimp_pointer pointer; + wimp_message message; + + wimp_get_pointer_info(&pointer); + + message.your_ref = 0; + message.action = message_DATA_SAVE; + message.data.data_xfer.w = pointer.w; + message.data.data_xfer.i = pointer.i; + message.data.data_xfer.pos.x = pointer.pos.x; + message.data.data_xfer.pos.y = pointer.pos.y; + message.data.data_xfer.est_size = 1000; + message.data.data_xfer.file_type = 0xfaf; + if (gui_current_save_type == GUI_SAVE_DRAW) + message.data.data_xfer.file_type = 0xaff; + strncpy(message.data.data_xfer.file_name, + ro_gui_get_icon_string(dialog_saveas, ICON_SAVE_PATH), + 212); + message.size = 44 + ((strlen(message.data.data_xfer.file_name) + 4) & + (~3u)); + + wimp_send_message_to_window(wimp_USER_MESSAGE, &message, + pointer.w, pointer.i); +} + + +/** + * Handle Message_DataSaveAck for a drag from the save dialog. + */ + +void ro_gui_save_datasave_ack(wimp_message *message) +{ + char *path = message->data.data_xfer.file_name; + + ro_gui_set_icon_string(dialog_saveas, ICON_SAVE_PATH, path); + + switch (gui_current_save_type) { + case GUI_SAVE_SOURCE: + warn_user("Not implemented yet!"); + return; + + case GUI_SAVE_DRAW: + if (!current_gui->data.browser.bw->current_content) + return; + save_as_draw(current_gui->data.browser.bw-> + current_content, path); + break; + } + + wimp_create_menu(wimp_CLOSE_MENU, 0, 0); +} -- cgit v1.2.3