osxlistview.cpp

来自「这是VCF框架的代码」· C++ 代码 · 共 660 行 · 第 1/2 页

CPP
660
字号
//OSXListview.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/ListViewControl.h"#include "vcf/ApplicationKit/OSXControl.h"#include "vcf/ApplicationKit/OSXListview.h"#define OSX_LISTVIEW_CTRL_PRIMARY_COL		'PRIM'using namespace VCF;struct ForEachData {	OSXListview* listview;};struct FindPtForItemData : public ForEachData {	VCF::Rect rect;	VCF::Point* pt;};OSXListview::OSXListview( ListViewControl* listviewControl ):	OSXControl( listviewControl ),	listviewControl_( listviewControl ){}OSXListview::~OSXListview(){	}void OSXListview::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 = OSXListview::DBItemDataCallback;		callbacks.u.v1.itemNotificationCallback = OSXListview::DBItemNotificationCallback;				err = SetDataBrowserCallbacks( hiView_, &callbacks );						//create initial column (DataBrowser doesn't work without at least one column		DataBrowserListViewColumnDesc col;		col.propertyDesc.propertyID = OSX_LISTVIEW_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 );				SetDataBrowserSelectionFlags( hiView_, kDataBrowserSelectOnlyOne | kDataBrowserResetSelection );				SetDataBrowserTableViewHiliteStyle( hiView_, kDataBrowserTableViewFillHilite );				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!") );		}				EventHandler* ev = 			new GenericEventHandler<OSXListview>( this, &OSXListview::onControlModelChanged, "OSXListview::onControlModelChanged" );									owningControl->ControlModelChanged += ev;					}	else {		throw RuntimeException( MAKE_ERROR_MSG_2("CreateDataBrowserControl failed to create view!") );	}}OSStatus OSXListview::DBItemDataCallback( ControlRef browser, DataBrowserItemID item, 										DataBrowserPropertyID property, DataBrowserItemDataRef itemData,										Boolean setValue ){	OSStatus err = noErr;		if ( !setValue ) {		switch ( property ) {			case OSX_LISTVIEW_CTRL_PRIMARY_COL : {				ListItem* listItem	 = (ListItem*)item;				CFTextString tmp;				tmp = listItem->getCaption();				SetDataBrowserItemDataText( itemData, tmp );			}			break;						case kDataBrowserItemIsSelectableProperty : {				err = SetDataBrowserItemDataBooleanValue( itemData, true );			}			break;						case kDataBrowserItemIsContainerProperty : {				SetDataBrowserItemDataBooleanValue( itemData, false );							}			break;						default: {				err = errDataBrowserPropertyNotSupported;							}			break;		}			}	else {		err = errDataBrowserPropertyNotSupported;	}		return err;}void OSXListview::DBItemNotificationCallback( ControlRef browser, DataBrowserItemID itemID, 															DataBrowserItemNotification message){	    switch (message)    {        case kDataBrowserContainerOpened:  {		                      }		break;		   		case kDataBrowserItemSelected : {			SetDataBrowserSelectedItems( browser, 1, &itemID, kDataBrowserItemsAdd );		}		break;				case kDataBrowserItemDeselected : {			SetDataBrowserSelectedItems( browser, 1, &itemID, kDataBrowserItemsRemove );				}		break;		    }}void OSXListview::addItem( ListItem * item ){	//unsigned int index = item->getIndex();		DataBrowserItemID dbItem = (DataBrowserItemID)item;	AddDataBrowserItems( hiView_, kDataBrowserNoItem, 1, &dbItem, kDataBrowserItemNoProperty );}void OSXListview::insertItem( const unsigned long& index, ListItem * item ){}void OSXListview::clear(){	RemoveDataBrowserItems( hiView_, kDataBrowserNoItem, 0, NULL, kDataBrowserItemNoProperty );}void OSXListview::deleteItem( ListItem* item ){	//unsigned int index = item->getIndex();	DataBrowserItemID dbItem = (DataBrowserItemID)item;		RemoveDataBrowserItems( hiView_, kDataBrowserNoItem, 1, &dbItem, kDataBrowserItemNoProperty );}bool OSXListview::ensureVisible(ListItem * item, bool partialOK ){	bool result = false;		return result;}void OSXListview::setFocusedItem(ListItem * item){	}void OSXListview::selectItem(ListItem * item){	}VCF::Rect OSXListview::getItemRect( ListItem* item ){		VCF::Rect result;	UInt32 columns = 0;	GetDataBrowserTableViewColumnCount( hiView_, &columns );	DataBrowserTableViewColumnID colID = 0;	DataBrowserItemID itemID = (DataBrowserItemID)item;	::Rect itemBounds;	for (UInt32 col=0;col<columns;col++ ) {		GetDataBrowserTableViewColumnProperty( hiView_, col, &colID );		GetDataBrowserItemPartBounds( hiView_, itemID, colID, kDataBrowserPropertyEnclosingPart, &itemBounds );		if ( col == 0 ) {			result.left_ = itemBounds.left;			result.top_ = itemBounds.top;			result.right_ = itemBounds.right;			result.bottom_ = itemBounds.bottom;		}		else {			result.right_ = itemBounds.right;			result.bottom_ = itemBounds.bottom;				}	}				return result;}bool OSXListview::isItemSelected(ListItem* item){	bool result = false;		return result;}void OSXListview::findPtForEachItem ( DataBrowserItemID item, DataBrowserItemState state, void *clientData ){	//FindPtForItemData* data = (FindPtForItemData*)clientData;		::Rect itemBounds;	//DataBrowserTableViewColumnID colID = 0;	//GetDataBrowserItemPartBounds( data->listview->hiView_, item, colID, kDataBrowserPropertyEnclosingPart, &itemBounds );}ListItem* OSXListview::isPtOverItem( Point* point ){	ListItem* result = NULL;			FindPtForItemData data;	data.listview = this;	data.pt = point;		if ( noErr == ForEachDataBrowserItem( hiView_, kDataBrowserNoItem, false, 0, OSXListview::findPtForEachItem, &data ) ) {		//result = data.rect;	}			return result;}ListItem* OSXListview::getFocusedItem(){	ListItem* result = NULL;		return result;}ListItem* OSXListview::getSelectedItem(){	ListItem* result = NULL;	Handle items = NewHandle(0);		if ( noErr == GetDataBrowserItems( hiView_, kDataBrowserNoItem, false, kDataBrowserItemIsSelected, items ) ) { 		int count = GetHandleSize(items)/sizeof(DataBrowserItemID);				if ( count > 0 ) {			HLock( items );			DataBrowserItemID* item = *((DataBrowserItemID**)items);					result = (ListItem*)(*item);					HUnlock( items );		}	}	DisposeHandle( items );	return result;}Enumerator<ListItem*>* OSXListview::getSelectedItems(){	ListItem* item = NULL;		return NULL;}void OSXListview::rangeSelect( Rect* selectionRect ){}void OSXListview::addHeaderColumn( const String& columnName, const double& width ){	UInt32 columnCount = 0;	GetDataBrowserTableViewColumnCount( hiView_, &columnCount );

⌨️ 快捷键说明

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