// GraphTea Project: http://github.com/graphtheorysoftware/GraphTea // Copyright (C) 2012 Graph Theory Software Foundation: http://GraphTheorySoftware.com // Copyright (C) 2008 Mathematical Science Department of Sharif University of Technology // Distributed under the terms of the GNU General Public License (GPL): http://www.gnu.org/licenses/ package graphtea.ui.components.gbody; import graphtea.platform.lang.Pair; import graphtea.ui.components.gsidebar.GSideBarPanel; import javax.swing.*; import java.awt.*; import java.util.ArrayList; import java.util.Iterator; /** * this class is the Body of the GFrame, it is important that the word "Body" here means the body of program plus the * side bar of the program, so it contains a Body pane, and a Split pane . which a vertical split is between them. * * @author azin azadi */ public class GBody extends JPanel { /** * */ private static final long serialVersionUID = 2389438929191166213L; private JSplitPane splitPane = new JSplitPane(); private Component bodyPane; //is side bar hidden private boolean hidden = false; private ArrayList<Pair<Component, String>> showingSideBars = new ArrayList<>(); public void setBodyPane(Component bodyPane) { this.bodyPane = bodyPane; splitPane.setRightComponent(bodyPane); if (hidden) hideSideBar(); } public void showSideBarPane(Component leftPanel, String label) { // int _ = splitPane.getDividerLocation(); Pair<Component, String> p = new Pair<>(leftPanel, label); if (showingSideBars.contains(p)) { return; } showingSideBars.add(p); updateEveryThingInsidebar(); // splitPane.setDividerLocation(_); // splitPane.setDividerLocation(leftPanel.getPreferredSize().width); // spitPane.setDividerSize(2); } private void updateEveryThingInsidebar() { JPanel sp = createTotalSideBarPanel(); hidden = false; splitPane.setRightComponent(bodyPane); splitPane.setLeftComponent(sp); add(splitPane); validate(); } private JPanel createTotalSideBarPanel() { JPanel sp = new JPanel(); makeJPanelFlat(sp); JPanel cur = sp; Iterator<Pair<Component, String>> it = showingSideBars.iterator(); while (it.hasNext()) { Pair<Component, String> stringPair = it.next(); GSideBarPanel sbp = new GSideBarPanel(this, stringPair.first, stringPair.second); if (it.hasNext()) { cur.add(new JSplitPane(JSplitPane.VERTICAL_SPLIT, true, sbp, cur = new JPanel())); makeJPanelFlat(cur); } else { cur.add(sbp); } } return sp; } private void makeJPanelFlat(JPanel p) { p.setBorder(null); p.setLayout(new BorderLayout(0, 0)); } public void hideSideBar(Component c, String label) { showingSideBars.remove(new Pair<>(c, label)); if (showingSideBars.isEmpty()) { hideSideBar(); } else { updateEveryThingInsidebar(); } } public void hideSideBar() { splitPane.remove(bodyPane); remove(splitPane); add(bodyPane); // splitPane.setDividerLocation(0); hidden = true; validate(); // splitPane.setDividerSize(0); } // private Component rightPanel = new JPanel(); // private Component leftPanel = new JPanel(); public GBody() { initComponents(); } private void initComponents() { setBodyPane(new Container()); hideSideBar(); // setBorder(new LineBorder(Color.red,1,true));//new EmptyBorder(0,0,0,0)); setLayout(new BorderLayout()); // add(splitPane); setBorder(null); splitPane.setBorder(null); } }