Page 1 of 1

wxTextCtrl (drag&drop)

Posted: Wed Jan 07, 2009 8:48 pm
by Ranger
есть ли у кого нибудь простой пример реализации перетаскивания файлов(из проводника) в wxTextCtrl?

Posted: Thu Jan 08, 2009 5:12 pm
by Ranger
ну что, никто не может помочь?

Posted: Thu Jan 08, 2009 5:26 pm
by T-Rex
Так а в samples/dnd пример есть и в документации вроде было

Posted: Fri Jan 09, 2009 5:09 pm
by Ranger
сделал так:

Code: Select all

#include <wx/app.h>
#include <wx/frame.h>
#include <wx/textctrl.h>
#include <wx/dnd.h>
#include <wx/filename.h>

#define	MAIN_WINDOW_ID 1000

class DnDFile : public wxFileDropTarget{
	private:
		wxTextCtrl *TargetTextCtrl;
	public:
		DnDFile(wxTextCtrl *target) {TargetTextCtrl = target; }
		virtual bool OnDropFiles(wxCoord x, wxCoord y, const wxArrayString &filenames);
};
bool DnDFile::OnDropFiles(wxCoord, wxCoord, const wxArrayString &filenames)
{
	wxFileName file(filenames[0]);
	if(file.GetExt() == "txt") TargetTextCtrl->LoadFile(filenames[0]);
	return true;
}
//---------------------------------------


class MainWindow : public wxFrame{
	private:
		wxTextCtrl *text_ctrl; 
	public:
		MainWindow(wxWindow *parent, wxWindowID id, const wxString &title, 
                           const wxPoint &pos, const wxSize &size, long style, const wxString &name);
		virtual ~MainWindow();
};

MainWindow::MainWindow(wxWindow *parent, wxWindowID id, const wxString &title, 
                       const wxPoint &pos, const wxSize &size, long style, const wxString &name) 
	  : wxFrame(parent,id, title, pos, size, style, name)
{
	text_ctrl  = new wxTextCtrl(this, wxID_ANY,wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE);
	text_ctrl->SetDropTarget(new DnDFile(text_ctrl));
}

//---------------------------------------
MainWindow::~MainWindow()
{
}

//---------------------------------------

class Application : public wxApp{
	public:
		bool OnInit();
};
IMPLEMENT_APP(Application)

bool Application::OnInit()
{
    MainWindow *main_window = new MainWindow(NULL,MAIN_WINDOW_ID, wxT("test"),
                                             wxPoint(100,100), wxSize(640,480), 
                                             wxDEFAULT_FRAME_STYLE, "test");	
    main_window->Show();
    return true;
}
но в Linux это отказывается компилироваться... ругается на 9 строку: 'expected class-name before ‘{’ token', и ещё метод SetDropTarget тоже 'не видит', пишет, что такого нет у wxTextCtrl. В чём может быть проблема?

Posted: Sun Jan 11, 2009 12:25 pm
by Ranger
с ошибками разобрался, но вот такой вопрос возник, как проверить формат файла, который я перетаскиваю?

Posted: Sun Jan 11, 2009 12:35 pm
by radcapricorn
Можно этим, но вообще все зависит от того, что нужно. :-)

Posted: Mon Jan 12, 2009 11:46 am
by Ranger
Мне нужно при перетаскивании проверить имеет ли файл текстовый формат, т.е, если он не текстовый, то загрузка файла не должна состояться. Как собственно это можно проверить? wxMimeTypesManager думаю не совсем то, мне кажется, что мне нужно наследоваться от wxDataObject и переопределить его виртуальные методы, но что, и как конкретно, не могу разобраться...

Posted: Tue Jan 13, 2009 9:00 am
by Nikolay
А какой критерий текстовости файл?:)
Помоему вашего if(file.GetExt() == "txt") должно вполне хватать.
думаю что wxDataObject тут вообще не причем...

Posted: Tue Jan 13, 2009 10:03 am
by Ranger
если wxDataObject непричём, то зачем в нём определен такой метод, как например

Code: Select all

virtual void GetAllFormats( wxDataFormat *formats, Direction dir = Get) const
и зачем нужен класс wxDataFormat? И метод void SetDataObject(wxDataObject* data) у класса wxFileDropTarget?
А насчёт проверки по расширению, то может под Windows это и будет работать, но не факт, что это будет работать под Linux. Да и под Windows... кто сказал, что file.txt это не переименованный file.bmp?

Posted: Tue Jan 13, 2009 10:19 am
by radcapricorn
Гы. Ну так вообще-то любой файл - бинарный. Это для нас есть разница текст - не текст, а не для машины.
По-моему не в том месте копаете. Единственный способ достоверно проверить файл на "текстовость" - это просмотреть его целиком на предмет наличия "нечитаемых" символов. Но и то не всегда поможет - взять любой файл, закодированный в base64 - все "читаемые" символы, только вот "текстовостью" и не пахнет :-)

Posted: Tue Jan 13, 2009 12:19 pm
by Ranger
Ну так вообще-то любой файл - бинарный.
Это понятно, но есть ещё такая вещь как сигнатура... Но к текстовым файлам это конечно не относится)
Вобщем на "текстовость", насколько я понял, файл проверить не получиться? А для чего же тогда всётаки нужен класс wxDataFormat?

Posted: Tue Jan 13, 2009 6:01 pm
by Nikolay

Posted: Tue Jan 13, 2009 9:55 pm
by T-Rex
wxMimeTypesManager

GetFileTypeFromMimeType
GetFileTypeFromExtension

wxFileType
A MIME type may have one or more associated extensions: "text/plain" will typically correspond to the extension ".txt", but may as well be associated with ".ini" or ".conf".