diff options
Diffstat (limited to 'src/libs/7zip/unix/CPP/Windows/Control')
-rw-r--r-- | src/libs/7zip/unix/CPP/Windows/Control/ComboBox.h | 82 | ||||
-rw-r--r-- | src/libs/7zip/unix/CPP/Windows/Control/Controls.cpp | 515 | ||||
-rw-r--r-- | src/libs/7zip/unix/CPP/Windows/Control/Dialog.cpp | 560 | ||||
-rw-r--r-- | src/libs/7zip/unix/CPP/Windows/Control/Dialog.h | 179 | ||||
-rw-r--r-- | src/libs/7zip/unix/CPP/Windows/Control/DialogImpl.h | 73 | ||||
-rw-r--r-- | src/libs/7zip/unix/CPP/Windows/Control/Edit.h | 24 | ||||
-rw-r--r-- | src/libs/7zip/unix/CPP/Windows/Control/ListView.h | 164 | ||||
-rw-r--r-- | src/libs/7zip/unix/CPP/Windows/Control/ProgressBar.h | 34 | ||||
-rw-r--r-- | src/libs/7zip/unix/CPP/Windows/Control/Static.h | 23 | ||||
-rw-r--r-- | src/libs/7zip/unix/CPP/Windows/Control/StatusBar.h | 56 | ||||
-rw-r--r-- | src/libs/7zip/unix/CPP/Windows/Control/Window2.cpp | 211 | ||||
-rw-r--r-- | src/libs/7zip/unix/CPP/Windows/Control/Window2.h | 111 |
12 files changed, 2032 insertions, 0 deletions
diff --git a/src/libs/7zip/unix/CPP/Windows/Control/ComboBox.h b/src/libs/7zip/unix/CPP/Windows/Control/ComboBox.h new file mode 100644 index 000000000..8717b4867 --- /dev/null +++ b/src/libs/7zip/unix/CPP/Windows/Control/ComboBox.h @@ -0,0 +1,82 @@ +// Windows/Control/ComboBox.h + +#ifndef __WINDOWS_WX_CONTROL_COMBOBOX_H +#define __WINDOWS_WX_CONTROL_COMBOBOX_H + +#include "Windows/Window.h" +#include "Windows/Defs.h" + + +#include "Windows/Control/Window2.h" // NMHDR + +#ifndef _WIN32 +#define CB_ERR (-1) // wxNOT_FOUND +#endif + +typedef struct +{ + NMHDR hdr; +#define CBENF_ESCAPE 1 +#define CBENF_RETURN 2 + int iWhy; +} NMCBEENDEDITW; + +typedef NMCBEENDEDITW * PNMCBEENDEDITW; + + +class wxComboBox; + +namespace NWindows { + namespace NControl { + + class CComboBox // : public CWindow + { + wxComboBox* _choice; + public: + CComboBox() : _choice(0) {} + + void Attach(wxWindow * newWindow); + wxWindow * Detach(); + operator HWND() const; + + int AddString(const TCHAR * txt); + + void SetText(LPCTSTR s); + + void GetText(CSysString &s); + + int GetCount() const ; + void GetLBText(int index, CSysString &s); + + void SetCurSel(int index); + int GetCurSel(); + + void SetItemData(int index, int val); + + int GetItemData(int index); + + void Enable(bool state); + + void ResetContent(); + }; + + class CComboBoxEx : public CComboBox // : public CWindow + { + public: + /* FIXME + LRESULT DeleteItem(int index) + { return SendMessage(CBEM_DELETEITEM, index, 0); } + LRESULT InsertItem(COMBOBOXEXITEM *item) + { return SendMessage(CBEM_INSERTITEM, 0, (LPARAM)item); } + DWORD SetExtendedStyle(DWORD exMask, DWORD exStyle) + { return (DWORD)SendMessage(CBEM_SETEXTENDEDSTYLE, exMask, exStyle); } + HWND GetEditControl() + { return (HWND)SendMessage(CBEM_GETEDITCONTROL, 0, 0); } + */ + }; + + + } +} + +#endif // __WINDOWS_WX_CONTROL_COMBOBOX_H diff --git a/src/libs/7zip/unix/CPP/Windows/Control/Controls.cpp b/src/libs/7zip/unix/CPP/Windows/Control/Controls.cpp new file mode 100644 index 000000000..2191d8009 --- /dev/null +++ b/src/libs/7zip/unix/CPP/Windows/Control/Controls.cpp @@ -0,0 +1,515 @@ +// Dialog.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" + #include "wx/imaglist.h" + #include "wx/listctrl.h" +#endif + +#undef _WIN32 + +#include "Windows/Control/Dialog.h" + +void verify_main_thread(void); + +class LockGUI +{ + bool _IsMain; + public: + LockGUI() { + verify_main_thread(); + _IsMain = wxThread::IsMain(); + if (!_IsMain) { + // DEBUG + printf("GuiEnter-Controls(0x%lx)\n",wxThread::GetCurrentId()); + abort(); // FIXME wxMutexGuiEnter(); + } + } + ~LockGUI() { + if (!_IsMain) { + wxMutexGuiLeave(); + // DEBUG printf("GuiLeave(0x%lx)\n",wxThread::GetCurrentId()); + } + } +}; +///////////////////////// + +static const wxString CLASS_NAME_wxStaticText = wxT("wxStaticText"); +static const wxString CLASS_NAME_wxTextCtrl = wxT("wxTextCtrl"); + +namespace NWindows { + namespace NControl { + + void CDialogChildControl::SetText(LPCWSTR s) + { + LockGUI lock; + const wxChar * class_name = _window->GetClassInfo()->GetClassName (); + + if ( CLASS_NAME_wxStaticText == class_name) { + ((wxStaticText *)_window)->SetLabel(s); + } else if ( CLASS_NAME_wxTextCtrl == class_name) { + ((wxTextCtrl *)_window)->SetLabel(s); + } else { + // ((wxControl *)_window)->SetValue(s); // FIXME + printf("INTERNAL ERROR - CDialogChildControl::SetText(class=%ls) not implemented\n",class_name); + exit(-1); + } + } + + bool CDialogChildControl::GetText(CSysString &s) + { + wxString str; + { + LockGUI lock; + const wxChar * class_name = _window->GetClassInfo()->GetClassName (); + if ( CLASS_NAME_wxStaticText == class_name) { + str = ((wxStaticText *)_window)->GetLabel(); + } else if ( CLASS_NAME_wxTextCtrl == class_name) { + str = ((wxTextCtrl *)_window)->GetLabel(); + } else { + // FIXME str = ((wxTextCtrl *)_window)->GetValue(); + printf("INTERNAL ERROR - CDialogChildControl::GetText(class=%ls) not implemented\n",class_name); + exit(-1); + } + } + s = str; + return true; + } + } +} + +///////////////////////// Windows/Control/ComboBox.cpp +#include "Windows/Control/ComboBox.h" + +namespace NWindows { + namespace NControl { + + void CComboBox::Attach(wxWindow * newWindow) { _choice = (wxComboBox*)newWindow; } + + wxWindow * CComboBox::Detach() + { + wxWindow * window = _choice; + _choice = NULL; + return window; + } + + CComboBox::operator HWND() const { return (HWND)_choice; } + + + int CComboBox::AddString(const TCHAR * txt) { + LockGUI lock; + wxString item(txt); + return _choice->Append(item); + } + + void CComboBox::SetText(LPCTSTR s) { + LockGUI lock; + wxString str(s); + _choice->SetValue(str); + } + + void CComboBox::GetText(CSysString &s) { + LockGUI lock; + wxString str = _choice->GetValue(); + s = str; + } + + int CComboBox::GetCount() const { + LockGUI lock; + return _choice->GetCount(); + } + + void CComboBox::GetLBText(int index, CSysString &s) { + LockGUI lock; + wxString str = _choice->GetString(index); + s = str; + } + + void CComboBox::SetCurSel(int index) { + LockGUI lock; + _choice->SetSelection(index); + } + + int CComboBox::GetCurSel() { + LockGUI lock; + return _choice->GetSelection(); + } + + void CComboBox::SetItemData(int index, int val) { + LockGUI lock; + _choice->SetClientData( index, (void *)(((char *)0) + val)); + } + + int CComboBox::GetItemData(int index) + { + LockGUI lock; + void * data = _choice->GetClientData(index); + int ret = (int)(((char *)data) - ((char *)0)); + return ret; + } + + void CComboBox::Enable(bool state) { + LockGUI lock; + _choice->Enable(state); + } + + void CComboBox::ResetContent() { + LockGUI lock; + _choice->Clear(); + } + } +} + +///////////////////////// Windows/Control/Edit.cpp +#include "Windows/Control/Edit.h" + +namespace NWindows { + namespace NControl { + + void CEdit::SetPasswordChar(WPARAM c) // Warning : does not work for wxMSW + { + LockGUI lock; + long style = _window->GetWindowStyle(); + if ( c == 0 ) style &= ~(wxTE_PASSWORD); + else style |= wxTE_PASSWORD; + _window->SetWindowStyle(style); + _window->Refresh(); + } + + + void CEdit::Show(int cmdShow) + { + LockGUI lock; + // FIXME _window->Show(cmdShow != SW_HIDE); + _window->Enable(cmdShow != SW_HIDE); + } + + void CEdit::SetText(LPCWSTR s) + { + LockGUI lock; + ((wxTextCtrl *)_window)->SetValue(s); + } + + bool CEdit::GetText(CSysString &s) + { + wxString str; + { + LockGUI lock; + str = ((wxTextCtrl *)_window)->GetValue(); + } + s = str; + return true; + } + + } +} + +///////////////////////// Windows/Control/ProgressBar.cpp +#include "Windows/Control/ProgressBar.h" + +namespace NWindows { + namespace NControl { + + CProgressBar::CProgressBar(wxWindow* newWindow): + _window((wxGauge *)newWindow) , _minValue(0), _range(0) { } + + void CProgressBar::Attach(wxWindow* newWindow) { + _window = (wxGauge *)newWindow; + _minValue = 0; + _range = 0; + } + + void CProgressBar::SetRange32(int minValue, int maxValue) { + int range = maxValue - minValue; + if (range >= 1) + { + LockGUI lock; + _minValue = minValue; + _range = range; + _window->SetRange(_range); + } + } + + void CProgressBar::SetPos(int pos) { + if (_range >= 1) + { + LockGUI lock; + int value = pos - _minValue; + if ((value >= 0) && (value <= _range)) _window->SetValue(value); + } + } + + } +} + +///////////////////////// Windows/Control/StatusBar.cpp +#include "Windows/Control/StatusBar.h" + +namespace NWindows { + namespace NControl { + + void CStatusBar::Attach(wxWindow * newWindow) { _statusBar = (wxStatusBar*)newWindow; } + + wxWindow * CStatusBar::Detach() + { + wxWindow * window = _statusBar; + _statusBar = NULL; + return window; + } + + void CStatusBar::SetText(int index, LPCTSTR text) + { + _statusBar->SetStatusText(text,index); + } + + } + +} + +///////////////////////// Windows/Control/ListView.cpp +#include "Windows/Control/ListView.h" + +namespace NWindows { +namespace NControl { + + void CListView::Attach(wxWindow * newWindow) { + _list = (wxListCtrl *)newWindow; + } + + CListView::operator HWND() const { return (HWND)_list; } + + int CListView::GetItemCount() const {return _list->GetItemCount(); } + + int CListView::InsertItem(int index, LPCTSTR text) { + return _list->InsertItem(index, text); + } + int CListView::InsertItem(const LVITEM* item) { + /* + int col = item->iSubItem; + wxString text; + if (item->mask & LVIF_TEXT) text = item->pszText; + + // printf("%p->InsertItem(id=%d,%ls)\n",_list,item->iItem, (const wchar_t *)text); + return _list->InsertItem(item->iItem, text); + */ + wxListItem info; + long mask = 0; + info.SetId(item->iItem); + if (item->mask & LVIF_TEXT) + { + info.SetText(item->pszText); + mask |= wxLIST_MASK_TEXT; + } + if (item->mask & LVIF_PARAM) + { + info.SetData(item->lParam); + mask |= wxLIST_MASK_DATA; + } + if (item->mask & LVIF_STATE) + { + info.SetState(item->state); + mask |= wxLIST_MASK_STATE; + } + // FIXME if (item->mask & LVIF_IMAGE) + + info.SetMask(mask); + + return _list->InsertItem(info); + } + + void CListView::SetItem(const LVITEM* item) { + int col = item->iSubItem; + wxString text; + if (item->mask & LVIF_TEXT) text = item->pszText; + // printf("%p->SetItem(id=%d,col=%d,%ls)\n",_list,item->iItem, col,(const wchar_t *)text); + _list->SetItem(item->iItem, col, text); + } + + int CListView::SetSubItem(int index, int subIndex, LPCTSTR text) + { + return _list->SetItem(index, subIndex, text); + } + + void SetUnicodeFormat(bool fUnicode) { return ; } + + void CListView::InsertColumn(int columnIndex, LPCTSTR text, int width) + { + _list->InsertColumn(columnIndex, text, wxLIST_FORMAT_LEFT, width); + } + + void CListView::InsertColumn(int columnIndex, const LVCOLUMNW *columnInfo) + { + wxString text; + int format = wxLIST_FORMAT_LEFT; + int width = -1; + if (columnInfo->mask & LVCF_FMT) + { + if (columnInfo->fmt == LVCFMT_LEFT) format = wxLIST_FORMAT_LEFT; + if (columnInfo->fmt == LVCFMT_RIGHT) format = wxLIST_FORMAT_RIGHT; + } + if (columnInfo->mask & LVCF_TEXT) text = columnInfo->pszText; + if (columnInfo->mask & LVCF_WIDTH) width = columnInfo->cx; + // FIXME LVCF_SUBITEM + // printf("%p->InsertColumn(%d,%ls)\n",_list,columnIndex,(const wchar_t *)heading); + _list->InsertColumn(columnIndex, text, format, width); + } + + void CListView::DeleteAllItems() { + _list->DeleteAllItems(); + printf("%p->DeleteAllItems()\n",_list); + } + + void CListView::SetRedraw(bool b) { + if (b) _list->Thaw(); + else _list->Freeze(); + printf(" %p->SetRedraw()\n",_list); + } + + void CListView::SetItemCount(int count) { + // ONLY IF VIRTUAL REPORT -- _list->SetItemCount(count); + printf(" %p->SetItemCount(%d)\n",_list,count); + } + + void CListView::InvalidateRect(void *, bool) { + printf("FIXME %p->InvalidateRect()\n",_list);/* FIXME */ + } + + int CListView::GetSelectedCount() const { + int nb = _list->GetSelectedItemCount(); + printf(" %p->GetSelectedCount()=>%d\n",_list,nb); + return nb; + } + + void /* bool */ CListView::EnsureVisible(int index, bool partialOK) { + + printf(" %p->EnsureVisible(%d)\n",_list,index); + + if (index == -1) index = 0; + _list->EnsureVisible(index); + + // return true; + } + + void CListView::SetItemState(int index, UINT state, UINT mask) { + // don't work _list->SetItemState(index, state, mask); !? + // try SetItem ... + /* + wxListItem info; + + info.m_mask = wxLIST_MASK_STATE; + info.m_itemId = index; + info.m_col = 0; + info.m_state = state; + info.m_mask = mask; + + _list->SetItem(info); + */ + + printf(" %p->EnsureVisible(%d)\n",_list,index); + + if (index == -1) return; + + if (mask & LVIS_FOCUSED) { + _list->SetItemState(index, state & LVIS_FOCUSED, mask & LVIS_FOCUSED); + } + + if (mask & LVIS_SELECTED) { + _list->SetItemState(index, state & LVIS_SELECTED, mask & LVIS_SELECTED); + } + + } + + UINT CListView::GetItemState(int index, UINT mask) const + { + UINT state = _list->GetItemState(index, mask); + printf("FIXME %p->GetItemState(index=%d,mask=0x%x)=0x%x\n",_list,index,(unsigned)mask,(unsigned)state); /* FIXME */ + + return state; + } + + void /* bool */ CListView::Update() { + printf("FIXME %p->Update()\n",_list); /* FIXME */ + } + + bool CListView::DeleteColumn(int columnIndex) { + // printf("%p->DeleteColumn()\n",_list); + if (_list->GetColumnCount() < 1) return false; + return _list->DeleteColumn(columnIndex); // always return true !? + } + + bool CListView::GetItemParam(int itemIndex, LPARAM ¶m) const + { + param = _list->GetItemData(itemIndex); + + // printf(" %p->GetItemParam(%d) => %ld\n",_list,itemIndex,(long)param); + + return true; + } + + int CListView::GetNextItem(int startIndex, UINT flags) const + { + int item = _list->GetNextItem(startIndex, wxLIST_NEXT_ALL, flags); + printf(" %p->GetNextItem(%d) => %d\n",_list,startIndex,item); + return item; + + } + + int CListView::GetFocusedItem() const + { + int item = _list->GetNextItem(-1, wxLIST_NEXT_ALL, wxLIST_STATE_FOCUSED); + printf(" %p->GetFocusedItem() => %d\n",_list,item); + return item; + } + + void CListView::RedrawAllItems() + { + printf("FIXME %p->RedrawAllItems()\n",_list); + } + + // FIXME added + int CListView::GetColumnCount() + { + return _list->GetColumnCount(); + } + + void CListView::SetFocus() { /* FIXME */ } + + void CListView::RedrawItem(int item) { /* FIXME */ } + + bool CListView::SortItems(PFNLVCOMPARE compareFunction, LPARAM dataParam) { + printf(" %p->SortItems()\n",_list); + return _list->SortItems(compareFunction, dataParam); + } + + bool CListView::GetColumn(int columnIndex, LVCOLUMN* columnInfo) + { + columnInfo->cx = _list->GetColumnWidth(columnIndex);// FIXME + + bool ret = false; + + if (columnInfo->cx >= 1) ret = true; + + // printf("CListView::GetColumn(%d) cx=%d\n",columnIndex,(int)columnInfo->cx); + + return ret; + } + + // HWND EditLabel(int itemIndex) + void CListView::EditLabel(int itemIndex) + { + /* FIXME */ + } + +}} + diff --git a/src/libs/7zip/unix/CPP/Windows/Control/Dialog.cpp b/src/libs/7zip/unix/CPP/Windows/Control/Dialog.cpp new file mode 100644 index 000000000..464ae302c --- /dev/null +++ b/src/libs/7zip/unix/CPP/Windows/Control/Dialog.cpp @@ -0,0 +1,560 @@ +// Dialog.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 + +#include <wx/filename.h> + + +#undef _WIN32 + +#include "Windows/Control/DialogImpl.h" +#include "Windows/Synchronization.h" + + +// FIXME +class MyApp : public wxApp +{ +public: + virtual bool OnInit(); +}; + +DECLARE_APP(MyApp) + +// #include "../GUI/p7zip_32.xpm" +extern const char * p7zip_32_xpm[]; + +const TCHAR * nameWindowToUnix(const TCHAR * lpFileName) { + if ((lpFileName[0] == wxT('c')) && (lpFileName[1] == wxT(':'))) return lpFileName+2; + return lpFileName; +} + + +extern time_t g_T0; // FIXME + +#define DIALOG_ID_MESSAGEBOX 8100 +#define DIALOG_ID_DIR_DIALOG 8101 +#define DIALOG_ID_FILE_DIALOG 8102 +#define DIALOG_ID_POST_DIALOG 8190 +#define DIALOG_ID_END_DIALOG 8199 + +static struct +{ + bool busy; + + int id; + wxWindow *parentWindow; + + // CreateDialog + NWindows::NControl::CModalDialog * dialog; + + // EndModal + int value; + NWindows::NControl::CModalDialogImpl * window; + + // MessageBox + const TCHAR * msg; + const TCHAR * title; + int flag; + + // + LPCWSTR initialFolderOrFile; + + wxSemaphore * sem; + int ret; + + UString resultPath; + +#define MAX_CREATE 16 +} g_tabCreate[MAX_CREATE]; + +static int myCreateHandle2(int n); + +static int findFreeInd() +{ +static NWindows::NSynchronization::CCriticalSection g_CriticalSection; + + g_CriticalSection.Enter(); + int ind = 0; + while (ind < MAX_CREATE) + { + if (g_tabCreate[ind].busy == false) + { + g_tabCreate[ind].busy = true; + break; + } + ind++; + } + g_CriticalSection.Leave(); + + return ind; +} + +static int WaitInd(wxWindow * destWindow, int ind,int id,wxWindow * parent,UString &resultPath) +{ + int ret = 0; + + g_tabCreate[ind].id = id; + g_tabCreate[ind].parentWindow = parent; + g_tabCreate[ind].ret = 0; + g_tabCreate[ind].resultPath = wxEmptyString; + + if (wxThread::IsMain()) + { + ret = myCreateHandle2(ind); + resultPath = g_tabCreate[ind].resultPath; + } + else + { + if (destWindow == 0) { + extern wxWindow * g_window; + if (g_window == 0) + { + printf("INTERNAL ERROR : g_window and destWindow == NULL\n"); abort(); + } + destWindow = g_window; + } + g_tabCreate[ind].sem = new wxSemaphore(0); + + // create any type of command event here + wxCommandEvent event( wxEVT_COMMAND_MENU_SELECTED, WORKER_EVENT ); + event.SetInt( ind ); + + // send in a thread-safe way + // DEBUG printf("T=0x%lx - %d : WaitInd(%d,%p): BEGIN\n", wxThread::GetCurrentId(),time(0)-g_T0,g_tabCreate[ind].id,g_tabCreate[ind].parentWindow); + wxPostEvent( destWindow, event ); + + g_tabCreate[ind].sem->Wait(); + + ret = g_tabCreate[ind].ret; + resultPath = g_tabCreate[ind].resultPath; + // DEBUG printf("T=0x%lx - %d : WaitInd(%d,%p): ret=%d\n", wxThread::GetCurrentId(),time(0)-g_T0,g_tabCreate[ind].id,g_tabCreate[ind].parentWindow,ret); + delete g_tabCreate[ind].sem; + g_tabCreate[ind].sem = 0; + } + + g_tabCreate[ind].busy = false; + + return ret; +} + +static int WaitInd(wxWindow * destWindow,int ind,int id,wxWindow * parent) +{ + UString resultPath; + return WaitInd(destWindow,ind,id,parent,resultPath); +} + +void verify_main_thread(void); + +class LockGUI +{ + bool _IsMain; + public: + LockGUI() { + + verify_main_thread(); + + _IsMain = wxThread::IsMain(); + if (!_IsMain) { + // DEBUG + printf("GuiEnter-Dialog(0x%lx)\n",wxThread::GetCurrentId()); + abort(); // FIXME wxMutexGuiEnter(); + } + } + ~LockGUI() { + if (!_IsMain) { + wxMutexGuiLeave(); + // DEBUG printf("GuiLeave(0x%lx)\n",wxThread::GetCurrentId()); + } + } +}; + +static const unsigned int kNumDialogsMax = 32; +static unsigned int g_NumDialogs = 0; +static const CDialogInfo *g_Dialogs[kNumDialogsMax]; + +void RegisterDialog(const CDialogInfo *dialogInfo) +{ + // DEBUG printf("RegisterDialog : %d\n",dialogInfo->id); + if (g_NumDialogs < kNumDialogsMax) + g_Dialogs[g_NumDialogs++] = dialogInfo; +} + +namespace NWindows { + + CSysString MyLoadString(unsigned int resourceID) + { + for(unsigned i=0; i < g_NumDialogs; i++) { + if (g_Dialogs[i]->stringTable) { + int j = 0; + while(g_Dialogs[i]->stringTable[j].str) { + if (resourceID == g_Dialogs[i]->stringTable[j].id) { + return g_Dialogs[i]->stringTable[j].str; + } + + j++; + } + } + } + return L"FIXME-MyLoadStringW-"; + } + + namespace NControl { + +/////////////////////////////////////////// CModalDialog ////////////////////////////////// + + bool CModalDialog::CheckButton(int buttonID, UINT checkState) + { + LockGUI lock; + wxCheckBox* w = (wxCheckBox*)_window->FindWindow(buttonID); + if (w) + { + w->SetValue(checkState == BST_CHECKED); + return true; + } + return false; + } + + UINT CModalDialog::IsButtonChecked(int buttonID) const + { + LockGUI lock; + wxCheckBox* w = (wxCheckBox*)_window->FindWindow(buttonID); + if (w) + { + bool bret = w->GetValue(); + if (bret) return BST_CHECKED; + } + return BST_UNCHECKED; + } + + void CModalDialog::EnableItem(int id, bool state) + { + LockGUI lock; + wxWindow* w = _window->FindWindow(id); + if (w) w->Enable(state); + } + + void CModalDialog::SetItemText(int id, const TCHAR *txt) + { + LockGUI lock; + wxWindow* w = _window->FindWindow(id); + if (w) + { + wxString label(txt); + w->SetLabel(label); + } + } + + wxWindow * CModalDialog::GetItem(long id) const + { + LockGUI lock; + return _window->FindWindow(id); + } + + void CModalDialog::ShowItem(int itemID, int cmdShow) const + { + LockGUI lock; + // cmdShow = SW_HIDE or SW_SHOW (sometimes false or true !) + wxWindow* w = _window->FindWindow(itemID); + if (w) + { +// FIXME w->Show(cmdShow != SW_HIDE); + w->Enable(cmdShow != SW_HIDE); + } + } + + UINT_PTR CModalDialog::SetTimer(UINT_PTR idEvent , unsigned milliseconds) + { + LockGUI lock; + return _window->SetTimer(idEvent , milliseconds); + } + + void CModalDialog::KillTimer(UINT_PTR idEvent) + { + LockGUI lock; + _window->KillTimer(idEvent); + } + + void CModalDialog::SetText(const TCHAR *_title) { + LockGUI lock; + _window->SetTitle(_title); + } + + + bool CModalDialog::GetText(CSysString &s) { + wxString str; + { + LockGUI lock; + str = _window->GetTitle(); + } + s = str; + return true; + } + + INT_PTR CModalDialog::Create(int id , HWND parentWindow) + { + int ind = findFreeInd(); + + g_tabCreate[ind].dialog = this; + + return WaitInd(0, ind,id,parentWindow); + } + + void CModalDialog::End(int result) + { + int ind = findFreeInd(); + + g_tabCreate[ind].window = _window; + g_tabCreate[ind].value = result; + + WaitInd(this->_window,ind,DIALOG_ID_END_DIALOG,0); + } + + void CModalDialog::PostMessage(UINT message) + { + int ind = findFreeInd(); + + g_tabCreate[ind].dialog = this; + g_tabCreate[ind].value = message; + + WaitInd(this->_window,ind,DIALOG_ID_POST_DIALOG,0); + } + +/////////////////////////////////////////// CModalDialogImpl /////////////////////////////////////// + + CModalDialogImpl::CModalDialogImpl(CDialog *dialog, wxWindow* parent, wxWindowID id, + const wxString& title, const wxPoint& pos, + const wxSize& size, long style) : + wxDialog(parent, id, title , pos , size, style /* | wxDIALOG_NO_PARENT */ ) , + _timer(this, TIMER_ID_IMPL), _dialog(dialog) + { + // set the frame icon + this->SetIcon(wxICON(p7zip_32)); + } + + void CModalDialogImpl::OnAnyButton(wxCommandEvent& event) + { + int id = event.GetId(); + if (id == wxID_OK) + { + if (_dialog) _dialog->OnOK(); + // event.Skip(true); + } + else if (id == wxID_CANCEL) + { + if (_dialog) _dialog->OnCancel(); + // event.Skip(true); + } + else if (id == wxID_HELP) + { + if (_dialog) _dialog->OnHelp(); + } + else + { + if (_dialog) + { + /* bool bret = */ _dialog->OnButtonClicked(id, FindWindow(id) ); + } + } + } + + void CModalDialogImpl::OnAnyChoice(wxCommandEvent &event) + { + int itemID = event.GetId(); + if (_dialog) _dialog->OnCommand(CBN_SELCHANGE, itemID, 0); + } + + void CModalDialogImpl::OnAnyTimer(wxTimerEvent &event) + { + int timerID = event.GetId(); + if (_dialog) _dialog->OnTimer(timerID , 0); + } + } +} + +///////////////////////// myCreateHandle + + +static int myCreateHandle2(int n) +{ + unsigned int id = g_tabCreate[n].id; + wxWindow * parentWindow = g_tabCreate[n].parentWindow; + NWindows::NControl::CModalDialogImpl * window = 0; + + // DEBUG printf("T=0x%lx - %d : myCreateHandle(%d): BEGIN\n", wxThread::GetCurrentId(),time(0)-g_T0,n); + + if (id == DIALOG_ID_END_DIALOG) + { + /* FIXME : the dialog must be shown before ending it ? + while (!g_tabCreate[n].window->IsShownOnScreen()) Sleep(200); + Sleep(200); + */ + g_tabCreate[n].window->EndModal(g_tabCreate[n].value); + return 0; + } + + if (id == DIALOG_ID_POST_DIALOG) + { + g_tabCreate[n].dialog->OnMessage(g_tabCreate[n].value, 0, 0); + return 0; + } + + if (id == DIALOG_ID_MESSAGEBOX) + { + long style = g_tabCreate[n].flag; + long decorated_style = style; + if ( ( style & ( wxICON_EXCLAMATION | wxICON_HAND | wxICON_INFORMATION | + wxICON_QUESTION ) ) == 0 ) + { + decorated_style |= ( style & wxYES ) ? wxICON_QUESTION : wxICON_INFORMATION ; + } + wxMessageDialog dialog(parentWindow, g_tabCreate[n].msg, g_tabCreate[n].title, decorated_style); + dialog.SetIcon(wxICON(p7zip_32)); + int ret = dialog.ShowModal(); + + return ret; + } + + if (id == DIALOG_ID_DIR_DIALOG) + { + wxString defaultDir = g_tabCreate[n].initialFolderOrFile; + wxDirDialog dirDialog(g_tabCreate[n].parentWindow, + g_tabCreate[n].title, defaultDir); + dirDialog.SetIcon(wxICON(p7zip_32)); + int ret = dirDialog.ShowModal(); + if (ret == wxID_OK) g_tabCreate[n].resultPath = dirDialog.GetPath(); + return ret; + } + + if (id == DIALOG_ID_FILE_DIALOG) + { + wxString defaultFilename = g_tabCreate[n].initialFolderOrFile; + + wxFileName filename(defaultFilename); + + wxString dir = filename.GetPath(); + wxString name = filename.GetFullName(); + + + // printf("DIALOG_ID_FILE_DIALOG = '%ls' => '%ls' '%ls'\n",&defaultFilename[0],&dir[0],&name[0]); + + + wxFileDialog fileDialog(g_tabCreate[n].parentWindow, g_tabCreate[n].title, + dir, name, wxT("All Files (*.*)|*.*"), wxFD_SAVE|wxFD_OVERWRITE_PROMPT); + fileDialog.SetIcon(wxICON(p7zip_32)); + int ret = fileDialog.ShowModal(); + if (ret == wxID_OK) g_tabCreate[n].resultPath = fileDialog.GetPath(); + return ret; + } + + for(unsigned i=0; i < g_NumDialogs; i++) { + if (id == g_Dialogs[i]->id) { + // DEBUG printf("%d : Create(%d,%p): CreateDialog-1\n",time(0)-g_T0,id,parentWindow); + window = (g_Dialogs[i]->createDialog)(g_tabCreate[n].dialog,g_tabCreate[n].parentWindow); + // DEBUG printf("%d : Create(%d,%p): CreateDialog-2\n",time(0)-g_T0,id,parentWindow); + break; + } + } + + if (window) { + + // DEBUG printf("%d : Create(%d,%p): %p->ShowModal()\n",time(0)-g_T0,id,parentWindow,window); + + // window->Show(true); + // wxGetApp().ProcessPendingEvents(); + + INT_PTR ret = window->ShowModal(); + + // DEBUG printf("%d : Create(%d,%p): %p->ShowModal() - ret=%d\n",time(0)-g_T0,id,parentWindow,window,ret); + window->Detach(); + window->Destroy(); + + // DEBUG printf("%d : Create(%d,%p): END\n",time(0)-g_T0,id,parentWindow,window); + + return ret; + } + + // FIXME + printf("INTERNAL ERROR : cannot find dialog %d\n",id); + + return 0; +} + +void myCreateHandle(int n) +{ + int ret = myCreateHandle2(n); + g_tabCreate[n].ret = ret; + g_tabCreate[n].sem->Post(); +} + +int MessageBoxW(wxWindow * parent, const TCHAR * msg, const TCHAR * title,int flag) +{ + int ind = findFreeInd(); + + g_tabCreate[ind].msg = msg; + g_tabCreate[ind].title = title; + g_tabCreate[ind].flag = flag; + + return WaitInd(parent,ind,DIALOG_ID_MESSAGEBOX,parent); // FIXME +} + + + +// FIXME : should be in Windows/Shell.cpp + +namespace NWindows{ +namespace NShell{ + +bool BrowseForFolder(HWND owner, LPCWSTR title, LPCWSTR initialFolder, UString &resultPath) +{ + int ind = findFreeInd(); + + g_tabCreate[ind].title = title; + g_tabCreate[ind].initialFolderOrFile = nameWindowToUnix(initialFolder); + + UString resTmp; + int ret = WaitInd(0,ind,DIALOG_ID_DIR_DIALOG,owner,resTmp); // FIXME + if(ret == wxID_OK) + { + resultPath = resTmp; + return true; + } + return false; +} + +}} + +/////////////////////////// CPP/Windows/CommonDialog.cpp +namespace NWindows +{ + + bool MyGetOpenFileName(HWND hwnd, LPCWSTR title, LPCWSTR fullFileName, LPCWSTR s, UString &resPath) + { + int ind = findFreeInd(); + + g_tabCreate[ind].title = title; + g_tabCreate[ind].initialFolderOrFile = nameWindowToUnix(fullFileName); + + UString resTmp; + int ret = WaitInd(0,ind,DIALOG_ID_FILE_DIALOG,hwnd,resTmp); // FIXME + if(ret == wxID_OK) + { + resPath = resTmp; + return true; + } + return false; + } +} + diff --git a/src/libs/7zip/unix/CPP/Windows/Control/Dialog.h b/src/libs/7zip/unix/CPP/Windows/Control/Dialog.h new file mode 100644 index 000000000..54899a104 --- /dev/null +++ b/src/libs/7zip/unix/CPP/Windows/Control/Dialog.h @@ -0,0 +1,179 @@ +// Windows/Control/Dialog.h + +#ifndef __WINDOWS_CONTROL_DIALOG_H +#define __WINDOWS_CONTROL_DIALOG_H + +#include "Windows/Window.h" + +#ifndef _WIN32 +#define SW_HIDE 0 +#define SW_SHOW 5 + +#define WM_SETTEXT (6000) // wxID_HIGHEST + 1 +#define WM_USER (6999) // wxID_HIGHEST + 1000 + +#endif + +#ifndef _WIN32 +#define CBN_SELCHANGE 1 +#endif + +// FIXME +#define IDCLOSE (5001) // wxID_CLOSE +#define IDEXIT (5006) // wxID_EXIT +#define IDOK (5100) // wxID_OK +#define IDCANCEL (5101) // wxID_CANCEL +#define IDABORT (5115) // wxID_ABORT +#define IDYES (5103) // wxID_YES +#define IDNO (5104) // wxID_NO +#define IDHELP (5009) // wxID_HELP + +#define BST_CHECKED 1 +#define BST_UNCHECKED 0 +// #define BST_INDETERMINATE 0x0002 + +#define wsprintf(a,b,c,d,e) swprintf(a,9999,b,c,d,e) // FIXME + +namespace NWindows { + namespace NControl { + + class CModalDialogImpl; + + class CDialog + { + protected: + CModalDialogImpl * _window; + public: + operator HWND() const { return HWND(_window); } + + bool OnInit(CModalDialogImpl * window) { + _window = window; + return OnInit(); + } + virtual bool OnInit() { return false; } + virtual void OnOK() {} + virtual void OnCancel() {} + virtual void OnHelp() {} + virtual bool OnButtonClicked(int buttonID, wxWindow * buttonHWND) { return false; } + virtual bool OnMessage(UINT message, WPARAM wParam, LPARAM lParam) { return false; } + virtual bool OnCommand(int code, int itemID, LPARAM lParam) { return false; } + virtual bool OnTimer(WPARAM /* timerID */, LPARAM /* callback */) { return false; } + + void NormalizeSize(bool fullNormalize = false) { /* FIXME */ } + void NormalizePosition() { /* FIXME */ } + }; + + class CModalDialog : public CDialog + { + public: + + + ////////////////// COMPATIBILITY + + bool CheckRadioButton(int firstButtonID, int lastButtonID, int checkButtonID) + { +/* + for(int id = firstButtonID; id <= lastButtonID; id++) + { + CheckButton(id,id == checkButtonID); + } +*/ + this->CheckButton(checkButtonID,true); + + return true; + } + + + bool CheckButton(int buttonID, UINT checkState); + bool CheckButton(int buttonID, bool checkState) + { + return CheckButton(buttonID, UINT(checkState ? BST_CHECKED : BST_UNCHECKED)); + } + + + UINT IsButtonChecked(int buttonID) const; + + bool IsButtonCheckedBool(long buttonID) const + { return (IsButtonChecked(buttonID) == BST_CHECKED); } + + void EnableItem(int id, bool state); + + void SetItemText(int id, const TCHAR *txt); + + wxWindow * GetItem(long id) const ; + + void ShowItem(int itemID, int cmdShow) const; + + void HideItem(int itemID) const { ShowItem(itemID, SW_HIDE); } + + void End(int result); + + void SetText(const TCHAR *_title); // { _dialog->SetTitle(_title); } + + bool GetText(CSysString &s); + + INT_PTR Create(int id , HWND parentWindow); + + void PostMessage(UINT message); + + virtual void OnHelp() {} + + UINT_PTR SetTimer(UINT_PTR idEvent , unsigned milliseconds); + + void KillTimer(UINT_PTR idEvent); + + virtual void OnOK() { End(IDOK); } + virtual void OnCancel() { End(IDCANCEL); } + }; + +class CDialogChildControl : public NWindows::CWindow +{ +public: + CDialogChildControl() {} + + int m_ID; + void Init(const NWindows::NControl::CModalDialog &parentDialog, int id) + { + m_ID = id; + this->Attach(parentDialog.GetItem(id)); + } + virtual void SetText(LPCWSTR s); + virtual bool GetText(CSysString &s); +}; + +} +} + +struct CStringTable +{ + unsigned int id; + const wchar_t *str; +}; + +struct CDialogInfo +{ + unsigned int id; + NWindows::NControl::CModalDialogImpl * (*createDialog)(NWindows::NControl::CModalDialog * dialog, HWND parentWindow); + CStringTable * stringTable; +}; + +void RegisterDialog(const CDialogInfo *dialogInfo); + +#define REGISTER_DIALOG_NAME(x) CRegister ## x + +#define REGISTER_DIALOG(id,x,stringTable) \ + static NWindows::NControl::CModalDialogImpl * myCreate##x(NWindows::NControl::CModalDialog * dialog,HWND parentWindow) \ + { return new x##Impl(dialog,parentWindow,id); } \ + static struct CDialogInfo g_DialogInfo = { id , myCreate##x, stringTable }; \ + struct REGISTER_DIALOG_NAME(x) { \ + REGISTER_DIALOG_NAME(x)() { RegisterDialog(&g_DialogInfo); }}; \ + static REGISTER_DIALOG_NAME(x) g_RegisterDialog; + +#define REGISTER_STRINGTABLE(stringTable) \ + static struct CDialogInfo g_DialogInfo = { -1 , 0 , stringTable }; \ + struct REGISTER_DIALOG_NAME(x) { \ + REGISTER_DIALOG_NAME(x)() { RegisterDialog(&g_DialogInfo); }}; \ + static REGISTER_DIALOG_NAME(x) g_RegisterDialog; + +#endif + diff --git a/src/libs/7zip/unix/CPP/Windows/Control/DialogImpl.h b/src/libs/7zip/unix/CPP/Windows/Control/DialogImpl.h new file mode 100644 index 000000000..a9720b778 --- /dev/null +++ b/src/libs/7zip/unix/CPP/Windows/Control/DialogImpl.h @@ -0,0 +1,73 @@ +// Windows/Control/DialogImpl.h + +#ifndef __WINDOWS_CONTROL_DIALOGIMPL_H +#define __WINDOWS_CONTROL_DIALOGIMPL_H + +#include "Windows/Window.h" +#include "Windows/Control/Dialog.h" + +void myCreateHandle(int n); // FIXME - duplicate + +enum { + WORKER_EVENT=100 // this one gets sent from the worker thread +}; + +namespace NWindows { + namespace NControl { + +#define TIMER_ID_IMPL (1234) + + class CModalDialogImpl : public wxDialog + { + wxTimer _timer; + + CDialog *_dialog; + public: + CModalDialogImpl(CDialog *dialog, wxWindow* parent, wxWindowID id, const wxString& title, + const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, + long style = wxDEFAULT_DIALOG_STYLE ); + + CDialog * Detach() + { + CDialog * oldDialog = _dialog; + _dialog = NULL; + return oldDialog; + } + + void OnInit() + { + if (_dialog) _dialog->OnInit(this); + } + + void OnAnyButton(wxCommandEvent& event); + void OnAnyChoice(wxCommandEvent &event); + void OnAnyTimer(wxTimerEvent &event); + +/* FIXME virtual void SetLabel(const wxString &title) + { + // Why we must do this "alias" ? + this->SetTitle(title); + } +*/ + ////////////////// + UINT_PTR SetTimer(UINT_PTR /* FIXME idEvent */, unsigned milliseconds) + { + _timer.Start(milliseconds); + return TIMER_ID_IMPL; + } + void KillTimer(UINT_PTR idEvent) + { + if (idEvent == TIMER_ID_IMPL) _timer.Stop(); + } + void OnWorkerEvent(wxCommandEvent& event) + { + int n = event.GetInt(); + // printf("CModalDialogImpl::OnWorkerEvent(n=%d)\n",n); + myCreateHandle(n); + } + }; +} +} + +#endif + diff --git a/src/libs/7zip/unix/CPP/Windows/Control/Edit.h b/src/libs/7zip/unix/CPP/Windows/Control/Edit.h new file mode 100644 index 000000000..e6930e5d4 --- /dev/null +++ b/src/libs/7zip/unix/CPP/Windows/Control/Edit.h @@ -0,0 +1,24 @@ +// Windows/Control/Edit.h + +#ifndef __WINDOWS_CONTROL_EDIT_H +#define __WINDOWS_CONTROL_EDIT_H + +#include "Windows/Window.h" +#include "Windows/Defs.h" + +namespace NWindows { +namespace NControl { + +class CEdit: public CWindow +{ +public: + void SetPasswordChar(WPARAM c); + void Show(int cmdShow); + virtual void SetText(LPCWSTR s); + virtual bool GetText(CSysString &s); +}; + +}} + +#endif + diff --git a/src/libs/7zip/unix/CPP/Windows/Control/ListView.h b/src/libs/7zip/unix/CPP/Windows/Control/ListView.h new file mode 100644 index 000000000..149f4a450 --- /dev/null +++ b/src/libs/7zip/unix/CPP/Windows/Control/ListView.h @@ -0,0 +1,164 @@ +// Windows/Control/ListView.h + +#ifndef __WINDOWS_CONTROL_LISTVIEW_H +#define __WINDOWS_CONTROL_LISTVIEW_H + +#include "Windows/Window.h" +#include "Windows/Defs.h" + +/* +#include <commctrl.h> +*/ + +#ifndef _WIN32 + +#define LVCF_FMT 0x0001 +#define LVCF_WIDTH 0x0002 +#define LVCF_TEXT 0x0004 +#define LVCF_SUBITEM 0x0008 +#define LVCF_IMAGE 0x0010 +#define LVCF_ORDER 0x0020 + +#define LVCFMT_LEFT 0x0000 +#define LVCFMT_RIGHT 0x0001 +#define LVCFMT_CENTER 0x0002 +#define LVCFMT_JUSTIFYMASK 0x0003 + + +// state +#define LVIS_FOCUSED 0x0002 /* wxLIST_STATE_FOCUSED */ +#define LVIS_SELECTED 0x0004 /* wxLIST_STATE_SELECTED */ + +#define LVNI_SELECTED 0x0004 /* wxLIST_STATE_SELECTED */ + +typedef INT (CALLBACK *PFNLVCOMPARE)(LPARAM, LPARAM, LPARAM); + +typedef struct tagLVCOLUMNW +{ + UINT mask; + int fmt; + int cx; + LPWSTR pszText; + int cchTextMax; + int iSubItem; + int iOrder; // FIXME +} LVCOLUMNW; + +#define LVCOLUMN LVCOLUMNW +#define LV_COLUMNW LVCOLUMNW /* FIXME */ + + + +typedef struct tagLVITEMW +{ + UINT mask; + int iItem; + int iSubItem; + UINT state; + UINT stateMask; + LPWSTR pszText; + int cchTextMax; + int iImage; + LPARAM lParam; +#if (_WIN32_IE >= 0x0300) + int iIndent; +#endif +#if (_WIN32_WINNT >= 0x501) + int iGroupId; + UINT cColumns; // tile view columns + PUINT puColumns; +#endif +} LVITEMW; + +#define LVITEM LVITEMW + +#define LVIF_TEXT 0x0001 +// FIXME - mask +#define LVIF_PARAM 2 +#define LVIF_IMAGE 4 +#define LVIF_STATE 8 + +#endif + +class wxListCtrl; + +namespace NWindows { +namespace NControl { + +class CListView // : public NWindows::CWindow +{ + wxListCtrl *_list; +public: + CListView() : _list(0) {} + void Attach(wxWindow * newWindow); + + operator HWND() const; + + int GetItemCount() const; + + int InsertItem(int index, LPCTSTR text); + int InsertItem(const LVITEM* item); + + void SetItem(const LVITEM* item); + + int SetSubItem(int index, int subIndex, LPCTSTR text); + + void SetUnicodeFormat(bool fUnicode) { return ; } + + void InsertColumn(int columnIndex, LPCTSTR text, int width); + + void InsertColumn(int columnIndex, const LVCOLUMNW *columnInfo); + + void DeleteAllItems(); + + void SetRedraw(bool); + + void SetItemCount(int ); + + void InvalidateRect(void *, bool); + + int GetSelectedCount() const; + + void /* bool */ EnsureVisible(int index, bool partialOK); + + void SetItemState(int index, UINT state, UINT mask); + + void SetItemState_FocusedSelected(int index) { SetItemState(index, LVIS_FOCUSED | LVIS_SELECTED, LVIS_FOCUSED | LVIS_SELECTED); } + + UINT GetItemState(int index, UINT mask) const; + + void /* bool */ Update(); + + bool DeleteColumn(int columnIndex); + + bool GetItemParam(int itemIndex, LPARAM ¶m) const; + + int GetNextItem(int startIndex, UINT flags) const; + + int GetFocusedItem() const; + + void RedrawAllItems(); + // FIXME added + int GetColumnCount(); + + void SetFocus(); + + void RedrawItem(int item); + + bool SortItems(PFNLVCOMPARE compareFunction, LPARAM dataParam); + + bool GetColumn(int columnIndex, LVCOLUMN* columnInfo); + + // HWND EditLabel(int itemIndex) + void EditLabel(int itemIndex); + + bool SetColumnWidthAuto(int iCol) { + return true; // FIXME SetColumnWidth(iCol, LVSCW_AUTOSIZE); + } + + +}; + +}} +#endif + diff --git a/src/libs/7zip/unix/CPP/Windows/Control/ProgressBar.h b/src/libs/7zip/unix/CPP/Windows/Control/ProgressBar.h new file mode 100644 index 000000000..c7bfa8e8d --- /dev/null +++ b/src/libs/7zip/unix/CPP/Windows/Control/ProgressBar.h @@ -0,0 +1,34 @@ +// Windows/Control/ProgressBar.h + +#ifndef __WINDOWS_CONTROL_PROGRESSBAR_H +#define __WINDOWS_CONTROL_PROGRESSBAR_H + +#include "Windows/Window.h" +#include "Windows/Defs.h" + +class wxGauge; + +namespace NWindows { +namespace NControl { + + +class CProgressBar : public CWindow +{ +protected: + wxGauge* _window; + int _minValue; + int _range; +public: + CProgressBar(wxWindow* newWindow = NULL); + + void Attach(wxWindow* newWindow); + + void SetRange32(int minValue, int maxValue); + + void SetPos(int pos); +}; + +}} + +#endif + diff --git a/src/libs/7zip/unix/CPP/Windows/Control/Static.h b/src/libs/7zip/unix/CPP/Windows/Control/Static.h new file mode 100644 index 000000000..36469c18f --- /dev/null +++ b/src/libs/7zip/unix/CPP/Windows/Control/Static.h @@ -0,0 +1,23 @@ +// Windows/Control/Static.h + +#ifndef __WINDOWS_CONTROL_STATIC_H +#define __WINDOWS_CONTROL_STATIC_H + +#include "Windows/Window.h" +#include "Windows/Defs.h" + +typedef void * HICON; + +namespace NWindows { +namespace NControl { + +class CStatic : public CWindow +{ +public: + + HICON SetIcon(HICON icon) { return 0; } // FIXME +}; + +}} + +#endif diff --git a/src/libs/7zip/unix/CPP/Windows/Control/StatusBar.h b/src/libs/7zip/unix/CPP/Windows/Control/StatusBar.h new file mode 100644 index 000000000..6b4417d10 --- /dev/null +++ b/src/libs/7zip/unix/CPP/Windows/Control/StatusBar.h @@ -0,0 +1,56 @@ +// Windows/Control/StatusBar.h + +#ifndef __WINDOWS_CONTROL_STATUSBAR_H +#define __WINDOWS_CONTROL_STATUSBAR_H + +#include "Windows/Window.h" +#include "Windows/Defs.h" + +class wxStatusBar; + +namespace NWindows { +namespace NControl { + +class CStatusBar // : public NWindows::CWindow +{ + wxStatusBar * _statusBar; +public: + CStatusBar() : _statusBar(0) {} + + void Attach(wxWindow * newWindow); + wxWindow * Detach(); + + void SetText(int index, LPCTSTR text); + +/* FIXME + bool Create(LONG style, LPCTSTR text, HWND hwndParent, UINT id) + { return (_window = ::CreateStatusWindow(style, text, hwndParent, id)) != 0; } + bool SetParts(int numParts, const int *edgePostions) + { return LRESULTToBool(SendMessage(SB_SETPARTS, numParts, (LPARAM)edgePostions)); } + bool SetText(LPCTSTR text) + { return CWindow::SetText(text); } + + bool SetText(int index, LPCTSTR text, UINT type) + { return LRESULTToBool(SendMessage(SB_SETTEXT, index | type, (LPARAM)text)); } + bool SetText(int index, LPCTSTR text) + { return SetText(index, text, 0); } + void Simple(bool simple) + { SendMessage(SB_SIMPLE, BoolToBOOL(simple), 0); } + + #ifndef _UNICODE + bool Create(LONG style, LPCWSTR text, HWND hwndParent, UINT id) + { return (_window = ::CreateStatusWindowW(style, text, hwndParent, id)) != 0; } + bool SetText(LPCWSTR text) + { return CWindow::SetText(text); } + bool SetText(int index, LPCWSTR text, UINT type) + { return LRESULTToBool(SendMessage(SB_SETTEXTW, index | type, (LPARAM)text)); } + bool SetText(int index, LPCWSTR text) + { return SetText(index, text, 0); } + #endif +*/ +}; + +}} + +#endif + diff --git a/src/libs/7zip/unix/CPP/Windows/Control/Window2.cpp b/src/libs/7zip/unix/CPP/Windows/Control/Window2.cpp new file mode 100644 index 000000000..dda1da090 --- /dev/null +++ b/src/libs/7zip/unix/CPP/Windows/Control/Window2.cpp @@ -0,0 +1,211 @@ +// Windows/Control/Window2.cpp + +#include "StdAfx.h" + +#ifndef _UNICODE +#include "Common/StringConvert.h" +#endif +#include "Windows/Control/Window2.h" + +// extern HINSTANCE g_hInstance; +#ifndef _UNICODE +extern bool g_IsNT; +#endif + +namespace NWindows { + +#ifndef _UNICODE +ATOM MyRegisterClass(CONST WNDCLASSW *wndClass); +#endif + +namespace NControl { + +#ifdef _WIN32 +static LRESULT CALLBACK WindowProcedure(HWND aHWND, UINT message, + WPARAM wParam, LPARAM lParam) +{ + CWindow tempWindow(aHWND); + if (message == WM_NCCREATE) + tempWindow.SetUserDataLongPtr( + LONG_PTR(((LPCREATESTRUCT)lParam)->lpCreateParams)); + CWindow2 *window = (CWindow2*)(tempWindow.GetUserDataLongPtr()); + if (window != NULL && message == WM_NCCREATE) + window->Attach(aHWND); + if (window == 0) + { + #ifndef _UNICODE + if (g_IsNT) + return DefWindowProcW(aHWND, message, wParam, lParam); + else + #endif + return DefWindowProc(aHWND, message, wParam, lParam); + } + return window->OnMessage(message, wParam, lParam); +} + +bool CWindow2::CreateEx(DWORD exStyle, LPCTSTR className, + LPCTSTR windowName, DWORD style, + int x, int y, int width, int height, + HWND parentWindow, HMENU idOrHMenu, + HINSTANCE instance) +{ + WNDCLASS windowClass; + if(!::GetClassInfo(instance, className, &windowClass)) + { + // windowClass.style = CS_HREDRAW | CS_VREDRAW; + windowClass.style = 0; + + windowClass.lpfnWndProc = WindowProcedure; + windowClass.cbClsExtra = NULL; + windowClass.cbWndExtra = NULL; + windowClass.hInstance = instance; + windowClass.hIcon = NULL; + windowClass.hCursor = LoadCursor(NULL, IDC_ARROW); + windowClass.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); + windowClass.lpszMenuName = NULL; + windowClass.lpszClassName = className; + if (::RegisterClass(&windowClass) == 0) + return false; + } + return CWindow::CreateEx(exStyle, className, windowName, + style, x, y, width, height, parentWindow, + idOrHMenu, instance, this); +} + +#ifndef _UNICODE + +bool CWindow2::CreateEx(DWORD exStyle, LPCWSTR className, + LPCWSTR windowName, DWORD style, + int x, int y, int width, int height, + HWND parentWindow, HMENU idOrHMenu, + HINSTANCE instance) +{ + bool needRegister; + if(g_IsNT) + { + WNDCLASSW windowClass; + needRegister = ::GetClassInfoW(instance, className, &windowClass) == 0; + } + else + { + WNDCLASSA windowClassA; + AString classNameA; + LPCSTR classNameP; + if (IS_INTRESOURCE(className)) + classNameP = (LPCSTR)className; + else + { + classNameA = GetSystemString(className); + classNameP = classNameA; + } + needRegister = ::GetClassInfoA(instance, classNameP, &windowClassA) == 0; + } + if (needRegister) + { + WNDCLASSW windowClass; + // windowClass.style = CS_HREDRAW | CS_VREDRAW; + windowClass.style = 0; + windowClass.lpfnWndProc = WindowProcedure; + windowClass.cbClsExtra = NULL; + windowClass.cbWndExtra = NULL; + windowClass.hInstance = instance; + windowClass.hIcon = NULL; + windowClass.hCursor = LoadCursor(NULL, IDC_ARROW); + windowClass.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); + windowClass.lpszMenuName = NULL; + windowClass.lpszClassName = className; + if (MyRegisterClass(&windowClass) == 0) + return false; + } + return CWindow::CreateEx(exStyle, className, windowName, + style, x, y, width, height, parentWindow, + idOrHMenu, instance, this); + +} +#endif + +LRESULT CWindow2::DefProc(UINT message, WPARAM wParam, LPARAM lParam) +{ + #ifndef _UNICODE + if (g_IsNT) + return DefWindowProcW(_window, message, wParam, lParam); + else + #endif + return DefWindowProc(_window, message, wParam, lParam); +} +#endif + +LRESULT CWindow2::OnMessage(UINT message, WPARAM wParam, LPARAM lParam) +{ + LRESULT result; + switch (message) + { + case WM_CREATE: + if (!OnCreate((CREATESTRUCT *)lParam)) + return -1; + break; + case WM_COMMAND: + if (OnCommand(wParam, lParam, result)) + return result; + break; + case WM_NOTIFY: + if (OnNotify((UINT)wParam, (LPNMHDR) lParam, result)) + return result; + break; + case WM_DESTROY: + OnDestroy(); + break; + case WM_CLOSE: + OnClose(); + return 0; +#ifdef _WIN32 + case WM_SIZE: + if (OnSize(wParam, LOWORD(lParam), HIWORD(lParam))) + return 0; +#endif + } +#ifdef _WIN32 + return DefProc(message, wParam, lParam); +#else + return 0; +#endif +} + +bool CWindow2::OnCommand(WPARAM wParam, LPARAM lParam, LRESULT &result) +{ + return OnCommand(HIWORD(wParam), LOWORD(wParam), lParam, result); +} + +bool CWindow2::OnCommand(int /* code */, int /* itemID */, LPARAM /* lParam */, LRESULT & /* result */) +{ + return false; + // return DefProc(message, wParam, lParam); + /* + if (code == BN_CLICKED) + return OnButtonClicked(itemID, (HWND)lParam); + */ +} + +/* +bool CDialog::OnButtonClicked(int buttonID, HWND buttonHWND) +{ + switch(aButtonID) + { + case IDOK: + OnOK(); + break; + case IDCANCEL: + OnCancel(); + break; + case IDHELP: + OnHelp(); + break; + default: + return false; + } + return true; +} + +*/ + +}} diff --git a/src/libs/7zip/unix/CPP/Windows/Control/Window2.h b/src/libs/7zip/unix/CPP/Windows/Control/Window2.h new file mode 100644 index 000000000..48c890640 --- /dev/null +++ b/src/libs/7zip/unix/CPP/Windows/Control/Window2.h @@ -0,0 +1,111 @@ +// Windows/Control/Window2.h + +#ifndef __WINDOWS_CONTROL_WINDOW2_H +#define __WINDOWS_CONTROL_WINDOW2_H + +#include "Windows/Window.h" +#include "Windows/Defs.h" + +#ifndef _WIN32 +typedef void * WNDPROC; +typedef void * CREATESTRUCT; +typedef struct +{ + HWND hwndFrom; + + UINT code; +#define NM_DBLCLK 1 +#define LVN_ITEMCHANGED 2 +#define LVN_COLUMNCLICK 3 +#define CBEN_BEGINEDIT 10 +#define CBEN_ENDEDITW 11 + + +} NMHDR; +typedef NMHDR * LPNMHDR; + +typedef struct tagNMLISTVIEW +{ + NMHDR hdr; + INT iItem; + INT iSubItem; + UINT uNewState; + UINT uOldState; + // UINT uChanged; + // POINT ptAction; + LPARAM lParam; +} NMLISTVIEW, *LPNMLISTVIEW; + +typedef void * LPNMITEMACTIVATE; + +#define NM_RCLICK 1234 /* FIXME */ + +// FIXME +#define WM_CREATE 1 +#define WM_COMMAND 2 +#define WM_NOTIFY 3 +#define WM_DESTROY 4 +#define WM_CLOSE 5 + +#define HIWORD(l) ((WORD)((DWORD_PTR)(l) >> 16)) +#define LOWORD(l) ((WORD)((DWORD_PTR)(l) & 0xFFFF)) + + +#endif + +namespace NWindows { +namespace NControl { + +class CWindow2 // : public CWindow +{ + // LRESULT DefProc(UINT message, WPARAM wParam, LPARAM lParam); +public: + // CWindow2(HWND newWindow = NULL): CWindow(newWindow){}; + CWindow2() {} + virtual ~CWindow2() {} + +#ifdef _WIN32 + bool CreateEx(DWORD exStyle, LPCTSTR className, + LPCTSTR windowName, DWORD style, + int x, int y, int width, int height, + HWND parentWindow, HMENU idOrHMenu, + HINSTANCE instance); + + #ifndef _UNICODE + bool CreateEx(DWORD exStyle, LPCWSTR className, + LPCWSTR windowName, DWORD style, + int x, int y, int width, int height, + HWND parentWindow, HMENU idOrHMenu, + HINSTANCE instance); + #endif +#endif + + virtual LRESULT OnMessage(UINT message, WPARAM wParam, LPARAM lParam); + virtual bool OnCreate(CREATESTRUCT * /* createStruct */) { return true; } + // virtual LRESULT OnCommand(WPARAM wParam, LPARAM lParam); + virtual bool OnCommand(WPARAM wParam, LPARAM lParam, LRESULT &result); + virtual bool OnCommand(int code, int itemID, LPARAM lParam, LRESULT &result); + virtual bool OnSize(WPARAM /* wParam */, int /* xSize */, int /* ySize */) { return false; } + virtual bool OnNotify(UINT /* controlID */, LPNMHDR /* lParam */, LRESULT & /* result */) { return false; } + virtual void OnDestroy() { /* FIXME PostQuitMessage(0); */ } + virtual void OnClose() { /* FIXME Destroy(); */ } + /* + virtual LRESULT OnHelp(LPHELPINFO helpInfo) { OnHelp(); }; + virtual LRESULT OnHelp() {}; + virtual bool OnButtonClicked(int buttonID, HWND buttonHWND); + virtual void OnOK() {}; + virtual void OnCancel() {}; + */ + +#ifdef _WIN32 + LONG_PTR SetMsgResult(LONG_PTR newLongPtr ) + { return SetLongPtr(DWLP_MSGRESULT, newLongPtr); } + LONG_PTR GetMsgResult() const + { return GetLongPtr(DWLP_MSGRESULT); } +#endif +}; + +}} + +#endif + |