1/*
2 * Copyright (c) 1998, 2003, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.  Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26package javax.swing.plaf.metal;
27
28import java.awt.*;
29import java.awt.event.*;
30import javax.swing.*;
31import javax.swing.border.*;
32import javax.swing.plaf.*;
33import java.beans.*;
34import java.util.EventListener;
35import java.io.Serializable;
36import javax.swing.plaf.basic.BasicDesktopIconUI;
37
38/**
39 * Metal desktop icon.
40 *
41 * @author Steve Wilson
42 */
43public class MetalDesktopIconUI extends BasicDesktopIconUI
44{
45
46    JButton button;
47    JLabel label;
48    TitleListener titleListener;
49    private int width;
50
51    /**
52     * Constructs a new instance of {@code MetalDesktopIconUI}.
53     *
54     * @param c a component
55     * @return a new instance of {@code MetalDesktopIconUI}
56     */
57    public static ComponentUI createUI(JComponent c)    {
58        return new MetalDesktopIconUI();
59    }
60
61    /**
62     * Constructs a new instance of {@code MetalDesktopIconUI}.
63     */
64    public MetalDesktopIconUI() {
65    }
66
67    protected void installDefaults() {
68        super.installDefaults();
69        LookAndFeel.installColorsAndFont(desktopIcon, "DesktopIcon.background", "DesktopIcon.foreground", "DesktopIcon.font");
70        width = UIManager.getInt("DesktopIcon.width");
71    }
72
73    protected void installComponents() {
74        frame = desktopIcon.getInternalFrame();
75        Icon icon = frame.getFrameIcon();
76        String title = frame.getTitle();
77
78        button = new JButton (title, icon);
79        button.addActionListener( new ActionListener() {
80                                  public void actionPerformed(ActionEvent e) {
81             deiconize(); }} );
82        button.setFont(desktopIcon.getFont());
83        button.setBackground(desktopIcon.getBackground());
84        button.setForeground(desktopIcon.getForeground());
85
86        int buttonH = button.getPreferredSize().height;
87
88        Icon drag = new MetalBumps((buttonH/3), buttonH,
89                                   MetalLookAndFeel.getControlHighlight(),
90                                   MetalLookAndFeel.getControlDarkShadow(),
91                                   MetalLookAndFeel.getControl());
92        label = new JLabel(drag);
93
94        label.setBorder( new MatteBorder( 0, 2, 0, 1, desktopIcon.getBackground()) );
95        desktopIcon.setLayout(new BorderLayout(2, 0));
96        desktopIcon.add(button, BorderLayout.CENTER);
97        desktopIcon.add(label, BorderLayout.WEST);
98    }
99
100    protected void uninstallComponents() {
101        desktopIcon.setLayout(null);
102        desktopIcon.remove(label);
103        desktopIcon.remove(button);
104        button = null;
105        frame = null;
106    }
107
108    protected void installListeners() {
109        super.installListeners();
110        desktopIcon.getInternalFrame().addPropertyChangeListener(
111                titleListener = new TitleListener());
112    }
113
114    protected void uninstallListeners() {
115        desktopIcon.getInternalFrame().removePropertyChangeListener(
116                titleListener);
117        titleListener = null;
118        super.uninstallListeners();
119    }
120
121
122    public Dimension getPreferredSize(JComponent c) {
123        // Metal desktop icons can not be resized.  Their dimensions should
124        // always be the minimum size.  See getMinimumSize(JComponent c).
125        return getMinimumSize(c);
126    }
127
128    public Dimension getMinimumSize(JComponent c) {
129        // For the metal desktop icon we will use the layout maanger to
130        // determine the correct height of the component, but we want to keep
131        // the width consistent according to the jlf spec.
132        return new Dimension(width,
133                desktopIcon.getLayout().minimumLayoutSize(desktopIcon).height);
134    }
135
136    public Dimension getMaximumSize(JComponent c) {
137        // Metal desktop icons can not be resized.  Their dimensions should
138        // always be the minimum size.  See getMinimumSize(JComponent c).
139        return getMinimumSize(c);
140    }
141
142    class TitleListener implements PropertyChangeListener {
143        public void propertyChange (PropertyChangeEvent e) {
144          if (e.getPropertyName().equals("title")) {
145            button.setText((String)e.getNewValue());
146          }
147
148          if (e.getPropertyName().equals("frameIcon")) {
149            button.setIcon((Icon)e.getNewValue());
150          }
151        }
152    }
153}
154