| 1 | package com.jsql.view.swing.menubar; | |
| 2 | ||
| 3 | import com.formdev.flatlaf.intellijthemes.FlatDarkFlatIJTheme; | |
| 4 | import com.formdev.flatlaf.intellijthemes.FlatHighContrastIJTheme; | |
| 5 | import com.formdev.flatlaf.intellijthemes.FlatLightFlatIJTheme; | |
| 6 | import com.formdev.flatlaf.intellijthemes.materialthemeuilite.FlatMTGitHubDarkIJTheme; | |
| 7 | import com.formdev.flatlaf.intellijthemes.materialthemeuilite.FlatMTGitHubIJTheme; | |
| 8 | import com.formdev.flatlaf.themes.FlatMacDarkLaf; | |
| 9 | import com.formdev.flatlaf.themes.FlatMacLightLaf; | |
| 10 | import com.jsql.model.InjectionModel; | |
| 11 | import com.jsql.util.I18nUtil; | |
| 12 | import com.jsql.util.LogLevelUtil; | |
| 13 | import com.jsql.util.PreferencesUtil; | |
| 14 | import com.jsql.view.swing.action.ActionNewWindow; | |
| 15 | import com.jsql.view.swing.dialog.translate.Language; | |
| 16 | import com.jsql.view.swing.panel.PanelPreferences; | |
| 17 | import com.jsql.view.swing.sql.SqlEngine; | |
| 18 | import com.jsql.view.swing.tab.TabHeader; | |
| 19 | import com.jsql.view.swing.util.I18nViewUtil; | |
| 20 | import com.jsql.view.swing.util.MediatorHelper; | |
| 21 | import com.jsql.view.swing.util.RadioItemPreventClose; | |
| 22 | import com.jsql.view.swing.util.UiUtil; | |
| 23 | import org.apache.logging.log4j.LogManager; | |
| 24 | import org.apache.logging.log4j.Logger; | |
| 25 | ||
| 26 | import javax.swing.*; | |
| 27 | import java.awt.*; | |
| 28 | import java.awt.event.ActionEvent; | |
| 29 | import java.awt.event.InputEvent; | |
| 30 | import java.awt.event.KeyEvent; | |
| 31 | import java.awt.event.MouseEvent; | |
| 32 | import java.util.AbstractMap; | |
| 33 | import java.util.Arrays; | |
| 34 | import java.util.Locale; | |
| 35 | import java.util.concurrent.atomic.AtomicBoolean; | |
| 36 | import java.util.concurrent.atomic.AtomicInteger; | |
| 37 | import java.util.prefs.Preferences; | |
| 38 | ||
| 39 | public class MenuWindows extends JMenu { | |
| 40 | ||
| 41 |     private static final Logger LOGGER = LogManager.getRootLogger(); | |
| 42 | ||
| 43 |     private static final String I18N_SQL_ENGINE = "MENUBAR_SQL_ENGINE"; | |
| 44 |     private static final String I18N_PREFERENCES = "MENUBAR_PREFERENCES"; | |
| 45 |     private final AppMenubar appMenubar; | |
| 46 | ||
| 47 |     private final JMenu menuView; | |
| 48 | ||
| 49 |     public MenuWindows(AppMenubar appMenubar) { | |
| 50 |         super(I18nUtil.valueByKey("MENUBAR_WINDOWS")); | |
| 51 |         this.appMenubar = appMenubar; | |
| 52 | ||
| 53 | 
1
1. <init> : removed call to com/jsql/view/swing/menubar/MenuWindows::setName → NO_COVERAGE | 
        this.setName("menuWindows"); | 
| 54 | 
1
1. <init> : removed call to com/jsql/view/swing/util/I18nViewUtil::addComponentForKey → NO_COVERAGE | 
        I18nViewUtil.addComponentForKey("MENUBAR_WINDOWS", this); | 
| 55 | 
1
1. <init> : removed call to com/jsql/view/swing/menubar/MenuWindows::setMnemonic → NO_COVERAGE | 
        this.setMnemonic('W'); | 
| 56 | ||
| 57 |         JMenuItem itemNewWindows = new JMenuItem(new ActionNewWindow()); | |
| 58 | 
1
1. <init> : removed call to com/jsql/view/swing/util/I18nViewUtil::addComponentForKey → NO_COVERAGE | 
        I18nViewUtil.addComponentForKey("NEW_WINDOW_MENU", itemNewWindows); | 
| 59 | ||
| 60 |         this.add(itemNewWindows); | |
| 61 |         var menuAppearance = new JMenu(I18nUtil.valueByKey("MENUBAR_APPEARANCE")); | |
| 62 | 
1
1. <init> : removed call to com/jsql/view/swing/util/I18nViewUtil::addComponentForKey → NO_COVERAGE | 
        I18nViewUtil.addComponentForKey("MENUBAR_APPEARANCE", menuAppearance); | 
| 63 | 
1
1. <init> : removed call to javax/swing/JMenu::setMnemonic → NO_COVERAGE | 
        menuAppearance.setMnemonic('A'); | 
| 64 | ||
| 65 |         JMenuItem itemNewWindows4k = new JMenuItem( | |
| 66 |             new ActionNewWindow("New 4K Window", "-Dsun.java2d.uiScale=2.5") | |
| 67 |         ); | |
| 68 |         menuAppearance.add(itemNewWindows4k); | |
| 69 | ||
| 70 |         var groupRadio = new ButtonGroup(); | |
| 71 |         var menuThemes = new JMenu(I18nUtil.valueByKey("MENUBAR_THEMES")); | |
| 72 | 
1
1. <init> : removed call to com/jsql/view/swing/util/I18nViewUtil::addComponentForKey → NO_COVERAGE | 
        I18nViewUtil.addComponentForKey("MENUBAR_THEMES", menuAppearance); | 
| 73 | 
1
1. <init> : removed call to javax/swing/JMenu::setMnemonic → NO_COVERAGE | 
        menuThemes.setMnemonic('T'); | 
| 74 | ||
| 75 |         Arrays.asList( | |
| 76 |             new AbstractMap.SimpleEntry<>(FlatLightFlatIJTheme.class.getName(), "IntelliJ"), | |
| 77 |             new AbstractMap.SimpleEntry<>(FlatDarkFlatIJTheme.class.getName(), "IntelliJ Dark"), | |
| 78 |             new AbstractMap.SimpleEntry<>(FlatMacLightLaf.class.getName(), "macOS"), | |
| 79 |             new AbstractMap.SimpleEntry<>(FlatMacDarkLaf.class.getName(), "macOS Dark"), | |
| 80 |             new AbstractMap.SimpleEntry<>(FlatMTGitHubIJTheme.class.getName(), "GitHub"), | |
| 81 |             new AbstractMap.SimpleEntry<>(FlatMTGitHubDarkIJTheme.class.getName(), "GitHub Dark"), | |
| 82 |             new AbstractMap.SimpleEntry<>(FlatHighContrastIJTheme.class.getName(), "High contrast") | |
| 83 | 
1
1. <init> : removed call to java/util/List::forEach → NO_COVERAGE | 
        ).forEach(entry -> { | 
| 84 |             JMenuItem item = new RadioItemPreventClose( | |
| 85 |                 new AbstractAction() { | |
| 86 |                     @Override | |
| 87 |                     public void actionPerformed(ActionEvent e) { | |
| 88 | 
1
1. actionPerformed : removed call to com/jsql/view/swing/menubar/AppMenubar::applyTheme → NO_COVERAGE | 
                        AppMenubar.applyTheme(entry.getKey()); | 
| 89 |                     } | |
| 90 |                 } | |
| 91 |             ); | |
| 92 | 
1
1. lambda$new$0 : removed call to javax/swing/JMenuItem::setText → NO_COVERAGE | 
            item.setText(entry.getValue()); | 
| 93 | 
1
1. lambda$new$0 : removed call to javax/swing/JMenuItem::setSelected → NO_COVERAGE | 
            item.setSelected(entry.getKey().equals(MediatorHelper.model().getMediatorUtils().getPreferencesUtil().getThemeFlatLafName())); | 
| 94 | 
1
1. lambda$new$0 : removed call to javax/swing/ButtonGroup::add → NO_COVERAGE | 
            groupRadio.add(item); | 
| 95 |             menuThemes.add(item); | |
| 96 |         }); | |
| 97 | ||
| 98 |         this.add(itemNewWindows); | |
| 99 |         this.add(menuAppearance); | |
| 100 |         this.add(menuThemes); | |
| 101 |         this.add(new JSeparator()); | |
| 102 |         this.add(this.initMenuTranslation()); | |
| 103 |         this.add(new JSeparator()); | |
| 104 | ||
| 105 |         this.menuView = new JMenu(I18nUtil.valueByKey("MENUBAR_VIEW")); | |
| 106 | 
1
1. <init> : removed call to com/jsql/view/swing/util/I18nViewUtil::addComponentForKey → NO_COVERAGE | 
        I18nViewUtil.addComponentForKey("MENUBAR_VIEW", this.menuView); | 
| 107 | 
1
1. <init> : removed call to javax/swing/JMenu::setMnemonic → NO_COVERAGE | 
        this.menuView.setMnemonic('V'); | 
| 108 | ||
| 109 |         AtomicInteger accelerator = new AtomicInteger(0x31); | |
| 110 |         AtomicInteger tabPosition = new AtomicInteger(); | |
| 111 | 
1
1. <init> : removed call to java/util/List::forEach → NO_COVERAGE | 
        MediatorHelper.frame().getTabManagers().getIconsTabs().forEach(entry -> { | 
| 112 |             var menuItem = new JMenuItem(I18nUtil.valueByKey(entry.getKeyLabel()), entry.getIcon()); | |
| 113 | 
1
1. lambda$new$2 : removed call to com/jsql/view/swing/util/I18nViewUtil::addComponentForKey → NO_COVERAGE | 
            I18nViewUtil.addComponentForKey(entry.getKeyLabel(), menuItem); | 
| 114 | 
1
1. lambda$new$2 : removed call to javax/swing/JMenuItem::setName → NO_COVERAGE | 
            menuItem.setName(entry.getKeyLabel());  // required by card manager switch | 
| 115 |             this.menuView.add(menuItem); | |
| 116 | ||
| 117 | 
1
1. lambda$new$2 : removed call to javax/swing/JMenuItem::setAccelerator → NO_COVERAGE | 
            menuItem.setAccelerator(KeyStroke.getKeyStroke( | 
| 118 |                 KeyEvent.getExtendedKeyCodeForChar(accelerator.getAndIncrement()), | |
| 119 |                 InputEvent.CTRL_DOWN_MASK | |
| 120 |             )); | |
| 121 | ||
| 122 |             final var position = tabPosition.get();  // required by closure | |
| 123 | 
1
1. lambda$new$2 : removed call to javax/swing/JMenuItem::addActionListener → NO_COVERAGE | 
            menuItem.addActionListener(actionEvent -> {  // setAction() could set action+text+icon but i18n not easy | 
| 124 |                 CardLayout cardLayout = (CardLayout) MediatorHelper.tabManagersCards().getLayout(); | |
| 125 | 
1
1. lambda$new$1 : removed call to java/awt/CardLayout::show → NO_COVERAGE | 
                cardLayout.show(MediatorHelper.tabManagersCards(), menuItem.getName()); | 
| 126 | 
1
1. lambda$new$1 : removed call to com/jsql/view/swing/tab/TabManagers::setSelectedIndex → NO_COVERAGE | 
                MediatorHelper.frame().getTabManagers().setSelectedIndex(position); | 
| 127 |             }); | |
| 128 |             tabPosition.getAndIncrement(); | |
| 129 |         }); | |
| 130 | ||
| 131 |         this.add(this.menuView); | |
| 132 | ||
| 133 |         Preferences preferences = Preferences.userRoot().node(InjectionModel.class.getName()); | |
| 134 | ||
| 135 |         var menuPanel = new JMenu(I18nUtil.valueByKey("MENUBAR_PANEL")); | |
| 136 | 
1
1. <init> : removed call to com/jsql/view/swing/util/I18nViewUtil::addComponentForKey → NO_COVERAGE | 
        I18nViewUtil.addComponentForKey("MENUBAR_PANEL", menuPanel); | 
| 137 | 
1
1. <init> : removed call to javax/swing/JMenu::setMnemonic → NO_COVERAGE | 
        menuPanel.setMnemonic('C'); | 
| 138 | ||
| 139 |         Arrays.asList( | |
| 140 |             new ModelCheckboxMenu( | |
| 141 |                 "CONSOLE_CHUNK_LABEL", | |
| 142 |                 PreferencesUtil.CHUNK_VISIBLE, | |
| 143 | 
1
1. lambda$new$3 : removed call to com/jsql/view/swing/panel/PanelConsoles::insertChunkTab → NO_COVERAGE | 
                () -> MediatorHelper.panelConsoles().insertChunkTab(), | 
| 144 |                 UiUtil.CHUNK.getIcon() | |
| 145 |             ), | |
| 146 |             new ModelCheckboxMenu( | |
| 147 |                 "CONSOLE_BINARY_LABEL", | |
| 148 |                 PreferencesUtil.BINARY_VISIBLE, | |
| 149 | 
1
1. lambda$new$4 : removed call to com/jsql/view/swing/panel/PanelConsoles::insertBooleanTab → NO_COVERAGE | 
                () -> MediatorHelper.panelConsoles().insertBooleanTab(), | 
| 150 |                 UiUtil.BINARY.getIcon() | |
| 151 |             ), | |
| 152 |             new ModelCheckboxMenu( | |
| 153 |                 "CONSOLE_NETWORK_LABEL", | |
| 154 |                 PreferencesUtil.NETWORK_VISIBLE, | |
| 155 | 
1
1. lambda$new$5 : removed call to com/jsql/view/swing/panel/PanelConsoles::insertNetworkTab → NO_COVERAGE | 
                () -> MediatorHelper.panelConsoles().insertNetworkTab(), | 
| 156 |                 UiUtil.NETWORK.getIcon() | |
| 157 |             ), | |
| 158 |             new ModelCheckboxMenu( | |
| 159 |                 "CONSOLE_JAVA_LABEL", | |
| 160 |                 PreferencesUtil.JAVA_VISIBLE, | |
| 161 | 
1
1. lambda$new$6 : removed call to com/jsql/view/swing/panel/PanelConsoles::insertJavaTab → NO_COVERAGE | 
                () -> MediatorHelper.panelConsoles().insertJavaTab(), | 
| 162 |                 UiUtil.CUP.getIcon() | |
| 163 |             ) | |
| 164 | 
1
1. <init> : removed call to java/util/List::forEach → NO_COVERAGE | 
        ).forEach(model -> { | 
| 165 |             var menuItem = new JCheckBoxMenuItem( | |
| 166 |                 I18nUtil.valueByKey(model.i18n), | |
| 167 |                 model.icon, | |
| 168 |                 preferences.getBoolean(model.keyPref, true) | |
| 169 |             ) { | |
| 170 |                 @Override | |
| 171 |                 protected void processMouseEvent(MouseEvent e) { | |
| 172 | 
1
1. processMouseEvent : negated conditional → NO_COVERAGE | 
                    if (!RadioItemPreventClose.preventClose(e, this)) { | 
| 173 | 
1
1. processMouseEvent : removed call to javax/swing/JCheckBoxMenuItem::processMouseEvent → NO_COVERAGE | 
                        super.processMouseEvent(e); | 
| 174 |                     } | |
| 175 |                 } | |
| 176 |             }; | |
| 177 | 
1
1. lambda$new$8 : removed call to com/jsql/view/swing/util/I18nViewUtil::addComponentForKey → NO_COVERAGE | 
            I18nViewUtil.addComponentForKey(model.i18n, menuItem); | 
| 178 |             menuPanel.add(menuItem); | |
| 179 | ||
| 180 | 
1
1. lambda$new$8 : removed call to com/jsql/view/swing/menubar/MenuWindows$2::addActionListener → NO_COVERAGE | 
            menuItem.addActionListener(actionEvent -> { | 
| 181 | 
1
1. lambda$new$7 : negated conditional → NO_COVERAGE | 
                if (menuItem.isSelected()) { | 
| 182 | 
1
1. lambda$new$7 : removed call to java/lang/Runnable::run → NO_COVERAGE | 
                    model.runnableInsertTab.run(); | 
| 183 |                 } else { | |
| 184 |                     try {  // fix #95874: IndexOutOfBoundsException on remove() | |
| 185 | 
1
1. lambda$new$7 : removed call to com/jsql/view/swing/tab/TabbedPaneWheeled::remove → NO_COVERAGE | 
                        MediatorHelper.tabConsoles().remove(MediatorHelper.tabConsoles().indexOfTab(model.icon)); | 
| 186 |                     } catch (IndexOutOfBoundsException e) {  // should not occur | |
| 187 |                         LOGGER.log(LogLevelUtil.CONSOLE_JAVA, e); | |
| 188 |                     } | |
| 189 |                 } | |
| 190 |             }); | |
| 191 |         }); | |
| 192 | ||
| 193 |         this.add(menuPanel); | |
| 194 |         this.add(new JSeparator()); | |
| 195 |         this.add(this.getMenuItemSqlEngine()); | |
| 196 |         this.add(this.getMenuItemPreferences()); | |
| 197 |     } | |
| 198 | ||
| 199 |     private JMenuItem getMenuItemSqlEngine() { | |
| 200 |         var itemSqlEngine = new JMenuItem(I18nUtil.valueByKey(MenuWindows.I18N_SQL_ENGINE)); | |
| 201 | 
1
1. getMenuItemSqlEngine : removed call to com/jsql/view/swing/util/I18nViewUtil::addComponentForKey → NO_COVERAGE | 
        I18nViewUtil.addComponentForKey(MenuWindows.I18N_SQL_ENGINE, itemSqlEngine); | 
| 202 | 
1
1. getMenuItemSqlEngine : removed call to javax/swing/JMenuItem::setName → NO_COVERAGE | 
        itemSqlEngine.setName("itemSqlEngine"); | 
| 203 | 
1
1. getMenuItemSqlEngine : removed call to javax/swing/JMenuItem::setMnemonic → NO_COVERAGE | 
        itemSqlEngine.setMnemonic('S'); | 
| 204 | ||
| 205 |         // Render the SQL Engine dialog behind scene | |
| 206 |         var titleTabSqlEngine = "SQL Engine"; | |
| 207 | ||
| 208 | 
1
1. getMenuItemSqlEngine : removed call to javax/swing/JMenuItem::addActionListener → NO_COVERAGE | 
        itemSqlEngine.addActionListener(actionEvent -> { | 
| 209 | 
2
1. lambda$getMenuItemSqlEngine$9 : negated conditional → NO_COVERAGE 2. lambda$getMenuItemSqlEngine$9 : changed conditional boundary → NO_COVERAGE  | 
            for (var i = 0 ; i < MediatorHelper.tabResults().getTabCount() ; i++) { | 
| 210 | 
1
1. lambda$getMenuItemSqlEngine$9 : negated conditional → NO_COVERAGE | 
                if (titleTabSqlEngine.equals(MediatorHelper.tabResults().getTitleAt(i))) { | 
| 211 | 
1
1. lambda$getMenuItemSqlEngine$9 : removed call to com/jsql/view/swing/tab/TabResults::setSelectedIndex → NO_COVERAGE | 
                    MediatorHelper.tabResults().setSelectedIndex(i); | 
| 212 |                     return; | |
| 213 |                 } | |
| 214 |             } | |
| 215 | ||
| 216 | 
1
1. lambda$getMenuItemSqlEngine$9 : removed call to com/jsql/view/swing/panel/split/SplitNS::initSplitOrientation → NO_COVERAGE | 
            MediatorHelper.frame().getSplitNS().initSplitOrientation(); | 
| 217 | ||
| 218 |             var panelSqlEngine = new SqlEngine(); | |
| 219 | 
1
1. lambda$getMenuItemSqlEngine$9 : removed call to com/jsql/view/swing/tab/TabResults::addTab → NO_COVERAGE | 
            MediatorHelper.tabResults().addTab(titleTabSqlEngine, panelSqlEngine); | 
| 220 | 
1
1. lambda$getMenuItemSqlEngine$9 : removed call to com/jsql/view/swing/tab/TabResults::setSelectedComponent → NO_COVERAGE | 
            MediatorHelper.tabResults().setSelectedComponent(panelSqlEngine);  // Focus on the new tab | 
| 221 | ||
| 222 |             // Create a custom tab header | |
| 223 |             var header = new TabHeader(I18nViewUtil.valueByKey(MenuWindows.I18N_SQL_ENGINE), UiUtil.COG.getIcon()); | |
| 224 | 
1
1. lambda$getMenuItemSqlEngine$9 : removed call to com/jsql/view/swing/util/I18nViewUtil::addComponentForKey → NO_COVERAGE | 
            I18nViewUtil.addComponentForKey(MenuWindows.I18N_SQL_ENGINE, header.getTabLabel()); | 
| 225 | ||
| 226 |             // Apply the custom header to the tab | |
| 227 | 
1
1. lambda$getMenuItemSqlEngine$9 : removed call to com/jsql/view/swing/tab/TabResults::setTabComponentAt → NO_COVERAGE | 
            MediatorHelper.tabResults().setTabComponentAt(MediatorHelper.tabResults().indexOfComponent(panelSqlEngine), header); | 
| 228 | 
1
1. lambda$getMenuItemSqlEngine$9 : removed call to com/jsql/view/swing/tab/TabResults::updateUI → NO_COVERAGE | 
            MediatorHelper.tabResults().updateUI();  // required: light, open/close prefs, dark => light artifacts | 
| 229 |         }); | |
| 230 | ||
| 231 | 
1
1. getMenuItemSqlEngine : replaced return value with null for com/jsql/view/swing/menubar/MenuWindows::getMenuItemSqlEngine → NO_COVERAGE | 
        return itemSqlEngine; | 
| 232 |     } | |
| 233 | ||
| 234 |     private JMenuItem getMenuItemPreferences() { | |
| 235 |         JMenuItem itemPreferences = new JMenuItem(I18nUtil.valueByKey(MenuWindows.I18N_PREFERENCES), 'P'); | |
| 236 | 
1
1. getMenuItemPreferences : removed call to com/jsql/view/swing/util/I18nViewUtil::addComponentForKey → NO_COVERAGE | 
        I18nViewUtil.addComponentForKey(MenuWindows.I18N_PREFERENCES, itemPreferences); | 
| 237 | 
1
1. getMenuItemPreferences : removed call to javax/swing/JMenuItem::setName → NO_COVERAGE | 
        itemPreferences.setName("itemPreferences"); | 
| 238 | ||
| 239 |         // Render the Preferences dialog behind scene | |
| 240 |         var titleTabPreferences = "Preferences"; | |
| 241 | ||
| 242 | 
1
1. getMenuItemPreferences : removed call to javax/swing/JMenuItem::addActionListener → NO_COVERAGE | 
        itemPreferences.addActionListener(actionEvent -> { | 
| 243 | 
2
1. lambda$getMenuItemPreferences$10 : changed conditional boundary → NO_COVERAGE 2. lambda$getMenuItemPreferences$10 : negated conditional → NO_COVERAGE  | 
            for (var i = 0 ; i < MediatorHelper.tabResults().getTabCount() ; i++) { | 
| 244 | 
1
1. lambda$getMenuItemPreferences$10 : negated conditional → NO_COVERAGE | 
                if (titleTabPreferences.equals(MediatorHelper.tabResults().getTitleAt(i))) { | 
| 245 | 
1
1. lambda$getMenuItemPreferences$10 : removed call to com/jsql/view/swing/tab/TabResults::setSelectedIndex → NO_COVERAGE | 
                    MediatorHelper.tabResults().setSelectedIndex(i); | 
| 246 |                     return; | |
| 247 |                 } | |
| 248 |             } | |
| 249 | ||
| 250 | 
1
1. lambda$getMenuItemPreferences$10 : removed call to com/jsql/view/swing/panel/split/SplitNS::initSplitOrientation → NO_COVERAGE | 
            MediatorHelper.frame().getSplitNS().initSplitOrientation(); | 
| 251 | ||
| 252 |             var panelPreferences = new PanelPreferences(); | |
| 253 | 
1
1. lambda$getMenuItemPreferences$10 : removed call to com/jsql/view/swing/tab/TabResults::addTab → NO_COVERAGE | 
            MediatorHelper.tabResults().addTab(titleTabPreferences, panelPreferences); | 
| 254 | 
1
1. lambda$getMenuItemPreferences$10 : removed call to com/jsql/view/swing/tab/TabResults::setSelectedComponent → NO_COVERAGE | 
            MediatorHelper.tabResults().setSelectedComponent(panelPreferences);  // Focus on the new tab | 
| 255 | ||
| 256 |             // Create a custom tab header | |
| 257 |             var header = new TabHeader(I18nViewUtil.valueByKey(MenuWindows.I18N_PREFERENCES), UiUtil.COG.getIcon()); | |
| 258 | 
1
1. lambda$getMenuItemPreferences$10 : removed call to com/jsql/view/swing/util/I18nViewUtil::addComponentForKey → NO_COVERAGE | 
            I18nViewUtil.addComponentForKey(MenuWindows.I18N_PREFERENCES, header.getTabLabel()); | 
| 259 | ||
| 260 |             // Apply the custom header to the tab | |
| 261 | 
1
1. lambda$getMenuItemPreferences$10 : removed call to com/jsql/view/swing/tab/TabResults::setTabComponentAt → NO_COVERAGE | 
            MediatorHelper.tabResults().setTabComponentAt(MediatorHelper.tabResults().indexOfComponent(panelPreferences), header); | 
| 262 | ||
| 263 | 
1
1. lambda$getMenuItemPreferences$10 : removed call to com/jsql/view/swing/tab/TabResults::updateUI → NO_COVERAGE | 
            MediatorHelper.tabResults().updateUI();  // required: light, open/close prefs, dark => light artifacts | 
| 264 |         }); | |
| 265 | ||
| 266 | 
1
1. getMenuItemPreferences : replaced return value with null for com/jsql/view/swing/menubar/MenuWindows::getMenuItemPreferences → NO_COVERAGE | 
        return itemPreferences; | 
| 267 |     } | |
| 268 | ||
| 269 |     private JMenu initMenuTranslation() { | |
| 270 |         var menuTranslation = new JMenu(I18nUtil.valueByKey("MENUBAR_LANGUAGE")); | |
| 271 | 
1
1. initMenuTranslation : removed call to com/jsql/view/swing/util/I18nViewUtil::addComponentForKey → NO_COVERAGE | 
        I18nViewUtil.addComponentForKey("MENUBAR_LANGUAGE", menuTranslation); | 
| 272 | 
1
1. initMenuTranslation : removed call to javax/swing/JMenu::setName → NO_COVERAGE | 
        menuTranslation.setName("menuTranslation"); | 
| 273 | 
1
1. initMenuTranslation : removed call to javax/swing/JMenu::setMnemonic → NO_COVERAGE | 
        menuTranslation.setMnemonic('L'); | 
| 274 | ||
| 275 |         var groupRadioLanguage = new ButtonGroup(); | |
| 276 |         var atomicIsAnySelected = new AtomicBoolean(false); | |
| 277 | 
1
1. initMenuTranslation : removed call to java/util/List::forEach → NO_COVERAGE | 
        AppMenubar.MODELS_ITEM.forEach(model -> { | 
| 278 | 
3
1. lambda$initMenuTranslation$12 : removed call to java/util/concurrent/atomic/AtomicBoolean::set → NO_COVERAGE 2. lambda$initMenuTranslation$12 : negated conditional → NO_COVERAGE 3. lambda$initMenuTranslation$12 : negated conditional → NO_COVERAGE  | 
            atomicIsAnySelected.set(atomicIsAnySelected.get() || model.getLanguage().isCurrentLanguage()); | 
| 279 | 
1
1. lambda$initMenuTranslation$12 : removed call to com/jsql/view/swing/menubar/ModelItemTranslate::setMenuItem → NO_COVERAGE | 
            model.setMenuItem(new RadioItemPreventClose( | 
| 280 |                 model.getLanguage().getMenuItemLabel(), | |
| 281 |                 model.getLanguage().getFlag(), | |
| 282 |                 model.getLanguage().isCurrentLanguage() | |
| 283 |             )); | |
| 284 | 
1
1. lambda$initMenuTranslation$12 : removed call to javax/swing/JMenuItem::addActionListener → NO_COVERAGE | 
            model.getMenuItem().addActionListener(actionEvent -> { | 
| 285 | 
1
1. lambda$initMenuTranslation$11 : removed call to com/jsql/view/swing/menubar/AppMenubar::switchLocale → NO_COVERAGE | 
                this.appMenubar.switchLocale( | 
| 286 | 
1
1. lambda$initMenuTranslation$11 : negated conditional → NO_COVERAGE | 
                    model.getLanguage() == Language.EN | 
| 287 |                     ? Locale.ROOT  // required as no bundle 'en' | |
| 288 |                     : Locale.forLanguageTag(model.getLanguage().getLanguageTag()) | |
| 289 |                 ); | |
| 290 | 
1
1. lambda$initMenuTranslation$11 : removed call to com/jsql/util/PreferencesUtil::persist → NO_COVERAGE | 
                MediatorHelper.model().getMediatorUtils().getPreferencesUtil().withLanguageTag(model.getLanguage().getLanguageTag()).persist(); | 
| 291 |             }); | |
| 292 |             menuTranslation.add(model.getMenuItem()); | |
| 293 | 
1
1. lambda$initMenuTranslation$12 : removed call to javax/swing/ButtonGroup::add → NO_COVERAGE | 
            groupRadioLanguage.add(model.getMenuItem()); | 
| 294 |         }); | |
| 295 | ||
| 296 | 
2
1. lambda$initMenuTranslation$13 : replaced boolean return with true for com/jsql/view/swing/menubar/MenuWindows::lambda$initMenuTranslation$13 → NO_COVERAGE 2. lambda$initMenuTranslation$13 : negated conditional → NO_COVERAGE  | 
        AppMenubar.MODELS_ITEM.stream().filter(model -> model.getLanguage() == Language.EN) | 
| 297 | 
1
1. initMenuTranslation : removed call to java/util/stream/Stream::forEach → NO_COVERAGE | 
        .forEach(modelItem -> { | 
| 298 | 
2
1. lambda$initMenuTranslation$14 : negated conditional → NO_COVERAGE 2. lambda$initMenuTranslation$14 : removed call to javax/swing/JMenuItem::setSelected → NO_COVERAGE  | 
            modelItem.getMenuItem().setSelected(!atomicIsAnySelected.get()); | 
| 299 | 
1
1. lambda$initMenuTranslation$14 : removed call to javax/swing/JMenuItem::setName → NO_COVERAGE | 
            modelItem.getMenuItem().setName("itemEnglish"); | 
| 300 |         }); | |
| 301 | 
2
1. lambda$initMenuTranslation$15 : negated conditional → NO_COVERAGE 2. lambda$initMenuTranslation$15 : replaced boolean return with true for com/jsql/view/swing/menubar/MenuWindows::lambda$initMenuTranslation$15 → NO_COVERAGE  | 
        AppMenubar.MODELS_ITEM.stream().filter(model -> model.getLanguage() == Language.RU) | 
| 302 | 
2
1. initMenuTranslation : removed call to java/util/stream/Stream::forEach → NO_COVERAGE 2. lambda$initMenuTranslation$16 : removed call to javax/swing/JMenuItem::setName → NO_COVERAGE  | 
        .forEach(modelItem -> modelItem.getMenuItem().setName("itemRussian")); | 
| 303 | 
2
1. lambda$initMenuTranslation$17 : replaced boolean return with true for com/jsql/view/swing/menubar/MenuWindows::lambda$initMenuTranslation$17 → NO_COVERAGE 2. lambda$initMenuTranslation$17 : negated conditional → NO_COVERAGE  | 
        AppMenubar.MODELS_ITEM.stream().filter(model -> model.getLanguage() == Language.AR) | 
| 304 | 
2
1. initMenuTranslation : removed call to java/util/stream/Stream::forEach → NO_COVERAGE 2. lambda$initMenuTranslation$18 : removed call to javax/swing/JMenuItem::setComponentOrientation → NO_COVERAGE  | 
        .forEach(modelItem -> modelItem.getMenuItem().setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT)); | 
| 305 | ||
| 306 | 
1
1. initMenuTranslation : replaced return value with null for com/jsql/view/swing/menubar/MenuWindows::initMenuTranslation → NO_COVERAGE | 
        return menuTranslation; | 
| 307 |     } | |
| 308 | ||
| 309 |     public void switchLocaleFromPreferences() { | |
| 310 |         AppMenubar.MODELS_ITEM.stream() | |
| 311 | 
2
1. lambda$switchLocaleFromPreferences$19 : replaced boolean return with false for com/jsql/view/swing/menubar/MenuWindows::lambda$switchLocaleFromPreferences$19 → NO_COVERAGE 2. lambda$switchLocaleFromPreferences$19 : replaced boolean return with true for com/jsql/view/swing/menubar/MenuWindows::lambda$switchLocaleFromPreferences$19 → NO_COVERAGE  | 
        .filter(model -> model.getLanguage().getLanguageTag().equals( | 
| 312 |             MediatorHelper.model().getMediatorUtils().getPreferencesUtil().getLanguageTag() | |
| 313 |         )) | |
| 314 | 
2
1. lambda$switchLocaleFromPreferences$20 : removed call to javax/swing/JMenuItem::doClick → NO_COVERAGE 2. switchLocaleFromPreferences : removed call to java/util/stream/Stream::forEach → NO_COVERAGE  | 
        .forEach(modelItem -> modelItem.getMenuItem().doClick()); | 
| 315 |     } | |
| 316 | ||
| 317 | ||
| 318 |     // Getter and setter | |
| 319 | ||
| 320 |     public JMenu getMenuView() { | |
| 321 | 
1
1. getMenuView : replaced return value with null for com/jsql/view/swing/menubar/MenuWindows::getMenuView → NO_COVERAGE | 
        return this.menuView; | 
| 322 |     } | |
| 323 | } | |
Mutations | ||
| 53 | 
 
 1.1  | 
