Notifications
Clear all

[Closed] DragandDrop in dotnetcontrol opens file in max

Hello,

I have a treeview and custom control added in dotnet container control in max rollout.

When ever a max/texture/script file is dropped in any of the control, that file opens up in max as if the file is dropped in viewport.

below is the pseudo code of how the controls are structured


rollout test "" 
( 
        local tv = dotnetobject "System.Windows.Forms.TreeView" 
        dotnetcontrol test "System.Windows.Forms.ContainerControl" 
        
         on test open do 
          ( 
                  test.Controls.Add tv 
           ) 
)

can anyone tell me whats going wrong with this.

Thanks

5 Replies
1 Reply
(@denist)
Joined: 1 year ago

Posts: 0

there is nothing wrong there. there is just nothing… what did you try to know about drag/drop events?

When i drop the files in the tree view they shouldnt open up in max,

If i directly use dotnetcontrol in rollout it works fine

I want to be able to drag and drop files to custom control to the treeview.

what did you try to know about drag/drop events?

I didn’t get your point

i didn’t get your code… which shows that you know a subject of your question. show how do you do drag and drop, and we will try to make it works.

I am not at my PC where the code is
I will post them once i get to the code

below is the code


macroScript ProdProjectManager
	category: "ProdTools"
	buttontext: "SimpleProjectMng"
	icon:#("SetProjectFolder",1)
