synthscrollpaneui.java

来自「java jdk 1.4的源码」· Java 代码 · 共 994 行 · 第 1/3 页

JAVA
994
字号
/* * @(#)SynthScrollPaneUI.java	1.10 03/05/05 * * Copyright 2003 Sun Microsystems, Inc. All rights reserved. * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. */package com.sun.java.swing.plaf.gtk;import javax.swing.*;import javax.swing.event.*;import javax.swing.border.*;import javax.swing.plaf.*;import java.beans.PropertyChangeListener;import java.beans.PropertyChangeEvent;import java.awt.Component;import java.awt.Container;import java.awt.LayoutManager;import java.awt.Rectangle;import java.awt.Dimension;import java.awt.Point;import java.awt.Insets;import java.awt.Graphics;import java.awt.event.*;import java.io.Serializable;import java.awt.Toolkit;/** * A default L&F implementation of ScrollPaneUI. * * @version 1.10, 05/05/03 (based on BasicScrollPaneUI v 1.65) * @author Hans Muller */class SynthScrollPaneUI    extends ScrollPaneUI implements ScrollPaneConstants, SynthUI{    private SynthStyle style;    protected JScrollPane scrollpane;    protected ChangeListener vsbChangeListener;    protected ChangeListener hsbChangeListener;    protected ChangeListener viewportChangeListener;    protected PropertyChangeListener spPropertyChangeListener;    private MouseWheelListener mouseScrollListener;    /**     * PropertyChangeListener installed on the vertical scrollbar.     */    private PropertyChangeListener vsbPropertyChangeListener;    /**     * PropertyChangeListener installed on the horizontal scrollbar.     */    private PropertyChangeListener hsbPropertyChangeListener;    /**     * The default implementation of createHSBPropertyChangeListener and     * createVSBPropertyChangeListener share the PropertyChangeListener, which     * is this ivar.     */    private PropertyChangeListener sbPropertyChangeListener;    /**     * State flag that shows whether setValue() was called from a user program     * before the value of "extent" was set in right-to-left component     * orientation.     */    private boolean setValueCalled = false;    public static ComponentUI createUI(JComponent x) {	return new SynthScrollPaneUI();    }    public static void loadActionMap(ActionMap map) {        // NOTE: this needs to remain static. If you have a need to        // have Actions that reference the UI in the ActionMap,        // then you'll also need to change the registeration of the        // ActionMap.	map.put("scrollUp", new ScrollAction("scrollUp", SwingConstants.						 VERTICAL, -1, true));	map.put("scrollDown", new ScrollAction("scrollDown",				     SwingConstants.VERTICAL, 1, true));	map.put("scrollHome", new ScrollHomeAction("ScrollHome"));	map.put("scrollEnd", new ScrollEndAction("ScrollEnd"));	map.put("unitScrollUp", new ScrollAction	       ("UnitScrollUp", SwingConstants.VERTICAL, -1,false));	map.put("unitScrollDown", new ScrollAction	       ("UnitScrollDown", SwingConstants.VERTICAL, 1, false));        // PENDING: this is currently broke, the actions should do        // the necessary mapping and not require us to reregister the actions.        // In order to reregister actions we would have to make this        // a per component action map.        map.put("scrollLeft", new ScrollAction("scrollLeft",				  SwingConstants.HORIZONTAL, -1, true));        map.put("scrollRight", new ScrollAction("ScrollRight",					SwingConstants.HORIZONTAL, 1, true));        map.put("unitScrollRight", new ScrollAction	       ("UnitScrollRight", SwingConstants.HORIZONTAL, 1, false));        map.put("unitScrollLeft", new ScrollAction	       ("UnitScrollLeft", SwingConstants.HORIZONTAL, -1, false));    }    public void update(Graphics g, JComponent c) {        SynthContext context = getContext(c);        SynthLookAndFeel.update(context, g);        paint(context, g);        context.dispose();    }    public void paint(Graphics g, JComponent c) {        SynthContext context = getContext(c);        paint(context, g);        context.dispose();    }    protected void paint(SynthContext context, Graphics g) {	Border vpBorder = scrollpane.getViewportBorder();	if (vpBorder != null) {	    Rectangle r = scrollpane.getViewportBorderBounds();	    vpBorder.paintBorder(scrollpane, g, r.x, r.y, r.width, r.height);	}    }    /**     * @return null which indicates that the LayoutManager will compute the value     * @see JComponent#getPreferredSize     */    public Dimension getPreferredSize(JComponent c) {	return null;    }    /**     * @return the preferred size     * @see #getPreferredSize     */    public Dimension getMinimumSize(JComponent c) {	return getPreferredSize(c);    }    /**     * @return new Dimension(Short.MAX_VALUE, Short.MAX_VALUE)     */    public Dimension getMaximumSize(JComponent c) {	return new Dimension(Short.MAX_VALUE, Short.MAX_VALUE);    }    protected void installDefaults(JScrollPane scrollpane) {        fetchStyle(scrollpane);    }    private void fetchStyle(JScrollPane c) {        SynthContext context = getContext(c, ENABLED);        SynthStyle oldStyle = style;        style = SynthLookAndFeel.updateStyle(context, this);        if (style != oldStyle) {            Border vpBorder = scrollpane.getViewportBorder();            if ((vpBorder == null) ||( vpBorder instanceof UIResource)) {                scrollpane.setViewportBorder(new ViewportBorder(context));            }        }        context.dispose();    }    protected void installListeners(JScrollPane c)     {	vsbChangeListener = createVSBChangeListener();        vsbPropertyChangeListener = createVSBPropertyChangeListener();	hsbChangeListener = createHSBChangeListener();        hsbPropertyChangeListener = createHSBPropertyChangeListener();	viewportChangeListener = createViewportChangeListener();	spPropertyChangeListener = createPropertyChangeListener();	JViewport viewport = scrollpane.getViewport();	JScrollBar vsb = scrollpane.getVerticalScrollBar();	JScrollBar hsb = scrollpane.getHorizontalScrollBar();	if (viewport != null) {	    viewport.addChangeListener(viewportChangeListener);	}	if (vsb != null) {	    vsb.getModel().addChangeListener(vsbChangeListener);            vsb.addPropertyChangeListener(vsbPropertyChangeListener);	}	if (hsb != null) {	    hsb.getModel().addChangeListener(hsbChangeListener);            hsb.addPropertyChangeListener(hsbPropertyChangeListener);	}	scrollpane.addPropertyChangeListener(spPropertyChangeListener);    mouseScrollListener = createMouseWheelListener();    scrollpane.addMouseWheelListener(mouseScrollListener);    }    protected void installKeyboardActions(JScrollPane c) {	InputMap inputMap = getInputMap(JComponent.				  WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);	SwingUtilities.replaceUIInputMap(c, JComponent.			       WHEN_ANCESTOR_OF_FOCUSED_COMPONENT, inputMap);        LazyActionMap.installLazyActionMap(c, SynthScrollPaneUI.class,                                           "ScrollPane.actionMap");    }    InputMap getInputMap(int condition) {	if (condition == JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT) {            SynthContext context = getContext(scrollpane, ENABLED);            SynthStyle style = context.getStyle();	    InputMap keyMap = (InputMap)style.get(context,                                                "ScrollPane.ancestorInputMap");	    InputMap rtlKeyMap;	    if (!scrollpane.getComponentOrientation().isLeftToRight() &&		   ((rtlKeyMap = (InputMap)style.get(context,                   "ScrollPane.ancestorInputMap.RightToLeft")) != null)) {		rtlKeyMap.setParent(keyMap);		keyMap = rtlKeyMap;	    }            context.dispose();            return keyMap;	}	return null;    }    public void installUI(JComponent x) {	scrollpane = (JScrollPane)x;	installDefaults(scrollpane);	installListeners(scrollpane);	installKeyboardActions(scrollpane);    }    protected void uninstallDefaults(JScrollPane c) {        SynthContext context = getContext(c, ENABLED);        style.uninstallDefaults(context);        context.dispose();        if (scrollpane.getViewportBorder() instanceof UIResource) {            scrollpane.setViewportBorder(null);        }    }    protected void uninstallListeners(JComponent c) {	JViewport viewport = scrollpane.getViewport();	JScrollBar vsb = scrollpane.getVerticalScrollBar();	JScrollBar hsb = scrollpane.getHorizontalScrollBar();	if (viewport != null) {	    viewport.removeChangeListener(viewportChangeListener);	}	if (vsb != null) {	    vsb.getModel().removeChangeListener(vsbChangeListener);            vsb.removePropertyChangeListener(vsbPropertyChangeListener);	}	if (hsb != null) {	    hsb.getModel().removeChangeListener(hsbChangeListener);            hsb.removePropertyChangeListener(hsbPropertyChangeListener);	}	scrollpane.removePropertyChangeListener(spPropertyChangeListener);    if (mouseScrollListener != null) {        scrollpane.removeMouseWheelListener(mouseScrollListener);    }	vsbChangeListener = null;	hsbChangeListener = null;	viewportChangeListener = null;	spPropertyChangeListener = null;        mouseScrollListener = null;    }    protected void uninstallKeyboardActions(JScrollPane c) {	SwingUtilities.replaceUIActionMap(c, null);	SwingUtilities.replaceUIInputMap(c, JComponent.			   WHEN_ANCESTOR_OF_FOCUSED_COMPONENT, null);    }    public void uninstallUI(JComponent c) {	uninstallDefaults(scrollpane);	uninstallListeners(scrollpane);	uninstallKeyboardActions(scrollpane);	scrollpane = null;    }    public SynthContext getContext(JComponent c) {        return getContext(c, getComponentState(c));    }    public SynthContext getContext(JComponent c, Region region) {        return SynthContext.getContext(SynthContext.class, c,                                       region, style, getComponentState(c));    }    private SynthContext getContext(JComponent c, int state) {        return SynthContext.getContext(SynthContext.class, c,                    SynthLookAndFeel.getRegion(c), style, state);    }    private Region getRegion(JComponent c) {        return SynthLookAndFeel.getRegion(c);    }    private int getComponentState(JComponent c) {        return SynthLookAndFeel.getComponentState(c);    }    protected void syncScrollPaneWithViewport()    {

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?