1/*
2 * Copyright (c) 1997, 2014, 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 com.sun.java.swing.plaf.motif;
27
28import javax.swing.*;
29import javax.swing.event.*;
30import javax.swing.plaf.*;
31import javax.swing.plaf.basic.BasicRadioButtonMenuItemUI;
32
33import java.awt.*;
34import java.awt.event.*;
35import java.io.Serializable;
36import sun.swing.SwingUtilities2;
37
38
39/**
40 * MotifRadioButtonMenuItem implementation
41 * <p>
42 * <strong>Warning:</strong>
43 * Serialized objects of this class will not be compatible with
44 * future Swing releases.  The current serialization support is appropriate
45 * for short term storage or RMI between applications running the same
46 * version of Swing.  A future release of Swing will provide support for
47 * long term persistence.
48 *
49 * @author Georges Saab
50 * @author Rich Schiavi
51 */
52public class MotifRadioButtonMenuItemUI extends BasicRadioButtonMenuItemUI
53{
54    protected ChangeListener changeListener;
55
56    public static ComponentUI createUI(JComponent b) {
57        return new MotifRadioButtonMenuItemUI();
58    }
59
60    protected void installListeners() {
61        super.installListeners();
62        changeListener = createChangeListener(menuItem);
63        menuItem.addChangeListener(changeListener);
64    }
65
66    protected void uninstallListeners() {
67        super.uninstallListeners();
68        menuItem.removeChangeListener(changeListener);
69    }
70
71    protected ChangeListener createChangeListener(JComponent c) {
72        return new ChangeHandler();
73    }
74
75    @SuppressWarnings("serial") // Same-version serialization only
76    protected class ChangeHandler implements ChangeListener, Serializable {
77        public void stateChanged(ChangeEvent e) {
78            JMenuItem c = (JMenuItem)e.getSource();
79            LookAndFeel.installProperty(c, "borderPainted", c.isArmed());
80        }
81    }
82
83    protected MouseInputListener createMouseInputListener(JComponent c) {
84        return new MouseInputHandler();
85    }
86
87
88    protected class MouseInputHandler implements MouseInputListener {
89        public void mouseClicked(MouseEvent e) {}
90        public void mousePressed(MouseEvent e) {
91            MenuSelectionManager manager = MenuSelectionManager.defaultManager();
92            manager.setSelectedPath(getPath());
93        }
94        public void mouseReleased(MouseEvent e) {
95            MenuSelectionManager manager =
96                MenuSelectionManager.defaultManager();
97            JMenuItem menuItem = (JMenuItem)e.getComponent();
98            Point p = e.getPoint();
99            if(p.x >= 0 && p.x < menuItem.getWidth() &&
100               p.y >= 0 && p.y < menuItem.getHeight()) {
101                String property = "RadioButtonMenuItem.doNotCloseOnMouseClick";
102                if (!SwingUtilities2.getBoolean(menuItem, property)) {
103                    manager.clearSelectedPath();
104                }
105                menuItem.doClick(0);
106            } else {
107                manager.processMouseEvent(e);
108            }
109        }
110        public void mouseEntered(MouseEvent e) {}
111        public void mouseExited(MouseEvent e) {}
112        public void mouseDragged(MouseEvent e) {
113            MenuSelectionManager.defaultManager().processMouseEvent(e);
114        }
115        public void mouseMoved(MouseEvent e) { }
116    }
117
118}
119