/*
 * FindBugs - Find Bugs in Java programs
 * Copyright (C) 2006, University of Maryland
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */

package edu.umd.cs.findbugs.gui2;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;

import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JPanel;
import javax.swing.JSplitPane;
import javax.swing.border.Border;
import javax.swing.border.EmptyBorder;
import javax.swing.border.LineBorder;
import javax.swing.plaf.basic.BasicSplitPaneDivider;
import javax.swing.plaf.basic.BasicSplitPaneUI;

import edu.umd.cs.findbugs.L10N;

/**
 * @author pugh
 */
public class SplitLayout implements FindBugsLayoutManager {

    final MainFrame frame;

    JLabel sourceTitle;

    JSplitPane topLeftSPane;

    JSplitPane topSPane;

    JSplitPane summarySPane;

    JSplitPane mainSPane;

    JButton viewSource = new JButton("View in browser");

    /**
     * @param frame
     */
    public SplitLayout(MainFrame frame) {
        this.frame = frame;
    }

    /*
     * (non-Javadoc)
     * 
     * @see edu.umd.cs.findbugs.gui2.FindBugsLayoutManager#createWindowMenu()
     */
    public JMenu createWindowMenu() {
        return null;
    }

    public void resetCommentsInputPane() {
        if (topLeftSPane != null) {
            int position = topLeftSPane.getDividerLocation();
            topLeftSPane.setRightComponent(frame.createCommentsInputPanel());
            topLeftSPane.setDividerLocation(position);
        }
    }

    /*
     * (non-Javadoc)
     * 
     * @see edu.umd.cs.findbugs.gui2.FindBugsLayoutManager#initialize()
     */
    public void initialize() {

        Font buttonFont = viewSource.getFont();
        viewSource.setFont(buttonFont.deriveFont(buttonFont.getSize() / 2));
        viewSource.setPreferredSize(new Dimension(150, 15));
        viewSource.setEnabled(false);

        topLeftSPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, frame.mainFrameTree.bugListPanel(),
                frame.createCommentsInputPanel());
        topLeftSPane.setOneTouchExpandable(true);
        topLeftSPane.setContinuousLayout(true);
        topLeftSPane.setDividerLocation(GUISaveState.getInstance().getSplitTreeComments());
        removeSplitPaneBorders(topLeftSPane);

        JPanel sourceTitlePanel = new JPanel();
        sourceTitlePanel.setLayout(new BorderLayout());

        JPanel sourcePanel = new JPanel();
        BorderLayout sourcePanelLayout = new BorderLayout();
        sourcePanelLayout.setHgap(3);
        sourcePanelLayout.setVgap(3);
        sourcePanel.setLayout(sourcePanelLayout);
        sourceTitle = new JLabel();
        sourceTitle.setText(L10N.getLocalString("txt.source_listing", ""));

        sourceTitlePanel.setBorder(new EmptyBorder(3, 3, 3, 3));
        sourceTitlePanel.add(viewSource, BorderLayout.EAST);
        sourceTitlePanel.add(sourceTitle, BorderLayout.CENTER);

        sourcePanel.setBorder(new LineBorder(Color.GRAY));
        sourcePanel.add(sourceTitlePanel, BorderLayout.NORTH);
        sourcePanel.add(frame.createSourceCodePanel(), BorderLayout.CENTER);
        sourcePanel.add(frame.createSourceSearchPanel(), BorderLayout.SOUTH);
        topSPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, topLeftSPane, sourcePanel);
        topSPane.setOneTouchExpandable(true);
        topSPane.setContinuousLayout(true);
        topSPane.setDividerLocation(GUISaveState.getInstance().getSplitTop());
        removeSplitPaneBorders(topSPane);

        summarySPane = frame.summaryTab();
        mainSPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, topSPane, summarySPane);
        mainSPane.setOneTouchExpandable(true);
        mainSPane.setContinuousLayout(true);
        mainSPane.setDividerLocation(GUISaveState.getInstance().getSplitMain());
        removeSplitPaneBorders(mainSPane);

        frame.setLayout(new BorderLayout());
        frame.add(mainSPane, BorderLayout.CENTER);
        frame.add(frame.statusBar(), BorderLayout.SOUTH);

    }

    private void removeSplitPaneBorders(JSplitPane pane) {
        pane.setUI(new BasicSplitPaneUI() {
            @Override
            public BasicSplitPaneDivider createDefaultDivider() {
                return new BasicSplitPaneDivider(this) {
                    @Override
                    public void setBorder(Border b) {
                    }
                };
            }
        });
        pane.setBorder(new EmptyBorder(3, 3, 3, 3));
    }

    /*
     * (non-Javadoc)
     * 
     * @see edu.umd.cs.findbugs.gui2.FindBugsLayoutManager#makeCommentsVisible()
     */
    public void makeCommentsVisible() {

    }

    /*
     * (non-Javadoc)
     * 
     * @see edu.umd.cs.findbugs.gui2.FindBugsLayoutManager#makeSourceVisible()
     */
    public void makeSourceVisible() {

    }

    /*
     * (non-Javadoc)
     * 
     * @see edu.umd.cs.findbugs.gui2.FindBugsLayoutManager#saveState()
     */
    public void saveState() {
        GUISaveState.getInstance().setSplitTreeComments(topLeftSPane.getDividerLocation());
        GUISaveState.getInstance().setSplitTop(topSPane.getDividerLocation());
        GUISaveState.getInstance().setSplitSummary(summarySPane.getDividerLocation());
        GUISaveState.getInstance().setSplitMain(mainSPane.getDividerLocation());
    }

    /*
     * (non-Javadoc)
     * 
     * @see
     * edu.umd.cs.findbugs.gui2.FindBugsLayoutManager#setSourceTitle(java.lang
     * .String)
     */
    public void setSourceTitle(String title) {
        sourceTitle.setText(title);

    }

    /*
     * (non-Javadoc)
     * 
     * @see
     * edu.umd.cs.findbugs.gui2.FindBugsLayoutManager#getSourceTitleComponent()
     */
    public JComponent getSourceViewComponent() {
        return viewSource;
    }

}
