home *** CD-ROM | disk | FTP | other *** search
/ PC Active 2001 July/August / PCA1307.ISO / EXTRA / cursus / DrawingApp.java < prev    next >
Encoding:
Java Source  |  2001-04-22  |  11.4 KB  |  506 lines

  1.  
  2. // DrawingApp.java
  3.  
  4. import java.io.*;
  5. import java.util.*;
  6. import java.lang.Math;
  7. import java.awt.*;
  8. import java.awt.event.*;
  9.  
  10. class DrawingApp extends Frame    implements ActionListener,ItemListener, AdjustmentListener
  11.      {
  12.      static final int RECT = 1;
  13.      static final int CIRCLE = 2;
  14.      static final int LINE = 3;
  15.  
  16.      Frame        frame;
  17.      MyCanvas    mycanvas;
  18.      Label        y_coor;
  19.      Label        x_coor;
  20.      Panel        panel1;
  21.      Panel        panel2;                                    
  22.      Panel        panel3;
  23.      Button        undo;
  24.      Checkbox    filled;
  25.      CheckboxGroup    shape;
  26.      Checkbox    rectangle;
  27.      Checkbox    circle;
  28.      Checkbox    line;
  29.      MenuBar    bar;
  30.      Menu        mFile;
  31.      Menu        mHelp;
  32.      MenuItem    mLoad;
  33.      MenuItem    mSave;
  34.      MenuItem    mPrint;
  35.      MenuItem    mQuit;
  36.      Rect        r;
  37.      Circle        c;
  38.      Line        l;
  39.      int        x_pos;
  40.      int        y_pos;
  41.      int        iShape = RECT;
  42.      boolean    bFilled = false;
  43.      Color        cColor = Color.black;
  44.      String        fPathname;
  45.      String        sFile;
  46.      Scrollbar    red;
  47.      Scrollbar    blue;
  48.      Scrollbar    green;
  49.      Label        tred;
  50.      Label        tblue;
  51.      Label        tgreen;
  52.      Canvas        clr;
  53.      int        rd;
  54.      int        gr;
  55.      int        bl;
  56.  
  57.      public static void main (String [] args)
  58.          {
  59.          DrawingApp drawapp = new DrawingApp ();
  60.          drawapp.go ();
  61.          }
  62.  
  63.      public void go ()
  64.          {
  65.          frame = new Frame ("Untitled");
  66.  
  67.          bar = new MenuBar ();
  68.          frame.setMenuBar (bar);
  69.  
  70.          mFile = new Menu ("File");
  71.          bar.add(mFile);
  72.          mSave = new MenuItem ("Save");
  73.          // Register the menu to listen for an actionevent
  74.          mSave.addActionListener (this);
  75.  
  76.          mLoad = new MenuItem ("Load");
  77.          // Register the menu to listen for an actionevent
  78.          mLoad.addActionListener (this);
  79.  
  80.          mPrint = new MenuItem ("Print");
  81.          // Register the menu to listen for an actionevent
  82.          mPrint.addActionListener (this);
  83.  
  84.          mQuit = new MenuItem ("Quit");
  85.          // Register the menu to listen for an actionevent
  86.          mQuit.addActionListener (this);
  87.  
  88.  
  89.          mFile.add (mSave);
  90.          mFile.add (mLoad);
  91.          mFile.addSeparator ();
  92.          mFile.add (mPrint);
  93.          mFile.addSeparator ();
  94.          mFile.add (mQuit);
  95.  
  96.          mycanvas = new MyCanvas ();
  97.          // Register the button to listen for an mouseevent
  98.          mycanvas.addMouseListener (new MouseHandler ());
  99.          mycanvas.addMouseMotionListener (new MouseMotionHandler ());
  100.          frame.add ("Center", mycanvas);
  101.          
  102.          panel3 = new Panel ();
  103.          panel3.setLayout (new FlowLayout(FlowLayout.LEFT));
  104.          panel3.setBackground (Color.lightGray);
  105.  
  106.          // Scrollbar color blue
  107.          blue = new Scrollbar (Scrollbar.VERTICAL, 0, 20, 0, 275);
  108.          blue.addAdjustmentListener (this);
  109.          tblue = new Label ();
  110.          tblue.setText ("B");
  111.          panel3.add (blue);
  112.          panel3.add (tblue);
  113.  
  114.          // Scrollbar color red
  115.          red = new Scrollbar (Scrollbar.VERTICAL, 0, 20, 0, 275);
  116.          red.addAdjustmentListener (this);
  117.          tred = new Label ();
  118.          tred.setText ("R");
  119.          panel3.add (red);
  120.          panel3.add (tred);
  121.  
  122.          // Scrollbar color green
  123.          green = new Scrollbar (Scrollbar.VERTICAL, 0, 20, 0, 275);
  124.          green.addAdjustmentListener (this);
  125.          tgreen = new Label ();
  126.          tgreen.setText ("G");
  127.          panel3.add (green);
  128.          panel3.add (tgreen);
  129.  
  130.          // Canvas for drawing
  131.          clr = new Canvas ();
  132.          clr.setBackground (Color.black);
  133.          clr.setSize (25,25);
  134.          panel3.add (clr);
  135.  
  136.          // X,Y coor
  137.          x_coor = new Label ("X:    ");
  138.          y_coor = new Label ("Y:    ");
  139.  
  140.          panel3.add (x_coor);
  141.          panel3.add (y_coor);
  142.  
  143.          panel2 = new Panel ();
  144.          panel2.setLayout (new FlowLayout(FlowLayout.RIGHT));
  145.          panel2.setBackground (Color.lightGray);
  146.  
  147.          shape = new CheckboxGroup ();
  148.          rectangle = new Checkbox ("Rect", shape, true);
  149.          circle = new Checkbox ("Circle", shape, false);
  150.          line = new Checkbox ("Line", shape, false);
  151.          // Register the choices to listen for an itemevent
  152.          rectangle.addItemListener (this);
  153.          circle.addItemListener (this);
  154.          line.addItemListener (this);
  155.  
  156.          panel2.add (circle);
  157.          panel2.add (rectangle);
  158.          panel2.add (line);
  159.          
  160.           filled = new Checkbox ("Filled");
  161.          panel2.add (filled);
  162.          // Register the button to listen for an actionevent
  163.          filled.addItemListener (this);
  164.  
  165.          undo = new Button ("Undo");
  166.          // Register the button to listen for an actionevent
  167.          undo.addActionListener (this);
  168.  
  169.          panel2.add (undo);
  170.  
  171.          panel1 = new Panel ();
  172.          panel1.setLayout (new BorderLayout());
  173.          panel1.add ("North", panel2);
  174.          panel1.add ("South", panel3);
  175.  
  176.          frame.add ("South", panel1);
  177.  
  178.          frame.pack ();
  179.  
  180.          // Register window to listen for a window event
  181.          frame.addWindowListener (new WindowHandler ());
  182.          frame.setSize (500,500);
  183.          frame.setVisible (true);
  184.          }
  185.  
  186.      public void adjustmentValueChanged (AdjustmentEvent e)
  187.          {
  188.          rd = red.getValue();
  189.          gr = green.getValue();
  190.          bl = blue.getValue();
  191.  
  192.          // Set new drawing color
  193.          cColor = new Color (rd, gr, bl);
  194.          clr.setBackground (cColor);
  195.          }
  196.  
  197.      public void itemStateChanged (ItemEvent e)
  198.          {
  199.          // Shape selection
  200.          if (e.getItem () == "Rect")
  201.              {
  202.              iShape = RECT;
  203.              }
  204.          else if (e.getItem () == "Circle")
  205.              {
  206.              iShape = CIRCLE;
  207.              }
  208.          else if (e.getItem () == "Line")
  209.              {
  210.              iShape = LINE;
  211.              filled.setState (false);
  212.              bFilled = false;
  213.              }
  214.          // Filled selection
  215.          else if (e.getStateChange() == ItemEvent.SELECTED)
  216.              {
  217.              // Check for shapes other than a line
  218.              if (iShape != LINE)
  219.                  {
  220.                  bFilled = true;
  221.                  }
  222.              else
  223.                  {
  224.                  // Line
  225.                  bFilled = false;
  226.                  filled.setState (false);
  227.                  }
  228.              }
  229.          else
  230.              {
  231.              // Filled not selected
  232.              bFilled = false;
  233.              }
  234.          }
  235.  
  236.      public void actionPerformed (ActionEvent e)
  237.          {
  238.          // Menu action load
  239.          if (e.getActionCommand () == "Load"  )
  240.              {
  241.              FileDialog filedialog = new FileDialog (this, "Load", FileDialog.LOAD);
  242.              filedialog.setVisible (true);
  243.  
  244.              fPathname = filedialog.getDirectory () + filedialog.getFile ();
  245.              sFile = filedialog.getFile ();
  246.  
  247.              if ( fPathname != null)
  248.                  {
  249.                  File f = new File (fPathname);
  250.  
  251.                  try
  252.                      {
  253.                      // Create object input stream
  254.                      FileInputStream fIn = new FileInputStream (f);
  255.                      ObjectInputStream in = new ObjectInputStream (fIn);
  256.  
  257.                      // Read the vector
  258.                      Vector v = (Vector)in.readObject();
  259.                      in.close ();
  260.  
  261.                      // Clear current drawings
  262.                      mycanvas.removeAll ();
  263.  
  264.                      // Set vector
  265.                      mycanvas.setVect (v);
  266.                      mycanvas.repaint();
  267.                      }
  268.                  catch (IOException ioe)
  269.                      {
  270.                      ioe.printStackTrace ();
  271.                      }
  272.                  catch (ClassNotFoundException ce)
  273.                      {
  274.                      System.out.println ("Incorrect object type");
  275.                      }
  276.                  }
  277.             }
  278.  
  279.          // Menu action save
  280.          if (e.getActionCommand () == "Save"  )
  281.              {
  282.              FileDialog filedialog = new FileDialog (this, "Save", FileDialog.SAVE);
  283.              filedialog.setVisible (true);
  284.  
  285.              fPathname = filedialog.getDirectory () + filedialog.getFile ();
  286.              sFile = filedialog.getFile ();
  287.  
  288.              if ( fPathname != null)
  289.                  {
  290.                  File f = new File (fPathname);
  291.  
  292.                  try
  293.                      {
  294.                      // Create a object output stream
  295.                      FileOutputStream fOut = new FileOutputStream (f);
  296.                      ObjectOutputStream out = new ObjectOutputStream (fOut);
  297.  
  298.                      // Get vector containing the shapes
  299.                      Vector v = mycanvas.getVect();
  300.  
  301.                      out.writeObject (v);
  302.                      out.close ();
  303.                      }
  304.                  catch (IOException ioe)
  305.                      {
  306.                      ioe.printStackTrace ();
  307.                      }
  308.                  }
  309.              }
  310.  
  311.          // Menu action quit
  312.          if (e.getActionCommand () == "Quit"  )
  313.                {
  314.              System.exit (0);
  315.              }
  316.  
  317.          if (e.getActionCommand () == "Undo"  )
  318.              {
  319.              mycanvas.removeLast ();
  320.              }
  321.  
  322.          if (e.getActionCommand () == "Help"  )
  323.              {
  324.              }
  325.  
  326.          if (e.getActionCommand () == "Print"  )
  327.              {
  328.              Toolkit t = mycanvas.getToolkit ();
  329.  
  330.              PrintJob job = t.getPrintJob (this, "Printing....", null);
  331.  
  332.              if ( job != null )
  333.                  {
  334.                  Graphics page = job.getGraphics ();
  335.  
  336.                  // Center it on the page and draw a rectangle aroud it
  337.                  Dimension size = mycanvas.getSize ();
  338.                  Dimension pagesize = job.getPageDimension ();
  339.                  page.translate ((pagesize.width - size.width)/2,
  340.                                   (pagesize.height - size.height)/2);
  341.                  page.drawRect (-1, -1, size.width+1, size.height + 1);
  342.                  page.setClip (0, 0, size.width, size.height);
  343.  
  344.                  mycanvas.printAll (page);
  345.                  page.dispose ();
  346.                  job.end ();
  347.                  }
  348.              }
  349.          }
  350.  
  351.  
  352.      class WindowHandler extends WindowAdapter
  353.          {
  354.          public void windowClosing (WindowEvent e)
  355.              {
  356.              System.exit (0);
  357.              }
  358.          }
  359.  
  360.      class MouseMotionHandler extends MouseMotionAdapter
  361.          {
  362.          // Update mouse coor
  363.          public void mouseMoved (MouseEvent e)
  364.              {
  365.              x_coor.setText ("X: " + e.getX());
  366.              y_coor.setText ("Y: " + e.getY());
  367.              }
  368.  
  369.          // Update mouse coor
  370.          public void mouseDragged (MouseEvent e)
  371.              {
  372.              x_coor.setText ("X: " + e.getX());
  373.              y_coor.setText ("Y: " + e.getY());
  374.              }
  375.          }
  376.  
  377.     class MouseHandler extends MouseAdapter
  378.          {
  379.          // Change mouse cursor to crosshair if inside canvase
  380.          public void mouseEntered (MouseEvent e)
  381.              {
  382.              frame.setCursor (Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));
  383.              x_coor.setText ("X: " + e.getX());
  384.              y_coor.setText ("Y: " + e.getY());
  385.              }
  386.  
  387.          // Change mouse cursor to arrow if outside canvas
  388.          public void mouseExited (MouseEvent e)
  389.              {
  390.              frame.setCursor (Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
  391.              x_coor.setText ("X:    ");
  392.              y_coor.setText ("Y:    ");
  393.              }
  394.  
  395.  
  396.          public void mousePressed (MouseEvent e)
  397.              {
  398.              // Start of drawing shape
  399.              if ( iShape == RECT)
  400.                  {
  401.                  r = new Rect ();
  402.  
  403.                  x_pos = e.getX();
  404.                  y_pos = e.getY();
  405.                  }
  406.              else if ( iShape == CIRCLE )
  407.                  {
  408.                  c = new Circle ();
  409.  
  410.                  x_pos = e.getX();
  411.                  y_pos = e.getY();
  412.                  }
  413.              else if ( iShape == LINE )
  414.                  {
  415.                  l = new Line ();
  416.  
  417.                  x_pos = e.getX();
  418.                  y_pos = e.getY();
  419.                  }
  420.              else
  421.                  {
  422.                  System.out.println ("Major error");
  423.                  System.exit (0);
  424.                  }
  425.              }
  426.  
  427.          public void mouseReleased (MouseEvent e)
  428.              {
  429.              int    width;
  430.              int    height;
  431.  
  432.              // Calculate width and heigt of shape
  433.              width = x_pos - e.getX();
  434.              height = y_pos - e.getY();
  435.  
  436.              // End drawing a shape
  437.              if (( iShape == RECT ) || ( iShape == CIRCLE ))
  438.                  {
  439.                  /*
  440.                   * If drawing from bottom to top of canvas
  441.                   * width and x_pos needs to be adjusted
  442.                   */
  443.                   if ( width > 0 )
  444.                       {
  445.                       width = Math.abs(width);
  446.                       x_pos = x_pos - width;
  447.                       }
  448.                   else
  449.                       width = Math.abs(width);
  450.  
  451.                  /*
  452.                   * If drawing from bottom to top of canvas
  453.                   * height and y_pos needs to be adjusted
  454.                   */
  455.                   if ( height > 0 )
  456.                       {
  457.                       height = Math.abs(height);
  458.                       y_pos = y_pos - height;
  459.                       }
  460.                   else
  461.                       height = Math.abs(height);
  462.                   }
  463.  
  464.               if ( iShape == RECT )
  465.                  {
  466.                  r.setX(x_pos);
  467.                  r.setY(y_pos);
  468.                  r.setWidth(width);
  469.                  r.setHeight(height);
  470.                  r.setClr (cColor);
  471.                  r.setFilled (bFilled);
  472.  
  473.                  mycanvas.addRect (r);
  474.                  mycanvas.repaint();
  475.                  }
  476.              else if ( iShape == CIRCLE )
  477.                  {
  478.                  c.setX(x_pos);
  479.                  c.setY(y_pos);
  480.                  c.setRadius(width, height);
  481.                  c.setClr (cColor);
  482.                  c.setFilled (bFilled);
  483.  
  484.                  mycanvas.addCircle (c);
  485.                  mycanvas.repaint();
  486.                  }
  487.              else if ( iShape == LINE )
  488.                  {
  489.                  l.setX(x_pos);
  490.                  l.setY(y_pos);
  491.                  l.setWidth(e.getX());
  492.                  l.setHeight(e.getY());
  493.                  l.setClr (cColor);
  494.  
  495.                  mycanvas.addLine (l);
  496.                  mycanvas.repaint();
  497.                  }
  498.              else
  499.                  {
  500.                  System.out.println ("Major error");
  501.                  System.exit (0);
  502.                  }
  503.              }
  504.          }
  505.      }
  506.