/* * File : JigSawEditor.java * Created : 03-dec-2002 10:03 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2005 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.shapers; import edu.xtec.jclic.Constants; import edu.xtec.jclic.boxes.BoxBase; import edu.xtec.util.Messages; import edu.xtec.util.Options; import java.awt.Color; import java.awt.Component; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Image; import java.awt.Rectangle; import java.awt.RenderingHints; import java.awt.Shape; import java.awt.Stroke; import java.util.ArrayList; import java.util.List; import javax.swing.JPanel; /** * * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.17 */ public class JigSawEditorPanel extends javax.swing.JPanel { Options options; JigSaw shaper; Image img; Rectangle previewArea; BoxBase previewBb; boolean modified; static final int MARGIN=40; /** Creates new form JigSawEditor */ public JigSawEditorPanel(Options options, JigSaw shaper, Dimension previewDim, Image img, BoxBase previewBb) { this.options=options; this.shaper=shaper; this.img=img; previewArea=new Rectangle(img==null ? previewDim : new Dimension(img.getWidth(this), img.getHeight(this))); this.previewBb=previewBb; initComponents(); } /** This method is called from within the constructor to * initialize the form. * WARNING: Do NOT modify this code. The content of this method is * always regenerated by the Form Editor. */ private void initComponents() {//GEN-BEGIN:initComponents javax.swing.JLabel toothWidthLb; javax.swing.JLabel toothHeightLb; java.awt.GridBagConstraints gridBagConstraints; controlPanel = new javax.swing.JPanel(); toothHeightLb = new javax.swing.JLabel(); toothHeightSlider = new javax.swing.JSlider(); toothWidthLb = new javax.swing.JLabel(); toothWidthSlider = new javax.swing.JSlider(); randomChk = new javax.swing.JCheckBox(); previewPanel = new PreviewPanel(); setLayout(new java.awt.BorderLayout()); controlPanel.setLayout(new java.awt.GridBagLayout()); toothHeightLb.setText(options.getMsg("edit_act_toothHeightFactor")); toothHeightLb.setLabelFor(toothHeightSlider); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); controlPanel.add(toothHeightLb, gridBagConstraints); toothHeightSlider.setMinorTickSpacing(5); toothHeightSlider.setPaintLabels(true); toothHeightSlider.setPaintTicks(true); toothHeightSlider.setMajorTickSpacing(25); toothHeightSlider.setMaximum(50); toothHeightSlider.setValue((int)(shaper.toothHeightFactor*50/shaper.getBaseFactor()*100)); toothHeightSlider.addChangeListener(new javax.swing.event.ChangeListener() { public void stateChanged(javax.swing.event.ChangeEvent evt) { toothHeightSliderStateChanged(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); controlPanel.add(toothHeightSlider, gridBagConstraints); toothWidthLb.setText(options.getMsg("edit_act_toothWidthFactor")); toothWidthLb.setLabelFor(toothWidthSlider); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); controlPanel.add(toothWidthLb, gridBagConstraints); toothWidthSlider.setMinorTickSpacing(5); toothWidthSlider.setPaintLabels(true); toothWidthSlider.setPaintTicks(true); toothWidthSlider.setMajorTickSpacing(25); toothWidthSlider.setValue((int)(shaper.baseWidthFactor*100)); toothWidthSlider.addChangeListener(new javax.swing.event.ChangeListener() { public void stateChanged(javax.swing.event.ChangeEvent evt) { toothWidthSliderStateChanged(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); controlPanel.add(toothWidthSlider, gridBagConstraints); randomChk.setSelected(shaper.randomLines); randomChk.setText(options.getMsg("edit_act_toothRandom")); randomChk.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { randomChkActionPerformed(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); controlPanel.add(randomChk, gridBagConstraints); add(controlPanel, java.awt.BorderLayout.NORTH); previewPanel.setBorder(new javax.swing.border.TitledBorder(options.getMsg("edit_act_preview"))); previewPanel.setPreferredSize(new Dimension(previewArea.width+MARGIN, previewArea.height+MARGIN)); add(previewPanel, java.awt.BorderLayout.CENTER); }//GEN-END:initComponents private void toothHeightSliderStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_toothHeightSliderStateChanged shaper.toothHeightFactor=((double)toothHeightSlider.getValue()*shaper.getBaseFactor()/50)/100; ((PreviewPanel)previewPanel).updateView(); }//GEN-LAST:event_toothHeightSliderStateChanged private void toothWidthSliderStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_toothWidthSliderStateChanged shaper.baseWidthFactor=((double)toothWidthSlider.getValue())/100; ((PreviewPanel)previewPanel).updateView(); }//GEN-LAST:event_toothWidthSliderStateChanged private void randomChkActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_randomChkActionPerformed shaper.randomLines=randomChk.isSelected(); ((PreviewPanel)previewPanel).updateView(); }//GEN-LAST:event_randomChkActionPerformed // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JCheckBox randomChk; private javax.swing.JSlider toothHeightSlider; private javax.swing.JPanel controlPanel; private javax.swing.JPanel previewPanel; private javax.swing.JSlider toothWidthSlider; // End of variables declaration//GEN-END:variables class PreviewPanel extends JPanel{ List<Shape> shapes; PreviewPanel() { this.shapes = new ArrayList<Shape>(); } public void updateView(){ shapes.clear(); shaper.reset(); for(int i=0; i<shaper.getNumCells(); i++){ shapes.add(shaper.getShape(i, previewArea)); } repaint(); } @Override public void paintComponent(Graphics g){ super.paintComponent(g); Graphics2D g2=(Graphics2D)g; RenderingHints rh=g2.getRenderingHints(); g2.setRenderingHints(Constants.DEFAULT_RENDERING_HINTS); Color defaultBgColor=g2.getBackground(); Color defaultColor=g2.getColor(); g2.setColor(previewBb.backColor); g2.fill(previewArea); g2.setBackground(previewBb.backColor); g2.setColor(previewBb.borderColor); Stroke defaultStroke=g2.getStroke(); g2.setStroke(previewBb.getBorder()); if(img!=null) g2.drawImage(img, previewArea.x, previewArea.y, this); for(int i=0; i<shapes.size(); i++) g2.draw((Shape)shapes.get(i)); g2.setStroke(defaultStroke); g2.setColor(defaultColor); g2.setBackground(defaultBgColor); g2.setRenderingHints(rh); } @Override public void doLayout(){ previewArea.x=(getBounds().width-previewArea.width)/2; previewArea.y=(getBounds().height-previewArea.height)/2; updateView(); } } public static Shaper getShaper(Shaper initialShaper, Component parent, Options options, Dimension dim, Image img, BoxBase bb){ Messages msg=options.getMessages(); if(initialShaper==null || !(initialShaper instanceof JigSaw)) return null; JigSaw sh; try{ sh=(JigSaw)initialShaper.clone(); } catch(CloneNotSupportedException ex){ msg.showErrorWarning(parent, "edit_act_shaper_err", ex); return null; } JigSawEditorPanel jse=new JigSawEditorPanel(options, sh, dim, img, bb); boolean b=msg.showInputDlg(parent, jse, "edit_act_shaper_properties"); return b ? sh : null; } }