View this PageEdit this PageAttachments to this PageHistory of this PageHomeRecent ChangesSearch the SwikiHelp Guide
Hotspots: Admin Pages | Turn-in Site |
Current Links: Cases Final Project Summer 2007

Questions on Fall 2003 Milestone 2

Got questions on Fall 2003 Milestone 2? Ask 'em here.


please make sure you have declared your team on the Fall 2003 Team Declaration Page. everyone without a declared team by tomorrow (friday, 12 sept) afternoon will be divided into teams.

groups that are already on the team declaration page, can find their ta here: everyone else should check back friday afternoon.

thanks :)


Remember that the TAs are going to have a hard time grading your system if they can't figure out how to work your user interface. And the last thing you want is a cranky TA assigning your grade. =)

That's yet another good reason to visit your friendly TA and show them your work in progress. Not only can they give you feedback on your design / implementation, but they'll also have an idea how to work your system when it comes time to grade it.

If you haven't shown your system to the TA by the time you turn it in, please include a README file explaining how to use your system. It'll make them think fondly of your team while grading your system, which can only be a good thing.


A number of people have asked how to get a PluggableTextMorph to refuse all edits. Well, I couldn't figure out how to do it either, but I put together a small subclass that does it. You can find the .st at:

Note that if you use this in your code, you'll need to make sure to include it in your change set when you submit.


I have a question for this statement:
"Users should be able to display the GUI by executing HelpRepository browse" Anyone has an idea what it means?
Nhan Le

Jeff's response:
I've got a very good idea. When a user sends the message browse to the class HelpRepository (for example, by typing HelpRepository browse into a Workspace and hitting Alt-D to "Do It"), your code should open the GUI for your repository. Is that clearer?

Wouldn't that be HelpRepository new browse.?
Galen Hussey

nope. just HelpRepository browse. in squeak, you are not required to name a "new" method "new". you can even have multiple new methods, like one named "new" and one named "browse" that cause a different initial setup for the class. check out some of the classes in squeak in the browser. lots of them have many different class methods to handle new object creation.

I was just wondering whether "professor-blessed" list has been posted somewhere on the coweb; I can't find it!

Arash Mirdamadi

Jeff's response:

I linked the List of Potential How-To Tasks to the Milestone 2 page this afternoon.

So we have two ideas on how to store the taskInstructions.

1) Store all of the names, definitions and steps in the initialize method for HelpRepository.

2) Store each taskInstructions as a file using the fileOut capability and then just run a loop on the files in HelpRepository's initialize method.

Is either method prefered?

Nirmal Patel

Jeff's response:
Neither is really optimal. They both reduce reusability: the first forces you to hard-code the instructions into the class, while the second forces you to hard-code the path to look for the instruction files.

You really want an approach where a user loads the instructions into his image once (imagine the user has downloaded new instructions for a task from the web) and then they persist in the image and are available to all HelpRepository instances. Here's a hint: instances aren't persistent, but classes are. Instead of putting the data in one of HelpRepository's methods, is there another way you could associate it with HelpRepository?

I think we are confused on the correct way to store the Tasks. Right now, if the user imports (fileIn) a task, quits squeak and comes back in - the task will not be there anymore. We cannot figure out how to store the tasks such that they will be there when somebody comes back in. We thought about dynamically creating a class for each task (so, the user makes a new class and we create a class that extends from TaskInstructions or something). This would be persistent across squeak closing (we think), but it seems unreasonable to create a class for each task. What are we missing? =(

Jason Whitehurst

Jeff's response:
The approach I was thinking of was to store the instructions in a class variable. Because the HelpRepository is persistent across sessions with the image, the class variable would persist as well. You could then give each new instance a copy of the instructions in the class variable when you initialize it (and when the user loads a new instruction set, add a copy to the class variable).

A slightly more advanced approach would be to utilize a PoolDictionary. But we won't cover those in the course, so we don't expect you to use one. =)

Regarding the class variable to store the instructions, how do you go about initializing the class variable so that it can be set to be an OrderedCollection? I get MessageNotUnderstood error when trying to copy from the class variable to instance variable because I haven't specified that the class variable is an OrderedCollection.

Austin Syfert

The .nfo file says that when a task name is clicked, *all* of the steps should be displayed.

But later we write methods to get the next and previous step (in the idea that they will go through a book-type window one step at a time).

Which should it be? Right now we just show all of the steps in the browser window (and were assuming we do the book-type thing in future milestones.

Jason Whitehurst

Jeff's response:
Showing all of the steps in the browser window is exactly right for this milestone. For Milestone 4 you'll start building the GUI that walks the user through the instuctions step by step (book-style).

In addition to the requirements listed in the milestone directions, must our GUI also support the new keyword searching functionality?

Martin Robinson

Jeff's response:
Nope. You'll add that functionality to the GUI for your Guide in Milestone 4.

We had decided to go ahead and add this to our gui - it would be a pain to remove it. =) I *assume* it was OK to go above and beyond? ;-)
Jason Whitehurst

Jeff's response:
Well, we'll let it slide this time. =)

I would like to know if the following is allowed:

1. User selects a button that says browse/add.
2. So in the window, a browser will appear on the left side (a list)
3. On the right there will be some text boxes.
4. So whenever a user selects a task name, it will put all
the info on those text boxes. And from there the user will be able
to add/change any task.

