Adobe 38040334 Extending Dreamweaver - Page 337

Creating Property inspectors for locked content

Page 337 highlights

DREAMWEAVER CS3 331 Extending Dreamweaver Creating Property inspectors for locked content After you create a translator, you need to create a Property inspector for the content so the user can change its properties (for example, the file to be included or one of the conditions in a conditional statement). Inspecting translated content is a unique problem for several reasons: • The user might want to change the properties of the translated content, and those changes must be reflected in the untranslated content. • The Document Object Model (DOM) contains the translated content (that is, the lock tags and the tags they surround are nodes in the DOM), but the outerHTML property of the documentElement object and the dreamweaver.getSelection() and dreamweaver.nodeToOffsets() functions act on the untranslated source. • The tags you inspect are different before and after translation. A Property inspector for the HAPPY tag might have a comment that looks similar to the following example: The Property inspector for the translated HAPPY tag, however, would have a comment that looks similar to the following example: The canInspectSelection() function for the untranslated HAPPY Property inspector is simple. Because the selection type is exact, it can return a value of true without further analysis. For the translated HAPPY Property inspector, this function is more complicated; the keyword *LOCKED* indicates that the Property inspector is appropriate when the selection is within a locked region, but because a document can have several locked regions, further checks must be performed to determine whether the Property inspector matches this particular locked region. Another problem is inherent in inspecting translated content. When you call the dom.getSelection() function, the values that return by default are offsets into the untranslated source. To expand the selection properly so that the locked region (and only the locked region) is selected, use the following technique: var currentDOM = dw.getDocumentDOM(); var offsets = currentDOM.getSelection(); var theSelection = currentDOM.offsetsToNode(offsets[0],offsets[0]+1); Using offsets[0]+1 as the second argument ensures that you remain within the opening lock tag when you convert the offsets to a node. If you use offsets[1] as the second argument, you risk selecting the node above the lock. After you make the selection (after ensuring that its nodeType is node.ELEMENT_NODE), you can inspect the type attribute to see if the locked region matches this Property inspector, as shown in the following example: if (theSelection.nodeType == node.ELEMENT_NODE && ¬ theSelection.getAttribute('type') == 'happy'){ return true; }else{ return false } To populate the text boxes in the Property inspector for the translated tag, you must parse the value of the orig attribute. For example, if the untranslated code is and the Property inspector has a Time text box, you must extract the value of the TIME attribute from the orig string:

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • 169
  • 170
  • 171
  • 172
  • 173
  • 174
  • 175
  • 176
  • 177
  • 178
  • 179
  • 180
  • 181
  • 182
  • 183
  • 184
  • 185
  • 186
  • 187
  • 188
  • 189
  • 190
  • 191
  • 192
  • 193
  • 194
  • 195
  • 196
  • 197
  • 198
  • 199
  • 200
  • 201
  • 202
  • 203
  • 204
  • 205
  • 206
  • 207
  • 208
  • 209
  • 210
  • 211
  • 212
  • 213
  • 214
  • 215
  • 216
  • 217
  • 218
  • 219
  • 220
  • 221
  • 222
  • 223
  • 224
  • 225
  • 226
  • 227
  • 228
  • 229
  • 230
  • 231
  • 232
  • 233
  • 234
  • 235
  • 236
  • 237
  • 238
  • 239
  • 240
  • 241
  • 242
  • 243
  • 244
  • 245
  • 246
  • 247
  • 248
  • 249
  • 250
  • 251
  • 252
  • 253
  • 254
  • 255
  • 256
  • 257
  • 258
  • 259
  • 260
  • 261
  • 262
  • 263
  • 264
  • 265
  • 266
  • 267
  • 268
  • 269
  • 270
  • 271
  • 272
  • 273
  • 274
  • 275
  • 276
  • 277
  • 278
  • 279
  • 280
  • 281
  • 282
  • 283
  • 284
  • 285
  • 286
  • 287
  • 288
  • 289
  • 290
  • 291
  • 292
  • 293
  • 294
  • 295
  • 296
  • 297
  • 298
  • 299
  • 300
  • 301
  • 302
  • 303
  • 304
  • 305
  • 306
  • 307
  • 308
  • 309
  • 310
  • 311
  • 312
  • 313
  • 314
  • 315
  • 316
  • 317
  • 318
  • 319
  • 320
  • 321
  • 322
  • 323
  • 324
  • 325
  • 326
  • 327
  • 328
  • 329
  • 330
  • 331
  • 332
  • 333
  • 334
  • 335
  • 336
  • 337
  • 338
  • 339
  • 340
  • 341
  • 342
  • 343
  • 344
  • 345
  • 346
  • 347
  • 348
  • 349
  • 350
  • 351
  • 352
  • 353
  • 354
  • 355
  • 356
  • 357
  • 358
  • 359
  • 360
  • 361
  • 362
  • 363
  • 364
  • 365
  • 366
  • 367
  • 368
  • 369
  • 370
  • 371
  • 372
  • 373
  • 374
  • 375
  • 376
  • 377
  • 378
  • 379
  • 380
  • 381
  • 382
  • 383
  • 384
  • 385

