Added files for wxNotebook and wxCocoaNSTabView

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@26679 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
David Elliott
2004-04-09 20:19:06 +00:00
parent 8ac7759580
commit 7848088476
4 changed files with 500 additions and 0 deletions

View File

@@ -0,0 +1,34 @@
///////////////////////////////////////////////////////////////////////////////
// Name: wx/cocoa/NSTabView.h
// Purpose: wxCocoaNSTabView class
// Author: David Elliott
// Modified by:
// Created: 2004/04/08
// RCS-ID: $Id$
// Copyright: (c) 2004 David Elliott
// Licence: wxWindows licence
///////////////////////////////////////////////////////////////////////////////
#ifndef _WX_COCOA_NSTABVIEW_H__
#define _WX_COCOA_NSTABVIEW_H__
#include "wx/hashmap.h"
#include "wx/cocoa/ObjcAssociate.h"
#include "wx/cocoa/ObjcRef.h"
DECLARE_WXCOCOA_OBJC_CLASS(NSTabView);
DECLARE_WXCOCOA_OBJC_CLASS(NSTabViewItem);
WX_DECLARE_OBJC_HASHMAP(NSTabView);
class wxCocoaNSTabView
{
WX_DECLARE_OBJC_INTERFACE_HASHMAP(NSTabView)
public:
void AssociateNSTabView(WX_NSTabView cocoaNSTabView);
void DisassociateNSTabView(WX_NSTabView ocoaNSTabView);
virtual void CocoaDelegate_tabView_didSelectTabViewItem(WX_NSTabViewItem tabviewItem) = 0;
virtual bool CocoaDelegate_tabView_shouldSelectTabViewItem(WX_NSTabViewItem tabviewItem) = 0;
protected:
static wxObjcAutoRefFromAlloc<struct objc_object*> sm_cocoaDelegate;
};
#endif // _WX_COCOA_NSTABVIEW_H__

103
include/wx/cocoa/notebook.h Normal file
View File

