synthtreeui.java

来自「java jdk 1.4的源码」· Java 代码 · 共 1,971 行 · 第 1/5 页

JAVA
1,971
字号
	    lineX = tree.getWidth() - offset - insets.right;	}	int clipLeft = clipBounds.x;	int clipRight = clipBounds.x + (clipBounds.width - 1);	if (lineX >= clipLeft && lineX <= clipRight) {	    int clipTop = clipBounds.y;	    int clipBottom = clipBounds.y + clipBounds.height;	    Rectangle parentBounds = getPathBounds(tree, path);	    Rectangle lastChildBounds = getPathBounds(tree,						     getLastChildPath(path));	    int       top;	    if (parentBounds == null) {		top = Math.max(insets.top, clipTop);	    }	    else {		top = Math.max(parentBounds.y + parentBounds.height, clipTop);            }	    if (depth == 0 && !tree.isRootVisible()) {		TreeModel     model = tree.getModel();                Object        root = model.getRoot();                if (model.getChildCount(root) > 0) {                    parentBounds = getPathBounds(tree, path.				  pathByAddingChild(model.getChild(root, 0)));                    if (parentBounds != null) {                        top = Math.max(insets.top, parentBounds.y +                                       parentBounds.height / 2);                    }		}	    }	    int bottom = Math.min(lastChildBounds.y +				  (lastChildBounds.height / 2), clipBottom);            if (top < bottom) {                SynthGraphics engine = context.getStyle().                                               getSynthGraphics(context);                g.setColor(context.getStyle().getColor(context,                                                       ColorType.FOREGROUND));                engine.drawLine(context, "Tree.verticalLine", g, lineX, top,                                lineX, bottom);            }	}    }    /**     * Paints the expand (toggle) part of a row. The receiver should     * NOT modify <code>clipBounds</code>, or <code>insets</code>.     */    protected void paintExpandControl(SynthContext context, Graphics g,                                    Rectangle clipBounds, Insets insets,                                    Rectangle bounds, TreePath path,                                    int row, boolean isExpanded,                                    boolean hasBeenExpanded,                                    boolean isLeaf) {	Object       value = path.getLastPathComponent();	// Draw icons if not a leaf and either hasn't been loaded,	// or the model child count is > 0.	if (!isLeaf && (!hasBeenExpanded ||			tree.getModel().getChildCount(value) > 0)) {	    int middleXOfKnob;	    if (leftToRight) {	        middleXOfKnob = bounds.x - getTrailingControlOffset() + 1;	    }	    else {	        middleXOfKnob = bounds.x + bounds.width +                                         getTrailingControlOffset() - 1;	    }	    int middleYOfKnob = bounds.y + (bounds.height / 2);	    if (isExpanded) {		Icon expandedIcon = getExpandedIcon();		if (expandedIcon != null) {                    paintIconCenteredAt(context, tree, g, expandedIcon,                                        middleXOfKnob, middleYOfKnob);                }	    }	    else {		Icon collapsedIcon = getCollapsedIcon();		if (collapsedIcon != null) {                    paintIconCenteredAt(context, tree, g, collapsedIcon,                                        middleXOfKnob, middleYOfKnob);                }	    }	}    }    /**     * Paints the renderer part of a row. The receiver should     * NOT modify <code>clipBounds</code>, or <code>insets</code>.     */    protected void paintRow(TreeCellRenderer renderer,               DefaultTreeCellRenderer dtcr, SynthContext treeContext,               SynthContext cellContext, Graphics g, Rectangle clipBounds,               Insets insets, Rectangle bounds, Rectangle rowBounds,               TreePath path, int row, boolean isExpanded,               boolean hasBeenExpanded, boolean isLeaf) {	// Don't paint the renderer if editing this row.        boolean selected = tree.isRowSelected(row);        if (selected) {            cellContext.setComponentState(ENABLED | SELECTED);        }        else {            cellContext.setComponentState(ENABLED);        }        if (dtcr != null && (dtcr.getBorderSelectionColor() instanceof                             UIResource)) {            dtcr.setBorderSelectionColor(style.getColor(                                             cellContext, ColorType.FOCUS));        }        SynthLookAndFeel.updateSubregion(cellContext, g, rowBounds);	if (getEditingRow() == row) {	    return;        }	int leadIndex;	if (tree.hasFocus()) {	    leadIndex = getLeadSelectionRow();	}	else {	    leadIndex = -1;        }	Component component = renderer.getTreeCellRendererComponent(                         tree, path.getLastPathComponent(),                         selected, isExpanded, isLeaf, row,                         (leadIndex == row));		rendererPane.paintComponent(g, component, tree, bounds.x, bounds.y,				    bounds.width, bounds.height, true);	    }    /**     * Returns true if the expand (toggle) control should be drawn for     * the specified row.     */    private boolean shouldPaintExpandControl(TreePath path, int row,                                             boolean isExpanded,                                             boolean hasBeenExpanded,                                             boolean isLeaf) {	if (isLeaf) {	    return false;        }	int              depth = path.getPathCount() - 1;	if ((depth == 0 || (depth == 1 && !tree.isRootVisible())) &&                           !tree.getShowsRootHandles()) {	    return false;        }	return true;    }    //    // Generic painting methods    //    /**     * Paints the Icon centered at the specified location.     */    private void paintIconCenteredAt(SynthContext context, Component c,                                     Graphics graphics, Icon icon,                                     int x, int y) {        int w = SynthIcon.getIconWidth(icon, context);        int h = SynthIcon.getIconHeight(icon, context);	SynthIcon.paintIcon(icon, context, graphics, x - w/2, y - h/2, w, h);    }    //    // Various local methods    //    /**     * Resets the selection model. The appropriate listener are installed     * on the model.     */    private void selectionModelChanged(TreeSelectionModel oldModel,                                    TreeSelectionModel newModel) {	completeEditing();        if (newModel != null) {            if (treeSelectionListener != null) {                newModel.removeTreeSelectionListener		               (treeSelectionListener);            }        }	if (newModel != null) {	    if (treeSelectionListener != null) {		newModel.addTreeSelectionListener		                   (treeSelectionListener);            }	    if (treeState != null) {		treeState.setSelectionModel(newModel);            }	}	else if (treeState != null) {	    treeState.setSelectionModel(null);        }	if (tree != null) {	    tree.repaint();        }    }    public void propertyChange(PropertyChangeEvent event) {        if (event.getSource() == tree) {            String              changeName = event.getPropertyName();            if (SynthLookAndFeel.shouldUpdateStyle(event)) {                fetchStyle((JTree)event.getSource());            }            if (JTree.LEAD_SELECTION_PATH_PROPERTY.equals(changeName)) {                updateLeadRow();                repaintPath((TreePath)event.getOldValue());                repaintPath((TreePath)event.getNewValue());            }            else if (JTree.ANCHOR_SELECTION_PATH_PROPERTY.equals(changeName)) {                repaintPath((TreePath)event.getOldValue());                repaintPath((TreePath)event.getNewValue());            }            else if (JTree.CELL_RENDERER_PROPERTY.equals(changeName)) {                completeEditing();                updateRenderer();                invalidateStateAndSize();            }            else if (JTree.TREE_MODEL_PROPERTY.equals(changeName)) {                TreeModel oldModel = (TreeModel)event.getOldValue();                completeEditing();                if (oldModel != null && treeModelListener != null) {                    oldModel.removeTreeModelListener(treeModelListener);                }                TreeModel newModel = (TreeModel)event.getNewValue();                if (newModel != null && treeModelListener != null) {                    newModel.addTreeModelListener(treeModelListener);                }                if (treeState != null) {                    treeState.setModel(newModel);                    updateLayoutCacheExpandedNodes();                    invalidateSize();                }            }            else if (JTree.ROOT_VISIBLE_PROPERTY.equals(changeName)) {                completeEditing();                updateRootOffset();                if (treeState != null) {                    treeState.setRootVisible(((Boolean)event.getNewValue()).                                             booleanValue());                    invalidateStateAndSize();                }            }            else if (JTree.SHOWS_ROOT_HANDLES_PROPERTY.equals(changeName)) {                completeEditing();                updateRootOffset();                invalidateStateAndSize();            }            else if (JTree.ROW_HEIGHT_PROPERTY.equals(changeName)) {                completeEditing();                if (treeState != null) {                    updateLargeModel();                    treeState.setRowHeight(tree.getRowHeight());                    invalidateSize();                }            }            else if (JTree.CELL_EDITOR_PROPERTY.equals(changeName)) {                completeEditing();                TreeCellEditor oldEditor = (TreeCellEditor)event.getOldValue();                if (oldEditor != null && cellEditorListener != null) {                    oldEditor.removeCellEditorListener(cellEditorListener);                }                TreeCellEditor newEditor = (TreeCellEditor)event.getNewValue();                if (newEditor != null) {                    if (cellEditorListener == null) {                        cellEditorListener = createCellEditorListener();                    }                    if (cellEditorListener != null) {                        newEditor.addCellEditorListener(cellEditorListener);                    }                }            }            else if (JTree.EDITABLE_PROPERTY.equals(changeName)) {                completeEditing();                TreeCellEditor editor = tree.getCellEditor();                if (tree.isEditable()) {                    if (editor == null) {                        editor = createCellEditor();                        if (editor != null) {                            tree.setCellEditor(editor);                        }                    }                    else {                        if (cellEditorListener == null) {                            cellEditorListener = createCellEditorListener();                        }                        if (cellEditorListener != null) {                            editor.addCellEditorListener(cellEditorListener);                        }                    }                }                else if (editor instanceof UIResource) {                    tree.setCellEditor(null);                }            }            else if (JTree.LARGE_MODEL_PROPERTY.equals(changeName)) {                updateLargeModel();            }            else if(JTree.SELECTION_MODEL_PROPERTY.equals(changeName)) {                selectionModelChanged((TreeSelectionModel)event.                                      getOldValue(), tree.getSelectionModel());            }            else if("font".equals(changeName)) {                completeEditing();                invalidateStateAndSize();            }            else if ("componentOrientation".equals(changeName)) {                leftToRight = tree.getComponentOrientation().isLeftToRight();                invalidateStateAndSize();                InputMap km = getInputMap(JComponent.WHEN_FOCUSED);                SwingUtilities.replaceUIInputMap(tree,						JComponent.WHEN_FOCUSED, km);            } else if ("transferHandler".equals(changeName)) {                DropTarget dropTarget = tree.getDropTarget();                if (dropTarget instanceof UIResource) {                    if (defaultDropTargetListener == null) {                        defaultDropTargetListener = new TreeDropTargetListener();                    }                    try {                        dropTarget.addDropTargetListener(defaultDropTargetListener);                    } catch (TooManyListenersException tmle) {                        // should not happen... swing drop target is multicast                    }                }            }	}    }    private int getTrailingControlOffset() {	return trailingControlOffset;    }    private int getIndent() {        return indent;    }    /**     * Returns the icon to draw when the node is expanded.     */    private Icon getExpandedIcon() {	return expandedIcon;    }    /**     * Returns the Icon to draw when the node is collapsed.     */    private Icon getCollapsedIcon() {	return collapsedIcon;    }    /**     * Updates the necessary state in response to the large model, or rowHeight     * property changing.     */    private void updateLargeModel() {        boolean largeModel = tree.isLargeModel();	if (tree.getRowHeight() < 1) {	    largeModel = false;        }	if (this.largeModel != largeModel) {	    completeEditing();	    this.largeModel = largeModel;	    treeState = createLayoutCache();	    configureLayoutCache();	    invalidateSize();	}    }    /**     * Returns true if operating in large model mode.     */    private boolean isLargeModel() {	return largeModel;

⌨️ 快捷键说明

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