~drgeo-developers/drgeo/trunk

« back to all changes in this revision

Viewing changes to src/DrGeo.pck.st

  • Committer: Launchpad Translations on behalf of drgeo-developers
  • Date: 2024-05-28 04:34:49 UTC
  • Revision ID: launchpad_translations_on_behalf_of_drgeo-developers-20240528043449-2m2ty195zxno1e9r
Launchpad automatic translations update.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
'From Cuis 6.0 [latest update: #6068] on 7 November 2023 at 8:59:38 pm'!
 
1
'From Cuis6.3 [latest update: #6340] on 5 May 2024 at 3:02:40 pm'!
2
2
'Description '!
3
 
!provides: 'DrGeo' 1 643!
 
3
!provides: 'DrGeo' 1 721!
4
4
!requires: 'Gettext' 1 17 nil!
5
5
!requires: 'SVG' 1 16 nil!
6
6
!requires: 'YAXO' 1 19 nil!
13
13
SystemOrganization addCategory: #'DrGeo-Model'!
14
14
SystemOrganization addCategory: #'DrGeo-Model-Smalltalk'!
15
15
SystemOrganization addCategory: #'DrGeo-Model-Item'!
 
16
SystemOrganization addCategory: #'DrGeo-Model-Style'!
16
17
SystemOrganization addCategory: #'DrGeo-Model-Macro'!
17
18
SystemOrganization addCategory: #'DrGeo-Model-Script'!
18
19
SystemOrganization addCategory: #'DrGeo-View'!
24
25
SystemOrganization addCategory: #'DrGeo-Presenter-Command'!
25
26
SystemOrganization addCategory: #'DrGeo-Factories'!
26
27
SystemOrganization addCategory: #'DrGeo-File'!
27
 
SystemOrganization addCategory: #'DrGeo-Styles'!
28
28
SystemOrganization addCategory: #'DrGeo-System'!
29
29
SystemOrganization addCategory: #'DrGeo-Test'!
30
30
SystemOrganization addCategory: #DrGeo!
462
462
 
463
463
!classDefinition: #DrGLabel category: #'DrGeo-View'!
464
464
LabelMorph subclass: #DrGLabel
465
 
        instanceVariableNames: 'blink itemMorph'
 
465
        instanceVariableNames: 'blink itemMorph delta'
466
466
        classVariableNames: ''
467
467
        poolDictionaries: ''
468
468
        category: 'DrGeo-View'!
484
484
SystemWindow subclass: #DrGeoView
485
485
        instanceVariableNames: 'presenter drawable'
486
486
        classVariableNames: ''
487
 
        poolDictionaries: 'nil'
 
487
        poolDictionaries: ''
488
488
        category: 'DrGeo-View'!
489
489
!classDefinition: 'DrGeoView class' category: #'DrGeo-View'!
490
490
DrGeoView class
602
602
 
603
603
!classDefinition: #DrGMorph category: #'DrGeo-View-Item'!
604
604
Morph subclass: #DrGMorph
605
 
        instanceVariableNames: 'drawable mathItem color style labelMorph labelPositionDelta blink'
 
605
        instanceVariableNames: 'mathItem color style labelMorph'
606
606
        classVariableNames: ''
607
607
        poolDictionaries: ''
608
608
        category: 'DrGeo-View-Item'!
850
850
DrGeoSmalltalkSketchTest class
851
851
        instanceVariableNames: ''!
852
852
 
 
853
!classDefinition: #LanguageFontTest category: #'DrGeo-Test'!
 
854
TestCase subclass: #LanguageFontTest
 
855
        instanceVariableNames: 'fontManager'
 
856
        classVariableNames: ''
 
857
        poolDictionaries: ''
 
858
        category: 'DrGeo-Test'!
 
859
!classDefinition: 'LanguageFontTest class' category: #'DrGeo-Test'!
 
860
LanguageFontTest class
 
861
        instanceVariableNames: ''!
 
862
 
853
863
!classDefinition: #DrGeoScriptTestResource category: #'DrGeo-Test'!
854
864
TestResource subclass: #DrGeoScriptTestResource
855
865
        instanceVariableNames: 'sketch'
860
870
DrGeoScriptTestResource class
861
871
        instanceVariableNames: ''!
862
872
 
863
 
!classDefinition: #DrGTypeArrow category: #'DrGeo-Styles'!
 
873
!classDefinition: #DrGTypeArrow category: #'DrGeo-Model-Style'!
864
874
PreferenceType subclass: #DrGTypeArrow
865
875
        instanceVariableNames: ''
866
876
        classVariableNames: ''
867
877
        poolDictionaries: ''
868
 
        category: 'DrGeo-Styles'!
869
 
!classDefinition: 'DrGTypeArrow class' category: #'DrGeo-Styles'!
 
878
        category: 'DrGeo-Model-Style'!
 
879
!classDefinition: 'DrGTypeArrow class' category: #'DrGeo-Model-Style'!
870
880
DrGTypeArrow class
871
881
        instanceVariableNames: ''!
872
882
 
873
 
!classDefinition: #DrGTypeColor category: #'DrGeo-Styles'!
 
883
!classDefinition: #DrGTypeColor category: #'DrGeo-Model-Style'!
874
884
PreferenceType subclass: #DrGTypeColor
875
885
        instanceVariableNames: ''
876
886
        classVariableNames: ''
877
887
        poolDictionaries: ''
878
 
        category: 'DrGeo-Styles'!
879
 
!classDefinition: 'DrGTypeColor class' category: #'DrGeo-Styles'!
 
888
        category: 'DrGeo-Model-Style'!
 
889
!classDefinition: 'DrGTypeColor class' category: #'DrGeo-Model-Style'!
880
890
DrGTypeColor class
881
891
        instanceVariableNames: ''!
882
892
 
883
 
!classDefinition: #DrGTypeMark category: #'DrGeo-Styles'!
 
893
!classDefinition: #DrGTypeMark category: #'DrGeo-Model-Style'!
884
894
PreferenceType subclass: #DrGTypeMark
885
895
        instanceVariableNames: ''
886
896
        classVariableNames: ''
887
897
        poolDictionaries: ''
888
 
        category: 'DrGeo-Styles'!
889
 
!classDefinition: 'DrGTypeMark class' category: #'DrGeo-Styles'!
 
898
        category: 'DrGeo-Model-Style'!
 
899
!classDefinition: 'DrGTypeMark class' category: #'DrGeo-Model-Style'!
890
900
DrGTypeMark class
891
901
        instanceVariableNames: ''!
892
902
 
893
 
!classDefinition: #DrGTypePointShape category: #'DrGeo-Styles'!
 
903
!classDefinition: #DrGTypePointShape category: #'DrGeo-Model-Style'!
894
904
PreferenceType subclass: #DrGTypePointShape
895
905
        instanceVariableNames: ''
896
906
        classVariableNames: ''
897
907
        poolDictionaries: ''
898
 
        category: 'DrGeo-Styles'!
899
 
!classDefinition: 'DrGTypePointShape class' category: #'DrGeo-Styles'!
 
908
        category: 'DrGeo-Model-Style'!
 
909
!classDefinition: 'DrGTypePointShape class' category: #'DrGeo-Model-Style'!
900
910
DrGTypePointShape class
901
911
        instanceVariableNames: ''!
902
912
 
903
 
!classDefinition: #DrGTypePointSize category: #'DrGeo-Styles'!
 
913
!classDefinition: #DrGTypePointSize category: #'DrGeo-Model-Style'!
904
914
PreferenceType subclass: #DrGTypePointSize
905
915
        instanceVariableNames: ''
906
916
        classVariableNames: ''
907
917
        poolDictionaries: ''
908
 
        category: 'DrGeo-Styles'!
909
 
!classDefinition: 'DrGTypePointSize class' category: #'DrGeo-Styles'!
 
918
        category: 'DrGeo-Model-Style'!
 
919
!classDefinition: 'DrGTypePointSize class' category: #'DrGeo-Model-Style'!
910
920
DrGTypePointSize class
911
921
        instanceVariableNames: ''!
912
922
 
913
 
!classDefinition: #DrGTypeStyle category: #'DrGeo-Styles'!
 
923
!classDefinition: #DrGTypeStyle category: #'DrGeo-Model-Style'!
914
924
PreferenceType subclass: #DrGTypeStyle
915
925
        instanceVariableNames: ''
916
926
        classVariableNames: ''
917
927
        poolDictionaries: ''
918
 
        category: 'DrGeo-Styles'!
919
 
!classDefinition: 'DrGTypeStyle class' category: #'DrGeo-Styles'!
 
928
        category: 'DrGeo-Model-Style'!
 
929
!classDefinition: 'DrGTypeStyle class' category: #'DrGeo-Model-Style'!
920
930
DrGTypeStyle class
921
931
        instanceVariableNames: ''!
922
932
 
923
 
!classDefinition: #DrGTypeThickness category: #'DrGeo-Styles'!
 
933
!classDefinition: #DrGTypeThickness category: #'DrGeo-Model-Style'!
924
934
PreferenceType subclass: #DrGTypeThickness
925
935
        instanceVariableNames: ''
926
936
        classVariableNames: ''
927
937
        poolDictionaries: ''
928
 
        category: 'DrGeo-Styles'!
929
 
!classDefinition: 'DrGTypeThickness class' category: #'DrGeo-Styles'!
 
938
        category: 'DrGeo-Model-Style'!
 
939
!classDefinition: 'DrGTypeThickness class' category: #'DrGeo-Model-Style'!
930
940
DrGTypeThickness class
931
941
        instanceVariableNames: ''!
932
942
 
960
970
DrGWrappedCurve class
961
971
        instanceVariableNames: ''!
962
972
 
963
 
!classDefinition: #DrGWrappedFilledCurve category: #'DrGeo-Model-Smalltalk'!
964
 
DrGWrappedCurve subclass: #DrGWrappedFilledCurve
965
 
        instanceVariableNames: ''
966
 
        classVariableNames: ''
967
 
        poolDictionaries: ''
968
 
        category: 'DrGeo-Model-Smalltalk'!
969
 
!classDefinition: 'DrGWrappedFilledCurve class' category: #'DrGeo-Model-Smalltalk'!
970
 
DrGWrappedFilledCurve class
971
 
        instanceVariableNames: ''!
972
 
 
973
973
!classDefinition: #DrGWrappedFinitCurve category: #'DrGeo-Model-Smalltalk'!
974
974
DrGWrappedCurve subclass: #DrGWrappedFinitCurve
975
975
        instanceVariableNames: ''
980
980
DrGWrappedFinitCurve class
981
981
        instanceVariableNames: ''!
982
982
 
 
983
!classDefinition: #DrGWrappedFilledCurve category: #'DrGeo-Model-Smalltalk'!
 
984
DrGWrappedFinitCurve subclass: #DrGWrappedFilledCurve
 
985
        instanceVariableNames: ''
 
986
        classVariableNames: ''
 
987
        poolDictionaries: ''
 
988
        category: 'DrGeo-Model-Smalltalk'!
 
989
!classDefinition: 'DrGWrappedFilledCurve class' category: #'DrGeo-Model-Smalltalk'!
 
990
DrGWrappedFilledCurve class
 
991
        instanceVariableNames: ''!
 
992
 
983
993
!classDefinition: #DrGWrappedSegment category: #'DrGeo-Model-Smalltalk'!
984
994
DrGWrappedFinitCurve subclass: #DrGWrappedSegment
985
995
        instanceVariableNames: ''
1640
1650
DrGPointItem class
1641
1651
        instanceVariableNames: ''!
1642
1652
 
 
1653
!classDefinition: #DrGPointBlockItem category: #'DrGeo-Model-Item'!
 
1654
DrGPointItem subclass: #DrGPointBlockItem
 
1655
        instanceVariableNames: 'pointBlock'
 
1656
        classVariableNames: ''
 
1657
        poolDictionaries: ''
 
1658
        category: 'DrGeo-Model-Item'!
 
1659
!classDefinition: 'DrGPointBlockItem class' category: #'DrGeo-Model-Item'!
 
1660
DrGPointBlockItem class
 
1661
        instanceVariableNames: ''!
 
1662
 
1643
1663
!classDefinition: #DrGPointCoordinateItem category: #'DrGeo-Model-Item'!
1644
1664
DrGPointItem subclass: #DrGPointCoordinateItem
1645
1665
        instanceVariableNames: ''
1650
1670
DrGPointCoordinateItem class
1651
1671
        instanceVariableNames: ''!
1652
1672
 
1653
 
!classDefinition: #DrGPointBlockItem category: #'DrGeo-Model-Item'!
1654
 
DrGPointCoordinateItem subclass: #DrGPointBlockItem
1655
 
        instanceVariableNames: 'pointBlock'
1656
 
        classVariableNames: ''
1657
 
        poolDictionaries: ''
1658
 
        category: 'DrGeo-Model-Item'!
1659
 
!classDefinition: 'DrGPointBlockItem class' category: #'DrGeo-Model-Item'!
1660
 
DrGPointBlockItem class
1661
 
        instanceVariableNames: ''!
1662
 
 
1663
 
!classDefinition: #DrGPointScriptItem category: #'DrGeo-Model-Item'!
1664
 
DrGPointCoordinateItem subclass: #DrGPointScriptItem
1665
 
        instanceVariableNames: ''
1666
 
        classVariableNames: ''
1667
 
        poolDictionaries: ''
1668
 
        category: 'DrGeo-Model-Item'!
1669
 
!classDefinition: 'DrGPointScriptItem class' category: #'DrGeo-Model-Item'!
1670
 
DrGPointScriptItem class
1671
 
        instanceVariableNames: ''!
1672
 
 
1673
1673
!classDefinition: #DrGPointFreeItem category: #'DrGeo-Model-Item'!
1674
1674
DrGPointItem subclass: #DrGPointFreeItem
1675
1675
        instanceVariableNames: 'locked'
1750
1750
DrGPointRotationItem class
1751
1751
        instanceVariableNames: ''!
1752
1752
 
 
1753
!classDefinition: #DrGPointScriptItem category: #'DrGeo-Model-Item'!
 
1754
DrGPointItem subclass: #DrGPointScriptItem
 
1755
        instanceVariableNames: ''
 
1756
        classVariableNames: ''
 
1757
        poolDictionaries: ''
 
1758
        category: 'DrGeo-Model-Item'!
 
1759
!classDefinition: 'DrGPointScriptItem class' category: #'DrGeo-Model-Item'!
 
1760
DrGPointScriptItem class
 
1761
        instanceVariableNames: ''!
 
1762
 
1753
1763
!classDefinition: #DrGPointSymmetryItem category: #'DrGeo-Model-Item'!
1754
1764
DrGPointItem subclass: #DrGPointSymmetryItem
1755
1765
        instanceVariableNames: ''
1960
1970
DrGValueArclengthItem class
1961
1971
        instanceVariableNames: ''!
1962
1972
 
 
1973
!classDefinition: #DrGValueBlockItem category: #'DrGeo-Model-Item'!
 
1974
DrGComputedValueItem subclass: #DrGValueBlockItem
 
1975
        instanceVariableNames: 'valueBlock'
 
1976
        classVariableNames: ''
 
1977
        poolDictionaries: ''
 
1978
        category: 'DrGeo-Model-Item'!
 
1979
!classDefinition: 'DrGValueBlockItem class' category: #'DrGeo-Model-Item'!
 
1980
DrGValueBlockItem class
 
1981
        instanceVariableNames: ''!
 
1982
 
1963
1983
!classDefinition: #DrGValueCircleperimeterItem category: #'DrGeo-Model-Item'!
1964
1984
DrGComputedValueItem subclass: #DrGValueCircleperimeterItem
1965
1985
        instanceVariableNames: ''
2090
2110
DrGValueValueItem class
2091
2111
        instanceVariableNames: ''!
2092
2112
 
 
2113
!classDefinition: #DrGStyle category: #'DrGeo-Model-Style'!
 
2114
Object subclass: #DrGStyle
 
2115
        instanceVariableNames: 'morph color hidden feedback'
 
2116
        classVariableNames: ''
 
2117
        poolDictionaries: ''
 
2118
        category: 'DrGeo-Model-Style'!
 
2119
!classDefinition: 'DrGStyle class' category: #'DrGeo-Model-Style'!
 
2120
DrGStyle class
 
2121
        instanceVariableNames: ''!
 
2122
 
 
2123
!classDefinition: #DrGCurveStyle category: #'DrGeo-Model-Style'!
 
2124
DrGStyle subclass: #DrGCurveStyle
 
2125
        instanceVariableNames: 'thickness lineStyle'
 
2126
        classVariableNames: ''
 
2127
        poolDictionaries: ''
 
2128
        category: 'DrGeo-Model-Style'!
 
2129
!classDefinition: 'DrGCurveStyle class' category: #'DrGeo-Model-Style'!
 
2130
DrGCurveStyle class
 
2131
        instanceVariableNames: ''!
 
2132
 
 
2133
!classDefinition: #DrGFinitCurveStyle category: #'DrGeo-Model-Style'!
 
2134
DrGCurveStyle subclass: #DrGFinitCurveStyle
 
2135
        instanceVariableNames: 'arrow'
 
2136
        classVariableNames: ''
 
2137
        poolDictionaries: ''
 
2138
        category: 'DrGeo-Model-Style'!
 
2139
!classDefinition: 'DrGFinitCurveStyle class' category: #'DrGeo-Model-Style'!
 
2140
DrGFinitCurveStyle class
 
2141
        instanceVariableNames: ''!
 
2142
 
 
2143
!classDefinition: #DrGCompositeStyle category: #'DrGeo-Model-Style'!
 
2144
DrGFinitCurveStyle subclass: #DrGCompositeStyle
 
2145
        instanceVariableNames: 'shape'
 
2146
        classVariableNames: ''
 
2147
        poolDictionaries: ''
 
2148
        category: 'DrGeo-Model-Style'!
 
2149
!classDefinition: 'DrGCompositeStyle class' category: #'DrGeo-Model-Style'!
 
2150
DrGCompositeStyle class
 
2151
        instanceVariableNames: ''!
 
2152
 
 
2153
!classDefinition: #DrGFilledStyle category: #'DrGeo-Model-Style'!
 
2154
DrGFinitCurveStyle subclass: #DrGFilledStyle
 
2155
        instanceVariableNames: 'fill translucent'
 
2156
        classVariableNames: ''
 
2157
        poolDictionaries: ''
 
2158
        category: 'DrGeo-Model-Style'!
 
2159
!classDefinition: 'DrGFilledStyle class' category: #'DrGeo-Model-Style'!
 
2160
DrGFilledStyle class
 
2161
        instanceVariableNames: ''!
 
2162
 
 
2163
!classDefinition: #DrGArcStyle category: #'DrGeo-Model-Style'!
 
2164
DrGFilledStyle subclass: #DrGArcStyle
 
2165
        instanceVariableNames: ''
 
2166
        classVariableNames: ''
 
2167
        poolDictionaries: ''
 
2168
        category: 'DrGeo-Model-Style'!
 
2169
!classDefinition: 'DrGArcStyle class' category: #'DrGeo-Model-Style'!
 
2170
DrGArcStyle class
 
2171
        instanceVariableNames: ''!
 
2172
 
 
2173
!classDefinition: #DrGCircleStyle category: #'DrGeo-Model-Style'!
 
2174
DrGFilledStyle subclass: #DrGCircleStyle
 
2175
        instanceVariableNames: ''
 
2176
        classVariableNames: ''
 
2177
        poolDictionaries: ''
 
2178
        category: 'DrGeo-Model-Style'!
 
2179
!classDefinition: 'DrGCircleStyle class' category: #'DrGeo-Model-Style'!
 
2180
DrGCircleStyle class
 
2181
        instanceVariableNames: ''!
 
2182
 
 
2183
!classDefinition: #DrGPolygonStyle category: #'DrGeo-Model-Style'!
 
2184
DrGFilledStyle subclass: #DrGPolygonStyle
 
2185
        instanceVariableNames: ''
 
2186
        classVariableNames: ''
 
2187
        poolDictionaries: ''
 
2188
        category: 'DrGeo-Model-Style'!
 
2189
!classDefinition: 'DrGPolygonStyle class' category: #'DrGeo-Model-Style'!
 
2190
DrGPolygonStyle class
 
2191
        instanceVariableNames: ''!
 
2192
 
 
2193
!classDefinition: #DrGSegmentStyle category: #'DrGeo-Model-Style'!
 
2194
DrGFinitCurveStyle subclass: #DrGSegmentStyle
 
2195
        instanceVariableNames: 'mark'
 
2196
        classVariableNames: ''
 
2197
        poolDictionaries: ''
 
2198
        category: 'DrGeo-Model-Style'!
 
2199
!classDefinition: 'DrGSegmentStyle class' category: #'DrGeo-Model-Style'!
 
2200
DrGSegmentStyle class
 
2201
        instanceVariableNames: ''!
 
2202
 
 
2203
!classDefinition: #DrGLineStyle category: #'DrGeo-Model-Style'!
 
2204
DrGCurveStyle subclass: #DrGLineStyle
 
2205
        instanceVariableNames: ''
 
2206
        classVariableNames: ''
 
2207
        poolDictionaries: ''
 
2208
        category: 'DrGeo-Model-Style'!
 
2209
!classDefinition: 'DrGLineStyle class' category: #'DrGeo-Model-Style'!
 
2210
DrGLineStyle class
 
2211
        instanceVariableNames: ''!
 
2212
 
 
2213
!classDefinition: #DrGLocusStyle category: #'DrGeo-Model-Style'!
 
2214
DrGCurveStyle subclass: #DrGLocusStyle
 
2215
        instanceVariableNames: ''
 
2216
        classVariableNames: ''
 
2217
        poolDictionaries: ''
 
2218
        category: 'DrGeo-Model-Style'!
 
2219
!classDefinition: 'DrGLocusStyle class' category: #'DrGeo-Model-Style'!
 
2220
DrGLocusStyle class
 
2221
        instanceVariableNames: ''!
 
2222
 
 
2223
!classDefinition: #DrGRayStyle category: #'DrGeo-Model-Style'!
 
2224
DrGCurveStyle subclass: #DrGRayStyle
 
2225
        instanceVariableNames: ''
 
2226
        classVariableNames: ''
 
2227
        poolDictionaries: ''
 
2228
        category: 'DrGeo-Model-Style'!
 
2229
!classDefinition: 'DrGRayStyle class' category: #'DrGeo-Model-Style'!
 
2230
DrGRayStyle class
 
2231
        instanceVariableNames: ''!
 
2232
 
 
2233
!classDefinition: #DrGVectorStyle category: #'DrGeo-Model-Style'!
 
2234
DrGCurveStyle subclass: #DrGVectorStyle
 
2235
        instanceVariableNames: ''
 
2236
        classVariableNames: ''
 
2237
        poolDictionaries: ''
 
2238
        category: 'DrGeo-Model-Style'!
 
2239
!classDefinition: 'DrGVectorStyle class' category: #'DrGeo-Model-Style'!
 
2240
DrGVectorStyle class
 
2241
        instanceVariableNames: ''!
 
2242
 
 
2243
!classDefinition: #DrGPointStyle category: #'DrGeo-Model-Style'!
 
2244
DrGStyle subclass: #DrGPointStyle
 
2245
        instanceVariableNames: 'shape pointSize extent'
 
2246
        classVariableNames: ''
 
2247
        poolDictionaries: ''
 
2248
        category: 'DrGeo-Model-Style'!
 
2249
!classDefinition: 'DrGPointStyle class' category: #'DrGeo-Model-Style'!
 
2250
DrGPointStyle class
 
2251
        instanceVariableNames: ''!
 
2252
 
 
2253
!classDefinition: #DrGTextStyle category: #'DrGeo-Model-Style'!
 
2254
DrGStyle subclass: #DrGTextStyle
 
2255
        instanceVariableNames: 'backgroundColor borderColor fontSize'
 
2256
        classVariableNames: ''
 
2257
        poolDictionaries: ''
 
2258
        category: 'DrGeo-Model-Style'!
 
2259
!classDefinition: 'DrGTextStyle class' category: #'DrGeo-Model-Style'!
 
2260
DrGTextStyle class
 
2261
        instanceVariableNames: ''!
 
2262
 
 
2263
!classDefinition: #DrGValueStyle category: #'DrGeo-Model-Style'!
 
2264
DrGTextStyle subclass: #DrGValueStyle
 
