Changeset 4068 for trunk/sources/HeuristicLab.ExtLibs/HeuristicLab.WinFormsUI/2.3.1/WinFormsUI-2.3.1/Docking/DockContentHandler.cs
- Timestamp:
- 07/22/10 00:44:01 (14 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/sources/HeuristicLab.ExtLibs/HeuristicLab.WinFormsUI/2.3.1/WinFormsUI-2.3.1/Docking/DockContentHandler.cs
r2645 r4068 1 1 using System; 2 using System.Windows.Forms;3 using System.Drawing;4 2 using System.ComponentModel; 5 3 using System.Diagnostics.CodeAnalysis; 6 7 namespace WeifenLuo.WinFormsUI.Docking 8 { 9 public delegate string GetPersistStringCallback(); 10 11 public class DockContentHandler : IDisposable, IDockDragSource 12 { 13 public DockContentHandler(Form form) : this(form, null) 14 { 15 } 16 17 public DockContentHandler(Form form, GetPersistStringCallback getPersistStringCallback) 18 { 19 if (!(form is IDockContent)) 20 throw new ArgumentException(Strings.DockContent_Constructor_InvalidForm, "form"); 21 22 m_form = form; 23 m_getPersistStringCallback = getPersistStringCallback; 24 25 m_events = new EventHandlerList(); 26 Form.Disposed +=new EventHandler(Form_Disposed); 27 Form.TextChanged += new EventHandler(Form_TextChanged); 28 } 29 30 public void Dispose() 31 { 32 Dispose(true); 33 GC.SuppressFinalize(this); 34 } 35 36 protected virtual void Dispose(bool disposing) 37 { 38 if(disposing) 39 { 40 lock(this) 41 { 42 DockPanel = null; 43 if (m_autoHideTab != null) 44 m_autoHideTab.Dispose(); 45 if (m_tab != null) 46 m_tab.Dispose(); 47 48 Form.Disposed -= new EventHandler(Form_Disposed); 49 Form.TextChanged -= new EventHandler(Form_TextChanged); 50 m_events.Dispose(); 51 } 52 } 53 } 54 55 private Form m_form; 56 public Form Form 57 { 58 get { return m_form; } 59 } 60 61 public IDockContent Content 62 { 63 get { return Form as IDockContent; } 64 } 65 66 private IDockContent m_previousActive = null; 67 public IDockContent PreviousActive 68 { 69 get { return m_previousActive; } 70 internal set { m_previousActive = value; } 4 using System.Drawing; 5 using System.Windows.Forms; 6 7 namespace WeifenLuo.WinFormsUI.Docking { 8 public delegate string GetPersistStringCallback(); 9 10 public class DockContentHandler : IDisposable, IDockDragSource { 11 public DockContentHandler(Form form) 12 : this(form, null) { 13 } 14 15 public DockContentHandler(Form form, GetPersistStringCallback getPersistStringCallback) { 16 if (!(form is IDockContent)) 17 throw new ArgumentException(Strings.DockContent_Constructor_InvalidForm, "form"); 18 19 m_form = form; 20 m_getPersistStringCallback = getPersistStringCallback; 21 22 m_events = new EventHandlerList(); 23 Form.Disposed += new EventHandler(Form_Disposed); 24 Form.TextChanged += new EventHandler(Form_TextChanged); 25 } 26 27 public void Dispose() { 28 Dispose(true); 29 GC.SuppressFinalize(this); 30 } 31 32 protected virtual void Dispose(bool disposing) { 33 if (disposing) { 34 lock (this) { 35 DockPanel = null; 36 if (m_autoHideTab != null) 37 m_autoHideTab.Dispose(); 38 if (m_tab != null) 39 m_tab.Dispose(); 40 41 Form.Disposed -= new EventHandler(Form_Disposed); 42 Form.TextChanged -= new EventHandler(Form_TextChanged); 43 m_events.Dispose(); 71 44 } 72 73 private IDockContent m_nextActive = null; 74 public IDockContent NextActive 75 { 76 get { return m_nextActive; } 77 internal set { m_nextActive = value; } 45 } 46 } 47 48 private Form m_form; 49 public Form Form { 50 get { return m_form; } 51 } 52 53 public IDockContent Content { 54 get { return Form as IDockContent; } 55 } 56 57 private IDockContent m_previousActive = null; 58 public IDockContent PreviousActive { 59 get { return m_previousActive; } 60 internal set { m_previousActive = value; } 61 } 62 63 private IDockContent m_nextActive = null; 64 public IDockContent NextActive { 65 get { return m_nextActive; } 66 internal set { m_nextActive = value; } 67 } 68 69 private EventHandlerList m_events; 70 private EventHandlerList Events { 71 get { return m_events; } 72 } 73 74 private bool m_allowEndUserDocking = true; 75 public bool AllowEndUserDocking { 76 get { return m_allowEndUserDocking; } 77 set { m_allowEndUserDocking = value; } 78 } 79 80 private double m_autoHidePortion = 0.25; 81 public double AutoHidePortion { 82 get { return m_autoHidePortion; } 83 set { 84 if (value <= 0) 85 throw (new ArgumentOutOfRangeException(Strings.DockContentHandler_AutoHidePortion_OutOfRange)); 86 87 if (m_autoHidePortion == value) 88 return; 89 90 m_autoHidePortion = value; 91 92 if (DockPanel == null) 93 return; 94 95 if (DockPanel.ActiveAutoHideContent == Content) 96 DockPanel.PerformLayout(); 97 } 98 } 99 100 private bool m_closeButton = true; 101 public bool CloseButton { 102 get { return m_closeButton; } 103 set { 104 if (m_closeButton == value) 105 return; 106 107 m_closeButton = value; 108 if (Pane != null) 109 if (Pane.ActiveContent.DockHandler == this) 110 Pane.RefreshChanges(); 111 } 112 } 113 114 private bool m_closeButtonVisible = true; 115 /// <summary> 116 /// Determines whether the close button is visible on the content 117 /// </summary> 118 public bool CloseButtonVisible { 119 get { return m_closeButtonVisible; } 120 set { m_closeButtonVisible = value; } 121 } 122 123 private DockState DefaultDockState { 124 get { 125 if (ShowHint != DockState.Unknown && ShowHint != DockState.Hidden) 126 return ShowHint; 127 128 if ((DockAreas & DockAreas.Document) != 0) 129 return DockState.Document; 130 if ((DockAreas & DockAreas.DockRight) != 0) 131 return DockState.DockRight; 132 if ((DockAreas & DockAreas.DockLeft) != 0) 133 return DockState.DockLeft; 134 if ((DockAreas & DockAreas.DockBottom) != 0) 135 return DockState.DockBottom; 136 if ((DockAreas & DockAreas.DockTop) != 0) 137 return DockState.DockTop; 138 139 return DockState.Unknown; 140 } 141 } 142 143 private DockState DefaultShowState { 144 get { 145 if (ShowHint != DockState.Unknown) 146 return ShowHint; 147 148 if ((DockAreas & DockAreas.Document) != 0) 149 return DockState.Document; 150 if ((DockAreas & DockAreas.DockRight) != 0) 151 return DockState.DockRight; 152 if ((DockAreas & DockAreas.DockLeft) != 0) 153 return DockState.DockLeft; 154 if ((DockAreas & DockAreas.DockBottom) != 0) 155 return DockState.DockBottom; 156 if ((DockAreas & DockAreas.DockTop) != 0) 157 return DockState.DockTop; 158 if ((DockAreas & DockAreas.Float) != 0) 159 return DockState.Float; 160 161 return DockState.Unknown; 162 } 163 } 164 165 private DockAreas m_allowedAreas = DockAreas.DockLeft | DockAreas.DockRight | DockAreas.DockTop | DockAreas.DockBottom | DockAreas.Document | DockAreas.Float; 166 public DockAreas DockAreas { 167 get { return m_allowedAreas; } 168 set { 169 if (m_allowedAreas == value) 170 return; 171 172 if (!DockHelper.IsDockStateValid(DockState, value)) 173 throw (new InvalidOperationException(Strings.DockContentHandler_DockAreas_InvalidValue)); 174 175 m_allowedAreas = value; 176 177 if (!DockHelper.IsDockStateValid(ShowHint, m_allowedAreas)) 178 ShowHint = DockState.Unknown; 179 } 180 } 181 182 private DockState m_dockState = DockState.Unknown; 183 public DockState DockState { 184 get { return m_dockState; } 185 set { 186 if (m_dockState == value) 187 return; 188 189 DockPanel.SuspendLayout(true); 190 191 if (value == DockState.Hidden) 192 IsHidden = true; 193 else 194 SetDockState(false, value, Pane); 195 196 DockPanel.ResumeLayout(true, true); 197 } 198 } 199 200 private DockPanel m_dockPanel = null; 201 public DockPanel DockPanel { 202 get { return m_dockPanel; } 203 set { 204 if (m_dockPanel == value) 205 return; 206 207 Pane = null; 208 209 if (m_dockPanel != null) 210 m_dockPanel.RemoveContent(Content); 211 212 if (m_tab != null) { 213 m_tab.Dispose(); 214 m_tab = null; 78 215 } 79 216 80 private EventHandlerList m_events; 81 private EventHandlerList Events 82 { 83 get { return m_events; } 84 } 85 86 private bool m_allowEndUserDocking = true; 87 public bool AllowEndUserDocking 88 { 89 get { return m_allowEndUserDocking; } 90 set { m_allowEndUserDocking = value; } 91 } 92 93 private double m_autoHidePortion = 0.25; 94 public double AutoHidePortion 95 { 96 get { return m_autoHidePortion; } 97 set 98 { 99 if (value <= 0) 100 throw(new ArgumentOutOfRangeException(Strings.DockContentHandler_AutoHidePortion_OutOfRange)); 101 102 if (m_autoHidePortion == value) 103 return; 104 105 m_autoHidePortion = value; 106 107 if (DockPanel == null) 108 return; 109 110 if (DockPanel.ActiveAutoHideContent == Content) 111 DockPanel.PerformLayout(); 112 } 113 } 114 115 private bool m_closeButton = true; 116 public bool CloseButton 117 { 118 get { return m_closeButton; } 119 set 120 { 121 if (m_closeButton == value) 122 return; 123 124 m_closeButton = value; 125 if (Pane != null) 126 if (Pane.ActiveContent.DockHandler == this) 127 Pane.RefreshChanges(); 128 } 129 } 130 131 private bool m_closeButtonVisible = true; 132 /// <summary> 133 /// Determines whether the close button is visible on the content 134 /// </summary> 135 public bool CloseButtonVisible 136 { 137 get { return m_closeButtonVisible; } 138 set { m_closeButtonVisible = value; } 217 if (m_autoHideTab != null) { 218 m_autoHideTab.Dispose(); 219 m_autoHideTab = null; 139 220 } 140 141 private DockState DefaultDockState 142 { 143 get 144 { 145 if (ShowHint != DockState.Unknown && ShowHint != DockState.Hidden) 146 return ShowHint; 147 148 if ((DockAreas & DockAreas.Document) != 0) 149 return DockState.Document; 150 if ((DockAreas & DockAreas.DockRight) != 0) 151 return DockState.DockRight; 152 if ((DockAreas & DockAreas.DockLeft) != 0) 153 return DockState.DockLeft; 154 if ((DockAreas & DockAreas.DockBottom) != 0) 155 return DockState.DockBottom; 156 if ((DockAreas & DockAreas.DockTop) != 0) 157 return DockState.DockTop; 158 159 return DockState.Unknown; 160 } 161 } 162 163 private DockState DefaultShowState 164 { 165 get 166 { 167 if (ShowHint != DockState.Unknown) 168 return ShowHint; 169 170 if ((DockAreas & DockAreas.Document) != 0) 171 return DockState.Document; 172 if ((DockAreas & DockAreas.DockRight) != 0) 173 return DockState.DockRight; 174 if ((DockAreas & DockAreas.DockLeft) != 0) 175 return DockState.DockLeft; 176 if ((DockAreas & DockAreas.DockBottom) != 0) 177 return DockState.DockBottom; 178 if ((DockAreas & DockAreas.DockTop) != 0) 179 return DockState.DockTop; 180 if ((DockAreas & DockAreas.Float) != 0) 181 return DockState.Float; 182 183 return DockState.Unknown; 184 } 185 } 186 187 private DockAreas m_allowedAreas = DockAreas.DockLeft | DockAreas.DockRight | DockAreas.DockTop | DockAreas.DockBottom | DockAreas.Document | DockAreas.Float; 188 public DockAreas DockAreas 189 { 190 get { return m_allowedAreas; } 191 set 192 { 193 if (m_allowedAreas == value) 194 return; 195 196 if (!DockHelper.IsDockStateValid(DockState, value)) 197 throw(new InvalidOperationException(Strings.DockContentHandler_DockAreas_InvalidValue)); 198 199 m_allowedAreas = value; 200 201 if (!DockHelper.IsDockStateValid(ShowHint, m_allowedAreas)) 202 ShowHint = DockState.Unknown; 203 } 204 } 205 206 private DockState m_dockState = DockState.Unknown; 207 public DockState DockState 208 { 209 get { return m_dockState; } 210 set 211 { 212 if (m_dockState == value) 213 return; 214 215 DockPanel.SuspendLayout(true); 216 217 if (value == DockState.Hidden) 218 IsHidden = true; 219 else 220 SetDockState(false, value, Pane); 221 222 DockPanel.ResumeLayout(true, true); 223 } 224 } 225 226 private DockPanel m_dockPanel = null; 227 public DockPanel DockPanel 228 { 229 get { return m_dockPanel; } 230 set 231 { 232 if (m_dockPanel == value) 233 return; 234 235 Pane = null; 236 237 if (m_dockPanel != null) 238 m_dockPanel.RemoveContent(Content); 239 240 if (m_tab != null) 241 { 242 m_tab.Dispose(); 243 m_tab = null; 244 } 245 246 if (m_autoHideTab != null) 247 { 248 m_autoHideTab.Dispose(); 249 m_autoHideTab = null; 250 } 251 252 m_dockPanel = value; 253 254 if (m_dockPanel != null) 255 { 256 m_dockPanel.AddContent(Content); 257 Form.TopLevel = false; 258 Form.FormBorderStyle = FormBorderStyle.None; 259 Form.ShowInTaskbar = false; 260 Form.WindowState = FormWindowState.Normal; 261 NativeMethods.SetWindowPos(Form.Handle, IntPtr.Zero, 0, 0, 0, 0, 262 Win32.FlagsSetWindowPos.SWP_NOACTIVATE | 263 Win32.FlagsSetWindowPos.SWP_NOMOVE | 264 Win32.FlagsSetWindowPos.SWP_NOSIZE | 265 Win32.FlagsSetWindowPos.SWP_NOZORDER | 266 Win32.FlagsSetWindowPos.SWP_NOOWNERZORDER | 267 Win32.FlagsSetWindowPos.SWP_FRAMECHANGED); 268 } 269 } 270 } 271 272 public Icon Icon 273 { 274 get { return Form.Icon; } 275 } 276 277 public DockPane Pane 278 { 279 get { return IsFloat ? FloatPane : PanelPane; } 280 set 281 { 282 if (Pane == value) 283 return; 284 285 DockPanel.SuspendLayout(true); 286 287 DockPane oldPane = Pane; 288 289 SuspendSetDockState(); 290 FloatPane = (value == null ? null : (value.IsFloat ? value : FloatPane)); 291 PanelPane = (value == null ? null : (value.IsFloat ? PanelPane : value)); 292 ResumeSetDockState(IsHidden, value != null ? value.DockState : DockState.Unknown, oldPane); 293 294 DockPanel.ResumeLayout(true, true); 295 } 296 } 297 298 private bool m_isHidden = true; 299 public bool IsHidden 300 { 301 get { return m_isHidden; } 302 set 303 { 304 if (m_isHidden == value) 305 return; 306 307 SetDockState(value, VisibleState, Pane); 308 } 309 } 310 311 private string m_tabText = null; 312 public string TabText 313 { 314 get { return m_tabText == null || m_tabText == "" ? Form.Text : m_tabText; } 315 set 316 { 317 if (m_tabText == value) 318 return; 319 320 m_tabText = value; 321 if (Pane != null) 322 Pane.RefreshChanges(); 323 } 324 } 325 326 private DockState m_visibleState = DockState.Unknown; 327 public DockState VisibleState 328 { 329 get { return m_visibleState; } 330 set 331 { 332 if (m_visibleState == value) 333 return; 334 335 SetDockState(IsHidden, value, Pane); 336 } 337 } 338 339 private bool m_isFloat = false; 340 public bool IsFloat 341 { 342 get { return m_isFloat; } 343 set 344 { 345 if (m_isFloat == value) 346 return; 347 348 DockState visibleState = CheckDockState(value); 349 350 if (visibleState == DockState.Unknown) 351 throw new InvalidOperationException(Strings.DockContentHandler_IsFloat_InvalidValue); 352 353 SetDockState(IsHidden, visibleState, Pane); 354 } 355 } 356 357 [SuppressMessage("Microsoft.Naming", "CA1720:AvoidTypeNamesInParameters")] 358 public DockState CheckDockState(bool isFloat) 359 { 360 DockState dockState; 361 362 if (isFloat) 363 { 364 if (!IsDockStateValid(DockState.Float)) 365 dockState = DockState.Unknown; 366 else 367 dockState = DockState.Float; 368 } 369 else 370 { 371 dockState = (PanelPane != null) ? PanelPane.DockState : DefaultDockState; 372 if (dockState != DockState.Unknown && !IsDockStateValid(dockState)) 373 dockState = DockState.Unknown; 374 } 375 376 return dockState; 221 222 m_dockPanel = value; 223 224 if (m_dockPanel != null) { 225 m_dockPanel.AddContent(Content); 226 Form.TopLevel = false; 227 Form.FormBorderStyle = FormBorderStyle.None; 228 Form.ShowInTaskbar = false; 229 Form.WindowState = FormWindowState.Normal; 230 NativeMethods.SetWindowPos(Form.Handle, IntPtr.Zero, 0, 0, 0, 0, 231 Win32.FlagsSetWindowPos.SWP_NOACTIVATE | 232 Win32.FlagsSetWindowPos.SWP_NOMOVE | 233 Win32.FlagsSetWindowPos.SWP_NOSIZE | 234 Win32.FlagsSetWindowPos.SWP_NOZORDER | 235 Win32.FlagsSetWindowPos.SWP_NOOWNERZORDER | 236 Win32.FlagsSetWindowPos.SWP_FRAMECHANGED); 377 237 } 378 379 private DockPane m_panelPane = null; 380 public DockPane PanelPane 381 { 382 get { return m_panelPane; } 383 set 384 { 385 if (m_panelPane == value) 386 return; 387 388 if (value != null) 389 { 390 if (value.IsFloat || value.DockPanel != DockPanel) 391 throw new InvalidOperationException(Strings.DockContentHandler_DockPane_InvalidValue); 392 } 393 394 DockPane oldPane = Pane; 395 396 if (m_panelPane != null) 397 RemoveFromPane(m_panelPane); 398 m_panelPane = value; 399 if (m_panelPane != null) 400 { 401 m_panelPane.AddContent(Content); 402 SetDockState(IsHidden, IsFloat ? DockState.Float : m_panelPane.DockState, oldPane); 403 } 404 else 405 SetDockState(IsHidden, DockState.Unknown, oldPane); 406 } 407 } 408 409 private void RemoveFromPane(DockPane pane) 410 { 411 pane.RemoveContent(Content); 412 SetPane(null); 413 if (pane.Contents.Count == 0) 414 pane.Dispose(); 238 } 239 } 240 241 public Icon Icon { 242 get { return Form.Icon; } 243 } 244 245 public DockPane Pane { 246 get { return IsFloat ? FloatPane : PanelPane; } 247 set { 248 if (Pane == value) 249 return; 250 251 DockPanel.SuspendLayout(true); 252 253 DockPane oldPane = Pane; 254 255 SuspendSetDockState(); 256 FloatPane = (value == null ? null : (value.IsFloat ? value : FloatPane)); 257 PanelPane = (value == null ? null : (value.IsFloat ? PanelPane : value)); 258 ResumeSetDockState(IsHidden, value != null ? value.DockState : DockState.Unknown, oldPane); 259 260 DockPanel.ResumeLayout(true, true); 261 } 262 } 263 264 private bool m_isHidden = true; 265 public bool IsHidden { 266 get { return m_isHidden; } 267 set { 268 if (m_isHidden == value) 269 return; 270 271 SetDockState(value, VisibleState, Pane); 272 } 273 } 274 275 private string m_tabText = null; 276 public string TabText { 277 get { return m_tabText == null || m_tabText == "" ? Form.Text : m_tabText; } 278 set { 279 if (m_tabText == value) 280 return; 281 282 m_tabText = value; 283 if (Pane != null) 284 Pane.RefreshChanges(); 285 } 286 } 287 288 private DockState m_visibleState = DockState.Unknown; 289 public DockState VisibleState { 290 get { return m_visibleState; } 291 set { 292 if (m_visibleState == value) 293 return; 294 295 SetDockState(IsHidden, value, Pane); 296 } 297 } 298 299 private bool m_isFloat = false; 300 public bool IsFloat { 301 get { return m_isFloat; } 302 set { 303 if (m_isFloat == value) 304 return; 305 306 DockState visibleState = CheckDockState(value); 307 308 if (visibleState == DockState.Unknown) 309 throw new InvalidOperationException(Strings.DockContentHandler_IsFloat_InvalidValue); 310 311 SetDockState(IsHidden, visibleState, Pane); 312 } 313 } 314 315 [SuppressMessage("Microsoft.Naming", "CA1720:AvoidTypeNamesInParameters")] 316 public DockState CheckDockState(bool isFloat) { 317 DockState dockState; 318 319 if (isFloat) { 320 if (!IsDockStateValid(DockState.Float)) 321 dockState = DockState.Unknown; 322 else 323 dockState = DockState.Float; 324 } else { 325 dockState = (PanelPane != null) ? PanelPane.DockState : DefaultDockState; 326 if (dockState != DockState.Unknown && !IsDockStateValid(dockState)) 327 dockState = DockState.Unknown; 328 } 329 330 return dockState; 331 } 332 333 private DockPane m_panelPane = null; 334 public DockPane PanelPane { 335 get { return m_panelPane; } 336 set { 337 if (m_panelPane == value) 338 return; 339 340 if (value != null) { 341 if (value.IsFloat || value.DockPanel != DockPanel) 342 throw new InvalidOperationException(Strings.DockContentHandler_DockPane_InvalidValue); 415 343 } 416 344 417 private DockPane m_floatPane = null; 418 public DockPane FloatPane 419 { 420 get { return m_floatPane; } 421 set 422 { 423 if (m_floatPane == value) 424 return; 425 426 if (value != null) 427 { 428 if (!value.IsFloat || value.DockPanel != DockPanel) 429 throw new InvalidOperationException(Strings.DockContentHandler_FloatPane_InvalidValue); 430 } 431 432 DockPane oldPane = Pane; 433 434 if (m_floatPane != null) 435 RemoveFromPane(m_floatPane); 436 m_floatPane = value; 437 if (m_floatPane != null) 438 { 439 m_floatPane.AddContent(Content); 440 SetDockState(IsHidden, IsFloat ? DockState.Float : VisibleState, oldPane); 441 } 442 else 443 SetDockState(IsHidden, DockState.Unknown, oldPane); 444 } 445 } 446 447 private int m_countSetDockState = 0; 448 private void SuspendSetDockState() 449 { 450 m_countSetDockState ++; 451 } 452 453 private void ResumeSetDockState() 454 { 455 m_countSetDockState --; 456 if (m_countSetDockState < 0) 457 m_countSetDockState = 0; 458 } 459 460 internal bool IsSuspendSetDockState 461 { 462 get { return m_countSetDockState != 0; } 463 } 464 465 private void ResumeSetDockState(bool isHidden, DockState visibleState, DockPane oldPane) 466 { 467 ResumeSetDockState(); 468 SetDockState(isHidden, visibleState, oldPane); 469 } 470 471 internal void SetDockState(bool isHidden, DockState visibleState, DockPane oldPane) 472 { 473 if (IsSuspendSetDockState) 474 return; 475 476 if (DockPanel == null && visibleState != DockState.Unknown) 477 throw new InvalidOperationException(Strings.DockContentHandler_SetDockState_NullPanel); 478 479 if (visibleState == DockState.Hidden || (visibleState != DockState.Unknown && !IsDockStateValid(visibleState))) 480 throw new InvalidOperationException(Strings.DockContentHandler_SetDockState_InvalidState); 481 482 DockPanel dockPanel = DockPanel; 483 if (dockPanel != null) 484 dockPanel.SuspendLayout(true); 485 486 SuspendSetDockState(); 487 488 DockState oldDockState = DockState; 489 490 if (m_isHidden != isHidden || oldDockState == DockState.Unknown) 491 { 492 m_isHidden = isHidden; 493 } 494 m_visibleState = visibleState; 495 m_dockState = isHidden ? DockState.Hidden : visibleState; 496 497 if (visibleState == DockState.Unknown) 498 Pane = null; 499 else 500 { 501 m_isFloat = (m_visibleState == DockState.Float); 502 503 if (Pane == null) 504 Pane = DockPanel.DockPaneFactory.CreateDockPane(Content, visibleState, true); 505 else if (Pane.DockState != visibleState) 506 { 507 if (Pane.Contents.Count == 1) 508 Pane.SetDockState(visibleState); 509 else 510 Pane = DockPanel.DockPaneFactory.CreateDockPane(Content, visibleState, true); 511 } 512 } 513 514 if (Form.ContainsFocus) 515 if (DockState == DockState.Hidden || DockState == DockState.Unknown) 516 DockPanel.ContentFocusManager.GiveUpFocus(Content); 517 518 SetPaneAndVisible(Pane); 519 520 if (oldPane != null && !oldPane.IsDisposed && oldDockState == oldPane.DockState) 521 RefreshDockPane(oldPane); 522 523 if (Pane != null && DockState == Pane.DockState) 524 { 525 if ((Pane != oldPane) || 526 (Pane == oldPane && oldDockState != oldPane.DockState)) 527 // Avoid early refresh of hidden AutoHide panes 528 if ((Pane.DockWindow == null || Pane.DockWindow.Visible || Pane.IsHidden) && !Pane.IsAutoHide) 529 RefreshDockPane(Pane); 530 } 531 532 if (oldDockState != DockState) 533 { 534 if (DockState == DockState.Hidden || DockState == DockState.Unknown || 535 DockHelper.IsDockStateAutoHide(DockState)) 536 DockPanel.ContentFocusManager.RemoveFromList(Content); 537 else 538 DockPanel.ContentFocusManager.AddToList(Content); 539 540 OnDockStateChanged(EventArgs.Empty); 541 } 542 ResumeSetDockState(); 543 544 if (dockPanel != null) 545 dockPanel.ResumeLayout(true, true); 546 } 547 548 private static void RefreshDockPane(DockPane pane) 549 { 550 pane.RefreshChanges(); 551 pane.ValidateActiveContent(); 552 } 553 554 internal string PersistString 555 { 556 get { return GetPersistStringCallback == null ? Form.GetType().ToString() : GetPersistStringCallback(); } 557 } 558 559 private GetPersistStringCallback m_getPersistStringCallback = null; 560 public GetPersistStringCallback GetPersistStringCallback 561 { 562 get { return m_getPersistStringCallback; } 563 set { m_getPersistStringCallback = value; } 564 } 565 566 567 private bool m_hideOnClose = false; 568 public bool HideOnClose 569 { 570 get { return m_hideOnClose; } 571 set { m_hideOnClose = value; } 572 } 573 574 private DockState m_showHint = DockState.Unknown; 575 public DockState ShowHint 576 { 577 get { return m_showHint; } 578 set 579 { 580 if (!DockHelper.IsDockStateValid(value, DockAreas)) 581 throw (new InvalidOperationException(Strings.DockContentHandler_ShowHint_InvalidValue)); 582 583 if (m_showHint == value) 584 return; 585 586 m_showHint = value; 587 } 588 } 589 590 private bool m_isActivated = false; 591 public bool IsActivated 592 { 593 get { return m_isActivated; } 594 internal set 595 { 596 if (m_isActivated == value) 597 return; 598 599 m_isActivated = value; 600 } 601 } 602 603 public bool IsDockStateValid(DockState dockState) 604 { 605 if (DockPanel != null && dockState == DockState.Document && DockPanel.DocumentStyle == DocumentStyle.SystemMdi) 606 return false; 607 else 608 return DockHelper.IsDockStateValid(dockState, DockAreas); 609 } 610 611 private ContextMenu m_tabPageContextMenu = null; 612 public ContextMenu TabPageContextMenu 613 { 614 get { return m_tabPageContextMenu; } 615 set { m_tabPageContextMenu = value; } 616 } 617 618 private string m_toolTipText = null; 619 public string ToolTipText 620 { 621 get { return m_toolTipText; } 622 set { m_toolTipText = value; } 623 } 624 625 public void Activate() 626 { 627 if (DockPanel == null) 628 Form.Activate(); 629 else if (Pane == null) 630 Show(DockPanel); 631 else 632 { 633 IsHidden = false; 634 Pane.ActiveContent = Content; 635 if (DockState == DockState.Document && DockPanel.DocumentStyle == DocumentStyle.SystemMdi) 636 { 637 Form.Activate(); 638 return; 639 } 640 else if (DockHelper.IsDockStateAutoHide(DockState)) 641 DockPanel.ActiveAutoHideContent = Content; 642 643 if (!Form.ContainsFocus) 644 DockPanel.ContentFocusManager.Activate(Content); 645 } 646 } 647 648 public void GiveUpFocus() 649 { 650 DockPanel.ContentFocusManager.GiveUpFocus(Content); 345 DockPane oldPane = Pane; 346 347 if (m_panelPane != null) 348 RemoveFromPane(m_panelPane); 349 m_panelPane = value; 350 if (m_panelPane != null) { 351 m_panelPane.AddContent(Content); 352 SetDockState(IsHidden, IsFloat ? DockState.Float : m_panelPane.DockState, oldPane); 353 } else 354 SetDockState(IsHidden, DockState.Unknown, oldPane); 355 } 356 } 357 358 private void RemoveFromPane(DockPane pane) { 359 pane.RemoveContent(Content); 360 SetPane(null); 361 if (pane.Contents.Count == 0) 362 pane.Dispose(); 363 } 364 365 private DockPane m_floatPane = null; 366 public DockPane FloatPane { 367 get { return m_floatPane; } 368 set { 369 if (m_floatPane == value) 370 return; 371 372 if (value != null) { 373 if (!value.IsFloat || value.DockPanel != DockPanel) 374 throw new InvalidOperationException(Strings.DockContentHandler_FloatPane_InvalidValue); 651 375 } 652 376 653 private IntPtr m_activeWindowHandle = IntPtr.Zero; 654 internal IntPtr ActiveWindowHandle 655 { 656 get { return m_activeWindowHandle; } 657 set { m_activeWindowHandle = value; } 658 } 659 660 public void Hide() 661 { 662 IsHidden = true; 663 } 664 665 internal void SetPaneAndVisible(DockPane pane) 666 { 667 SetPane(pane); 668 SetVisible(); 377 DockPane oldPane = Pane; 378 379 if (m_floatPane != null) 380 RemoveFromPane(m_floatPane); 381 m_floatPane = value; 382 if (m_floatPane != null) { 383 m_floatPane.AddContent(Content); 384 SetDockState(IsHidden, IsFloat ? DockState.Float : VisibleState, oldPane); 385 } else 386 SetDockState(IsHidden, DockState.Unknown, oldPane); 387 } 388 } 389 390 private int m_countSetDockState = 0; 391 private void SuspendSetDockState() { 392 m_countSetDockState++; 393 } 394 395 private void ResumeSetDockState() { 396 m_countSetDockState--; 397 if (m_countSetDockState < 0) 398 m_countSetDockState = 0; 399 } 400 401 internal bool IsSuspendSetDockState { 402 get { return m_countSetDockState != 0; } 403 } 404 405 private void ResumeSetDockState(bool isHidden, DockState visibleState, DockPane oldPane) { 406 ResumeSetDockState(); 407 SetDockState(isHidden, visibleState, oldPane); 408 } 409 410 internal void SetDockState(bool isHidden, DockState visibleState, DockPane oldPane) { 411 if (IsSuspendSetDockState) 412 return; 413 414 if (DockPanel == null && visibleState != DockState.Unknown) 415 throw new InvalidOperationException(Strings.DockContentHandler_SetDockState_NullPanel); 416 417 if (visibleState == DockState.Hidden || (visibleState != DockState.Unknown && !IsDockStateValid(visibleState))) 418 throw new InvalidOperationException(Strings.DockContentHandler_SetDockState_InvalidState); 419 420 DockPanel dockPanel = DockPanel; 421 if (dockPanel != null) 422 dockPanel.SuspendLayout(true); 423 424 SuspendSetDockState(); 425 426 DockState oldDockState = DockState; 427 428 if (m_isHidden != isHidden || oldDockState == DockState.Unknown) { 429 m_isHidden = isHidden; 430 } 431 m_visibleState = visibleState; 432 m_dockState = isHidden ? DockState.Hidden : visibleState; 433 434 if (visibleState == DockState.Unknown) 435 Pane = null; 436 else { 437 m_isFloat = (m_visibleState == DockState.Float); 438 439 if (Pane == null) 440 Pane = DockPanel.DockPaneFactory.CreateDockPane(Content, visibleState, true); 441 else if (Pane.DockState != visibleState) { 442 if (Pane.Contents.Count == 1) 443 Pane.SetDockState(visibleState); 444 else 445 Pane = DockPanel.DockPaneFactory.CreateDockPane(Content, visibleState, true); 669 446 } 670 671 private void SetPane(DockPane pane) 672 { 673 if (pane != null && pane.DockState == DockState.Document && DockPanel.DocumentStyle == DocumentStyle.DockingMdi) 674 { 675 if (Form.Parent is DockPane) 676 SetParent(null); 677 if (Form.MdiParent != DockPanel.ParentForm) 678 { 679 FlagClipWindow = true; 680 Form.MdiParent = DockPanel.ParentForm; 681 } 682 } 683 else 684 { 685 FlagClipWindow = true; 686 if (Form.MdiParent != null) 687 Form.MdiParent = null; 688 if (Form.TopLevel) 689 Form.TopLevel = false; 690 SetParent(pane); 691 } 692 } 693 694 internal void SetVisible() 695 { 696 bool visible; 697 698 if (IsHidden) 699 visible = false; 700 else if (Pane != null && Pane.DockState == DockState.Document && DockPanel.DocumentStyle == DocumentStyle.DockingMdi) 701 visible = true; 702 else if (Pane != null && Pane.ActiveContent == Content) 703 visible = true; 704 else if (Pane != null && Pane.ActiveContent != Content) 705 visible = false; 706 else 707 visible = Form.Visible; 708 709 if (Form.Visible != visible) 710 Form.Visible = visible; 711 } 712 713 private void SetParent(Control value) 714 { 715 if (Form.Parent == value) 716 return; 717 718 //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 719 // Workaround of .Net Framework bug: 720 // Change the parent of a control with focus may result in the first 721 // MDI child form get activated. 722 //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 723 bool bRestoreFocus = false; 724 if (Form.ContainsFocus) 725 { 726 //Suggested as a fix for a memory leak by bugreports 727 if (value == null && !IsFloat) 728 DockPanel.ContentFocusManager.GiveUpFocus(this.Content); 729 else 730 { 731 DockPanel.SaveFocus(); 732 bRestoreFocus = true; 733 } 734 } 735 //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 736 737 Form.Parent = value; 738 739 //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 740 // Workaround of .Net Framework bug: 741 // Change the parent of a control with focus may result in the first 742 // MDI child form get activated. 743 //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 744 if (bRestoreFocus) 745 Activate(); 746 //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 447 } 448 449 if (Form.ContainsFocus) 450 if (DockState == DockState.Hidden || DockState == DockState.Unknown) 451 DockPanel.ContentFocusManager.GiveUpFocus(Content); 452 453 SetPaneAndVisible(Pane); 454 455 if (oldPane != null && !oldPane.IsDisposed && oldDockState == oldPane.DockState) 456 RefreshDockPane(oldPane); 457 458 if (Pane != null && DockState == Pane.DockState) { 459 if ((Pane != oldPane) || 460 (Pane == oldPane && oldDockState != oldPane.DockState)) 461 // Avoid early refresh of hidden AutoHide panes 462 if ((Pane.DockWindow == null || Pane.DockWindow.Visible || Pane.IsHidden) && !Pane.IsAutoHide) 463 RefreshDockPane(Pane); 464 } 465 466 if (oldDockState != DockState) { 467 if (DockState == DockState.Hidden || DockState == DockState.Unknown || 468 DockHelper.IsDockStateAutoHide(DockState)) 469 DockPanel.ContentFocusManager.RemoveFromList(Content); 470 else 471 DockPanel.ContentFocusManager.AddToList(Content); 472 473 OnDockStateChanged(EventArgs.Empty); 474 } 475 ResumeSetDockState(); 476 477 if (dockPanel != null) 478 dockPanel.ResumeLayout(true, true); 479 } 480 481 private static void RefreshDockPane(DockPane pane) { 482 pane.RefreshChanges(); 483 pane.ValidateActiveContent(); 484 } 485 486 internal string PersistString { 487 get { return GetPersistStringCallback == null ? Form.GetType().ToString() : GetPersistStringCallback(); } 488 } 489 490 private GetPersistStringCallback m_getPersistStringCallback = null; 491 public GetPersistStringCallback GetPersistStringCallback { 492 get { return m_getPersistStringCallback; } 493 set { m_getPersistStringCallback = value; } 494 } 495 496 497 private bool m_hideOnClose = false; 498 public bool HideOnClose { 499 get { return m_hideOnClose; } 500 set { m_hideOnClose = value; } 501 } 502 503 private DockState m_showHint = DockState.Unknown; 504 public DockState ShowHint { 505 get { return m_showHint; } 506 set { 507 if (!DockHelper.IsDockStateValid(value, DockAreas)) 508 throw (new InvalidOperationException(Strings.DockContentHandler_ShowHint_InvalidValue)); 509 510 if (m_showHint == value) 511 return; 512 513 m_showHint = value; 514 } 515 } 516 517 private bool m_isActivated = false; 518 public bool IsActivated { 519 get { return m_isActivated; } 520 internal set { 521 if (m_isActivated == value) 522 return; 523 524 m_isActivated = value; 525 } 526 } 527 528 public bool IsDockStateValid(DockState dockState) { 529 if (DockPanel != null && dockState == DockState.Document && DockPanel.DocumentStyle == DocumentStyle.SystemMdi) 530 return false; 531 else 532 return DockHelper.IsDockStateValid(dockState, DockAreas); 533 } 534 535 private ContextMenu m_tabPageContextMenu = null; 536 public ContextMenu TabPageContextMenu { 537 get { return m_tabPageContextMenu; } 538 set { m_tabPageContextMenu = value; } 539 } 540 541 private string m_toolTipText = null; 542 public string ToolTipText { 543 get { return m_toolTipText; } 544 set { m_toolTipText = value; } 545 } 546 547 public void Activate() { 548 if (DockPanel == null) 549 Form.Activate(); 550 else if (Pane == null) 551 Show(DockPanel); 552 else { 553 IsHidden = false; 554 Pane.ActiveContent = Content; 555 if (DockState == DockState.Document && DockPanel.DocumentStyle == DocumentStyle.SystemMdi) { 556 Form.Activate(); 557 return; 558 } else if (DockHelper.IsDockStateAutoHide(DockState)) 559 DockPanel.ActiveAutoHideContent = Content; 560 561 if (!Form.ContainsFocus) 562 DockPanel.ContentFocusManager.Activate(Content); 563 } 564 } 565 566 public void GiveUpFocus() { 567 DockPanel.ContentFocusManager.GiveUpFocus(Content); 568 } 569 570 private IntPtr m_activeWindowHandle = IntPtr.Zero; 571 internal IntPtr ActiveWindowHandle { 572 get { return m_activeWindowHandle; } 573 set { m_activeWindowHandle = value; } 574 } 575 576 public void Hide() { 577 IsHidden = true; 578 } 579 580 internal void SetPaneAndVisible(DockPane pane) { 581 SetPane(pane); 582 SetVisible(); 583 } 584 585 private void SetPane(DockPane pane) { 586 if (pane != null && pane.DockState == DockState.Document && DockPanel.DocumentStyle == DocumentStyle.DockingMdi) { 587 if (Form.Parent is DockPane) 588 SetParent(null); 589 if (Form.MdiParent != DockPanel.ParentForm) { 590 FlagClipWindow = true; 591 Form.MdiParent = DockPanel.ParentForm; 747 592 } 748 749 public void Show() 750 { 751 if (DockPanel == null) 752 Form.Show(); 753 else 754 Show(DockPanel); 755 } 756 757 public void Show(DockPanel dockPanel) 758 { 759 if (dockPanel == null) 760 throw(new ArgumentNullException(Strings.DockContentHandler_Show_NullDockPanel)); 761 762 if (DockState == DockState.Unknown) 763 Show(dockPanel, DefaultShowState); 764 else 765 Activate(); 766 } 767 768 public void Show(DockPanel dockPanel, DockState dockState) 769 { 770 if (dockPanel == null) 771 throw(new ArgumentNullException(Strings.DockContentHandler_Show_NullDockPanel)); 772 773 if (dockState == DockState.Unknown || dockState == DockState.Hidden) 774 throw(new ArgumentException(Strings.DockContentHandler_Show_InvalidDockState)); 775 776 dockPanel.SuspendLayout(true); 777 778 DockPanel = dockPanel; 779 780 if (dockState == DockState.Float && FloatPane == null) 781 Pane = DockPanel.DockPaneFactory.CreateDockPane(Content, DockState.Float, true); 782 else if (PanelPane == null) 783 { 784 DockPane paneExisting = null; 785 foreach (DockPane pane in DockPanel.Panes) 786 if (pane.DockState == dockState) 787 { 788 paneExisting = pane; 789 break; 790 } 791 792 if (paneExisting == null) 793 Pane = DockPanel.DockPaneFactory.CreateDockPane(Content, dockState, true); 794 else 795 Pane = paneExisting; 796 } 797 798 DockState = dockState; 799 dockPanel.ResumeLayout(true, true); //we'll resume the layout before activating to ensure that the position 800 Activate(); //and size of the form are finally processed before the form is shown 801 } 802 803 [SuppressMessage("Microsoft.Naming", "CA1720:AvoidTypeNamesInParameters")] 804 public void Show(DockPanel dockPanel, Rectangle floatWindowBounds) 805 { 806 if (dockPanel == null) 807 throw(new ArgumentNullException(Strings.DockContentHandler_Show_NullDockPanel)); 808 809 dockPanel.SuspendLayout(true); 810 811 DockPanel = dockPanel; 812 if (FloatPane == null) 813 { 814 IsHidden = true; // to reduce the screen flicker 815 FloatPane = DockPanel.DockPaneFactory.CreateDockPane(Content, DockState.Float, false); 816 FloatPane.FloatWindow.StartPosition = FormStartPosition.Manual; 817 } 818 819 FloatPane.FloatWindow.Bounds = floatWindowBounds; 820 821 Show(dockPanel, DockState.Float); 822 Activate(); 823 824 dockPanel.ResumeLayout(true, true); 825 } 826 827 public void Show(DockPane pane, IDockContent beforeContent) 828 { 829 if (pane == null) 830 throw(new ArgumentNullException(Strings.DockContentHandler_Show_NullPane)); 831 832 if (beforeContent != null && pane.Contents.IndexOf(beforeContent) == -1) 833 throw(new ArgumentException(Strings.DockContentHandler_Show_InvalidBeforeContent)); 834 835 pane.DockPanel.SuspendLayout(true); 836 837 DockPanel = pane.DockPanel; 838 Pane = pane; 839 pane.SetContentIndex(Content, pane.Contents.IndexOf(beforeContent)); 840 Show(); 841 842 pane.DockPanel.ResumeLayout(true, true); 843 } 844 845 public void Show(DockPane previousPane, DockAlignment alignment, double proportion) 846 { 847 if (previousPane == null) 848 throw(new ArgumentException(Strings.DockContentHandler_Show_InvalidPrevPane)); 849 850 if (DockHelper.IsDockStateAutoHide(previousPane.DockState)) 851 throw(new ArgumentException(Strings.DockContentHandler_Show_InvalidPrevPane)); 852 853 previousPane.DockPanel.SuspendLayout(true); 854 855 DockPanel = previousPane.DockPanel; 856 DockPanel.DockPaneFactory.CreateDockPane(Content, previousPane, alignment, proportion, true); 857 Show(); 858 859 previousPane.DockPanel.ResumeLayout(true, true); 860 } 861 862 public void Close() 863 { 864 DockPanel dockPanel = DockPanel; 865 if (dockPanel != null) 866 dockPanel.SuspendLayout(true); 867 Form.Close(); 868 if (dockPanel != null) 869 dockPanel.ResumeLayout(true, true); 870 871 } 872 873 private DockPaneStripBase.Tab m_tab = null; 874 internal DockPaneStripBase.Tab GetTab(DockPaneStripBase dockPaneStrip) 875 { 876 if (m_tab == null) 877 m_tab = dockPaneStrip.CreateTab(Content); 878 879 return m_tab; 880 } 881 882 private IDisposable m_autoHideTab = null; 883 internal IDisposable AutoHideTab 884 { 885 get { return m_autoHideTab; } 886 set { m_autoHideTab = value; } 887 } 888 889 #region Events 890 private static readonly object DockStateChangedEvent = new object(); 891 public event EventHandler DockStateChanged 892 { 893 add { Events.AddHandler(DockStateChangedEvent, value); } 894 remove { Events.RemoveHandler(DockStateChangedEvent, value); } 895 } 896 protected virtual void OnDockStateChanged(EventArgs e) 897 { 898 EventHandler handler = (EventHandler)Events[DockStateChangedEvent]; 899 if (handler != null) 900 handler(this, e); 901 } 902 #endregion 903 904 private void Form_Disposed(object sender, EventArgs e) 905 { 906 Dispose(); 907 } 908 909 private void Form_TextChanged(object sender, EventArgs e) 910 { 911 if (DockHelper.IsDockStateAutoHide(DockState)) 912 DockPanel.RefreshAutoHideStrip(); 913 else if (Pane != null) 914 { 915 if (Pane.FloatWindow != null) 916 Pane.FloatWindow.SetText(); 917 Pane.RefreshChanges(); 918 } 919 } 920 921 private bool m_flagClipWindow = false; 922 internal bool FlagClipWindow 923 { 924 get { return m_flagClipWindow; } 925 set 926 { 927 if (m_flagClipWindow == value) 928 return; 929 930 m_flagClipWindow = value; 931 if (m_flagClipWindow) 932 Form.Region = new Region(Rectangle.Empty); 933 else 934 Form.Region = null; 935 } 936 } 937 938 private ContextMenuStrip m_tabPageContextMenuStrip = null; 939 public ContextMenuStrip TabPageContextMenuStrip 940 { 941 get { return m_tabPageContextMenuStrip; } 942 set { m_tabPageContextMenuStrip = value; } 593 } else { 594 FlagClipWindow = true; 595 if (Form.MdiParent != null) 596 Form.MdiParent = null; 597 if (Form.TopLevel) 598 Form.TopLevel = false; 599 SetParent(pane); 600 } 601 } 602 603 internal void SetVisible() { 604 bool visible; 605 606 if (IsHidden) 607 visible = false; 608 else if (Pane != null && Pane.DockState == DockState.Document && DockPanel.DocumentStyle == DocumentStyle.DockingMdi) 609 visible = true; 610 else if (Pane != null && Pane.ActiveContent == Content) 611 visible = true; 612 else if (Pane != null && Pane.ActiveContent != Content) 613 visible = false; 614 else 615 visible = Form.Visible; 616 617 if (Form.Visible != visible) 618 Form.Visible = visible; 619 } 620 621 private void SetParent(Control value) { 622 if (Form.Parent == value) 623 return; 624 625 //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 626 // Workaround of .Net Framework bug: 627 // Change the parent of a control with focus may result in the first 628 // MDI child form get activated. 629 //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 630 bool bRestoreFocus = false; 631 if (Form.ContainsFocus) { 632 //Suggested as a fix for a memory leak by bugreports 633 if (value == null && !IsFloat) 634 DockPanel.ContentFocusManager.GiveUpFocus(this.Content); 635 else { 636 DockPanel.SaveFocus(); 637 bRestoreFocus = true; 943 638 } 944 945 #region IDockDragSource Members 946 947 Control IDragSource.DragControl 948 { 949 get { return Form; } 639 } 640 //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 641 642 Form.Parent = value; 643 644 //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 645 // Workaround of .Net Framework bug: 646 // Change the parent of a control with focus may result in the first 647 // MDI child form get activated. 648 //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 649 if (bRestoreFocus) 650 Activate(); 651 //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 652 } 653 654 public void Show() { 655 if (DockPanel == null) 656 Form.Show(); 657 else 658 Show(DockPanel); 659 } 660 661 public void Show(DockPanel dockPanel) { 662 if (dockPanel == null) 663 throw (new ArgumentNullException(Strings.DockContentHandler_Show_NullDockPanel)); 664 665 if (DockState == DockState.Unknown) 666 Show(dockPanel, DefaultShowState); 667 else 668 Activate(); 669 } 670 671 public void Show(DockPanel dockPanel, DockState dockState) { 672 if (dockPanel == null) 673 throw (new ArgumentNullException(Strings.DockContentHandler_Show_NullDockPanel)); 674 675 if (dockState == DockState.Unknown || dockState == DockState.Hidden) 676 throw (new ArgumentException(Strings.DockContentHandler_Show_InvalidDockState)); 677 678 dockPanel.SuspendLayout(true); 679 680 DockPanel = dockPanel; 681 682 if (dockState == DockState.Float && FloatPane == null) 683 Pane = DockPanel.DockPaneFactory.CreateDockPane(Content, DockState.Float, true); 684 else if (PanelPane == null) { 685 DockPane paneExisting = null; 686 foreach (DockPane pane in DockPanel.Panes) 687 if (pane.DockState == dockState) { 688 paneExisting = pane; 689 break; 690 } 691 692 if (paneExisting == null) 693 Pane = DockPanel.DockPaneFactory.CreateDockPane(Content, dockState, true); 694 else 695 Pane = paneExisting; 696 } 697 698 DockState = dockState; 699 dockPanel.ResumeLayout(true, true); //we'll resume the layout before activating to ensure that the position 700 Activate(); //and size of the form are finally processed before the form is shown 701 } 702 703 [SuppressMessage("Microsoft.Naming", "CA1720:AvoidTypeNamesInParameters")] 704 public void Show(DockPanel dockPanel, Rectangle floatWindowBounds) { 705 if (dockPanel == null) 706 throw (new ArgumentNullException(Strings.DockContentHandler_Show_NullDockPanel)); 707 708 dockPanel.SuspendLayout(true); 709 710 DockPanel = dockPanel; 711 if (FloatPane == null) { 712 IsHidden = true; // to reduce the screen flicker 713 FloatPane = DockPanel.DockPaneFactory.CreateDockPane(Content, DockState.Float, false); 714 FloatPane.FloatWindow.StartPosition = FormStartPosition.Manual; 715 } 716 717 FloatPane.FloatWindow.Bounds = floatWindowBounds; 718 719 Show(dockPanel, DockState.Float); 720 Activate(); 721 722 dockPanel.ResumeLayout(true, true); 723 } 724 725 public void Show(DockPane pane, IDockContent beforeContent) { 726 if (pane == null) 727 throw (new ArgumentNullException(Strings.DockContentHandler_Show_NullPane)); 728 729 if (beforeContent != null && pane.Contents.IndexOf(beforeContent) == -1) 730 throw (new ArgumentException(Strings.DockContentHandler_Show_InvalidBeforeContent)); 731 732 pane.DockPanel.SuspendLayout(true); 733 734 DockPanel = pane.DockPanel; 735 Pane = pane; 736 pane.SetContentIndex(Content, pane.Contents.IndexOf(beforeContent)); 737 Show(); 738 739 pane.DockPanel.ResumeLayout(true, true); 740 } 741 742 public void Show(DockPane previousPane, DockAlignment alignment, double proportion) { 743 if (previousPane == null) 744 throw (new ArgumentException(Strings.DockContentHandler_Show_InvalidPrevPane)); 745 746 if (DockHelper.IsDockStateAutoHide(previousPane.DockState)) 747 throw (new ArgumentException(Strings.DockContentHandler_Show_InvalidPrevPane)); 748 749 previousPane.DockPanel.SuspendLayout(true); 750 751 DockPanel = previousPane.DockPanel; 752 DockPanel.DockPaneFactory.CreateDockPane(Content, previousPane, alignment, proportion, true); 753 Show(); 754 755 previousPane.DockPanel.ResumeLayout(true, true); 756 } 757 758 public void Close() { 759 DockPanel dockPanel = DockPanel; 760 if (dockPanel != null) 761 dockPanel.SuspendLayout(true); 762 Form.Close(); 763 if (dockPanel != null) 764 dockPanel.ResumeLayout(true, true); 765 766 } 767 768 private DockPaneStripBase.Tab m_tab = null; 769 internal DockPaneStripBase.Tab GetTab(DockPaneStripBase dockPaneStrip) { 770 if (m_tab == null) 771 m_tab = dockPaneStrip.CreateTab(Content); 772 773 return m_tab; 774 } 775 776 private IDisposable m_autoHideTab = null; 777 internal IDisposable AutoHideTab { 778 get { return m_autoHideTab; } 779 set { m_autoHideTab = value; } 780 } 781 782 #region Events 783 private static readonly object DockStateChangedEvent = new object(); 784 public event EventHandler DockStateChanged { 785 add { Events.AddHandler(DockStateChangedEvent, value); } 786 remove { Events.RemoveHandler(DockStateChangedEvent, value); } 787 } 788 protected virtual void OnDockStateChanged(EventArgs e) { 789 EventHandler handler = (EventHandler)Events[DockStateChangedEvent]; 790 if (handler != null) 791 handler(this, e); 792 } 793 #endregion 794 795 private void Form_Disposed(object sender, EventArgs e) { 796 Dispose(); 797 } 798 799 private void Form_TextChanged(object sender, EventArgs e) { 800 if (DockHelper.IsDockStateAutoHide(DockState)) 801 DockPanel.RefreshAutoHideStrip(); 802 else if (Pane != null) { 803 if (Pane.FloatWindow != null) 804 Pane.FloatWindow.SetText(); 805 Pane.RefreshChanges(); 806 } 807 } 808 809 private bool m_flagClipWindow = false; 810 internal bool FlagClipWindow { 811 get { return m_flagClipWindow; } 812 set { 813 if (m_flagClipWindow == value) 814 return; 815 816 m_flagClipWindow = value; 817 if (m_flagClipWindow) 818 Form.Region = new Region(Rectangle.Empty); 819 else 820 Form.Region = null; 821 } 822 } 823 824 private ContextMenuStrip m_tabPageContextMenuStrip = null; 825 public ContextMenuStrip TabPageContextMenuStrip { 826 get { return m_tabPageContextMenuStrip; } 827 set { m_tabPageContextMenuStrip = value; } 828 } 829 830 #region IDockDragSource Members 831 832 Control IDragSource.DragControl { 833 get { return Form; } 834 } 835 836 bool IDockDragSource.CanDockTo(DockPane pane) { 837 if (!IsDockStateValid(pane.DockState)) 838 return false; 839 840 if (Pane == pane && pane.DisplayingContents.Count == 1) 841 return false; 842 843 return true; 844 } 845 846 Rectangle IDockDragSource.BeginDrag(Point ptMouse) { 847 Size size; 848 DockPane floatPane = this.FloatPane; 849 if (DockState == DockState.Float || floatPane == null || floatPane.FloatWindow.NestedPanes.Count != 1) 850 size = DockPanel.DefaultFloatWindowSize; 851 else 852 size = floatPane.FloatWindow.Size; 853 854 Point location; 855 Rectangle rectPane = Pane.ClientRectangle; 856 if (DockState == DockState.Document) { 857 if (Pane.DockPanel.DocumentTabStripLocation == DocumentTabStripLocation.Bottom) 858 location = new Point(rectPane.Left, rectPane.Bottom - size.Height); 859 else 860 location = new Point(rectPane.Left, rectPane.Top); 861 } else { 862 location = new Point(rectPane.Left, rectPane.Bottom); 863 location.Y -= size.Height; 864 } 865 location = Pane.PointToScreen(location); 866 867 if (ptMouse.X > location.X + size.Width) 868 location.X += ptMouse.X - (location.X + size.Width) + Measures.SplitterSize; 869 870 return new Rectangle(location, size); 871 } 872 873 public void FloatAt(Rectangle floatWindowBounds) { 874 DockPane pane = DockPanel.DockPaneFactory.CreateDockPane(Content, floatWindowBounds, true); 875 } 876 877 public void DockTo(DockPane pane, DockStyle dockStyle, int contentIndex) { 878 if (dockStyle == DockStyle.Fill) { 879 bool samePane = (Pane == pane); 880 if (!samePane) 881 Pane = pane; 882 883 if (contentIndex == -1 || !samePane) 884 pane.SetContentIndex(Content, contentIndex); 885 else { 886 DockContentCollection contents = pane.Contents; 887 int oldIndex = contents.IndexOf(Content); 888 int newIndex = contentIndex; 889 if (oldIndex < newIndex) { 890 newIndex += 1; 891 if (newIndex > contents.Count - 1) 892 newIndex = -1; 893 } 894 pane.SetContentIndex(Content, newIndex); 950 895 } 951 952 bool IDockDragSource.CanDockTo(DockPane pane) 953 { 954 if (!IsDockStateValid(pane.DockState)) 955 return false; 956 957 if (Pane == pane && pane.DisplayingContents.Count == 1) 958 return false; 959 960 return true; 961 } 962 963 Rectangle IDockDragSource.BeginDrag(Point ptMouse) 964 { 965 Size size; 966 DockPane floatPane = this.FloatPane; 967 if (DockState == DockState.Float || floatPane == null || floatPane.FloatWindow.NestedPanes.Count != 1) 968 size = DockPanel.DefaultFloatWindowSize; 969 else 970 size = floatPane.FloatWindow.Size; 971 972 Point location; 973 Rectangle rectPane = Pane.ClientRectangle; 974 if (DockState == DockState.Document) 975 { 976 if (Pane.DockPanel.DocumentTabStripLocation == DocumentTabStripLocation.Bottom) 977 location = new Point(rectPane.Left, rectPane.Bottom - size.Height); 978 else 979 location = new Point(rectPane.Left, rectPane.Top); 980 } 981 else 982 { 983 location = new Point(rectPane.Left, rectPane.Bottom); 984 location.Y -= size.Height; 985 } 986 location = Pane.PointToScreen(location); 987 988 if (ptMouse.X > location.X + size.Width) 989 location.X += ptMouse.X - (location.X + size.Width) + Measures.SplitterSize; 990 991 return new Rectangle(location, size); 992 } 993 994 public void FloatAt(Rectangle floatWindowBounds) 995 { 996 DockPane pane = DockPanel.DockPaneFactory.CreateDockPane(Content, floatWindowBounds, true); 997 } 998 999 public void DockTo(DockPane pane, DockStyle dockStyle, int contentIndex) 1000 { 1001 if (dockStyle == DockStyle.Fill) 1002 { 1003 bool samePane = (Pane == pane); 1004 if (!samePane) 1005 Pane = pane; 1006 1007 if (contentIndex == -1 || !samePane) 1008 pane.SetContentIndex(Content, contentIndex); 1009 else 1010 { 1011 DockContentCollection contents = pane.Contents; 1012 int oldIndex = contents.IndexOf(Content); 1013 int newIndex = contentIndex; 1014 if (oldIndex < newIndex) 1015 { 1016 newIndex += 1; 1017 if (newIndex > contents.Count -1) 1018 newIndex = -1; 1019 } 1020 pane.SetContentIndex(Content, newIndex); 1021 } 1022 } 1023 else 1024 { 1025 DockPane paneFrom = DockPanel.DockPaneFactory.CreateDockPane(Content, pane.DockState, true); 1026 INestedPanesContainer container = pane.NestedPanesContainer; 1027 if (dockStyle == DockStyle.Left) 1028 paneFrom.DockTo(container, pane, DockAlignment.Left, 0.5); 1029 else if (dockStyle == DockStyle.Right) 1030 paneFrom.DockTo(container, pane, DockAlignment.Right, 0.5); 1031 else if (dockStyle == DockStyle.Top) 1032 paneFrom.DockTo(container, pane, DockAlignment.Top, 0.5); 1033 else if (dockStyle == DockStyle.Bottom) 1034 paneFrom.DockTo(container, pane, DockAlignment.Bottom, 0.5); 1035 1036 paneFrom.DockState = pane.DockState; 1037 } 1038 } 1039 1040 public void DockTo(DockPanel panel, DockStyle dockStyle) 1041 { 1042 if (panel != DockPanel) 1043 throw new ArgumentException(Strings.IDockDragSource_DockTo_InvalidPanel, "panel"); 1044 1045 DockPane pane; 1046 1047 if (dockStyle == DockStyle.Top) 1048 pane = DockPanel.DockPaneFactory.CreateDockPane(Content, DockState.DockTop, true); 1049 else if (dockStyle == DockStyle.Bottom) 1050 pane = DockPanel.DockPaneFactory.CreateDockPane(Content, DockState.DockBottom, true); 1051 else if (dockStyle == DockStyle.Left) 1052 pane = DockPanel.DockPaneFactory.CreateDockPane(Content, DockState.DockLeft, true); 1053 else if (dockStyle == DockStyle.Right) 1054 pane = DockPanel.DockPaneFactory.CreateDockPane(Content, DockState.DockRight, true); 1055 else if (dockStyle == DockStyle.Fill) 1056 pane = DockPanel.DockPaneFactory.CreateDockPane(Content, DockState.Document, true); 1057 else 1058 return; 1059 } 1060 1061 #endregion 1062 } 896 } else { 897 DockPane paneFrom = DockPanel.DockPaneFactory.CreateDockPane(Content, pane.DockState, true); 898 INestedPanesContainer container = pane.NestedPanesContainer; 899 if (dockStyle == DockStyle.Left) 900 paneFrom.DockTo(container, pane, DockAlignment.Left, 0.5); 901 else if (dockStyle == DockStyle.Right) 902 paneFrom.DockTo(container, pane, DockAlignment.Right, 0.5); 903 else if (dockStyle == DockStyle.Top) 904 paneFrom.DockTo(container, pane, DockAlignment.Top, 0.5); 905 else if (dockStyle == DockStyle.Bottom) 906 paneFrom.DockTo(container, pane, DockAlignment.Bottom, 0.5); 907 908 paneFrom.DockState = pane.DockState; 909 } 910 } 911 912 public void DockTo(DockPanel panel, DockStyle dockStyle) { 913 if (panel != DockPanel) 914 throw new ArgumentException(Strings.IDockDragSource_DockTo_InvalidPanel, "panel"); 915 916 DockPane pane; 917 918 if (dockStyle == DockStyle.Top) 919 pane = DockPanel.DockPaneFactory.CreateDockPane(Content, DockState.DockTop, true); 920 else if (dockStyle == DockStyle.Bottom) 921 pane = DockPanel.DockPaneFactory.CreateDockPane(Content, DockState.DockBottom, true); 922 else if (dockStyle == DockStyle.Left) 923 pane = DockPanel.DockPaneFactory.CreateDockPane(Content, DockState.DockLeft, true); 924 else if (dockStyle == DockStyle.Right) 925 pane = DockPanel.DockPaneFactory.CreateDockPane(Content, DockState.DockRight, true); 926 else if (dockStyle == DockStyle.Fill) 927 pane = DockPanel.DockPaneFactory.CreateDockPane(Content, DockState.Document, true); 928 else 929 return; 930 } 931 932 #endregion 933 } 1063 934 }
Note: See TracChangeset
for help on using the changeset viewer.