home *** CD-ROM | disk | FTP | other *** search
/ Fresh Fish 5 / FreshFish_July-August1994.bin / bbs / dev / alst-3.04.lha / ALSt-3.04 / src / stdwin.st < prev    next >
Encoding:
Text File  |  1994-05-14  |  10.7 KB  |  473 lines

  1. Class StandardWindows Object
  2. Class Window Object number title menus size
  3. Class   TextWindow Window text
  4. Class   GraphicsWindow Window
  5. Class      DictionaryWindow GraphicsWindow dict select action
  6. Class         BrowserWindow DictionaryWindow class method mw tw
  7. Class EventManager Process responses
  8. Class Menu Object number title itemtitles items enablestatus
  9. Methods Window 'all'
  10.     new
  11.         title <- ''.
  12.         menus <- List new.
  13.         (1 to: 15) do: [:i | (windows at: i) isNil
  14.             ifTrue: [ windows at: i put: self.
  15.                     number <- i.  ^ self ] ]
  16. |
  17.     attachMenu: menu
  18.         menus addLast: menu.
  19.         <162 number 2 (menu number)>
  20. |
  21.     activate
  22.         ^ nil
  23. |
  24.     deactivate
  25.         ^ nil
  26. |
  27.     drawEvent
  28.         " overridden in subclasses "
  29.         ^ nil
  30. |
  31.     mouseMoveTo: mouseLocation
  32.         " mouse moved with button down "
  33.         ^ nil
  34. |
  35.     mouseDownAt: mouseLocation
  36.         " mouse down, do nothing "
  37.         ^ nil
  38. |
  39.     mouseUpAt: mouseLocation
  40.         " mouse up "
  41.         ^ nil
  42. |
  43.     command: n
  44.         (n = 1) ifTrue: [ self close ]
  45. |
  46.     reSized
  47.         size <- <161 number 6>
  48. |
  49.     open
  50.         " open our window, unless already opened "
  51.         <160 number title 0>.
  52.         menus do: [:m | <162 number 2 (m number)> ].
  53.         self reSized.
  54. |
  55.     charTyped: c
  56.         smalltalk beep
  57. |
  58.     title: text
  59.         title <- text.
  60.         <164 number title>
  61. |
  62.     close
  63.         " close up shop "
  64.         <161 number 1>.
  65.         windows at: number put: nil
  66. ]
  67. Methods TextWindow 'all'
  68.     open
  69.         "open the window with implicit text buffer"
  70.         <160 number title 1>.
  71.         " now do other initialization "
  72.         super open
  73. |
  74.     activate
  75.         super activate.
  76.         printer <- self.
  77. |
  78.     deactivate
  79.         super deactivate.
  80.         printer <- stdout.
  81. |
  82.     text
  83.         " read updated text and store it"
  84.         ^ text <- <165 number>
  85. |
  86.     print: text
  87.         <166 number text>
  88. |
  89.     draw
  90.         "redraw window"
  91.         <161 number 2>.
  92.         <161 number 5>.
  93.         <161 number 3>
  94. ]
  95. Methods GraphicsWindow 'all'
  96.     startDrawing
  97.         <161 number 2>
  98. |
  99.     endDrawing
  100.         <161 number 3>
  101. |
  102.     drawEvent
  103.         self startDrawing.
  104.         self draw.
  105.         self endDrawing.
  106. |
  107.     draw
  108.         " done by subclasses "
  109.         ^ nil
  110. |
  111.     at: x and: y print: text
  112.         <190 x y text>
  113. ]
  114. Methods DictionaryWindow 'all'
  115.     open
  116.         itms at: number put: 0.
  117.         super open
  118. |
  119.     action: aBlock
  120.         action <- aBlock
  121. |
  122.     dictionary: d
  123.         dict <- d.
  124.         <163 number 2 4 (1* d size)>
  125. |
  126.     draw        | loc itm |
  127.         loc <- 0.
  128.         itm <- itms at: number.
  129.         dict binaryDo: [:a :b |
  130.             self at: 0 and: loc print: a asString.
  131.             loc <- loc + 1 ].
  132.         select <- 0@(itm) to: 20@(itm + 1).
  133.         self invertSelection.
  134.         <163 number 3 0 itm>
  135. |
  136.     mouseDownAt: mouseLocation    | loc itm |
  137.         loc <- 0.
  138.         itm <- itms at: number.
  139.         dict binaryDo: [:a :b |
  140.             (loc = itm) ifTrue: [ action value: b. ^ nil ].
  141.             loc <- loc + 1 ]
  142. |
  143.     invertSelection
  144.         self startDrawing.
  145.         (select notNil)
  146.             ifTrue: [ select invert ].
  147.         self endDrawing.
  148. |
  149.     command: n    | itm |
  150.         (n = 1) ifTrue: [ self close ].
  151.         (n = 4) ifTrue: [
  152.             itm <- itms at: number.
  153.             select <- 0@(itm) to: 20@(itm + 1).
  154.             self invertSelection.
  155.             (itm > 0) ifTrue: [
  156.                 itm <- itm - 1.
  157.                 itms at: number put: itm.
  158.                 select <- 0@(itm) to: 20@(itm + 1) ].
  159.             self invertSelection.
  160.             <163 number 3 0 itm> ].
  161.         (n = 5) ifTrue: [
  162.             itm <- itms at: number.
  163.             select <- 0@(itm) to: 20@(itm + 1).
  164.             self invertSelection.
  165.             (itm < (dict size - 1) ) ifTrue: [
  166.                 itm <- itm + 1.
  167.                 itms at: number put: itm.
  168.                 select <- 0@(itm) to: 20@(itm + 1) ].
  169.             self invertSelection.
  170.             <163 number 3 0 itm> ].
  171.         (n = 9) ifTrue: [
  172.             self mouseDownAt: 0@(itms at: number) ]
  173. ]
  174. Methods BrowserWindow 'all'
  175.     new
  176.         super new.
  177.         dict <- classes.
  178.         action <- [:c | self selectClass: c ].
  179.         self makeBrowserMenu.
  180. |
  181.     close
  182.         " close all our windows "
  183.         tw notNil ifTrue: [ tw close ].
  184.         mw notNil ifTrue: [ mw close ].
  185.         super close.
  186. |
  187.     selectClass: c
  188.         class <- c.
  189.         browserMenu enableItem: 2.
  190.         browserMenu disableItem: 3.
  191.         browserMenu disableItem: 4.
  192.         tw notNil ifTrue: [ tw close ].
  193.         mw notNil ifTrue: [ mw close ].
  194.         self openMethodWindow
  195. |
  196.     openMethodWindow
  197.         tw notNil ifTrue: [ tw close ].
  198.         browserMenu disableItem: 3.
  199.         mw notNil ifTrue: [ mw close ].
  200.         browserMenu enableItem: 2.
  201.         mw <- DictionaryWindow new; 
  202.             title: class printString,  ' Methods';
  203.             dictionary: class methods;
  204.             action: [:c | self selectMethod: c ];
  205.             attachMenu: browserMenu;
  206.             open.
  207. |
  208.     selectMethod: m
  209.         method <- m.
  210.         tw notNil ifTrue: [ tw close ].
  211.         tw <- TextWindow new; 
  212.             title: class printString , ' ', m asString;
  213.             attachMenu: browserMenu;
  214.             open.
  215.         browserMenu enableItem: 3.
  216.         tw print: m text
  217. |
  218.     makeBrowserMenu
  219.         browserMenu isNil ifTrue: 
  220.             [ browserMenu <- Menu new; title: 'Browser'; create.
  221.             browserMenu addItem: 'add class'
  222.                 action: [:w | self addClass ].
  223.             browserMenu addItem: 'add method'
  224.                 action: [:w | self addMethod ].
  225.             browserMenu addItem: 'compile'
  226.                 action: [:w | self compile ].
  227.             browserMenu addItem: 'command'
  228.                 action: [:w | self doCommand ] ].
  229.         browserMenu disableItem: 2.
  230.         browserMenu disableItem: 3.
  231.         browserMenu disableItem: 4.
  232.         self attachMenu: browserMenu
  233. |
  234.     addClass    
  235.         " add a new class "
  236.         tw notNil ifTrue: [ tw close ].
  237.         browserMenu enableItem: 4.
  238.         tw <- TextWindow new; title: 'New Class Information';
  239.             open; attachMenu: browserMenu;
  240.             print: 'superClass addSubClass: #nameOfClass ',
  241.                 'instanceVariableNames: ''var1 var2'' '
  242. |
  243.     addMethod
  244.         method <- Method new.
  245.         tw notNil ifTrue: [ tw close ].
  246.         tw <- TextWindow new; 
  247.             title: class printString , ' new method'.
  248.         tw open; attachMenu: browserMenu.
  249.         browserMenu enableItem: 3.
  250. |
  251.     compile
  252.         method text: tw text.
  253.         (method compileWithClass: class)
  254.             ifTrue: [ class methods at: method name put: method.
  255.                 mw drawEvent ].
  256. |
  257.     doCommand
  258.         " accept tw command "
  259.         [ tw text execute. tw close. self drawEvent ] fork.
  260. ]
  261. Methods Menu 'all'
  262.     new
  263.         items <- Array new: 0.
  264.         itemtitles <- Array new: 0.
  265.         enablestatus <- Array new: 0.
  266.         (1 to: 15) do: [:i | (menus at: i) isNil
  267.             ifTrue: [ menus at: i put: self.
  268.                     number <- i.  ^ self ] ]
  269. |
  270.     number
  271.         ^ number
  272. |
  273.     addItem: name action: aBlock
  274.         items <- items with: aBlock.
  275.         itemtitles <- itemtitles with: name.
  276.         enablestatus <- enablestatus with: true.
  277.         <181 number name nil>
  278. |
  279.     enableItem: n
  280.         enablestatus at: n put: true.
  281.         <182 number n 1 1>
  282. |
  283.     disableItem: n
  284.         enablestatus at: n put: false.
  285.         <182 number n 1 0>
  286. |
  287.     selectItem: n inWindow: w
  288.         " execute the selected menu item "
  289.         (items at: n) value: w
  290. |
  291.     title: aString
  292.         " give the title to a menu item"
  293.         title <- aString
  294. |
  295.     create
  296.         "create menu"
  297.         <180 number title>.
  298.         " reinstate any old items "
  299.         (1 to: items size) do:
  300.             [:i | <181 number (itemtitles at: i) nil>. 
  301.                 (enablestatus at: i) 
  302.                     ifFalse: [ self disableItem: i]]
  303. ]
  304. Methods EventManager 'all'
  305.     new
  306.         responses <- Array new: 12.
  307.         responses at: 1 put: [:w | w activate ].
  308.         responses at: 2 put: [:w | w charTyped: (Char new; value: <171 4>) ].
  309.         responses at: 3 put: [:w | w command: <171 9> ].
  310.         responses at: 4 put: [:w | w mouseDownAt: self mouseLocation ].
  311.         responses at: 5 put: [:w | w mouseMoveTo: self mouseLocation ].
  312.         responses at: 6 put: [:w | w mouseUpAt: self mouseLocation ].
  313.         responses at: 7 put: [:w | self eventMenu 
  314.             selectItem: self menuItem inWindow: w ].
  315.         responses at: 8 put: [:w | w reSized ].
  316.         responses at: 9 put: [:w | w moved ].
  317.         responses at: 10 put: [:w | w drawEvent ].
  318.         responses at: 11 put: [:w | w timer ].
  319.         responses at: 12 put: [:w | w deactivate ].
  320. |
  321.     eventWindow
  322.         ^ windows at: <171 1>
  323. |
  324.     eventMenu
  325.         ^ menus at: <171 2>
  326. |
  327.     menuItem
  328.         ^ <171 3>
  329. |
  330.     mouseLocation
  331.         " return the current location of the mouse "
  332.         ^ <172 1>
  333. |
  334.     execute        | i |
  335.         " process one event "
  336.         i <- <170>.  (i = 0)
  337.         ifFalse: [ (responses at: i) value: self eventWindow ]
  338. ]
  339. Methods StandardWindows 'all'
  340.     makeSystemMenu
  341.         systemMenu isNil ifTrue:
  342.             [ systemMenu <- Menu new; title: 'System'; create.
  343.             systemMenu addItem: 'browser' 
  344.                 action: [:w | BrowserWindow new; title: 'Browser'; open ].
  345.             systemMenu addItem: 'file in'
  346.                 action: [:w | [ File new; 
  347.                     fileIn: (smalltalk askFile: 'file name:')] fork ].
  348.             systemMenu addItem: 'save image'
  349.                 action: [:w | [ smalltalk saveImage: 
  350.                     (smalltalk askNewFile: 'image file:') ] fork ].
  351.             systemMenu addItem: 'quit'
  352.                 action: [:w | scheduler quit ]
  353.             ]
  354. |
  355.     makeWorkspaceMenu
  356.         workspaceMenu isNil ifTrue: [
  357.             workspaceMenu <- Menu new; title: 'Workspace'; create.
  358.             workspaceMenu addItem: 'print it'
  359.                 action: [:w | [ w print:  w text value asString ] fork ].
  360.             workspaceMenu addItem: 'do it'
  361.                 action: [:w | [ w text execute ] fork ]]
  362. |
  363.     makeWorkspace
  364.         TextWindow new; title: 'Workspace';
  365.             open; attachMenu: systemMenu; attachMenu: workspaceMenu.
  366. ]
  367. *
  368. * initialization code
  369. * this is executed once, by the initial image maker
  370. *
  371. *
  372. Methods Smalltalk 'doit'
  373.     error: aString    | ew |
  374.         " print a message, and remove current process "
  375.         scheduler currentProcess trace.
  376.         <204 aString>.
  377.         scheduler currentProcess terminate
  378. ]
  379. Methods Scheduler 'get commands'
  380.     initialize
  381.         stdwin makeSystemMenu.
  382.         stdwin makeWorkspaceMenu.
  383.         stdwin makeWorkspace.
  384.         eventManager <- EventManager new.
  385.         scheduler addProcess: eventManager
  386. |
  387.     quit
  388.         " all done - really quit "
  389.         " should probably verify first "
  390.         notdone <- false
  391. ]
  392. Methods UndefinedObject 'initial image'
  393.     createGlobals
  394.         " create global variables in initial image "
  395.         true <- True new.
  396.         false <- False new.
  397.         smalltalk <- Smalltalk new.
  398.         files <- Array new: 15.
  399.         stdin <- File new; name: 'stdin'; mode: 'r'; open.
  400.         stdout <- File new; name: 'stdout'; mode: 'w'; open.
  401.         stderr <- File new; name: 'stderr'; mode: 'w'; open.
  402.         printer <- stdout.
  403.         " create a dictionary of classes "
  404.         classes <- Dictionary new.
  405.         symbols binaryDo: [:x :y | 
  406.             (y class == Class)
  407.                 ifTrue: [ classes at: x put: y ] ].
  408.         scheduler <- Scheduler new.
  409.         stdwin <- StandardWindows new.
  410.         windows <- Array new: 15.
  411.         menus <- Array new: 15.
  412.         itms <- Array new: 15
  413. |
  414.     initialize    | aBlock |
  415.         " initialize the initial object image "
  416.         self createGlobals.
  417.         " create the initial system process "
  418.         " note the delayed recursive call "
  419.         aBlock <- [ files do: [:f | f notNil ifTrue: [ f open ]].
  420.                 menus do: [:m | m notNil ifTrue: [ m create ]].
  421.                 windows do: [:w | w notNil ifTrue: [ w open ]].
  422.                 systemProcess <- aBlock newProcess.
  423.                 scheduler run ].
  424.         systemProcess <- aBlock newProcess.
  425.         File new;
  426.             name: 'systemImage';
  427.             open: 'w';
  428.             saveImage;
  429.             close.
  430. ]
  431. Methods String 'test'
  432.     print
  433.         ^ printer print: self
  434. ]
  435. Methods Smalltalk 'interface'
  436.     getPrompt: aString
  437.         ^ <201 aString ''>
  438. |
  439.     askNewFile: prompt
  440.         " ask for a new file name "
  441.         ^ <203 prompt '' 1>
  442. |
  443.     askFile: prompt
  444.         ^ <203 prompt '' 0>
  445. |
  446.     inquire: aString
  447.         ^ <202 aString 1>
  448. ]
  449. Methods Rectangle 'drawing'
  450.     frame
  451.         <194 1 left top right bottom>
  452. |
  453.     paint
  454.         <194 2 left top right bottom>
  455. |
  456.     erase
  457.         <194 3 left top right bottom>
  458. |
  459.     invert
  460.         <194 4 left top right bottom>
  461. |
  462.     shade: aPercent
  463.         <195 1 left top right bottom aPercent>
  464. ]
  465. Methods Smalltalk 'beep'
  466.     beep
  467.         <205>
  468. ]
  469. Methods Circle 'drawing'
  470.     frame
  471.         <193 1 (center x) (center y) radius>
  472. ]
  473.