protected override void DoMouseOperation(TreeNodeAdvMouseEventArgs args)
		{
			if(Tree.SelectionMode==TreeSelectionMode.Single||Tree.SelectionStart==null)
			{
				base.DoMouseOperation(args);
			}
			else if(CanSelect(args.Node))
			{
				Tree.SuspendSelectionEvent=true;
				try
				{
					SelectAllFromStart(args.Node);
				}
				finally
				{
					Tree.SuspendSelectionEvent=false;
				}
			}
		}
		public override void MouseDown(TreeNodeAdvMouseEventArgs args)
		{
			if(args.Node!=null)
			{
				Tree.ItemDragMode=true;
				Tree.ItemDragStart=args.Location;

				if(args.Button==MouseButtons.Left||args.Button==MouseButtons.Right)
				{
					Tree.BeginUpdate();
					try
					{
						Tree.CurrentNode=args.Node;
						if(args.Node.IsSelected)
							_mouseDownFlag=true;
						else
						{
							_mouseDownFlag=false;
							DoMouseOperation(args);
						}
					}
					finally
					{
						Tree.EndUpdate();
					}
				}

			}
			else
			{
				Tree.ItemDragMode=false;
				MouseDownAtEmptySpace(args);
			}
		}
		protected virtual void DoMouseOperation(TreeNodeAdvMouseEventArgs args)
		{
			if(Tree.SelectedNodes.Count==1&&args.Node!=null&&args.Node.IsSelected)
				return;

			Tree.SuspendSelectionEvent=true;
			try
			{
				Tree.ClearSelectionInternal();
				if(args.Node!=null)
					args.Node.IsSelected=true;
				Tree.SelectionStart=args.Node;
			}
			finally
			{
				Tree.SuspendSelectionEvent=false;
			}
		}
		protected virtual void MouseDownAtEmptySpace(TreeNodeAdvMouseEventArgs args)
		{
			Tree.ClearSelection();
		}
		public override void MouseUp(TreeNodeAdvMouseEventArgs args)
		{
			Tree.ItemDragMode=false;
			if(_mouseDownFlag&&args.Node!=null)
			{
				if(args.Button==MouseButtons.Left)
					DoMouseOperation(args);
				else if(args.Button==MouseButtons.Right)
					Tree.CurrentNode=args.Node;
			}
			_mouseDownFlag=false;
		}
		public virtual void MouseDoubleClick(TreeNodeAdvMouseEventArgs args)
		{
		}
		public abstract void MouseUp(TreeNodeAdvMouseEventArgs args);
		public override void MouseUp(TreeNodeAdvMouseEventArgs args)
		{
			Tree.ChangeInput();
			Tree.UpdateView();
			Tree.OnColumnClicked(Column);
		}
		public override void MouseDown(TreeNodeAdvMouseEventArgs args)
		{
		}
		public override void MouseDoubleClick(TreeNodeAdvMouseEventArgs args)
		{
			Tree.AutoSizeColumn(Column);
		}
		public override void MouseUp(TreeNodeAdvMouseEventArgs args)
		{
			FinishResize();
		}
		protected override void MouseDownAtEmptySpace(TreeNodeAdvMouseEventArgs args)
		{
		}
		private TreeNodeAdvMouseEventArgs CreateMouseArgs(MouseEventArgs e)
		{
			TreeNodeAdvMouseEventArgs args=new TreeNodeAdvMouseEventArgs(e);
			args.ViewLocation=new Point(e.X+OffsetX,
				e.Y+_rowLayout.GetRowBounds(FirstVisibleRow).Y-ColumnHeaderHeight);
			args.ModifierKeys=ModifierKeys;
			args.Node=GetNodeAt(e.Location);
			NodeControlInfo info=GetNodeControlInfoAt(args.Node, e.Location);
			args.ControlBounds=info.Bounds;
			args.Control=info.Control;
			return args;
		}
		private string GetNodeToolTip(TreeNodeAdvMouseEventArgs args)
		{
			string msg=args.Control.GetToolTip(args.Node);

			BaseTextControl btc=args.Control as BaseTextControl;
			if(btc!=null&&btc.DisplayHiddenContentInToolTip&&String.IsNullOrEmpty(msg))
			{
				Size ms=btc.GetActualSize(args.Node, _measureContext);
				if(ms.Width>args.ControlBounds.Size.Width||ms.Height>args.ControlBounds.Size.Height
					||args.ControlBounds.Right-OffsetX>DisplayRectangle.Width)
					msg=btc.GetLabel(args.Node);
			}

			if(String.IsNullOrEmpty(msg)&&DefaultToolTipProvider!=null)
				msg=DefaultToolTipProvider.GetToolTip(args.Node, args.Control);

			return msg;
		}