Node *VisualScriptYieldSignal::_get_base_node() const {

#ifdef TOOLS_ENABLED
	Ref<Script> script = get_visual_script();
	if (!script.is_valid())
		return NULL;

	MainLoop *main_loop = OS::get_singleton()->get_main_loop();
	SceneTree *scene_tree = Object::cast_to<SceneTree>(main_loop);

	if (!scene_tree)
		return NULL;

	Node *edited_scene = scene_tree->get_edited_scene_root();

	if (!edited_scene)
		return NULL;

	Node *script_node = _find_script_node(edited_scene, edited_scene, script);

	if (!script_node)
		return NULL;

	if (!script_node->has_node(base_path))
		return NULL;

	Node *path_to = script_node->get_node(base_path);

	return path_to;
#else

	return NULL;
#endif
}
static Node* _find_script_node(Node* p_edited_scene,Node* p_current_node,const Ref<Script> &script) {

	if (p_edited_scene!=p_current_node && p_current_node->get_owner()!=p_edited_scene)
		return NULL;

	Ref<Script> scr = p_current_node->get_script();

	if (scr.is_valid() && scr==script)
		return p_current_node;

	for(int i=0;i<p_current_node->get_child_count();i++) {
		Node *n = _find_script_node(p_edited_scene,p_current_node->get_child(i),script);
		if (n)
			return n;
	}

	return NULL;
}
void ScriptTextEditor::drop_data_fw(const Point2& p_point,const Variant& p_data,Control* p_from){

	Dictionary d = p_data;

	if (d.has("type") && String(d["type"])=="resource") {

		Ref<Resource> res = d["resource"];
		if (!res.is_valid()) {
			return;
		}

		if (res->get_path().is_resource_file()) {
			EditorNode::get_singleton()->show_warning("Only resources from filesystem can be dropped.");
			return;
		}

		code_editor->get_text_edit()->insert_text_at_cursor(res->get_path());

	}

	if (d.has("type") && String(d["type"])=="files") {


		Array files = d["files"];

		String text_to_drop;
		for(int i=0;i<files.size();i++) {

			if (i>0)
				text_to_drop+=",";
			text_to_drop+="\""+String(files[i]).c_escape()+"\"";

		}

		code_editor->get_text_edit()->insert_text_at_cursor(text_to_drop);

	}

	if (d.has("type") && String(d["type"])=="nodes") {

		Node* sn = _find_script_node(get_tree()->get_edited_scene_root(),get_tree()->get_edited_scene_root(),script);


		if (!sn) {
			EditorNode::get_singleton()->show_warning("Can't drop nodes because script '"+get_name()+"' is not used in this scene.");
			return;
		}


		Array nodes = d["nodes"];
		String text_to_drop;
		for(int i=0;i<nodes.size();i++) {

			if (i>0)
				text_to_drop+=",";

			NodePath np = nodes[i];
			Node *node = get_node(np);
			if (!node) {
				continue;
			}



			String path = sn->get_path_to(node);
			text_to_drop+="\""+path.c_escape()+"\"";


		}

		code_editor->get_text_edit()->insert_text_at_cursor(text_to_drop);


	}



}