1 "{ Package: 'stx:libtool' }" |
1 "{ Package: 'stx:libtool' }" |
2 |
2 |
3 AbstractSettingsApplication subclass:#P4SourceCodeManagementSettingsAppl |
3 AbstractSourceCodeManagementSettingsAppl subclass:#P4SourceCodeManagementSettingsAppl |
4 instanceVariableNames:'sourceCacheDir listOfModules removeEnabled acceptChannel |
4 instanceVariableNames:'sourceCacheDir listOfModules removeEnabled acceptChannel |
5 selectedPerModuleRoot verboseSourceCodeAccess |
5 selectedPerModuleRoot verboseSourceCodeAccess |
6 perforceExecutableHolder listOfPerforceModules |
6 perforceExecutableHolder listOfPerforceModules |
7 defaultSettingsHolder tableColumns defaultSettingsPrototypeList' |
7 defaultSettingsHolder tableColumns defaultSettingsPrototypeList' |
8 classVariableNames:'RecentlyUsedCVSRoots RecentlyUsedStoreHosts |
8 classVariableNames:'RecentlyUsedCVSRoots RecentlyUsedStoreHosts |
9 RecentlyUsedSmallTeamHosts LastStoreHost LastStoreUser |
9 RecentlyUsedSmallTeamHosts LastStoreHost LastStoreUser |
10 LastStorePassword' |
10 LastStorePassword' |
11 poolDictionaries:'' |
11 poolDictionaries:'' |
12 category:'Interface-Smalltalk' |
12 category:'Interface-Smalltalk' |
13 ! |
13 ! |
14 |
14 |
15 ApplicationModel subclass:#ManagerPerModuleApp |
15 ApplicationModel subclass:#ManagerPerModuleApp |
16 instanceVariableNames:'moduleHolder acceptChannel settingsHolder |
16 instanceVariableNames:'moduleHolder acceptChannel settingsHolder |
17 sourceCodeManagementSettingsApp acceptEnableChannel canceled |
17 sourceCodeManagementSettingsApp acceptEnableChannel canceled |
18 defaultSettingsPrototypeList' |
18 defaultSettingsPrototypeList' |
19 classVariableNames:'' |
19 classVariableNames:'' |
20 poolDictionaries:'' |
20 poolDictionaries:'' |
21 privateIn:P4SourceCodeManagementSettingsAppl |
21 privateIn:P4SourceCodeManagementSettingsAppl |
22 ! |
22 ! |
23 |
23 |
24 Object subclass:#ModuleManager |
24 Object subclass:#ModuleManager |
25 instanceVariableNames:'manager module settings app' |
25 instanceVariableNames:'manager module settings app' |
26 classVariableNames:'' |
26 classVariableNames:'' |
27 poolDictionaries:'' |
27 poolDictionaries:'' |
28 privateIn:P4SourceCodeManagementSettingsAppl |
28 privateIn:P4SourceCodeManagementSettingsAppl |
29 ! |
29 ! |
30 |
30 |
31 |
31 |
32 !P4SourceCodeManagementSettingsAppl class methodsFor:'image specs'! |
32 !P4SourceCodeManagementSettingsAppl class methodsFor:'image specs'! |
33 |
33 |
45 " |
45 " |
46 |
46 |
47 <resource: #image> |
47 <resource: #image> |
48 |
48 |
49 ^Icon |
49 ^Icon |
50 constantNamed:#'AbstractSettingsApplication::SourceCodeManagementSettingsAppl class defaultIcon' |
50 constantNamed:#'AbstractSettingsApplication::SourceCodeManagementSettingsAppl class defaultIcon' |
51 ifAbsentPut:[(Depth8Image new) width: 22; height: 22; photometric:(#palette); bitsPerSample:(#(8 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:' |
51 ifAbsentPut:[(Depth8Image new) width: 22; height: 22; photometric:(#palette); bitsPerSample:(#(8 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:' |
52 @@@@@@@@@@@A@PHB@0P@@@@@@@@@@@@@@@@@@@HEA \HA $JB0HD@@@@@@@@@@@@@@HLA04NC0HD@@L@@ P@@@@@@@@@@@@ED@ NDP@@@@@@@@@D@@@@@@@@ |
52 @@@@@@@@@@@A@PHB@0P@@@@@@@@@@@@@@@@@@@HEA \HA $JB0HD@@@@@@@@@@@@@@HLA04NC0HD@@L@@ P@@@@@@@@@@@@ED@ NDP@@@@@@@@@D@@@@@@@@ |
53 @@@BA \FAPP@@@@@@@@@@@P@@@@@@@@@AQ@RC0@@@@@@@@@@@@@@@@@@@@@@@@TGA!!DD@@@@@@@@@@@@@@@@@@@D@PDIA08OA@@@@@@@@@@@@@@@@@@@AP S |
53 @@@BA \FAPP@@@@@@@@@@@P@@@@@@@@@AQ@RC0@@@@@@@@@@@@@@@@@@@@@@@@TGA!!DD@@@@@@@@@@@@@@@@@@@D@PDIA08OA@@@@@@@@@@@@@@@@@@@AP S |
54 A0XIBPXGC0P@@@@@@@@@@@@@@@@ECAPLBPXOAP@@@@@@EQX@@@@@@@@@@@TIE@XOAP@@@@@@EQ\XE @@@@@@@@@@AP$OAP@@@@@@FQ\ZE!! V@@@@@@@@@@@E |
54 A0XIBPXGC0P@@@@@@@@@@@@@@@@ECAPLBPXOAP@@@@@@EQX@@@@@@@@@@@TIE@XOAP@@@@@@EQ\XE @@@@@@@@@@AP$OAP@@@@@@FQ\ZE!! V@@@@@@@@@@@E |
55 F0@@@@@@EQ\ZF!!(VFAX@@@@@@@@@@@@@@@@ZEQ\VE!!(ZF!!XWF @@@@@@@@@@@@@@@@@@@A\ZE!!(@@@@@@@@@@@@@@@@@@@@@@@@XE!!XZ@@@@@@@@@@@@@@@@ |
55 F0@@@@@@EQ\ZF!!(VFAX@@@@@@@@@@@@@@@@ZEQ\VE!!(ZF!!XWF @@@@@@@@@@@@@@@@@@@A\ZE!!(@@@@@@@@@@@@@@@@@@@@@@@@XE!!XZ@@@@@@@@@@@@@@@@ |
56 @@@@@@@@EQ(V@@@@@@@@@@@@@@@@@@@@@@@@EQ\VE @@@@@@@@@@@@@@@@@@@@@@EQ VE @@@@@@@@@@@@@@F @@@@@WEQ VE!!(@@@@@@@@@@@@@@@@@E!!\W |
56 @@@@@@@@EQ(V@@@@@@@@@@@@@@@@@@@@@@@@EQ\VE @@@@@@@@@@@@@@@@@@@@@@EQ VE @@@@@@@@@@@@@@F @@@@@WEQ VE!!(@@@@@@@@@@@@@@@@@E!!\W |
330 |
330 |
331 ) |
331 ) |
332 ) |
332 ) |
333 ! ! |
333 ! ! |
334 |
334 |
|
335 !P4SourceCodeManagementSettingsAppl class methodsFor:'queries'! |
|
336 |
|
337 managerClass |
|
338 "backlink to my manager class (needed by the settings app)" |
|
339 |
|
340 ^ PerforceSourceCodeManager |
|
341 |
|
342 "Created: / 19-04-2011 / 12:52:02 / cg" |
|
343 ! ! |
|
344 |
335 !P4SourceCodeManagementSettingsAppl class methodsFor:'tableColumns specs'! |
345 !P4SourceCodeManagementSettingsAppl class methodsFor:'tableColumns specs'! |
336 |
346 |
337 tableColumns |
347 tableColumns |
338 "This resource specification was automatically generated |
348 "This resource specification was automatically generated |
339 by the DataSetBuilder of ST/X." |
349 by the DataSetBuilder of ST/X." |
371 |
381 |
372 |detectedManager| |
382 |detectedManager| |
373 |
383 |
374 detectedManager := self listOfModules detect:[:eachModuleManager| eachModuleManager module = aModuleManager module] ifNone:nil. |
384 detectedManager := self listOfModules detect:[:eachModuleManager| eachModuleManager module = aModuleManager module] ifNone:nil. |
375 detectedManager isNil ifTrue:[ |
385 detectedManager isNil ifTrue:[ |
376 self listOfModules add:aModuleManager; sort. |
386 self listOfModules add:aModuleManager; sort. |
377 self updateModifiedChannel. |
387 self updateModifiedChannel. |
378 ] ifFalse:[ |
388 ] ifFalse:[ |
379 Dialog information:'Manager for Module ', aModuleManager module, ' already exists'. |
389 Dialog information:'Manager for Module ', aModuleManager module, ' already exists'. |
380 ]. |
390 ]. |
381 |
391 |
382 |
392 |
383 "Created: / 08-11-2006 / 19:25:21 / cg" |
393 "Created: / 08-11-2006 / 19:25:21 / cg" |
384 ! |
394 ! |
385 |
395 |
386 addModule:module withData:data |
396 addModule:module withData:data |
387 (self listOfModules includes:module) ifFalse:[ |
397 (self listOfModules includes:module) ifFalse:[ |
388 self listOfModules add:module; sort. |
398 self listOfModules add:module; sort. |
389 ]. |
399 ]. |
390 |
400 |
391 self updateModifiedChannel. |
401 self updateModifiedChannel. |
392 |
402 |
393 "Created: / 08-11-2006 / 19:25:21 / cg" |
403 "Created: / 08-11-2006 / 19:25:21 / cg" |
517 !P4SourceCodeManagementSettingsAppl methodsFor:'aspects'! |
527 !P4SourceCodeManagementSettingsAppl methodsFor:'aspects'! |
518 |
528 |
519 acceptChannel |
529 acceptChannel |
520 |
530 |
521 acceptChannel isNil ifTrue:[ |
531 acceptChannel isNil ifTrue:[ |
522 acceptChannel := TriggerValue new. |
532 acceptChannel := TriggerValue new. |
523 ]. |
533 ]. |
524 ^ acceptChannel. |
534 ^ acceptChannel. |
525 ! |
535 ! |
526 |
536 |
527 defaultSettingsHolder |
537 defaultSettingsHolder |
528 |
538 |
529 defaultSettingsHolder isNil ifTrue:[ |
539 defaultSettingsHolder isNil ifTrue:[ |
530 defaultSettingsHolder := ValueHolder new. |
540 defaultSettingsHolder := ValueHolder new. |
531 defaultSettingsHolder addDependent:self. |
541 defaultSettingsHolder addDependent:self. |
532 ]. |
542 ]. |
533 ^ defaultSettingsHolder. |
543 ^ defaultSettingsHolder. |
534 ! |
544 ! |
535 |
545 |
536 defaultSettingsPrototypeList |
546 defaultSettingsPrototypeList |
537 |
547 |
538 defaultSettingsPrototypeList isNil ifTrue:[ |
548 defaultSettingsPrototypeList isNil ifTrue:[ |
539 defaultSettingsPrototypeList := self perforcePrototypeList. |
549 defaultSettingsPrototypeList := self perforcePrototypeList. |
540 ]. |
550 ]. |
541 ^ defaultSettingsPrototypeList. |
551 ^ defaultSettingsPrototypeList. |
542 ! |
552 ! |
543 |
553 |
544 listOfModules |
554 listOfModules |
545 |
555 |
546 listOfModules isNil ifTrue:[ |
556 listOfModules isNil ifTrue:[ |
547 listOfModules := List new. |
557 listOfModules := List new. |
548 listOfModules addDependent:self. |
558 listOfModules addDependent:self. |
549 ]. |
559 ]. |
550 ^ listOfModules. |
560 ^ listOfModules. |
551 ! |
561 ! |
552 |
562 |
553 perforceExecutableHolder |
563 perforceExecutableHolder |
554 perforceExecutableHolder isNil ifTrue:[ |
564 perforceExecutableHolder isNil ifTrue:[ |
555 perforceExecutableHolder := ValueHolder new. |
565 perforceExecutableHolder := ValueHolder new. |
556 perforceExecutableHolder onChangeSend:#updateModifiedChannel to:self |
566 perforceExecutableHolder onChangeSend:#updateModifiedChannel to:self |
557 ]. |
567 ]. |
558 ^ perforceExecutableHolder. |
568 ^ perforceExecutableHolder. |
559 |
569 |
560 "Created: / 21-09-2006 / 15:37:06 / cg" |
570 "Created: / 21-09-2006 / 15:37:06 / cg" |
561 ! |
571 ! |
564 |
574 |
565 |first client| |
575 |first client| |
566 |
576 |
567 client := PerforceSourceCodeManager perforceClient. |
577 client := PerforceSourceCodeManager perforceClient. |
568 client isEmptyOrNil ifTrue:[ |
578 client isEmptyOrNil ifTrue:[ |
569 client := 'workspace'. |
579 client := 'workspace'. |
570 ]. |
580 ]. |
571 first := (client ,':', PerforceSourceCodeManager perforceUser, ':', |
581 first := (client ,':', PerforceSourceCodeManager perforceUser, ':', |
572 (PerforceSourceCodeManager perforcePassword ? 'pass'), '@', |
582 (PerforceSourceCodeManager perforcePassword ? 'pass'), '@', |
573 PerforceSourceCodeManager perforcePort). |
583 PerforceSourceCodeManager perforcePort). |
574 ^ Array with:first. |
584 ^ Array with:first. |
575 ! |
585 ! |
576 |
586 |
577 removeEnabled |
587 removeEnabled |
578 |
588 |
579 removeEnabled isNil ifTrue:[ |
589 removeEnabled isNil ifTrue:[ |
580 removeEnabled := false asValue. |
590 removeEnabled := false asValue. |
581 ]. |
591 ]. |
582 ^ removeEnabled. |
592 ^ removeEnabled. |
583 ! |
593 ! |
584 |
594 |
585 selectedPerModuleRoot |
595 selectedPerModuleRoot |
586 selectedPerModuleRoot isNil ifTrue:[ |
596 selectedPerModuleRoot isNil ifTrue:[ |
587 selectedPerModuleRoot := ValueHolder new. |
597 selectedPerModuleRoot := ValueHolder new. |
588 selectedPerModuleRoot addDependent:self. |
598 selectedPerModuleRoot addDependent:self. |
589 ]. |
599 ]. |
590 ^ selectedPerModuleRoot. |
600 ^ selectedPerModuleRoot. |
591 ! |
601 ! |
592 |
602 |
593 sourceCacheDir |
603 sourceCacheDir |
594 sourceCacheDir isNil ifTrue:[ |
604 sourceCacheDir isNil ifTrue:[ |
595 sourceCacheDir := ValueHolder new. |
605 sourceCacheDir := ValueHolder new. |
596 sourceCacheDir onChangeSend:#updateModifiedChannel to:self |
606 sourceCacheDir onChangeSend:#updateModifiedChannel to:self |
597 ]. |
607 ]. |
598 ^ sourceCacheDir. |
608 ^ sourceCacheDir. |
599 ! |
609 ! |
600 |
610 |
601 tableColumns |
611 tableColumns |
607 "*** (which may not be the one you wanted)" |
617 "*** (which may not be the one you wanted)" |
608 "*** Please change as required and accept it in the browser." |
618 "*** Please change as required and accept it in the browser." |
609 "*** (and replace this comment by something more useful ;-)" |
619 "*** (and replace this comment by something more useful ;-)" |
610 |
620 |
611 tableColumns isNil ifTrue:[ |
621 tableColumns isNil ifTrue:[ |
612 tableColumns := self class tableColumns asValue. |
622 tableColumns := self class tableColumns asValue. |
613 "/ if your app needs to be notified of changes, uncomment one of the lines below: |
623 "/ if your app needs to be notified of changes, uncomment one of the lines below: |
614 "/ tableColumns addDependent:self. |
624 "/ tableColumns addDependent:self. |
615 "/ tableColumns onChangeSend:#tableColumnsChanged to:self. |
625 "/ tableColumns onChangeSend:#tableColumnsChanged to:self. |
616 ]. |
626 ]. |
617 ^ tableColumns. |
627 ^ tableColumns. |
618 ! |
628 ! |
619 |
629 |
620 verboseSourceCodeAccess |
630 verboseSourceCodeAccess |
621 verboseSourceCodeAccess isNil ifTrue:[ |
631 verboseSourceCodeAccess isNil ifTrue:[ |
622 verboseSourceCodeAccess := false asValue. |
632 verboseSourceCodeAccess := false asValue. |
623 verboseSourceCodeAccess onChangeSend:#updateModifiedChannel to:self |
633 verboseSourceCodeAccess onChangeSend:#updateModifiedChannel to:self |
624 ]. |
634 ]. |
625 ^ verboseSourceCodeAccess. |
635 ^ verboseSourceCodeAccess. |
626 ! ! |
636 ! ! |
627 |
637 |
628 !P4SourceCodeManagementSettingsAppl methodsFor:'change & update'! |
638 !P4SourceCodeManagementSettingsAppl methodsFor:'change & update'! |
637 |
647 |
638 nm := self sourceCacheDir value. |
648 nm := self sourceCacheDir value. |
639 nm isEmptyOrNil ifTrue:[^ self]. |
649 nm isEmptyOrNil ifTrue:[^ self]. |
640 |
650 |
641 (fn := nm asFilename) exists ifFalse:[ |
651 (fn := nm asFilename) exists ifFalse:[ |
642 (self confirm:('SourceCache directory ''' , nm , ''' does not exist.\Create ?' withCRs)) ifTrue:[ |
652 (self confirm:('SourceCache directory ''' , nm , ''' does not exist.\Create ?' withCRs)) ifTrue:[ |
643 fn makeDirectory; |
653 fn makeDirectory; |
644 makeReadableForAll; |
654 makeReadableForAll; |
645 makeWritableForAll; |
655 makeWritableForAll; |
646 makeExecutableForAll. |
656 makeExecutableForAll. |
647 ] ifFalse:[ |
657 ] ifFalse:[ |
648 self sourceCacheDir value:(AbstractSourceCodeManager cacheDirectoryName). |
658 self sourceCacheDir value:(AbstractSourceCodeManager cacheDirectoryName). |
649 ^ self. |
659 ^ self. |
650 ]. |
660 ]. |
651 ]. |
661 ]. |
652 (fn isDirectory |
662 (fn isDirectory |
653 and:[fn isReadable |
663 and:[fn isReadable |
654 and:[fn isWritable]]) ifTrue:[ |
664 and:[fn isWritable]]) ifTrue:[ |
655 AbstractSourceCodeManager cacheDirectoryName:nm. |
665 AbstractSourceCodeManager cacheDirectoryName:nm. |
656 ] ifFalse:[ |
666 ] ifFalse:[ |
657 self warn:'Invalid sourceCache directory.'. |
667 self warn:'Invalid sourceCache directory.'. |
658 self sourceCacheDir value:(AbstractSourceCodeManager cacheDirectoryName). |
668 self sourceCacheDir value:(AbstractSourceCodeManager cacheDirectoryName). |
659 ]. |
669 ]. |
660 ! |
670 ! |
661 |
671 |
662 update:something with:aParameter from:changedObject |
672 update:something with:aParameter from:changedObject |
663 "/ common |
673 "/ common |
762 |
772 |
763 |repositoryInfoPerModule| |
773 |repositoryInfoPerModule| |
764 |
774 |
765 repositoryInfoPerModule := Dictionary new. |
775 repositoryInfoPerModule := Dictionary new. |
766 self listOfModules do:[:aModuleManager| |
776 self listOfModules do:[:aModuleManager| |
767 repositoryInfoPerModule at:aModuleManager module put:aModuleManager settings. |
777 repositoryInfoPerModule at:aModuleManager module put:aModuleManager settings. |
768 ]. |
778 ]. |
769 ^ repositoryInfoPerModule |
779 ^ repositoryInfoPerModule |
770 ! ! |
780 ! ! |
771 |
781 |
772 !P4SourceCodeManagementSettingsAppl::ManagerPerModuleApp class methodsFor:'instance creation'! |
782 !P4SourceCodeManagementSettingsAppl::ManagerPerModuleApp class methodsFor:'instance creation'! |
944 ! |
954 ! |
945 |
955 |
946 defaultSettingsPrototypeList |
956 defaultSettingsPrototypeList |
947 |
957 |
948 defaultSettingsPrototypeList isNil ifTrue:[ |
958 defaultSettingsPrototypeList isNil ifTrue:[ |
949 defaultSettingsPrototypeList := sourceCodeManagementSettingsApp perforcePrototypeList. |
959 defaultSettingsPrototypeList := sourceCodeManagementSettingsApp perforcePrototypeList. |
950 ]. |
960 ]. |
951 ^ defaultSettingsPrototypeList. |
961 ^ defaultSettingsPrototypeList. |
952 ! |
962 ! |
953 |
963 |
954 sourceCodeManagementSettingsApp |
964 sourceCodeManagementSettingsApp |
970 "*** (which may not be the one you wanted)" |
980 "*** (which may not be the one you wanted)" |
971 "*** Please change as required and accept it in the browser." |
981 "*** Please change as required and accept it in the browser." |
972 "*** (and replace this comment by something more useful ;-)" |
982 "*** (and replace this comment by something more useful ;-)" |
973 |
983 |
974 acceptChannel isNil ifTrue:[ |
984 acceptChannel isNil ifTrue:[ |
975 acceptChannel := TriggerValue new. |
985 acceptChannel := TriggerValue new. |
976 ]. |
986 ]. |
977 ^ acceptChannel. |
987 ^ acceptChannel. |
978 ! |
988 ! |
979 |
989 |
980 acceptEnableChannel |
990 acceptEnableChannel |
986 "*** (which may not be the one you wanted)" |
996 "*** (which may not be the one you wanted)" |
987 "*** Please change as required and accept it in the browser." |
997 "*** Please change as required and accept it in the browser." |
988 "*** (and replace this comment by something more useful ;-)" |
998 "*** (and replace this comment by something more useful ;-)" |
989 |
999 |
990 acceptEnableChannel isNil ifTrue:[ |
1000 acceptEnableChannel isNil ifTrue:[ |
991 acceptEnableChannel := true asValue. |
1001 acceptEnableChannel := true asValue. |
992 "/ if your app needs to be notified of changes, uncomment one of the lines below: |
1002 "/ if your app needs to be notified of changes, uncomment one of the lines below: |
993 "/ acceptEnableChannel addDependent:self. |
1003 "/ acceptEnableChannel addDependent:self. |
994 "/ acceptEnableChannel onChangeSend:#acceptEnableChannelChanged to:self. |
1004 "/ acceptEnableChannel onChangeSend:#acceptEnableChannelChanged to:self. |
995 ]. |
1005 ]. |
996 ^ acceptEnableChannel. |
1006 ^ acceptEnableChannel. |
1005 "*** (which may not be the one you wanted)" |
1015 "*** (which may not be the one you wanted)" |
1006 "*** Please change as required and accept it in the browser." |
1016 "*** Please change as required and accept it in the browser." |
1007 "*** (and replace this comment by something more useful ;-)" |
1017 "*** (and replace this comment by something more useful ;-)" |
1008 |
1018 |
1009 moduleHolder isNil ifTrue:[ |
1019 moduleHolder isNil ifTrue:[ |
1010 moduleHolder := ValueHolder new. |
1020 moduleHolder := ValueHolder new. |
1011 "/ if your app needs to be notified of changes, uncomment one of the lines below: |
1021 "/ if your app needs to be notified of changes, uncomment one of the lines below: |
1012 moduleHolder addDependent:self. |
1022 moduleHolder addDependent:self. |
1013 "/ moduleHolder onChangeSend:#moduleHolderChanged to:self. |
1023 "/ moduleHolder onChangeSend:#moduleHolderChanged to:self. |
1014 ]. |
1024 ]. |
1015 ^ moduleHolder. |
1025 ^ moduleHolder. |
1016 ! |
1026 ! |
1017 |
1027 |
1024 "*** (which may not be the one you wanted)" |
1034 "*** (which may not be the one you wanted)" |
1025 "*** Please change as required and accept it in the browser." |
1035 "*** Please change as required and accept it in the browser." |
1026 "*** (and replace this comment by something more useful ;-)" |
1036 "*** (and replace this comment by something more useful ;-)" |
1027 |
1037 |
1028 settingsHolder isNil ifTrue:[ |
1038 settingsHolder isNil ifTrue:[ |
1029 settingsHolder := ValueHolder new. |
1039 settingsHolder := ValueHolder new. |
1030 "/ if your app needs to be notified of changes, uncomment one of the lines below: |
1040 "/ if your app needs to be notified of changes, uncomment one of the lines below: |
1031 "/ settingsHolder addDependent:self. |
1041 "/ settingsHolder addDependent:self. |
1032 "/ settingsHolder onChangeSend:#settingsHolderChanged to:self. |
1042 "/ settingsHolder onChangeSend:#settingsHolderChanged to:self. |
1033 ]. |
1043 ]. |
1034 ^ settingsHolder. |
1044 ^ settingsHolder. |