From cb4a685c2fea8235761e4687c2f99e8d55937730 Mon Sep 17 00:00:00 2001 From: Kirill Kalishev Date: Wed, 28 Feb 2007 15:10:14 +0300 Subject: [PATCH] debugger relayout to new tabs - 3 --- ui/impl/com/intellij/ui/tabs/TabInfo.java | 2 +- ui/impl/com/intellij/ui/tabs/TabsWithActions.java | 139 ++++++++++++++++++---- 2 files changed, 120 insertions(+), 21 deletions(-) diff --git a/ui/impl/com/intellij/ui/tabs/TabInfo.java b/ui/impl/com/intellij/ui/tabs/TabInfo.java index 2b388cdc62..75c6216e00 100644 --- a/ui/impl/com/intellij/ui/tabs/TabInfo.java +++ b/ui/impl/com/intellij/ui/tabs/TabInfo.java @@ -47,7 +47,7 @@ public final class TabInfo { return myGroup; } - JComponent getComponent() { + public JComponent getComponent() { return myComponent; } diff --git a/ui/impl/com/intellij/ui/tabs/TabsWithActions.java b/ui/impl/com/intellij/ui/tabs/TabsWithActions.java index 245e5272d3..eeea58017e 100644 --- a/ui/impl/com/intellij/ui/tabs/TabsWithActions.java +++ b/ui/impl/com/intellij/ui/tabs/TabsWithActions.java @@ -29,7 +29,7 @@ public class TabsWithActions extends JComponent implements PropertyChangeListene private List myInfos = new ArrayList(); private TabInfo mySelectedInfo; - private Map myInfo2Label = new HashMap(); + private Map myInfo2Label = new HashMap(); private Map myInfo2Toolbar = new HashMap(); private Dimension myHeaderFitSize; private Rectangle mySelectedBounds; @@ -42,28 +42,36 @@ public class TabsWithActions extends JComponent implements PropertyChangeListene myActionManager = actionManager; } - public TabInfo addTab(JComponent component) { + public TabInfo addTab(JComponent component, int index) { final TabInfo info = new TabInfo(component); info.getChangeSupport().addPropertyChangeListener(this); add(component); - final JLabel label = new JLabel("???"); - label.addMouseListener(new MouseAdapter() { - public void mousePressed(final MouseEvent e) { - if (e.getClickCount() == 1 && e.getButton() == MouseEvent.BUTTON1) { - setSelected(info); - } - } - }); - label.setBorder(new EmptyBorder(4, 8, 4, 8)); + final TabLabel label = new TabLabel(info); myInfo2Label.put(info, label); - myInfos.add(info); + + if (index < 0) { + myInfos.add(0, info); + } else if (index > myInfos.size() - 1) { + myInfos.add(info); + } else { + myInfos.add(index, info); + } + add(label); - update(); - updateListeners(); + updateAll(); return info; } + public TabInfo addTab(JComponent component) { + return addTab(component, -1); + } + + + private void updateAll() { + update(); + updateListeners(); + } public void setSelected(final TabInfo info) { mySelectedInfo = info; @@ -91,8 +99,11 @@ public class TabsWithActions extends JComponent implements PropertyChangeListene update(); } - private @Nullable - TabInfo getSelectedInfo() { + @Nullable + public TabInfo getSelectedInfo() { + if (!myInfos.contains(mySelectedInfo)) { + mySelectedInfo = null; + } return mySelectedInfo != null ? mySelectedInfo : (myInfos.size() > 0 ? myInfos.get(0) : null); } @@ -112,7 +123,7 @@ public class TabsWithActions extends JComponent implements PropertyChangeListene final TabInfo selected = getSelectedInfo(); mySelectedBounds = null; for (TabInfo eachInfo : myInfos) { - final JLabel label = myInfo2Label.get(eachInfo); + final TabLabel label = myInfo2Label.get(eachInfo); final Dimension eachSize = label.getPreferredSize(); label.setBounds(currentX, insets.top, eachSize.width, myHeaderFitSize.height); currentX += eachSize.width; @@ -195,7 +206,7 @@ public class TabsWithActions extends JComponent implements PropertyChangeListene private Max computeMaxSize() { Max max = new Max(); for (TabInfo eachInfo : myInfos) { - final JLabel label = myInfo2Label.get(eachInfo); + final TabLabel label = myInfo2Label.get(eachInfo); max.myLabel.height = Math.max(max.myLabel.height, label.getPreferredSize().height); max.myLabel.width = Math.max(max.myLabel.width, label.getPreferredSize().width); final JComponent toolbar = myInfo2Toolbar.get(eachInfo); @@ -214,6 +225,60 @@ public class TabsWithActions extends JComponent implements PropertyChangeListene return myInfos.size(); } + public void removeTab(final JComponent component) { + removeTab(findInfo(component)); + } + + public void removeTab(TabInfo info) { + if (info == null) return; + + remove(myInfo2Label.get(info)); + final JComponent tb = myInfo2Toolbar.get(info); + if (tb != null) { + remove(tb); + } + remove(info.getComponent()); + + myInfos.remove(info); + myInfo2Label.remove(info); + myInfo2Toolbar.remove(info); + + updateAll(); + } + + public TabInfo findInfo(Component component) { + for (TabInfo each : myInfos) { + if (each.getComponent() == component) return each; + } + + return null; + } + + public TabInfo findInfo(MouseEvent event) { + final Point src = event.getPoint(); + final Point point = SwingUtilities.convertPoint(event.getComponent(), src, this); + Component component = findComponentAt(point); + if (component == null) return null; + while (component != this || component != null) { + if (component instanceof TabLabel) { + return ((TabLabel)component).getInfo(); + } else { + final TabInfo info = findInfo(component); + if (info != null) return info; + } + component = component.getParent(); + } + + return null; + } + + public void removeAllTabs() { + final TabInfo[] infos = (TabInfo[])myInfos.toArray(new TabInfo[myInfos.size()]); + for (TabInfo each : infos) { + removeTab(each); + } + } + private class Max { Dimension myLabel = new Dimension(); Dimension myToolbar = new Dimension(); @@ -242,7 +307,7 @@ public class TabsWithActions extends JComponent implements PropertyChangeListene private void addListeners() { for (TabInfo eachInfo : myInfos) { - final JLabel label = myInfo2Label.get(eachInfo); + final TabLabel label = myInfo2Label.get(eachInfo); for (MouseListener eachListener : myTabListeners) { label.addMouseListener(eachListener); } @@ -251,7 +316,7 @@ public class TabsWithActions extends JComponent implements PropertyChangeListene private void removeListeners() { for (TabInfo eachInfo : myInfos) { - final JLabel label = myInfo2Label.get(eachInfo); + final TabLabel label = myInfo2Label.get(eachInfo); for (MouseListener eachListener : myTabListeners) { label.removeMouseListener(eachListener); } @@ -263,6 +328,40 @@ public class TabsWithActions extends JComponent implements PropertyChangeListene addListeners(); } + + private class TabLabel extends JPanel { + private JLabel myLabel = new JLabel(); + private TabInfo myInfo; + + public TabLabel(final TabInfo info) { + myInfo = info; + setOpaque(false); + setLayout(new BorderLayout()); + add(myLabel, BorderLayout.CENTER); + + addMouseListener(new MouseAdapter() { + public void mousePressed(final MouseEvent e) { + if (e.getClickCount() == 1 && e.getButton() == MouseEvent.BUTTON1) { + setSelected(info); + } + } + }); + setBorder(new EmptyBorder(4, 8, 4, 8)); + } + + public void setText(final String text) { + myLabel.setText(text); + } + + public void setIcon(final Icon icon) { + myLabel.setIcon(icon); + } + + public TabInfo getInfo() { + return myInfo; + } + } + public static void main(String[] args) { final JFrame frame = new JFrame(); frame.getContentPane().setLayout(new BorderLayout()); -- 2.11.4.GIT