Mercurial > projects > dwt-addons
comparison dwtx/ui/internal/forms/MessageManager.d @ 104:04b47443bb01
Reworked the collection uses to make use of a wrapper collection that is compatible to the Java Collections.
These new wrappers now use the tango.util.containers instead of the tango.util.collections.
author | Frank Benoit <benoit@tionex.de> |
---|---|
date | Thu, 07 Aug 2008 15:01:33 +0200 |
parents | 1088ca33d3e0 |
children |
comparison
equal
deleted
inserted
replaced
103:2d6540440fe6 | 104:04b47443bb01 |
---|---|
29 import dwtx.ui.forms.IMessagePrefixProvider; | 29 import dwtx.ui.forms.IMessagePrefixProvider; |
30 import dwtx.ui.forms.widgets.Hyperlink; | 30 import dwtx.ui.forms.widgets.Hyperlink; |
31 import dwtx.ui.forms.widgets.ScrolledForm; | 31 import dwtx.ui.forms.widgets.ScrolledForm; |
32 | 32 |
33 import dwt.dwthelper.utils; | 33 import dwt.dwthelper.utils; |
34 | 34 import dwtx.dwtxhelper.Collection; |
35 import tango.util.collection.ArraySeq; | 35 |
36 import tango.util.collection.HashMap; | |
37 import tango.util.Convert; | 36 import tango.util.Convert; |
38 import tango.text.Text; | 37 import tango.text.Text; |
39 import tango.io.model.IFile; | 38 import tango.io.model.IFile; |
40 | 39 |
41 /** | 40 /** |
53 } | 52 } |
54 } | 53 } |
55 } | 54 } |
56 return DEFAULT_PREFIX_PROVIDER_; | 55 return DEFAULT_PREFIX_PROVIDER_; |
57 } | 56 } |
58 private ArraySeq!(Object) messages; | 57 private ArrayList messages; |
59 private HashMap!(Object,Object) decorators; | 58 private Hashtable decorators; |
60 private bool autoUpdate = true; | 59 private bool autoUpdate = true; |
61 private ScrolledForm scrolledForm; | 60 private ScrolledForm scrolledForm; |
62 private IMessagePrefixProvider prefixProvider; | 61 private IMessagePrefixProvider prefixProvider; |
63 private int decorationPosition = DWT.LEFT | DWT.BOTTOM; | 62 private int decorationPosition = DWT.LEFT | DWT.BOTTOM; |
64 | 63 |
235 } | 234 } |
236 } | 235 } |
237 | 236 |
238 class ControlDecorator { | 237 class ControlDecorator { |
239 private ControlDecoration decoration; | 238 private ControlDecoration decoration; |
240 private ArraySeq!(Object) controlMessages; | 239 private ArrayList controlMessages; |
241 private String prefix; | 240 private String prefix; |
242 | 241 |
243 this(Control control) { | 242 this(Control control) { |
244 controlMessages = new ArraySeq!(Object); | 243 controlMessages = new ArrayList(); |
245 this.decoration = new ControlDecoration(control, decorationPosition, scrolledForm.getBody()); | 244 this.decoration = new ControlDecoration(control, decorationPosition, scrolledForm.getBody()); |
246 } | 245 } |
247 | 246 |
248 public bool isDisposed() { | 247 public bool isDisposed() { |
249 return decoration.getControl() is null; | 248 return decoration.getControl() is null; |
275 if (prefix is null) | 274 if (prefix is null) |
276 // make a prefix anyway | 275 // make a prefix anyway |
277 prefix = ""; //$NON-NLS-1$ | 276 prefix = ""; //$NON-NLS-1$ |
278 } | 277 } |
279 | 278 |
280 void addAll(ArraySeq!(Object) target) { | 279 void addAll(ArrayList target) { |
281 foreach( o; controlMessages ){ | 280 target.addAll(controlMessages); |
282 target.append(o); | |
283 } | |
284 } | 281 } |
285 | 282 |
286 void addMessage(Object key, String text, Object data, int type) { | 283 void addMessage(Object key, String text, Object data, int type) { |
287 Message message = this.outer.addMessage(getPrefix(), key, | 284 Message message = this.outer.addMessage(getPrefix(), key, |
288 text, data, type, controlMessages); | 285 text, data, type, controlMessages); |
300 } | 297 } |
301 return message !is null; | 298 return message !is null; |
302 } | 299 } |
303 | 300 |
304 bool removeMessages() { | 301 bool removeMessages() { |
305 if (controlMessages.drained()) | 302 if (controlMessages.isEmpty()) |
306 return false; | 303 return false; |
307 controlMessages.clear(); | 304 controlMessages.clear(); |
308 if (isAutoUpdate()) | 305 if (isAutoUpdate()) |
309 update(); | 306 update(); |
310 return true; | 307 return true; |
311 } | 308 } |
312 | 309 |
313 public void update() { | 310 public void update() { |
314 if (controlMessages.drained()) { | 311 if (controlMessages.isEmpty()) { |
315 decoration.setDescriptionText(null); | 312 decoration.setDescriptionText(null); |
316 decoration.hide(); | 313 decoration.hide(); |
317 } else { | 314 } else { |
318 auto peers = createPeers(controlMessages); | 315 ArrayList peers = createPeers(controlMessages); |
319 int type = (cast(IMessage) peers.get(0)).getMessageType(); | 316 int type = (cast(IMessage) peers.get(0)).getMessageType(); |
320 String description = createDetails(createPeers(peers), true); | 317 String description = createDetails(createPeers(peers), true); |
321 if (type is IMessageProvider.ERROR) | 318 if (type is IMessageProvider.ERROR) |
322 decoration.setImage(standardError.getImage()); | 319 decoration.setImage(standardError.getImage()); |
323 else if (type is IMessageProvider.WARNING) | 320 else if (type is IMessageProvider.WARNING) |
337 * @param scrolledForm | 334 * @param scrolledForm |
338 * the form to control | 335 * the form to control |
339 */ | 336 */ |
340 public this(ScrolledForm scrolledForm) { | 337 public this(ScrolledForm scrolledForm) { |
341 prefixProvider = DEFAULT_PREFIX_PROVIDER; | 338 prefixProvider = DEFAULT_PREFIX_PROVIDER; |
342 messages = new ArraySeq!(Object); | 339 messages = new ArrayList(); |
343 decorators = new HashMap!(Object,Object); | 340 decorators = new Hashtable(); |
344 this.scrolledForm = scrolledForm; | 341 this.scrolledForm = scrolledForm; |
345 } | 342 } |
346 | 343 |
347 /* | 344 /* |
348 * (non-Javadoc) | 345 * (non-Javadoc) |
366 int type, Control control) { | 363 int type, Control control) { |
367 ControlDecorator dec = cast(ControlDecorator) decorators.get(control); | 364 ControlDecorator dec = cast(ControlDecorator) decorators.get(control); |
368 | 365 |
369 if (dec is null) { | 366 if (dec is null) { |
370 dec = new ControlDecorator(control); | 367 dec = new ControlDecorator(control); |
371 decorators.add(control, dec); | 368 decorators.put(control, dec); |
372 } | 369 } |
373 dec.addMessage(key, messageText, data, type); | 370 dec.addMessage(key, messageText, data, type); |
374 if (isAutoUpdate()) | 371 if (isAutoUpdate()) |
375 updateForm(); | 372 updateForm(); |
376 } | 373 } |
393 * (non-Javadoc) | 390 * (non-Javadoc) |
394 * | 391 * |
395 * @see dwtx.ui.forms.IMessageManager#removeMessages() | 392 * @see dwtx.ui.forms.IMessageManager#removeMessages() |
396 */ | 393 */ |
397 public void removeMessages() { | 394 public void removeMessages() { |
398 if (!messages.drained()) { | 395 if (!messages.isEmpty()) { |
399 messages.clear(); | 396 messages.clear(); |
400 if (isAutoUpdate()) | 397 if (isAutoUpdate()) |
401 updateForm(); | 398 updateForm(); |
402 } | 399 } |
403 } | 400 } |
437 * | 434 * |
438 * @see dwtx.ui.forms.IMessageManager#removeAllMessages() | 435 * @see dwtx.ui.forms.IMessageManager#removeAllMessages() |
439 */ | 436 */ |
440 public void removeAllMessages() { | 437 public void removeAllMessages() { |
441 bool needsUpdate = false; | 438 bool needsUpdate = false; |
442 foreach( v; decorators ){ | 439 for (Enumeration enm = decorators.elements(); enm.hasMoreElements();) { |
443 ControlDecorator control = cast(ControlDecorator) v; | 440 ControlDecorator control = cast(ControlDecorator) enm.nextElement(); |
444 if (control.removeMessages()) | 441 if (control.removeMessages()) |
445 needsUpdate = true; | 442 needsUpdate = true; |
446 } | 443 } |
447 if (!messages.drained()) { | 444 if (!messages.isEmpty()) { |
448 messages.clear(); | 445 messages.clear(); |
449 needsUpdate = true; | 446 needsUpdate = true; |
450 } | 447 } |
451 if (needsUpdate && isAutoUpdate()) | 448 if (needsUpdate && isAutoUpdate()) |
452 updateForm(); | 449 updateForm(); |
455 /* | 452 /* |
456 * Adds the message if it does not already exist in the provided list. | 453 * Adds the message if it does not already exist in the provided list. |
457 */ | 454 */ |
458 | 455 |
459 private Message addMessage(String prefix, Object key, String messageText, | 456 private Message addMessage(String prefix, Object key, String messageText, |
460 Object data, int type, ArraySeq!(Object) list) { | 457 Object data, int type, ArrayList list) { |
461 Message message = findMessage(key, list); | 458 Message message = findMessage(key, list); |
462 if (message is null) { | 459 if (message is null) { |
463 message = new Message(key, messageText, type, data); | 460 message = new Message(key, messageText, type, data); |
464 message.prefix = prefix; | 461 message.prefix = prefix; |
465 list.append(message); | 462 list.add(message); |
466 } else { | 463 } else { |
467 message.message = messageText; | 464 message.message = messageText; |
468 message.type = type; | 465 message.type = type; |
469 message.data = data; | 466 message.data = data; |
470 } | 467 } |
473 | 470 |
474 /* | 471 /* |
475 * Finds the message with the provided key in the provided list. | 472 * Finds the message with the provided key in the provided list. |
476 */ | 473 */ |
477 | 474 |
478 private Message findMessage(Object key, ArraySeq!(Object) list) { | 475 private Message findMessage(Object key, ArrayList list) { |
479 for (int i = 0; i < list.size(); i++) { | 476 for (int i = 0; i < list.size(); i++) { |
480 Message message = cast(Message) list.get(i); | 477 Message message = cast(Message) list.get(i); |
481 if (message.getKey().opEquals(key)) | 478 if (message.getKey().opEquals(key)) |
482 return message; | 479 return message; |
483 } | 480 } |
489 * | 486 * |
490 * @see dwtx.ui.forms.IMessageManager#update() | 487 * @see dwtx.ui.forms.IMessageManager#update() |
491 */ | 488 */ |
492 public void update() { | 489 public void update() { |
493 // Update decorations | 490 // Update decorations |
494 foreach( v; decorators ){ | 491 for (Iterator iter = decorators.values().iterator(); iter.hasNext();) { |
495 ControlDecorator dec = cast(ControlDecorator) v; | 492 ControlDecorator dec = cast(ControlDecorator) iter.next(); |
496 dec.update(); | 493 dec.update(); |
497 } | 494 } |
498 // Update the form | 495 // Update the form |
499 updateForm(); | 496 updateForm(); |
500 } | 497 } |
502 /* | 499 /* |
503 * Updates the container by rolling the messages up from the controls. | 500 * Updates the container by rolling the messages up from the controls. |
504 */ | 501 */ |
505 | 502 |
506 private void updateForm() { | 503 private void updateForm() { |
507 ArraySeq!(Object) mergedList = new ArraySeq!(Object); | 504 ArrayList mergedList = new ArrayList(); |
508 foreach( o; messages ){ | 505 mergedList.addAll(messages); |
509 mergedList.append(o); | 506 for (Enumeration enm = decorators.elements(); enm.hasMoreElements();) { |
510 } | 507 ControlDecorator dec = cast(ControlDecorator) enm.nextElement(); |
511 foreach( v; decorators ){ | |
512 ControlDecorator dec = cast(ControlDecorator) v; | |
513 dec.addAll(mergedList); | 508 dec.addAll(mergedList); |
514 } | 509 } |
515 update(mergedList); | 510 update(mergedList); |
516 } | 511 } |
517 | 512 |
518 private void update(ArraySeq!(Object) mergedList) { | 513 private void update(ArrayList mergedList) { |
519 pruneControlDecorators(); | 514 pruneControlDecorators(); |
520 if (scrolledForm.getForm().getHead().getBounds().height is 0 || mergedList.drained() || mergedList is null) { | 515 if (scrolledForm.getForm().getHead().getBounds().height is 0 || mergedList.isEmpty() || mergedList is null) { |
521 scrolledForm.setMessage(null, IMessageProvider.NONE); | 516 scrolledForm.setMessage(null, IMessageProvider.NONE); |
522 return; | 517 return; |
523 } | 518 } |
524 auto peers = createPeers(mergedList); | 519 ArrayList peers = createPeers(mergedList); |
525 int maxType = (cast(IMessage) peers.get(0)).getMessageType(); | 520 int maxType = (cast(IMessage) peers.get(0)).getMessageType(); |
526 String messageText; | 521 String messageText; |
527 IMessage[] array = arraycast!(IMessage)( peers | 522 IMessage[] array = arraycast!(IMessage)( peers |
528 .toArray()); | 523 .toArray()); |
529 if (peers.size() is 1 && (cast(Message) peers.get(0)).prefix is null) { | 524 if (peers.size() is 1 && (cast(Message) peers.get(0)).prefix is null) { |
548 if (message.getPrefix() is null) | 543 if (message.getPrefix() is null) |
549 return message.getMessage(); | 544 return message.getMessage(); |
550 return message.getPrefix() ~ message.getMessage(); | 545 return message.getPrefix() ~ message.getMessage(); |
551 } | 546 } |
552 | 547 |
553 private ArraySeq!(Object) createPeers(ArraySeq!(Object) messages) { | 548 private ArrayList createPeers(ArrayList messages) { |
554 auto peers = new ArraySeq!(Object); | 549 ArrayList peers = new ArrayList(); |
555 int maxType = 0; | 550 int maxType = 0; |
556 foreach( o; messages ){ | 551 for (int i = 0; i < messages.size(); i++) { |
557 auto message = cast(Message)o; | 552 Message message = cast(Message) messages.get(i); |
558 if (message.type > maxType) { | 553 if (message.type > maxType) { |
559 peers.clear(); | 554 peers.clear(); |
560 maxType = message.type; | 555 maxType = message.type; |
561 } | 556 } |
562 if (message.type is maxType) | 557 if (message.type is maxType) |
563 peers.append(message); | 558 peers.add(message); |
564 } | 559 } |
565 return peers; | 560 return peers; |
566 } | 561 } |
567 | 562 |
568 private String createDetails(ArraySeq!(Object) messages, bool excludePrefix) { | 563 private String createDetails(ArrayList messages, bool excludePrefix) { |
569 auto txt = new tango.text.Text.Text!(char); | 564 auto txt = new tango.text.Text.Text!(char); |
570 | 565 |
571 for (int i = 0; i < messages.size(); i++) { | 566 for (int i = 0; i < messages.size(); i++) { |
572 if (i > 0) | 567 if (i > 0) |
573 txt.append( FileConst.NewlineString ); | 568 txt.append( FileConst.NewlineString ); |
598 public String createSummary(IMessage[] messages) { | 593 public String createSummary(IMessage[] messages) { |
599 return createDetails(messages); | 594 return createDetails(messages); |
600 } | 595 } |
601 | 596 |
602 private void pruneControlDecorators() { | 597 private void pruneControlDecorators() { |
603 foreach( o; decorators.dup ){ | 598 for (Iterator iter = decorators.values().iterator(); iter.hasNext();) { |
604 ControlDecorator dec = cast(ControlDecorator) o; | 599 ControlDecorator dec = cast(ControlDecorator) iter.next(); |
605 if (dec.isDisposed()) | 600 if (dec.isDisposed()) |
606 decorators.remove(o); | 601 iter.remove(); |
607 } | 602 } |
608 } | 603 } |
609 | 604 |
610 /* | 605 /* |
611 * (non-Javadoc) | 606 * (non-Javadoc) |
621 * | 616 * |
622 * @see dwtx.ui.forms.IMessageManager#setMessagePrefixProvider(dwtx.ui.forms.IMessagePrefixProvider) | 617 * @see dwtx.ui.forms.IMessageManager#setMessagePrefixProvider(dwtx.ui.forms.IMessagePrefixProvider) |
623 */ | 618 */ |
624 public void setMessagePrefixProvider(IMessagePrefixProvider provider) { | 619 public void setMessagePrefixProvider(IMessagePrefixProvider provider) { |
625 this.prefixProvider = provider; | 620 this.prefixProvider = provider; |
626 foreach( o; decorators ){ | 621 for (Iterator iter = decorators.values().iterator(); iter.hasNext();) { |
627 ControlDecorator dec = cast(ControlDecorator) o; | 622 ControlDecorator dec = cast(ControlDecorator) iter.next(); |
628 dec.updatePrefix(); | 623 dec.updatePrefix(); |
629 } | 624 } |
630 } | 625 } |
631 | 626 |
632 /* | 627 /* |
643 * | 638 * |
644 * @see dwtx.ui.forms.IMessageManager#setDecorationPosition(int) | 639 * @see dwtx.ui.forms.IMessageManager#setDecorationPosition(int) |
645 */ | 640 */ |
646 public void setDecorationPosition(int position) { | 641 public void setDecorationPosition(int position) { |
647 this.decorationPosition = position; | 642 this.decorationPosition = position; |
648 foreach( o; decorators ){ | 643 for (Iterator iter = decorators.values().iterator(); iter.hasNext();) { |
649 ControlDecorator dec = cast(ControlDecorator) o; | 644 ControlDecorator dec = cast(ControlDecorator) iter.next(); |
650 dec.updatePosition(); | 645 dec.updatePosition(); |
651 } | 646 } |
652 } | 647 } |
653 | 648 |
654 /* | 649 /* |