SplitterWithSecondHideable (@NotNull JPanel rootPane) { SplitterWithSecondHideable.OnOffListener listener = new SplitterWithSecondHideable.OnOffListener() { @Override public void on(int hideableHeight) { if (hideableHeight == 0) return; getWindow().addComponentListener(new ComponentAdapter() { @Override public void componentResized(ComponentEvent e) { e.getComponent().removeComponentListener(this); refreshDetails(false, true); } }); mySplitter.skipNextLayout(); myDetailsSplitter.getComponent().skipNextLayout(); Dimension dialogSize = getSize(); setSize(dialogSize.width, dialogSize.height + hideableHeight); repaint(); } @Override public void off(int hideableHeight) { if (hideableHeight == 0) return; myDiffDetails.clear(); mySplitter.skipNextLayout(); myDetailsSplitter.getComponent().skipNextLayout(); Dimension dialogSize = getSize(); setSize(dialogSize.width, dialogSize.height - hideableHeight); repaint(); } }; // TODO: there are no reason to use such heavy interface for a simple task. return new SplitterWithSecondHideable(true, message("changes.diff.separator"), rootPane, listener) { @Override protected RefreshablePanel createDetails() { JPanel panel = JBUI.Panels.simplePanel(myDiffDetails.getComponent()); return new RefreshablePanel() { @Override public void refresh() { } @Override public JPanel getPanel() { return panel; } }; } @Override protected float getSplitterInitialProportion() { float value = PropertiesComponent.getInstance().getFloat(DETAILS_SPLITTER_PROPORTION_OPTION, DETAILS_SPLITTER_PROPORTION_OPTION_DEFAULT); return value <= 0.05 || value >= 0.95 ? DETAILS_SPLITTER_PROPORTION_OPTION_DEFAULT : value; } }; }