/// <summary> /// Shows the layer arrangement dialog and then arranges the layers according to the user input. /// </summary> /// <param name="graph">Graph that contains the layers to arrange.</param> /// <param name="activeLayer">Layer that is currently active.</param> public static void ShowLayerArrangementDialog(this GraphDocument graph, HostLayer activeLayer) { var arrangement = new ArrangeLayersDocument(); object doco = arrangement; if (Current.Gui.ShowDialog(ref doco, "Arrange layers")) { arrangement = (ArrangeLayersDocument)doco; try { ArrangeLayers(activeLayer, arrangement); } catch (Exception ex) { Current.Gui.ErrorMessageBox(ex.Message); } } }
public static void ArrangeGrid(this ArrangeLayersDocument arrangement, GridPartitioning grid) { grid.XPartitioning.Clear(); grid.YPartitioning.Clear(); double columnSize = Math.Max(0, 1 - arrangement.LeftMargin - arrangement.RightMargin - (arrangement.NumberOfColumns - 1) * arrangement.ColumnSpacing); double rowSize = Math.Max(0, 1 - arrangement.TopMargin - arrangement.BottomMargin - (arrangement.NumberOfRows - 1) * arrangement.RowSpacing); if (arrangement.NumberOfColumns > 0) { grid.XPartitioning.Add(RADouble.NewRel(arrangement.LeftMargin)); for (int i = arrangement.NumberOfColumns - 1; i >= 0; --i) { grid.XPartitioning.Add(RADouble.NewRel(columnSize / arrangement.NumberOfColumns)); if (i != 0) { grid.XPartitioning.Add(RADouble.NewRel(arrangement.ColumnSpacing)); } } grid.XPartitioning.Add(RADouble.NewRel(arrangement.RightMargin)); } else { grid.XPartitioning.Add(RADouble.NewRel(1)); } if (arrangement.NumberOfRows > 0) { grid.YPartitioning.Add(RADouble.NewRel(arrangement.TopMargin)); for (int i = arrangement.NumberOfRows - 1; i >= 0; --i) { grid.YPartitioning.Add(RADouble.NewRel(rowSize / arrangement.NumberOfRows)); if (i != 0) { grid.YPartitioning.Add(RADouble.NewRel(arrangement.RowSpacing)); } } grid.YPartitioning.Add(RADouble.NewRel(arrangement.BottomMargin)); } else { grid.YPartitioning.Add(RADouble.NewRel(1)); } }
/// <summary> /// Arranges the layers according to the provided options. /// </summary> /// <param name="activeLayer">Layer, whose siblings are about to be arranged. (Exception: If the root layer is the active layer, then the childs of the root layer will be arranged.</param> /// <param name="arrangement">The layer arrangement options (contain the information how to arrange the layers).</param> public static void ArrangeLayers(this HostLayer activeLayer, ArrangeLayersDocument arrangement) { var context = activeLayer.GetPropertyContext(); var parentLayer = activeLayer.ParentLayer ?? activeLayer; int numPresentLayers = parentLayer.Layers.Count; int numDestLayers = arrangement.NumberOfColumns * arrangement.NumberOfRows; int additionalLayers = Math.Max(0, numDestLayers - numPresentLayers); if (null == parentLayer.Grid) { parentLayer.CreateDefaultGrid(); } ArrangeGrid(arrangement, parentLayer.Grid); int nLayer = -1; for (int i = 0; i < arrangement.NumberOfRows; ++i) { for (int j = 0; j < arrangement.NumberOfColumns; ++j) { nLayer++; if (nLayer >= numPresentLayers) { var graph = Altaxo.Graph.Gdi.GraphTemplates.TemplateWithXYPlotLayerWithG2DCartesicCoordinateSystem.CreateGraph(context, Guid.NewGuid().ToString(), "", false); if (graph != null && graph.RootLayer.Layers.Count > 0) { var newLayer = (HostLayer)graph.RootLayer.Layers[0].Clone(); parentLayer.Layers.Add(newLayer); } else { var newLayer = new XYPlotLayer(parentLayer); newLayer.CreateDefaultAxes(context); parentLayer.Layers.Add(newLayer); } } var oldSize = parentLayer.Layers[nLayer].Size; parentLayer.Layers[nLayer].Location = new ItemLocationByGrid { GridColumn = 2 * j + 1, GridRow = 2 * i + 1, GridColumnSpan = 1, GridRowSpan = 1 }; var newSize = parentLayer.Layers[nLayer].Size; } } // act now on superfluous layers if (numPresentLayers > numDestLayers) { switch (arrangement.SuperfluousLayersAction) { case SuperfluousLayersAction.Remove: for (int i = numPresentLayers - 1; i >= numDestLayers; i--) { parentLayer.Layers.RemoveAt(i); } break; case SuperfluousLayersAction.OverlayFirstLayer: case SuperfluousLayersAction.OverlayLastLayer: int template = arrangement.SuperfluousLayersAction == SuperfluousLayersAction.OverlayFirstLayer ? 0 : numDestLayers - 1; var templateLayer = parentLayer.Layers[template]; for (int i = numDestLayers; i < numPresentLayers; i++) { var oldSize = parentLayer.Layers[i].Size; parentLayer.Layers[i].Location = (IItemLocation)templateLayer.Location.Clone(); var newSize = parentLayer.Layers[i].Size; } break; } } }
public ArrangeLayersDocument(ArrangeLayersDocument from) { CopyFrom(from); }
/// <summary> /// Arranges the layers according to the provided options. /// </summary> /// <param name="activeLayer">Layer, whose siblings are about to be arranged. (Exception: If the root layer is the active layer, then the childs of the root layer will be arranged.</param> /// <param name="arrangement">The layer arrangement options (contain the information how to arrange the layers).</param> public static void ArrangeLayers(this HostLayer activeLayer, ArrangeLayersDocument arrangement) { var context = activeLayer.GetPropertyContext(); var parentLayer = activeLayer.ParentLayer ?? activeLayer; int numPresentLayers = parentLayer.Layers.Count; int numDestLayers = arrangement.NumberOfColumns * arrangement.NumberOfRows; int additionalLayers = Math.Max(0, numDestLayers - numPresentLayers); if (null == parentLayer.Grid) parentLayer.CreateDefaultGrid(); ArrangeGrid(arrangement, parentLayer.Grid); int nLayer = -1; for (int i = 0; i < arrangement.NumberOfRows; ++i) { for (int j = 0; j < arrangement.NumberOfColumns; ++j) { nLayer++; if (nLayer >= numPresentLayers) { var graph = Altaxo.Graph.Gdi.GraphTemplates.TemplateWithXYPlotLayerWithG2DCartesicCoordinateSystem.CreateGraph(context, Guid.NewGuid().ToString(), "", false); if (graph != null && graph.RootLayer.Layers.Count > 0) { var newLayer = (HostLayer)graph.RootLayer.Layers[0].Clone(); parentLayer.Layers.Add(newLayer); } else { var newLayer = new XYPlotLayer(parentLayer); newLayer.CreateDefaultAxes(context); parentLayer.Layers.Add(newLayer); } } var oldSize = parentLayer.Layers[nLayer].Size; parentLayer.Layers[nLayer].Location = new ItemLocationByGrid { GridColumn = 2 * j + 1, GridRow = 2 * i + 1, GridColumnSpan = 1, GridRowSpan = 1 }; var newSize = parentLayer.Layers[nLayer].Size; } } // act now on superfluous layers if (numPresentLayers > numDestLayers) { switch (arrangement.SuperfluousLayersAction) { case SuperfluousLayersAction.Remove: for (int i = numPresentLayers - 1; i >= numDestLayers; i--) parentLayer.Layers.RemoveAt(i); break; case SuperfluousLayersAction.OverlayFirstLayer: case SuperfluousLayersAction.OverlayLastLayer: int template = arrangement.SuperfluousLayersAction == SuperfluousLayersAction.OverlayFirstLayer ? 0 : numDestLayers - 1; var templateLayer = parentLayer.Layers[template]; for (int i = numDestLayers; i < numPresentLayers; i++) { var oldSize = parentLayer.Layers[i].Size; parentLayer.Layers[i].Location = (IItemLocation)templateLayer.Location.Clone(); var newSize = parentLayer.Layers[i].Size; } break; } } }
/// <summary> /// Shows the layer arrangement dialog and then arranges the layers according to the user input. /// </summary> /// <param name="graph">Graph that contains the layers to arrange.</param> /// <param name="activeLayer">Layer that is currently active.</param> public static void ShowLayerArrangementDialog(this GraphDocument graph, HostLayer activeLayer) { ArrangeLayersDocument arrangement = new ArrangeLayersDocument(); object doco = arrangement; if (Current.Gui.ShowDialog(ref doco, "Arrange layers")) { arrangement = (ArrangeLayersDocument)doco; try { ArrangeLayers(activeLayer, arrangement); } catch (Exception ex) { Current.Gui.ErrorMessageBox(ex.Message); } } }