File: StripedViewportBorder.java

package info (click to toggle)
mac-widgets 0.9.5%2Bsvn369-dfsg1-3
  • links: PTS, VCS
  • area: main
  • in suites: wheezy
  • size: 1,920 kB
  • sloc: java: 8,318; makefile: 13; sh: 12
file content (79 lines) | stat: -rw-r--r-- 3,040 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
package com.explodingpixels.widgets;

import javax.swing.JTable;
import javax.swing.JViewport;
import javax.swing.border.AbstractBorder;
import javax.swing.table.TableColumn;
import java.awt.Color;
import java.awt.Component;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.Rectangle;

/**
 * Creates a border for a {@link JViewport} that draws a striped background corresponding to the row
 * positions of the given {@link JTable}.
 */
class StripedViewportBorder extends AbstractBorder {

    private final JViewport fViewport;
    private final JTable fTable;
    private final Color fStripeColor;

    StripedViewportBorder(JViewport viewport, JTable table, Color stripeColor) {
        fViewport = viewport;
        fTable = table;
        fStripeColor = stripeColor;
    }

    @Override
    public void paintBorder(Component c, Graphics g, int x, int y, int width, int height) {
        paintStripedBackground(g);
        paintVerticalGridLines(g, y, height);
    }

    private void paintStripedBackground(Graphics g) {
        // get the row index at the top of the clip bounds (the first row
        // to paint).
        Rectangle clip = g.getClipBounds();
        Point viewPosition = fViewport.getViewPosition();
        // TODO figure out how to honor the beginning of clip region.
        // Point viewPostionWithClip = new Point(viewPosition.x + clip.x, viewPosition.y + clip.y);
        int rowAtPoint = fTable.rowAtPoint(viewPosition);
        // get the y coordinate of the first row to paint. if there are no
        // rows in the table, start painting at the top of the supplied
        // clipping bounds.
        int topY = rowAtPoint < 0
                ? clip.y
                : fTable.getCellRect(rowAtPoint, 0, true).y - viewPosition.y;

        // create a counter variable to hold the current row. if there are no
        // rows in the table, start the counter at 0.
        int currentRow = rowAtPoint < 0 ? 0 : rowAtPoint;
        while (topY < clip.y + clip.height) {
            int bottomY = topY + fTable.getRowHeight();
            g.setColor(getRowColor(currentRow));
            g.fillRect(clip.x, topY, clip.width, bottomY);
            topY = bottomY;
            currentRow++;
        }
    }

    private Color getRowColor(int row) {
        return row % 2 == 0 ? fStripeColor : fTable.getBackground();
    }

    private void paintVerticalGridLines(Graphics g, int y, int height) {
        // paint the column grid dividers for the non-existent rows.
        int x = 0 - fViewport.getViewPosition().x;
        for (int i = 0; i < fTable.getColumnCount(); i++) {
            TableColumn column = fTable.getColumnModel().getColumn(i);
            // increase the x position by the width of the current column.
            x += column.getWidth();
            g.setColor(fTable.getGridColor());
            // draw the grid line (not sure what the -1 is for, but BasicTableUI
            // also does it.source
            g.drawLine(x - 1, y, x - 1, y + height);
        }
    }
}