///////////////////////////////////////////////////////////////////////////////
-// Name: notebook.cpp
+// Name: src/os2/notebook.cpp
// Purpose: implementation of wxNotebook
// Author: David Webster
// Modified by:
#if wxUSE_NOTEBOOK
-// wxWindows
+#include "wx/notebook.h"
+
+// wxWidgets
#ifndef WX_PRECOMP
- #include "wx/string.h"
+ #include "wx/app.h"
+ #include "wx/dcclient.h"
+ #include "wx/string.h"
+ #include "wx/settings.h"
+ #include "wx/log.h"
+ #include "wx/event.h"
+ #include "wx/control.h"
#endif // WX_PRECOMP
-#include "wx/log.h"
#include "wx/imaglist.h"
-#include "wx/event.h"
-#include "wx/control.h"
-#include "wx/notebook.h"
#include "wx/os2/private.h"
// ----------------------------------------------------------------------------
// check that the page index is valid
-#define IS_VALID_PAGE(nPage) (((nPage) >= 0) && ((nPage) < GetPageCount()))
+#define IS_VALID_PAGE(nPage) ( \
+ /* size_t is _always_ >= 0 */ \
+ /* ((nPage) >= 0) && */ \
+ ((nPage) < GetPageCount()) \
+ )
// hide the ugly cast
#define m_hWnd (HWND)GetHWND()
// event table
// ----------------------------------------------------------------------------
-DEFINE_EVENT_TYPE(wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED)
-DEFINE_EVENT_TYPE(wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGING)
-
-BEGIN_EVENT_TABLE(wxNotebook, wxControl)
- EVT_NOTEBOOK_PAGE_CHANGED(-1, wxNotebook::OnSelChange)
+BEGIN_EVENT_TABLE(wxNotebook, wxBookCtrlBase)
+ EVT_NOTEBOOK_PAGE_CHANGED(wxID_ANY, wxNotebook::OnSelChange)
EVT_SIZE(wxNotebook::OnSize)
EVT_SET_FOCUS(wxNotebook::OnSetFocus)
EVT_NAVIGATION_KEY(wxNotebook::OnNavigationKey)
END_EVENT_TABLE()
-IMPLEMENT_DYNAMIC_CLASS(wxNotebook, wxControl)
-IMPLEMENT_DYNAMIC_CLASS(wxNotebookEvent, wxNotifyEvent)
-
// ============================================================================
// implementation
// ============================================================================
void wxNotebook::Init()
{
m_imageList = NULL;
- m_nSelection = -1;
m_nTabSize = 0;
} // end of wxNotebook::Init
//
// Create() function
//
-bool wxNotebook::Create(
- wxWindow* pParent
-, wxWindowID vId
-, const wxPoint& rPos
-, const wxSize& rSize
-, long lStyle
-, const wxString& rsName
-)
+bool wxNotebook::Create( wxWindow* pParent,
+ wxWindowID vId,
+ const wxPoint& rPos,
+ const wxSize& rSize,
+ long lStyle,
+ const wxString& rsName )
{
+ if ( (lStyle & wxBK_ALIGN_MASK) == wxBK_DEFAULT )
+ lStyle |= wxBK_TOP;
//
// Base init
//
,wxDefaultValidator
,rsName
))
- return FALSE;
+ return false;
//
// Notebook, so explicitly specify 0 as last parameter
//
- if (!OS2CreateControl( "NOTEBOOK"
- ,_T("")
+ if (!OS2CreateControl( wxT("NOTEBOOK")
+ ,wxEmptyString
,rPos
,rSize
,lStyle | wxTAB_TRAVERSAL
))
- return FALSE;
+ return false;
SetBackgroundColour(wxColour(wxSystemSettings::GetColour(wxSYS_COLOUR_BTNFACE)));
- return TRUE;
+ return true;
} // end of wxNotebook::Create
WXDWORD wxNotebook::OS2GetStyle (
,pdwExstyle
);
- dwTabStyle |= WS_TABSTOP | BKS_SOLIDBIND | BKS_ROUNDEDTABS | BKS_TABTEXTCENTER;
+ dwTabStyle |= WS_TABSTOP | BKS_SOLIDBIND | BKS_ROUNDEDTABS | BKS_TABTEXTCENTER | BKS_TABBEDDIALOG;
- if (lStyle & wxNB_BOTTOM)
+ if (lStyle & wxBK_BOTTOM)
dwTabStyle |= BKS_MAJORTABBOTTOM | BKS_BACKPAGESBL;
- else if (lStyle & wxNB_RIGHT)
+ else if (lStyle & wxBK_RIGHT)
dwTabStyle |= BKS_MAJORTABRIGHT | BKS_BACKPAGESBR;
- else if (lStyle & wxNB_LEFT)
+ else if (lStyle & wxBK_LEFT)
dwTabStyle |= BKS_MAJORTABLEFT | BKS_BACKPAGESTL;
else // default to top
dwTabStyle |= BKS_MAJORTABTOP | BKS_BACKPAGESTR;
// wxNotebook accessors
// ----------------------------------------------------------------------------
-int wxNotebook::GetPageCount() const
+size_t wxNotebook::GetPageCount() const
{
- int nPageInternal = m_pages.Count();
- int nPageAPI = (int)::WinSendMsg(GetHWND(), BKM_QUERYPAGECOUNT, (MPARAM)0, (MPARAM)BKA_END);
-
//
// Consistency check
//
);
} // end of wxNotebook::GetRowCount
-int wxNotebook::SetSelection(
- int nPage
-)
+int wxNotebook::SetSelection( size_t nPage )
{
- wxCHECK_MSG( IS_VALID_PAGE(nPage), -1, wxT("notebook page out of range") );
- int nOldPage = GetSelection();
+ wxCHECK_MSG( IS_VALID_PAGE(nPage), wxNOT_FOUND, wxT("notebook page out of range") );
- ChangePage( m_nSelection
- ,nPage
- );
+ if (nPage != (size_t)m_selection)
+ {
+ wxBookCtrlEvent vEvent( wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGING
+ ,m_windowId
+ );
- ULONG ulPageId = (ULONG)m_alPageId[nPage];
+ vEvent.SetSelection(nPage);
+ vEvent.SetOldSelection(m_selection);
+ vEvent.SetEventObject(this);
+ if (!HandleWindowEvent(vEvent) || vEvent.IsAllowed())
+ {
- ::WinSendMsg( GetHWND()
- ,BKM_TURNTOPAGE
- ,MPFROMLONG((ULONG)m_alPageId[nPage])
- ,(MPARAM)0
- );
- m_nSelection = nPage;
+ //
+ // Program allows the page change
+ //
+ vEvent.SetEventType(wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED);
+ HandleWindowEvent(vEvent);
+
+ ::WinSendMsg( GetHWND()
+ ,BKM_TURNTOPAGE
+ ,MPFROMLONG((ULONG)m_alPageId[nPage])
+ ,(MPARAM)0
+ );
+ }
+ }
+ m_selection = nPage;
return nPage;
} // end of wxNotebook::SetSelection
-bool wxNotebook::SetPageText(
- int nPage
-, const wxString& rsStrText
-)
+int wxNotebook::ChangeSelection( size_t nPage )
{
- wxCHECK_MSG( IS_VALID_PAGE(nPage), FALSE, wxT("notebook page out of range") );
+ wxCHECK_MSG( IS_VALID_PAGE(nPage), wxNOT_FOUND, wxT("notebook page out of range") );
+ if (nPage != (size_t)m_selection)
+ {
+ ::WinSendMsg( GetHWND()
+ ,BKM_TURNTOPAGE
+ ,MPFROMLONG((ULONG)m_alPageId[nPage])
+ ,(MPARAM)0
+ );
+ }
+ m_selection = nPage;
+ return nPage;
+}
- ULONG ulPageId = (ULONG)m_alPageId[nPage];
-
+bool wxNotebook::SetPageText( size_t nPage,
+ const wxString& rsStrText )
+{
+ wxCHECK_MSG( IS_VALID_PAGE(nPage), false, wxT("notebook page out of range") );
return (bool)::WinSendMsg( m_hWnd
,BKM_SETTABTEXT
,MPFROMLONG((ULONG)m_alPageId[nPage])
- ,MPFROMP((PSZ)rsStrText.c_str())
+ ,MPFROMP((const char*)rsStrText.c_str())
);
} // end of wxNotebook::SetPageText
-wxString wxNotebook::GetPageText (
- int nPage
-) const
+wxString wxNotebook::GetPageText ( size_t nPage ) const
{
BOOKTEXT vBookText;
wxChar zBuf[256];
wxString sStr;
ULONG ulRc;
- wxCHECK_MSG( IS_VALID_PAGE(nPage), wxT(""), wxT("notebook page out of range") );
-
-
- ULONG ulPageId = (ULONG)m_alPageId[nPage];
+ wxCHECK_MSG( IS_VALID_PAGE(nPage), wxEmptyString, wxT("notebook page out of range") );
memset(&vBookText, '\0', sizeof(BOOKTEXT));
vBookText.textLen = 0; // This will get the length
,MPFROMLONG((ULONG)m_alPageId[nPage])
,MPFROMP(&vBookText)
));
- if (ulRc == BOOKERR_INVALID_PARAMETERS || ulRc == 0L)
+ if (ulRc == (ULONG)BOOKERR_INVALID_PARAMETERS || ulRc == 0L)
{
- if (ulRc == BOOKERR_INVALID_PARAMETERS)
+ if (ulRc == (ULONG)BOOKERR_INVALID_PARAMETERS)
{
wxLogError(wxT("Invalid Page Id for page text querry."));
}
return wxEmptyString;
}
vBookText.textLen = ulRc + 1; // To get the null terminator
- vBookText.pString = zBuf;
+ vBookText.pString = (char*)zBuf;
//
// Now get the actual text
,MPFROMLONG((ULONG)m_alPageId[nPage])
,MPFROMP(&vBookText)
));
- if (ulRc == BOOKERR_INVALID_PARAMETERS || ulRc == 0L)
+ if (ulRc == (ULONG)BOOKERR_INVALID_PARAMETERS || ulRc == 0L)
{
return wxEmptyString;
}
ulRc = 255L;
vBookText.pString[ulRc] = '\0';
- sStr = vBookText.pString;
+ sStr = (wxChar*)vBookText.pString;
return sStr;
} // end of wxNotebook::GetPageText
-int wxNotebook::GetPageImage (
- int nPage
-) const
+int wxNotebook::GetPageImage ( size_t nPage ) const
{
- wxCHECK_MSG( IS_VALID_PAGE(nPage), -1, wxT("notebook page out of range") );
+ wxCHECK_MSG( IS_VALID_PAGE(nPage), wxNOT_FOUND, wxT("notebook page out of range") );
//
// For OS/2 just return the page
} // end of wxNotebook::GetPageImage
bool wxNotebook::SetPageImage (
- int nPage
+ size_t nPage
, int nImage
)
{
- wxBitmap* pBitmap = (wxBitmap*)m_imageList->GetBitmap(nImage);
-
-
- ULONG ulPageId = (ULONG)m_alPageId[nPage];
+ wxBitmap vBitmap = (wxBitmap)m_imageList->GetBitmap(nImage);
return (bool)::WinSendMsg( GetHWND()
,BKM_SETTABBITMAP
,MPFROMLONG((ULONG)m_alPageId[nPage])
- ,(MPARAM)pBitmap->GetHBITMAP()
+ ,(MPARAM)wxCopyBmp(vBitmap.GetHBITMAP(), true)
);
} // end of wxNotebook::SetPageImage
void wxNotebook::SetImageList (
- wxImageList* WXUNUSED(pImageList)
+ wxImageList* pImageList
)
{
//
- // Does nothing under OS/2
+ // Does not really do anything yet, but at least we need to
+ // update the base class.
//
+ wxNotebookBase::SetImageList(pImageList);
} // end of wxNotebook::SetImageList
// ----------------------------------------------------------------------------
const wxSize& rSize
)
{
- RECTL vRect;
-
- //
- // Transform the page size into the notebook size
- //
- vRect.xLeft = vRect.yTop = 0;
- vRect.xRight = rSize.x;
- vRect.yBottom = rSize.y;
-
-
- //
- // And now set it
- //
- SetSize( vRect.xRight - vRect.xLeft
- ,vRect.yBottom - vRect.yTop
- );
+ SetSize(rSize);
} // end of wxNotebook::SetPageSize
void wxNotebook::SetPadding (
//
// Remove one page from the notebook, without deleting
//
-wxNotebookPage* wxNotebook::DoRemovePage (
- int nPage
-)
+wxNotebookPage* wxNotebook::DoRemovePage ( size_t nPage )
{
- wxNotebookPage* pPageRemoved = wxNotebookBase::DoRemovePage(nPage);
+ wxNotebookPage* pPageRemoved = wxNotebookBase::DoRemovePage(nPage);
if (!pPageRemoved)
return NULL;
-
- ULONG ulPageId = (ULONG)m_alPageId[nPage];
-
::WinSendMsg( GetHWND()
,BKM_DELETEPAGE
,MPFROMLONG((ULONG)m_alPageId[nPage])
//
// No selection any more, the notebook becamse empty
//
- m_nSelection = -1;
+ m_selection = wxNOT_FOUND;
}
else // notebook still not empty
{
//
int nSelNew;
- if (m_nSelection == GetPageCount())
+ if (m_selection == (int)GetPageCount())
{
//
// Last page deleted, make the new last page the new selection
//
- nSelNew = m_nSelection - 1;
+ nSelNew = m_selection - 1;
}
- else if (nPage <= m_nSelection)
+ else if (nPage <= (size_t)m_selection)
{
//
// We must show another page, even if it has the same index
//
- nSelNew = m_nSelection;
+ nSelNew = m_selection;
}
else // nothing changes for the currently selected page
{
- nSelNew = -1;
+ nSelNew = wxNOT_FOUND;
//
// We still must refresh the current page: this needs to be done
// control (i.e. when there are too many pages) -- otherwise after
// deleting a page nothing at all is shown
//
- m_pages[m_nSelection]->Refresh();
+ m_pages[m_selection]->Refresh();
}
- if (nSelNew != -1)
+ if (nSelNew != wxNOT_FOUND)
{
//
- // m_nSelection must be always valid so reset it before calling
+ // m_selection must be always valid so reset it before calling
// SetSelection()
//
- m_nSelection = -1;
+ m_selection = wxNOT_FOUND;
SetSelection(nSelNew);
}
}
,(MPARAM)0
,(MPARAM)BKA_ALL
);
- m_nSelection = -1;
- return TRUE;
+ m_selection = wxNOT_FOUND;
+
+ return true;
} // end of wxNotebook::DeleteAllPages
//
//
// Same as AddPage() but does it at given position
//
-bool wxNotebook::InsertPage (
- int nPage
-, wxNotebookPage* pPage
-, const wxString& rsStrText
-, bool bSelect
-, int nImageId
-)
+bool wxNotebook::InsertPage ( size_t nPage,
+ wxNotebookPage* pPage,
+ const wxString& rsStrText,
+ bool bSelect,
+ int nImageId )
{
ULONG ulApiPage;
wxASSERT( pPage != NULL );
- wxCHECK( IS_VALID_PAGE(nPage) || nPage == GetPageCount(), FALSE );
+ wxCHECK( IS_VALID_PAGE(nPage) || nPage == GetPageCount(), false );
//
// Under OS/2 we can only insert FIRST, LAST, NEXT or PREV. Requires
vError = ::WinGetLastError(vHabmain);
sError = wxPMErrorToStr(vError);
- return FALSE;
+ return false;
}
m_alPageId.Insert((long)ulApiPage, nPage);
}
vError = ::WinGetLastError(vHabmain);
sError = wxPMErrorToStr(vError);
- return FALSE;
+ return false;
}
m_alPageId.Insert((long)ulApiPage, nPage);
}
,MPFROMLONG((ULONG)m_alPageId[nPage])
,MPFROMHWND(pPage->GetHWND())
))
- return FALSE;
+ return false;
}
//
// If the inserted page is before the selected one, we must update the
// index of the selected page
//
- if (nPage <= m_nSelection)
+ if (nPage <= (size_t)m_selection)
{
//
// One extra page added
//
- m_nSelection++;
+ m_selection++;
}
if (pPage)
// Now set TAB dimenstions
//
- wxWindowDC vDC(this);
- wxCoord nTextX;
- wxCoord nTextY;
+ wxWindowDC vDC(this);
+ wxCoord nTextX;
+ wxCoord nTextY;
vDC.GetTextExtent(rsStrText, &nTextX, &nTextY);
nTextY *= 2;
- nTextX *= 1.3;
+ nTextX = (wxCoord)(nTextX * 1.3);
if (nTextX > m_nTabSize)
{
m_nTabSize = nTextX;
//
// Now set any TAB text
//
- if (!rsStrText.IsEmpty())
+ if (!rsStrText.empty())
{
if (!SetPageText( nPage
,rsStrText
))
- return FALSE;
+ return false;
}
//
if (!SetPageImage( nPage
,nImageId
))
- return FALSE;
+ return false;
}
if (pPage)
//
// Don't show pages by default (we'll need to adjust their size first)
//
- HWND hWnd = GetWinHwnd(pPage);
+ HWND hWnd = GetWinHwnd(pPage);
WinSetWindowULong( hWnd
,QWL_STYLE
//
// This updates internal flag too - otherwise it will get out of sync
//
- pPage->Show(FALSE);
+ pPage->Show(false);
}
- //
- // Some page should be selected: either this one or the first one if there is
- // still no selection
- //
- int nSelNew = -1;
+ DoSetSelectionAfterInsertion(nPage, bSelect);
- if (bSelect)
- nSelNew = nPage;
- else if ( m_nSelection == -1 )
- nSelNew = 0;
+ InvalidateBestSize();
- if (nSelNew != -1)
- SetSelection(nSelNew);
- return TRUE;
+ return true;
} // end of wxNotebook::InsertPage
// ----------------------------------------------------------------------------
wxSizeEvent& rEvent
)
{
- if (m_nSelection < m_pages.Count() && m_nSelection >= 0)
- m_pages[m_nSelection]->Refresh();
rEvent.Skip();
} // end of wxNotebook::OnSize
void wxNotebook::OnSelChange (
- wxNotebookEvent& rEvent
+ wxBookCtrlEvent& rEvent
)
{
//
//
if (rEvent.GetEventObject() == this)
{
- int nSel = rEvent.GetOldSelection();
+ int nPageCount = GetPageCount();
+ int nSel;
+ ULONG ulOS2Sel = (ULONG)rEvent.GetOldSelection();
+ bool bFound = false;
- if (nSel != -1)
+ for (nSel = 0; nSel < nPageCount; nSel++)
{
- m_pages[nSel]->Show(FALSE);
- m_pages[nSel]->SetActivePage(FALSE);
+ if (ulOS2Sel == (ULONG)m_alPageId[nSel])
+ {
+ bFound = true;
+ break;
+ }
}
- nSel = rEvent.GetSelection();
- if (nSel != -1)
- {
- wxNotebookPage* pPage = m_pages[nSel];
- pPage->Show(TRUE);
- pPage->SetFocus();
- m_pages[nSel]->SetActivePage(TRUE);
+ if (!bFound)
+ return;
+
+ m_pages[nSel]->Show(false);
+
+ ulOS2Sel = (ULONG)rEvent.GetSelection();
+
+ bFound = false;
+
+ for (nSel = 0; nSel < nPageCount; nSel++)
+ {
+ if (ulOS2Sel == (ULONG)m_alPageId[nSel])
+ {
+ bFound = true;
+ break;
+ }
}
- m_nSelection = nSel;
+
+ if (!bFound)
+ return;
+
+ wxNotebookPage* pPage = m_pages[nSel];
+
+ pPage->Show(true);
+ m_selection = nSel;
}
//
//
// set focus to the currently selected page if any
//
- if (m_nSelection != -1)
- m_pages[m_nSelection]->SetFocus();
+ if (m_selection != wxNOT_FOUND)
+ m_pages[m_selection]->SetFocus();
rEvent.Skip();
} // end of wxNotebook::OnSetFocus
//
// No, it doesn't come from child, case (b): forward to a page
//
- if (m_nSelection != -1)
+ if (m_selection != wxNOT_FOUND)
{
//
// So that the page knows that the event comes from it's parent
//
rEvent.SetEventObject(this);
- wxWindow* pPage = m_pages[m_nSelection];
+ wxWindow* pPage = m_pages[m_selection];
- if (!pPage->GetEventHandler()->ProcessEvent(rEvent))
+ if (!pPage->HandleWindowEvent(rEvent))
{
pPage->SetFocus();
}
if (pParent)
{
rEvent.SetCurrentFocus(this);
- pParent->GetEventHandler()->ProcessEvent(rEvent);
+ pParent->HandleWindowEvent(rEvent);
}
}
}
//
// Override these 2 functions to do nothing: everything is done in OnSize
//
-void wxNotebook::SetConstraintSizes(
- bool WXUNUSED(bRecurse)
-)
+void wxNotebook::SetConstraintSizes( bool WXUNUSED(bRecurse) )
{
//
// Don't set the sizes of the pages - their correct size is not yet known
//
- wxControl::SetConstraintSizes(FALSE);
+ wxControl::SetConstraintSizes(false);
} // end of wxNotebook::SetConstraintSizes
-bool wxNotebook::DoPhase (
- int WXUNUSED(nPhase)
-)
+bool wxNotebook::DoPhase ( int WXUNUSED(nPhase) )
{
- return TRUE;
+ return true;
} // end of wxNotebook::DoPhase
// ----------------------------------------------------------------------------
// wxNotebook Windows message handlers
// ----------------------------------------------------------------------------
-bool wxNotebook::OS2OnScroll (
- int nOrientation
-, WXWORD wSBCode
-, WXWORD wPos
-, WXHWND wControl
-)
+bool wxNotebook::OS2OnScroll ( int nOrientation,
+ WXWORD wSBCode,
+ WXWORD wPos,
+ WXHWND wControl )
{
//
// Don't generate EVT_SCROLLWIN events for the WM_SCROLLs coming from the
// up-down control
//
if (wControl)
- return FALSE;
+ return false;
return wxNotebookBase::OS2OnScroll( nOrientation
,wSBCode
,wPos
);
} // end of wxNotebook::OS2OnScroll
-// ----------------------------------------------------------------------------
-// wxNotebook helper functions
-// ----------------------------------------------------------------------------
-
-//
-// Generate the page changing and changed events, hide the currently active
-// panel and show the new one
-//
-void wxNotebook::ChangePage (
- int nOldSel
-, int nSel
-)
-{
- static bool sbInsideChangePage = FALSE;
-
- //
- // When we call ProcessEvent(), our own OnSelChange() is called which calls
- // this function - break the infinite loop
- //
- if (sbInsideChangePage)
- return;
-
- //
- // It's not an error (the message may be generated by the tab control itself)
- // and it may happen - just do nothing
- //
- if (nSel == nOldSel)
- return;
-
- sbInsideChangePage = TRUE;
-
- wxNotebookEvent rEvent( wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGING
- ,m_windowId
- );
-
- rEvent.SetSelection(nSel);
- rEvent.SetOldSelection(nOldSel);
- rEvent.SetEventObject(this);
- if (GetEventHandler()->ProcessEvent(rEvent) && !rEvent.IsAllowed())
- {
- //
- // Program doesn't allow the page change
- //
- sbInsideChangePage = FALSE;
- return;
- }
- rEvent.SetEventType(wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED);
- GetEventHandler()->ProcessEvent(rEvent);
- sbInsideChangePage = FALSE;
-} // end of wxNotebook::ChangePage
-
#endif // wxUSE_NOTEBOOK
-