Files
wxWidgets/src/os2/filedlg.cpp
Vadim Zeitlin 3f66f6a5b3 Remove all lines containing cvs/svn "$Id$" keyword.
This keyword is not expanded by Git which means it's not replaced with the
correct revision value in the releases made using git-based scripts and it's
confusing to have lines with unexpanded "$Id$" in the released files. As
expanding them with Git is not that simple (it could be done with git archive
and export-subst attribute) and there are not many benefits in having them in
the first place, just remove all these lines.

If nothing else, this will make an eventual transition to Git simpler.

Closes #14487.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@74602 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
2013-07-26 16:02:46 +00:00

328 lines
10 KiB
C++

/////////////////////////////////////////////////////////////////////////////
// Name: src/os2/filedlg.cpp
// Purpose: wxFileDialog
// Author: David Webster
// Modified by:
// Created: 10/05/99
// Copyright: (c) David Webster
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
// For compilers that support precompilation, includes "wx.h".
#include "wx/wxprec.h"
#ifdef __BORLANDC__
#pragma hdrstop
#endif
#if wxUSE_FILEDLG
#include "wx/filedlg.h"
#ifndef WX_PRECOMP
#include "wx/utils.h"
#include "wx/msgdlg.h"
#include "wx/filename.h"
#include "wx/intl.h"
#include "wx/log.h"
#include "wx/app.h"
#include "wx/math.h"
#endif
#define INCL_PM
#include <os2.h>
#include "wx/os2/private.h"
#include <stdlib.h>
#include <string.h>
#include "wx/tokenzr.h"
#include "wx/modalhook.h"
#define wxMAXPATH 1024
#define wxMAXFILE 1024
#define wxMAXEXT 5
#ifndef MAXPATH
# define MAXPATH 400
#endif
#ifndef MAXDRIVE
# define MAXDRIVE 3
#endif
#ifndef MAXFILE
# define MAXFILE 9
#endif
#ifndef MAXEXT
# define MAXEXT 5
#endif
IMPLEMENT_CLASS(wxFileDialog, wxFileDialogBase)
// ----------------------------------------------------------------------------
// CLASS wxFileDialog
// ----------------------------------------------------------------------------
wxFileDialog::wxFileDialog (
wxWindow* pParent
, const wxString& rsMessage
, const wxString& rsDefaultDir
, const wxString& rsDefaultFileName
, const wxString& rsWildCard
, long lStyle
, const wxPoint& rPos,
const wxSize& sz,
const wxString& name
)
:wxFileDialogBase(pParent, rsMessage, rsDefaultDir, rsDefaultFileName, rsWildCard, lStyle, rPos, sz, name)
{
// NB: all style checks are done by wxFileDialogBase::Create
m_filterIndex = 1;
} // end of wxFileDialog::wxFileDialog
void wxFileDialog::GetPaths (
wxArrayString& rasPaths
) const
{
wxString sDir(m_dir);
size_t nCount = m_fileNames.GetCount();
rasPaths.Empty();
if (m_dir.Last() != wxT('\\'))
sDir += wxT('\\');
for ( size_t n = 0; n < nCount; n++ )
{
rasPaths.Add(sDir + m_fileNames[n]);
}
} // end of wxFileDialog::GetPaths
int wxFileDialog::ShowModal()
{
WX_HOOK_MODAL_DIALOG();
wxString sTheFilter;
wxString sFilterBuffer;
wxChar* pzFilterBuffer;
static wxChar zFileNameBuffer[wxMAXPATH]; // the file-name
HWND hWnd = 0;
wxChar zTitleBuffer[wxMAXFILE + 1 + wxMAXEXT]; // the file-name, without path
wxString sDir;
size_t i;
size_t nLen = m_dir.length();
int nCount = 0;
FILEDLG vFileDlg;
ULONG lFlags = 0L;
memset(&vFileDlg, '\0', sizeof(FILEDLG));
if (m_parent)
hWnd = (HWND) m_parent->GetHWND();
if (!hWnd && wxTheApp->GetTopWindow())
hWnd = (HWND) wxTheApp->GetTopWindow()->GetHWND();
*zFileNameBuffer = wxT('\0');
*zTitleBuffer = wxT('\0');
if (m_windowStyle & wxFD_SAVE)
lFlags = FDS_SAVEAS_DIALOG;
else
lFlags = FDS_OPEN_DIALOG;
if (m_windowStyle & wxFD_SAVE)
lFlags |= FDS_SAVEAS_DIALOG;
if (m_windowStyle & wxFD_MULTIPLE)
lFlags |= FDS_OPEN_DIALOG | FDS_MULTIPLESEL;
vFileDlg.cbSize = sizeof(FILEDLG);
vFileDlg.fl = lFlags;
vFileDlg.pszTitle = (PSZ)zTitleBuffer;
//
// Convert forward slashes to backslashes (file selector doesn't like
// forward slashes) and also squeeze multiple consecutive slashes into one
// as it doesn't like two backslashes in a row neither
//
sDir.reserve(nLen);
for ( i = 0; i < nLen; i++ )
{
wxChar ch = m_dir[i];
switch (ch)
{
case wxT('/'):
//
// Convert to backslash
//
ch = wxT('\\');
//
// Fall through
//
case wxT('\\'):
while (i < nLen - 1)
{
wxChar chNext = m_dir[i + 1];
if (chNext != wxT('\\') && chNext != wxT('/'))
break;
//
// Ignore the next one, unless it is at the start of a UNC path
//
if (i > 0)
i++;
else
break;
}
//
// Fall through
//
default:
//
// Normal char
sDir += ch;
}
}
if ( wxStrlen(m_wildCard) == 0 )
sTheFilter = wxEmptyString;
else
sTheFilter = m_wildCard;
wxStrtok(sTheFilter.wchar_str(), wxT("|"), &pzFilterBuffer);
while(pzFilterBuffer != NULL)
{
if (nCount > 0 && !(nCount % 2))
sDir += wxT(";");
if (nCount % 2)
{
sDir += pzFilterBuffer;
}
wxStrtok(NULL, wxT("|"), &pzFilterBuffer);
nCount++;
}
if (nCount == 0)
sDir += m_fileName;
if (sDir.empty())
sDir = wxT("*.*");
wxStrcpy((wxChar*)vFileDlg.szFullFile, sDir);
sFilterBuffer = sDir;
hWnd = ::WinFileDlg( HWND_DESKTOP
,GetHwndOf(m_parent)
,&vFileDlg
);
if (hWnd && vFileDlg.lReturn == DID_OK)
{
m_fileNames.Empty();
if ((m_windowStyle & wxFD_MULTIPLE ) && vFileDlg.ulFQFCount > 1)
{
for (int i = 0; i < (int)vFileDlg.ulFQFCount; i++)
{
if (i == 0)
{
m_dir = wxPathOnly(wxString((const wxChar*)*vFileDlg.papszFQFilename[0]));
m_path = (const wxChar*)*vFileDlg.papszFQFilename[0];
}
m_fileName = wxFileNameFromPath(wxString((const wxChar*)*vFileDlg.papszFQFilename[i]));
m_fileNames.Add(m_fileName);
}
::WinFreeFileDlgList(vFileDlg.papszFQFilename);
}
else if (!(m_windowStyle & wxFD_SAVE))
{
m_path = (wxChar*)vFileDlg.szFullFile;
m_fileName = wxFileNameFromPath(wxString((const wxChar*)vFileDlg.szFullFile));
m_dir = wxPathOnly((const wxChar*)vFileDlg.szFullFile);
}
else // save file
{
const wxChar* pzExtension = NULL;
wxStrcpy(zFileNameBuffer, (const wxChar*)vFileDlg.szFullFile);
int nIdx = wxStrlen(zFileNameBuffer) - 1;
wxString sExt;
wxFileName::SplitPath( zFileNameBuffer
,&m_path
,&m_fileName
,&sExt
);
if (zFileNameBuffer[nIdx] == wxT('.') || sExt.empty())
{
zFileNameBuffer[nIdx] = wxT('\0');
//
// User has typed a filename without an extension:
//
// A filename can end in a "." here ("abc."), this means it
// does not have an extension. Because later on a "." with
// the default extension is appended we remove the "." if
// filename ends with one (We don't want files called
// "abc..ext")
//
pzExtension = sFilterBuffer.c_str();
for( int i = 0; i < (int)sFilterBuffer.length(); i++ )
{
//
// Get extension
//
pzExtension = wxStrrchr(pzExtension, wxT('.'));
if ( pzExtension &&
!wxStrrchr(pzExtension, wxT('*')) &&
!wxStrrchr(pzExtension, wxT('?')) &&
pzExtension[1] &&
pzExtension[1] != wxT(' ')
) // != "blabla. "
{
//
// Now concat extension to the fileName:
//
m_path = wxString(zFileNameBuffer) + pzExtension;
}
}
}
else
{
m_path = (wxChar*)vFileDlg.szFullFile;
}
m_fileName = wxFileNameFromPath((const wxChar*)vFileDlg.szFullFile);
m_dir = wxPathOnly((const wxChar*)vFileDlg.szFullFile);
//
// === Simulating the wxFD_OVERWRITE_PROMPT >>============================
//
if ((m_windowStyle & wxFD_OVERWRITE_PROMPT) &&
(m_windowStyle & wxFD_SAVE) &&
(wxFileExists(m_path.c_str())))
{
wxString sMessageText;
sMessageText.Printf( _("File '%s' already exists.\nDo you want to replace it?")
,m_path.c_str()
);
if (wxMessageBox( sMessageText
,wxT("Save File As")
,wxYES_NO | wxICON_EXCLAMATION
) != wxYES)
{
return wxID_CANCEL;
}
}
}
return wxID_OK;
}
return wxID_CANCEL;
} // end of wxFileDialog::ShowModal
#endif // wxUSE_FILEDLG