/* Project #7 Expanding on my class of bricks for polychroming pattern generation Lisa M. Snyder December 2, 1998 Illustrates creation of a graphic user defined class, class functions (methods), Mouse events, and loops. The final project will include another class for decorative brick panels. The point is to create a field of class objects (bricks) that can have their color modified to allow the user to play with polychrome patterns. A relatively complex function allows the bricks to be 'split' so that the bond pattern can be manipulated. A universal change allows the grout color to be changed for the entire pattern. */ import java.awt.*; import java.awt.event.*; public class hw7 extends java.applet.Applet implements MouseListener,MouseMotionListener, ActionListener,ItemListener{ int max_bricks = 1000; private brick[] b_array = new brick[max_bricks]; int number_bricks=0; int max_decos = 50; private deco[] d_array = new deco[max_decos]; int number_decos=0; private int b_picked = -1; private int d_picked = -1; boolean bPicked = false; boolean dPicked = false; boolean dDrag = false; int apph, appw; int b_width = 0; int b_height = 0; int rows, cols; int x, y, xlast, ylast; private Button color,grout,split,reset,panel; private Choice color_choices; Color terraCotta = (new Color(153,51,28)); Color cream = (new Color(211,184,130)); Color brown = (new Color(73,36,27)); Color maroon = (new Color(125,26,17)); Color black = (new Color(13,24,17)); Color current_color = terraCotta; private Choice deco_choices; // ----------------------------------------------------------------------- public void init() { setBackground (Color.black); addMouseListener (this); //applet listens to mouse events addMouseMotionListener (this); //listen for mouse drags appw = size().width; //get applet width apph = size().height; //get applet height String s = getParameter ("b_width"); b_width = Integer.valueOf(s).intValue(); String f = getParameter ("b_height"); b_height = Integer.valueOf(f).intValue(); rows = 25; cols = 6; // rows = (int)(appw/b_width); // cols = (int)((apph-(b_height*2))/b_height); y = 0; for (int r = 1; r <= rows; r++){ if ((r+1)%2==0) x = -b_width/2; else x = 0; for (int c = 1; c <= cols; c++){ b_array[number_bricks] = new brick(x,y,b_width,b_height,terraCotta); x=x+b_width; number_bricks++; } y=y+b_height; } // botton panel setLayout(new BorderLayout()); Panel p = new Panel(); p.setLayout (new GridLayout(1,5)); // add drop down list to chose color color_choices = new Choice(); color_choices.addItemListener (this); color_choices.addItem("TerraCotta"); color_choices.addItem("Cream"); color_choices.addItem("Brown"); color_choices.addItem("Maroon"); color_choices.addItem("Black"); color_choices.setForeground(Color.black); color_choices.setBackground(Color.lightGray); p.add(color_choices); split = new Button("Split"); split.addActionListener (this); p.add(split); grout = new Button("Grout"); grout.addActionListener (this); p.add(grout); reset = new Button ("Field"); reset.addActionListener (this); p.add (reset); // add drop down list to chose decorative panel type deco_choices = new Choice(); deco_choices.addItemListener (this); deco_choices.addItem("Verticals"); deco_choices.addItem("Diamonds"); deco_choices.addItem("Chevrons"); //deco_choices.addItem("Herringbone"); deco_choices.setForeground(Color.black); deco_choices.setBackground(Color.lightGray); p.add(deco_choices); //panel = new Button ("Panel"); //panel.addActionListener (this); //p.add (panel); add("South", p); } // ----------------------------------------------------------------------- public void paint(Graphics g) { for (int i=0; i= 0){ d_array[d_picked].setColor(current_color); Rectangle clipR = d_array[d_picked].boundingBox(); repaint(clipR.x,clipR.y,clipR.width,clipR.height); dDrag = true; xlast = x; //save old coordinates ylast = y; //repaint(); } } //if no panels were picked, see if brick is picked, and respond if (!dPicked){ for (int i=0; i= 0){ b_array[b_picked].setColor(current_color); Rectangle clipR = b_array[b_picked].boundingBox(); repaint(clipR.x,clipR.y,clipR.width,clipR.height); //picked = -1; //repaint(); } } if ((!bPicked)&&(!dPicked)) return; //nothing picked } // ----------------------------------------------------------------------- public void mouseReleased (MouseEvent e) { dDrag = false; //nothing draggable } // ----------------------------------------------------------------------- public void mouseDragged (MouseEvent e) { //see if mouse was moved //System.out.println ("In mouseDragged"); int x = e.getX(); //gets x&y coordinates int y = e.getY(); if (dDrag) //if a deco is selected { int xOffset = x-xlast; int yOffset = y-ylast; //get bounding rectangle of figure in original position Rectangle oldRect = d_array[d_picked].boundingBox(); //change position of figure d_array[d_picked].translate(xOffset,yOffset); //get bounding rectangle of figure in new position Rectangle newRect = d_array[d_picked].boundingBox(); //union rectangles to determine area to be redrawn Rectangle clipR = newRect.union(oldRect); //repaint clip R repaint (clipR.x,clipR.y,clipR.width+1,clipR.height+1); xlast = x; //copy old coordinates ylast = y; } } // ----------------------------------------------------------------------- public void actionPerformed (ActionEvent e ) { //user selects Split button if (e.getSource() == split && number_bricks <= 1000){ System.out.println ("picked=" + b_picked + "number=" + number_bricks); b_array[b_picked].split_brick(); b_array[number_bricks] = b_array[b_picked].add_brick(); number_bricks++; //b_array[number_bricks].single_paint(); //System.out.println ("picked=" + picked + "number=" + number_bricks); Rectangle oldRect = b_array[b_picked].boundingBox(); Rectangle newRect = b_array[number_bricks-1].boundingBox(); Rectangle clipR = oldRect.union(newRect); repaint(clipR.x,clipR.y,clipR.width,clipR.height); //repaint(); } //user selects Grout button if (e.getSource() == grout){ for (int i = 0; i <= number_bricks; i++){ b_array[i].changeGrout(current_color); repaint(); } } //user selects Reset button if (e.getSource() == reset){ for (int i = 0; i <= number_bricks; i++){ b_array[i].resetColor(current_color); repaint(); } } //user selects Panel button (From before choice implemented) //if (e.getSource() == panel && number_decos <= 50){ //d_array[number_decos] = new deco(0,50,50,b_width,b_height,current_color); //repaint(); //number_decos++; //System.out.println ("number of decos is " + number_decos); //} } // ----------------------------------------------------------------------- public void itemStateChanged (ItemEvent e) { // listens to option buttons and lets user pick new current color or panel type Choice choice = (Choice) e.getItemSelectable(); // returns index of menu item selected (0 = first item, etc.) System.out.println ("choice == " + choice); System.out.println ("deco_choices == " + deco_choices); System.out.println ("color_choices == " + color_choices); int temp = choice.getSelectedIndex(); // decides what option was selected; tried 2 switch statements, but it didn't work if ((choice == color_choices)&&(temp == 0)) current_color = terraCotta; else if ((choice == color_choices)&&(temp == 1)) current_color = cream; else if ((choice == color_choices)&&(temp == 2)) current_color = brown; else if ((choice == color_choices)&&(temp == 3)) current_color = maroon; else if ((choice == color_choices)&&(temp == 4)) current_color = black; else if ((choice == deco_choices)&&(temp == 0)&&(number_decos <= max_decos)){ //System.out.println ("passing to deco.java"); d_array[number_decos] = new deco(0,50,50,b_width*2,b_height*3,current_color); repaint(); number_decos++; } else if ((choice == deco_choices)&&(temp == 1)&&(number_decos <= max_decos)){ System.out.println ("passing to deco.java for diamond"); d_array[number_decos] = new deco(1,50,50,b_width*2,b_height*5,current_color); repaint(); number_decos++; } else if ((choice == deco_choices)&&(temp == 2)&&(number_decos <= max_decos)){ d_array[number_decos] = new deco(2,50,50,(int)(b_width*2.5),b_height*3,current_color); repaint(); number_decos++; //System.out.println ("number of decos is " + number_decos); } else if ((choice == deco_choices)&&(temp == 3)&&(number_decos <= max_decos)){ d_array[number_decos] = new deco(3,50,50,b_width,b_height,current_color); repaint(); number_decos++; //System.out.println ("number of decos is " + number_decos); } } // ----------------------------------------------------------------------- public void mouseClicked (MouseEvent e) {} public void mouseEntered (MouseEvent e) {} public void mouseExited (MouseEvent e) {} public void mouseMoved (MouseEvent e) {} // ----------------------------------------------------------------------- } //end of program /* // ----------------------- DEAD CODE ----------------------------------------- // ---------- MENU OPTIONS -- TWO SWITCHES CAN'T WORK AT SAME TIME ----------- if (choice == color_choices){ System.out.println ("I'm going into color switch"); int color = choice.getSelectedIndex(); // based on item selected, set color switch (color){ case 0: current_color = terraCotta; break; case 1: current_color = cream; break; case 2: current_color = brown; break; case 3: current_color = maroon; break; case 4: current_color = black; break; default: break; } else if (choice == deco_choices){ System.out.println ("I'm going into deco switch"); int deco = choice.getSelectedIndex(); // based on item selected, create new decorative panel switch (deco){ case 0: if (number_decos <= max_decos){ d_array[number_decos] = new deco(0,50,50,b_width,b_height,Color.red); repaint(); number_decos++; System.out.println ("number of decos is " + number_decos); break; } case 1: if (number_decos <= max_decos){ d_array[number_decos] = new deco(0,50,50,b_width,b_height,Color.blue); repaint(); number_decos++; System.out.println ("number of decos is " + number_decos); break; } case 2: if (number_decos <= max_decos){ d_array[number_decos] = new deco(0,50,50,b_width,b_height,Color.yellow); repaint(); number_decos++; System.out.println ("number of decos is " + number_decos); break; } case 3: if (number_decos <= max_decos){ d_array[number_decos] = new deco(0,50,50,b_width,b_height,Color.green); repaint(); number_decos++; System.out.println ("number of decos is " + number_decos); break; } default: break; } */