/* * Post-It program for Java. Let's user put rectangles on the screen, move * them, and remove them. Written 2/13/00 by Kim Bruce. Revised 2/15/04. */ import java.awt.*; import javax.swing.*; import java.awt.event.*; import structure.*; import objectdraw.*; public class PostIt extends WindowController implements ActionListener { protected static final int numJButtons = 3; // number of JButtons protected static final int hgap = 10; // gap between JButtons protected static final int vgap = 40; // protected static final int canvasWidth = 180; // dimensions of canvas // protected static final int canvasHeight = 150; protected JButton addJButton; // JButton to add window protected JButton deleteJButton; // JButton to delete window protected JComboBox colorSelect; // combo box to select color protected Vector pictVect = new Vector(); // Vector of objects on canvas // top-most object is last in vector protected boolean adding = false; // Was add JButton pushed protected boolean deleting = false; // Was deleting JButton pushed protected boolean moving = false; // In middle of moving square protected double left, top, width, height; // bounds of top rectangle protected Location lastPos; // last mouse position protected Rect postIt; // rectangle being drawn or moved protected Rect movingPostIt; // framed rect representing // rect being moved protected Color currentColor = Color.black; // color for drawing // Create JButtons and add to window public void begin() { // Set up add JButton addJButton = new JButton("Add"); addJButton.addActionListener(this); // Set up delete JButton deleteJButton = new JButton("Delete"); deleteJButton.addActionListener(this); // Set up color choice colorSelect = new JComboBox(); colorSelect.addItem("Black"); colorSelect.addItem("Red"); colorSelect.addItem("Blue"); colorSelect.addItem("Green"); colorSelect.addItem("Cyan"); colorSelect.addActionListener(this); // Set up panel to hold JButtons JPanel JButtonPanel = new JPanel(); // Panel to hold JButtons JButtonPanel.setLayout(new GridLayout(1, numJButtons, hgap, vgap)); JButtonPanel.add(addJButton); JButtonPanel.add(deleteJButton); JButtonPanel.add(colorSelect); // Create layout and add JButtons and windowCanvas getContentPane().add(BorderLayout.SOUTH, JButtonPanel); } // Handle JButton clicks // PRE: User clicked on a JButton // POST: if clicked "add" JButton then remember adding // if clicked "delete" JButton then remember deleting // if clicked on "colorSelect" then remember current color public void actionPerformed(ActionEvent e) { if (e.getSource() == addJButton) { adding = true; deleting = false; } else if (e.getSource() == deleteJButton) { if (pictVect.isEmpty()) { System.out.println("Nothing to delete!"); } else { deleting = true; adding = false; } } else if (e.getSource() == colorSelect) { String colorName = (String) colorSelect.getSelectedItem(); if (colorName.equals("Black")) { currentColor = Color.black; } else if (colorName.equals("Red")) { currentColor = Color.red; } else if (colorName.equals("Blue")) { currentColor = Color.blue; } else if (colorName.equals("Green")) { currentColor = Color.green; } else if (colorName.equals("Cyan")) { currentColor = Color.cyan; } } } // PRE: User has pressed mouse on canvas // POST: if adding, then create filled rect at current mouse position but 0 // width and height. // if deleting, then find window clicked on and remove // from window and vector // if moving, then determine which window to move,hide filled rect, // and create framed rect to be moved public void onMousePress(Location pos) { if (adding) { postIt = new FramedRect(pos, 0, 0, canvas); // Create new PostIt note outline postIt.setColor(currentColor); left = pos.getX(); // Save starting position top = pos.getY(); } else if (deleting) { int windowIndex = findWindowIndex(pos); if (windowIndex != -1) { removeWindow(windowIndex); } } else { int windowIndex = findWindowIndex(pos); if (windowIndex != -1) { moving = true; moveToTop(windowIndex); postIt = (FilledRect) pictVect.elementAt(pictVect.size() - 1); postIt.hide(); // hide top-most note Bounds lastBds = postIt.getBounds(); // create framed note at // same position movingPostIt = new FramedRect( lastBds.getLocation(), lastBds.getWidth(), lastBds.getHeight(), canvas); movingPostIt.setColor(postIt.getColor()); lastPos = pos; // save where last clicked } } } // POST: if adding then resize rectangle to reach to new mouse posn // if moving then move framed rect by amount of mouse motion public void onMouseDrag(Location pos) { double x = pos.getX(); // coords of mouse double y = pos.getY(); if (adding) { // reset bounds of rect width = Math.abs(x - left); height = Math.abs(y - top); Bounds newBds = new Bounds(Math.min(x, left), Math.min(y, top), width, height); postIt.setBounds(newBds); } else if (moving) { // move by amount of last mouse motion movingPostIt.move(x - lastPos.getX(), y - lastPos.getY()); lastPos = pos; // remember this mouse position } } // PRE: User has released mouse button // POST: if adding then add rectangle to Vector // if moving then bring back filled rectangle and move to new posn. Hide // framed rect. public void onMouseRelease(Location pos) { if (adding) { adding = false; Bounds lastBds = postIt.getBounds(); // create framed note at // same position as framed postIt.removeFromCanvas(); // hide top-most note postIt = new FilledRect( lastBds.getLocation(), lastBds.getWidth(), lastBds.getHeight(), canvas); postIt.setColor(currentColor); pictVect.addElement(postIt); // add new rectangle to Vector } else if (moving) { postIt.setBounds(movingPostIt.getBounds()); postIt.show(); movingPostIt.removeFromCanvas(); moving = false; } else { deleting = false; } } // post: returns index of top-most window containing pt or // -1 if pt is in no window private int findWindowIndex(Location pt) { int windowIndex = pictVect.size() - 1; while (windowIndex >= 0 && !((Rect) pictVect.get(windowIndex)).contains(pt)) { windowIndex--; } return windowIndex; } // pre: 0 <= windowIndex < size() // post: window corresponding to windowIndex is moved to first // element of vector and to top level of window private void moveToTop(int windowIndex) { Rect movingWindow = (Rect) pictVect.remove(windowIndex); pictVect.add(movingWindow); movingWindow.sendToFront(); } // pre: 0 <= windowIndex < size() // post: window corresponding to windowIndex is removed from vector // and screen private void removeWindow(int windowIndex) { Rect movingWindow = (Rect) pictVect.remove(windowIndex); movingWindow.removeFromCanvas(); } }