[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
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
)
)