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 /*