News:

As usual while waiting for the next release - don't forget to check the nightly builds in the forum.

Main Menu

Editor's right-click menu can open file's containing folder.

Started by codeman, July 24, 2010, 10:07:53 PM

Previous topic - Next topic

codeman

My 2nd patch:
https://developer.berlios.de/patch/index.php?func=detailpatch&patch_id=3038&group_id=5358

I use this feature from Visual Studio all the time.

Unfortunately it is platform specific, so I could only make it work for WIN32.

oBFusCATed

The correct macro to check for is __WXMSW__ not _WIN32.

On linux xdg-open can be used.
(most of the time I ignore long posts)
[strangers don't send me private messages, I'll ignore them; post a topic in the forum, but first read the rules!]

codeman

Thanks.

Ok Ive updated the patch to use the __WXMSW__ define.

I will try xdg-open when I get back to my linux box, unless someone else wants to do it.

ollydbg

Quote from: codeman on July 24, 2010, 10:07:53 PM
My 2nd patch:
https://developer.berlios.de/patch/index.php?func=detailpatch&patch_id=3038&group_id=5358

I use this feature from Visual Studio all the time.

Unfortunately it is platform specific, so I could only make it work for WIN32.

Nice work.
But I can't apply your patch. (I just copy the patch, and create a a.patch file, then apply the patch by tortoiseSVN, then failed)
but it seems your patch was generated from "msys git" ? Can git used to access cb repo?
If some piece of memory should be reused, turn them to variables (or const variables).
If some piece of operations should be reused, turn them to functions.
If they happened together, then turn them to classes.

MortenMacFly

Quote from: codeman on July 24, 2010, 10:07:53 PM
https://developer.berlios.de/patch/index.php?func=detailpatch&patch_id=3038&group_id=5358
That is a very nice idea, however, I wonder whether wxWidgets can do that, too (in a cross platform way). Implementing such functionality OS natively should be our last option usually. Did you have a look at wxWidgets API first / ask in a wx forum?
Compiler logging: Settings->Compiler & Debugger->tab "Other"->Compiler logging="Full command line"
C::B Manual: [url="https://www.codeblocks.org/docs/main_codeblocks_en.html"]https://www.codeblocks.org/docs/main_codeblocks_en.html[/url]
C::B FAQ: [url="https://wiki.codeblocks.org/index.php?title=FAQ"]https://wiki.codeblocks.org/index.php?title=FAQ[/url]

codeman

Quote from: ollydbg on July 25, 2010, 05:16:15 AM
Nice work.
But I can't apply your patch. (I just copy the patch, and create a a.patch file, then apply the patch by tortoiseSVN, then failed)
but it seems your patch was generated from "msys git" ? Can git used to access cb repo?

I stored the 10.05 source into a local git repo, and used git to create patches. After some reading, you can apply them to your files using git-apply (you dont need a git repository). I should probably get SVN so that I can work with the latest tree and create compatible patches  :P

Quote from: MortenMacFly on July 25, 2010, 09:49:14 AM
That is a very nice idea, however, I wonder whether wxWidgets can do that, too (in a cross platform way). Implementing such functionality OS natively should be our last option usually. Did you have a look at wxWidgets API first / ask in a wx forum?

I did a lot of searching to see if wx has builtin support for it, and I dont think it does. Well just have to do this for Windows, Mac and Linux seperately.

oBFusCATed

Probably this could help: http://wiki.wxwidgets.org/Launching_The_Default_Browser

But I wasn't able to make it open the directory:

   wxMimeTypesManager manager;
   wxFileType * filetype = manager.GetFileTypeFromMimeType(wxT("application/x-directory"));
   if (filetype)
   {
       wxString command = filetype->GetOpenCommand(wxT("/home/obfuscated"));
       wxExecute(command);
   }



codeman: you could use git svn, but the generated patches couldn't be applied in a normal tree, last time I've tried. The git svn was not recognizing the "$Revision:" and similar tags.
(most of the time I ignore long posts)
[strangers don't send me private messages, I'll ignore them; post a topic in the forum, but first read the rules!]

codeman

Ok I just replaced the patch with one coming from tortoiseSVN from the latest tree (revision 6416). Hopefully that will work for everyone.

MortenMacFly

Quote from: oBFusCATed on July 25, 2010, 11:34:01 AM

   wxMimeTypesManager manager;
   wxFileType * filetype = manager.GetFileTypeFromMimeType(wxT("application/x-directory"));
   if (filetype)
   {
       wxString command = filetype->GetOpenCommand(wxT("/home/obfuscated"));
       wxExecute(command);
   }

I think this only applies to a web browser. What I meant was really the platform's file explorer.

In this thread:
http://forums.wxwidgets.org/viewtopic.php?p=9441
...I found this:
http://forums.wxwidgets.org/viewtopic.php?p=9624#9624