2265
        instanceVariableNames: ''
 
2266
        classVariableNames: ''
 
2267
        poolDictionaries: ''
 
2268
        category: 'DrGeo-Model-Style'!
 
2269
!classDefinition: 'DrGValueStyle class' category: #'DrGeo-Model-Style'!
 
2270
DrGValueStyle class
 
2271
        instanceVariableNames: ''!
 
2272
 
2093
2273
!classDefinition: #DrGMacro category: #'DrGeo-Model-Macro'!
2094
2274
Object subclass: #DrGMacro
2095
2275
        instanceVariableNames: 'nodes title description saved'
2164
2344
Object subclass: #DrGIcons
2165
2345
        instanceVariableNames: ''
2166
2346
        classVariableNames: ''
2167
 
        poolDictionaries: 'nil'
 
2347
        poolDictionaries: ''
2168
2348
        category: 'DrGeo-View'!
2169
2349
!classDefinition: 'DrGIcons class' category: #'DrGeo-View'!
2170
2350
DrGIcons class
2174
2354
Object subclass: #DrGUIControlsManager
2175
2355
        instanceVariableNames: 'presenter tools statusBar tree treeView editPanel quickToolbar view'
2176
2356
        classVariableNames: ''
2177
 
        poolDictionaries: 'nil'
 
2357
        poolDictionaries: ''
2178
2358
        category: 'DrGeo-View'!
2179
2359
!classDefinition: 'DrGUIControlsManager class' category: #'DrGeo-View'!
2180
2360
DrGUIControlsManager class
2192
2372
 
2193
2373
!classDefinition: #DrGeo category: #'DrGeo-Presenter'!
2194
2374
Object subclass: #DrGeo
2195
 
        instanceVariableNames: 'domain controlsManager tool gridStuck isCreateMultipleMode selectedTool selection sketchName exportImageName saved notInteractive'
 
2375
        instanceVariableNames: 'domain controlsManager tool gridStuck isCreateMultipleMode selectedTool selection sketchName exportImageName saved notInteractive stSketch'
2196
2376
        classVariableNames: ''
2197
2377
        poolDictionaries: ''
2198
2378
        category: 'DrGeo-Presenter'!
2720
2900
DrGeoXml class
2721
2901
        instanceVariableNames: ''!
2722
2902
 
2723
 
!classDefinition: #DrGStyle category: #'DrGeo-Styles'!
2724
 
Object subclass: #DrGStyle
2725
 
        instanceVariableNames: 'morph color hidden feedback'
2726
 
        classVariableNames: ''
2727
 
        poolDictionaries: ''
2728
 
        category: 'DrGeo-Styles'!
2729
 
!classDefinition: 'DrGStyle class' category: #'DrGeo-Styles'!
2730
 
DrGStyle class
2731
 
        instanceVariableNames: ''!
2732
 
 
2733
 
!classDefinition: #DrGCurveStyle category: #'DrGeo-Styles'!
2734
 
DrGStyle subclass: #DrGCurveStyle
2735
 
        instanceVariableNames: 'thickness lineStyle'
2736
 
        classVariableNames: ''
2737
 
        poolDictionaries: ''
2738
 
        category: 'DrGeo-Styles'!
2739
 
!classDefinition: 'DrGCurveStyle class' category: #'DrGeo-Styles'!
2740
 
DrGCurveStyle class
2741
 
        instanceVariableNames: ''!
2742
 
 
2743
 
!classDefinition: #DrGFinitCurveStyle category: #'DrGeo-Styles'!
2744
 
DrGCurveStyle subclass: #DrGFinitCurveStyle
2745
 
        instanceVariableNames: 'arrow'
2746
 
        classVariableNames: ''
2747
 
        poolDictionaries: ''
2748
 
        category: 'DrGeo-Styles'!
2749
 
!classDefinition: 'DrGFinitCurveStyle class' category: #'DrGeo-Styles'!
2750
 
DrGFinitCurveStyle class
2751
 
        instanceVariableNames: ''!
2752
 
 
2753
 
!classDefinition: #DrGCompositeStyle category: #'DrGeo-Styles'!
2754
 
DrGFinitCurveStyle subclass: #DrGCompositeStyle
2755
 
        instanceVariableNames: 'shape'
2756
 
        classVariableNames: ''
2757
 
        poolDictionaries: ''
2758
 
        category: 'DrGeo-Styles'!
2759
 
!classDefinition: 'DrGCompositeStyle class' category: #'DrGeo-Styles'!
2760
 
DrGCompositeStyle class
2761
 
        instanceVariableNames: ''!
2762
 
 
2763
 
!classDefinition: #DrGFilledStyle category: #'DrGeo-Styles'!
2764
 
DrGFinitCurveStyle subclass: #DrGFilledStyle
2765
 
        instanceVariableNames: 'fill translucent'
2766
 
        classVariableNames: ''
2767
 
        poolDictionaries: ''
2768
 
        category: 'DrGeo-Styles'!
2769
 
!classDefinition: 'DrGFilledStyle class' category: #'DrGeo-Styles'!
2770
 
DrGFilledStyle class
2771
 
        instanceVariableNames: ''!
2772
 
 
2773
 
!classDefinition: #DrGArcStyle category: #'DrGeo-Styles'!
2774
 
DrGFilledStyle subclass: #DrGArcStyle
2775
 
        instanceVariableNames: ''
2776
 
        classVariableNames: ''
2777
 
        poolDictionaries: ''
2778
 
        category: 'DrGeo-Styles'!
2779
 
!classDefinition: 'DrGArcStyle class' category: #'DrGeo-Styles'!
2780
 
DrGArcStyle class
2781
 
        instanceVariableNames: ''!
2782
 
 
2783
 
!classDefinition: #DrGCircleStyle category: #'DrGeo-Styles'!
2784
 
DrGFilledStyle subclass: #DrGCircleStyle
2785
 
        instanceVariableNames: ''
2786
 
        classVariableNames: ''
2787
 
        poolDictionaries: ''
2788
 
        category: 'DrGeo-Styles'!
2789
 
!classDefinition: 'DrGCircleStyle class' category: #'DrGeo-Styles'!
2790
 
DrGCircleStyle class
2791
 
        instanceVariableNames: ''!
2792
 
 
2793
 
!classDefinition: #DrGPolygonStyle category: #'DrGeo-Styles'!
2794
 
DrGFilledStyle subclass: #DrGPolygonStyle
2795
 
        instanceVariableNames: ''
2796
 
        classVariableNames: ''
2797
 
        poolDictionaries: ''
2798
 
        category: 'DrGeo-Styles'!
2799
 
!classDefinition: 'DrGPolygonStyle class' category: #'DrGeo-Styles'!
2800
 
DrGPolygonStyle class
2801
 
        instanceVariableNames: ''!
2802
 
 
2803
 
!classDefinition: #DrGSegmentStyle category: #'DrGeo-Styles'!
2804
 
DrGFinitCurveStyle subclass: #DrGSegmentStyle
2805
 
        instanceVariableNames: 'mark'
2806
 
        classVariableNames: ''
2807
 
        poolDictionaries: ''
2808
 
        category: 'DrGeo-Styles'!
2809
 
!classDefinition: 'DrGSegmentStyle class' category: #'DrGeo-Styles'!
2810
 
DrGSegmentStyle class
2811
 
        instanceVariableNames: ''!
2812
 
 
2813
 
!classDefinition: #DrGLineStyle category: #'DrGeo-Styles'!
2814
 
DrGCurveStyle subclass: #DrGLineStyle
2815
 
        instanceVariableNames: ''
2816
 
        classVariableNames: ''
2817
 
        poolDictionaries: ''
2818
 
        category: 'DrGeo-Styles'!
2819
 
!classDefinition: 'DrGLineStyle class' category: #'DrGeo-Styles'!
2820
 
DrGLineStyle class
2821
 
        instanceVariableNames: ''!
2822
 
 
2823
 
!classDefinition: #DrGLocusStyle category: #'DrGeo-Styles'!
2824
 
DrGCurveStyle subclass: #DrGLocusStyle
2825
 
        instanceVariableNames: ''
2826
 
        classVariableNames: ''
2827
 
        poolDictionaries: ''
2828
 
        category: 'DrGeo-Styles'!
2829
 
!classDefinition: 'DrGLocusStyle class' category: #'DrGeo-Styles'!
2830
 
DrGLocusStyle class
2831
 
        instanceVariableNames: ''!
2832
 
 
2833
 
!classDefinition: #DrGRayStyle category: #'DrGeo-Styles'!
2834
 
DrGCurveStyle subclass: #DrGRayStyle
2835
 
        instanceVariableNames: ''
2836
 
        classVariableNames: ''
2837
 
        poolDictionaries: ''
2838
 
        category: 'DrGeo-Styles'!
2839
 
!classDefinition: 'DrGRayStyle class' category: #'DrGeo-Styles'!
2840
 
DrGRayStyle class
2841
 
        instanceVariableNames: ''!
2842
 
 
2843
 
!classDefinition: #DrGVectorStyle category: #'DrGeo-Styles'!
2844
 
DrGCurveStyle subclass: #DrGVectorStyle
2845
 
        instanceVariableNames: ''
2846
 
        classVariableNames: ''
2847
 
        poolDictionaries: ''
2848
 
        category: 'DrGeo-Styles'!
2849
 
!classDefinition: 'DrGVectorStyle class' category: #'DrGeo-Styles'!
2850
 
DrGVectorStyle class
2851
 
        instanceVariableNames: ''!
2852
 
 
2853
 
!classDefinition: #DrGPointStyle category: #'DrGeo-Styles'!
2854
 
DrGStyle subclass: #DrGPointStyle
2855
 
        instanceVariableNames: 'shape pointSize'
2856
 
        classVariableNames: ''
2857
 
        poolDictionaries: ''
2858
 
        category: 'DrGeo-Styles'!
2859
 
!classDefinition: 'DrGPointStyle class' category: #'DrGeo-Styles'!
2860
 
DrGPointStyle class
2861
 
        instanceVariableNames: ''!
2862
 
 
2863
 
!classDefinition: #DrGTextStyle category: #'DrGeo-Styles'!
2864
 
DrGStyle subclass: #DrGTextStyle
2865
 
        instanceVariableNames: 'backgroundColor borderColor fontSize'
2866
 
        classVariableNames: ''
2867
 
        poolDictionaries: ''
2868
 
        category: 'DrGeo-Styles'!
2869
 
!classDefinition: 'DrGTextStyle class' category: #'DrGeo-Styles'!
2870
 
DrGTextStyle class
2871
 
        instanceVariableNames: ''!
2872
 
 
2873
 
!classDefinition: #DrGValueStyle category: #'DrGeo-Styles'!
2874
 
DrGTextStyle subclass: #DrGValueStyle
2875
 
        instanceVariableNames: ''
2876
 
        classVariableNames: ''
2877
 
        poolDictionaries: ''
2878
 
        category: 'DrGeo-Styles'!
2879
 
!classDefinition: 'DrGValueStyle class' category: #'DrGeo-Styles'!
2880
 
DrGValueStyle class
2881
 
        instanceVariableNames: ''!
2882
 
 
2883
2903
!classDefinition: #DrGPlatform category: #'DrGeo-System'!
2884
2904
Object subclass: #DrGPlatform
2885
 
        instanceVariableNames: 'toolbarIconSize canWeDisplaySpinner preferences'
 
2905
        instanceVariableNames: 'toolbarIconSize canWeDisplaySpinner preferences fontManager'
2886
2906
        classVariableNames: ''
2887
2907
        poolDictionaries: ''
2888
2908
        category: 'DrGeo-System'!
2920
2940
DrGeoSystem class
2921
2941
        instanceVariableNames: 'platform'!
2922
2942
 
 
2943
!classDefinition: #LanguageFont category: #'DrGeo-System'!
 
2944
Object subclass: #LanguageFont
 
2945
        instanceVariableNames: 'locales family file'
 
2946
        classVariableNames: ''
 
2947
        poolDictionaries: ''
 
2948
        category: 'DrGeo-System'!
 
2949
!classDefinition: 'LanguageFont class' category: #'DrGeo-System'!
 
2950
LanguageFont class
 
2951
        instanceVariableNames: ''!
 
2952
 
 
2953
!classDefinition: #LanguageFontManager category: #'DrGeo-System'!
 
2954
Object subclass: #LanguageFontManager
 
2955
        instanceVariableNames: 'languageFonts'
 
2956
        classVariableNames: ''
 
2957
        poolDictionaries: ''
 
2958
        category: 'DrGeo-System'!
 
2959
!classDefinition: 'LanguageFontManager class' category: #'DrGeo-System'!
 
2960
LanguageFontManager class
 
2961
        instanceVariableNames: ''!
 
2962
 
2923
2963
 
2924
2964
!DrGeoDomain commentStamp: '<historical>' prior: 0!
2925
2965
This is the domain object for DrGeo, aka the top level Model instance for one DrGeo instance. 
3005
3045
I am a DrGeo view without toolbar, I only come with the wheels and the top menu. I am used to display computed sketches (i.e. sketches constrcuted from Smalltalk code with the DrGeo API)!
3006
3046
 
3007
3047
!DrGLabel commentStamp: '<historical>' prior: 0!
3008
 
I am label sticked arround a math object.
 
3048
I am a label sticked arround a math object.
3009
3049
I can be dragged arround the objet and renammed from the Style tool.
3010
 
- itemMorph is the view of a math Item I am attached too!
 
3050
- itemMorph is the view of a math Item I am attached too
 
3051
- delta : my x@y delta to the reference point of the itemMorph I am attached to!
3011
3052
 
3012
3053
!DrGDebuggerWindow commentStamp: '<historical>' prior: 0!
3013
3054
A simplified Debugger window, with translated labels and helps.!
3059
3100
- docView : view of the Erudite DrGeo tutorial
3060
3101
- sketchProcess: the Smalltalk sketch is executed in its own thread
3061
3102
- playButton: the button to play and pause the Smalltalk sketch execution
 
3103
- debugger: a debugger window whose content is plug in the editor when appropriate
3062
3104
!
3063
3105
 
3064
3106
!DrGStylePanel commentStamp: '<historical>' prior: 0!
3163
3205
Domain Specific Language (DSL) abstraction to construct programmatically interactive sketch.
3164
3206
 
3165
3207
| sketch a |
3166
 
sketch _ DrGeoSketch new.
3167
 
a _ sketch point: 1@1.
 
3208
sketch := DrGeoSketch new.
 
3209
a := sketch point: 1@1.
3168
3210
sketch line: a to: 0@0
3169
3211
!
3170
3212
 
3230
3272
!DrGPointBlockItem commentStamp: '' prior: 0!
3231
3273
Point item defined by a block closure!
3232
3274
 
3233
 
!DrGPointScriptItem commentStamp: '' prior: 0!
3234
 
A DrGPointByScriptItem is definied by the returned value of a script.
3235
 
The script valueItem should understand asPoint.
3236
 
 
3237
 
Instance Variables
3238
 
!
3239
 
 
3240
3275
!DrGPointFreeItem commentStamp: '' prior: 0!
3241
3276
I represent a free point in the plane!
3242
3277
 
3243
3278
!DrGPointIntersectionItem commentStamp: '' prior: 0!
3244
3279
k                               - (-1) or 1 when they are 2 intersection points!
3245
3280
 
 
3281
!DrGPointScriptItem commentStamp: '' prior: 0!
 
3282
A DrGPointByScriptItem is definied by the returned value of a script.
 
3283
The script valueItem should understand asPoint.
 
3284
 
 
3285
Instance Variables
 
3286
!
 
3287
 
3246
3288
!DrGPolygonRegularItem commentStamp: '' prior: 0!
3247
3289
A regular polygon defined by its center, a vertex and a value (number of summit).!
3248
3290
 
3255
3297
!DrGAngleVectorsItem commentStamp: '' prior: 0!
3256
3298
Define an oriented angle, in the range ]-180 ; 180]!
3257
3299
 
 
3300
!DrGComputedValueItem commentStamp: '<historical>' prior: 0!
 
3301
An abstract class for value calculated or extracted from the properties of mathematical objects.!
 
3302
 
3258
3303
!DrGEquationLineItem commentStamp: '' prior: 0!
3259
3304
a line equation: 
3260
3305
- provide a and b for the reduced equation: y = a . x + b
3261
3306
- provide m otherwise for the equation x = m
3262
3307
!
3263
3308
 
 
3309
!DrGValueBlockItem commentStamp: '<historical>' prior: 0!
 
3310
Value defined by a block closure!
 
3311
 
3264
3312
!DrGValueScriptItem commentStamp: '<historical>' prior: 0!
3265
3313
Script
3266
3314
        - script: a script class instance 
3269
3317
!DrGValueValueItem commentStamp: '' prior: 0!
3270
3318
Free value!
3271
3319
 
 
3320
!DrGStyle commentStamp: '<historical>' prior: 0!
 
3321
I am an abstract class to set a style to a morph item (DrGMorph hierarchy).!
 
3322
 
 
3323
!DrGCurveStyle commentStamp: 'hlsf 5/18/2021 21:24:01' prior: 0!
 
3324
- color is a the optional fill color of the curve
 
3325
- borderColor is its line color!
 
3326
 
3272
3327
!DrGMacro commentStamp: '' prior: 0!
3273
3328
A DrGMacro is a macro-construction definition
3274
3329
 
3288
3343
Instance Variables
3289
3344
!
3290
3345
 
3291
 
!DrGeoUserScript commentStamp: '' prior: 0!
 
3346
!DrGeoUserScript commentStamp: '<historical>' prior: 0!
3292
3347
I am an abstract user script. 
3293
3348
My subclass 'DrGeoScriptXXXXXXX' are created from the Dr. Geo script wizard, menu: Script>Create a Script.
3294
3349
 
3301
3356
 
3302
3357
A set of helpers are present to use in the #compute method:
3303
3358
- #arg1 to #arg4: to access first to fourth mathItem arguments as selected by the user
3304
 
- #costume1 to #costume4: to access the first to fourth mathitem's costume
 
3359
- #costume1 to #costume4: to access the first to fourth mathitem's view (morph)
3305
3360
 
3306
3361
 
3307
3362
Instance Variables
3308
3363
- arguments : Array of DrGCostum, arguments this script uses in its computation
3309
 
- cosutme : the costume representing this script on the canvas, access only from its #costume message.
 
3364
- cosutme : the morph representing this script on the canvas, access only from its #costume message.
3310
3365
                !
3311
3366
 
3312
3367
!DrGIcons commentStamp: 'hlsf 4/26/2020 15:34:30' prior: 0!
3329
3384
- I build the main Dr. Geo view (Window or simpler view)
3330
3385
!
3331
3386
 
3332
 
!DrGeo commentStamp: '<historical>' prior: 0!
 
3387
!DrGeo commentStamp: 'hlsf 11/14/2023 00:18:25' prior: 0!
3333
3388
A presenter for the DrGeo app.
3334
3389
It is the interface to callback, state of the application
3335
3390
 
3336
3391
- notInteractive: indicates if the app is under the user interaction or is used by the system (for example to load a sketch), in that case no user interaction are authorized.
3337
 
- saved: is the sketch saved!
 
3392
- saved: is the sketch saved
 
3393
- stSketch: if not nil DrGeo was initialized from a Smalltalk Sketch!
3338
3394
 
3339
3395
!DrGTool commentStamp: '<historical>' prior: 0!
3340
3396
The root of the class hierarchy to handle tool. A tool is used to process the user inputs and to give appropriate feedbacks to the user depending on the operation the user can conduct. It works in close relation with a builder (see presenter-builder).
3457
3513
A DrGeoXml is an helper to load or save as an XML representation a DrGeo instance, including export to SVG.
3458
3514
!
3459
3515
 
3460
 
!DrGStyle commentStamp: '<historical>' prior: 0!
3461
 
I am an abstract class to set a style to a morph item (DrGMorph hierarchy).!
3462
 
 
3463
 
!DrGCurveStyle commentStamp: 'hlsf 5/18/2021 21:24:01' prior: 0!
3464
 
- color is a the optional fill color of the curve
3465
 
- borderColor is its line color!
3466
 
 
3467
3516
!DrGPlatform commentStamp: '' prior: 0!
3468
3517
I am an abstract class to modelise access to plateform preferences and information.
3469
3518
Pattern: strategy!
3478
3527
I map settings/preferences to the underneath hardware/os plateform
3479
3528
Pattern: strategy!
3480
3529
 
 
3530
!LanguageFont commentStamp: 'hlsf 11/17/2023 22:53:20' prior: 0!
 
3531
Associate several LocaleIDs (fr_FR, zh_TW, zh_CN, ko) (with or without country code) with an appropriate font.
 
3532
- locales : a collection of LocaleID
 
3533
- family : a String, font family name
 
3534
- file : a String, file name of the font!
 
3535
 
3481
3536
!DrGeoDomain methodsFor: 'initialize-release' stamp: 'hlsf 3/9/2023 17:26:59'!
3482
3537
initialize
3483
3538
        super initialize.
3484
 
        factory _ DrGMathItemFactory new.
3485
 
        cmdManager _ DrGCommandManager new domain: self.
3486
 
        pointNameIndex _ 0! !
 
3539
        factory := DrGMathItemFactory new.
 
3540
        cmdManager := DrGCommandManager new domain: self.
 
3541
        pointNameIndex := 0! !
3487
3542
 
3488
 
!DrGeoDomain methodsFor: 'initialize-release' stamp: 'hlsf 4/24/2020 12:56:07'!
 
3543
!DrGeoDomain methodsFor: 'initialize-release' stamp: 'hlsf 4/12/2024 15:18:43'!
3489
3544
release
3490
 
        factory release.
3491
 
        cmdManager release.! !
 
3545
        factory := cmdManager := nil
 
3546
        "factory release.
 
3547
        cmdManager release."! !
3492
3548
 
3493
3549
!DrGeoDomain methodsFor: 'building'!
3494
3550
createCompositeItem: aMathItemSelection
3544
3600
in: macroTree replaceParent: item with: newItem 
3545
3601
        | index |
3546
3602
        macroTree do: [ :anItem | 
3547
 
                (anItem parents notNil and: [ (index _ anItem parents indexOf: item) ~= 0 ])
 
3603
                (anItem parents notNil and: [ (index := anItem parents indexOf: item) ~= 0 ])
3548
3604
                        ifTrue: [anItem parents at: index put: newItem ] ]! !
3549
3605
 
3550
3606
!DrGeoDomain methodsFor: 'building'!
3606
3662
!DrGeoDomain methodsFor: 'updating'!
3607
3663
mutate: aPointItem asFreeOn: aCurveItem at: aPosition
3608
3664
        |item|
3609
 
        item _ DrGPointOncurveItem newWith: {aCurveItem .  aPosition}.
 
3665
        item := DrGPointOncurveItem newWith: {aCurveItem .  aPosition}.
3610
3666
        item name: aPointItem name.
3611
3667
        item actionMap: aPointItem actionMap.
3612
3668
        aPointItem become: item.
3615
3671
!DrGeoDomain methodsFor: 'updating'!
3616
3672
mutate: aPointItem asIntersectionWith: curveA and: curveB at: aPosition
3617
3673
        |item|
3618
 
        item _  DrGPointIntersectionItem newWith: {curveA. curveB.  aPosition}.
 
3674
        item :=  DrGPointIntersectionItem newWith: {curveA. curveB.  aPosition}.
3619
3675
        item name: aPointItem name.
3620
3676
        item actionMap: aPointItem actionMap.
3621
3677
        aPointItem become: item.
3625
3681
mutateAsFreePoint: aPointItem
3626
3682
        |freePointItem|
3627
3683
        (aPointItem isFreePointItem and: [aPointItem isPointItemOnCurve not]) ifTrue: [^aPointItem].
3628
 
        freePointItem _ DrGPointFreeItem new point: aPointItem point.
 
3684
        freePointItem := DrGPointFreeItem new point: aPointItem point.
3629
3685
        freePointItem name: aPointItem name.
3630
3686
        freePointItem actionMap: aPointItem actionMap.
3631
3687
        aPointItem become: freePointItem.
3636
3692
        factory updateAllMathItems.
3637
3693
        self triggerEvent: #updatedItems! !
3638
3694
 
3639
 
!DrGeoDomain methodsFor: 'updating'!
3640
 
updateAllMathItemsButLocus
3641
 
        factory updateAllMathItemsButLocus.
