/* * 1.4 version. */ import java.awt.*; import java.awt.event.*; import java.applet.Applet; import java.util.*; /* These should not be here for Java 1.4 import Point2D; import BezierCurve284; */ /* * This displays a framed area. When the user clicks within * the area, this program displays a dot and a string indicating * the coordinates where the click occurred. */ public class Main extends Applet implements ActionListener, AdjustmentListener, ItemListener { FramedArea framedArea; Label statusLabel, slicesLabel, tLabel; Button clearButton, addButton; Scrollbar slicesSlider, tSlider; Checkbox cbDelete, cbT; boolean bDeletePoints = false; boolean bBezierDrawT = false; double dT = 0.1; public Main() { super(); this.setBackground(Color.lightGray); } public void init() // Called by browser { GridBagLayout gbLayout = new GridBagLayout(); GridBagConstraints gbConstraints = new GridBagConstraints(); setLayout(gbLayout); ////////////////////////////////////////////////////////////////// gbConstraints.fill = GridBagConstraints.HORIZONTAL; gbConstraints.weightx = 1.0; gbConstraints.weighty = 0.0; Label label0 = new Label(" "); gbLayout.setConstraints(label0, gbConstraints); add(label0); Label label1 = new Label(" "); gbLayout.setConstraints(label1, gbConstraints); add(label1); Label label2 = new Label(" "); gbLayout.setConstraints(label2, gbConstraints); add(label2); Label label3 = new Label(" "); gbLayout.setConstraints(label3, gbConstraints); add(label3); Label label4 = new Label(" "); gbLayout.setConstraints(label4, gbConstraints); add(label4); Label label5 = new Label(" "); gbLayout.setConstraints(label5, gbConstraints); add(label5); Label label6 = new Label(" "); gbLayout.setConstraints(label6, gbConstraints); add(label6); Label label7 = new Label(" "); gbLayout.setConstraints(label7, gbConstraints); add(label7); Label label8 = new Label(" "); gbLayout.setConstraints(label8, gbConstraints); add(label8); Label label9 = new Label(" "); gbLayout.setConstraints(label9, gbConstraints); add(label9); gbConstraints.gridwidth = GridBagConstraints.REMAINDER; //end row Label labelEnd = new Label(" "); gbLayout.setConstraints(labelEnd, gbConstraints); add(labelEnd); ////////////////////////////////////////////////////////////////// statusLabel = new Label("Click within the framed area."); gbConstraints.fill = GridBagConstraints.HORIZONTAL; gbConstraints.gridwidth = 9; gbLayout.setConstraints(statusLabel, gbConstraints); add(statusLabel); gbConstraints.gridwidth = 1; clearButton = new Button( "clear" ); clearButton.addActionListener(this); gbConstraints.gridwidth = GridBagConstraints.REMAINDER; //end row gbLayout.setConstraints(clearButton, gbConstraints); add(clearButton); framedArea = new FramedArea(this); gbConstraints.fill = GridBagConstraints.BOTH; gbConstraints.weighty = 1.0; gbConstraints.gridwidth = GridBagConstraints.REMAINDER; //end row gbLayout.setConstraints(framedArea, gbConstraints); add(framedArea); addButton = new Button( "start new curve" ); gbConstraints.fill = GridBagConstraints.HORIZONTAL; gbConstraints.gridwidth = 3; gbConstraints.weighty = 0.0; addButton.addActionListener(this); gbLayout.setConstraints(addButton, gbConstraints); add(addButton); Label blank1 = new Label(" "); gbConstraints.gridwidth = 5; gbLayout.setConstraints(blank1, gbConstraints); add(blank1); cbDelete = new Checkbox("delete selected points"); gbConstraints.gridwidth = GridBagConstraints.REMAINDER; //end row cbDelete.addItemListener(this); gbLayout.setConstraints(cbDelete, gbConstraints); add(cbDelete); Label blank2 = new Label(" "); gbConstraints.fill = GridBagConstraints.HORIZONTAL; gbConstraints.gridwidth = 1; gbConstraints.weighty = 0.0; gbLayout.setConstraints(blank2, gbConstraints); add(blank2); slicesLabel = new Label(" Slices: 10"); gbConstraints.fill = GridBagConstraints.HORIZONTAL; gbConstraints.gridwidth = 1; gbConstraints.weighty = 0.0; gbLayout.setConstraints(slicesLabel, gbConstraints); add(slicesLabel); slicesSlider = new Scrollbar(Scrollbar.HORIZONTAL, 10, 10, 1, 110); slicesSlider.addAdjustmentListener(this); gbConstraints.gridwidth = GridBagConstraints.REMAINDER; //end row gbLayout.setConstraints(slicesSlider, gbConstraints); add(slicesSlider); cbT = new Checkbox(""); gbConstraints.gridwidth = 1; cbT.addItemListener(this); gbLayout.setConstraints(cbT, gbConstraints); add(cbT); tLabel = new Label(" t value: 0.1"); gbConstraints.fill = GridBagConstraints.HORIZONTAL; gbConstraints.gridwidth = 1; gbLayout.setConstraints(tLabel, gbConstraints); add(tLabel); tSlider = new Scrollbar(Scrollbar.HORIZONTAL, 10, 10, 0, 110); tSlider.addAdjustmentListener(this); gbConstraints.gridwidth = GridBagConstraints.REMAINDER; //end row gbLayout.setConstraints(tSlider, gbConstraints); add(tSlider); } public void adjustmentValueChanged(AdjustmentEvent ae) { if(ae.getSource() == slicesSlider) { framedArea.setBezierSlices(slicesSlider.getValue()); updateSlicesLabel(slicesSlider.getValue()); } else if(ae.getSource() == tSlider) { dT = tSlider.getValue()/100.0; framedArea.setBezierTValue(dT); updatetLabel(dT); } } public void actionPerformed(ActionEvent ae) { if(ae.getSource() == clearButton) { framedArea.clearSelectedArea(); } else if(ae.getSource() == addButton) { framedArea.addCurveToSelectedArea(); } } public void itemStateChanged(ItemEvent ie) { if(ie.getSource() == cbDelete) { if( ie.getStateChange() == ItemEvent.SELECTED ) { bDeletePoints = true; } else { bDeletePoints = false; } } else if(ie.getSource() == cbT) { if( ie.getStateChange() == ItemEvent.SELECTED ) { bBezierDrawT = true; framedArea.setBezierDrawT(true); } else { bBezierDrawT = false; framedArea.setBezierDrawT(false); } } } public void updateStatusLabel(int xx, int yy) { int x = xx + 3; int y = yy + 3; statusLabel.setText("Control point added at (" + x + ", " + y + ")"); } public void updateSlicesLabel(int slices) { slicesLabel.setText(" Slices: " + slices); } public void updatetLabel(double t) { tLabel.setText(" t value: " + t); } public static void main (String[] args) { Main m = new Main(); m.init(); final Frame f = new Frame("Bezier Curve"); f.add(m); f.setSize(600,600); f.show(); } } ////////////////////////////////////////////////////////////////////////////////// // This class exists solely to put a frame around the coordinate area. class FramedArea extends Panel { SelectionArea sArea = null; public FramedArea(Main controller) { super(); setLayout(new GridLayout(1,0)); //Set layout so its contents are as big as possible. sArea = new SelectionArea(controller); add(sArea); } public void clearSelectedArea() { sArea.clearAll(); } public void addCurveToSelectedArea() { sArea.addCurve(); } public void setBezierSlices(int slices) { sArea.setBezierSlices(slices); } public void setBezierTValue(double t) { sArea.setBezierTValue(t); } public void setBezierDrawT(boolean b) { sArea.setBezierDrawT(b); } public Insets getInsets() { return new Insets(4,4,5,5); } public void paint(Graphics g) { Dimension d = getSize(); Color bg = getBackground(); g.setColor(bg); g.draw3DRect(0, 0, d.width - 1, d.height - 1, true); g.draw3DRect(3, 3, d.width - 7, d.height - 7, false); } } ////////////////////////////////////////////////////////////////////////////////// class SelectionArea extends Canvas { Main controller; Vector m_vBezierCurves = new Vector(); BezierCurve284 m_bcCurveSelected = null; BezierCurve284 m_bcCurveCurrent = null; public SelectionArea(Main controller) { super(); this.controller = controller; MyListener myListener = new MyListener(); addMouseListener(myListener); addMouseMotionListener(myListener); } class MyListener extends MouseAdapter implements MouseMotionListener { public void mousePressed(MouseEvent e) { /* System.out.println( "Button Pressed: " + e.getModifiers() ); System.out.println( " : " + MouseEvent.BUTTON1_MASK + " " + MouseEvent.BUTTON2_MASK + " " + MouseEvent.BUTTON3_MASK ); */ if( (e.getModifiers() == MouseEvent.BUTTON1_MASK) || // Java 1.2 Button 1 (e.getModifiers() == 0) ) // Java 1.1 { BezierCurve284 bcCurve; int x = e.getX(); int y = e.getY(); m_bcCurveSelected = null; for (Enumeration enum = m_vBezierCurves.elements(); enum.hasMoreElements(); ) { bcCurve = (BezierCurve284)enum.nextElement(); if( bcCurve.selectedControlPoint(x, y) ) // Select point { m_bcCurveSelected = bcCurve; } } if( m_bcCurveSelected == null ) // Clicked in empty space { // Add new Point controller.updateStatusLabel(x, y); Point2D pt = new Point2D(x, y); if( m_bcCurveCurrent == null ) { m_bcCurveCurrent = new BezierCurve284(controller.bBezierDrawT, controller.dT); m_vBezierCurves.addElement(m_bcCurveCurrent); } m_bcCurveSelected = m_bcCurveCurrent; m_bcCurveCurrent.addPoint(pt); //m_bcCurveCurrent.display(); repaint(); } else // Clicked on point { if( controller.bDeletePoints ) // delete selected point { m_bcCurveSelected.deleteSelectedControlPoint(); controller.statusLabel.setText("Control point deleted at (" +x+ ", " +y+ ")"); repaint(); } } } else if( e.getModifiers() == MouseEvent.BUTTON2_MASK ) // Button 2 { } else if( e.getModifiers() == MouseEvent.BUTTON3_MASK ) // Button 3 { } else { System.out.println( "Button Press Error"); } } public void mouseDragged(MouseEvent e) { if( m_bcCurveSelected != null ) { int x = e.getX(); int y = e.getY(); m_bcCurveSelected.moveSelectedControlPoint( x, y ); controller.statusLabel.setText("Control point moved to (" +x+ ", " +y+ ")"); repaint(); } } public void mouseMoved(MouseEvent e) { } public void mouseReleased(MouseEvent e) { if( m_bcCurveSelected != null ) { m_bcCurveSelected.deselectControlPoint(); } } } public void clearAll() { m_bcCurveSelected = null; m_bcCurveCurrent = null; m_vBezierCurves.removeAllElements(); repaint(); } public void addCurve() { if( m_vBezierCurves != null) { m_bcCurveCurrent = new BezierCurve284(controller.bBezierDrawT, controller.dT); m_vBezierCurves.addElement(m_bcCurveCurrent); m_bcCurveSelected = null; } } public void setBezierSlices(int slices) { BezierCurve284 bcCurve; for (Enumeration enum = m_vBezierCurves.elements(); enum.hasMoreElements(); ) { bcCurve = (BezierCurve284)enum.nextElement(); bcCurve.setSlices(slices); } repaint(); } public void setBezierTValue(double t) { BezierCurve284 bcCurve; for (Enumeration enum = m_vBezierCurves.elements(); enum.hasMoreElements(); ) { bcCurve = (BezierCurve284)enum.nextElement(); bcCurve.setTValue(t); } repaint(); } public void setBezierDrawT(boolean b) { BezierCurve284 bcCurve; for (Enumeration enum = m_vBezierCurves.elements(); enum.hasMoreElements(); ) { bcCurve = (BezierCurve284)enum.nextElement(); bcCurve.setDrawT(b); } repaint(); } public void paint(Graphics g) { BezierCurve284 bcCurve; for (Enumeration enum = m_vBezierCurves.elements(); enum.hasMoreElements(); ) { bcCurve = (BezierCurve284)enum.nextElement(); bcCurve.paint(g); } } }