DREAMWEAVER CS3
Extending Dreamweaver
331
Creating Property inspectors for locked content
After you create a translator, you need to create a Property inspector for the content so the user can change its
properties (for example, the file to be included or one of the conditions in a conditional statement). Inspecting trans-
lated content is a unique problem for several reasons:
The user might want to change the properties of the translated content, and those changes must be reflected in the
untranslated content.
The Document Object Model (DOM) contains the translated content (that is, the lock tags and the tags they
surround are nodes in the DOM), but the
outerHTML
property of the
documentElement
object and the
dreamweaver.getSelection()
and
dreamweaver.nodeToOffsets()
functions act on the untranslated
source.
The tags you inspect are different before and after translation.
A Property inspector for the
HAPPY
tag might have a comment that looks similar to the following example:
<!-- tag:HAPPY,priority:5,selection:exact,hline,vline, attrName:xxx,¬ attrValue:yyy -->
The Property inspector for the translated
HAPPY
tag, however, would have a comment that looks similar to the
following example:
<!-- tag:*LOCKED*,priority:5,selection:within,hline,vline -->
The
canInspectSelection()
function for the untranslated
HAPPY
Property inspector is simple. Because the
selection
type is
exact
, it can return a value of
true
without further analysis. For the translated
HAPPY
Property
inspector, this function is more complicated; the keyword
*LOCKED*
indicates that the Property inspector is appro-
priate when the selection is within a locked region, but because a document can have several locked regions, further
checks must be performed to determine whether the Property inspector matches this particular locked region.
Another problem is inherent in inspecting translated content. When you call the
dom.getSelection()
function,
the values that return by default are offsets into the untranslated source. To expand the selection properly so that the
locked region (and only the locked region) is selected, use the following technique:
var currentDOM = dw.getDocumentDOM();
var offsets = currentDOM.getSelection();
var theSelection = currentDOM.offsetsToNode(offsets[0],offsets[0]+1);
Using
offsets[0]+1
as the second argument ensures that you remain within the opening lock tag when you convert
the offsets to a node. If you use
offsets[1]
as the second argument, you risk selecting the node above the lock.
After you make the selection (after ensuring that its
nodeType
is
node.ELEMENT_NODE
), you can inspect the
type
attribute to see if the locked region matches this Property inspector, as shown in the following example:
if (theSelection.nodeType == node.ELEMENT_NODE && ¬
theSelection.getAttribute('type') == 'happy'){
return true;
}else{
return false
}
To populate the text boxes in the Property inspector for the translated tag, you must parse the value of the
orig
attribute. For example, if the untranslated code is
<HAPPY TIME="22">
and the Property inspector has a Time text
box, you must extract the value of the
TIME
attribute from the
orig
string: