📄 pvborder.java
字号:
@param iSet1 set of octal flags for right/bottom lines.
@param iSet2 set of octal flags for left/top lines.
@param iRepeat width factor (0..7).
@param c border color. In case of null, the lightGray color
is used.
@see #draw(Graphics,Rectangle,int,Color)
*/
public static void draw(Graphics g, Rectangle r, int iSet1, int iSet2, int iRepeat, Color c)
{
if(r != null)
{
int j, i;
if(iSet1 == 0) if(iRepeat-- == 0) return;
iRepeat++;
if(g == null)
{
//-------------------------------
// adjust rectangle for client area and return
for(i=1; i < 10; i++) if(((iSet1 >>= 3) & 7) == 0 || ((iSet2 >>= 3) & 7) == 0) break;
i *= iRepeat;
if(i > (r.width >>> 1)) i = r.width >>> 1;
if(i > (r.height >>> 1)) i = r.height >>> 1;
r.x += i; r.y += i;
r.width -= (i << 1);
r.height -= (i << 1);
return;
}
if(c == null) c = Color.lightGray;
if(iSet1 == 0)
{
g.setColor(c);
while(iRepeat-- > 0)
{
focus(g, r.x, r.y, r.width - 1, r.height - 1);
r.grow(-1, -1);
}
return;
}
//----------------------------------
// fill array [7] with shadow colors
// [4] ==> original color,
// [0..3] ==> shift to black
// [5..7] ==> shift to white
int rgb[] = new int[3], clr[] = new int[6];
int iR = 170 + ((c.getRed() - 170) * 5 >> 3), iG = 170 + ((c.getGreen() - 170) * 5 >> 3), iB = 170 + ((c.getBlue() - 170) * 5 >> 3);
//----------------------------------
for(j=0; j < 6; j++)
{
rgb[0] = iR; rgb[1] = iG; rgb[2] = iB;
for(i=0; i < 3; i++)
{
switch(j)
{
case 0: rgb[i] = 0; break;
case 1: rgb[i] = rgb[i] * 3 >>> 2; break;
//case 2: default color
case 3: rgb[i] = rgb[i] + ((255 - rgb[i]) << 1) / 6; break;
case 4: rgb[i] = rgb[i] + ((255 - rgb[i]) << 3) / 11; break;
case 5: rgb[i] = 255; break;
}
}
clr[j] = (rgb[0] << 16) | (rgb[1] << 8) | rgb[2];
}
//----------------------------------
// draw border rectangles starting from the
// most outter and moving to the inside
for(i=0; i < 10; i++)
{
iR = iSet1 & 7; iB = iSet2 & 7;
if(iR-- == 0 || iB-- == 0) break;
for(j=0; j < iRepeat; j++)
{
if(r.width < 2 || r.height < 2) break;
rect(g, r, (iR == 6) ? c : new Color(clr[iR]), (iB == 6) ? c : new Color(clr[iB]));
}
iSet1 >>= 3; iSet2 >>= 3;
}
}
}
/**
Draw 3D rectangle.
@param g graphics.
@param r rectangle (on return, it is deflated by 1).
@param c1 color for right/bottom edges.
@param c2 color for left/top edges.
*/
static void rect(Graphics g, Rectangle r, Color c1, Color c2)
{
int iRight = r.x + r.width - 1, iBottom = r.y + r.height - 1;
//--------------------------------------
// extract color flag (0..XXX000)
// draw top-left lines
g.setColor(c2);
g.drawLine(r.x, r.y, r.x, iBottom);
g.drawLine(r.x, r.y, iRight, r.y);
//--------------------------------------
// extract color flag (0..000XXX)
// draw bottom-right lines
g.setColor(c1);
g.drawLine(r.x, iBottom, iRight, iBottom);
g.drawLine(iRight, r.y, iRight, iBottom);
//--------------------------------------
// shrink rectangle by 1
if(r.width > 2) { r.x++; r.width -= 2; }
if(r.height > 2) { r.y++; r.height -= 2; }
}
/**
Return predifined sets of flags for right/bottom or left/top lines.
@param s style. Possible values:
<UL>
0 - no border<br>
1..10 - symmetric borders<br>
11..20 - raised borders<br>
21..30 - sunken borders<br>
31..40 - outdent borders<br>
41..50 - indent borders<br>
51..60 - picture borders<br>
61..70 - double raised borders<br>
71..80 - double sunken borders<br>
81..90 - bottom-right borders<br>
91..100 - top-left borders
</UL>
@param b location of lines. True - right/bottom, false - left/top.
@return Set of flags for main constructor.
@see #draw(Graphics,Rectangle,int,Color)
*/
public final static int set(int s, boolean b)
{
if((s & 0700000) != 0) return b ? (s & 077777) : ((s >> 15) & 077777);
if((s &= 0xff) > 40) if(s < 51 || (s > 70 && s < 81) || (s > 90 && s < 101)) { s -= 10; b = !b; }
switch(s)
{
//--------------------------------------------
// none
case 0: return 0;
//--------------------------------------------
// plane
case 1: return 7;
case 2: return 1;
case 3: return 00000000041;
case 4: return 00000002631;
case 5: return 00000365321;
case 6: return 00001234563;
case 7: return 00124565421;
case 8: return 01234566531;
case 9: return 03566654321;
case 10: return 01234566653;
//--------------------------------------------
// raised
case 11: return b ? 00000000001 : 00000000006;
case 12: return b ? 00000000002 : 00000000005;
case 13: return b ? 00000000021 : 00000000045;
case 14: return b ? 00000000321 : 00000000565;
case 15: return b ? 00000003221 : 00000005665;
case 16: return b ? 00000433221 : 00000466654;
case 17: return b ? 00000123454 : 00000456664;
case 18: return b ? 00021777721 : 00046777763;
case 19: return b ? 03217777321 : 04567777653;
case 20: return b ? 02177217721 : 05677657756;
//--------------------------------------------
// sunken
case 21: return b ? 00000000006 : 00000000001;
case 22: return b ? 00000000005 : 00000000002;
case 23: return b ? 00000000046 : 00000000012;
case 24: return b ? 00000000456 : 00000000123;
case 25: return b ? 00000004565 : 00000001223;
case 26: return b ? 00000034564 : 00000012343;
case 27: return b ? 00000345654 : 00000433211;
case 28: return b ? 00004677763 : 00001377713;
case 29: return b ? 04567777653 : 01227777122;
case 30: return b ? 06577657765 : 01277127712;
//--------------------------------------------
// outdent/(indent inverted)
case 31: return b ? 00000000052 : 00000000025;
case 32: return b ? 00000000061 : 00000000016;
case 33: return b ? 00000000631 : 00000000136;
case 34: return b ? 00000006331 : 00000001336;
case 35: return b ? 00000046531 : 00000013564;
case 36: return b ? 00000464442 : 00000244464;
case 37: return b ? 00004654321 : 00001234564;
case 38: return b ? 00046654321 : 00012345664;
case 39: return b ? 00465444321 : 00123444564;
case 40: return b ? 04665444321 : 01234445664;
//--------------------------------------------
// picture
case 51: return b ? 04614654321 : 01461234564;
case 52: return b ? 03632156431 : 01363123464;
case 53: return b ? 05135134631 : 01515313563;
case 54: return b ? 04514614631 : 01541641463;
case 55: return b ? 06441446441 : 01446441446;
case 56: return b ? 04654614431 : 01344164564;
case 57: return b ? 04644641441 : 01441464464;
case 58: return b ? 06446441441 : 01441446446;
case 59: return b ? 04654314431 : 01234654465;
case 60: return b ? 03456643141 : 01233446646;
//--------------------------------------------
// double raised/(sunken inverted)
case 61: return b ? 00000000171 : 00000000676;
case 62: return b ? 00000000271 : 00000000576;
case 63: return b ? 00000000272 : 00000000575;
case 64: return b ? 00000001771 : 00000006776;
case 65: return b ? 00000002771 : 00000005776;
case 66: return b ? 00000002772 : 00000005775;
case 67: return b ? 00000017171 : 00000067676;
case 68: return b ? 00000027271 : 00000057576;
case 69: return b ? 00000027272 : 00000057575;
case 70: return b ? 00000171721 : 00000676756;
//--------------------------------------------
// bottom-right/(top-left inverted)
case 81: return b ? 00000000001 : 00000000007;
case 82: return b ? 00000000002 : 00000000007;
case 83: return b ? 00000000021 : 00000000077;
case 84: return b ? 00000000321 : 00000000777;
case 85: return b ? 00000000321 : 00000000771;
case 86: return b ? 00000000005 : 00000000007;
case 87: return b ? 00000000006 : 00000000007;
case 88: return b ? 00000000056 : 00000000077;
case 89: return b ? 00000000456 : 00000000777;
case 90: return b ? 00000000456 : 00000000776;
}
return s;
}
/**
Draw dotted (focus) rectangle.
The current color of graphics is used.
@param g graphics.
@param l left edge of rectangle.
@param t top edge of rectangle.
@param w width of rectangle.
@param h height of rectangle.
*/
public static void focus(Graphics g, int l, int t, int w, int h)
{
int d = w & 1, i = t - 1;
w += l;
//-----------------
// left/right lines
while((i += 2) <= h + t)
{
g.drawLine(l, i, l, i);
if(i + d <= h + t) g.drawLine(w, i + d, w, i + d);
}
//-----------------
// top/bottom lines
d = h & 1; h += t; i = l - 1;
while((i += 2) <= w)
{
g.drawLine(i, t, i, t);
if(i + d <= w) g.drawLine(i + d, h, i + d, h);
}
}
/**
Draw shadow and adjust rectangle to client area.
@param g graphics. In case of null, shadow is not painted, but rectangle
is calculated.
@param r rectangle.
@param c shadow color.
@param back background color.
@param s the position of the shadow. Possible values:
<UL>
0 - no shadow<br>
1 - right bottom<br>
2 - left bottom<br>
3 - left top<br>
4 - right top
</UL>
@param w the width of the shadow.
*/
public static void shadow(Graphics g, Rectangle r, Color c, Color back, int s, int w)
{
if(s > 0 && r != null)
{
if(w > r.width) w = r.width; if(w > r.height) w = r.height;
if(w > 0)
{
r.width -= w; r.height -= w;
if(g != null)
{
int i1 = s & 1, i2 = (s + 1) & 1;
g.setColor(back);
g.fillRect(r.x + i1 * r.width, r.y, w, w);
g.fillRect(r.x + i2 * r.width, r.y + r.height, w, w);
//------------
i1 = (2 - (s & 2)) / 2; i2 = (4 - s) / 2;
g.setColor(c);
g.fillRect(r.x + i1 * w, r.y + i2 * r.height, r.width, w);
g.fillRect(r.x + i1 * r.width, r.y + i2 * w, w, r.height);
}
if(s > 2) r.y += w;
if((s & 2) != 0) r.x += w;
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -