~ubuntu-it-wiki/wiki-ubuntu-it/wiki-repo

« back to all changes in this revision

Viewing changes to applets/moinFCKplugins/selection/fckplugin.js

  • Committer: Leo Iannacone
  • Date: 2011-06-02 15:05:37 UTC
  • Revision ID: l3on@ubuntu.com-20110602150537-ycrnf58qf67uf593
Added applets for gui editor

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
// debug function.
 
2
// TODO : make common javascript class and extract this one
 
3
function showObj(title, obj)
 
4
{ // show an object in a alert box
 
5
  var res = '';
 
6
  res += title+': '+obj+'\n\n';
 
7
  for (temp in obj)
 
8
  {
 
9
    res += temp+': '+obj[temp]+', ';
 
10
  }
 
11
  res += '\n';
 
12
  alert(res);
 
13
}
 
14
 
 
15
 
 
16
/* 
 
17
 * Checks if the name of any of the selected nodes or the nodes surrounding 
 
18
 * the selection match the pattern RE.
 
19
 * Returns FCK_TRISTATE_DISABLED insted of true.
 
20
 */
 
21
var sAlert = "";
 
22
 
 
23
var Alert = function(sText)
 
24
{
 
25
  if (sText!=sAlert)
 
26
  {
 
27
    sAlert = sText;
 
28
    alert(sText);
 
29
  }
 
30
}
 
31
 
 
32
 
 
33
 
 
34
/**
 
35
 * range usage is different on each browser
 
36
 * internet explorer use Microsoft Text Range and others use W3C Range
 
37
 * 
 
38
 * follow link describe that
 
39
 * http://www.quirksmode.org/dom/range_intro.html#t00
 
40
 *
 
41
 * because of this reason getting something on selected node is divided 2 part
 
42
 * first for internet explorer and second for others
 
43
 * each codes implement same function do same behavior
 
44
 * to understand following code. it's better others part first.
 
45
 * it's more easy and short
 
46
 */
 
47
 
 
48
 
 
49
// --------------------------------
 
50
// IE
 
51
// --------------------------------
 
