void (Element parentNode) { parentNode.setAttribute(NAME_ATTR, getName()); parentNode.setAttribute(VERSION_ATTR, Integer.toString(version)); /* * FONT_SCALE is used to correctly identify the font size in both the JRE-managed HiDPI mode and * the IDE-managed HiDPI mode: {@link UIUtil#isJreHiDPIEnabled()}. Also, it helps to distinguish * the "hidpi-aware" scheme version from the previous one. Namely, the absence of the FONT_SCALE * attribute in the scheme indicates the previous "hidpi-unaware" scheme and the restored font size * is reset to default. It's assumed this (transition case) happens only once, after which the IDE * will be able to restore the font size according to its scale and the IDE HiDPI mode. The default * FONT_SCALE value should also be written for that reason. */ if (!(fontPreferences instanceof DelegatingFontPreferences) || !(consoleFontPreferences instanceof DelegatingFontPreferences)) { // must precede font options JdomKt.addOptionTag(parentNode, FONT_SCALE, String.valueOf(UISettings.getDefFontScale())); } if (parentScheme != null && parentScheme != EmptyColorScheme.INSTANCE) { parentNode.setAttribute(PARENT_SCHEME_ATTR, parentScheme.getName()); } if (!"true".equals(metaInfo.getProperty(META_INFO_PARTIAL)) && !isReadOnly() && getBaseScheme() != parentScheme) { metaInfo.setProperty(META_INFO_PARTIAL, "true"); } if (!metaInfo.isEmpty()) { parentNode.addContent(metaInfoToElement()); } // IJ has used a 'single customizable font' mode for ages. That's why we want to support that format now, when it's possible // to specify a font sequence (see getFontPreferences()), there are big chances that many clients still will use a single font. // That's why we want to use an old format when zero or one font is selected and 'extended' format otherwise. boolean useOldFontFormat = fontPreferences.getEffectiveFontFamilies().size() <= 1; if (!(fontPreferences instanceof DelegatingFontPreferences)) { JdomKt.addOptionTag(parentNode, LINE_SPACING, String.valueOf(getLineSpacing())); if (useOldFontFormat) { JdomKt.addOptionTag(parentNode, EDITOR_FONT_SIZE, String.valueOf(getEditorFontSize())); JdomKt.addOptionTag(parentNode, EDITOR_FONT_NAME, fontPreferences.getFontFamily()); } else { writeFontPreferences(EDITOR_FONT, parentNode, fontPreferences); } writeLigaturesPreferences(parentNode, fontPreferences, EDITOR_LIGATURES); } if (!(consoleFontPreferences instanceof DelegatingFontPreferences)) { if (consoleFontPreferences.getEffectiveFontFamilies().size() <= 1) { JdomKt.addOptionTag(parentNode, CONSOLE_FONT_NAME, getConsoleFontName()); if (getConsoleFontSize() != getEditorFontSize()) { // Write font size as integer for compatibility JdomKt.addOptionTag(parentNode, CONSOLE_FONT_SIZE, Integer.toString(getConsoleFontSize())); } } else { writeFontPreferences(CONSOLE_FONT, parentNode, consoleFontPreferences); } writeLigaturesPreferences(parentNode, consoleFontPreferences, CONSOLE_LIGATURES); if ((fontPreferences instanceof DelegatingFontPreferences) || getConsoleLineSpacing() != getLineSpacing()) { JdomKt.addOptionTag(parentNode, CONSOLE_LINE_SPACING, Float.toString(getConsoleLineSpacing())); } } Element colorElements = new Element(COLORS_ELEMENT); Element attrElements = new Element(ATTRIBUTES_ELEMENT); writeColors(colorElements); writeAttributes(attrElements); if (!colorElements.getChildren().isEmpty()) { parentNode.addContent(colorElements); } if (!attrElements.getChildren().isEmpty()) { parentNode.addContent(attrElements); } setSaveNeeded(false); }