324 <resource: #canvas> |
324 <resource: #canvas> |
325 |
325 |
326 ^ |
326 ^ |
327 |
327 |
328 #(#FullSpec |
328 #(#FullSpec |
329 #window: |
329 #window: |
330 #(#WindowSpec |
330 #(#WindowSpec |
331 #name: 'Changes Browser' |
331 #name: 'Changes Browser' |
332 #layout: #(#LayoutFrame 53 0 92 0 687 0 583 0) |
332 #layout: #(#LayoutFrame 53 0 92 0 687 0 583 0) |
333 #label: 'Changes Browser' |
333 #label: 'Changes Browser' |
334 #min: #(#Point 10 10) |
334 #min: #(#Point 10 10) |
335 #max: #(#Point 1152 900) |
335 #max: #(#Point 1152 900) |
336 #bounds: #(#Rectangle 53 92 688 584) |
336 #bounds: #(#Rectangle 53 92 688 584) |
337 #menu: #menu |
337 #menu: #menu |
338 #usePreferredExtent: false |
338 #usePreferredExtent: false |
339 ) |
339 ) |
340 #component: |
340 #component: |
341 #(#SpecCollection |
341 #(#SpecCollection |
342 #collection: |
342 #collection: |
343 #( |
343 #( |
344 #(#MenuPanelSpec |
344 #(#MenuPanelSpec |
345 #name: 'menuToolbarView' |
345 #name: 'menuToolbarView' |
346 #layout: #(#LayoutFrame 0 0.0 0 0 0 1.0 32 0) |
346 #layout: #(#LayoutFrame 0 0.0 0 0 0 1.0 32 0) |
347 #menu: #menuToolbar |
347 #menu: #menuToolbar |
348 #style: #(#FontDescription #helvetica #medium #roman 10) |
348 #style: #(#FontDescription #helvetica #medium #roman 10) |
349 #showSeparatingLines: true |
349 #showSeparatingLines: true |
350 ) |
350 ) |
351 #(#VariableVerticalPanelSpec |
351 #(#VariableVerticalPanelSpec |
352 #name: 'variableVerticalPanel1' |
352 #name: 'variableVerticalPanel1' |
353 #layout: #(#LayoutFrame 0 0.0 34 0 0 1.0 -26 1.0) |
353 #layout: #(#LayoutFrame 0 0.0 34 0 0 1.0 -26 1.0) |
354 #component: |
354 #component: |
355 #(#SpecCollection |
355 #(#SpecCollection |
356 #collection: |
356 #collection: |
357 #( |
357 #( |
358 #(#ViewSpec |
358 #(#ViewSpec |
359 #name: 'Box1' |
359 #name: 'Box1' |
360 #component: |
360 #component: |
361 #(#SpecCollection |
361 #(#SpecCollection |
362 #collection: |
362 #collection: |
363 #( |
363 #( |
364 #(#DataSetSpec |
364 #(#DataSetSpec |
365 #name: 'changesDataSetView' |
365 #name: 'changesDataSetView' |
366 #layout: #(#LayoutFrame 0 0.0 0 0.0 0 1.0 -28 1.0) |
366 #layout: #(#LayoutFrame 0 0.0 0 0.0 0 1.0 -28 1.0) |
367 #model: #selectionOfChange |
367 #model: #selectionOfChange |
368 #menu: #menuTable |
368 #menu: #menuTable |
369 #hasHorizontalScrollBar: true |
369 #hasHorizontalScrollBar: true |
370 #hasVerticalScrollBar: true |
370 #hasVerticalScrollBar: true |
371 #miniScrollerHorizontal: true |
371 #miniScrollerHorizontal: true |
372 #dataList: #listOfChanges |
372 #dataList: #listOfChanges |
373 #useIndex: false |
373 #useIndex: false |
374 #has3Dsepartors: true |
374 #has3Dsepartors: true |
375 #doubleClickSelector: #doBrowseClass |
375 #doubleClickSelector: #doBrowseClass |
376 #columnHolder: #listOfChangeColumns |
376 #columnHolder: #listOfChangeColumns |
377 #valueChangeSelector: #changeSelected: |
377 #valueChangeSelector: #changeSelected: |
378 ) |
378 ) |
379 #(#ViewSpec |
379 #(#ViewSpec |
380 #name: 'Box2' |
380 #name: 'Box2' |
381 #layout: #(#LayoutFrame 0 0.0 -28 1 0 1.0 0 1.0) |
381 #layout: #(#LayoutFrame 0 0.0 -28 1 0 1.0 0 1.0) |
382 #component: |
382 #component: |
383 #(#SpecCollection |
383 #(#SpecCollection |
384 #collection: |
384 #collection: |
385 #( |
385 #( |
386 #(#LabelSpec |
386 #(#LabelSpec |
387 #name: 'filterLabel' |
387 #name: 'filterLabel' |
388 #layout: #(#AlignmentOrigin 37 0 13 0.0 1 0.5) |
388 #layout: #(#AlignmentOrigin 37 0 13 0.0 1 0.5) |
389 #label: 'Filter:' |
389 #label: 'Filter:' |
390 #style: #(#FontDescription #helvetica #medium #roman 10) |
390 #style: #(#FontDescription #helvetica #medium #roman 10) |
391 #adjust: #left |
391 #adjust: #left |
392 ) |
392 ) |
393 #(#InputFieldSpec |
393 #(#InputFieldSpec |
394 #name: 'filterField' |
394 #name: 'filterField' |
395 #layout: #(#LayoutFrame 41 0.0 3 0 250 0 25 0) |
395 #layout: #(#LayoutFrame 41 0.0 3 0 250 0 25 0) |
396 #activeHelpKey: #filterField |
396 #activeHelpKey: #filterField |
397 #model: #valueOfFilter |
397 #model: #valueOfFilter |
398 #immediateAccept: false |
398 #immediateAccept: false |
399 ) |
399 ) |
400 #(#ProgressIndicatorSpec |
400 #(#ProgressIndicatorSpec |
401 #name: 'readProgressIndicator' |
401 #name: 'readProgressIndicator' |
402 #layout: #(#LayoutFrame 41 0 3 0 250 0 25 0) |
402 #layout: #(#LayoutFrame 41 0 3 0 250 0 25 0) |
403 #model: #valueOfReadProgress |
403 #model: #valueOfReadProgress |
404 #foregroundColor: #(#Color 0.0 60.0 60.0) |
404 #foregroundColor: #(#Color 0.0 60.0 60.0) |
405 ) |
405 ) |
406 #(#ActionButtonSpec |
406 #(#ActionButtonSpec |
407 #name: 'allButton' |
407 #name: 'allButton' |
408 #layout: #(#LayoutFrame 258 0.0 2 0.0 268 0 13 0) |
408 #layout: #(#LayoutFrame 258 0.0 2 0.0 268 0 13 0) |
409 #label: ' ' |
409 #label: ' ' |
410 #model: #doFilter: |
410 #model: #doFilter: |
411 #actionValue: '' |
411 ) |
412 ) |
412 #(#LabelSpec |
413 #(#LabelSpec |
413 #name: 'allLabel' |
414 #name: 'allLabel' |
414 #layout: #(#LayoutFrame 273 0 0 0.0 310 0 14 0) |
415 #layout: #(#LayoutFrame 273 0 0 0.0 310 0 14 0) |
415 #label: '= all' |
416 #label: '= all' |
416 #translateLabel: true |
417 #translateLabel: true |
417 #style: #(#FontDescription #helvetica #medium #roman 10) |
418 #style: #(#FontDescription #helvetica #medium #roman 10) |
418 #adjust: #left |
419 #adjust: #left |
419 ) |
420 ) |
420 #(#ActionButtonSpec |
421 #(#ActionButtonSpec |
421 #name: 'methodChangesButton' |
422 #name: 'methodChangesButton' |
422 #layout: #(#LayoutFrame 359 0.0 2 0.0 369 0 13 0) |
423 #layout: #(#LayoutFrame 359 0.0 2 0.0 369 0 13 0) |
423 #label: ' ' |
424 #label: ' ' |
424 #backgroundColor: #(#Color 100.0 100.0 100.0) |
425 #backgroundColor: #(#Color 100.0 100.0 100.0) |
425 #model: #doFilterType: |
426 #model: #doFilterType: |
426 #actionValue: 'method' |
427 #actionValue: 'method' |
427 ) |
428 ) |
428 #(#LabelSpec |
429 #(#LabelSpec |
429 #name: 'methodChangesLabel' |
430 #name: 'methodChangesLabel' |
430 #layout: #(#LayoutFrame 373 0 0 0.0 458 0 14 0) |
431 #layout: #(#LayoutFrame 373 0 0 0.0 458 0 14 0) |
431 #label: '= method' |
432 #label: '= method' |
432 #translateLabel: true |
433 #translateLabel: true |
433 #style: #(#FontDescription #helvetica #medium #roman 10) |
434 #style: #(#FontDescription #helvetica #medium #roman 10) |
434 #adjust: #left |
435 #adjust: #left |
435 ) |
436 ) |
436 #(#ActionButtonSpec |
437 #(#ActionButtonSpec |
437 #name: 'classChangesButton' |
438 #name: 'classChangesButton' |
438 #layout: #(#LayoutFrame 455 0.0 2 0.0 465 0 13 0) |
439 #layout: #(#LayoutFrame 455 0.0 2 0.0 465 0 13 0) |
439 #label: ' ' |
440 #label: ' ' |
440 #backgroundColor: #(#Color 50.0008 50.0008 50.0008) |
441 #backgroundColor: #(#Color 50.0008 50.0008 50.0008) |
441 #model: #doFilterType: |
442 #model: #doFilterType: |
442 #actionValue: 'class' |
443 #actionValue: 'class' |
443 ) |
444 ) |
444 #(#LabelSpec |
445 #(#LabelSpec |
445 #name: 'classChangesLabel' |
446 #name: 'classChangesLabel' |
446 #layout: #(#LayoutFrame 470 0 0 0.0 580 0 14 0) |
447 #layout: #(#LayoutFrame 470 0 0 0.0 580 0 14 0) |
447 #label: '= class change' |
448 #label: '= class change' |
448 #translateLabel: true |
449 #translateLabel: true |
449 #style: #(#FontDescription #helvetica #medium #roman 10) |
450 #style: #(#FontDescription #helvetica #medium #roman 10) |
450 #adjust: #left |
451 #adjust: #left |
451 ) |
452 ) |
452 #(#ActionButtonSpec |
453 #(#ActionButtonSpec |
453 #name: 'snapshotButton' |
454 #name: 'snapshotButton' |
454 #layout: #(#LayoutFrame 258 0.0 16 0.0 268 0 27 0) |
455 #layout: #(#LayoutFrame 258 0.0 16 0.0 268 0 27 0) |
455 #label: ' ' |
456 #label: ' ' |
456 #backgroundColor: #(#Color 100.0 0.0 0.0) |
457 #backgroundColor: #(#Color 100.0 0.0 0.0) |
457 #model: #doFilterType: |
458 #model: #doFilterType: |
458 #actionValue: 'image' |
459 #actionValue: 'image' |
459 ) |
460 ) |
460 #(#LabelSpec |
461 #(#LabelSpec |
461 #name: 'snapshotLabel' |
462 #name: 'snapshotLabel' |
462 #layout: #(#LayoutFrame 273 0 14 0.0 355 0 28 0) |
463 #layout: #(#LayoutFrame 273 0 14 0.0 355 0 28 0) |
463 #label: '= snapshot' |
464 #label: '= snapshot' |
464 #translateLabel: true |
465 #translateLabel: true |
465 #style: #(#FontDescription #helvetica #medium #roman 10) |
466 #style: #(#FontDescription #helvetica #medium #roman 10) |
466 #adjust: #left |
467 #adjust: #left |
467 ) |
468 ) |
468 #(#ActionButtonSpec |
469 #(#ActionButtonSpec |
469 #name: 'fileInButton' |
470 #name: 'fileInButton' |
470 #layout: #(#LayoutFrame 359 0.0 16 0.0 369 0 27 0) |
471 #layout: #(#LayoutFrame 359 0.0 16 0.0 369 0 27 0) |
471 #label: ' ' |
472 #label: ' ' |
472 #backgroundColor: #(#Color 0.0 80.0 80.0) |
473 #backgroundColor: #(#Color 0.0 80.0 80.0) |
473 #model: #doFilterSourceType: |
474 #model: #doFilterSourceType: |
474 #actionValue: '* file*' |
475 #actionValue: '* file*' |
475 ) |
476 ) |
476 #(#LabelSpec |
477 #(#LabelSpec |
477 #name: 'fileInLabel' |
478 #name: 'fileInLabel' |
478 #layout: #(#LayoutFrame 374 0 14 0.0 440 0 28 0) |
479 #layout: #(#LayoutFrame 374 0 14 0.0 440 0 28 0) |
479 #label: '= fileIn' |
480 #label: '= fileIn' |
480 #translateLabel: true |
481 #translateLabel: true |
481 #style: #(#FontDescription #helvetica #medium #roman 10) |
482 #style: #(#FontDescription #helvetica #medium #roman 10) |
482 #adjust: #left |
483 #adjust: #left |
483 ) |
484 ) |
484 #(#ActionButtonSpec |
485 #(#ActionButtonSpec |
485 #name: 'checkInButton' |
486 #name: 'checkInButton' |
486 #layout: #(#LayoutFrame 455 0.0 16 0.0 465 0 27 0) |
487 #layout: #(#LayoutFrame 455 0.0 16 0.0 465 0 27 0) |
487 #label: ' ' |
488 #label: ' ' |
488 #backgroundColor: #(#Color 0.0 0.0 100.0) |
489 #backgroundColor: #(#Color 0.0 0.0 100.0) |
489 #model: #doFilterSourceType: |
490 #model: #doFilterSourceType: |
490 #actionValue: '* checkin*' |
491 #actionValue: '* checkin*' |
491 ) |
492 ) |
492 #(#LabelSpec |
493 #(#LabelSpec |
493 #name: 'checkInLabel' |
494 #name: 'checkInLabel' |
494 #layout: #(#LayoutFrame 470 0 14 0.0 550 0 28 0) |
495 #layout: #(#LayoutFrame 470 0 14 0.0 550 0 28 0) |
495 #label: '= checkIn' |
496 #label: '= checkIn' |
496 #translateLabel: true |
497 #translateLabel: true |
497 #style: #(#FontDescription #helvetica #medium #roman 10) |
498 #style: #(#FontDescription #helvetica #medium #roman 10) |
498 #adjust: #left |
499 #adjust: #left |
499 ) |
500 ) |
500 ) |
501 ) |
501 ) |
502 ) |
502 ) |
503 ) |
503 ) |
504 ) |
504 ) |
505 ) |
505 ) |
506 ) |
506 #(#WorkspaceSpec |
507 #(#WorkspaceSpec |
507 #name: 'changeTextEditor' |
508 #name: 'changeTextEditor' |
508 #model: #valueOfChangeText |
509 #model: #valueOfChangeText |
509 #hasHorizontalScrollBar: true |
510 #hasHorizontalScrollBar: true |
510 #hasVerticalScrollBar: true |
511 #hasVerticalScrollBar: true |
511 #miniScrollerHorizontal: true |
512 #miniScrollerHorizontal: true |
512 #isReadOnly: true |
513 #isReadOnly: true |
513 ) |
514 ) |
514 ) |
515 ) |
515 ) |
516 ) |
516 #handles: #(#Any 0.5 1.0) |
517 #handles: #(#Any 0.5 1.0) |
517 ) |
518 ) |
518 #(#UISubSpecification |
519 #(#UISubSpecification |
519 #name: 'windowSpecForInfoBar' |
520 #name: 'windowSpecForInfoBar' |
520 #layout: #(#LayoutFrame 0 0.0 -24 1 0 1.0 0 1.0) |
521 #layout: #(#LayoutFrame 0 0.0 -24 1 0 1.0 0 1.0) |
521 #majorKey: #ToolApplicationModel |
522 #majorKey: #ToolApplicationModel |
522 #minorKey: #windowSpecForInfoBar |
523 #minorKey: #windowSpecForInfoBar |
523 ) |
524 ) |
524 ) |
525 ) |
525 ) |
526 ) |
|
527 ) |
526 ) |
528 |
527 |
529 "Modified: / 19.5.1998 / 18:58:47 / cg" |
528 "Modified: / 19.5.1998 / 18:58:47 / cg" |
530 ! ! |
529 ! ! |
531 |
530 |
620 |
619 |
621 ^ |
620 ^ |
622 |
621 |
623 #(#Menu |
622 #(#Menu |
624 |
623 |
625 #( |
624 #( |
626 #(#MenuItem |
625 #(#MenuItem |
627 #label: 'About' |
626 #label: 'About' |
628 #translateLabel: true |
627 #translateLabel: true |
629 #activeHelpKey: #about |
628 #activeHelpKey: #about |
630 #labelImage: #(#ResourceRetriever nil #menuIcon) |
629 #labelImage: #(#ResourceRetriever nil #menuIcon) |
631 #submenuChannel: #menuAbout |
630 #submenuChannel: #menuAbout |
632 ) |
631 ) |
633 #(#MenuItem |
632 #(#MenuItem |
634 #label: 'File' |
633 #label: 'File' |
635 #translateLabel: true |
634 #translateLabel: true |
636 #activeHelpKey: #file |
635 #activeHelpKey: #file |
637 #submenu: |
636 #submenu: |
638 #(#Menu |
637 #(#Menu |
639 |
638 |
640 #( |
639 #( |
641 #(#MenuItem |
640 #(#MenuItem |
642 #label: 'Reload' |
641 #label: 'Reload' |
643 #translateLabel: true |
642 #translateLabel: true |
644 #value: #doReload |
643 #value: #doReload |
645 #activeHelpKey: #fileReload |
644 #activeHelpKey: #fileReload |
646 #enabled: #valueOfNotReading |
645 #enabled: #valueOfNotReading |
647 ) |
646 ) |
648 #(#MenuItem |
647 #(#MenuItem |
649 #label: '-' |
648 #label: '-' |
650 ) |
649 ) |
651 #(#MenuItem |
650 #(#MenuItem |
652 #label: 'Load...' |
651 #label: 'Load...' |
653 #translateLabel: true |
652 #translateLabel: true |
654 #value: #doLoad |
653 #value: #doLoad |
655 #activeHelpKey: #fileLoad |
654 #activeHelpKey: #fileLoad |
656 #enabled: #valueOfNotSaving |
655 #enabled: #valueOfNotSaving |
657 ) |
656 ) |
658 #(#MenuItem |
657 #(#MenuItem |
659 #label: '-' |
658 #label: '-' |
660 ) |
659 ) |
661 #(#MenuItem |
660 #(#MenuItem |
662 #label: 'Save' |
661 #label: 'Save' |
663 #translateLabel: true |
662 #translateLabel: true |
664 #value: #doSave |
663 #value: #doSave |
665 #activeHelpKey: #fileSave |
664 #activeHelpKey: #fileSave |
666 #enabled: #valueOfNotReading |
665 #enabled: #valueOfNotReading |
667 ) |
666 ) |
668 #(#MenuItem |
667 #(#MenuItem |
669 #label: '-' |
668 #label: '-' |
670 ) |
669 ) |
671 #(#MenuItem |
670 #(#MenuItem |
672 #label: 'Browse Class' |
671 #label: 'Browse Class' |
673 #translateLabel: true |
672 #translateLabel: true |
674 #value: #doBrowseClass |
673 #value: #doBrowseClass |
675 #activeHelpKey: #fileBrowseClass |
674 #activeHelpKey: #fileBrowseClass |
676 #enabled: #valueOfHavingChangeSelection |
675 #enabled: #valueOfHavingChangeSelection |
677 ) |
676 ) |
678 #(#MenuItem |
677 #(#MenuItem |
679 #label: '-' |
678 #label: '-' |
680 ) |
679 ) |
681 #(#MenuItem |
680 #(#MenuItem |
682 #label: 'Exit' |
681 #label: 'Exit' |
683 #translateLabel: true |
682 #translateLabel: true |
684 #value: #closeRequest |
683 #value: #closeRequest |
685 #activeHelpKey: #fileExit |
684 #activeHelpKey: #fileExit |
686 #enabled: #valueOfNotSaving |
685 #enabled: #valueOfNotSaving |
687 ) |
686 ) |
688 ) nil |
687 ) nil |
689 nil |
688 nil |
690 ) |
689 ) |
691 ) |
690 ) |
692 #(#MenuItem |
691 #(#MenuItem |
693 #label: 'Apply' |
692 #label: 'Apply' |
694 #translateLabel: true |
693 #translateLabel: true |
695 #submenu: |
694 #submenu: |
696 #(#Menu |
695 #(#Menu |
697 |
696 |
698 #( |
697 #( |
699 #(#MenuItem |
698 #(#MenuItem |
700 #label: 'Change' |
699 #label: 'Change' |
701 #translateLabel: true |
700 #translateLabel: true |
702 #value: #doApply |
701 #value: #doApply |
703 #activeHelpKey: #applyLine |
702 #activeHelpKey: #applyLine |
704 #enabled: #valueOfHavingChangeSelection |
703 #enabled: #valueOfHavingChangeSelection |
705 ) |
704 ) |
706 #(#MenuItem |
705 #(#MenuItem |
707 #label: '-' |
706 #label: '-' |
708 ) |
707 ) |
709 #(#MenuItem |
708 #(#MenuItem |
710 #label: 'All' |
709 #label: 'All' |
711 #translateLabel: true |
710 #translateLabel: true |
712 #value: #doApplyAll |
711 #value: #doApplyAll |
713 #activeHelpKey: #applyAll |
712 #activeHelpKey: #applyAll |
714 #enabled: #valueOfNotReading |
713 #enabled: #valueOfNotReading |
715 ) |
714 ) |
716 #(#MenuItem |
715 #(#MenuItem |
717 #label: 'To End' |
716 #label: 'To End' |
718 #translateLabel: true |
717 #translateLabel: true |
719 #value: #doApplyToEnd |
718 #value: #doApplyToEnd |
720 #activeHelpKey: #applyToEnd |
719 #activeHelpKey: #applyToEnd |
721 #enabled: #valueOfHavingSelection |
720 #enabled: #valueOfHavingSelection |
722 ) |
721 ) |
723 #(#MenuItem |
722 #(#MenuItem |
724 #label: 'All for Class' |
723 #label: 'All for Class' |
725 #translateLabel: true |
724 #translateLabel: true |
726 #value: #doApplyAllForClass |
725 #value: #doApplyAllForClass |
727 #activeHelpKey: #applyForClassToEnd |
726 #activeHelpKey: #applyForClassToEnd |
728 #enabled: #valueOfHavingChangeSelection |
727 #enabled: #valueOfHavingChangeSelection |
729 ) |
728 ) |
730 #(#MenuItem |
729 #(#MenuItem |
731 #label: 'For Class to End' |
730 #label: 'For Class to End' |
732 #translateLabel: true |
731 #translateLabel: true |
733 #value: #doApplyForClassToEnd |
732 #value: #doApplyForClassToEnd |
734 #activeHelpKey: #applyForClassToEnd |
733 #activeHelpKey: #applyForClassToEnd |
735 #enabled: #valueOfHavingChangeSelection |
734 #enabled: #valueOfHavingChangeSelection |
736 ) |
735 ) |
737 #(#MenuItem |
736 #(#MenuItem |
738 #label: '-' |
737 #label: '-' |
739 ) |
738 ) |
740 #(#MenuItem |
739 #(#MenuItem |
741 #label: 'From last Snapshot' |
740 #label: 'From last Snapshot' |
742 #translateLabel: true |
741 #translateLabel: true |
743 #value: #doApplyFromLastSnapshot |
742 #value: #doApplyFromLastSnapshot |
744 #activeHelpKey: #applyFromLastSnapshot |
743 #activeHelpKey: #applyFromLastSnapshot |
745 #enabled: #valueOfNotReading |
744 #enabled: #valueOfNotReading |
746 ) |
745 ) |
747 ) nil |
746 ) nil |
748 nil |
747 nil |
749 ) |
748 ) |
750 ) |
749 ) |
751 #(#MenuItem |
750 #(#MenuItem |
752 #label: 'Delete' |
751 #label: 'Delete' |
753 #translateLabel: true |
752 #translateLabel: true |
754 #activeHelpKey: #edit |
753 #activeHelpKey: #edit |
755 #submenu: |
754 #submenu: |
756 #(#Menu |
755 #(#Menu |
757 |
756 |
758 #( |
757 #( |
759 #(#MenuItem |
758 #(#MenuItem |
760 #label: 'Change' |
759 #label: 'Change' |
761 #translateLabel: true |
760 #translateLabel: true |
762 #value: #doDelete |
761 #value: #doDelete |
763 #activeHelpKey: #deleteLine |
762 #activeHelpKey: #deleteLine |
764 #enabled: #valueOfHavingSelection |
763 #enabled: #valueOfHavingSelection |
765 ) |
764 ) |
766 #(#MenuItem |
765 #(#MenuItem |
767 #label: '-' |
766 #label: '-' |
768 ) |
767 ) |
769 #(#MenuItem |
768 #(#MenuItem |
770 #label: 'All' |
769 #label: 'All' |
771 #translateLabel: true |
770 #translateLabel: true |
772 #value: #doDeleteAll |
771 #value: #doDeleteAll |
773 #activeHelpKey: #deleteAll |
772 #activeHelpKey: #deleteAll |
774 #enabled: #valueOfNotReading |
773 #enabled: #valueOfNotReading |
775 ) |
774 ) |
776 #(#MenuItem |
775 #(#MenuItem |
777 #label: 'To End' |
776 #label: 'To End' |
778 #translateLabel: true |
777 #translateLabel: true |
779 #value: #doDeleteToEnd |
778 #value: #doDeleteToEnd |
780 #activeHelpKey: #deleteToEnd |
779 #activeHelpKey: #deleteToEnd |
781 #enabled: #valueOfHavingSelection |
780 #enabled: #valueOfHavingSelection |
782 ) |
781 ) |
783 #(#MenuItem |
782 #(#MenuItem |
784 #label: 'All for Class' |
783 #label: 'All for Class' |
785 #translateLabel: true |
784 #translateLabel: true |
786 #value: #doDeleteAllForClass |
785 #value: #doDeleteAllForClass |
787 #activeHelpKey: #applyForClassToEnd |
786 #activeHelpKey: #applyForClassToEnd |
788 #enabled: #valueOfHavingChangeSelection |
787 #enabled: #valueOfHavingChangeSelection |
789 ) |
788 ) |
790 #(#MenuItem |
789 #(#MenuItem |
791 #label: 'For Class to End' |
790 #label: 'For Class to End' |
792 #translateLabel: true |
791 #translateLabel: true |
793 #value: #doDeleteForClassToEnd |
792 #value: #doDeleteForClassToEnd |
794 #activeHelpKey: #deleteForClassToEnd |
793 #activeHelpKey: #deleteForClassToEnd |
795 #enabled: #valueOfHavingChangeSelection |
794 #enabled: #valueOfHavingChangeSelection |
796 ) |
795 ) |
797 #(#MenuItem |
796 #(#MenuItem |
798 #label: '-' |
797 #label: '-' |
799 ) |
798 ) |
800 #(#MenuItem |
799 #(#MenuItem |
801 #label: 'Compress' |
800 #label: 'Compress' |
802 #translateLabel: true |
801 #translateLabel: true |
803 #value: #doCompress |
802 #value: #doCompress |
804 #activeHelpKey: #deleteCompress |
803 #activeHelpKey: #deleteCompress |
805 #enabled: #valueOfNotReading |
804 #enabled: #valueOfNotReading |
806 ) |
805 ) |
807 #(#MenuItem |
806 #(#MenuItem |
808 #label: 'Compress for Class' |
807 #label: 'Compress for Class' |
809 #translateLabel: true |
808 #translateLabel: true |
810 #value: #doCompressForClass |
809 #value: #doCompressForClass |
811 #activeHelpKey: #deleteCompressForClass |
810 #activeHelpKey: #deleteCompressForClass |
812 #enabled: #valueOfHavingChangeSelection |
811 #enabled: #valueOfHavingChangeSelection |
813 ) |
812 ) |
814 ) nil |
813 ) nil |
815 nil |
814 nil |
816 ) |
815 ) |
817 ) |
816 ) |
818 #(#MenuItem |
817 #(#MenuItem |
819 #label: 'Test' |
818 #label: 'Test' |
820 #translateLabel: true |
819 #translateLabel: true |
821 #activeHelpKey: #test |
820 #activeHelpKey: #test |
822 #submenu: |
821 #submenu: |
823 #(#Menu |
822 #(#Menu |
824 |
823 |
825 #( |
824 #( |
826 #(#MenuItem |
825 #(#MenuItem |
827 #label: 'Find last Snapshot' |
826 #label: 'Find last Snapshot' |
828 #translateLabel: true |
827 #translateLabel: true |
829 #value: #doFindSnapshot: |
828 #value: #doFindSnapshot: |
830 #activeHelpKey: #testFindLastSnapshot |
829 #activeHelpKey: #testFindLastSnapshot |
831 #enabled: #valueOfHavingSelection |
830 #enabled: #valueOfHavingSelection |
832 #argument: 'last' |
831 #argument: 'last' |
833 ) |
832 ) |
834 #(#MenuItem |
833 #(#MenuItem |
835 #label: 'Find next Snapshot' |
834 #label: 'Find next Snapshot' |
836 #translateLabel: true |
835 #translateLabel: true |
837 #value: #doFindSnapshot: |
836 #value: #doFindSnapshot: |
838 #activeHelpKey: #testFindNextSnapshot |
837 #activeHelpKey: #testFindNextSnapshot |
839 #enabled: #valueOfHavingSelection |
838 #enabled: #valueOfHavingSelection |
840 #argument: 'next' |
839 #argument: 'next' |
841 ) |
840 ) |
842 #(#MenuItem |
841 #(#MenuItem |
843 #label: '-' |
842 #label: '-' |
844 ) |
843 ) |
845 #(#MenuItem |
844 #(#MenuItem |
846 #label: 'Compare with Current Version' |
845 #label: 'Compare with Current Version' |
847 #translateLabel: true |
846 #translateLabel: true |
848 #value: #doCompare |
847 #value: #doCompare |
849 #activeHelpKey: #testCompareWithCurrentVersion |
848 #activeHelpKey: #testCompareWithCurrentVersion |
850 #enabled: #valueOfHavingChangeSelection |
849 #enabled: #valueOfHavingChangeSelection |
851 ) |
850 ) |
852 ) nil |
851 ) nil |
853 nil |
852 nil |
854 ) |
853 ) |
855 ) |
854 ) |
856 #(#MenuItem |
855 #(#MenuItem |
857 #label: 'Settings' |
856 #label: 'Settings' |
858 #translateLabel: true |
857 #translateLabel: true |
859 #activeHelpKey: #settings |
858 #activeHelpKey: #settings |
860 #submenu: |
859 #submenu: |
861 #(#Menu |
860 #(#Menu |
862 |
861 |
863 #( |
862 #( |
864 #(#MenuItem |
863 #(#MenuItem |
865 #label: 'Auto Update' |
864 #label: 'Auto Update' |
866 #translateLabel: true |
865 #translateLabel: true |
867 #activeHelpKey: #settingsAutoUpdate |
866 #activeHelpKey: #settingsAutoUpdate |
868 #enabled: #valueOfNotReading |
867 #enabled: #valueOfNotReading |
869 #indication: #autoUpdateMode: |
868 #indication: #autoUpdateMode: |
870 ) |
869 ) |
871 #(#MenuItem |
870 #(#MenuItem |
872 #label: '-' |
871 #label: '-' |
873 ) |
872 ) |
874 #(#MenuItem |
873 #(#MenuItem |
875 #label: 'Private Classes as Separate' |
874 #label: 'Private Classes as Separate' |
876 #translateLabel: true |
875 #translateLabel: true |
877 #activeHelpKey: #settingsPrivateAsSeparate |
876 #activeHelpKey: #settingsPrivateAsSeparate |
878 #enabled: #valueOfNotReading |
877 #enabled: #valueOfNotReading |
879 #indication: #privateAsSeparate: |
878 #indication: #privateAsSeparate: |
880 ) |
879 ) |
881 #(#MenuItem |
880 #(#MenuItem |
882 #label: '-' |
881 #label: '-' |
883 ) |
882 ) |
884 #(#MenuItem |
883 #(#MenuItem |
885 #label: 'Columns' |
884 #label: 'Columns' |
886 #translateLabel: true |
885 #translateLabel: true |
887 #activeHelpKey: #settingsColumns |
886 #activeHelpKey: #settingsColumns |
888 #submenu: |
887 #submenu: |
889 #(#Menu |
888 #(#Menu |
890 |
889 |
891 #( |
890 #( |
892 #(#MenuItem |
891 #(#MenuItem |
893 #label: 'Category' |
892 #label: 'Category' |
894 #activeHelpKey: #settingsColumnsCategory |
893 #activeHelpKey: #settingsColumnsCategory |
895 #indication: #categoryColumn: |
894 #indication: #categoryColumn: |
896 ) |
895 ) |
897 #(#MenuItem |
896 #(#MenuItem |
898 #label: 'Delta Info' |
897 #label: 'Delta Info' |
899 #activeHelpKey: #settingsColumnsDeltaInfo |
898 #activeHelpKey: #settingsColumnsDeltaInfo |
900 #indication: #deltaInfoColumn: |
899 #indication: #deltaInfoColumn: |
901 ) |
900 ) |
902 #(#MenuItem |
901 #(#MenuItem |
903 #label: 'Type' |
902 #label: 'Type' |
904 #activeHelpKey: #settingsColumnsType |
903 #activeHelpKey: #settingsColumnsType |
905 #indication: #typeColumn: |
904 #indication: #typeColumn: |
906 ) |
905 ) |
907 #(#MenuItem |
906 #(#MenuItem |
908 #label: 'Time Stamp' |
907 #label: 'Time Stamp' |
909 #activeHelpKey: #settingsColumnsTimeStamp |
908 #activeHelpKey: #settingsColumnsTimeStamp |
910 #indication: #timeStampColumn: |
909 #indication: #timeStampColumn: |
911 ) |
910 ) |
912 #(#MenuItem |
911 #(#MenuItem |
913 #label: 'Positions' |
912 #label: 'Positions' |
914 #activeHelpKey: #settingsColumnsPosition |
913 #activeHelpKey: #settingsColumnsPosition |
915 #indication: #positionsColumn: |
914 #indication: #positionsColumn: |
916 ) |
915 ) |
917 ) nil |
916 ) nil |
918 nil |
917 nil |
919 ) |
918 ) |
920 ) |
919 ) |
921 #(#MenuItem |
920 #(#MenuItem |
922 #label: '-' |
921 #label: '-' |
923 ) |
922 ) |
924 #(#MenuItem |
923 #(#MenuItem |
925 #label: 'Fonts' |
924 #label: 'Fonts' |
926 #translateLabel: true |
925 #translateLabel: true |
927 #enabled: #valueOfNotReading |
926 #enabled: #valueOfNotReading |
928 #submenuChannel: #menuFont |
927 #submenuChannel: #menuFont |
929 ) |
928 ) |
930 ) nil |
929 ) nil |
931 nil |
930 nil |
932 ) |
931 ) |
933 ) |
932 ) |
934 #(#MenuItem |
933 #(#MenuItem |
935 #label: 'History' |
934 #label: 'History' |
936 #translateLabel: true |
935 #translateLabel: true |
937 #submenuChannel: #menuHistory |
936 #submenuChannel: #menuHistory |
938 ) |
937 ) |
939 #(#MenuItem |
938 #(#MenuItem |
940 #label: 'Help' |
939 #label: 'Help' |
941 #translateLabel: true |
940 #translateLabel: true |
942 #startGroup: #right |
941 #startGroup: #right |
943 #activeHelpKey: #help |
942 #activeHelpKey: #help |
944 #submenuChannel: #menuHelp |
943 #submenuChannel: #menuHelp |
945 ) |
944 ) |
946 ) nil |
945 ) nil |
947 nil |
946 nil |
948 ) |
947 ) |
949 |
948 |
950 "Modified: / 19.5.1998 / 18:17:27 / cg" |
949 "Modified: / 19.5.1998 / 18:17:27 / cg" |
951 ! |
950 ! |
952 |
951 |
966 |
965 |
967 ^ |
966 ^ |
968 |
967 |
969 #(#Menu |
968 #(#Menu |
970 |
969 |
971 #( |
970 #( |
972 #(#MenuItem |
971 #(#MenuItem |
973 #label: 'Apply' |
972 #label: 'Apply' |
974 #translateLabel: true |
973 #translateLabel: true |
975 #value: #doApply |
974 #value: #doApply |
976 #activeHelpKey: #applyLine |
975 #activeHelpKey: #applyLine |
977 #enabled: #valueOfHavingChangeSelection |
976 #enabled: #valueOfHavingChangeSelection |
978 ) |
977 ) |
979 #(#MenuItem |
978 #(#MenuItem |
980 #label: 'Apply To End' |
979 #label: 'Apply To End' |
981 #translateLabel: true |
980 #translateLabel: true |
982 #value: #doApplyToEnd |
981 #value: #doApplyToEnd |
983 #activeHelpKey: #applyToEnd |
982 #activeHelpKey: #applyToEnd |
984 #enabled: #valueOfHavingSelection |
983 #enabled: #valueOfHavingSelection |
985 ) |
984 ) |
986 #(#MenuItem |
985 #(#MenuItem |
987 #label: 'Apply All For Class' |
986 #label: 'Apply All For Class' |
988 #translateLabel: true |
987 #translateLabel: true |
989 #value: #doApplyAllForClass |
988 #value: #doApplyAllForClass |
990 #activeHelpKey: #applyForClassToEnd |
989 #activeHelpKey: #applyForClassToEnd |
991 #enabled: #valueOfHavingChangeSelection |
990 #enabled: #valueOfHavingChangeSelection |
992 ) |
991 ) |
993 #(#MenuItem |
992 #(#MenuItem |
994 #label: 'Apply For Class To End' |
993 #label: 'Apply For Class To End' |
995 #translateLabel: true |
994 #translateLabel: true |
996 #value: #doApplyForClassToEnd |
995 #value: #doApplyForClassToEnd |
997 #activeHelpKey: #applyForClassToEnd |
996 #activeHelpKey: #applyForClassToEnd |
998 #enabled: #valueOfHavingChangeSelection |
997 #enabled: #valueOfHavingChangeSelection |
999 ) |
998 ) |
1000 #(#MenuItem |
999 #(#MenuItem |
1001 #label: '-' |
1000 #label: '-' |
1002 ) |
1001 ) |
1003 #(#MenuItem |
1002 #(#MenuItem |
1004 #label: 'Delete' |
1003 #label: 'Delete' |
1005 #translateLabel: true |
1004 #translateLabel: true |
1006 #value: #doDelete |
1005 #value: #doDelete |
1007 #activeHelpKey: #deleteLine |
1006 #activeHelpKey: #deleteLine |
1008 #enabled: #valueOfHavingSelection |
1007 #enabled: #valueOfHavingSelection |
1009 ) |
1008 ) |
1010 #(#MenuItem |
1009 #(#MenuItem |
1011 #label: 'Delete To End' |
1010 #label: 'Delete To End' |
1012 #translateLabel: true |
1011 #translateLabel: true |
1013 #value: #doDeleteToEnd |
1012 #value: #doDeleteToEnd |
1014 #activeHelpKey: #deleteToEnd |
1013 #activeHelpKey: #deleteToEnd |
1015 #enabled: #valueOfHavingSelection |
1014 #enabled: #valueOfHavingSelection |
1016 ) |
1015 ) |
1017 #(#MenuItem |
1016 #(#MenuItem |
1018 #label: 'Delete All For Class' |
1017 #label: 'Delete All For Class' |
1019 #translateLabel: true |
1018 #translateLabel: true |
1020 #value: #doDeleteAllForClass |
1019 #value: #doDeleteAllForClass |
1021 #activeHelpKey: #applyForClassToEnd |
1020 #activeHelpKey: #applyForClassToEnd |
1022 #enabled: #valueOfHavingChangeSelection |
1021 #enabled: #valueOfHavingChangeSelection |
1023 ) |
1022 ) |
1024 #(#MenuItem |
1023 #(#MenuItem |
1025 #label: 'Delete For Class To End' |
1024 #label: 'Delete For Class To End' |
1026 #translateLabel: true |
1025 #translateLabel: true |
1027 #value: #doDeleteForClassToEnd |
1026 #value: #doDeleteForClassToEnd |
1028 #activeHelpKey: #deleteForClassToEnd |
1027 #activeHelpKey: #deleteForClassToEnd |
1029 #enabled: #valueOfHavingChangeSelection |
1028 #enabled: #valueOfHavingChangeSelection |
1030 ) |
1029 ) |
1031 #(#MenuItem |
1030 #(#MenuItem |
1032 #label: '-' |
1031 #label: '-' |
1033 ) |
1032 ) |
1034 #(#MenuItem |
1033 #(#MenuItem |
1035 #label: 'Browse Class' |
1034 #label: 'Browse Class' |
1036 #translateLabel: true |
1035 #translateLabel: true |
1037 #value: #doBrowseClass |
1036 #value: #doBrowseClass |
1038 #activeHelpKey: #fileBrowseClass |
1037 #activeHelpKey: #fileBrowseClass |
1039 #enabled: #valueOfHavingChangeSelection |
1038 #enabled: #valueOfHavingChangeSelection |
1040 ) |
1039 ) |
1041 #(#MenuItem |
1040 #(#MenuItem |
1042 #label: '-' |
1041 #label: '-' |
1043 ) |
1042 ) |
1044 #(#MenuItem |
1043 #(#MenuItem |
1045 #label: 'Compress For Class' |
1044 #label: 'Compress For Class' |
1046 #translateLabel: true |
1045 #translateLabel: true |
1047 #value: #doCompressForClass |
1046 #value: #doCompressForClass |
1048 #activeHelpKey: #deleteCompressForClass |
1047 #activeHelpKey: #deleteCompressForClass |
1049 #enabled: #valueOfHavingChangeSelection |
1048 #enabled: #valueOfHavingChangeSelection |
1050 ) |
1049 ) |
1051 ) nil |
1050 ) nil |
1052 nil |
1051 nil |
1053 ) |
1052 ) |
1054 |
1053 |
1055 "Modified: / 19.5.1998 / 18:03:59 / cg" |
1054 "Modified: / 19.5.1998 / 18:03:59 / cg" |
1056 ! |
1055 ! |
1057 |
1056 |
1071 |
1070 |
1072 ^ |
1071 ^ |
1073 |
1072 |
1074 #(#Menu |
1073 #(#Menu |
1075 |
1074 |
1076 #( |
1075 #( |
1077 #(#MenuItem |
1076 #(#MenuItem |
1078 #label: 'Load' |
1077 #label: 'Load' |
1079 #isButton: true |
1078 #isButton: true |
1080 #value: #doLoad |
1079 #value: #doLoad |
1081 #activeHelpKey: #fileLoad |
1080 #activeHelpKey: #fileLoad |
1082 #enabled: #valueOfNotReading |
1081 #enabled: #valueOfNotReading |
1083 #labelImage: #(#ResourceRetriever #Icon #loadIcon) |
1082 #labelImage: #(#ResourceRetriever #Icon #loadIcon) |
1084 ) |
1083 ) |
1085 #(#MenuItem |
1084 #(#MenuItem |
1086 #label: 'Save' |
1085 #label: 'Save' |
1087 #isButton: true |
1086 #isButton: true |
1088 #value: #doSave |
1087 #value: #doSave |
1089 #activeHelpKey: #fileSave |
1088 #activeHelpKey: #fileSave |
1090 #enabled: #valueOfNotSaving |
1089 #enabled: #valueOfNotSaving |
1091 #labelImage: #(#ResourceRetriever #Icon #saveIcon) |
1090 #labelImage: #(#ResourceRetriever #Icon #saveIcon) |
1092 ) |
1091 ) |
1093 #(#MenuItem |
1092 #(#MenuItem |
1094 #label: '' |
1093 #label: '' |
1095 ) |
1094 ) |
1096 #(#MenuItem |
1095 #(#MenuItem |
1097 #label: 'Compress' |
1096 #label: 'Compress' |
1098 #isButton: true |
1097 #isButton: true |
1099 #value: #doCompress |
1098 #value: #doCompress |
1100 #activeHelpKey: #deleteCompress |
1099 #activeHelpKey: #deleteCompress |
1101 #enabled: #valueOfNotReading |
1100 #enabled: #valueOfNotReading |
1102 #labelImage: #(#ResourceRetriever nil #compressIcon) |
1101 #labelImage: #(#ResourceRetriever nil #compressIcon) |
1103 ) |
1102 ) |
1104 #(#MenuItem |
1103 #(#MenuItem |
1105 #label: '' |
1104 #label: '' |
1106 ) |
1105 ) |
1107 #(#MenuItem |
1106 #(#MenuItem |
1108 #label: 'Apply' |
1107 #label: 'Apply' |
1109 #isButton: true |
1108 #isButton: true |
1110 #value: #doApply |
1109 #value: #doApply |
1111 #activeHelpKey: #applyLine |
1110 #activeHelpKey: #applyLine |
1112 #enabled: #valueOfHavingChangeSelection |
1111 #enabled: #valueOfHavingChangeSelection |
1113 #labelImage: #(#ResourceRetriever nil #applyIcon) |
1112 #labelImage: #(#ResourceRetriever nil #applyIcon) |
1114 ) |
1113 ) |
1115 #(#MenuItem |
1114 #(#MenuItem |
1116 #label: 'Apply To End' |
1115 #label: 'Apply To End' |
1117 #isButton: true |
1116 #isButton: true |
1118 #value: #doApplyToEnd |
1117 #value: #doApplyToEnd |
1119 #activeHelpKey: #applyToEnd |
1118 #activeHelpKey: #applyToEnd |
1120 #enabled: #valueOfHavingSelection |
1119 #enabled: #valueOfHavingSelection |
1121 #labelImage: #(#ResourceRetriever nil #applyToEndIcon) |
1120 #labelImage: #(#ResourceRetriever nil #applyToEndIcon) |
1122 ) |
1121 ) |
1123 #(#MenuItem |
1122 #(#MenuItem |
1124 #label: 'Apply From Last Snapshot' |
1123 #label: 'Apply From Last Snapshot' |
1125 #isButton: true |
1124 #isButton: true |
1126 #value: #doApplyFromLastSnapshot |
1125 #value: #doApplyFromLastSnapshot |
1127 #activeHelpKey: #applyFromLastSnapshot |
1126 #activeHelpKey: #applyFromLastSnapshot |
1128 #enabled: #valueOfNotReading |
1127 #enabled: #valueOfNotReading |
1129 #labelImage: #(#ResourceRetriever nil #applyFromLastSnapshotIcon) |
1128 #labelImage: #(#ResourceRetriever nil #applyFromLastSnapshotIcon) |
1130 ) |
1129 ) |
1131 #(#MenuItem |
1130 #(#MenuItem |
1132 #label: '' |
1131 #label: '' |
1133 ) |
1132 ) |
1134 #(#MenuItem |
1133 #(#MenuItem |
1135 #label: 'Delete' |
1134 #label: 'Delete' |
1136 #isButton: true |
1135 #isButton: true |
1137 #value: #doDelete |
1136 #value: #doDelete |
1138 #activeHelpKey: #deleteLine |
1137 #activeHelpKey: #deleteLine |
1139 #enabled: #valueOfHavingSelection |
1138 #enabled: #valueOfHavingSelection |
1140 #labelImage: #(#ResourceRetriever nil #deleteIcon) |
1139 #labelImage: #(#ResourceRetriever nil #deleteIcon) |
1141 ) |
1140 ) |
1142 #(#MenuItem |
1141 #(#MenuItem |
1143 #label: 'Delete To End' |
1142 #label: 'Delete To End' |
1144 #isButton: true |
1143 #isButton: true |
1145 #value: #doDeleteToEnd |
1144 #value: #doDeleteToEnd |
1146 #activeHelpKey: #deleteToEnd |
1145 #activeHelpKey: #deleteToEnd |
1147 #enabled: #valueOfHavingSelection |
1146 #enabled: #valueOfHavingSelection |
1148 #labelImage: #(#ResourceRetriever nil #deleteToEndIcon) |
1147 #labelImage: #(#ResourceRetriever nil #deleteToEndIcon) |
1149 ) |
1148 ) |
1150 #(#MenuItem |
1149 #(#MenuItem |
1151 #label: '' |
1150 #label: '' |
1152 ) |
1151 ) |
1153 #(#MenuItem |
1152 #(#MenuItem |
1154 #label: 'Find Last Snapshot' |
1153 #label: 'Find Last Snapshot' |
1155 #isButton: true |
1154 #isButton: true |
1156 #value: #doFindSnapshot: |
1155 #value: #doFindSnapshot: |
1157 #activeHelpKey: #testFindLastSnapshot |
1156 #activeHelpKey: #testFindLastSnapshot |
1158 #enabled: #valueOfHavingSelection |
1157 #enabled: #valueOfHavingSelection |
1159 #argument: 'last' |
1158 #argument: 'last' |
1160 #labelImage: #(#ResourceRetriever nil #findLastSnapshotIcon) |
1159 #labelImage: #(#ResourceRetriever nil #findLastSnapshotIcon) |
1161 ) |
1160 ) |
1162 #(#MenuItem |
1161 #(#MenuItem |
1163 #label: 'Find Next Snapshot' |
1162 #label: 'Find Next Snapshot' |
1164 #isButton: true |
1163 #isButton: true |
1165 #value: #doFindSnapshot: |
1164 #value: #doFindSnapshot: |
1166 #activeHelpKey: #testFindNextSnapshot |
1165 #activeHelpKey: #testFindNextSnapshot |
1167 #enabled: #valueOfHavingSelection |
1166 #enabled: #valueOfHavingSelection |
1168 #argument: 'next' |
1167 #argument: 'next' |
1169 #labelImage: #(#ResourceRetriever nil #findNextSnapshotIcon) |
1168 #labelImage: #(#ResourceRetriever nil #findNextSnapshotIcon) |
1170 ) |
1169 ) |
1171 ) nil |
1170 ) nil |
1172 nil |
1171 nil |
1173 ) |
1172 ) |
1174 ! ! |
1173 ! ! |
1175 |
1174 |
1176 !NewChangesBrowser methodsFor:'accesssing - columns'! |
1175 !NewChangesBrowser methodsFor:'accesssing - columns'! |
1177 |
1176 |
1794 aStream isNil ifTrue:[^ self]. |
1793 aStream isNil ifTrue:[^ self]. |
1795 |
1794 |
1796 showDiff := false. |
1795 showDiff := false. |
1797 |
1796 |
1798 aChange followUp ifFalse:[ |
1797 aChange followUp ifFalse:[ |
1799 sawExcla := aStream peekFor:(aStream class chunkSeparator). |
1798 sawExcla := aStream peekFor:(aStream class chunkSeparator). |
1800 chunk := aStream nextChunk. |
1799 chunk := aStream nextChunk. |
1801 ] ifTrue:[ |
1800 ] ifTrue:[ |
1802 chunk := aChange chunk. |
1801 chunk := aChange chunk. |
1803 sawExcla := true. |
1802 sawExcla := true. |
1804 ]. |
1803 ]. |
1805 |
1804 |
1806 beep := false. |
1805 beep := false. |
1807 sawExcla ifFalse:[ |
1806 sawExcla ifFalse:[ |
1808 outcome := 'Cannot compare this change\(i.e. this is not a method change)!!'. |
1807 outcome := 'Cannot compare this change\(i.e. this is not a method change)!!'. |
1809 |
1808 |
1810 parseTree := Parser parseExpression:chunk. |
1809 parseTree := Parser parseExpression:chunk. |
1811 (parseTree notNil and:[parseTree isMessage]) ifTrue:[ |
1810 (parseTree notNil and:[parseTree isMessage]) ifTrue:[ |
1812 ((selector := parseTree selector) == #removeSelector:) ifTrue:[ |
1811 ((selector := parseTree selector) == #removeSelector:) ifTrue:[ |
1813 thisClass := (parseTree receiver evaluate). |
1812 thisClass := (parseTree receiver evaluate). |
1814 thisClass isBehavior ifTrue:[ |
1813 thisClass isBehavior ifTrue:[ |
1815 (self checkClassIsLoaded:thisClass) ifTrue:[ |
1814 (self checkClassIsLoaded:thisClass) ifTrue:[ |
1816 selector := (parseTree arg1 evaluate). |
1815 selector := (parseTree arg1 evaluate). |
1817 (thisClass includesSelector:selector) ifTrue:[ |
1816 (thisClass includesSelector:selector) ifTrue:[ |
1818 outcome := 'Change removes the #' , selector , ' method from ' , thisClass name. |
1817 outcome := 'Change removes the #' , selector , ' method from ' , thisClass name. |
1819 ] ifFalse:[ |
1818 ] ifFalse:[ |
1820 outcome := 'Change has no effect\(there is no method for #' , selector , ' in ' , thisClass name , ')' |
1819 outcome := 'Change has no effect\(there is no method for #' , selector , ' in ' , thisClass name , ')' |
1821 ] |
1820 ] |
1822 ] ifFalse:[ |
1821 ] ifFalse:[ |
1823 beep := true. |
1822 beep := true. |
1824 outcome := 'Cannot compare this change (compare requires class to be loaded)!!'. |
1823 outcome := 'Cannot compare this change (compare requires class to be loaded)!!'. |
1825 ] |
1824 ] |
1826 ] |
1825 ] |
1827 ]. |
1826 ]. |
1828 selector == #category: ifTrue:[ |
1827 selector == #category: ifTrue:[ |
1829 parseTree receiver isMessage ifTrue:[ |
1828 parseTree receiver isMessage ifTrue:[ |
1830 parseTree receiver selector == #compiledMethodAt: ifTrue:[ |
1829 parseTree receiver selector == #compiledMethodAt: ifTrue:[ |
1831 (method := parseTree receiver evaluate) isMethod ifTrue:[ |
1830 (method := parseTree receiver evaluate) isMethod ifTrue:[ |
1832 method category = parseTree arg1 evaluate ifTrue:[ |
1831 method category = parseTree arg1 evaluate ifTrue:[ |
1833 outcome := 'Change has no effect\(same category)'. |
1832 outcome := 'Change has no effect\(same category)'. |
1834 ] ifFalse:[ |
1833 ] ifFalse:[ |
1835 outcome := 'Category is different (''' , method category , ''' vs. ''' , parseTree arg1 evaluate , ''')' |
1834 outcome := 'Category is different (''' , method category , ''' vs. ''' , parseTree arg1 evaluate , ''')' |
1836 ] |
1835 ] |
1837 ] ifFalse:[ |
1836 ] ifFalse:[ |
1838 beep := true. |
1837 beep := true. |
1839 outcome := 'There is no such method!!' |
1838 outcome := 'There is no such method!!' |
1840 ] |
1839 ] |
1841 ] |
1840 ] |
1842 ] |
1841 ] |
1843 ] |
1842 ] |
1844 ] |
1843 ] |
1845 ] ifTrue:[ |
1844 ] ifTrue:[ |
1846 parseTree := Parser parseExpression:chunk. |
1845 parseTree := Parser parseExpression:chunk. |
1847 (parseTree notNil |
1846 (parseTree notNil |
1848 and:[parseTree ~~ #Error |
1847 and:[parseTree ~~ #Error |
1849 and:[parseTree isMessage]]) ifTrue:[ |
1848 and:[parseTree isMessage]]) ifTrue:[ |
1850 (parseTree selector == #methodsFor:) ifTrue:[ |
1849 (parseTree selector == #methodsFor:) ifTrue:[ |
1851 thisClass := (parseTree receiver evaluate). |
1850 thisClass := (parseTree receiver evaluate). |
1852 thisClass isBehavior ifTrue:[ |
1851 thisClass isBehavior ifTrue:[ |
1853 (isLoaded := self checkClassIsLoaded:thisClass) ifFalse:[ |
1852 (isLoaded := self checkClassIsLoaded:thisClass) ifFalse:[ |
1854 outcome := 'Cannot compare this change\(compare requires class to be loaded)!!'. |
1853 outcome := 'Cannot compare this change\(compare requires class to be loaded)!!'. |
1855 ]. |
1854 ]. |
1856 |
1855 |
1857 cat := parseTree arg1 evaluate. |
1856 cat := parseTree arg1 evaluate. |
1858 newSource := aStream nextChunk. |
1857 newSource := aStream nextChunk. |
1859 |
1858 |
1860 parser := Parser parseMethod:newSource in:thisClass. |
1859 parser := Parser parseMethod:newSource in:thisClass. |
1861 (parser notNil and:[parser ~~ #Error]) ifTrue:[ |
1860 (parser notNil and:[parser ~~ #Error]) ifTrue:[ |
1862 sel := parser selector. |
1861 sel := parser selector. |
1863 oldMethod := thisClass compiledMethodAt:sel. |
1862 oldMethod := thisClass compiledMethodAt:sel. |
1864 oldMethod notNil ifTrue:[ |
1863 oldMethod notNil ifTrue:[ |
1865 (oldMethod category = cat) ifFalse:[ |
1864 (oldMethod category = cat) ifFalse:[ |
1866 Transcript showCR:'Category changed.'. |
1865 Transcript showCR:'Category changed.'. |
1867 ]. |
1866 ]. |
1868 oldSource := oldMethod source. |
1867 oldSource := oldMethod source. |
1869 (oldSource = newSource) ifTrue:[ |
1868 (oldSource = newSource) ifTrue:[ |
1870 outcome := 'Same source.' |
1869 outcome := 'Same source.' |
1871 ] ifFalse:[ |
1870 ] ifFalse:[ |
1872 oldSource isNil ifTrue:[ |
1871 oldSource isNil ifTrue:[ |
1873 beep := true. |
1872 beep := true. |
1874 outcome := 'No source for compare.' |
1873 outcome := 'No source for compare.' |
1875 ] ifFalse:[ |
1874 ] ifFalse:[ |
1876 "/ |
1875 "/ |
1877 "/ compare for tabulator <-> space changes |
1876 "/ compare for tabulator <-> space changes |
1878 "/ before showing diff... |
1877 "/ before showing diff... |
1879 "/ |
1878 "/ |
1880 t1 := oldSource asCollectionOfLines collect:[:s | s withTabsExpanded]. |
1879 t1 := oldSource asCollectionOfLines collect:[:s | s withTabsExpanded]. |
1881 t2 := newSource asCollectionOfLines collect:[:s | s withTabsExpanded]. |
1880 t2 := newSource asCollectionOfLines collect:[:s | s withTabsExpanded]. |
1882 t1 = t2 ifTrue:[ |
1881 t1 = t2 ifTrue:[ |
1883 outcome := 'Same source.' |
1882 outcome := 'Same source.' |
1884 ] ifFalse:[ |
1883 ] ifFalse:[ |
1885 outcome := 'Source changed!!'. |
1884 outcome := 'Source changed!!'. |
1886 showDiff := true. |
1885 showDiff := true. |
1887 |
1886 |
1888 "/ |
1887 "/ |
1889 "/ check if only historyLine diffs |
1888 "/ check if only historyLine diffs |
1890 "/ |
1889 "/ |
1891 (HistoryManager notNil |
1890 (HistoryManager notNil |
1892 and:[HistoryManager isActive]) ifTrue:[ |
1891 and:[HistoryManager isActive]) ifTrue:[ |
1893 (HistoryManager withoutHistoryLines:newSource) |
1892 (HistoryManager withoutHistoryLines:newSource) |
1894 = |
1893 = |
1895 (HistoryManager withoutHistoryLines:oldSource) |
1894 (HistoryManager withoutHistoryLines:oldSource) |
1896 ifTrue:[ |
1895 ifTrue:[ |
1897 outcome := 'Same source (history only).'. |
1896 outcome := 'Same source (history only).'. |
1898 showDiff := false. |
1897 showDiff := false. |
1899 ] |
1898 ] |
1900 ]. |
1899 ]. |
1901 ] |
1900 ] |
1902 ] |
1901 ] |
1903 ] |
1902 ] |
1904 ] ifFalse:[ |
1903 ] ifFalse:[ |
1905 isLoaded ifTrue:[ |
1904 isLoaded ifTrue:[ |
1906 beep := true. |
1905 beep := true. |
1907 outcome := 'Method does not exist!!' |
1906 outcome := 'Method does not exist!!' |
1908 ] |
1907 ] |
1909 ] |
1908 ] |
1910 ] ifFalse:[ |
1909 ] ifFalse:[ |
1911 outcome := 'Change unparsable!!' |
1910 outcome := 'Change unparsable!!' |
1912 ]. |
1911 ]. |
1913 (showDiff and:[oldSource notNil and:[newSource notNil]]) ifTrue:[ |
1912 (showDiff and:[oldSource notNil and:[newSource notNil]]) ifTrue:[ |
1914 d := DiffTextView |
1913 d := DiffTextView |
1915 openOn:oldSource label:'Current version (in image)' |
1914 openOn:oldSource label:'Current version (in image)' |
1916 and:newSource label:'Change version'. |
1915 and:newSource label:'Change version'. |
1917 d label:'method differences'. |
1916 d label:'method differences'. |
1918 ] |
1917 ] |
1919 ] ifFalse:[ |
1918 ] ifFalse:[ |
1920 beep := true. |
1919 beep := true. |
1921 outcome := 'Class does not exist!!' |
1920 outcome := 'Class does not exist!!' |
1922 ] |
1921 ] |
1923 ] ifFalse:[ |
1922 ] ifFalse:[ |
1924 beep := true. |
1923 beep := true. |
1925 outcome := 'Not comparable!!' |
1924 outcome := 'Not comparable!!' |
1926 ] |
1925 ] |
1927 ] ifFalse:[ |
1926 ] ifFalse:[ |
1928 beep := true. |
1927 beep := true. |
1929 outcome := 'Not comparable!!' |
1928 outcome := 'Not comparable!!' |
1930 ] |
1929 ] |
1931 ]. |
1930 ]. |
1932 aStream close. |
1931 aStream close. |
1933 showDiff ifFalse:[ |
1932 showDiff ifFalse:[ |
1934 beep ifTrue:[ |
1933 beep ifTrue:[ |
1935 self warn:outcome withCRs. |
1934 self warn:outcome withCRs. |
1936 ] ifFalse:[ |
1935 ] ifFalse:[ |
1937 self information:outcome withCRs. |
1936 self information:outcome withCRs. |
1938 ] |
1937 ] |
1939 ] |
1938 ] |
1940 ! |
1939 ! |
1941 |
1940 |
1942 compressForClass:aClassNameOrNil |
1941 compressForClass:aClassNameOrNil |
1943 "compresses the list of changes; |
1942 "compresses the list of changes; |
1950 |
1949 |
1951 aStream := FileStream readonlyFileNamed:changeFileName. |
1950 aStream := FileStream readonlyFileNamed:changeFileName. |
1952 aStream isNil ifTrue:[^ self]. |
1951 aStream isNil ifTrue:[^ self]. |
1953 |
1952 |
1954 aClassNameOrNil isNil ifTrue:[ |
1953 aClassNameOrNil isNil ifTrue:[ |
1955 self newLabel:'compressing...'. |
1954 self newLabel:'compressing...'. |
1956 ] ifFalse:[ |
1955 ] ifFalse:[ |
1957 self newLabel:'compressing for ' , aClassNameOrNil. |
1956 self newLabel:'compressing for ' , aClassNameOrNil. |
1958 ]. |
1957 ]. |
1959 |
1958 |
1960 CompressSnapshotInfo == true ifTrue:[ |
1959 CompressSnapshotInfo == true ifTrue:[ |
1961 " |
1960 " |
1962 get a prototype snapshot record (to be independent of |
1961 get a prototype snapshot record (to be independent of |
1963 the actual format .. |
1962 the actual format .. |
1964 " |
1963 " |
1965 str := WriteStream on:String new. |
1964 str := WriteStream on:String new. |
1966 Class addChangeRecordForSnapshot:'foo' to:str. |
1965 Class addChangeRecordForSnapshot:'foo' to:str. |
1967 snapshotProto := str contents. |
1966 snapshotProto := str contents. |
1968 snapshotPrefix := snapshotProto copyTo:10. |
1967 snapshotPrefix := snapshotProto copyTo:10. |
1969 snapshotNameIndex := snapshotProto findString:'foo'. |
1968 snapshotNameIndex := snapshotProto findString:'foo'. |
1970 ]. |
1969 ]. |
1971 |
1970 |
1972 self valueOfNotReading value: false. |
1971 self valueOfNotReading value: false. |
1973 self valueOfHavingSelection value: false. |
1972 self valueOfHavingSelection value: false. |
1974 self valueOfHavingChangeSelection value: false. |
1973 self valueOfHavingChangeSelection value: false. |
1975 self valueOfReadProgress value: 0. |
1974 self valueOfReadProgress value: 0. |
1976 self readProgressIndicator raise. |
1975 self readProgressIndicator raise. |
1977 self filterLabel label: 'Comp:'; redraw. |
1976 self filterLabel label: 'Comp:'; redraw. |
1978 |
1977 |
1979 self withExecuteCursorDo:[ |
1978 self withExecuteCursorDo:[ |
1980 |numChanges classes selectors types excla sawExcla |
1979 |numChanges classes selectors types excla sawExcla |
1981 changeNr chunk aParseTree parseTreeChunk |
1980 changeNr chunk aParseTree parseTreeChunk |
1982 thisClass thisSelector codeChunk codeParser |
1981 thisClass thisSelector codeChunk codeParser |
1983 compressThis oldValue| |
1982 compressThis oldValue| |
1984 |
1983 |
1985 numChanges := changes size. |
1984 numChanges := changes size. |
1986 classes := Array new:numChanges. |
1985 classes := Array new:numChanges. |
1987 selectors := Array new:numChanges. |
1986 selectors := Array new:numChanges. |
1988 types := Array new:numChanges. |
1987 types := Array new:numChanges. |
1989 |
1988 |
1990 "starting at the end, get the change class and change selector; |
1989 "starting at the end, get the change class and change selector; |
1991 collect all in classes / selectors" |
1990 collect all in classes / selectors" |
1992 |
1991 |
1993 changeNr := numChanges. |
1992 changeNr := numChanges. |
1994 excla := aStream class chunkSeparator. |
1993 excla := aStream class chunkSeparator. |
1995 |
1994 |
1996 [changeNr >= 1] whileTrue:[ |
1995 [changeNr >= 1] whileTrue:[ |
1997 oldValue := self valueOfReadProgress value. |
1996 oldValue := self valueOfReadProgress value. |
1998 self valueOfReadProgress value: (100 - ((aStream position/aStream size) * 100) rounded). |
1997 self valueOfReadProgress value: (100 - ((aStream position/aStream size) * 100) rounded). |
1999 oldValue ~~ self valueOfReadProgress value |
1998 oldValue ~~ self valueOfReadProgress value |
2000 ifTrue: [self readProgressIndicator redrawEdges;redraw]. |
1999 ifTrue: [self readProgressIndicator redrawEdges;redraw]. |
2001 aStream position:(changes at: changeNr) position. |
2000 aStream position:(changes at: changeNr) position. |
2002 sawExcla := aStream peekFor:excla. |
2001 sawExcla := aStream peekFor:excla. |
2003 chunk := aStream nextChunk. |
2002 chunk := aStream nextChunk. |
2004 sawExcla ifTrue:[ |
2003 sawExcla ifTrue:[ |
2005 "optimize a bit if multiple methods for same category arrive" |
2004 "optimize a bit if multiple methods for same category arrive" |
2006 (chunk = parseTreeChunk) ifFalse:[ |
2005 (chunk = parseTreeChunk) ifFalse:[ |
2007 aParseTree := Parser parseExpression:chunk. |
2006 aParseTree := Parser parseExpression:chunk. |
2008 parseTreeChunk := chunk |
2007 parseTreeChunk := chunk |
2009 ]. |
2008 ]. |
2010 (aParseTree notNil |
2009 (aParseTree notNil |
2011 and:[(aParseTree ~~ #Error) |
2010 and:[(aParseTree ~~ #Error) |
2012 and:[aParseTree isMessage]]) ifTrue:[ |
2011 and:[aParseTree isMessage]]) ifTrue:[ |
2013 (aParseTree selector == #methodsFor:) ifTrue:[ |
2012 (aParseTree selector == #methodsFor:) ifTrue:[ |
2014 thisClass := (aParseTree receiver evaluate). |
2013 thisClass := (aParseTree receiver evaluate). |
2015 codeChunk := aStream nextChunk. |
2014 codeChunk := aStream nextChunk. |
2016 codeParser := Parser |
2015 codeParser := Parser |
2017 parseMethodSpecification:codeChunk |
2016 parseMethodSpecification:codeChunk |
2018 in:thisClass |
2017 in:thisClass |
2019 ignoreErrors:true |
2018 ignoreErrors:true |
2020 ignoreWarnings:true. |
2019 ignoreWarnings:true. |
2021 (codeParser notNil and:[codeParser ~~ #Error]) ifTrue:[ |
2020 (codeParser notNil and:[codeParser ~~ #Error]) ifTrue:[ |
2022 selectors at:changeNr put:(codeParser selector). |
2021 selectors at:changeNr put:(codeParser selector). |
2023 classes at:changeNr put:thisClass. |
2022 classes at:changeNr put:thisClass. |
2024 types at:changeNr put:#methodsFor |
2023 types at:changeNr put:#methodsFor |
2025 ] |
2024 ] |
2026 ] |
2025 ] |
2027 ] |
2026 ] |
2028 ] ifFalse:[ |
2027 ] ifFalse:[ |
2029 aParseTree := Parser parseExpression:chunk. |
2028 aParseTree := Parser parseExpression:chunk. |
2030 parseTreeChunk := chunk. |
2029 parseTreeChunk := chunk. |
2031 (aParseTree notNil |
2030 (aParseTree notNil |
2032 and:[(aParseTree ~~ #Error) |
2031 and:[(aParseTree ~~ #Error) |
2033 and:[aParseTree isMessage]]) ifTrue:[ |
2032 and:[aParseTree isMessage]]) ifTrue:[ |
2034 (aParseTree selector == #removeSelector:) ifTrue:[ |
2033 (aParseTree selector == #removeSelector:) ifTrue:[ |
2035 selectors at:changeNr put:(aParseTree arg1 value ). |
2034 selectors at:changeNr put:(aParseTree arg1 value ). |
2036 classes at:changeNr put:(aParseTree receiver evaluate). |
2035 classes at:changeNr put:(aParseTree receiver evaluate). |
2037 types at:changeNr put:#removeSelector |
2036 types at:changeNr put:#removeSelector |
2038 ] |
2037 ] |
2039 ] ifFalse:[ |
2038 ] ifFalse:[ |
2040 CompressSnapshotInfo == true ifTrue:[ |
2039 CompressSnapshotInfo == true ifTrue:[ |
2041 (chunk startsWith:snapshotPrefix) ifTrue:[ |
2040 (chunk startsWith:snapshotPrefix) ifTrue:[ |
2042 str := chunk readStream position:snapshotNameIndex. |
2041 str := chunk readStream position:snapshotNameIndex. |
2043 fileName := str upTo:(Character space). |
2042 fileName := str upTo:(Character space). |
2044 " |
2043 " |
2045 kludge to allow use of match-check below |
2044 kludge to allow use of match-check below |
2046 " |
2045 " |
2047 selectors at:changeNr put:snapshotPrefix. |
2046 selectors at:changeNr put:snapshotPrefix. |
2048 classes at:changeNr put:fileName. |
2047 classes at:changeNr put:fileName. |
2049 ] |
2048 ] |
2050 ] |
2049 ] |
2051 ] |
2050 ] |
2052 ]. |
2051 ]. |
2053 changeNr := changeNr - 1 |
2052 changeNr := changeNr - 1 |
2054 ]. |
2053 ]. |
2055 aStream close. |
2054 aStream close. |
2056 |
2055 |
2057 "for all changes, look for another class/selector occurence later |
2056 "for all changes, look for another class/selector occurence later |
2058 in the list and, if there is one, add change number to the delete set" |
2057 in the list and, if there is one, add change number to the delete set" |
2059 |
2058 |
2060 deleteSet := OrderedCollection new. |
2059 deleteSet := OrderedCollection new. |
2061 changeNr := 1. |
2060 changeNr := 1. |
2062 [changeNr < changes size] whileTrue:[ |
2061 [changeNr < changes size] whileTrue:[ |
2063 thisClass := classes at:changeNr. |
2062 thisClass := classes at:changeNr. |
2064 |
2063 |
2065 compressThis := false. |
2064 compressThis := false. |
2066 aClassNameOrNil isNil ifTrue:[ |
2065 aClassNameOrNil isNil ifTrue:[ |
2067 compressThis := true |
2066 compressThis := true |
2068 ] ifFalse:[ |
2067 ] ifFalse:[ |
2069 "/ skipping unloaded/unknown classes |
2068 "/ skipping unloaded/unknown classes |
2070 thisClass isBehavior ifTrue:[ |
2069 thisClass isBehavior ifTrue:[ |
2071 thisClass isMeta ifTrue:[ |
2070 thisClass isMeta ifTrue:[ |
2072 compressThis := aClassNameOrNil = thisClass soleInstance name. |
2071 compressThis := aClassNameOrNil = thisClass soleInstance name. |
2073 ] ifFalse:[ |
2072 ] ifFalse:[ |
2074 compressThis := aClassNameOrNil = thisClass name. |
2073 compressThis := aClassNameOrNil = thisClass name. |
2075 (PrivateAsSeparate not and: [thisClass isPrivate]) |
2074 (PrivateAsSeparate not and: [thisClass isPrivate]) |
2076 ifTrue:[compressThis := aClassNameOrNil = thisClass owningClass name] |
2075 ifTrue:[compressThis := aClassNameOrNil = thisClass owningClass name] |
2077 ] |
2076 ] |
2078 ] |
2077 ] |
2079 ]. |
2078 ]. |
2080 |
2079 |
2081 compressThis ifTrue:[ |
2080 compressThis ifTrue:[ |
2082 thisSelector := selectors at:changeNr. |
2081 thisSelector := selectors at:changeNr. |
2083 searchIndex := changeNr. |
2082 searchIndex := changeNr. |
2084 anyMore := true. |
2083 anyMore := true. |
2085 [anyMore] whileTrue:[ |
2084 [anyMore] whileTrue:[ |
2086 searchIndex := classes indexOf:thisClass |
2085 searchIndex := classes indexOf:thisClass |
2087 startingAt:(searchIndex + 1). |
2086 startingAt:(searchIndex + 1). |
2088 (searchIndex ~~ 0) ifTrue:[ |
2087 (searchIndex ~~ 0) ifTrue:[ |
2089 ((selectors at:searchIndex) == thisSelector) ifTrue:[ |
2088 ((selectors at:searchIndex) == thisSelector) ifTrue:[ |
2090 thisClass notNil ifTrue:[ |
2089 thisClass notNil ifTrue:[ |
2091 deleteSet add:changeNr. |
2090 deleteSet add:changeNr. |
2092 anyMore := false |
2091 anyMore := false |
2093 ] |
2092 ] |
2094 ] |
2093 ] |
2095 ] ifFalse:[ |
2094 ] ifFalse:[ |
2096 anyMore := false |
2095 anyMore := false |
2097 ] |
2096 ] |
2098 ]. |
2097 ]. |
2099 ]. |
2098 ]. |
2100 |
2099 |
2101 changeNr := changeNr + 1 |
2100 changeNr := changeNr + 1 |
2102 ]. |
2101 ]. |
2103 |
2102 |
2104 "finally delete what has been found" |
2103 "finally delete what has been found" |
2105 |
2104 |
2106 (deleteSet size > 0) ifTrue:[ |
2105 (deleteSet size > 0) ifTrue:[ |
2107 index := deleteSet size. |
2106 index := deleteSet size. |
2108 [index > 0] whileTrue:[ |
2107 [index > 0] whileTrue:[ |
2109 self silentDeleteChange: (changes at: (deleteSet at:index)). |
2108 self silentDeleteChange: (changes at: (deleteSet at:index)). |
2110 index := index - 1 |
2109 index := index - 1 |
2111 ]. |
2110 ]. |
2112 self setChangeList |
2111 self setChangeList |
2113 ]. |
2112 ]. |
2114 ]. |
2113 ]. |
2115 self valueOfNotReading value: true. |
2114 self valueOfNotReading value: true. |
2116 self filterField raise. |
2115 self filterField raise. |
2117 self filterLabel label: 'Filter:'. |
2116 self filterLabel label: 'Filter:'. |
2118 self newLabel: '' |
2117 self newLabel: '' |
2236 #'primitiveFunctions:' |
2235 #'primitiveFunctions:' |
2237 #'primitiveVariables:' |
2236 #'primitiveVariables:' |
2238 #'renameCategory:to:' |
2237 #'renameCategory:to:' |
2239 #'instanceVariableNames:' |
2238 #'instanceVariableNames:' |
2240 ) includes:sel) ifTrue:[ |
2239 ) includes:sel) ifTrue:[ |
2241 " |
2240 " |
2242 yes, the className is the receiver |
2241 yes, the className is the receiver |
2243 " |
2242 " |
2244 (recTree notNil and:[recTree ~~ #Error]) ifTrue:[ |
2243 (recTree notNil and:[recTree ~~ #Error]) ifTrue:[ |
2245 isMeta := false. |
2244 isMeta := false. |
2246 recTree isUnaryMessage ifTrue:[ |
2245 recTree isUnaryMessage ifTrue:[ |
2247 (recTree selector ~~ #class) ifTrue:[^ nil]. |
2246 (recTree selector ~~ #class) ifTrue:[^ nil]. |
2248 "id class methodsFor:..." |
2247 "id class methodsFor:..." |
2249 recTree := recTree receiver. |
2248 recTree := recTree receiver. |
2250 isMeta := true. |
2249 isMeta := true. |
2251 ]. |
2250 ]. |
2252 recTree isPrimary ifTrue:[ |
2251 recTree isPrimary ifTrue:[ |
2253 name := recTree name. |
2252 name := recTree name. |
2254 isMeta ifTrue:[ |
2253 isMeta ifTrue:[ |
2255 name := name , ' class'. |
2254 name := name , ' class'. |
2256 ]. |
2255 ]. |
2257 aChange className: name. |
2256 aChange className: name. |
2258 ^ name |
2257 ^ name |
2259 ] |
2258 ] |
2260 ]. |
2259 ]. |
2261 "more strange things" |
2260 "more strange things" |
2262 ^ nil |
2261 ^ nil |
2263 ]. |
2262 ]. |
2264 |
2263 |
2265 " |
2264 " |
2266 is it a change in a class-description ? |
2265 is it a change in a class-description ? |
2267 " |
2266 " |
2268 (('subclass:*' match:sel) |
2267 (('subclass:*' match:sel) |
2269 or:[('variable*subclass:*' match:sel)]) ifTrue:[ |
2268 or:[('variable*subclass:*' match:sel)]) ifTrue:[ |
2270 "/ must parse the full changes text, to get |
2269 "/ must parse the full changes text, to get |
2271 "/ privacy information. |
2270 "/ privacy information. |
2272 |
2271 |
2273 changeStream := self streamForChange:aChange. |
2272 changeStream := self streamForChange:aChange. |
2274 changeStream notNil ifTrue:[ |
2273 changeStream notNil ifTrue:[ |
2275 chunk := changeStream nextChunk. |
2274 chunk := changeStream nextChunk. |
2276 changeStream close. |
2275 changeStream close. |
2277 fullParseTree := Parser parseExpression:chunk. |
2276 fullParseTree := Parser parseExpression:chunk. |
2278 (fullParseTree isNil or:[fullParseTree == #Error]) ifTrue:[ |
2277 (fullParseTree isNil or:[fullParseTree == #Error]) ifTrue:[ |
2279 fullParseTree := nil |
2278 fullParseTree := nil |
2280 ]. |
2279 ]. |
2281 fullParseTree isMessage ifFalse:[ |
2280 fullParseTree isMessage ifFalse:[ |
2282 fullParseTree := nil |
2281 fullParseTree := nil |
2283 ]. |
2282 ]. |
2284 "/ actually, the nil case cannot happen |
2283 "/ actually, the nil case cannot happen |
2285 fullParseTree notNil ifTrue:[ |
2284 fullParseTree notNil ifTrue:[ |
2286 aParseTree := fullParseTree. |
2285 aParseTree := fullParseTree. |
2287 sel := aParseTree selector. |
2286 sel := aParseTree selector. |
2288 ]. |
2287 ]. |
2289 ]. |
2288 ]. |
2290 |
2289 |
2291 arg1Tree := aParseTree arg1. |
2290 arg1Tree := aParseTree arg1. |
2292 (arg1Tree notNil and:[arg1Tree isConstant]) ifTrue:[ |
2291 (arg1Tree notNil and:[arg1Tree isConstant]) ifTrue:[ |
2293 name := arg1Tree value asString. |
2292 name := arg1Tree value asString. |
2294 |
2293 |
2295 "/ is it a private-class ? |
2294 "/ is it a private-class ? |
2296 ('*privateIn:' match:sel) ifTrue:[ |
2295 ('*privateIn:' match:sel) ifTrue:[ |
2297 ownerTree := aParseTree args last. |
2296 ownerTree := aParseTree args last. |
2298 ownerName := ownerTree name asString. |
2297 ownerName := ownerTree name asString. |
2299 name := ownerName , '::' , name |
2298 name := ownerName , '::' , name |
2300 ]. |
2299 ]. |
2301 aChange className: name. |
2300 aChange className: name. |
2302 ^ name |
2301 ^ name |
2303 ]. |
2302 ]. |
2304 "very strange" |
2303 "very strange" |
2305 ^ nil |
2304 ^ nil |
2306 ]. |
2305 ]. |
2307 |
2306 |
2308 " |
2307 " |
2309 is it a class remove ? |
2308 is it a class remove ? |
2310 " |
2309 " |
2311 (sel == #removeClass:) ifTrue:[ |
2310 (sel == #removeClass:) ifTrue:[ |
2312 (recTree notNil |
2311 (recTree notNil |
2313 and:[recTree ~~ #Error |
2312 and:[recTree ~~ #Error |
2314 and:[recTree isPrimary |
2313 and:[recTree isPrimary |
2315 and:[recTree name = 'Smalltalk']]]) ifTrue:[ |
2314 and:[recTree name = 'Smalltalk']]]) ifTrue:[ |
2316 arg1Tree := aParseTree arg1. |
2315 arg1Tree := aParseTree arg1. |
2317 (arg1Tree notNil and:[arg1Tree isPrimary]) ifTrue:[ |
2316 (arg1Tree notNil and:[arg1Tree isPrimary]) ifTrue:[ |
2318 name := arg1Tree name. |
2317 name := arg1Tree name. |
2319 aChange className: name. |
2318 aChange className: name. |
2320 ^ name |
2319 ^ name |
2321 ]. |
2320 ]. |
2322 ] |
2321 ] |
2323 ]. |
2322 ]. |
2324 |
2323 |
2325 " |
2324 " |
2326 is it a method category change ? |
2325 is it a method category change ? |
2327 " |
2326 " |
2328 ((sel == #category:) |
2327 ((sel == #category:) |
2329 or:[sel == #privacy:]) ifTrue:[ |
2328 or:[sel == #privacy:]) ifTrue:[ |
2330 (recTree notNil |
2329 (recTree notNil |
2331 and:[recTree ~~ #Error |
2330 and:[recTree ~~ #Error |
2332 and:[recTree isMessage |
2331 and:[recTree isMessage |
2333 and:[recTree selector == #compiledMethodAt:]]]) ifTrue:[ |
2332 and:[recTree selector == #compiledMethodAt:]]]) ifTrue:[ |
2334 isMeta := false. |
2333 isMeta := false. |
2335 recTree := recTree receiver. |
2334 recTree := recTree receiver. |
2336 recTree isUnaryMessage ifTrue:[ |
2335 recTree isUnaryMessage ifTrue:[ |
2337 (recTree selector ~~ #class) ifTrue:[^ nil]. |
2336 (recTree selector ~~ #class) ifTrue:[^ nil]. |
2338 "id class " |
2337 "id class " |
2339 recTree := recTree receiver |
2338 recTree := recTree receiver |
2340 ]. |
2339 ]. |
2341 recTree isPrimary ifTrue:[ |
2340 recTree isPrimary ifTrue:[ |
2342 isMeta ifTrue:[ |
2341 isMeta ifTrue:[ |
2343 name := name , ' class'. |
2342 name := name , ' class'. |
2344 ]. |
2343 ]. |
2345 name := recTree name. |
2344 name := recTree name. |
2346 aChange className: name. |
2345 aChange className: name. |
2347 ^ name |
2346 ^ name |
2348 ] |
2347 ] |
2349 ] |
2348 ] |
2350 ]. |
2349 ]. |
2351 ^ nil |
2350 ^ nil |
2352 ! |
2351 ! |
2353 |
2352 |
2354 newLabel:how |
2353 newLabel:how |
2400 self valueOfReadProgress value: 0. |
2399 self valueOfReadProgress value: 0. |
2401 self readProgressIndicator raise. |
2400 self readProgressIndicator raise. |
2402 self filterLabel label: 'Read:'; redraw. |
2401 self filterLabel label: 'Read:'; redraw. |
2403 |
2402 |
2404 self withReadCursorDo:[ |
2403 self withReadCursorDo:[ |
2405 |myProcess myPriority| |
2404 |myProcess myPriority| |
2406 |
2405 |
2407 " |
2406 " |
2408 this is a time consuming operation (especially, if reading an |
2407 this is a time consuming operation (especially, if reading an |
2409 NFS-mounted directory; therefore lower my priority... |
2408 NFS-mounted directory; therefore lower my priority... |
2410 " |
2409 " |
2411 inBackground ifTrue:[ |
2410 inBackground ifTrue:[ |
2412 myProcess := Processor activeProcess. |
2411 myProcess := Processor activeProcess. |
2413 myPriority := myProcess priority. |
2412 myPriority := myProcess priority. |
2414 myProcess priority:(Processor userBackgroundPriority). |
2413 myProcess priority:(Processor userBackgroundPriority). |
2415 ]. |
2414 ]. |
2416 |
2415 |
2417 [ |
2416 [ |
2418 |excla timeStampInfo lastChange| |
2417 |excla timeStampInfo lastChange| |
2419 |
2418 |
2420 excla := aStream class chunkSeparator. |
2419 excla := aStream class chunkSeparator. |
2421 |
2420 |
2422 [aStream atEnd] whileFalse:[ |
2421 [aStream atEnd] whileFalse:[ |
2423 |change changeDelta changeString changeType changeCategory |
2422 |change changeDelta changeString changeType changeCategory |
2424 line s l changeClass sawExcla category |
2423 line s l changeClass sawExcla category |
2425 chunkText chunkPos sel oldValue| |
2424 chunkText chunkPos sel oldValue| |
2426 |
2425 |
2427 change := Change new. |
2426 change := Change new. |
2428 " |
2427 " |
2429 get a chunk (separated by excla) |
2428 get a chunk (separated by excla) |
2430 " |
2429 " |
2431 oldValue := self valueOfReadProgress value. |
2430 oldValue := self valueOfReadProgress value. |
2432 self valueOfReadProgress value: (((aStream position/aStream size) * 100) rounded). |
2431 self valueOfReadProgress value: (((aStream position/aStream size) * 100) rounded). |
2433 oldValue ~~ self valueOfReadProgress value |
2432 oldValue ~~ self valueOfReadProgress value |
2434 ifTrue: [self readProgressIndicator redrawEdges;redraw]. |
2433 ifTrue: [self readProgressIndicator redrawEdges;redraw]. |
2435 |
2434 |
2436 aStream skipSeparators. |
2435 aStream skipSeparators. |
2437 chunkPos := aStream position. |
2436 chunkPos := aStream position. |
2438 |
2437 |
2439 sawExcla := aStream peekFor:excla. |
2438 sawExcla := aStream peekFor:excla. |
2440 chunkText := aStream nextChunk. |
2439 chunkText := aStream nextChunk. |
2441 chunkText notNil ifTrue:[ |
2440 chunkText notNil ifTrue:[ |
2442 |index headerLine cls| |
2441 |index headerLine cls| |
2443 |
2442 |
2444 (chunkText startsWith:'''---- timestamp ') ifTrue:[ |
2443 (chunkText startsWith:'''---- timestamp ') ifTrue:[ |
2445 timeStampInfo := (chunkText copyFrom:16 to:(chunkText size - 6)) withoutSpaces. |
2444 timeStampInfo := (chunkText copyFrom:16 to:(chunkText size - 6)) withoutSpaces. |
2446 ] ifFalse:[ |
2445 ] ifFalse:[ |
2447 |
2446 |
2448 " |
2447 " |
2449 only first line is saved in changeChunks... |
2448 only first line is saved in changeChunks... |
2450 " |
2449 " |
2451 index := chunkText indexOf:(Character cr). |
2450 index := chunkText indexOf:(Character cr). |
2452 (index ~~ 0) ifTrue:[ |
2451 (index ~~ 0) ifTrue:[ |
2453 chunkText := chunkText copyTo:(index - 1). |
2452 chunkText := chunkText copyTo:(index - 1). |
2454 |
2453 |
2455 "take care for comment changes - must still be a |
2454 "take care for comment changes - must still be a |
2456 valid expression for classNameOfChange: to work" |
2455 valid expression for classNameOfChange: to work" |
2457 |
2456 |
2458 (chunkText endsWith:'comment:''') ifTrue:[ |
2457 (chunkText endsWith:'comment:''') ifTrue:[ |
2459 chunkText := chunkText , '...''' |
2458 chunkText := chunkText , '...''' |
2460 ]. |
2459 ]. |
2461 (chunkText endsWith:'primitiveDefinitions:''') ifTrue:[ |
2460 (chunkText endsWith:'primitiveDefinitions:''') ifTrue:[ |
2462 sel := 'primitiveDefinitions:'. |
2461 sel := 'primitiveDefinitions:'. |
2463 chunkText := chunkText copyWithoutLast:1 |
2462 chunkText := chunkText copyWithoutLast:1 |
2464 ]. |
2463 ]. |
2465 (chunkText endsWith:'primitiveVariables:''') ifTrue:[ |
2464 (chunkText endsWith:'primitiveVariables:''') ifTrue:[ |
2466 sel := 'primitiveVariables:'. |
2465 sel := 'primitiveVariables:'. |
2467 chunkText := chunkText copyWithoutLast:1 |
2466 chunkText := chunkText copyWithoutLast:1 |
2468 ]. |
2467 ]. |
2469 (chunkText endsWith:'primitiveFunctions:''') ifTrue:[ |
2468 (chunkText endsWith:'primitiveFunctions:''') ifTrue:[ |
2470 sel := 'primitiveFunctions:'. |
2469 sel := 'primitiveFunctions:'. |
2471 chunkText := chunkText copyWithoutLast:1 |
2470 chunkText := chunkText copyWithoutLast:1 |
2472 ]. |
2471 ]. |
2473 ]. |
2472 ]. |
2474 |
2473 |
2475 change chunk: chunkText. |
2474 change chunk: chunkText. |
2476 change position: chunkPos. |
2475 change position: chunkPos. |
2477 lastChange notNil ifTrue: [lastChange lastPosition: chunkPos - 1]. |
2476 lastChange notNil ifTrue: [lastChange lastPosition: chunkPos - 1]. |
2478 lastChange := change. |
2477 lastChange := change. |
2479 change timeStamp: timeStampInfo. |
2478 change timeStamp: timeStampInfo. |
2480 change followUp: false. |
2479 change followUp: false. |
2481 headerLine := nil. |
2480 headerLine := nil. |
2482 changeDelta := ' '. |
2481 changeDelta := ' '. |
2483 |
2482 |
2484 sawExcla ifFalse:[ |
2483 sawExcla ifFalse:[ |
2485 (chunkText startsWith:'''---- snap') ifTrue:[ |
2484 (chunkText startsWith:'''---- snap') ifTrue:[ |
2486 changeType := ''. |
2485 changeType := ''. |
2487 headerLine := chunkText. |
2486 headerLine := chunkText. |
2488 changeString := (chunkText contractTo:maxLen). |
2487 changeString := (chunkText contractTo:maxLen). |
2489 timeStampInfo := nil. |
2488 timeStampInfo := nil. |
2490 ] ifFalse:[ |
2489 ] ifFalse:[ |
2491 |
2490 |
2492 |p cls| |
2491 |p cls| |
2493 |
2492 |
2494 headerLine := chunkText , ' (doIt)'. |
2493 headerLine := chunkText , ' (doIt)'. |
2495 |
2494 |
2496 " |
2495 " |
2497 first, assume doIt - then lets have a more detailed look... |
2496 first, assume doIt - then lets have a more detailed look... |
2498 " |
2497 " |
2499 ((chunkText startsWith:'''---- file') |
2498 ((chunkText startsWith:'''---- file') |
2500 or:[(chunkText startsWith:'''---- check')]) ifTrue:[ |
2499 or:[(chunkText startsWith:'''---- check')]) ifTrue:[ |
2501 changeType := ''. |
2500 changeType := ''. |
2502 timeStampInfo := nil. |
2501 timeStampInfo := nil. |
2503 ] ifFalse:[ |
2502 ] ifFalse:[ |
2504 changeType := 'doIt'. |
2503 changeType := 'doIt'. |
2505 ]. |
2504 ]. |
2506 changeString := (chunkText contractTo:maxLen). |
2505 changeString := (chunkText contractTo:maxLen). |
2507 |
2506 |
2508 p := Parser parseExpression:chunkText inNameSpace:Smalltalk. |
2507 p := Parser parseExpression:chunkText inNameSpace:Smalltalk. |
2509 (p notNil |
2508 (p notNil |
2510 and:[p ~~ #Error |
2509 and:[p ~~ #Error |
2511 and:[p isMessage]]) ifTrue:[ |
2510 and:[p isMessage]]) ifTrue:[ |
2512 sel := p selector. |
2511 sel := p selector. |
2513 ]. |
2512 ]. |
2514 (sel == #removeSelector:) ifTrue:[ |
2513 (sel == #removeSelector:) ifTrue:[ |
2515 p receiver isUnaryMessage ifTrue:[ |
2514 p receiver isUnaryMessage ifTrue:[ |
2516 cls := p receiver receiver name. |
2515 cls := p receiver receiver name. |
2517 changeClass := (Smalltalk classNamed:cls) class. |
2516 changeClass := (Smalltalk classNamed:cls) class. |
2518 cls := cls , ' class'. |
2517 cls := cls , ' class'. |
2519 ] ifFalse:[ |
2518 ] ifFalse:[ |
2520 cls := p receiver name. |
2519 cls := p receiver name. |
2521 changeClass := (Smalltalk classNamed:cls) |
2520 changeClass := (Smalltalk classNamed:cls) |
2522 ]. |
2521 ]. |
2523 sel := (p args at:1) evaluate. |
2522 sel := (p args at:1) evaluate. |
2524 |
2523 |
2525 DeltaInfoColumn ifTrue:[ |
2524 DeltaInfoColumn ifTrue:[ |
2526 (changeClass isNil or:[changeClass isLoaded not]) ifTrue:[ |
2525 (changeClass isNil or:[changeClass isLoaded not]) ifTrue:[ |
2527 changeDelta := '?' |
2526 changeDelta := '?' |
2528 ] ifFalse:[ |
2527 ] ifFalse:[ |
2529 (changeClass implements:sel asSymbol) ifTrue:[ |
2528 (changeClass implements:sel asSymbol) ifTrue:[ |
2530 changeDelta := '-'. |
2529 changeDelta := '-'. |
2531 ] |
2530 ] |
2532 ] |
2531 ] |
2533 ]. |
2532 ]. |
2534 changeType := 'remove'. |
2533 changeType := 'remove'. |
2535 changeString := self contractClass:cls selector:sel to:maxLen. |
2534 changeString := self contractClass:cls selector:sel to:maxLen. |
2536 ]. |
2535 ]. |
2537 (p ~~ #Error |
2536 (p ~~ #Error |
2538 and:[p isMessage |
2537 and:[p isMessage |
2539 and:[p receiver isMessage |
2538 and:[p receiver isMessage |
2540 and:[p receiver selector == #compiledMethodAt:]]]) ifTrue:[ |
2539 and:[p receiver selector == #compiledMethodAt:]]]) ifTrue:[ |
2541 p receiver receiver isUnaryMessage ifTrue:[ |
2540 p receiver receiver isUnaryMessage ifTrue:[ |
2542 cls := p receiver receiver receiver name. |
2541 cls := p receiver receiver receiver name. |
2543 changeClass := (Smalltalk classNamed:cls) class. |
2542 changeClass := (Smalltalk classNamed:cls) class. |
2544 cls := cls , ' class'. |
2543 cls := cls , ' class'. |
2545 ] ifFalse:[ |
2544 ] ifFalse:[ |
2546 cls := p receiver receiver name. |
2545 cls := p receiver receiver name. |
2547 changeClass := (Smalltalk classNamed:cls) |
2546 changeClass := (Smalltalk classNamed:cls) |
2548 ]. |
2547 ]. |
2549 (sel == #category:) ifTrue:[ |
2548 (sel == #category:) ifTrue:[ |
2550 sel := (p receiver args at:1) evaluate. |
2549 sel := (p receiver args at:1) evaluate. |
2551 changeType := '(category change)'. |
2550 changeType := '(category change)'. |
2552 changeString := self contractClass:cls selector:sel to:maxLen. |
2551 changeString := self contractClass:cls selector:sel to:maxLen. |
2553 ]. |
2552 ]. |
2554 (sel == #privacy:) ifTrue:[ |
2553 (sel == #privacy:) ifTrue:[ |
2555 sel := (p receiver args at:1) evaluate. |
2554 sel := (p receiver args at:1) evaluate. |
2556 changeType := 'privacy change'. |
2555 changeType := 'privacy change'. |
2557 changeString := self contractClass:cls selector:sel to:maxLen. |
2556 changeString := self contractClass:cls selector:sel to:maxLen. |
2558 ]. |
2557 ]. |
2559 ]. |
2558 ]. |
2560 (#(#'subclass:' |
2559 (#(#'subclass:' |
2561 #'variableSubclass:' |
2560 #'variableSubclass:' |
2562 #'variableByteSubclass:' |
2561 #'variableByteSubclass:' |
2563 #'variableWordSubclass:' |
2562 #'variableWordSubclass:' |
2564 #'variableLongSubclass:' |
2563 #'variableLongSubclass:' |
2565 #'variableFloatSubclass:' |
2564 #'variableFloatSubclass:' |
2566 #'variableDoubleSubclass:' |
2565 #'variableDoubleSubclass:' |
2567 #'primitiveDefinitions:' |
2566 #'primitiveDefinitions:' |
2568 #'primitiveFunctions:' |
2567 #'primitiveFunctions:' |
2569 #'primitiveVariables:' |
2568 #'primitiveVariables:' |
2570 ) includes:sel) ifTrue:[ |
2569 ) includes:sel) ifTrue:[ |
2571 changeType := 'class definition'. |
2570 changeType := 'class definition'. |
2572 ]. |
2571 ]. |
2573 ] |
2572 ] |
2574 ] ifTrue:[ |
2573 ] ifTrue:[ |
2575 |done first p className cls text methodPos| |
2574 |done first p className cls text methodPos| |
2576 |
2575 |
2577 " |
2576 " |
2578 method definitions actually consist of |
2577 method definitions actually consist of |
2579 two (or more) chunks; skip next chunk(s) |
2578 two (or more) chunks; skip next chunk(s) |
2580 up to an empty one. |
2579 up to an empty one. |
2581 The system only writes one chunk, |
2580 The system only writes one chunk, |
2582 and we cannot handle more in this ChangesBrowser.... |
2581 and we cannot handle more in this ChangesBrowser.... |
2583 " |
2582 " |
2584 className := nil. |
2583 className := nil. |
2585 p := Parser parseExpression:chunkText inNameSpace:Smalltalk. |
2584 p := Parser parseExpression:chunkText inNameSpace:Smalltalk. |
2586 |
2585 |
2587 (p notNil and:[p ~~ #Error]) ifTrue:[ |
2586 (p notNil and:[p ~~ #Error]) ifTrue:[ |
2588 sel := p selector. |
2587 sel := p selector. |
2589 (sel == #methodsFor:) ifTrue:[ |
2588 (sel == #methodsFor:) ifTrue:[ |
2590 p receiver isUnaryMessage ifTrue:[ |
2589 p receiver isUnaryMessage ifTrue:[ |
2591 className := p receiver receiver name. |
2590 className := p receiver receiver name. |
2592 changeClass := (Smalltalk classNamed:className) class. |
2591 changeClass := (Smalltalk classNamed:className) class. |
2593 className := className , ' class'. |
2592 className := className , ' class'. |
2594 ] ifFalse:[ |
2593 ] ifFalse:[ |
2595 className := p receiver name. |
2594 className := p receiver name. |
2596 changeClass := Smalltalk classNamed:className |
2595 changeClass := Smalltalk classNamed:className |
2597 ]. |
2596 ]. |
2598 category := (p args at:1) evaluate. |
2597 category := (p args at:1) evaluate. |
2599 ]. |
2598 ]. |
2600 ]. |
2599 ]. |
2601 |
2600 |
2602 done := false. |
2601 done := false. |
2603 first := true. |
2602 first := true. |
2604 [done] whileFalse:[ |
2603 [done] whileFalse:[ |
2605 |
2604 |
2606 changeDelta := ' '. |
2605 changeDelta := ' '. |
2607 methodPos := aStream position. |
2606 methodPos := aStream position. |
2608 |
2607 |
2609 text := aStream nextChunk. |
2608 text := aStream nextChunk. |
2610 text isNil ifTrue:[ |
2609 text isNil ifTrue:[ |
2611 done := true |
2610 done := true |
2612 ] ifFalse:[ |
2611 ] ifFalse:[ |
2613 done := text isEmpty |
2612 done := text isEmpty |
2614 ]. |
2613 ]. |
2615 done ifFalse:[ |
2614 done ifFalse:[ |
2616 first ifFalse:[ |
2615 first ifFalse:[ |
2617 change := Change new. |
2616 change := Change new. |
2618 change chunk: chunkText. |
2617 change chunk: chunkText. |
2619 change string:changeString. |
2618 change string:changeString. |
2620 change position: methodPos. |
2619 change position: methodPos. |
2621 change className: className. |
2620 change className: className. |
2622 lastChange notNil ifTrue: [lastChange lastPosition: methodPos - 1]. |
2621 lastChange notNil ifTrue: [lastChange lastPosition: methodPos - 1]. |
2623 lastChange := change. |
2622 lastChange := change. |
2624 change timeStamp: timeStampInfo. |
2623 change timeStamp: timeStampInfo. |
2625 change followUp: true. |
2624 change followUp: true. |
2626 editingClassSource := true. |
2625 editingClassSource := true. |
2627 ]. |
2626 ]. |
2628 |
2627 |
2629 first := false. |
2628 first := false. |
2630 " |
2629 " |
2631 try to find the selector |
2630 try to find the selector |
2632 " |
2631 " |
2633 sel := nil. |
2632 sel := nil. |
2634 className notNil ifTrue:[ |
2633 className notNil ifTrue:[ |
2635 p := Parser |
2634 p := Parser |
2636 parseMethodSpecification:text |
2635 parseMethodSpecification:text |
2637 in:nil |
2636 in:nil |
2638 ignoreErrors:true |
2637 ignoreErrors:true |
2639 ignoreWarnings:true. |
2638 ignoreWarnings:true. |
2640 (p notNil and:[p ~~ #Error]) ifTrue:[ |
2639 (p notNil and:[p ~~ #Error]) ifTrue:[ |
2641 sel := p selector. |
2640 sel := p selector. |
2642 ] |
2641 ] |
2643 ]. |
2642 ]. |
2644 |
2643 |
2645 sel isNil ifTrue:[ |
2644 sel isNil ifTrue:[ |
2646 changeString := (chunkText contractTo:maxLen). |
2645 changeString := (chunkText contractTo:maxLen). |
2647 changeType := 'change'. |
2646 changeType := 'change'. |
2648 headerLine := chunkText , ' (change)'. |
2647 headerLine := chunkText , ' (change)'. |
2649 ] ifFalse:[ |
2648 ] ifFalse:[ |
2650 changeString := self contractClass:className selector:sel to:maxLen. |
2649 changeString := self contractClass:className selector:sel to:maxLen. |
2651 changeType := 'method definition'. |
2650 changeType := 'method definition'. |
2652 changeCategory := category. |
2651 changeCategory := category. |
2653 headerLine := className , ' ' , sel , ' ' , '(change category: ''' , category , ''')'. |
2652 headerLine := className , ' ' , sel , ' ' , '(change category: ''' , category , ''')'. |
2654 ]. |
2653 ]. |
2655 |
2654 |
2656 DeltaInfoColumn ifTrue:[ |
2655 DeltaInfoColumn ifTrue:[ |
2657 changeClass isNil ifFalse:[ |
2656 changeClass isNil ifFalse:[ |
2658 changeClass isMeta ifTrue:[ |
2657 changeClass isMeta ifTrue:[ |
2659 cls := changeClass soleInstance |
2658 cls := changeClass soleInstance |
2660 ] ifFalse:[ |
2659 ] ifFalse:[ |
2661 cls := changeClass |
2660 cls := changeClass |
2662 ]. |
2661 ]. |
2663 ]. |
2662 ]. |
2664 |
2663 |
2665 (changeClass isNil or:[cls isLoaded not]) ifTrue:[ |
2664 (changeClass isNil or:[cls isLoaded not]) ifTrue:[ |
2666 changeDelta := '?' |
2665 changeDelta := '?' |
2667 ] ifFalse:[ |
2666 ] ifFalse:[ |
2668 (changeClass implements:sel asSymbol) ifFalse:[ |
2667 (changeClass implements:sel asSymbol) ifFalse:[ |
2669 changeDelta := '+'. |
2668 changeDelta := '+'. |
2670 ] ifTrue:[ |
2669 ] ifTrue:[ |
2671 |m currentText t1 t2| |
2670 |m currentText t1 t2| |
2672 |
2671 |
2673 m := changeClass compiledMethodAt:sel asSymbol. |
2672 m := changeClass compiledMethodAt:sel asSymbol. |
2674 currentText := m source. |
2673 currentText := m source. |
2675 currentText notNil ifTrue:[ |
2674 currentText notNil ifTrue:[ |
2676 text asString = currentText asString ifTrue:[ |
2675 text asString = currentText asString ifTrue:[ |
2677 changeDelta := '=' |
2676 changeDelta := '=' |
2678 ] ifFalse:[ |
2677 ] ifFalse:[ |
2679 t1 := currentText asCollectionOfLines collect:[:s | s withTabsExpanded]. |
2678 t1 := currentText asCollectionOfLines collect:[:s | s withTabsExpanded]. |
2680 t2 := text asCollectionOfLines collect:[:s | s withTabsExpanded]. |
2679 t2 := text asCollectionOfLines collect:[:s | s withTabsExpanded]. |
2681 t1 = t2 ifTrue:[ |
2680 t1 = t2 ifTrue:[ |
2682 changeDelta := '=' |
2681 changeDelta := '=' |
2683 ] |
2682 ] |
2684 ] |
2683 ] |
2685 ] |
2684 ] |
2686 ] |
2685 ] |
2687 ] |
2686 ] |
2688 ]. |
2687 ]. |
2689 change delta:changeDelta. |
2688 change delta:changeDelta. |
2690 change string:changeString. |
2689 change string:changeString. |
2691 change type:changeType. |
2690 change type:changeType. |
2692 change category: changeCategory. |
2691 change category: changeCategory. |
2693 change timeStamp:timeStampInfo. |
2692 change timeStamp:timeStampInfo. |
2694 changes add:change. |
2693 changes add:change. |
2695 ]. |
2694 ]. |
2696 changeString := nil. |
2695 changeString := nil. |
2697 headerLine := nil. |
2696 headerLine := nil. |
2698 |
2697 |
2699 ] |
2698 ] |
2700 ]. |
2699 ]. |
2701 changeString notNil ifTrue:[ |
2700 changeString notNil ifTrue:[ |
2702 change delta:changeDelta. |
2701 change delta:changeDelta. |
2703 change string:changeString. |
2702 change string:changeString. |
2704 change type:changeType. |
2703 change type:changeType. |
2705 change timeStamp:timeStampInfo. |
2704 change timeStamp:timeStampInfo. |
2706 changes add:change. |
2705 changes add:change. |
2707 |
2706 |
2708 ] ifFalse:[ |
2707 ] ifFalse:[ |
2709 headerLine notNil ifTrue:[ |
2708 headerLine notNil ifTrue:[ |
2710 changes add: change. |
2709 changes add: change. |
2711 ] |
2710 ] |
2712 ] |
2711 ] |
2713 ] |
2712 ] |
2714 ]. |
2713 ]. |
2715 change lastPosition: aStream position. |
2714 change lastPosition: aStream position. |
2716 ]. |
2715 ]. |
2717 modified := false. |
2716 modified := false. |
2718 |
2717 |
2719 ] valueNowOrOnUnwindDo:[ |
2718 ] valueNowOrOnUnwindDo:[ |
2720 aStream close. |
2719 aStream close. |
2721 inBackground ifTrue:[myProcess priority:myPriority]. |
2720 inBackground ifTrue:[myProcess priority:myPriority]. |
2722 ]. |
2721 ]. |
2723 ]. |
2722 ]. |
2724 self setChangeList. |
2723 self setChangeList. |
2725 self valueOfNotReading value: true. |
2724 self valueOfNotReading value: true. |
2726 self filterField raise. |
2725 self filterField raise. |
2727 self filterLabel label: 'Filter:'. |
2726 self filterLabel label: 'Filter:'. |
3280 |inStream outStream tempfile stamp f| |
3279 |inStream outStream tempfile stamp f| |
3281 |
3280 |
3282 self valueOfNotReading value ifFalse: [^nil]. |
3281 self valueOfNotReading value ifFalse: [^nil]. |
3283 |
3282 |
3284 editingClassSource ifTrue:[ |
3283 editingClassSource ifTrue:[ |
3285 (self confirm:'You are editing a classes sourceFile (not a changeFile) !!\Are you certain, you want to overwrite it ?' withCRs) |
3284 (self confirm:'You are editing a classes sourceFile (not a changeFile) !!\Are you certain, you want to overwrite it ?' withCRs) |
3286 ifFalse:[ |
3285 ifFalse:[ |
3287 ^ false |
3286 ^ false |
3288 ] |
3287 ] |
3289 ]. |
3288 ]. |
3290 |
3289 |
3291 tempfile := Filename newTemporaryIn:nil. |
3290 tempfile := Filename newTemporaryIn:nil. |
3292 tempfile exists ifTrue:[tempfile remove]. |
3291 tempfile exists ifTrue:[tempfile remove]. |
3293 |
3292 |
3294 outStream := tempfile writeStream. |
3293 outStream := tempfile writeStream. |
3295 outStream isNil ifTrue:[ |
3294 outStream isNil ifTrue:[ |
3296 self warn:'Cannot create temporary file in current directory.'. |
3295 self warn:'Cannot create temporary file in current directory.'. |
3297 ^ false |
3296 ^ false |
3298 ]. |
3297 ]. |
3299 |
3298 |
3300 inStream := FileStream readonlyFileNamed:changeFileName. |
3299 inStream := FileStream readonlyFileNamed:changeFileName. |
3301 inStream isNil ifTrue:[^ false]. |
3300 inStream isNil ifTrue:[^ false]. |
3302 |
3301 |
3303 self withCursor:(Cursor write) do:[ |
3302 self withCursor:(Cursor write) do:[ |
3304 |excla sawExcla done first chunk |
3303 |excla sawExcla done first chunk |
3305 nChanges "{Class:SmallInteger}" | |
3304 nChanges "{Class:SmallInteger}" | |
3306 |
3305 |
3307 Stream writeErrorSignal handle:[:ex | |
3306 Stream writeErrorSignal handle:[:ex | |
3308 self warn:('Could not update the changes file.\\' , ex errorString) withCRs. |
3307 self warn:('Could not update the changes file.\\' , ex errorString) withCRs. |
3309 ^ false |
3308 ^ false |
3310 ] do:[ |
3309 ] do:[ |
3311 |
3310 |
3312 self valueOfNotSaving value: false. |
3311 self valueOfNotSaving value: false. |
3313 |
3312 |
3314 excla := inStream class chunkSeparator. |
3313 excla := inStream class chunkSeparator. |
3315 nChanges := changes size. |
3314 nChanges := changes size. |
3316 |
3315 |
3317 1 to:nChanges do:[:index | |
3316 1 to:nChanges do:[:index | |
3318 inStream position: (changes at: index) position. |
3317 inStream position: (changes at: index) position. |
3319 sawExcla := inStream peekFor:excla. |
3318 sawExcla := inStream peekFor:excla. |
3320 chunk := inStream nextChunk. |
3319 chunk := inStream nextChunk. |
3321 |
3320 |
3322 (chunk notNil |
3321 (chunk notNil |
3323 and:[(chunk startsWith:'''---- snap') not]) ifTrue:[ |
3322 and:[(chunk startsWith:'''---- snap') not]) ifTrue:[ |
3324 (stamp := (changes at:index) timeStamp) notNil ifTrue:[ |
3323 (stamp := (changes at:index) timeStamp) notNil ifTrue:[ |
3325 outStream nextPutAll:'''---- timestamp ' , stamp , ' ----'''. |
3324 outStream nextPutAll:'''---- timestamp ' , stamp , ' ----'''. |
3326 outStream nextPut:excla; cr. |
3325 outStream nextPut:excla; cr. |
3327 ]. |
3326 ]. |
3328 ]. |
3327 ]. |
3329 |
3328 |
3330 sawExcla ifTrue:[ |
3329 sawExcla ifTrue:[ |
3331 outStream nextPut:excla. |
3330 outStream nextPut:excla. |
3332 outStream nextChunkPut:chunk. |
3331 outStream nextChunkPut:chunk. |
3333 outStream cr; cr. |
3332 outStream cr; cr. |
3334 |
3333 |
3335 " |
3334 " |
3336 a method-definition chunk - skip followups |
3335 a method-definition chunk - skip followups |
3337 " |
3336 " |
3338 done := false. |
3337 done := false. |
3339 first := true. |
3338 first := true. |
3340 [done] whileFalse:[ |
3339 [done] whileFalse:[ |
3341 chunk := inStream nextChunk. |
3340 chunk := inStream nextChunk. |
3342 chunk isNil ifTrue:[ |
3341 chunk isNil ifTrue:[ |
3343 outStream cr; cr. |
3342 outStream cr; cr. |
3344 done := true |
3343 done := true |
3345 ] ifFalse:[ |
3344 ] ifFalse:[ |
3346 chunk isEmpty ifTrue:[ |
3345 chunk isEmpty ifTrue:[ |
3347 outStream space; nextChunkPut:chunk; cr; cr. |
3346 outStream space; nextChunkPut:chunk; cr; cr. |
3348 done := true. |
3347 done := true. |
3349 ] ifFalse:[ |
3348 ] ifFalse:[ |
3350 first ifFalse:[ |
3349 first ifFalse:[ |
3351 outStream cr; cr. |
3350 outStream cr; cr. |
3352 ]. |
3351 ]. |
3353 outStream nextChunkPut:chunk. |
3352 outStream nextChunkPut:chunk. |
3354 ]. |
3353 ]. |
3355 ]. |
3354 ]. |
3356 first := false. |
3355 first := false. |
3357 ]. |
3356 ]. |
3358 ] ifFalse:[ |
3357 ] ifFalse:[ |
3359 outStream nextChunkPut:chunk. |
3358 outStream nextChunkPut:chunk. |
3360 outStream cr |
3359 outStream cr |
3361 ] |
3360 ] |
3362 ]. |
3361 ]. |
3363 outStream close. |
3362 outStream close. |
3364 inStream close. |
3363 inStream close. |
3365 ]. |
3364 ]. |
3366 |
3365 |
3367 f := changeFileName asFilename. |
3366 f := changeFileName asFilename. |
3368 f renameTo:(f withSuffix:'bak'). |
3367 f renameTo:(f withSuffix:'bak'). |
3369 tempfile renameTo:changeFileName. |
3368 tempfile renameTo:changeFileName. |
3370 self doReload. |
3369 self doReload. |
3371 modified := false. |
3370 modified := false. |
3372 self valueOfNotSaving value: true. |
3371 self valueOfNotSaving value: true. |
3373 ]. |
3372 ]. |
3374 ^ true |
3373 ^ true |
3375 |
3374 |
3376 |
3375 |
3377 ! ! |
3376 ! ! |