# HG changeset patch # User Matthias Bläsing # Date 1342360828 -7200 # Branch mb-patches2 # Node ID df551b887b00a388e689bea7aa6062a63dc2495a # Parent 12c2e22dd60244d486e6c1406dd730ac2487abfb Implement feature "Open as Image" diff --git a/db.dataview/nbproject/project.xml b/db.dataview/nbproject/project.xml --- a/db.dataview/nbproject/project.xml +++ b/db.dataview/nbproject/project.xml @@ -49,6 +49,30 @@ + org.openide.filesystems + + + + 7.63 + + + + org.openide.loaders + + + + 7.38 + + + + org.openide.nodes + + + + 7.29 + + + org.openide.text diff --git a/db.dataview/src/org/netbeans/modules/db/dataview/table/celleditor/BlobFieldTableCellEditor.java b/db.dataview/src/org/netbeans/modules/db/dataview/table/celleditor/BlobFieldTableCellEditor.java --- a/db.dataview/src/org/netbeans/modules/db/dataview/table/celleditor/BlobFieldTableCellEditor.java +++ b/db.dataview/src/org/netbeans/modules/db/dataview/table/celleditor/BlobFieldTableCellEditor.java @@ -50,14 +50,24 @@ import java.sql.Blob; import java.sql.SQLException; import java.util.EventObject; +import java.util.Iterator; import java.util.logging.Level; import java.util.logging.Logger; +import javax.imageio.ImageIO; +import javax.imageio.ImageReader; +import javax.imageio.stream.ImageInputStream; import javax.swing.*; import javax.swing.table.TableCellEditor; import org.netbeans.api.progress.ProgressUtils; import org.netbeans.modules.db.dataview.util.FileBackedBlob; import org.openide.DialogDisplayer; import org.openide.NotifyDescriptor; +import org.openide.cookies.OpenCookie; +import org.openide.filesystems.FileObject; +import org.openide.filesystems.FileSystem; +import org.openide.filesystems.FileUtil; +import org.openide.loaders.DataObject; +import org.openide.util.Exceptions; import org.openide.util.NbBundle; public class BlobFieldTableCellEditor extends AbstractCellEditor @@ -72,6 +82,7 @@ protected JPopupMenu popup; protected JTable table; protected JMenuItem saveContentMenuItem; + protected JMenuItem miOpenImageMenuItem; @SuppressWarnings("LeakingThisInConstructor") public BlobFieldTableCellEditor() { @@ -98,6 +109,19 @@ }); saveContentMenuItem = miLobSaveAction; popup.add(miLobSaveAction); + + final JMenuItem miOpenImageAction = new JMenuItem("Open as Image"); + miOpenImageAction.addActionListener(new ActionListener() { + + @Override + public void actionPerformed(ActionEvent e) { + openAsImage(currentValue); + fireEditingCanceled(); + } + }); + miOpenImageMenuItem = miOpenImageAction; + popup.add(miOpenImageAction); + final JMenuItem miLobLoadAction = new JMenuItem(NbBundle.getMessage(BlobFieldTableCellEditor.class, "loadLob.title")); miLobLoadAction.addActionListener(new ActionListener() { @@ -136,6 +160,7 @@ currentValue = (java.sql.Blob) value; if (currentValue != null) { saveContentMenuItem.setEnabled(true); + miOpenImageMenuItem.setEnabled(true); try { long size = currentValue.length(); StringBuilder stringValue = new StringBuilder(); @@ -154,6 +179,7 @@ } } else { saveContentMenuItem.setEnabled(false); + miOpenImageMenuItem.setEnabled(false); button.setText(""); } this.table = table; @@ -294,4 +320,53 @@ dd.notifyLater(nd); } + + private void openAsImage(Blob b) { + if (b == null) { + return; + } + try { + ImageInputStream iis = ImageIO.createImageInputStream(b.getBinaryStream()); + Iterator irs = ImageIO.getImageReaders(iis); + if (irs.hasNext()) { + FileSystem fs = FileUtil.createMemoryFileSystem(); + FileObject fob = fs.getRoot().createData(Long.toString(System.currentTimeMillis()), irs.next().getFormatName()); + OutputStream os = fob.getOutputStream(); + os.write(b.getBytes(1, (int) b.length())); + os.close(); + DataObject data = DataObject.find(fob); + OpenCookie cookie = data.getLookup().lookup(OpenCookie.class); + if (cookie != null) { + cookie.open(); + return; + } + } + displayErrorOpenImage("openImageErrorNotImage.message"); + } catch (SQLException ex) { + LOG.log(Level.INFO, "SQLException while opening BLOB as file", ex); + displayErrorOpenImage("openImageErrorDB.message"); + } catch (IOException ex) { + LOG.log(Level.INFO, "IOError while opening BLOB as file", ex); + } + + } + + private void displayErrorOpenImage(String messageProperty) { + DialogDisplayer dd = DialogDisplayer.getDefault(); + + String messageMsg = NbBundle.getMessage(BlobFieldTableCellEditor.class, + messageProperty); + String titleMsg = NbBundle.getMessage(BlobFieldTableCellEditor.class, + "openImageError.title"); + + NotifyDescriptor nd = new NotifyDescriptor( + messageMsg, + titleMsg, + NotifyDescriptor.OK_CANCEL_OPTION, + NotifyDescriptor.WARNING_MESSAGE, + new Object[]{NotifyDescriptor.CANCEL_OPTION}, + NotifyDescriptor.CANCEL_OPTION); + + dd.notifyLater(nd); + } } \ No newline at end of file diff --git a/db.dataview/src/org/netbeans/modules/db/dataview/table/celleditor/Bundle.properties b/db.dataview/src/org/netbeans/modules/db/dataview/table/celleditor/Bundle.properties --- a/db.dataview/src/org/netbeans/modules/db/dataview/table/celleditor/Bundle.properties +++ b/db.dataview/src/org/netbeans/modules/db/dataview/table/celleditor/Bundle.properties @@ -56,4 +56,7 @@ clobSaveToFileError.title=Error while saving CLOB to file clobReadFromFileError.title=Error while loading CLOB from file clobSaveToFileError.message={0} while saving CLOB\n\nFile: {1}\n\nMessage:\n{2} -clobReadFromFileError.message={0} while loading CLOB\n\nFile: {1}\n\nMessage:\n{2} \ No newline at end of file +clobReadFromFileError.message={0} while loading CLOB\n\nFile: {1}\n\nMessage:\n{2} +openImageError.title=Error opening BLOB as image +openImageErrorDB.message=Failed to read data from database +openImageErrorNotImage.message=Image format can not be opened \ No newline at end of file