osxtree.cpp

来自「这是VCF框架的代码」· C++ 代码 · 共 433 行

CPP
433
字号
//OSXTree.cpp/*Copyright 2000-2004 The VCF Project.Please see License.txt in the top level directorywhere you installed the VCF.*/#include "vcf/ApplicationKit/ApplicationKit.h"#include "vcf/ApplicationKit/ApplicationKitPrivate.h"#include "vcf/ApplicationKit/OSXControl.h"#include "vcf/ApplicationKit/OSXTree.h"#include "vcf/ApplicationKit/TreeControl.h"#include "vcf/ApplicationKit/DefaultTreeItem.h"#define OSX_TREE_CTRL_PRIMARY_COL		'PRIM'using namespace VCF;OSXTree::OSXTree( TreeControl* tree ):	OSXControl( tree ),	treeControl_( tree )	{}OSXTree::~OSXTree(){	}OSStatus OSXTree::DBItemDataCallback( ControlRef browser, DataBrowserItemID item, 										DataBrowserPropertyID property, DataBrowserItemDataRef itemData,										Boolean setValue ){	OSStatus err = noErr;		if ( !setValue ) {		switch ( property ) {			case OSX_TREE_CTRL_PRIMARY_COL : {				//CFStringRef s = CFStringCreateWithCString( NULL, itemsText[item-BASE_ID], kCFStringEncodingMacRoman );				//SetDataBrowserItemDataText( itemData, s );				//CFRelease( s );								TreeItem* treeItem	 = (TreeItem*)item;				CFTextString tmp;				tmp = treeItem->getCaption();				SetDataBrowserItemDataText( itemData, tmp );			}			break;						case kDataBrowserItemIsSelectableProperty : {				err = SetDataBrowserItemDataBooleanValue( itemData, true );			}			break;						case kDataBrowserItemIsContainerProperty : {				TreeItem* treeItem	 = (TreeItem*)item;								SetDataBrowserItemDataBooleanValue( itemData, treeItem->isLeaf() );							}			break;						default: {				err = errDataBrowserPropertyNotSupported;							}			break;		}			}	else {		err = errDataBrowserPropertyNotSupported;	}		return err;}void OSXTree::DBItemNotificationCallback( ControlRef browser, DataBrowserItemID itemID, 															DataBrowserItemNotification message){   switch (message)    {        case kDataBrowserContainerOpened: // 1        {                       /*int i, myItemsPerContainer;            myItemsPerContainer = myTunesDatabase[itemID].songsInAlbum; // 2             DataBrowserItemID myItems [myItemsPerContainer];            for ( i = 0; i < myItemsPerContainer; i++) // 3                        myItems[i] =  MyGetChild (itemID, i);            status = AddDataBrowserItems (browser, itemID,                                    myItemsPerContainer,                                     myItems, kTitleColumn); // 4			*/			//DataBrowserItemID item2 = BASE_ID +1;			//status = AddDataBrowserItems( browser, BASE_ID, 1, &item2, kDataBrowserItemNoProperty );				TreeItem* treeItem	 = (TreeItem*)itemID;			OSXTree* tree = (OSXTree*) OSXControl::getControlFromControlRef( browser );						tree->addChildItems( treeItem );	            break;          }   		case kDataBrowserItemSelected : {			SetDataBrowserSelectedItems( browser, 1, &itemID, kDataBrowserItemsAdd );		}		break;				case kDataBrowserItemDeselected : {			SetDataBrowserSelectedItems( browser, 1, &itemID, kDataBrowserItemsRemove );				}		break;		    }}void OSXTree::create( Control* owningControl ){	::Rect r;	r.left = 0;	r.top = 0;	r.right = 0;	r.bottom = 0;		OSStatus err;	if ( noErr == CreateDataBrowserControl( NULL, &r, kDataBrowserListView, &hiView_ ) ) {		DataBrowserCallbacks callbacks;		callbacks.version = kDataBrowserLatestCallbacks;		err = InitDataBrowserCallbacks( &callbacks ); 			callbacks.u.v1.itemDataCallback = OSXTree::DBItemDataCallback;		callbacks.u.v1.itemNotificationCallback = OSXTree::DBItemNotificationCallback;				err = SetDataBrowserCallbacks( hiView_, &callbacks );						//create initial column (DataBrowser doesn't work without at least one column		DataBrowserListViewColumnDesc col;		col.propertyDesc.propertyID = OSX_TREE_CTRL_PRIMARY_COL;		col.propertyDesc.propertyType =  kDataBrowserTextType;		col.propertyDesc.propertyFlags =  kDataBrowserListViewSelectionColumn;				col.headerBtnDesc.version = kDataBrowserListViewLatestHeaderDesc;		col.headerBtnDesc.minimumWidth = 10;		col.headerBtnDesc.maximumWidth = 200;		col.headerBtnDesc.titleOffset = 0;		col.headerBtnDesc.titleString = NULL;		col.headerBtnDesc.initialOrder = kDataBrowserOrderIncreasing;		col.headerBtnDesc.btnFontStyle.flags = 0;		col.headerBtnDesc.btnFontStyle.font = 0;		col.headerBtnDesc.btnFontStyle.size = 0;		col.headerBtnDesc.btnFontStyle.style = 0;		col.headerBtnDesc.btnFontStyle.mode = 0;		col.headerBtnDesc.btnFontStyle.just = 0;				col.headerBtnDesc.btnContentInfo.contentType = kControlContentTextOnly;				AddDataBrowserListViewColumn( hiView_, &col, 0 );			SetDataBrowserListViewDisclosureColumn( hiView_, OSX_TREE_CTRL_PRIMARY_COL, true );				SetDataBrowserSelectionFlags( hiView_, kDataBrowserSelectOnlyOne | kDataBrowserResetSelection );						OSXControl* thisPtr = this;		SetControlProperty( hiView_, 							VCF_PROPERTY_CREATOR, 							VCF_PROPERTY_CONTROL_VAL, 							sizeof(thisPtr), 							&thisPtr );									err = OSXControl::installStdControlHandler();									if ( err != noErr ) {			throw RuntimeException( MAKE_ERROR_MSG_2("InstallEventHandler failed for OSXTree!") );		}								}	else {		throw RuntimeException( MAKE_ERROR_MSG_2("CreateDataBrowserControl failed to create view!") );	}	}TreeModel* OSXTree::getTreeModel(){	return NULL;}void OSXTree::setTreeModel( TreeModel* model ){}double OSXTree::getItemIndent(){	return 0;}void OSXTree::setItemIndent( const double& indent ){	}ImageList* OSXTree::getImageList(){	return NULL;}void OSXTree::setImageList( ImageList* imageList ){	if ( imageList != NULL ) {				EventHandler* imgListHandler = getEventHandler( "OSXTree::onImageListImageChanged" );		if ( NULL == imgListHandler ) {			imgListHandler =				new ImageListEventHandler<OSXTree>(this, &OSXTree::onImageListImageChanged, "OSXTree::onImageListImageChanged" );		}		imageList->SizeChanged.addHandler( imgListHandler );		imageList->ImageAdded.addHandler( imgListHandler );		imageList->ImageDeleted.addHandler( imgListHandler );	}}void OSXTree::addItem( TreeItem* item ){	}void OSXTree::clear(){	}void OSXTree::onImageListImageChanged( ImageListEvent* event ){	ulong32 index = event->getIndexOfImage();	ImageList* imageList = (ImageList*)event->getSource();	setImageList( imageList );}VCF::Rect OSXTree::getItemImageRect( TreeItem* item ){	VCF::Rect result;	return result;}VCF::Rect OSXTree::getItemRect( TreeItem* item ){	VCF::Rect result;	return result;}void OSXTree::onStateImageListImageChanged( ImageListEvent* event ){	ImageList* imageList = (ImageList*)event->getSource();	setStateImageList( imageList );}void OSXTree::setStateImageList( ImageList* imageList ){	if ( imageList != NULL ) {			EventHandler* imgListHandler = getEventHandler( "OSXTree::onStateImageListImageChanged" );		if ( NULL == imgListHandler ) {			imgListHandler =				new ImageListEventHandler<OSXTree>(this, &OSXTree::onStateImageListImageChanged, "OSXTree::onStateImageListImageChanged" );		}		imageList->SizeChanged.addHandler( imgListHandler );		imageList->ImageAdded.addHandler( imgListHandler );		imageList->ImageDeleted.addHandler( imgListHandler );	}}bool OSXTree::getAllowLabelEditing(){	return false;}void OSXTree::setAllowLabelEditing( const bool& allowLabelEditing ){	}void OSXTree::onControlModelChanged( Event* e ){	EventHandler* ev = getEventHandler( "OSXTree::onTreeNodeDeleted" );	if ( NULL == ev ) {		ev = new TreeModelEventHandler<OSXTree>( this,													&OSXTree::onTreeNodeDeleted,													"OSXTree::onTreeNodeDeleted" );	}			treeControl_->getTreeModel()->addTreeNodeDeletedHandler( ev );		addChildItems( NULL );}void OSXTree::onTreeNodeDeleted( TreeModelEvent* event ){	TreeItem* item = event->getTreeItem();	if ( NULL != item ){		DataBrowserItemID dbParentItem = (DataBrowserItemID)item->getParent();		DataBrowserItemID dbItem = (DataBrowserItemID)item;				RemoveDataBrowserItems( hiView_, dbParentItem, 1, &dbItem, kDataBrowserItemNoProperty );	}}void OSXTree::addChildItems( TreeItem* parent ){	if ( NULL == parent ) {		//start from the tree model!!!		 		TreeModel* treeModel = treeControl_->getTreeModel(); 		Enumerator<TreeItem*>* rootItems = treeModel->getRootItems();				while ( rootItems->hasMoreElements() ) {			TreeItem* item = rootItems->nextElement();			DataBrowserItemID dbItem = (DataBrowserItemID)item;			AddDataBrowserItems( hiView_, kDataBrowserNoItem, 1, 										&dbItem, kDataBrowserItemNoProperty );														addChildItems( item );		}	}	else {		uint32 count = parent->getChildCount();		if ( count > 0 ) {			Enumerator<TreeItem*>* children = parent->getChildren();			while ( children->hasMoreElements() ) {				TreeItem* child = children->nextElement();								//use the child's pointer address as the item ID				DataBrowserItemID dbItem = (DataBrowserItemID)child;								AddDataBrowserItems( hiView_, (DataBrowserItemID)parent, 1, 										&dbItem, kDataBrowserItemNoProperty );									addChildItems( child );			}		}	}}OSStatus OSXTree::handleOSXEvent( EventHandlerCallRef nextHandler, EventRef theEvent ){	OSStatus result = eventNotHandledErr;	    UInt32 whatHappened = GetEventKind (theEvent);	TCarbonEvent event( theEvent );		switch ( GetEventClass( theEvent ) )  {				 		case kEventClassControl : {			switch( whatHappened ) {				case kEventControlDraw : {					result = CallNextEventHandler( nextHandler, theEvent );				}				break;								default : {					result = OSXControl::handleOSXEvent( nextHandler, theEvent );				}					break;			}		}		break;				default : {			result = OSXControl::handleOSXEvent( nextHandler, theEvent );		}			break;	}		return result;}/***CVS Log info*$Log$*Revision 1.3  2006/04/07 02:35:24  ddiego*initial checkin of merge from 0.6.9 dev branch.**Revision 1.2.2.2  2006/03/17 03:08:11  ddiego*updated osx code to latest changes.**Revision 1.2.2.1  2005/11/27 23:55:45  ddiego*more osx updates.**Revision 1.2  2005/07/09 23:14:55  ddiego*merging in changes from devmain-0-6-7 branch.**Revision 1.1.2.5  2005/07/07 23:28:58  ddiego*last osx checkins before release - not complete :(**Revision 1.1.2.4  2005/06/29 03:46:13  ddiego*more osx tree and list coding.**Revision 1.1.2.3  2005/06/28 04:03:36  ddiego*osx text edit mods and started on osx tree peer.**Revision 1.1.2.2  2005/06/23 01:26:55  ddiego*build updates**Revision 1.1.2.1  2005/06/22 03:59:30  ddiego*added osx stub classes for peers**/

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?