private void DoLayout(bool arrange)
if (_anordning.Typ.Kategori != Anordningskategori.Färd && _symbolDropDown == DropDownState.Down)
_symbolDropDown = DropDownState.Up;
using (FontProxy fontProxy = GetFont())
fontHeight = fontProxy.Font.Height;
borderwidth = BorderWidth;
_mnuVillkorat.Enabled = _anordning.Typ.ShowVillkorat;
if (!_anordning.Typ.ShowSpar)
else if (_viewMode != AnordningViewMode.Edit && _viewMode != AnordningViewMode.GraphEdit)
int noOfRows = CalculateRows();
if (_output == OutputType.Screen)
height = (2 * borderwidth) + (noOfRows * (_rowHeight));
height = (_rowHeight + 1) * noOfRows + (2 * borderwidth);
_mainRect = DisplayRectangle;
_mainRect.Inflate(-borderwidth, -borderwidth);
_mainRgn = new Region(_mainRect);
_samradRect = new Rectangle(_mainRect.Left, _mainRect.Top + topPadding, 23, _rowHeight);
_samradRgn = new Region(_samradRect);
_franRect = new Rectangle(_samradRect.Left + _samradRect.Width, _samradRect.Top, 45, _rowHeight);
_franRgn = new Region(_franRect);
_tillRect = new Rectangle(_franRect.Left + _franRect.Width, _samradRect.Top, 45, _rowHeight);
_tillRgn = new Region(_tillRect);
_installdRect = new Rectangle(_tillRect.Left + _tillRect.Width, _samradRect.Top, 48, _rowHeight);
_installdRgn = new Region(_installdRect);
int pos = _installdRect.Left + _installdRect.Width;
_idRect = new Rectangle(pos, _samradRect.Top, _mainRect.Width - pos + 2, _rowHeight);
_idRgn = new Region(_idRect);
_statusRect = new Rectangle(_samradRect.Left, _samradRect.Top, _mainRect.Width - _idRect.Width, _rowHeight);
_statusRgn = new Region(_statusRect);
_objectRect = new Rectangle(_idRect.Left, _idRect.Top, 50, _rowHeight);
_objectRgn = new Region(_objectRect);
_closeRect = new Rectangle(_mainRect.Left + _mainRect.Width - 18, _idRect.Top, 17, _rowHeight - 5);
_closeRgn = new Region(_closeRect);
_closeWinRect = new Rectangle(_mainRect.Left + _mainRect.Width - 18, _idRect.Top, 17, _rowHeight - 5);
_closeWinRgn = new Region(_closeWinRect);
_nummerRect = new Rectangle(_objectRect.Left + _objectRect.Width, _idRect.Top, _idRect.Width - _objectRect.Width - _closeRect.Width - 6, _rowHeight);
_nummerRgn = new Region(_nummerRect);
_utbredningRect = new Rectangle(_mainRect.Left, _statusRect.Top + _statusRect.Height, _statusRect.Width - 15, _rowHeight);
_utbredningRgn = new Region(_utbredningRect);
_typRect = new Rectangle(_objectRect.Left, _statusRect.Top + _statusRect.Height, _mainRect.Width - _statusRect.Width - 2, _rowHeight);
_typRgn = new Region(_typRect);
_symbolDropDownRect = new Rectangle(_mainRect.Left + _statusRect.Width - 30, _utbredningRect.Top + 3, 30, _rowHeight - 6);
_symbolDropDownRgn = new Region(_symbolDropDownRect);
if ((_state == AnordningViewState.Expanded) || (Output == OutputType.SVG))
if ((_viewMode == AnordningViewMode.Create || _viewMode == AnordningViewMode.Edit || _viewMode == AnordningViewMode.GraphEdit) && _symbolDropDown == DropDownState.Down)
top = _utbredningRect.Top + _utbredningRect.Height;
if (_viewMode == AnordningViewMode.Create)
_AnordningButtonsYPosition = top + 2;
if (_anordning.Typ.ShowOmrade)
using (Graphics graphics = CreateGraphics())
using (FontProxy fontProxy = GetFont())
string text = _anordning.Omrade != string.Empty ? _anordning.Omrade : DefaultOmrade;
SizeF size = graphics.MeasureString(text, fontProxy.Font, _mainRect.Width);
_omradeRect = new Rectangle(_mainRect.Left, top + space, _statusRect.Width, (int)(size.Height + .5f) + 5);
height += _omradeRect.Height - _rowHeight + space;
_omradeRgn = new Region(_omradeRect);
top = _omradeRect.Top + _omradeRect.Height;
if (_anordning.Typ.ShowBeteckning)
using (Graphics graphics = CreateGraphics())
using (FontProxy fontProxy = GetFont())
var rubrikSize = graphics.MeasureString(BeteckningText, fontProxy.Font, _mainRect.Width);
_beteckningRubrikRect = new Rectangle(_mainRect.Left, top + space, (int)(rubrikSize.Width + 2), (int)(rubrikSize.Height + .5f) + 5);
_beteckningRubrikRgn = new Region(_beteckningRubrikRect);
var text = _anordning.Beteckning != string.Empty ? _anordning.Beteckning : fritext;
int beteckningWidth = _mainRect.Width - (int)rubrikSize.Width - 4;
var size = graphics.MeasureString(text, fontProxy.Font, beteckningWidth);
_beteckningRect = new Rectangle(_mainRect.Left + (int)(rubrikSize.Width), top + space, beteckningWidth, (int)(size.Height + .5f) + 5);
height += _omradeRect.Height - _rowHeight + space;
_beteckningRgn = new Region(_beteckningRect);
top = _beteckningRubrikRect.Top + _beteckningRubrikRect.Height;
if (_anordning.Typ.ShowAvsparrning)
string text = string.IsNullOrEmpty(_anordning.Avsparrning) ? " " : _anordning.Avsparrning;
using (Graphics graphics = CreateGraphics())
using (FontProxy fontProxy = GetFont())
SizeF size = graphics.MeasureString(GranspunkterText, fontProxy.Font, _mainRect.Width);
_avsparrRect = new Rectangle(_mainRect.Left, top + space, (int)(size.Width + 2), (int)(size.Height + .5f) + 5);
_avsparrRgn = new Region(_avsparrRect);
SizeF LeftSize = graphics.MeasureString(GranspunkterText, fontProxy.Font);
int avsparrningWidth = _mainRect.Width - (int)LeftSize.Width - 4;
size = graphics.MeasureString(text, fontProxy.Font, avsparrningWidth);
_avsparrningRect = new Rectangle(_mainRect.Left + (int)(LeftSize.Width), top + space, avsparrningWidth, (int)(size.Height + .5f) + 5);
height += _avsparrningRect.Height - _rowHeight + space;
_avsparrningRgn = new Region(_avsparrningRect);
top = _avsparrningRect.Top + _avsparrningRect.Height;
if (_anordning.Typ.ShowSubTyp)
_subTypRect = new Rectangle(_mainRect.Left, top, _mainRect.Width, _rowHeight);
_subTypRgn = new Region(_subTypRect);
_vaxlingChkRect = new Rectangle(_subTypRect.Left + 3, _subTypRect.Top + padding, _rowHeight - 2 * padding, _rowHeight - 2 * padding);
_vaxlingChkRgn = new Region(_vaxlingChkRect);
var vaxlingWidth = (int)(fontHeight * 0.50 * ExtendedEnum.GetLabel(TrafikvshSidosparSubTyp.Vaxling).Length);
_aSkyddChkRect = new Rectangle(_vaxlingChkRect.Right + vaxlingWidth + 3, _subTypRect.Top + padding, _rowHeight - 2 * padding, _rowHeight - 2 * padding);
_aSkyddChkRgn = new Region(_aSkyddChkRect);
top = _subTypRect.Top + _subTypRect.Height;
if ((_anordning.Spar.Count > 1) && (_viewMode == AnordningViewMode.Edit || _viewMode == AnordningViewMode.GraphEdit || _viewMode == AnordningViewMode.Create) && (_anordning.Typ.ShowSpar) && (Output != OutputType.SVG))
Rectangle rect = new Rectangle(_mainRect.Left, top, _mainRect.Width, _rowHeight);
_showSparBtnRect = new Rectangle(_showSparRect.Left + 2, _showSparRect.Top + 2, 120, _rowHeight);
_showSparBtnRgn = new Region(_showSparBtnRect);
top = _showSparRect.Top + _showSparRect.Height;
if ((_anordning.Typ.ShowSpar) || (Output == OutputType.SVG))
int maxSparRowsLangd = _anordning.Spar.Count > 1 ? _maxSparRowsLangd : _maxSparRowsLangd + 1;
for (int i = 0; i < _sparRows; i++)
int sparLength = Anordning.MojligaSpar(_anordning.Spar[i].FranPlats, _anordning.Spar[i].TillPlats).Length;
if (sparLength > maxSparRowsLangd)
var rectHeight = (sparLength % maxSparRowsLangd == 0) ? _rowHeight * (sparLength / maxSparRowsLangd) : (_rowHeight * ((sparLength / maxSparRowsLangd) + 1));
rect = new Rectangle(_mainRect.Left, top + totalHeight, _mainRect.Width, rectHeight);
rect = new Rectangle(_mainRect.Left, top + totalHeight, _mainRect.Width, _rowHeight);
Region rgn = new Region(rect);
totalHeight += rect.Height;
foreach (AnordningSpar obj in _anordning.Spar)
int d = _sparRect[0].Left + 3;
string[] spar = Anordning.MojligaSpar(obj.FranPlats, obj.TillPlats);
d = _sparRect[row].Left + 3;
if (_anordning.Spar.Count > 1)
Rectangle txtRect = new Rectangle(d, _sparRect[row].Top, 90, _rowHeight);
_sparDescRect.Add(txtRect);
for (int i = 0; i < spar.Length; i++)
if (obj.FranPlats == obj.TillPlats)
if (GlobalData.Trafikplatser.Get(obj.FranPlats).Typ.IsSvartplats)
_anordning.RemoveSpar(spar[i], obj.FranPlats, obj.TillPlats);
SparCheckBox box = new SparCheckBox(obj.FranPlats, obj.TillPlats);
Rectangle nrRect = new Rectangle(l, _sparRect[row].Top + 5 + addTop, _rowHeight - 2 * padding, _rowHeight - 2 * padding);
box.CheckBoxRectangle = nrRect;
l = nrRect.Left + nrRect.Width + 3;
float width = (float)((fontHeight * 0.55) * (Anordning.MojligaSpar(obj.FranPlats, obj.TillPlats)[i].Trim().Length + 1));
Rectangle descRect = new Rectangle(l, _sparRect[row].Top + 2 + addTop, (int)width, _rowHeight - 2);
box.DescriptionRectangle = descRect;
l = descRect.Left + descRect.Width + 3;
if (((i + 1) % maxSparRowsLangd == 0) && (i > 0))
l = (_anordning.Spar.Count > 1) ? d + 85 : d;
Rectangle txtRect = new Rectangle(d, _sparRect[0].Top, 0, 0);
_sparDescRect.Add(txtRect);
if (_anordning.Spar.Count == 1 || _showSpar || Output == OutputType.SVG)
top = _sparRect[_sparRect.Count - 1].Top + _sparRect[_sparRect.Count - 1].Height;
top = _showSparRect.Top + _showSparRect.Height;
int col1 = _mainRect.Left;
double col2 = (fontHeight * 0.51) * (efterTag.Length + 7);
if (_anordning.Typ.ShowEftertag)
int width = (int)((fontHeight * 0.50) * (efterTag.Length - 3));
_efterTagRect = new Rectangle(col1, top, width, _rowHeight);
_efterTagRgn = new Region(_efterTagRect);
width = (int)((fontHeight * 0.50) * (7));
_tagNrRect = new Rectangle(_efterTagRect.Width, top, width, _rowHeight);
_tagNrRgn = new Region(_tagNrRect);
if (_anordning.Typ.ShowIntill)
top = _efterTagRect.Top + _efterTagRect.Height;
if (_anordning.Typ.ShowIntill)
int width = (int)((fontHeight * 0.50) * (intill.Length - 1));
if (_anordning.Typ.ShowEftertag)
_intillRect = new Rectangle((int)col2, top, width, _rowHeight);
_intillRect = new Rectangle(col1, top, width, _rowHeight);
_intillRgn = new Region(_intillRect);
_intillStnRect = new Rectangle(_intillRect.Left + _intillRect.Width, top, 70, _rowHeight);
_intillStnRgn = new Region(_intillStnRect);
_intillChkRect = new Rectangle(_intillRect.Left + 3, _intillRect.Top + padding, _rowHeight - 2 * padding, _rowHeight - 2 * padding);
_intillChkRgn = new Region(_intillChkRect);
if (!_anordning.SynligIGrafValbar)
top = _intillRect.Top + _intillRect.Height;
if (_anordning.SynligIGrafValbar)
int width = (int)((fontHeight * 0.50) * (intill.Length - 1));
_synligIGrafRect = new Rectangle((int)col2, top, width, _rowHeight);
_synligIGrafRgn = new Region(_synligIGrafRect);
_synligIGrafChkRect = new Rectangle(_synligIGrafRect.Left + 3, _synligIGrafRect.Top + padding, _rowHeight - 2 * padding, _rowHeight - 2 * padding);
_synligIGrafChkRgn = new Region(_synligIGrafChkRect);
top = _synligIGrafRect.Top + _synligIGrafRect.Height;
if (_anordning.Typ.ShowFordon)
_fordonRect = new Rectangle(col1, top, _mainRect.Width, _rowHeight);
_fordonRgn = new Region(_fordonRect);
_fordonChkRect = new Rectangle(_fordonRect.Left + 3, _fordonRect.Top + padding, _rowHeight - 2 * padding, _rowHeight - 2 * padding);
_fordonChkRgn = new Region(_fordonChkRect);
if (_anordning.Typ.ShowTsm)
top = _fordonRect.Top + _fordonRect.Height;
if (_anordning.Typ.ShowTsm)
_tsmRect = new Rectangle((int)col2, top, _mainRect.Width, _rowHeight);
_tsmRgn = new Region(_tsmRect);
_tsmChkRect = new Rectangle(_tsmRect.Left + 3, _tsmRect.Top + padding, _rowHeight - 2 * padding, _rowHeight - 2 * padding);
_tsmChkRgn = new Region(_tsmChkRect);
top = _tsmRect.Top + _tsmRect.Height;
if (_anordning.Typ.ShowHastighet)
using (Graphics graphics = CreateGraphics())
using (FontProxy fontProxy = GetFont())
SizeF size = graphics.MeasureString(Hastighet, fontProxy.Font);
_hastRect = new Rectangle(_mainRect.Left, top + space, _mainRect.Width, (int)(size.Height + .5f) + 5);
_hastRgn = new Region(_hastRect);
size = graphics.MeasureString("999", fontProxy.Font, _mainRect.Width);
SizeF LeftSize = graphics.MeasureString(Hastighet, fontProxy.Font);
_hastighetRect = new Rectangle(_mainRect.Left + (int)(LeftSize.Width), top + space, (int)(size.Width + 2), (int)(size.Height + .5f) + 5);
height += _hastighetRect.Height - _rowHeight + space;
_hastighetRgn = new Region(_hastighetRect);
top = _hastighetRect.Top + _hastighetRect.Height;
if (_anordning.Typ.ShowOmfattning)
using (Graphics graphics = CreateGraphics())
using (FontProxy fontProxy = GetFont())
if (_viewMode == AnordningViewMode.Create)
_showOmfattningBtnRect = new Rectangle(_mainRect.Left + space, top + space, 110, _rowHeight);
height += _showOmfattningBtnRect.Height - _rowHeight + space;
_showOmfattningBtnRgn = new Region(_showOmfattningBtnRect);
top = _showOmfattningBtnRect.Top + _showOmfattningBtnRect.Height;
int left = _mainRect.Left;
SizeF size = graphics.MeasureString(Mellan, fontProxy.Font);
_mellanRect = new Rectangle(left, top + space, (int)(size.Width + hPadding), (int)(size.Height + vPadding));
height += _mellanRect.Height - _rowHeight + space;
_mellanRgn = new Region(_mellanRect);
left += _mellanRect.Width;
size = graphics.MeasureString("9999", fontProxy.Font);
_franKmRect = new Rectangle(left, top + space, (int)(size.Width + hPadding), (int)(size.Height + vPadding));
_franKmRgn = new Region(_franKmRect);
left += _franKmRect.Width - 6;
size = graphics.MeasureString(Plus, fontProxy.Font);
_plus1Rect = new Rectangle(left, top + space, (int)(size.Width + hPadding), (int)(size.Height + vPadding));
_plus1Rgn = new Region(_plus1Rect);
left += _plus1Rect.Width;
size = graphics.MeasureString("1999", fontProxy.Font);
_franMRect = new Rectangle(left, top + space, (int)(size.Width + hPadding), (int)(size.Height + vPadding));
_franMRgn = new Region(_franMRect);
left += _franMRect.Width - 4;
size = graphics.MeasureString(Och, fontProxy.Font, _mainRect.Width);
_ochRect = new Rectangle(left, top + space, (int)(size.Width + hPadding), (int)(size.Height + vPadding));
_ochRgn = new Region(_ochRect);
size = graphics.MeasureString("9999", fontProxy.Font);
_tillKmRect = new Rectangle(left, top + space, (int)(size.Width + hPadding), (int)(size.Height + vPadding));
_tillKmRgn = new Region(_tillKmRect);
left += _tillKmRect.Width - 6;
size = graphics.MeasureString(Plus, fontProxy.Font);
_plus2Rect = new Rectangle(left, top + space, (int)(size.Width + hPadding), (int)(size.Height + vPadding));
_plus2Rgn = new Region(_plus2Rect);
left += _plus2Rect.Width;
size = graphics.MeasureString("1999", fontProxy.Font);
_tillMRect = new Rectangle(left, top + space, (int)(size.Width + hPadding), (int)(size.Height + vPadding));
_tillMRgn = new Region(_tillMRect);
top = _tillMRect.Top + _tillMRect.Height;
if (_anordning.Typ.ShowFritext)
string text = _anordning.Fritext != string.Empty ? _anordning.Fritext : fritext;
using (Graphics graphics = CreateGraphics())
using (FontProxy fontProxy = GetFont())
SizeF size = graphics.MeasureString(text, fontProxy.Font, _mainRect.Width);
_fritextRect = new Rectangle(_mainRect.Left, top + space, _mainRect.Width - space, (int)(size.Height + .5f) + 5);
height += _fritextRect.Height - _rowHeight + space;
_fritextRgn = new Region(_fritextRect);
top = _fritextRect.Top + _fritextRect.Height;
if (_anordning.Typ.ShowSamrad)
_samradMedRect = new Rectangle(_mainRect.Left, top + space, _mainRect.Width, _rowHeight);
_samradMedRgn = new Region(_samradMedRect);
height += _samradMedRect.Height - _rowHeight + space;
top = _samradMedRect.Top + _samradMedRect.Height;
if (_output == OutputType.Screen && !_samradMarker.InvokeRequired)
_samradMarker.Rectangle = _samradMedRect;
_samradMarker.Rectangle = new Rectangle();
_samradMarker.Active = false;
if (_anordning.Typ.ShowNamn)
_namnRect = new Rectangle(_mainRect.Left, top, 135, _rowHeight);
_namnRgn = new Region(_namnRect);
if (_anordning.Typ.ShowTel)
_teleRect = new Rectangle(_namnRect.Left + _namnRect.Width, top, 95, _rowHeight);
_teleRgn = new Region(_teleRect);
if (_anordning.Typ.ShowSign)
_signRect = new Rectangle(_mainRect.Width - 40, top, 40, _rowHeight);
_signRgn = new Region(_signRect);
if (_anordning.Typ.ShowNamn)
top = _namnRect.Top + _namnRect.Height;
else if (_anordning.Typ.ShowTel)
top = _teleRect.Top + _teleRect.Height;
if (_symbolDropDown == DropDownState.Down)
top = _utbredningRect.Top + _utbredningRect.Height;
if ((_anordning.Typ.ShowBeteckning && !string.IsNullOrEmpty(_anordning.Beteckning)) && _state == AnordningViewState.Collapsed)
using (Graphics graphics = CreateGraphics())
using (FontProxy fontProxy = GetFont())
var rubrikSize = graphics.MeasureString(BeteckningText, fontProxy.Font, _mainRect.Width);
_beteckningRubrikRect = new Rectangle(_mainRect.Left, top + space, (int)(rubrikSize.Width + 2), (int)(rubrikSize.Height + .5f) + 5);
_beteckningRubrikRgn = new Region(_beteckningRubrikRect);
int beteckningWidth = _mainRect.Width - (int)rubrikSize.Width - 4;
var text = _anordning.Beteckning;
var size = graphics.MeasureString(text, fontProxy.Font, beteckningWidth);
_beteckningRect = new Rectangle(_mainRect.Left + (int)(rubrikSize.Width) + 1, top + space, beteckningWidth, (int)(size.Height + .5f) + 5);
height += ((int)(size.Height + .5f) + 5) - _rowHeight + space;
_beteckningRgn = new Region(_beteckningRect);
if (this.Height != height)
SizeChanged(this, new EventArgs());
Noteringsvy p = Parent as Noteringsvy;
_mainRect = DisplayRectangle;
_mainRect.Inflate(-borderwidth, -borderwidth);
_mainRgn = new Region(_mainRect);
if (_viewMode == AnordningViewMode.Create)
_buttonRect = new Rectangle(_mainRect.Left, _mainRect.Height - _rowHeight + 2, _mainRect.Width, _rowHeight);
_buttonRgn = new Region(_buttonRect);
_okRect = new Rectangle(_buttonRect.Left + 2, _buttonRect.Top + 2, 60, _rowHeight - 4);
_okRgn = new Region(_okRect);
_startRect = new Rectangle(_okRect.Left + _okRect.Width + 6, _buttonRect.Top + 2, 60, _rowHeight - 4);
_startRgn = new Region(_startRect);
_cancelRect = new Rectangle(_startRect.Left + _startRect.Width + 12, _buttonRect.Top + 2, 60, _rowHeight - 4);
_cancelRgn = new Region(_cancelRect);