/// <summary> /// Gets the view for the next visible and enabled button spec of the defined edge. /// </summary> /// <param name="align">Edge of buttons caller is interested in searching.</param> /// <param name="current">Current button that is the marker for searching.</param> /// <returns>ViewDrawButton reference; otherwise false.</returns> public virtual ViewDrawButton GetNextVisibleViewButton(PaletteRelativeEdgeAlign align, ViewDrawButton current) { bool found = false; foreach (ButtonSpecView specView in _specLookup.Values) { if (!found) { found = (specView.ViewButton == current); } else { // Is the button actually visible/enabled if (specView.ViewCenter.Visible && specView.ViewButton.Enabled) { if (specView.ButtonSpec.Edge == align) { return(specView.ViewButton); } } } } return(null); }
/// <summary> /// Perform rendering before child elements are rendered. /// </summary> /// <param name="context">Rendering context.</param> public override void RenderBefore(RenderContext context) { foreach (ViewBase child in this) { // Only interested in updating view buttons if (child is ViewDrawButton) { // Cast to correct type ViewDrawButton crumbButton = child as ViewDrawButton; // That are associated with crumb items KryptonBreadCrumbItem crumbItem; if (_buttonToCrumb.TryGetValue(crumbButton, out crumbItem)) { // If the button is pressed then point button downwards, // otherwise we point in the direction the buttons layed out. if (crumbButton.ElementState == PaletteState.Pressed) { crumbButton.DropDownOrientation = VisualOrientation.Top; } else { crumbButton.DropDownOrientation = VisualOrientation.Left; } } } } base.RenderBefore(context); }
/// <summary> /// Initialize a new instance of the ButtonSpecView class. /// </summary> /// <param name="redirector">Palette redirector.</param> /// <param name="paletteMetric">Source for metric values.</param> /// <param name="metricPadding">Padding metric for border padding.</param> /// <param name="manager">Reference to owning manager.</param> /// <param name="buttonSpec">Access</param> public ButtonSpecView(PaletteRedirect redirector, IPaletteMetric paletteMetric, PaletteMetricPadding metricPadding, ButtonSpecManagerBase manager, ButtonSpec buttonSpec) { Debug.Assert(redirector != null); Debug.Assert(manager != null); Debug.Assert(buttonSpec != null); // Remember references _redirector = redirector; _manager = manager; _buttonSpec = buttonSpec; _finishDelegate = new EventHandler(OnFinishDelegate); // Create delegate for paint notifications NeedPaintHandler needPaint = new NeedPaintHandler(OnNeedPaint); // Intercept calls from the button for color remapping and instead use // the button spec defined map and the container foreground color _remapPalette = _manager.CreateButtonSpecRemap(redirector, buttonSpec); // Use a redirector to get button values directly from palette _palette = new PaletteTripleRedirect(_remapPalette, PaletteBackStyle.ButtonButtonSpec, PaletteBorderStyle.ButtonButtonSpec, PaletteContentStyle.ButtonButtonSpec, needPaint); // Create the view for displaying a button _viewButton = new ViewDrawButton(_palette, _palette, _palette, _palette, paletteMetric, this, VisualOrientation.Top, false); // Associate the view with the source component (for design time support) if (buttonSpec.AllowComponent) _viewButton.Component = buttonSpec; // Use a view center to place button in centre of given space _viewCenter = new ViewLayoutCenter(paletteMetric, metricPadding, VisualOrientation.Top); _viewCenter.Add(_viewButton); // Create a controller for managing button behavior ButtonSpecViewControllers controllers = CreateController(_viewButton, needPaint, new MouseEventHandler(OnClick)); _viewButton.MouseController = controllers.MouseController; _viewButton.SourceController = controllers.SourceController; _viewButton.KeyController = controllers.KeyController; // We need notifying whenever a button specification property changes _buttonSpec.ButtonSpecPropertyChanged += new PropertyChangedEventHandler(OnPropertyChanged); // Associate the button spec with the view that is drawing it _buttonSpec.SetView(_viewButton); // Finally update view with current button spec settings UpdateButtonStyle(); UpdateVisible(); UpdateEnabled(); UpdateChecked(); }
/// <summary> /// Initialize a new instance of the KryptonButton class. /// </summary> public KryptonButton() { // We generate click events manually, suppress default // production of them by the base Control class SetStyle(ControlStyles.StandardClick | ControlStyles.StandardDoubleClick, false); // Set default button properties _style = ButtonStyle.Standalone; _dialogResult = DialogResult.None; _orientation = VisualOrientation.Top; _useMnemonic = true; // Create content storage _buttonValues = CreateButtonValues(NeedPaintDelegate); _buttonValues.TextChanged += new EventHandler(OnButtonTextChanged); // Create the palette storage _stateCommon = new PaletteTripleRedirect(Redirector, PaletteBackStyle.ButtonStandalone, PaletteBorderStyle.ButtonStandalone, PaletteContentStyle.ButtonStandalone, NeedPaintDelegate); _stateDisabled = new PaletteTriple(_stateCommon, NeedPaintDelegate); _stateNormal = new PaletteTriple(_stateCommon, NeedPaintDelegate); _stateTracking = new PaletteTriple(_stateCommon, NeedPaintDelegate); _statePressed = new PaletteTriple(_stateCommon, NeedPaintDelegate); _stateDefault = new PaletteTripleRedirect(Redirector, PaletteBackStyle.ButtonStandalone, PaletteBorderStyle.ButtonStandalone, PaletteContentStyle.ButtonStandalone, NeedPaintDelegate); _stateFocus = new PaletteTripleRedirect(Redirector, PaletteBackStyle.ButtonStandalone, PaletteBorderStyle.ButtonStandalone, PaletteContentStyle.ButtonStandalone, NeedPaintDelegate); // Create the override handling classes _overrideFocus = new PaletteTripleOverride(_stateFocus, _stateNormal, PaletteState.FocusOverride); _overrideNormal = new PaletteTripleOverride(_stateDefault, _overrideFocus, PaletteState.NormalDefaultOverride); _overrideTracking = new PaletteTripleOverride(_stateFocus, _stateTracking, PaletteState.FocusOverride); _overridePressed = new PaletteTripleOverride(_stateFocus, _statePressed, PaletteState.FocusOverride); // Create the view button instance _drawButton = new ViewDrawButton(_stateDisabled, _overrideNormal, _overrideTracking, _overridePressed, new PaletteMetricRedirect(Redirector), this, Orientation, UseMnemonic); // Only draw a focus rectangle when focus cues are needed in the top level form _drawButton.TestForFocusCues = true; // Create a button controller to handle button style behaviour _buttonController = new ButtonController(_drawButton, NeedPaintDelegate); // Assign the controller to the view element to treat as a button _drawButton.MouseController = _buttonController; _drawButton.KeyController = _buttonController; _drawButton.SourceController = _buttonController; // Need to know when user clicks the button view or mouse selects it _buttonController.Click += new MouseEventHandler(OnButtonClick); _buttonController.MouseSelect += new MouseEventHandler(OnButtonSelect); // Create the view manager instance ViewManager = new ViewManager(this, _drawButton); }
private void CreateOverflowButton() { // Create a button used when we overflow the available area _overflowButton = new ViewDrawButton(_kryptonBreadCrumb.StateDisabled.BreadCrumb, _kryptonBreadCrumb.StateNormal.BreadCrumb, _kryptonBreadCrumb.StateTracking.BreadCrumb, _kryptonBreadCrumb.StatePressed.BreadCrumb, _kryptonBreadCrumb.GetStateCommon(), this, VisualOrientation.Top, false) { Splitter = true, TestForFocusCues = true, DropDownPalette = _kryptonBreadCrumb.GetRedirector() }; // Create controller for operating the button ButtonController crumbButtonController = new ButtonController(_overflowButton, _needPaintDelegate) { Tag = this, BecomesFixed = true }; crumbButtonController.Click += OnOverflowButtonClick; _overflowButton.MouseController = crumbButtonController; }
/// <summary> /// Gets the view for the previous visible and enabled button spec of the defined edge. /// </summary> /// <param name="align">Edge of buttons caller is interested in searching.</param> /// <param name="current">Current button that is the marker for searching.</param> /// <returns>ViewDrawButton reference; otherwise false.</returns> public virtual ViewDrawButton GetPreviousVisibleViewButton(PaletteRelativeEdgeAlign align, ViewDrawButton current) { ButtonSpecView[] specLookups = new ButtonSpecView[_specLookup.Count]; _specLookup.Values.CopyTo(specLookups, 0); bool found = false; for (int i = _specLookup.Count - 1; i >= 0; i--) { ButtonSpecView specView = (ButtonSpecView)specLookups[i]; if (!found) { found = (specView.ViewButton == current); } else { // Is the button actually visible/enabled if (specView.ViewCenter.Visible && specView.ViewButton.Enabled) { if (specView.ButtonSpec.Edge == align) { return(specView.ViewButton); } } } } return(null); }
/// <summary> /// Initialize a new instance of the ButtonSpecAppButtonController class. /// </summary> /// <param name="viewManager">Owning view manager instance.</param> /// <param name="target">Target for state changes.</param> /// <param name="needPaint">Delegate for notifying paint requests.</param> public ButtonSpecAppButtonController(ViewContextMenuManager viewManager, ViewDrawButton target, NeedPaintHandler needPaint) : base(target, needPaint) { _target = target; _viewManager = viewManager; }
/// <summary> /// Find the ButtonSpec definition associated with the provided button view. /// </summary> /// <param name="viewButton">View to use when searching.</param> /// <returns>ButtonSpec reference if found; otherwise null.</returns> public virtual ButtonSpec GetButtonSpecFromView(ViewDrawButton viewButton) { foreach (ButtonSpecView specView in _specLookup.Values) { if (specView.ViewButton == viewButton) { return(specView.ButtonSpec); } } return(null); }
private void SyncBreadCrumbs() { // Remove all existing children Clear(); // Walk up the bread crumb trail KryptonBreadCrumbItem item = _kryptonBreadCrumb.SelectedItem; while (item != null) { // If we do not have a button to represent this crumb... if (!_crumbToButton.TryGetValue(item, out ViewDrawButton crumbButton)) { // Setup the button for drawing as a drop down button if required crumbButton = new ViewDrawButton(_kryptonBreadCrumb.StateDisabled.BreadCrumb, _kryptonBreadCrumb.StateNormal.BreadCrumb, _kryptonBreadCrumb.StateTracking.BreadCrumb, _kryptonBreadCrumb.StatePressed.BreadCrumb, _kryptonBreadCrumb.GetStateCommon(), item, VisualOrientation.Top, false) { Splitter = true, TestForFocusCues = true, DropDownPalette = _kryptonBreadCrumb.GetRedirector() }; // Create controller for operating the button ButtonController crumbButtonController = new ButtonController(crumbButton, _needPaintDelegate) { Tag = item, BecomesFixed = true }; crumbButtonController.Click += OnButtonClick; crumbButton.MouseController = crumbButtonController; // Add to cache for future use _crumbToButton.Add(item, crumbButton); _buttonToCrumb.Add(crumbButton, item); } // Only show a drop down button if we have some children to choose from crumbButton.DropDown = _kryptonBreadCrumb.DropDownNavigation && (item.Items.Count > 0); // Add crumb to end of child collection Insert(0, crumbButton); // Move up another level item = item.Parent; } // Always add the overflow to the first item Insert(0, _overflowButton); }
/// <summary> /// Create a button controller for the view. /// </summary> /// <param name="viewButton">View to be controlled.</param> /// <param name="needPaint">Paint delegate.</param> /// <param name="clickHandler">Reference to click handler.</param> /// <returns>Controller instance.</returns> public override ButtonSpecViewControllers CreateController(ViewDrawButton viewButton, NeedPaintHandler needPaint, MouseEventHandler clickHandler) { // Create a ribbon specific button controller _controller = new ButtonSpecRibbonController(viewButton, needPaint); _controller.BecomesFixed = true; _controller.Click += clickHandler; // If associated with a tooltip manager then pass mouse messages onto tooltip manager IMouseController mouseController = (IMouseController)_controller; if (Manager.ToolTipManager != null) mouseController = new ToolTipController(Manager.ToolTipManager, viewButton, _controller); // Return a collection of controllers return new ButtonSpecViewControllers(mouseController, _controller, _controller); }
/// <summary> /// Initialize a new instance of the KryptonCheckButton class. /// </summary> public KryptonCheckButton() { // Create the extra state needed for the checked additions the the base button StateCheckedNormal = new PaletteTriple(StateCommon, NeedPaintDelegate); StateCheckedTracking = new PaletteTriple(StateCommon, NeedPaintDelegate); StateCheckedPressed = new PaletteTriple(StateCommon, NeedPaintDelegate); // Create the override handling classes _overrideCheckedFocus = new PaletteTripleOverride(OverrideFocus, StateCheckedNormal, PaletteState.FocusOverride); _overrideCheckedNormal = new PaletteTripleOverride(OverrideDefault, _overrideCheckedFocus, PaletteState.NormalDefaultOverride); _overrideCheckedTracking = new PaletteTripleOverride(OverrideFocus, StateCheckedTracking, PaletteState.FocusOverride); _overrideCheckedPressed = new PaletteTripleOverride(OverrideFocus, StateCheckedPressed, PaletteState.FocusOverride); // Add the checked specific palettes to the existing view button ViewDrawButton.SetCheckedPalettes(_overrideCheckedNormal, _overrideCheckedTracking, _overrideCheckedPressed); }
/// <summary> /// Create a button controller for the view. /// </summary> /// <param name="viewButton">View to be controlled.</param> /// <param name="needPaint">Paint delegate.</param> /// <param name="clickHandler">Reference to click handler.</param> /// <returns>Controller instance.</returns> public virtual ButtonSpecViewControllers CreateController(ViewDrawButton viewButton, NeedPaintHandler needPaint, MouseEventHandler clickHandler) { // Create a standard button controller _controller = new ButtonController(viewButton, needPaint); _controller.BecomesFixed = true; _controller.Click += clickHandler; // If associated with a tooltip manager then pass mouse messages onto tooltip manager IMouseController mouseController = (IMouseController)_controller; if (Manager.ToolTipManager != null) { mouseController = new ToolTipController(Manager.ToolTipManager, viewButton, _controller); } // Return a collection of controllers return(new ButtonSpecViewControllers(mouseController, _controller, _controller)); }
/// <summary> /// Initialize a new instance of the ButtonSpecView class. /// </summary> /// <param name="redirector">Palette redirector.</param> /// <param name="paletteMetric">Source for metric values.</param> /// <param name="metricPadding">Padding metric for border padding.</param> /// <param name="manager">Reference to owning manager.</param> /// <param name="buttonSpec">Access</param> public ButtonSpecView(PaletteRedirect redirector, IPaletteMetric paletteMetric, PaletteMetricPadding metricPadding, ButtonSpecManagerBase manager, ButtonSpec buttonSpec) { Debug.Assert(redirector != null); Debug.Assert(manager != null); Debug.Assert(buttonSpec != null); // Remember references _redirector = redirector; Manager = manager; ButtonSpec = buttonSpec; _finishDelegate = OnFinishDelegate; // Create delegate for paint notifications NeedPaintHandler needPaint = OnNeedPaint; // Intercept calls from the button for color remapping and instead use // the button spec defined map and the container foreground color RemapPalette = Manager.CreateButtonSpecRemap(redirector, buttonSpec); // Use a redirector to get button values directly from palette _palette = new PaletteTripleRedirect(RemapPalette, PaletteBackStyle.ButtonButtonSpec, PaletteBorderStyle.ButtonButtonSpec, PaletteContentStyle.ButtonButtonSpec, needPaint); // Create the view for displaying a button ViewButton = new ViewDrawButton(_palette, _palette, _palette, _palette, paletteMetric, this, VisualOrientation.Top, false); // Associate the view with the source component (for design time support) if (buttonSpec.AllowComponent) { ViewButton.Component = buttonSpec; } // Use a view center to place button in centre of given space ViewCenter = new ViewLayoutCenter(paletteMetric, metricPadding, VisualOrientation.Top) { ViewButton }; // Create a controller for managing button behavior ButtonSpecViewControllers controllers = CreateController(ViewButton, needPaint, OnClick); ViewButton.MouseController = controllers.MouseController; ViewButton.SourceController = controllers.SourceController; ViewButton.KeyController = controllers.KeyController; // We need notifying whenever a button specification property changes ButtonSpec.ButtonSpecPropertyChanged += OnPropertyChanged; // Associate the button spec with the view that is drawing it ButtonSpec.SetView(ViewButton); // Finally update view with current button spec settings UpdateButtonStyle(); UpdateVisible(); UpdateEnabled(); UpdateChecked(); }
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); }
/// <summary> /// Initialize a new instance of the ViewDrawMenuCheckButton class. /// </summary> /// <param name="provider">Reference to provider.</param> /// <param name="checkButton">Reference to owning check button entry.</param> public ViewDrawMenuCheckButton(IContextMenuProvider provider, KryptonContextMenuCheckButton checkButton) { _provider = provider; KryptonContextMenuCheckButton = checkButton; // Create fixed storage of the content values _contentValues = new FixedContentValue(ResolveText, ResolveExtraText, ResolveImage, ResolveImageTransparentColor); // Decide on the enabled state of the display ItemEnabled = provider.ProviderEnabled && ResolveEnabled; // Give the heading object the redirector to use when inheriting values KryptonContextMenuCheckButton.SetPaletteRedirect(provider.ProviderRedirector); // Create the view button instance ViewDrawButton = new ViewDrawButton(checkButton.OverrideDisabled, checkButton.OverrideNormal, checkButton.OverrideTracking, checkButton.OverridePressed, new PaletteMetricRedirect(provider.ProviderRedirector), _contentValues, VisualOrientation.Top, true); // Add the checked specific palettes to the existing view button ViewDrawButton.SetCheckedPalettes(checkButton.OverrideCheckedNormal, checkButton.OverrideCheckedTracking, checkButton.OverrideCheckedPressed); ViewDrawButton.Enabled = ItemEnabled; ViewDrawButton.Checked = ResolveChecked; // Place the check box on the left of the available space but inside separators _innerDocker = new ViewLayoutDocker { { ViewDrawButton, ViewDockStyle.Fill }, { new ViewLayoutSeparator(1), ViewDockStyle.Right }, { new ViewLayoutSeparator(1), ViewDockStyle.Left }, { new ViewLayoutSeparator(1), ViewDockStyle.Top }, { new ViewLayoutSeparator(1), ViewDockStyle.Bottom } }; // Use outer docker so that any extra space not needed is used by the null _outerDocker = new ViewLayoutDocker { { _innerDocker, ViewDockStyle.Top }, { new ViewLayoutNull(), ViewDockStyle.Fill } }; // Use context menu specific version of the check box controller MenuCheckButtonController mcbc = new MenuCheckButtonController(provider.ProviderViewManager, _innerDocker, this, provider.ProviderNeedPaintDelegate); mcbc.Click += OnClick; _innerDocker.MouseController = mcbc; _innerDocker.KeyController = mcbc; // Add docker as the composite content Add(_outerDocker); // Want to know when a property changes whilst displayed KryptonContextMenuCheckButton.PropertyChanged += OnPropertyChanged; // We need to know if a property of the command changes if (KryptonContextMenuCheckButton.KryptonCommand != null) { _cachedCommand = KryptonContextMenuCheckButton.KryptonCommand; KryptonContextMenuCheckButton.KryptonCommand.PropertyChanged += OnCommandPropertyChanged; } }
public KryptonListBox() { // Contains another control and needs marking as such for validation to work SetStyle(ControlStyles.ContainerControl, true); // Cannot select this control, only the child ListBox and does not generate a click event SetStyle(ControlStyles.Selectable | ControlStyles.StandardClick, false); // Default fields _alwaysActive = true; _lastSelectedIndex = -1; _style = ButtonStyle.ListItem; base.Padding = new Padding(1); // Create the palette storage _stateCommon = new PaletteListStateRedirect(Redirector, PaletteBackStyle.InputControlStandalone, PaletteBorderStyle.InputControlStandalone, NeedPaintDelegate); _stateFocus = new PaletteListItemTripleRedirect(Redirector, PaletteBackStyle.ButtonListItem, PaletteBorderStyle.ButtonListItem, PaletteContentStyle.ButtonListItem, NeedPaintDelegate); _stateDisabled = new PaletteListState(_stateCommon, NeedPaintDelegate); _stateActive = new PaletteDouble(_stateCommon, NeedPaintDelegate); _stateNormal = new PaletteListState(_stateCommon, NeedPaintDelegate); _stateTracking = new PaletteListItemTriple(_stateCommon.Item, NeedPaintDelegate); _statePressed = new PaletteListItemTriple(_stateCommon.Item, NeedPaintDelegate); _stateCheckedNormal = new PaletteListItemTriple(_stateCommon.Item, NeedPaintDelegate); _stateCheckedTracking = new PaletteListItemTriple(_stateCommon.Item, NeedPaintDelegate); _stateCheckedPressed = new PaletteListItemTriple(_stateCommon.Item, NeedPaintDelegate); // Create the override handling classes _overrideNormal = new PaletteTripleOverride(_stateFocus.Item, _stateNormal.Item, PaletteState.FocusOverride); _overrideTracking = new PaletteTripleOverride(_stateFocus.Item, _stateTracking.Item, PaletteState.FocusOverride); _overridePressed = new PaletteTripleOverride(_stateFocus.Item, _statePressed.Item, PaletteState.FocusOverride); _overrideCheckedNormal = new PaletteTripleOverride(_stateFocus.Item, _stateCheckedNormal.Item, PaletteState.FocusOverride); _overrideCheckedTracking = new PaletteTripleOverride(_stateFocus.Item, _stateCheckedTracking.Item, PaletteState.FocusOverride); _overrideCheckedPressed = new PaletteTripleOverride(_stateFocus.Item, _stateCheckedPressed.Item, PaletteState.FocusOverride); // Create the draw element for owner drawing individual items _contentValues = new FixedContentValue(); _drawButton = new ViewDrawButton(StateDisabled.Item, _overrideNormal, _overrideTracking, _overridePressed, _overrideCheckedNormal, _overrideCheckedTracking, _overrideCheckedPressed, new PaletteMetricRedirect(Redirector), _contentValues, VisualOrientation.Top, false); // Create the internal list box used for containing content _listBox = new InternalListBox(this); _listBox.DrawItem += new DrawItemEventHandler(OnListBoxDrawItem); _listBox.MeasureItem += new MeasureItemEventHandler(OnListBoxMeasureItem); _listBox.TrackMouseEnter += new EventHandler(OnListBoxMouseChange); _listBox.TrackMouseLeave += new EventHandler(OnListBoxMouseChange); _listBox.DataSourceChanged += new EventHandler(OnListBoxDataSourceChanged); _listBox.DisplayMemberChanged += new EventHandler(OnListBoxDisplayMemberChanged); _listBox.ValueMemberChanged += new EventHandler(OnListBoxValueMemberChanged); _listBox.SelectedIndexChanged += new EventHandler(OnListBoxSelectedIndexChanged); _listBox.SelectedValueChanged += new EventHandler(OnListBoxSelectedValueChanged); _listBox.DisplayMemberChanged += new EventHandler(OnListBoxDisplayMemberChanged); _listBox.Format += new ListControlConvertEventHandler(OnListBoxFormat); _listBox.FormatInfoChanged += new EventHandler(OnListBoxFormatInfoChanged); _listBox.FormatStringChanged += new EventHandler(OnListBoxFormatStringChanged); _listBox.FormattingEnabledChanged += new EventHandler(OnListBoxFormattingEnabledChanged); _listBox.GotFocus += new EventHandler(OnListBoxGotFocus); _listBox.LostFocus += new EventHandler(OnListBoxLostFocus); _listBox.KeyDown += new KeyEventHandler(OnListBoxKeyDown); _listBox.KeyUp += new KeyEventHandler(OnListBoxKeyUp); _listBox.KeyPress += new KeyPressEventHandler(OnListBoxKeyPress); _listBox.PreviewKeyDown += new PreviewKeyDownEventHandler(OnListBoxPreviewKeyDown); _listBox.Validating += new CancelEventHandler(OnListBoxValidating); _listBox.Validated += new EventHandler(OnListBoxValidated); // Create the element that fills the remainder space and remembers fill rectange _layoutFill = new ViewLayoutFill(_listBox); _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 list box to the controls collection ((KryptonReadOnlyControls)Controls).AddInternal(_listBox); }
/// <summary> /// Initialize a new instance of the KryptonDropButton class. /// </summary> public KryptonDropButton() { // We generate click events manually, suppress default // production of them by the base Control class SetStyle(ControlStyles.StandardClick | ControlStyles.StandardDoubleClick, false); // Set default button properties _style = ButtonStyle.Standalone; DialogResult = DialogResult.None; _useMnemonic = true; // Create content storage Values = CreateButtonValues(NeedPaintDelegate); Values.TextChanged += OnButtonTextChanged; Images = new DropDownButtonImages(NeedPaintDelegate); // Image need an extra redirector to check the local images first _paletteDropDownButtonImages = new PaletteRedirectDropDownButton(Redirector, Images); // Create the palette storage StateCommon = new PaletteTripleRedirect(Redirector, PaletteBackStyle.ButtonStandalone, PaletteBorderStyle.ButtonStandalone, PaletteContentStyle.ButtonStandalone, NeedPaintDelegate); StateDisabled = new PaletteTriple(StateCommon, NeedPaintDelegate); StateNormal = new PaletteTriple(StateCommon, NeedPaintDelegate); StateTracking = new PaletteTriple(StateCommon, NeedPaintDelegate); StatePressed = new PaletteTriple(StateCommon, NeedPaintDelegate); OverrideDefault = new PaletteTripleRedirect(Redirector, PaletteBackStyle.ButtonStandalone, PaletteBorderStyle.ButtonStandalone, PaletteContentStyle.ButtonStandalone, NeedPaintDelegate); OverrideFocus = new PaletteTripleRedirect(Redirector, PaletteBackStyle.ButtonStandalone, PaletteBorderStyle.ButtonStandalone, PaletteContentStyle.ButtonStandalone, NeedPaintDelegate); // Create the override handling classes _overrideFocus = new PaletteTripleOverride(OverrideFocus, StateNormal, PaletteState.FocusOverride); _overrideNormal = new PaletteTripleOverride(OverrideDefault, _overrideFocus, PaletteState.NormalDefaultOverride); _overrideTracking = new PaletteTripleOverride(OverrideFocus, StateTracking, PaletteState.FocusOverride); _overridePressed = new PaletteTripleOverride(OverrideFocus, StatePressed, PaletteState.FocusOverride); // Create the view button instance _drawButton = new ViewDrawButton(StateDisabled, _overrideNormal, _overrideTracking, _overridePressed, new PaletteMetricRedirect(Redirector), this, VisualOrientation.Top, UseMnemonic) { // Set default button state DropDown = true, Splitter = true, TestForFocusCues = true, DropDownPalette = _paletteDropDownButtonImages }; // Create a button controller to handle button style behaviour _buttonController = new ButtonController(_drawButton, NeedPaintDelegate) { BecomesFixed = true }; // Assign the controller to the view element to treat as a button _drawButton.MouseController = _buttonController; _drawButton.KeyController = _buttonController; _drawButton.SourceController = _buttonController; // Need to know when user clicks the button view or mouse selects it _buttonController.Click += OnButtonClick; _buttonController.MouseSelect += OnButtonSelect; // Create the view manager instance ViewManager = new ViewManager(this, _drawButton); }
/// <summary> /// Initialize a new instance of the KryptonColorButton class. /// </summary> public KryptonColorButton() { // We generate click events manually, suppress default // production of them by the base Control class SetStyle(ControlStyles.StandardClick | ControlStyles.StandardDoubleClick, false); // Set default color button properties _style = ButtonStyle.Standalone; _visibleThemes = true; _visibleStandard = true; _visibleRecent = true; _visibleNoColor = true; _visibleMoreColors = true; _autoRecentColors = true; _schemeThemes = ColorScheme.OfficeThemes; _schemeStandard = ColorScheme.OfficeStandard; _selectedRect = new Rectangle(0, 12, 16, 4); _selectedColor = Color.Red; _emptyBorderColor = Color.DarkGray; _dialogResult = DialogResult.None; _useMnemonic = true; _maxRecentColors = 10; _recentColors = new List<Color>(); // Create the context menu items _kryptonContextMenu = new KryptonContextMenu(); _separatorTheme = new KryptonContextMenuSeparator(); _headingTheme = new KryptonContextMenuHeading("Theme Colors"); _colorsTheme = new KryptonContextMenuColorColumns(ColorScheme.OfficeThemes); _separatorStandard = new KryptonContextMenuSeparator(); _headingStandard = new KryptonContextMenuHeading("Standard Colors"); _colorsStandard = new KryptonContextMenuColorColumns(ColorScheme.OfficeStandard); _separatorRecent = new KryptonContextMenuSeparator(); _headingRecent = new KryptonContextMenuHeading("Recent Colors"); _colorsRecent = new KryptonContextMenuColorColumns(ColorScheme.None); _separatorNoColor = new KryptonContextMenuSeparator(); _itemNoColor = new KryptonContextMenuItem("&No Color", Properties.Resources.ButtonNoColor, new EventHandler(OnClickNoColor)); _itemsNoColor = new KryptonContextMenuItems(); _itemsNoColor.Items.Add(_itemNoColor); _separatorMoreColors = new KryptonContextMenuSeparator(); _itemMoreColors = new KryptonContextMenuItem("&More Colors...", new EventHandler(OnClickMoreColors)); _itemsMoreColors = new KryptonContextMenuItems(); _itemsMoreColors.Items.Add(_itemMoreColors); _kryptonContextMenu.Items.AddRange(new KryptonContextMenuItemBase[] { _separatorTheme, _headingTheme, _colorsTheme, _separatorStandard, _headingStandard, _colorsStandard, _separatorRecent, _headingRecent, _colorsRecent, _separatorNoColor, _itemsNoColor, _separatorMoreColors, _itemsMoreColors}); // Create content storage _buttonValues = CreateButtonValues(NeedPaintDelegate); _buttonValues.TextChanged += new EventHandler(OnButtonTextChanged); _images = new DropDownButtonImages(NeedPaintDelegate); // Image need an extra redirector to check the local images first _paletteDropDownButtonImages = new PaletteRedirectDropDownButton(Redirector, _images); // Create the palette storage _strings = new PaletteColorButtonStrings(); _stateCommon = new PaletteTripleRedirect(Redirector, PaletteBackStyle.ButtonStandalone, PaletteBorderStyle.ButtonStandalone, PaletteContentStyle.ButtonStandalone, NeedPaintDelegate); _stateDisabled = new PaletteTriple(_stateCommon, NeedPaintDelegate); _stateNormal = new PaletteTriple(_stateCommon, NeedPaintDelegate); _stateTracking = new PaletteTriple(_stateCommon, NeedPaintDelegate); _statePressed = new PaletteTriple(_stateCommon, NeedPaintDelegate); _stateDefault = new PaletteTripleRedirect(Redirector, PaletteBackStyle.ButtonStandalone, PaletteBorderStyle.ButtonStandalone, PaletteContentStyle.ButtonStandalone, NeedPaintDelegate); _stateFocus = new PaletteTripleRedirect(Redirector, PaletteBackStyle.ButtonStandalone, PaletteBorderStyle.ButtonStandalone, PaletteContentStyle.ButtonStandalone, NeedPaintDelegate); // Create the override handling classes _overrideFocus = new PaletteTripleOverride(_stateFocus, _stateNormal, PaletteState.FocusOverride); _overrideNormal = new PaletteTripleOverride(_stateDefault, _overrideFocus, PaletteState.NormalDefaultOverride); _overrideTracking = new PaletteTripleOverride(_stateFocus, _stateTracking, PaletteState.FocusOverride); _overridePressed = new PaletteTripleOverride(_stateFocus, _statePressed, PaletteState.FocusOverride); // Create the view color button instance _drawButton = new ViewDrawButton(_stateDisabled, _overrideNormal, _overrideTracking, _overridePressed, new PaletteMetricRedirect(Redirector), this, VisualOrientation.Top, UseMnemonic); // Set default color button state _drawButton.DropDown = true; _drawButton.Splitter = true; _drawButton.TestForFocusCues = true; _drawButton.DropDownPalette = _paletteDropDownButtonImages; // Create a color button controller to handle button style behaviour _buttonController = new ButtonController(_drawButton, NeedPaintDelegate); _buttonController.BecomesFixed = true; // Assign the controller to the view element to treat as a button _drawButton.MouseController = _buttonController; _drawButton.KeyController = _buttonController; _drawButton.SourceController = _buttonController; // Need to know when user clicks the button view or mouse selects it _buttonController.Click += new MouseEventHandler(OnButtonClick); _buttonController.MouseSelect += new MouseEventHandler(OnButtonSelect); // Create the view manager instance ViewManager = new ViewManager(this, _drawButton); }
/// <summary> /// Initialize a new instance of the KryptonDropButton class. /// </summary> public KryptonDropButton() { // We generate click events manually, suppress default // production of them by the base Control class SetStyle(ControlStyles.StandardClick | ControlStyles.StandardDoubleClick, false); // Set default button properties _style = ButtonStyle.Standalone; _dialogResult = DialogResult.None; _useMnemonic = true; // Create content storage _buttonValues = CreateButtonValues(NeedPaintDelegate); _buttonValues.TextChanged += new EventHandler(OnButtonTextChanged); _images = new DropDownButtonImages(NeedPaintDelegate); // Image need an extra redirector to check the local images first _paletteDropDownButtonImages = new PaletteRedirectDropDownButton(Redirector, _images); // Create the palette storage _stateCommon = new PaletteTripleRedirect(Redirector, PaletteBackStyle.ButtonStandalone, PaletteBorderStyle.ButtonStandalone, PaletteContentStyle.ButtonStandalone, NeedPaintDelegate); _stateDisabled = new PaletteTriple(_stateCommon, NeedPaintDelegate); _stateNormal = new PaletteTriple(_stateCommon, NeedPaintDelegate); _stateTracking = new PaletteTriple(_stateCommon, NeedPaintDelegate); _statePressed = new PaletteTriple(_stateCommon, NeedPaintDelegate); _stateDefault = new PaletteTripleRedirect(Redirector, PaletteBackStyle.ButtonStandalone, PaletteBorderStyle.ButtonStandalone, PaletteContentStyle.ButtonStandalone, NeedPaintDelegate); _stateFocus = new PaletteTripleRedirect(Redirector, PaletteBackStyle.ButtonStandalone, PaletteBorderStyle.ButtonStandalone, PaletteContentStyle.ButtonStandalone, NeedPaintDelegate); // Create the override handling classes _overrideFocus = new PaletteTripleOverride(_stateFocus, _stateNormal, PaletteState.FocusOverride); _overrideNormal = new PaletteTripleOverride(_stateDefault, _overrideFocus, PaletteState.NormalDefaultOverride); _overrideTracking = new PaletteTripleOverride(_stateFocus, _stateTracking, PaletteState.FocusOverride); _overridePressed = new PaletteTripleOverride(_stateFocus, _statePressed, PaletteState.FocusOverride); // Create the view button instance _drawButton = new ViewDrawButton(_stateDisabled, _overrideNormal, _overrideTracking, _overridePressed, new PaletteMetricRedirect(Redirector), this, VisualOrientation.Top, UseMnemonic); // Set default button state _drawButton.DropDown = true; _drawButton.Splitter = true; _drawButton.TestForFocusCues = true; _drawButton.DropDownPalette = _paletteDropDownButtonImages; // Create a button controller to handle button style behaviour _buttonController = new ButtonController(_drawButton, NeedPaintDelegate); _buttonController.BecomesFixed = true; // Assign the controller to the view element to treat as a button _drawButton.MouseController = _buttonController; _drawButton.KeyController = _buttonController; _drawButton.SourceController = _buttonController; // Need to know when user clicks the button view or mouse selects it _buttonController.Click += new MouseEventHandler(OnButtonClick); _buttonController.MouseSelect += new MouseEventHandler(OnButtonSelect); // Create the view manager instance ViewManager = new ViewManager(this, _drawButton); }
private void OnButtonClick(object sender, MouseEventArgs e) { // Only allow a single context menu at a time if (!_showingContextMenu) { // Get access to the controller, view and crumb item ViewDrawButton viewButton = sender as ViewDrawButton; ButtonController controller = viewButton.MouseController as ButtonController; KryptonBreadCrumbItem breadCrumb = controller.Tag as KryptonBreadCrumbItem; // Do we need to show a drop down menu? if (viewButton.DropDown && viewButton.SplitRectangle.Contains(e.Location)) { // Create a context menu with a items collection KryptonContextMenu kcm = new KryptonContextMenu { // Use same palette settings for context menu as the main control Palette = _kryptonBreadCrumb.Palette }; if (kcm.Palette == null) { kcm.PaletteMode = _kryptonBreadCrumb.PaletteMode; } // Add an items collection as the root item of the context menu KryptonContextMenuItems items = new KryptonContextMenuItems(); kcm.Items.Add(items); // Store lookup between each menu item and the crumb it represents. Prevents // needing to use the menu item tag for remembering association. Leaving the // tag free for use by the user. _menuItemToCrumb = new MenuItemToCrumb(); // Create a new menu item to represent each child crumb foreach (KryptonBreadCrumbItem childCrumb in breadCrumb.Items) { KryptonContextMenuItem childMenu = new KryptonContextMenuItem(); // Store 1-to-1 association _menuItemToCrumb.Add(childMenu, childCrumb); // Copy across the display details of the child crumb item childMenu.Text = childCrumb.ShortText; childMenu.ExtraText = childCrumb.LongText; childMenu.Image = childCrumb.Image; childMenu.ImageTransparentColor = childCrumb.ImageTransparentColor; childMenu.Click += OnChildCrumbClick; items.Items.Add(childMenu); } // Allow the user a chance to alter the menu contents or cancel it entirely BreadCrumbMenuArgs bcma = new BreadCrumbMenuArgs(breadCrumb, kcm, KryptonContextMenuPositionH.Left, KryptonContextMenuPositionV.Below); _kryptonBreadCrumb.OnCrumbDropDown(bcma); // Is there still the need to show a menu that is not empty? if (!bcma.Cancel && (bcma.KryptonContextMenu != null) && CommonHelper.ValidKryptonContextMenu(bcma.KryptonContextMenu)) { // Cache the controller for use in menu close processing, prevents the need to // store anything in the KryptonContextMenu tag and so free up its use to the user. _pressedButtonController = controller; // Show the context menu so user can select the next item for selection bcma.KryptonContextMenu.Closed += OnKryptonContextMenuClosed; bcma.KryptonContextMenu.Show(_kryptonBreadCrumb, _kryptonBreadCrumb.RectangleToScreen(new Rectangle(viewButton.SplitRectangle.X - viewButton.SplitRectangle.Width, viewButton.SplitRectangle.Y, viewButton.SplitRectangle.Width * 2, viewButton.SplitRectangle.Height)), bcma.PositionH, bcma.PositionV); // do not show another context menu whilst this one is visible _showingContextMenu = true; } else { // Button gives a fixed appearance when pressed, without a context menu that is not necessary controller.RemoveFixed(); } } else { // Button gives a fixed appearance when pressed, without a context menu that is not necessary controller.RemoveFixed(); // Clicking item makes it become the selected crumb _kryptonBreadCrumb.SelectedItem = breadCrumb; } } }
private void OnOverflowButtonClick(object sender, MouseEventArgs e) { // Only allow a single context menu at a time if (!_showingContextMenu) { // Get access to the controller, view and crumb item ViewDrawButton viewButton = sender as ViewDrawButton; ButtonController controller = viewButton.MouseController as ButtonController; // Create a context menu with a items collection KryptonContextMenu kcm = new KryptonContextMenu { // Use same palette settings for context menu as the main control Palette = _kryptonBreadCrumb.Palette }; if (kcm.Palette == null) { kcm.PaletteMode = _kryptonBreadCrumb.PaletteMode; } // Add an items collection as the root item of the context menu KryptonContextMenuItems items = new KryptonContextMenuItems(); kcm.Items.Add(items); // Store lookup between each menu item and the crumb it represents. Prevents // needing to use the menu item tag for remembering association. Leaving the // tag free for use by the user. _menuItemToCrumb = new MenuItemToCrumb(); // Create a new menu item to represent each of the invisible crumbs not children of the root // (item 0=overflow button, 1=root; 2=child of root, so we start at index 3) for (int i = 3; i < Count; i++) { if (!this[i].Visible) { KryptonBreadCrumbItem childCrumb = _buttonToCrumb[(ViewDrawButton)this[i]]; KryptonContextMenuItem childMenu = new KryptonContextMenuItem(); // Store 1-to-1 association _menuItemToCrumb.Add(childMenu, childCrumb); // Copy across the display details of the child crumb item childMenu.Text = childCrumb.ShortText; childMenu.ExtraText = childCrumb.LongText; childMenu.Image = childCrumb.Image; childMenu.ImageTransparentColor = childCrumb.ImageTransparentColor; childMenu.Click += OnChildCrumbClick; items.Items.Add(childMenu); } } // Create a new menu item to represent each of the roots children bool firstRoot = true; foreach (KryptonBreadCrumbItem childCrumb in _kryptonBreadCrumb.RootItem.Items) { // The first time we add an entry if (firstRoot) { // Add a separator if entries already exist if (items.Items.Count > 0) { items.Items.Add(new KryptonContextMenuSeparator()); } firstRoot = false; } KryptonContextMenuItem childMenu = new KryptonContextMenuItem(); // Store 1-to-1 association _menuItemToCrumb.Add(childMenu, childCrumb); // Copy across the display details of the child crumb item childMenu.Text = childCrumb.ShortText; childMenu.ExtraText = childCrumb.LongText; childMenu.Image = childCrumb.Image; childMenu.ImageTransparentColor = childCrumb.ImageTransparentColor; childMenu.Click += OnChildCrumbClick; items.Items.Add(childMenu); } // Allow the user a chance to alter the menu contents or cancel it entirely ContextPositionMenuArgs cpma = new ContextPositionMenuArgs(kcm, KryptonContextMenuPositionH.Left, KryptonContextMenuPositionV.Below); _kryptonBreadCrumb.OnOverflowDropDown(cpma); // Is there still the need to show a menu that is not empty? if (!cpma.Cancel && (cpma.KryptonContextMenu != null) && CommonHelper.ValidKryptonContextMenu(cpma.KryptonContextMenu)) { // Cache the controller for use in menu close processing, prevents the need to // store anything in the KryptonContextMenu tag and so free up its use to the user. _pressedButtonController = controller; // Show the context menu so user can select the next item for selection cpma.KryptonContextMenu.Closed += OnKryptonContextMenuClosed; cpma.KryptonContextMenu.Show(_kryptonBreadCrumb, _kryptonBreadCrumb.RectangleToScreen(new Rectangle(viewButton.ClientRectangle.X, viewButton.ClientRectangle.Y, viewButton.ClientRectangle.Width * 2, viewButton.ClientRectangle.Height)), cpma.PositionH, cpma.PositionV); // do not show another context menu whilst this one is visible _showingContextMenu = true; } else { // Button gives a fixed appearance when pressed, without a context menu that is not necessary controller.RemoveFixed(); // Clicking item makes it become the selected crumb _kryptonBreadCrumb.SelectedItem = _kryptonBreadCrumb.RootItem; } } }
/// <summary> /// Initialize a new instance of the ViewDrawMenuCheckButton class. /// </summary> /// <param name="provider">Reference to provider.</param> /// <param name="checkButton">Reference to owning check button entry.</param> public ViewDrawMenuCheckButton(IContextMenuProvider provider, KryptonContextMenuCheckButton checkButton) { _provider = provider; _checkButton = checkButton; // Create fixed storage of the content values _contentValues = new FixedContentValue(ResolveText, ResolveExtraText, ResolveImage, ResolveImageTransparentColor); // Decide on the enabled state of the display _itemEnabled = provider.ProviderEnabled && ResolveEnabled; // Give the heading object the redirector to use when inheriting values _checkButton.SetPaletteRedirect(provider.ProviderRedirector); // Create the view button instance _drawButton = new ViewDrawButton(checkButton.OverrideDisabled, checkButton.OverrideNormal, checkButton.OverrideTracking, checkButton.OverridePressed, new PaletteMetricRedirect(provider.ProviderRedirector), _contentValues, VisualOrientation.Top, true); // Add the checked specific palettes to the existing view button _drawButton.SetCheckedPalettes(checkButton.OverrideCheckedNormal, checkButton.OverrideCheckedTracking, checkButton.OverrideCheckedPressed); _drawButton.Enabled = _itemEnabled; _drawButton.Checked = ResolveChecked; // Place the check box on the left of the available space but inside separators _innerDocker = new ViewLayoutDocker(); _innerDocker.Add(_drawButton, ViewDockStyle.Fill); _innerDocker.Add(new ViewLayoutSeparator(1), ViewDockStyle.Right); _innerDocker.Add(new ViewLayoutSeparator(1), ViewDockStyle.Left); _innerDocker.Add(new ViewLayoutSeparator(1), ViewDockStyle.Top); _innerDocker.Add(new ViewLayoutSeparator(1), ViewDockStyle.Bottom); // Use outer docker so that any extra space not needed is used by the null _outerDocker = new ViewLayoutDocker(); _outerDocker.Add(_innerDocker, ViewDockStyle.Top); _outerDocker.Add(new ViewLayoutNull(), ViewDockStyle.Fill); // Use context menu specific version of the check box controller MenuCheckButtonController mcbc = new MenuCheckButtonController(provider.ProviderViewManager, _innerDocker, this, provider.ProviderNeedPaintDelegate); mcbc.Click += new EventHandler(OnClick); _innerDocker.MouseController = mcbc; _innerDocker.KeyController = mcbc; // Add docker as the composite content Add(_outerDocker); // Want to know when a property changes whilst displayed _checkButton.PropertyChanged += new PropertyChangedEventHandler(OnPropertyChanged); // We need to know if a property of the command changes if (_checkButton.KryptonCommand != null) { _cachedCommand = _checkButton.KryptonCommand; _checkButton.KryptonCommand.PropertyChanged += new PropertyChangedEventHandler(OnCommandPropertyChanged); } }