/* GNU Lesser General Public License ImageDialog Copyright (C) 2003 Howard Kistler & other contributors 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 */ package com.hexidec.ekit.component; import java.awt.Container; import java.awt.Cursor; import java.awt.Dialog; import java.awt.Dimension; import java.awt.Frame; import java.awt.Insets; import java.awt.Window; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.BorderFactory; import javax.swing.Box; import javax.swing.BoxLayout; import javax.swing.JButton; import javax.swing.JDialog; import javax.swing.JEditorPane; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextField; import javax.swing.ListSelectionModel; import javax.swing.ScrollPaneConstants; import javax.swing.SwingConstants; import javax.swing.WindowConstants; import javax.swing.border.BevelBorder; import javax.swing.border.SoftBevelBorder; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import javax.swing.text.html.HTML; import javax.swing.text.html.HTMLDocument; public class ImageDialog extends JDialog implements ActionListener { /** <code>serialVersionUID</code> */ private static final long serialVersionUID = -6443353902954507446L; private static final String[] BORDERSIZES = new String[] { "none", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10" }; private static final String[] WRAPS = new String[] { "none", "left", "right", "top", "middle", "bottom" }; private ExtendedHTMLEditorKit imageHtmlKit; private HTMLDocument imageHtmlDoc; private JList wrapJList; private JList borderSizeJList; private JList imagesJList; private JTextField imageAltText; private JTextField imageWidth; private JTextField imageHeight; private JEditorPane previewPane; private String imageDir; private String[] imageList; private String previewImage; private String selectedImage; /** * Creates and displays a FontSelectorDialog. * @param parent the parent Frame or Dialog of the FontSelectorDialog * @param imageDir the directory where to find the images * @param imageList a list of available images * @param title the dialog title * @param modal whether the dialog should be modal * @return the ImageDialog instance */ public static ImageDialog open(Window parent, String imageDir, String[] imageList, String title, boolean modal) { ImageDialog me; if (parent instanceof Frame) { me = new ImageDialog((Frame) parent, imageDir, imageList, title, modal); } else if (parent instanceof Dialog) { me = new ImageDialog((Dialog) parent, imageDir, imageList, title, modal); me.pack(); me.setVisible(true); } else { throw new IllegalArgumentException("parent must be a Frame or a Dialog"); } return me; } private ImageDialog(Dialog parent, String imageDir, String[] imageList, String title, boolean modal) { super(parent, title, modal); init(imageDir, imageList); } /** * @deprecated use {@link #open(Window, String, String[], String, boolean)} instead */ // TODO reduce visibility to private in next release public ImageDialog(Frame parent, String imageDir, String[] imageList, String title, boolean modal) { super(parent, title, modal); init(imageDir, imageList); pack(); setVisible(true); } public void actionPerformed(ActionEvent e) { if(e.getActionCommand().equals("apply")) { ListSelectionModel sm = imagesJList.getSelectionModel(); if(sm.isSelectionEmpty()) { SimpleInfoDialog.show(getOwner(), "Error", true, "No image selected", SimpleInfoDialog.ERROR); imagesJList.requestFocus(); } else { if(validateControls()) { previewSelectedImage(); } } } if(e.getActionCommand().equals("save")) { ListSelectionModel sm = imagesJList.getSelectionModel(); if(sm.isSelectionEmpty()) { SimpleInfoDialog.show(getOwner(), "Error", true, "No image selected", SimpleInfoDialog.ERROR); imagesJList.requestFocus(); } else { if(validateControls()) { previewSelectedImage(); selectedImage = previewImage; hide(); } } } else if(e.getActionCommand().equals("cancel")) { hide(); } } public void init(String imageDir, String[] imageList) { this.imageDir = imageDir; this.imageList = imageList; selectedImage = ""; Container contentPane = getContentPane(); contentPane.setLayout(new BoxLayout(contentPane, BoxLayout.Y_AXIS)); //setBounds(100,100,500,300); setDefaultCloseOperation(WindowConstants.HIDE_ON_CLOSE); imagesJList = new JList(imageList); imagesJList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); imagesJList.clearSelection(); ListSelectionModel lsm = imagesJList.getSelectionModel(); /* Create the editor kit, document, and stylesheet */ previewPane = new JEditorPane(); previewPane.setEditable(false); imageHtmlKit = new ExtendedHTMLEditorKit(); imageHtmlDoc = (HTMLDocument)(imageHtmlKit.createDefaultDocument()); imageHtmlKit.setDefaultCursor(new Cursor(Cursor.TEXT_CURSOR)); previewPane.setCaretPosition(0); //PreviewPane.getDocument().addDocumentListener(this); //StyleSheet styleSheet = ImageHtmlDoc.getStyleSheet(); //ImageStyleSheet = styleSheet; lsm.addListSelectionListener(new ListSelectionListener() { public void valueChanged(ListSelectionEvent e) { if(!e.getValueIsAdjusting() && validateControls()) { previewSelectedImage(); } } }); JScrollPane imageScrollPane = new JScrollPane(imagesJList); imageScrollPane.setPreferredSize(new Dimension(200,250)); imageScrollPane.setMaximumSize(new Dimension(200,250)); imageScrollPane.setAlignmentX(LEFT_ALIGNMENT); JPanel centerPanel = new JPanel(); centerPanel.setLayout(new BoxLayout(centerPanel, BoxLayout.X_AXIS)); centerPanel.add(imageScrollPane); centerPanel.setBorder(BorderFactory.createTitledBorder("Server Images")); /* Set up the text pane */ previewPane.setEditorKit(imageHtmlKit); previewPane.setDocument(imageHtmlDoc); previewPane.setMargin(new Insets(4, 4, 4, 4)); JScrollPane previewViewport = new JScrollPane(previewPane); previewViewport.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS); previewViewport.setPreferredSize(new Dimension(250,250)); centerPanel.add(previewViewport); JPanel controlsPanel = new JPanel(); controlsPanel.setLayout(new BoxLayout(controlsPanel, BoxLayout.Y_AXIS)); JPanel altPanel = new JPanel(); altPanel.setLayout(new BoxLayout(altPanel, BoxLayout.X_AXIS)); altPanel.add(Box.createHorizontalStrut(10)); JLabel imageAltTextLabel = new JLabel("Alternate Text:", SwingConstants.LEFT); altPanel.add(imageAltTextLabel); imageAltText = new JTextField(""); imageAltText.addActionListener(this); imageAltText.setPreferredSize(new Dimension(300,25)); imageAltText.setMaximumSize(new Dimension(600,25)); altPanel.add(imageAltText); altPanel.add(Box.createHorizontalStrut(10)); controlsPanel.add(altPanel); controlsPanel.add(Box.createVerticalStrut(5)); JPanel dimPanel = new JPanel(); dimPanel.setLayout(new BoxLayout(dimPanel, BoxLayout.X_AXIS)); dimPanel.add(Box.createHorizontalStrut(10)); JLabel imageWidthLabel = new JLabel("Width:", SwingConstants.LEFT); dimPanel.add(imageWidthLabel); imageWidth = new JTextField(""); imageWidth.setPreferredSize(new Dimension(40,25)); imageWidth.setMaximumSize(new Dimension(40,25)); dimPanel.add(imageWidth); JLabel imageWidthPixels = new JLabel("pix", SwingConstants.LEFT); imageWidthPixels.setPreferredSize(new Dimension(20,10)); dimPanel.add(imageWidthPixels); dimPanel.add(Box.createHorizontalStrut(10)); JLabel imageHeightLabel = new JLabel("Height:", SwingConstants.LEFT); dimPanel.add(imageHeightLabel); imageHeight = new JTextField(""); imageHeight.setPreferredSize(new Dimension(40,25)); imageHeight.setMaximumSize(new Dimension(40,25)); dimPanel.add(imageHeight); JLabel imageHeightPixels = new JLabel("pix", SwingConstants.LEFT); imageHeightPixels.setPreferredSize(new Dimension(20,10)); dimPanel.add(imageHeightPixels); dimPanel.add(Box.createHorizontalStrut(10)); JLabel wrapLabel = new JLabel("Wrap:", SwingConstants.LEFT); dimPanel.add(wrapLabel); wrapJList = new JList(WRAPS); wrapJList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); wrapJList.getSelectionModel().setSelectionInterval(0,0); JScrollPane wrapScrollPane = new JScrollPane(wrapJList); wrapScrollPane.setAlignmentX(LEFT_ALIGNMENT); wrapScrollPane.setPreferredSize(new Dimension(80,40)); wrapScrollPane.setMaximumSize(new Dimension(80,100)); dimPanel.add(wrapScrollPane); controlsPanel.add(dimPanel); /* JPanel borderPanel = new JPanel(); JLabel borderStyleLabel = new JLabel("Style:", SwingConstants.LEFT); borderPanel.add(borderStyleLabel); BorderList = new JList(Borders); BorderList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); BorderList.getSelectionModel().setSelectionInterval(0,0); JScrollPane borderScrollPane = new JScrollPane(BorderList); borderScrollPane.setAlignmentX(LEFT_ALIGNMENT); borderScrollPane.setPreferredSize(new Dimension(80,40)); borderScrollPane.setMaximumSize(new Dimension(80,100)); borderPanel.add(borderScrollPane); borderPanel.add(Box.createHorizontalStrut(5)); */ dimPanel.add(Box.createHorizontalStrut(5)); JLabel borderSizeLabel = new JLabel("Border Size:", SwingConstants.LEFT); dimPanel.add(borderSizeLabel); borderSizeJList = new JList(BORDERSIZES); borderSizeJList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); borderSizeJList.getSelectionModel().setSelectionInterval(0,0); JScrollPane borderSizeScrollPane = new JScrollPane(borderSizeJList); borderSizeScrollPane.setAlignmentX(LEFT_ALIGNMENT); borderSizeScrollPane.setPreferredSize(new Dimension(80,40)); borderSizeScrollPane.setMaximumSize(new Dimension(80,100)); dimPanel.add(borderSizeScrollPane); dimPanel.add(Box.createHorizontalStrut(10)); dimPanel.add(Box.createVerticalStrut(10)); /* JLabel borderColorLabel = new JLabel("Color:", SwingConstants.LEFT); borderPanel.add(borderColorLabel); BorderColorList = new JList(BorderColors); BorderColorList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); JScrollPane borderColorScrollPane = new JScrollPane(BorderColorList); borderColorScrollPane.setAlignmentX(LEFT_ALIGNMENT); borderColorScrollPane.setPreferredSize(new Dimension(80,40)); borderPanel.add(borderColorScrollPane); controlsPanel.add(borderPanel); */ JPanel buttonPanel= new JPanel(); buttonPanel.setBorder(new SoftBevelBorder(BevelBorder.LOWERED)); JButton applyButton = new JButton("Apply"); applyButton.setActionCommand("apply"); applyButton.addActionListener(this); JButton saveButton = new JButton("Accept"); saveButton.setActionCommand("save"); saveButton.addActionListener(this); JButton cancelButton = new JButton("Cancel"); cancelButton.setActionCommand("cancel"); cancelButton.addActionListener(this); buttonPanel.add(applyButton); buttonPanel.add(saveButton); buttonPanel.add(cancelButton); contentPane.add(centerPanel); contentPane.add(controlsPanel); contentPane.add(buttonPanel); } void previewSelectedImage() { ListSelectionModel sm = imagesJList.getSelectionModel(); if(!sm.isSelectionEmpty()) { String theImage = imageList[sm.getMinSelectionIndex()]; try { // Clear the preview area previewPane.setText(""); StringBuffer attrString = new StringBuffer(); if(!imageHeight.getText().equals("")) { attrString.append(" HEIGHT=\"" + imageHeight.getText() + '"'); } if(!imageWidth.getText().equals("")) { attrString.append(" WIDTH=\"" + imageWidth.getText() + '"'); } if(!imageAltText.getText().equals("")) { attrString.append(" ALT=\"" + imageAltText.getText() + '"'); } if(!wrapJList.getSelectionModel().isSelectionEmpty()) { String theWrap = WRAPS[wrapJList.getSelectionModel().getMinSelectionIndex()]; if(!theWrap.equals("none")) { attrString.append(" ALIGN=\"" + theWrap + '"'); } } /* if(!BorderList.getSelectionModel().isSelectionEmpty()) { String theBorder = Borders[BorderList.getSelectionModel().getMinSelectionIndex()]; if(!theBorder.equals("none")) { */ String borderSize = null; if(!borderSizeJList.getSelectionModel().isSelectionEmpty()) { borderSize = BORDERSIZES[borderSizeJList.getSelectionModel().getMinSelectionIndex()]; if(!borderSize.equals("none")) { attrString.append(" BORDER=" + borderSize); } } else { borderSize = BORDERSIZES[0]; } /* if(!BorderColorList.getSelectionModel().isSelectionEmpty()) { borderColor = BorderColors[BorderColorList.getSelectionModel().getMinSelectionIndex()]; } else { borderColor = "gray"; } attrString.append(" STYLE=\"border: " + borderColor + " " + borderSize + "px " + theBorder + "\""); } } */ previewImage = "<IMG SRC=" + imageDir + "/" + theImage + " " + attrString.toString() + ">"; imageHtmlKit.insertHTML(imageHtmlDoc, 0, previewImage, 0, 0, HTML.Tag.IMG); repaint(); } catch(Exception ex) { System.err.println("Exception previewing image"); } } } boolean validateControls() { boolean result = true; if(!imageWidth.getText().equals("")) { try { Integer.parseInt(imageWidth.getText()); } catch (NumberFormatException e) { result = false; SimpleInfoDialog.show(getOwner(), "Error", true, "Image Width is not an integer", SimpleInfoDialog.ERROR); imageWidth.requestFocus(); } } if( result && !imageHeight.getText().equals("")) { try { Integer.parseInt(imageHeight.getText()); } catch (NumberFormatException e) { result = false; SimpleInfoDialog.show(getOwner(), "Error", true, "Image Height is not an integer", SimpleInfoDialog.ERROR); imageHeight.requestFocus(); } } return result; } public String getSelectedImage() { return selectedImage; } }