3642
 
        "We don't need to update the costumem we just want updated mathiteem'"
3643
 
        "self triggerEvent: #updatedItems"! !
3644
 
 
3645
3695
!DrGeoDomain methodsFor: 'updating' stamp: 'hlsf 5/17/2020 16:57:35'!
3646
3696
updateDirty: mathItems
3647
3697
        mathItems do: [:item | item update].
3668
3718
        (DrGeoSystem preferences at: #autoName) ifFalse: [^ self].
3669
3719
        aMathItem isPointItem ifTrue: [self autonamePoint: aMathItem]! !
3670
3720
 
3671
 
!DrGeoDomain methodsFor: 'autoname' stamp: 'hlsf 3/9/2023 17:36:01'!
 
3721
!DrGeoDomain methodsFor: 'autoname' stamp: 'drgeo 3/16/2024 19:52:00'!
3672
3722
autonamePoint: pointItem
3673
3723
        | name letter index |
3674
 
        letter _ ((pointNameIndex \\ 26) + 65) asCharacter.
3675
 
        index _ pointNameIndex // 26.
3676
 
        pointNameIndex _ pointNameIndex + 1.
3677
 
        name _ index isZero 
 
3724
        letter :=  Character codePoint: (pointNameIndex \\ 26) + 65.
 
3725
        index := pointNameIndex // 26.
 
3726
        pointNameIndex := pointNameIndex + 1.
 
3727
        name := index isZero 
3678
3728
                ifTrue: [letter asString]
3679
3729
                ifFalse: [letter asString, index asString].
3680
3730
        pointItem name: name
3757
3807
addToFlyingItem: anItem
3758
3808
 "Add an item to the flying item representing the item built by this builder "
3759
3809
        self isNotInteractive ifTrue: [^self].
3760
 
        movingPoint _ DrGPointFreeItem new point: point + (0.1 @ 0.1).
3761
 
        flyingItem _ self mathItemClass newWith: self flyingMathItemArguments.
 
3810
        movingPoint := DrGPointFreeItem new point: point + (0.1 @ 0.1).
 
3811
        flyingItem := self mathItemClass newWith: self flyingMathItemArguments.
3762
3812
        self initializeFlyingMorph
3763
3813
! !
3764
3814
 
3790
3840
basicItemFrom: node
3791
3841
| type itemClass item|
3792
3842
        "build the item class name from the node description"
3793
 
        type _ ((node  attributeAt: #type) copyWithoutAll: '_') capitalized.
3794
 
        itemClass _ Smalltalk
 
3843
        type := ((node  attributeAt: #type) copyWithoutAll: '_') capitalized.
 
3844
        itemClass := Smalltalk
3795
3845
                classNamed: ('DrG' , node tag capitalized , type , 'Item') asSymbol.
3796
 
        item _ itemClass new yourself.
 
3846
        item := itemClass new yourself.
3797
3847
        self postProcess: item from: node.
3798
3848
        ^ item! !
3799
3849
 
3800
3850
!DrGMathItemBuilder methodsFor: 'xml' stamp: 'hlsf 9/28/2022 17:24:10'!
3801
3851
itemFrom: node
3802
3852
        |item|
3803
 
        item _ self itemInstanceFrom: node.
 
3853
        item := self itemInstanceFrom: node.
3804
3854
        self postProcess: item from: node.
3805
3855
        ^ {self domain createFromMathItemNoCommandNoFactoryCheck: item. true}! !
3806
3856
 
3816
3866
"return a collection of the item parent given theirs id in the attribute
3817
3867
elements <parent id=xxx>"
3818
3868
        |collection|
3819
 
        collection _ OrderedCollection new.
 
3869
        collection := OrderedCollection new.
3820
3870
        node elementsDo: [:each | 
3821
3871
                (each tag = #parent) ifTrue: [
3822
3872
                        collection add: (self factory findInPoolById: (each attributeAt: 'ref') asSymbol)]].
3825
3875
!DrGMathItemBuilder methodsFor: 'xml'!
3826
3876
parseValuePosition: node
3827
3877
        | x y |
3828
 
        x _ (node contentStringAt: #x) asNumber.
3829
 
        y _ (node contentStringAt: #y) asNumber.
 
3878
        x := (node contentStringAt: #x) asNumber.
 
3879
        y := (node contentStringAt: #y) asNumber.
3830
3880
        ^ x@y.! !
3831
3881
 
3832
3882
!DrGMathItemBuilder methodsFor: 'xml'!
3848
3898
 
3849
3899
!DrGMathItemBuilder methodsFor: 'updating' stamp: 'hlsf 4/12/2021 22:04:51'!
3850
3900
reset
3851
 
        point _ nil.
 
3901
        point := nil.
3852
3902
        flyingMorph ifNotNil:
3853
3903
                [flyingMorph release.
3854
 
                flyingMorph _ nil]! !
 
3904
                flyingMorph := nil]! !
3855
3905
 
3856
3906
!DrGMathItemBuilder methodsFor: 'private'!
3857
3907
addItem: aMathItemCollection at: aPoint
3858
 
        point _ aPoint.! !
 
3908
        point := aPoint.! !
3859
3909
 
3860
3910
!DrGMathItemBuilder methodsFor: 'private'!
3861
3911
addToggleItem: aMathItemCollection in: aCollection
3883
3933
basicItemFrom: node
3884
3934
"create a basic item (unitialised) from this node and add it to the domain, return an item partially initialized. Used for macro node"
3885
3935
        | builder |
3886
 
        builder _ self new.
 
3936
        builder := self new.
3887
3937
        ^ builder basicItemFrom: node! !
3888
3938
 
3889
3939
!DrGMathItemBuilder class methodsFor: 'xml' stamp: 'hlsf 8/4/2023 17:09:44'!
3896
3946
!DrGAngleGeometricBuilder methodsFor: 'updating' stamp: 'hlsf 6/20/2021 11:22:39'!
3897
3947
reset
3898
3948
        super reset.
3899
 
        pointA _ pointB _ pointC _ nil! !
 
3949
        pointA := pointB := pointC := nil! !
3900
3950
 
3901
3951
!DrGAngleGeometricBuilder methodsFor: 'testing'!
3902
3952
isWanted: aMathItemCollection
3916
3966
        aMathItemCollection first isPointItem
3917
3967
                ifTrue:
3918
3968
                        [pointA ifNil: 
3919
 
                                [pointA _ aMathItemCollection first.
 
3969
                                [pointA := aMathItemCollection first.
3920
3970
                                ^self].
3921
3971
                        pointB ifNil:
3922
 
                                [pointB _ aMathItemCollection first.
 
3972
                                [pointB := aMathItemCollection first.
3923
3973
                                ^self].
3924
 
                        pointC _ aMathItemCollection first]! !
 
3974
                        pointC := aMathItemCollection first]! !
3925
3975
 
3926
3976
!DrGAngleGeometricBuilder methodsFor: 'constant'!
3927
3977
mathItemClass
3970
4020
!DrGAngleOrientedBuilder methodsFor: 'updating' stamp: 'hlsf 6/20/2021 11:22:42'!
3971
4021
reset
3972
4022
        super reset.
3973
 
        vectorA _ vectorB _ nil! !
 
4023
        vectorA := vectorB := nil! !
3974
4024
 
3975
4025
!DrGAngleOrientedBuilder methodsFor: 'private'!
3976
4026
addItem: aMathItemCollection at: aPoint
3978
4028
        aMathItemCollection first isPointItem
3979
4029
                ifFalse:
3980
4030
                        [vectorA ifNil:
3981
 
                                [vectorA _ aMathItemCollection first.
 
4031
                                [vectorA := aMathItemCollection first.
3982
4032
                                ^self].
3983
 
                        vectorB _ aMathItemCollection first]! !
 
4033
                        vectorB := aMathItemCollection first]! !
3984
4034
 
3985
4035
!DrGAngleOrientedBuilder methodsFor: 'constant'!
3986
4036
mathItemClass
4016
4066
!DrGArcBuilder methodsFor: 'private'!
4017
4067
addItem: aMathItemCollection at: aPoint
4018
4068
        super addItem: aMathItemCollection  at: aPoint.
4019
 
        pointA ifNil: [^ pointA _ aMathItemCollection first].
 
4069
        pointA ifNil: [^ pointA := aMathItemCollection first].
4020
4070
        pointB ifNil: 
4021
 
                [pointB _ aMathItemCollection first.
 
4071
                [pointB := aMathItemCollection first.
4022
4072
                ^ self addToFlyingItem: pointB].
4023
 
        pointC ifNil: [pointC _ aMathItemCollection first].
 
4073
        pointC ifNil: [pointC := aMathItemCollection first].
4024
4074
        ! !
4025
4075
 
4026
4076
!DrGArcBuilder methodsFor: 'testing'!
4037
4087
!DrGArcBuilder methodsFor: 'updating' stamp: 'hlsf 6/20/2021 11:22:49'!
4038
4088
reset
4039
4089
        super reset.
4040
 
        pointA _ pointB _ pointC _ nil! !
 
4090
        pointA := pointB := pointC := nil! !
4041
4091
 
4042
4092
!DrGArcBuilder class methodsFor: 'documentation'!
4043
4093
description 
4059
4109
isWanted: aMathItemCollection 
4060
4110
| item |
4061
4111
        ^ aMathItemCollection notEmpty 
4062
 
                and: [(item _ aMathItemCollection first) isPointItem 
 
4112
                and: [(item := aMathItemCollection first) isPointItem 
4063
4113
                and: [item ~= center 
4064
4114
                and: [item ~= origin]]]! !
4065
4115
 
4070
4120
!DrGArcCenterBuilder methodsFor: 'private'!
4071
4121
addItem: aMathItemCollection at: aPoint
4072
4122
        super addItem: aMathItemCollection at: aPoint.
4073
 
        center ifNil: [^ center _ aMathItemCollection first].
 
4123
        center ifNil: [^ center := aMathItemCollection first].
4074
4124
        origin ifNil: [
4075
 
                origin _ aMathItemCollection first.
 
4125
                origin := aMathItemCollection first.
4076
4126
                ^ self addToFlyingItem: origin].
4077
 
        extremity ifNil: [extremity _ aMathItemCollection first]! !
 
4127
        extremity ifNil: [extremity := aMathItemCollection first]! !
4078
4128
 
4079
4129
!DrGArcCenterBuilder methodsFor: 'updating' stamp: 'hlsf 6/20/2021 11:22:55'!
4080
4130
reset
4081
4131
        super reset.
4082
 
        origin _ center _ extremity _ nil! !
 
4132
        origin := center := extremity := nil! !
4083
4133
 
4084
4134
!DrGArcCenterBuilder methodsFor: 'flying costume' stamp: 'hlsf 4/12/2021 22:14:28'!
4085
4135
flyingMathItemArguments
4109
4159
        | form |
4110
4160
        super postProcess: item from: node.
4111
4161
        self parseValuePosition: node of: item.
4112
 
        form _ PNGReadWriter formFromStream: (node contentStringAt: #data) base64Decoded asByteArray readStream.
 
4162
        form := PNGReadWriter formFromStream: (node contentStringAt: #data) base64Decoded asByteArray readStream.
4113
4163
        item 
4114
4164
                insertAtScale: (node contentStringAt: #insertAtScale) asNumber;
4115
4165
                magnifyBy: (node contentStringAt: #magnify) asNumber;
4143
4193
!DrGCloneBuilder methodsFor: 'updating'!
4144
4194
reset
4145
4195
        super reset.
4146
 
        item _ nil! !
 
4196
        item := nil! !
4147
4197
 
4148
4198
!DrGCloneBuilder methodsFor: 'testing'!
4149
4199
isWanted: aMathItemCollection 
4157
4207
!DrGCloneBuilder methodsFor: 'private'!
4158
4208
addItem: aMathItemCollection at: aPoint
4159
4209
        super addItem: aMathItemCollection at: aPoint.
4160
 
        item _ aMathItemCollection first! !
 
4210
        item := aMathItemCollection first! !
4161
4211
 
4162
4212
!DrGCloneBuilder methodsFor: 'building'!
4163
4213
buildItem
4167
4217
!DrGCoordinatesBuilder methodsFor: 'private'!
4168
4218
addItem: aMathItemCollection at: aPoint
4169
4219
        | item |
4170
 
        point _ aPoint.
4171
 
        item _ aMathItemCollection first.
4172
 
        item isPointItem ifTrue: [^ pointA _ item].
4173
 
        item isCircleItem ifTrue: [^ circle _ item].
4174
 
        item isLineItem ifTrue: [^ line _ item].
4175
 
        item isVectorItem ifTrue: [^ vector _ item]! !
 
4220
        point := aPoint.
 
4221
        item := aMathItemCollection first.
 
4222
        item isPointItem ifTrue: [^ pointA := item].
 
4223
        item isCircleItem ifTrue: [^ circle := item].
 
4224
        item isLineItem ifTrue: [^ line := item].
 
4225
        item isVectorItem ifTrue: [^ vector := item]! !
4176
4226
 
4177
4227
!DrGCoordinatesBuilder methodsFor: 'as yet unclassified'!
4178
4228
itemInstanceFrom: node
4181
4231
to select the one we want"
4182
4232
        | nodeType |
4183
4233
        (self parentsById: node) do: [:each |   self addItem: {each} at: 0@0].
4184
 
        nodeType _ (node  attributeAt: #type) asSymbol.
 
4234
        nodeType := (node  attributeAt: #type) asSymbol.
4185
4235
        ^ self getItem detect: [:item | item nodeType = nodeType]
4186
4236
! !
4187
4237
 
4197
4247
!DrGCoordinatesBuilder methodsFor: 'updating' stamp: 'hlsf 6/20/2021 11:23:04'!
4198
4248
reset
4199
4249
        super reset.
4200
 
        pointA _ vector _ circle _ line _ nil! !
 
4250
        pointA := vector := circle := line := nil! !
4201
4251
 
4202
4252
!DrGCoordinatesBuilder methodsFor: 'testing'!
4203
4253
isWanted: aMathItemCollection 
4261
4311
to create the interesection the user clicks on two curves at the same time"
4262
4312
        super addItem: aMathItemCollection at: aPoint.
4263
4313
        aMathItemCollection ifNotEmpty: 
4264
 
                [curveItemA _ aMathItemCollection first].
 
4314
                [curveItemA := aMathItemCollection first].
4265
4315
        aMathItemCollection size >= 2 ifTrue:
4266
 
                [curveItemB _ aMathItemCollection second]! !
 
4316
                [curveItemB := aMathItemCollection second]! !
4267
4317
 
4268
4318
!DrGFlyPointBuilder methodsFor: 'private'!
4269
4319
restoreState: anArray
4270
 
        curveItemA _ anArray first.
4271
 
        curveItemB _ anArray second.
4272
 
        point _ anArray third! !
 
4320
        curveItemA := anArray first.
 
4321
        curveItemB := anArray second.
 
4322
        point := anArray third! !
4273
4323
 
4274
4324
!DrGFlyPointBuilder methodsFor: 'private'!
4275
4325
saveState
4278
4328
!DrGFlyPointBuilder methodsFor: 'updating' stamp: 'hlsf 6/20/2021 11:20:49'!
4279
4329
reset
4280
4330
        super reset.
4281
 
        curveItemA _ curveItemB _ nil! !
 
4331
        curveItemA := curveItemB := nil! !
4282
4332
 
4283
4333
!DrGFlyPointBuilder methodsFor: 'xml'!
4284
4334
itemInstanceFrom: node
4287
4337
!DrGFlyPointBuilder methodsFor: 'testing'!
4288
4338
isCurveIntersectionValid: aCollection
4289
4339
        | item state |
4290
 
        state _ self saveState.
 
4340
        state := self saveState.
4291
4341
        self restoreState: aCollection.
4292
 
        [item _ self buildItem]
 
4342
        [item := self buildItem]
4293
4343
                on: Error 
4294
4344
                do: [self restoreState: state.
4295
4345
                        ^false].
4341
4391
                ifFalse: [
4342
4392
                        item setCurveAbscissa: (node contentStringAt: #value) asNumber] 
4343
4393
                ifTrue: [ |x y|
4344
 
                        x _ (node contentStringAt: #x) asNumber.
4345
 
                        y _ (node contentStringAt: #y) asNumber.
 
4394
                        x := (node contentStringAt: #x) asNumber.
 
4395
                        y := (node contentStringAt: #y) asNumber.
4346
4396
                        item point: x@y]
4347
4397
! !
4348
4398
 
4349
4399
!DrGFreePointBuilder methodsFor: 'updating'!
4350
4400
reset
4351
4401
        super reset.
4352
 
        curveItem _ nil.! !
 
4402
        curveItem := nil.! !
4353
4403
 
4354
4404
!DrGFreePointBuilder methodsFor: 'accessing'!
4355
4405
arguments
4364
4414
addItem: aMathItemCollection at: aPoint
4365
4415
        super addItem: aMathItemCollection  at: aPoint.
4366
4416
        aMathItemCollection 
4367
 
                ifNotEmpty: [curveItem _ aMathItemCollection first].! !
 
4417
                ifNotEmpty: [curveItem := aMathItemCollection first].! !
4368
4418
 
4369
4419
!DrGFreePointBuilder methodsFor: 'constant'!
4370
4420
mathItemClass
4385
4435
!DrGLocusBuilder methodsFor: 'updating' stamp: 'hlsf 6/20/2021 11:20:58'!
4386
4436
reset
4387
4437
        super reset.
4388
 
        freePoint _ constrainedPoint _ nil! !
 
4438
        freePoint := constrainedPoint := nil! !
4389
4439
 
4390
4440
!DrGLocusBuilder methodsFor: 'private'!
4391
4441
addItem: aMathItemCollection at: aPoint 
4392
4442
        super addItem: aMathItemCollection at: aPoint.
4393
4443
        aMathItemCollection first isPointItemOnCurve
4394
4444
                ifTrue: [freePoint
4395
 
                                ifNil: [freePoint _ aMathItemCollection first.
 
4445
                                ifNil: [freePoint := aMathItemCollection first.
4396
4446
                                        ^ self].
4397
4447
                        constrainedPoint
4398
 
                                ifNil: [constrainedPoint _ aMathItemCollection first]]
 
4448
                                ifNil: [constrainedPoint := aMathItemCollection first]]
4399
4449
                ifFalse: [constrainedPoint
4400
 
                                ifNil: [constrainedPoint _ aMathItemCollection first.
 
4450
                                ifNil: [constrainedPoint := aMathItemCollection first.
4401
4451
                                        ^ self].
4402
4452
                        freePoint
4403
 
                                ifNil: [freePoint _ aMathItemCollection first]]! !
 
4453
                                ifNil: [freePoint := aMathItemCollection first]]! !
4404
4454
 
4405
4455
!DrGLocusBuilder methodsFor: 'constant'!
4406
4456
mathItemClass
4477
4527
 
4478
4528
!DrGMacroBuilder methodsFor: 'accessing'!
4479
4529
description: string
4480
 
        description _ string asString! !
 
4530
        description := string asString! !
4481
4531
 
4482
4532
!DrGMacroBuilder methodsFor: 'accessing'!
4483
4533
input
4505
4555
 
4506
4556
!DrGMacroBuilder methodsFor: 'accessing'!
4507
4557
title: string
4508
 
        title _ string! !
 
4558
        title := string! !
4509
4559
 
4510
4560
!DrGMacroBuilder methodsFor: 'private'!
4511
4561
addItem: aMathItemCollection at: aPoint
4538
4588
        "we receive notification from the wizard the user change the wizard
4539
4589
        current page"
4540
4590
        | newState |
4541
 
        (integer = 1 or: [ integer = 4 ]) ifTrue: [ newState _ DrGMacroToolStateNeutral ].
4542
 
        integer = 2 ifTrue: [ newState _ DrGMacroBuildToolStateInput ].
4543
 
        integer = 3 ifTrue: [ newState _ DrGMacroBuildToolStateOutput ].
 
4591
        (integer = 1 or: [ integer = 4 ]) ifTrue: [ newState := DrGMacroToolStateNeutral ].
 
4592
        integer = 2 ifTrue: [ newState := DrGMacroBuildToolStateInput ].
 
4593
        integer = 3 ifTrue: [ newState := DrGMacroBuildToolStateOutput ].
4544
4594
        integer = 4 ifTrue: [DrGeoSystem showVirtualKeyboard: true].
4545
4595
        self 
4546
4596
                triggerEvent: #changedState
4553
4603
!DrGMacroBuilder methodsFor: 'building'!
4554
4604
buildItem: domain 
4555
4605
        | macro |
4556
 
        macro _ DrGMacro new
 
4606
        macro := DrGMacro new
4557
4607
                title: title; description: description.
4558
4608
        macro   from: input to: output  in: domain.
4559
4609
        ^ macro! !
4571
4621
!DrGMacroBuilder methodsFor: 'initialize-release' stamp: 'hlsf 4/6/2022 16:35:50'!
4572
4622
initialize
4573
4623
        self reset.
4574
 
        wizard _ DrGWizardMacroBuild open: self ::
 
4624
        wizard := (DrGWizardMacroBuild open: self) 
4575
4625
                addPages;
4576
4626
                openInWorld.
4577
4627
        wizard morphPosition: 0@0.
4583
4633
release
4584
4634
        wizard removeActionsWithReceiver: self.
4585
4635
        wizard delete.
4586
 
        wizard _ nil! !
 
4636
        wizard := nil! !
4587
4637
 
4588
4638
!DrGMacroBuilder methodsFor: 'updating' stamp: 'hlsf 11/3/2021 19:07:55'!
4589
4639
reset
4590
4640
        super reset.
4591
 
        input _ OrderedCollection new.
4592
 
        output _ OrderedCollection new.
4593
 
        title _ self defaultTitle.
4594
 
        description _ self defaultDescription.
 
4641
        input := OrderedCollection new.
 
4642
        output := OrderedCollection new.
 
4643
        title := self defaultTitle.
 
4644
        description := self defaultDescription.
4595
4645
        self changed: #inputNames.
4596
4646
        self changed: #ouputNames.
4597
4647
        self changed: #title.
4632
4682
        current page"
4633
4683
        | newState |
4634
4684
        integer = 1 
4635
 
                ifTrue: [ newState _ DrGMacroToolStateNeutral ]
4636
 
                ifFalse: [ newState _ DrGMacroPlayToolStateSelect].
 
4685
                ifTrue: [ newState := DrGMacroToolStateNeutral ]
 
4686
                ifFalse: [ newState := DrGMacroPlayToolStateSelect].
4637
4687
        self 
4638
4688
                triggerEvent: #changedState
4639
4689
                with: newState! !
4669
4719
!DrGMacroPlayer methodsFor: 'accessing'!
4670
4720
selectedMacro: aMacro
4671
4721
        "Some cleaning are needed"
4672
 
        selectedMacro _ aMacro.
4673
 
        input _ OrderedCollection new.
 
4722
        selectedMacro := aMacro.
 
4723
        input := OrderedCollection new.
4674
4724
        self triggerEvent: #changedMacro.! !
4675
4725
 
4676
4726
!DrGMacroPlayer methodsFor: 'initialize-release' stamp: 'hlsf 4/6/2022 16:34:27'!
4677
4727
initialize
4678
 
        wizard _ DrGWizardMacroPlay open: self :: 
 
4728
        wizard := (DrGWizardMacroPlay open: self) 
4679
4729
                addPages;
4680
4730
                openInWorld.
4681
4731
        wizard morphPosition: 0@0.
4682
 
        input _ OrderedCollection new.
 
4732
        input := OrderedCollection new.
4683
4733
        wizard when: #page send: #page: to: self.
4684
4734
        wizard when: #cancel send: #cancel to: self! !
4685
4735
 
4687
4737
release
4688
4738
        wizard removeActionsWithReceiver: self.
4689
4739
        wizard delete.
4690
 
        wizard _ nil! !
 
4740
        wizard := nil! !
4691
4741
 
4692
4742
!DrGMacroPlayer methodsFor: 'testing'!
4693
4743
isWanted: aMathItemCollection
4702
4752
!DrGMacroPlayer methodsFor: 'updating' stamp: 'hlsf 11/19/2021 11:01:22'!
4703
4753
reset
4704
4754
        super reset.
4705
 
        input _ OrderedCollection new.
4706
 
        selectedMacro _ nil.
 
4755
        input := OrderedCollection new.
 
4756
        selectedMacro := nil.
4707
4757
        self changed: #description.
4708
4758
        self flag: #drgeoTodo
4709
4759
        "wizard changed: #selectedMacro"! !
4718
4768
 
4719
4769
!DrGMacroPlayerHeadless methodsFor: 'initialize-release'!
4720
4770
initialize 
4721
 
        input _ OrderedCollection new.
 
4771
        input := OrderedCollection new.
4722
4772
! !
4723
4773
 
4724
4774
!DrGMacroPlayerHeadless methodsFor: 'initialize-release'!
4727
4777
!DrGMiddleBuilder methodsFor: 'updating' stamp: 'hlsf 6/20/2021 11:21:14'!
4728
4778
reset
4729
4779
        super reset.
4730
 
        pointA _ pointB _ segment _ nil! !
 
4780
        pointA := pointB := segment := nil! !
4731
4781
 
4732
4782
!DrGMiddleBuilder methodsFor: 'accessing'!
4733
4783
arguments
4756
4806
        aMathItemCollection first isPointItem 
4757
4807
                ifTrue:
4758
4808
                        [pointA ifNil: 
4759
 
                                [pointA _ aMathItemCollection first.
 
4809
                                [pointA := aMathItemCollection first.
4760
4810
                                ^self].
4761
4811
                        pointB ifNil:
4762
 
                                [pointB _ aMathItemCollection  first.
 
4812
                                [pointB := aMathItemCollection  first.
4763
4813
                                ^self]]
4764
 
                ifFalse: [segment _ aMathItemCollection  first]! !
 
4814
                ifFalse: [segment := aMathItemCollection  first]! !
4765
4815
 
4766
4816
!DrGMiddleBuilder class methodsFor: 'documentation'!
4767
4817
description 
4782
4832
        super addItem: aMathItemCollection at: aPoint.
4783
4833
        aMathItemCollection first isScriptItem 
4784
4834
                ifTrue: 
4785
 
                        [script _ aMathItemCollection first]
 
4835
                        [script := aMathItemCollection first]
4786
4836
                ifFalse: 
4787
4837
                        [valueX 
4788
 
                                ifNil: [valueX _ aMathItemCollection first.]
4789
 
                                ifNotNil: [valueY ifNil: [valueY _ aMathItemCollection first]]]! !
 
4838
                                ifNil: [valueX := aMathItemCollection first.]
 
4839
                                ifNotNil: [valueY ifNil: [valueY := aMathItemCollection first]]]! !
4790
4840
 
4791
4841
!DrGPointByCoordinatesBuilder methodsFor: 'accessing'!
4792
4842
arguments
4812
4862
!DrGPointByCoordinatesBuilder methodsFor: 'updating' stamp: 'hlsf 6/20/2021 11:21:26'!
4813
4863
reset
4814
4864
        super reset.
4815
 
        script _ valueX _ valueY _ nil! !
 
4865
        script := valueX := valueY := nil! !
4816
4866
 
4817
4867
!DrGPointByCoordinatesBuilder class methodsFor: 'documentation'!
4818
4868
description
4830
4880
addItem: aMathItemCollection at: aPoint
4831
4881
        super addItem: aMathItemCollection at: aPoint.
4832
4882
        curveItemA ifNil: [
4833
 
                curveItemA _ aMathItemCollection first.
 
4883
                curveItemA := aMathItemCollection first.
4834
4884
                ^self].
4835
 
        curveItemB ifNil: [curveItemB _ aMathItemCollection first]
 
4885
        curveItemB ifNil: [curveItemB := aMathItemCollection first]
4836
4886
! !
4837
4887
 
4838
4888
!DrGPointIntersectionBuilder methodsFor: 'testing'!
4859
4909
postProcess: item from: node
4860
4910
        |k|
4861
4911
        super postProcess: item from: node.
4862
 
        k _  (node attributeAt: 'extra') asNumber = 0 ifTrue: [-1] ifFalse: [1].
 
4912
        k :=  (node attributeAt: 'extra') asNumber = 0 ifTrue: [-1] ifFalse: [1].
4863
4913
        item k: k! !
4864
4914
 
4865
4915
!DrGPointIntersectionBuilder methodsFor: 'updating'!
4873
4923
!DrGPointIntersectionBuilder methodsFor: 'updating' stamp: 'hlsf 6/20/2021 11:21:30'!
4874
4924
reset
4875
4925
        super reset.
4876
 
        curveItemA _ curveItemB _ nil! !
 
4926
        curveItemA := curveItemB := nil! !
4877
4927
 
4878
4928
!DrGPointIntersectionBuilder methodsFor: 'xml' stamp: 'hlsf 9/25/2021 14:44:19'!
4879
4929
itemInstanceFrom: node
4880
4930
        "We only want intersection point"
4881
4931
        |arguments k|
4882
 
        arguments _ self parentsById: node.
 
4932
        arguments := self parentsById: node.
4883
4933
        "We by-pass the builder because it requires the user mouse position at intersection request "
4884
 
        k _  (node attributeAt: 'extra') asNumber = 0 ifTrue: [-1] ifFalse: [1].
 
4934
        k :=  (node attributeAt: 'extra') asNumber = 0 ifTrue: [-1] ifFalse: [1].
4885
4935
        ^self mathItemClass newWith: arguments k: k.! !
4886
4936
 
4887
4937
!DrGPointIntersectionBuilder class methodsFor: 'documentation'!
4896
4946
addToFlyingItem: anItem
4897
4947
        self isNotInteractive ifTrue: [^self].
4898
4948
        points size = 2 ifTrue: [
4899
 
                movingPoint _ DrGPointFreeItem new point: anItem point + (0.1 @ 0.1).
4900
 
                flyingItem _ self mathItemClass 
 
4949
                movingPoint := DrGPointFreeItem new point: anItem point + (0.1 @ 0.1).
 
4950
                flyingItem := self mathItemClass 
4901
4951
                        newWith: ((OrderedCollection withAll: points) add: movingPoint; yourself).
4902
4952
                self initializeFlyingMorph].
4903
4953
        points size > 2 ifTrue: [
4904
 
                movingPoint _ DrGPointFreeItem new point: anItem point + (0.1 @ 0.1).
 
4954
                movingPoint := DrGPointFreeItem new point: anItem point + (0.1 @ 0.1).
4905
4955
                flyingItem parents: (flyingItem parents
4906
4956
                                                                add: movingPoint;
4907
4957
                                                                yourself).
4917
4967
 
4918
4968
!DrGPolygonBuilder methodsFor: 'initialize-release'!
4919
4969
initialize
4920
 
        points _ OrderedCollection new.
 
4970
        points := OrderedCollection new.
4921
4971
! !
4922
4972
 
4923
4973
!DrGPolygonBuilder methodsFor: 'accessing'!
4946
4996
parentsById: node
4947
4997
        |arguments|
4948
4998
        "To instantiate a polygon we need the first summit to be duplucated at the end of the point collection"
4949
 
        arguments _ super parentsById: node.
 
4999
        arguments := super parentsById: node.
4950
5000
        arguments addLast: arguments first.
4951
5001
        ^ arguments ! !
4952
5002
 
4953
5003
!DrGPolygonBuilder methodsFor: 'updating'!
4954
5004
reset
4955
5005
        super reset.
4956
 
        points _ OrderedCollection new! !
 
5006
        points := OrderedCollection new! !
4957
5007
 
4958
5008
!DrGPolygonBuilder class methodsFor: 'documentation'!
4959
5009
description
4967
5017
addItem: aMathItemCollection at: aPoint
4968
5018
| item |
4969
5019
        super addItem: aMathItemCollection at: aPoint.
4970
 
        item _ aMathItemCollection first.
 
5020
        item := aMathItemCollection first.
4971
5021
        item isPointItem ifTrue: [
4972
 
                center isNil ifTrue: [^ center _ item].
4973
 
                pointA isNil ifTrue: [^ pointA _ item]].
 
5022
                center isNil ifTrue: [^ center := item].
 
5023
                pointA isNil ifTrue: [^ pointA := item]].
4974
5024
        (item isValueItem and: [value isNil]) ifTrue: [
4975
 
                value _ item]! !
 
5025
                value := item]! !
4976
5026
 
4977
5027
!DrGPolygonRegularBuilder methodsFor: 'accessing'!
4978
5028
arguments
4991
5041
!DrGPolygonRegularBuilder methodsFor: 'updating' stamp: 'hlsf 6/20/2021 11:21:37'!
4992
5042
reset
4993
5043
        super reset.
4994
 
        center _ pointA _ value _ nil! !
 
5044
        center := pointA := value := nil! !
4995
5045
 
4996
5046
!DrGPolygonRegularBuilder methodsFor: 'constant'!
4997
5047
mathItemClass 
5015
5065
        current page"
5016
5066
        | newState |
5017
5067
        integer = 1 
5018
 
                ifTrue: [ newState _ DrGMacroToolStateNeutral ]
5019
 
                ifFalse: [ newState _ DrGMacroPlayToolStateSelect].
 
5068
                ifTrue: [ newState := DrGMacroToolStateNeutral ]
 
5069
                ifFalse: [ newState := DrGMacroPlayToolStateSelect].
5020
5070
        self 
5021
5071
                triggerEvent: #changedState
5022
5072
                with: newState! !
5025
5075
basicItemFrom: node
5026
5076
"create a scrip item then set its script from the xml node information"
5027
5077
| item |
5028
 
        item _ super basicItemFrom: node.
 
5078
        item := super basicItemFrom: node.
5029
5079
        item script: (node attributeAt: #class) asClass.
5030
5080
        ^ item! !
5031
5081
 
5045
5095
release
5046
5096
        self removeEvents.
5047
5097
        wizard delete.
5048
 
        wizard _ nil! !
 
5098
        wizard := nil! !
5049
5099
 
5050
5100
!DrGScriptPlayer methodsFor: 'private'!
5051
5101
addItem: aMathItemCollection at: aPoint
5052
5102
"Take the point position only when the user clic somewhere in the background"
5053
5103
        aMathItemCollection ifEmpty: 
5054
 
                [point _ aPoint.
 
5104
                [point := aPoint.
5055
5105
                ^self].
5056
5106
        input size < scriptClass argumentsType size
5057
5107
                ifTrue: [self addToggleItem: aMathItemCollection in: input]
5081
5131
!DrGScriptPlayer methodsFor: 'testing'!
5082
5132
reset
5083
5133
        super reset.
5084
 
        input _ OrderedCollection new.! !
 
5134
        input := OrderedCollection new.! !
5085
5135
 
5086
5136
!DrGScriptPlayer methodsFor: 'accessing'!
5087
5137
arguments
5096
5146
        ^ scriptClass
5097
5147
                ifNil: ['']
5098
5148
                ifNotNil: 
5099
 
                        [comment _ scriptClass description.
 
5149
                        [comment := scriptClass description.
5100
5150
                        comment isEmpty 
5101
5151
                                ifTrue: ['No description, write one in the description method of this script.' translated]
5102
5152
                                ifFalse: [comment]]! !
5116
5166
 
5117
5167
!DrGScriptPlayer methodsFor: 'accessing'!
5118
5168
scriptClass: anObject
5119
 
        scriptClass _ anObject.
5120
 
        input _ OrderedCollection new.
 
5169
        scriptClass := anObject.
 
5170
        input := OrderedCollection new.
5121
5171
        self triggerEvent: #changedScript.! !
5122
5172
 
5123
5173
!DrGScriptPlayer methodsFor: 'initialize-release'!
5124
5174
basicInitialize
5125
 
        input _ OrderedCollection new.! !
 
5175
        input := OrderedCollection new.! !
5126
5176
 
5127
5177
!DrGScriptPlayer methodsFor: 'initialize-release' stamp: 'hlsf 4/6/2022 16:36:57'!
5128
5178
initialize
5129
 
        wizard _ DrGWizardScript open: self ::
 
5179
        wizard := (DrGWizardScript open: self)
5130
5180
                addPages;
5131
5181
                openInWorld.
5132
 
        input _ OrderedCollection new.
 
5182
        input := OrderedCollection new.
5133
5183
        wizard when: #page send: #page: to: self.
5134
5184
        wizard when: #cancel send: #cancel to: self.! !
5135
5185
 
5141
5191
basicItemFrom: node
5142
5192
"create a basic item (unitialised) from this node and add it to the domain, return an item partially initialized. Use for macro node"
5143
5193
        | builder |
5144
 
        builder _ self basicNew basicInitialize.
 
5194
        builder := self basicNew basicInitialize.
5145
5195
        ^ builder basicItemFrom: node! !
5146
5196
 
5147
5197
!DrGScriptPlayer class methodsFor: 'xml' stamp: 'hlsf 8/4/2023 17:29:25'!
5161
5211
 
5162
5212
!DrGScriptPlayerHeadless methodsFor: 'as yet unclassified'!
5163
5213
initialize
5164
 
        input _ OrderedCollection new.! !
 
5214
        input := OrderedCollection new.! !
5165
5215
 
5166
5216
!DrGScriptPlayerHeadless methodsFor: 'as yet unclassified'!
5167
5217
release! !
5179
5229
!DrGSegmentBuilder methodsFor: 'updating' stamp: 'hlsf 6/20/2021 11:21:41'!
5180
5230
reset
5181
5231
        super reset.
5182
 
        pointA _ pointB _ nil! !
 
5232
        pointA := pointB := nil! !
5183
5233
 
5184
5234
!DrGSegmentBuilder methodsFor: 'accessing'!
5185
5235
arguments
5202
5252
addItem: aMathItemCollection at: aPoint
5203
5253
        super addItem: aMathItemCollection  at: aPoint.
5204
5254
        pointA ifNil: 
5205
 
                [pointA _ aMathItemCollection first.
 
5255
                [pointA := aMathItemCollection first.
5206
5256
                self addToFlyingItem: pointA.
5207
5257
                ^ self].
5208
 
        pointB ifNil: [ pointB _ aMathItemCollection first]
 
5258
        pointB ifNil: [ pointB := aMathItemCollection first]
5209
5259
        ! !
5210
5260
 
5211
5261
!DrGSegmentBuilder class methodsFor: 'documentation'!
5237
5287
!DrGCircleBuilder methodsFor: 'private'!
5238
5288
addItem: aMathItemCollection at: aPoint 
5239
5289
        |item|
5240
 
        point _ aPoint.
5241
 
        (item _ aMathItemCollection first) isSegmentItem ifTrue: [
5242
 
                ^ segment ifNil: [segment _ item]].
 
5290
        point := aPoint.
 
5291
        (item := aMathItemCollection first) isSegmentItem ifTrue: [
 
5292
                ^ segment ifNil: [segment := item]].
5243
5293
        item isValueItem ifTrue: [
5244
 
                ^ radius ifNil: [radius _ item]].
 
5294
                ^ radius ifNil: [radius := item]].
5245
5295
        ^ pointA 
5246
 
                ifNil: [pointA _ item.
 
5296
                ifNil: [pointA := item.
5247
5297
                        self addToFlyingItem: pointA]
5248
 
                ifNotNil: [pointB _ item]! !
 
5298
                ifNotNil: [pointB := item]! !
5249
5299
 
5250
5300
!DrGCircleBuilder methodsFor: 'flying costume' stamp: 'hlsf 4/12/2021 22:04:35'!
5251
5301
flyingMorphClass
5262
5312
!DrGCircleBuilder methodsFor: 'updating'!
5263
5313
reset
5264
5314
        super reset.
5265
 
        radius _ nil.
5266
 
        segment _ nil.! !
 
5315
        radius := nil.
 
5316
        segment := nil.! !
5267
5317
 
5268
5318
!DrGCircleBuilder methodsFor: 'constant'!
5269
5319
mathItemClass
5301
5351
!DrGAngleBisectorBuilder methodsFor: 'private'!
5302
5352
addItem: aMathItemCollection at: aPoint
5303
5353
        | item |
5304
 
        point _ aPoint.
5305
 
        (item _ aMathItemCollection first) isAngleItem ifTrue: [^ angle ifNil: [angle := item]].
 
5354
        point := aPoint.
 
5355
        (item := aMathItemCollection first) isAngleItem ifTrue: [^ angle ifNil: [angle := item]].
5306
5356
        pointA 
5307
 
                ifNil: [pointA _ item] 
 
5357
                ifNil: [pointA := item] 
5308
5358
                ifNotNil: [pointB 
5309
 
                        ifNil: [pointB _ item.
 
5359
                        ifNil: [pointB := item.
5310
5360
                                self addToFlyingItem: pointB] 
5311
 
                        ifNotNil: [pointC _ item]]! !
 
5361
                        ifNotNil: [pointC := item]]! !
5312
5362
 
5313
5363
!DrGAngleBisectorBuilder methodsFor: 'accessing'!
5314
5364
arguments
5319
5369
!DrGAngleBisectorBuilder methodsFor: 'updating' stamp: 'hlsf 6/20/2021 11:21:47'!
5320
5370
reset
5321
5371
        super reset.
5322
 
        pointC _ angle _ nil
 
5372
        pointC := angle := nil
5323
5373
        ! !
5324
5374
 
5325
5375
!DrGAngleBisectorBuilder methodsFor: 'constant'!
5336
5386
isWanted: aMathItemCollection
5337
5387
        | item |
5338
5388
        ^ aMathItemCollection notEmpty 
5339
 
                and: [((item _ aMathItemCollection first) isPointItem 
 
5389
                and: [((item := aMathItemCollection first) isPointItem 
5340
5390
                                and: [item ~= pointA 
5341
5391
                                and: [item  ~= pointB]])
5342
5392
                        or:     [item isAngleItem and: [pointA isNil and: [item nodeType = #'3pts']]]]  ! !
5378
5428
!DrGParallelBuilder methodsFor: 'updating' stamp: 'hlsf 6/20/2021 11:22:00'!
5379
5429
reset
5380
5430
        super reset.
5381
 
        pointA _ direction _ nil! !
 
5431
        pointA := direction := nil! !
5382
5432
 
5383
5433
!DrGParallelBuilder methodsFor: 'private'!
5384
5434
addItem: aMathItemCollection at: aPoint
5385
 
        point _ aPoint.
 
5435
        point := aPoint.
5386
5436
        aMathItemCollection first isPointItem 
5387
 
                ifTrue: [pointA _ aMathItemCollection first].
 
5437
                ifTrue: [pointA := aMathItemCollection first].
5388
5438
        aMathItemCollection first isDirectionItem 
5389
 
                ifTrue:[direction _ aMathItemCollection first.
 
5439
                ifTrue:[direction := aMathItemCollection first.
5390
5440
                        self addToFlyingItem: direction].
5391
5441
        ! !
5392
5442
 
5418
5468
isWanted: aMathItemCollection
5419
5469
| item |
5420
5470
        ^ aMathItemCollection notEmpty 
5421
 
                and: [((item _ aMathItemCollection first) isPointItem 
 
5471
                and: [((item := aMathItemCollection first) isPointItem 
5422
5472
                and: [item ~= pointA])
5423
5473
                        or: [item isSegmentItem and: [pointA isNil]]]! !
5424
5474
 
5430
5480
!DrGPerpendicularBisectorBuilder methodsFor: 'updating'!
5431
5481
reset
5432
5482
        super reset.
5433
 
        segment _ nil! !
 
5483
        segment := nil! !
5434
5484
 
5435
5485
!DrGPerpendicularBisectorBuilder methodsFor: 'accessing'!
5436
5486
arguments 
5441
5491
!DrGPerpendicularBisectorBuilder methodsFor: 'private'!
5442
5492
addItem: aMathItemCollection at: aPoint
5443
5493
        | item |
5444
 
        point _ aPoint.
5445
 
        (item _ aMathItemCollection first) isSegmentItem ifTrue: 
5446
 
                [^segment ifNil: [segment _ item]].
 
5494
        point := aPoint.
 
5495
        (item := aMathItemCollection first) isSegmentItem ifTrue: 
 
5496
                [^segment ifNil: [segment := item]].
5447
5497
        pointA 
5448
 
                ifNil: [pointA _ item.
 
5498
                ifNil: [pointA := item.
5449
5499
                        self addToFlyingItem: pointA.]
5450
 
                ifNotNil: [pointB _ item]
 
5500
                ifNotNil: [pointB := item]
5451
5501
        ! !
5452
5502
 
5453
5503
!DrGPerpendicularBisectorBuilder methodsFor: 'constant'!
5557
5607
!DrGReflectionBuilder methodsFor: 'constant' stamp: 'hlsf 5/31/2021 18:57:50'!
5558
5608
mathItemClass: aMathItem
5559
5609
        |className|
5560
 
        className _ 'DrG', aMathItem basicType capitalized, 'ReflexionItem'.
 
5610
        className := 'DrG', aMathItem basicType capitalized, 'ReflexionItem'.
5561
5611
        ^(Smalltalk classNamed: className)! !
5562
5612
 
5563
5613
!DrGReflectionBuilder methodsFor: 'accessing'!
5580
5630
addItem: aMathItemCollection at: aPoint
5581
5631
        super addItem: aMathItemCollection  at: aPoint.
5582
5632
        (aMathItemCollection first isLineItem and: [axe isNil])
5583
 
                ifTrue: [axe _ aMathItemCollection first]
5584
 
                ifFalse: [mathItem _ aMathItemCollection first]! !
 
5633
                ifTrue: [axe := aMathItemCollection first]
 
5634
                ifFalse: [mathItem := aMathItemCollection first]! !
5585
5635
 
5586
5636
!DrGReflectionBuilder methodsFor: 'updating' stamp: 'hlsf 6/20/2021 11:22:05'!
5587
5637
reset
5588
5638
        super reset.
5589
 
        axe _ mathItem _ nil! !
 
5639
        axe := mathItem := nil! !
5590
5640
 
5591
5641
!DrGReflectionBuilder class methodsFor: 'documentation'!
5592
5642
description
5611
5661
addItem: aMathItemCollection at: aPoint
5612
5662
        super addItem: aMathItemCollection at: aPoint.
5613
5663
        (aMathItemCollection first isPointItem and: [center isNil])
5614
 
                ifTrue: [center _ aMathItemCollection first. ^self].
 
5664
                ifTrue: [center := aMathItemCollection first. ^self].
5615
5665
        (aMathItemCollection first isValueItem and: [value isNil])
5616
 
                ifTrue: [value _ aMathItemCollection first. ^self].
5617
 
        mathItem _ aMathItemCollection first! !
 
5666
                ifTrue: [value := aMathItemCollection first. ^self].
 
5667
        mathItem := aMathItemCollection first! !
5618
5668
 
5619
5669
!DrGRotationBuilder methodsFor: 'accessing'!
5620
5670
arguments: aMathItem
5623
5673
!DrGRotationBuilder methodsFor: 'updating' stamp: 'hlsf 6/20/2021 11:22:14'!
5624
5674
reset
5625
5675
        super reset.
5626
 
        center _ value _ mathItem _ nil! !
 
5676
        center := value := mathItem := nil! !
5627
5677
 
5628
5678
!DrGRotationBuilder methodsFor: 'constant' stamp: 'hlsf 5/31/2021 18:57:54'!
5629
5679
mathItemClass: aMathItem
5630
5680
        |className|
5631
 
        className _ 'DrG', aMathItem basicType capitalized, 'RotationItem'.
 
5681
        className := 'DrG', aMathItem basicType capitalized, 'RotationItem'.
5632
5682
        ^(Smalltalk classNamed: className)! !
5633
5683
 
5634
5684
!DrGRotationBuilder class methodsFor: 'documentation'!
5642
5692
!DrGHomothetyBuilder methodsFor: 'constant' stamp: 'hlsf 5/31/2021 18:57:39'!
5643
5693
mathItemClass: aMathItem
5644
5694
        |className|
5645
 
        className _ 'DrG', aMathItem basicType capitalized, 'HomothetyItem'.
 
5695
        className := 'DrG', aMathItem basicType capitalized, 'HomothetyItem'.
5646
5696
        ^(Smalltalk classNamed: className)! !
5647
5697
 
5648
5698
!DrGHomothetyBuilder class methodsFor: 'documentation'!
5660
5710
!DrGSymmetryBuilder methodsFor: 'updating' stamp: 'hlsf 6/20/2021 11:22:17'!
5661
5711
reset
5662
5712
        super reset.
5663
 
        mathItem _ center _ nil! !
 
5713
        mathItem := center := nil! !
5664
5714
 
5665
5715
!DrGSymmetryBuilder methodsFor: 'testing'!
5666
5716
isWanted: aMathItemCollection 
5678
5728
addItem: aMathItemCollection at: aPoint
5679
5729
        super addItem: aMathItemCollection at: aPoint.
5680
5730
        (aMathItemCollection first isPointItem and: [center isNil])
5681
 
                ifTrue: [center _ aMathItemCollection first]
5682
 
                ifFalse: [mathItem _ aMathItemCollection first]! !
 
5731
                ifTrue: [center := aMathItemCollection first]
 
5732
                ifFalse: [mathItem := aMathItemCollection first]! !
5683
5733
 
5684
5734
!DrGSymmetryBuilder methodsFor: 'constant' stamp: 'hlsf 5/31/2021 18:58:02'!
5685
5735
mathItemClass: aMathItem
5686
5736
        |className|
5687
 
        className _ 'DrG', aMathItem basicType capitalized, 'SymmetryItem'.
 
5737
        className := 'DrG', aMathItem basicType capitalized, 'SymmetryItem'.
5688
5738
        ^(Smalltalk classNamed: className)! !
5689
5739
 
5690
5740
!DrGSymmetryBuilder class methodsFor: 'documentation'!
5698
5748
!DrGTranslationBuilder methodsFor: 'constant' stamp: 'hlsf 5/31/2021 18:58:11'!
5699
5749
mathItemClass: aMathItem
5700
5750
        |className|
5701
 
        className _ 'DrG', aMathItem basicType capitalized, 'TranslationItem'.
 
5751
        className := 'DrG', aMathItem basicType capitalized, 'TranslationItem'.
5702
5752
        ^(Smalltalk classNamed: className)! !
5703
5753
 
5704
5754
!DrGTranslationBuilder methodsFor: 'accessing'!
5721
5771
!DrGTranslationBuilder methodsFor: 'updating' stamp: 'hlsf 6/20/2021 11:22:22'!
5722
5772
reset
5723
5773
        super reset.
5724
 
        vector _ mathItem _ nil.! !
 
5774
        vector := mathItem := nil.! !
5725
5775
 
5726
5776
!DrGTranslationBuilder methodsFor: 'private'!
5727
5777
addItem: aMathItemCollection at: aPoint
5728
5778
        super addItem: aMathItemCollection at: aPoint.
5729
5779
        (aMathItemCollection first isVectorItem and: [vector isNil])
5730
 
                ifTrue: [vector _ aMathItemCollection first]
5731
 
                ifFalse: [mathItem _ aMathItemCollection first]! !
 
5780
                ifTrue: [vector := aMathItemCollection first]
 
5781
                ifFalse: [mathItem := aMathItemCollection first]! !
5732
5782
 
5733
5783
!DrGTranslationBuilder class methodsFor: 'documentation'!
5734
5784
description
5753
5803
        aMathItemCollection first isPointItem 
5754
5804
                ifTrue: 
5755
5805
                        [pointA ifNil:
5756
 
                                [pointA _ aMathItemCollection first.
 
5806
                                [pointA := aMathItemCollection first.
5757
5807
                                ^self].
5758
5808
                        pointB ifNil:
5759
 
                                [pointB _ aMathItemCollection first.
 
5809
                                [pointB := aMathItemCollection first.
5760
5810
                                ^self]]
5761
 
                ifFalse: [curveItem _ aMathItemCollection first]! !
 
5811
                ifFalse: [curveItem := aMathItemCollection first]! !
5762
5812
 
5763
5813
!DrGValueBuilder methodsFor: 'xml'!
5764
5814
itemInstanceFrom: node
5802
5852
!DrGValueBuilder methodsFor: 'updating' stamp: 'hlsf 6/20/2021 11:22:28'!
5803
5853
reset
5804
5854
        super reset.
5805
 
        pointA _ pointB _ curveItem _ nil! !
 
5855
        pointA := pointB := curveItem := nil! !
5806
5856
 
5807
5857
!DrGValueBuilder methodsFor: 'testing'!
5808
5858
isWanted: aMathItemCollection 
5842
5892
!DrGCommandStack methodsFor: 'private'!
5843
5893
truncate
5844
5894
        |oldReadLimit|
5845
 
        oldReadLimit _ readLimit.
5846
 
        readLimit _ position.
 
5895
        oldReadLimit := readLimit.
 
5896
        readLimit := position.
5847
5897
        oldReadLimit > readLimit ifTrue:
5848
5898
                        [readLimit to: oldReadLimit do:
5849
5899
                                [:index| collection at: index + 1 put: nil]]! !
5882
5932
 
5883
5933
!DrGLocusSample methodsFor: 'accessing'!
5884
5934
isValid: aBoolean
5885
 
        ^ exist _ aBoolean ! !
 
5935
        ^ exist := aBoolean ! !
5886
5936
 
5887
5937
!DrGLocusSample methodsFor: 'accessing'!
5888
5938
offScreen: aBoolean
5889
 
        offScreen  _ aBoolean ! !
 
5939
        offScreen  := aBoolean ! !
5890
5940
 
5891
5941
!DrGLocusSample methodsFor: 'accessing'!
5892
5942
pointScreen
5896
5946
!DrGLocusSample methodsFor: 'accessing'!
5897
5947
pointScreen: anObject
5898
5948
 
5899
 
        pointScreen _ anObject! !
 
5949
        pointScreen := anObject! !
5900
5950
 
5901
5951
!DrGLocusSample methodsFor: 'accessing'!
5902
5952
pointWorld
5906
5956
!DrGLocusSample methodsFor: 'accessing'!
5907
5957
pointWorld: anObject
5908
5958
 
5909
 
        pointWorld _ anObject! !
 
5959
        pointWorld := anObject! !
5910
5960
 
5911
5961
!DrGLocusSample methodsFor: 'accessing'!
5912
5962
x
5916
5966
!DrGLocusSample methodsFor: 'accessing'!
5917
5967
x: anObject
5918
5968
 
5919
 
        abscissa _ anObject! !
 
5969
        abscissa := anObject! !
5920
5970
 
5921
5971
!DrGeoMiniView methodsFor: 'accessing' stamp: 'hlsf 6/19/2021 10:07:28'!
5922
5972
drawable
5952
6002
scriptMenu: aMenu
5953
6003
self flag: #drgeoTodo! !
5954
6004
 
5955
 
!DrGeoMiniView methodsFor: 'initialize-release' stamp: 'hlsf 4/10/2022 17:18:04'!
 
6005
!DrGeoMiniView methodsFor: 'initialize-release' stamp: 'hlsf 3/30/2024 16:45:35'!
5956
6006
defaultColor
5957
 
        ^ `(Color r: 0.986 g: 0.986 b: 0.986)`! !
 
6007
        ^ Theme current paneBackgroundFrom: Theme current defaultWindowColor ! !
5958
6008
 
5959
6009
!DrGeoMiniView methodsFor: 'initialize-release'!
5960
6010
deleteWithoutConfirmation
5961
6011
        self delete! !
5962
6012
 
5963
 
!DrGeoMiniView methodsFor: 'initialize-release' stamp: 'hlsf 8/4/2023 17:43:30'!
 
6013
!DrGeoMiniView methodsFor: 'initialize-release' stamp: 'hlsf 3/30/2024 16:37:20'!
5964
6014
initialize
5965
6015
        super initialize.
5966
 
        self color: Color white.
 
6016
        self color: self defaultColor .
5967
6017
        drawable := DrGDrawable newOn: presenter .
5968
6018
        self morphExtent: 750@500! !
5969
6019
 
5982
6032
 
5983
6033
!DrGeoMiniView class methodsFor: 'instance creation' stamp: 'hlsf 8/4/2023 13:05:08'!
5984
6034
for: aPresenter
5985
 
        ^ self basicNew ::
 
6035
        ^ self basicNew 
5986
6036
                presenter: aPresenter ;
5987
6037
                initialize;
5988
6038
                beColumn;
6008
6058
                self morphPosition: itemMorph labelPosition].
6009
6059
! !
6010
6060
 
6011
 
!DrGLabel methodsFor: 'initialization' stamp: 'hlsf 4/11/2021 11:56:54'!
 
6061
!DrGLabel methodsFor: 'initialization' stamp: 'hlsf 4/12/2024 11:04:56'!
6012
6062
initialize
6013
6063
        super initialize.
6014
 
        blink _ false.
 
6064
        blink := false.
 
6065
        delta := 7@7.
6015
6066
        self font: DrGeoSystem canvasFont
6016
6067
! !
6017
6068
 
 
6069
!DrGLabel methodsFor: 'accessing' stamp: 'hlsf 4/12/2024 11:09:41'!
 
6070
delta
 
6071
        ^ delta! !
 
6072
 
 
6073
!DrGLabel methodsFor: 'accessing' stamp: 'hlsf 4/12/2024 11:09:52'!
 
6074
delta: aPoint
 
6075
        delta := aPoint! !
 
6076
 
6018
6077
!DrGLabel methodsFor: 'accessing' stamp: 'hlsf 4/11/2021 11:56:58'!
6019
6078
morph: aDrGMorph
6020
 
        itemMorph _ aDrGMorph! !
 
6079
        itemMorph := aDrGMorph! !
6021
6080
 
6022
6081
!DrGLabel methodsFor: 'stepping and presenter' stamp: 'hlsf 4/11/2021 11:57:02'!
6023
6082
startBlinking
6024
 
        blink _ true.
 
6083
        blink := true.
6025
6084
        self startStepping ! !
6026
6085
 
6027
6086
!DrGLabel methodsFor: 'stepping and presenter' stamp: 'hlsf 6/3/2022 11:37:32'!
6034
6093
 
6035
6094
!DrGLabel methodsFor: 'stepping and presenter' stamp: 'hlsf 4/11/2021 11:57:18'!
6036
6095
stopBlinking
6037
 
        blink _ false.
 
6096
        blink := false.
6038
6097
        self stopStepping.! !
6039
6098
 
6040
6099
!DrGLabel methodsFor: 'stepping and presenter' stamp: 'hlsf 4/11/2021 11:57:23'!
6052
6111
 
6053
6112
!DrGDebuggerWindow methodsFor: 'GUI building' stamp: 'hlsf 10/13/2022 15:09:14'!
6054
6113
buildLowerPanes
6055
 
        ^ LayoutMorph newColumn ::
 
6114
        ^ LayoutMorph newColumn 
6056
6115
                addMorph: self customButtonRow fixedHeight: self defaultButtonPaneHeight;
6057
6116
                addMorph: self buildMorphicCodePane proportionalHeight: 1.0;
6058
6117
                yourself! !
6059
6118
 
6060
 
!DrGDebuggerWindow methodsFor: 'GUI building' stamp: 'hlsf 10/13/2022 19:58:26'!
 
6119
!DrGDebuggerWindow methodsFor: 'GUI building' stamp: 'hlsf 4/28/2024 15:42:11'!
6061
6120
buildMorphicWindow
6062
6121
        "Open a full morphic debugger with the given label"
6063
6122
 
6068
6127
        "Instantiate, but not used on the GUI"
6069
6128
        self receiverInspectorText.
6070
6129
        
6071
 
        bottomMorph _ LayoutMorph newRow.
 
6130
        bottomMorph := LayoutMorph newRow.
6072
6131
        bottomMorph
6073
6132
                addAdjusterAndMorph: self contextVariableInspector proportionalWidth: 0.30;
6074
6133
                addAdjusterAndMorph: self contextVariableInspectorText proportionalWidth: 0.70.
6075
6134
 
6076
6135
        self layoutMorph
6077
 
                addAdjusterAndMorph: self buildLowerPanes proportionalHeight: 0.7;
 
6136
                addMorph: self stackList proportionalHeight: 0.1;
 
6137
                addAdjusterAndMorph: self buildLowerPanes proportionalHeight: 0.6;
6078
6138
                addAdjusterAndMorph: bottomMorph proportionalHeight: 0.3.! !
6079
6139
 
6080
 
!DrGDebuggerWindow methodsFor: 'GUI building' stamp: 'hlsf 10/13/2022 12:08:52'!
 
6140
!DrGDebuggerWindow methodsFor: 'GUI building' stamp: 'hlsf 4/10/2024 16:46:52'!
6081
6141
customButtonSpecs
6082
6142
        "Answer an array of elements of the form wording, selector, help-message, that characterize the custom button row of a debugger."
6083
6143
 
6084
6144
        ^{
6085
 
                {'Restart' translated . #               restart  .              'Restart the step by step execution from its start.' translated } .
6086
 
                {'Step'  translated .   #       doStep .                         'Execute the current message and go to the next message.' translated } .
 
6145
                {'Restart' translated . #restart         .              'Restart the step by step execution from its start.' translated } .
 
6146
                {'Step'  translated .   #doStep .                        'Execute the current message and go to the next message.' translated } .
6087
6147
                {'Step into'             translated . #stepIntoBlock             . 'Step into a block.' translated } .
6088
 
                {'Run to Cursor' translated . #         runToCursor      .      'Execute the code up to the cursor position.' translated }
 
6148
                {'Run to Cursor' translated . #runToCursor       .      'Execute the code up to the cursor position.' translated }
6089
6149
        }! !
6090
6150
 
6091
6151
!DrGDebuggerWindow methodsFor: 'GUI building' stamp: 'hlsf 10/13/2022 15:20:08'!
6096
6156
layerNumber
6097
6157
        ^ 50! !
6098
6158
 
6099
 
!DrGDebuggerWindow class methodsFor: 'instance creation' stamp: 'hlsf 10/19/2022 21:20:35'!
 
6159
!DrGDebuggerWindow class methodsFor: 'instance creation' stamp: 'hlsf 4/28/2024 15:41:23'!
6100
6160
open: model
6101
 
        ^ self new ::
 
6161
        | debuggerWindow |
 
6162
        debuggerWindow := self new
6102
6163
                model: model;
6103
 
                buildMorphicWindow;
6104
 
                yourself
 
6164
                buildMorphicWindow.
 
6165
        debuggerWindow widgetsColor: debuggerWindow windowColor.
 
6166
        ^ debuggerWindow        
6105
6167
! !
6106
6168
 
6107
6169
!DrGeoView methodsFor: 'initialization' stamp: 'hlsf 8/4/2023 12:40:38'!
6118
6180
        drawable := nil.
6119
6181
        presenter := nil! !
6120
6182
 
 
6183
!DrGeoView methodsFor: 'initialization' stamp: 'hlsf 3/30/2024 16:10:30'!
 
6184
windowColor
 
6185
        ^Theme current browser! !
 
6186
 
6121
6187
!DrGeoView methodsFor: 'stepping' stamp: 'hlsf 6/5/2021 11:00:04'!
6122
6188
step
6123
6189
        DrGeoSystem ifTablet: [
6190
6256
        descriptionLabel := LabelMorph contents: 'Description:' translated.
6191
6257
        labelsWidth := titleLabel morphWidth max: descriptionLabel morphWidth.
6192
6258
        row addMorph: titleLabel fixedWidth: labelsWidth.
6193
 
        tMorph := TextModelMorph textProvider: model textGetter: #title textSetter: #title: ::
 
6259
        tMorph := (TextModelMorph textProvider: model textGetter: #title textSetter: #title:)
6194
6260
                hideScrollBarsIndefinitely; 
6195
6261
                askBeforeDiscardingEdits: false.
6196
6262
        tMorph scroller 
6202
6268
        pane addMorph: row fixedHeight: titleLabel morphHeight.
6203
6269
        row :=  LayoutMorph newRow separation: 4.
6204
6270
        row addMorph: descriptionLabel fixedWidth: labelsWidth .
6205
 
        descrMorph := TextModelMorph textProvider: model textGetter: #description textSetter: #description: ::
 
6271
        descrMorph := (TextModelMorph textProvider: model textGetter: #description textSetter: #description:)
6206
6272
                askBeforeDiscardingEdits: false.
6207
6273
        descrMorph scroller 
6208
6274
                setProperty: #keyStroke: 
6218
6284
!DrGWizardMacroBuild methodsFor: 'pages' stamp: 'hlsf 12/27/2021 10:00:29'!
6219
6285
secondPage
6220
6286
| list pane |
6221
 
        list _ PluggableListMorph 
 
6287
        list := PluggableListMorph 
6222
6288
                model: model
6223
6289
                listGetter: #inputNames
6224
6290
                indexGetter:  nil
6225
6291
                indexSetter: nil.
6226
 
        pane _ self emptyPane 
 
6292
        pane := self emptyPane 
6227
6293
                addMorphUseAll: list;
6228
6294
                yourself.
6229
6295
        ^ (WizardPage standardPage: 'Select input parameters' translated on: self)
6234
6300
!DrGWizardMacroBuild methodsFor: 'pages' stamp: 'hlsf 12/27/2021 10:00:29'!
6235
6301
thirdPage
6236
6302
| list pane |
6237
 
        list _ PluggableListMorph 
 
6303
        list := PluggableListMorph 
6238
6304
                model: model
6239
6305
                listGetter: #outputNames
6240
6306
                indexGetter:  nil
6241
6307
                indexSetter: nil.
6242
 
        pane _ self emptyPane 
 
6308
        pane := self emptyPane 
6243
6309
                addMorphUseAll: list;
6244
6310
                yourself.
6245
6311
        ^ (WizardPage standardPage: 'Select output parameters' translated on: self)
6277
6343
!DrGWizardMacroPlay methodsFor: 'initialize-release' stamp: 'hlsf 12/27/2021 11:03:24'!
6278
6344
initialize
6279
6345
        super initialize.
6280
 
        macroFactories _ DrGMacroFactory new! !
 
6346
        macroFactories := DrGMacroFactory new! !
6281
6347
 
6282
6348
!DrGWizardMacroPlay methodsFor: 'pages' stamp: 'hlsf 12/27/2021 10:00:29'!
6283
6349
firstPage
6294
6360
!DrGWizardMacroPlay methodsFor: 'pages' stamp: 'hlsf 12/27/2021 10:00:29'!
6295
6361
secondPage
6296
6362
| pane morph |
6297
 
        morph _ PluggableListMorph 
 
6363
        morph := PluggableListMorph 
6298
6364
                model: self
6299
6365
                listGetter: #macroList
6300
6366
                indexGetter: #selectedMacro
6301
6367
                indexSetter: #selectedMacro:.
6302
 
        pane  _ self emptyPane
 
6368
        pane  := self emptyPane
6303
6369
                addMorphKeepMorphHeight: (LabelMorph contents: 'Title:' translated);
6304
6370
                addMorph: morph proportionalHeight: 0.3;
6305
6371
                addMorphKeepMorphHeight: (LabelMorph contents: 'Description:' translated);              
6306
6372
                yourself.
6307
 
        morph _ TextModelMorph textProvider: model textGetter: #description textSetter: #description:.
 
6373
        morph := TextModelMorph textProvider: model textGetter: #description textSetter: #description:.
6308
6374
        morph hideScrollBarsIndefinitely; askBeforeDiscardingEdits: false.
6309
6375
        pane addMorphUseAll: morph.
6310
6376
        ^ (WizardPage applyPage: 'Select a macro-construction then the figure items' translated on: self)
6341
6407
        ^ model scriptClass 
6342
6408
                ifNil: [ #() ]
6343
6409
                ifNotNil: [
6344
 
                        labels _ DrGScriptDesignerDialog classesAndLabels.
 
6410
                        labels := DrGScriptDesignerDialog classesAndLabels.
6345
6411
                        model scriptClass argumentsType collect: [ :type | labels at: type ]
6346
6412
                ]! !
6347
6413
 
6348
6414
!DrGWizardScript methodsFor: 'accessing' stamp: 'hlsf 4/7/2022 15:40:01'!
6349
6415
scripts
6350
 
        ^ scripts       ifNil: [        scripts _ DrGWizardScript sortedScripts ]! !
 
6416
        ^ scripts       ifNil: [        scripts := DrGWizardScript sortedScripts ]! !
6351
6417
 
6352
6418
!DrGWizardScript methodsFor: 'accessing' stamp: 'hlsf 4/6/2022 16:55:26'!
6353
6419
scriptsName
6386
6452
!DrGWizardScript methodsFor: 'pages' stamp: 'hlsf 4/7/2022 15:42:08'!
6387
6453
secondPage
6388
6454
        | list argumentList page textMorph |
6389
 
        list _ PluggableListMorph 
 
6455
        list := PluggableListMorph 
6390
6456
                model: self listGetter: #scriptsName indexGetter: #selectedScript               indexSetter: #selectedScript:. 
6391
 
        argumentList _ PluggableListMorph 
6392
 
                model: self             listGetter: #argumentsName indexGetter: nil indexSetter:        nil ::
 
6457
        argumentList := (PluggableListMorph 
 
6458
                model: self listGetter: #argumentsName indexGetter: nil indexSetter: nil)
6393
6459
                setBalloonText: 'The arguments accepted by this script.' translated;
6394
6460
                yourself.
6395
 
        textMorph _ TextModelMorph textProvider: model textGetter: #description textSetter: #description: ::
 
6461
        textMorph := (TextModelMorph textProvider: model textGetter: #description textSetter: #description:)
6396
6462
                askBeforeDiscardingEdits: false;
6397
6463
                yourself.
6398
 
        page _ LabelGroup with: { 
 
6464
        page := LabelGroup with: { 
6399
6465
                'Script name' translated -> list.
6400
6466
                'Description' translated -> textMorph.
6401
6467
                'Arguments' translated -> argumentList}.
6402
6468
 
6403
 
        ^ WizardPage applyPage: 'Select a script then items in the sketch' translated on: self ::
 
6469
        ^ (WizardPage applyPage: 'Select a script then items in the sketch' translated on: self)
6404
6470
                 contents: page! !
6405
6471
 
6406
6472
!DrGWizardScript methodsFor: 'open/close' stamp: 'hlsf 4/7/2022 12:34:54'!
6407
6473
delete
6408
6474
        super delete.
6409
 
        model _ nil! !
 
6475
        model := nil! !
6410
6476
 
6411
6477
!DrGWizardScript methodsFor: 'navigation' stamp: 'hlsf 4/7/2022 15:54:58'!
6412
6478
goPage: integer
6443
6509
        DrGeoSystem stopSpinner.
6444
6510
        ^ panel! !
6445
6511
 
6446
 
!DrGFileOpenMorph methodsFor: 'GUI building' stamp: 'hlsf 8/3/2023 23:22:27'!
 
6512
!DrGFileOpenMorph methodsFor: 'GUI building' stamp: 'hlsf 11/23/2023 17:50:41'!
6447
6513
computePreviewFor: aSketchFile
6448
6514
        | stream drgeo form |
6449
6515
        stream := aSketchFile readStream.
6452
6518
                ensure: [stream close].
6453
6519
        drgeo 
6454
6520
                ifNil: [form := Form extent: 1@1] 
6455
 
                ifNotNil: [drgeo presenter previewOnFile: ((aSketchFile pathName allButLast: 4), 'png') asFileEntry     ].
 
6521
                ifNotNil: [drgeo previewOnFile: ((aSketchFile pathName allButLast: 4), 'png') asFileEntry       ].
6456
6522
        ^ form! !
6457
6523
 
6458
6524
!DrGFileOpenMorph methodsFor: 'GUI building' stamp: 'hlsf 4/11/2022 21:24:20'!
6459
6525
newButtonArea
6460
6526
        | rowLeft rowRight |    
6461
 
        buttonArea _ LayoutMorph newRow :: 
 
6527
        buttonArea := LayoutMorph newRow 
6462
6528
                separation: 8@0; 
6463
6529
                yourself.
6464
 
        rowLeft _ LayoutMorph newRow.
 
6530
        rowLeft := LayoutMorph newRow.
6465
6531
        rowLeft 
6466
6532
                axisEdgeWeight: #rowLeft;
6467
6533
                addMorph: (PluggableButtonMorph 
6474
6540
                        stateGetter: #isMySketches
6475
6541
                        action: #switchToMySketches
6476
6542
                        label: 'My Sketches' translated).
6477
 
        rowRight _ LayoutMorph newRow.
 
6543
        rowRight := LayoutMorph newRow.
6478
6544
        rowRight 
6479
6545
                axisEdgeWeight: #rowRight;              
6480
6546
                addMorph: (PluggableButtonMorph
6501
6567
                scrollDeltaHeight: 80; 
6502
6568
                yourself! !
6503
6569
 
6504
 
!DrGFileOpenMorph methodsFor: 'GUI building' stamp: 'hlsf 5/1/2023 17:14:43'!
 
6570
!DrGFileOpenMorph methodsFor: 'GUI building' stamp: 'hlsf 4/2/2024 18:53:40'!
6505
6571
previewFor: aSketchEntry
6506
6572
        | imageFilename form |
6507
6573
        imageFilename := ((aSketchEntry pathName allButLast: 4), 'png') asFileEntry.
6508
6574
        imageFilename exists 
6509
6575
                ifTrue: [       form := Form fromFileEntry: imageFilename]
6510
6576
                ifFalse: [form := self computePreviewFor: aSketchEntry ].
6511
 
        ^ form magnifyBy: DrGeoSystem previewSize x / form width! !
 
6577
        ^ form magnifyBy: (Theme current scale: Theme current previewSize x) / form width! !
6512
6578
 
6513
 
!DrGFileOpenMorph methodsFor: 'GUI building' stamp: 'hlsf 5/4/2023 15:40:22'!
 
6579
!DrGFileOpenMorph methodsFor: 'GUI building' stamp: 'hlsf 3/30/2024 17:15:25'!
6514
6580
previewMorphFor: sketchEntry
6515
6581
        | preview  |
6516
 
        preview := FilePreviewMorph             
 
6582
        preview := (FilePreviewMorph            
6517
6583
                file: sketchEntry 
6518
6584
                image: (self previewFor: sketchEntry ) 
6519
 
                buttons: nil ::
 
6585
                buttons: nil)
6520
6586
                when: #selected send: #update: to: self;
6521
6587
                when: #doubleClick send: #open: to: self.
6522
6588
        previews add: preview.
6537
6603
deleteSketch
6538
6604
"Delete the selected sketch"
6539
6605
        self canDelete ifTrue: [ | file |
6540
 
                file _ self selectedFile.
 
6606
                file := self selectedFile.
6541
6607
                file delete.
6542
6608
                ((file pathName allButLast: 4), 'png') asFileEntry delete.
6543
6609
                self selectedPreview delete             ]
6560
6626
 
6561
6627
!DrGFileOpenMorph methodsFor: 'actions' stamp: 'hlsf 10/17/2021 12:29:46'!
6562
6628
switchToExamples
6563
 
        model _ DrGeoSystem examplesPath.
 
6629
        model := DrGeoSystem examplesPath.
6564
6630
        self updateButtonsAndPreviews ! !
6565
6631
 
6566
6632
!DrGFileOpenMorph methodsFor: 'actions' stamp: 'hlsf 10/17/2021 12:30:00'!
6567
6633
switchToMySketches
6568
 
        model _ DrGeoSystem mySketchesPath.
 
6634
        model := DrGeoSystem mySketchesPath.
6569
6635
        self updateButtonsAndPreviews ! !
6570
6636
 
6571
6637
!DrGFileOpenMorph methodsFor: 'states' stamp: 'hlsf 10/25/2021 09:46:28'!
6592
6658
        self changed: #isMySketches.
6593
6659
        self buildPane! !
6594
6660
 
 
6661
!DrGFileOpenMorph methodsFor: 'initialization' stamp: 'hlsf 3/30/2024 16:52:03'!
 
6662
defaultColor
 
6663
        ^ self windowColor ! !
 
6664
 
6595
6665
!DrGFileOpenMorph methodsFor: 'initialization' stamp: 'hlsf 10/29/2021 12:12:00'!
6596
6666
initialize
6597
6667
        super initialize.
6598
 
        previews _ #()! !
6599
 
 
6600
 
!DrGFileOpenMorph methodsFor: 'geometry' stamp: 'hlsf 11/7/2023 14:21:35'!
 
6668
        previews := #()! !
 
6669
 
 
6670
!DrGFileOpenMorph methodsFor: 'initialization' stamp: 'hlsf 3/30/2024 17:01:50'!
 
6671
windowColor
 
6672
        ^ Theme current transcript ! !
 
6673
 
 
6674
!DrGFileOpenMorph methodsFor: 'geometry' stamp: 'hlsf 4/2/2024 18:44:39'!
6601
6675
minimumExtent
6602
 
        ^ 1000@500! !
 
6676
        ^ Theme current scale: 1000@500! !
6603
6677
 
6604
6678
!DrGFileOpenMorph class methodsFor: 'instance creation' stamp: 'hlsf 10/14/2021 21:04:26'!
6605
6679
open
6609
6683
arguments 
6610
6684
"The arguments as selected by the user"
6611
6685
|alignments|
6612
 
        alignments _ argumentsMorph submorphs select: [ :morph | morph class = LayoutMorph].
 
6686
        alignments := argumentsMorph submorphs select: [ :morph | morph class = LayoutMorph].
6613
6687
        ^  alignments reverse collect: [ :each | each submorphs first selectedItem].
6614
6688
        ! !
6615
6689
 
6617
6691
argumentsClass
6618
6692
"The arguments type as selected by the user, tpye=class from the MathItem hierarchy"
6619
6693
|dict|
6620
 
        dict _ self class labelsAndClasses .
 
6694
        dict := self class labelsAndClasses .
6621
6695
        ^ self arguments collect: [:aLabel | dict at: aLabel]! !
6622
6696
 
6623
6697
!DrGScriptDesignerDialog methodsFor: 'accessing' stamp: 'hlsf 4/6/2022 14:52:28'!
6626
6700
 
6627
6701
!DrGScriptDesignerDialog methodsFor: 'accessing' stamp: 'hlsf 4/2/2022 09:10:06'!
6628
6702
description: aString
6629
 
        description _ aString ! !
 
6703
        description := aString ! !
6630
6704
 
6631
6705
!DrGScriptDesignerDialog methodsFor: 'accessing' stamp: 'hlsf 4/6/2022 14:52:35'!
6632
6706
scriptName
6634
6708
 
6635
6709
!DrGScriptDesignerDialog methodsFor: 'accessing' stamp: 'hlsf 4/2/2022 09:09:41'!
6636
6710
scriptName: aString
6637
 
        scriptName _ aString ! !
 
6711
        scriptName := aString ! !
6638
6712
 
6639
6713
!DrGScriptDesignerDialog methodsFor: 'GUI building' stamp: 'hlsf 4/4/2022 12:54:13'!
6640
6714
newAddArgumentButton
6641
 
        ^ PluggableButtonMorph model: self action:  #addArgument label: 'Add argument' translated ::
 
6715
        ^ (PluggableButtonMorph model: self action:  #addArgument label: 'Add argument' translated)
6642
6716
                        setBalloonText: 'Add an argument to this script.' translated;
6643
6717
                        yourself! !
6644
6718
 
6654
6728
newButtonArea
6655
6729
        buttonArea := LayoutMorph newRow
6656
6730
                separation: 8@0;
6657
 
                addMorph: (PluggableButtonMorph model: self action:  #build label: 'Build' translated ::
 
6731
                addMorph: ((PluggableButtonMorph model: self action: #build label: 'Build' translated)
6658
6732
                                enableSelector: #isValid; 
6659
6733
                                setBalloonText: 'Build a script with these settings.' translated;
6660
6734
                                yourself)
6661
 
                layoutSpec: (LayoutSpec new ::
 
6735
                layoutSpec: (LayoutSpec new
6662
6736
                        useMorphWidth ;
6663
6737
                        proportionalHeight:  1;
6664
6738
                        offAxisEdgeWeight: #center);
6665
6739
                addMorph: (PluggableButtonMorph model: self action:  #cancel label: 'Cancel' translated)
6666
 
                layoutSpec: (LayoutSpec new ::
 
6740
                layoutSpec: (LayoutSpec new
6667
6741
                        useMorphWidth ;
6668
6742
                        proportionalHeight:  1;
6669
6743
                        offAxisEdgeWeight: #center);
6674
6748
!DrGScriptDesignerDialog methodsFor: 'GUI building' stamp: 'hlsf 4/4/2022 20:10:51'!
6675
6749
newDescriptionMorph
6676
6750
| morph |
6677
 
        morph _ TextModelMorph textProvider: self textGetter: #description textSetter: #description: ::
 
6751
        morph := (TextModelMorph textProvider: self textGetter: #description textSetter: #description:)
6678
6752
                askBeforeDiscardingEdits: false;
6679
6753
                setBalloonText:  'A description of the script. To help the user, describe carefully what the script does and the input arguments to select to use it.' translated;
6680
6754
                yourself        .
6688
6762
        ^ LabelGroup with: {
6689
6763
                'Name' translated -> self newScriptNameMorph .
6690
6764
                'Description' translated -> self newDescriptionMorph .
6691
 
                'Arguments' translated -> (argumentsMorph _  self newArgumentMorph)     
 
6765
                'Arguments' translated -> (argumentsMorph :=  self newArgumentMorph)    
6692
6766
        }! !
6693
6767
 
6694
6768
!DrGScriptDesignerDialog methodsFor: 'GUI building' stamp: 'hlsf 4/4/2022 20:10:48'!
6695
6769
newScriptNameMorph
6696
6770
| morph |
6697
 
        morph _ TextModelMorph textProvider: self textGetter: #scriptName textSetter:  #scriptName: ::
 
6771
        morph := (TextModelMorph textProvider: self textGetter: #scriptName textSetter:  #scriptName:)
6698
6772
                hideScrollBarsIndefinitely;
6699
6773
                askBeforeDiscardingEdits: false;
6700
6774
                acceptOnCR: true;
6709
6783
!DrGScriptDesignerDialog methodsFor: 'initialization' stamp: 'hlsf 4/5/2022 21:02:25'!
6710
6784
initialize
6711
6785
        super initialize.
6712
 
        scriptName _ ''.
6713
 
        description _ ''! !
 
6786
        scriptName := ''.
 
6787
        description := ''! !
6714
6788
 
6715
 
!DrGScriptDesignerDialog methodsFor: 'action' stamp: 'hlsf 5/27/2023 12:12:17'!
 
6789
!DrGScriptDesignerDialog methodsFor: 'action' stamp: 'hlsf 4/9/2024 10:38:38'!
6716
6790
addArgument
6717
6791
        | newArgument |
6718
 
        newArgument := LayoutMorph newRow ::
 
6792
        newArgument := LayoutMorph newRow
6719
6793
                adoptWidgetsColor: widgetsColor;
6720
6794
                borderWidth: 1;
6721
6795
                yourself.
6722
 
        newArgument addMorph: (PluggableButtonMorph model: self action: #removeArgument: ::
 
6796
        newArgument addMorph: ((PluggableButtonMorph model: self action: #removeArgument:)
6723
6797
                        icon: Theme current deleteIcon;
6724
6798
                        actionArgument: newArgument;
6725
6799
                        borderWidth: 0;
6726
6800
                        color: Color transparent;
6727
6801
                        setBalloonText:  'Remove this script argument.' translated;
6728
6802
                        yourself);              
6729
 
                addMorph: (DropDownListMorph 
 
6803
                addMorph: ((DropDownListMorph 
6730
6804
                        model: (ListModel with: self class labels)
6731
6805
                        listGetter: #list
6732
6806
                        indexGetter:  #listIndex
6733
 
                        indexSetter: #listIndex: ::
6734
 
                        adoptWidgetsColor: widgetsColor ).
 
6807
                        indexSetter: #listIndex:)
 
6808
                        adoptWidgetsColor: widgetsColor).
6735
6809
        argumentsMorph addMorph: newArgument.
6736
6810
        self morphExtent: self minimumExtent ! !
6737
6811
 
6802
6876
!DrGScriptDesignerDialog class methodsFor: 'labels and classes' stamp: 'hlsf 4/2/2022 12:50:48'!
6803
6877
classesAndLabels
6804
6878
        | dict |
6805
 
        dict _ Dictionary new.
 
6879
        dict := Dictionary new.
6806
6880
        self labelsAndClasses associationsDo: [ :assoc | 
6807
6881
                dict add: assoc value -> assoc key ].
6808
6882
        ^ dict
6858
6932
 
6859
6933
!DrGSmalltalkSketchBrowser methodsFor: 'accessing' stamp: 'hlsf 4/9/2022 11:05:19'!
6860
6934
model: aDirectoryEntry
6861
 
        model _ aDirectoryEntry .
6862
 
        sketches _ nil! !
 
6935
        model := aDirectoryEntry .
 
6936
        sketches := nil! !
6863
6937
 
6864
6938
!DrGSmalltalkSketchBrowser methodsFor: 'accessing' stamp: 'hlsf 4/12/2022 21:24:54'!
6865
6939
showCode: aCheckButtonMorph 
6866
6940
| drgeoFraction |
6867
6941
        aCheckButtonMorph isSelected 
6868
6942
                ifTrue:         [
6869
 
                        drgeoFraction _ 0.7.
 
6943
                        drgeoFraction := 0.7.
6870
6944
                        pane addMorph: codeView proportionalHeight: 1 - drgeoFraction.
6871
6945
                        codeView adoptWidgetsColor: self widgetsColor ]
6872
6946
                 ifFalse: [
6873
 
                        drgeoFraction _ 1.
 
6947
                        drgeoFraction := 1.
6874
6948
                        pane removeMorph: codeView].
6875
6949
        drgeoView layoutSpec: (LayoutSpec proportionalHeight: drgeoFraction)! !
6876
6950
 
6900
6974
!DrGSmalltalkSketchBrowser methodsFor: 'accessing' stamp: 'hlsf 9/28/2022 16:32:35'!
6901
6975
sketches
6902
6976
" The skteches files in the current path"
6903
 
        ^ sketches ifNil: [sketches _ (model files 
 
6977
        ^ sketches ifNil: [sketches := (model files 
6904
6978
                        select: [:aFile | aFile extension = 'st']
6905
6979
                        thenCollect: [:aFile | aFile baseName ]) sorted ]
6906
6980
                        ! !
6913
6987
 
6914
6988
!DrGSmalltalkSketchBrowser methodsFor: 'accessing' stamp: 'hlsf 4/11/2022 21:54:35'!
6915
6989
switchToExamples
6916
 
        model _ DrGeoSystem smalltalkSketchesPath.
 
6990
        model := DrGeoSystem smalltalkSketchesPath.
6917
6991
        self updateButtonsAndPreviews! !
6918
6992
 
6919
6993
!DrGSmalltalkSketchBrowser methodsFor: 'accessing' stamp: 'hlsf 4/11/2022 21:55:43'!
6920
6994
switchToMySketches
6921
 
        model _ DrGeoSystem mySmalltalkSketchesPath.
 
6995
        model := DrGeoSystem mySmalltalkSketchesPath.
6922
6996
        self updateButtonsAndPreviews! !
6923
6997
 
6924
6998
!DrGSmalltalkSketchBrowser methodsFor: 'GUI building' stamp: 'hlsf 4/14/2022 15:16:01'!
6926
7000
        super buildMorphicWindow.
6927
7001
        titleMorph showButtonsNamed: #(close expand).! !
6928
7002
 
6929
 
!DrGSmalltalkSketchBrowser methodsFor: 'GUI building' stamp: 'hlsf 7/9/2022 12:04:06'!
 
7003
!DrGSmalltalkSketchBrowser methodsFor: 'GUI building' stamp: 'hlsf 4/4/2024 12:54:48'!
6930
7004
newButtonArea
6931
7005
        | rowLeft rowRight |    
6932
 
        buttonArea _ LayoutMorph newRow :: 
 
7006
        buttonArea := LayoutMorph newRow 
6933
7007
                separation: 8@0; 
6934
7008
                yourself.
6935
 
        rowLeft _ LayoutMorph newRow.
 
7009
        rowLeft := LayoutMorph newRow.
6936
7010
        rowLeft 
6937
7011
                axisEdgeWeight: #rowLeft;
6938
7012
                addMorph: (PluggableButtonMorph 
6940
7014
                        stateGetter: #isExamples 
6941
7015
                        action: #switchToExamples 
6942
7016
                        label: 'Examples' translated);
6943
 
                addMorph: (PluggableButtonMorph 
 
7017
                addMorph: ((PluggableButtonMorph 
6944
7018
                        model: self
6945
7019
                        stateGetter: #isMySketches
6946
7020
                        action: #switchToMySketches
6947
 
                        label: 'My Sketches' translated).
6948
 
        rowRight _ LayoutMorph newRow.
 
7021
                        label: 'My Sketches' translated) 
 
7022
                                setBalloonText: 'Browse my collection of Smalltalk sketches.' translated;
 
7023
                                yourself).
 
7024
        rowRight := LayoutMorph newRow.
6949
7025
        rowRight 
6950
7026
                axisEdgeWeight: #rowRight;              
6951
7027
                addMorph: ((PluggableButtonMorph
6973
7049
!DrGSmalltalkSketchBrowser methodsFor: 'GUI building' stamp: 'hlsf 4/12/2022 23:31:48'!
6974
7050
newDrGeoColumn
6975
7051
" the DrGeo view and an optional code view"
6976
 
        ^ pane _ LayoutMorph newColumn ::
 
7052
        ^ pane := LayoutMorph newColumn
6977
7053
                addMorph: drgeoView proportionalHeight: 1;
6978
7054
                addAdjusterMorph ;
6979
7055
                yourself! !
6980
7056
 
6981
7057
!DrGSmalltalkSketchBrowser methodsFor: 'GUI building' stamp: 'hlsf 4/12/2022 19:34:44'!
6982
7058
newPane
6983
 
        ^ LayoutMorph newRow ::
 
7059
        ^ LayoutMorph newRow
6984
7060
                separation: self defaultSeparation ;
6985
7061
                addMorph: self newSketchesColumn layoutSpec: (LayoutSpec new useMorphWidth );
6986
7062
                addMorphUseAll: self newDrGeoColumn;
6990
7066
newSketchesColumn
6991
7067
" The list of the sketch and an option to view the code"
6992
7068
        | checkGtoup |
6993
 
        checkGtoup _ CheckGroup fromList: {'Code' translated}.
 
7069
        checkGtoup := CheckGroup fromList: {'Code' translated}.
6994
7070
        checkGtoup buttons first when: #checkSelection send: #showCode: to: self.
6995
 
        ^ LayoutMorph newColumn ::
 
7071
        ^ LayoutMorph newColumn
6996
7072
                addMorph: sketchesListMorph layoutSpec: (LayoutSpec new useMorphWidth);
6997
7073
                addMorphKeepMorphHeight: checkGtoup ;
6998
7074
                yourself
6999
7075
                ! !
7000
7076
 
 
7077
!DrGSmalltalkSketchBrowser methodsFor: 'initialization' stamp: 'hlsf 3/30/2024 16:49:02'!
 
7078
defaultColor
 
7079
        ^ self windowColor ! !
 
7080
 
7001
7081
!DrGSmalltalkSketchBrowser methodsFor: 'initialization' stamp: 'hlsf 4/12/2022 18:56:10'!
7002
7082
emptyView
7003
 
        ^ BoxedMorph new ::
 
7083
        ^ BoxedMorph new
7004
7084
                color: self color;
7005
7085
                borderWidth: 1;
7006
7086
                layoutSpec: LayoutSpec useAll! !
7008
7088
!DrGSmalltalkSketchBrowser methodsFor: 'initialization' stamp: 'hlsf 2/22/2023 11:22:05'!
7009
7089
initialize
7010
7090
        super initialize.
7011
 
        sketchesListMorph _ PluggableListMorph 
 
7091
        sketchesListMorph := PluggableListMorph 
7012
7092
                model: self             listGetter: #sketches           indexGetter: #sketch indexSetter: #sketch:.
7013
 
        drgeoView _ self emptyView.
7014
 
        codeView _ TextModelMorph textProvider: self textGetter: #sourceCode ::
 
7093
        drgeoView := self emptyView.
 
7094
        codeView := (TextModelMorph textProvider: self textGetter: #sourceCode)
7015
7095
                disableEditing;
7016
7096
                yourself.! !
7017
7097
 
7018
 
!DrGSmalltalkSketchBrowser methodsFor: 'geometry' stamp: 'hlsf 4/12/2022 23:32:28'!
 
7098
!DrGSmalltalkSketchBrowser methodsFor: 'initialization' stamp: 'hlsf 3/30/2024 16:48:52'!
 
7099
windowColor
 
7100
        ^ Theme current transcript ! !
 
7101
 
 
7102
!DrGSmalltalkSketchBrowser methodsFor: 'geometry' stamp: 'hlsf 4/2/2024 19:01:40'!
7019
7103
minimumExtent
7020
 
        ^ 1200@800! !
 
7104
        ^ Theme current scale: 800@600! !
7021
7105
 
7022
7106
!DrGSmalltalkSketchBrowser methodsFor: 'update' stamp: 'hlsf 7/9/2022 12:07:45'!
7023
7107
updateButtonsAndPreviews
7024
 
        sketches _ nil.
 
7108
        sketches := nil.
7025
7109
        self changed: #isExamples.
7026
7110
        self changed: #isMySketches.
7027
7111
        self changed: #sketches.
7051
7135
        
7052
7136
        ^true! !
7053
7137
 
7054
 
!DrGSmalltalkSketchBrowser methodsFor: 'user interface support' stamp: 'hlsf 8/3/2023 18:19:23'!
 
7138
!DrGSmalltalkSketchBrowser methodsFor: 'user interface support' stamp: 'hlsf 11/23/2023 17:27:51'!
7055
7139
styleByParagraphs
7056
 
        ^ true! !
 
7140
        ^ false! !
7057
7141
 
7058
7142
!DrGSmalltalkSketchBrowser methodsFor: 'user interface support' stamp: 'hlsf 4/12/2022 23:25:32'!
7059
7143
textStylerClassFor: object
7072
7156
shoutMustKeepContentsSize
7073
7157
        ^ true! !
7074
7158
 
7075
 
!DrGSmalltalkSketchBrowser methodsFor: 'submorphs-add/remove' stamp: 'hlsf 5/25/2023 15:33:56'!
 
7159
!DrGSmalltalkSketchBrowser methodsFor: 'submorphs-add/remove' stamp: 'hlsf 4/12/2024 17:54:59'!
7076
7160
delete
7077
7161
        super delete.
7078
 
        self releaseMiniView ! !
 
7162
        self releaseMiniView! !
7079
7163
 
7080
7164
!DrGSmalltalkSketchBrowser methodsFor: 'submorphs-add/remove' stamp: 'hlsf 8/4/2023 12:58:33'!
7081
7165
releaseMiniView
7082
7166
        (drgeoView respondsTo: #presenter) 
7083
7167
                ifTrue: [drgeoView presenter ifNotNil: [:pres | pres release] ]! !
7084
7168
 
7085
 
!DrGSmalltalkSketchEditor methodsFor: 'GUI building' stamp: 'hlsf 10/30/2022 20:53:10'!
 
7169
!DrGSmalltalkSketchEditor methodsFor: 'GUI building' stamp: 'hlsf 12/25/2023 19:28:31'!
7086
7170
buildMorphicWindow
7087
7171
        super buildMorphicWindow.
7088
7172
        titleMorph showButtonsNamed: #(close collapse expand).
7089
 
        self toggleHelp ! !
 
7173
        self toggleHelp.
 
7174
        self activeHand newKeyboardFocus: codeView scroller! !
7090
7175
 
7091
 
!DrGSmalltalkSketchEditor methodsFor: 'GUI building' stamp: 'hlsf 4/14/2022 16:36:45'!
 
7176
!DrGSmalltalkSketchEditor methodsFor: 'GUI building' stamp: 'hlsf 3/30/2024 08:48:53'!
7092
7177
button: iconSymbol action: actionSelector help: helpString
7093
 
        ^ ButtonMorph model: self action: actionSelector ::
 
7178
        ^ (ButtonMorph model: self action: actionSelector)
7094
7179
                        icon: (DrGIcons for: iconSymbol );
7095
7180
                        setBalloonText: helpString ;
7096
 
                        color: DrGUIControlsManager buttonColor;
7097
 
                        selectedColor: DrGUIControlsManager buttonSelectedColor;
7098
 
                        borderColor: DrGUIControlsManager buttonColor muchDarker;
 
7181
                        color: Theme current drgeoButtonColor;
 
7182
                        selectedColor: Theme current drgeoButtonSelectedColor;
 
7183
                        borderColor: Theme current drgeoButtonColor muchDarker;
7099
7184
                        borderWidth: 2;
7100
 
                        morphExtent: (DrGeoSystem toolbarIconSize + 4) asPoint;
 
7185
                        morphExtent: (Theme current toolbarIconSize + 4) asPoint;
7101
7186
                        yourself! !
7102
7187
 
7103
 
!DrGSmalltalkSketchEditor methodsFor: 'GUI building' stamp: 'hlsf 10/28/2022 11:13:31'!
 
7188
!DrGSmalltalkSketchEditor methodsFor: 'GUI building' stamp: 'hlsf 3/30/2024 08:49:06'!
7104
7189
button: iconSymbol action: actionSelector state: getStateSel help: helpString
7105
 
        ^ ButtonMorph model: self stateGetter: getStateSel action: actionSelector ::
 
7190
        ^ (ButtonMorph model: self stateGetter: getStateSel action: actionSelector)
7106
7191
                        icon: (DrGIcons for: iconSymbol );
7107
7192
                        setBalloonText: helpString ;
7108
 
                        color: DrGUIControlsManager buttonColor;
7109
 
                        selectedColor: DrGUIControlsManager buttonSelectedColor;
7110
 
                        borderColor: DrGUIControlsManager buttonColor muchDarker;
 
7193
                        color: Theme current drgeoButtonColor;
 
7194
                        selectedColor: Theme current drgeoButtonSelectedColor;
 
7195
                        borderColor: Theme current drgeoButtonColor muchDarker;
7111
7196
                        borderWidth: 2;
7112
 
                        morphExtent: (DrGeoSystem toolbarIconSize + 4) asPoint;
 
7197
                        morphExtent: (Theme current toolbarIconSize + 4) asPoint;
7113
7198
                        yourself! !
7114
7199
 
7115
7200
!DrGSmalltalkSketchEditor methodsFor: 'GUI building' stamp: 'hlsf 4/14/2022 16:43:31'!
7116
7201
newButtonArea
7117
 
        buttonArea _ LayoutMorph newRow :: 
 
7202
        buttonArea := LayoutMorph newRow 
7118
7203
                axisEdgeWeight: #rowRight;
7119
7204
                addMorph: (PluggableButtonMorph
7120
7205
                        model: self
7124
7209
 
7125
7210
!DrGSmalltalkSketchEditor methodsFor: 'GUI building' stamp: 'hlsf 11/2/2022 19:39:02'!
7126
7211
newCodeAndView
7127
 
        ^ LayoutMorph newRow ::
 
7212
        ^ LayoutMorph newRow
7128
7213
                separation: self defaultSeparation;
7129
 
                addMorph: (codeAndViewPanel _ LayoutMorph newColumn ::
7130
 
                        addMorph:               codeView proportionalHeight: 0.7;
 
7214
                addMorph: (codeAndViewPanel := LayoutMorph newColumn
 
7215
                        addMorph: codeView proportionalHeight: 0.7;
7131
7216
                        addAdjusterMorph;
7132
7217
                        addMorph: docView proportionalHeight: 0.3) 
7133
7218
                proportionalWidth: 0.5;
7137
7222
 
7138
7223
!DrGSmalltalkSketchEditor methodsFor: 'GUI building' stamp: 'hlsf 10/19/2022 21:31:20'!
7139
7224
newPane
7140
 
        ^ LayoutMorph newColumn ::
 
7225
        ^ LayoutMorph newColumn
7141
7226
                separation: self defaultSeparation ;
7142
7227
                addMorphKeepMorphHeight: self newToolbar;
7143
7228
                addMorphUseAll: self newCodeAndView;
7145
7230
 
7146
7231
!DrGSmalltalkSketchEditor methodsFor: 'GUI building' stamp: 'hlsf 10/28/2022 11:15:20'!
7147
7232
newToolbar
7148
 
        ^ LayoutMorph newRow ::
 
7233
        ^ LayoutMorph newRow
7149
7234
                separation: 5@0 ;
7150
7235
                addMorph: (self button: #open action: #browseSketches help: 'Edit a Smalltalk sketch.' translated);
7151
7236
                addMorph: (self button: #keep action: #keepSketch help: 'Save this Smalltalk sketch.' translated);
7152
 
                addMorph: (playButton _ self button: #play action: #executeSketch help: 'Play the Smalltalk sketch.' translated);
 
7237
                addMorph: (playButton := self button: #play action: #executeSketch help: 'Play the Smalltalk sketch.' translated);
7153
7238
                addMorph: (self button: #debug action: #debugSketch help: 'Debug the Smalltalk sketch.' translated);
7154
7239
                addMorph: (self button: #stop action: #stopSketch help: 'Stop the execution of the Smalltalk sketch.' translated);
7155
7240
                addMorph: self transparentMorph layoutSpec: (LayoutSpec proportionalWidth: 1.0);
7156
7241
                addMorph: (self button: #doc action: #toggleHelp state: #isDocVisible help: 'Dr. Geo tutorial' translated)
7157
7242
                yourself! !
7158
7243
 
 
7244
!DrGSmalltalkSketchEditor methodsFor: 'GUI building' stamp: 'hlsf 5/1/2024 11:08:16'!
 
7245
plugDebugger
 
7246
" Install the debugger window at the place of the code viewer "
 
7247
        debugger layoutMorph borderWidth: 1.
 
7248
        codeAndViewPanel replaceSubmorph: codeView by: debugger layoutMorph.                    
 
7249
        debugger model when: #closeViews send: #stopDebbuger to: self.! !
 
7250
 
 
7251
!DrGSmalltalkSketchEditor methodsFor: 'GUI building' stamp: 'hlsf 4/28/2024 15:56:59'!
 
7252
plugDebugger: aDebugger
 
7253
        debugger := aDebugger.
 
7254
        self plugDebugger ! !
 
7255
 
7159
7256
!DrGSmalltalkSketchEditor methodsFor: 'GUI building' stamp: 'hlsf 10/6/2022 12:44:50'!
7160
7257
switchToPauseButton
7161
7258
7167
7264
                setBalloonText: 'Pause the Smalltalk sketch.' translated;
7168
7265
                redrawNeeded ! !
7169
7266
 
7170
 
!DrGSmalltalkSketchEditor methodsFor: 'GUI building' stamp: 'hlsf 10/6/2022 12:44:47'!
 
7267
!DrGSmalltalkSketchEditor methodsFor: 'GUI building' stamp: 'hlsf 3/20/2024 16:20:14'!
7171
7268
switchToPlayButton
7172
7269
7173
7270
Switch to play sketch action 
7176
7273
                icon: (DrGIcons for: #play);
7177
7274
                action: #executeSketch;
7178
7275
                setBalloonText: 'Play the Smalltalk sketch.' translated;
7179
 
                redrawNeeded ! !
 
7276
                redrawNeeded.! !
7180
7277
 
7181
7278
!DrGSmalltalkSketchEditor methodsFor: 'GUI building' stamp: 'hlsf 10/6/2022 12:44:44'!
7182
7279
switchToResumeButton
7196
7293
                color: Color transparent; 
7197
7294
                yourself! !
7198
7295
 
7199
 
!DrGSmalltalkSketchEditor methodsFor: 'initialization' stamp: 'hlsf 2/22/2023 11:29:52'!
 
7296
!DrGSmalltalkSketchEditor methodsFor: 'initialization' stamp: 'hlsf 3/30/2024 16:46:58'!
 
7297
defaultColor
 
7298
        ^ self windowColor ! !
 
7299
 
 
7300
!DrGSmalltalkSketchEditor methodsFor: 'initialization' stamp: 'drgeo 3/17/2024 17:18:31'!
7200
7301
initialize
7201
7302
        | book |
7202
7303
        super initialize.
7203
 
        book _ EruditeBookReaderMorph new.
7204
 
        docView _ book
 
7304
        book := EruditeBookReaderMorph new.
 
7305
        docView := book
7205
7306
                model: DrGeoTutorial new; 
7206
7307
                buildMorphicWindow;
7207
7308
                layoutMorph.
7208
7309
        book when: #askToCopyCode send: #sourceCode: to: self.
7209
7310
        
7210
 
        codeView _ TextModelMorph textProvider: self textGetter: #sourceCode textSetter: #sourceCode: ::
 
7311
        codeView := (TextModelMorph textProvider: self textGetter: #sourceCode textSetter: #sourceCode:)
7211
7312
                askBeforeDiscardingEdits: false;
7212
7313
                yourself.
7213
 
        drgeoView _  LayoutMorph new ::
 
7314
        drgeoView :=  LayoutMorph new
7214
7315
                color: self color;
7215
7316
                borderWidth: 1;
7216
7317
                layoutSpec: LayoutSpec useAll! !
7217
7318
 
 
7319
!DrGSmalltalkSketchEditor methodsFor: 'initialization' stamp: 'hlsf 3/30/2024 16:50:10'!
 
7320
windowColor
 
7321
        ^ Theme current workspace ! !
 
7322
 
7218
7323
!DrGSmalltalkSketchEditor methodsFor: 'accessing' stamp: 'hlsf 10/30/2022 20:39:21'!
7219
7324
isDocVisible
7220
7325
        ^ docView visible! !
7222
7327
!DrGSmalltalkSketchEditor methodsFor: 'accessing' stamp: 'hlsf 4/14/2022 16:35:00'!
7223
7328
model: sourceCode
7224
7329
"Set an initial source code (string)"
7225
 
        model _ sourceCode
 
7330
        model := sourceCode
7226
7331
! !
7227
7332
 
7228
7333
!DrGSmalltalkSketchEditor methodsFor: 'accessing' stamp: 'hlsf 10/30/2022 20:45:35'!
7283
7388
        
7284
7389
        ^true! !
7285
7390
 
7286
 
!DrGSmalltalkSketchEditor methodsFor: 'user interface support' stamp: 'hlsf 8/3/2023 18:15:40'!
 
7391
!DrGSmalltalkSketchEditor methodsFor: 'user interface support' stamp: 'hlsf 11/23/2023 17:27:30'!
7287
7392
styleByParagraphs
7288
 
        ^ true! !
 
7393
        ^ false! !
7289
7394
 
7290
7395
!DrGSmalltalkSketchEditor methodsFor: 'user interface support' stamp: 'hlsf 4/14/2022 16:40:27'!
7291
7396
textStylerClassFor: object
7300
7405
                label: 'Select a Smalltalk sketch' translated.
7301
7406
        browser when: #editSmalltalkSketch send: #loadSketch: to: self.! !
7302
7407
 
7303
 
!DrGSmalltalkSketchEditor methodsFor: 'actions' stamp: 'hlsf 5/25/2023 15:31:32'!
 
7408
!DrGSmalltalkSketchEditor methodsFor: 'actions' stamp: 'hlsf 3/20/2024 17:07:38'!
7304
7409
compiledSketch: aSketch
7305
7410
        self releaseMiniView.
7306
7411
        drgeoView 
7307
7412
                removeAllMorphs;
7308
7413
                addMorph: aSketch view.! !
7309
7414
 
7310
 
!DrGSmalltalkSketchEditor methodsFor: 'actions' stamp: 'hlsf 2/22/2023 22:10:10'!
 
7415
!DrGSmalltalkSketchEditor methodsFor: 'actions' stamp: 'hlsf 12/31/2023 12:25:54'!
7311
7416
debugSketch
 
7417
" Execute the sketch step by step in a debugger "
7312
7418
        model ifEmpty: [^ self].
7313
7419
        self stopSketch.
7314
7420
        self isDocVisible ifTrue: [self toggleHelp].
7318
7424
                afterCompiling: model 
7319
7425
                do:  [ :compiler :method :receiver :context | 
7320
7426
                        (method notNil and: [method isQuick not]) ifTrue: [
7321
 
                                debugger _ Debugger 
 
7427
                                debugger := Debugger 
7322
7428
                                        openMinimalDebugging: [
7323
7429
                                                method
7324
7430
                                                        valueWithReceiver: receiver 
7325
7431
                                                        arguments: (context ifNil: [ #() ] ifNotNil: [ { context } ])]
7326
7432
                                        to: method.
7327
 
                                debugger layoutMorph borderWidth: 1.
7328
 
                                codeAndViewPanel replaceSubmorph: codeView by: debugger layoutMorph.                    
7329
 
                                debugger model when: #closeViews send: #stopDebbuger to: self.
7330
 
                                debugger        contextVariableInspector selectionIndex: 3.]
7331
 
                        ]
7332
 
                ifFail: [].! !
7333
 
 
7334
 
!DrGSmalltalkSketchEditor methodsFor: 'actions' stamp: 'hlsf 10/19/2022 21:21:13'!
7335
 
debugWindowSketch
7336
 
        self stopSketch.
7337
 
        codeView scroller acceptContents.
7338
 
        codeView editor 
7339
 
                afterCompiling: model 
7340
 
                do:  [ :compiler :method :receiver :context | method ifNotNil: [ | window |
7341
 
                        window _ Debugger 
7342
 
                                openMinimalDebugging: [
7343
 
                                        method
7344
 
                                                valueWithReceiver: receiver 
7345
 
                                                arguments: (context ifNil: [ #() ] ifNotNil: [ { context } ])]
7346
 
                                to: method 
7347
 
                                label: 'Execute step by step' translated.
7348
 
                        window  contextVariableInspector selectionIndex: 3.]
7349
 
                        ]
7350
 
                ifFail: [].! !
7351
 
 
7352
 
!DrGSmalltalkSketchEditor methodsFor: 'actions' stamp: 'hlsf 2/22/2023 11:55:13'!
 
7433
                                self plugDebugger ]                     ]
 
7434
                ifFail: [].! !
 
7435
 
 
7436
!DrGSmalltalkSketchEditor methodsFor: 'actions' stamp: 'hlsf 5/1/2024 11:36:43'!
7353
7437
executeSketch
7354
7438
        self stopSketch.
7355
7439
        codeView scroller acceptContents.
7356
7440
        self switchToPauseButton.
7357
7441
        DrGeoSketch when: #newSmalltalkSketch send: #compiledSketch: to: self.
7358
 
        sketchProcess _ [ | t |
7359
 
                t _ DateAndTime now.
7360
 
                Compiler evaluate: model.
 
7442
        sketchProcess := [ | t |
 
7443
                t := DateAndTime now.
 
7444
                (DrGeoSystem preferences at: #advancedDebugger) 
 
7445
                        ifTrue: [Compiler evaluate: model]
 
7446
                        ifFalse: [
 
7447
                                [Compiler evaluate: model] 
 
7448
                                        on: Error 
 
7449
                                        do: [:ex | 
 
7450
                                                self setLabel: ex description.
 
7451
                                                Debugger                
 
7452
                                                        openMinimalIn: self
 
7453
                                                        debuggingProcess: sketchProcess                         
 
7454
                                                        context: ex signalerContext ]   ].
7361
7455
                " When we get there, sketch has been entirely executed, switch back to play button "
7362
7456
                self switchToPlayButton.
7363
7457
                Transcript show: DateAndTime now - t ;cr] newProcess.
7364
7458
        sketchProcess 
7365
 
                priority: Processor userSchedulingPriority ;
 
7459
                priority: Processor userSchedulingPriority - 1;
7366
7460
                name: '[DrGeo] Smalltalk Sketch execution';
7367
7461
                resume.! !
7368
7462
 
7371
7465
| modelName |
7372
7466
        DrGeoSystem showVirtualKeyboard: true.
7373
7467
        codeView scroller acceptContents.
7374
 
        modelName _ ValueHolder with: self sketchName :: 
 
7468
        modelName := (ValueHolder with: self sketchName)
7375
7469
        action: [:aString | 
7376
7470
                self setLabel: aString.
7377
 
                file _ DrGeoSystem mySmalltalkSketchesPath // (aString, '.st').
 
7471
                file := DrGeoSystem mySmalltalkSketchesPath // (aString, '.st').
7378
7472
                file < model].
7379
 
        StringEntryPanel openWide: modelName label: 'Name the sketch to keep.' translated ::
 
7473
        (StringEntryPanel openWide: modelName label: 'Name the sketch to keep.' translated)
7380
7474
                morphCenter: self fullBoundsInOwner center;
7381
7475
                setProperty: #layerNumber toValue: 20! !
7382
7476
 
7383
7477
!DrGSmalltalkSketchEditor methodsFor: 'actions' stamp: 'hlsf 2/22/2023 11:31:05'!
7384
7478
loadSketch: afileEntry
7385
7479
" we are informed by the browser we want a file "
7386
 
        file _ afileEntry.
 
7480
        file := afileEntry.
7387
7481
        self setLabel: self sketchName.
7388
7482
        self sourceCode: file fileContents! !
7389
7483
 
7400
7494
        sketchProcess resume.
7401
7495
        self switchToPauseButton! !
7402
7496
 
7403
 
!DrGSmalltalkSketchEditor methodsFor: 'actions' stamp: 'hlsf 10/19/2022 21:35:07'!
 
7497
!DrGSmalltalkSketchEditor methodsFor: 'actions' stamp: 'hlsf 5/1/2024 11:37:06'!
7404
7498
stopDebbuger
7405
7499
        debugger ifNotNil: [
7406
7500
                codeAndViewPanel replaceSubmorph: debugger layoutMorph by: codeView.
7407
7501
                debugger closeView.
7408
 
                debugger _ nil]
 
7502
                debugger := nil.
 
7503
                self restoreLabel ]
7409
7504
                
7410
7505
                ! !
7411
7506
 
7412
 
!DrGSmalltalkSketchEditor methodsFor: 'actions' stamp: 'hlsf 5/18/2023 17:35:51'!
 
7507
!DrGSmalltalkSketchEditor methodsFor: 'actions' stamp: 'hlsf 4/28/2024 14:33:26'!
7413
7508
stopSketch
7414
 
        "DrGeoSketch removeActionsWithReceiver: self."  
7415
7509
        DrGeoSketch releaseActionMap .
7416
7510
        sketchProcess   ifNotNil: [
7417
7511
                sketchProcess terminate.
7442
7536
        super expand.
7443
7537
        self fullScreen! !
7444
7538
 
7445
 
!DrGSmalltalkSketchEditor methodsFor: 'geometry' stamp: 'hlsf 4/14/2022 16:43:02'!
 
7539
!DrGSmalltalkSketchEditor methodsFor: 'geometry' stamp: 'hlsf 4/2/2024 18:58:11'!
7446
7540
minimumExtent
7447
 
        ^ 1200@800! !
 
7541
        ^ Theme current scale: 800@600! !
7448
7542
 
7449
7543
!DrGSmalltalkSketchEditor methodsFor: 'testing' stamp: 'hlsf 5/18/2023 17:07:27'!
7450
7544
shouldAutoHighlight
7466
7560
                drgeoView firstSubmorph ifNotNil: [:miniView|   
7467
7561
                        miniView  presenter ifNotNil: [:p | p release] ]]! !
7468
7562
 
7469
 
!DrGStylePanel methodsFor: 'GUI building' stamp: 'hlsf 2/14/2022 11:39:14'!
 
7563
!DrGSmalltalkSketchEditor methodsFor: 'label' stamp: 'hlsf 5/1/2024 11:36:19'!
 
7564
restoreLabel
 
7565
        | defaultLabel |
 
7566
        defaultLabel := self sketchName ifEmpty: ['Edit Smalltalk Sketch' translated].
 
7567
        self label == defaultLabel              ifFalse: [self setLabel: defaultLabel]! !
 
7568
 
 
7569
!DrGStylePanel methodsFor: 'GUI building' stamp: 'hlsf 4/1/2024 17:01:29'!
7470
7570
buildMorphicWindow
7471
7571
        | labelWidth widgets |
7472
7572
        titleMorph showButtonsNamed: #(#close).
7473
 
        self layoutMorph separation: 4 ;
 
7573
        self layoutMorph separation: (Theme current scale: 4) ;
7474
7574
                axisEdgeWeight: #columnTop.
7475
 
        widgets _ model styleWidget.
7476
 
        labelWidth _ widgets max: [:rowOfMorph | (self searchLabelIn:           rowOfMorph) morphWidth].
 
7575
        widgets := model styleWidget.
 
7576
        labelWidth := widgets max: [:rowOfMorph | (self searchLabelIn:          rowOfMorph) morphWidth].
7477
7577
        widgets do: [:rowOfMorph |
7478
7578
                (self searchLabelIn: rowOfMorph) morphWidth: labelWidth.
7479
7579
                self addMorph: rowOfMorph].
7494
7594
                                
7495
7595
                ! !
7496
7596
 
7497
 
!DrGDrawableMenu methodsFor: 'events' stamp: 'hlsf 5/3/2020 23:43:15'!
 
7597
!DrGStylePanel methodsFor: 'as yet unclassified' stamp: 'hlsf 4/1/2024 16:57:51'!
 
7598
defaultColor
 
7599
        ^ self windowColor ! !
 
7600
 
 
7601
!DrGStylePanel methodsFor: 'as yet unclassified' stamp: 'hlsf 4/1/2024 16:57:46'!
 
7602
windowColor
 
7603
        ^ Theme current transcript ! !
 
7604
 
 
7605
!DrGDrawableMenu methodsFor: 'events' stamp: 'hlsf 3/30/2024 09:21:21'!
7498
7606
initialize
7499
7607
        super initialize.
7500
 
        self color: (self color alpha: 0.7).
 
7608
        self color: (self color alpha: 0.8).
7501
7609
        self borderColor: (self borderColor alpha: 0.7).
7502
7610
! !
7503
7611
 
7504
 
!DrGDrawableMenu methodsFor: 'events' stamp: 'hlsf 9/23/2021 12:04:49'!
 
7612
!DrGDrawableMenu methodsFor: 'events' stamp: 'hlsf 4/12/2024 12:22:33'!
7505
7613
mouseButton1Down: aMouseButtonEvent localPosition: localEventPosition
7506
7614
        "click outside => step blinking the selected item "
7507
7615
        (stayUp or: [(self coversLocalPoint:localEventPosition) or: [selectedItem isNil]]) 
7508
7616
                ifFalse: [
7509
 
                        selectedItem arguments first first stopBlinking.
 
7617
                        selectedItem arguments first first stopStepping. " blinking"
7510
7618
                        tool reset].
7511
7619
        super mouseButton1Down: aMouseButtonEvent localPosition: localEventPosition ! !
7512
7620
 
7513
 
!DrGDrawableMenu methodsFor: 'control' stamp: 'hlsf 8/3/2021 13:00:14'!
 
7621
!DrGDrawableMenu methodsFor: 'control' stamp: 'hlsf 4/12/2024 12:23:15'!
7514
7622
selectItem: aMenuItem 
7515
7623
        selectedItem ifNotNil:[
7516
 
                selectedItem arguments first first stopBlinking].
 
7624
                selectedItem arguments first first stopStepping " blinking"].
7517
7625
        aMenuItem ifNotNil:[
7518
 
                aMenuItem arguments first first startBlinking].
 
7626
                aMenuItem arguments first first startStepping " blinking"].
7519
7627
        ^ super selectItem: aMenuItem ! !
7520
7628
 
7521
7629
!DrGDrawableMenu methodsFor: 'accessing' stamp: 'hlsf 5/6/2020 14:17:28'!
7522
7630
tool: aDrGeoTool
7523
 
        tool _ aDrGeoTool ! !
 
7631
        tool := aDrGeoTool ! !
7524
7632
 
7525
7633
!DrGDrawable methodsFor: 'accessing' stamp: 'hlsf 8/4/2023 17:42:50'!
7526
7634
domain
7543
7651
 
7544
7652
!DrGDrawable methodsFor: 'accessing'!
7545
7653
ox: integer
7546
 
        ox _ integer asNumber! !
 
7654
        ox := integer asNumber! !
7547
7655
 
7548
7656
!DrGDrawable methodsFor: 'accessing'!
7549
7657
oy
7552
7660
 
7553
7661
!DrGDrawable methodsFor: 'accessing'!
7554
7662
oy: integer
7555
 
        oy _ integer asNumber! !
 
7663
        oy := integer asNumber! !
7556
7664
 
7557
7665
!DrGDrawable methodsFor: 'accessing' stamp: 'hlsf 8/4/2023 12:44:35'!
7558
7666
presenter
7567
7675
"Return a form preview"
7568
7676
        ^ self previewOn: ByteArray new writeStream! !
7569
7677
 
7570
 
!DrGDrawable methodsFor: 'accessing' stamp: 'hlsf 8/3/2023 21:28:55'!
 
7678
!DrGDrawable methodsFor: 'accessing' stamp: 'hlsf 4/2/2024 18:54:08'!
7571
7679
previewOn: aStream
7572
7680
"compute an PNG preiview, put it in the stream and return its form"
7573
7681
        |form |
7574
 
        form := (self imageForm: 32) magnifyBy: DrGeoSystem previewSize x / self morphExtent x.
 
7682
        form := (self imageForm: 32) magnifyBy: Theme current previewSize x / self morphExtent x.
7575
7683
        PNGReadWriter putForm: form onStream: aStream.
7576
7684
        ^ form! !
7577
7685
 
7587
7695
 
7588
7696
!DrGDrawable methodsFor: 'accessing'!
7589
7697
scaleNoRedraw: increment
7590
 
        scale _ (scale + increment) .
7591
 
        scale < 1 ifTrue: [scale _ 1.0].
7592
 
        scale > 1000 ifTrue: [scale _ 1000.0].
 
7698
        scale := (scale + increment) .
 
7699
        scale < 1 ifTrue: [scale := 1.0].
 
7700
        scale > 1000 ifTrue: [scale := 1000.0].
7593
7701
! !
7594
7702
 
7595
7703
!DrGDrawable methodsFor: 'accessing' stamp: 'hlsf 4/16/2022 17:53:55'!
7596
7704
setScaleTo: number
7597
 
        scale _ number asNumber.
 
7705
        scale := number asNumber.
7598
7706
        self updateGrid.
7599
7707
        self redrawNeeded ! !
7600
7708
 
7629
7737
 
7630
7738
!DrGDrawable methodsFor: 'callback' stamp: 'hlsf 5/1/2020 16:37:02'!
7631
7739
moveOx: increment
7632
 
        ox _ ox - increment.
 
7740
        ox := ox - increment.
7633
7741
        self redrawNeeded! !
7634
7742
 
7635
7743
!DrGDrawable methodsFor: 'callback' stamp: 'hlsf 5/1/2020 16:34:10'!
7636
7744
moveOxy: pointIncrement
7637
 
        ox _ ox - pointIncrement x.
7638
 
        oy _ oy - pointIncrement y.
 
7745
        ox := ox - pointIncrement x.
 
7746
        oy := oy - pointIncrement y.
7639
7747
        self redrawNeeded.! !
7640
7748
 
7641
7749
!DrGDrawable methodsFor: 'callback' stamp: 'hlsf 5/1/2020 16:34:27'!
7642
7750
moveOy: increment
7643
 
        oy _ oy + increment.
 
7751
        oy := oy + increment.
7644
7752
        self redrawNeeded! !
7645
7753
 
7646
7754
!DrGDrawable methodsFor: 'callback' stamp: 'hlsf 8/5/2021 12:48:46'!
7647
7755
zoom: anExtent
7648
 
        scale _ (scale + ((anExtent x + anExtent y) / 5)) asInteger.
7649
 
        scale _ scale min: 200.
 
7756
        scale := (scale + ((anExtent x + anExtent y) / 5)) asInteger.
 
7757
        scale := scale min: 200.
7650
7758
        self updateGrid.
7651
7759
        self redrawNeeded! !
7652
7760
 
7653
7761
!DrGDrawable methodsFor: 'coordinates' stamp: 'hlsf 5/1/2020 16:59:05'!
7654
7762
defaultScalePosition
7655
 
        ox _ oy := 0.0.
7656
 
        scale _ 34.0.
 
7763
        ox := oy := 0.0.
 
7764
        scale := 34.0.
7657
7765
        self updateGrid.
7658
7766
        self redrawNeeded! !
7659
7767
 
7761
7869
removeDottedLinesToParents
7762
7870
        valueItem ifNil: [^self].
7763
7871
        dottedLines do: [:line | self removeMorph: line].
7764
 
        dottedLines _ nil.
7765
 
        valueItem _ nil! !
 
7872
        dottedLines := nil.
 
7873
        valueItem := nil! !
7766
7874
 
7767
7875
!DrGDrawable methodsFor: 'drawing' stamp: 'hlsf 8/4/2023 12:19:10'!
7768
7876
updateDottedLinesToParents
7779
7887
!DrGDrawable methodsFor: 'drawing axes & grid' stamp: 'hlsf 3/17/2022 15:25:39'!
7780
7888
drawAxesOn: aCanvas
7781
7889
        | origin worldBound font p start |
7782
 
        origin _ self worldToMorph: 0@0.
7783
 
        worldBound _ self worldBound.
7784
 
        font _ DrGeoSystem canvasFont.
 
7890
        origin := self worldToMorph: 0@0.
 
7891
        worldBound := self worldBound.
 
7892
        font := DrGeoSystem canvasFont.
7785
7893
        
7786
7894
        "x-axis"
7787
7895
        (origin y > 0 and: [origin y < extent y]) ifTrue: [
7788
7896
                aCanvas line: 0 @ origin y  to: extent x @ origin y width: 1 color: Color lightGray.            
7789
7897
                "x labels in [0 ; +inf["
7790
 
                start _ worldBound origin x > gridScale 
 
7898
                start := worldBound origin x > gridScale 
7791
7899
                        ifTrue: [worldBound origin x roundUpTo: gridScale] 
7792
7900
                        ifFalse: [gridScale].
7793
7901
                start to: (worldBound corner x roundDownTo: gridScale) by: gridScale do: [:x | 
7796
7904
                gridScale negated to: (worldBound origin x roundUpTo: gridScale) by: gridScale negated do: [:x |
7797
7905
                        self drawGradX: x origin: origin on: aCanvas font: font].
7798
7906
                "orientation"
7799
 
                p _ extent x - 2 @ origin y.
 
7907
                p := extent x - 2 @ origin y.
7800
7908
                aCanvas line: p  to: p - `4 @ 4` width: 1 color: Color lightGray;
7801
7909
                        line: p to: p - `4 @ -4` width: 1 color: Color lightGray].
7802
7910
        
7807
7915
                gridScale to: (worldBound corner y roundDownTo: gridScale) by: gridScale do: [:y | 
7808
7916
                        self drawGradY: y origin: origin on: aCanvas font: font].
7809
7917
                "y labels in ]-inf ; 0["
7810
 
                start _ worldBound corner y < gridScale negated
 
7918
                start := worldBound corner y < gridScale negated
7811
7919
                        ifTrue: [worldBound corner y roundDownTo: gridScale] 
7812
7920
                        ifFalse: [gridScale negated].
7813
7921
                start to: (worldBound origin y roundUpTo: gridScale) by: gridScale negated do: [:y |
7814
7922
                        self drawGradY: y origin: origin on: aCanvas font: font].
7815
7923
                "orientations"
7816
 
                p _  origin x @ 0.
 
7924
                p :=  origin x @ 0.
7817
7925
                aCanvas line: p  to: p + `4 @ 4` width: 1 color: Color lightGray;
7818
7926
                        line: p to: p + `-4 @ 4` width: 1 color: Color lightGray].
7819
7927
 
7826
7934
drawGradX: x origin: origin on: canvas font: font
7827
7935
"Draw a tick on the (ox) axis with a graduation value"
7828
7936
        | str pos shift |
7829
 
        pos _ (self worldAbscissaToMorph: x asFloat) @ origin y.
7830
 
        str _ self labelForAxes: x.
7831
 
        shift _ self gridVisible ifTrue: [2@6] ifFalse: [(font widthOfString: str) / -2.0 @6].
 
7937
        pos := (self worldAbscissaToMorph: x asFloat) @ origin y.
 
7938
        str := self labelForAxes: x.
 
7939
        shift := self gridVisible ifTrue: [2@6] ifFalse: [(font widthOfString: str) / -2.0 @6].
7832
7940
        canvas drawString: str  at: pos + shift font: font color: Color lightGray.
7833
7941
        canvas line: pos - `0@2` to: pos + `0@2` width: 1.5 color: Color lightGray.! !
7834
7942
 
7836
7944
drawGradY: y origin: origin on: canvas font: font
7837
7945
"Draw a tick on the (oy) axis with a graduation value"
7838
7946
        | pos shift |
7839
 
        pos _ origin x @ (self worldOrdinateToMorph: y asFloat).
7840
 
        shift _ self gridVisible ifTrue: [5@2] ifFalse: [5 @ (font lineSpacing / -2.0)].
 
7947
        pos := origin x @ (self worldOrdinateToMorph: y asFloat).
 
7948
        shift := self gridVisible ifTrue: [5@2] ifFalse: [5 @ (font lineSpacing / -2.0)].
7841
7949
        canvas 
7842
7950
                drawString: (self labelForAxes: y)  
7843
7951
                at: pos + shift 
7848
7956
!DrGDrawable methodsFor: 'drawing axes & grid' stamp: 'hlsf 11/1/2022 20:30:25'!
7849
7957
drawGridOn: aCanvas
7850
7958
        | worldBound end start length step |
7851
 
        worldBound _ self worldBound.
7852
 
        step _ self worldToPixel: gridScale.
 
7959
        worldBound := self worldBound.
 
7960
        step := self worldToPixel: gridScale.
7853
7961
        "horizontal lines"
7854
 
        length _ extent x.
7855
 
        start _ self worldOrdinateToMorph: (worldBound corner y         roundTo: gridScale).
7856
 
        start < 0 ifTrue: [start _ start + step].
7857
 
        end _ extent y.
 
7962
        length := extent x.
 
7963
        start := self worldOrdinateToMorph: (worldBound corner y        roundTo: gridScale).
 
7964
        start < 0 ifTrue: [start := start + step].
 
7965
        end := extent y.
7858
7966
        start to: end by: step do: [:y |
7859
7967
                aCanvas line: 0 @ y to: length @ y  width: 0.4 color: Color lightGray].
7860
7968
        ""
7861
7969
        "vertical lines"
7862
 
        length _ extent y.
7863
 
        start _ self worldAbscissaToMorph: (worldBound origin x         roundTo: gridScale).
7864
 
        start < 0 ifTrue: [start _ start + step].
7865
 
        end _ extent x.
 
7970
        length := extent y.
 
7971
        start := self worldAbscissaToMorph: (worldBound origin x        roundTo: gridScale).
 
7972
        start < 0 ifTrue: [start := start + step].
 
7973
        end := extent x.
7866
7974
        start to: end by: step do: [:x |
7867
7975
                aCanvas line: x @ 0 to: x @ length width: 0.4 color: Color lightGray]! !
7868
7976
 
7870
7978
labelForAxes: number
7871
7979
        gridScale isFloat 
7872
7980
                ifTrue: [|integer|
7873
 
                        integer _ number asInteger.
 
7981
                        integer := number asInteger.
7874
7982
                        integer = number ifTrue: [^ integer printString]].
7875
7983
                ^ (number isInteger not and: [number isFraction]) 
7876
7984
                        ifTrue: [number printString allButFirst allButLast]
7881
7989
"Here we encapsulated the image morph (dropped) in a DrGBitmapItem.
7882
7990
We do not really need a builder to do so but we have to process it in the command stack"
7883
7991
        | item |
7884
 
        item _ (DrGBitmapItem newWith: {self morphToWorld: evt eventPosition})
 
7992
        item := (DrGBitmapItem newWith: {self morphToWorld: evt eventPosition})
7885
7993
                data: (self resizeImage: dropped form);
7886
7994
                insertAtScale: self scale.
7887
7995
        self domain createFromMathItem: item.! !
7890
7998
resizeImage: aForm
7891
7999
"Reszie the image to a maximum pixel number"
7892
8000
        | resizedForm maxPixels size ratio |
7893
 
        maxPixels _ 250000.
7894
 
        size _ aForm extent x * aForm extent y.
 
8001
        maxPixels := 250000.
 
8002
        size := aForm extent x * aForm extent y.
7895
8003
        size > maxPixels 
7896
 
                ifTrue: [ratio _ (maxPixels  / size) sqrt.
7897
 
                        resizedForm _ aForm magnifyBy: ratio]
7898
 
                ifFalse: [resizedForm  _ aForm].
 
8004
                ifTrue: [ratio := (maxPixels  / size) sqrt.
 
8005
                        resizedForm := aForm magnifyBy: ratio]
 
8006
                ifFalse: [resizedForm  := aForm].
7899
8007
        ^ resizedForm ! !
7900
8008
 
7901
8009
!DrGDrawable methodsFor: 'event handling testing' stamp: 'hlsf 5/1/2020 17:16:55'!
7961
8069
        evt shiftPressed 
7962
8070
                ifTrue: [self tool handleShiftKeyMouseAt: localEventPosition]
7963
8071
                ifFalse: [self tool handleMouseAt: localEventPosition].
7964
 
        prevMousePos _ localEventPosition! !
 
8072
        prevMousePos := localEventPosition! !
7965
8073
 
7966
8074
!DrGDrawable methodsFor: 'events' stamp: 'hlsf 6/21/2021 21:27:06'!
7967
8075
mouseLeave: evt
7979
8087
                                ifFalse: [self mouseMoveOxy: localEventPosition]
7980
8088
                ].              
7981
8089
        self updateUnderMouseMorphPosition.
7982
 
        prevMousePos _ localEventPosition.
 
8090
        prevMousePos := localEventPosition.
7983
8091
! !
7984
8092
 
7985
8093
!DrGDrawable methodsFor: 'events' stamp: 'hlsf 4/28/2020 12:21:19'!
7986
8094
mouseMoveOxy: newPosition
7987
8095
"move the whole sketch in the Oxy plane"
7988
8096
        |delta| 
7989
 
        delta _ newPosition - prevMousePos.
 
8097
        delta := newPosition - prevMousePos.
7990
8098
        delta r  < 100 ifTrue: "we need to check because in tablet mode, previous mouse position can be far away"
7991
8099
                [self moveOxy: (self pixelVectorToWorldVector: delta)]! !
7992
8100
 
7993
8101
!DrGDrawable methodsFor: 'events' stamp: 'hlsf 8/5/2021 12:51:36'!
7994
8102
mouseScroll: evt localPosition: localEventPosition
7995
8103
        | increment orginalWorldCursorPoint |
7996
 
        orginalWorldCursorPoint _ self morphToWorld: localEventPosition.
 
8104
        orginalWorldCursorPoint := self morphToWorld: localEventPosition.
7997
8105
"       WAIT for proper wheel event with modifier keys always on
7998
 
        increment _ evt shiftPressed ifTrue: [10] ifFalse: [2]."
7999
 
        increment _ 0.5.
 
8106
        increment := evt shiftPressed ifTrue: [10] ifFalse: [2]."
 
8107
        increment := 0.5.
8000
8108
        evt direction == #down
8001
8109
                ifTrue: [ self scaleNoRedraw: increment ].
8002
8110
        evt direction == #up
8065
8173
 
8066
8174
!DrGDrawable methodsFor: 'gridding' stamp: 'hlsf 4/30/2020 18:11:39'!
8067
8175
updateGridScaleForAxes
8068
 
        gridScale _ 50 / scale.
 
8176
        gridScale := 50 / scale.
8069
8177
        gridScale >= 1 
8070
8178
                ifTrue: [
8071
 
                        gridScale _ gridScale roundTo: 0.5.
8072
 
                        gridScale asInteger = gridScale ifTrue: [gridScale _ gridScale asInteger]] 
 
8179
                        gridScale := gridScale roundTo: 0.5.
 
8180
                        gridScale asInteger = gridScale ifTrue: [gridScale := gridScale asInteger]] 
8073
8181
                ifFalse: [
8074
 
                        gridScale _ 1 / ((1 / gridScale) rounded)]! !
 
8182
                        gridScale := 1 / ((1 / gridScale) rounded)]! !
8075
8183
 
8076
8184
!DrGDrawable methodsFor: 'gridding' stamp: 'hlsf 4/26/2020 14:46:44'!
8077
8185
updateGridScaleForGrid
8078
 
        gridScale _ 5! !
 
8186
        gridScale := 5! !
8079
8187
 
8080
8188
!DrGDrawable methodsFor: 'halos and balloon help' stamp: 'hlsf 6/21/2021 21:55:43'!
8081
8189
wantsHalo
8086
8194
        super dismissMorph.
8087
8195
        presenter view dismissMorph ! !
8088
8196
 
8089
 
!DrGDrawable methodsFor: 'initialize-release' stamp: 'hlsf 8/4/2023 18:33:52'!
 
8197
!DrGDrawable methodsFor: 'initialize-release' stamp: 'hlsf 3/30/2024 15:46:40'!
8090
8198
initialize
8091
8199
        super initialize.
8092
 
        self color: Theme current background.
8093
 
        self color: Color white.
 
8200
        self color: Theme current canvasBackground.
8094
8201
        self borderWidth: 0.
8095
8202
        tipOn := true.
8096
8203
        self defaultScalePosition.
8130
8237
                send: #redrawNeeded
8131
8238
                to: self.! !
8132
8239
 
8133
 
!DrGDrawable methodsFor: 'initialize-release' stamp: 'hlsf 8/4/2023 12:33:51'!
 
8240
!DrGDrawable methodsFor: 'initialize-release' stamp: 'hlsf 4/12/2024 15:19:23'!
8134
8241
release
8135
8242
        self domain removeActionsWithReceiver: self.
8136
 
        itemViews do: [:each | each release]! !
 
8243
        self removeAllMorphs ! !
8137
8244
 
8138
8245
!DrGDrawable methodsFor: 'item-view' stamp: 'hlsf 8/4/2023 11:08:35'!
8139
8246
deleteItemView: aMorph
8175
8282
                ifFound: [ :aMorph | aMorph ]
8176
8283
                ifNone: [ nil]! !
8177
8284
 
8178
 
!DrGDrawable methodsFor: 'item-view' stamp: 'hlsf 8/4/2023 12:16:24'!
 
8285
!DrGDrawable methodsFor: 'item-view' stamp: 'hlsf 4/12/2024 15:12:01'!
8179
8286
recoverViewOf: aMathItem 
8180
8287
        "a redo math item event : a math item has been recalled, find its morph "
8181
8288
        | itemMorph |
8183
8290
                detect: [:morph | morph mathItem == aMathItem]
8184
8291
                ifFound: [:morph | morph ]
8185
8292
                ifNone: [^ self itemView: aMathItem].
8186
 
        itemMorph mathItem: aMathItem.
8187
 
        itemMorph reInitialize.
 
8293
        itemMorph mathItem: aMathItem in: self.
 
8294
        itemMorph isBitmap 
 
8295
                ifTrue: [self addMorphBack: itemMorph ]
 
8296
                ifFalse: [self addMorph: itemMorph].
 
8297
        itemMorph 
 
8298
                labelMorph: itemMorph mathItem name     ;
 
8299
                forcedVisibility: false;
 
8300
                restoreNormalColor.
8188
8301
        undoneViews := undoneViews copyWithout: itemMorph.
8189
8302
        itemViews add: itemMorph! !
8190
8303
 
8225
8338
addMorph: newMorph
8226
8339
        | aLabel |
8227
8340
        newMorph class == DrGLabel ifTrue: [^ self addMorphFront: newMorph].
8228
 
        aLabel _ self mostBehindLabel.
 
8341
        aLabel := self mostBehindLabel.
8229
8342
        aLabel 
8230
8343
                ifNil: [self addMorphFront: newMorph]  
8231
8344
                ifNotNil: [self addMorph: newMorph behind: aLabel]! !
8247
8360
 
8248
8361
!DrGDrawable methodsFor: 'tip'!
8249
8362
toggleTip
8250
 
        tipOn _ tipOn not! !
 
8363
        tipOn := tipOn not! !
8251
8364
 
8252
8365
!DrGDrawable methodsFor: 'under mouse'!
8253
8366
showUnderMouseMorph
8280
8393
drawOn: aCanvas
8281
8394
"       | areaUnderHand |
8282
8395
        super drawOn: aCanvas.
8283
 
        areaUnderHand _ Form fromDisplay: (Rectangle 
 
8396
        areaUnderHand := Form fromDisplay: (Rectangle 
8284
8397
                        center: ActiveHand position 
8285
8398
                        extent: self extent - (self borderWidth * 2)).
8286
8399
        aCanvas drawImage: areaUnderHand at: self position + self borderWidth"! !
8291
8404
 
8292
8405
!DrGMorph methodsFor: 'accessing' stamp: 'hlsf 5/23/2021 12:43:28'!
8293
8406
color: aColor
8294
 
        color _ aColor! !
 
8407
        color := aColor! !
8295
8408
 
8296
 
!DrGMorph methodsFor: 'accessing' stamp: 'hlsf 8/4/2023 11:00:13'!
 
8409
!DrGMorph methodsFor: 'accessing' stamp: 'hlsf 4/12/2024 12:32:25'!
8297
8410
domain
8298
 
        ^ drawable domain! !
 
8411
        ^ self drawable domain! !
8299
8412
 
8300
 
!DrGMorph methodsFor: 'accessing' stamp: 'hlsf 8/4/2023 11:00:06'!
 
8413
!DrGMorph methodsFor: 'accessing' stamp: 'hlsf 4/12/2024 12:32:31'!
8301
8414
drawable
8302
 
        ^ drawable ! !
8303
 
 
8304
 
!DrGMorph methodsFor: 'accessing' stamp: 'hlsf 8/4/2023 11:00:30'!
8305
 
drawable: aDrawable
8306
 
        drawable  :=     aDrawable ! !
 
8415
        ^ owner ! !
8307
8416
 
8308
8417
!DrGMorph methodsFor: 'accessing' stamp: 'hlsf 5/24/2023 19:16:26'!
8309
8418
fontSize: aSmallInteger 
8310
8419
! !
8311
8420
 
 
8421
!DrGMorph methodsFor: 'accessing' stamp: 'hlsf 4/12/2024 11:24:33'!
 
8422
labelPositionDelta
 
8423
        ^ labelMorph delta! !
 
8424
 
8312
8425
!DrGMorph methodsFor: 'accessing' stamp: 'hlsf 3/30/2021 13:58:02'!
8313
8426
locked
8314
8427
        ^ mathItem isLocked! !
8326
8439
!DrGMorph methodsFor: 'accessing' stamp: 'hlsf 3/30/2021 13:55:46'!
8327
8440
mathItem: aMathItem
8328
8441
        self removeEvents.
8329
 
        mathItem _ aMathItem.
 
8442
        mathItem := aMathItem.
8330
8443
        self registerEvents.! !
8331
8444
 
 
8445
!DrGMorph methodsFor: 'accessing' stamp: 'hlsf 4/12/2024 12:40:58'!
 
8446
mathItem: aMathItem in: aDrawable
 
8447
        self removeEvents.
 
8448
        mathItem := aMathItem.
 
8449
        self registerEventsIn: aDrawable .! !
 
8450
 
8332
8451
!DrGMorph methodsFor: 'accessing' stamp: 'hlsf 8/5/2021 16:05:18'!
8333
8452
morphCenter
8334
8453
"Our center in our drawable"
8345
8464
        self labelMorph: mathItem name
8346
8465
! !
8347
8466
 
8348
 
!DrGMorph methodsFor: 'accessing' stamp: 'hlsf 8/4/2023 17:58:05'!
 
8467
!DrGMorph methodsFor: 'accessing' stamp: 'hlsf 4/12/2024 12:32:36'!
8349
8468
presenter
8350
 
        ^ drawable presenter ! !
 
8469
        ^ self drawable presenter ! !
8351
8470
 
8352
8471
!DrGMorph methodsFor: 'accessing' stamp: 'hlsf 3/30/2021 13:56:00'!
8353
8472
style
8355
8474
 
8356
8475
!DrGMorph methodsFor: 'accessing' stamp: 'hlsf 3/30/2021 13:56:33'!
8357
8476
style: aStyle
8358
 
        style _ aStyle ! !
 
8477
        style := aStyle ! !
8359
8478
 
8360
8479
!DrGMorph methodsFor: 'accessing' stamp: 'hlsf 4/7/2021 19:52:49'!
8361
8480
styleClass
8362
8481
        ^DrGStyle! !
8363
8482
 
8364
 
!DrGMorph methodsFor: 'accessing' stamp: 'hlsf 8/4/2023 12:47:01'!
 
8483
!DrGMorph methodsFor: 'accessing' stamp: 'hlsf 4/12/2024 12:32:51'!
8365
8484
view
8366
 
        ^ drawable view! !
 
8485
        ^ self drawable view! !
8367
8486
 
8368
8487
!DrGMorph methodsFor: 'printing' stamp: 'hlsf 4/3/2021 15:17:35'!
8369
8488
asString
8380
8499
handlesMouseDown: evt
8381
8500
       &