/* * File : HolesEditorPanel.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.awt.event.*; import java.beans.PropertyChangeListener; import java.util.ArrayList; import java.util.List; import javax.swing.*; import javax.swing.event.*; /** * * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.17 */ public class HolesEditorPanel extends javax.swing.JPanel implements PointListener, ActionListener, PropertyChangeListener{ public static final double ROTATE_UNIT=Math.PI/180*15; Options options; Holes shaper; Image img; Rectangle previewArea; BoxBase previewBb; ShapeListModel listModel; ListSelectionListener listSelectionListener; boolean modified; int currentShape; protected PolygonDrawPanel pdp; private boolean shapeDrawn=false; double xFactor=1, yFactor=1; double lastWidth=-1, lastHeight=-1; Dimension previewDim;// private boolean initializing; private int zoomFactor=1; public static final int MAX_ZOOM=10, MIN_ZOOM=-2; /** Creates new form JigSawEditor */ public HolesEditorPanel(Options options, Holes shaper, Dimension previewDim, Image img, BoxBase previewBb) { this.options=options; this.shaper=shaper; this.img=img; this.previewDim=previewDim; initializing=true; //currentShape=-1; currentShape=shaper.getNumCells()+1; previewArea=new Rectangle(img==null ? previewDim : new Dimension(img.getWidth(this), img.getHeight(this))); //previewAreaStart=previewArea; this.previewBb=previewBb; initMembers(); initComponents(); customizeComponents(); pdp=new PolygonDrawPanel(img==null ? (int)(previewDim.getWidth()):img.getWidth(this), img==null ? ((int)previewDim.getHeight()) :img.getHeight(this),this,(img==null)); pdp.addPointListener(this); if (previewPanel!=null){ ((PreviewPanel)previewPanel).vp.addMouseMotionListener(pdp); ((PreviewPanel)previewPanel).vp.addMouseListener(pdp); } initializing=false; shapeChanged(); } @Override public void setCursor(java.awt.Cursor c){ if (previewPanel!=null) ((PreviewPanel)previewPanel).vp.setCursor(c); } public void setCursor(java.awt.Cursor c, boolean onlyPreviewPanel){ if (previewPanel!=null) ((PreviewPanel)previewPanel).vp.setCursor(c); } class ShapeListModel extends AbstractListModel { public int getSize() { return shaper.shapeData.length; } public Object getElementAt(int index) { ShapeData sd = shaper.shapeData[index]; return (sd.comment == null || sd.comment.length() == 0) ? Integer.toString(index) : sd.comment; } public void switchShapes(int index1, int index2) { if (shaper != null && index1 >= 0 && index1 < shaper.shapeData.length && index2 >= 0 && index2 < shaper.shapeData.length) { /* pdp.deSelectAll(); setCurrentShape(-1); ShapeData sd1 = shaper.shapeData[index1]; ShapeData sd2 = shaper.shapeData[index2]; shaper.shapeData[index1] = sd2; shaper.shapeData[index2] = sd1; setCurrentShape(index1); updateList(); * */ //shapeChanged(); //listSelectionListener.valueChanged(new ListSelectionEvent(listModel, index1, index2, false)); } } } private void initMembers(){ listModel=new ShapeListModel(); listSelectionListener=new ListSelectionListener(){ public void valueChanged(ListSelectionEvent ev){ if(ev.getValueIsAdjusting()) return; int v=shapesList.getSelectedIndex(); if(v!=currentShape && v>=0){ if (pdp.getNumShapes()>0) pdp.endPolygon(true,false,v); if (v>=0 && getHoles().getShapeData(v)!=null) tfName.setText(getHoles().getShapeData(v).comment); else tfName.setText(""); setCurrentShapeNoList(v); } else tfName.setText(""); upBtn.setEnabled(v>0); downBtn.setEnabled(v < shapesList.getModel().getSize()-1); } }; } protected void confirmChanges(){ pdp.endPolygon(); } protected void customizeComponents(){ btShowDrawnPoints.setSelected(EditableShapeConstants.showDrawnPoints); btGrid.setSelected(EditableShapeConstants.gridWidth!=-1); gridSizeEdit.setEnabled(btGrid.isSelected()); btMagnet.setSelected(EditableShapeConstants.pointsOnGrid); magnetRadiusEdit.setEnabled(btMagnet.isSelected()); btSelect.setSelected(true); } public void updateList(){ initMembers(); shapesList.setModel(listModel); } protected void setCurrentShape(int v){ if (shapesList.getSelectedIndex()!=v) shapesList.setSelectedIndex(v); btDelete.setEnabled(pdp.getNumShapes()>0); updateTransformingButtons(); currentShape=v; } protected void setCurrentShapeNoList(int v){ currentShape=v; pdp.selectShape(v); btDelete.setEnabled(pdp.getNumShapes()>0); ((PreviewPanel)previewPanel).updateView(); } /** 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. */ // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents private void initComponents() { java.awt.GridBagConstraints gridBagConstraints; bgMode = new javax.swing.ButtonGroup(); javax.swing.JPanel topPanel = new javax.swing.JPanel(); javax.swing.JToolBar tbTop1 = new javax.swing.JToolBar(); btShowDrawnPoints = new javax.swing.JToggleButton(); btShowDrawnPoints.addActionListener(this); javax.swing.JSeparator sept1 = new JToolBar.Separator(); btGrid = new javax.swing.JToggleButton(); btGrid.addActionListener(this); gridSizeEdit = new edu.xtec.jclic.beans.SmallIntEditor(); gridSizeEdit.addPropertyChangeListener(this); javax.swing.JSeparator sept2 = new JToolBar.Separator(); btDelete = new javax.swing.JButton(); btDelete.addActionListener(this); btCopy = new javax.swing.JButton(); btCopy.addActionListener(this); btPaste = new javax.swing.JButton(); btPaste.addActionListener(this); javax.swing.JSeparator sept3 = new JToolBar.Separator(); btMagnet = new javax.swing.JToggleButton(); btMagnet.addActionListener(this); magnetRadiusEdit = new edu.xtec.jclic.beans.SmallIntEditor(); magnetRadiusEdit.addPropertyChangeListener(this); javax.swing.JSeparator sept4 = new JToolBar.Separator(); javax.swing.JPanel zoomPanel = new javax.swing.JPanel(); javax.swing.JLabel zoomLb = new javax.swing.JLabel(); btZoomOut = new javax.swing.JButton(); btZoomOut.addActionListener(this); lbZoom = new javax.swing.JTextField(); btZoomIn = new javax.swing.JButton(); btZoomIn.addActionListener(this); javax.swing.JLabel spacerTop = new javax.swing.JLabel(); javax.swing.JSeparator sep0 = new javax.swing.JSeparator(); javax.swing.JPanel leftPanel = new javax.swing.JPanel(); javax.swing.JToolBar tbLeft1 = new javax.swing.JToolBar(); btSelect = new javax.swing.JToggleButton(); btSelect.addActionListener(this); btDivide = new javax.swing.JToggleButton(); btDivide.addActionListener(this); javax.swing.JSeparator sep1 = new JToolBar.Separator(); btRect = new javax.swing.JToggleButton(); btRect.addActionListener(this); btEllipse = new javax.swing.JToggleButton(); btEllipse.addActionListener(this); btPolygon = new javax.swing.JToggleButton(); btPolygon.addActionListener(this); btLine = new javax.swing.JButton(); btLine.addActionListener(this); btBezier = new javax.swing.JButton(); btBezier.addActionListener(this); btQuad = new javax.swing.JButton(); btQuad.addActionListener(this); javax.swing.JSeparator sep2 = new JToolBar.Separator(); btExpand = new javax.swing.JButton(); btExpand.addActionListener(this); btContract = new javax.swing.JButton(); btContract.addActionListener(this); javax.swing.JSeparator sep4 = new JToolBar.Separator(); btRotateRight = new javax.swing.JButton(); btRotateRight.addActionListener(this); btRotateLeft = new javax.swing.JButton(); btRotateLeft.addActionListener(this); javax.swing.JLabel spacerLeft = new javax.swing.JLabel(); javax.swing.JSplitPane splitPane = new javax.swing.JSplitPane(); previewPanel = new PreviewPanel(); previewPanel.addPropertyChangeListener(this); javax.swing.JPanel listPanel = new javax.swing.JPanel(); orderBtnPanel = new javax.swing.JPanel(); upBtn = new javax.swing.JButton(); downBtn = new javax.swing.JButton(); listScroll = new javax.swing.JScrollPane(); shapesList = new javax.swing.JList(); tfName = new javax.swing.JTextField(); tfName.addActionListener(this); setLayout(new java.awt.GridBagLayout()); topPanel.setLayout(new java.awt.GridBagLayout()); tbTop1.setFloatable(false); btShowDrawnPoints.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/vertex_off.gif"))); // NOI18N btShowDrawnPoints.setToolTipText(options.getMsg("edit_shape_showPoints_tooltip")); btShowDrawnPoints.setSelectedIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/vertex_on.gif"))); // NOI18N tbTop1.add(btShowDrawnPoints); sept1.setOrientation(javax.swing.SwingConstants.VERTICAL); tbTop1.add(sept1); btGrid.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/grid.gif"))); // NOI18N btGrid.setToolTipText(options.getMsg("edit_shape_hideGrid")); tbTop1.add(btGrid); gridSizeEdit.setToolTipText(options.getMsg("edit_shape_gridSize_tooltip")); gridSizeEdit.setEditColumns(2); gridSizeEdit.setMax(50); gridSizeEdit.setMin(5); gridSizeEdit.setValue(10); gridSizeEdit.setValues(new int[]{5, 10, 15, 20, 30, 50}); tbTop1.add(gridSizeEdit); sept2.setOrientation(javax.swing.SwingConstants.VERTICAL); tbTop1.add(sept2); btDelete.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/delete.gif"))); // NOI18N btDelete.setToolTipText(options.getMsg("edit_shape_deletePoint")); btDelete.setMaximumSize(new java.awt.Dimension(32, 32)); btDelete.setMinimumSize(new java.awt.Dimension(32, 32)); tbTop1.add(btDelete); btCopy.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/copy.gif"))); // NOI18N btCopy.setToolTipText(options.getMsg("COPY")); tbTop1.add(btCopy); btPaste.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/paste.gif"))); // NOI18N btPaste.setToolTipText(options.getMsg("PASTE")); tbTop1.add(btPaste); sept3.setOrientation(javax.swing.SwingConstants.VERTICAL); tbTop1.add(sept3); btMagnet.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/imant.gif"))); // NOI18N btMagnet.setToolTipText(options.getMsg("edit_shape_aproxPoints")); tbTop1.add(btMagnet); magnetRadiusEdit.setToolTipText(options.getMsg("edit_shape_magnetRadius_tooltip")); magnetRadiusEdit.setEditColumns(2); magnetRadiusEdit.setMax(15); magnetRadiusEdit.setMin(1); magnetRadiusEdit.setValue(4); magnetRadiusEdit.setValues(new int[]{1, 2, 4, 6, 10, 15}); tbTop1.add(magnetRadiusEdit); sept4.setOrientation(javax.swing.SwingConstants.VERTICAL); tbTop1.add(sept4); zoomPanel.setOpaque(false); zoomPanel.setLayout(new javax.swing.BoxLayout(zoomPanel, javax.swing.BoxLayout.LINE_AXIS)); zoomLb.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/zoom.gif"))); // NOI18N zoomLb.setBorder(javax.swing.BorderFactory.createEmptyBorder(1, 3, 1, 3)); zoomPanel.add(zoomLb); btZoomOut.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/minus.gif"))); // NOI18N btZoomOut.setToolTipText(options.getMsg("edit_shape_zoomOut")); btZoomOut.setPreferredSize(new java.awt.Dimension(16, 16)); zoomPanel.add(btZoomOut); lbZoom.setColumns(3); lbZoom.setEditable(false); lbZoom.setHorizontalAlignment(javax.swing.JTextField.CENTER); lbZoom.setText("1x"); zoomPanel.add(lbZoom); btZoomIn.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/plus.gif"))); // NOI18N btZoomIn.setToolTipText(options.getMsg("edit_shape_zoomIn")); btZoomIn.setPreferredSize(new java.awt.Dimension(16, 16)); zoomPanel.add(btZoomIn); tbTop1.add(zoomPanel); topPanel.add(tbTop1, new java.awt.GridBagConstraints()); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.weightx = 1.0; topPanel.add(spacerTop, gridBagConstraints); 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); add(topPanel, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; add(sep0, gridBagConstraints); leftPanel.setLayout(new java.awt.GridBagLayout()); tbLeft1.setFloatable(false); tbLeft1.setOrientation(1); bgMode.add(btSelect); btSelect.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/selectionMode.gif"))); // NOI18N btSelect.setToolTipText(options.getMsg("edit_shape_select")); btSelect.setMaximumSize(new java.awt.Dimension(32, 32)); btSelect.setMinimumSize(new java.awt.Dimension(32, 32)); tbLeft1.add(btSelect); bgMode.add(btDivide); btDivide.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/add_point.gif"))); // NOI18N btDivide.setToolTipText(options.getMsg("edit_shape_addPoint")); btDivide.setMaximumSize(new java.awt.Dimension(32, 32)); btDivide.setMinimumSize(new java.awt.Dimension(32, 32)); tbLeft1.add(btDivide); tbLeft1.add(sep1); bgMode.add(btRect); btRect.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/rect.gif"))); // NOI18N btRect.setToolTipText(options.getMsg("edit_shape_drawRect")); btRect.setMaximumSize(new java.awt.Dimension(32, 32)); btRect.setMinimumSize(new java.awt.Dimension(32, 32)); tbLeft1.add(btRect); bgMode.add(btEllipse); btEllipse.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/rodona.gif"))); // NOI18N btEllipse.setToolTipText(options.getMsg("edit_shape_drawEllipse")); btEllipse.setMaximumSize(new java.awt.Dimension(32, 32)); btEllipse.setMinimumSize(new java.awt.Dimension(32, 32)); tbLeft1.add(btEllipse); bgMode.add(btPolygon); btPolygon.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/pent.gif"))); // NOI18N btPolygon.setToolTipText(options.getMsg("edit_shape_drawPoly")); btPolygon.setMaximumSize(new java.awt.Dimension(32, 32)); btPolygon.setMinimumSize(new java.awt.Dimension(32, 32)); tbLeft1.add(btPolygon); btLine.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/line.gif"))); // NOI18N btLine.setToolTipText(options.getMsg("edit_shape_toLine")); btLine.setMaximumSize(new java.awt.Dimension(32, 32)); btLine.setMinimumSize(new java.awt.Dimension(32, 32)); tbLeft1.add(btLine); btBezier.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/bezier.gif"))); // NOI18N btBezier.setToolTipText(options.getMsg("edit_shape_toBezier")); btBezier.setMaximumSize(new java.awt.Dimension(32, 32)); btBezier.setMinimumSize(new java.awt.Dimension(32, 32)); tbLeft1.add(btBezier); btQuad.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/quad.gif"))); // NOI18N btQuad.setToolTipText(options.getMsg("edit_shape_toQuad")); btQuad.setMaximumSize(new java.awt.Dimension(32, 32)); btQuad.setMinimumSize(new java.awt.Dimension(32, 32)); tbLeft1.add(btQuad); tbLeft1.add(sep2); btExpand.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/expand.gif"))); // NOI18N btExpand.setToolTipText(options.getMsg("edit_shape_expand")); tbLeft1.add(btExpand); btContract.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/contract.gif"))); // NOI18N btContract.setToolTipText(options.getMsg("edit_shape_contract")); tbLeft1.add(btContract); tbLeft1.add(sep4); btRotateRight.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/rotate_right.gif"))); // NOI18N btRotateRight.setToolTipText(options.getMsg("edit_shape_rRight")); tbLeft1.add(btRotateRight); btRotateLeft.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/rotate_left.gif"))); // NOI18N btRotateLeft.setToolTipText(options.getMsg("edit_shape_rLeft")); tbLeft1.add(btRotateLeft); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; leftPanel.add(tbLeft1, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.weighty = 1.0; leftPanel.add(spacerLeft, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTH; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); add(leftPanel, gridBagConstraints); splitPane.setResizeWeight(1.0); previewPanel.setHorizontalScrollBarPolicy(javax.swing.ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS); previewPanel.setVerticalScrollBarPolicy(javax.swing.ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS); splitPane.setLeftComponent(previewPanel); listPanel.setLayout(new java.awt.BorderLayout(10, 8)); upBtn.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/up.gif"))); upBtn.setToolTipText(options.getMsg("edit_list_upBtn_tooltip")); upBtn.setEnabled(false); upBtn.setPreferredSize(new java.awt.Dimension(16, 16)); upBtn.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { upBtnActionPerformed(evt); } }); orderBtnPanel.add(upBtn); downBtn.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/down.gif"))); downBtn.setToolTipText(options.getMsg("edit_list_downBtn_tooltip")); downBtn.setEnabled(false); downBtn.setPreferredSize(new java.awt.Dimension(16, 16)); downBtn.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { downBtnActionPerformed(evt); } }); orderBtnPanel.add(downBtn); listPanel.add(orderBtnPanel, java.awt.BorderLayout.NORTH); listScroll.setToolTipText(options.getMsg("edit_shape_elements")); listScroll.setPreferredSize(new java.awt.Dimension(80, 100)); shapesList.setModel(listModel); shapesList.addListSelectionListener(listSelectionListener); listScroll.setViewportView(shapesList); listPanel.add(listScroll, java.awt.BorderLayout.CENTER); tfName.setToolTipText(options.getMsg("edit_shape_elemName")); listPanel.add(tfName, java.awt.BorderLayout.SOUTH); splitPane.setRightComponent(listPanel); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.weightx = 1.0; gridBagConstraints.weighty = 1.0; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); add(splitPane, gridBagConstraints); }// </editor-fold>//GEN-END:initComponents private void upBtnActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_upBtnActionPerformed if (listModel != null) { int sel = shapesList.getSelectedIndex(); if (sel > 0 && sel < listModel.getSize() - 1) { listModel.switchShapes(sel, sel-1); shapesList.setSelectedIndex(sel - 1); modified = true; repaint(0); } } }//GEN-LAST:event_upBtnActionPerformed private void downBtnActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_downBtnActionPerformed if (listModel != null) { int sel = shapesList.getSelectedIndex(); if (sel >= 0 && sel < listModel.getSize() - 2) { listModel.switchShapes(sel, sel+1); shapesList.setSelectedIndex(sel + 1); modified = true; repaint(0); } } }//GEN-LAST:event_downBtnActionPerformed private void setDrawingRectangleMode(){ deselectAll(); btRect.setSelected(true); pdp.setDrawingMode(PolygonDrawPanel.DRAWING_RECT); pdp.deSelectAll(); repaint(0); } private void deselectAll(){ pdp.cancelCurrentOperations(); btSelect.setSelected(false); btRect.setSelected(false); btEllipse.setSelected(false); btPolygon.setSelected(false); btBezier.setSelected(false); btQuad.setSelected(false); btDivide.setSelected(false); // btZoom.setSelected(false); } public void setDrawingMode(int drawingMode){ pdp.setDrawingMode(drawingMode); switch (drawingMode){ case PolygonDrawPanel.SELECTING: btSelect.setSelected(true); break; case PolygonDrawPanel.NEW_POINT: btDivide.setSelected(true); break; } btDelete.setEnabled(pdp.getNumShapes()>0); } public void shapeChanged() { if (pdp.getNumShapes()>0){ //Ja no podem crear un rectangle o el.lipse btDelete.setEnabled(true); shapeDrawn=true; repaint(0); } else { btDelete.setEnabled(pdp.hasSelectedPoint()); clean(); } if (!btDivide.isSelected()){ pdp.setDrawingMode(PolygonDrawPanel.SELECTING); deselectAll(); btSelect.setSelected(true); } else btSelect.setSelected(false); updateTransformingButtons(); } protected void updateTransformingButtons(){ List<EditableShape> v=pdp.getSelectedShapes(); if (v.size()==1){ EditableShape shape=v.get(0); //El te segur: size==1 if (!(shape instanceof EditableRectangle)){ btBezier.setEnabled(true); btQuad.setEnabled(true); } if (!(shape instanceof EditableEllipse2D)) btLine.setEnabled(true); } else{ btBezier.setEnabled(false); btQuad.setEnabled(false); btLine.setEnabled(false); repaint(0); } } public JComponent getPreviewPanel(){ return previewPanel; } private void clean(){ //pdp.deleteCurrent(); pdp.deleteSelected(false); shapeDrawn=false; deselectAll(); btRect.setEnabled(true); btEllipse.setEnabled(true); btPolygon.setEnabled(true); ////btDivide.setEnabled(false); } // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.ButtonGroup bgMode; private javax.swing.JButton btBezier; private javax.swing.JButton btContract; private javax.swing.JButton btCopy; private javax.swing.JButton btDelete; private javax.swing.JToggleButton btDivide; private javax.swing.JToggleButton btEllipse; private javax.swing.JButton btExpand; private javax.swing.JToggleButton btGrid; private javax.swing.JButton btLine; private javax.swing.JToggleButton btMagnet; private javax.swing.JButton btPaste; private javax.swing.JToggleButton btPolygon; private javax.swing.JButton btQuad; private javax.swing.JToggleButton btRect; private javax.swing.JButton btRotateLeft; private javax.swing.JButton btRotateRight; private javax.swing.JToggleButton btSelect; private javax.swing.JToggleButton btShowDrawnPoints; private javax.swing.JButton btZoomIn; private javax.swing.JButton btZoomOut; private javax.swing.JButton downBtn; private edu.xtec.jclic.beans.SmallIntEditor gridSizeEdit; private javax.swing.JTextField lbZoom; private javax.swing.JScrollPane listScroll; private edu.xtec.jclic.beans.SmallIntEditor magnetRadiusEdit; private javax.swing.JPanel orderBtnPanel; private javax.swing.JScrollPane previewPanel; private javax.swing.JList shapesList; private javax.swing.JTextField tfName; private javax.swing.JButton upBtn; // End of variables declaration//GEN-END:variables public void updateView(){ ((PreviewPanel)previewPanel).updateView(); } class PreviewPanel extends JScrollPane{ public VP vp; public PreviewPanel(){ vp=new VP(); setViewportView(vp); updateView(); } public void updateView(){ vp.updateView(); //doLayout();//// } } class VP extends JPanel{ private int xBak=-1, yBak=-1, wBak=-1, hBak=-1; List<Shape> shapes; VP() { this.shapes = new ArrayList<Shape>(); } public void updateView(){ setSize(getSize()); setPreferredSize(getSize()); updateComponentsView(); } public void updateComponentsView(){ shapes.clear(); for(int i=0; i<shaper.getNumCells(); i++){ shapes.add(shaper.getShape(i, previewArea)); } if (pdp!=null) pdp.updateView(); super.updateUI(); 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, previewArea.width, previewArea.height, this); } pdp.drawGrid(g,EditableShapeConstants.gridWidth); g2.setColor(Color.black); for(int i=0; i<shapes.size(); i++){ if(i!=currentShape) g2.draw((Shape)shapes.get(i)); } g2.setColor(Color.red); pdp.paint(g2); ///% drawBorder(g2,defaultBgColor); g2.setStroke(defaultStroke); g2.setColor(defaultColor); g2.setBackground(defaultBgColor); g2.setRenderingHints(rh); } protected void drawBorder(Graphics g, Color c){ g.setColor(c); g.fillRect(0,0,(int)previewArea.getX(),getHeight()); } @Override public void doLayout(){ previewArea.x=(getBounds().width-previewArea.width)/2; previewArea.y=(getBounds().height-previewArea.height)/2; if (previewArea.x!=xBak || previewArea.y!=yBak || previewArea.width!=wBak || previewArea.height!=hBak){ xBak=previewArea.x; yBak=previewArea.y; wBak=previewArea.width; hBak=previewArea.height; pdp.initDrawnBorders(); } //previewArea.x=0; //previewArea.y=0; //updateView(); updateComponentsView(); } @Override public Dimension getSize(){ return new Dimension(previewArea.x+(int)previewArea.getBounds().getWidth(),previewArea.y+(int)previewArea.getBounds().getHeight()); } } public Holes getHoles(){ return shaper; } public Rectangle getPreviewArea(){ return previewArea; } public void setPreviewArea(Rectangle r){ previewArea=r; } public int getNumShapes(){ return shaper.getNumCells(); } public static Shaper getShaper(Shaper initialShaper, Component parent, Options options, Dimension dim, Image img, BoxBase bb){ //return HolesEditPanel.getShaper(initialShaper, parent, options, dim, img, bb); Messages msg=options.getMessages(); if(initialShaper==null || !(initialShaper instanceof Holes)) return null; Holes sh; try{ sh=(Holes)initialShaper.clone(); } catch(CloneNotSupportedException ex){ msg.showErrorWarning(parent, "edit_act_shaper_err", ex); return null; } HolesEditorPanel he=new HolesEditorPanel(options, sh, dim, img, bb); boolean b=msg.showInputDlg(parent, he, "edit_act_shaper_properties"); if(b) he.confirmChanges(); return b ? sh : null; } public void updatePreviewArea(double xFactor, double yFactor){ if (lastWidth!=-1){ lastWidth*=xFactor; lastHeight*=yFactor; } else{ lastWidth=previewArea.getWidth()*xFactor; lastHeight=previewArea.getHeight()*yFactor; } this.xFactor*=xFactor; this.yFactor*=yFactor; //previewArea=new Rectangle(new Point((int)(previewArea.x*xFactor),(int)(previewArea.y*yFactor)),new Dimension((int)(lastWidth), (int)(lastHeight))); previewArea=new Rectangle(new Dimension((int)(lastWidth), (int)(lastHeight))); //previewArea.x=(int)((((PreviewPanel)previewPanel).vp.getBounds().width-lastWidth)/2); //previewArea.y=(int)((((PreviewPanel)previewPanel).vp.getBounds().height-lastHeight)/2); //previewArea=new Rectangle(new Dimension((int)(previewArea.getWidth()*xFactor), (int)(previewArea.getHeight()*yFactor))); updateView(); } public void incDrawingArea(double incWidth, double incHeight){ modifyDrawingArea(previewArea.width+incWidth,previewArea.height+incHeight); } protected void modifyDrawingArea(double newWidth, double newHeight){ if(newWidth>0 && newHeight>0){ double xFactorMod=newWidth/previewArea.width; double yFactorMod=newHeight/previewArea.height; for(int i=0; i<shaper.getNumCells(); i++){ ShapeData sd=shaper.getShapeData(i); sd.scaleTo(xFactorMod, yFactorMod); } previewArea.setSize((int)newWidth, (int)newHeight); previewDim.setSize(previewArea.getSize()); shaper.scaleW=newWidth; shaper.scaleH=newHeight; updateView(); } } public void pointMoved(java.awt.geom.Point2D p) { } public void actionPerformed(java.awt.event.ActionEvent actionEvent) { if(!initializing && actionEvent!=null){ Object obj=actionEvent.getSource(); if(obj==btDivide){ deselectAll(); requestFocus(); btDivide.setSelected(true); pdp.setDrawingMode(PolygonDrawPanel.NEW_POINT); pdp.deSelectAll(); repaint(0); } else if(obj==btDelete){ clean(); shapeChanged(); repaint(0); } else if(obj==btEllipse){ requestFocus(); pdp.setDrawingMode(PolygonDrawPanel.DRAWING_ELLIPSE); } else if(obj==btRect){ requestFocus(); pdp.setDrawingMode(PolygonDrawPanel.DRAWING_RECT); } else if(obj==btLine){ requestFocus(); pdp.convertToLine(); repaint(0); } else if(obj==btBezier){ requestFocus(); pdp.convertToBezier(); repaint(0); } else if(obj==btQuad){ requestFocus(); pdp.convertToQuad(); repaint(0); } else if(obj==btPolygon){ requestFocus(); pdp.setDrawingMode(PolygonDrawPanel.DRAWING_POLYGON); } else if(obj==btSelect){ requestFocus(); pdp.setDrawingMode(PolygonDrawPanel.SELECTING); } else if(obj==btShowDrawnPoints){ EditableShapeConstants.showDrawnPoints=btShowDrawnPoints.isSelected(); repaint(0); } else if(obj==btGrid){ EditableShapeConstants.gridWidth=btGrid.isSelected() ? gridSizeEdit.getValue() : -1; gridSizeEdit.setEnabled(btGrid.isSelected()); repaint(); } else if(obj==btMagnet){ EditableShapeConstants.pointsOnGrid=btMagnet.isSelected(); magnetRadiusEdit.setEnabled(btMagnet.isSelected()); repaint(0); } else if(obj==btRotateRight){ pdp.rotate(ROTATE_UNIT, false, false); } else if(obj==btRotateLeft){ pdp.rotate(-ROTATE_UNIT, false, false); } else if(obj==btExpand){ pdp.scale(EditableShapeConstants.scaleXFactor,EditableShapeConstants.scaleYFactor,false,false); } else if(obj==btContract){ if(EditableShapeConstants.scaleXFactor!=0 && EditableShapeConstants.scaleYFactor!=0) pdp.scale(1/EditableShapeConstants.scaleXFactor,1/EditableShapeConstants.scaleYFactor,false,false); } else if(obj==btZoomIn){ doZoom(true); } else if(obj==btZoomOut){ doZoom(false); } else if(obj==btCopy){ pdp.copy(false); updateView(); } else if(obj==btPaste){ pdp.endPolygon(); pdp.paste(); updateView(); } else if(obj==tfName){ ShapeData sd; if (currentShape>=0){ sd=getHoles().getShapeData(currentShape); String txt=tfName.getText().trim(); //Potser caldria comprovar que no estigui repetit el nom if (sd!=null && txt.length()>0) sd.comment=txt; updateList(); } } } } public void propertyChange(java.beans.PropertyChangeEvent ev) { if(!initializing && ev!=null){ Object obj=ev.getSource(); if(obj==gridSizeEdit){ int v=btGrid.isSelected() ? gridSizeEdit.getValue() : -1; if(v!=EditableShapeConstants.gridWidth){ EditableShapeConstants.gridWidth=v; repaint(); } } else if(obj==magnetRadiusEdit){ int v=magnetRadiusEdit.getValue()*2; if(v!=EditableShapeConstants.selectLength){ EditableShapeConstants.selectLength=v; pdp.initDrawnBorders(); repaint(); } } else if(obj==previewPanel){ repaint(0); } } } protected void doZoom(boolean in){ double zoomDelta=1.0; if(in){ if(zoomFactor<MAX_ZOOM){ if (zoomFactor>=1){ zoomDelta=((double)zoomFactor+1)/zoomFactor; } else{ double den=Math.abs(zoomFactor-2); zoomDelta=(1/(den-1))/(1/den); } zoomFactor++; } } else{ if(zoomFactor>MIN_ZOOM){ if (zoomFactor>1){ zoomDelta=((double)zoomFactor-1)/zoomFactor; } else { double den=Math.abs(zoomFactor-2); zoomDelta=(1/(den+1))/(1/den); } zoomFactor--; } } if (zoomDelta!=1){ pdp.endPolygon(); updatePreviewArea(zoomDelta, zoomDelta); } btZoomIn.setEnabled(zoomFactor<MAX_ZOOM); btZoomOut.setEnabled(zoomFactor>MIN_ZOOM); String sFactor = (zoomFactor>=1) ? Integer.toString(zoomFactor) : ("1/"+Math.abs(zoomFactor-2)); lbZoom.setText(sFactor+"x"); } }