|
| 54 | 
 
 1.1  | 
|
| 55 | 
 
 1.1  | 
|
| 58 | 
 
 1.1  | 
|
| 62 | 
 
 1.1  | 
|
| 63 | 
 
 1.1  | 
|
| 72 | 
 
 1.1  | 
|
| 73 | 
 
 1.1  | 
|
| 83 | 
 
 1.1  | 
|
| 88 | 
 
 1.1  | 
|
| 92 | 
 
 1.1  | 
|
| 93 | 
 
 1.1  | 
|
| 94 | 
 
 1.1  | 
|
| 106 | 
 
 1.1  | 
|
| 107 | 
 
 1.1  | 
|
| 111 | 
 
 1.1  | 
|
| 113 | 
 
 1.1  | 
|
| 114 | 
 
 1.1  | 
|
| 117 | 
 
 1.1  | 
|
| 123 | 
 
 1.1  | 
|
| 125 | 
 
 1.1  | 
|
| 126 | 
 
 1.1  | 
|
| 136 | 
 
 1.1  | 
|
| 137 | 
 
 1.1  | 
|
| 143 | 
 
 1.1  | 
|
| 149 | 
 
 1.1  | 
|
| 155 | 
 
 1.1  | 
|
| 161 | 
 
 1.1  | 
|
| 164 | 
 
 1.1  | 
|
| 172 | 
 
 1.1  | 
|
| 173 | 
 
 1.1  | 
|
| 177 | 
 
 1.1  | 
|
| 180 | 
 
 1.1  | 
|
| 181 | 
 
 1.1  | 
|
| 182 | 
 
 1.1  | 
|
| 185 | 
 
 1.1  | 
|
| 201 | 
 
 1.1  | 
|
| 202 | 
 
 1.1  | 
|
| 203 | 
 
 1.1  | 
|
| 208 | 
 
 1.1  | 
|
| 209 | 
 
 1.1 2.2  | 
|
| 210 | 
 
 1.1  | 
|
| 211 | 
 
 1.1  | 
|
| 216 | 
 
 1.1  | 
|
| 219 | 
 
 1.1  | 
|
| 220 | 
 
 1.1  | 
|
| 224 | 
 
 1.1  | 
|
| 227 | 
 
 1.1  | 
|
| 228 | 
 
 1.1  | 
|
| 231 | 
 
 1.1  | 
|
| 236 | 
 
 1.1  | 
|
| 237 | 
 
 1.1  | 
|
| 242 | 
 
 1.1  | 
|
| 243 | 
 
 1.1 2.2  | 
|
| 244 | 
 
 1.1  | 
|
| 245 | 
 
 1.1  | 
|
| 250 | 
 
 1.1  | 
|
| 253 | 
 
 1.1  | 
|
| 254 | 
 
 1.1  | 
|
| 258 | 
 
 1.1  | 
|
| 261 | 
 
 1.1  | 
|
| 263 | 
 
 1.1  | 
|
| 266 | 
 
 1.1  | 
|
| 271 | 
 
 1.1  | 
|
| 272 | 
 
 1.1  | 
|
| 273 | 
 
 1.1  | 
|
| 277 | 
 
 1.1  | 
|
| 278 | 
 
 1.1 2.2 3.3  | 
|
| 279 | 
 
 1.1  | 
|
| 284 | 
 
 1.1  | 
|
| 285 | 
 
 1.1  | 
|
| 286 | 
 
 1.1  | 
|
| 290 | 
 
 1.1  | 
|
| 293 | 
 
 1.1  | 
|
| 296 | 
 
 1.1 2.2  | 
|
| 297 | 
 
 1.1  | 
|
| 298 | 
 
 1.1 2.2  | 
|
| 299 | 
 
 1.1  | 
|
| 301 | 
 
 1.1 2.2  | 
|
| 302 | 
 
 1.1 2.2  | 
|
| 303 | 
 
 1.1 2.2  | 
|
| 304 | 
 
 1.1 2.2  | 
|
| 306 | 
 
 1.1  | 
|
| 311 | 
 
 1.1 2.2  | 
|
| 314 | 
 
 1.1 2.2  | 
|
| 321 | 
 
 1.1  |