|
@@ -0,0 +1,148 @@
|
|
|
+package ui.view;
|
|
|
+
|
|
|
+
|
|
|
+ * Copyright (c) 1995, 2008, Oracle and/or its affiliates. All rights reserved.
|
|
|
+ *
|
|
|
+ * Redistribution and use in source and binary forms, with or without
|
|
|
+ * modification, are permitted provided that the following conditions
|
|
|
+ * are met:
|
|
|
+ *
|
|
|
+ * - Redistributions of source code must retain the above copyright
|
|
|
+ * notice, this list of conditions and the following disclaimer.
|
|
|
+ *
|
|
|
+ * - Redistributions in binary form must reproduce the above copyright
|
|
|
+ * notice, this list of conditions and the following disclaimer in the
|
|
|
+ * documentation and/or other materials provided with the distribution.
|
|
|
+ *
|
|
|
+ * - Neither the name of Oracle or the names of its
|
|
|
+ * contributors may be used to endorse or promote products derived
|
|
|
+ * from this software without specific prior written permission.
|
|
|
+ *
|
|
|
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
|
|
|
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
|
|
|
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
|
|
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
|
|
|
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
|
|
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
|
|
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
|
|
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|
|
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
|
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|
|
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
|
+ */
|
|
|
+
|
|
|
+import javax.swing.*;
|
|
|
+import javax.swing.*;
|
|
|
+import javax.swing.plaf.basic.BasicButtonUI;
|
|
|
+import java.awt.*;
|
|
|
+import java.awt.event.*;
|
|
|
+
|
|
|
+
|
|
|
+ * Component to be used as tabComponent;
|
|
|
+ * Contains a JLabel to show the text and
|
|
|
+ * a JButton to close the tab it belongs to
|
|
|
+ */
|
|
|
+public class ButtonTabComponent extends JPanel {
|
|
|
+ private final JTabbedPane pane;
|
|
|
+
|
|
|
+ public ButtonTabComponent(final JTabbedPane pane) {
|
|
|
+
|
|
|
+ super(new FlowLayout(FlowLayout.LEFT, 0, 0));
|
|
|
+ if (pane == null) {
|
|
|
+ throw new NullPointerException("TabbedPane is null");
|
|
|
+ }
|
|
|
+ this.pane = pane;
|
|
|
+ setOpaque(false);
|
|
|
+
|
|
|
+
|
|
|
+ JLabel label = new JLabel() {
|
|
|
+ public String getText() {
|
|
|
+ int i = pane.indexOfTabComponent(ButtonTabComponent.this);
|
|
|
+ if (i != -1) {
|
|
|
+ return pane.getTitleAt(i);
|
|
|
+ }
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ };
|
|
|
+
|
|
|
+ add(label);
|
|
|
+
|
|
|
+ label.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 5));
|
|
|
+
|
|
|
+ JButton button = new TabButton();
|
|
|
+ add(button);
|
|
|
+
|
|
|
+ setBorder(BorderFactory.createEmptyBorder(2, 0, 0, 0));
|
|
|
+ }
|
|
|
+
|
|
|
+ private class TabButton extends JButton implements ActionListener {
|
|
|
+ public TabButton() {
|
|
|
+ int size = 17;
|
|
|
+ setPreferredSize(new Dimension(size, size));
|
|
|
+ setToolTipText("close this tab");
|
|
|
+
|
|
|
+ setUI(new BasicButtonUI());
|
|
|
+
|
|
|
+ setContentAreaFilled(false);
|
|
|
+
|
|
|
+ setFocusable(false);
|
|
|
+ setBorder(BorderFactory.createEtchedBorder());
|
|
|
+ setBorderPainted(false);
|
|
|
+
|
|
|
+
|
|
|
+ addMouseListener(buttonMouseListener);
|
|
|
+ setRolloverEnabled(true);
|
|
|
+
|
|
|
+ addActionListener(this);
|
|
|
+ }
|
|
|
+
|
|
|
+ public void actionPerformed(ActionEvent e) {
|
|
|
+ int i = pane.indexOfTabComponent(ButtonTabComponent.this);
|
|
|
+ if (i != -1) {
|
|
|
+ pane.remove(i);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ public void updateUI() {
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ protected void paintComponent(Graphics g) {
|
|
|
+ super.paintComponent(g);
|
|
|
+ Graphics2D g2 = (Graphics2D) g.create();
|
|
|
+
|
|
|
+ if (getModel().isPressed()) {
|
|
|
+ g2.translate(1, 1);
|
|
|
+ }
|
|
|
+ g2.setStroke(new BasicStroke(2));
|
|
|
+ g2.setColor(Color.BLACK);
|
|
|
+ if (getModel().isRollover()) {
|
|
|
+ g2.setColor(Color.MAGENTA);
|
|
|
+ }
|
|
|
+ int delta = 6;
|
|
|
+ g2.drawLine(delta, delta, getWidth() - delta - 1, getHeight() - delta - 1);
|
|
|
+ g2.drawLine(getWidth() - delta - 1, delta, delta, getHeight() - delta - 1);
|
|
|
+ g2.dispose();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private final static MouseListener buttonMouseListener = new MouseAdapter() {
|
|
|
+ public void mouseEntered(MouseEvent e) {
|
|
|
+ Component component = e.getComponent();
|
|
|
+ if (component instanceof AbstractButton) {
|
|
|
+ AbstractButton button = (AbstractButton) component;
|
|
|
+ button.setBorderPainted(true);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public void mouseExited(MouseEvent e) {
|
|
|
+ Component component = e.getComponent();
|
|
|
+ if (component instanceof AbstractButton) {
|
|
|
+ AbstractButton button = (AbstractButton) component;
|
|
|
+ button.setBorderPainted(false);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ };
|
|
|
+}
|
|
|
+
|