@@ -0,0 +1,103 @@
/////////////////////////////////////////////////////////////////////////////
// Name: wx/cocoa/notebook.h
// Purpose: wxNotebook class
// Author: David Elliott
// Modified by:
// Created: 2004/04/08
// RCS-ID: $Id$
// Copyright: (c) 2004 David Elliott
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#ifndef _WX_COCOA_NOTEBOOK_H__
#define _WX_COCOA_NOTEBOOK_H__
#include "wx/cocoa/NSTabView.h"
// ========================================================================
// wxNotebook
// ========================================================================
class WXDLLEXPORT wxNotebook: public wxNotebookBase, protected wxCocoaNSTabView
{
DECLARE_DYNAMIC_CLASS(wxNotebook)
DECLARE_EVENT_TABLE()
WX_DECLARE_COCOA_OWNER(NSTabView,NSView,NSView)
// ------------------------------------------------------------------------
// initialization
// ------------------------------------------------------------------------
public:
wxNotebook() { }
wxNotebook(wxWindow *parent, wxWindowID winid,
const wxPoint& pos = wxDefaultPosition,
const wxSize& size = wxDefaultSize,
long style = 0,
const wxString& name = wxNOTEBOOK_NAME)
{
Create(parent, winid, pos, size, style, name);
}
bool Create(wxWindow *parent, wxWindowID winid,
const wxPoint& pos = wxDefaultPosition,
const wxSize& size = wxDefaultSize,
long style = 0,
const wxString& name = wxNOTEBOOK_NAME);
virtual ~wxNotebook();
// ------------------------------------------------------------------------
// Cocoa callbacks
// ------------------------------------------------------------------------
protected:
// Notebooks cannot be enabled/disabled
virtual void CocoaSetEnabled(bool enable) { }
virtual void CocoaDelegate_tabView_didSelectTabViewItem(WX_NSTabViewItem tabviewItem);
virtual bool CocoaDelegate_tabView_shouldSelectTabViewItem(WX_NSTabViewItem tabviewItem);
// ------------------------------------------------------------------------
// Implementation
// ------------------------------------------------------------------------
public:
// 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(size_t nPage);
// get the currently selected page
int GetSelection() const;
// set/get the title of a page
bool SetPageText(size_t nPage, const wxString& strText);
wxString GetPageText(size_t nPage) const;
// sets/returns item's image index in the current image list
int GetPageImage(size_t nPage) const;
bool SetPageImage(size_t nPage, int nImage);
// set the size (the same for all pages)
void SetPageSize(const wxSize& size);
// SetPadding and SetTabSize aren't possible to implement
void SetPadding(const wxSize& padding);
void SetTabSize(const wxSize& sz);
//-----------------------
// adding/removing pages
// remove one page from the notebook, without deleting
virtual wxNotebookPage *DoRemovePage(size_t nPage);
// remove one page from the notebook
bool DeletePage(size_t 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.
// the same as AddPage(), but adds it at the specified position
bool InsertPage( size_t position,
wxNotebookPage *win,
const wxString& strText,
bool bSelect = FALSE,
int imageId = -1 );
protected:
};
#endif //ndef _WX_COCOA_NOTEBOOK_H__

73
src/cocoa/NSTabView.mm Normal file
View File

@@ -0,0 +1,73 @@
/////////////////////////////////////////////////////////////////////////////
// Name: cocoa/NSTabView.mm
// Purpose: wxCocoaNSTabView
// Author: David Elliott
// Modified by:
// Created: 2004/04/08
// RCS-ID: $Id$
// Copyright: (c) 2004 David Elliott
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#include "wx/wxprec.h"
#ifndef WX_PRECOMP
#endif // WX_PRECOMP
#include "wx/cocoa/NSTabView.h"
#include <AppKit/NSTabView.h>
// ============================================================================
// @class wxNSTabViewDelegate
// ============================================================================
@interface wxNSTabViewDelegate : NSObject
{
}
- (void)tabView:(NSTabView*)tabView didSelectTabViewItem:(NSTabViewItem*)tabViewItem;
- (BOOL)tabView:(NSTabView*)tabView shouldSelectTabViewItem:(NSTabViewItem*)tabViewItem;
@end // interface wxNSTabViewDelegate : NSObject
@implementation wxNSTabViewDelegate : NSObject
- (void)tabView:(NSTabView*)tabView didSelectTabViewItem:(NSTabViewItem*)tabViewItem
{
wxCocoaNSTabView *notebook = wxCocoaNSTabView::GetFromCocoa(tabView);
wxCHECK_RET(notebook, wxT("This delegate is for use only with wxCocoa NSTabViews"));
notebook->CocoaDelegate_tabView_didSelectTabViewItem(tabViewItem);
}
- (BOOL)tabView:(NSTabView*)tabView shouldSelectTabViewItem:(NSTabViewItem*)tabViewItem
{
wxCocoaNSTabView *notebook = wxCocoaNSTabView::GetFromCocoa(tabView);
wxCHECK_MSG(notebook, true, wxT("This delegate is for use only with wxCocoa NSTabViews"));
return notebook->CocoaDelegate_tabView_shouldSelectTabViewItem(tabViewItem);
}
@end // implementation wxNSTabViewDelegate : NSObject
// ============================================================================
// class wxCocoaNSTabView
// ============================================================================
WX_IMPLEMENT_OBJC_INTERFACE_HASHMAP(NSTabView)
wxObjcAutoRefFromAlloc<struct objc_object*> wxCocoaNSTabView::sm_cocoaDelegate = [[wxNSTabViewDelegate alloc] init];
void wxCocoaNSTabView::AssociateNSTabView(WX_NSTabView cocoaNSTabView)
{
if(cocoaNSTabView)
{
sm_cocoaHash.insert(wxCocoaNSTabViewHash::value_type(cocoaNSTabView,this));
[cocoaNSTabView setDelegate: sm_cocoaDelegate];
}
}
void wxCocoaNSTabView::DisassociateNSTabView(WX_NSTabView cocoaNSTabView)
{
if(cocoaNSTabView)
{
[cocoaNSTabView setDelegate: nil];
sm_cocoaHash.erase(cocoaNSTabView);
}
}

290
src/cocoa/notebook.mm Normal file
View File

@@ -0,0 +1,290 @@
/////////////////////////////////////////////////////////////////////////////
// Name: cocoa/notebook.mm
// Purpose: wxNotebook
// Author: David Elliott
// Modified by:
// Created: 2004/04/08
// RCS-ID: $Id$
// Copyright: (c) 2004 David Elliott
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#include "wx/wxprec.h"
#ifndef WX_PRECOMP
#include "wx/app.h"
#include "wx/notebook.h"
#endif //WX_PRECOMP
#include "wx/imaglist.h"
#include "wx/cocoa/autorelease.h"
#include "wx/cocoa/string.h"
#import <AppKit/NSTabView.h>
#import <AppKit/NSTabViewItem.h>
#import <AppKit/NSImage.h>
// testing:
#import <AppKit/NSPasteboard.h>
#import <Foundation/NSArray.h>
// ========================================================================
// WXCTabViewImageItem
// ========================================================================
@interface WXCTabViewImageItem : NSTabViewItem
{
NSImage *m_image;
}
- (id)init;
- (id)initWithIdentifier: (id)identifier;
- (void)dealloc;
- (NSSize)sizeOfLabel:(BOOL)shouldTruncateLabel;
- (void)drawLabel:(BOOL)shouldTruncateLabel inRect:(NSRect)tabRect;
- (NSImage*)image;
- (void)setImage:(NSImage*)image;
@end // interface WXCTabViewImageItem : NSTabViewItem
@implementation WXCTabViewImageItem : NSTabViewItem
- (id)init
{
return [self initWithIdentifier:nil];
}
- (id)initWithIdentifier: (id)identifier;
{
m_image = nil;
return [super initWithIdentifier:identifier];
}
- (void)dealloc
{
[m_image release];
}
- (NSSize)sizeOfLabel:(BOOL)shouldTruncateLabel
{
NSSize labelSize = [super sizeOfLabel:shouldTruncateLabel];
if(!m_image)
return labelSize;
NSSize imageSize = [m_image size];
// scale image size
if(imageSize.height > labelSize.height)
{
imageSize.width *= labelSize.height/imageSize.height;
imageSize.height *= labelSize.height/imageSize.height;
[m_image setScalesWhenResized:YES];
[m_image setSize: imageSize];
}
labelSize.width += imageSize.width;
return labelSize;
}
- (void)drawLabel:(BOOL)shouldTruncateLabel inRect:(NSRect)tabRect
{
if(m_image)
{
NSSize imageSize = [m_image size];
[m_image compositeToPoint:NSMakePoint(tabRect.origin.x,
tabRect.origin.y+imageSize.height)
operation:NSCompositeSourceOver];
tabRect.size.width -= imageSize.width;
tabRect.origin.x += imageSize.width;
}
[super drawLabel:shouldTruncateLabel inRect:tabRect];
}
- (NSImage*)image
{
return m_image;
}
- (void)setImage:(NSImage*)image
{
[image retain];
[m_image release];
m_image = image;
if(!m_image)
return;
[[NSPasteboard generalPasteboard]
declareTypes:[NSArray arrayWithObject:NSTIFFPboardType]
owner:nil];
[[NSPasteboard generalPasteboard]
setData:[m_image TIFFRepresentation]
forType:NSTIFFPboardType];
}
@end // implementation WXCTabViewImageItem : NSTabViewItem
// ========================================================================
// wxNotebookEvent
// ========================================================================
DEFINE_EVENT_TYPE(wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED)
DEFINE_EVENT_TYPE(wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGING)
IMPLEMENT_DYNAMIC_CLASS(wxNotebookEvent, wxNotifyEvent)
// ========================================================================
// wxNotebook
// ========================================================================
IMPLEMENT_DYNAMIC_CLASS(wxNotebook, wxControl)
BEGIN_EVENT_TABLE(wxNotebook, wxNotebookBase)
END_EVENT_TABLE()
WX_IMPLEMENT_COCOA_OWNER(wxNotebook,NSTabView,NSView,NSView)
bool wxNotebook::Create(wxWindow *parent, wxWindowID winid,
const wxPoint& pos,
const wxSize& size,
long style,
const wxString& name)
{
wxAutoNSAutoreleasePool pool;
if(!CreateControl(parent,winid,pos,size,style,wxDefaultValidator,name))
return false;
m_cocoaNSView = NULL;
SetNSTabView([[NSTabView alloc] initWithFrame:MakeDefaultNSRect(size)]);
if(m_parent)
m_parent->CocoaAddChild(this);
SetInitialFrameRect(pos,size);
return true;
}
wxNotebook::~wxNotebook()
{
}
void wxNotebook::SetPadding(const wxSize& padding)
{ // Can't do
}
void wxNotebook::SetTabSize(const wxSize& sz)
{ // Can't do
}
void wxNotebook::SetPageSize(const wxSize& size)
{
}
wxNotebookPage *wxNotebook::DoRemovePage(size_t nPage)
{
wxNotebookPage *page = wxNotebookBase::DoRemovePage(nPage);
if(!page)
return NULL;
NSTabViewItem *tvitem = [GetNSTabView() tabViewItemAtIndex: nPage];
wxASSERT(tvitem);
[tvitem retain];
[GetNSTabView() removeTabViewItem:tvitem];
// Remove the child window as a notebook page
wxASSERT([tvitem view] == page->GetNSViewForSuperview());
[tvitem setView:nil];
[tvitem release];
// Make it back into a normal child window
[m_cocoaNSView addSubview: page->GetNSViewForSuperview()];
return page;
}
bool wxNotebook::DeletePage(size_t nPage)
{
return wxNotebookBase::DeletePage(nPage);
}
bool wxNotebook::InsertPage( size_t pos,
wxNotebookPage *page, const wxString& title,
bool bSelect, int imageId)
{
wxAutoNSAutoreleasePool pool;
m_pages.Insert(page,pos);
NSTabViewItem *tvitem = [[WXCTabViewImageItem alloc] initWithIdentifier:nil];
[tvitem setLabel: wxNSStringWithWxString(title)];
const wxBitmap *bmp = (imageId!=-1)?m_imageList->GetBitmap(imageId):NULL;
if(bmp)
[(WXCTabViewImageItem*) tvitem setImage: bmp->GetNSImage(true)];
NSView *pageNSView = page->GetNSViewForSuperview();
// Remove it as a normal child
wxASSERT(m_cocoaNSView == [pageNSView superview]);
[pageNSView removeFromSuperview];
// And make it a notebook page
[tvitem setView: pageNSView];
[GetNSTabView() insertTabViewItem:tvitem atIndex:pos];
[tvitem release];
return true;
}
bool wxNotebook::DeleteAllPages()
{
while(!m_pages.IsEmpty())
DeletePage(0);
return true;
}
bool wxNotebook::SetPageText(size_t nPage, const wxString& title)
{
NSTabViewItem *tvitem = [GetNSTabView() tabViewItemAtIndex: nPage];
if(!tvitem)
return false;
[tvitem setLabel: wxNSStringWithWxString(title)];
return true;
}
wxString wxNotebook::GetPageText(size_t nPage) const
{
return wxStringWithNSString([[GetNSTabView() tabViewItemAtIndex: nPage] label]);
}
int wxNotebook::GetPageImage(size_t nPage) const
{
// To do this we'd need to keep track of this, which we don't!
return -1;
}
bool wxNotebook::SetPageImage(size_t nPage, int nImage)
{
const wxBitmap *bmp = nImage!=-1?m_imageList->GetBitmap(nImage):NULL;
if(!bmp)
return false;
NSTabViewItem *tvitem = [GetNSTabView() tabViewItemAtIndex: nPage];
if(!tvitem)
return false;
[(WXCTabViewImageItem*) tvitem setImage: bmp->GetNSImage(true)];
return true;
}
int wxNotebook::SetSelection(size_t nPage)
{
[GetNSTabView() selectTabViewItemAtIndex:nPage];
return GetSelection();
}
int wxNotebook::GetSelection() const
{
NSTabViewItem *selectedItem = [GetNSTabView() selectedTabViewItem];
if(!selectedItem)
return -1;
return [GetNSTabView() indexOfTabViewItem:selectedItem];
}
void wxNotebook::CocoaDelegate_tabView_didSelectTabViewItem(WX_NSTabViewItem tabViewItem)
{
// FIXME: oldSel probably == newSel
wxNotebookEvent event(wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGING, GetId(),
[GetNSTabView() indexOfTabViewItem:tabViewItem], GetSelection());
event.SetEventObject(this);
}
bool wxNotebook::CocoaDelegate_tabView_shouldSelectTabViewItem(WX_NSTabViewItem tabViewItem)
{
wxNotebookEvent event(wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGING, GetId(),
[GetNSTabView() indexOfTabViewItem:tabViewItem], GetSelection());
event.SetEventObject(this);
return !GetEventHandler()->ProcessEvent(event) || event.IsAllowed();
}