52
if (sSuffix == 'ie') {
 
53
  // initialize startNode and endNode
 
54
  function invalidSelection()
 
55
  {
 
56
      FCKSelection._startNode = null;
 
57
      FCKSelection._endNode = null;
 
58
  }
 
59
 
 
60
  // everytime selection changed. initialize internal variables 
 
61
  FCK.AttachToOnSelectionChange(invalidSelection);
 
62
 
 
63
  FCKSelection._startNode = null;
 
64
  FCKSelection._endNode = null;
 
65
 
 
66
 
 
67
  // get start node of seleced element
 
68
  FCKSelection.GetStartNode = function()
 
69
  {
 
70
    if (!FCKSelection._startNode) 
 
71
    {
 
72
      FCKSelection._startNode = FCKSelection._getStartNode()
 
73
    }
 
74
    return FCKSelection._startNode;
 
75
  }
 
76
 
 
77
  
 
78
  FCKSelection._getStartNode = function()
 
79
  {
 
80
    if (FCKSelection._startNode) return FCKSelection._startNode;
 
81
 
 
82
    var oRange = FCKSelection.GetSelection().createRange();
 
83
 
 
84
    if (FCKSelection.GetType()=="Control")
 
85
    {
 
86
      return oRange.item(0);
 
87
    }
 
88
    else // Text, None
 
89
    {
 
90
      var oTmpRange = FCKSelection.GetSelection().createRange();
 
91
      var parent = oRange.parentElement();
 
92
      var oNode = null;
 
93
      var following_text = 0;
 
94
 
 
95
      // selection in empty tag
 
96
      if ( !parent.hasChildNodes() ) 
 
97
        return parent; 
 
98
 
 
99
      // the first child of the parent of the selection
 
100
      oNode = parent.firstChild;
 
101
      var oLastText = oNode;
 
102
 
 
103
      // looping all lower nodes of the parent of selected object
 
104
      // and compare it with first selected node 
 
105
      // if oNode is not a text compare start of oRange and end of oTmpRange
 
106
      // and then compare start of both range(oRange, oTmpRange)
 
107
      while (oNode)
 
108
      {
 
109
        if (oNode.nodeName != "#text") 
 
110
        {
 
111
          following_text = false;
 
112
          oTmpRange.moveToElementText(oNode);
 
113
          if (oRange.compareEndPoints('StartToEnd', oTmpRange)<0)
 
114
          {
 
115
            // found
 
116
            if (oRange.compareEndPoints('StartToStart', oTmpRange)<=0)
 
117
              return oLastText; // already inside selection
 
118
 
 
119
            oNode = oNode.firstChild;
 
120
          }
 
121
          else 
 
122
          {
 
123
            oNode = oNode.nextSibling;
 
124
          }
 
125
        }
 
126
        else // oNode.nodeName == '#text'
 
127
        {
 
128
          if (!following_text)
 
129
          {
 
130
            oLastText = oNode;
 
131
            following_text = true;
 
132
          }
 
133
 
 
134
          try {
 
135
            oNode = oNode.nextSibling;
 
136
          }
 
137
          catch (e) {
 
138
            if (parent.childNodes.length>=2)
 
139
            {
 
140
              oNode = parent.childNodes[1];
 
141
            }
 
142
            else 
 
143
            {
 
144
              return parent;
 
145
            }
 
146
          } // end of catch
 
147
        } // end of else
 
148
      } // end of while
 
149
      return oLastText;
 
150
    } // end of else
 
151
  }
 
152
 
 
153
  // getting start node offset
 
154
  FCKSelection.GetStartOffset = function() 
 
155
  {
 
156
    // XXX does not work yet!
 
157
    var oNode = FCKSelection.GetStartNode();
 
158
    
 
159
    // not a text node 
 
160
    if (oNode.nodeType != 3) 
 
161
      return 0; 
 
162
 
 
163
    var startoffset = 0;
 
164
    var selrange = FCKSelection.GetSelection().createRange();
 
165
    var elrange = selrange.duplicate();
 
166
 
 
167
    if (oNode.previousSilbing)
 
168
    {
 
169
      elrange.moveToElementText(oNode.previousSibling);
 
170
      while (selrange.compareEndPoints('StartToEnd', elrange) > 0) 
 
171
      {
 
172
        startoffset++;
 
173
        elrange.moveEnd('character', 1);
 
174
      }
 
175
    }
 
176
    else
 
177
    { 
 
178
      elrange.moveToElementText(oNode.parentNode);
 
179
      while (selrange.compareEndPoints('StartToStart', elrange) > 0) 
 
180
      {
 
181
        startoffset++;
 
182
        elrange.moveStart('character', 1);
 
183
      }
 
184
    }
 
185
    return startoffset;
 
186
  }
 
187
 
 
188
  // get end node of seleced element
 
189
  FCKSelection.GetEndNode = function()
 
190
  {
 
191
    if (!FCKSelection._endNode) 
 
192
    {
 
193
      FCKSelection._endNode = FCKSelection._getEndNode()
 
194
    }
 
195
    return FCKSelection._endNode;
 
196
  }
 
197
 
 
198
 
 
199
  FCKSelection._getEndNode = function()
 
200
  {
 
201
    FCKSelection.sEnd = "";
 
202
    var oRange = FCKSelection.GetSelection().createRange();
 
203
 
 
204
    if (FCKSelection.GetType()=="Control")
 
205
    {
 
206
      return oRange.item(oRange.length-1);
 
207
    }
 
208
    else // Text, None
 
209
    {
 
210
      var oTmpRange = FCKSelection.GetSelection().createRange();
 
211
      var oNode = oRange.parentElement()
 
212
      var following_text = false;
 
213
 
 
214
      // selection in empty tag
 
215
      if (!oNode.hasChildNodes()) 
 
216
        return oNode; 
 
217
 
 
218
      oNode = oNode.lastChild;
 
219
 
 
220
      var oLastText = oNode;
 
221
 
 
222
      while (oNode)
 
223
      {
 
224
        if (oNode.nodeName!="#text") 
 
225
        {
 
226
          following_text = false;
 
227
          oTmpRange.moveToElementText(oNode);
 
228
 
 
229
          if (oRange.compareEndPoints('EndToStart', oTmpRange)>0)
 
230
          {
 
231
            if (oRange.compareEndPoints('EndToEnd', oTmpRange)>=0)
 
232
              return oLastText; // already in selection
 
233
              
 
234
            // found
 
235
            FCKSelection.sEnd += oNode.nodeName + "->";
 
236
            oNode = oNode.lastChild;
 
237
 
 
238
            if (oNode) 
 
239
              FCKSelection.sEnd += oNode.nodeName + ";";
 
240
          }
 
241
          else 
 
242
          {
 
243
            oNode = oNode.previousSibling;
 
244
          }
 
245
        }
 
246
        else
 
247
        {
 
248
          if (!following_text)
 
249
          {
 
250
            oLastText = oNode;
 
251
            following_text = true;
 
252
          }
 
253
 
 
254
          try
 
255
          {
 
256
            oNode = oNode.previousSibling;
 
257
          } 
 
258
          catch (e) 
 
259
          {
 
260
            return oRange.parentElement();
 
261
          } // end of catch
 
262
        } // end of else
 
263
      } // end of while
 
264
      return oLastText;
 
265
    } // end of else
 
266
  } // end of function
 
267
 
 
268
 
 
269
  // getting offset of end node
 
270
  FCKSelection.GetEndOffset = function() 
 
271
  {
 
272
    var oNode = FCKSelection.GetEndNode();
 
273
 
 
274
    // not a text node 
 
275
    if (oNode.nodeType != 3)
 
276
      return 0; 
 
277
 
 
278
    var endoffset = 0;
 
279
    var selrange = FCKSelection.GetSelection().createRange();
 
280
    var elrange = selrange.duplicate();
 
281
 
 
282
    if (oNode.nextSilbing)
 
283
    {
 
284
      elrange.moveToElementText(oNode.nextSibling);
 
285
      while (selrange.compareEndPoints('EndToStart', elrange) < 0) 
 
286
      {
 
287
        endoffset++;
 
288
        elrange.moveStart('character', -1);
 
289
      }
 
290
    }
 
291
    else 
 
292
    {
 
293
      elrange.moveToElementText(oNode.parentNode);
 
294
      while (selrange.compareEndPoints('EndToEnd', elrange) < 0) 
 
295
      {
 
296
        endoffset++;
 
297
        elrange.moveStart('character', -11);
 
298
      }
 
299
    }
 
300
    return endoffset;
 
301
  }
 
302
 
 
303
  // return selected node's text
 
304
  FCKSelection.GetText = function()
 
305
  {
 
306
    var oRange = FCKSelection.GetSelection().createRange();
 
307
    return oRange.text;
 
308
  }
 
309
 
 
310
  // return true if selected node's type is None
 
311
  FCKSelection.IsCollapsed = function()
 
312
  {
 
313
    return FCKSelection.GetType() == 'None';
 
314
  }
 
315
}
 
