Merge remote-tracking branch 'origin/master'

This commit is contained in:
Egor.Ushakov
2015-02-09 15:02:40 +03:00
15 changed files with 237 additions and 139 deletions
@@ -59,9 +59,4 @@ public interface ImageEditor extends Disposable, VirtualFileListener, ImageCompo
*/
boolean isDisposed();
ImageZoomModel getZoomModel();
void setGridVisible(boolean visible);
boolean isGridVisible();
}
@@ -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;
}
};
}
@@ -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 <code>null</code>
*/
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();
}
}
@@ -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);
}
}
@@ -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);
}
}
@@ -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());
}
}
@@ -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());
}
}
@@ -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 <a href="mailto:aefimov.box@gmail.com">Alexey Efimov</a>
*/
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());
}
}
}
@@ -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.
*
@@ -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 <a href="mailto:aefimov.box@gmail.com">Alexey Efimov</a>
*/
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());
}
}
}
@@ -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() {
@@ -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 <code>true</code> is decorator is enabled
*/
boolean isEnabledForActionPlace(String place);
ImageZoomModel getZoomModel();
void setGridVisible(boolean visible);
boolean isGridVisible();
}
@@ -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
@@ -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);
@@ -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);