(
	----------------------------------------------------------------------------------------------
	--Global variable Declarations
	----------------------------------------------------------------------------------------------
	global prodprojmanagerdata
	global config_file
	----------------------------------------------------------------------------------------------
	--Local variable Declarations
	----------------------------------------------------------------------------------------------
	local ro_ProdProjectManager, rm_MainRcMenu, rc_projectoptions,rc_directoryoptions, ro_renamerdiag
	struct prodprojmanagerdata_struct (ro_ProdProjectManager, rm_MainRcMenu, rc_projectoptions, rc_directoryoptions,ro_renamerdiag)
	
	local AddNewFolderBool
	
	local dotnetbgcolor = (dotnetclass "System.Drawing.Color").FromArgb 60 60 60
	local defaultfont = dotnetobject "System.Drawing.Font" "Franklin Gothic" 9 --((dotnetclass "System.Drawing.FontStyle").Bold)
	local dotnetforecolor = (dotnetclass "System.Drawing.Color").FromArgb 220 220 220
	local tv_rootnode, tv_imagelist
	
	local dirclass = dotnetclass "System.Io.Directory"
	
	----------------------------------------------------------------------------------------------
	--Functions Declarations
	----------------------------------------------------------------------------------------------
	
	fn getUnlockedImage file =
	(
		local fs = dotnetobject "System.IO.FileStream" file ((dotnetclass "System.IO.FileMode").Open) ((dotnetclass "IO.FileAccess").Read) ((dotnetclass "IO.FileShare").ReadWrite)
		local fsbmp = dotnetobject "System.Drawing.Image" ((dotnetclass "System.Drawing.Image").FromStream fs)		
		fs.Close()
		fsbmp		
	)
	
	fn generateTreeViewImageList = 
	(
		if tv_imagelist == undefined then  tv_imagelist = dotnetobject "System.Windows.Forms.ImageList" else tv_imagelist.images.clear()
		--showproperties imagelist
		tv_imagelist.ImageSize = dotnetobject "System.Drawing.Size" 22 22
		tv_imagelist.ColorDepth = (dotnetclass "System.Windows.Forms.ColorDepth").Depth32Bit
		
		local imgfiles = getfiles ((pathConfig.GetDir #scripts)+"\ProdProjectManager\Icons\*.png")
		for file in imgfiles do
		(
			local imgname = pathConfig.stripPathToLeaf file
			imgname = substring imgname 1 (imgname.count - 4)
			
			tv_imagelist.Images.Add (imgname) (getUnlockedImage file)			
		)
	)
	
	fn addDirectoryNodetoTreeView spath:undefined parentnode:undefined =
	(
		if spath != undefined and (pathConfig.isAbsolutePath spath) and (pathConfig.isLegalPath  spath)  and parentnode != undefined and (classof parentnode == dotnetobject) then
		(
			if dirclass.Exists spath then
			(
				local sname = (pathconfig.strippathtoleaf spath)
				format "Adding : % 
" sname
				local tempnode = dotnetobject "System.Windows.Forms.TreeNode"
				tempnode.Text = sname
				tempnode.Tag = "Directory"
				tempnode.Name = spath
				tempnode.ImageKey = tempnode.SelectedImageKey = "openfolder"
				parentnode.Nodes.Add tempnode
			)
		)
	)
	
	----------------------------------------------------------------------------------------------
	--Rollout and RC Menu Definitions
	----------------------------------------------------------------------------------------------
	rollout ro_ProdProjectManager "Prod Project Manager" width:600 height:750
	(
		local rolloutopen = false
		local oldtext
		dotnetcontrol edt_searchbox "System.Windows.Forms.TextBox" 
		dotnetcontrol tv_browser "System.Windows.Forms.TreeView" 
		dotnetcontrol _cont "System.Windows.Forms.Label"
		local lsv_browser = dotnetobject "Manina.Windows.Forms.ImageListView"
		--dotnetcontrol lsv_browser "Manina.Windows.Forms.ImageListView" 
		dotnetcontrol status_bar "System.Windows.Forms.TextBox"
		
		---------------------------------------------------------------------------
		--Function Decalarations
		---------------------------------------------------------------------------
		fn formopen =
		(
			if not doesfileexist ((pathConfig.GetDir #scripts)+"\ProdProjectManager\ImageListView.dll") then
			(
				messagebox "One or more requiered files is not present, hence I cannot go ahead, Please reinstall me again :( 
"
				exit
			)
			else
			(
				dotnet.loadassembly ((pathConfig.GetDir #scripts)+"\ProdProjectManager\ImageListView.dll")			
			)
			
			config_file = (pathConfig.GetDir #scripts)+"\ProdProjectManager\ProdProjectManager.ini"
			if not doesfileexist config_file then
			(
				if (createfile config_file) == undefined then shutdown()				
			)
			createdialog ro_ProdProjectManager style: #(#style_titlebar, #style_sysmenu, #style_resizing, #style_minimizebox, #style_toolwindow) escapeEnable:false menu:rm_MainRcMenu \ 
			bgcolor:(color 150 150 150)
		)
		
		fn updateposandsize =
		(
			if ro_ProdProjectManager.width < 400 then ro_ProdProjectManager.width = 400
			if ro_ProdProjectManager.height < 300 then ro_ProdProjectManager.height = 300
			local diagsize = getDialogSize ro_ProdProjectManager
			
			edt_searchbox.pos = [0,0]
			edt_searchbox.Width = status_bar.width = diagsize.x			
			
			status_bar.pos.x= 0
			status_bar.pos.y = (diagsize.y - 22)
			
			tv_browser.pos.x = 0
			tv_browser.pos.y = (edt_searchbox.height+2)
			tv_browser.width = 250
			tv_browser.height = (status_bar.pos.y - tv_browser.pos.y) - 2
			
			_cont.pos.x = tv_browser.width+2
			_cont.pos.y = (edt_searchbox.height+2)
			_cont.width = (diagsize.x - 255)
			_cont.height = (status_bar.pos.y - tv_browser.pos.y) - 2
		)
		
		fn InitComponents =
		(
			edt_searchbox.BorderStyle = status_bar.BorderStyle = tv_browser.BorderStyle = lsv_browser.BorderStyle = ((dotnetclass "System.Windows.Forms.BorderStyle").FixedSingle)
			edt_searchbox.BackColor = status_bar.BackColor = tv_browser.BackColor = lsv_browser.BackColor = dotnetbgcolor
			edt_searchbox.ForeColor = status_bar.ForeColor = tv_browser.ForeColor = lsv_browser.ForeColor = dotnetforecolor
			edt_searchbox.Font = status_bar.Font = tv_browser.Font = lsv_browser.Font = defaultfont
				
			tv_browser.ImageList = tv_imagelist
			tv_rootnode = dotnetobject "System.Windows.Forms.TreeNode" "Root"
			
			lsv_browser.Dock = (dotnetclass "System.Windows.Forms.DockStyle").Fill
			lsv_browser.AllowDrag = true
			_cont.Controls.Add lsv_browser
		)
		
		fn addSubDirectoryNodes spath:undefined parentnode:undefined =
		(
			if spath != undefined and (pathConfig.isAbsolutePath spath) and (pathConfig.isLegalPath  spath)  and parentnode != undefined and (classof parentnode == dotnetobject) then
			(			
				local dirs = if dirclass.Exists spath then dirclass.getDirectories spath else undefined
				if dirs != undefined and dirs.count > 0 then
				(
					local dirnodes = #()
					for dir in dirs do
					(
						local dirname = pathConfig.stripPathToLeaf dir
						local tnode = dotnetobject "System.Windows.Forms.TreeNode" dirname
						tnode.Tag = "DirectoryNode"
						tnode.Name = dir
						tnode.ImageKey = tnode.SelectedImageKey  = "openfolder"
						if (dirclass.getDirectories dir).Count > 0 then addSubDirectoryNodes spath:dir parentnode:tnode
						append dirnodes tnode
					)
					parentnode.Nodes.AddRange dirnodes
				)
			)
		)
		
		fn populateTreeNodes =
		(
			tv_browser.nodes.Clear()
			tv_rootnode.Nodes.Clear()			
			
			local starttime = timestamp()
			local rootnodes = #()
			local projnodes = #()
			local childnodes = #()

			local allkeys = (getIniSetting config_file "RootDirectories")
			local ndiv = 0
			for key in allkeys do
			(
				local val = getIniSetting config_file "RootDirectories" key
				local srootname = pathconfig.strippathtoleaf val
				local nrootnode = dotnetobject "System.Windows.Forms.TreeNode" srootname
				nrootnode.Tag = "RootDirectory"
				nrootnode.name = val
				nrootnode.ImageKey = nrootnode.SelectedImageKey = "openfolder"
				
				searchSubDirs=(dotnetClass "System.IO.SearchOption")
				local mxpfiles = (dirclass.GetFiles val "*.mxp"  searchSubDirs.AllDirectories)
				
				--Init a Emty array for projectnodes
				projnodes = #()
				if mxpfiles != undefined then
				(
					for file in mxpfiles do 
					(					
						local projname = pathconfig.strippathtoleaf file
						projname = substring projname 1 (projname.Count-4)
						local projnode = dotnetobject "System.Windows.Forms.TreeNode" projname
						projnode.Tag = "ProjectNode"
						projnode.Name = file
						projnode.ImageKey = projnode.SelectedImageKey = "maxicon"
						
						local sprojfld = getIniSetting (file) "Directories" "ProjectFolder"
						addSubDirectoryNodes spath:sprojfld parentnode:projnode			
						
						--Append the Nodes to the Array
						append projnodes projnode
					)
				)
				--Add the Project Nodes to the Root Directory Node
				nrootnode.Nodes.AddRange projnodes
				--Append the Node to the Array
				append rootnodes nrootnode
			)
			
			
			--Add the Root Directory Nodes to the Root Node
			tv_rootNode.Nodes.AddRange rootnodes
			--Add the Root Node to the TreeView
			tv_browser.Nodes.Add tv_rootNode
			format "Time Taken = % 
" (timestamp() - starttime)
		)
		
		fn FindNodes nodes str =
		(			
			for i = 0 to nodes.count - 1 do
			(
				local nnode = nodes.item[i]				
				if matchPattern (nnode.text) pattern:(str+"*") ignoreCase:true then
				(
					tv_browser.nodes.add (nnode.Clone())
				)
				FindNodes (nnode.nodes) str
			)
		)
		
		fn populateLSVNodes spath:undefined = 
		(
			try (prodprojmanagerdata.ro_ProdProjectManager.lsv_browser.Items.Clear()) catch ()
			
			local searchSubDirs=(dotnetClass "System.IO.SearchOption")
			local files = if (dirclass.Exists spath) then (dirclass.GetFiles spath "*.*" ) else undefined
			if files != undefined then prodprojmanagerdata.ro_ProdProjectManager.lsv_browser.Items.AddRange files
		)
		---------------------------------------------------------------------------
		--Component Handlers
		---------------------------------------------------------------------------
		on tv_browser AfterSelect sender arg do 
		( 
			try ( prodprojmanagerdata.ro_ProdProjectManager.lsv_browser.Items.Clear() ) 
			catch 
			(
				format "Error : % 
" (getcurrentexception()) 				
			)
			populateLSVNodes spath:arg.Node.Name 
		)
		on tv_browser NodeMouseClick sender arg do 
		( 
			if arg.Node != undefined then sender.selectednode = arg.node
			if arg.Button == (dotnetclass "System.Windows.Forms.MouseButtons").Right then
			(
				local npoint = [arg.x, arg.y]
				case (arg.Node.Tag) of
				(
					"RootDirectory":()
					"ProjectNode":(PopupMenu (prodprojmanagerdata.rc_projectoptions) pos:npoint rollout:(prodprojmanagerdata.ro_ProdProjectManager))
					"DirectoryNode":(PopupMenu (prodprojmanagerdata.rc_directoryoptions) pos:npoint rollout:(prodprojmanagerdata.ro_ProdProjectManager))
				)
			)
		)
		
		on edt_searchbox MouseDown sender arg do if sender.Text == "Enter text here to search for a Project...................................." then sender.text = ""		
		on edt_searchbox LostFocus sender arg do if sender.text == "" then sender.text = "Enter text here to search for a Project...................................."
		on edt_searchbox TextChanged arg args do 
		( 
			local stext = arg.text			
			if (oldtext != "Enter text here to search for a Project...................................." and  stext.count == 0 ) then --stext == "Enter text here to search for a Project...................................." then
			(
				populateTreeNodes()
			)
			else if stext.count > 0 and stext != "Enter text here to search for a Project...................................." then
			(
				tv_browser.nodes.clear()
				FindNodes (tv_rootNode.nodes) (sText)				
			)
			oldtext = arg.Text
		)
		
		---------------------------------------------------------------------------
		--Rollout Handlers
		---------------------------------------------------------------------------		
		on ro_ProdProjectManager open do
		(
			rolloutopen = true
			updateposandsize()
			generateTreeViewImageList()
			InitComponents()
			
			--Populate All the TreeNodes
			populateTreeNodes()
			
			gc()
			format "HeapFree : % 
" heapfree
		)
		
		on ro_ProdProjectManager resized size do
		(
			updateposandsize()
		)
		
		on ro_ProdProjectManager close do
		(
			rolloutopen = false
			updateToolbarButtons()
			gc()
			format "HeapFree : % 
" heapfree
		)		
	)
	
	rollout ro_renamerdiag "Rename" width:200 height:55
	(
		local validatormsgdisplayed = false
		local selectednode
		edittext edt_newname "Enter Name : " pos:[5,5] width:190 height:17
		button btn_ok "OK" pos:[5,30] width:90 height:20
		button btn_cancel "Cancel" pos:[100,30] width:95 height:20
			
		fn validateName newname =
		(
			pattern = @"^[a-zA-Z0-9_@.-]*$"
			regex = dotnetobject "System.Text.RegularExpressions.Regex" pattern
			result = regex.isMatch(newname)
			result
		)
		
		on edt_newname changed arg do
		(
			if not (validateName arg) then
			(
				if not validatormsgdisplayed then
				(
					messagebox "Special characters liek ? / are not allowed 
 only Alphabets, Numbers and (. _ @ -) signs are allowed"
					validatormsgdisplayed = true
					setFocus edt_newname
				)
				edt_newname.Text = substring arg 1 (arg.Count - 1)
			)
		)
		
		fn setName =
		(
			local newname = edt_newname.Text
			
			local originalpath = selectednode.Name
			local newpath = (pathconfig.removepathleaf originalpath)+"\\"+newname			
			local success = false
			try
			(
				dirclass.Move originalpath newpath
				success = true
			)
			catch
			(
				format "Error Occured while trying to Rename Directory"
				format "Error : % 
" (getcurrentexception())
				success = false
			)
			format "Renaming From : % to : % 
" originalpath newpath
			if success then
			(
				selectednode.Text = newname
				selectednode.Name = newpath
			)
			try(destroydialog ro_renamerdiag)catch()
		)
		
		fn createNewDirectory =
		(
			local sname = edt_newname.Text
			local parentdirectory = selectednode.Name
			local newpath = parentdirectory+"\\"+sname
			if not (dirclass.Exists newpath ) then
			(
				try
				(
					dirclass.CreateDirectory newpath
					addDirectoryNodetoTreeView spath:newpath parentnode:(selectednode)
				)
				catch
				(
					format "Error Occured while trying to create directory 
"
					format "Error : % 
" (getcurrentexception())
				)
				try(destroydialog ro_renamerdiag)catch()
			)
			else
			(
				messagebox "Folder with the same already Exists 
"
			)
		)
		
		on btn_ok pressed do if AddNewFolderBool then createNewDirectory() else setName()		
		on edt_newname entered arg do if AddNewFolderBool then createNewDirectory() else setName()
		
		on ro_renamerdiag open do
		(
			if AddNewFolderBool then ro_renamerdiag.Title = "Add New Folder" else ro_renamerdiag.Title = "Rename Folder"
			selectednode = prodprojmanagerdata.ro_ProdProjectManager.tv_browser.SelectedNode
			setFocus edt_newname
		)
		
		--Set the AddNewFolderBool boolean to false whenever we close the dialog
		--This is necessary since this global variable affects how this dialog behaves.
		--If this boolean is true this dialog acts as renaming dialog, else acts as dialog for creating new directory
		on ro_renamerdiag close do AddNewFolderBool = false
		
		on btn_cancel pressed do
		(
			try(destroydialog ro_renamerdiag)catch()
		)
	)
	
	rcmenu rm_MainRcMenu
	(
		submenu "File"
		(
			menuitem btn_exitapp "Exit"
		)
		
		submenu "View"
		(
			submenu "View Mode"
			(
				menuitem btn_gallery "Galley"
				menuitem btn_thumbnail "Thumbnail"
				menuitem btn_pane "Pane"
			)
			seperator sp_1
			menuitem btn_smallicons "Small Icons"
			menuitem btn_largeicons "Large Icons"
			menuitem btn_extralargeicons "Extra Large Icons"
		)
		
		submenu "Preferencea"
		(
			
		)
		
		submenu "Help"
		(
			menuitem btn_help "Help (F1)"
			seperator sp_2
			menuitem btn_about "About"
		)
	)
	
	rcmenu rc_projectoptions
	(
		menuitem btn_setproject "Set Project"
		menuitem btn_openfolderinexplorer "Open Folder In Explorer"
	)
	
	rcmenu	rc_directoryoptions
	(
		local selectednode
		menuitem btn_newfolder "New Folder"
		menuitem btn_renamefolder "Rename Folder"
		menuitem btn_deletefolder "Delete Folder"
		menuitem btn_openfolderinexplorer "Open Folder In Explorer"
		separator sp_directoryoptions1
		menuitem btn_addfoldertouserpaths "Add Current Folder to User Path"
		
		on btn_deletefolder picked do
		(			
			local dir = selectednode.Name
			local qrystr = "Are you sure you wnat to Delete "+dir+" and all of it content 
"
			if querybox qrystr then
			(
				local done = false
				try
				(
					dirclass.Delete dir true
					done = true
				)
				catch
				(
					messagebox ("Error Occured while trying to delete "+dir+"
"+(getcurrentexception()))
					done = false
				)
				if done then selectednode.Remove()
			)
		)
		
		on btn_openfolderinexplorer picked do 
		(
			if dirclass.Exists (selectednode.name) then ShellLaunch (selectednode.name) ""
		)
		on btn_newfolder picked do
		(		
			try(destroydialog ro_renamerdiag)catch()
			AddNewFolderBool = true
			createdialog (prodprojmanagerdata.ro_renamerdiag) modal:true style:#(#style_titlebar, #style_border, #style_sysmenu,#style_toolwindow)
		)
		on btn_renamefolder picked do
		(		
			try(destroydialog ro_renamerdiag)catch()
			AddNewFolderBool = false
			createdialog (prodprojmanagerdata.ro_renamerdiag) modal:true style:#(#style_titlebar, #style_border, #style_sysmenu,#style_toolwindow)
		)
		
		on rc_directoryoptions open do
		(
			selectednode = prodprojmanagerdata.ro_ProdProjectManager.tv_browser.SelectedNode
		)
	)
	----------------------------------------------------------------------------------------------
	--Event Handler Function Declarations
	----------------------------------------------------------------------------------------------
	
	----------------------------------------------------------------------------------------------
	--Macro Script Event Handlers
	----------------------------------------------------------------------------------------------
	on execute do
	(
		prodprojmanagerdata = prodprojmanagerdata_struct ro_ProdProjectManager rm_MainRcMenu rc_projectoptions rc_directoryoptions ro_renamerdiag
		ro_ProdProjectManager.formopen()
	)
	
	on isChecked do
	(
		ro_ProdProjectManager.rolloutopen
	)
)