summaryrefslogtreecommitdiffstats
path: root/installerbuilder/libinstaller/3rdparty/p7zip_9.04/unix/CPP/7zip/UI/GUI/wxGUI.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'installerbuilder/libinstaller/3rdparty/p7zip_9.04/unix/CPP/7zip/UI/GUI/wxGUI.cpp')
-rw-r--r--installerbuilder/libinstaller/3rdparty/p7zip_9.04/unix/CPP/7zip/UI/GUI/wxGUI.cpp575
1 files changed, 575 insertions, 0 deletions
diff --git a/installerbuilder/libinstaller/3rdparty/p7zip_9.04/unix/CPP/7zip/UI/GUI/wxGUI.cpp b/installerbuilder/libinstaller/3rdparty/p7zip_9.04/unix/CPP/7zip/UI/GUI/wxGUI.cpp
new file mode 100644
index 000000000..366bd40c4
--- /dev/null
+++ b/installerbuilder/libinstaller/3rdparty/p7zip_9.04/unix/CPP/7zip/UI/GUI/wxGUI.cpp
@@ -0,0 +1,575 @@
+// wxGUI.cpp
+
+#include "StdAfx.h"
+
+// For compilers that support precompilation, includes "wx/wx.h".
+#include "wx/wxprec.h"
+
+#ifdef __BORLANDC__
+ #pragma hdrstop
+#endif
+
+// for all others, include the necessary headers (this file is usually all you
+// need because it includes almost all "standard" wxWidgets headers)
+#ifndef WX_PRECOMP
+ #include "wx/wx.h"
+#endif
+
+#define static const
+#include "../GUI/p7zip_32.xpm"
+#undef static
+
+#undef ACTIVATE_DIALOG_TESTS
+
+int Main1(int argc,TCHAR **argv);
+
+#include "Windows/Registry.h"
+using namespace NWindows;
+using namespace NRegistry;
+
+
+#include "Common/StringConvert.h"
+#include "Windows/FileDir.h"
+#include "Windows/Synchronization.h"
+
+#include "ExtractRes.h"
+#include "../Explorer/MyMessages.h"
+
+#include "ExtractGUI.h"
+#include "UpdateGUI.h"
+#include "BenchmarkDialog.h"
+#include "../FileManager/RegistryUtils.h"
+
+using namespace NWindows;
+using namespace NFile;
+
+#include "../FileManager/ProgramLocation.h"
+
+static LPCWSTR kHelpFileName = L"help/";
+
+void ShowHelpWindow(HWND hwnd, LPCWSTR topicFile)
+{
+ UString path;
+ if (!::GetProgramFolderPath(path))
+ return;
+ path += kHelpFileName;
+ path += topicFile;
+ printf("ShowHelpWindow(%p,%ls)=>%ls\n",hwnd,topicFile,(const wchar_t *)path);
+ // HtmlHelp(hwnd, GetSystemString(path), HH_DISPLAY_TOPIC, NULL);
+ wxString path2(path);
+ wxLaunchDefaultBrowser(path2);
+}
+
+////////////////////////////// TRIES ///////////////////////////////////
+
+#ifdef ACTIVATE_DIALOG_TESTS
+static void ErrorMessage(const wchar_t *message)
+{
+ MessageBox(0,message, wxT("7-Zip GUI"),wxICON_ERROR);
+}
+
+#include "../FileManager/PasswordDialog.h"
+#include "../FileManager/MessagesDialog.h"
+#include "../FileManager/OverwriteDialog.h"
+#include "Windows/Thread.h"
+
+void myErrorMsg(const wchar_t *message)
+{
+ MessageBox(0,message, wxT("Message"),wxICON_ERROR);
+}
+
+void testCMessagesDialog()
+{
+ UStringVector Messages;
+
+ Messages.Add(L"message 1");
+ Messages.Add(L"message 2");
+ Messages.Add(L"message 3");
+ Messages.Add(L"message 4");
+ Messages.Add(L"message 5");
+ Messages.Add(L"message 6");
+ Messages.Add(L"message 7");
+ Messages.Add(L"message 8");
+ Messages.Add(L"message 9");
+
+ CMessagesDialog messagesDialog;
+ messagesDialog.Messages = &Messages;
+ int ret = messagesDialog.Create( 0 ); // ParentWindow
+
+ if (ret == IDOK) myErrorMsg(wxT("CMessagesDialog => IDOK"));
+ else if (ret == IDCANCEL) myErrorMsg(wxT("CMessagesDialog => IDCANCEL"));
+ else myErrorMsg(wxT("CMessagesDialog => ?"));
+
+}
+
+void testCOverwriteDialog()
+{
+SYSTEMTIME systemTime;
+GetSystemTime( &systemTime );
+
+
+const wchar_t *existName = L"existName";
+FILETIME data_existTime;
+FILETIME *existTime = &data_existTime ;
+UInt64 data_existSize = 1234;
+UInt64 *existSize = &data_existSize;
+const wchar_t *newName = L"newName";
+FILETIME data_newTime;
+FILETIME *newTime = &data_newTime;
+UInt64 data_newSize = 45678;
+UInt64 *newSize = &data_newSize;
+Int32 data_answer=0;
+Int32 *answer = &data_answer;
+
+SystemTimeToFileTime( &systemTime , &data_existTime);
+SystemTimeToFileTime( &systemTime , &data_newTime);
+
+ COverwriteDialog dialog;
+
+ dialog.OldFileInfo.Time = *existTime;
+ dialog.OldFileInfo.TimeIsDefined = true; // FIXME : look again at the sample !
+
+ dialog.OldFileInfo.SizeIsDefined = (existSize != NULL);
+ if (dialog.OldFileInfo.SizeIsDefined)
+ dialog.OldFileInfo.Size = *existSize;
+ dialog.OldFileInfo.Name = existName;
+
+ if (newTime == 0)
+ dialog.NewFileInfo.TimeIsDefined = false;
+ else
+ {
+ dialog.NewFileInfo.TimeIsDefined = true;
+ dialog.NewFileInfo.Time = *newTime;
+ }
+
+ dialog.NewFileInfo.SizeIsDefined = (newSize != NULL);
+ if (dialog.NewFileInfo.SizeIsDefined)
+ dialog.NewFileInfo.Size = *newSize;
+ dialog.NewFileInfo.Name = newName;
+
+ /*
+ NOverwriteDialog::NResult::EEnum writeAnswer =
+ NOverwriteDialog::Execute(oldFileInfo, newFileInfo);
+ */
+ INT_PTR writeAnswer = dialog.Create(NULL); // ParentWindow doesn't work with 7z
+
+ switch(writeAnswer)
+ {
+ case IDCANCEL: myErrorMsg(wxT("COverwriteDialog => IDCANCEL")); break;
+ case IDNO: myErrorMsg(wxT("COverwriteDialog => IDNO")); break;
+ case IDC_BUTTON_OVERWRITE_NO_TO_ALL: myErrorMsg(wxT("COverwriteDialog => IDC_BUTTON_OVERWRITE_NO_TO_ALL")); break;
+ case IDC_BUTTON_OVERWRITE_YES_TO_ALL:myErrorMsg(wxT("COverwriteDialog => IDC_BUTTON_OVERWRITE_YES_TO_ALL")); break;
+ case IDC_BUTTON_OVERWRITE_AUTO_RENAME:myErrorMsg(wxT("COverwriteDialog => IDC_BUTTON_OVERWRITE_AUTO_RENAME")); break;
+ case IDYES: myErrorMsg(wxT("COverwriteDialog => IDYES")); break;
+ default: myErrorMsg(wxT("COverwriteDialog => default")); break;
+ }
+}
+
+void testCPasswordDialog()
+{
+ CPasswordDialog dialog;
+
+ int ret = dialog.Create(0);
+ if (ret == IDOK) {
+ UString Password = dialog.Password;
+ UString msg = wxT("CPasswordDialog => IDOK password=\"");
+ msg += Password;
+ msg += wxT("\"");
+ myErrorMsg(msg);
+ }
+ else if (ret == IDCANCEL) myErrorMsg(wxT("CPasswordDialog => IDCANCEL"));
+ else myErrorMsg(wxT("CPasswordDialog => ?"));
+
+}
+
+struct CThreadProgressDialog
+{
+ CProgressDialog * ProgressDialog;
+ static THREAD_FUNC_DECL MyThreadFunction(void *param)
+ {
+ ((CThreadProgressDialog *)param)->Result = ((CThreadProgressDialog *)param)->Process();
+ return 0;
+ }
+ HRESULT Result;
+ HRESULT Process()
+ {
+ Sleep(1000);
+ int total = 1000;
+
+ ProgressDialog->ProgressSynch.SetTitleFileName(L"SetTitleFileName");
+ ProgressDialog->ProgressSynch.SetNumFilesTotal(100);
+ ProgressDialog->ProgressSynch.SetNumFilesCur(1);
+ ProgressDialog->ProgressSynch.SetProgress(total, 0);
+ // ProgressDialog.ProgressSynch.SetRatioInfo(inSize, outSize);
+ // ProgressDialog.ProgressSynch.SetCurrentFileName(name);
+
+ ProgressDialog->ProgressSynch.SetPos(total/10);
+ ProgressDialog->ProgressSynch.SetCurrentFileName(L"File1");
+ Sleep(1000);
+ ProgressDialog->ProgressSynch.SetPos(total/2);
+ ProgressDialog->ProgressSynch.SetCurrentFileName(L"File2");
+ Sleep(1000);
+ ProgressDialog->ProgressSynch.SetPos(total);
+ ProgressDialog->ProgressSynch.SetCurrentFileName(L"File3");
+ Sleep(1000);
+ ProgressDialog->MyClose();
+ return 0;
+ }
+};
+
+void testCProgressDialog()
+{
+ CProgressDialog ProgressDialog;
+
+ CThreadProgressDialog benchmarker;
+ benchmarker.ProgressDialog = &ProgressDialog;
+ NWindows::CThread thread;
+ thread.Create(CThreadProgressDialog::MyThreadFunction, &benchmarker);
+
+ // void StartProgressDialog(const UString &title)
+ int ret = ProgressDialog.Create(L"testCProgressDialog", 0);
+
+ if (ret == IDOK) myErrorMsg(wxT("CProgressDialog => IDOK"));
+ else if (ret == IDCANCEL) myErrorMsg(wxT("CProgressDialog => IDCANCEL"));
+ else myErrorMsg(wxT("CProgressDialog => ?"));
+
+}
+
+void testDialog(int num)
+{
+ NWindows::NControl::CModalDialog dialog;
+
+ printf("Generic Dialog(%d)\n",num);
+ int ret = dialog.Create(num, 0);
+ if (ret == IDOK) myErrorMsg(wxT("Generic Dialog => IDOK"));
+ else if (ret == IDCANCEL) myErrorMsg(wxT("Generic Dialog => IDCANCEL"));
+ else myErrorMsg(wxT("Generic Dialog => ?"));
+}
+
+void testMessageBox()
+{
+ int ret = MessageBoxW(0, L"test yes/no/cancel",
+ L"7-Zip", MB_YESNOCANCEL | MB_ICONQUESTION | MB_TASKMODAL);
+ if (ret == IDYES) myErrorMsg(wxT("MessageBoxW => IDYES"));
+ else if (ret == IDNO) myErrorMsg(wxT("MessageBoxW => IDNO"));
+ else if (ret == IDCANCEL) myErrorMsg(wxT("MessageBoxW => IDCANCEL"));
+ else myErrorMsg(wxT("MessageBoxW => ?"));
+}
+
+static void testRegistry()
+{
+ SaveRegLang(L"fr");
+
+ UString langFile;
+ ReadRegLang(langFile);
+
+ printf("testRegistry : -%ls-\n",(const wchar_t *)langFile);
+}
+
+
+int Main2(int argc,TCHAR **argv);
+
+int Main3(int argc,wxChar **argv)
+{
+ testRegistry();
+
+ int num = -1;
+
+ if (argc >=2 )
+ {
+ num = argv[1][0] - L'0';
+ }
+ printf("num=%d\n",num);
+
+
+ switch(num)
+ {
+ case 0:
+ {
+ TCHAR **argv2 = (TCHAR **)calloc(argc,sizeof(*argv));
+
+ argv2[0] = argv[0];
+ for(int i = 2; i < argc; i++) argv2[i-1] = argv[i];
+
+ return Main2(argc-1,argv2);
+ }
+ // TODO Benchmark
+ // TODO CCompressDialog
+ // TODO CExtractDialog ?
+ case 1 : testCMessagesDialog(); break;
+ case 2 : testCOverwriteDialog(); break;
+ case 3 : testCPasswordDialog(); break;
+ case 4 : testCProgressDialog(); break;
+ case 5 : testMessageBox(); break;
+ case 9 :
+ if (argc >= 3)
+ {
+ AString str = GetAnsiString(argv[2]);
+ int num = atoi((const char*)str);
+ testDialog(num);
+ }
+ else
+ {
+ printf("usage : 7zG 9 <windowID>\n");
+ }
+ break;
+ default :
+ printf("usage : 7zG number\n");
+
+ };
+
+ return 0;
+}
+
+#endif // ACTIVATE_DIALOG_TESTS
+
+static const TCHAR *kCUBasePath = TEXT("Software/7-ZIP");
+static const WCHAR *kLangValueName = L"Lang";
+
+void SaveRegLang(const UString &langFile)
+{
+ CKey key;
+ key.Create(HKEY_CURRENT_USER, kCUBasePath);
+ key.SetValue(kLangValueName, langFile);
+}
+
+void ReadRegLang(UString &langFile)
+{
+ langFile.Empty();
+ CKey key;
+ if (key.Open(HKEY_CURRENT_USER, kCUBasePath, KEY_READ) == ERROR_SUCCESS)
+ key.QueryValue(kLangValueName, langFile);
+}
+
+
+//////////////////////////////////
+
+#define NEED_NAME_WINDOWS_TO_UNIX
+#include "myPrivate.h" // global_use_utf16_conversion
+
+void mySplitCommandLineW(int numArguments, TCHAR **arguments,UStringVector &parts) {
+
+ parts.Clear();
+ for(int ind=0;ind < numArguments; ind++) {
+ UString tmp = arguments[ind];
+ // tmp.Trim(); " " is a valid filename ...
+ if (!tmp.IsEmpty()) {
+ parts.Add(tmp);
+// DEBUG printf("ARG %d : '%ls'\n",ind,(const wchar_t *)tmp);
+ }
+ }
+}
+
+// ----------------------------------------------------------------------------
+// private classes
+// ----------------------------------------------------------------------------
+
+// Define a new frame type
+class MyFrame: public wxFrame
+{
+public:
+ // ctor
+ MyFrame(wxFrame *frame, const wxString& title, int x, int y, int w, int h);
+ // virtual ~MyFrame();
+
+ // operations
+ void WriteText(const wxString& text) { m_txtctrl->WriteText(text); }
+
+protected:
+ // callbacks
+ void OnWorkerEvent(wxCommandEvent& event);
+private:
+ // just some place to put our messages in
+ wxTextCtrl *m_txtctrl;
+ DECLARE_EVENT_TABLE()
+};
+
+enum {
+ WORKER_EVENT=100 // this one gets sent from the worker thread
+};
+
+BEGIN_EVENT_TABLE(MyFrame, wxFrame)
+ EVT_MENU(WORKER_EVENT, MyFrame::OnWorkerEvent)
+ // EVT_IDLE(MyFrame::OnIdle)
+END_EVENT_TABLE()
+
+// My frame constructor
+MyFrame::MyFrame(wxFrame *frame, const wxString& title,
+ int x, int y, int w, int h)
+ : wxFrame(frame, wxID_ANY, title, wxPoint(x, y), wxSize(w, h))
+{
+ this->SetIcon(wxICON(p7zip_32));
+
+#if wxUSE_STATUSBAR
+ CreateStatusBar(2);
+#endif // wxUSE_STATUSBAR
+
+ m_txtctrl = new wxTextCtrl(this, wxID_ANY, _T(""), wxPoint(0, 0), wxSize(0, 0), wxTE_MULTILINE | wxTE_READONLY);
+}
+
+void myCreateHandle(int n);
+wxWindow * g_window=0;
+
+void MyFrame::OnWorkerEvent(wxCommandEvent& event)
+{
+ int n = event.GetInt();
+ myCreateHandle(n);
+}
+
+
+// Define a new application type, each program should derive a class from wxApp
+class MyApp : public wxApp
+{
+public:
+ // override base class virtuals
+ // ----------------------------
+
+ // this one is called on application startup and is a good place for the app
+ // initialization (doing it here and not in the ctor allows to have an error
+ // return: if OnInit() returns false, the application terminates)
+ virtual bool OnInit();
+};
+
+// Create a new application object: this macro will allow wxWidgets to create
+// the application object during program execution (it's better than using a
+// static object for many reasons) and also implements the accessor function
+// wxGetApp() which will return the reference of the right type (i.e. MyApp and
+// not wxApp)
+IMPLEMENT_APP(MyApp)
+
+time_t g_T0 = 0;
+class MyThread : public wxThread
+{
+ int _argc;
+ TCHAR **_argv;
+public:
+ MyThread(int argc,TCHAR **argv): wxThread(),_argc(argc), _argv(argv) {}
+
+ // thread execution starts here
+ virtual void *Entry()
+ {
+#ifdef ACTIVATE_DIALOG_TESTS
+ int ret = Main3(_argc,_argv);
+#else
+ int ret = Main1(_argc,_argv);
+#endif
+ exit(ret);
+ }
+};
+
+// 'Main program' equivalent: the program execution "starts" here
+bool MyApp::OnInit()
+{
+ // don't parse the command-line options !
+ // : if ( !wxApp::OnInit() ) return false;
+
+ { // define P7ZIP_HOME_DIR
+ extern void my_windows_split_path(const AString &p_path, AString &dir , AString &base);
+ static char p7zip_home_dir[MAX_PATH];
+
+ UString fullPath;
+ NDirectory::MyGetFullPathName(wxApp::argv[0], fullPath);
+ AString afullPath = GetAnsiString(fullPath);
+
+ AString dir,name;
+
+ my_windows_split_path(afullPath,dir,name);
+
+ const char *dir2 = nameWindowToUnix((const char *)dir);
+ snprintf(p7zip_home_dir,sizeof(p7zip_home_dir),"P7ZIP_HOME_DIR=%s/",dir2);
+ p7zip_home_dir[sizeof(p7zip_home_dir)-1] = 0;
+ putenv(p7zip_home_dir);
+ // DEBUG printf("putenv(%s)\n",p7zip_home_dir);
+ }
+ global_use_utf16_conversion = 1; // UNICODE !
+
+ g_T0 = time(0);
+ // DEBUG printf("MAIN Thread : 0x%lx\n",wxThread::GetCurrentId());
+
+ // Create the main frame window
+ MyFrame *frame = new MyFrame((wxFrame *)NULL, _T("7-zip Main Window"), 50, 50, 450, 340);
+ // Don't Show the frame !
+ // frame->Show(true);
+
+ SetTopWindow(frame);
+
+ g_window = frame;
+
+ MyThread *thread = new MyThread(wxApp::argc,wxApp::argv);
+ thread->Create(); // != wxTHREAD_NO_ERROR
+ thread->Run();
+
+ // success: wxApp::OnRun() will be called which will enter the main message
+ // loop and the application will run. If we returned false here, the
+ // application would exit immediately.
+ return true;
+}
+
+DWORD WINAPI GetTickCount(VOID) {
+ static wxStopWatch sw;
+ return sw.Time();
+}
+
+//////////////////////////////////////////
+
+#include "resource.h"
+#include "ExtractRes.h"
+
+static CStringTable g_stringTable[] =
+{
+ /* resource.rc */
+ /***************/
+ { IDS_OPEN_TYPE_ALL_FILES, L"All Files" },
+ { IDS_METHOD_STORE, L"Store" },
+ { IDS_METHOD_NORMAL, L"Normal" },
+ { IDS_METHOD_MAXIMUM, L"Maximum" },
+ { IDS_METHOD_FAST, L"Fast" },
+ { IDS_METHOD_FASTEST, L"Fastest" },
+ { IDS_METHOD_ULTRA, L"Ultra" },
+ { IDS_COMPRESS_NON_SOLID, L"Non-solid" },
+ { IDS_COMPRESS_SOLID, L"Solid" },
+
+ { IDS_COMPRESS_UPDATE_MODE_ADD, L"Add and replace files" },
+ { IDS_COMPRESS_UPDATE_MODE_UPDATE, L"Update and add files" },
+ { IDS_COMPRESS_UPDATE_MODE_FRESH, L"Freshen existing files" },
+ { IDS_COMPRESS_UPDATE_MODE_SYNCHRONIZE, L"Synchronize files" },
+ { IDS_COMPRESS_SET_ARCHIVE_DIALOG_TITLE, L"Browse" },
+ { IDS_COMPRESS_INCORRECT_VOLUME_SIZE, L"Incorrect volume size" },
+ { IDS_COMPRESS_SPLIT_CONFIRM_MESSAGE, L"Specified volume size: {0} bytes.\nAre you sure you want to split archive into such volumes?" },
+
+ { IDS_PASSWORD_USE_ASCII, L"Use only English letters, numbers and special characters (!, #, $, ...) for password." },
+ { IDS_PASSWORD_PASSWORDS_DO_NOT_MATCH, L"Passwords do not match" },
+ { IDS_PASSWORD_IS_TOO_LONG, L"Password is too long" },
+
+ { IDS_PROGRESS_COMPRESSING, L"Compressing" },
+ { IDS_PROGRESS_TESTING, L"Testing" },
+ { IDS_MESSAGE_NO_ERRORS, L"There are no errors" },
+ { IDS_FILES_COLON, L"Files:" },
+ { IDS_FOLDERS_COLON, L"Folders:" },
+ { IDS_SIZE_COLON, L"Size:" },
+ { IDS_COMPRESSED_COLON, L"Compressed size:" },
+ { IDS_ARCHIVES_COLON, L"Archives:" },
+
+ /* Extract.rc */
+ /**************/
+ { IDS_CANNOT_CREATE_FOLDER , L"Cannot create folder '{0}'"},
+ { IDS_OPEN_IS_NOT_SUPORTED_ARCHIVE, L"File is not supported archive."},
+
+ { IDS_MESSAGES_DIALOG_EXTRACT_MESSAGE_CRC , L"CRC failed in '{0}'. File is broken."},
+ { IDS_MESSAGES_DIALOG_EXTRACT_MESSAGE_DATA_ERROR , L"Data error in '{0}'. File is broken"},
+ { IDS_MESSAGES_DIALOG_EXTRACT_MESSAGE_UNSUPPORTED_METHOD , L"Unsupported compression method for '{0}'."},
+ { IDS_MESSAGES_DIALOG_EXTRACT_MESSAGE_CRC_ENCRYPTED , L"CRC failed in encrypted file '{0}'. Wrong password?"},
+ { IDS_MESSAGES_DIALOG_EXTRACT_MESSAGE_DATA_ERROR_ENCRYPTED , L"Data error in encrypted file '{0}'. Wrong password?"},
+
+ { IDS_EXTRACT_SET_FOLDER , L"Specify a location for extracted files."},
+ { IDS_MESSAGES_DIALOG_EXTRACT_MESSAGE_CANNOT_OPEN_FILE, L"Can not open output file '{0}'."},
+ { IDS_PROGRESS_EXTRACTING, L"Extracting" },
+
+ { IDS_CANT_OPEN_ARCHIVE , L"Can not open file '{0}' as archive"},
+ { IDS_CANT_OPEN_ENCRYPTED_ARCHIVE , L"Can not open encrypted archive '{0}'. Wrong password?"},
+
+ { 0 , 0 }
+};
+
+REGISTER_STRINGTABLE(g_stringTable)
+