316
// --------------------------------
 
317
// Others (firefox, safari, opera, ..)
 
318
// --------------------------------
 
319
else {
 
320
  // assume exactly one selection. only first selection accepted.
 
321
  FCKSelection.GetStartNode = function()
 
322
    {
 
323
      var oSelection = FCKSelection.GetSelection();
 
324
      // startContainer returns the parent of the first node in the selection
 
325
      var oContainer = oSelection.getRangeAt(0).startContainer;
 
326
      // The offset within the startContainer where the range starts
 
327
      var iOffset = oSelection.getRangeAt(0).startOffset;
 
328
 
 
329
      // if oContainer has children return child at iOffset
 
330
      // otherwise return oContainer
 
331
      if (oContainer.childNodes.length > iOffset) 
 
332
        return oContainer.childNodes[iOffset];
 
333
      else
 
334
        return oContainer;
 
335
    }
 
336
 
 
337
  FCKSelection.GetStartOffset = function()
 
338
  {
 
339
    var oSelection = FCKSelection.GetSelection();
 
340
    return oSelection.getRangeAt(0).startOffset;
 
341
  }
 
342
 
 
343
  FCKSelection.GetEndNode = function()
 
344
  {
 
345
    var oSelection = FCKSelection.GetSelection();
 
346
    var oContainer = oSelection.getRangeAt(0).endContainer;
 
347
    var iOffset = oSelection.getRangeAt(0).startEndset;
 
348
 
 
349
    if (oContainer.childNodes.length>iOffset) 
 
350
      return oContainer.childNodes[iOffset];
 
351
    else
 
352
      return oContainer;
 
353
  }
 
354
 
 
355
  FCKSelection.GetEndOffset = function()
 
356
  {
 
357
    var oSelection = FCKSelection.GetSelection();
 
358
    return oSelection.getRangeAt(0).endOffset;    
 
359
  }
 
360
 
 
361
  FCKSelection.IsCollapsed = function()
 
362
  {
 
363
    var oSelection = FCKSelection.GetSelection();
 
364
    return oSelection.getRangeAt(0).collapsed;
 
365
  }
 
366
 
 
367
  FCKSelection.GetText = function()
 
368
  {
 
369
    return FCKSelection.GetSelection().toString();
 
370
  }
 
371
}
 
