source: Dev/trunk/src/client/dojox/drawing/stencil/Text.js @ 532

Last change on this file since 532 was 483, checked in by hendrikvanantwerpen, 11 years ago

Added Dojo 1.9.3 release.

  • Property svn:executable set to *
File size: 6.0 KB
Line 
1define(["dojo", "../util/oo", "./_Base", "../manager/_registry", "../util/typeset"],
2function(dojo, oo, Base, registry, typeset){
3
4var Text = oo.declare(
5        Base,
6        function(options){
7                // summary:
8                //              constructor.
9        },
10        {
11                // summary:
12                //              Creates a dojox.gfx Text (SVG or VML) based on data provided.
13                // description:
14                //              There are two text classes. TextBlock extends this one and
15                //              adds editable functionality, discovers text width etc.
16                //              This class displays text only. There is no line wrapping.
17                //              Multiple lines can be achieved by inserting \n linebreaks
18                //              in the text.
19
20                type:"dojox.drawing.stencil.Text",
21                anchorType:"none",
22                baseRender:true,
23
24                // align: String
25                //              Text horizontal alignment.
26                //              Options: start, middle, end
27                align:"start",
28
29                // valign: String
30                //              Text vertical alignment
31                //              Options: top, middle, bottom (FIXME: bottom not supported)
32                valign:"top",
33
34                // _lineHeight: [readonly] Number
35                //      The height of each line of text. Based on style information
36                //              and font size.
37                _lineHeight:1,
38
39                /*=====
40                StencilData: {
41                        // summary:
42                        //              The data used to create the dojox.gfx Text
43                        // x: Number
44                        //              Left point x
45                        // y: Number
46                        //              Top point y
47                        // width: ? Number
48                        //              Optional width of Text. Not required but reccommended.
49                        //              for auto-sizing, use TextBlock
50                        // height: ? Number
51                        //              Optional height of Text. If not provided, _lineHeight is used.
52                        // text: String
53                        //              The string content. If not provided, may auto-delete depending on defaults.
54                },
55
56                StencilPoints: [
57                        // summary:
58                        //              An Array of dojox.__StencilPoint objects that describe the Stencil
59                        //              [Top left point, Top right point, Bottom right point, Bottom left point]
60                ],
61                =====*/
62
63                typesetter: function(text){
64                        // summary:
65                        //              Register raw text, returning typeset form.
66                        //              Uses function dojox.drawing.stencil.Text.typeset
67                        //              for typesetting, if it exists.
68
69                        //if(dojox.drawing.util.typeset){
70                                this._rawText = text;
71                                return typeset.convertLaTeX(text);
72                        //}
73                        //return text;
74                },
75
76                setText: function(text){
77                        // summary:
78                        //              Setter for text.
79
80                        // Only apply typesetting to objects that the user can modify.
81                        // Else, it is assumed that typesetting is done elsewhere.
82                        if(this.enabled){
83                                text = this.typesetter(text);
84                        }
85                        // This only has an effect if text is null or this.created is false.
86                        this._text = text;
87
88                        this._textArray = [];
89                        this.created && this.render(text);
90                },
91
92                getText: function(){
93                        // summary:
94                        //              Getter for text.
95
96                        return this._rawText || this._text;
97                },
98
99                dataToPoints: function(/*Object*/o){
100                        // summary:
101                        //              Converts data to points.
102                        o = o || this.data;
103                        var w = o.width =="auto" ? 1 : o.width;
104                        var h = o.height || this._lineHeight;
105                        this.points = [
106                                {x:o.x, y:o.y},                                 // TL
107                                {x:o.x + w, y:o.y},                             // TR
108                                {x:o.x + w, y:o.y + h},                 // BR
109                                {x:o.x, y:o.y + h}                              // BL
110                        ];
111                        return this.points;
112                },
113                pointsToData: function(/*Array*/p){
114                        // summary:
115                        //              Converts points to data
116                        p = p || this.points;
117                        var s = p[0];
118                        var e = p[2];
119                        this.data = {
120                                x: s.x,
121                                y: s.y,
122                                width: e.x-s.x,
123                                height: e.y-s.y
124                        };
125                        return this.data;
126                },
127
128                render: function(/* String*/text){
129                        // summary:
130                        //              Renders the 'hit' object (the shape used for an expanded
131                        //              hit area and for highlighting) and the'shape' (the actual
132                        //              display object). Text is slightly different than other
133                        //              implementations. Instead of calling render twice, it calls
134                        //              _createHilite for the 'hit'
135                        // text: String
136                        //              Changes text if sent. Be sure to use the setText and
137                        //              not to call this directly.
138
139                        this.remove(this.shape, this.hit);
140                        //console.log("text render, outline:", !this.annotation, this.renderHit, (!this.annotation && this.renderHit))
141                        !this.annotation && this.renderHit && this._renderOutline();
142                        if(text!=undefined){
143                                this._text = text;
144                                this._textArray = this._text.split("\n");
145                        }
146
147                        var d = this.pointsToData();
148                        var h = this._lineHeight;
149                        var x = d.x + this.style.text.pad*2;
150                        var y = d.y + this._lineHeight - (this.textSize*.4);
151                        if(this.valign=="middle"){
152                                y -= h/2;
153                        }
154                        this.shape = this.container.createGroup();
155
156                        /*console.log("    render ", this.type, this.id)
157                        console.log("    render Y:", d.y, "textSize:", this.textSize, "LH:", this._lineHeight)
158                        console.log("    render text:", y, " ... ", this._text, "enabled:", this.enabled);
159                        console.log("    render text:", this.style.currentText);
160                        */
161                        dojo.forEach(this._textArray, function(txt, i){
162                                var tb = this.shape.createText({x: x, y: y+(h*i), text: unescape(txt), align: this.align})
163                                        .setFont(this.style.currentText)
164                                        .setFill(this.style.currentText.color);
165
166                                this._setNodeAtts(tb);
167
168                        }, this);
169
170                        this._setNodeAtts(this.shape);
171
172                },
173                _renderOutline: function(){
174                        // summary:
175                        //              Create the hit and highlight area
176                        //              for the Text.
177
178                        if(this.annotation){ return; }
179                        var d = this.pointsToData();
180
181                        if(this.align=="middle"){
182                                d.x -= d.width/2 - this.style.text.pad * 2;
183                        }else if(this.align=="start"){
184                                d.x += this.style.text.pad;
185                        }else if(this.align=="end"){
186                                d.x -= d.width - this.style.text.pad * 3;
187                        }
188
189                        if(this.valign=="middle"){
190                                d.y -= (this._lineHeight )/2 - this.style.text.pad;
191                        }
192
193                        this.hit = this.container.createRect(d)
194                                .setStroke(this.style.currentHit)
195                                .setFill(this.style.currentHit.fill);
196                                //.setFill("#ffff00");
197
198                        this._setNodeAtts(this.hit);
199                        this.hit.moveToBack();
200                },
201                makeFit: function(text, w){
202                        var span = dojo.create('span', {innerHTML:text, id:"foo"}, document.body);
203                        var sz = 1;
204                        dojo.style(span, "fontSize", sz+"px");
205                        var cnt = 30;
206                        while(dojo.marginBox(span).w<w){
207                                sz++;
208                                dojo.style(span, "fontSize", sz+"px");
209                                if(cnt--<=0) break;
210                        }
211                        sz--;
212                        var box = dojo.marginBox(span);
213                        dojo.destroy(span);
214
215                        return {size:sz, box:box};
216                }
217        }
218);
219
220dojo.setObject("dojox.drawing.stencil.Text", Text);
221registry.register({
222        name:"dojox.drawing.stencil.Text"
223}, "stencil");
224return Text;
225});
Note: See TracBrowser for help on using the repository browser.