/* * Copyright (C) 2004 The Concord Consortium, Inc., * 10 Concord Crossing, Concord, MA 01742 * * Web Site: http://www.concord.org * Email: info@concord.org * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * END LICENSE */ package org.concord.swing; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.Insets; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.awt.image.BufferedImage; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import javax.swing.AbstractButton; import javax.swing.BorderFactory; import javax.swing.ButtonGroup; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JDialog; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JRadioButton; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.JToolBar; import javax.swing.SwingConstants; import javax.swing.SwingUtilities; import javax.swing.border.Border; class JAnnotationImageExample extends JPanel { private static final Border SELECTED_BORDER=BorderFactory.createLoweredBevelBorder(); private static final Border EMPTY_BORDER=BorderFactory.createEmptyBorder(); private JToolBar toolbar; private JTextArea textArea; private JAnnotationImageContainer annotationContainer; private JCheckBox annotationCheckBox; private ImageIcon image; JAnnotationImageExample(){ super(new BorderLayout(0, 0)); setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); textArea=new JTextArea(); textArea.setPreferredSize(new Dimension(300, 100)); JScrollPane sp = new JScrollPane(textArea); //add(sp, BorderLayout.SOUTH); JLabel label=new JLabel("<html>Please make note of the above snapshot image in the following box (it will be automatically included in your report) :</html>"); label.setAlignmentX(0.5f); label.setPreferredSize(new Dimension(300, 50)); //add(label, BorderLayout.CENTER); JPanel panel=new JPanel(new BorderLayout(0, 0)); panel.setBorder(BorderFactory.createEtchedBorder()); //add(panel, BorderLayout.NORTH); annotationContainer=new JAnnotationImageContainer(); //annotationContainer.setToolBarVisible(false); annotationContainer.setBorder(BorderFactory.createLoweredBevelBorder()); panel.add(annotationContainer, BorderLayout.CENTER); javax.swing.Box box = javax.swing.Box.createVerticalBox(); add(box,BorderLayout.CENTER); box.add(new JScrollPane(panel)); box.add(label); box.add(sp); } String showInputDialog(Component parent, ImageIcon image){ this.image=image; annotationContainer.setAnnotationImage((BufferedImage)image.getImage()); annotationContainer.setPreferredSize(new Dimension(image.getIconWidth(), image.getIconHeight())); if(annotationCheckBox != null) annotationCheckBox.setSelected(false); textArea.setText(""); final JDialog dialog=new JDialog(JOptionPane.getFrameForComponent(parent), "Add snapshot", true); dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); dialog.getContentPane().add(this, BorderLayout.CENTER); JPanel panel=new JPanel(); dialog.getContentPane().add(panel, BorderLayout.SOUTH); JButton button=new JButton("OK"); button.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e){ dialog.dispose(); } }); panel.add(button); dialog.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){ dialog.dispose(); } public void windowActivated(WindowEvent e){ textArea.requestFocus(); } }); dialog.pack(); dialog.setLocationRelativeTo(parent); dialog.setVisible(true); return textArea.getText(); } private void createAnnotationToolBar(){ toolbar=new JToolBar(SwingConstants.HORIZONTAL); toolbar.setFloatable(false); toolbar.setMargin(new Insets(0, 0, 0, 0)); toolbar.setLayout(new FlowLayout(FlowLayout.LEFT, 2, 0)); toolbar.putClientProperty("JToolBar.isRollover", Boolean.TRUE); Dimension buttonDimension=new Dimension(24, 24); final List disableList=new ArrayList(); annotationCheckBox=new JCheckBox("Annotation"); annotationCheckBox.setToolTipText("Enable the tool for annotating the snapshot image"); annotationCheckBox.setHorizontalAlignment(SwingConstants.CENTER); annotationCheckBox.setSelected(false); annotationCheckBox.addItemListener(new ItemListener(){ public void itemStateChanged(ItemEvent e){ final boolean b=e.getStateChange()==ItemEvent.SELECTED; SwingUtilities.invokeLater(new Runnable(){ public void run(){ annotationContainer.setEditMode(b); for(Iterator it=disableList.iterator(); it.hasNext();){ ((AbstractButton)it.next()).setEnabled(b); } } }); } }); toolbar.add(annotationCheckBox); ButtonGroup bg=new ButtonGroup(); JRadioButton rb=new JRadioButton(new ImageIcon(getClass().getResource("images/CallOutRectangle.gif"))); rb.setSelected(true); rb.setToolTipText("Annotate a selected rectangular area"); rb.setPreferredSize(buttonDimension); rb.setBorderPainted(true); rb.setHorizontalAlignment(SwingConstants.CENTER); rb.addItemListener(new ItemListener(){ public void itemStateChanged(ItemEvent e){ JRadioButton rbb=(JRadioButton)e.getSource(); if(e.getStateChange()==ItemEvent.SELECTED){ annotationContainer.setChoosingMode(JAnnotationImageModel.CHOOSING_MODE_RECTANGLE); rbb.setBorder(SELECTED_BORDER); rbb.setBackground(Color.white); } else { rbb.setBorder(EMPTY_BORDER); rbb.setBackground(getBackground()); } } }); bg.add(rb); toolbar.add(rb); disableList.add(rb); rb=new JRadioButton(new ImageIcon(getClass().getResource("images/CallOutEllipse.gif"))); rb.setToolTipText("Annotate a selected circular area"); rb.setPreferredSize(buttonDimension); rb.setBorderPainted(true); rb.setHorizontalAlignment(SwingConstants.CENTER); rb.addItemListener(new ItemListener(){ public void itemStateChanged(ItemEvent e){ JRadioButton rbb=(JRadioButton)e.getSource(); if(e.getStateChange()==ItemEvent.SELECTED){ annotationContainer.setChoosingMode(JAnnotationImageModel.CHOOSING_MODE_ELLIPSE); rbb.setBorder(SELECTED_BORDER); rbb.setBackground(Color.white); } else { rbb.setBorder(EMPTY_BORDER); rbb.setBackground(getBackground()); } } }); bg.add(rb); toolbar.add(rb); disableList.add(rb); for(Iterator it=disableList.iterator(); it.hasNext();) ((AbstractButton)it.next()).setEnabled(false); } public static void main(String []args){ JAnnotationImageExample snapshotComment=new JAnnotationImageExample(); try{ java.awt.Robot robot = new java.awt.Robot(); java.awt.image.BufferedImage bimg = robot.createScreenCapture(new java.awt.Rectangle(0,0,300,300)); snapshotComment.showInputDialog(null, new ImageIcon(bimg)); }catch(Throwable t){ System.out.println("Throwable "+t); t.printStackTrace(); } } }