Esempio n. 1
0
// generic requester wrapper
short super_request(APTR parent,char *message,IPCData *ipc,ULONG *flagptr)
{
	struct super_request_data *data;
	short ret=1;

	// Allocate data
	if (!(data=AllocVec(sizeof(struct super_request_data),MEMF_CLEAR)))
		return 0;

	// Initialise data
	data->ret_val=1;

	// Initialise simple request structure
	data->request.title=GetString(&locale,MSG_DIRECTORY_OPUS_REQUEST);
	data->request.message=message;
	data->request.gadgets=data->gadgets;
	data->request.return_values=data->return_values;
	data->request.flags=flagptr[0];

	// Asked to open on main window?
	if (!(data->request.flags&SRF_SCREEN_PARENT) && parent==(APTR)GUI->window)
	{
		// Change to open on main screen, unless mouse positioning is set
		if (!(data->request.flags&SRF_MOUSE_POS))
		{
			parent=GUI->screen_pointer;
			data->request.flags|=SRF_SCREEN_PARENT;
		}
	}

	// Buffer supplied?
	if (data->request.flags&SRF_BUFFER)
	{
		// Get buffer pointer
		data->request.string_buffer=(char *)flagptr[ret++];

		// Get buffer length
		data->request.string_len=(int)flagptr[ret++];
	}

	// Buffer supplied?
	if (data->request.flags&SRF_BUFFER2)
	{
		// Get buffer pointer
		data->request.string_buffer_2=(char *)flagptr[ret++];

		// Get buffer length
		data->request.string_len_2=(int)flagptr[ret++];
	}

	// History supplied?
	if (data->request.flags&SRF_HISTORY)
	{
		// Get history list
		data->request.history=(Att_List *)flagptr[ret++];
	}

	// IPC supplied?
	if (ipc)
	{
		// Store pointer, set flag
		data->request.ipc=ipc;
		data->request.flags|=SRF_IPC;
	}

	// IPC or signal bit supplied?
	else if (data->request.flags&(SRF_IPC|SRF_SIGNAL))
	{
		// Get IPC pointer
		data->request.ipc=(IPCData *)flagptr[ret++];
	}

	// Checkmark supplied?
	if (data->request.flags&SRF_CHECKMARK)
	{
		// Get checkmark pointers
		data->request.check_text=(char *)flagptr[ret++];
		data->request.check_ptr=(short *)flagptr[ret++];
	}

	// Go through gadgets
	while ((data->gad=(char *)flagptr[ret++]))
	{
		// Valid gadget?
		if (data->gad==(char *)-1) continue;

		// Store gadget in the array
		data->gadgets[data->gad_count]=data->gad;
		data->return_values[data->gad_count++]=data->ret_val++;

		// Maximum of 10 gadgets
		if (data->gad_count==10) break;
	}

	// If we got more than 1 gadget, make the last gadget a "cancel" gadget
	if (data->gad_count>1) data->return_values[data->gad_count-1]=0;

	// Zero the last gadget pointer
	data->gadgets[data->gad_count]=0;

	// Do the request
	ret=DoSimpleRequest(parent,&data->request);

	// Free data
	FreeVec(data);
	return ret;
}
// Remove a filetype
short filetype_remove(
	config_filetypes_data *data,
	Att_Node *node,
	short store)
{
	FiletypeNode *ftnode;
	struct DOpusSimpleRequest simple;
	char buf[100],*gadgets[3];
	int ret_vals[2];
	short change=0;

	// Get filetype node
	ftnode=(FiletypeNode *)node->data;

	// Fill out requester structure
	simple.title=GetString(locale,MSG_FILETYPE_EDITOR_TITLE);
	simple.message=buf;
	simple.gadgets=gadgets;
	simple.return_values=ret_vals;
	simple.string_buffer=0;
	simple.flags=SRF_IPC;
	simple.font=0;
	simple.ipc=data->ipc;

	// Build message
	lsprintf(buf,GetString(locale,MSG_FILETYPE_REMOVE_REQ),ftnode->type->type.name);

	// Fill in gadgets
	gadgets[0]=GetString(locale,MSG_FILETYPES_REMOVE);
	gadgets[1]=GetString(locale,MSG_CANCEL);
	gadgets[2]=0;
	ret_vals[0]=1;
	ret_vals[1]=0;

	// Make window busy
	SetWindowBusy(data->window);

	// Display requester
	if (store || (change=DoSimpleRequest(data->window,&simple))==1)
	{
		// Is the editor open for this filetype?
		if (ftnode->editor)
		{
			// Tell it to quit
			IPC_Quit(ftnode->editor,-1,0);
		}

		// Remove filetype list from lister
		SetGadgetChoices(data->objlist,GAD_FILETYPES_LIST,(APTR)~0);

		// Mark this list as changed
		ftnode->type->list->flags|=FTLISTF_CHANGED;

		// Stored?
		if (store)
		{
			ftnode->type->list->flags|=FTLISTF_STORE;
			change=1;
		}

		// Removed
		else
		{
			// Free filetype
			FreeFiletype(ftnode->type);
		}

		// Free node data and node
		FreeVec(ftnode);
		Att_RemNode(node);

		// Reattach list with no selection
		SetGadgetValue(data->objlist,GAD_FILETYPES_LIST,(ULONG)-1);
		SetGadgetChoices(data->objlist,GAD_FILETYPES_LIST,data->filetype_list);

		// Disable buttons
		filetype_able_buttons(data,TRUE);
	}

	// Make window unbusy
	ClearWindowBusy(data->window);

	return change;
}