This is FacePamphlet, that is a very simple incarnation of facebook (social network of people).
There are some milestones that allow you to head towards, like a stepping stone to figure out the path to take to get the assignment done. Here are the milestones and also some code that will be linked into the milestones
Milestone 1: Create the west side panel
To create the panels with the data, then need to pull some data from the files that are present on the filesystem. Things like the name of the user is stored in a file and also friends, requests of friends etc, so to create for example below the list of friends that I would have, the repository class is already created and that “talks” to the filesystem to get the data in question (either locally in my case, and also in the testing phrasing of the assignment) but if you changed it to a network setup then it would get the data from a remote server. I have created a few private variables that will store the different parts of the graphics user interface so that I can “talk” to them with just referencing there name, which makes it allot more easier to update there details in the future.
Below the first code will get the full user name from the repository and add it to the WEST panel and then it will retrieve the list of names of friends into a String array and then cycle through to add them to the friends list on the WEST panel again.
usersName = new JButton(repository.getProperty(userID + FILE_NAME));
add(usersName, WEST);
friendsList = new FPScrollableList();
// add to the friends list
myFriends = repository.getMyFriends();
for (int i=0; i < myFriends.length; i++)
friendsList.add(myFriends[i]);
add(new JLabel("Friends:"), WEST);
add(friendsList,WEST); |
usersName = new JButton(repository.getProperty(userID + FILE_NAME));
add(usersName, WEST);
friendsList = new FPScrollableList();
// add to the friends list
myFriends = repository.getMyFriends();
for (int i=0; i < myFriends.length; i++)
friendsList.add(myFriends[i]);
add(new JLabel("Friends:"), WEST);
add(friendsList,WEST);
Milestone 2 – interactors
Interactors with the different parts of the GUI is nice and a good way is using the above code, e.g. using private variables that can be able to talk to when we get clicks from the GUI on buttons and want to find out which item was clicked, also since we are using some stanford custom code like FPScrollableList, FPScollableTextArea which you have to add the listens and also tell the called function what command (in string text) has been called.
friendsList.addActionListener(this);
friendsList.setActionCommand(VISIT); |
friendsList.addActionListener(this);
friendsList.setActionCommand(VISIT);
the VISIT is a static final string so that encase any thing is altered just alter it once (it equals = “VISITS”)
Milestone 3: Create the center panel
The centre panel creates the basic information of the user, but also displays a graphical image and also error reporting with status updates as well. With the graphics object the graphics is saved within a string format, which using the FPTools has a graphics to string converter, but to rescale the image I am seeing if the height/width is beyond centre size then alter the image by the size that is available divided by the size of the graphical object.
if (picCentre.getHeight() > FPConstants.MAX_IMAGE_HEIGHT)
{
double newHeight = FPConstants.MAX_IMAGE_HEIGHT / picCentre.getHeight();
picCentre.scale(newHeight);
}
if (picCentre.getWidth() > CENTERWIDTH)
{
double newWidth = CENTERWIDTH/ picCentre.getWidth();
picCentre.scale(newWidth);
}
picCentre.setLocation(FPConstants.LEFT_MARGIN, FPConstants.IMAGE_TOP);
add(picCentre); |
if (picCentre.getHeight() > FPConstants.MAX_IMAGE_HEIGHT)
{
double newHeight = FPConstants.MAX_IMAGE_HEIGHT / picCentre.getHeight();
picCentre.scale(newHeight);
}
if (picCentre.getWidth() > CENTERWIDTH)
{
double newWidth = CENTERWIDTH/ picCentre.getWidth();
picCentre.scale(newWidth);
}
picCentre.setLocation(FPConstants.LEFT_MARGIN, FPConstants.IMAGE_TOP);
add(picCentre);
updating the error messages I am using a function that takes the message as string and then just output the message, I am removing object and then just re-creating it and placing on the area specified in the FPConstants class. (you could test to see if there is any message length and thus create the infoMessage object)
private void updateErrorMessage(String message)
{
if (infoMessage !=null) remove(infoMessage);
infoMessage = new GLabel(message);
infoMessage.setFont(FPConstants.INFO_MESSAGE_FONT);
infoMessage.setColor(FPConstants.INFO_MESSAGE_COLOR);
infoMessage.setLocation(FPConstants.LEFT_MARGIN, FPConstants.APPLICATION_HEIGHT - FPConstants.BOTTOM_MARGIN);
add(infoMessage);
} |
private void updateErrorMessage(String message)
{
if (infoMessage !=null) remove(infoMessage);
infoMessage = new GLabel(message);
infoMessage.setFont(FPConstants.INFO_MESSAGE_FONT);
infoMessage.setColor(FPConstants.INFO_MESSAGE_COLOR);
infoMessage.setLocation(FPConstants.LEFT_MARGIN, FPConstants.APPLICATION_HEIGHT - FPConstants.BOTTOM_MARGIN);
add(infoMessage);
}
Milestone 4: Implement the interactors
Here is the interactor for when you click on requesting a friend, or press enter on the friends name text box (getActionCommand), to start with I am getting the text of the friends and seeing if there is any friends with the same name already in my friends list, else if not then send a request. I have include the error reporting and also the message string is the error string that is being sent back to inform the user what is being happening.
if ((event.getSource() == friendRequestButton) || event.getActionCommand().equals(FRIENDREQUEST))
{
String requested = friendRequest.getText();
if (requested.length() > 0)
{
try
{
if (repository.isMyFriend(requested))
Message = requested + " is already your friend";
else
{
repository.requestFriend(requested);
Message = "Requested friend : " + requested;
}
repository.setProperty(homeUserID + FILE_LOG , "Requested friend " + requested);
}
catch (NullPointerException ex)
{
Message = "Not sure of name ? "+ requested + " : error : "+ ex.getMessage();
}
catch (ErrorException ex)
{
Message = "Not sure of name ? "+ requested + " : error : "+ ex.getMessage();
}
}
friendRequest.setText("");
} |
if ((event.getSource() == friendRequestButton) || event.getActionCommand().equals(FRIENDREQUEST))
{
String requested = friendRequest.getText();
if (requested.length() > 0)
{
try
{
if (repository.isMyFriend(requested))
Message = requested + " is already your friend";
else
{
repository.requestFriend(requested);
Message = "Requested friend : " + requested;
}
repository.setProperty(homeUserID + FILE_LOG , "Requested friend " + requested);
}
catch (NullPointerException ex)
{
Message = "Not sure of name ? "+ requested + " : error : "+ ex.getMessage();
}
catch (ErrorException ex)
{
Message = "Not sure of name ? "+ requested + " : error : "+ ex.getMessage();
}
}
friendRequest.setText("");
}
Milestone 5: Shift over to the networked repository
Since I am running on the local PC, then I cannot connect to the Stanford server to test with, so will just guess that it is working :).
I also did implement a basic logging of the last actioned, in the users repository directory, and also if a user updates there pending friends request list and another user is viewing there FacePamphlet account and the friends list is updated then it will report the new friend in the status messages.
Going to implement in the extensions
- Search for some friends with key words e.g. part of the name
- status line on 2-x lines
- change the middle gcanvas to a jpanel
- friend finder – friends that you could link to from your friends already
Shall post extension next.