public KryptonTreeView()
{
// Contains another control and needs marking as such for validation to work
SetStyle(ControlStyles.ContainerControl, true);
// Cannot select this control, only the child tree view and does not generate a click event
SetStyle(ControlStyles.Selectable | ControlStyles.StandardClick, false);
// Default fields
_alwaysActive = true;
_style = ButtonStyle.ListItem;
_itemHeightDefault = true;
_plusMinusImages = new TreeViewImages();
_checkBoxImages = new CheckBoxImages();
base.Padding = new Padding(1);
// Create the palette storage
_redirectImages = new PaletteRedirectTreeView(Redirector, _plusMinusImages, _checkBoxImages);
PaletteBackInheritRedirect backInherit = new PaletteBackInheritRedirect(Redirector, PaletteBackStyle.InputControlStandalone);
PaletteBorderInheritRedirect borderInherit = new PaletteBorderInheritRedirect(Redirector, PaletteBorderStyle.InputControlStandalone);
PaletteBackColor1 commonBack = new PaletteBackColor1(backInherit, NeedPaintDelegate);
PaletteBorder commonBorder = new PaletteBorder(borderInherit, NeedPaintDelegate);
_stateCommon = new PaletteTreeStateRedirect(Redirector, commonBack, backInherit, commonBorder, borderInherit, NeedPaintDelegate);
PaletteBackColor1 disabledBack = new PaletteBackColor1(_stateCommon.PaletteBack, NeedPaintDelegate);
PaletteBorder disabledBorder = new PaletteBorder(_stateCommon.PaletteBorder, NeedPaintDelegate);
_stateDisabled = new PaletteTreeState(_stateCommon, disabledBack, disabledBorder, NeedPaintDelegate);
PaletteBackColor1 normalBack = new PaletteBackColor1(_stateCommon.PaletteBack, NeedPaintDelegate);
PaletteBorder normalBorder = new PaletteBorder(_stateCommon.PaletteBorder, NeedPaintDelegate);
_stateNormal = new PaletteTreeState(_stateCommon, normalBack, normalBorder, NeedPaintDelegate);
PaletteBackColor1 activeBack = new PaletteBackColor1(_stateCommon.PaletteBack, NeedPaintDelegate);
PaletteBorder activeBorder = new PaletteBorder(_stateCommon.PaletteBorder, NeedPaintDelegate);
_stateActive = new PaletteDouble(_stateCommon, activeBack, activeBorder, NeedPaintDelegate);
_stateFocus = new PaletteTreeNodeTripleRedirect(Redirector, PaletteBackStyle.ButtonListItem, PaletteBorderStyle.ButtonListItem, PaletteContentStyle.ButtonListItem, NeedPaintDelegate);
_stateTracking = new PaletteTreeNodeTriple(_stateCommon.Node, NeedPaintDelegate);
_statePressed = new PaletteTreeNodeTriple(_stateCommon.Node, NeedPaintDelegate);
_stateCheckedNormal = new PaletteTreeNodeTriple(_stateCommon.Node, NeedPaintDelegate);
_stateCheckedTracking = new PaletteTreeNodeTriple(_stateCommon.Node, NeedPaintDelegate);
_stateCheckedPressed = new PaletteTreeNodeTriple(_stateCommon.Node, NeedPaintDelegate);
// Create the override handling classes
_overrideNormal = new PaletteTripleOverride(_stateFocus.Node, _stateNormal.Node, PaletteState.FocusOverride);
_overrideTracking = new PaletteTripleOverride(_stateFocus.Node, _stateTracking.Node, PaletteState.FocusOverride);
_overridePressed = new PaletteTripleOverride(_stateFocus.Node, _statePressed.Node, PaletteState.FocusOverride);
_overrideCheckedNormal = new PaletteTripleOverride(_stateFocus.Node, _stateCheckedNormal.Node, PaletteState.FocusOverride);
_overrideCheckedTracking = new PaletteTripleOverride(_stateFocus.Node, _stateCheckedTracking.Node, PaletteState.FocusOverride);
_overrideCheckedPressed = new PaletteTripleOverride(_stateFocus.Node, _stateCheckedPressed.Node, PaletteState.FocusOverride);
_overrideNormalNode = new PaletteNodeOverride(_overrideNormal);
// Create the check box image drawer and place inside element so it is always centered
_drawCheckBox = new ViewDrawCheckBox(_redirectImages);
_layoutCheckBox = new ViewLayoutCenter();
_layoutCheckBox.Add(_drawCheckBox);
// Stack used to layout the location of the node image
_layoutImage = new ViewLayoutSeparator(0, 0);
_layoutImageAfter = new ViewLayoutSeparator(3, 0);
_layoutImageCenter = new ViewLayoutCenter(_layoutImage);
_layoutImageStack = new ViewLayoutStack(true);
_layoutImageStack.Add(_layoutImageCenter);
_layoutImageStack.Add(_layoutImageAfter);
_layoutImageState = new ViewLayoutSeparator(16, 16);
_layoutImageCenterState = new ViewLayoutCenter(_layoutImageState);
// Create the draw element for owner drawing individual items
_contentValues = new FixedContentValue();
_drawButton = new ViewDrawButton(StateDisabled.Node, _overrideNormalNode,
_overrideTracking, _overridePressed,
_overrideCheckedNormal, _overrideCheckedTracking,
_overrideCheckedPressed,
new PaletteMetricRedirect(Redirector),
_contentValues, VisualOrientation.Top, false);
// Place check box on the left and the label in the remainder
_layoutDocker = new ViewLayoutDocker();
_layoutDocker.Add(_layoutImageStack, ViewDockStyle.Left);
_layoutDocker.Add(_layoutImageCenterState, ViewDockStyle.Left);
_layoutDocker.Add(_layoutCheckBox, ViewDockStyle.Left);
_layoutDocker.Add(_drawButton, ViewDockStyle.Fill);
// Create the internal tree view used for containing content
_treeView = new InternalTreeView(this);
_treeView.TrackMouseEnter += new EventHandler(OnTreeViewMouseChange);
_treeView.TrackMouseLeave += new EventHandler(OnTreeViewMouseChange);
_treeView.GotFocus += new EventHandler(OnTreeViewGotFocus);
_treeView.LostFocus += new EventHandler(OnTreeViewLostFocus);
_treeView.KeyDown += new KeyEventHandler(OnTreeViewKeyDown);
_treeView.KeyUp += new KeyEventHandler(OnTreeViewKeyUp);
_treeView.KeyPress += new KeyPressEventHandler(OnTreeViewKeyPress);
_treeView.PreviewKeyDown += new PreviewKeyDownEventHandler(OnTreeViewPreviewKeyDown);
_treeView.Validating += new CancelEventHandler(OnTreeViewValidating);
_treeView.Validated += new EventHandler(OnTreeViewValidated);
_treeView.AfterCheck += new TreeViewEventHandler(OnTreeViewAfterCheck);
_treeView.AfterCollapse += new TreeViewEventHandler(OnTreeViewAfterCollapse);
_treeView.AfterExpand += new TreeViewEventHandler(OnTreeViewAfterExpand);
_treeView.AfterLabelEdit += new NodeLabelEditEventHandler(OnTreeViewAfterLabelEdit);
_treeView.AfterSelect += new TreeViewEventHandler(OnTreeViewAfterSelect);
_treeView.BeforeCheck += new TreeViewCancelEventHandler(OnTreeViewBeforeCheck);
_treeView.BeforeCollapse += new TreeViewCancelEventHandler(OnTreeViewBeforeCollapse);
_treeView.BeforeExpand += new TreeViewCancelEventHandler(OnTreeViewBeforeExpand);
_treeView.BeforeLabelEdit += new NodeLabelEditEventHandler(OnTreeViewBeforeLabelEdit);
_treeView.BeforeSelect += new TreeViewCancelEventHandler(OnTreeViewBeforeSelect);
_treeView.ItemDrag += new ItemDragEventHandler(OnTreeViewItemDrag);
_treeView.NodeMouseClick += new TreeNodeMouseClickEventHandler(OnTreeViewNodeMouseClick);
_treeView.NodeMouseDoubleClick += new TreeNodeMouseClickEventHandler(OnTreeViewNodeMouseDoubleClick);
_treeView.NodeMouseHover += new TreeNodeMouseHoverEventHandler(OnTreeViewNodeMouseHover);
_treeView.DrawNode += new DrawTreeNodeEventHandler(OnTreeViewDrawNode);
_treeView.DrawMode = TreeViewDrawMode.OwnerDrawAll;
// Create the element that fills the remainder space and remembers fill rectange
_layoutFill = new ViewLayoutFill(_treeView);
_layoutFill.DisplayPadding = new Padding(1);
// Create inner view for placing inside the drawing docker
_drawDockerInner = new ViewLayoutDocker();
_drawDockerInner.Add(_layoutFill, ViewDockStyle.Fill);
// Create view for the control border and background
_drawDockerOuter = new ViewDrawDocker(_stateNormal.Back, _stateNormal.Border);
_drawDockerOuter.Add(_drawDockerInner, ViewDockStyle.Fill);
// Create the view manager instance
ViewManager = new ViewManager(this, _drawDockerOuter);
// We need to create and cache a device context compatible with the display
_screenDC = PI.CreateCompatibleDC(IntPtr.Zero);
// Add tree view to the controls collection
((KryptonReadOnlyControls)Controls).AddInternal(_treeView);
}