/* * 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 edu.umd.cs.findbugs.L10N; import java.awt.BorderLayout; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import java.awt.event.KeyEvent; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; import javax.swing.JCheckBoxMenuItem; import javax.swing.JMenu; import net.infonode.docking.DockingWindow; import net.infonode.docking.DockingWindowAdapter; import net.infonode.docking.DockingWindowListener; import net.infonode.docking.RootWindow; import net.infonode.docking.SplitWindow; import net.infonode.docking.TabWindow; import net.infonode.docking.View; import net.infonode.docking.theme.DockingWindowsTheme; import net.infonode.docking.theme.ShapedGradientDockingTheme; import net.infonode.docking.title.DockingWindowTitleProvider; import net.infonode.docking.util.DockingUtil; import net.infonode.docking.util.ViewMap; /** * @author pugh */ public class DockLayout implements FindBugsLayoutManager { private static class DockParentListener extends DockingWindowAdapter { @Override public void windowClosed(DockingWindow window) { // Notify all children's listeners ArrayList<DockingWindow> children = new ArrayList<DockingWindow>(); for (int i = 0; i < window.getChildWindowCount(); i++) children.add(window.getChildWindow(i)); for (DockingWindow i : children) i.close(); } } private class ViewMenuItem extends JCheckBoxMenuItem implements ItemListener { private View view; public ViewMenuItem(View view, String title) { super(title, true); addItemListener(this); this.view = view; // view.addListener(new Listener()); } // Menu item has been checked or unchecked public void itemStateChanged(ItemEvent evt) { if (evt.getStateChange() == ItemEvent.SELECTED) DockingUtil.addWindow(view, rootWindow); if (evt.getStateChange() == ItemEvent.DESELECTED) view.close(); } // private class Listener extends DockingWindowAdapter // { // @Override // public void windowAdded(DockingWindow addedToWindow, DockingWindow addedWindow) // { // if (addedWindow.equals(view)) // ViewMenuItem.this.setSelected(true); // } // // @Override // public void windowRemoved(DockingWindow removedFromWindow, DockingWindow removedWindow) // { // if (removedWindow.equals(view)) // ViewMenuItem.this.setSelected(false); // } // } } private View commentsView = null; final MainFrame frame; private RootWindow rootWindow; private View sourceView = null; private View summaryView = null; private TabWindow tabs = null; private View topView = null; private Map<View, ViewMenuItem> viewMenuItems = null; /** * @param frame */ public DockLayout(MainFrame frame) { this.frame = frame; } /* (non-Javadoc) * @see edu.umd.cs.findbugs.gui2.LayoutManager#createWindowMenu() */ public JMenu createWindowMenu() { viewMenuItems = new HashMap<View, ViewMenuItem>(); viewMenuItems.put(summaryView, new ViewMenuItem(summaryView, "Bug summary")); viewMenuItems.put(commentsView, new ViewMenuItem(commentsView, "Comments")); viewMenuItems.put(sourceView, new ViewMenuItem(sourceView, "Source code")); JMenu windowMenu = new JMenu("Window"); windowMenu.setMnemonic(KeyEvent.VK_W); windowMenu.add(viewMenuItems.get(summaryView)); windowMenu.add(viewMenuItems.get(commentsView)); windowMenu.add(viewMenuItems.get(sourceView)); return windowMenu; } /* (non-Javadoc) * @see edu.umd.cs.findbugs.gui2.LayoutManager#initialize() */ public void initialize() { ViewMap viewMap = new ViewMap(); topView = new View(L10N.getLocalString("view.bugs", "Bugs"), null, frame.bugListPanel()); topView.getWindowProperties().setCloseEnabled(false); viewMap.addView(0, topView); summaryView = new View(L10N.getLocalString("view.bug_summary", "Bug Summary"), null, frame.summaryTab()); viewMap.addView(1, summaryView); commentsView = new View(L10N.getLocalString("view.comments", "Comments"), null, frame.createCommentsInputPanel()); viewMap.addView(2, commentsView); sourceView = new View(L10N.getLocalString("view.source", "Source"), null, frame.createSourceCodePanel()); viewMap.addView(3, sourceView); rootWindow = DockingUtil.createRootWindow(viewMap, true); tabs = new TabWindow(new DockingWindow[]{summaryView, commentsView, sourceView}); tabs.addListener(new DockParentListener()); tabs.setSelectedTab(0); // tabs.getWindowProperties().setCloseEnabled(false); rootWindow.setWindow(new SplitWindow(false, 0.4f, topView, tabs)); DockingWindowsTheme theme = new ShapedGradientDockingTheme(); rootWindow.getRootWindowProperties().addSuperObject(theme.getRootWindowProperties()); try { rootWindow.read(new ObjectInputStream(new ByteArrayInputStream(GUISaveState.getInstance().getDockingLayout())), true); } catch (IOException e) {} DockingWindowListener listener = new DockingWindowAdapter() { @Override public void windowAdded(DockingWindow addedToWindow, DockingWindow addedWindow) { viewMenuItems.get(addedWindow).setSelected(true); addedToWindow.addListener(new DockParentListener()); } @Override public void windowClosed(DockingWindow window) { viewMenuItems.get(window).setSelected(false); } }; summaryView.addListener(listener); commentsView.addListener(listener); sourceView.addListener(listener); frame.setLayout(new BorderLayout()); frame.add(rootWindow, BorderLayout.CENTER); frame.add(frame.statusBar(), BorderLayout.SOUTH); } /* (non-Javadoc) * @see edu.umd.cs.findbugs.gui2.LayoutManager#makeCommentsVisible() */ public void makeCommentsVisible() { commentsView.makeVisible(); } /* (non-Javadoc) * @see edu.umd.cs.findbugs.gui2.LayoutManager#makeSourceVisible() */ public void makeSourceVisible() { sourceView.makeVisible(); } /* (non-Javadoc) * @see edu.umd.cs.findbugs.gui2.LayoutManager#saveState() */ public void saveState() { try { // FIXME this is writing the wrong array and I don't know why ByteArrayOutputStream dockingLayout = new ByteArrayOutputStream(); ObjectOutputStream out = new ObjectOutputStream(dockingLayout); rootWindow.write(out, true); out.close(); GUISaveState.getInstance().setDockingLayout(dockingLayout.toByteArray()); } catch (IOException e) {} } /* (non-Javadoc) * @see edu.umd.cs.findbugs.gui2.LayoutManager#setSourceTitle(java.lang.String) */ public void setSourceTitle(final String title) { sourceView.getWindowProperties().setTitleProvider(new DockingWindowTitleProvider(){ public String getTitle(DockingWindow arg0) { return title; } }); } }