Page Menu
Home
Code
Search
Configure Global Search
Log In
Files
F1128143
Figure.js
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Size
10 KB
Subscribers
None
Figure.js
View Options
/*
Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
Available via Academic Free License >= 2.1 OR the modified BSD license.
see: http://dojotoolkit.org/license for details
*/
if
(
!
dojo
.
_hasResource
[
"dojox.sketch.Figure"
]){
dojo
.
_hasResource
[
"dojox.sketch.Figure"
]
=
true
;
dojo
.
provide
(
"dojox.sketch.Figure"
);
dojo
.
experimental
(
"dojox.sketch"
);
dojo
.
require
(
"dojox.gfx"
);
dojo
.
require
(
"dojox.sketch.UndoStack"
);
(
function
(){
var
ta
=
dojox
.
sketch
;
ta
.
tools
=
{};
ta
.
registerTool
=
function
(
_1
,
fn
){
ta
.
tools
[
_1
]
=
fn
;
};
ta
.
Figure
=
function
(
_2
){
var
_3
=
this
;
this
.
annCounter
=
1
;
this
.
shapes
=
[];
this
.
image
=
null
;
this
.
imageSrc
=
null
;
this
.
size
=
{
w
:
0
,
h
:
0
};
this
.
surface
=
null
;
this
.
group
=
null
;
this
.
node
=
null
;
this
.
zoomFactor
=
1
;
this
.
tools
=
null
;
this
.
obj
=
{};
dojo
.
mixin
(
this
,
_2
);
this
.
selected
=
[];
this
.
hasSelections
=
function
(){
return
this
.
selected
.
length
>
0
;
};
this
.
isSelected
=
function
(
_4
){
for
(
var
i
=
0
;
i
<
_3
.
selected
.
length
;
i
++
){
if
(
_3
.
selected
[
i
]
==
_4
){
return
true
;
}
}
return
false
;
};
this
.
select
=
function
(
_5
){
if
(
!
_3
.
isSelected
(
_5
)){
_3
.
clearSelections
();
_3
.
selected
=
[
_5
];
}
_5
.
setMode
(
ta
.
Annotation
.
Modes
.
View
);
_5
.
setMode
(
ta
.
Annotation
.
Modes
.
Edit
);
};
this
.
deselect
=
function
(
_6
){
var
_7
=-
1
;
for
(
var
i
=
0
;
i
<
_3
.
selected
.
length
;
i
++
){
if
(
_3
.
selected
[
i
]
==
_6
){
_7
=
i
;
break
;
}
}
if
(
_7
>-
1
){
_6
.
setMode
(
ta
.
Annotation
.
Modes
.
View
);
_3
.
selected
.
splice
(
_7
,
1
);
}
return
_6
;
};
this
.
clearSelections
=
function
(){
for
(
var
i
=
0
;
i
<
_3
.
selected
.
length
;
i
++
){
_3
.
selected
[
i
].
setMode
(
ta
.
Annotation
.
Modes
.
View
);
}
_3
.
selected
=
[];
};
this
.
replaceSelection
=
function
(
n
,
o
){
if
(
!
_3
.
isSelected
(
o
)){
_3
.
select
(
n
);
return
;
}
var
_8
=-
1
;
for
(
var
i
=
0
;
i
<
_3
.
selected
.
length
;
i
++
){
if
(
_3
.
selected
[
i
]
==
o
){
_8
=
i
;
break
;
}
}
if
(
_8
>-
1
){
_3
.
selected
.
splice
(
_8
,
1
,
n
);
}
};
this
.
_c
=
null
;
this
.
_ctr
=
null
;
this
.
_lp
=
null
;
this
.
_action
=
null
;
this
.
_prevState
=
null
;
this
.
_startPoint
=
null
;
this
.
_ctool
=
null
;
this
.
_start
=
null
;
this
.
_end
=
null
;
this
.
_absEnd
=
null
;
this
.
_cshape
=
null
;
this
.
_dblclick
=
function
(
e
){
var
o
=
_3
.
_fromEvt
(
e
);
if
(
o
){
_3
.
onDblClickShape
(
o
,
e
);
}
};
this
.
_keydown
=
function
(
e
){
var
_9
=
false
;
if
(
e
.
ctrlKey
){
if
(
e
.
keyCode
===
90
||
e
.
keyCode
===
122
){
_3
.
undo
();
_9
=
true
;
}
else
{
if
(
e
.
keyCode
===
89
||
e
.
keyCode
===
121
){
_3
.
redo
();
_9
=
true
;
}
}
}
if
(
e
.
keyCode
===
46
||
e
.
keyCode
===
8
){
_3
.
_delete
(
_3
.
selected
);
_9
=
true
;
}
if
(
_9
){
dojo
.
stopEvent
(
e
);
}
};
this
.
_md
=
function
(
e
){
if
(
dojox
.
gfx
.
renderer
==
"vml"
){
_3
.
node
.
focus
();
}
var
o
=
_3
.
_fromEvt
(
e
);
_3
.
_startPoint
=
{
x
:
e
.
pageX
,
y
:
e
.
pageY
};
_3
.
_ctr
=
dojo
.
position
(
_3
.
node
);
var
_a
=
{
x
:
_3
.
node
.
scrollLeft
,
y
:
_3
.
node
.
scrollTop
};
_3
.
_ctr
=
{
x
:
_3
.
_ctr
.
x
-
_a
.
x
,
y
:
_3
.
_ctr
.
y
-
_a
.
y
};
var
X
=
e
.
clientX
-
_3
.
_ctr
.
x
,
Y
=
e
.
clientY
-
_3
.
_ctr
.
y
;
_3
.
_lp
=
{
x
:
X
,
y
:
Y
};
_3
.
_start
=
{
x
:
X
,
y
:
Y
};
_3
.
_end
=
{
x
:
X
,
y
:
Y
};
_3
.
_absEnd
=
{
x
:
X
,
y
:
Y
};
if
(
!
o
){
_3
.
clearSelections
();
_3
.
_ctool
.
onMouseDown
(
e
);
}
else
{
if
(
o
.
type
&&
o
.
type
()
!=
"Anchor"
){
if
(
!
_3
.
isSelected
(
o
)){
_3
.
select
(
o
);
_3
.
_sameShapeSelected
=
false
;
}
else
{
_3
.
_sameShapeSelected
=
true
;
}
}
o
.
beginEdit
();
_3
.
_c
=
o
;
}
};
this
.
_mm
=
function
(
e
){
if
(
!
_3
.
_ctr
){
return
;
}
var
x
=
e
.
clientX
-
_3
.
_ctr
.
x
;
var
y
=
e
.
clientY
-
_3
.
_ctr
.
y
;
var
dx
=
x
-
_3
.
_lp
.
x
;
var
dy
=
y
-
_3
.
_lp
.
y
;
_3
.
_absEnd
=
{
x
:
x
,
y
:
y
};
if
(
_3
.
_c
){
_3
.
_c
.
setBinding
({
dx
:
dx
/
_3
.
zoomFactor
,
dy
:
dy
/
_3
.
zoomFactor
});
_3
.
_lp
=
{
x
:
x
,
y
:
y
};
}
else
{
_3
.
_end
=
{
x
:
dx
,
y
:
dy
};
var
_b
=
{
x
:
Math
.
min
(
_3
.
_start
.
x
,
_3
.
_absEnd
.
x
),
y
:
Math
.
min
(
_3
.
_start
.
y
,
_3
.
_absEnd
.
y
),
width
:
Math
.
abs
(
_3
.
_start
.
x
-
_3
.
_absEnd
.
x
),
height
:
Math
.
abs
(
_3
.
_start
.
y
-
_3
.
_absEnd
.
y
)};
if
(
_b
.
width
&&
_b
.
height
){
_3
.
_ctool
.
onMouseMove
(
e
,
_b
);
}
}
};
this
.
_mu
=
function
(
e
){
if
(
_3
.
_c
){
_3
.
_c
.
endEdit
();
}
else
{
_3
.
_ctool
.
onMouseUp
(
e
);
}
_3
.
_c
=
_3
.
_ctr
=
_3
.
_lp
=
_3
.
_action
=
_3
.
_prevState
=
_3
.
_startPoint
=
null
;
_3
.
_cshape
=
_3
.
_start
=
_3
.
_end
=
_3
.
_absEnd
=
null
;
};
this
.
initUndoStack
();
};
var
p
=
ta
.
Figure
.
prototype
;
p
.
initUndoStack
=
function
(){
this
.
history
=
new
ta
.
UndoStack
(
this
);
};
p
.
setTool
=
function
(
t
){
this
.
_ctool
=
t
;
};
p
.
gridSize
=
0
;
p
.
_calCol
=
function
(
v
){
return
this
.
gridSize
?
(
Math
.
round
(
v
/
this
.
gridSize
)
*
this
.
gridSize
)
:
v
;
};
p
.
_delete
=
function
(
_c
,
_d
){
for
(
var
i
=
0
;
i
<
_c
.
length
;
i
++
){
_c
[
i
].
setMode
(
ta
.
Annotation
.
Modes
.
View
);
_c
[
i
].
destroy
(
_d
);
this
.
remove
(
_c
[
i
]);
this
.
_remove
(
_c
[
i
]);
if
(
!
_d
){
_c
[
i
].
onRemove
();
}
}
_c
.
splice
(
0
,
_c
.
length
);
};
p
.
onDblClickShape
=
function
(
_e
,
e
){
if
(
_e
[
"onDblClick"
]){
_e
.
onDblClick
(
e
);
}
};
p
.
onCreateShape
=
function
(
_f
){
};
p
.
onBeforeCreateShape
=
function
(
_10
){
};
p
.
initialize
=
function
(
_11
){
this
.
node
=
_11
;
this
.
surface
=
dojox
.
gfx
.
createSurface
(
_11
,
this
.
size
.
w
,
this
.
size
.
h
);
this
.
group
=
this
.
surface
.
createGroup
();
this
.
_cons
=
[];
var
es
=
this
.
surface
.
getEventSource
();
this
.
_cons
.
push
(
dojo
.
connect
(
es
,
"ondraggesture"
,
dojo
.
stopEvent
),
dojo
.
connect
(
es
,
"ondragenter"
,
dojo
.
stopEvent
),
dojo
.
connect
(
es
,
"ondragover"
,
dojo
.
stopEvent
),
dojo
.
connect
(
es
,
"ondragexit"
,
dojo
.
stopEvent
),
dojo
.
connect
(
es
,
"ondragstart"
,
dojo
.
stopEvent
),
dojo
.
connect
(
es
,
"onselectstart"
,
dojo
.
stopEvent
),
dojo
.
connect
(
es
,
"onmousedown"
,
this
.
_md
),
dojo
.
connect
(
es
,
"onmousemove"
,
this
.
_mm
),
dojo
.
connect
(
es
,
"onmouseup"
,
this
.
_mu
),
dojo
.
connect
(
es
,
"onclick"
,
this
,
"onClick"
),
dojo
.
connect
(
es
,
"ondblclick"
,
this
.
_dblclick
),
dojo
.
connect
(
_11
,
"onkeydown"
,
this
.
_keydown
));
this
.
image
=
this
.
group
.
createImage
({
width
:
this
.
imageSize
.
w
,
height
:
this
.
imageSize
.
h
,
src
:
this
.
imageSrc
});
};
p
.
destroy
=
function
(
_12
){
if
(
!
this
.
node
){
return
;
}
if
(
!
_12
){
if
(
this
.
history
){
this
.
history
.
destroy
();
}
if
(
this
.
_subscribed
){
dojo
.
unsubscribe
(
this
.
_subscribed
);
delete
this
.
_subscribed
;
}
}
dojo
.
forEach
(
this
.
_cons
,
dojo
.
disconnect
);
this
.
_cons
=
[];
dojo
.
empty
(
this
.
node
);
this
.
group
=
this
.
surface
=
null
;
this
.
obj
=
{};
this
.
shapes
=
[];
};
p
.
nextKey
=
function
(){
return
"annotation-"
+
this
.
annCounter
++
;
};
p
.
draw
=
function
(){
};
p
.
zoom
=
function
(
pct
){
this
.
zoomFactor
=
pct
/
100
;
var
w
=
this
.
size
.
w
*
this
.
zoomFactor
;
var
h
=
this
.
size
.
h
*
this
.
zoomFactor
;
this
.
surface
.
setDimensions
(
w
,
h
);
this
.
group
.
setTransform
(
dojox
.
gfx
.
matrix
.
scale
(
this
.
zoomFactor
,
this
.
zoomFactor
));
for
(
var
i
=
0
;
i
<
this
.
shapes
.
length
;
i
++
){
this
.
shapes
[
i
].
zoom
(
this
.
zoomFactor
);
}
};
p
.
getFit
=
function
(){
var
wF
=
(
this
.
node
.
parentNode
.
offsetWidth
-
5
)
/
this
.
size
.
w
;
var
hF
=
(
this
.
node
.
parentNode
.
offsetHeight
-
5
)
/
this
.
size
.
h
;
return
Math
.
min
(
wF
,
hF
)
*
100
;
};
p
.
unzoom
=
function
(){
this
.
zoomFactor
=
1
;
this
.
surface
.
setDimensions
(
this
.
size
.
w
,
this
.
size
.
h
);
this
.
group
.
setTransform
();
};
p
.
_add
=
function
(
obj
){
this
.
obj
[
obj
.
_key
]
=
obj
;
};
p
.
_remove
=
function
(
obj
){
if
(
this
.
obj
[
obj
.
_key
]){
delete
this
.
obj
[
obj
.
_key
];
}
};
p
.
_get
=
function
(
key
){
if
(
key
&&
key
.
indexOf
(
"bounding"
)
>-
1
){
key
=
key
.
replace
(
"-boundingBox"
,
""
);
}
else
{
if
(
key
&&
key
.
indexOf
(
"-labelShape"
)
>-
1
){
key
=
key
.
replace
(
"-labelShape"
,
""
);
}
}
return
this
.
obj
[
key
];
};
p
.
_keyFromEvt
=
function
(
e
){
var
key
=
e
.
target
.
id
+
""
;
if
(
key
.
length
==
0
){
var
p
=
e
.
target
.
parentNode
;
var
_13
=
this
.
surface
.
getEventSource
();
while
(
p
&&
p
.
id
.
length
==
0
&&
p
!=
_13
){
p
=
p
.
parentNode
;
}
key
=
p
.
id
;
}
return
key
;
};
p
.
_fromEvt
=
function
(
e
){
return
this
.
_get
(
this
.
_keyFromEvt
(
e
));
};
p
.
add
=
function
(
_14
){
for
(
var
i
=
0
;
i
<
this
.
shapes
.
length
;
i
++
){
if
(
this
.
shapes
[
i
]
==
_14
){
return
true
;
}
}
this
.
shapes
.
push
(
_14
);
return
true
;
};
p
.
remove
=
function
(
_15
){
var
idx
=-
1
;
for
(
var
i
=
0
;
i
<
this
.
shapes
.
length
;
i
++
){
if
(
this
.
shapes
[
i
]
==
_15
){
idx
=
i
;
break
;
}
}
if
(
idx
>-
1
){
this
.
shapes
.
splice
(
idx
,
1
);
}
return
_15
;
};
p
.
get
=
function
(
id
){
for
(
var
i
=
0
;
i
<
this
.
shapes
.
length
;
i
++
){
if
(
this
.
shapes
[
i
].
id
==
id
){
return
this
.
shapes
[
i
];
}
}
return
null
;
};
p
.
convert
=
function
(
ann
,
t
){
var
_16
=
t
+
"Annotation"
;
if
(
!
ta
[
_16
]){
return
;
}
var
_17
=
ann
.
type
(),
id
=
ann
.
id
,
_18
=
ann
.
label
,
_19
=
ann
.
mode
,
_1a
=
ann
.
tokenId
;
var
_1b
,
end
,
_1c
,
_1d
;
switch
(
_17
){
case
"Preexisting"
:
case
"Lead"
:
_1d
=
{
dx
:
ann
.
transform
.
dx
,
dy
:
ann
.
transform
.
dy
};
_1b
=
{
x
:
ann
.
start
.
x
,
y
:
ann
.
start
.
y
};
end
=
{
x
:
ann
.
end
.
x
,
y
:
ann
.
end
.
y
};
var
cx
=
end
.
x
-
((
end
.
x
-
_1b
.
x
)
/
2
);
var
cy
=
end
.
y
-
((
end
.
y
-
_1b
.
y
)
/
2
);
_1c
=
{
x
:
cx
,
y
:
cy
};
break
;
case
"SingleArrow"
:
case
"DoubleArrow"
:
_1d
=
{
dx
:
ann
.
transform
.
dx
,
dy
:
ann
.
transform
.
dy
};
_1b
=
{
x
:
ann
.
start
.
x
,
y
:
ann
.
start
.
y
};
end
=
{
x
:
ann
.
end
.
x
,
y
:
ann
.
end
.
y
};
_1c
=
{
x
:
ann
.
control
.
x
,
y
:
ann
.
control
.
y
};
break
;
case
"Underline"
:
_1d
=
{
dx
:
ann
.
transform
.
dx
,
dy
:
ann
.
transform
.
dy
};
_1b
=
{
x
:
ann
.
start
.
x
,
y
:
ann
.
start
.
y
};
_1c
=
{
x
:
_1b
.
x
+
50
,
y
:
_1b
.
y
+
50
};
end
=
{
x
:
_1b
.
x
+
100
,
y
:
_1b
.
y
+
100
};
break
;
case
"Brace"
:
}
var
n
=
new
ta
[
_16
](
this
,
id
);
if
(
n
.
type
()
==
"Underline"
){
n
.
transform
=
{
dx
:
_1d
.
dx
+
_1b
.
x
,
dy
:
_1d
.
dy
+
_1b
.
y
};
}
else
{
if
(
n
.
transform
){
n
.
transform
=
_1d
;
}
if
(
n
.
start
){
n
.
start
=
_1b
;
}
}
if
(
n
.
end
){
n
.
end
=
end
;
}
if
(
n
.
control
){
n
.
control
=
_1c
;
}
n
.
label
=
_18
;
n
.
token
=
dojo
.
lang
.
shallowCopy
(
ann
.
token
);
n
.
initialize
();
this
.
replaceSelection
(
n
,
ann
);
this
.
_remove
(
ann
);
this
.
remove
(
ann
);
ann
.
destroy
();
n
.
setMode
(
_19
);
};
p
.
setValue
=
function
(
_1e
){
var
obj
=
dojox
.
xml
.
DomParser
.
parse
(
_1e
);
var
_1f
=
this
.
node
;
this
.
load
(
obj
,
_1f
);
};
p
.
load
=
function
(
obj
,
n
){
if
(
this
.
surface
){
this
.
destroy
(
true
);
}
var
_20
=
obj
.
documentElement
;
this
.
size
=
{
w
:
parseFloat
(
_20
.
getAttribute
(
"width"
),
10
),
h
:
parseFloat
(
_20
.
getAttribute
(
"height"
),
10
)};
var
g
=
_20
.
childrenByName
(
"g"
)[
0
];
var
img
=
g
.
childrenByName
(
"image"
)[
0
];
this
.
imageSize
=
{
w
:
parseFloat
(
img
.
getAttribute
(
"width"
),
10
),
h
:
parseFloat
(
img
.
getAttribute
(
"height"
),
10
)};
this
.
imageSrc
=
img
.
getAttribute
(
"xlink:href"
);
this
.
initialize
(
n
);
var
ann
=
g
.
childrenByName
(
"g"
);
for
(
var
i
=
0
;
i
<
ann
.
length
;
i
++
){
this
.
_loadAnnotation
(
ann
[
i
]);
}
if
(
this
.
_loadDeferred
){
this
.
_loadDeferred
.
callback
(
this
);
this
.
_loadDeferred
=
null
;
}
this
.
onLoad
();
};
p
.
onLoad
=
function
(){
};
p
.
onClick
=
function
(){
};
p
.
_loadAnnotation
=
function
(
obj
){
var
_21
=
obj
.
getAttribute
(
"dojoxsketch:type"
)
+
"Annotation"
;
if
(
ta
[
_21
]){
var
a
=
new
ta
[
_21
](
this
,
obj
.
id
);
a
.
initialize
(
obj
);
this
.
nextKey
();
a
.
setMode
(
ta
.
Annotation
.
Modes
.
View
);
this
.
_add
(
a
);
return
a
;
}
return
null
;
};
p
.
onUndo
=
function
(){
};
p
.
onBeforeUndo
=
function
(){
};
p
.
onRedo
=
function
(){
};
p
.
onBeforeRedo
=
function
(){
};
p
.
undo
=
function
(){
if
(
this
.
history
){
this
.
onBeforeUndo
();
this
.
history
.
undo
();
this
.
onUndo
();
}
};
p
.
redo
=
function
(){
if
(
this
.
history
){
this
.
onBeforeRedo
();
this
.
history
.
redo
();
this
.
onRedo
();
}
};
p
.
serialize
=
function
(){
var
s
=
"<svg xmlns=\"http://www.w3.org/2000/svg\" "
+
"xmlns:xlink=\"http://www.w3.org/1999/xlink\" "
+
"xmlns:dojoxsketch=\"http://dojotoolkit.org/dojox/sketch\" "
+
"width=\""
+
this
.
size
.
w
+
"\" height=\""
+
this
.
size
.
h
+
"\">"
+
"<g>"
+
"<image xlink:href=\""
+
this
.
imageSrc
+
"\" x=\"0\" y=\"0\" width=\""
+
this
.
size
.
w
+
"\" height=\""
+
this
.
size
.
h
+
"\" />"
;
for
(
var
i
=
0
;
i
<
this
.
shapes
.
length
;
i
++
){
s
+=
this
.
shapes
[
i
].
serialize
();
}
s
+=
"</g></svg>"
;
return
s
;
};
p
.
getValue
=
p
.
serialize
;
})();
}
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Fri, Jun 20, 04:08 (2 w, 4 d ago)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
26274
Default Alt Text
Figure.js (10 KB)
Attached To
rZED Zed
Event Timeline
Log In to Comment