made the interface more compatible with the MSW version (although
InsertPage and wxEVT_PAGE_CHANGING are still not implemented) and implemented the wxEVT_PAGE_CHANGED callback. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@146 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -5,7 +5,7 @@
|
|||||||
// Modified by:
|
// Modified by:
|
||||||
// RCS-ID: $Id$
|
// RCS-ID: $Id$
|
||||||
// Copyright: (c) Julian Smart and Markus Holzem
|
// Copyright: (c) Julian Smart and Markus Holzem
|
||||||
// Licence: wxWindows license
|
// Licence: wxWindows license
|
||||||
/////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
#ifndef __TABCTRLH__
|
#ifndef __TABCTRLH__
|
||||||
@@ -28,79 +28,158 @@ class wxImageList;
|
|||||||
class wxNotebook;
|
class wxNotebook;
|
||||||
class wxNotebookPage;
|
class wxNotebookPage;
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
// global data
|
// notebook events
|
||||||
//-----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
|
class wxNotebookEvent : public wxCommandEvent
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
wxNotebookEvent(WXTYPE commandType = 0, int id = 0,
|
||||||
|
int nSel = -1, int nOldSel = -1)
|
||||||
|
: wxCommandEvent(commandType, id) { m_nSel = nSel; m_nOldSel = nOldSel; }
|
||||||
|
|
||||||
|
// accessors
|
||||||
|
int GetSelection() const { return m_nSel; }
|
||||||
|
int GetOldSelection() const { return m_nOldSel; }
|
||||||
|
|
||||||
|
private:
|
||||||
|
int m_nSel, // currently selected page
|
||||||
|
m_nOldSel; // previously selected page
|
||||||
|
|
||||||
|
DECLARE_DYNAMIC_CLASS(wxNotebookEvent)
|
||||||
|
};
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// wxNotebook
|
// wxNotebook
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
class wxNotebook: public wxControl
|
class wxNotebook : public wxControl
|
||||||
{
|
{
|
||||||
|
public:
|
||||||
|
// ctors
|
||||||
|
// -----
|
||||||
|
// default for dynamic class
|
||||||
|
wxNotebook();
|
||||||
|
// the same arguments as for wxControl (@@@ any special styles?)
|
||||||
|
wxNotebook(wxWindow *parent,
|
||||||
|
const wxWindowID id,
|
||||||
|
const wxPoint& pos = wxDefaultPosition,
|
||||||
|
const wxSize& size = wxDefaultSize,
|
||||||
|
const long style = 0,
|
||||||
|
const wxString& name = "notebook");
|
||||||
|
// Create() function
|
||||||
|
bool Create(wxWindow *parent,
|
||||||
|
const wxWindowID id,
|
||||||
|
const wxPoint& pos = wxDefaultPosition,
|
||||||
|
const wxSize& size = wxDefaultSize,
|
||||||
|
const long style = 0,
|
||||||
|
const wxString& name = "notebook");
|
||||||
|
// dtor
|
||||||
|
~wxNotebook();
|
||||||
|
|
||||||
|
// accessors
|
||||||
|
// ---------
|
||||||
|
// get number of pages in the dialog
|
||||||
|
int GetPageCount() const;
|
||||||
|
|
||||||
|
// set the currently selected page, return the index of the previously
|
||||||
|
// selected one (or -1 on error)
|
||||||
|
// NB: this function will _not_ generate wxEVT_NOTEBOOK_PAGE_xxx events
|
||||||
|
int SetSelection(int nPage);
|
||||||
|
// cycle thru the tabs
|
||||||
|
void AdvanceSelection(bool bForward = TRUE);
|
||||||
|
// get the currently selected page
|
||||||
|
int GetSelection() const;
|
||||||
|
|
||||||
|
// set/get the title of a page
|
||||||
|
bool SetPageText(int nPage, const wxString& strText);
|
||||||
|
wxString GetPageText(int nPage) const;
|
||||||
|
|
||||||
|
// image list stuff: each page may have an image associated with it. All
|
||||||
|
// the images belong to an image list, so you have to
|
||||||
|
// 1) create an image list
|
||||||
|
// 2) associate it with the notebook
|
||||||
|
// 3) set for each page it's image
|
||||||
|
// associate image list with a control
|
||||||
|
void SetImageList(wxImageList* imageList);
|
||||||
|
// get pointer (may be NULL) to the associated image list
|
||||||
|
wxImageList* GetImageList() const { return m_imageList; }
|
||||||
|
|
||||||
|
// sets/returns item's image index in the current image list
|
||||||
|
int GetPageImage(int nPage) const;
|
||||||
|
bool SetPageImage(int nPage, int nImage);
|
||||||
|
|
||||||
|
// currently it's always 1 because wxGTK doesn't support multi-row
|
||||||
|
// tab controls
|
||||||
|
int GetRowCount() const;
|
||||||
|
|
||||||
|
// control the appearance of the notebook pages
|
||||||
|
// set the size (the same for all pages)
|
||||||
|
void SetPageSize(const wxSize& size);
|
||||||
|
// set the padding between tabs (in pixels)
|
||||||
|
void SetPadding(const wxSize& padding);
|
||||||
|
|
||||||
|
// operations
|
||||||
|
// ----------
|
||||||
|
// remove one page from the notebook
|
||||||
|
bool DeletePage(int nPage);
|
||||||
|
// remove all pages
|
||||||
|
bool DeleteAllPages();
|
||||||
|
// adds a new page to the notebook (it will be deleted ny the notebook,
|
||||||
|
// don't delete it yourself). If bSelect, this page becomes active.
|
||||||
|
bool AddPage(wxWindow *pPage,
|
||||||
|
const wxString& strText,
|
||||||
|
bool bSelect = FALSE,
|
||||||
|
int imageId = -1);
|
||||||
|
// @@@@ VZ: I don't know how to implement InsertPage()
|
||||||
|
|
||||||
|
// get the panel which represents the given page
|
||||||
|
wxWindow *GetPage(int nPage) const;
|
||||||
|
|
||||||
|
// base class virtuals
|
||||||
|
virtual void AddChild(wxWindow *child);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
// wxWin callbacks
|
||||||
|
void OnSize(wxSizeEvent& event);
|
||||||
|
|
||||||
|
private:
|
||||||
|
// common part of all ctors
|
||||||
|
void Init();
|
||||||
|
|
||||||
|
// helper function
|
||||||
|
wxNotebookPage* GetNotebookPage(int page) const;
|
||||||
|
|
||||||
|
wxImageList* m_imageList;
|
||||||
|
wxList m_pages;
|
||||||
|
uint m_idHandler; // the change page handler id
|
||||||
|
|
||||||
DECLARE_DYNAMIC_CLASS(wxNotebook)
|
DECLARE_DYNAMIC_CLASS(wxNotebook)
|
||||||
|
|
||||||
public:
|
|
||||||
|
|
||||||
wxNotebook(void);
|
|
||||||
wxNotebook( wxWindow *parent, const wxWindowID id,
|
|
||||||
const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize,
|
|
||||||
const long style = 0, const wxString& name = "notebook" );
|
|
||||||
~wxNotebook(void);
|
|
||||||
bool Create(wxWindow *parent, const wxWindowID id,
|
|
||||||
const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize,
|
|
||||||
const long style = 0, const wxString& name = "notebook" );
|
|
||||||
int GetSelection(void) const;
|
|
||||||
wxImageList* GetImageList(void) const;
|
|
||||||
int GetPageCount(void) const;
|
|
||||||
int GetRowCount(void) const;
|
|
||||||
wxString GetPageText( const int page ) const;
|
|
||||||
int GetPageImage( const int page ) const;
|
|
||||||
void* GetPageData( const int page ) const;
|
|
||||||
wxNotebookPage* GetNotebookPage(int page) const;
|
|
||||||
int SetSelection( const int page );
|
|
||||||
void SetImageList( wxImageList* imageList );
|
|
||||||
bool SetPageText( const int page, const wxString& text );
|
|
||||||
bool SetPageImage( const int oage, const int image );
|
|
||||||
bool SetPageData( const int page, void* data );
|
|
||||||
void SetPageSize( const wxSize& size );
|
|
||||||
void SetPadding( const wxSize& padding );
|
|
||||||
bool DeleteAllPages(void);
|
|
||||||
bool DeletePage( const int page );
|
|
||||||
bool AddPage(wxWindow* win, const wxString& text, const int imageId = -1, void* data = NULL );
|
|
||||||
wxWindow *GetPageWindow( const int page ) const;
|
|
||||||
virtual void AddChild( wxWindow *win );
|
|
||||||
|
|
||||||
protected:
|
|
||||||
// wxWin callbacks
|
|
||||||
void OnSize(wxSizeEvent& event);
|
|
||||||
|
|
||||||
wxImageList* m_imageList;
|
|
||||||
wxList m_pages;
|
|
||||||
|
|
||||||
DECLARE_EVENT_TABLE()
|
DECLARE_EVENT_TABLE()
|
||||||
};
|
};
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
// wxTabEvent
|
// event macros
|
||||||
//-----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
|
typedef void (wxEvtHandler::*wxNotebookEventFunction)(wxNotebookEvent&);
|
||||||
|
|
||||||
class wxTabEvent: public wxCommandEvent
|
#define EVT_NOTEBOOK_PAGE_CHANGED(id, fn) \
|
||||||
{
|
{ \
|
||||||
DECLARE_DYNAMIC_CLASS(wxTabEvent)
|
wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED, \
|
||||||
|
id, \
|
||||||
|
-1, \
|
||||||
|
(wxObjectEventFunction)(wxEventFunction)(wxNotebookEventFunction) &fn, \
|
||||||
|
NULL \
|
||||||
|
},
|
||||||
|
|
||||||
public:
|
#define EVT_NOTEBOOK_PAGE_CHANGING(id, fn) \
|
||||||
|
{ \
|
||||||
wxTabEvent( WXTYPE commandType = 0, int id = 0 );
|
wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGING, \ \
|
||||||
};
|
id, \
|
||||||
|
-1, \
|
||||||
typedef void (wxEvtHandler::*wxTabEventFunction)(wxTabEvent&);
|
(wxObjectEventFunction)(wxEventFunction)(wxNotebookEventFunction) &fn, \
|
||||||
|
NULL \
|
||||||
#define EVT_TAB_SEL_CHANGED(id, fn) { wxEVT_COMMAND_TAB_SEL_CHANGED, \
|
},
|
||||||
id, -1, (wxObjectEventFunction) (wxEventFunction) (wxTabEventFunction) & fn, NULL },
|
|
||||||
#define EVT_TAB_SEL_CHANGING(id, fn) { wxEVT_COMMAND_TAB_SEL_CHANGING, \
|
|
||||||
id, -1, (wxObjectEventFunction) (wxEventFunction) (wxTabEventFunction) & fn, NULL },
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
// __TABCTRLH__
|
// __TABCTRLH__
|
||||||
|
@@ -5,7 +5,7 @@
|
|||||||
// Modified by:
|
// Modified by:
|
||||||
// RCS-ID: $Id$
|
// RCS-ID: $Id$
|
||||||
// Copyright: (c) Julian Smart and Markus Holzem
|
// Copyright: (c) Julian Smart and Markus Holzem
|
||||||
// Licence: wxWindows license
|
// Licence: wxWindows license
|
||||||
/////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
#ifndef __TABCTRLH__
|
#ifndef __TABCTRLH__
|
||||||
@@ -28,79 +28,158 @@ class wxImageList;
|
|||||||
class wxNotebook;
|
class wxNotebook;
|
||||||
class wxNotebookPage;
|
class wxNotebookPage;
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
// global data
|
// notebook events
|
||||||
//-----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
|
class wxNotebookEvent : public wxCommandEvent
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
wxNotebookEvent(WXTYPE commandType = 0, int id = 0,
|
||||||
|
int nSel = -1, int nOldSel = -1)
|
||||||
|
: wxCommandEvent(commandType, id) { m_nSel = nSel; m_nOldSel = nOldSel; }
|
||||||
|
|
||||||
|
// accessors
|
||||||
|
int GetSelection() const { return m_nSel; }
|
||||||
|
int GetOldSelection() const { return m_nOldSel; }
|
||||||
|
|
||||||
|
private:
|
||||||
|
int m_nSel, // currently selected page
|
||||||
|
m_nOldSel; // previously selected page
|
||||||
|
|
||||||
|
DECLARE_DYNAMIC_CLASS(wxNotebookEvent)
|
||||||
|
};
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// wxNotebook
|
// wxNotebook
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
class wxNotebook: public wxControl
|
class wxNotebook : public wxControl
|
||||||
{
|
{
|
||||||
|
public:
|
||||||
|
// ctors
|
||||||
|
// -----
|
||||||
|
// default for dynamic class
|
||||||
|
wxNotebook();
|
||||||
|
// the same arguments as for wxControl (@@@ any special styles?)
|
||||||
|
wxNotebook(wxWindow *parent,
|
||||||
|
const wxWindowID id,
|
||||||
|
const wxPoint& pos = wxDefaultPosition,
|
||||||
|
const wxSize& size = wxDefaultSize,
|
||||||
|
const long style = 0,
|
||||||
|
const wxString& name = "notebook");
|
||||||
|
// Create() function
|
||||||
|
bool Create(wxWindow *parent,
|
||||||
|
const wxWindowID id,
|
||||||
|
const wxPoint& pos = wxDefaultPosition,
|
||||||
|
const wxSize& size = wxDefaultSize,
|
||||||
|
const long style = 0,
|
||||||
|
const wxString& name = "notebook");
|
||||||
|
// dtor
|
||||||
|
~wxNotebook();
|
||||||
|
|
||||||
|
// accessors
|
||||||
|
// ---------
|
||||||
|
// get number of pages in the dialog
|
||||||
|
int GetPageCount() const;
|
||||||
|
|
||||||
|
// set the currently selected page, return the index of the previously
|
||||||
|
// selected one (or -1 on error)
|
||||||
|
// NB: this function will _not_ generate wxEVT_NOTEBOOK_PAGE_xxx events
|
||||||
|
int SetSelection(int nPage);
|
||||||
|
// cycle thru the tabs
|
||||||
|
void AdvanceSelection(bool bForward = TRUE);
|
||||||
|
// get the currently selected page
|
||||||
|
int GetSelection() const;
|
||||||
|
|
||||||
|
// set/get the title of a page
|
||||||
|
bool SetPageText(int nPage, const wxString& strText);
|
||||||
|
wxString GetPageText(int nPage) const;
|
||||||
|
|
||||||
|
// image list stuff: each page may have an image associated with it. All
|
||||||
|
// the images belong to an image list, so you have to
|
||||||
|
// 1) create an image list
|
||||||
|
// 2) associate it with the notebook
|
||||||
|
// 3) set for each page it's image
|
||||||
|
// associate image list with a control
|
||||||
|
void SetImageList(wxImageList* imageList);
|
||||||
|
// get pointer (may be NULL) to the associated image list
|
||||||
|
wxImageList* GetImageList() const { return m_imageList; }
|
||||||
|
|
||||||
|
// sets/returns item's image index in the current image list
|
||||||
|
int GetPageImage(int nPage) const;
|
||||||
|
bool SetPageImage(int nPage, int nImage);
|
||||||
|
|
||||||
|
// currently it's always 1 because wxGTK doesn't support multi-row
|
||||||
|
// tab controls
|
||||||
|
int GetRowCount() const;
|
||||||
|
|
||||||
|
// control the appearance of the notebook pages
|
||||||
|
// set the size (the same for all pages)
|
||||||
|
void SetPageSize(const wxSize& size);
|
||||||
|
// set the padding between tabs (in pixels)
|
||||||
|
void SetPadding(const wxSize& padding);
|
||||||
|
|
||||||
|
// operations
|
||||||
|
// ----------
|
||||||
|
// remove one page from the notebook
|
||||||
|
bool DeletePage(int nPage);
|
||||||
|
// remove all pages
|
||||||
|
bool DeleteAllPages();
|
||||||
|
// adds a new page to the notebook (it will be deleted ny the notebook,
|
||||||
|
// don't delete it yourself). If bSelect, this page becomes active.
|
||||||
|
bool AddPage(wxWindow *pPage,
|
||||||
|
const wxString& strText,
|
||||||
|
bool bSelect = FALSE,
|
||||||
|
int imageId = -1);
|
||||||
|
// @@@@ VZ: I don't know how to implement InsertPage()
|
||||||
|
|
||||||
|
// get the panel which represents the given page
|
||||||
|
wxWindow *GetPage(int nPage) const;
|
||||||
|
|
||||||
|
// base class virtuals
|
||||||
|
virtual void AddChild(wxWindow *child);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
// wxWin callbacks
|
||||||
|
void OnSize(wxSizeEvent& event);
|
||||||
|
|
||||||
|
private:
|
||||||
|
// common part of all ctors
|
||||||
|
void Init();
|
||||||
|
|
||||||
|
// helper function
|
||||||
|
wxNotebookPage* GetNotebookPage(int page) const;
|
||||||
|
|
||||||
|
wxImageList* m_imageList;
|
||||||
|
wxList m_pages;
|
||||||
|
uint m_idHandler; // the change page handler id
|
||||||
|
|
||||||
DECLARE_DYNAMIC_CLASS(wxNotebook)
|
DECLARE_DYNAMIC_CLASS(wxNotebook)
|
||||||
|
|
||||||
public:
|
|
||||||
|
|
||||||
wxNotebook(void);
|
|
||||||
wxNotebook( wxWindow *parent, const wxWindowID id,
|
|
||||||
const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize,
|
|
||||||
const long style = 0, const wxString& name = "notebook" );
|
|
||||||
~wxNotebook(void);
|
|
||||||
bool Create(wxWindow *parent, const wxWindowID id,
|
|
||||||
const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize,
|
|
||||||
const long style = 0, const wxString& name = "notebook" );
|
|
||||||
int GetSelection(void) const;
|
|
||||||
wxImageList* GetImageList(void) const;
|
|
||||||
int GetPageCount(void) const;
|
|
||||||
int GetRowCount(void) const;
|
|
||||||
wxString GetPageText( const int page ) const;
|
|
||||||
int GetPageImage( const int page ) const;
|
|
||||||
void* GetPageData( const int page ) const;
|
|
||||||
wxNotebookPage* GetNotebookPage(int page) const;
|
|
||||||
int SetSelection( const int page );
|
|
||||||
void SetImageList( wxImageList* imageList );
|
|
||||||
bool SetPageText( const int page, const wxString& text );
|
|
||||||
bool SetPageImage( const int oage, const int image );
|
|
||||||
bool SetPageData( const int page, void* data );
|
|
||||||
void SetPageSize( const wxSize& size );
|
|
||||||
void SetPadding( const wxSize& padding );
|
|
||||||
bool DeleteAllPages(void);
|
|
||||||
bool DeletePage( const int page );
|
|
||||||
bool AddPage(wxWindow* win, const wxString& text, const int imageId = -1, void* data = NULL );
|
|
||||||
wxWindow *GetPageWindow( const int page ) const;
|
|
||||||
virtual void AddChild( wxWindow *win );
|
|
||||||
|
|
||||||
protected:
|
|
||||||
// wxWin callbacks
|
|
||||||
void OnSize(wxSizeEvent& event);
|
|
||||||
|
|
||||||
wxImageList* m_imageList;
|
|
||||||
wxList m_pages;
|
|
||||||
|
|
||||||
DECLARE_EVENT_TABLE()
|
DECLARE_EVENT_TABLE()
|
||||||
};
|
};
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
// wxTabEvent
|
// event macros
|
||||||
//-----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
|
typedef void (wxEvtHandler::*wxNotebookEventFunction)(wxNotebookEvent&);
|
||||||
|
|
||||||
class wxTabEvent: public wxCommandEvent
|
#define EVT_NOTEBOOK_PAGE_CHANGED(id, fn) \
|
||||||
{
|
{ \
|
||||||
DECLARE_DYNAMIC_CLASS(wxTabEvent)
|
wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED, \
|
||||||
|
id, \
|
||||||
|
-1, \
|
||||||
|
(wxObjectEventFunction)(wxEventFunction)(wxNotebookEventFunction) &fn, \
|
||||||
|
NULL \
|
||||||
|
},
|
||||||
|
|
||||||
public:
|
#define EVT_NOTEBOOK_PAGE_CHANGING(id, fn) \
|
||||||
|
{ \
|
||||||
wxTabEvent( WXTYPE commandType = 0, int id = 0 );
|
wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGING, \ \
|
||||||
};
|
id, \
|
||||||
|
-1, \
|
||||||
typedef void (wxEvtHandler::*wxTabEventFunction)(wxTabEvent&);
|
(wxObjectEventFunction)(wxEventFunction)(wxNotebookEventFunction) &fn, \
|
||||||
|
NULL \
|
||||||
#define EVT_TAB_SEL_CHANGED(id, fn) { wxEVT_COMMAND_TAB_SEL_CHANGED, \
|
},
|
||||||
id, -1, (wxObjectEventFunction) (wxEventFunction) (wxTabEventFunction) & fn, NULL },
|
|
||||||
#define EVT_TAB_SEL_CHANGING(id, fn) { wxEVT_COMMAND_TAB_SEL_CHANGING, \
|
|
||||||
id, -1, (wxObjectEventFunction) (wxEventFunction) (wxTabEventFunction) & fn, NULL },
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
// __TABCTRLH__
|
// __TABCTRLH__
|
||||||
|
@@ -5,7 +5,7 @@
|
|||||||
// Created: 01/02/97
|
// Created: 01/02/97
|
||||||
// Id:
|
// Id:
|
||||||
// Copyright: (c) 1998 Robert Roebling, Julian Smart and Markus Holzem
|
// Copyright: (c) 1998 Robert Roebling, Julian Smart and Markus Holzem
|
||||||
// Licence: wxWindows licence
|
// Licence: wxWindows licence
|
||||||
/////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
#ifdef __GNUG__
|
#ifdef __GNUG__
|
||||||
@@ -19,32 +19,52 @@
|
|||||||
#include "wx/intl.h"
|
#include "wx/intl.h"
|
||||||
#include "wx/log.h"
|
#include "wx/log.h"
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
// GTK callbacks
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
// page change callback
|
||||||
|
static void gtk_notebook_page_change_callback(GtkNotebook *widget,
|
||||||
|
GtkNotebookPage *page,
|
||||||
|
gint nPage,
|
||||||
|
gpointer data)
|
||||||
|
{
|
||||||
|
wxNotebook *notebook = (wxNotebook *)data;
|
||||||
|
|
||||||
|
int nOld = notebook->GetSelection();
|
||||||
|
|
||||||
|
// TODO: emulate PAGE_CHANGING event
|
||||||
|
wxNotebookEvent event(wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED,
|
||||||
|
notebook->GetId(),
|
||||||
|
nPage,
|
||||||
|
nOld);
|
||||||
|
event.SetEventObject(notebook);
|
||||||
|
notebook->ProcessEvent(event);
|
||||||
|
}
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// wxNotebookPage
|
// wxNotebookPage
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
class wxNotebookPage: public wxObject
|
class wxNotebookPage: public wxObject
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
wxNotebookPage()
|
||||||
int m_id;
|
{
|
||||||
wxString m_text;
|
m_id = -1;
|
||||||
int m_image;
|
m_text = "";
|
||||||
void *m_clientData;
|
m_image = -1;
|
||||||
GtkNotebookPage *m_page;
|
m_page = NULL;
|
||||||
GtkLabel *m_label;
|
m_clientPanel = NULL;
|
||||||
wxWindow *m_clientPanel;
|
};
|
||||||
|
|
||||||
wxNotebookPage()
|
//private:
|
||||||
{
|
int m_id;
|
||||||
m_id = -1;
|
wxString m_text;
|
||||||
m_text = "";
|
int m_image;
|
||||||
m_image = -1;
|
GtkNotebookPage *m_page;
|
||||||
m_clientData = NULL;
|
GtkLabel *m_label;
|
||||||
m_page = NULL;
|
wxWindow *m_clientPanel;
|
||||||
m_clientPanel = NULL;
|
|
||||||
};
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
@@ -57,81 +77,94 @@ END_EVENT_TABLE()
|
|||||||
|
|
||||||
IMPLEMENT_DYNAMIC_CLASS(wxNotebook,wxControl)
|
IMPLEMENT_DYNAMIC_CLASS(wxNotebook,wxControl)
|
||||||
|
|
||||||
wxNotebook::wxNotebook(void)
|
void wxNotebook::Init()
|
||||||
{
|
{
|
||||||
m_imageList = NULL;
|
m_imageList = NULL;
|
||||||
m_pages.DeleteContents( TRUE );
|
m_pages.DeleteContents( TRUE );
|
||||||
|
m_idHandler = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxNotebook::wxNotebook()
|
||||||
|
{
|
||||||
|
Init();
|
||||||
};
|
};
|
||||||
|
|
||||||
wxNotebook::wxNotebook( wxWindow *parent, const wxWindowID id,
|
wxNotebook::wxNotebook( wxWindow *parent, const wxWindowID id,
|
||||||
const wxPoint& pos, const wxSize& size,
|
const wxPoint& pos, const wxSize& size,
|
||||||
const long style, const wxString& name )
|
const long style, const wxString& name )
|
||||||
{
|
{
|
||||||
m_imageList = NULL;
|
Init();
|
||||||
m_pages.DeleteContents( TRUE );
|
|
||||||
Create( parent, id, pos, size, style, name );
|
Create( parent, id, pos, size, style, name );
|
||||||
};
|
};
|
||||||
|
|
||||||
wxNotebook::~wxNotebook(void)
|
wxNotebook::~wxNotebook()
|
||||||
{
|
{
|
||||||
if (m_imageList) delete m_imageList;
|
// don't generate change page events any more
|
||||||
|
if ( m_idHandler != 0 )
|
||||||
|
gtk_signal_disconnect(GTK_OBJECT(m_widget), m_idHandler);
|
||||||
|
|
||||||
|
if (m_imageList)
|
||||||
|
delete m_imageList;
|
||||||
DeleteAllPages();
|
DeleteAllPages();
|
||||||
};
|
};
|
||||||
|
|
||||||
bool wxNotebook::Create(wxWindow *parent, const wxWindowID id,
|
bool wxNotebook::Create(wxWindow *parent, const wxWindowID id,
|
||||||
const wxPoint& pos, const wxSize& size,
|
const wxPoint& pos, const wxSize& size,
|
||||||
const long style, const wxString& name )
|
const long style, const wxString& name )
|
||||||
{
|
{
|
||||||
m_needParent = TRUE;
|
m_needParent = TRUE;
|
||||||
|
|
||||||
PreCreation( parent, id, pos, size, style, name );
|
PreCreation( parent, id, pos, size, style, name );
|
||||||
|
|
||||||
m_widget = gtk_notebook_new();
|
m_widget = gtk_notebook_new();
|
||||||
|
m_idHandler = gtk_signal_connect
|
||||||
|
(
|
||||||
|
GTK_OBJECT(m_widget), "switch_page",
|
||||||
|
GTK_SIGNAL_FUNC(gtk_notebook_page_change_callback),
|
||||||
|
(gpointer)this
|
||||||
|
);
|
||||||
|
|
||||||
PostCreation();
|
PostCreation();
|
||||||
|
|
||||||
Show( TRUE );
|
Show( TRUE );
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
};
|
};
|
||||||
|
|
||||||
int wxNotebook::GetSelection(void) const
|
int wxNotebook::GetSelection() const
|
||||||
{
|
{
|
||||||
if (m_pages.Number() == 0) return -1;
|
if (m_pages.Number() == 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
GtkNotebookPage *g_page = GTK_NOTEBOOK(m_widget)->cur_page;
|
GtkNotebookPage *g_page = GTK_NOTEBOOK(m_widget)->cur_page;
|
||||||
|
|
||||||
wxNotebookPage *page = NULL;
|
wxNotebookPage *page = NULL;
|
||||||
|
|
||||||
wxNode *node = m_pages.First();
|
wxNode *node = m_pages.First();
|
||||||
while (node)
|
while (node)
|
||||||
{
|
{
|
||||||
page = (wxNotebookPage*)node->Data();
|
page = (wxNotebookPage*)node->Data();
|
||||||
if (page->m_page == g_page) break;
|
if (page->m_page == g_page)
|
||||||
|
break;
|
||||||
node = node->Next();
|
node = node->Next();
|
||||||
};
|
};
|
||||||
|
|
||||||
if (!node) wxFatalError( "Notebook error." );
|
wxCHECK_MSG( node != NULL, -1, "wxNotebook: no selection?");
|
||||||
|
|
||||||
return page->m_id;
|
return page->m_id;
|
||||||
};
|
};
|
||||||
|
|
||||||
wxImageList* wxNotebook::GetImageList(void) const
|
int wxNotebook::GetPageCount() const
|
||||||
{
|
|
||||||
return m_imageList;
|
|
||||||
};
|
|
||||||
|
|
||||||
int wxNotebook::GetPageCount(void) const
|
|
||||||
{
|
{
|
||||||
return m_pages.Number();
|
return m_pages.Number();
|
||||||
};
|
};
|
||||||
|
|
||||||
int wxNotebook::GetRowCount(void) const
|
int wxNotebook::GetRowCount() const
|
||||||
{
|
{
|
||||||
return 1;
|
return 1;
|
||||||
};
|
};
|
||||||
|
|
||||||
wxString wxNotebook::GetPageText( const int page ) const
|
wxString wxNotebook::GetPageText( int page ) const
|
||||||
{
|
{
|
||||||
wxNotebookPage* nb_page = GetNotebookPage(page);
|
wxNotebookPage* nb_page = GetNotebookPage(page);
|
||||||
if (nb_page)
|
if (nb_page)
|
||||||
@@ -140,7 +173,7 @@ wxString wxNotebook::GetPageText( const int page ) const
|
|||||||
return "";
|
return "";
|
||||||
};
|
};
|
||||||
|
|
||||||
int wxNotebook::GetPageImage( const int page ) const
|
int wxNotebook::GetPageImage( int page ) const
|
||||||
{
|
{
|
||||||
wxNotebookPage* nb_page = GetNotebookPage(page);
|
wxNotebookPage* nb_page = GetNotebookPage(page);
|
||||||
if (nb_page)
|
if (nb_page)
|
||||||
@@ -149,15 +182,6 @@ int wxNotebook::GetPageImage( const int page ) const
|
|||||||
return 0;
|
return 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
void* wxNotebook::GetPageData( const int page ) const
|
|
||||||
{
|
|
||||||
wxNotebookPage* nb_page = GetNotebookPage(page);
|
|
||||||
if (nb_page)
|
|
||||||
return nb_page->m_clientData;
|
|
||||||
else
|
|
||||||
return NULL;
|
|
||||||
};
|
|
||||||
|
|
||||||
wxNotebookPage* wxNotebook::GetNotebookPage(int page) const
|
wxNotebookPage* wxNotebook::GetNotebookPage(int page) const
|
||||||
{
|
{
|
||||||
wxNotebookPage *nb_page = NULL;
|
wxNotebookPage *nb_page = NULL;
|
||||||
@@ -166,99 +190,106 @@ wxNotebookPage* wxNotebook::GetNotebookPage(int page) const
|
|||||||
while (node)
|
while (node)
|
||||||
{
|
{
|
||||||
nb_page = (wxNotebookPage*)node->Data();
|
nb_page = (wxNotebookPage*)node->Data();
|
||||||
if (nb_page->m_id == page) break;
|
if (nb_page->m_id == page)
|
||||||
|
return nb_page;
|
||||||
node = node->Next();
|
node = node->Next();
|
||||||
};
|
};
|
||||||
if (!node) return NULL;
|
|
||||||
return nb_page;
|
wxLogDebug("Notebook page %d not found!", page);
|
||||||
|
|
||||||
|
return NULL;
|
||||||
};
|
};
|
||||||
|
|
||||||
int wxNotebook::SetSelection( const int page )
|
int wxNotebook::SetSelection( int page )
|
||||||
{
|
{
|
||||||
|
int selOld = GetSelection();
|
||||||
wxNotebookPage* nb_page = GetNotebookPage(page);
|
wxNotebookPage* nb_page = GetNotebookPage(page);
|
||||||
if (!nb_page) return -1;
|
if (!nb_page)
|
||||||
|
return -1;
|
||||||
|
|
||||||
int page_num = 0;
|
int page_num = 0;
|
||||||
GList *child = GTK_NOTEBOOK(m_widget)->children;
|
GList *child = GTK_NOTEBOOK(m_widget)->children;
|
||||||
while (child)
|
while (child)
|
||||||
{
|
{
|
||||||
if (nb_page->m_page == (GtkNotebookPage*)child->data) break;
|
if (nb_page->m_page == (GtkNotebookPage*)child->data)
|
||||||
|
break;
|
||||||
page_num++;
|
page_num++;
|
||||||
child = child->next;
|
child = child->next;
|
||||||
};
|
};
|
||||||
|
|
||||||
if (!child) return -1;
|
if (!child) return -1;
|
||||||
|
|
||||||
gtk_notebook_set_page( GTK_NOTEBOOK(m_widget), page_num );
|
gtk_notebook_set_page( GTK_NOTEBOOK(m_widget), page_num );
|
||||||
|
|
||||||
return page;
|
return selOld;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
void wxNotebook::AdvanceSelection(bool bForward)
|
||||||
|
{
|
||||||
|
int nSel = GetSelection(),
|
||||||
|
nMax = GetPageCount();
|
||||||
|
|
||||||
|
if ( bForward ) {
|
||||||
|
SetSelection(nSel == nMax ? 0 : nSel + 1);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
SetSelection(nSel == 0 ? nMax : nSel - 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void wxNotebook::SetImageList( wxImageList* imageList )
|
void wxNotebook::SetImageList( wxImageList* imageList )
|
||||||
{
|
{
|
||||||
m_imageList = imageList;
|
m_imageList = imageList;
|
||||||
};
|
};
|
||||||
|
|
||||||
bool wxNotebook::SetPageText( const int page, const wxString &text )
|
bool wxNotebook::SetPageText( int page, const wxString &text )
|
||||||
{
|
|
||||||
wxNotebookPage* nb_page = GetNotebookPage(page);
|
|
||||||
if (!nb_page) return FALSE;
|
|
||||||
|
|
||||||
nb_page->m_text = text;
|
|
||||||
|
|
||||||
// recreate
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
};
|
|
||||||
|
|
||||||
bool wxNotebook::SetPageImage( const int page, const int image )
|
|
||||||
{
|
{
|
||||||
wxNotebookPage* nb_page = GetNotebookPage(page);
|
wxNotebookPage* nb_page = GetNotebookPage(page);
|
||||||
if (!nb_page)
|
if (!nb_page)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
nb_page->m_image = image;
|
nb_page->m_text = text;
|
||||||
|
|
||||||
// recreate
|
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
};
|
};
|
||||||
|
|
||||||
bool wxNotebook::SetPageData( const int page, void* data )
|
bool wxNotebook::SetPageImage( int page, const int image )
|
||||||
{
|
{
|
||||||
wxNotebookPage* nb_page = GetNotebookPage(page);
|
wxNotebookPage* nb_page = GetNotebookPage(page);
|
||||||
if (!nb_page) return FALSE;
|
if (!nb_page)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
nb_page->m_image = image;
|
||||||
|
|
||||||
nb_page->m_clientData = data;
|
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
};
|
};
|
||||||
|
|
||||||
void wxNotebook::SetPageSize( const wxSize &WXUNUSED(size) )
|
void wxNotebook::SetPageSize( const wxSize &WXUNUSED(size) )
|
||||||
{
|
{
|
||||||
|
wxFAIL_MSG("wxNotebook::SetPageSize not implemented");
|
||||||
};
|
};
|
||||||
|
|
||||||
void wxNotebook::SetPadding( const wxSize &WXUNUSED(padding) )
|
void wxNotebook::SetPadding( const wxSize &WXUNUSED(padding) )
|
||||||
{
|
{
|
||||||
// what's this ?
|
wxFAIL_MSG("wxNotebook::SetPadding not implemented");
|
||||||
};
|
};
|
||||||
|
|
||||||
bool wxNotebook::DeleteAllPages(void)
|
bool wxNotebook::DeleteAllPages()
|
||||||
{
|
{
|
||||||
wxNode *page_node = m_pages.First();
|
wxNode *page_node = m_pages.First();
|
||||||
while (page_node)
|
while (page_node)
|
||||||
{
|
{
|
||||||
wxNotebookPage *page = (wxNotebookPage*)page_node->Data();
|
wxNotebookPage *page = (wxNotebookPage*)page_node->Data();
|
||||||
|
|
||||||
DeletePage( page->m_id );
|
DeletePage( page->m_id );
|
||||||
|
|
||||||
page_node = m_pages.First();
|
page_node = m_pages.First();
|
||||||
};
|
};
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
};
|
};
|
||||||
|
|
||||||
bool wxNotebook::DeletePage( const int page )
|
bool wxNotebook::DeletePage( int page )
|
||||||
{
|
{
|
||||||
wxNotebookPage* nb_page = GetNotebookPage(page);
|
wxNotebookPage* nb_page = GetNotebookPage(page);
|
||||||
if (!nb_page) return FALSE;
|
if (!nb_page) return FALSE;
|
||||||
@@ -273,18 +304,19 @@ bool wxNotebook::DeletePage( const int page )
|
|||||||
};
|
};
|
||||||
|
|
||||||
wxASSERT( child );
|
wxASSERT( child );
|
||||||
|
|
||||||
delete nb_page->m_clientPanel;
|
delete nb_page->m_clientPanel;
|
||||||
|
|
||||||
// Amazingly, this is not necessary
|
// Amazingly, this is not necessary
|
||||||
// gtk_notebook_remove_page( GTK_NOTEBOOK(m_widget), page_num );
|
// gtk_notebook_remove_page( GTK_NOTEBOOK(m_widget), page_num );
|
||||||
|
|
||||||
m_pages.DeleteObject( nb_page );
|
m_pages.DeleteObject( nb_page );
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
};
|
};
|
||||||
|
|
||||||
bool wxNotebook::AddPage(wxWindow* win, const wxString& text, const int imageId, void* data)
|
bool wxNotebook::AddPage(wxWindow* win, const wxString& text,
|
||||||
|
bool bSelect, int imageId)
|
||||||
{
|
{
|
||||||
// we've created the notebook page in AddChild(). Now we just have to set
|
// we've created the notebook page in AddChild(). Now we just have to set
|
||||||
// the caption for the page and set the others parameters.
|
// the caption for the page and set the others parameters.
|
||||||
@@ -296,40 +328,41 @@ bool wxNotebook::AddPage(wxWindow* win, const wxString& text, const int imageId,
|
|||||||
while (node)
|
while (node)
|
||||||
{
|
{
|
||||||
page = (wxNotebookPage*)node->Data();
|
page = (wxNotebookPage*)node->Data();
|
||||||
if ( page->m_clientPanel == win )
|
if ( page->m_clientPanel == win )
|
||||||
break; // found
|
break; // found
|
||||||
node = node->Next();
|
node = node->Next();
|
||||||
};
|
};
|
||||||
|
|
||||||
if ( page == NULL ) {
|
|
||||||
wxFAIL_MSG("Can't add a page whose parent is not the notebook!");
|
|
||||||
|
|
||||||
return FALSE;
|
wxCHECK_MSG(page != NULL, FALSE,
|
||||||
}
|
"Can't add a page whose parent is not the notebook!");
|
||||||
|
|
||||||
// then set the attributes
|
// then set the attributes
|
||||||
page->m_text = text;
|
page->m_text = text;
|
||||||
if ( page->m_text.IsEmpty() )
|
if ( page->m_text.IsEmpty() )
|
||||||
page->m_text = "";
|
page->m_text = "";
|
||||||
page->m_image = imageId;
|
page->m_image = imageId;
|
||||||
page->m_clientData = data;
|
|
||||||
gtk_label_set(page->m_label, page->m_text);
|
gtk_label_set(page->m_label, page->m_text);
|
||||||
|
|
||||||
|
if ( bSelect ) {
|
||||||
|
SetSelection(GetPageCount());
|
||||||
|
}
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
};
|
};
|
||||||
|
|
||||||
wxWindow *wxNotebook::GetPageWindow( const int page ) const
|
wxWindow *wxNotebook::GetPage( int page ) const
|
||||||
{
|
{
|
||||||
wxNotebookPage* nb_page = GetNotebookPage(page);
|
wxNotebookPage* nb_page = GetNotebookPage(page);
|
||||||
if (!nb_page) return NULL;
|
if (!nb_page)
|
||||||
|
return NULL;
|
||||||
return nb_page->m_clientPanel;
|
else
|
||||||
|
return nb_page->m_clientPanel;
|
||||||
};
|
};
|
||||||
|
|
||||||
void wxNotebook::AddChild( wxWindow *win )
|
void wxNotebook::AddChild( wxWindow *win )
|
||||||
{
|
{
|
||||||
// @@@ normally done in wxWindow::AddChild but for some reason wxNotebook
|
// @@@ normally done in wxWindow::AddChild but for some reason wxNotebook
|
||||||
// case is speicla there (Robert?)
|
// case is special there (Robert?)
|
||||||
m_children.Append(win);
|
m_children.Append(win);
|
||||||
|
|
||||||
wxNotebookPage *page = new wxNotebookPage();
|
wxNotebookPage *page = new wxNotebookPage();
|
||||||
@@ -337,15 +370,15 @@ void wxNotebook::AddChild( wxWindow *win )
|
|||||||
page->m_id = GetPageCount();
|
page->m_id = GetPageCount();
|
||||||
page->m_label = (GtkLabel *)gtk_label_new("no caption");
|
page->m_label = (GtkLabel *)gtk_label_new("no caption");
|
||||||
page->m_clientPanel = win;
|
page->m_clientPanel = win;
|
||||||
gtk_notebook_append_page(GTK_NOTEBOOK(m_widget), win->m_widget,
|
gtk_notebook_append_page(GTK_NOTEBOOK(m_widget), win->m_widget,
|
||||||
(GtkWidget *)page->m_label);
|
(GtkWidget *)page->m_label);
|
||||||
gtk_misc_set_alignment(GTK_MISC(page->m_label), 0.0, 0.5);
|
gtk_misc_set_alignment(GTK_MISC(page->m_label), 0.0, 0.5);
|
||||||
|
|
||||||
page->m_page = (GtkNotebookPage*)
|
page->m_page = (GtkNotebookPage*)
|
||||||
(
|
(
|
||||||
g_list_last(GTK_NOTEBOOK(m_widget)->children)->data
|
g_list_last(GTK_NOTEBOOK(m_widget)->children)->data
|
||||||
);
|
);
|
||||||
|
|
||||||
if (!page->m_page)
|
if (!page->m_page)
|
||||||
{
|
{
|
||||||
wxLogFatalError( "Notebook page creation error" );
|
wxLogFatalError( "Notebook page creation error" );
|
||||||
@@ -362,20 +395,17 @@ void wxNotebook::OnSize(wxSizeEvent& event)
|
|||||||
while (node)
|
while (node)
|
||||||
{
|
{
|
||||||
wxNotebookPage *page = (wxNotebookPage*)node->Data();
|
wxNotebookPage *page = (wxNotebookPage*)node->Data();
|
||||||
page->m_clientPanel->SetSize(event.GetSize().GetX(), event.GetSize().GetY());
|
// @@@@ This -50 is completely wrong - instead, we should substract
|
||||||
|
// the height of the tabs
|
||||||
|
page->m_clientPanel->SetSize(event.GetSize().GetX(),
|
||||||
|
event.GetSize().GetY() - 50);
|
||||||
|
|
||||||
node = node->Next();
|
node = node->Next();
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// wxTabEvent
|
// wxNotebookEvent
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
IMPLEMENT_DYNAMIC_CLASS(wxTabEvent, wxCommandEvent)
|
IMPLEMENT_DYNAMIC_CLASS(wxNotebookEvent, wxCommandEvent)
|
||||||
|
|
||||||
wxTabEvent::wxTabEvent( WXTYPE commandType, int id ) :
|
|
||||||
wxCommandEvent(commandType, id)
|
|
||||||
{
|
|
||||||
};
|
|
||||||
|
|
||||||
|
@@ -5,7 +5,7 @@
|
|||||||
// Created: 01/02/97
|
// Created: 01/02/97
|
||||||
// Id:
|
// Id:
|
||||||
// Copyright: (c) 1998 Robert Roebling, Julian Smart and Markus Holzem
|
// Copyright: (c) 1998 Robert Roebling, Julian Smart and Markus Holzem
|
||||||
// Licence: wxWindows licence
|
// Licence: wxWindows licence
|
||||||
/////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
#ifdef __GNUG__
|
#ifdef __GNUG__
|
||||||
@@ -19,32 +19,52 @@
|
|||||||
#include "wx/intl.h"
|
#include "wx/intl.h"
|
||||||
#include "wx/log.h"
|
#include "wx/log.h"
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
// GTK callbacks
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
// page change callback
|
||||||
|
static void gtk_notebook_page_change_callback(GtkNotebook *widget,
|
||||||
|
GtkNotebookPage *page,
|
||||||
|
gint nPage,
|
||||||
|
gpointer data)
|
||||||
|
{
|
||||||
|
wxNotebook *notebook = (wxNotebook *)data;
|
||||||
|
|
||||||
|
int nOld = notebook->GetSelection();
|
||||||
|
|
||||||
|
// TODO: emulate PAGE_CHANGING event
|
||||||
|
wxNotebookEvent event(wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED,
|
||||||
|
notebook->GetId(),
|
||||||
|
nPage,
|
||||||
|
nOld);
|
||||||
|
event.SetEventObject(notebook);
|
||||||
|
notebook->ProcessEvent(event);
|
||||||
|
}
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// wxNotebookPage
|
// wxNotebookPage
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
class wxNotebookPage: public wxObject
|
class wxNotebookPage: public wxObject
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
wxNotebookPage()
|
||||||
int m_id;
|
{
|
||||||
wxString m_text;
|
m_id = -1;
|
||||||
int m_image;
|
m_text = "";
|
||||||
void *m_clientData;
|
m_image = -1;
|
||||||
GtkNotebookPage *m_page;
|
m_page = NULL;
|
||||||
GtkLabel *m_label;
|
m_clientPanel = NULL;
|
||||||
wxWindow *m_clientPanel;
|
};
|
||||||
|
|
||||||
wxNotebookPage()
|
//private:
|
||||||
{
|
int m_id;
|
||||||
m_id = -1;
|
wxString m_text;
|
||||||
m_text = "";
|
int m_image;
|
||||||
m_image = -1;
|
GtkNotebookPage *m_page;
|
||||||
m_clientData = NULL;
|
GtkLabel *m_label;
|
||||||
m_page = NULL;
|
wxWindow *m_clientPanel;
|
||||||
m_clientPanel = NULL;
|
|
||||||
};
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
@@ -57,81 +77,94 @@ END_EVENT_TABLE()
|
|||||||
|
|
||||||
IMPLEMENT_DYNAMIC_CLASS(wxNotebook,wxControl)
|
IMPLEMENT_DYNAMIC_CLASS(wxNotebook,wxControl)
|
||||||
|
|
||||||
wxNotebook::wxNotebook(void)
|
void wxNotebook::Init()
|
||||||
{
|
{
|
||||||
m_imageList = NULL;
|
m_imageList = NULL;
|
||||||
m_pages.DeleteContents( TRUE );
|
m_pages.DeleteContents( TRUE );
|
||||||
|
m_idHandler = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxNotebook::wxNotebook()
|
||||||
|
{
|
||||||
|
Init();
|
||||||
};
|
};
|
||||||
|
|
||||||
wxNotebook::wxNotebook( wxWindow *parent, const wxWindowID id,
|
wxNotebook::wxNotebook( wxWindow *parent, const wxWindowID id,
|
||||||
const wxPoint& pos, const wxSize& size,
|
const wxPoint& pos, const wxSize& size,
|
||||||
const long style, const wxString& name )
|
const long style, const wxString& name )
|
||||||
{
|
{
|
||||||
m_imageList = NULL;
|
Init();
|
||||||
m_pages.DeleteContents( TRUE );
|
|
||||||
Create( parent, id, pos, size, style, name );
|
Create( parent, id, pos, size, style, name );
|
||||||
};
|
};
|
||||||
|
|
||||||
wxNotebook::~wxNotebook(void)
|
wxNotebook::~wxNotebook()
|
||||||
{
|
{
|
||||||
if (m_imageList) delete m_imageList;
|
// don't generate change page events any more
|
||||||
|
if ( m_idHandler != 0 )
|
||||||
|
gtk_signal_disconnect(GTK_OBJECT(m_widget), m_idHandler);
|
||||||
|
|
||||||
|
if (m_imageList)
|
||||||
|
delete m_imageList;
|
||||||
DeleteAllPages();
|
DeleteAllPages();
|
||||||
};
|
};
|
||||||
|
|
||||||
bool wxNotebook::Create(wxWindow *parent, const wxWindowID id,
|
bool wxNotebook::Create(wxWindow *parent, const wxWindowID id,
|
||||||
const wxPoint& pos, const wxSize& size,
|
const wxPoint& pos, const wxSize& size,
|
||||||
const long style, const wxString& name )
|
const long style, const wxString& name )
|
||||||
{
|
{
|
||||||
m_needParent = TRUE;
|
m_needParent = TRUE;
|
||||||
|
|
||||||
PreCreation( parent, id, pos, size, style, name );
|
PreCreation( parent, id, pos, size, style, name );
|
||||||
|
|
||||||
m_widget = gtk_notebook_new();
|
m_widget = gtk_notebook_new();
|
||||||
|
m_idHandler = gtk_signal_connect
|
||||||
|
(
|
||||||
|
GTK_OBJECT(m_widget), "switch_page",
|
||||||
|
GTK_SIGNAL_FUNC(gtk_notebook_page_change_callback),
|
||||||
|
(gpointer)this
|
||||||
|
);
|
||||||
|
|
||||||
PostCreation();
|
PostCreation();
|
||||||
|
|
||||||
Show( TRUE );
|
Show( TRUE );
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
};
|
};
|
||||||
|
|
||||||
int wxNotebook::GetSelection(void) const
|
int wxNotebook::GetSelection() const
|
||||||
{
|
{
|
||||||
if (m_pages.Number() == 0) return -1;
|
if (m_pages.Number() == 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
GtkNotebookPage *g_page = GTK_NOTEBOOK(m_widget)->cur_page;
|
GtkNotebookPage *g_page = GTK_NOTEBOOK(m_widget)->cur_page;
|
||||||
|
|
||||||
wxNotebookPage *page = NULL;
|
wxNotebookPage *page = NULL;
|
||||||
|
|
||||||
wxNode *node = m_pages.First();
|
wxNode *node = m_pages.First();
|
||||||
while (node)
|
while (node)
|
||||||
{
|
{
|
||||||
page = (wxNotebookPage*)node->Data();
|
page = (wxNotebookPage*)node->Data();
|
||||||
if (page->m_page == g_page) break;
|
if (page->m_page == g_page)
|
||||||
|
break;
|
||||||
node = node->Next();
|
node = node->Next();
|
||||||
};
|
};
|
||||||
|
|
||||||
if (!node) wxFatalError( "Notebook error." );
|
wxCHECK_MSG( node != NULL, -1, "wxNotebook: no selection?");
|
||||||
|
|
||||||
return page->m_id;
|
return page->m_id;
|
||||||
};
|
};
|
||||||
|
|
||||||
wxImageList* wxNotebook::GetImageList(void) const
|
int wxNotebook::GetPageCount() const
|
||||||
{
|
|
||||||
return m_imageList;
|
|
||||||
};
|
|
||||||
|
|
||||||
int wxNotebook::GetPageCount(void) const
|
|
||||||
{
|
{
|
||||||
return m_pages.Number();
|
return m_pages.Number();
|
||||||
};
|
};
|
||||||
|
|
||||||
int wxNotebook::GetRowCount(void) const
|
int wxNotebook::GetRowCount() const
|
||||||
{
|
{
|
||||||
return 1;
|
return 1;
|
||||||
};
|
};
|
||||||
|
|
||||||
wxString wxNotebook::GetPageText( const int page ) const
|
wxString wxNotebook::GetPageText( int page ) const
|
||||||
{
|
{
|
||||||
wxNotebookPage* nb_page = GetNotebookPage(page);
|
wxNotebookPage* nb_page = GetNotebookPage(page);
|
||||||
if (nb_page)
|
if (nb_page)
|
||||||
@@ -140,7 +173,7 @@ wxString wxNotebook::GetPageText( const int page ) const
|
|||||||
return "";
|
return "";
|
||||||
};
|
};
|
||||||
|
|
||||||
int wxNotebook::GetPageImage( const int page ) const
|
int wxNotebook::GetPageImage( int page ) const
|
||||||
{
|
{
|
||||||
wxNotebookPage* nb_page = GetNotebookPage(page);
|
wxNotebookPage* nb_page = GetNotebookPage(page);
|
||||||
if (nb_page)
|
if (nb_page)
|
||||||
@@ -149,15 +182,6 @@ int wxNotebook::GetPageImage( const int page ) const
|
|||||||
return 0;
|
return 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
void* wxNotebook::GetPageData( const int page ) const
|
|
||||||
{
|
|
||||||
wxNotebookPage* nb_page = GetNotebookPage(page);
|
|
||||||
if (nb_page)
|
|
||||||
return nb_page->m_clientData;
|
|
||||||
else
|
|
||||||
return NULL;
|
|
||||||
};
|
|
||||||
|
|
||||||
wxNotebookPage* wxNotebook::GetNotebookPage(int page) const
|
wxNotebookPage* wxNotebook::GetNotebookPage(int page) const
|
||||||
{
|
{
|
||||||
wxNotebookPage *nb_page = NULL;
|
wxNotebookPage *nb_page = NULL;
|
||||||
@@ -166,99 +190,106 @@ wxNotebookPage* wxNotebook::GetNotebookPage(int page) const
|
|||||||
while (node)
|
while (node)
|
||||||
{
|
{
|
||||||
nb_page = (wxNotebookPage*)node->Data();
|
nb_page = (wxNotebookPage*)node->Data();
|
||||||
if (nb_page->m_id == page) break;
|
if (nb_page->m_id == page)
|
||||||
|
return nb_page;
|
||||||
node = node->Next();
|
node = node->Next();
|
||||||
};
|
};
|
||||||
if (!node) return NULL;
|
|
||||||
return nb_page;
|
wxLogDebug("Notebook page %d not found!", page);
|
||||||
|
|
||||||
|
return NULL;
|
||||||
};
|
};
|
||||||
|
|
||||||
int wxNotebook::SetSelection( const int page )
|
int wxNotebook::SetSelection( int page )
|
||||||
{
|
{
|
||||||
|
int selOld = GetSelection();
|
||||||
wxNotebookPage* nb_page = GetNotebookPage(page);
|
wxNotebookPage* nb_page = GetNotebookPage(page);
|
||||||
if (!nb_page) return -1;
|
if (!nb_page)
|
||||||
|
return -1;
|
||||||
|
|
||||||
int page_num = 0;
|
int page_num = 0;
|
||||||
GList *child = GTK_NOTEBOOK(m_widget)->children;
|
GList *child = GTK_NOTEBOOK(m_widget)->children;
|
||||||
while (child)
|
while (child)
|
||||||
{
|
{
|
||||||
if (nb_page->m_page == (GtkNotebookPage*)child->data) break;
|
if (nb_page->m_page == (GtkNotebookPage*)child->data)
|
||||||
|
break;
|
||||||
page_num++;
|
page_num++;
|
||||||
child = child->next;
|
child = child->next;
|
||||||
};
|
};
|
||||||
|
|
||||||
if (!child) return -1;
|
if (!child) return -1;
|
||||||
|
|
||||||
gtk_notebook_set_page( GTK_NOTEBOOK(m_widget), page_num );
|
gtk_notebook_set_page( GTK_NOTEBOOK(m_widget), page_num );
|
||||||
|
|
||||||
return page;
|
return selOld;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
void wxNotebook::AdvanceSelection(bool bForward)
|
||||||
|
{
|
||||||
|
int nSel = GetSelection(),
|
||||||
|
nMax = GetPageCount();
|
||||||
|
|
||||||
|
if ( bForward ) {
|
||||||
|
SetSelection(nSel == nMax ? 0 : nSel + 1);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
SetSelection(nSel == 0 ? nMax : nSel - 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void wxNotebook::SetImageList( wxImageList* imageList )
|
void wxNotebook::SetImageList( wxImageList* imageList )
|
||||||
{
|
{
|
||||||
m_imageList = imageList;
|
m_imageList = imageList;
|
||||||
};
|
};
|
||||||
|
|
||||||
bool wxNotebook::SetPageText( const int page, const wxString &text )
|
bool wxNotebook::SetPageText( int page, const wxString &text )
|
||||||
{
|
|
||||||
wxNotebookPage* nb_page = GetNotebookPage(page);
|
|
||||||
if (!nb_page) return FALSE;
|
|
||||||
|
|
||||||
nb_page->m_text = text;
|
|
||||||
|
|
||||||
// recreate
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
};
|
|
||||||
|
|
||||||
bool wxNotebook::SetPageImage( const int page, const int image )
|
|
||||||
{
|
{
|
||||||
wxNotebookPage* nb_page = GetNotebookPage(page);
|
wxNotebookPage* nb_page = GetNotebookPage(page);
|
||||||
if (!nb_page)
|
if (!nb_page)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
nb_page->m_image = image;
|
nb_page->m_text = text;
|
||||||
|
|
||||||
// recreate
|
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
};
|
};
|
||||||
|
|
||||||
bool wxNotebook::SetPageData( const int page, void* data )
|
bool wxNotebook::SetPageImage( int page, const int image )
|
||||||
{
|
{
|
||||||
wxNotebookPage* nb_page = GetNotebookPage(page);
|
wxNotebookPage* nb_page = GetNotebookPage(page);
|
||||||
if (!nb_page) return FALSE;
|
if (!nb_page)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
nb_page->m_image = image;
|
||||||
|
|
||||||
nb_page->m_clientData = data;
|
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
};
|
};
|
||||||
|
|
||||||
void wxNotebook::SetPageSize( const wxSize &WXUNUSED(size) )
|
void wxNotebook::SetPageSize( const wxSize &WXUNUSED(size) )
|
||||||
{
|
{
|
||||||
|
wxFAIL_MSG("wxNotebook::SetPageSize not implemented");
|
||||||
};
|
};
|
||||||
|
|
||||||
void wxNotebook::SetPadding( const wxSize &WXUNUSED(padding) )
|
void wxNotebook::SetPadding( const wxSize &WXUNUSED(padding) )
|
||||||
{
|
{
|
||||||
// what's this ?
|
wxFAIL_MSG("wxNotebook::SetPadding not implemented");
|
||||||
};
|
};
|
||||||
|
|
||||||
bool wxNotebook::DeleteAllPages(void)
|
bool wxNotebook::DeleteAllPages()
|
||||||
{
|
{
|
||||||
wxNode *page_node = m_pages.First();
|
wxNode *page_node = m_pages.First();
|
||||||
while (page_node)
|
while (page_node)
|
||||||
{
|
{
|
||||||
wxNotebookPage *page = (wxNotebookPage*)page_node->Data();
|
wxNotebookPage *page = (wxNotebookPage*)page_node->Data();
|
||||||
|
|
||||||
DeletePage( page->m_id );
|
DeletePage( page->m_id );
|
||||||
|
|
||||||
page_node = m_pages.First();
|
page_node = m_pages.First();
|
||||||
};
|
};
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
};
|
};
|
||||||
|
|
||||||
bool wxNotebook::DeletePage( const int page )
|
bool wxNotebook::DeletePage( int page )
|
||||||
{
|
{
|
||||||
wxNotebookPage* nb_page = GetNotebookPage(page);
|
wxNotebookPage* nb_page = GetNotebookPage(page);
|
||||||
if (!nb_page) return FALSE;
|
if (!nb_page) return FALSE;
|
||||||
@@ -273,18 +304,19 @@ bool wxNotebook::DeletePage( const int page )
|
|||||||
};
|
};
|
||||||
|
|
||||||
wxASSERT( child );
|
wxASSERT( child );
|
||||||
|
|
||||||
delete nb_page->m_clientPanel;
|
delete nb_page->m_clientPanel;
|
||||||
|
|
||||||
// Amazingly, this is not necessary
|
// Amazingly, this is not necessary
|
||||||
// gtk_notebook_remove_page( GTK_NOTEBOOK(m_widget), page_num );
|
// gtk_notebook_remove_page( GTK_NOTEBOOK(m_widget), page_num );
|
||||||
|
|
||||||
m_pages.DeleteObject( nb_page );
|
m_pages.DeleteObject( nb_page );
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
};
|
};
|
||||||
|
|
||||||
bool wxNotebook::AddPage(wxWindow* win, const wxString& text, const int imageId, void* data)
|
bool wxNotebook::AddPage(wxWindow* win, const wxString& text,
|
||||||
|
bool bSelect, int imageId)
|
||||||
{
|
{
|
||||||
// we've created the notebook page in AddChild(). Now we just have to set
|
// we've created the notebook page in AddChild(). Now we just have to set
|
||||||
// the caption for the page and set the others parameters.
|
// the caption for the page and set the others parameters.
|
||||||
@@ -296,40 +328,41 @@ bool wxNotebook::AddPage(wxWindow* win, const wxString& text, const int imageId,
|
|||||||
while (node)
|
while (node)
|
||||||
{
|
{
|
||||||
page = (wxNotebookPage*)node->Data();
|
page = (wxNotebookPage*)node->Data();
|
||||||
if ( page->m_clientPanel == win )
|
if ( page->m_clientPanel == win )
|
||||||
break; // found
|
break; // found
|
||||||
node = node->Next();
|
node = node->Next();
|
||||||
};
|
};
|
||||||
|
|
||||||
if ( page == NULL ) {
|
|
||||||
wxFAIL_MSG("Can't add a page whose parent is not the notebook!");
|
|
||||||
|
|
||||||
return FALSE;
|
wxCHECK_MSG(page != NULL, FALSE,
|
||||||
}
|
"Can't add a page whose parent is not the notebook!");
|
||||||
|
|
||||||
// then set the attributes
|
// then set the attributes
|
||||||
page->m_text = text;
|
page->m_text = text;
|
||||||
if ( page->m_text.IsEmpty() )
|
if ( page->m_text.IsEmpty() )
|
||||||
page->m_text = "";
|
page->m_text = "";
|
||||||
page->m_image = imageId;
|
page->m_image = imageId;
|
||||||
page->m_clientData = data;
|
|
||||||
gtk_label_set(page->m_label, page->m_text);
|
gtk_label_set(page->m_label, page->m_text);
|
||||||
|
|
||||||
|
if ( bSelect ) {
|
||||||
|
SetSelection(GetPageCount());
|
||||||
|
}
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
};
|
};
|
||||||
|
|
||||||
wxWindow *wxNotebook::GetPageWindow( const int page ) const
|
wxWindow *wxNotebook::GetPage( int page ) const
|
||||||
{
|
{
|
||||||
wxNotebookPage* nb_page = GetNotebookPage(page);
|
wxNotebookPage* nb_page = GetNotebookPage(page);
|
||||||
if (!nb_page) return NULL;
|
if (!nb_page)
|
||||||
|
return NULL;
|
||||||
return nb_page->m_clientPanel;
|
else
|
||||||
|
return nb_page->m_clientPanel;
|
||||||
};
|
};
|
||||||
|
|
||||||
void wxNotebook::AddChild( wxWindow *win )
|
void wxNotebook::AddChild( wxWindow *win )
|
||||||
{
|
{
|
||||||
// @@@ normally done in wxWindow::AddChild but for some reason wxNotebook
|
// @@@ normally done in wxWindow::AddChild but for some reason wxNotebook
|
||||||
// case is speicla there (Robert?)
|
// case is special there (Robert?)
|
||||||
m_children.Append(win);
|
m_children.Append(win);
|
||||||
|
|
||||||
wxNotebookPage *page = new wxNotebookPage();
|
wxNotebookPage *page = new wxNotebookPage();
|
||||||
@@ -337,15 +370,15 @@ void wxNotebook::AddChild( wxWindow *win )
|
|||||||
page->m_id = GetPageCount();
|
page->m_id = GetPageCount();
|
||||||
page->m_label = (GtkLabel *)gtk_label_new("no caption");
|
page->m_label = (GtkLabel *)gtk_label_new("no caption");
|
||||||
page->m_clientPanel = win;
|
page->m_clientPanel = win;
|
||||||
gtk_notebook_append_page(GTK_NOTEBOOK(m_widget), win->m_widget,
|
gtk_notebook_append_page(GTK_NOTEBOOK(m_widget), win->m_widget,
|
||||||
(GtkWidget *)page->m_label);
|
(GtkWidget *)page->m_label);
|
||||||
gtk_misc_set_alignment(GTK_MISC(page->m_label), 0.0, 0.5);
|
gtk_misc_set_alignment(GTK_MISC(page->m_label), 0.0, 0.5);
|
||||||
|
|
||||||
page->m_page = (GtkNotebookPage*)
|
page->m_page = (GtkNotebookPage*)
|
||||||
(
|
(
|
||||||
g_list_last(GTK_NOTEBOOK(m_widget)->children)->data
|
g_list_last(GTK_NOTEBOOK(m_widget)->children)->data
|
||||||
);
|
);
|
||||||
|
|
||||||
if (!page->m_page)
|
if (!page->m_page)
|
||||||
{
|
{
|
||||||
wxLogFatalError( "Notebook page creation error" );
|
wxLogFatalError( "Notebook page creation error" );
|
||||||
@@ -362,20 +395,17 @@ void wxNotebook::OnSize(wxSizeEvent& event)
|
|||||||
while (node)
|
while (node)
|
||||||
{
|
{
|
||||||
wxNotebookPage *page = (wxNotebookPage*)node->Data();
|
wxNotebookPage *page = (wxNotebookPage*)node->Data();
|
||||||
page->m_clientPanel->SetSize(event.GetSize().GetX(), event.GetSize().GetY());
|
// @@@@ This -50 is completely wrong - instead, we should substract
|
||||||
|
// the height of the tabs
|
||||||
|
page->m_clientPanel->SetSize(event.GetSize().GetX(),
|
||||||
|
event.GetSize().GetY() - 50);
|
||||||
|
|
||||||
node = node->Next();
|
node = node->Next();
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// wxTabEvent
|
// wxNotebookEvent
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
IMPLEMENT_DYNAMIC_CLASS(wxTabEvent, wxCommandEvent)
|
IMPLEMENT_DYNAMIC_CLASS(wxNotebookEvent, wxCommandEvent)
|
||||||
|
|
||||||
wxTabEvent::wxTabEvent( WXTYPE commandType, int id ) :
|
|
||||||
wxCommandEvent(commandType, id)
|
|
||||||
{
|
|
||||||
};
|
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user