added support for file types popup upon save, an Get/SetFilterIndex
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/branches/WX_2_4_BRANCH@17662 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -48,9 +48,11 @@ extern bool gUseNavServices ;
|
|||||||
|
|
||||||
struct OpenUserDataRec {
|
struct OpenUserDataRec {
|
||||||
int currentfilter ;
|
int currentfilter ;
|
||||||
|
bool saveMode ;
|
||||||
wxArrayString name ;
|
wxArrayString name ;
|
||||||
wxArrayString extensions ;
|
wxArrayString extensions ;
|
||||||
wxArrayLong filtermactypes ;
|
wxArrayLong filtermactypes ;
|
||||||
|
NavMenuItemSpecArrayHandle menuitems ;
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct OpenUserDataRec
|
typedef struct OpenUserDataRec
|
||||||
@@ -73,23 +75,40 @@ NavEventProc(
|
|||||||
NavCBRecPtr ioParams,
|
NavCBRecPtr ioParams,
|
||||||
NavCallBackUserData ioUserData )
|
NavCallBackUserData ioUserData )
|
||||||
{
|
{
|
||||||
OpenUserDataRec * data = ( OpenUserDataRec *) ioUserData ;
|
OpenUserDataRec * data = ( OpenUserDataRec *) ioUserData ;
|
||||||
if (inSelector == kNavCBEvent) {
|
if (inSelector == kNavCBEvent) {
|
||||||
// In Universal Headers 3.2, Apple changed the definition of
|
|
||||||
/*
|
|
||||||
#if UNIVERSAL_INTERFACES_VERSION >= 0x0320 // Universal Headers 3.2
|
|
||||||
UModalAlerts::ProcessModalEvent(*(ioParams->eventData.eventDataParms.event));
|
|
||||||
|
|
||||||
#else
|
|
||||||
UModalAlerts::ProcessModalEvent(*(ioParams->eventData.event));
|
|
||||||
#endif
|
|
||||||
*/
|
|
||||||
|
|
||||||
wxTheApp->MacHandleOneEvent(ioParams->eventData.eventDataParms.event);
|
wxTheApp->MacHandleOneEvent(ioParams->eventData.eventDataParms.event);
|
||||||
} else if ( inSelector == kNavCBPopupMenuSelect )
|
}
|
||||||
|
else if ( inSelector == kNavCBStart )
|
||||||
{
|
{
|
||||||
NavMenuItemSpec * menu = (NavMenuItemSpec *) ioParams->eventData.eventDataParms.param ;
|
if ( data->menuitems )
|
||||||
data->currentfilter = menu->menuType ;
|
NavCustomControl(ioParams->context, kNavCtlSelectCustomType, &(*data->menuitems)[data->currentfilter]);
|
||||||
|
}
|
||||||
|
else if ( inSelector == kNavCBPopupMenuSelect )
|
||||||
|
{
|
||||||
|
NavMenuItemSpec * menu = (NavMenuItemSpec *) ioParams->eventData.eventDataParms.param ;
|
||||||
|
if ( menu->menuCreator == 'WXNG' )
|
||||||
|
{
|
||||||
|
data->currentfilter = menu->menuType ;
|
||||||
|
if ( data->saveMode )
|
||||||
|
{
|
||||||
|
int i = menu->menuType ;
|
||||||
|
wxString extension = data->extensions[i].AfterLast('.') ;
|
||||||
|
extension.MakeLower() ;
|
||||||
|
Str255 filename ;
|
||||||
|
// get the current filename
|
||||||
|
NavCustomControl(ioParams->context, kNavCtlGetEditFileName, &filename);
|
||||||
|
CopyPascalStringToC( filename , (char*) filename ) ;
|
||||||
|
wxString sfilename( filename ) ;
|
||||||
|
int pos = sfilename.Find('.',TRUE) ;
|
||||||
|
if ( pos != wxNOT_FOUND )
|
||||||
|
{
|
||||||
|
sfilename = sfilename.Left(pos+1)+extension ;
|
||||||
|
CopyCStringToPascal( sfilename.c_str() , filename ) ;
|
||||||
|
NavCustomControl(ioParams->context, kNavCtlSetEditFileName, &filename);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -115,8 +134,10 @@ OSType gfiltersmac[] =
|
|||||||
|
|
||||||
void MakeUserDataRec(OpenUserDataRec *myData , const wxString& filter )
|
void MakeUserDataRec(OpenUserDataRec *myData , const wxString& filter )
|
||||||
{
|
{
|
||||||
myData->currentfilter = 0 ;
|
myData->menuitems = NULL ;
|
||||||
|
myData->currentfilter = 0 ;
|
||||||
|
myData->saveMode = FALSE ;
|
||||||
|
|
||||||
if ( filter && filter[0] )
|
if ( filter && filter[0] )
|
||||||
{
|
{
|
||||||
wxString filter2(filter) ;
|
wxString filter2(filter) ;
|
||||||
@@ -310,7 +331,7 @@ wxFileDialog::wxFileDialog(wxWindow *parent, const wxString& message,
|
|||||||
const wxString& defaultDir, const wxString& defaultFileName, const wxString& wildCard,
|
const wxString& defaultDir, const wxString& defaultFileName, const wxString& wildCard,
|
||||||
long style, const wxPoint& pos)
|
long style, const wxPoint& pos)
|
||||||
{
|
{
|
||||||
wxASSERT_MSG( NavServicesAvailable() , "Navigation Services are not running" ) ;
|
wxASSERT_MSG( NavServicesAvailable() , "Navigation Services are not running" ) ;
|
||||||
m_message = message;
|
m_message = message;
|
||||||
m_dialogStyle = style;
|
m_dialogStyle = style;
|
||||||
m_parent = parent;
|
m_parent = parent;
|
||||||
@@ -318,7 +339,7 @@ wxFileDialog::wxFileDialog(wxWindow *parent, const wxString& message,
|
|||||||
m_fileName = defaultFileName;
|
m_fileName = defaultFileName;
|
||||||
m_dir = defaultDir;
|
m_dir = defaultDir;
|
||||||
m_wildCard = wildCard;
|
m_wildCard = wildCard;
|
||||||
m_filterIndex = 1;
|
m_filterIndex = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -404,10 +425,30 @@ int wxFileDialog::ShowModal()
|
|||||||
c2pstr((char *)mNavOptions.savedFileName ) ;
|
c2pstr((char *)mNavOptions.savedFileName ) ;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
OpenUserDataRec myData;
|
||||||
|
MakeUserDataRec( &myData , m_wildCard ) ;
|
||||||
|
myData.currentfilter = m_filterIndex ;
|
||||||
|
if ( myData.extensions.GetCount() > 0 )
|
||||||
|
{
|
||||||
|
mNavOptions.popupExtension = (NavMenuItemSpecArrayHandle) NewHandle( sizeof( NavMenuItemSpec ) * myData.extensions.GetCount() ) ;
|
||||||
|
myData.menuitems = mNavOptions.popupExtension ;
|
||||||
|
for ( int i = 0 ; i < myData.extensions.GetCount() ; ++i )
|
||||||
|
{
|
||||||
|
(*mNavOptions.popupExtension)[i].version = kNavMenuItemSpecVersion ;
|
||||||
|
(*mNavOptions.popupExtension)[i].menuCreator = 'WXNG' ;
|
||||||
|
(*mNavOptions.popupExtension)[i].menuType = i ;
|
||||||
|
#if TARGET_CARBON
|
||||||
|
c2pstrcpy((StringPtr)(*mNavOptions.popupExtension)[i].menuItemName, myData.name[i]) ;
|
||||||
|
#else
|
||||||
|
strcpy((char *)(*mNavOptions.popupExtension)[i].menuItemName, myData.name[i]) ;
|
||||||
|
c2pstr((char *)(*mNavOptions.popupExtension)[i].menuItemName ) ;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
if ( m_dialogStyle & wxSAVE )
|
if ( m_dialogStyle & wxSAVE )
|
||||||
{
|
{
|
||||||
|
myData.saveMode = true ;
|
||||||
mNavOptions.dialogOptionFlags |= kNavNoTypePopup ;
|
|
||||||
mNavOptions.dialogOptionFlags |= kNavDontAutoTranslate ;
|
mNavOptions.dialogOptionFlags |= kNavDontAutoTranslate ;
|
||||||
mNavOptions.dialogOptionFlags |= kNavDontAddTranslateItems ;
|
mNavOptions.dialogOptionFlags |= kNavDontAddTranslateItems ;
|
||||||
|
|
||||||
@@ -416,34 +457,16 @@ int wxFileDialog::ShowModal()
|
|||||||
&mNavReply,
|
&mNavReply,
|
||||||
&mNavOptions,
|
&mNavOptions,
|
||||||
sStandardNavEventFilter ,
|
sStandardNavEventFilter ,
|
||||||
'TEXT',
|
NULL,
|
||||||
'TEXT',
|
kNavGenericSignature,
|
||||||
0L); // User Data
|
&myData); // User Data
|
||||||
|
m_filterIndex = myData.currentfilter ;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
OpenUserDataRec myData;
|
myData.saveMode = false ;
|
||||||
MakeUserDataRec( &myData , m_wildCard ) ;
|
|
||||||
NavTypeListHandle typelist = NULL ;
|
|
||||||
|
|
||||||
if ( myData.extensions.GetCount() > 0 )
|
mNavFilterUPP = NewNavObjectFilterUPP( CrossPlatformFilterCallback ) ;
|
||||||
{
|
|
||||||
mNavOptions.popupExtension = (NavMenuItemSpecArrayHandle) NewHandle( sizeof( NavMenuItemSpec ) * myData.extensions.GetCount() ) ;
|
|
||||||
const size_t extCount = myData.extensions.GetCount();
|
|
||||||
for ( size_t i = 0 ; i < extCount; ++i ) {
|
|
||||||
(*mNavOptions.popupExtension)[i].version = kNavMenuItemSpecVersion ;
|
|
||||||
(*mNavOptions.popupExtension)[i].menuCreator = 'WXNG' ;
|
|
||||||
(*mNavOptions.popupExtension)[i].menuType = i ;
|
|
||||||
#if TARGET_CARBON
|
|
||||||
c2pstrcpy((StringPtr)(*mNavOptions.popupExtension)[i].menuItemName, myData.name[i]) ;
|
|
||||||
#else
|
|
||||||
strcpy((char *)(*mNavOptions.popupExtension)[i].menuItemName, myData.name[i]) ;
|
|
||||||
c2pstr((char *)(*mNavOptions.popupExtension)[i].menuItemName ) ;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
mNavFilterUPP = NewNavObjectFilterUPP( CrossPlatformFilterCallback ) ;
|
|
||||||
if ( m_dialogStyle & wxMULTIPLE )
|
if ( m_dialogStyle & wxMULTIPLE )
|
||||||
mNavOptions.dialogOptionFlags |= kNavAllowMultipleFiles ;
|
mNavOptions.dialogOptionFlags |= kNavAllowMultipleFiles ;
|
||||||
else
|
else
|
||||||
@@ -456,10 +479,9 @@ int wxFileDialog::ShowModal()
|
|||||||
sStandardNavEventFilter ,
|
sStandardNavEventFilter ,
|
||||||
mNavPreviewUPP,
|
mNavPreviewUPP,
|
||||||
mNavFilterUPP,
|
mNavFilterUPP,
|
||||||
typelist /*inFileTypes.TypeListHandle() */,
|
NULL ,
|
||||||
&myData); // User Data
|
&myData);
|
||||||
if ( typelist )
|
m_filterIndex = myData.currentfilter ;
|
||||||
DisposeHandle( (Handle) typelist ) ;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
DisposeNavObjectFilterUPP(mNavFilterUPP);
|
DisposeNavObjectFilterUPP(mNavFilterUPP);
|
||||||
|
@@ -48,9 +48,11 @@ extern bool gUseNavServices ;
|
|||||||
|
|
||||||
struct OpenUserDataRec {
|
struct OpenUserDataRec {
|
||||||
int currentfilter ;
|
int currentfilter ;
|
||||||
|
bool saveMode ;
|
||||||
wxArrayString name ;
|
wxArrayString name ;
|
||||||
wxArrayString extensions ;
|
wxArrayString extensions ;
|
||||||
wxArrayLong filtermactypes ;
|
wxArrayLong filtermactypes ;
|
||||||
|
NavMenuItemSpecArrayHandle menuitems ;
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct OpenUserDataRec
|
typedef struct OpenUserDataRec
|
||||||
@@ -73,23 +75,40 @@ NavEventProc(
|
|||||||
NavCBRecPtr ioParams,
|
NavCBRecPtr ioParams,
|
||||||
NavCallBackUserData ioUserData )
|
NavCallBackUserData ioUserData )
|
||||||
{
|
{
|
||||||
OpenUserDataRec * data = ( OpenUserDataRec *) ioUserData ;
|
OpenUserDataRec * data = ( OpenUserDataRec *) ioUserData ;
|
||||||
if (inSelector == kNavCBEvent) {
|
if (inSelector == kNavCBEvent) {
|
||||||
// In Universal Headers 3.2, Apple changed the definition of
|
|
||||||
/*
|
|
||||||
#if UNIVERSAL_INTERFACES_VERSION >= 0x0320 // Universal Headers 3.2
|
|
||||||
UModalAlerts::ProcessModalEvent(*(ioParams->eventData.eventDataParms.event));
|
|
||||||
|
|
||||||
#else
|
|
||||||
UModalAlerts::ProcessModalEvent(*(ioParams->eventData.event));
|
|
||||||
#endif
|
|
||||||
*/
|
|
||||||
|
|
||||||
wxTheApp->MacHandleOneEvent(ioParams->eventData.eventDataParms.event);
|
wxTheApp->MacHandleOneEvent(ioParams->eventData.eventDataParms.event);
|
||||||
} else if ( inSelector == kNavCBPopupMenuSelect )
|
}
|
||||||
|
else if ( inSelector == kNavCBStart )
|
||||||
{
|
{
|
||||||
NavMenuItemSpec * menu = (NavMenuItemSpec *) ioParams->eventData.eventDataParms.param ;
|
if ( data->menuitems )
|
||||||
data->currentfilter = menu->menuType ;
|
NavCustomControl(ioParams->context, kNavCtlSelectCustomType, &(*data->menuitems)[data->currentfilter]);
|
||||||
|
}
|
||||||
|
else if ( inSelector == kNavCBPopupMenuSelect )
|
||||||
|
{
|
||||||
|
NavMenuItemSpec * menu = (NavMenuItemSpec *) ioParams->eventData.eventDataParms.param ;
|
||||||
|
if ( menu->menuCreator == 'WXNG' )
|
||||||
|
{
|
||||||
|
data->currentfilter = menu->menuType ;
|
||||||
|
if ( data->saveMode )
|
||||||
|
{
|
||||||
|
int i = menu->menuType ;
|
||||||
|
wxString extension = data->extensions[i].AfterLast('.') ;
|
||||||
|
extension.MakeLower() ;
|
||||||
|
Str255 filename ;
|
||||||
|
// get the current filename
|
||||||
|
NavCustomControl(ioParams->context, kNavCtlGetEditFileName, &filename);
|
||||||
|
CopyPascalStringToC( filename , (char*) filename ) ;
|
||||||
|
wxString sfilename( filename ) ;
|
||||||
|
int pos = sfilename.Find('.',TRUE) ;
|
||||||
|
if ( pos != wxNOT_FOUND )
|
||||||
|
{
|
||||||
|
sfilename = sfilename.Left(pos+1)+extension ;
|
||||||
|
CopyCStringToPascal( sfilename.c_str() , filename ) ;
|
||||||
|
NavCustomControl(ioParams->context, kNavCtlSetEditFileName, &filename);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -115,8 +134,10 @@ OSType gfiltersmac[] =
|
|||||||
|
|
||||||
void MakeUserDataRec(OpenUserDataRec *myData , const wxString& filter )
|
void MakeUserDataRec(OpenUserDataRec *myData , const wxString& filter )
|
||||||
{
|
{
|
||||||
myData->currentfilter = 0 ;
|
myData->menuitems = NULL ;
|
||||||
|
myData->currentfilter = 0 ;
|
||||||
|
myData->saveMode = FALSE ;
|
||||||
|
|
||||||
if ( filter && filter[0] )
|
if ( filter && filter[0] )
|
||||||
{
|
{
|
||||||
wxString filter2(filter) ;
|
wxString filter2(filter) ;
|
||||||
@@ -310,7 +331,7 @@ wxFileDialog::wxFileDialog(wxWindow *parent, const wxString& message,
|
|||||||
const wxString& defaultDir, const wxString& defaultFileName, const wxString& wildCard,
|
const wxString& defaultDir, const wxString& defaultFileName, const wxString& wildCard,
|
||||||
long style, const wxPoint& pos)
|
long style, const wxPoint& pos)
|
||||||
{
|
{
|
||||||
wxASSERT_MSG( NavServicesAvailable() , "Navigation Services are not running" ) ;
|
wxASSERT_MSG( NavServicesAvailable() , "Navigation Services are not running" ) ;
|
||||||
m_message = message;
|
m_message = message;
|
||||||
m_dialogStyle = style;
|
m_dialogStyle = style;
|
||||||
m_parent = parent;
|
m_parent = parent;
|
||||||
@@ -318,7 +339,7 @@ wxFileDialog::wxFileDialog(wxWindow *parent, const wxString& message,
|
|||||||
m_fileName = defaultFileName;
|
m_fileName = defaultFileName;
|
||||||
m_dir = defaultDir;
|
m_dir = defaultDir;
|
||||||
m_wildCard = wildCard;
|
m_wildCard = wildCard;
|
||||||
m_filterIndex = 1;
|
m_filterIndex = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -404,10 +425,30 @@ int wxFileDialog::ShowModal()
|
|||||||
c2pstr((char *)mNavOptions.savedFileName ) ;
|
c2pstr((char *)mNavOptions.savedFileName ) ;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
OpenUserDataRec myData;
|
||||||
|
MakeUserDataRec( &myData , m_wildCard ) ;
|
||||||
|
myData.currentfilter = m_filterIndex ;
|
||||||
|
if ( myData.extensions.GetCount() > 0 )
|
||||||
|
{
|
||||||
|
mNavOptions.popupExtension = (NavMenuItemSpecArrayHandle) NewHandle( sizeof( NavMenuItemSpec ) * myData.extensions.GetCount() ) ;
|
||||||
|
myData.menuitems = mNavOptions.popupExtension ;
|
||||||
|
for ( int i = 0 ; i < myData.extensions.GetCount() ; ++i )
|
||||||
|
{
|
||||||
|
(*mNavOptions.popupExtension)[i].version = kNavMenuItemSpecVersion ;
|
||||||
|
(*mNavOptions.popupExtension)[i].menuCreator = 'WXNG' ;
|
||||||
|
(*mNavOptions.popupExtension)[i].menuType = i ;
|
||||||
|
#if TARGET_CARBON
|
||||||
|
c2pstrcpy((StringPtr)(*mNavOptions.popupExtension)[i].menuItemName, myData.name[i]) ;
|
||||||
|
#else
|
||||||
|
strcpy((char *)(*mNavOptions.popupExtension)[i].menuItemName, myData.name[i]) ;
|
||||||
|
c2pstr((char *)(*mNavOptions.popupExtension)[i].menuItemName ) ;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
if ( m_dialogStyle & wxSAVE )
|
if ( m_dialogStyle & wxSAVE )
|
||||||
{
|
{
|
||||||
|
myData.saveMode = true ;
|
||||||
mNavOptions.dialogOptionFlags |= kNavNoTypePopup ;
|
|
||||||
mNavOptions.dialogOptionFlags |= kNavDontAutoTranslate ;
|
mNavOptions.dialogOptionFlags |= kNavDontAutoTranslate ;
|
||||||
mNavOptions.dialogOptionFlags |= kNavDontAddTranslateItems ;
|
mNavOptions.dialogOptionFlags |= kNavDontAddTranslateItems ;
|
||||||
|
|
||||||
@@ -416,34 +457,16 @@ int wxFileDialog::ShowModal()
|
|||||||
&mNavReply,
|
&mNavReply,
|
||||||
&mNavOptions,
|
&mNavOptions,
|
||||||
sStandardNavEventFilter ,
|
sStandardNavEventFilter ,
|
||||||
'TEXT',
|
NULL,
|
||||||
'TEXT',
|
kNavGenericSignature,
|
||||||
0L); // User Data
|
&myData); // User Data
|
||||||
|
m_filterIndex = myData.currentfilter ;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
OpenUserDataRec myData;
|
myData.saveMode = false ;
|
||||||
MakeUserDataRec( &myData , m_wildCard ) ;
|
|
||||||
NavTypeListHandle typelist = NULL ;
|
|
||||||
|
|
||||||
if ( myData.extensions.GetCount() > 0 )
|
mNavFilterUPP = NewNavObjectFilterUPP( CrossPlatformFilterCallback ) ;
|
||||||
{
|
|
||||||
mNavOptions.popupExtension = (NavMenuItemSpecArrayHandle) NewHandle( sizeof( NavMenuItemSpec ) * myData.extensions.GetCount() ) ;
|
|
||||||
const size_t extCount = myData.extensions.GetCount();
|
|
||||||
for ( size_t i = 0 ; i < extCount; ++i ) {
|
|
||||||
(*mNavOptions.popupExtension)[i].version = kNavMenuItemSpecVersion ;
|
|
||||||
(*mNavOptions.popupExtension)[i].menuCreator = 'WXNG' ;
|
|
||||||
(*mNavOptions.popupExtension)[i].menuType = i ;
|
|
||||||
#if TARGET_CARBON
|
|
||||||
c2pstrcpy((StringPtr)(*mNavOptions.popupExtension)[i].menuItemName, myData.name[i]) ;
|
|
||||||
#else
|
|
||||||
strcpy((char *)(*mNavOptions.popupExtension)[i].menuItemName, myData.name[i]) ;
|
|
||||||
c2pstr((char *)(*mNavOptions.popupExtension)[i].menuItemName ) ;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
mNavFilterUPP = NewNavObjectFilterUPP( CrossPlatformFilterCallback ) ;
|
|
||||||
if ( m_dialogStyle & wxMULTIPLE )
|
if ( m_dialogStyle & wxMULTIPLE )
|
||||||
mNavOptions.dialogOptionFlags |= kNavAllowMultipleFiles ;
|
mNavOptions.dialogOptionFlags |= kNavAllowMultipleFiles ;
|
||||||
else
|
else
|
||||||
@@ -456,10 +479,9 @@ int wxFileDialog::ShowModal()
|
|||||||
sStandardNavEventFilter ,
|
sStandardNavEventFilter ,
|
||||||
mNavPreviewUPP,
|
mNavPreviewUPP,
|
||||||
mNavFilterUPP,
|
mNavFilterUPP,
|
||||||
typelist /*inFileTypes.TypeListHandle() */,
|
NULL ,
|
||||||
&myData); // User Data
|
&myData);
|
||||||
if ( typelist )
|
m_filterIndex = myData.currentfilter ;
|
||||||
DisposeHandle( (Handle) typelist ) ;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
DisposeNavObjectFilterUPP(mNavFilterUPP);
|
DisposeNavObjectFilterUPP(mNavFilterUPP);
|
||||||
|
Reference in New Issue
Block a user