} // display rectangle of the control, used for invalidation public BasicCoordinator(PlacementDrivenLogicalControl logicalControl, LogicalControlsContainer logicalControlsContainer) { _lg = logicalControl; _logicalControlsContainer = logicalControlsContainer; _containerControl = logicalControlsContainer.mainControl; _logicalControlsContainer.Add(logicalControl); _lg.VisibleChanged += lg_VisibleChanged; }
/// <summary> /// copied from GUI::gui_upd_win_scroll_bars_hebrew in online QCR #978524 /// when controls receive negative location (possible during hebrew placement) /// we must move all the control so they will have positive locations, /// like it is done in online /// </summary> /// <param name="containerControl"></param> void gui_upd_win_scroll_bars_hebrew(Control containerControl) { ArrayList controlsList = GetControlsList(containerControl); int leftDX = 0; foreach (var item in controlsList) { if (!ShouldApplyPlacement(item)) { continue; } //check visible!!! Rectangle rect = Bounds(item); leftDX = Math.Min(rect.X, leftDX); } if (leftDX < 0) { LogicalControlsContainer logicalControlsContainer = GetLogicalControlsContainer(containerControl); logicalControlsContainer.NegativeOffset = leftDX; foreach (var item in controlsList) { if (!ShouldApplyPlacement(item)) { continue; } Control control = item as Control; if (control != null) { #if PocketPC // skip dummy control if (containerControl is Panel && item == ((Panel)containerControl).dummy) { continue; } #endif Rectangle rect = Bounds(control); Rectangle?savedRect = GetSavedBounds(control); if (savedRect != null) { rect.Width = ((Rectangle)savedRect).Width; rect.Height = ((Rectangle)savedRect).Height; } rect.X -= leftDX; SetBounds(control, rect); } else //logical control { ReCalculateAndRefresh(item); } } } }
/// <summary> /// return list of chlid controls including static controls /// </summary> /// <param name="container"></param> /// <returns></returns> private ArrayList GetControlsList(Control containerControl) { ArrayList array = new ArrayList(); // Can't use List<T> - may hold controls and logical controls array.AddRange(containerControl.Controls); LogicalControlsContainer logicalControlsContainer = GetLogicalControlsContainer(containerControl); if (logicalControlsContainer != null && logicalControlsContainer.LogicalControls != null) { array.AddRange(logicalControlsContainer.LogicalControls); } return(array); }
protected virtual void ReCalculateAndRefresh() { LogicalControlsContainer logicalControlsContainer = GetLogicalControlsContainer(_mainComposite); if (logicalControlsContainer != null && !logicalControlsContainer.SizeChange.IsEmpty) { logicalControlsContainer.SizeChange = new Point(); foreach (var item in logicalControlsContainer.LogicalControls) { ReCalculateAndRefresh(item); } } }
/// <summary> /// Compute logical size /// </summary> /// <param name="container"></param> /// <returns></returns> public Point computeSize(Control container) { int width = 0, height = 0; //all this is not relevant for table control , to improve performance return size if (container is TableControl) { return(new Point(container.Size.Width, container.Size.Height)); } GetMaxOfActualControlDimensions(container, ref width, ref height); Size size = new Size(); LogicalControlsContainer logicalControlsContainer = GetLogicalControlsContainer(container); if (logicalControlsContainer != null) { size = logicalControlsContainer.computeSize(); } return(new Point(Math.Max(width, size.Width), Math.Max(height, size.Height))); }
/// <summary> implement placement</summary> public void layout(Control containerControl, LayoutEventArgs ea) { if (!CanPerformLayout(containerControl)) { return; } containerControl.SuspendLayout(); Rectangle rectangleToSave, newRect = rectangleToSave = GetBounds(_mainComposite); FixRuntimeDesignerPlacement(ref newRect); Point actualPlacement = new Point(0, 0); int deltaX = 0, deltaY = 0; ArrayList controlsList; bool compositeMoved = newRect.Width - _prevRect.Width != 0 || newRect.Height - _prevRect.Height != 0; if (compositeMoved) { deltaX = newRect.Width - _prevRect.Width; deltaY = newRect.Height - _prevRect.Height; // we have horizontal scrollbar and it will remain after placement if ((_prevRect.Width < _prevLogicalSize.X && newRect.Width < _prevLogicalSize.X) || _prevLogicalSize.X < 0) { if (containerControl is ScrollableControl && ((ScrollableControl)containerControl).AutoScroll) { deltaX = 0; } } if ((_prevRect.Height < _prevLogicalSize.Y && newRect.Height < _prevLogicalSize.Y) || _prevLogicalSize.Y < 0) { // we have vertical scrollbar and it will remain after placement deltaY = 0; } if (deltaX != 0 || deltaY != 0) { actualPlacement = limitPlacement(containerControl, deltaX, deltaY, newRect); } Debug.Assert(!(IsTabControl(containerControl))); if (!(containerControl is TableControl)) { controlsList = GetControlsList(containerControl); // execute placement LogicalControlsContainer logicalControlsContainer = GetLogicalControlsContainer(containerControl); if (logicalControlsContainer != null) { logicalControlsContainer.addChange(actualPlacement); } foreach (Object obj in controlsList) { #if PocketPC // No placement for dummy control if (containerControl is Panel && obj == ((Panel)containerControl).dummy) { continue; } #endif ControlPlacement(obj, actualPlacement); } if (logicalControlsContainer.LogicalControls != null) { containerControl.Invalidate(); } } } _prevRect = rectangleToSave; if (isRTL(containerControl)) { gui_upd_win_scroll_bars_hebrew(containerControl); } computeAndUpdateLogicalSize(containerControl); containerControl.ResumeLayout(); }