import { VDomModel, VDomRenderer } from '@jupyterlab/apputils';
import { CodeEditor } from '@jupyterlab/codeeditor';
import { IDocumentWidget } from '@jupyterlab/docregistry';
import { TranslationBundle } from '@jupyterlab/translation';
import type * as CodeMirror from 'codemirror';
import React, { ReactElement } from 'react';
import * as lsProtocol from 'vscode-languageserver-protocol';
import { CodeDiagnostics as LSPDiagnosticsSettings } from '../../_diagnostics';
import { StatusMessage, WidgetAdapter } from '../../adapters/adapter';
import { FeatureSettings } from '../../feature';
import { DiagnosticSeverity } from '../../lsp';
import { IEditorPosition } from '../../positioning';
import { CodeMirrorVirtualEditor } from '../../virtual/codemirror_editor';
import { VirtualDocument } from '../../virtual/document';
import { IVirtualEditor } from '../../virtual/editor';
import '../../../style/diagnostics_listing.css';
/**
 * Diagnostic which is localized at a specific editor (cell) within a notebook
 * (if used in the context of a FileEditor, then there is just a single editor)
 */
export interface IEditorDiagnostic {
    diagnostic: lsProtocol.Diagnostic;
    editor: CodeMirror.Editor;
    range: {
        start: IEditorPosition;
        end: IEditorPosition;
    };
}
export declare const DIAGNOSTICS_LISTING_CLASS = "lsp-diagnostics-listing";
export declare class DiagnosticsDatabase extends Map<VirtualDocument, IEditorDiagnostic[]> {
    get all(): Array<IEditorDiagnostic>;
}
export interface IDiagnosticsRow {
    data: IEditorDiagnostic;
    key: string;
    document: VirtualDocument;
    /**
     * Cell number is the ordinal, 1-based cell identifier displayed to the user.
     */
    cell_number?: number;
}
interface IListingContext {
    db: DiagnosticsDatabase;
    editor: IVirtualEditor<CodeEditor.IEditor>;
    adapter: WidgetAdapter<IDocumentWidget>;
}
interface IColumnOptions {
    id: string;
    label: string;
    render_cell(data: IDiagnosticsRow, context?: IListingContext): ReactElement;
    sort(a: IDiagnosticsRow, b: IDiagnosticsRow): number;
    is_available?(context: IListingContext): boolean;
}
declare class Column {
    private options;
    is_visible: boolean;
    constructor(options: IColumnOptions);
    render_cell(data: IDiagnosticsRow, context: IListingContext): React.ReactElement<any, string | ((props: any) => React.ReactElement<any, any> | null) | (new (props: any) => React.Component<any, any, any>)>;
    sort(a: IDiagnosticsRow, b: IDiagnosticsRow): number;
    get id(): string;
    is_available(context: IListingContext): boolean;
    render_header(listing: DiagnosticsListing): ReactElement;
}
export declare function message_without_code(diagnostic: lsProtocol.Diagnostic): string;
export declare class DiagnosticsListing extends VDomRenderer<DiagnosticsListing.Model> {
    sort_key: string;
    sort_direction: number;
    private _diagnostics;
    protected trans: TranslationBundle;
    columns: Column[];
    protected severityTranslations: Record<keyof typeof DiagnosticSeverity, string>;
    constructor(model: DiagnosticsListing.Model);
    sort(key: string): void;
    render(): JSX.Element;
    get_diagnostic(key: string): IDiagnosticsRow | undefined;
    jump_to(row: IDiagnosticsRow): void;
}
export declare namespace DiagnosticsListing {
    /**
     * A VDomModel for the LSP of current file editor/notebook.
     */
    class Model extends VDomModel {
        diagnostics: DiagnosticsDatabase | null;
        virtual_editor: CodeMirrorVirtualEditor | null;
        adapter: WidgetAdapter<any> | null;
        settings: FeatureSettings<LSPDiagnosticsSettings>;
        status_message: StatusMessage;
        trans: TranslationBundle;
        constructor(translator_bundle: TranslationBundle);
    }
}
export {};
