wxTextCtrl (drag&drop) Topic is solved

Это русская секция форума wxWidjets. В этой секции вы можете обсуждать любые вопросы, связанные с wxWidgets на вашем родном языке.
Post Reply
Ranger
Knows some wx things
Knows some wx things
Posts: 30
Joined: Sun Jun 29, 2008 1:19 pm

wxTextCtrl (drag&drop)

Post by Ranger » Wed Jan 07, 2009 8:48 pm

есть ли у кого нибудь простой пример реализации перетаскивания файлов(из проводника) в wxTextCtrl?

Ranger
Knows some wx things
Knows some wx things
Posts: 30
Joined: Sun Jun 29, 2008 1:19 pm

Post by Ranger » Thu Jan 08, 2009 5:12 pm

ну что, никто не может помочь?

User avatar
T-Rex
Moderator
Moderator
Posts: 1188
Joined: Sat Oct 23, 2004 9:58 am
Location: Zaporizhzhya, Ukraine
Contact:

Post by T-Rex » Thu Jan 08, 2009 5:26 pm

Так а в samples/dnd пример есть и в документации вроде было

Ranger
Knows some wx things
Knows some wx things
Posts: 30
Joined: Sun Jun 29, 2008 1:19 pm

Post by Ranger » Fri Jan 09, 2009 5:09 pm

сделал так:

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. В чём может быть проблема?

Ranger
Knows some wx things
Knows some wx things
Posts: 30
Joined: Sun Jun 29, 2008 1:19 pm

Post by Ranger » Sun Jan 11, 2009 12:25 pm

с ошибками разобрался, но вот такой вопрос возник, как проверить формат файла, который я перетаскиваю?

radcapricorn
Experienced Solver
Experienced Solver
Posts: 70
Joined: Fri Nov 07, 2008 4:25 pm
Location: Saint-Petersburg, Russia

Post by radcapricorn » Sun Jan 11, 2009 12:35 pm

Можно этим, но вообще все зависит от того, что нужно. :-)
win xp pro sp3/VS Express 2008/MinGW;
win Vista Ultimate/VS 2005;
Debian Lenny/gcc/cegcc-mingw32ce;
wxWidgets-2.8.9 w/wxWinCE;

Ranger
Knows some wx things
Knows some wx things
Posts: 30
Joined: Sun Jun 29, 2008 1:19 pm

Post by Ranger » Mon Jan 12, 2009 11:46 am

Мне нужно при перетаскивании проверить имеет ли файл текстовый формат, т.е, если он не текстовый, то загрузка файла не должна состояться. Как собственно это можно проверить? wxMimeTypesManager думаю не совсем то, мне кажется, что мне нужно наследоваться от wxDataObject и переопределить его виртуальные методы, но что, и как конкретно, не могу разобраться...

Nikolay
Experienced Solver
Experienced Solver
Posts: 72
Joined: Wed Oct 10, 2007 4:27 am

Post by Nikolay » Tue Jan 13, 2009 9:00 am

А какой критерий текстовости файл?:)
Помоему вашего if(file.GetExt() == "txt") должно вполне хватать.
думаю что wxDataObject тут вообще не причем...
Best regards, Nikolay
wxWidgets in russian
Small Notes Manager and Clipboard Manager with History written with wxWidgets

Ranger
Knows some wx things
Knows some wx things
Posts: 30
Joined: Sun Jun 29, 2008 1:19 pm

Post by Ranger » Tue Jan 13, 2009 10:03 am

если 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?

radcapricorn
Experienced Solver
Experienced Solver
Posts: 70
Joined: Fri Nov 07, 2008 4:25 pm
Location: Saint-Petersburg, Russia

Post by radcapricorn » Tue Jan 13, 2009 10:19 am

Гы. Ну так вообще-то любой файл - бинарный. Это для нас есть разница текст - не текст, а не для машины.
По-моему не в том месте копаете. Единственный способ достоверно проверить файл на "текстовость" - это просмотреть его целиком на предмет наличия "нечитаемых" символов. Но и то не всегда поможет - взять любой файл, закодированный в base64 - все "читаемые" символы, только вот "текстовостью" и не пахнет :-)
win xp pro sp3/VS Express 2008/MinGW;
win Vista Ultimate/VS 2005;
Debian Lenny/gcc/cegcc-mingw32ce;
wxWidgets-2.8.9 w/wxWinCE;

Ranger
Knows some wx things
Knows some wx things
Posts: 30
Joined: Sun Jun 29, 2008 1:19 pm

Post by Ranger » Tue Jan 13, 2009 12:19 pm

Ну так вообще-то любой файл - бинарный.
Это понятно, но есть ещё такая вещь как сигнатура... Но к текстовым файлам это конечно не относится)
Вобщем на "текстовость", насколько я понял, файл проверить не получиться? А для чего же тогда всётаки нужен класс wxDataFormat?

Nikolay
Experienced Solver
Experienced Solver
Posts: 72
Joined: Wed Oct 10, 2007 4:27 am

Post by Nikolay » Tue Jan 13, 2009 6:01 pm

Best regards, Nikolay
wxWidgets in russian
Small Notes Manager and Clipboard Manager with History written with wxWidgets

User avatar
T-Rex
Moderator
Moderator
Posts: 1188
Joined: Sat Oct 23, 2004 9:58 am
Location: Zaporizhzhya, Ukraine
Contact:

Post by T-Rex » Tue Jan 13, 2009 9:55 pm

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".

Post Reply