:
vector>accelerators_;
size_tregistered_accelerator_count_;
右键菜单管理器:
ContextMenuController*context_menu_controller_;
拖拽管理器,负责为View写拖拽数据,同时提供拖拽支持:
DragController*drag_controller_;
窗口树的组织(黄色为父节点指针,蓝色为子节点指针):
ContextMenuController右键菜单管理器为一个抽象接口,View中有这个成员,这使得所有View及其子类都具有显示、响应右键菜单的能力:
classContextMenuController{
public:
virtualvoidShowContextMenu(View*source,
constgfx:
:
Point&p,
boolis_mouse_gesture)=0;
protected:
virtual~ContextMenuController(){}
};
其中唯一一个成员函数是ShowContextMenu,用于为View显示右键菜单,其中source是要显示菜单的View的指针,p是菜单显示的位置,为屏幕坐标系。
DragController也是一个抽象的接口,负责为View的拖拽写数据,View中有这个成员,这使得所有View都支持拖拽。
classDragController{
public:
//Writesthedataforthedrag.
virtualvoidWriteDragData(View*sender,
constgfx:
:
Point&press_pt,
OSExchangeData*data)=0;
//Returnsthesupporteddragoperations(seeDragDropTypesforpossible
//values).Adragisonlystartedifthisreturnsanon-zerovalue.
virtualintGetDragOperations(View*sender,constgfx:
:
Point&p)=0;
//Returnstrueifadragoperationcanbestarted.
//|press_pt|representsthecoordinateswherethemousewasinitially
//presseddown.|p|isthecurrentmousecoordinates.
virtualboolCanStartDrag(View*sender,
constgfx:
:
Point&press_pt,
constgfx:
:
Point&p)=0;
protected:
virtual~DragController(){}
};
AcceleratorTarget为快捷键接收者,所有View都从其中派生,这使得所有View及其子类都具有处理快捷键的能力。
AcceleratorTarget的唯一一个成员函数为AcceleratorPressed,用于处理具体的快捷键,各个View可以重写此函数,用于处理自己的快捷键。
charView:
:
kViewClassName[]="views/View";
constintView:
:
kShowFolderDropMenuDelay=400;
View的主要成员函数
基本属性相关:
constgfx:
:
Rect&bounds()const{returnbounds_;}
constgfx:
:
Size&size()const{returnbounds_.size();}
voidSetBounds(constgfx:
:
Rect&bounds);
voidSetBounds(intx,inty,intwidth,intheight)
virtualgfx:
:
SizeGetPreferredSize();
virtualvoidSetVisible(boolflag);
virtualboolIsVisible()const{returnis_visible_;}
virtualvoidSetEnabled(boolflag);
virtualboolIsEnabled()const;
virtualboolIsPushed()const{returnfalse;}
排版相关:
virtualvoidLayout();
对本View进行排版,默认实现是调用排版管理器进行排版,这是一个虚函数,重载它可以实现各种不同的排版。
voidInvalidateLayout();
为本View和所有父节点设置需要重拍版标记,这可以确保下次调用Layout()时可以传播到本View,即使父View的大小不变。
LayoutManager*GetLayoutManager()const;
获取本View的焦点管理器。
voidSetLayoutManager(LayoutManager*layout);
为本View设置焦点管理器。
绘制相关的函数:
virtualvoidSchedulePaint(constgfx:
:
Rect&r,boolurgent);
将指定的区域标记为脏区域(需要重绘),如果urgent标志为true,则在当前事件处理完成后该区域马上被重绘,否则,会尽可能早的重绘。
virtualvoidSchedulePaint();
将整个View标记为脏,将尽可能早的重绘。
virtualvoidProcessPaint(gfx:
:
Canvas*canvas);
这是绘制本View及其孩子的主入口函数。
该函数被绘制系统调用,只有需要绘制子树时才调用此函数。
virtualvoidPaint(gfx:
:
Canvas*canvas);
绘制本View
virtualvoidPaintBackground(gfx:
:
Canvas*canvas);
绘制View的背景
virtualvoidPaintBorder(gfx:
:
Canvas*canvas);
绘制View的边框
virtualvoidPaintFocusBorder(gfx:
:
Canvas*canvas);
绘制焦点边框,如果本View有焦点。
默认的实现是在View周围绘制一个灰色的边框,重载该函数可以实现不同的效果。
virtualvoidPaintNow();
立刻绘制本View。
子节点、父节点操作相关的函数:
voidAddChildView(View*v);
voidAddChildView(intindex,View*v);
View*GetChildViewAt(intindex)const;
voidRemoveChildView(View*v);
voidRemoveAllChildViews(booldelete_views);
intGetChildViewCount()const;
boolHasChildView(View*a_view);
virtualView*GetViewForPoint(constgfx:
:
Point&point);
virtualWidget*GetWidget()const;
virtualWindow*GetWindow()const;
virtualboolContainsNativeView(gfx:
:
NativeViewnative_view)const;
virtualRootView*GetRootView();
View*GetParent()const{returnparent_;}
intGetChildIndex(constView*v)const;
boolIsParentOf(View*v)const;
virtualView*GetViewByID(intid)const;
voidSetID(intid);
intGetID()const;
voidSetGroup(intgid);
intGetGroup()const;
virtualboolIsGroupFocusTraversable()const{returntrue;}
voidGetViewsWithGroup(intgroup_id,std:
:
vector*out);
virtualView*GetSelectedViewForGroup(intgroup_id);
每个View的Layout函数用于定位它所有的子View。
当因为某些原因整个窗口需要重构时,根View调用Layout函数,然后递归调用每一个子View的Layout函数。
关于Chrome的Layout,Chrome还提供了一个GridLayout和FillLayout。
添加子节点的流程:
voidView:
:
AddChildView(intindex,View*v)
如果v有父节点,则先从其父节点中删除
设置v的前一个、后一个焦点view
将v插入本节点的子节点数组中,并将v的父节点设置为本节点
从本节点一直循环上溯到根节点,调用ViewHierarchyChangedImpl
PropagateAddNotifications
更新tooltips
为RootView调用RegisterChildrenForVisibleBoundsNotification
排版管理器调用ViewAdded
焦点、快捷键管理相关:
View*GetNextFocusableView();
View*GetPreviousFocusableView();
voidSetNextFocusableView(View*view);
virtualvoidSetFocusable(boolfocusable);
boolIsFocusableInRootView()const;
boolIsAccessibilityFocusableInRootView()const;
virtualvoidset_accessibility_focusable(boolaccessibility_focusable)
virtualFocusManager*GetFocusManager();
virtualvoidAddAccelerator(constAccelerator&accelerator);
virtualvoidRemoveAccelerator(constAccelerator&accelerator);
virtualvoidResetAccelerators();
virtualboolAcceleratorPressed(constAccelerator&accelerator)
virtualboolHasFocus();
工具函数:
staticvoidConvertPointToView(constView*src,
constView*dst,
gfx:
:
Point*point);
staticvoidConvertPointToWidget(constView*src,gfx:
:
Point*point);
staticvoidConvertPointFromWidget(constView*dest,gfx:
:
Point*p);
staticvoidConvertPointToScreen(constView*src,gfx:
:
Point*point);
事件处理函数:
virtualboolOnMousePressed(constMouseEvent&event);
virtualboolOnMouseDragged(constMouseEvent&event);
virtualvoidOnMouseReleased(constMouseEvent&event,boolcanceled);
virtualvoidOnMouseMoved(constMouseEvent&e);
virtualvoidOnMouseEntered(constMouseEvent&event);
virtualvoidOnMouseExited(constMouseEvent&event);
virtualvoidSetMouseHandler(View*new_mouse_handler);
virtualvoidRequestFocus();
virtualvoidWillGainFocus();
virtualvoidDidGainFocus();
virtualvoidWillLoseFocus();
virtualvoidAboutToRequestFocusFromTabTraversal(boolreverse)
virtualboolSkipDefaultKeyEventProcessing(constKeyEvent&e)
virtualboolOnKeyPressed(constKeyEvent&e);
virtualboolOnKeyReleased(constKeyEvent&e);
virtualboolOnMouseWheel(constMouseWheelEvent&e);
拖拽相关:
voidSetDragControl