From cc5017b61565f997686b2029164f296d1ee23e33 Mon Sep 17 00:00:00 2001 From: "Vassiliy.Kudryashov" Date: Mon, 9 Feb 2015 14:57:10 +0300 Subject: [PATCH] Debugger: Image/Icon viewer based on standard image viewer Compilation fix --- .../intellij/images/editor/ImageEditor.java | 5 - .../images/editor/ImageZoomModel.java | 34 ++++++ .../actionSystem/ImageEditorActionUtil.java | 31 ++--- .../editor/actions/ActualSizeAction.java | 11 +- .../editor/actions/ToggleGridAction.java | 11 +- .../images/editor/actions/ZoomInAction.java | 11 +- .../images/editor/actions/ZoomOutAction.java | 11 +- .../images/editor/impl/ImageEditorImpl.java | 63 +--------- .../editor/impl/ImageEditorManagerImpl.java | 17 +++ .../images/editor/impl/ImageEditorUI.java | 112 +++++++++++++++--- .../thumbnail/impl/ThumbnailViewImpl.java | 18 ++- .../images/ui/ImageComponentDecorator.java | 7 ++ .../settings/ImageObjectRenderer.java | 31 ++--- .../intellij/ui/ShowColorPickerAction.java | 12 ++ .../xdebugger/impl/ui/DebuggerUIUtil.java | 2 +- 15 files changed, 237 insertions(+), 139 deletions(-) diff --git a/images/src/org/intellij/images/editor/ImageEditor.java b/images/src/org/intellij/images/editor/ImageEditor.java index a888961b8af0..1aa422f3bba5 100644 --- a/images/src/org/intellij/images/editor/ImageEditor.java +++ b/images/src/org/intellij/images/editor/ImageEditor.java @@ -59,9 +59,4 @@ public interface ImageEditor extends Disposable, VirtualFileListener, ImageCompo */ boolean isDisposed(); - ImageZoomModel getZoomModel(); - - void setGridVisible(boolean visible); - - boolean isGridVisible(); } diff --git a/images/src/org/intellij/images/editor/ImageZoomModel.java b/images/src/org/intellij/images/editor/ImageZoomModel.java index a8902fd9aa21..12216b5d0b04 100644 --- a/images/src/org/intellij/images/editor/ImageZoomModel.java +++ b/images/src/org/intellij/images/editor/ImageZoomModel.java @@ -38,4 +38,38 @@ public interface ImageZoomModel { boolean canZoomIn(); boolean isZoomLevelChanged(); + + ImageZoomModel STUB = new ImageZoomModel() { + @Override + public double getZoomFactor() { + return 1; + } + + @Override + public void setZoomFactor(double zoomFactor) { + } + + @Override + public void zoomOut() { + } + + @Override + public void zoomIn() { + } + + @Override + public boolean canZoomOut() { + return false; + } + + @Override + public boolean canZoomIn() { + return false; + } + + @Override + public boolean isZoomLevelChanged() { + return false; + } + }; } diff --git a/images/src/org/intellij/images/editor/actionSystem/ImageEditorActionUtil.java b/images/src/org/intellij/images/editor/actionSystem/ImageEditorActionUtil.java index 1f6e6f8e2a40..4379abfad418 100644 --- a/images/src/org/intellij/images/editor/actionSystem/ImageEditorActionUtil.java +++ b/images/src/org/intellij/images/editor/actionSystem/ImageEditorActionUtil.java @@ -17,11 +17,9 @@ package org.intellij.images.editor.actionSystem; import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.actionSystem.DataContext; -import com.intellij.openapi.actionSystem.PlatformDataKeys; import com.intellij.openapi.actionSystem.Presentation; -import com.intellij.openapi.fileEditor.FileEditor; import org.intellij.images.editor.ImageEditor; -import org.intellij.images.editor.ImageFileEditor; +import org.intellij.images.ui.ImageComponentDecorator; /** * Editor actions utility. @@ -38,22 +36,17 @@ public final class ImageEditorActionUtil { * @param e Action event * @return Current {@link ImageEditor} or null */ - public static ImageEditor getValidEditor(AnActionEvent e) { - ImageEditor editor = getEditor(e); - if (editor != null && editor.isValid()) { - return editor; - } - return null; - } + //public static ImageEditor getValidEditor(AnActionEvent e) { + // ImageEditor editor = getEditor(e); + // if (editor != null && editor.isValid()) { + // return editor; + // } + // return null; + //} - public static ImageEditor getEditor(AnActionEvent e) { + public static ImageComponentDecorator getImageComponentDecorator(AnActionEvent e) { DataContext dataContext = e.getDataContext(); - FileEditor editor = PlatformDataKeys.FILE_EDITOR.getData(dataContext); - if (editor instanceof ImageFileEditor) { - ImageFileEditor fileEditor = (ImageFileEditor) editor; - return fileEditor.getImageEditor(); - } - return null; + return ImageComponentDecorator.DATA_KEY.getData(dataContext); } /** @@ -63,9 +56,9 @@ public final class ImageEditorActionUtil { * @return Enabled value */ public static boolean setEnabled(AnActionEvent e) { - ImageEditor editor = getValidEditor(e); + ImageComponentDecorator decorator = getImageComponentDecorator(e); Presentation presentation = e.getPresentation(); - presentation.setEnabled(editor != null); + presentation.setEnabled(decorator != null); return presentation.isEnabled(); } } diff --git a/images/src/org/intellij/images/editor/actions/ActualSizeAction.java b/images/src/org/intellij/images/editor/actions/ActualSizeAction.java index 60ae407f8374..9379e86e97b4 100644 --- a/images/src/org/intellij/images/editor/actions/ActualSizeAction.java +++ b/images/src/org/intellij/images/editor/actions/ActualSizeAction.java @@ -21,6 +21,7 @@ import com.intellij.openapi.project.DumbAware; import org.intellij.images.editor.ImageEditor; import org.intellij.images.editor.ImageZoomModel; import org.intellij.images.editor.actionSystem.ImageEditorActionUtil; +import org.intellij.images.ui.ImageComponentDecorator; /** * Resize image to actual size. @@ -31,9 +32,9 @@ import org.intellij.images.editor.actionSystem.ImageEditorActionUtil; */ public final class ActualSizeAction extends AnAction implements DumbAware { public void actionPerformed(AnActionEvent e) { - ImageEditor editor = ImageEditorActionUtil.getValidEditor(e); - if (editor != null) { - ImageZoomModel zoomModel = editor.getZoomModel(); + ImageComponentDecorator decorator = ImageEditorActionUtil.getImageComponentDecorator(e); + if (decorator != null) { + ImageZoomModel zoomModel = decorator.getZoomModel(); zoomModel.setZoomFactor(1.0d); } } @@ -41,8 +42,8 @@ public final class ActualSizeAction extends AnAction implements DumbAware { public void update(AnActionEvent e) { super.update(e); if (ImageEditorActionUtil.setEnabled(e)) { - ImageEditor editor = ImageEditorActionUtil.getValidEditor(e); - ImageZoomModel zoomModel = editor.getZoomModel(); + ImageComponentDecorator decorator = ImageEditorActionUtil.getImageComponentDecorator(e); + ImageZoomModel zoomModel = decorator.getZoomModel(); e.getPresentation().setEnabled(zoomModel.getZoomFactor() != 1.0d); } } diff --git a/images/src/org/intellij/images/editor/actions/ToggleGridAction.java b/images/src/org/intellij/images/editor/actions/ToggleGridAction.java index 4cd74f8521c3..87d0d284c011 100644 --- a/images/src/org/intellij/images/editor/actions/ToggleGridAction.java +++ b/images/src/org/intellij/images/editor/actions/ToggleGridAction.java @@ -20,6 +20,7 @@ import com.intellij.openapi.actionSystem.ToggleAction; import com.intellij.openapi.project.DumbAware; import org.intellij.images.editor.ImageEditor; import org.intellij.images.editor.actionSystem.ImageEditorActionUtil; +import org.intellij.images.ui.ImageComponentDecorator; /** * Toggle grid lines over image. @@ -29,14 +30,14 @@ import org.intellij.images.editor.actionSystem.ImageEditorActionUtil; */ public final class ToggleGridAction extends ToggleAction implements DumbAware { public boolean isSelected(AnActionEvent e) { - ImageEditor editor = ImageEditorActionUtil.getValidEditor(e); - return editor != null && editor.isGridVisible(); + ImageComponentDecorator decorator = ImageEditorActionUtil.getImageComponentDecorator(e); + return decorator != null && decorator.isGridVisible(); } public void setSelected(AnActionEvent e, boolean state) { - ImageEditor editor = ImageEditorActionUtil.getValidEditor(e); - if (editor != null) { - editor.setGridVisible(state); + ImageComponentDecorator decorator = ImageEditorActionUtil.getImageComponentDecorator(e); + if (decorator != null) { + decorator.setGridVisible(state); } } diff --git a/images/src/org/intellij/images/editor/actions/ZoomInAction.java b/images/src/org/intellij/images/editor/actions/ZoomInAction.java index 7461b39ec360..b48702119da3 100644 --- a/images/src/org/intellij/images/editor/actions/ZoomInAction.java +++ b/images/src/org/intellij/images/editor/actions/ZoomInAction.java @@ -21,6 +21,7 @@ import com.intellij.openapi.project.DumbAware; import org.intellij.images.editor.ImageEditor; import org.intellij.images.editor.ImageZoomModel; import org.intellij.images.editor.actionSystem.ImageEditorActionUtil; +import org.intellij.images.ui.ImageComponentDecorator; /** * Zoom in. @@ -30,9 +31,9 @@ import org.intellij.images.editor.actionSystem.ImageEditorActionUtil; */ public final class ZoomInAction extends AnAction implements DumbAware { public void actionPerformed(AnActionEvent e) { - ImageEditor editor = ImageEditorActionUtil.getValidEditor(e); - if (editor != null) { - ImageZoomModel zoomModel = editor.getZoomModel(); + ImageComponentDecorator decorator = ImageEditorActionUtil.getImageComponentDecorator(e); + if (decorator != null) { + ImageZoomModel zoomModel = decorator.getZoomModel(); zoomModel.zoomIn(); } } @@ -40,8 +41,8 @@ public final class ZoomInAction extends AnAction implements DumbAware { public void update(AnActionEvent e) { super.update(e); if (ImageEditorActionUtil.setEnabled(e)) { - ImageEditor editor = ImageEditorActionUtil.getValidEditor(e); - ImageZoomModel zoomModel = editor.getZoomModel(); + ImageComponentDecorator decorator = ImageEditorActionUtil.getImageComponentDecorator(e); + ImageZoomModel zoomModel = decorator.getZoomModel(); e.getPresentation().setEnabled(zoomModel.canZoomIn()); } } diff --git a/images/src/org/intellij/images/editor/actions/ZoomOutAction.java b/images/src/org/intellij/images/editor/actions/ZoomOutAction.java index 3f7e709e7999..0873e397f584 100644 --- a/images/src/org/intellij/images/editor/actions/ZoomOutAction.java +++ b/images/src/org/intellij/images/editor/actions/ZoomOutAction.java @@ -21,6 +21,7 @@ import com.intellij.openapi.project.DumbAware; import org.intellij.images.editor.ImageEditor; import org.intellij.images.editor.ImageZoomModel; import org.intellij.images.editor.actionSystem.ImageEditorActionUtil; +import org.intellij.images.ui.ImageComponentDecorator; /** * Zoom out. @@ -30,9 +31,9 @@ import org.intellij.images.editor.actionSystem.ImageEditorActionUtil; */ public final class ZoomOutAction extends AnAction implements DumbAware { public void actionPerformed(AnActionEvent e) { - ImageEditor editor = ImageEditorActionUtil.getValidEditor(e); - if (editor != null) { - ImageZoomModel zoomModel = editor.getZoomModel(); + ImageComponentDecorator decorator = ImageEditorActionUtil.getImageComponentDecorator(e); + if (decorator != null) { + ImageZoomModel zoomModel = decorator.getZoomModel(); zoomModel.zoomOut(); } } @@ -40,8 +41,8 @@ public final class ZoomOutAction extends AnAction implements DumbAware { public void update(AnActionEvent e) { super.update(e); if (ImageEditorActionUtil.setEnabled(e)) { - ImageEditor editor = ImageEditorActionUtil.getValidEditor(e); - ImageZoomModel zoomModel = editor.getZoomModel(); + ImageComponentDecorator decorator = ImageEditorActionUtil.getImageComponentDecorator(e); + ImageZoomModel zoomModel = decorator.getZoomModel(); e.getPresentation().setEnabled(zoomModel.canZoomOut()); } } diff --git a/images/src/org/intellij/images/editor/impl/ImageEditorImpl.java b/images/src/org/intellij/images/editor/impl/ImageEditorImpl.java index 581d7bb9b10e..8c23b10b0c6e 100644 --- a/images/src/org/intellij/images/editor/impl/ImageEditorImpl.java +++ b/images/src/org/intellij/images/editor/impl/ImageEditorImpl.java @@ -22,17 +22,11 @@ import org.intellij.images.editor.ImageDocument; import org.intellij.images.editor.ImageEditor; import org.intellij.images.editor.ImageZoomModel; import org.intellij.images.fileTypes.ImageFileTypeManager; -import org.intellij.images.options.*; import org.intellij.images.thumbnail.actionSystem.ThumbnailViewActions; -import org.intellij.images.ui.ImageComponent; import org.intellij.images.vfs.IfsUtil; import org.jetbrains.annotations.NotNull; import javax.swing.*; -import java.awt.*; -import java.awt.image.BufferedImage; -import java.beans.PropertyChangeEvent; -import java.beans.PropertyChangeListener; /** * Image viewer implementation. @@ -40,7 +34,6 @@ import java.beans.PropertyChangeListener; * @author Alexey Efimov */ final class ImageEditorImpl extends VirtualFileAdapter implements ImageEditor { - private final PropertyChangeListener optionsChangeListener = new OptionsChangeListener(); private final Project project; private final VirtualFile file; private final ImageEditorUI editorUI; @@ -50,10 +43,7 @@ final class ImageEditorImpl extends VirtualFileAdapter implements ImageEditor { this.project = project; this.file = file; - // Options - Options options = OptionsManager.getInstance().getOptions(); - editorUI = new ImageEditorUI(this, options.getEditorOptions()); - options.addPropertyChangeListener(optionsChangeListener); + editorUI = new ImageEditorUI(this); VirtualFileManager.getInstance().addVirtualFileListener(this); @@ -61,34 +51,12 @@ final class ImageEditorImpl extends VirtualFileAdapter implements ImageEditor { } private void setValue(VirtualFile file) { - ImageDocument document = editorUI.getImageComponent().getDocument(); try { - BufferedImage previousImage = document.getValue(); - BufferedImage image = IfsUtil.getImage(file); - document.setValue(image); - document.setFormat(IfsUtil.getFormat(file)); - ImageZoomModel zoomModel = getZoomModel(); - if (image != null && (previousImage == null || !zoomModel.isZoomLevelChanged())) { - // Set smart zooming behaviour on open - Options options = OptionsManager.getInstance().getOptions(); - ZoomOptions zoomOptions = options.getEditorOptions().getZoomOptions(); - // Open as actual size - zoomModel.setZoomFactor(1.0d); - - if (zoomOptions.isSmartZooming()) { - Dimension prefferedSize = zoomOptions.getPrefferedSize(); - if (prefferedSize.width > image.getWidth() && prefferedSize.height > image.getHeight()) { - // Resize to preffered size - // Calculate zoom factor - - double factor = (prefferedSize.getWidth() / (double) image.getWidth() + prefferedSize.getHeight() / (double) image.getHeight()) / 2.0d; - zoomModel.setZoomFactor(Math.ceil(factor)); - } - } - } - } catch (Exception e) { - // Error loading image file - document.setValue(null); + editorUI.setImage(IfsUtil.getImage(file), IfsUtil.getFormat(file)); + } + catch (Exception e) { + // Error loading image file + editorUI.setImage(null, null); } } @@ -151,8 +119,6 @@ final class ImageEditorImpl extends VirtualFileAdapter implements ImageEditor { } public void dispose() { - Options options = OptionsManager.getInstance().getOptions(); - options.removePropertyChangeListener(optionsChangeListener); editorUI.dispose(); VirtualFileManager.getInstance().removeVirtualFileListener(this); disposed = true; @@ -188,21 +154,4 @@ final class ImageEditorImpl extends VirtualFileAdapter implements ImageEditor { }); } } - - private class OptionsChangeListener implements PropertyChangeListener { - public void propertyChange(PropertyChangeEvent evt) { - Options options = (Options) evt.getSource(); - EditorOptions editorOptions = options.getEditorOptions(); - TransparencyChessboardOptions chessboardOptions = editorOptions.getTransparencyChessboardOptions(); - GridOptions gridOptions = editorOptions.getGridOptions(); - - ImageComponent imageComponent = editorUI.getImageComponent(); - imageComponent.setTransparencyChessboardCellSize(chessboardOptions.getCellSize()); - imageComponent.setTransparencyChessboardWhiteColor(chessboardOptions.getWhiteColor()); - imageComponent.setTransparencyChessboardBlankColor(chessboardOptions.getBlackColor()); - imageComponent.setGridLineZoomFactor(gridOptions.getLineZoomFactor()); - imageComponent.setGridLineSpan(gridOptions.getLineSpan()); - imageComponent.setGridLineColor(gridOptions.getLineColor()); - } - } } diff --git a/images/src/org/intellij/images/editor/impl/ImageEditorManagerImpl.java b/images/src/org/intellij/images/editor/impl/ImageEditorManagerImpl.java index fd7e3c92e932..08103b9c9e6d 100644 --- a/images/src/org/intellij/images/editor/impl/ImageEditorManagerImpl.java +++ b/images/src/org/intellij/images/editor/impl/ImageEditorManagerImpl.java @@ -18,8 +18,11 @@ package org.intellij.images.editor.impl; import com.intellij.openapi.project.Project; import com.intellij.openapi.vfs.VirtualFile; import org.intellij.images.editor.ImageEditor; +import org.intellij.images.options.*; import org.jetbrains.annotations.NotNull; +import java.awt.image.BufferedImage; + /** * Image viewer manager implementation. * @@ -40,6 +43,20 @@ public final class ImageEditorManagerImpl { return new ImageEditorImpl(project, file); } + @NotNull + public static ImageEditorUI createImageEditorUI(BufferedImage image) { + ImageEditorUI ui = new ImageEditorUI(null); + Options options = OptionsManager.getInstance().getOptions(); + EditorOptions editorOptions = options.getEditorOptions(); + GridOptions gridOptions = editorOptions.getGridOptions(); + TransparencyChessboardOptions transparencyChessboardOptions = editorOptions.getTransparencyChessboardOptions(); + ui.getImageComponent().setGridVisible(gridOptions.isShowDefault()); + ui.getImageComponent().setTransparencyChessboardVisible(transparencyChessboardOptions.isShowDefault()); + + ui.setImage(image, null); + return ui; + } + /** * Release editor. Disposing caches and other resources allocated in creation. * diff --git a/images/src/org/intellij/images/editor/impl/ImageEditorUI.java b/images/src/org/intellij/images/editor/impl/ImageEditorUI.java index b14296626eba..fedca0234308 100644 --- a/images/src/org/intellij/images/editor/impl/ImageEditorUI.java +++ b/images/src/org/intellij/images/editor/impl/ImageEditorUI.java @@ -38,6 +38,7 @@ import org.intellij.images.editor.ImageEditor; import org.intellij.images.editor.ImageZoomModel; import org.intellij.images.editor.actionSystem.ImageEditorActions; import org.intellij.images.options.*; +import org.intellij.images.thumbnail.actionSystem.ThumbnailViewActions; import org.intellij.images.ui.ImageComponent; import org.intellij.images.ui.ImageComponentDecorator; import org.jetbrains.annotations.NonNls; @@ -57,6 +58,8 @@ import java.awt.event.MouseWheelEvent; import java.awt.event.MouseWheelListener; import java.awt.image.BufferedImage; import java.awt.image.ColorModel; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; import java.io.IOException; import java.util.Locale; @@ -65,13 +68,13 @@ import java.util.Locale; * * @author Alexey Efimov */ -final class ImageEditorUI extends JPanel implements DataProvider, CopyProvider { +final class ImageEditorUI extends JPanel implements DataProvider, CopyProvider, ImageComponentDecorator { @NonNls private static final String IMAGE_PANEL = "image"; @NonNls private static final String ERROR_PANEL = "error"; - private final ImageEditor editor; + private final @Nullable ImageEditor editor; private final DeleteProvider deleteProvider; private final CopyPasteSupport copyPasteSupport; @@ -82,10 +85,17 @@ final class ImageEditorUI extends JPanel implements DataProvider, CopyProvider { private final JPanel contentPanel; private final JLabel infoLabel; - ImageEditorUI(ImageEditor editor, EditorOptions editorOptions) { + private final PropertyChangeListener optionsChangeListener = new OptionsChangeListener(); + + ImageEditorUI(@Nullable ImageEditor editor) { this.editor = editor; + + Options options = OptionsManager.getInstance().getOptions(); + EditorOptions editorOptions = options.getEditorOptions(); + options.addPropertyChangeListener(optionsChangeListener); + final PsiActionSupportFactory factory = PsiActionSupportFactory.getInstance(); - if (factory != null) { + if (factory != null && editor != null) { copyPasteSupport = factory.createPsiBasedCopyPasteSupport(editor.getProject(), this, new PsiActionSupportFactory.PsiElementSelector() { public PsiElement[] getSelectedElements() { @@ -168,11 +178,11 @@ final class ImageEditorUI extends JPanel implements DataProvider, CopyProvider { ColorModel colorModel = image.getColorModel(); String format = document.getFormat(); if (format == null) { - format = ImagesBundle.message("unknown.format"); + format = editor != null ? ImagesBundle.message("unknown.format") : ""; } else { format = format.toUpperCase(Locale.ENGLISH); } - VirtualFile file = editor.getFile(); + VirtualFile file = editor != null ? editor.getFile() : null; infoLabel.setText( ImagesBundle.message("image.info", image.getWidth(), image.getHeight(), format, @@ -192,16 +202,73 @@ final class ImageEditorUI extends JPanel implements DataProvider, CopyProvider { } void dispose() { + Options options = OptionsManager.getInstance().getOptions(); + options.removePropertyChangeListener(optionsChangeListener); + imageComponent.removeMouseWheelListener(wheelAdapter); imageComponent.getDocument().removeChangeListener(changeListener); removeAll(); } + @Override + public void setTransparencyChessboardVisible(boolean visible) { + imageComponent.setTransparencyChessboardVisible(visible); + } - ImageZoomModel getZoomModel() { + @Override + public boolean isTransparencyChessboardVisible() { + return imageComponent.isTransparencyChessboardVisible(); + } + + @Override + public boolean isEnabledForActionPlace(String place) { + // Disable for thumbnails action + return !ThumbnailViewActions.ACTION_PLACE.equals(place); + } + + + @Override + public void setGridVisible(boolean visible) { + imageComponent.setGridVisible(visible); + } + + @Override + public boolean isGridVisible() { + return imageComponent.isGridVisible(); + } + + public ImageZoomModel getZoomModel() { return zoomModel; } + public void setImage(BufferedImage image, String format) { + ImageDocument document = imageComponent.getDocument(); + BufferedImage previousImage = document.getValue(); + document.setValue(image); + if (image == null) return; + document.setFormat(format); + ImageZoomModel zoomModel = getZoomModel(); + if (previousImage == null || !zoomModel.isZoomLevelChanged()) { + // Set smart zooming behaviour on open + Options options = OptionsManager.getInstance().getOptions(); + ZoomOptions zoomOptions = options.getEditorOptions().getZoomOptions(); + // Open as actual size + zoomModel.setZoomFactor(1.0d); + + if (zoomOptions.isSmartZooming()) { + Dimension prefferedSize = zoomOptions.getPrefferedSize(); + if (prefferedSize.width > image.getWidth() && prefferedSize.height > image.getHeight()) { + // Resize to preffered size + // Calculate zoom factor + + double factor = + (prefferedSize.getWidth() / (double)image.getWidth() + prefferedSize.getHeight() / (double)image.getHeight()) / 2.0d; + zoomModel.setZoomFactor(Math.ceil(factor)); + } + } + } + } + private final class ImageContainerPane extends JBLayeredPane { private final ImageComponent imageComponent; @@ -213,7 +280,7 @@ final class ImageEditorUI extends JPanel implements DataProvider, CopyProvider { @Override public Point magnify(double scale, Point at) { Point locationBefore = imageComponent.getLocation(); - ImageZoomModel model = editor.getZoomModel(); + ImageZoomModel model = editor != null ? editor.getZoomModel() : getZoomModel(); double factor = model.getZoomFactor(); model.setZoomFactor(scale * factor); return new Point(((int)((at.x - Math.max(scale > 1.0 ? locationBefore.x : 0, 0)) * scale)), @@ -383,18 +450,18 @@ final class ImageEditorUI extends JPanel implements DataProvider, CopyProvider { public Object getData(String dataId) { if (CommonDataKeys.PROJECT.is(dataId)) { - return editor.getProject(); + return editor != null ? editor.getProject() : null; } else if (CommonDataKeys.VIRTUAL_FILE.is(dataId)) { - return editor.getFile(); + return editor != null ? editor.getFile() : null; } else if (CommonDataKeys.VIRTUAL_FILE_ARRAY.is(dataId)) { - return new VirtualFile[]{editor.getFile()}; + return editor != null ? new VirtualFile[]{editor.getFile()} : new VirtualFile[]{}; } else if (CommonDataKeys.PSI_FILE.is(dataId)) { return getData(CommonDataKeys.PSI_ELEMENT.getName()); } else if (CommonDataKeys.PSI_ELEMENT.is(dataId)) { - VirtualFile file = editor.getFile(); + VirtualFile file = editor != null ? editor.getFile() : null; return file != null && file.isValid() ? PsiManager.getInstance(editor.getProject()).findFile(file) : null; } else if (LangDataKeys.PSI_ELEMENT_ARRAY.is(dataId)) { - return new PsiElement[]{(PsiElement)getData(CommonDataKeys.PSI_ELEMENT.getName())}; + return editor != null ? new PsiElement[]{(PsiElement)getData(CommonDataKeys.PSI_ELEMENT.getName())} : new PsiElement[]{} ; } else if (PlatformDataKeys.COPY_PROVIDER.is(dataId) && copyPasteSupport != null) { return this; } else if (PlatformDataKeys.CUT_PROVIDER.is(dataId) && copyPasteSupport != null) { @@ -402,7 +469,7 @@ final class ImageEditorUI extends JPanel implements DataProvider, CopyProvider { } else if (PlatformDataKeys.DELETE_ELEMENT_PROVIDER.is(dataId)) { return deleteProvider; } else if (ImageComponentDecorator.DATA_KEY.is(dataId)) { - return editor; + return editor != null ? editor : this; } return null; @@ -450,4 +517,21 @@ final class ImageEditorUI extends JPanel implements DataProvider, CopyProvider { return myImage; } } + + private class OptionsChangeListener implements PropertyChangeListener { + public void propertyChange(PropertyChangeEvent evt) { + Options options = (Options) evt.getSource(); + EditorOptions editorOptions = options.getEditorOptions(); + TransparencyChessboardOptions chessboardOptions = editorOptions.getTransparencyChessboardOptions(); + GridOptions gridOptions = editorOptions.getGridOptions(); + + imageComponent.setTransparencyChessboardCellSize(chessboardOptions.getCellSize()); + imageComponent.setTransparencyChessboardWhiteColor(chessboardOptions.getWhiteColor()); + imageComponent.setTransparencyChessboardBlankColor(chessboardOptions.getBlackColor()); + imageComponent.setGridLineZoomFactor(gridOptions.getLineZoomFactor()); + imageComponent.setGridLineSpan(gridOptions.getLineSpan()); + imageComponent.setGridLineColor(gridOptions.getLineColor()); + } + } + } diff --git a/images/src/org/intellij/images/thumbnail/impl/ThumbnailViewImpl.java b/images/src/org/intellij/images/thumbnail/impl/ThumbnailViewImpl.java index 445c245b12d9..2b04c8822c98 100644 --- a/images/src/org/intellij/images/thumbnail/impl/ThumbnailViewImpl.java +++ b/images/src/org/intellij/images/thumbnail/impl/ThumbnailViewImpl.java @@ -19,11 +19,13 @@ package org.intellij.images.thumbnail.impl; import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.Disposer; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.wm.ToolWindow; import com.intellij.openapi.wm.ToolWindowAnchor; import com.intellij.openapi.wm.ToolWindowManager; import icons.ImagesIcons; +import org.intellij.images.editor.ImageZoomModel; import org.intellij.images.editor.actionSystem.ImageEditorActions; import org.intellij.images.thumbnail.ThumbnailView; import org.intellij.images.vfs.IfsUtil; @@ -160,12 +162,26 @@ final class ThumbnailViewImpl implements ThumbnailView { public void dispose() { // Dispose UI - getUI().dispose(); + Disposer.dispose(getUI()); // Unregister ToolWindow ToolWindowManager windowManager = ToolWindowManager.getInstance(project); windowManager.unregisterToolWindow(TOOLWINDOW_ID); } + @Override + public ImageZoomModel getZoomModel() { + return ImageZoomModel.STUB; + } + + @Override + public void setGridVisible(boolean visible) { + } + + @Override + public boolean isGridVisible() { + return false; + } + private final class LazyScroller implements Runnable { public void run() { SwingUtilities.invokeLater(new Runnable() { diff --git a/images/src/org/intellij/images/ui/ImageComponentDecorator.java b/images/src/org/intellij/images/ui/ImageComponentDecorator.java index da9ef9215b3a..075065cbbca9 100644 --- a/images/src/org/intellij/images/ui/ImageComponentDecorator.java +++ b/images/src/org/intellij/images/ui/ImageComponentDecorator.java @@ -16,6 +16,7 @@ package org.intellij.images.ui; import com.intellij.openapi.actionSystem.DataKey; +import org.intellij.images.editor.ImageZoomModel; /** * Image Component manager. It can toggle backround transparency, grid, etc. @@ -36,4 +37,10 @@ public interface ImageComponentDecorator { * @return true is decorator is enabled */ boolean isEnabledForActionPlace(String place); + + ImageZoomModel getZoomModel(); + + void setGridVisible(boolean visible); + + boolean isGridVisible(); } diff --git a/java/debugger/impl/src/com/intellij/debugger/settings/ImageObjectRenderer.java b/java/debugger/impl/src/com/intellij/debugger/settings/ImageObjectRenderer.java index 96f7fbe086a2..6372092dc2e9 100644 --- a/java/debugger/impl/src/com/intellij/debugger/settings/ImageObjectRenderer.java +++ b/java/debugger/impl/src/com/intellij/debugger/settings/ImageObjectRenderer.java @@ -25,13 +25,9 @@ import com.intellij.debugger.ui.tree.ValueDescriptor; import com.intellij.debugger.ui.tree.render.CompoundReferenceRenderer; import com.intellij.debugger.ui.tree.render.DescriptorLabelListener; import com.intellij.rt.debugger.ImageSerializer; -import com.intellij.ui.Gray; -import com.intellij.ui.JBColor; -import com.intellij.ui.components.JBLabel; -import com.intellij.ui.components.JBScrollPane; -import com.intellij.util.ui.UIUtil; import com.intellij.xdebugger.frame.XFullValueEvaluator; import com.sun.jdi.*; +import org.intellij.images.editor.impl.ImageEditorManagerImpl; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -71,24 +67,15 @@ class ImageObjectRenderer extends CompoundReferenceRenderer implements FullValue } static JComponent createIconViewer(Icon icon) { - return new JBScrollPane(new JBLabel(icon){ - private BufferedImage myBackgroundImage = UIUtil.createImage(16, 16, BufferedImage.TYPE_INT_ARGB); - { - Graphics2D g = myBackgroundImage.createGraphics(); - g.setColor(new JBColor(Gray._255, Gray._135)); - g.fillRect(0, 0, 17, 17); - g.setColor(new JBColor(Gray._191, Gray._83)); - g.fillRect(0, 0, 8, 8); - g.fillRect(8, 8, 8, 8); - } - @Override - public void paint(Graphics g) { - ((Graphics2D)g).setPaint(new TexturePaint(myBackgroundImage, new Rectangle(0, 0, 16, 16))); - g.fillRect(0, 0, getWidth()+1, getHeight() + 1); - super.paint(g); - } - }); + final int w = icon.getIconWidth(); + final int h = icon.getIconHeight(); + final BufferedImage image = GraphicsEnvironment.getLocalGraphicsEnvironment() + .getDefaultScreenDevice().getDefaultConfiguration().createCompatibleImage(w, h, Transparency.TRANSLUCENT); + final Graphics2D g = image.createGraphics(); + icon.paintIcon(null, g, 0, 0); + g.dispose(); + return ImageEditorManagerImpl.createImageEditorUI(image); } @Nullable diff --git a/platform/platform-impl/src/com/intellij/ui/ShowColorPickerAction.java b/platform/platform-impl/src/com/intellij/ui/ShowColorPickerAction.java index 5327c84c3c8d..74af71c52d54 100644 --- a/platform/platform-impl/src/com/intellij/ui/ShowColorPickerAction.java +++ b/platform/platform-impl/src/com/intellij/ui/ShowColorPickerAction.java @@ -18,11 +18,13 @@ package com.intellij.ui; import com.intellij.openapi.actionSystem.AnAction; import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.actionSystem.CommonDataKeys; +import com.intellij.openapi.actionSystem.PlatformDataKeys; import com.intellij.openapi.project.Project; import com.intellij.openapi.wm.IdeFrame; import com.intellij.openapi.wm.WindowManager; import javax.swing.*; +import java.awt.*; import java.util.List; /** @@ -41,6 +43,16 @@ public class ShowColorPickerAction extends AnAction { } } + @Override + public void update(AnActionEvent e) { + Component component = PlatformDataKeys.CONTEXT_COMPONENT.getData(e.getDataContext()); + if (component == null || !(SwingUtilities.getWindowAncestor(component) instanceof Frame)) { + e.getPresentation().setEnabledAndVisible(false); + return; + } + e.getPresentation().setEnabledAndVisible(true); + } + private static JComponent rootComponent(Project project) { if (project != null) { IdeFrame frame = WindowManager.getInstance().getIdeFrame(project); diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/DebuggerUIUtil.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/DebuggerUIUtil.java index 9baa5a85bda4..6758d5e9b356 100644 --- a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/DebuggerUIUtil.java +++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/DebuggerUIUtil.java @@ -127,7 +127,7 @@ public class DebuggerUIUtil { JComponent component, @Nullable final FullValueEvaluationCallbackImpl callback) { ComponentPopupBuilder builder = JBPopupFactory.getInstance().createComponentPopupBuilder(component, null); - builder.setResizable(true) + builder.setResizable(true).setAlpha(1) .setMovable(true) .setDimensionServiceKey(project, FULL_VALUE_POPUP_DIMENSION_KEY, false) .setRequestFocus(false);