372
 
 
373
 
 
374
 
 
375
// this function make toolbar's button enable/disable using inserted pattern.
 
376
// check coverage contains its parent and children.
 
377
FCKSelection.CheckForNodeNames = function(pattern)
 
378
{
 
379
  var oStart = FCKSelection.GetStartNode();
 
380
  var oEnd = FCKSelection.GetEndNode();
 
381
 
 
382
  // filtering invalid input and selection
 
383
  if (!oStart || !oEnd || !pattern){
 
384
    return 0;
 
385
  }
 
386
  
 
387
  /* Crashes IE
 
388
  if ((FCKSelection.GetType()=="None") && (oStart!=oEnd))
 
389
  {
 
390
    FCKSelection.GetParentElement().normalize();
 
391
    var oStart = FCKSelection.GetStartNode();
 
392
    var oEnd = FCKSelection.GetEndNode();
 
393
  }
 
394
  */
 
395
 
 
396
  // Check surrounding nodes
 
397
  var oElement = oStart;
 
398
 
 
399
  while (oElement)
 
400
  {
 
401
    if (pattern.test(oElement.nodeName))
 
402
    { 
 
403
      //Alert("Start:" + oStart.nodeName + ':' + oElement.nodeName + 
 
404
      //      ':' + oEnd.nodeName);
 
405
      return FCK_TRISTATE_DISABLED;
 
406
    }
 
407
    oElement = oElement.parentNode;
 
408
  }
 
409
 
 
410
  oElement = oEnd;
 
411
  while (oElement)
 
412
  {
 
413
    if (pattern.test(oElement.nodeName))
 
414
    { 
 
415
      //Alert("End:" + oStart.nodeName + ':' + oElement.nodeName + 
 
416
      //      ':' + oEnd.nodeName);
 
417
      return FCK_TRISTATE_DISABLED;
 
418
    }
 
419
    oElement = oElement.parentNode;
 
420
  }
 
421
 
 
422
  if (FCKSelection.IsCollapsed()) 
 
423
  {
 
424
    return 0;
 
425
  }
 
426
 
 
427
  // check selected nodes
 
428
  var oNode = oStart;
 
429
 
 
430
  while (oNode)
 
431
  {
 
432
    if (pattern.test(oNode.nodeName))
 
433
    {
 
434
      /*
 
435
      Alert("Down:" + oStart.nodeName + ':' + oNode.nodeName + ':' + 
 
436
            oEnd.nodeName + FCKSelection.GetStartOffset() + ":" +
 
437
            FCKSelection.GetEndOffset());
 
438
      */
 
439
      return FCK_TRISTATE_DISABLED;
 
440
    }
 
441
 
 
442
    if (oNode==oEnd && oNode!=oStart)
 
443
    {
 
444
      return 0;
 
445
    }
 
446
 
 
447
    if (oNode.hasChildNodes()) 
 
448
    {
 
449
      oNode = oNode.firstChild;
 
450
    }
 
451
    else
 
452
    {
 
453
      // happens if oStart==oEnd && no children
 
454
      if (oNode==oEnd) 
 
455
        return 0; 
 
456
 
 
457
      while (!oNode.nextSibling) 
 
458
      {
 
459
        oNode = oNode.parentNode;
 
460
 
 
461
        if (!oNode) return 0;
 
462
 
 
463
        if (pattern.test(oNode.nodeName))
 
464
        {
 
465
          //Alert("Up:" + oStart.nodeName +':'+ oNode.nodeName + ':' + 
 
466
          //          oEnd.nodeName);
 
467
          return FCK_TRISTATE_DISABLED;
 
468
        }
 
469
 
 
470
        if (oNode==oEnd) return 0;
 
471
      }
 
472
      oNode = oNode.nextSibling;
 
473
    }
 
474
  }
 
475
  return 0;
 
476
}