This looks like cross-platform and in addition you can open up in a folder you like.

Strange that there is really no wx core function available. I wonder how it's done in Qt, maybe it can be done similar in wx, too.
Compiler logging: Settings->Compiler & Debugger->tab "Other"->Compiler logging="Full command line"
C::B Manual: [url="https://www.codeblocks.org/docs/main_codeblocks_en.html"]https://www.codeblocks.org/docs/main_codeblocks_en.html[/url]
C::B FAQ: [url="https://wiki.codeblocks.org/index.php?title=FAQ"]https://wiki.codeblocks.org/index.php?title=FAQ[/url]

codeman

Ok here is my latest version that I have tested on Ubuntu - it works very well, except that it wont leave the file selected.

MortenMacFly: were you referring to the wxExecute() command when you said it was cross-platform? We still need to use different commands for the different platforms, like I have, correct?


bool EditorManager::OpenContainingFolder()
{
cbEditor* ed = GetBuiltinEditor(GetActiveEditor());
if (!ed)
return false;

const wxString& fullpath = ed->GetFilename();

#ifdef __WXMSW__

WCHAR cmd[1024]; //CreateProcessW is allowed to modify this for internal processing.
wsprintf(cmd, _("explorer /select,%s"), fullpath.c_str()); //Build the command string to open an explorer window on the folder with the file selected

STARTUPINFOW si;
memset(&si, 0, sizeof(si));
si.cb = sizeof(si);
PROCESS_INFORMATION po;
memset(&po, 0, sizeof(po));
CreateProcessW(NULL, cmd, NULL, NULL, FALSE, 0, NULL, NULL, &si, &po); //Launch explorer
#else
//Extract the folder name from the file
wxString cmd;
wxFileName::SplitPath(fullpath, &cmd, NULL, NULL);

//Use the xdg-open command, and get the char* string
cmd.Prepend(_("xdg-open "));
wxCharBuffer mbcmd = cmd.mb_str();
system(mbcmd);
#endif

return true;
}

MortenMacFly

Quote from: codeman on July 25, 2010, 09:07:48 PM
MortenMacFly: were you referring to the wxExecute() command when you said it was cross-platform? We still need to use different commands for the different platforms, like I have, correct?
Partially. In the post I was referring to it shows what to use for "explorer" on the other platforms. Basically you call wxExecute with the system's default file explorer as listed in this post (of Ryan Norton):
http://forums.wxwidgets.org/viewtopic.php?p=9624#9624
Compiler logging: Settings->Compiler & Debugger->tab "Other"->Compiler logging="Full command line"
C::B Manual: [url="https://www.codeblocks.org/docs/main_codeblocks_en.html"]https://www.codeblocks.org/docs/main_codeblocks_en.html[/url]
C::B FAQ: [url="https://wiki.codeblocks.org/index.php?title=FAQ"]https://wiki.codeblocks.org/index.php?title=FAQ[/url]

codeman

Ok shall I change my code to use wxExecute with the three different commands (explorer, xdg-open, open), and then we can put it into the codebase?

oBFusCATed

Quote from: MortenMacFly on July 25, 2010, 08:19:47 PM
I think this only applies to a web browser. What I meant was really the platform's file explorer.
No it doesn't, mime types can be used by all applications (the Enlightenment WM/shell is using them to recognize files for example).

Please make this configurable, even on windows, some people are not using the exploder, but total commander or something similar.
(most of the time I ignore long posts)
[strangers don't send me private messages, I'll ignore them; post a topic in the forum, but first read the rules!]

codeman

Now works with all three platforms, using wxExecute.

Im pretty sure the Mac version works, but if someone would like to test it. Ive updated the patch https://developer.berlios.de/patch/index.php?func=detailpatch&patch_id=3038&group_id=5358

bool EditorManager::OpenContainingFolder()
{
cbEditor* ed = GetBuiltinEditor(GetActiveEditor());
if (!ed)
return false;

const wxString& fullpath = ed->GetFilename();

wxString cmd;

#ifdef __WXMSW__
cmd = _("explorer /select,") + fullpath; //Open folder with the file selected
#else
#ifdef __WXMAC__
cmd = _("open -R ") + fullpath; //Open folder with the file selected
#else
//Cant select the file on Linux, so just extract the folder name
wxFileName::SplitPath(fullpath, &cmd, NULL, NULL);

//Use the xdg-open command
cmd = _("xdg-open ") + cmd;
#endif
#endif

wxExecute(cmd);

return true;
}

Jenna

I would prefer not to hardcode the open-commands, but making them configurable.
The configuration-defaults should be platform specific, so the user can change the default command to his/her needs.
It would be a little bit like "Terminal to launch  console apps", but for all platforms and not only for non-windows platforms.

Should not be too hard to implement.