protected override void Dispose(bool disposing)
        {
            if (disposing)
            {
                document.DocumentAboutToBeChanged -= DocumentAboutToBeChanged;
                if (codeCompletionListView != null)
                {
                    codeCompletionListView.Dispose();
                    codeCompletionListView = null;
                }

                if (declarationViewWindow != null)
                {
                    declarationViewWindow.Dispose();
                    declarationViewWindow = null;
                }
            }

            base.Dispose(disposing);
        }
        private CodeCompletionWindow(ICompletionDataProvider completionDataProvider, ICompletionData[] completionData,
                                     Form parentForm, TextEditorControl control, bool showDeclarationWindow, bool fixedListViewWidth) : base(
                parentForm, control)
        {
            dataProvider               = completionDataProvider;
            this.completionData        = completionData;
            document                   = control.Document;
            this.showDeclarationWindow = showDeclarationWindow;
            this.fixedListViewWidth    = fixedListViewWidth;

            workingScreen = Screen.GetWorkingArea(Location);
            startOffset   = control.ActiveTextAreaControl.Caret.Offset + 1;
            endOffset     = startOffset;
            if (completionDataProvider.PreSelection != null)
            {
                startOffset -= completionDataProvider.PreSelection.Length + 1;
                endOffset--;
            }

            codeCompletionListView                      = new CodeCompletionListView(completionData);
            codeCompletionListView.ImageList            = completionDataProvider.ImageList;
            codeCompletionListView.Dock                 = DockStyle.Fill;
            codeCompletionListView.SelectedItemChanged += CodeCompletionListViewSelectedItemChanged;
            codeCompletionListView.DoubleClick         += CodeCompletionListViewDoubleClick;
            codeCompletionListView.Click               += CodeCompletionListViewClick;
            Controls.Add(codeCompletionListView);

            if (completionData.Length > MaxListLength)
            {
                vScrollBar.Name        = "scroll";
                vScrollBar.Dock        = DockStyle.Right;
                vScrollBar.Minimum     = 0;
                vScrollBar.Maximum     = completionData.Length - 1;
                vScrollBar.SmallChange = 1;
                vScrollBar.LargeChange = MaxListLength;
                codeCompletionListView.FirstItemChanged += CodeCompletionListViewFirstItemChanged;
                Controls.Add(vScrollBar);
            }

            drawingSize = GetListViewSize();
            SetLocation();

            if (declarationViewWindow == null)
            {
                declarationViewWindow = new DeclarationViewWindow(parentForm);
            }
            SetDeclarationViewLocation();
            declarationViewWindow.ShowDeclarationViewWindow();
            declarationViewWindow.MouseMove += ControlMouseMove;
            control.Focus();
            CodeCompletionListViewSelectedItemChanged(this, EventArgs.Empty);

            if (completionDataProvider.DefaultIndex >= 0)
            {
                codeCompletionListView.SelectIndex(completionDataProvider.DefaultIndex);
            }

            if (completionDataProvider.PreSelection != null)
            {
                CaretOffsetChanged(this, EventArgs.Empty);
            }

            vScrollBar.ValueChanged           += VScrollBarValueChanged;
            document.DocumentAboutToBeChanged += DocumentAboutToBeChanged;
        }