import { StaffLine } from "./StaffLine";
import { Instrument } from "../Instrument";
import { Fraction } from "../../Common/DataObjects/Fraction";
import { InstrumentalGroup } from "../InstrumentalGroup";
import { GraphicalMusicPage } from "./GraphicalMusicPage";
import { GraphicalLabel } from "./GraphicalLabel";
import { GraphicalMeasure } from "./GraphicalMeasure";
import { GraphicalObject } from "./GraphicalObject";
import { EngravingRules } from "./EngravingRules";
import { SystemLinesEnum } from "./SystemLinesEnum";
import { Dictionary } from "typescript-collections";
import { GraphicalComment } from "./GraphicalComment";
import { GraphicalMarkedArea } from "./GraphicalMarkedArea";
import { SystemLine } from "./SystemLine";
import { SystemLinePosition } from "./SystemLinePosition";
/**
 * A MusicSystem contains the [[StaffLine]]s for all instruments, until a line break
 */
export declare abstract class MusicSystem extends GraphicalObject {
    needsToBeRedrawn: boolean;
    rules: EngravingRules;
    protected parent: GraphicalMusicPage;
    protected id: number;
    protected staffLines: StaffLine[];
    protected graphicalMeasures: GraphicalMeasure[][];
    /** Dictionary of (Instruments and) labels.
     * note that the key needs to be unique, GraphicalLabel is not unique yet.
     * That is why the labels are labels.values() and not labels.keys().
     */
    protected labels: Dictionary<Instrument, GraphicalLabel>;
    protected measureNumberLabels: GraphicalLabel[];
    protected maxLabelLength: number;
    protected objectsToRedraw: [Object[], Object][];
    protected instrumentBrackets: GraphicalObject[];
    protected groupBrackets: GraphicalObject[];
    protected graphicalMarkedAreas: GraphicalMarkedArea[];
    protected graphicalComments: GraphicalComment[];
    protected systemLines: SystemLine[];
    breaksPage: boolean;
    constructor(id: number);
    get Parent(): GraphicalMusicPage;
    set Parent(value: GraphicalMusicPage);
    get NextSystem(): MusicSystem;
    get StaffLines(): StaffLine[];
    set StaffLines(value: StaffLine[]);
    get GraphicalMeasures(): GraphicalMeasure[][];
    get MeasureNumberLabels(): GraphicalLabel[];
    get Labels(): GraphicalLabel[];
    get ObjectsToRedraw(): [Object[], Object][];
    get InstrumentBrackets(): GraphicalObject[];
    get GroupBrackets(): GraphicalObject[];
    get GraphicalMarkedAreas(): GraphicalMarkedArea[];
    get GraphicalComments(): GraphicalComment[];
    get SystemLines(): SystemLine[];
    get Id(): number;
    get MaxLabelLength(): number;
    /**
     * Create the left vertical Line connecting all staves of the [[MusicSystem]].
     * @param lineWidth
     * @param systemLabelsRightMargin
     */
    createSystemLeftLine(lineWidth: number, systemLabelsRightMargin: number, isFirstSystem: boolean): void;
    /**
     * Create the vertical Lines after the End of all [[StaffLine]]'s Measures
     * @param xPosition
     * @param lineWidth
     * @param lineType
     * @param linePosition indicates if the line belongs to start or end of measure
     * @param measureIndex the measure index within the staffline
     * @param measure
     */
    createVerticalLineForMeasure(xPosition: number, lineWidth: number, lineType: SystemLinesEnum, linePosition: SystemLinePosition, measureIndex: number, measure: GraphicalMeasure): void;
    /**
     * Set the y-Positions of all the system lines in the system and creates the graphical Lines and dots within.
     * @param rules
     */
    setYPositionsToVerticalLineObjectsAndCreateLines(rules: EngravingRules): void;
    calculateBorders(rules: EngravingRules): void;
    alignBeginInstructions(): void;
    GetLeftBorderAbsoluteXPosition(): number;
    GetRightBorderAbsoluteXPosition(): number;
    AddGraphicalMeasures(graphicalMeasures: GraphicalMeasure[]): void;
    GetSystemsFirstTimeStamp(): Fraction;
    GetSystemsLastTimeStamp(): Fraction;
    /**
     * Create an InstrumentBracket for each multiStave Instrument.
     * @param instruments
     * @param staffHeight
     */
    createInstrumentBrackets(instruments: Instrument[], staffHeight: number): void;
    /**
     * Create a GroupBracket for an [[InstrumentalGroup]].
     * @param instrumentGroups
     * @param staffHeight
     * @param recursionDepth
     */
    createGroupBrackets(instrumentGroups: InstrumentalGroup[], staffHeight: number, recursionDepth: number): void;
    /**
     * Create the Instrument's Labels (only for the first [[MusicSystem]] of the first MusicPage).
     * @param instrumentLabelTextHeight
     * @param systemLabelsRightMargin
     * @param labelMarginBorderFactor
     */
    createMusicSystemLabel(instrumentLabelTextHeight: number, systemLabelsRightMargin: number, labelMarginBorderFactor: number, isFirstSystem?: boolean): void;
    /**
     * Set the Y-Positions for the MusicSystem's Labels.
     */
    setMusicSystemLabelsYPosition(): void;
    /**
     * Check if two "adjacent" StaffLines have BOTH a StaffEntry with a StaffEntryLink.
     * This is needed for the y-spacing algorithm.
     * @returns {boolean}
     */
    checkStaffEntriesForStaffEntryLink(): boolean;
    getBottomStaffLine(topStaffLine: StaffLine): StaffLine;
    /**
     * Here the system line is generated, which acts as the container of graphical lines and dots that will be finally rendered.
     * It holds al the logical parameters of the system line.
     * @param xPosition The x position within the system
     * @param lineWidth The total x width
     * @param lineType The line type enum
     * @param linePosition indicates if the line belongs to start or end of measure
     * @param musicSystem
     * @param topMeasure
     * @param bottomMeasure
     */
    protected createSystemLine(xPosition: number, lineWidth: number, lineType: SystemLinesEnum, linePosition: SystemLinePosition, musicSystem: MusicSystem, topMeasure: GraphicalMeasure, bottomMeasure?: GraphicalMeasure): SystemLine;
    /**
     * Create all the graphical lines and dots needed to render a system line (e.g. bold-thin-dots..).
     * @param systemLine
     */
    protected createLinesForSystemLine(systemLine: SystemLine): void;
    /**
     * Calculates the summed x-width of a possibly given Instrument Brace and/or Group Bracket(s).
     * @returns {number} the x-width
     */
    protected calcBracketsWidth(): number;
    protected createInstrumentBracket(firstStaffLine: StaffLine, lastStaffLine: StaffLine): void;
    protected createGroupBracket(firstStaffLine: StaffLine, lastStaffLine: StaffLine, recursionDepth: number): void;
    private findFirstVisibleInstrumentInInstrumentalGroup;
    private findLastVisibleInstrumentInInstrumentalGroup;
    /**
     * Update the xPosition of the [[MusicSystem]]'s [[StaffLine]]'s due to [[Label]] positioning.
     * @param systemLabelsRightMargin
     */
    private updateMusicSystemStaffLineXPosition;
}
