guff 0.0.2 → 0.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/History.txt +4 -0
- data/License.txt +20 -0
- data/Manifest.txt +37 -21
- data/README.txt +1 -3
- data/Rakefile +3 -53
- data/config/hoe.rb +71 -0
- data/config/requirements.rb +17 -0
- data/lib/guff.rb +8 -2
- data/lib/guff/java_source.rb +167 -35
- data/lib/guff/version.rb +9 -9
- data/script/destroy +14 -0
- data/script/generate +14 -0
- data/script/txt2html +74 -0
- data/setup.rb +1585 -1585
- data/tasks/deployment.rake +34 -0
- data/tasks/environment.rake +7 -0
- data/tasks/website.rake +17 -0
- data/test/java_source/files/ClassWithConstructors.java +22 -0
- data/test/java_source/files/ClassWithFields.java +4 -0
- data/test/java_source/files/ClassWithImports.java +8 -0
- data/test/java_source/files/ClassWithMethods.java +5 -1
- data/test/java_source/files/GenericClass.java +3 -0
- data/test/java_source/{annotation_declaration_test.rb → test_annotation_declaration.rb} +0 -0
- data/test/java_source/{class_declaration_test.rb → test_class_declaration.rb} +20 -0
- data/test/java_source/{field_declaration_test.rb → test_field_declaration.rb} +1 -1
- data/test/java_source/test_helper.rb +0 -2
- data/test/java_source/test_import_declaration.rb +14 -0
- data/test/java_source/{method_declaration_test.rb → test_method_declaration.rb} +4 -2
- data/test/test_helper.rb +2 -1
- data/website/index.html +326 -0
- data/website/index.txt +240 -0
- data/website/javascripts/rounded_corners_lite.inc.js +285 -0
- data/website/stylesheets/screen.css +138 -0
- data/website/template.rhtml +48 -0
- metadata +82 -50
- data/CHANGELOG.txt +0 -0
data/website/index.txt
ADDED
@@ -0,0 +1,240 @@
|
|
1
|
+
h1. Java Source Code Generator
|
2
|
+
|
3
|
+
h1. → 'guff'
|
4
|
+
|
5
|
+
|
6
|
+
h2. What
|
7
|
+
|
8
|
+
<code>guff</code> is a ruby gem containing classes that let you produce nicely formatted Java code. Its intended to be used
|
9
|
+
by code generation scripts that eliminate a lot of the 'guff' that often ends up being written on Java projects. One
|
10
|
+
example of this is the "java_testing_guff":http://rubyforge.org/projects/jbuilder-guff project, which generates java classes
|
11
|
+
that provide fluent interfaces to configure mock objects.
|
12
|
+
|
13
|
+
h2. Installing
|
14
|
+
|
15
|
+
<pre syntax="ruby">sudo gem install guff</pre>
|
16
|
+
|
17
|
+
h2. The basics
|
18
|
+
|
19
|
+
<code>guff</code> consists of classes that model a Java source file: SourceFile, Class, Constructor, Method, Field, Annotation etc.
|
20
|
+
You begin by constructing a SourceFile. Then, in a series of nested method calls, you can add the class, fields, method etc.
|
21
|
+
Finally you can tell the source file to save itself. All these classes live in the <code>Guff::JavaSource</code> module.
|
22
|
+
|
23
|
+
h2. Generating a Java source file
|
24
|
+
|
25
|
+
You begin by creating a new source file in a particular package:
|
26
|
+
|
27
|
+
<pre syntax="ruby">
|
28
|
+
source=Guff::JavaSource::SourceFile.new.package('guff.test')
|
29
|
+
</pre>
|
30
|
+
|
31
|
+
You may add some import statements if you need. Import statements can be added later in your code generation script
|
32
|
+
if you do not know all your imports at this stage. Its common to learn that you need to import a particular class only
|
33
|
+
deep down in the guts of your code generation script. But, if you do know you need an import or two:
|
34
|
+
|
35
|
+
<pre syntax="ruby">
|
36
|
+
source.import("java.util.Collections").import("some.other.Thing.*")
|
37
|
+
</pre>
|
38
|
+
|
39
|
+
These imported classes are just strings as far as <code>guff</code> is concerned. It makes no attempt to do anything
|
40
|
+
smart with them like checking for their existence on the classpath or what have you. It will make sure that any given
|
41
|
+
class is imported only once though.
|
42
|
+
|
43
|
+
h3. Adding a new class
|
44
|
+
|
45
|
+
Now that you have a source file, you can add a class to it:
|
46
|
+
|
47
|
+
<pre syntax="ruby">
|
48
|
+
source.begin_class('GenericClass') {|c|
|
49
|
+
c.genericized_using('<T extends SomethingElse>')
|
50
|
+
c.extends('guff.test.SuperClass')
|
51
|
+
c.implements('guff.test.Interface', 'java.io.Serializable')
|
52
|
+
c.add_javadoc("This class has a line of javadoc.").add_javadoc("With a little follow on.")
|
53
|
+
}
|
54
|
+
</pre>
|
55
|
+
|
56
|
+
h3. Adding fields to the class
|
57
|
+
|
58
|
+
You can add fields to a class like this:
|
59
|
+
|
60
|
+
<pre syntax="ruby">
|
61
|
+
source.begin_class('SomeClass') {|c|
|
62
|
+
c.add_field('name',:String).static.final.initial('"Fred"')
|
63
|
+
c.add_field('id',:long).initial('0')
|
64
|
+
c.add_field('user','some.other.pkg.User').initial('new some.other.pkg.User(0,2)')
|
65
|
+
c.add_field('otherId',:int).package_local
|
66
|
+
c.add_field('c',:char).protected.add_javadoc('javadoc').add_javadoc('More javadoc!')
|
67
|
+
c.add_field('flag',:boolean).public.initial('false')
|
68
|
+
}
|
69
|
+
</pre>
|
70
|
+
|
71
|
+
By default fields are <code>private</code>.
|
72
|
+
|
73
|
+
h3. Adding a constructor
|
74
|
+
|
75
|
+
You can add constructors to a class like this:
|
76
|
+
|
77
|
+
<pre syntax="ruby">
|
78
|
+
source.begin_class('SomeClass') {|c|
|
79
|
+
c.add_constructor.taking("date","java.util.Date").taking("active","boolean").body {|body|
|
80
|
+
body.line("super();")
|
81
|
+
}
|
82
|
+
}
|
83
|
+
</pre>
|
84
|
+
|
85
|
+
You can string together as many <code>taking</code> clauses as you need (<code>taking</code> and <code>takes</code>
|
86
|
+
are aliases by the way).
|
87
|
+
|
88
|
+
Otherwise you can add constructors for fields you have already added to the class like this:
|
89
|
+
|
90
|
+
source.begin_class('SomeClass') {|c|
|
91
|
+
c.add_field('id',:long).initial('0')
|
92
|
+
c.add_field('name',:String).static.final.initial('"Fred"')
|
93
|
+
|
94
|
+
c.add_constructor.for_field("id")
|
95
|
+
c.add_constructor.for_fields("id","name")
|
96
|
+
}
|
97
|
+
</pre>
|
98
|
+
|
99
|
+
|
100
|
+
h3. Defining the body of the constructor
|
101
|
+
|
102
|
+
When you want to define the body of a constructor (or method), you call the <code>body</code> method on the constructor
|
103
|
+
and use a single argument block to define the contents of the body. The body instance that is passed to this block supports
|
104
|
+
the following methods:
|
105
|
+
|
106
|
+
<pre syntax="ruby">
|
107
|
+
# an entire line of java code including new line
|
108
|
+
body.line("super();")
|
109
|
+
|
110
|
+
# append the supplied text to the current line
|
111
|
+
body.append("this.").append("execute()")
|
112
|
+
|
113
|
+
# a nested block - call body again
|
114
|
+
body.body { |nested_body|
|
115
|
+
nested_body.line('System.out.println("Nested");');
|
116
|
+
}
|
117
|
+
</pre>
|
118
|
+
|
119
|
+
|
120
|
+
h3. Adding a method
|
121
|
+
|
122
|
+
You can add methods to a class like this:
|
123
|
+
|
124
|
+
<pre syntax="ruby">
|
125
|
+
source.begin_class('SomeClass') {|c|
|
126
|
+
c.add_method.taking("active","boolean").returns("java.util.Date").body {|body|
|
127
|
+
body.line("super();")
|
128
|
+
}
|
129
|
+
}
|
130
|
+
</pre>
|
131
|
+
|
132
|
+
Which is the same as adding a constructor, except for the <code>returns</code> clause.
|
133
|
+
By default methods are <code>public</code> and return <code>void</code>.
|
134
|
+
The body of a method is defined in the same way as the body of a constructor (above).
|
135
|
+
|
136
|
+
h3. Adding a throws clause
|
137
|
+
|
138
|
+
You can add as many throws clauses as you need to methods and constructors like this:
|
139
|
+
|
140
|
+
<pre syntax="ruby">
|
141
|
+
source.begin_class('SomeClass') {|c|
|
142
|
+
c.add_method.throws("guff.SomeWeirdException").throws("guff.SomeOtherException").body {|body|
|
143
|
+
body.line("super();")
|
144
|
+
}
|
145
|
+
}
|
146
|
+
</pre>
|
147
|
+
|
148
|
+
h3. Adding annotations
|
149
|
+
|
150
|
+
You can add as many annotations as you need to classes, fields, methods and constructors like this:
|
151
|
+
|
152
|
+
<pre syntax="ruby">
|
153
|
+
source.begin_class('ClassWithAnnotatedMethods') {|c|
|
154
|
+
c.add_annotation("javax.persistence.Entity")
|
155
|
+
|
156
|
+
m = c.add_method("getAddressID").returns(:String)
|
157
|
+
m.add_annotation("javax.persistence.Column") {|a|
|
158
|
+
a.add_property("name", '"addressID"')
|
159
|
+
a.add_property("table", '"EMP_DETAIL"')
|
160
|
+
}
|
161
|
+
m.add_annotation("SuppressWarnings",'"unchecked"')
|
162
|
+
m.body {|body|
|
163
|
+
body.line('return "0";')
|
164
|
+
}
|
165
|
+
</pre>
|
166
|
+
|
167
|
+
And you can generate complex annotations like this:
|
168
|
+
|
169
|
+
<pre syntax="ruby">
|
170
|
+
source.begin_class('ClassWithAnnotatedMethods') {|c|
|
171
|
+
c.add_annotation("javax.persistence.Entity")
|
172
|
+
|
173
|
+
m = c.add_method("getAddressID").returns(:String)
|
174
|
+
m.add_annotation("JoinTable") {|a|
|
175
|
+
a.add_property("name", '"CUSTOMERBEANSUBSCRIPTIONBEAN"')
|
176
|
+
a.add_property("joinColumns", annotation("JoinColumn"){|aa|
|
177
|
+
aa.add_property("name", '"CUSTOMERBEAN_CUSTOMERID96"')
|
178
|
+
aa.add_property("referencedColumnName", '"customerid"')
|
179
|
+
})
|
180
|
+
a.add_property("inverseJoinColumns", annotation("JoinColumn"){|aa|
|
181
|
+
aa.add_property("name", '"SUBSCRIPTION_TITLE"')
|
182
|
+
aa.add_property("referencedColumnName", '"TITLE"')
|
183
|
+
})
|
184
|
+
}
|
185
|
+
</pre>
|
186
|
+
|
187
|
+
h3. Scope and modifiers
|
188
|
+
|
189
|
+
Classes, fields and methods support scoping and addition of modifiers as follows:
|
190
|
+
|
191
|
+
<pre syntax="ruby">
|
192
|
+
method.public.abstract
|
193
|
+
field.private.final
|
194
|
+
clazz.package_local.abstract
|
195
|
+
</pre>
|
196
|
+
|
197
|
+
The supported scopes are <code>public</code>, <code>protected</code>, <code>package_local</code> and <code>private</code>.
|
198
|
+
The supported modifiers are <code>abstract</code>, <code>final</code> and <code>static</code>
|
199
|
+
|
200
|
+
h3. Adding javadoc
|
201
|
+
|
202
|
+
Classes, constructors, methods and fields support javadoc as follows:
|
203
|
+
|
204
|
+
<pre syntax="ruby">
|
205
|
+
method.add_javadoc("Line of javadoc").add_javadoc("Nudder line of javadoc")
|
206
|
+
</pre>
|
207
|
+
|
208
|
+
h3. Adding imports
|
209
|
+
|
210
|
+
Source files, classes, fields, constructors and methods all support the <code>import</code> statement, but all imports will be written
|
211
|
+
out in the right place when the file is saved (i.e. between the package statement and the class declaration). If you
|
212
|
+
import a given class more than once, it will be imported only once in the generated java source file.
|
213
|
+
|
214
|
+
h3. Saving the generated code
|
215
|
+
|
216
|
+
Once you have all your fields, constructors and methods added you can save your source file as follows:
|
217
|
+
|
218
|
+
<pre syntax="ruby">
|
219
|
+
source.save_in("../src/generated")
|
220
|
+
</pre>
|
221
|
+
|
222
|
+
|
223
|
+
h2. Forum
|
224
|
+
|
225
|
+
"http://groups.google.com/group/guff":http://groups.google.com/group/guff
|
226
|
+
|
227
|
+
h2. How to submit patches
|
228
|
+
|
229
|
+
Read the "8 steps for fixing other people's code":http://drnicwilliams.com/2007/06/01/8-steps-for-fixing-other-peoples-code/ and for section "8b: Submit patch to Google Groups":http://drnicwilliams.com/2007/06/01/8-steps-for-fixing-other-peoples-code/#8b-google-groups, use the Google Group above.
|
230
|
+
|
231
|
+
The project is hosted "here":http://rubyforge.org/projects/jbuilder-guff/ and you can find details of how to get anonymous svn access there.
|
232
|
+
|
233
|
+
h2. License
|
234
|
+
|
235
|
+
This code is free to use under the terms of the MIT license.
|
236
|
+
|
237
|
+
h2. Contact
|
238
|
+
|
239
|
+
Comments are welcome. Send an email to the "forum":http://groups.google.com/group/guff
|
240
|
+
|
@@ -0,0 +1,285 @@
|
|
1
|
+
|
2
|
+
/****************************************************************
|
3
|
+
* *
|
4
|
+
* curvyCorners *
|
5
|
+
* ------------ *
|
6
|
+
* *
|
7
|
+
* This script generates rounded corners for your divs. *
|
8
|
+
* *
|
9
|
+
* Version 1.2.9 *
|
10
|
+
* Copyright (c) 2006 Cameron Cooke *
|
11
|
+
* By: Cameron Cooke and Tim Hutchison. *
|
12
|
+
* *
|
13
|
+
* *
|
14
|
+
* Website: http://www.curvycorners.net *
|
15
|
+
* Email: info@totalinfinity.com *
|
16
|
+
* Forum: http://www.curvycorners.net/forum/ *
|
17
|
+
* *
|
18
|
+
* *
|
19
|
+
* This library is free software; you can redistribute *
|
20
|
+
* it and/or modify it under the terms of the GNU *
|
21
|
+
* Lesser General Public License as published by the *
|
22
|
+
* Free Software Foundation; either version 2.1 of the *
|
23
|
+
* License, or (at your option) any later version. *
|
24
|
+
* *
|
25
|
+
* This library is distributed in the hope that it will *
|
26
|
+
* be useful, but WITHOUT ANY WARRANTY; without even the *
|
27
|
+
* implied warranty of MERCHANTABILITY or FITNESS FOR A *
|
28
|
+
* PARTICULAR PURPOSE. See the GNU Lesser General Public *
|
29
|
+
* License for more details. *
|
30
|
+
* *
|
31
|
+
* You should have received a copy of the GNU Lesser *
|
32
|
+
* General Public License along with this library; *
|
33
|
+
* Inc., 59 Temple Place, Suite 330, Boston, *
|
34
|
+
* MA 02111-1307 USA *
|
35
|
+
* *
|
36
|
+
****************************************************************/
|
37
|
+
|
38
|
+
var isIE = navigator.userAgent.toLowerCase().indexOf("msie") > -1; var isMoz = document.implementation && document.implementation.createDocument; var isSafari = ((navigator.userAgent.toLowerCase().indexOf('safari')!=-1)&&(navigator.userAgent.toLowerCase().indexOf('mac')!=-1))?true:false; function curvyCorners()
|
39
|
+
{ if(typeof(arguments[0]) != "object") throw newCurvyError("First parameter of curvyCorners() must be an object."); if(typeof(arguments[1]) != "object" && typeof(arguments[1]) != "string") throw newCurvyError("Second parameter of curvyCorners() must be an object or a class name."); if(typeof(arguments[1]) == "string")
|
40
|
+
{ var startIndex = 0; var boxCol = getElementsByClass(arguments[1]);}
|
41
|
+
else
|
42
|
+
{ var startIndex = 1; var boxCol = arguments;}
|
43
|
+
var curvyCornersCol = new Array(); if(arguments[0].validTags)
|
44
|
+
var validElements = arguments[0].validTags; else
|
45
|
+
var validElements = ["div"]; for(var i = startIndex, j = boxCol.length; i < j; i++)
|
46
|
+
{ var currentTag = boxCol[i].tagName.toLowerCase(); if(inArray(validElements, currentTag) !== false)
|
47
|
+
{ curvyCornersCol[curvyCornersCol.length] = new curvyObject(arguments[0], boxCol[i]);}
|
48
|
+
}
|
49
|
+
this.objects = curvyCornersCol; this.applyCornersToAll = function()
|
50
|
+
{ for(var x = 0, k = this.objects.length; x < k; x++)
|
51
|
+
{ this.objects[x].applyCorners();}
|
52
|
+
}
|
53
|
+
}
|
54
|
+
function curvyObject()
|
55
|
+
{ this.box = arguments[1]; this.settings = arguments[0]; this.topContainer = null; this.bottomContainer = null; this.masterCorners = new Array(); this.contentDIV = null; var boxHeight = get_style(this.box, "height", "height"); var boxWidth = get_style(this.box, "width", "width"); var borderWidth = get_style(this.box, "borderTopWidth", "border-top-width"); var borderColour = get_style(this.box, "borderTopColor", "border-top-color"); var boxColour = get_style(this.box, "backgroundColor", "background-color"); var backgroundImage = get_style(this.box, "backgroundImage", "background-image"); var boxPosition = get_style(this.box, "position", "position"); var boxPadding = get_style(this.box, "paddingTop", "padding-top"); this.boxHeight = parseInt(((boxHeight != "" && boxHeight != "auto" && boxHeight.indexOf("%") == -1)? boxHeight.substring(0, boxHeight.indexOf("px")) : this.box.scrollHeight)); this.boxWidth = parseInt(((boxWidth != "" && boxWidth != "auto" && boxWidth.indexOf("%") == -1)? boxWidth.substring(0, boxWidth.indexOf("px")) : this.box.scrollWidth)); this.borderWidth = parseInt(((borderWidth != "" && borderWidth.indexOf("px") !== -1)? borderWidth.slice(0, borderWidth.indexOf("px")) : 0)); this.boxColour = format_colour(boxColour); this.boxPadding = parseInt(((boxPadding != "" && boxPadding.indexOf("px") !== -1)? boxPadding.slice(0, boxPadding.indexOf("px")) : 0)); this.borderColour = format_colour(borderColour); this.borderString = this.borderWidth + "px" + " solid " + this.borderColour; this.backgroundImage = ((backgroundImage != "none")? backgroundImage : ""); this.boxContent = this.box.innerHTML; if(boxPosition != "absolute") this.box.style.position = "relative"; this.box.style.padding = "0px"; if(isIE && boxWidth == "auto" && boxHeight == "auto") this.box.style.width = "100%"; if(this.settings.autoPad == true && this.boxPadding > 0)
|
56
|
+
this.box.innerHTML = ""; this.applyCorners = function()
|
57
|
+
{ for(var t = 0; t < 2; t++)
|
58
|
+
{ switch(t)
|
59
|
+
{ case 0:
|
60
|
+
if(this.settings.tl || this.settings.tr)
|
61
|
+
{ var newMainContainer = document.createElement("DIV"); newMainContainer.style.width = "100%"; newMainContainer.style.fontSize = "1px"; newMainContainer.style.overflow = "hidden"; newMainContainer.style.position = "absolute"; newMainContainer.style.paddingLeft = this.borderWidth + "px"; newMainContainer.style.paddingRight = this.borderWidth + "px"; var topMaxRadius = Math.max(this.settings.tl ? this.settings.tl.radius : 0, this.settings.tr ? this.settings.tr.radius : 0); newMainContainer.style.height = topMaxRadius + "px"; newMainContainer.style.top = 0 - topMaxRadius + "px"; newMainContainer.style.left = 0 - this.borderWidth + "px"; this.topContainer = this.box.appendChild(newMainContainer);}
|
62
|
+
break; case 1:
|
63
|
+
if(this.settings.bl || this.settings.br)
|
64
|
+
{ var newMainContainer = document.createElement("DIV"); newMainContainer.style.width = "100%"; newMainContainer.style.fontSize = "1px"; newMainContainer.style.overflow = "hidden"; newMainContainer.style.position = "absolute"; newMainContainer.style.paddingLeft = this.borderWidth + "px"; newMainContainer.style.paddingRight = this.borderWidth + "px"; var botMaxRadius = Math.max(this.settings.bl ? this.settings.bl.radius : 0, this.settings.br ? this.settings.br.radius : 0); newMainContainer.style.height = botMaxRadius + "px"; newMainContainer.style.bottom = 0 - botMaxRadius + "px"; newMainContainer.style.left = 0 - this.borderWidth + "px"; this.bottomContainer = this.box.appendChild(newMainContainer);}
|
65
|
+
break;}
|
66
|
+
}
|
67
|
+
if(this.topContainer) this.box.style.borderTopWidth = "0px"; if(this.bottomContainer) this.box.style.borderBottomWidth = "0px"; var corners = ["tr", "tl", "br", "bl"]; for(var i in corners)
|
68
|
+
{ if(i > -1 < 4)
|
69
|
+
{ var cc = corners[i]; if(!this.settings[cc])
|
70
|
+
{ if(((cc == "tr" || cc == "tl") && this.topContainer != null) || ((cc == "br" || cc == "bl") && this.bottomContainer != null))
|
71
|
+
{ var newCorner = document.createElement("DIV"); newCorner.style.position = "relative"; newCorner.style.fontSize = "1px"; newCorner.style.overflow = "hidden"; if(this.backgroundImage == "")
|
72
|
+
newCorner.style.backgroundColor = this.boxColour; else
|
73
|
+
newCorner.style.backgroundImage = this.backgroundImage; switch(cc)
|
74
|
+
{ case "tl":
|
75
|
+
newCorner.style.height = topMaxRadius - this.borderWidth + "px"; newCorner.style.marginRight = this.settings.tr.radius - (this.borderWidth*2) + "px"; newCorner.style.borderLeft = this.borderString; newCorner.style.borderTop = this.borderString; newCorner.style.left = -this.borderWidth + "px"; break; case "tr":
|
76
|
+
newCorner.style.height = topMaxRadius - this.borderWidth + "px"; newCorner.style.marginLeft = this.settings.tl.radius - (this.borderWidth*2) + "px"; newCorner.style.borderRight = this.borderString; newCorner.style.borderTop = this.borderString; newCorner.style.backgroundPosition = "-" + (topMaxRadius + this.borderWidth) + "px 0px"; newCorner.style.left = this.borderWidth + "px"; break; case "bl":
|
77
|
+
newCorner.style.height = botMaxRadius - this.borderWidth + "px"; newCorner.style.marginRight = this.settings.br.radius - (this.borderWidth*2) + "px"; newCorner.style.borderLeft = this.borderString; newCorner.style.borderBottom = this.borderString; newCorner.style.left = -this.borderWidth + "px"; newCorner.style.backgroundPosition = "-" + (this.borderWidth) + "px -" + (this.boxHeight + (botMaxRadius + this.borderWidth)) + "px"; break; case "br":
|
78
|
+
newCorner.style.height = botMaxRadius - this.borderWidth + "px"; newCorner.style.marginLeft = this.settings.bl.radius - (this.borderWidth*2) + "px"; newCorner.style.borderRight = this.borderString; newCorner.style.borderBottom = this.borderString; newCorner.style.left = this.borderWidth + "px"
|
79
|
+
newCorner.style.backgroundPosition = "-" + (botMaxRadius + this.borderWidth) + "px -" + (this.boxHeight + (botMaxRadius + this.borderWidth)) + "px"; break;}
|
80
|
+
}
|
81
|
+
}
|
82
|
+
else
|
83
|
+
{ if(this.masterCorners[this.settings[cc].radius])
|
84
|
+
{ var newCorner = this.masterCorners[this.settings[cc].radius].cloneNode(true);}
|
85
|
+
else
|
86
|
+
{ var newCorner = document.createElement("DIV"); newCorner.style.height = this.settings[cc].radius + "px"; newCorner.style.width = this.settings[cc].radius + "px"; newCorner.style.position = "absolute"; newCorner.style.fontSize = "1px"; newCorner.style.overflow = "hidden"; var borderRadius = parseInt(this.settings[cc].radius - this.borderWidth); for(var intx = 0, j = this.settings[cc].radius; intx < j; intx++)
|
87
|
+
{ if((intx +1) >= borderRadius)
|
88
|
+
var y1 = -1; else
|
89
|
+
var y1 = (Math.floor(Math.sqrt(Math.pow(borderRadius, 2) - Math.pow((intx+1), 2))) - 1); if(borderRadius != j)
|
90
|
+
{ if((intx) >= borderRadius)
|
91
|
+
var y2 = -1; else
|
92
|
+
var y2 = Math.ceil(Math.sqrt(Math.pow(borderRadius,2) - Math.pow(intx, 2))); if((intx+1) >= j)
|
93
|
+
var y3 = -1; else
|
94
|
+
var y3 = (Math.floor(Math.sqrt(Math.pow(j ,2) - Math.pow((intx+1), 2))) - 1);}
|
95
|
+
if((intx) >= j)
|
96
|
+
var y4 = -1; else
|
97
|
+
var y4 = Math.ceil(Math.sqrt(Math.pow(j ,2) - Math.pow(intx, 2))); if(y1 > -1) this.drawPixel(intx, 0, this.boxColour, 100, (y1+1), newCorner, -1, this.settings[cc].radius); if(borderRadius != j)
|
98
|
+
{ for(var inty = (y1 + 1); inty < y2; inty++)
|
99
|
+
{ if(this.settings.antiAlias)
|
100
|
+
{ if(this.backgroundImage != "")
|
101
|
+
{ var borderFract = (pixelFraction(intx, inty, borderRadius) * 100); if(borderFract < 30)
|
102
|
+
{ this.drawPixel(intx, inty, this.borderColour, 100, 1, newCorner, 0, this.settings[cc].radius);}
|
103
|
+
else
|
104
|
+
{ this.drawPixel(intx, inty, this.borderColour, 100, 1, newCorner, -1, this.settings[cc].radius);}
|
105
|
+
}
|
106
|
+
else
|
107
|
+
{ var pixelcolour = BlendColour(this.boxColour, this.borderColour, pixelFraction(intx, inty, borderRadius)); this.drawPixel(intx, inty, pixelcolour, 100, 1, newCorner, 0, this.settings[cc].radius, cc);}
|
108
|
+
}
|
109
|
+
}
|
110
|
+
if(this.settings.antiAlias)
|
111
|
+
{ if(y3 >= y2)
|
112
|
+
{ if (y2 == -1) y2 = 0; this.drawPixel(intx, y2, this.borderColour, 100, (y3 - y2 + 1), newCorner, 0, 0);}
|
113
|
+
}
|
114
|
+
else
|
115
|
+
{ if(y3 >= y1)
|
116
|
+
{ this.drawPixel(intx, (y1 + 1), this.borderColour, 100, (y3 - y1), newCorner, 0, 0);}
|
117
|
+
}
|
118
|
+
var outsideColour = this.borderColour;}
|
119
|
+
else
|
120
|
+
{ var outsideColour = this.boxColour; var y3 = y1;}
|
121
|
+
if(this.settings.antiAlias)
|
122
|
+
{ for(var inty = (y3 + 1); inty < y4; inty++)
|
123
|
+
{ this.drawPixel(intx, inty, outsideColour, (pixelFraction(intx, inty , j) * 100), 1, newCorner, ((this.borderWidth > 0)? 0 : -1), this.settings[cc].radius);}
|
124
|
+
}
|
125
|
+
}
|
126
|
+
this.masterCorners[this.settings[cc].radius] = newCorner.cloneNode(true);}
|
127
|
+
if(cc != "br")
|
128
|
+
{ for(var t = 0, k = newCorner.childNodes.length; t < k; t++)
|
129
|
+
{ var pixelBar = newCorner.childNodes[t]; var pixelBarTop = parseInt(pixelBar.style.top.substring(0, pixelBar.style.top.indexOf("px"))); var pixelBarLeft = parseInt(pixelBar.style.left.substring(0, pixelBar.style.left.indexOf("px"))); var pixelBarHeight = parseInt(pixelBar.style.height.substring(0, pixelBar.style.height.indexOf("px"))); if(cc == "tl" || cc == "bl"){ pixelBar.style.left = this.settings[cc].radius -pixelBarLeft -1 + "px";}
|
130
|
+
if(cc == "tr" || cc == "tl"){ pixelBar.style.top = this.settings[cc].radius -pixelBarHeight -pixelBarTop + "px";}
|
131
|
+
switch(cc)
|
132
|
+
{ case "tr":
|
133
|
+
pixelBar.style.backgroundPosition = "-" + Math.abs((this.boxWidth - this.settings[cc].radius + this.borderWidth) + pixelBarLeft) + "px -" + Math.abs(this.settings[cc].radius -pixelBarHeight -pixelBarTop - this.borderWidth) + "px"; break; case "tl":
|
134
|
+
pixelBar.style.backgroundPosition = "-" + Math.abs((this.settings[cc].radius -pixelBarLeft -1) - this.borderWidth) + "px -" + Math.abs(this.settings[cc].radius -pixelBarHeight -pixelBarTop - this.borderWidth) + "px"; break; case "bl":
|
135
|
+
pixelBar.style.backgroundPosition = "-" + Math.abs((this.settings[cc].radius -pixelBarLeft -1) - this.borderWidth) + "px -" + Math.abs((this.boxHeight + this.settings[cc].radius + pixelBarTop) -this.borderWidth) + "px"; break;}
|
136
|
+
}
|
137
|
+
}
|
138
|
+
}
|
139
|
+
if(newCorner)
|
140
|
+
{ switch(cc)
|
141
|
+
{ case "tl":
|
142
|
+
if(newCorner.style.position == "absolute") newCorner.style.top = "0px"; if(newCorner.style.position == "absolute") newCorner.style.left = "0px"; if(this.topContainer) this.topContainer.appendChild(newCorner); break; case "tr":
|
143
|
+
if(newCorner.style.position == "absolute") newCorner.style.top = "0px"; if(newCorner.style.position == "absolute") newCorner.style.right = "0px"; if(this.topContainer) this.topContainer.appendChild(newCorner); break; case "bl":
|
144
|
+
if(newCorner.style.position == "absolute") newCorner.style.bottom = "0px"; if(newCorner.style.position == "absolute") newCorner.style.left = "0px"; if(this.bottomContainer) this.bottomContainer.appendChild(newCorner); break; case "br":
|
145
|
+
if(newCorner.style.position == "absolute") newCorner.style.bottom = "0px"; if(newCorner.style.position == "absolute") newCorner.style.right = "0px"; if(this.bottomContainer) this.bottomContainer.appendChild(newCorner); break;}
|
146
|
+
}
|
147
|
+
}
|
148
|
+
}
|
149
|
+
var radiusDiff = new Array(); radiusDiff["t"] = Math.abs(this.settings.tl.radius - this.settings.tr.radius)
|
150
|
+
radiusDiff["b"] = Math.abs(this.settings.bl.radius - this.settings.br.radius); for(z in radiusDiff)
|
151
|
+
{ if(z == "t" || z == "b")
|
152
|
+
{ if(radiusDiff[z])
|
153
|
+
{ var smallerCornerType = ((this.settings[z + "l"].radius < this.settings[z + "r"].radius)? z +"l" : z +"r"); var newFiller = document.createElement("DIV"); newFiller.style.height = radiusDiff[z] + "px"; newFiller.style.width = this.settings[smallerCornerType].radius+ "px"
|
154
|
+
newFiller.style.position = "absolute"; newFiller.style.fontSize = "1px"; newFiller.style.overflow = "hidden"; newFiller.style.backgroundColor = this.boxColour; switch(smallerCornerType)
|
155
|
+
{ case "tl":
|
156
|
+
newFiller.style.bottom = "0px"; newFiller.style.left = "0px"; newFiller.style.borderLeft = this.borderString; this.topContainer.appendChild(newFiller); break; case "tr":
|
157
|
+
newFiller.style.bottom = "0px"; newFiller.style.right = "0px"; newFiller.style.borderRight = this.borderString; this.topContainer.appendChild(newFiller); break; case "bl":
|
158
|
+
newFiller.style.top = "0px"; newFiller.style.left = "0px"; newFiller.style.borderLeft = this.borderString; this.bottomContainer.appendChild(newFiller); break; case "br":
|
159
|
+
newFiller.style.top = "0px"; newFiller.style.right = "0px"; newFiller.style.borderRight = this.borderString; this.bottomContainer.appendChild(newFiller); break;}
|
160
|
+
}
|
161
|
+
var newFillerBar = document.createElement("DIV"); newFillerBar.style.position = "relative"; newFillerBar.style.fontSize = "1px"; newFillerBar.style.overflow = "hidden"; newFillerBar.style.backgroundColor = this.boxColour; newFillerBar.style.backgroundImage = this.backgroundImage; switch(z)
|
162
|
+
{ case "t":
|
163
|
+
if(this.topContainer)
|
164
|
+
{ if(this.settings.tl.radius && this.settings.tr.radius)
|
165
|
+
{ newFillerBar.style.height = topMaxRadius - this.borderWidth + "px"; newFillerBar.style.marginLeft = this.settings.tl.radius - this.borderWidth + "px"; newFillerBar.style.marginRight = this.settings.tr.radius - this.borderWidth + "px"; newFillerBar.style.borderTop = this.borderString; if(this.backgroundImage != "")
|
166
|
+
newFillerBar.style.backgroundPosition = "-" + (topMaxRadius + this.borderWidth) + "px 0px"; this.topContainer.appendChild(newFillerBar);}
|
167
|
+
this.box.style.backgroundPosition = "0px -" + (topMaxRadius - this.borderWidth) + "px";}
|
168
|
+
break; case "b":
|
169
|
+
if(this.bottomContainer)
|
170
|
+
{ if(this.settings.bl.radius && this.settings.br.radius)
|
171
|
+
{ newFillerBar.style.height = botMaxRadius - this.borderWidth + "px"; newFillerBar.style.marginLeft = this.settings.bl.radius - this.borderWidth + "px"; newFillerBar.style.marginRight = this.settings.br.radius - this.borderWidth + "px"; newFillerBar.style.borderBottom = this.borderString; if(this.backgroundImage != "")
|
172
|
+
newFillerBar.style.backgroundPosition = "-" + (botMaxRadius + this.borderWidth) + "px -" + (this.boxHeight + (topMaxRadius + this.borderWidth)) + "px"; this.bottomContainer.appendChild(newFillerBar);}
|
173
|
+
}
|
174
|
+
break;}
|
175
|
+
}
|
176
|
+
}
|
177
|
+
if(this.settings.autoPad == true && this.boxPadding > 0)
|
178
|
+
{ var contentContainer = document.createElement("DIV"); contentContainer.style.position = "relative"; contentContainer.innerHTML = this.boxContent; contentContainer.className = "autoPadDiv"; var topPadding = Math.abs(topMaxRadius - this.boxPadding); var botPadding = Math.abs(botMaxRadius - this.boxPadding); if(topMaxRadius < this.boxPadding)
|
179
|
+
contentContainer.style.paddingTop = topPadding + "px"; if(botMaxRadius < this.boxPadding)
|
180
|
+
contentContainer.style.paddingBottom = botMaxRadius + "px"; contentContainer.style.paddingLeft = this.boxPadding + "px"; contentContainer.style.paddingRight = this.boxPadding + "px"; this.contentDIV = this.box.appendChild(contentContainer);}
|
181
|
+
}
|
182
|
+
this.drawPixel = function(intx, inty, colour, transAmount, height, newCorner, image, cornerRadius)
|
183
|
+
{ var pixel = document.createElement("DIV"); pixel.style.height = height + "px"; pixel.style.width = "1px"; pixel.style.position = "absolute"; pixel.style.fontSize = "1px"; pixel.style.overflow = "hidden"; var topMaxRadius = Math.max(this.settings["tr"].radius, this.settings["tl"].radius); if(image == -1 && this.backgroundImage != "")
|
184
|
+
{ pixel.style.backgroundImage = this.backgroundImage; pixel.style.backgroundPosition = "-" + (this.boxWidth - (cornerRadius - intx) + this.borderWidth) + "px -" + ((this.boxHeight + topMaxRadius + inty) -this.borderWidth) + "px";}
|
185
|
+
else
|
186
|
+
{ pixel.style.backgroundColor = colour;}
|
187
|
+
if (transAmount != 100)
|
188
|
+
setOpacity(pixel, transAmount); pixel.style.top = inty + "px"; pixel.style.left = intx + "px"; newCorner.appendChild(pixel);}
|
189
|
+
}
|
190
|
+
function insertAfter(parent, node, referenceNode)
|
191
|
+
{ parent.insertBefore(node, referenceNode.nextSibling);}
|
192
|
+
function BlendColour(Col1, Col2, Col1Fraction)
|
193
|
+
{ var red1 = parseInt(Col1.substr(1,2),16); var green1 = parseInt(Col1.substr(3,2),16); var blue1 = parseInt(Col1.substr(5,2),16); var red2 = parseInt(Col2.substr(1,2),16); var green2 = parseInt(Col2.substr(3,2),16); var blue2 = parseInt(Col2.substr(5,2),16); if(Col1Fraction > 1 || Col1Fraction < 0) Col1Fraction = 1; var endRed = Math.round((red1 * Col1Fraction) + (red2 * (1 - Col1Fraction))); if(endRed > 255) endRed = 255; if(endRed < 0) endRed = 0; var endGreen = Math.round((green1 * Col1Fraction) + (green2 * (1 - Col1Fraction))); if(endGreen > 255) endGreen = 255; if(endGreen < 0) endGreen = 0; var endBlue = Math.round((blue1 * Col1Fraction) + (blue2 * (1 - Col1Fraction))); if(endBlue > 255) endBlue = 255; if(endBlue < 0) endBlue = 0; return "#" + IntToHex(endRed)+ IntToHex(endGreen)+ IntToHex(endBlue);}
|
194
|
+
function IntToHex(strNum)
|
195
|
+
{ base = strNum / 16; rem = strNum % 16; base = base - (rem / 16); baseS = MakeHex(base); remS = MakeHex(rem); return baseS + '' + remS;}
|
196
|
+
function MakeHex(x)
|
197
|
+
{ if((x >= 0) && (x <= 9))
|
198
|
+
{ return x;}
|
199
|
+
else
|
200
|
+
{ switch(x)
|
201
|
+
{ case 10: return "A"; case 11: return "B"; case 12: return "C"; case 13: return "D"; case 14: return "E"; case 15: return "F";}
|
202
|
+
}
|
203
|
+
}
|
204
|
+
function pixelFraction(x, y, r)
|
205
|
+
{ var pixelfraction = 0; var xvalues = new Array(1); var yvalues = new Array(1); var point = 0; var whatsides = ""; var intersect = Math.sqrt((Math.pow(r,2) - Math.pow(x,2))); if ((intersect >= y) && (intersect < (y+1)))
|
206
|
+
{ whatsides = "Left"; xvalues[point] = 0; yvalues[point] = intersect - y; point = point + 1;}
|
207
|
+
var intersect = Math.sqrt((Math.pow(r,2) - Math.pow(y+1,2))); if ((intersect >= x) && (intersect < (x+1)))
|
208
|
+
{ whatsides = whatsides + "Top"; xvalues[point] = intersect - x; yvalues[point] = 1; point = point + 1;}
|
209
|
+
var intersect = Math.sqrt((Math.pow(r,2) - Math.pow(x+1,2))); if ((intersect >= y) && (intersect < (y+1)))
|
210
|
+
{ whatsides = whatsides + "Right"; xvalues[point] = 1; yvalues[point] = intersect - y; point = point + 1;}
|
211
|
+
var intersect = Math.sqrt((Math.pow(r,2) - Math.pow(y,2))); if ((intersect >= x) && (intersect < (x+1)))
|
212
|
+
{ whatsides = whatsides + "Bottom"; xvalues[point] = intersect - x; yvalues[point] = 0;}
|
213
|
+
switch (whatsides)
|
214
|
+
{ case "LeftRight":
|
215
|
+
pixelfraction = Math.min(yvalues[0],yvalues[1]) + ((Math.max(yvalues[0],yvalues[1]) - Math.min(yvalues[0],yvalues[1]))/2); break; case "TopRight":
|
216
|
+
pixelfraction = 1-(((1-xvalues[0])*(1-yvalues[1]))/2); break; case "TopBottom":
|
217
|
+
pixelfraction = Math.min(xvalues[0],xvalues[1]) + ((Math.max(xvalues[0],xvalues[1]) - Math.min(xvalues[0],xvalues[1]))/2); break; case "LeftBottom":
|
218
|
+
pixelfraction = (yvalues[0]*xvalues[1])/2; break; default:
|
219
|
+
pixelfraction = 1;}
|
220
|
+
return pixelfraction;}
|
221
|
+
function rgb2Hex(rgbColour)
|
222
|
+
{ try{ var rgbArray = rgb2Array(rgbColour); var red = parseInt(rgbArray[0]); var green = parseInt(rgbArray[1]); var blue = parseInt(rgbArray[2]); var hexColour = "#" + IntToHex(red) + IntToHex(green) + IntToHex(blue);}
|
223
|
+
catch(e){ alert("There was an error converting the RGB value to Hexadecimal in function rgb2Hex");}
|
224
|
+
return hexColour;}
|
225
|
+
function rgb2Array(rgbColour)
|
226
|
+
{ var rgbValues = rgbColour.substring(4, rgbColour.indexOf(")")); var rgbArray = rgbValues.split(", "); return rgbArray;}
|
227
|
+
function setOpacity(obj, opacity)
|
228
|
+
{ opacity = (opacity == 100)?99.999:opacity; if(isSafari && obj.tagName != "IFRAME")
|
229
|
+
{ var rgbArray = rgb2Array(obj.style.backgroundColor); var red = parseInt(rgbArray[0]); var green = parseInt(rgbArray[1]); var blue = parseInt(rgbArray[2]); obj.style.backgroundColor = "rgba(" + red + ", " + green + ", " + blue + ", " + opacity/100 + ")";}
|
230
|
+
else if(typeof(obj.style.opacity) != "undefined")
|
231
|
+
{ obj.style.opacity = opacity/100;}
|
232
|
+
else if(typeof(obj.style.MozOpacity) != "undefined")
|
233
|
+
{ obj.style.MozOpacity = opacity/100;}
|
234
|
+
else if(typeof(obj.style.filter) != "undefined")
|
235
|
+
{ obj.style.filter = "alpha(opacity:" + opacity + ")";}
|
236
|
+
else if(typeof(obj.style.KHTMLOpacity) != "undefined")
|
237
|
+
{ obj.style.KHTMLOpacity = opacity/100;}
|
238
|
+
}
|
239
|
+
function inArray(array, value)
|
240
|
+
{ for(var i = 0; i < array.length; i++){ if (array[i] === value) return i;}
|
241
|
+
return false;}
|
242
|
+
function inArrayKey(array, value)
|
243
|
+
{ for(key in array){ if(key === value) return true;}
|
244
|
+
return false;}
|
245
|
+
function addEvent(elm, evType, fn, useCapture) { if (elm.addEventListener) { elm.addEventListener(evType, fn, useCapture); return true;}
|
246
|
+
else if (elm.attachEvent) { var r = elm.attachEvent('on' + evType, fn); return r;}
|
247
|
+
else { elm['on' + evType] = fn;}
|
248
|
+
}
|
249
|
+
function removeEvent(obj, evType, fn, useCapture){ if (obj.removeEventListener){ obj.removeEventListener(evType, fn, useCapture); return true;} else if (obj.detachEvent){ var r = obj.detachEvent("on"+evType, fn); return r;} else { alert("Handler could not be removed");}
|
250
|
+
}
|
251
|
+
function format_colour(colour)
|
252
|
+
{ var returnColour = "#ffffff"; if(colour != "" && colour != "transparent")
|
253
|
+
{ if(colour.substr(0, 3) == "rgb")
|
254
|
+
{ returnColour = rgb2Hex(colour);}
|
255
|
+
else if(colour.length == 4)
|
256
|
+
{ returnColour = "#" + colour.substring(1, 2) + colour.substring(1, 2) + colour.substring(2, 3) + colour.substring(2, 3) + colour.substring(3, 4) + colour.substring(3, 4);}
|
257
|
+
else
|
258
|
+
{ returnColour = colour;}
|
259
|
+
}
|
260
|
+
return returnColour;}
|
261
|
+
function get_style(obj, property, propertyNS)
|
262
|
+
{ try
|
263
|
+
{ if(obj.currentStyle)
|
264
|
+
{ var returnVal = eval("obj.currentStyle." + property);}
|
265
|
+
else
|
266
|
+
{ if(isSafari && obj.style.display == "none")
|
267
|
+
{ obj.style.display = ""; var wasHidden = true;}
|
268
|
+
var returnVal = document.defaultView.getComputedStyle(obj, '').getPropertyValue(propertyNS); if(isSafari && wasHidden)
|
269
|
+
{ obj.style.display = "none";}
|
270
|
+
}
|
271
|
+
}
|
272
|
+
catch(e)
|
273
|
+
{ }
|
274
|
+
return returnVal;}
|
275
|
+
function getElementsByClass(searchClass, node, tag)
|
276
|
+
{ var classElements = new Array(); if(node == null)
|
277
|
+
node = document; if(tag == null)
|
278
|
+
tag = '*'; var els = node.getElementsByTagName(tag); var elsLen = els.length; var pattern = new RegExp("(^|\s)"+searchClass+"(\s|$)"); for (i = 0, j = 0; i < elsLen; i++)
|
279
|
+
{ if(pattern.test(els[i].className))
|
280
|
+
{ classElements[j] = els[i]; j++;}
|
281
|
+
}
|
282
|
+
return classElements;}
|
283
|
+
function newCurvyError(errorMessage)
|
284
|
+
{ return new Error("curvyCorners Error:\n" + errorMessage)
|
285
|
+
}
|