Is this allowed to fulfill the requisites of browsing, seeing what was clicked on the browser, and adding.


Jorge Lage

Jeff's response:
It's a little tough to tell fron your description exactly how you want the interaction to flow. Where is the browse/add button? What window is the list (browser) appearing in? The Squeak window? How many text boxes are there on the right? It sounds like you want users to be able to edit the detailed instructions in the same text window they're displayed in, which would be fine. But how does the user create a new set of instructions?

It sounds like what you're describing might fulfill the requirements, but without more detail I can't say for sure.

Jorge Lage
When I do:
HelpRepository browse. (Alt-p)
A GUI appears with two panes. One on the left (about 20% of width of the entire GUI) where the buttons are, ie. "Browse/Add", "Save Task", etc...
The second pane is the main one, the center of the GUI. So when the users clicks on "Browse/Add" the main pane is filled. Half of the main pane is a list of task names, and the idea is to put in the other half, three text boxes, one for the task name, the other for the description, and the other for the steps. So far the browse requirements looks good.
After the three text boxes there will be two buttons. One for "Add/Edit" and the other for "Clear fields".
You will be able to edit by erasing, typing stuff and then clikcin on the "Add/Edit". If you would like to add something, you will clear the fields and type the new one.

Is it more clear now?


Jeff's response:
That's much clearer. Overall it sounds like your interface would fulfill the requirements. Putting my UI designer hat on, I do have a few suggestions on improving the UI (and take these with a grain of salt, since I haven't actually seen your UI):

That gives you a pane on the left that shows the task names, three text boxes on the right for details, and "File In", "File Out", "New", and "Accept" buttons.

So what was decided on the SUnit for the GUI, are we supposed to have some or GUI is not be included in the SUnit but just the model?

Riyaz Habibbhai

Jeff's response:
Automating tests of a user interface is pretty difficult, because you've got to simulate user input, and as far as I know SUnit doesn't provide any such facilities. Therefore we won't expect you to have SUnit tests on any GUI functionality that requires user interaction. However, you can (and should) test the parts of your Model and View that you can verify programmatically.

Hi, I have a question regarding the helpTasksMatching: aCollectionOfStrings method.

Is/are the keyword(s) to be included with the task itself? For example, if a user would like to search for a certain task using certain keywords, would the system have to search for this keyword in the taskName, taskDescription, or instruction steps? Or is there a pre-supplied keyword that goes with each task, and the system would only need to compare these keywords, and be able to determine whether a task matches the correct description.

Please let me know if you don't understand the question.
Nguyen Truong

IANATA, but in the instructions they suggest adding special methods and variables for holding keywords in tasks - I would assume we would store the keywords in the same file as a task.
Galen Hussey

Jeff's reply:
What Galen said.

Note that you can choose how your system determines what the keywords are for a particular task: does the user supply them, or does the system auto-generate them?

PluggableTextMorph Question:

We're using PluggableTextMorph to enter text where we edit the tasks. In the editor window that we have, there is a save button that the user presses to save the changes and close the editor window. Right now we have to hit alt-s in the PluggableTextMorph to change the text. We tried using the getText methods for PluggableTextMorph but the text doesn't change unless you hit alt-s. Is there a way to change this so we can get the text from the morphs and change the instructions at one time when the user hits save instead of having to press alt-s first?
Jeff Shaffer

myPlugMorph accept.

Jason Whitehurst

For our keyword matching we don't do a ratio we do a score. The idea is that if a keyword occurs in the task name then it is weighted more than if it appears in the description or steps. This allows for a better matching between keywords and tasks. We thought of the idea because this is how windows and mac does it. With our most recent read over of the requirements we are wondering if this is okay?

Nirmal Patel

Any idea on the best way to complete the SUnits? Since Tasks is a class variable, if I edit Tasks to get it into a known state for my test cases to work, then the next time the user opened up a GUI, all the tasks they added and edited would be gone. I don't want to back it up and reset it during each setUp/tearDown...that would be bad. Any ideas?

Jason Whitehurst

Should the scenario we turn in be a use case scenario that shows
no internal workings of our system? Or should we show how our
objects will interact with each other in the scenario?


William Tuck

If you look on page 91, and in the "Designing Objects Systems" lecture slides there are good examples of the scenarios.
Kris Kemper

Ok, I'm wondering if someone has a quick way for off campus people ot incorporate CVS into Squeak. Right now I have to go back and forth between ftp'n to a CoC server then switching to SecureCRT to run CVS commands and then ftp'n back, and then doing all the DVS stuff in Squeak. I'm wondering if there's a way Squeak can do all of this for me. I'm looking all over the web and not finding much luck. Please help.

Joe Yeager

Nevermind, I found a great resource for all you Windows users:

We were looking at the Milestones for previous semesters. They said that CRC do not need to include GUI classes. So that would leave only a few cards for M2? Secondly, should the Collaborators section of the CRC card only include classes that have a HasA relationship?

Liang Wen

Jorge Lage
Is it a requirement to have the steps numbered when we show them
in the GUI?

Is there a way to move classes from one category to another, so that I can just turn in one nice .st file, as opposed to 3 or 4, each made by a different team member?

Jordan Bethea

Just highlight the class name and in the class definition below change the category name to whatever you want it to be.

Link to this Page