/* * Jitsi, the OpenSource Java VoIP and Instant Messaging client. * * Copyright @ 2015 Atlassian Pty Ltd * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package net.java.sip.communicator.plugin.desktoputil.presence.avatar.imagepicker; import java.awt.*; import java.awt.event.*; import java.awt.image.*; import java.io.*; import javax.imageio.*; import javax.swing.*; import net.java.sip.communicator.plugin.desktoputil.*; /** * Dialog in which we can load an image from file or take new one by using * the webcam. Scaling the image to desired size. * * @author Shashank Tyagi * @author Damien Roth * @author Damian Minkov */ public class ImagePickerDialog extends SIPCommDialog implements ActionListener { private EditPanel editPanel; private JButton okButton, cancelButton; private JButton selectFileButton, webcamButton; private boolean editCanceled = false; public ImagePickerDialog(int clipperZoneWidth, int clipperZoneHeight) { super(); this.initComponents(clipperZoneWidth, clipperZoneHeight); this.initDialog(); this.pack(); this.setLocationRelativeTo(null); } /** * Initialize the dialog with the already created components. */ private void initDialog() { this.setTitle(DesktopUtilActivator.getResources() .getI18NString("service.gui.avatar.imagepicker.IMAGE_PICKER")); this.setModal(true); this.setResizable(true); this.setLayout(new BorderLayout()); TransparentPanel editButtonsPanel = new TransparentPanel(); editButtonsPanel.setLayout(new FlowLayout(FlowLayout.LEFT)); editButtonsPanel.add(this.selectFileButton); editButtonsPanel.add(this.webcamButton); TransparentPanel okCancelPanel = new TransparentPanel(); okCancelPanel.setLayout(new FlowLayout(FlowLayout.RIGHT)); okCancelPanel.add(cancelButton); okCancelPanel.add(okButton); TransparentPanel buttonsPanel = new TransparentPanel(); buttonsPanel.setLayout(new BorderLayout()); buttonsPanel.add(editButtonsPanel, BorderLayout.WEST); buttonsPanel.add(okCancelPanel, BorderLayout.CENTER); this.add(this.editPanel, BorderLayout.CENTER); this.add(buttonsPanel, BorderLayout.SOUTH); this.pack(); } /** * Initialize UI components. * @param clipperZoneWidth * @param clipperZoneHeight */ private void initComponents(int clipperZoneWidth, int clipperZoneHeight) { // Edit panel this.editPanel = new EditPanel(clipperZoneWidth, clipperZoneHeight); // Buttons this.okButton = new JButton(DesktopUtilActivator.getResources() .getI18NString("service.gui.avatar.imagepicker.SET")); this.okButton.addActionListener(this); this.okButton.setName("okButton"); this.cancelButton = new JButton(DesktopUtilActivator.getResources() .getI18NString("service.gui.avatar.imagepicker.CANCEL")); this.cancelButton.addActionListener(this); this.cancelButton.setName("cancelButton"); this.selectFileButton = new JButton(DesktopUtilActivator.getResources() .getI18NString("service.gui.avatar.imagepicker.CHOOSE_FILE")); this.selectFileButton.addActionListener(this); this.selectFileButton.setName("selectFileButton"); this.webcamButton = new JButton(DesktopUtilActivator.getResources() .getI18NString("service.gui.avatar.imagepicker.TAKE_PHOTO")); this.webcamButton.addActionListener(this); this.webcamButton.setName("webcamButton"); } /** * Shows current dialog and setting initial picture. * @param image the initial picture to show. * @return the result: clipped image (from file or webcam). */ public byte[] showDialog(Image image) { if(image != null) this.editPanel.setImage(ImageUtils.getBufferedImage(image)); this.setVisible(true); if (this.editCanceled) return null; else return this.editPanel.getClippedImage(); } /** * Invoked for any button activity. * @param e */ public void actionPerformed(ActionEvent e) { String name = ((JButton) e.getSource()).getName(); if (name.equals("cancelButton")) { editCanceled = true; this.setVisible(false); } else if (name.equals("selectFileButton")) { SipCommFileChooser chooser = GenericFileDialog.create( //GuiActivator.getUIService().getMainFrame(), null, DesktopUtilActivator.getResources().getI18NString( "service.gui.avatar.imagepicker.CHOOSE_FILE"), SipCommFileChooser.LOAD_FILE_OPERATION); chooser.addFilter(new ImageFileFilter()); File selectedFile = chooser.getFileFromDialog(); if(selectedFile != null) { try { BufferedImage image = ImageIO.read(selectedFile); this.editPanel.setImage(image); } catch (IOException ioe) { // TODO Auto-generated catch block ioe.printStackTrace(); } } } else if (name.equals("okButton")) { editCanceled = false; this.setVisible(false); } else if (name.equals("webcamButton")) { WebcamDialog dialog = new WebcamDialog(this); dialog.setVisible(true); byte[] bimage = dialog.getGrabbedImage(); if (bimage != null) { Image i = new ImageIcon(bimage).getImage(); editPanel.setImage(ImageUtils.getBufferedImage(i)); } } } /** * Closes the dialog. * @param isEscaped */ @Override protected void close(boolean isEscaped) { dispose(); } /** * The filter for file chooser. */ class ImageFileFilter extends SipCommFileFilter { @Override public boolean accept(File f) { String path = f.getAbsolutePath().toLowerCase(); if (path.matches("(.*)\\.(jpg|jpeg|png|bmp)$") || f.isDirectory()) return true; else return false; } @Override public String getDescription() { return DesktopUtilActivator.getResources() .getI18NString("service.gui.avatar.imagepicker.IMAGE_FILES"); } } }