From cc5beecbce623a7f22da94443829799f15826ce4 Mon Sep 17 00:00:00 2001 From: "Gregory.Shrago" Date: Sat, 16 Dec 2023 19:21:38 +0400 Subject: [PATCH] reformat GitOrigin-RevId: 9e3a941071cfbf0f86f36da4be4b7d8c333b3d17 --- .../images/actions/ShowThumbnailsAction.java | 50 +- .../intellij/images/editor/ImageDocument.java | 147 +- .../intellij/images/editor/ImageEditor.java | 77 +- .../images/editor/ImageFileEditor.java | 2 +- .../images/editor/ImageZoomModel.java | 108 +- .../actionSystem/ImageEditorActionUtil.java | 51 +- .../actionSystem/ImageEditorActions.java | 9 +- .../editor/actions/ActualSizeAction.java | 38 +- .../images/editor/actions/ZoomInAction.java | 36 +- .../images/editor/actions/ZoomOutAction.java | 36 +- .../editor/impl/ImageEditorManagerImpl.java | 3 +- .../images/editor/impl/ImageEditorUI.java | 15 +- .../editor/impl/ImageFileEditorProvider.java | 11 +- .../images/options/EditorOptions.java | 18 +- .../images/options/ExternalEditorOptions.java | 12 +- .../intellij/images/options/GridOptions.java | 33 +- .../org/intellij/images/options/Options.java | 38 +- .../images/options/OptionsManager.java | 18 +- .../TransparencyChessboardOptions.java | 33 +- .../intellij/images/options/ZoomOptions.java | 32 +- .../options/impl/EditorOptionsImpl.java | 142 +- .../images/thumbnail/ThumbnailManager.java | 1 - .../actionSystem/ThumbnailViewActionUtil.java | 58 +- .../actionSystem/ThumbnailViewActions.java | 6 +- .../images/thumbnail/actions/EnterAction.java | 77 +- .../actions/FilterByTagActionGroup.java | 146 +- .../actions/FilterByThemeComboBoxAction.java | 78 +- .../thumbnail/actions/ShowBorderAction.java | 38 +- .../actions/ToggleFileNameAction.java | 39 +- .../actions/ToggleFileSizeAction.java | 39 +- .../actions/ToggleTagsPanelAction.java | 52 +- .../thumbnail/actions/UpFolderAction.java | 44 +- .../thumbnail/impl/ThumbnailViewUI.java | 1336 +++++++++-------- .../intellij/images/ui/ImageComponent.java | 711 ++++----- .../intellij/images/ui/ImageComponentUI.java | 203 +-- .../images/ui/ThumbnailComponent.java | 192 +-- .../images/ui/ThumbnailComponentUI.java | 440 +++--- 37 files changed, 2192 insertions(+), 2177 deletions(-) diff --git a/images/src/org/intellij/images/actions/ShowThumbnailsAction.java b/images/src/org/intellij/images/actions/ShowThumbnailsAction.java index 3029dbe5f18e..746815285e37 100644 --- a/images/src/org/intellij/images/actions/ShowThumbnailsAction.java +++ b/images/src/org/intellij/images/actions/ShowThumbnailsAction.java @@ -28,33 +28,33 @@ import org.jetbrains.annotations.NotNull; * @author Alexey Efimov */ public final class ShowThumbnailsAction extends AnAction { - @Override - public void actionPerformed(@NotNull AnActionEvent e) { - Project project = e.getData(CommonDataKeys.PROJECT); - VirtualFile file = e.getData(CommonDataKeys.VIRTUAL_FILE); - if (project != null && file != null && file.isDirectory()) { - ThumbnailManager thumbnailManager = ThumbnailManager.getManager(project); - ThumbnailView thumbnailView = thumbnailManager.getThumbnailView(); - thumbnailView.setRoot(file); - thumbnailView.setVisible(true); - thumbnailView.activate(); - } + @Override + public void actionPerformed(@NotNull AnActionEvent e) { + Project project = e.getData(CommonDataKeys.PROJECT); + VirtualFile file = e.getData(CommonDataKeys.VIRTUAL_FILE); + if (project != null && file != null && file.isDirectory()) { + ThumbnailManager thumbnailManager = ThumbnailManager.getManager(project); + ThumbnailView thumbnailView = thumbnailManager.getThumbnailView(); + thumbnailView.setRoot(file); + thumbnailView.setVisible(true); + thumbnailView.activate(); } + } - @Override - public void update(@NotNull AnActionEvent e) { - VirtualFile file = e.getData(CommonDataKeys.VIRTUAL_FILE); - boolean enabled = file != null && file.isDirectory(); - if (ActionPlaces.isPopupPlace(e.getPlace())) { - e.getPresentation().setEnabledAndVisible(enabled); - } - else { - e.getPresentation().setEnabled(enabled); - } + @Override + public void update(@NotNull AnActionEvent e) { + VirtualFile file = e.getData(CommonDataKeys.VIRTUAL_FILE); + boolean enabled = file != null && file.isDirectory(); + if (ActionPlaces.isPopupPlace(e.getPlace())) { + e.getPresentation().setEnabledAndVisible(enabled); } + else { + e.getPresentation().setEnabled(enabled); + } + } - @Override - public @NotNull ActionUpdateThread getActionUpdateThread() { - return ActionUpdateThread.BGT; - } + @Override + public @NotNull ActionUpdateThread getActionUpdateThread() { + return ActionUpdateThread.BGT; + } } diff --git a/images/src/org/intellij/images/editor/ImageDocument.java b/images/src/org/intellij/images/editor/ImageDocument.java index 7f8a6d78a25b..7c36c731ff36 100644 --- a/images/src/org/intellij/images/editor/ImageDocument.java +++ b/images/src/org/intellij/images/editor/ImageDocument.java @@ -29,90 +29,91 @@ import java.util.function.BiFunction; * @author tav */ public interface ImageDocument { - /** - * A scaled image provider. - */ - interface ScaledImageProvider extends BiFunction {} + /** + * A scaled image provider. + */ + interface ScaledImageProvider extends BiFunction { + } - /** - * A scaled image provider with caching strategy. - */ - interface CachedScaledImageProvider extends ScaledImageProvider { - default void clearCache() {} - } + /** + * A scaled image provider with caching strategy. + */ + interface CachedScaledImageProvider extends ScaledImageProvider { + default void clearCache() { } + } - /** - * Return image for rendering - * - * @return Image renderer - */ - Image getRenderer(); + /** + * Return image for rendering + * + * @return Image renderer + */ + Image getRenderer(); - /** - * Returns an image in the provided scale for rendering - * - * @return Image renderer - */ - Image getRenderer(double scale); + /** + * Returns an image in the provided scale for rendering + * + * @return Image renderer + */ + Image getRenderer(double scale); - /** - * Return current image. - * - * @return Return current buffered image - */ - BufferedImage getValue(); + /** + * Return current image. + * + * @return Return current buffered image + */ + BufferedImage getValue(); - /** - * Returns an image represented in the provided scale. - */ - BufferedImage getValue(double scale); + /** + * Returns an image represented in the provided scale. + */ + BufferedImage getValue(double scale); - /** - * Returns the bounds of the current image. - */ - @Nullable - default Rectangle getBounds() { - return getBounds(1d); - } + /** + * Returns the bounds of the current image. + */ + @Nullable + default Rectangle getBounds() { + return getBounds(1d); + } - /** - * Returns the bounds of the image represented in the provided scale. - */ - @Nullable - default Rectangle getBounds(double scale) { - BufferedImage image = getValue(scale); - return image != null ? new Rectangle(image.getWidth(), image.getHeight()) : null; - } + /** + * Returns the bounds of the image represented in the provided scale. + */ + @Nullable + default Rectangle getBounds(double scale) { + BufferedImage image = getValue(scale); + return image != null ? new Rectangle(image.getWidth(), image.getHeight()) : null; + } - /** - * Set image value - * - * @param image Value - */ - void setValue(BufferedImage image); + /** + * Set image value + * + * @param image Value + */ + void setValue(BufferedImage image); - /** - * Sets the scaled image provider. - * - * @param imageProvider the image provider - */ - void setValue(ScaledImageProvider imageProvider); + /** + * Sets the scaled image provider. + * + * @param imageProvider the image provider + */ + void setValue(ScaledImageProvider imageProvider); - /** - * Return image format. - * - * @return Format name - */ - String getFormat(); + /** + * Return image format. + * + * @return Format name + */ + String getFormat(); - /** - * Set image format. - * - * @param format Format from ImageIO (GIF, PNG, JPEG etc) - */ - void setFormat(String format); + /** + * Set image format. + * + * @param format Format from ImageIO (GIF, PNG, JPEG etc) + */ + void setFormat(String format); - void addChangeListener(ChangeListener listener); + void addChangeListener(ChangeListener listener); - void removeChangeListener(ChangeListener listener); + void removeChangeListener(ChangeListener listener); } diff --git a/images/src/org/intellij/images/editor/ImageEditor.java b/images/src/org/intellij/images/editor/ImageEditor.java index 8bff5d1346cb..e0f02b7558e2 100644 --- a/images/src/org/intellij/images/editor/ImageEditor.java +++ b/images/src/org/intellij/images/editor/ImageEditor.java @@ -1,18 +1,18 @@ /* -* Copyright 2004-2005 Alexey Efimov -* -* 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. -*/ + * Copyright 2004-2005 Alexey Efimov + * + * 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 org.intellij.images.editor; import com.intellij.openapi.Disposable; @@ -30,35 +30,34 @@ import javax.swing.*; */ public interface ImageEditor extends Disposable, ImageComponentDecorator { - @NotNull - VirtualFile getFile(); + @NotNull + VirtualFile getFile(); - Project getProject(); + Project getProject(); - ImageDocument getDocument(); + ImageDocument getDocument(); - JComponent getComponent(); + JComponent getComponent(); - /** - * Return the target of image editing area within entire component, - * returned by {@link #getComponent()}. - * - * @return Content component - */ - JComponent getContentComponent(); + /** + * Return the target of image editing area within entire component, + * returned by {@link #getComponent()}. + * + * @return Content component + */ + JComponent getContentComponent(); - /** - * Return {@code true} if editor show valid image. - * - * @return {@code true} if editor show valid image. - */ - boolean isValid(); - - /** - * Return {@code true} if editor is already disposed. - * - * @return {@code true} if editor is already disposed. - */ - boolean isDisposed(); + /** + * Return {@code true} if editor show valid image. + * + * @return {@code true} if editor show valid image. + */ + boolean isValid(); + /** + * Return {@code true} if editor is already disposed. + * + * @return {@code true} if editor is already disposed. + */ + boolean isDisposed(); } diff --git a/images/src/org/intellij/images/editor/ImageFileEditor.java b/images/src/org/intellij/images/editor/ImageFileEditor.java index 27c3ddbf9730..be2655746f39 100644 --- a/images/src/org/intellij/images/editor/ImageFileEditor.java +++ b/images/src/org/intellij/images/editor/ImageFileEditor.java @@ -18,5 +18,5 @@ package org.intellij.images.editor; import com.intellij.openapi.fileEditor.FileEditor; public interface ImageFileEditor extends FileEditor { - ImageEditor getImageEditor(); + ImageEditor getImageEditor(); } diff --git a/images/src/org/intellij/images/editor/ImageZoomModel.java b/images/src/org/intellij/images/editor/ImageZoomModel.java index b1273bc4696c..da5be36ad940 100644 --- a/images/src/org/intellij/images/editor/ImageZoomModel.java +++ b/images/src/org/intellij/images/editor/ImageZoomModel.java @@ -25,78 +25,78 @@ import org.jetbrains.annotations.Nullable; * @author Alexey Efimov */ public interface ImageZoomModel { - int MACRO_ZOOM_POWER_LIMIT = 5; - int MICRO_ZOOM_POWER_LIMIT = 8; - double MACRO_ZOOM_RATIO = 2.0d; - double MICRO_ZOOM_RATIO = 1.5d; - double MACRO_ZOOM_LIMIT = Math.pow(MACRO_ZOOM_RATIO, MACRO_ZOOM_POWER_LIMIT); - double MICRO_ZOOM_LIMIT = Math.pow(1 / MICRO_ZOOM_RATIO, MICRO_ZOOM_POWER_LIMIT); + int MACRO_ZOOM_POWER_LIMIT = 5; + int MICRO_ZOOM_POWER_LIMIT = 8; + double MACRO_ZOOM_RATIO = 2.0d; + double MICRO_ZOOM_RATIO = 1.5d; + double MACRO_ZOOM_LIMIT = Math.pow(MACRO_ZOOM_RATIO, MACRO_ZOOM_POWER_LIMIT); + double MICRO_ZOOM_LIMIT = Math.pow(1 / MICRO_ZOOM_RATIO, MICRO_ZOOM_POWER_LIMIT); - double getZoomFactor(); + double getZoomFactor(); - void setZoomFactor(double zoomFactor); + void setZoomFactor(double zoomFactor); - void fitZoomToWindow(); + void fitZoomToWindow(); - void zoomOut(); + void zoomOut(); - void zoomIn(); + void zoomIn(); - void setZoomLevelChanged(boolean value); + void setZoomLevelChanged(boolean value); - boolean canZoomOut(); + boolean canZoomOut(); - boolean canZoomIn(); + boolean canZoomIn(); - boolean isZoomLevelChanged(); + boolean isZoomLevelChanged(); - default @Nullable ZoomOptions getCustomZoomOptions() { - return null; + default @Nullable ZoomOptions getCustomZoomOptions() { + return null; + } + + default void setCustomZoomOptions(@Nullable ZoomOptions zoomOptions) { + // Nothing. + } + + ImageZoomModel STUB = new ImageZoomModel() { + @Override + public double getZoomFactor() { + return 1; } - default void setCustomZoomOptions(@Nullable ZoomOptions zoomOptions) { - // Nothing. + @Override + public void setZoomFactor(double zoomFactor) { } - ImageZoomModel STUB = new ImageZoomModel() { - @Override - public double getZoomFactor() { - return 1; - } + @Override + public void zoomOut() { + } - @Override - public void setZoomFactor(double zoomFactor) { - } + @Override + public void zoomIn() { + } - @Override - public void zoomOut() { - } + @Override + public void setZoomLevelChanged(boolean value) { + } - @Override - public void zoomIn() { - } + @Override + public void fitZoomToWindow() { + } - @Override - public void setZoomLevelChanged(boolean value) { - } + @Override + public boolean canZoomOut() { + return false; + } - @Override - public void fitZoomToWindow() { - } + @Override + public boolean canZoomIn() { + return false; + } - @Override - public boolean canZoomOut() { - return false; - } - - @Override - public boolean canZoomIn() { - return false; - } - - @Override - public boolean isZoomLevelChanged() { - 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 988104ef27a7..63be14758f77 100644 --- a/images/src/org/intellij/images/editor/actionSystem/ImageEditorActionUtil.java +++ b/images/src/org/intellij/images/editor/actionSystem/ImageEditorActionUtil.java @@ -18,7 +18,6 @@ package org.intellij.images.editor.actionSystem; import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.actionSystem.DataContext; import com.intellij.openapi.actionSystem.Presentation; -import org.intellij.images.editor.ImageEditor; import org.intellij.images.ui.ImageComponentDecorator; import org.jetbrains.annotations.NotNull; @@ -28,38 +27,24 @@ import org.jetbrains.annotations.NotNull; * @author Alexey Efimov */ public final class ImageEditorActionUtil { - private ImageEditorActionUtil() { - } + private ImageEditorActionUtil() { + } - /** - * Extract current editor from event context. - * - * @param e Action event - * @return Current {@link ImageEditor} or {@code null} - */ - //public static ImageEditor getValidEditor(AnActionEvent e) { - // ImageEditor editor = getEditor(e); - // if (editor != null && editor.isValid()) { - // return editor; - // } - // return null; - //} + public static ImageComponentDecorator getImageComponentDecorator(@NotNull AnActionEvent e) { + DataContext dataContext = e.getDataContext(); + return ImageComponentDecorator.DATA_KEY.getData(dataContext); + } - public static ImageComponentDecorator getImageComponentDecorator(@NotNull AnActionEvent e) { - DataContext dataContext = e.getDataContext(); - return ImageComponentDecorator.DATA_KEY.getData(dataContext); - } - - /** - * Enable or disable current action from event. - * - * @param e Action event - * @return Enabled value - */ - public static boolean setEnabled(@NotNull AnActionEvent e) { - ImageComponentDecorator decorator = getImageComponentDecorator(e); - Presentation presentation = e.getPresentation(); - presentation.setEnabled(decorator != null); - return presentation.isEnabled(); - } + /** + * Enable or disable current action from event. + * + * @param e Action event + * @return Enabled value + */ + public static boolean setEnabled(@NotNull AnActionEvent e) { + ImageComponentDecorator decorator = getImageComponentDecorator(e); + Presentation presentation = e.getPresentation(); + presentation.setEnabled(decorator != null); + return presentation.isEnabled(); + } } diff --git a/images/src/org/intellij/images/editor/actionSystem/ImageEditorActions.java b/images/src/org/intellij/images/editor/actionSystem/ImageEditorActions.java index a9b4668dca91..e1239bc639a7 100644 --- a/images/src/org/intellij/images/editor/actionSystem/ImageEditorActions.java +++ b/images/src/org/intellij/images/editor/actionSystem/ImageEditorActions.java @@ -23,10 +23,7 @@ import org.jetbrains.annotations.NonNls; * @author Alexey Efimov */ public interface ImageEditorActions { - @NonNls - String GROUP_TOOLBAR = "Images.EditorToolbar"; - @NonNls - String GROUP_POPUP = "Images.EditorPopupMenu"; - @NonNls - String ACTION_PLACE = "Images.Editor"; + @NonNls String GROUP_TOOLBAR = "Images.EditorToolbar"; + @NonNls String GROUP_POPUP = "Images.EditorPopupMenu"; + @NonNls String ACTION_PLACE = "Images.Editor"; } diff --git a/images/src/org/intellij/images/editor/actions/ActualSizeAction.java b/images/src/org/intellij/images/editor/actions/ActualSizeAction.java index 6d8b36f532cd..44ba3d34f2c6 100644 --- a/images/src/org/intellij/images/editor/actions/ActualSizeAction.java +++ b/images/src/org/intellij/images/editor/actions/ActualSizeAction.java @@ -33,27 +33,27 @@ import org.jetbrains.annotations.NotNull; * @see ImageZoomModel#setZoomFactor */ public final class ActualSizeAction extends AnAction implements DumbAware { - @Override - public void actionPerformed(@NotNull AnActionEvent e) { - ImageComponentDecorator decorator = ImageEditorActionUtil.getImageComponentDecorator(e); - if (decorator != null) { - ImageZoomModel zoomModel = decorator.getZoomModel(); - zoomModel.setZoomFactor(1.0d); - zoomModel.setZoomLevelChanged(true); - } + @Override + public void actionPerformed(@NotNull AnActionEvent e) { + ImageComponentDecorator decorator = ImageEditorActionUtil.getImageComponentDecorator(e); + if (decorator != null) { + ImageZoomModel zoomModel = decorator.getZoomModel(); + zoomModel.setZoomFactor(1.0d); + zoomModel.setZoomLevelChanged(true); } + } - @Override - public void update(@NotNull AnActionEvent e) { - if (ImageEditorActionUtil.setEnabled(e)) { - ImageComponentDecorator decorator = ImageEditorActionUtil.getImageComponentDecorator(e); - ImageZoomModel zoomModel = decorator.getZoomModel(); - e.getPresentation().setEnabled(zoomModel.getZoomFactor() != 1.0d); - } + @Override + public void update(@NotNull AnActionEvent e) { + if (ImageEditorActionUtil.setEnabled(e)) { + ImageComponentDecorator decorator = ImageEditorActionUtil.getImageComponentDecorator(e); + ImageZoomModel zoomModel = decorator.getZoomModel(); + e.getPresentation().setEnabled(zoomModel.getZoomFactor() != 1.0d); } + } - @Override - public @NotNull ActionUpdateThread getActionUpdateThread() { - return ActionUpdateThread.EDT; - } + @Override + public @NotNull ActionUpdateThread getActionUpdateThread() { + return ActionUpdateThread.EDT; + } } diff --git a/images/src/org/intellij/images/editor/actions/ZoomInAction.java b/images/src/org/intellij/images/editor/actions/ZoomInAction.java index 3af98fe5f19c..984df916780e 100644 --- a/images/src/org/intellij/images/editor/actions/ZoomInAction.java +++ b/images/src/org/intellij/images/editor/actions/ZoomInAction.java @@ -32,26 +32,26 @@ import org.jetbrains.annotations.NotNull; * @see ImageEditor#getZoomModel */ public final class ZoomInAction extends AnAction implements DumbAware { - @Override - public void actionPerformed(@NotNull AnActionEvent e) { - ImageComponentDecorator decorator = ImageEditorActionUtil.getImageComponentDecorator(e); - if (decorator != null) { - ImageZoomModel zoomModel = decorator.getZoomModel(); - zoomModel.zoomIn(); - } + @Override + public void actionPerformed(@NotNull AnActionEvent e) { + ImageComponentDecorator decorator = ImageEditorActionUtil.getImageComponentDecorator(e); + if (decorator != null) { + ImageZoomModel zoomModel = decorator.getZoomModel(); + zoomModel.zoomIn(); } + } - @Override - public void update(@NotNull AnActionEvent e) { - if (ImageEditorActionUtil.setEnabled(e)) { - ImageComponentDecorator decorator = ImageEditorActionUtil.getImageComponentDecorator(e); - ImageZoomModel zoomModel = decorator.getZoomModel(); - e.getPresentation().setEnabled(zoomModel.canZoomIn()); - } + @Override + public void update(@NotNull AnActionEvent e) { + if (ImageEditorActionUtil.setEnabled(e)) { + ImageComponentDecorator decorator = ImageEditorActionUtil.getImageComponentDecorator(e); + ImageZoomModel zoomModel = decorator.getZoomModel(); + e.getPresentation().setEnabled(zoomModel.canZoomIn()); } + } - @Override - public @NotNull ActionUpdateThread getActionUpdateThread() { - return ActionUpdateThread.EDT; - } + @Override + public @NotNull ActionUpdateThread getActionUpdateThread() { + return ActionUpdateThread.EDT; + } } diff --git a/images/src/org/intellij/images/editor/actions/ZoomOutAction.java b/images/src/org/intellij/images/editor/actions/ZoomOutAction.java index 05789b853440..cac2783375c0 100644 --- a/images/src/org/intellij/images/editor/actions/ZoomOutAction.java +++ b/images/src/org/intellij/images/editor/actions/ZoomOutAction.java @@ -32,26 +32,26 @@ import org.jetbrains.annotations.NotNull; * @see ImageEditor#getZoomModel */ public final class ZoomOutAction extends AnAction implements DumbAware { - @Override - public void actionPerformed(@NotNull AnActionEvent e) { - ImageComponentDecorator decorator = ImageEditorActionUtil.getImageComponentDecorator(e); - if (decorator != null) { - ImageZoomModel zoomModel = decorator.getZoomModel(); - zoomModel.zoomOut(); - } + @Override + public void actionPerformed(@NotNull AnActionEvent e) { + ImageComponentDecorator decorator = ImageEditorActionUtil.getImageComponentDecorator(e); + if (decorator != null) { + ImageZoomModel zoomModel = decorator.getZoomModel(); + zoomModel.zoomOut(); } + } - @Override - public void update(@NotNull AnActionEvent e) { - if (ImageEditorActionUtil.setEnabled(e)) { - ImageComponentDecorator decorator = ImageEditorActionUtil.getImageComponentDecorator(e); - ImageZoomModel zoomModel = decorator.getZoomModel(); - e.getPresentation().setEnabled(zoomModel.canZoomOut()); - } + @Override + public void update(@NotNull AnActionEvent e) { + if (ImageEditorActionUtil.setEnabled(e)) { + ImageComponentDecorator decorator = ImageEditorActionUtil.getImageComponentDecorator(e); + ImageZoomModel zoomModel = decorator.getZoomModel(); + e.getPresentation().setEnabled(zoomModel.canZoomOut()); } + } - @Override - public @NotNull ActionUpdateThread getActionUpdateThread() { - return ActionUpdateThread.EDT; - } + @Override + public @NotNull ActionUpdateThread getActionUpdateThread() { + return ActionUpdateThread.EDT; + } } diff --git a/images/src/org/intellij/images/editor/impl/ImageEditorManagerImpl.java b/images/src/org/intellij/images/editor/impl/ImageEditorManagerImpl.java index c333390b9a5a..932291091760 100644 --- a/images/src/org/intellij/images/editor/impl/ImageEditorManagerImpl.java +++ b/images/src/org/intellij/images/editor/impl/ImageEditorManagerImpl.java @@ -31,9 +31,10 @@ public final class ImageEditorManagerImpl { } @NotNull - public static ImageEditorUI createImageEditorUI(BufferedImage image){ + public static ImageEditorUI createImageEditorUI(BufferedImage image) { return createImageEditorUI(image, null); } + @NotNull public static ImageEditorUI createImageEditorUI(BufferedImage image, @Nullable String format) { ImageEditorUI ui = new ImageEditorUI(null); diff --git a/images/src/org/intellij/images/editor/impl/ImageEditorUI.java b/images/src/org/intellij/images/editor/impl/ImageEditorUI.java index ab9955a65cf3..bec77ce68c8a 100644 --- a/images/src/org/intellij/images/editor/impl/ImageEditorUI.java +++ b/images/src/org/intellij/images/editor/impl/ImageEditorUI.java @@ -214,7 +214,8 @@ final class ImageEditorUI extends JPanel implements DataProvider, CopyProvider, String format = document.getFormat(); if (format == null) { format = editor != null ? ImagesBundle.message("unknown.format") : ""; - } else { + } + else { format = StringUtil.toUpperCase(format); } VirtualFile file = editor != null ? editor.getFile() : null; @@ -222,7 +223,8 @@ final class ImageEditorUI extends JPanel implements DataProvider, CopyProvider, ImagesBundle.message("image.info", image.getWidth(), image.getHeight(), format, colorModel.getPixelSize(), file != null ? StringUtil.formatFileSize(file.getLength()) : "")); - } else { + } + else { infoLabel.setText(null); } } @@ -243,6 +245,7 @@ final class ImageEditorUI extends JPanel implements DataProvider, CopyProvider, removeAll(); } + @Override public void setTransparencyChessboardVisible(boolean visible) { imageComponent.setTransparencyChessboardVisible(visible); @@ -585,7 +588,8 @@ final class ImageEditorUI extends JPanel implements DataProvider, CopyProvider, private class FocusRequester extends MouseAdapter { @Override public void mousePressed(@NotNull MouseEvent e) { - IdeFocusManager.getGlobalInstance().doWhenFocusSettlesDown(() -> IdeFocusManager.getGlobalInstance().requestFocus(ImageEditorUI.this, true)); + IdeFocusManager.getGlobalInstance().doWhenFocusSettlesDown( + () -> IdeFocusManager.getGlobalInstance().requestFocus(ImageEditorUI.this, true)); } } @@ -670,7 +674,7 @@ final class ImageEditorUI extends JPanel implements DataProvider, CopyProvider, @Override public DataFlavor[] getTransferDataFlavors() { - return new DataFlavor[] { DataFlavor.imageFlavor }; + return new DataFlavor[]{DataFlavor.imageFlavor}; } @Override @@ -690,7 +694,7 @@ final class ImageEditorUI extends JPanel implements DataProvider, CopyProvider, private class OptionsChangeListener implements PropertyChangeListener { @Override public void propertyChange(PropertyChangeEvent evt) { - Options options = (Options) evt.getSource(); + Options options = (Options)evt.getSource(); EditorOptions editorOptions = options.getEditorOptions(); TransparencyChessboardOptions chessboardOptions = editorOptions.getTransparencyChessboardOptions(); GridOptions gridOptions = editorOptions.getGridOptions(); @@ -703,5 +707,4 @@ final class ImageEditorUI extends JPanel implements DataProvider, CopyProvider, imageComponent.setGridLineColor(gridOptions.getLineColor()); } } - } diff --git a/images/src/org/intellij/images/editor/impl/ImageFileEditorProvider.java b/images/src/org/intellij/images/editor/impl/ImageFileEditorProvider.java index 99b46ba15cf4..3d7ac3ffe5b2 100644 --- a/images/src/org/intellij/images/editor/impl/ImageFileEditorProvider.java +++ b/images/src/org/intellij/images/editor/impl/ImageFileEditorProvider.java @@ -56,16 +56,19 @@ final class ImageFileEditorProvider implements FileEditorProvider, DumbAware { if (IfsUtil.isSVG(file)) { TextEditor editor = (TextEditor)TextEditorProvider.getInstance().createEditor(project, file); if (JBCefApp.isSupported() && RegistryManager.getInstance().is("ide.browser.jcef.svg-viewer.enabled")) { - return new TextEditorWithPreview(editor, new JCefImageViewer(file, "image/svg+xml") , "SvgEditor"); - } else { + return new TextEditorWithPreview(editor, new JCefImageViewer(file, "image/svg+xml"), "SvgEditor"); + } + else { ImageFileEditorImpl viewer = new ImageFileEditorImpl(project, file); editor.getEditor().getDocument().addDocumentListener(new DocumentListener() { final Alarm myAlarm = new Alarm(Alarm.ThreadToUse.POOLED_THREAD, editor); + @Override public void documentChanged(@NotNull DocumentEvent event) { myAlarm.cancelAllRequests(); - myAlarm.addRequest(() -> ((ImageEditorImpl)viewer.getImageEditor()).setValue(new LightVirtualFile("preview.svg", file.getFileType(), event.getDocument().getText())), - 500); + myAlarm.addRequest( + () -> ((ImageEditorImpl)viewer.getImageEditor()) + .setValue(new LightVirtualFile("preview.svg", file.getFileType(), event.getDocument().getText())), 500); } }, editor); return new TextEditorWithPreview(editor, viewer, "SvgEditor"); diff --git a/images/src/org/intellij/images/options/EditorOptions.java b/images/src/org/intellij/images/options/EditorOptions.java index 0e1642e91c12..40813c0e8b17 100644 --- a/images/src/org/intellij/images/options/EditorOptions.java +++ b/images/src/org/intellij/images/options/EditorOptions.java @@ -21,21 +21,21 @@ package org.intellij.images.options; * @author Alexey Efimov */ public interface EditorOptions extends Cloneable { - GridOptions getGridOptions(); + GridOptions getGridOptions(); - TransparencyChessboardOptions getTransparencyChessboardOptions(); + TransparencyChessboardOptions getTransparencyChessboardOptions(); - ZoomOptions getZoomOptions(); + ZoomOptions getZoomOptions(); - void inject(EditorOptions options); + void inject(EditorOptions options); - boolean setOption(String name, Object value); + boolean setOption(String name, Object value); - boolean isFileNameVisible(); + boolean isFileNameVisible(); - void setFileNameVisible(boolean fileNameVisible); + void setFileNameVisible(boolean fileNameVisible); - void setFileSizeVisible(boolean fileSizeVisible); + void setFileSizeVisible(boolean fileSizeVisible); - boolean isFileSizeVisible(); + boolean isFileSizeVisible(); } diff --git a/images/src/org/intellij/images/options/ExternalEditorOptions.java b/images/src/org/intellij/images/options/ExternalEditorOptions.java index 6da9cf98af89..4a90b0b5f37a 100644 --- a/images/src/org/intellij/images/options/ExternalEditorOptions.java +++ b/images/src/org/intellij/images/options/ExternalEditorOptions.java @@ -23,14 +23,12 @@ import org.jetbrains.annotations.NonNls; * @author Alexey Efimov */ public interface ExternalEditorOptions extends Cloneable { - @NonNls - String ATTR_PREFIX = "ExternalEditor."; - @NonNls - String ATTR_EXECUTABLE_PATH = ATTR_PREFIX + "executablePath"; + @NonNls String ATTR_PREFIX = "ExternalEditor."; + @NonNls String ATTR_EXECUTABLE_PATH = ATTR_PREFIX + "executablePath"; - String getExecutablePath(); + String getExecutablePath(); - void inject(ExternalEditorOptions options); + void inject(ExternalEditorOptions options); - boolean setOption(String name, Object value); + boolean setOption(String name, Object value); } diff --git a/images/src/org/intellij/images/options/GridOptions.java b/images/src/org/intellij/images/options/GridOptions.java index a428552be4a2..2f11ed0de855 100644 --- a/images/src/org/intellij/images/options/GridOptions.java +++ b/images/src/org/intellij/images/options/GridOptions.java @@ -26,30 +26,25 @@ import java.awt.*; * @author Alexey Efimov */ public interface GridOptions extends Cloneable { - @NonNls - String ATTR_PREFIX = "Editor.Grid."; - @NonNls - String ATTR_SHOW_DEFAULT = ATTR_PREFIX + "showDefault"; - @NonNls - String ATTR_LINE_ZOOM_FACTOR = ATTR_PREFIX + "lineZoomFactor"; - @NonNls - String ATTR_LINE_SPAN = ATTR_PREFIX + "lineSpan"; - @NonNls - String ATTR_LINE_COLOR = ATTR_PREFIX + "lineColor"; + @NonNls String ATTR_PREFIX = "Editor.Grid."; + @NonNls String ATTR_SHOW_DEFAULT = ATTR_PREFIX + "showDefault"; + @NonNls String ATTR_LINE_ZOOM_FACTOR = ATTR_PREFIX + "lineZoomFactor"; + @NonNls String ATTR_LINE_SPAN = ATTR_PREFIX + "lineSpan"; + @NonNls String ATTR_LINE_COLOR = ATTR_PREFIX + "lineColor"; - int DEFAULT_LINE_ZOOM_FACTOR = 3; - int DEFAULT_LINE_SPAN = 1; - Color DEFAULT_LINE_COLOR = JBColor.DARK_GRAY; + int DEFAULT_LINE_ZOOM_FACTOR = 3; + int DEFAULT_LINE_SPAN = 1; + Color DEFAULT_LINE_COLOR = JBColor.DARK_GRAY; - boolean isShowDefault(); + boolean isShowDefault(); - int getLineZoomFactor(); + int getLineZoomFactor(); - int getLineSpan(); + int getLineSpan(); - Color getLineColor(); + Color getLineColor(); - void inject(GridOptions options); + void inject(GridOptions options); - boolean setOption(String name, Object value); + boolean setOption(String name, Object value); } diff --git a/images/src/org/intellij/images/options/Options.java b/images/src/org/intellij/images/options/Options.java index 2c1c1bdb0082..d1913e4ba6bd 100644 --- a/images/src/org/intellij/images/options/Options.java +++ b/images/src/org/intellij/images/options/Options.java @@ -26,27 +26,27 @@ import java.beans.PropertyChangeListener; * @author Alexey Efimov */ public interface Options extends Cloneable { - @NotNull - EditorOptions getEditorOptions(); + @NotNull + EditorOptions getEditorOptions(); - @NotNull - ExternalEditorOptions getExternalEditorOptions(); + @NotNull + ExternalEditorOptions getExternalEditorOptions(); - /** - * Option injection from other options. - * - * @param options Other options - */ - void inject(@NotNull Options options); + /** + * Option injection from other options. + * + * @param options Other options + */ + void inject(@NotNull Options options); - void addPropertyChangeListener(@NotNull PropertyChangeListener listener, @NotNull Disposable parent); + void addPropertyChangeListener(@NotNull PropertyChangeListener listener, @NotNull Disposable parent); - /** - * Set option by string representation. - * - * @param name Name of option - * @param value Value - * @return {@code true} if option is matched and setted. - */ - boolean setOption(@NotNull String name, Object value); + /** + * Set option by string representation. + * + * @param name Name of option + * @param value Value + * @return {@code true} if option is matched and setted. + */ + boolean setOption(@NotNull String name, Object value); } diff --git a/images/src/org/intellij/images/options/OptionsManager.java b/images/src/org/intellij/images/options/OptionsManager.java index ee273fce246d..6a8234663e69 100644 --- a/images/src/org/intellij/images/options/OptionsManager.java +++ b/images/src/org/intellij/images/options/OptionsManager.java @@ -23,14 +23,14 @@ import com.intellij.openapi.application.ApplicationManager; * @author Alexey Efimov */ public abstract class OptionsManager { - /** - * Return current options. - * - * @return Options - */ - public abstract Options getOptions(); + /** + * Return current options. + * + * @return Options + */ + public abstract Options getOptions(); - public static OptionsManager getInstance() { - return ApplicationManager.getApplication().getService(OptionsManager.class); - } + public static OptionsManager getInstance() { + return ApplicationManager.getApplication().getService(OptionsManager.class); + } } diff --git a/images/src/org/intellij/images/options/TransparencyChessboardOptions.java b/images/src/org/intellij/images/options/TransparencyChessboardOptions.java index d0fb55d61b16..e2d6fd1a29ab 100644 --- a/images/src/org/intellij/images/options/TransparencyChessboardOptions.java +++ b/images/src/org/intellij/images/options/TransparencyChessboardOptions.java @@ -25,30 +25,25 @@ import java.awt.*; * @author Alexey Efimov */ public interface TransparencyChessboardOptions extends Cloneable { - @NonNls - String ATTR_PREFIX = "Editor.TransparencyChessboard."; - @NonNls - String ATTR_SHOW_DEFAULT = ATTR_PREFIX + "showDefault"; - @NonNls - String ATTR_CELL_SIZE = ATTR_PREFIX + "cellSize"; - @NonNls - String ATTR_WHITE_COLOR = ATTR_PREFIX + "whiteColor"; - @NonNls - String ATTR_BLACK_COLOR = ATTR_PREFIX + "blackColor"; + @NonNls String ATTR_PREFIX = "Editor.TransparencyChessboard."; + @NonNls String ATTR_SHOW_DEFAULT = ATTR_PREFIX + "showDefault"; + @NonNls String ATTR_CELL_SIZE = ATTR_PREFIX + "cellSize"; + @NonNls String ATTR_WHITE_COLOR = ATTR_PREFIX + "whiteColor"; + @NonNls String ATTR_BLACK_COLOR = ATTR_PREFIX + "blackColor"; - int DEFAULT_CELL_SIZE = 5; - Color DEFAULT_WHITE_COLOR = Color.WHITE; - Color DEFAULT_BLACK_COLOR = Color.LIGHT_GRAY; + int DEFAULT_CELL_SIZE = 5; + Color DEFAULT_WHITE_COLOR = Color.WHITE; + Color DEFAULT_BLACK_COLOR = Color.LIGHT_GRAY; - boolean isShowDefault(); + boolean isShowDefault(); - int getCellSize(); + int getCellSize(); - Color getWhiteColor(); + Color getWhiteColor(); - Color getBlackColor(); + Color getBlackColor(); - void inject(TransparencyChessboardOptions options); + void inject(TransparencyChessboardOptions options); - boolean setOption(String name, Object value); + boolean setOption(String name, Object value); } diff --git a/images/src/org/intellij/images/options/ZoomOptions.java b/images/src/org/intellij/images/options/ZoomOptions.java index 04b220bc773b..db042499df98 100644 --- a/images/src/org/intellij/images/options/ZoomOptions.java +++ b/images/src/org/intellij/images/options/ZoomOptions.java @@ -26,22 +26,22 @@ import java.awt.*; * @author Alexey Efimov */ public interface ZoomOptions extends Cloneable { - @NonNls - String ATTR_PREFIX = "Editor.Zoom."; - @NonNls - String ATTR_PREFFERED_WIDTH = ATTR_PREFIX + "prefferedWidth"; - @NonNls - String ATTR_PREFFERED_HEIGHT = ATTR_PREFIX + "prefferedHeight"; + @NonNls + String ATTR_PREFIX = "Editor.Zoom."; + @NonNls + String ATTR_PREFFERED_WIDTH = ATTR_PREFIX + "prefferedWidth"; + @NonNls + String ATTR_PREFFERED_HEIGHT = ATTR_PREFIX + "prefferedHeight"; - Dimension DEFAULT_PREFFERED_SIZE = new Dimension(128, 128); + Dimension DEFAULT_PREFFERED_SIZE = new Dimension(128, 128); - default boolean isWheelZooming() { - return Registry.is("ide.images.wheel.zooming", true); - } + default boolean isWheelZooming() { + return Registry.is("ide.images.wheel.zooming", true); + } - default boolean isSmartZooming() { - return isWheelZooming(); - } + default boolean isSmartZooming() { + return isWheelZooming(); + } default Double getSmartZoomFactor(Rectangle imageSize, Dimension viewPort, int inset) { if (imageSize == null) return null; @@ -69,9 +69,9 @@ public interface ZoomOptions extends Cloneable { return 1.0d; } - Dimension getPrefferedSize(); + Dimension getPrefferedSize(); - void inject(ZoomOptions options); + void inject(ZoomOptions options); - boolean setOption(String name, Object value); + boolean setOption(String name, Object value); } diff --git a/images/src/org/intellij/images/options/impl/EditorOptionsImpl.java b/images/src/org/intellij/images/options/impl/EditorOptionsImpl.java index 7deff7fc7fa9..66428807426c 100644 --- a/images/src/org/intellij/images/options/impl/EditorOptionsImpl.java +++ b/images/src/org/intellij/images/options/impl/EditorOptionsImpl.java @@ -32,89 +32,89 @@ import java.beans.PropertyChangeSupport; * @author Alexey Efimov */ final class EditorOptionsImpl implements EditorOptions, JDOMExternalizable { - private final GridOptions gridOptions; - private final TransparencyChessboardOptions transparencyChessboardOptions; - private final ZoomOptions zoomOptions; - private boolean fileNameVisible = true; - private boolean fileSizeVisible = true; + private final GridOptions gridOptions; + private final TransparencyChessboardOptions transparencyChessboardOptions; + private final ZoomOptions zoomOptions; + private boolean fileNameVisible = true; + private boolean fileSizeVisible = true; - EditorOptionsImpl(PropertyChangeSupport propertyChangeSupport) { - gridOptions = new GridOptionsImpl(propertyChangeSupport); - transparencyChessboardOptions = new TransparencyChessboardOptionsImpl(propertyChangeSupport); - zoomOptions = new ZoomOptionsImpl(propertyChangeSupport); - } + EditorOptionsImpl(PropertyChangeSupport propertyChangeSupport) { + gridOptions = new GridOptionsImpl(propertyChangeSupport); + transparencyChessboardOptions = new TransparencyChessboardOptionsImpl(propertyChangeSupport); + zoomOptions = new ZoomOptionsImpl(propertyChangeSupport); + } - @Override - public GridOptions getGridOptions() { - return gridOptions; - } + @Override + public GridOptions getGridOptions() { + return gridOptions; + } - @Override - public TransparencyChessboardOptions getTransparencyChessboardOptions() { - return transparencyChessboardOptions; - } + @Override + public TransparencyChessboardOptions getTransparencyChessboardOptions() { + return transparencyChessboardOptions; + } - @Override - public ZoomOptions getZoomOptions() { - return zoomOptions; - } + @Override + public ZoomOptions getZoomOptions() { + return zoomOptions; + } - @Override - public EditorOptions clone() throws CloneNotSupportedException { - return (EditorOptions)super.clone(); - } + @Override + public EditorOptions clone() throws CloneNotSupportedException { + return (EditorOptions)super.clone(); + } - @Override - public void inject(EditorOptions options) { - gridOptions.inject(options.getGridOptions()); - transparencyChessboardOptions.inject(options.getTransparencyChessboardOptions()); - zoomOptions.inject(options.getZoomOptions()); - } + @Override + public void inject(EditorOptions options) { + gridOptions.inject(options.getGridOptions()); + transparencyChessboardOptions.inject(options.getTransparencyChessboardOptions()); + zoomOptions.inject(options.getZoomOptions()); + } - @Override - public boolean setOption(String name, Object value) { - return gridOptions.setOption(name, value) || - transparencyChessboardOptions.setOption(name, value) || - zoomOptions.setOption(name, value); - } + @Override + public boolean setOption(String name, Object value) { + return gridOptions.setOption(name, value) || + transparencyChessboardOptions.setOption(name, value) || + zoomOptions.setOption(name, value); + } - @Override - public boolean isFileNameVisible() { - return fileNameVisible; - } + @Override + public boolean isFileNameVisible() { + return fileNameVisible; + } - @Override - public void setFileNameVisible(boolean fileNameVisible) { - this.fileNameVisible = fileNameVisible; - } + @Override + public void setFileNameVisible(boolean fileNameVisible) { + this.fileNameVisible = fileNameVisible; + } - @Override - public void setFileSizeVisible(boolean fileSizeVisible) { - this.fileSizeVisible = fileSizeVisible; - } + @Override + public void setFileSizeVisible(boolean fileSizeVisible) { + this.fileSizeVisible = fileSizeVisible; + } - @Override - public boolean isFileSizeVisible() { - return fileSizeVisible; - } + @Override + public boolean isFileSizeVisible() { + return fileSizeVisible; + } - @Override - public void readExternal(Element element) throws InvalidDataException { - ((JDOMExternalizable)transparencyChessboardOptions).readExternal(element); - String fileNameVisibleAttr = element.getAttributeValue("fileNameVisible"); - fileNameVisible = fileNameVisibleAttr == null || Boolean.parseBoolean(fileNameVisibleAttr); - String fileSizeVisibleAttr = element.getAttributeValue("fileSizeVisible"); - fileSizeVisible = fileNameVisibleAttr == null || Boolean.parseBoolean(fileSizeVisibleAttr); - } + @Override + public void readExternal(Element element) throws InvalidDataException { + ((JDOMExternalizable)transparencyChessboardOptions).readExternal(element); + String fileNameVisibleAttr = element.getAttributeValue("fileNameVisible"); + fileNameVisible = fileNameVisibleAttr == null || Boolean.parseBoolean(fileNameVisibleAttr); + String fileSizeVisibleAttr = element.getAttributeValue("fileSizeVisible"); + fileSizeVisible = fileNameVisibleAttr == null || Boolean.parseBoolean(fileSizeVisibleAttr); + } - @Override - public void writeExternal(Element element) throws WriteExternalException { - ((JDOMExternalizable)transparencyChessboardOptions).writeExternal(element); - if (!fileNameVisible) { - element.setAttribute("fileNameVisible", "false"); - } - if (!fileSizeVisible) { - element.setAttribute("fileSizeVisible", "false"); - } + @Override + public void writeExternal(Element element) throws WriteExternalException { + ((JDOMExternalizable)transparencyChessboardOptions).writeExternal(element); + if (!fileNameVisible) { + element.setAttribute("fileNameVisible", "false"); } + if (!fileSizeVisible) { + element.setAttribute("fileSizeVisible", "false"); + } + } } diff --git a/images/src/org/intellij/images/thumbnail/ThumbnailManager.java b/images/src/org/intellij/images/thumbnail/ThumbnailManager.java index 963c063a4f19..cb84f9dab2c7 100644 --- a/images/src/org/intellij/images/thumbnail/ThumbnailManager.java +++ b/images/src/org/intellij/images/thumbnail/ThumbnailManager.java @@ -36,5 +36,4 @@ public abstract class ThumbnailManager { */ @NotNull public abstract ThumbnailView getThumbnailView(); - } diff --git a/images/src/org/intellij/images/thumbnail/actionSystem/ThumbnailViewActionUtil.java b/images/src/org/intellij/images/thumbnail/actionSystem/ThumbnailViewActionUtil.java index aadcfe6df422..7e0a42455f73 100644 --- a/images/src/org/intellij/images/thumbnail/actionSystem/ThumbnailViewActionUtil.java +++ b/images/src/org/intellij/images/thumbnail/actionSystem/ThumbnailViewActionUtil.java @@ -12,37 +12,37 @@ import org.jetbrains.annotations.NotNull; * @author Alexey Efimov */ public final class ThumbnailViewActionUtil { - private ThumbnailViewActionUtil() { - } + private ThumbnailViewActionUtil() { + } - /** - * Extract current thumbnail view from event context. - * - * @param e Action event - * @return Current {@link ThumbnailView} or {@code null} - */ - public static ThumbnailView getVisibleThumbnailView(@NotNull AnActionEvent e) { - ThumbnailView thumbnailView = getThumbnailView(e); - if (thumbnailView != null && thumbnailView.isVisible()) { - return thumbnailView; - } - return null; + /** + * Extract current thumbnail view from event context. + * + * @param e Action event + * @return Current {@link ThumbnailView} or {@code null} + */ + public static ThumbnailView getVisibleThumbnailView(@NotNull AnActionEvent e) { + ThumbnailView thumbnailView = getThumbnailView(e); + if (thumbnailView != null && thumbnailView.isVisible()) { + return thumbnailView; } + return null; + } - public static ThumbnailView getThumbnailView(@NotNull AnActionEvent e) { - return e.getData(ThumbnailView.DATA_KEY); - } + public static ThumbnailView getThumbnailView(@NotNull AnActionEvent e) { + return e.getData(ThumbnailView.DATA_KEY); + } - /** - * Enable or disable current action from event. - * - * @param e Action event - * @return Enabled value - */ - public static boolean setEnabled(@NotNull AnActionEvent e) { - ThumbnailView thumbnailView = getVisibleThumbnailView(e); - Presentation presentation = e.getPresentation(); - presentation.setEnabled(thumbnailView != null); - return presentation.isEnabled(); - } + /** + * Enable or disable current action from event. + * + * @param e Action event + * @return Enabled value + */ + public static boolean setEnabled(@NotNull AnActionEvent e) { + ThumbnailView thumbnailView = getVisibleThumbnailView(e); + Presentation presentation = e.getPresentation(); + presentation.setEnabled(thumbnailView != null); + return presentation.isEnabled(); + } } diff --git a/images/src/org/intellij/images/thumbnail/actionSystem/ThumbnailViewActions.java b/images/src/org/intellij/images/thumbnail/actionSystem/ThumbnailViewActions.java index 7ae268c1ea2c..9e7c4fdf14c9 100644 --- a/images/src/org/intellij/images/thumbnail/actionSystem/ThumbnailViewActions.java +++ b/images/src/org/intellij/images/thumbnail/actionSystem/ThumbnailViewActions.java @@ -23,7 +23,7 @@ import org.jetbrains.annotations.NonNls; * @author Alexey Efimov */ public interface ThumbnailViewActions { - @NonNls String GROUP_POPUP = "Images.ThumbnailsPopupMenu"; - @NonNls String GROUP_TOOLBAR = "Images.ThumbnailsToolbar"; - @NonNls String ACTION_PLACE = "Images.Thumbnails"; + @NonNls String GROUP_POPUP = "Images.ThumbnailsPopupMenu"; + @NonNls String GROUP_TOOLBAR = "Images.ThumbnailsToolbar"; + @NonNls String ACTION_PLACE = "Images.Thumbnails"; } diff --git a/images/src/org/intellij/images/thumbnail/actions/EnterAction.java b/images/src/org/intellij/images/thumbnail/actions/EnterAction.java index cf4e52ecd521..016f586f6bff 100644 --- a/images/src/org/intellij/images/thumbnail/actions/EnterAction.java +++ b/images/src/org/intellij/images/thumbnail/actions/EnterAction.java @@ -18,48 +18,51 @@ import org.jetbrains.annotations.NotNull; * @author Alexey Efimov */ public final class EnterAction extends AnAction { - @Override - public void actionPerformed(@NotNull AnActionEvent e) { - ThumbnailView view = ThumbnailViewActionUtil.getVisibleThumbnailView(e); - if (view != null) { - VirtualFile[] selection = view.getSelection(); - if (selection.length == 1 && selection[0].isDirectory()) { - view.setRoot(selection[0]); - } else if (selection.length > 0) { - FileEditorManager fileEditorManager = FileEditorManager.getInstance(view.getProject()); - ImageFileTypeManager typeManager = ImageFileTypeManager.getInstance(); - for (VirtualFile file : selection) { - if (typeManager.isImage(file)) { - fileEditorManager.openFile(file, false); - } - } - } + @Override + public void actionPerformed(@NotNull AnActionEvent e) { + ThumbnailView view = ThumbnailViewActionUtil.getVisibleThumbnailView(e); + if (view != null) { + VirtualFile[] selection = view.getSelection(); + if (selection.length == 1 && selection[0].isDirectory()) { + view.setRoot(selection[0]); + } + else if (selection.length > 0) { + FileEditorManager fileEditorManager = FileEditorManager.getInstance(view.getProject()); + ImageFileTypeManager typeManager = ImageFileTypeManager.getInstance(); + for (VirtualFile file : selection) { + if (typeManager.isImage(file)) { + fileEditorManager.openFile(file, false); + } } + } } + } - @Override - public void update(@NotNull AnActionEvent e) { - if (ThumbnailViewActionUtil.setEnabled(e)) { - Presentation presentation = e.getPresentation(); - ThumbnailView view = ThumbnailViewActionUtil.getVisibleThumbnailView(e); - VirtualFile[] selection = view.getSelection(); - if (selection.length > 0) { - if (selection.length == 1 && selection[0].isDirectory()) { - presentation.setVisible(true); - } else { - boolean notImages = false; - ImageFileTypeManager typeManager = ImageFileTypeManager.getInstance(); - for (VirtualFile file : selection) { - notImages |= !typeManager.isImage(file); - } - presentation.setEnabled(!notImages); - presentation.setVisible(false); - } - } else { - presentation.setEnabledAndVisible(false); - } + @Override + public void update(@NotNull AnActionEvent e) { + if (ThumbnailViewActionUtil.setEnabled(e)) { + Presentation presentation = e.getPresentation(); + ThumbnailView view = ThumbnailViewActionUtil.getVisibleThumbnailView(e); + VirtualFile[] selection = view.getSelection(); + if (selection.length > 0) { + if (selection.length == 1 && selection[0].isDirectory()) { + presentation.setVisible(true); } + else { + boolean notImages = false; + ImageFileTypeManager typeManager = ImageFileTypeManager.getInstance(); + for (VirtualFile file : selection) { + notImages |= !typeManager.isImage(file); + } + presentation.setEnabled(!notImages); + presentation.setVisible(false); + } + } + else { + presentation.setEnabledAndVisible(false); + } } + } @Override public @NotNull ActionUpdateThread getActionUpdateThread() { diff --git a/images/src/org/intellij/images/thumbnail/actions/FilterByTagActionGroup.java b/images/src/org/intellij/images/thumbnail/actions/FilterByTagActionGroup.java index b5a3a2335df7..f1a6a1b17cc7 100644 --- a/images/src/org/intellij/images/thumbnail/actions/FilterByTagActionGroup.java +++ b/images/src/org/intellij/images/thumbnail/actions/FilterByTagActionGroup.java @@ -35,87 +35,87 @@ import java.util.List; public final class FilterByTagActionGroup extends ActionGroup implements PopupAction { - public FilterByTagActionGroup() { - setPopup(true); + public FilterByTagActionGroup() { + setPopup(true); + } + + @Override + public void update(@NotNull final AnActionEvent e) { + Project project = e.getProject(); + if (project == null) { + e.getPresentation().setEnabledAndVisible(false); + return; + } + ThumbnailView view = ThumbnailViewActionUtil.getVisibleThumbnailView(e); + ImageTagManager tagManager = ImageTagManager.getInstance(project); + e.getPresentation().setVisible(view != null && !tagManager.getAllTags().isEmpty()); + TagFilter[] filters = view != null ? view.getTagFilters() : null; + e.getPresentation().setText(filters == null ? CommonBundle.message("action.text.all") + : StringUtil.join(filters, filter -> filter.getDisplayName(), ",")); + e.getPresentation().setIcon(AllIcons.Duplicates.SendToTheRight); + } + + + @Override + public @NotNull ActionUpdateThread getActionUpdateThread() { + return ActionUpdateThread.EDT; + } + + @Override + public AnAction @NotNull [] getChildren(@Nullable AnActionEvent e) { + if (e == null) return AnAction.EMPTY_ARRAY; + DefaultActionGroup group = new DefaultActionGroup(); + Project project = e.getProject(); + ThumbnailView view = ThumbnailViewActionUtil.getVisibleThumbnailView(e); + if (view == null) return AnAction.EMPTY_ARRAY; + ImageTagManager tagManager = ImageTagManager.getInstance(project); + + List tagActions = + ContainerUtil.map(tagManager.getAllTags(), (@NlsSafe var tag) -> new MyToggleAction(view, new TagFilter(tag, tagManager))); + group.add(new AnAction(IdeBundle.messagePointer("action.Anonymous.text.all")) { + @Override + public void actionPerformed(@NotNull AnActionEvent e) { + for (MyToggleAction tagAction : tagActions) { + tagAction.setSelected(e, false); + } + } + }); + group.add(Separator.getInstance()); + + group.addAll(tagActions); + + return group.getChildren(e); + } + + private static class MyToggleAction extends ToggleAction { + private final ThumbnailView myView; + private final TagFilter myFilter; + + MyToggleAction(ThumbnailView view, TagFilter filter) { + super(filter.getDisplayName()); + myView = view; + myFilter = filter; } @Override - public void update(@NotNull final AnActionEvent e) { - Project project = e.getProject(); - if (project == null) { - e.getPresentation().setEnabledAndVisible(false); - return; - } - ThumbnailView view = ThumbnailViewActionUtil.getVisibleThumbnailView(e); - ImageTagManager tagManager = ImageTagManager.getInstance(project); - e.getPresentation().setVisible(view != null && !tagManager.getAllTags().isEmpty()); - TagFilter[] filters = view != null ? view.getTagFilters() : null; - e.getPresentation().setText(filters == null ? CommonBundle.message("action.text.all") - : StringUtil.join(filters, filter -> filter.getDisplayName(), ",")); - e.getPresentation().setIcon(AllIcons.Duplicates.SendToTheRight); + public boolean isSelected(@NotNull AnActionEvent e) { + TagFilter[] filters = myView.getTagFilters(); + return filters != null && ContainerUtil.exists(filters, f -> myFilter.getDisplayName().equals(f.getDisplayName())); } - @Override public @NotNull ActionUpdateThread getActionUpdateThread() { - return ActionUpdateThread.EDT; + return ActionUpdateThread.BGT; } - @Override - public AnAction @NotNull [] getChildren(@Nullable AnActionEvent e) { - if (e == null) return AnAction.EMPTY_ARRAY; - DefaultActionGroup group = new DefaultActionGroup(); - Project project = e.getProject(); - ThumbnailView view = ThumbnailViewActionUtil.getVisibleThumbnailView(e); - if (view == null) return AnAction.EMPTY_ARRAY; - ImageTagManager tagManager = ImageTagManager.getInstance(project); - - List tagActions = - ContainerUtil.map(tagManager.getAllTags(), (@NlsSafe var tag) -> new MyToggleAction(view, new TagFilter(tag, tagManager))); - group.add(new AnAction(IdeBundle.messagePointer("action.Anonymous.text.all")) { - @Override - public void actionPerformed(@NotNull AnActionEvent e) { - for (MyToggleAction tagAction : tagActions) { - tagAction.setSelected(e, false); - } - } - }); - group.add(Separator.getInstance()); - - group.addAll(tagActions); - - return group.getChildren(e); - } - - private static class MyToggleAction extends ToggleAction { - private final ThumbnailView myView; - private final TagFilter myFilter; - - MyToggleAction(ThumbnailView view, TagFilter filter) { - super(filter.getDisplayName()); - myView = view; - myFilter = filter; - } - - @Override - public boolean isSelected(@NotNull AnActionEvent e) { - TagFilter[] filters = myView.getTagFilters(); - return filters != null && ContainerUtil.exists(filters, f -> myFilter.getDisplayName().equals(f.getDisplayName())); - } - - @Override - public @NotNull ActionUpdateThread getActionUpdateThread() { - return ActionUpdateThread.BGT; - } - - @Override - public void setSelected(@NotNull AnActionEvent e, boolean state) { - if (state) { - myFilter.setFilter(myView); - } - else { - myFilter.clearFilter(myView); - } - } + @Override + public void setSelected(@NotNull AnActionEvent e, boolean state) { + if (state) { + myFilter.setFilter(myView); + } + else { + myFilter.clearFilter(myView); + } } + } } diff --git a/images/src/org/intellij/images/thumbnail/actions/FilterByThemeComboBoxAction.java b/images/src/org/intellij/images/thumbnail/actions/FilterByThemeComboBoxAction.java index a20c2377f621..c3396cd77dbd 100644 --- a/images/src/org/intellij/images/thumbnail/actions/FilterByThemeComboBoxAction.java +++ b/images/src/org/intellij/images/thumbnail/actions/FilterByThemeComboBoxAction.java @@ -27,45 +27,45 @@ public final class FilterByThemeComboBoxAction extends ComboBoxAction { @Override - public void update(@NotNull final AnActionEvent e) { - Project project = e.getProject(); - ThumbnailView view = ThumbnailViewActionUtil.getVisibleThumbnailView(e); - boolean hasApplicableExtension = - ContainerUtil.and(ThemeFilter.EP_NAME.getExtensionList(), filter -> project != null && filter.isApplicableToProject(project)); - e.getPresentation().setVisible(view != null && hasApplicableExtension); - ThemeFilter filter = view != null ? view.getFilter() : null; - e.getPresentation().setText(filter == null ? CommonBundle.message("action.text.all") : filter.getDisplayName()); + public void update(@NotNull final AnActionEvent e) { + Project project = e.getProject(); + ThumbnailView view = ThumbnailViewActionUtil.getVisibleThumbnailView(e); + boolean hasApplicableExtension = + ContainerUtil.and(ThemeFilter.EP_NAME.getExtensionList(), filter -> project != null && filter.isApplicableToProject(project)); + e.getPresentation().setVisible(view != null && hasApplicableExtension); + ThemeFilter filter = view != null ? view.getFilter() : null; + e.getPresentation().setText(filter == null ? CommonBundle.message("action.text.all") : filter.getDisplayName()); + } + + @NotNull + @Override + protected DefaultActionGroup createPopupActionGroup(@NotNull JComponent button, @NotNull DataContext context) { + DefaultActionGroup group = new DefaultActionGroup(); + group.add(new FilterImagesAction(new ThemeFilter() { + @Override + public String getDisplayName() { + return ImagesBundle.message("action.all.text"); + } + + @Override + public boolean accepts(VirtualFile file) { + return true; + } + + @Override + public boolean isApplicableToProject(Project project) { + return true; + } + + @Override + public void setFilter(ThumbnailView view) { + view.setFilter(this); + } + })); + for (ThemeFilter filter : ThemeFilter.EP_NAME.getExtensionList()) { + group.add(new FilterImagesAction(filter)); } - @NotNull - @Override - protected DefaultActionGroup createPopupActionGroup(@NotNull JComponent button, @NotNull DataContext context) { - DefaultActionGroup group = new DefaultActionGroup(); - group.add(new FilterImagesAction(new ThemeFilter() { - @Override - public String getDisplayName() { - return ImagesBundle.message("action.all.text"); - } - - @Override - public boolean accepts(VirtualFile file) { - return true; - } - - @Override - public boolean isApplicableToProject(Project project) { - return true; - } - - @Override - public void setFilter(ThumbnailView view) { - view.setFilter(this); - } - })); - for (ThemeFilter filter : ThemeFilter.EP_NAME.getExtensionList()) { - group.add(new FilterImagesAction(filter)); - } - - return group; - } + return group; + } } diff --git a/images/src/org/intellij/images/thumbnail/actions/ShowBorderAction.java b/images/src/org/intellij/images/thumbnail/actions/ShowBorderAction.java index b08a2d208ddf..384b8cd0ff29 100644 --- a/images/src/org/intellij/images/thumbnail/actions/ShowBorderAction.java +++ b/images/src/org/intellij/images/thumbnail/actions/ShowBorderAction.java @@ -14,28 +14,28 @@ import org.jetbrains.annotations.NotNull; * @author Konstantin Bulenkov */ public class ShowBorderAction extends ToggleAction implements DumbAware { - public static final String PROP_NAME = "ImagePlugin.borderVisible"; + public static final String PROP_NAME = "ImagePlugin.borderVisible"; - public static boolean isBorderVisible() { - return PropertiesComponent.getInstance().getBoolean(PROP_NAME, false); - } + public static boolean isBorderVisible() { + return PropertiesComponent.getInstance().getBoolean(PROP_NAME, false); + } - @Override - public boolean isSelected(@NotNull AnActionEvent e) { - return isBorderVisible(); - } + @Override + public boolean isSelected(@NotNull AnActionEvent e) { + return isBorderVisible(); + } - @Override - public @NotNull ActionUpdateThread getActionUpdateThread() { - return ActionUpdateThread.BGT; - } + @Override + public @NotNull ActionUpdateThread getActionUpdateThread() { + return ActionUpdateThread.BGT; + } - @Override - public void setSelected(@NotNull AnActionEvent e, boolean state) { - ImageComponentDecorator decorator = ImageEditorActionUtil.getImageComponentDecorator(e); - PropertiesComponent.getInstance().setValue(PROP_NAME, state); - if (decorator != null) { - decorator.setBorderVisible(state); - } + @Override + public void setSelected(@NotNull AnActionEvent e, boolean state) { + ImageComponentDecorator decorator = ImageEditorActionUtil.getImageComponentDecorator(e); + PropertiesComponent.getInstance().setValue(PROP_NAME, state); + if (decorator != null) { + decorator.setBorderVisible(state); } + } } diff --git a/images/src/org/intellij/images/thumbnail/actions/ToggleFileNameAction.java b/images/src/org/intellij/images/thumbnail/actions/ToggleFileNameAction.java index 309b19fc8748..92604e8321c4 100644 --- a/images/src/org/intellij/images/thumbnail/actions/ToggleFileNameAction.java +++ b/images/src/org/intellij/images/thumbnail/actions/ToggleFileNameAction.java @@ -11,28 +11,29 @@ import org.intellij.images.ui.ImageComponentDecorator; import org.jetbrains.annotations.NotNull; public final class ToggleFileNameAction extends ToggleAction { - @Override - public boolean isSelected(@NotNull AnActionEvent e) { - ImageComponentDecorator decorator = e.getData(ImageComponentDecorator.DATA_KEY); - return decorator != null && decorator.isEnabledForActionPlace(e.getPlace()) && decorator.isFileNameVisible(); - } + @Override + public boolean isSelected(@NotNull AnActionEvent e) { + ImageComponentDecorator decorator = e.getData(ImageComponentDecorator.DATA_KEY); + return decorator != null && decorator.isEnabledForActionPlace(e.getPlace()) && decorator.isFileNameVisible(); + } - @Override - public void setSelected(@NotNull AnActionEvent e, boolean state) { - ImageComponentDecorator decorator = e.getData(ImageComponentDecorator.DATA_KEY); - if (decorator != null && decorator.isEnabledForActionPlace(e.getPlace())) { - decorator.setFileNameVisible(state); - OptionsManager.getInstance().getOptions().getEditorOptions().setFileNameVisible(state); - } + @Override + public void setSelected(@NotNull AnActionEvent e, boolean state) { + ImageComponentDecorator decorator = e.getData(ImageComponentDecorator.DATA_KEY); + if (decorator != null && decorator.isEnabledForActionPlace(e.getPlace())) { + decorator.setFileNameVisible(state); + OptionsManager.getInstance().getOptions().getEditorOptions().setFileNameVisible(state); } + } - @Override - public void update(@NotNull final AnActionEvent e) { - super.update(e); - ImageComponentDecorator decorator = e.getData(ImageComponentDecorator.DATA_KEY); - e.getPresentation().setEnabled(decorator != null && decorator.isEnabledForActionPlace(e.getPlace())); - e.getPresentation().setText(isSelected(e) ? IdeBundle.message("action.text.hide.file.name") : IdeBundle.message("action.text.show.file.name")); - } + @Override + public void update(@NotNull final AnActionEvent e) { + super.update(e); + ImageComponentDecorator decorator = e.getData(ImageComponentDecorator.DATA_KEY); + e.getPresentation().setEnabled(decorator != null && decorator.isEnabledForActionPlace(e.getPlace())); + e.getPresentation().setText(isSelected(e) ? IdeBundle.message("action.text.hide.file.name") : + IdeBundle.message("action.text.show.file.name")); + } @Override public @NotNull ActionUpdateThread getActionUpdateThread() { diff --git a/images/src/org/intellij/images/thumbnail/actions/ToggleFileSizeAction.java b/images/src/org/intellij/images/thumbnail/actions/ToggleFileSizeAction.java index 4dc543308a2e..8ae26981a5e9 100644 --- a/images/src/org/intellij/images/thumbnail/actions/ToggleFileSizeAction.java +++ b/images/src/org/intellij/images/thumbnail/actions/ToggleFileSizeAction.java @@ -11,28 +11,29 @@ import org.intellij.images.ui.ImageComponentDecorator; import org.jetbrains.annotations.NotNull; public final class ToggleFileSizeAction extends ToggleAction { - @Override - public boolean isSelected(@NotNull AnActionEvent e) { - ImageComponentDecorator decorator = e.getData(ImageComponentDecorator.DATA_KEY); - return decorator != null && decorator.isEnabledForActionPlace(e.getPlace()) && decorator.isFileSizeVisible(); - } + @Override + public boolean isSelected(@NotNull AnActionEvent e) { + ImageComponentDecorator decorator = e.getData(ImageComponentDecorator.DATA_KEY); + return decorator != null && decorator.isEnabledForActionPlace(e.getPlace()) && decorator.isFileSizeVisible(); + } - @Override - public void setSelected(@NotNull AnActionEvent e, boolean state) { - ImageComponentDecorator decorator = e.getData(ImageComponentDecorator.DATA_KEY); - if (decorator != null && decorator.isEnabledForActionPlace(e.getPlace())) { - decorator.setFileSizeVisible(state); - OptionsManager.getInstance().getOptions().getEditorOptions().setFileSizeVisible(state); - } + @Override + public void setSelected(@NotNull AnActionEvent e, boolean state) { + ImageComponentDecorator decorator = e.getData(ImageComponentDecorator.DATA_KEY); + if (decorator != null && decorator.isEnabledForActionPlace(e.getPlace())) { + decorator.setFileSizeVisible(state); + OptionsManager.getInstance().getOptions().getEditorOptions().setFileSizeVisible(state); } + } - @Override - public void update(@NotNull final AnActionEvent e) { - super.update(e); - ImageComponentDecorator decorator = e.getData(ImageComponentDecorator.DATA_KEY); - e.getPresentation().setEnabled(decorator != null && decorator.isEnabledForActionPlace(e.getPlace())); - e.getPresentation().setText(isSelected(e) ? IdeBundle.message("action.text.hide.file.size") : IdeBundle.message("action.text.show.file.size")); - } + @Override + public void update(@NotNull final AnActionEvent e) { + super.update(e); + ImageComponentDecorator decorator = e.getData(ImageComponentDecorator.DATA_KEY); + e.getPresentation().setEnabled(decorator != null && decorator.isEnabledForActionPlace(e.getPlace())); + e.getPresentation().setText(isSelected(e) ? IdeBundle.message("action.text.hide.file.size") : + IdeBundle.message("action.text.show.file.size")); + } @Override public @NotNull ActionUpdateThread getActionUpdateThread() { diff --git a/images/src/org/intellij/images/thumbnail/actions/ToggleTagsPanelAction.java b/images/src/org/intellij/images/thumbnail/actions/ToggleTagsPanelAction.java index f46839e698b3..7696b827ac21 100644 --- a/images/src/org/intellij/images/thumbnail/actions/ToggleTagsPanelAction.java +++ b/images/src/org/intellij/images/thumbnail/actions/ToggleTagsPanelAction.java @@ -27,32 +27,34 @@ import org.intellij.images.thumbnail.actionSystem.ThumbnailViewActionUtil; import org.jetbrains.annotations.NotNull; public final class ToggleTagsPanelAction extends ToggleAction { - public static final String TAGS_PANEL_VISIBLE = "tags.panel.visible"; - public static final String TAGS_PANEL_PROPORTION = "tags.panel.proportion"; - @Override - public boolean isSelected(@NotNull AnActionEvent e) { - Project project = e.getProject(); - return project != null && PropertiesComponent.getInstance(project).getBoolean(TAGS_PANEL_VISIBLE, false); - } + public static final String TAGS_PANEL_VISIBLE = "tags.panel.visible"; + public static final String TAGS_PANEL_PROPORTION = "tags.panel.proportion"; - @Override - public void setSelected(@NotNull AnActionEvent e, boolean state) { - PropertiesComponent.getInstance(e.getProject()).setValue(TAGS_PANEL_VISIBLE, state); - ThumbnailView view = ThumbnailViewActionUtil.getVisibleThumbnailView(e); - assert view != null; - view.refresh(); - } + @Override + public boolean isSelected(@NotNull AnActionEvent e) { + Project project = e.getProject(); + return project != null && PropertiesComponent.getInstance(project).getBoolean(TAGS_PANEL_VISIBLE, false); + } - @Override - public void update(@NotNull final AnActionEvent e) { - ThumbnailView view = ThumbnailViewActionUtil.getVisibleThumbnailView(e); - e.getPresentation().setEnabledAndVisible(view != null); - e.getPresentation().setText(isSelected(e) ? IdeBundle.message("action.text.hide.tags.panel") : IdeBundle.message("action.text.show.tags.panel")); - super.update(e); - } + @Override + public void setSelected(@NotNull AnActionEvent e, boolean state) { + PropertiesComponent.getInstance(e.getProject()).setValue(TAGS_PANEL_VISIBLE, state); + ThumbnailView view = ThumbnailViewActionUtil.getVisibleThumbnailView(e); + assert view != null; + view.refresh(); + } - @Override - public @NotNull ActionUpdateThread getActionUpdateThread() { - return ActionUpdateThread.BGT; - } + @Override + public void update(@NotNull final AnActionEvent e) { + ThumbnailView view = ThumbnailViewActionUtil.getVisibleThumbnailView(e); + e.getPresentation().setEnabledAndVisible(view != null); + e.getPresentation().setText(isSelected(e) ? IdeBundle.message("action.text.hide.tags.panel") : + IdeBundle.message("action.text.show.tags.panel")); + super.update(e); + } + + @Override + public @NotNull ActionUpdateThread getActionUpdateThread() { + return ActionUpdateThread.BGT; + } } diff --git a/images/src/org/intellij/images/thumbnail/actions/UpFolderAction.java b/images/src/org/intellij/images/thumbnail/actions/UpFolderAction.java index fb78793152f3..6023840aed49 100644 --- a/images/src/org/intellij/images/thumbnail/actions/UpFolderAction.java +++ b/images/src/org/intellij/images/thumbnail/actions/UpFolderAction.java @@ -15,31 +15,31 @@ import org.jetbrains.annotations.NotNull; * @author Alexey Efimov */ public final class UpFolderAction extends AnAction { - @Override - public void actionPerformed(@NotNull AnActionEvent e) { - ThumbnailView view = ThumbnailViewActionUtil.getVisibleThumbnailView(e); - if (view != null) { - VirtualFile root = view.getRoot(); - if (root != null) { - VirtualFile parent = root.getParent(); - if (parent != null) { - view.setRoot(parent); - } - } + @Override + public void actionPerformed(@NotNull AnActionEvent e) { + ThumbnailView view = ThumbnailViewActionUtil.getVisibleThumbnailView(e); + if (view != null) { + VirtualFile root = view.getRoot(); + if (root != null) { + VirtualFile parent = root.getParent(); + if (parent != null) { + view.setRoot(parent); } + } } + } - @Override - public void update(@NotNull AnActionEvent e) { - if (ThumbnailViewActionUtil.setEnabled(e)) { - ThumbnailView view = ThumbnailViewActionUtil.getVisibleThumbnailView(e); - VirtualFile root = view.getRoot(); - e.getPresentation().setEnabled(root != null && root.getParent() != null && !view.isRecursive()); - } + @Override + public void update(@NotNull AnActionEvent e) { + if (ThumbnailViewActionUtil.setEnabled(e)) { + ThumbnailView view = ThumbnailViewActionUtil.getVisibleThumbnailView(e); + VirtualFile root = view.getRoot(); + e.getPresentation().setEnabled(root != null && root.getParent() != null && !view.isRecursive()); } + } - @Override - public @NotNull ActionUpdateThread getActionUpdateThread() { - return ActionUpdateThread.EDT; - } + @Override + public @NotNull ActionUpdateThread getActionUpdateThread() { + return ActionUpdateThread.EDT; + } } diff --git a/images/src/org/intellij/images/thumbnail/impl/ThumbnailViewUI.java b/images/src/org/intellij/images/thumbnail/impl/ThumbnailViewUI.java index 91e80f5d3d53..fdccfb988f39 100644 --- a/images/src/org/intellij/images/thumbnail/impl/ThumbnailViewUI.java +++ b/images/src/org/intellij/images/thumbnail/impl/ThumbnailViewUI.java @@ -61,701 +61,723 @@ import static com.intellij.pom.Navigatable.EMPTY_NAVIGATABLE_ARRAY; final class ThumbnailViewUI extends JPanel implements DataProvider, Disposable { - private final ThumbnailView thumbnailView; - private final CopyPasteSupport copyPasteSupport; - private final DeleteProvider deleteProvider; - private ThumbnailListCellRenderer cellRenderer; - private JList list; - private JPanel tagsPanel; - private static final Comparator VIRTUAL_FILE_COMPARATOR = (o1, o2) -> { - if (o1.isDirectory() && !o2.isDirectory()) { - return -1; - } - if (o2.isDirectory() && !o1.isDirectory()) { - return 1; - } - - return o1.getPath().compareToIgnoreCase(o2.getPath()); - }; - private DefaultListModel listModel; - private Splitter previewSplitter; - - ThumbnailViewUI(ThumbnailViewImpl thumbnailView) { - super(new BorderLayout()); - - this.thumbnailView = thumbnailView; - - copyPasteSupport = new CopyPasteDelegator(thumbnailView.getProject(), this); - deleteProvider = new DeleteHandler.DefaultDeleteProvider(); - + private final ThumbnailView thumbnailView; + private final CopyPasteSupport copyPasteSupport; + private final DeleteProvider deleteProvider; + private ThumbnailListCellRenderer cellRenderer; + private JList list; + private JPanel tagsPanel; + private static final Comparator VIRTUAL_FILE_COMPARATOR = (o1, o2) -> { + if (o1.isDirectory() && !o2.isDirectory()) { + return -1; + } + if (o2.isDirectory() && !o1.isDirectory()) { + return 1; } - private void createUI() { - if (cellRenderer == null || list == null) { - cellRenderer = new ThumbnailListCellRenderer(); - ImageComponent imageComponent = cellRenderer.getImageComponent(); + return o1.getPath().compareToIgnoreCase(o2.getPath()); + }; + private DefaultListModel listModel; + private Splitter previewSplitter; - VirtualFileManager.getInstance().addVirtualFileListener(new VFSListener(), this); + ThumbnailViewUI(ThumbnailViewImpl thumbnailView) { + super(new BorderLayout()); - Options options = OptionsManager.getInstance().getOptions(); - EditorOptions editorOptions = options.getEditorOptions(); - // Set options - TransparencyChessboardOptions chessboardOptions = editorOptions.getTransparencyChessboardOptions(); - imageComponent.setTransparencyChessboardVisible(chessboardOptions.isShowDefault()); - imageComponent.setTransparencyChessboardCellSize(chessboardOptions.getCellSize()); - imageComponent.setTransparencyChessboardWhiteColor(chessboardOptions.getWhiteColor()); - imageComponent.setTransparencyChessboardBlankColor(chessboardOptions.getBlackColor()); - imageComponent.setFileNameVisible(editorOptions.isFileNameVisible()); - imageComponent.setFileSizeVisible(editorOptions.isFileSizeVisible()); + this.thumbnailView = thumbnailView; - options.addPropertyChangeListener(new OptionsChangeListener(), this); + copyPasteSupport = new CopyPasteDelegator(thumbnailView.getProject(), this); + deleteProvider = new DeleteHandler.DefaultDeleteProvider(); + } - list = new JBList(); - list.setModel(new DefaultListModel()); - list.setLayoutOrientation(JList.HORIZONTAL_WRAP); - list.setVisibleRowCount(-1); - list.setCellRenderer(cellRenderer); - list.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); - list.addListSelectionListener(e -> updateTagsPreviewModel()); + private void createUI() { + if (cellRenderer == null || list == null) { + cellRenderer = new ThumbnailListCellRenderer(); + ImageComponent imageComponent = cellRenderer.getImageComponent(); - ThumbnailsMouseAdapter mouseListener = new ThumbnailsMouseAdapter(); - list.addMouseListener(mouseListener); - list.addMouseMotionListener(mouseListener); + VirtualFileManager.getInstance().addVirtualFileListener(new VFSListener(), this); - ThumbnailComponentUI componentUI = (ThumbnailComponentUI)ThumbnailComponentUI.createUI(cellRenderer); - Dimension preferredSize = componentUI.getPreferredSize(cellRenderer); + Options options = OptionsManager.getInstance().getOptions(); + EditorOptions editorOptions = options.getEditorOptions(); + // Set options + TransparencyChessboardOptions chessboardOptions = editorOptions.getTransparencyChessboardOptions(); + imageComponent.setTransparencyChessboardVisible(chessboardOptions.isShowDefault()); + imageComponent.setTransparencyChessboardCellSize(chessboardOptions.getCellSize()); + imageComponent.setTransparencyChessboardWhiteColor(chessboardOptions.getWhiteColor()); + imageComponent.setTransparencyChessboardBlankColor(chessboardOptions.getBlackColor()); + imageComponent.setFileNameVisible(editorOptions.isFileNameVisible()); + imageComponent.setFileSizeVisible(editorOptions.isFileSizeVisible()); - list.setFixedCellWidth(preferredSize.width); - list.setFixedCellHeight(preferredSize.height); + options.addPropertyChangeListener(new OptionsChangeListener(), this); + + list = new JBList(); + list.setModel(new DefaultListModel()); + list.setLayoutOrientation(JList.HORIZONTAL_WRAP); + list.setVisibleRowCount(-1); + list.setCellRenderer(cellRenderer); + list.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); + list.addListSelectionListener(e -> updateTagsPreviewModel()); + + ThumbnailsMouseAdapter mouseListener = new ThumbnailsMouseAdapter(); + list.addMouseListener(mouseListener); + list.addMouseMotionListener(mouseListener); + + ThumbnailComponentUI componentUI = (ThumbnailComponentUI)ThumbnailComponentUI.createUI(cellRenderer); + Dimension preferredSize = componentUI.getPreferredSize(cellRenderer); + + list.setFixedCellWidth(preferredSize.width); + list.setFixedCellHeight(preferredSize.height); - JScrollPane scrollPane = - ScrollPaneFactory.createScrollPane(list, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, - ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); - scrollPane.setBorder(IdeBorderFactory.createBorder(SideBorder.TOP)); + JScrollPane scrollPane = + ScrollPaneFactory.createScrollPane(list, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, + ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); + scrollPane.setBorder(IdeBorderFactory.createBorder(SideBorder.TOP)); - ActionManager actionManager = ActionManager.getInstance(); - ActionGroup actionGroup = (ActionGroup) actionManager.getAction(ThumbnailViewActions.GROUP_TOOLBAR); - ActionToolbar actionToolbar = actionManager.createActionToolbar( - ThumbnailViewActions.ACTION_PLACE, actionGroup, true - ); - actionToolbar.setTargetComponent(this); + ActionManager actionManager = ActionManager.getInstance(); + ActionGroup actionGroup = (ActionGroup)actionManager.getAction(ThumbnailViewActions.GROUP_TOOLBAR); + ActionToolbar actionToolbar = actionManager.createActionToolbar( + ThumbnailViewActions.ACTION_PLACE, actionGroup, true + ); + actionToolbar.setTargetComponent(this); - JComponent toolbar = actionToolbar.getComponent(); + JComponent toolbar = actionToolbar.getComponent(); - FocusRequester focusRequester = new FocusRequester(); - toolbar.addMouseListener(focusRequester); - scrollPane.addMouseListener(focusRequester); + FocusRequester focusRequester = new FocusRequester(); + toolbar.addMouseListener(focusRequester); + scrollPane.addMouseListener(focusRequester); - add(toolbar, BorderLayout.NORTH); + add(toolbar, BorderLayout.NORTH); - previewSplitter = new Splitter(); - previewSplitter.setFirstComponent(scrollPane); - previewSplitter.setProportion(1); - previewSplitter.setSecondComponent(null); - add(previewSplitter, BorderLayout.CENTER); + previewSplitter = new Splitter(); + previewSplitter.setFirstComponent(scrollPane); + previewSplitter.setProportion(1); + previewSplitter.setSecondComponent(null); + add(previewSplitter, BorderLayout.CENTER); + } + updateTagsPreview(); + } + + private JPanel createTagPreviewPanel() { + listModel = new DefaultListModel<>(); + updateTagsPreviewModel(); + JBList tagsList = new JBList<>(listModel); + tagsList.setEmptyText(ImagesBundle.message("list.empty.text.no.tags.defined")); + ImageTagManager imageTagManager = ImageTagManager.getInstance(thumbnailView.getProject()); + return ToolbarDecorator.createDecorator(tagsList) + .setAddAction(new AnActionButtonRunnable() { + @Override + public void run(AnActionButton button) { + JBPopupFactory.getInstance().createActionGroupPopup(IdeBundle.message("popup.title.add.tags"), + new AddTagGroup(), + button.getDataContext(), + JBPopupFactory.ActionSelectionAid.SPEEDSEARCH, false) + .show(button.getPreferredPopupPoint()); } - updateTagsPreview(); + }) + .setRemoveAction(new AnActionButtonRunnable() { + @Override + public void run(AnActionButton button) { + String selectedValue = tagsList.getSelectedValue(); + if (selectedValue != null) { + Arrays.stream(getSelection()) + .forEach(virtualFile -> imageTagManager.removeTag(selectedValue, virtualFile)); + } + updateTagsPreviewModel(); + } + }) + .disableUpDownActions() + .setToolbarPosition(ActionToolbarPosition.RIGHT) + .createPanel(); + } + + private void updateTagsPreview() { + Project project = thumbnailView.getProject(); + boolean enabled = PropertiesComponent.getInstance(project).getBoolean(ToggleTagsPanelAction.TAGS_PANEL_VISIBLE, false); + float splitterProportion = previewSplitter.getProportion(); + if (enabled) { + if (splitterProportion == 1) { + previewSplitter.setProportion( + Float.parseFloat(PropertiesComponent.getInstance(project).getValue(ToggleTagsPanelAction.TAGS_PANEL_PROPORTION, "0.5f"))); + } + if (tagsPanel == null) { + tagsPanel = createTagPreviewPanel(); + } + previewSplitter.setSecondComponent(tagsPanel); + } + else { + if (splitterProportion != 1) { + PropertiesComponent.getInstance(thumbnailView.getProject()) + .setValue(ToggleTagsPanelAction.TAGS_PANEL_PROPORTION, String.valueOf(splitterProportion)); + } + previewSplitter.setProportion(1); + previewSplitter.setSecondComponent(null); + } + } + + private void updateTagsPreviewModel() { + if (listModel == null) return; + listModel.clear(); + + VirtualFile[] selection = getSelection(); + ImageTagManager tagManager = ImageTagManager.getInstance(thumbnailView.getProject()); + List commonTags = null; + for (VirtualFile virtualFile : selection) { + List tags = tagManager.getTags(virtualFile); + if (commonTags == null) { + commonTags = new ArrayList<>(tags); + } + else { + commonTags.retainAll(tags); + } } - private JPanel createTagPreviewPanel() { - listModel = new DefaultListModel<>(); - updateTagsPreviewModel(); - JBList tagsList = new JBList<>(listModel); - tagsList.setEmptyText(ImagesBundle.message("list.empty.text.no.tags.defined")); - ImageTagManager imageTagManager = ImageTagManager.getInstance(thumbnailView.getProject()); - return ToolbarDecorator.createDecorator(tagsList) - .setAddAction(new AnActionButtonRunnable() { - @Override - public void run(AnActionButton button) { - JBPopupFactory.getInstance().createActionGroupPopup(IdeBundle.message("popup.title.add.tags"), - new AddTagGroup(), - button.getDataContext(), - JBPopupFactory.ActionSelectionAid.SPEEDSEARCH, false) - .show(button.getPreferredPopupPoint()); - } - }) - .setRemoveAction(new AnActionButtonRunnable() { - @Override - public void run(AnActionButton button) { - String selectedValue = tagsList.getSelectedValue(); - if (selectedValue != null) { - Arrays.stream(getSelection()) - .forEach(virtualFile -> imageTagManager.removeTag(selectedValue, virtualFile)); - } - updateTagsPreviewModel(); - } - }) - .disableUpDownActions() - .setToolbarPosition(ActionToolbarPosition.RIGHT) - .createPanel(); + if (commonTags != null) { + commonTags.forEach(listModel::addElement); } + } - private void updateTagsPreview() { - Project project = thumbnailView.getProject(); - boolean enabled = PropertiesComponent.getInstance(project).getBoolean(ToggleTagsPanelAction.TAGS_PANEL_VISIBLE, false); - float splitterProportion = previewSplitter.getProportion(); - if (enabled) { - if (splitterProportion == 1) { - previewSplitter.setProportion(Float.parseFloat(PropertiesComponent.getInstance(project).getValue(ToggleTagsPanelAction.TAGS_PANEL_PROPORTION, "0.5f"))); + public void refresh() { + createUI(); + if (list != null) { + DefaultListModel model = (DefaultListModel)list.getModel(); + model.clear(); + VirtualFile root = thumbnailView.getRoot(); + if (root != null && root.isValid() && root.isDirectory()) { + Set files = findFiles(root.getChildren()); + VirtualFile[] virtualFiles = VfsUtilCore.toVirtualFileArray(files); + Arrays.sort(virtualFiles, VIRTUAL_FILE_COMPARATOR); + + model.ensureCapacity(model.size() + virtualFiles.length + 1); + ThemeFilter filter = thumbnailView.getFilter(); + TagFilter[] tagFilters = thumbnailView.getTagFilters(); + for (VirtualFile virtualFile : virtualFiles) { + if (filter == null || filter.accepts(virtualFile)) { + if (tagFilters == null || Arrays.stream(tagFilters).anyMatch(tagFilter -> tagFilter.accepts(virtualFile))) { + model.addElement(virtualFile); } - if (tagsPanel == null) { - tagsPanel = createTagPreviewPanel(); + } + } + if (model.size() > 0) { + list.setSelectedIndex(0); + } + } + else { + thumbnailView.setVisible(false); + } + } + } + + public boolean isTransparencyChessboardVisible() { + createUI(); + return cellRenderer.getImageComponent().isTransparencyChessboardVisible(); + } + + public void setTransparencyChessboardVisible(boolean visible) { + createUI(); + cellRenderer.getImageComponent().setTransparencyChessboardVisible(visible); + list.repaint(); + } + + public void setFileNameVisible(boolean visible) { + createUI(); + cellRenderer.getImageComponent().setFileNameVisible(visible); + list.repaint(); + } + + public boolean isFileNameVisible() { + createUI(); + return cellRenderer.getImageComponent().isFileNameVisible(); + } + + public void setFileSizeVisible(boolean visible) { + createUI(); + cellRenderer.getImageComponent().setFileSizeVisible(visible); + list.repaint(); + } + + public boolean isFileSizeVisible() { + createUI(); + return cellRenderer.getImageComponent().isFileSizeVisible(); + } + + public void setSelected(VirtualFile file, boolean selected) { + createUI(); + list.setSelectedValue(file, false); + } + + public void scrollToSelection() { + int minSelectionIndex = list.getMinSelectionIndex(); + int maxSelectionIndex = list.getMaxSelectionIndex(); + if (minSelectionIndex != -1 && maxSelectionIndex != -1) { + list.scrollRectToVisible(list.getCellBounds(minSelectionIndex, maxSelectionIndex)); + } + } + + public boolean isSelected(VirtualFile file) { + int index = ((DefaultListModel)list.getModel()).indexOf(file); + return index != -1 && list.isSelectedIndex(index); + } + + public VirtualFile @NotNull [] getSelection() { + if (list != null) { + Object[] selectedValues = list.getSelectedValues(); + if (selectedValues != null) { + VirtualFile[] files = new VirtualFile[selectedValues.length]; + for (int i = 0; i < selectedValues.length; i++) { + files[i] = (VirtualFile)selectedValues[i]; + } + return files; + } + } + return VirtualFile.EMPTY_ARRAY; + } + + private final class ThumbnailListCellRenderer extends ThumbnailComponent + implements ListCellRenderer { + private final ImageFileTypeManager typeManager = ImageFileTypeManager.getInstance(); + + @Override + public Component getListCellRendererComponent( + JList list, Object value, int index, boolean isSelected, boolean cellHasFocus + ) { + if (value instanceof VirtualFile file) { + setFileName(file.getName()); + String toolTipText = IfsUtil.getReferencePath(thumbnailView.getProject(), file); + if (!isFileSizeVisible()) { + String description = getImageComponent().getDescription(); + if (description != null) { + toolTipText += " [" + description + "]"; + } + } + setToolTipText(toolTipText); + setDirectory(file.isDirectory()); + if (file.isDirectory()) { + int imagesCount = 0; + VirtualFile[] children = file.getChildren(); + for (VirtualFile child : children) { + if (typeManager.isImage(child)) { + imagesCount++; + if (imagesCount > 100) { + break; + } } - previewSplitter.setSecondComponent(tagsPanel); + } + setImagesCount(imagesCount); } else { - if (splitterProportion != 1) { - PropertiesComponent.getInstance(thumbnailView.getProject()) - .setValue(ToggleTagsPanelAction.TAGS_PANEL_PROPORTION, String.valueOf(splitterProportion)); - } - previewSplitter.setProportion(1); - previewSplitter.setSecondComponent(null); + // File rendering + setFileSize(file.getLength()); + try { + ImageComponent imageComponent = getImageComponent(); + BufferedImage image = IfsUtil.getImage(file, imageComponent); + imageComponent.getDocument().setValue(image); + setFormat(IfsUtil.getFormat(file)); + } + catch (Exception e) { + // Ignore + ImageComponent imageComponent = getImageComponent(); + imageComponent.getDocument().setValue((BufferedImage)null); + } } - } - - private void updateTagsPreviewModel() { - if (listModel == null) return; - listModel.clear(); - - VirtualFile[] selection = getSelection(); - ImageTagManager tagManager = ImageTagManager.getInstance(thumbnailView.getProject()); - List commonTags = null; - for (VirtualFile virtualFile : selection) { - List tags = tagManager.getTags(virtualFile); - if (commonTags == null) { - commonTags = new ArrayList<>(tags); - } - else { - commonTags.retainAll(tags); - } - } - - if (commonTags != null) { - commonTags.forEach(listModel::addElement); - } - } - - public void refresh() { - createUI(); - if (list != null) { - DefaultListModel model = (DefaultListModel) list.getModel(); - model.clear(); - VirtualFile root = thumbnailView.getRoot(); - if (root != null && root.isValid() && root.isDirectory()) { - Set files = findFiles(root.getChildren()); - VirtualFile[] virtualFiles = VfsUtilCore.toVirtualFileArray(files); - Arrays.sort(virtualFiles, VIRTUAL_FILE_COMPARATOR); - - model.ensureCapacity(model.size() + virtualFiles.length + 1); - ThemeFilter filter = thumbnailView.getFilter(); - TagFilter[] tagFilters = thumbnailView.getTagFilters(); - for (VirtualFile virtualFile : virtualFiles) { - if (filter == null || filter.accepts(virtualFile)) { - if (tagFilters == null || Arrays.stream(tagFilters).anyMatch( tagFilter -> tagFilter.accepts(virtualFile))) { - model.addElement(virtualFile); - } - } - } - if (model.size() > 0) { - list.setSelectedIndex(0); - } - } else { - thumbnailView.setVisible(false); - } - } - } - - public boolean isTransparencyChessboardVisible() { - createUI(); - return cellRenderer.getImageComponent().isTransparencyChessboardVisible(); - } - - public void setTransparencyChessboardVisible(boolean visible) { - createUI(); - cellRenderer.getImageComponent().setTransparencyChessboardVisible(visible); - list.repaint(); - } - - public void setFileNameVisible(boolean visible) { - createUI(); - cellRenderer.getImageComponent().setFileNameVisible(visible); - list.repaint(); - } - - public boolean isFileNameVisible() { - createUI(); - return cellRenderer.getImageComponent().isFileNameVisible(); - } - - public void setFileSizeVisible(boolean visible) { - createUI(); - cellRenderer.getImageComponent().setFileSizeVisible(visible); - list.repaint(); - } - - public boolean isFileSizeVisible() { - createUI(); - return cellRenderer.getImageComponent().isFileSizeVisible(); - } - - public void setSelected(VirtualFile file, boolean selected) { - createUI(); - list.setSelectedValue(file, false); - } - - public void scrollToSelection() { - int minSelectionIndex = list.getMinSelectionIndex(); - int maxSelectionIndex = list.getMaxSelectionIndex(); - if (minSelectionIndex != -1 && maxSelectionIndex != -1) { - list.scrollRectToVisible(list.getCellBounds(minSelectionIndex, maxSelectionIndex)); - } - } - - public boolean isSelected(VirtualFile file) { - int index = ((DefaultListModel) list.getModel()).indexOf(file); - return index != -1 && list.isSelectedIndex(index); - } - - public VirtualFile @NotNull [] getSelection() { - if (list != null) { - Object[] selectedValues = list.getSelectedValues(); - if (selectedValues != null) { - VirtualFile[] files = new VirtualFile[selectedValues.length]; - for (int i = 0; i < selectedValues.length; i++) { - files[i] = (VirtualFile) selectedValues[i]; - } - return files; - } - } - return VirtualFile.EMPTY_ARRAY; - } - - private final class ThumbnailListCellRenderer extends ThumbnailComponent - implements ListCellRenderer { - private final ImageFileTypeManager typeManager = ImageFileTypeManager.getInstance(); - - @Override - public Component getListCellRendererComponent( - JList list, Object value, int index, boolean isSelected, boolean cellHasFocus - ) { - if (value instanceof VirtualFile file) { - setFileName(file.getName()); - String toolTipText = IfsUtil.getReferencePath(thumbnailView.getProject(), file); - if (!isFileSizeVisible()) { - String description = getImageComponent().getDescription(); - if (description != null) { - toolTipText += " [" + description + "]"; - } - } - setToolTipText(toolTipText); - setDirectory(file.isDirectory()); - if (file.isDirectory()) { - int imagesCount = 0; - VirtualFile[] children = file.getChildren(); - for (VirtualFile child : children) { - if (typeManager.isImage(child)) { - imagesCount++; - if (imagesCount > 100) { - break; - } - } - } - setImagesCount(imagesCount); - } else { - // File rendering - setFileSize(file.getLength()); - try { - ImageComponent imageComponent = getImageComponent(); - BufferedImage image = IfsUtil.getImage(file, imageComponent); - imageComponent.getDocument().setValue(image); - setFormat(IfsUtil.getFormat(file)); - } catch (Exception e) { - // Ignore - ImageComponent imageComponent = getImageComponent(); - imageComponent.getDocument().setValue((BufferedImage)null); - } - } - - } else { - ImageComponent imageComponent = getImageComponent(); - imageComponent.getDocument().setValue((BufferedImage)null); - setFileName(null); - setFileSize(0); - setToolTipText(null); - } - - if (isSelected) { - setForeground(list.getSelectionForeground()); - setBackground(list.getSelectionBackground()); - } else { - setForeground(list.getForeground()); - setBackground(list.getBackground()); - } - - return this; - } - - } - - private Set findFiles(VirtualFile[] roots) { - Set files = new HashSet<>(); - for (VirtualFile root : roots) { - files.addAll(findFiles(root)); - } - return files; - } - - private Set findFiles(VirtualFile file) { - Set files = new HashSet<>(0); - Project project = thumbnailView.getProject(); - if (!project.isDisposed()) { - ProjectRootManager rootManager = ProjectRootManager.getInstance(project); - boolean projectIgnored = rootManager.getFileIndex().isExcluded(file); - - if (!projectIgnored && !FileTypeManager.getInstance().isFileIgnored(file)) { - ImageFileTypeManager typeManager = ImageFileTypeManager.getInstance(); - if (file.isDirectory()) { - if (thumbnailView.isRecursive()) { - files.addAll(findFiles(file.getChildren())); - } else if (isImagesInDirectory(file)) { - files.add(file); - } - } else if (typeManager.isImage(file)) { - files.add(file); - } - } - } - return files; - } - - private static boolean isImagesInDirectory(VirtualFile dir) { - ImageFileTypeManager typeManager = ImageFileTypeManager.getInstance(); - VirtualFile[] files = dir.getChildren(); - for (VirtualFile file : files) { - if (file.isDirectory()) { - // We can be sure for fast searching - return true; - } - if (typeManager.isImage(file)) { - return true; - } - } - return false; - } - - private final class ThumbnailsMouseAdapter extends MouseAdapter implements MouseMotionListener { - @Override - public void mouseDragged(MouseEvent e) { - Point point = e.getPoint(); - int index = list.locationToIndex(point); - if (index != -1) { - Rectangle cellBounds = list.getCellBounds(index, index); - if (!cellBounds.contains(point) && - (KeyEvent.CTRL_DOWN_MASK & e.getModifiersEx()) != KeyEvent.CTRL_DOWN_MASK) { - list.clearSelection(); - e.consume(); - } - } - } - - @Override - public void mouseMoved(MouseEvent e) { - } - - - @Override - public void mousePressed(MouseEvent e) { - Point point = e.getPoint(); - int index = list.locationToIndex(point); - if (index != -1) { - Rectangle cellBounds = list.getCellBounds(index, index); - if (!cellBounds.contains(point) && (KeyEvent.CTRL_DOWN_MASK & e.getModifiersEx()) != KeyEvent.CTRL_DOWN_MASK) { - list.clearSelection(); - e.consume(); - } - } - } - - @Override - public void mouseClicked(MouseEvent e) { - Point point = e.getPoint(); - int index = list.locationToIndex(point); - if (index != -1) { - Rectangle cellBounds = list.getCellBounds(index, index); - if (!cellBounds.contains(point) && (KeyEvent.CTRL_DOWN_MASK & e.getModifiersEx()) != KeyEvent.CTRL_DOWN_MASK) { - index = -1; - list.clearSelection(); - } - } - if (index != -1) { - if (MouseEvent.BUTTON1 == e.getButton() && e.getClickCount() == 2) { - // Double click - list.setSelectedIndex(index); - VirtualFile selected = (VirtualFile) list.getSelectedValue(); - if (selected != null) { - if (selected.isDirectory()) { - thumbnailView.setRoot(selected); - } else { - FileEditorManager fileEditorManager = FileEditorManager.getInstance(thumbnailView.getProject()); - fileEditorManager.openFile(selected, true); - } - e.consume(); - } - } - if (MouseEvent.BUTTON3 == e.getButton() && e.getClickCount() == 1) { - // Ensure that we have selection - if ((KeyEvent.CTRL_DOWN_MASK & e.getModifiersEx()) != KeyEvent.CTRL_DOWN_MASK) { - // Ctrl is not pressed - list.setSelectedIndex(index); - } else { - // Ctrl is pressed - list.getSelectionModel().addSelectionInterval(index, index); - } - // Single right click - ActionManager actionManager = ActionManager.getInstance(); - ActionGroup actionGroup = (ActionGroup) actionManager.getAction(ThumbnailViewActions.GROUP_POPUP); - ActionPopupMenu menu = actionManager.createActionPopupMenu(ThumbnailViewActions.ACTION_PLACE, actionGroup); - JPopupMenu popupMenu = menu.getComponent(); - popupMenu.pack(); - JBPopupMenu.showByEvent(e, popupMenu); - e.consume(); - } - } - } - } - - @Override - @Nullable - public Object getData(@NotNull String dataId) { - if (CommonDataKeys.PROJECT.is(dataId)) { - return thumbnailView.getProject(); - } else if (CommonDataKeys.VIRTUAL_FILE.is(dataId)) { - VirtualFile[] selectedFiles = getSelectedFiles(); - return selectedFiles.length > 0 ? selectedFiles[0] : null; - } else if (CommonDataKeys.VIRTUAL_FILE_ARRAY.is(dataId)) { - return getSelectedFiles(); - } else if (CommonDataKeys.PSI_FILE.is(dataId)) { - return getData(CommonDataKeys.PSI_ELEMENT.getName()); - } else if (CommonDataKeys.PSI_ELEMENT.is(dataId)) { - VirtualFile[] selectedFiles = getSelectedFiles(); - return selectedFiles.length > 0 ? PsiManager.getInstance(thumbnailView.getProject()).findFile(selectedFiles[0]) : null; - } else if (LangDataKeys.PSI_ELEMENT_ARRAY.is(dataId)) { - return getSelectedElements(); - } else if (CommonDataKeys.NAVIGATABLE.is(dataId)) { - VirtualFile[] selectedFiles = getSelectedFiles(); - return new ThumbnailNavigatable(selectedFiles.length > 0 ? selectedFiles[0] : null); - } else if (PlatformDataKeys.COPY_PROVIDER.is(dataId)) { - return copyPasteSupport.getCopyProvider(); - } else if (PlatformDataKeys.CUT_PROVIDER.is(dataId)) { - return copyPasteSupport.getCutProvider(); - } else if (PlatformDataKeys.PASTE_PROVIDER.is(dataId)) { - return copyPasteSupport.getPasteProvider(); - } else if (PlatformDataKeys.DELETE_ELEMENT_PROVIDER.is(dataId)) { - return deleteProvider; - } else if (CommonDataKeys.NAVIGATABLE_ARRAY.is(dataId)) { - VirtualFile[] selectedFiles = getSelectedFiles(); - Set navigatables = new HashSet<>(selectedFiles.length); - for (VirtualFile selectedFile : selectedFiles) { - if (!selectedFile.isDirectory()) { - navigatables.add(new ThumbnailNavigatable(selectedFile)); - } - } - return navigatables.toArray(EMPTY_NAVIGATABLE_ARRAY); - } else if (ThumbnailView.DATA_KEY.is(dataId)) { - return thumbnailView; - } else if (ImageComponentDecorator.DATA_KEY.is(dataId)) { - return thumbnailView; - } - - return null; - } - - - private PsiElement @NotNull [] getSelectedElements() { - VirtualFile[] selectedFiles = getSelectedFiles(); - Set psiElements = new HashSet<>(selectedFiles.length); - PsiManager psiManager = PsiManager.getInstance(thumbnailView.getProject()); - for (VirtualFile file : selectedFiles) { - PsiFile psiFile = psiManager.findFile(file); - PsiElement element = psiFile != null ? psiFile : psiManager.findDirectory(file); - if (element != null) { - psiElements.add(element); - } - } - return PsiUtilCore.toPsiElementArray(psiElements); - } - - private VirtualFile @NotNull [] getSelectedFiles() { - if (list != null) { - Object[] selectedValues = list.getSelectedValues(); - if (selectedValues != null) { - VirtualFile[] files = new VirtualFile[selectedValues.length]; - for (int i = 0; i < selectedValues.length; i++) { - files[i] = (VirtualFile) selectedValues[i]; - } - return files; - } - } - return VirtualFile.EMPTY_ARRAY; - } - - @Override - public void dispose() { - removeAll(); - - list = null; - cellRenderer = null; - tagsPanel = null; - } - - private final class ThumbnailNavigatable implements Navigatable { - private final VirtualFile file; - - ThumbnailNavigatable(VirtualFile file) { - this.file = file; - } - - @Override - public void navigate(boolean requestFocus) { - if (file != null) { - FileEditorManager manager = FileEditorManager.getInstance(thumbnailView.getProject()); - manager.openFile(file, true); - } - } - - @Override - public boolean canNavigate() { - return file != null; - } - - @Override - public boolean canNavigateToSource() { - return file != null; - } - } - - private final class VFSListener implements VirtualFileListener { - @Override - public void contentsChanged(@NotNull VirtualFileEvent event) { - VirtualFile file = event.getFile(); - if (list != null) { - int index = ((DefaultListModel) list.getModel()).indexOf(file); - if (index != -1) { - Rectangle cellBounds = list.getCellBounds(index, index); - list.repaint(cellBounds); - } - } - } - - @Override - public void fileDeleted(@NotNull VirtualFileEvent event) { - VirtualFile file = event.getFile(); - VirtualFile root = thumbnailView.getRoot(); - if (root != null && VfsUtilCore.isAncestor(file, root, false)) { - refresh(); - } - if (list != null) { - ((DefaultListModel) list.getModel()).removeElement(file); - } - } - - @Override - public void propertyChanged(@NotNull VirtualFilePropertyEvent event) { - refresh(); - } - - @Override - public void fileCreated(@NotNull VirtualFileEvent event) { - refresh(); - } - - @Override - public void fileMoved(@NotNull VirtualFileMoveEvent event) { - refresh(); - } - } - - private final class OptionsChangeListener implements PropertyChangeListener { - @Override - public void propertyChange(PropertyChangeEvent evt) { - Options options = (Options) evt.getSource(); - EditorOptions editorOptions = options.getEditorOptions(); - TransparencyChessboardOptions chessboardOptions = editorOptions.getTransparencyChessboardOptions(); - GridOptions gridOptions = editorOptions.getGridOptions(); - - ImageComponent imageComponent = cellRenderer.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()); - } - } - - private class FocusRequester extends MouseAdapter { - @Override - public void mouseClicked(MouseEvent e) { - IdeFocusManager.getGlobalInstance().doWhenFocusSettlesDown(() -> IdeFocusManager.getGlobalInstance().requestFocus(ThumbnailViewUI.this, true)); - } - } - - public class AddTagGroup extends ActionGroup { - public AddTagGroup() { - setPopup(true); + } + else { + ImageComponent imageComponent = getImageComponent(); + imageComponent.getDocument().setValue((BufferedImage)null); + setFileName(null); + setFileSize(0); + setToolTipText(null); } - @Override - public AnAction @NotNull [] getChildren(@Nullable AnActionEvent e) { - if (e == null) return EMPTY_ARRAY; - Project project = e.getProject(); - ImageTagManager tagManager = ImageTagManager.getInstance(project); - List tags = tagManager.getAllTags(); - int tagsNumber = tags.size(); - AnAction[] actions = new AnAction[tagsNumber + 1]; - for (int i = 0; i < tagsNumber; i++) { - String tag = tags.get(i); - actions[i] = new AnAction(tag) { - @Override - public void actionPerformed(@NotNull AnActionEvent e) { - for (VirtualFile file : thumbnailView.getSelection()) { - tagManager.addTag(tag, file); - } + if (isSelected) { + setForeground(list.getSelectionForeground()); + setBackground(list.getSelectionBackground()); + } + else { + setForeground(list.getForeground()); + setBackground(list.getBackground()); + } - updateTagsPreviewModel(); - } + return this; + } + } - @Override - public void update(@NotNull AnActionEvent e) { - e.getPresentation().setEnabledAndVisible(!ContainerUtil.exists(thumbnailView.getSelection(), file -> tagManager.hasTag(tag, file))); - } + private Set findFiles(VirtualFile[] roots) { + Set files = new HashSet<>(); + for (VirtualFile root : roots) { + files.addAll(findFiles(root)); + } + return files; + } - @Override - public @NotNull ActionUpdateThread getActionUpdateThread() { - return ActionUpdateThread.EDT; - } - }; + private Set findFiles(VirtualFile file) { + Set files = new HashSet<>(0); + Project project = thumbnailView.getProject(); + if (!project.isDisposed()) { + ProjectRootManager rootManager = ProjectRootManager.getInstance(project); + boolean projectIgnored = rootManager.getFileIndex().isExcluded(file); + + if (!projectIgnored && !FileTypeManager.getInstance().isFileIgnored(file)) { + ImageFileTypeManager typeManager = ImageFileTypeManager.getInstance(); + if (file.isDirectory()) { + if (thumbnailView.isRecursive()) { + files.addAll(findFiles(file.getChildren())); + } + else if (isImagesInDirectory(file)) { + files.add(file); + } } - actions[tagsNumber] = new AnAction(IdeBundle.messagePointer("action.Anonymous.text.new.tag")) { + else if (typeManager.isImage(file)) { + files.add(file); + } + } + } + return files; + } + + private static boolean isImagesInDirectory(VirtualFile dir) { + ImageFileTypeManager typeManager = ImageFileTypeManager.getInstance(); + VirtualFile[] files = dir.getChildren(); + for (VirtualFile file : files) { + if (file.isDirectory()) { + // We can be sure for fast searching + return true; + } + if (typeManager.isImage(file)) { + return true; + } + } + return false; + } + + private final class ThumbnailsMouseAdapter extends MouseAdapter implements MouseMotionListener { + @Override + public void mouseDragged(MouseEvent e) { + Point point = e.getPoint(); + int index = list.locationToIndex(point); + if (index != -1) { + Rectangle cellBounds = list.getCellBounds(index, index); + if (!cellBounds.contains(point) && + (KeyEvent.CTRL_DOWN_MASK & e.getModifiersEx()) != KeyEvent.CTRL_DOWN_MASK) { + list.clearSelection(); + e.consume(); + } + } + } + + @Override + public void mouseMoved(MouseEvent e) { + } + + + @Override + public void mousePressed(MouseEvent e) { + Point point = e.getPoint(); + int index = list.locationToIndex(point); + if (index != -1) { + Rectangle cellBounds = list.getCellBounds(index, index); + if (!cellBounds.contains(point) && (KeyEvent.CTRL_DOWN_MASK & e.getModifiersEx()) != KeyEvent.CTRL_DOWN_MASK) { + list.clearSelection(); + e.consume(); + } + } + } + + @Override + public void mouseClicked(MouseEvent e) { + Point point = e.getPoint(); + int index = list.locationToIndex(point); + if (index != -1) { + Rectangle cellBounds = list.getCellBounds(index, index); + if (!cellBounds.contains(point) && (KeyEvent.CTRL_DOWN_MASK & e.getModifiersEx()) != KeyEvent.CTRL_DOWN_MASK) { + index = -1; + list.clearSelection(); + } + } + if (index != -1) { + if (MouseEvent.BUTTON1 == e.getButton() && e.getClickCount() == 2) { + // Double click + list.setSelectedIndex(index); + VirtualFile selected = (VirtualFile)list.getSelectedValue(); + if (selected != null) { + if (selected.isDirectory()) { + thumbnailView.setRoot(selected); + } + else { + FileEditorManager fileEditorManager = FileEditorManager.getInstance(thumbnailView.getProject()); + fileEditorManager.openFile(selected, true); + } + e.consume(); + } + } + if (MouseEvent.BUTTON3 == e.getButton() && e.getClickCount() == 1) { + // Ensure that we have selection + if ((KeyEvent.CTRL_DOWN_MASK & e.getModifiersEx()) != KeyEvent.CTRL_DOWN_MASK) { + // Ctrl is not pressed + list.setSelectedIndex(index); + } + else { + // Ctrl is pressed + list.getSelectionModel().addSelectionInterval(index, index); + } + // Single right click + ActionManager actionManager = ActionManager.getInstance(); + ActionGroup actionGroup = (ActionGroup)actionManager.getAction(ThumbnailViewActions.GROUP_POPUP); + ActionPopupMenu menu = actionManager.createActionPopupMenu(ThumbnailViewActions.ACTION_PLACE, actionGroup); + JPopupMenu popupMenu = menu.getComponent(); + popupMenu.pack(); + JBPopupMenu.showByEvent(e, popupMenu); + e.consume(); + } + } + } + } + + @Override + @Nullable + public Object getData(@NotNull String dataId) { + if (CommonDataKeys.PROJECT.is(dataId)) { + return thumbnailView.getProject(); + } + else if (CommonDataKeys.VIRTUAL_FILE.is(dataId)) { + VirtualFile[] selectedFiles = getSelectedFiles(); + return selectedFiles.length > 0 ? selectedFiles[0] : null; + } + else if (CommonDataKeys.VIRTUAL_FILE_ARRAY.is(dataId)) { + return getSelectedFiles(); + } + else if (CommonDataKeys.PSI_FILE.is(dataId)) { + return getData(CommonDataKeys.PSI_ELEMENT.getName()); + } + else if (CommonDataKeys.PSI_ELEMENT.is(dataId)) { + VirtualFile[] selectedFiles = getSelectedFiles(); + return selectedFiles.length > 0 ? PsiManager.getInstance(thumbnailView.getProject()).findFile(selectedFiles[0]) : null; + } + else if (LangDataKeys.PSI_ELEMENT_ARRAY.is(dataId)) { + return getSelectedElements(); + } + else if (CommonDataKeys.NAVIGATABLE.is(dataId)) { + VirtualFile[] selectedFiles = getSelectedFiles(); + return new ThumbnailNavigatable(selectedFiles.length > 0 ? selectedFiles[0] : null); + } + else if (PlatformDataKeys.COPY_PROVIDER.is(dataId)) { + return copyPasteSupport.getCopyProvider(); + } + else if (PlatformDataKeys.CUT_PROVIDER.is(dataId)) { + return copyPasteSupport.getCutProvider(); + } + else if (PlatformDataKeys.PASTE_PROVIDER.is(dataId)) { + return copyPasteSupport.getPasteProvider(); + } + else if (PlatformDataKeys.DELETE_ELEMENT_PROVIDER.is(dataId)) { + return deleteProvider; + } + else if (CommonDataKeys.NAVIGATABLE_ARRAY.is(dataId)) { + VirtualFile[] selectedFiles = getSelectedFiles(); + Set navigatables = new HashSet<>(selectedFiles.length); + for (VirtualFile selectedFile : selectedFiles) { + if (!selectedFile.isDirectory()) { + navigatables.add(new ThumbnailNavigatable(selectedFile)); + } + } + return navigatables.toArray(EMPTY_NAVIGATABLE_ARRAY); + } + else if (ThumbnailView.DATA_KEY.is(dataId)) { + return thumbnailView; + } + else if (ImageComponentDecorator.DATA_KEY.is(dataId)) { + return thumbnailView; + } + + return null; + } + + + private PsiElement @NotNull [] getSelectedElements() { + VirtualFile[] selectedFiles = getSelectedFiles(); + Set psiElements = new HashSet<>(selectedFiles.length); + PsiManager psiManager = PsiManager.getInstance(thumbnailView.getProject()); + for (VirtualFile file : selectedFiles) { + PsiFile psiFile = psiManager.findFile(file); + PsiElement element = psiFile != null ? psiFile : psiManager.findDirectory(file); + if (element != null) { + psiElements.add(element); + } + } + return PsiUtilCore.toPsiElementArray(psiElements); + } + + private VirtualFile @NotNull [] getSelectedFiles() { + if (list != null) { + Object[] selectedValues = list.getSelectedValues(); + if (selectedValues != null) { + VirtualFile[] files = new VirtualFile[selectedValues.length]; + for (int i = 0; i < selectedValues.length; i++) { + files[i] = (VirtualFile)selectedValues[i]; + } + return files; + } + } + return VirtualFile.EMPTY_ARRAY; + } + + @Override + public void dispose() { + removeAll(); + + list = null; + cellRenderer = null; + tagsPanel = null; + } + + private final class ThumbnailNavigatable implements Navigatable { + private final VirtualFile file; + + ThumbnailNavigatable(VirtualFile file) { + this.file = file; + } + + @Override + public void navigate(boolean requestFocus) { + if (file != null) { + FileEditorManager manager = FileEditorManager.getInstance(thumbnailView.getProject()); + manager.openFile(file, true); + } + } + + @Override + public boolean canNavigate() { + return file != null; + } + + @Override + public boolean canNavigateToSource() { + return file != null; + } + } + + private final class VFSListener implements VirtualFileListener { + @Override + public void contentsChanged(@NotNull VirtualFileEvent event) { + VirtualFile file = event.getFile(); + if (list != null) { + int index = ((DefaultListModel)list.getModel()).indexOf(file); + if (index != -1) { + Rectangle cellBounds = list.getCellBounds(index, index); + list.repaint(cellBounds); + } + } + } + + @Override + public void fileDeleted(@NotNull VirtualFileEvent event) { + VirtualFile file = event.getFile(); + VirtualFile root = thumbnailView.getRoot(); + if (root != null && VfsUtilCore.isAncestor(file, root, false)) { + refresh(); + } + if (list != null) { + ((DefaultListModel)list.getModel()).removeElement(file); + } + } + + @Override + public void propertyChanged(@NotNull VirtualFilePropertyEvent event) { + refresh(); + } + + @Override + public void fileCreated(@NotNull VirtualFileEvent event) { + refresh(); + } + + @Override + public void fileMoved(@NotNull VirtualFileMoveEvent event) { + refresh(); + } + } + + private final class OptionsChangeListener implements PropertyChangeListener { + @Override + public void propertyChange(PropertyChangeEvent evt) { + Options options = (Options)evt.getSource(); + EditorOptions editorOptions = options.getEditorOptions(); + TransparencyChessboardOptions chessboardOptions = editorOptions.getTransparencyChessboardOptions(); + GridOptions gridOptions = editorOptions.getGridOptions(); + + ImageComponent imageComponent = cellRenderer.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()); + } + } + + private class FocusRequester extends MouseAdapter { + @Override + public void mouseClicked(MouseEvent e) { + IdeFocusManager.getGlobalInstance() + .doWhenFocusSettlesDown(() -> IdeFocusManager.getGlobalInstance().requestFocus(ThumbnailViewUI.this, true)); + } + } + + public class AddTagGroup extends ActionGroup { + public AddTagGroup() { + setPopup(true); + } + + @Override + public AnAction @NotNull [] getChildren(@Nullable AnActionEvent e) { + if (e == null) return EMPTY_ARRAY; + Project project = e.getProject(); + ImageTagManager tagManager = ImageTagManager.getInstance(project); + List tags = tagManager.getAllTags(); + int tagsNumber = tags.size(); + AnAction[] actions = new AnAction[tagsNumber + 1]; + for (int i = 0; i < tagsNumber; i++) { + String tag = tags.get(i); + actions[i] = new AnAction(tag) { @Override public void actionPerformed(@NotNull AnActionEvent e) { - ThumbnailView view = ThumbnailViewActionUtil.getVisibleThumbnailView(e); - if (view != null) { - VirtualFile[] selection = view.getSelection(); - if (selection.length > 0) { - String tag = Messages.showInputDialog("", IdeBundle.message("dialog.title.new.tag.name"), null); - if (tag != null) { - for (VirtualFile file : selection) { - tagManager.addTag(tag, file); - } + for (VirtualFile file : thumbnailView.getSelection()) { + tagManager.addTag(tag, file); + } + + updateTagsPreviewModel(); + } + + @Override + public void update(@NotNull AnActionEvent e) { + e.getPresentation() + .setEnabledAndVisible(!ContainerUtil.exists(thumbnailView.getSelection(), file -> tagManager.hasTag(tag, file))); + } + + @Override + public @NotNull ActionUpdateThread getActionUpdateThread() { + return ActionUpdateThread.EDT; + } + }; + } + actions[tagsNumber] = new AnAction(IdeBundle.messagePointer("action.Anonymous.text.new.tag")) { + @Override + public void actionPerformed(@NotNull AnActionEvent e) { + ThumbnailView view = ThumbnailViewActionUtil.getVisibleThumbnailView(e); + if (view != null) { + VirtualFile[] selection = view.getSelection(); + if (selection.length > 0) { + String tag = Messages.showInputDialog("", IdeBundle.message("dialog.title.new.tag.name"), null); + if (tag != null) { + for (VirtualFile file : selection) { + tagManager.addTag(tag, file); } } } } - }; + } + }; - return actions; - } + return actions; } + } } diff --git a/images/src/org/intellij/images/ui/ImageComponent.java b/images/src/org/intellij/images/ui/ImageComponent.java index 29dd7614be1b..50f4606ef8ba 100644 --- a/images/src/org/intellij/images/ui/ImageComponent.java +++ b/images/src/org/intellij/images/ui/ImageComponent.java @@ -32,393 +32,394 @@ import static com.intellij.ui.scale.ScaleType.OBJ_SCALE; * @author Alexey Efimov */ public class ImageComponent extends JComponent { - public static final int IMAGE_INSETS = 2; + public static final int IMAGE_INSETS = 2; - @NonNls - public static final String TRANSPARENCY_CHESSBOARD_CELL_SIZE_PROP = "TransparencyChessboard.cellSize"; - @NonNls - public static final String TRANSPARENCY_CHESSBOARD_WHITE_COLOR_PROP = "TransparencyChessboard.whiteColor"; - @NonNls - public static final String TRANSPARENCY_CHESSBOARD_BLACK_COLOR_PROP = "TransparencyChessboard.blackColor"; - @NonNls - private static final String TRANSPARENCY_CHESSBOARD_VISIBLE_PROP = "TransparencyChessboard.visible"; - @NonNls - private static final String GRID_LINE_ZOOM_FACTOR_PROP = "Grid.lineZoomFactor"; - @NonNls - private static final String GRID_LINE_SPAN_PROP = "Grid.lineSpan"; - @NonNls - private static final String GRID_LINE_COLOR_PROP = "Grid.lineColor"; - @NonNls - private static final String GRID_VISIBLE_PROP = "Grid.visible"; - @NonNls - private static final String FILE_SIZE_VISIBLE_PROP = "FileSize.visible"; - @NonNls - private static final String FILE_NAME_VISIBLE_PROP = "FileName.visible"; + @NonNls + public static final String TRANSPARENCY_CHESSBOARD_CELL_SIZE_PROP = "TransparencyChessboard.cellSize"; + @NonNls + public static final String TRANSPARENCY_CHESSBOARD_WHITE_COLOR_PROP = "TransparencyChessboard.whiteColor"; + @NonNls + public static final String TRANSPARENCY_CHESSBOARD_BLACK_COLOR_PROP = "TransparencyChessboard.blackColor"; + @NonNls + private static final String TRANSPARENCY_CHESSBOARD_VISIBLE_PROP = "TransparencyChessboard.visible"; + @NonNls + private static final String GRID_LINE_ZOOM_FACTOR_PROP = "Grid.lineZoomFactor"; + @NonNls + private static final String GRID_LINE_SPAN_PROP = "Grid.lineSpan"; + @NonNls + private static final String GRID_LINE_COLOR_PROP = "Grid.lineColor"; + @NonNls + private static final String GRID_VISIBLE_PROP = "Grid.visible"; + @NonNls + private static final String FILE_SIZE_VISIBLE_PROP = "FileSize.visible"; + @NonNls + private static final String FILE_NAME_VISIBLE_PROP = "FileName.visible"; - /** - * @see #getUIClassID - * @see #readObject - */ - @NonNls - private static final String uiClassID = "ImageComponentUI"; + /** + * @see #getUIClassID + * @see #readObject + */ + @NonNls + private static final String uiClassID = "ImageComponentUI"; - private final ImageDocument document = new ImageDocumentImpl(this); - private final Grid grid = new Grid(); - private final Chessboard chessboard = new Chessboard(); - private boolean myFileSizeVisible = true; - private boolean myFileNameVisible = true; - private double zoomFactor = 1d; - private boolean myBorderVisible = true; + private final ImageDocument document = new ImageDocumentImpl(this); + private final Grid grid = new Grid(); + private final Chessboard chessboard = new Chessboard(); + private boolean myFileSizeVisible = true; + private boolean myFileNameVisible = true; + private double zoomFactor = 1d; + private boolean myBorderVisible = true; - public ImageComponent() { - updateUI(); + public ImageComponent() { + updateUI(); + } + + public ImageDocument getDocument() { + return document; + } + + public double getZoomFactor() { + return zoomFactor; + } + + public void setZoomFactor(double zoomFactor) { + this.zoomFactor = zoomFactor; + } + + public void setTransparencyChessboardCellSize(int cellSize) { + int oldValue = chessboard.getCellSize(); + if (oldValue != cellSize) { + chessboard.setCellSize(cellSize); + firePropertyChange(TRANSPARENCY_CHESSBOARD_CELL_SIZE_PROP, oldValue, cellSize); } + } - public ImageDocument getDocument() { - return document; + public void setTransparencyChessboardWhiteColor(Color color) { + Color oldValue = chessboard.getWhiteColor(); + if (oldValue != null && !oldValue.equals(color) || oldValue == null && color != null) { + chessboard.setWhiteColor(color); + firePropertyChange(TRANSPARENCY_CHESSBOARD_WHITE_COLOR_PROP, oldValue, color); } + } - public double getZoomFactor() { - return zoomFactor; + public void setTransparencyChessboardBlankColor(Color color) { + Color oldValue = chessboard.getBlackColor(); + if (oldValue != null && !oldValue.equals(color) || oldValue == null && color != null) { + chessboard.setBlackColor(color); + firePropertyChange(TRANSPARENCY_CHESSBOARD_BLACK_COLOR_PROP, oldValue, color); } + } - public void setZoomFactor(double zoomFactor) { - this.zoomFactor = zoomFactor; + public void setTransparencyChessboardVisible(boolean visible) { + boolean oldValue = chessboard.isVisible(); + if (oldValue != visible) { + chessboard.setVisible(visible); + firePropertyChange(TRANSPARENCY_CHESSBOARD_VISIBLE_PROP, oldValue, visible); } + } - public void setTransparencyChessboardCellSize(int cellSize) { - int oldValue = chessboard.getCellSize(); - if (oldValue != cellSize) { - chessboard.setCellSize(cellSize); - firePropertyChange(TRANSPARENCY_CHESSBOARD_CELL_SIZE_PROP, oldValue, cellSize); + public int getTransparencyChessboardCellSize() { + return chessboard.getCellSize(); + } + + public Color getTransparencyChessboardWhiteColor() { + return chessboard.getWhiteColor(); + } + + public Color getTransparencyChessboardBlackColor() { + return chessboard.getBlackColor(); + } + + public boolean isTransparencyChessboardVisible() { + return chessboard.isVisible(); + } + + public boolean isFileSizeVisible() { + return myFileSizeVisible; + } + + public void setFileSizeVisible(boolean fileSizeVisible) { + boolean oldValue = myFileSizeVisible; + myFileSizeVisible = fileSizeVisible; + firePropertyChange(FILE_SIZE_VISIBLE_PROP, oldValue, fileSizeVisible); + } + + public boolean isFileNameVisible() { + return myFileNameVisible; + } + + public void setFileNameVisible(boolean fileNameVisible) { + boolean oldValue = myFileNameVisible; + myFileNameVisible = fileNameVisible; + firePropertyChange(FILE_NAME_VISIBLE_PROP, oldValue, fileNameVisible); + } + + public boolean isBorderVisible() { + return myBorderVisible; + } + + public void setBorderVisible(boolean borderVisible) { + boolean oldValue = myBorderVisible; + myBorderVisible = borderVisible; + firePropertyChange("Border.visible", oldValue, myBorderVisible); + } + + public void setGridLineZoomFactor(int lineZoomFactor) { + int oldValue = grid.getLineZoomFactor(); + if (oldValue != lineZoomFactor) { + grid.setLineZoomFactor(lineZoomFactor); + firePropertyChange(GRID_LINE_ZOOM_FACTOR_PROP, oldValue, lineZoomFactor); + } + } + + public void setGridLineSpan(int lineSpan) { + int oldValue = grid.getLineSpan(); + if (oldValue != lineSpan) { + grid.setLineSpan(lineSpan); + firePropertyChange(GRID_LINE_SPAN_PROP, oldValue, lineSpan); + } + } + + public void setGridLineColor(Color color) { + Color oldValue = grid.getLineColor(); + if (oldValue != null && !oldValue.equals(color) || oldValue == null && color != null) { + grid.setLineColor(color); + firePropertyChange(GRID_LINE_COLOR_PROP, oldValue, color); + } + } + + public void setGridVisible(boolean visible) { + boolean oldValue = grid.isVisible(); + if (oldValue != visible) { + grid.setVisible(visible); + firePropertyChange(GRID_VISIBLE_PROP, oldValue, visible); + } + } + + public int getGridLineZoomFactor() { + return grid.getLineZoomFactor(); + } + + public int getGridLineSpan() { + return grid.getLineSpan(); + } + + public Color getGridLineColor() { + return grid.getLineColor(); + } + + public boolean isGridVisible() { + return grid.isVisible(); + } + + @Nullable + public String getDescription() { + BufferedImage image = getDocument().getValue(); + if (image != null) { + return ImagesBundle.message("icon.dimensions", image.getWidth(), image.getHeight(), image.getColorModel().getPixelSize()); + } + return null; + } + + public void setCanvasSize(int width, int height) { + setSize(width + IMAGE_INSETS * 2, height + IMAGE_INSETS * 2); + } + + public void setCanvasSize(Dimension dimension) { + setCanvasSize(dimension.width, dimension.height); + } + + public Dimension getCanvasSize() { + Dimension size = getSize(); + return new Dimension(size.width - IMAGE_INSETS * 2, size.height - IMAGE_INSETS * 2); + } + + @Override + public String getUIClassID() { + return uiClassID; + } + + @Override + public void updateUI() { + boolean customUI = UIManager.getDefaults().get(uiClassID) != null; + setUI(customUI ? UIManager.getUI(this) : new ImageComponentUI(this)); + } + + private static class ImageDocumentImpl implements ImageDocument { + private final List listeners = ContainerUtil.createLockFreeCopyOnWriteList(); + private CachedScaledImageProvider imageProvider; + private String format; + private Image renderer; + private final Component myComponent; + private final ScaleContextCache cachedBounds = new ScaleContextCache<>((ctx) -> { + BufferedImage image = getValue(ctx.getScale(OBJ_SCALE)); + return image != null ? new Rectangle(image.getWidth(), image.getHeight()) : null; + }); + + ImageDocumentImpl(Component component) { + myComponent = component; + myComponent.addPropertyChangeListener(new PropertyChangeListener() { + @Override + public void propertyChange(PropertyChangeEvent e) { + if (e.getPropertyName().equals("ancestor") && e.getNewValue() == null && imageProvider != null) { + imageProvider.clearCache(); + } } + }); } - public void setTransparencyChessboardWhiteColor(Color color) { - Color oldValue = chessboard.getWhiteColor(); - if (oldValue != null && !oldValue.equals(color) || oldValue == null && color != null) { - chessboard.setWhiteColor(color); - firePropertyChange(TRANSPARENCY_CHESSBOARD_WHITE_COLOR_PROP, oldValue, color); - } + @Override + public Image getRenderer() { + return renderer; } - public void setTransparencyChessboardBlankColor(Color color) { - Color oldValue = chessboard.getBlackColor(); - if (oldValue != null && !oldValue.equals(color) || oldValue == null && color != null) { - chessboard.setBlackColor(color); - firePropertyChange(TRANSPARENCY_CHESSBOARD_BLACK_COLOR_PROP, oldValue, color); - } - } - - public void setTransparencyChessboardVisible(boolean visible) { - boolean oldValue = chessboard.isVisible(); - if (oldValue != visible) { - chessboard.setVisible(visible); - firePropertyChange(TRANSPARENCY_CHESSBOARD_VISIBLE_PROP, oldValue, visible); - } - } - - public int getTransparencyChessboardCellSize() { - return chessboard.getCellSize(); - } - - public Color getTransparencyChessboardWhiteColor() { - return chessboard.getWhiteColor(); - } - - public Color getTransparencyChessboardBlackColor() { - return chessboard.getBlackColor(); - } - - public boolean isTransparencyChessboardVisible() { - return chessboard.isVisible(); - } - - public boolean isFileSizeVisible() { - return myFileSizeVisible; - } - - public void setFileSizeVisible(boolean fileSizeVisible) { - boolean oldValue = myFileSizeVisible; - myFileSizeVisible = fileSizeVisible; - firePropertyChange(FILE_SIZE_VISIBLE_PROP, oldValue, fileSizeVisible); - } - - public boolean isFileNameVisible() { - return myFileNameVisible; - } - - public void setFileNameVisible(boolean fileNameVisible) { - boolean oldValue = myFileNameVisible; - myFileNameVisible = fileNameVisible; - firePropertyChange(FILE_NAME_VISIBLE_PROP, oldValue, fileNameVisible); - } - - public boolean isBorderVisible() { - return myBorderVisible; - } - - public void setBorderVisible(boolean borderVisible) { - boolean oldValue = myBorderVisible; - myBorderVisible = borderVisible; - firePropertyChange("Border.visible", oldValue, myBorderVisible); - } - - public void setGridLineZoomFactor(int lineZoomFactor) { - int oldValue = grid.getLineZoomFactor(); - if (oldValue != lineZoomFactor) { - grid.setLineZoomFactor(lineZoomFactor); - firePropertyChange(GRID_LINE_ZOOM_FACTOR_PROP, oldValue, lineZoomFactor); - } - } - - public void setGridLineSpan(int lineSpan) { - int oldValue = grid.getLineSpan(); - if (oldValue != lineSpan) { - grid.setLineSpan(lineSpan); - firePropertyChange(GRID_LINE_SPAN_PROP, oldValue, lineSpan); - } - } - - public void setGridLineColor(Color color) { - Color oldValue = grid.getLineColor(); - if (oldValue != null && !oldValue.equals(color) || oldValue == null && color != null) { - grid.setLineColor(color); - firePropertyChange(GRID_LINE_COLOR_PROP, oldValue, color); - } - } - - public void setGridVisible(boolean visible) { - boolean oldValue = grid.isVisible(); - if (oldValue != visible) { - grid.setVisible(visible); - firePropertyChange(GRID_VISIBLE_PROP, oldValue, visible); - } - } - - public int getGridLineZoomFactor() { - return grid.getLineZoomFactor(); - } - - public int getGridLineSpan() { - return grid.getLineSpan(); - } - - public Color getGridLineColor() { - return grid.getLineColor(); - } - - public boolean isGridVisible() { - return grid.isVisible(); + @Override + public Image getRenderer(double scale) { + return getValue(scale); } @Nullable - public String getDescription() { - BufferedImage image = getDocument().getValue(); - if (image != null) { - return ImagesBundle.message("icon.dimensions", image.getWidth(), image.getHeight(), image.getColorModel().getPixelSize()); - } - return null; - } - - public void setCanvasSize(int width, int height) { - setSize(width + IMAGE_INSETS * 2, height + IMAGE_INSETS * 2); - } - - public void setCanvasSize(Dimension dimension) { - setCanvasSize(dimension.width, dimension.height); - } - - public Dimension getCanvasSize() { - Dimension size = getSize(); - return new Dimension(size.width - IMAGE_INSETS * 2, size.height - IMAGE_INSETS * 2); + @Override + public Rectangle getBounds(double scale) { + ScaleContext ctx = ScaleContext.create(myComponent); + ctx.setScale(OBJ_SCALE.of(scale)); + return cachedBounds.getOrProvide(ctx); } @Override - public String getUIClassID() { - return uiClassID; + public BufferedImage getValue() { + return getValue(1d); } @Override - public void updateUI() { - boolean customUI = UIManager.getDefaults().get(uiClassID) != null; - setUI(customUI ? UIManager.getUI(this) : new ImageComponentUI(this)); + public BufferedImage getValue(double scale) { + return imageProvider != null ? imageProvider.apply(scale, myComponent) : null; } - private static class ImageDocumentImpl implements ImageDocument { - private final List listeners = ContainerUtil.createLockFreeCopyOnWriteList(); - private CachedScaledImageProvider imageProvider; - private String format; - private Image renderer; - private final Component myComponent; - private final ScaleContextCache cachedBounds = new ScaleContextCache<>((ctx) -> { - BufferedImage image = getValue(ctx.getScale(OBJ_SCALE)); - return image != null ? new Rectangle(image.getWidth(), image.getHeight()) : null; - }); - - ImageDocumentImpl(Component component) { - myComponent = component; - myComponent.addPropertyChangeListener(new PropertyChangeListener() { - @Override - public void propertyChange(PropertyChangeEvent e) { - if (e.getPropertyName().equals("ancestor") && e.getNewValue() == null && imageProvider != null) { - imageProvider.clearCache(); - } - } - }); - } - - @Override - public Image getRenderer() { - return renderer; - } - - @Override - public Image getRenderer(double scale) { - return getValue(scale); - } - - @Nullable - @Override - public Rectangle getBounds(double scale) { - ScaleContext ctx = ScaleContext.create(myComponent); - ctx.setScale(OBJ_SCALE.of(scale)); - return cachedBounds.getOrProvide(ctx); - } - - @Override - public BufferedImage getValue() { - return getValue(1d); - } - - @Override - public BufferedImage getValue(double scale) { - return imageProvider != null ? imageProvider.apply(scale, myComponent) : null; - } - - @Override - public void setValue(BufferedImage image) { - this.renderer = image != null ? Toolkit.getDefaultToolkit().createImage(image.getSource()) : null; - setValue(image != null ? (scale, anchor) -> image : null); - } - - @Override - public void setValue(ScaledImageProvider imageProvider) { - this.imageProvider = imageProvider instanceof CachedScaledImageProvider ? - (CachedScaledImageProvider)imageProvider : - imageProvider != null ? (zoom, ancestor) -> imageProvider.apply(zoom, ancestor) : - null; - - cachedBounds.clear(); - fireChangeEvent(new ChangeEvent(this)); - } - - @Override - public String getFormat() { - return format; - } - - - @Override - public void setFormat(String format) { - this.format = format; - fireChangeEvent(new ChangeEvent(this)); - } - - private void fireChangeEvent(ChangeEvent e) { - for (ChangeListener listener : listeners) { - listener.stateChanged(e); - } - } - - @Override - public void addChangeListener(ChangeListener listener) { - listeners.add(listener); - } - - @Override - public void removeChangeListener(ChangeListener listener) { - listeners.remove(listener); - } + @Override + public void setValue(BufferedImage image) { + this.renderer = image != null ? Toolkit.getDefaultToolkit().createImage(image.getSource()) : null; + setValue(image != null ? (scale, anchor) -> image : null); } - private static final class Chessboard { - private int cellSize = TransparencyChessboardOptions.DEFAULT_CELL_SIZE; - private Color whiteColor = TransparencyChessboardOptions.DEFAULT_WHITE_COLOR; - private Color blackColor = TransparencyChessboardOptions.DEFAULT_BLACK_COLOR; - private boolean visible = false; + @Override + public void setValue(ScaledImageProvider imageProvider) { + this.imageProvider = + imageProvider instanceof CachedScaledImageProvider ? + (CachedScaledImageProvider)imageProvider : + imageProvider != null ? (zoom, ancestor) -> imageProvider.apply(zoom, ancestor) : + null; - public int getCellSize() { - return cellSize; - } - - public void setCellSize(int cellSize) { - this.cellSize = cellSize; - } - - public Color getWhiteColor() { - return whiteColor; - } - - public void setWhiteColor(Color whiteColor) { - this.whiteColor = whiteColor; - } - - public Color getBlackColor() { - return blackColor; - } - - public void setBlackColor(Color blackColor) { - this.blackColor = blackColor; - } - - public boolean isVisible() { - return visible; - } - - public void setVisible(boolean visible) { - this.visible = visible; - } + cachedBounds.clear(); + fireChangeEvent(new ChangeEvent(this)); } - private static final class Grid { - private int lineZoomFactor = GridOptions.DEFAULT_LINE_ZOOM_FACTOR; - private int lineSpan = GridOptions.DEFAULT_LINE_SPAN; - private Color lineColor = GridOptions.DEFAULT_LINE_COLOR; - private boolean visible = false; - - public int getLineZoomFactor() { - return lineZoomFactor; - } - - public void setLineZoomFactor(int lineZoomFactor) { - this.lineZoomFactor = lineZoomFactor; - } - - public int getLineSpan() { - return lineSpan; - } - - public void setLineSpan(int lineSpan) { - this.lineSpan = lineSpan; - } - - public Color getLineColor() { - EditorColorsScheme editorScheme = EditorColorsManager.getInstance().getGlobalScheme(); - Color color = editorScheme.getColor(ImageEditorColorSchemeSettingsKt.getGRID_LINE_COLOR_KEY()); - return color != null ? color : JBColor.DARK_GRAY; - } - - public void setLineColor(Color lineColor) { - this.lineColor = lineColor; - } - - public boolean isVisible() { - return visible; - } - - public void setVisible(boolean visible) { - this.visible = visible; - } + @Override + public String getFormat() { + return format; } + + + @Override + public void setFormat(String format) { + this.format = format; + fireChangeEvent(new ChangeEvent(this)); + } + + private void fireChangeEvent(ChangeEvent e) { + for (ChangeListener listener : listeners) { + listener.stateChanged(e); + } + } + + @Override + public void addChangeListener(ChangeListener listener) { + listeners.add(listener); + } + + @Override + public void removeChangeListener(ChangeListener listener) { + listeners.remove(listener); + } + } + + private static final class Chessboard { + private int cellSize = TransparencyChessboardOptions.DEFAULT_CELL_SIZE; + private Color whiteColor = TransparencyChessboardOptions.DEFAULT_WHITE_COLOR; + private Color blackColor = TransparencyChessboardOptions.DEFAULT_BLACK_COLOR; + private boolean visible = false; + + public int getCellSize() { + return cellSize; + } + + public void setCellSize(int cellSize) { + this.cellSize = cellSize; + } + + public Color getWhiteColor() { + return whiteColor; + } + + public void setWhiteColor(Color whiteColor) { + this.whiteColor = whiteColor; + } + + public Color getBlackColor() { + return blackColor; + } + + public void setBlackColor(Color blackColor) { + this.blackColor = blackColor; + } + + public boolean isVisible() { + return visible; + } + + public void setVisible(boolean visible) { + this.visible = visible; + } + } + + private static final class Grid { + private int lineZoomFactor = GridOptions.DEFAULT_LINE_ZOOM_FACTOR; + private int lineSpan = GridOptions.DEFAULT_LINE_SPAN; + private Color lineColor = GridOptions.DEFAULT_LINE_COLOR; + private boolean visible = false; + + public int getLineZoomFactor() { + return lineZoomFactor; + } + + public void setLineZoomFactor(int lineZoomFactor) { + this.lineZoomFactor = lineZoomFactor; + } + + public int getLineSpan() { + return lineSpan; + } + + public void setLineSpan(int lineSpan) { + this.lineSpan = lineSpan; + } + + public Color getLineColor() { + EditorColorsScheme editorScheme = EditorColorsManager.getInstance().getGlobalScheme(); + Color color = editorScheme.getColor(ImageEditorColorSchemeSettingsKt.getGRID_LINE_COLOR_KEY()); + return color != null ? color : JBColor.DARK_GRAY; + } + + public void setLineColor(Color lineColor) { + this.lineColor = lineColor; + } + + public boolean isVisible() { + return visible; + } + + public void setVisible(boolean visible) { + this.visible = visible; + } + } } diff --git a/images/src/org/intellij/images/ui/ImageComponentUI.java b/images/src/org/intellij/images/ui/ImageComponentUI.java index c6bba26713cd..7dc40aece2c5 100644 --- a/images/src/org/intellij/images/ui/ImageComponentUI.java +++ b/images/src/org/intellij/images/ui/ImageComponentUI.java @@ -17,119 +17,120 @@ import java.awt.image.BufferedImage; * @author Alexey Efimov */ public class ImageComponentUI extends ComponentUI { - private BufferedImage pattern; + private BufferedImage pattern; - public ImageComponentUI(JComponent c) { - c.addPropertyChangeListener(evt -> { - String name = evt.getPropertyName(); - if (ImageComponent.TRANSPARENCY_CHESSBOARD_BLACK_COLOR_PROP.equals(name) || - ImageComponent.TRANSPARENCY_CHESSBOARD_WHITE_COLOR_PROP.equals(name) || - ImageComponent.TRANSPARENCY_CHESSBOARD_CELL_SIZE_PROP.equals(name)) { - pattern = null; - } - }); - } + public ImageComponentUI(JComponent c) { + c.addPropertyChangeListener(evt -> { + String name = evt.getPropertyName(); + if (ImageComponent.TRANSPARENCY_CHESSBOARD_BLACK_COLOR_PROP.equals(name) || + ImageComponent.TRANSPARENCY_CHESSBOARD_WHITE_COLOR_PROP.equals(name) || + ImageComponent.TRANSPARENCY_CHESSBOARD_CELL_SIZE_PROP.equals(name)) { + pattern = null; + } + }); + } - @Override - public void paint(Graphics g, JComponent c) { - ImageComponent ic = (ImageComponent)c; - if (ic != null) { - ImageDocument document = ic.getDocument(); - BufferedImage image = document.getValue(ic.getZoomFactor()); - if (image != null) { - if (ic.isFileSizeVisible() && ic.isBorderVisible()) paintBorder(g, ic); + @Override + public void paint(Graphics g, JComponent c) { + ImageComponent ic = (ImageComponent)c; + if (ic != null) { + ImageDocument document = ic.getDocument(); + BufferedImage image = document.getValue(ic.getZoomFactor()); + if (image != null) { + if (ic.isFileSizeVisible() && ic.isBorderVisible()) paintBorder(g, ic); - Dimension size = ic.getCanvasSize(); - Graphics igc = g.create(ImageComponent.IMAGE_INSETS, ImageComponent.IMAGE_INSETS, size.width, size.height); - - // Transparency chessboard - if (ic.isTransparencyChessboardVisible() && image.getTransparency() != Transparency.OPAQUE) { - paintChessboard(igc, ic); - } - - paintImage(igc, ic); - - // Grid - if (ic.isGridVisible()) { - paintGrid(igc, ic); - } - - igc.dispose(); - } - } - } - - private static void paintBorder(Graphics g, ImageComponent ic) { - Dimension size = ic.getSize(); - g.setColor(ic.getTransparencyChessboardBlackColor()); - g.drawRect(0, 0, size.width - 1, size.height - 1); - } - - private void paintChessboard(Graphics g, ImageComponent ic) { Dimension size = ic.getCanvasSize(); - // Create pattern - int cellSize = ic.getTransparencyChessboardCellSize(); - int patternSize = 2 * cellSize; + Graphics igc = g.create(ImageComponent.IMAGE_INSETS, ImageComponent.IMAGE_INSETS, size.width, size.height); - if (pattern == null) { - pattern = ImageUtil.createImage(g, patternSize, patternSize, BufferedImage.TYPE_INT_ARGB); - Graphics imageGraphics = pattern.getGraphics(); - imageGraphics.setColor(ic.getTransparencyChessboardWhiteColor()); - imageGraphics.fillRect(0, 0, patternSize, patternSize); - imageGraphics.setColor(ic.getTransparencyChessboardBlackColor()); - imageGraphics.fillRect(0, cellSize, cellSize, cellSize); - imageGraphics.fillRect(cellSize, 0, cellSize, cellSize); + // Transparency chessboard + if (ic.isTransparencyChessboardVisible() && image.getTransparency() != Transparency.OPAQUE) { + paintChessboard(igc, ic); } - ((Graphics2D)g).setPaint(new TexturePaint(pattern, new Rectangle(0, 0, patternSize, patternSize))); - g.fillRect(0, 0, size.width, size.height); - } + paintImage(igc, ic); - private static void paintImage(Graphics g, ImageComponent ic) { - ImageDocument document = ic.getDocument(); - Dimension size = ic.getCanvasSize(); - - Graphics2D g2d = (Graphics2D)g; - RenderingHints oldHints = g2d.getRenderingHints(); - - BufferedImage image = document.getValue(ic.getZoomFactor()); - if (image == null) return; - - if (size.width > image.getWidth() && size.height > image.getHeight()) { - // disable any kind of source image manipulation when resizing - g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF); - g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_NEAREST_NEIGHBOR); - } else { - g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); - g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR); + // Grid + if (ic.isGridVisible()) { + paintGrid(igc, ic); } - StartupUiUtil.drawImage(g, image, new Rectangle(0, 0, size.width, size.height), ic); - g2d.setRenderingHints(oldHints); + igc.dispose(); + } + } + } + + private static void paintBorder(Graphics g, ImageComponent ic) { + Dimension size = ic.getSize(); + g.setColor(ic.getTransparencyChessboardBlackColor()); + g.drawRect(0, 0, size.width - 1, size.height - 1); + } + + private void paintChessboard(Graphics g, ImageComponent ic) { + Dimension size = ic.getCanvasSize(); + // Create pattern + int cellSize = ic.getTransparencyChessboardCellSize(); + int patternSize = 2 * cellSize; + + if (pattern == null) { + pattern = ImageUtil.createImage(g, patternSize, patternSize, BufferedImage.TYPE_INT_ARGB); + Graphics imageGraphics = pattern.getGraphics(); + imageGraphics.setColor(ic.getTransparencyChessboardWhiteColor()); + imageGraphics.fillRect(0, 0, patternSize, patternSize); + imageGraphics.setColor(ic.getTransparencyChessboardBlackColor()); + imageGraphics.fillRect(0, cellSize, cellSize, cellSize); + imageGraphics.fillRect(cellSize, 0, cellSize, cellSize); } - private static void paintGrid(Graphics g, ImageComponent ic) { - Dimension size = ic.getCanvasSize(); - BufferedImage image = ic.getDocument().getValue(); - int imageWidth = image.getWidth(); - int imageHeight = image.getHeight(); - double zoomX = (double)size.width / (double)imageWidth; - double zoomY = (double)size.height / (double)imageHeight; - double zoomFactor = (zoomX + zoomY) / 2.0d; - if (zoomFactor >= ic.getGridLineZoomFactor()) { - g.setColor(ic.getGridLineColor()); - int ls = ic.getGridLineSpan(); - for (int dx = ls; dx < imageWidth; dx += ls) { - LinePainter2D.paint((Graphics2D)g, (int)((double)dx * zoomX), 0, (int)((double)dx * zoomX), size.height); - } - for (int dy = ls; dy < imageHeight; dy += ls) { - LinePainter2D.paint((Graphics2D)g, 0, (int)((double)dy * zoomY), size.width, (int)((double)dy * zoomY)); - } - } - } + ((Graphics2D)g).setPaint(new TexturePaint(pattern, new Rectangle(0, 0, patternSize, patternSize))); + g.fillRect(0, 0, size.width, size.height); + } - @SuppressWarnings({"UnusedDeclaration"}) - public static ComponentUI createUI(JComponent c) { - return new ImageComponentUI(c); + private static void paintImage(Graphics g, ImageComponent ic) { + ImageDocument document = ic.getDocument(); + Dimension size = ic.getCanvasSize(); + + Graphics2D g2d = (Graphics2D)g; + RenderingHints oldHints = g2d.getRenderingHints(); + + BufferedImage image = document.getValue(ic.getZoomFactor()); + if (image == null) return; + + if (size.width > image.getWidth() && size.height > image.getHeight()) { + // disable any kind of source image manipulation when resizing + g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF); + g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_NEAREST_NEIGHBOR); } + else { + g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR); + } + StartupUiUtil.drawImage(g, image, new Rectangle(0, 0, size.width, size.height), ic); + + g2d.setRenderingHints(oldHints); + } + + private static void paintGrid(Graphics g, ImageComponent ic) { + Dimension size = ic.getCanvasSize(); + BufferedImage image = ic.getDocument().getValue(); + int imageWidth = image.getWidth(); + int imageHeight = image.getHeight(); + double zoomX = (double)size.width / (double)imageWidth; + double zoomY = (double)size.height / (double)imageHeight; + double zoomFactor = (zoomX + zoomY) / 2.0d; + if (zoomFactor >= ic.getGridLineZoomFactor()) { + g.setColor(ic.getGridLineColor()); + int ls = ic.getGridLineSpan(); + for (int dx = ls; dx < imageWidth; dx += ls) { + LinePainter2D.paint((Graphics2D)g, (int)((double)dx * zoomX), 0, (int)((double)dx * zoomX), size.height); + } + for (int dy = ls; dy < imageHeight; dy += ls) { + LinePainter2D.paint((Graphics2D)g, 0, (int)((double)dy * zoomY), size.width, (int)((double)dy * zoomY)); + } + } + } + + @SuppressWarnings({"UnusedDeclaration"}) + public static ComponentUI createUI(JComponent c) { + return new ImageComponentUI(c); + } } diff --git a/images/src/org/intellij/images/ui/ThumbnailComponent.java b/images/src/org/intellij/images/ui/ThumbnailComponent.java index 267212fbf726..159988ae09d2 100644 --- a/images/src/org/intellij/images/ui/ThumbnailComponent.java +++ b/images/src/org/intellij/images/ui/ThumbnailComponent.java @@ -26,118 +26,118 @@ import javax.swing.*; * @author Alexey Efimov */ public class ThumbnailComponent extends JComponent { - @NonNls - private static final String FORMAT_PROP = "format"; - @NonNls - private static final String FILE_SIZE_PROP = "fileSize"; - @NonNls - private static final String FILE_NAME_PROP = "fileName"; - @NonNls - private static final String DIRECTORY_PROP = "directory"; - @NonNls - private static final String IMAGES_COUNT_PROP = "imagesCount"; + @NonNls + private static final String FORMAT_PROP = "format"; + @NonNls + private static final String FILE_SIZE_PROP = "fileSize"; + @NonNls + private static final String FILE_NAME_PROP = "fileName"; + @NonNls + private static final String DIRECTORY_PROP = "directory"; + @NonNls + private static final String IMAGES_COUNT_PROP = "imagesCount"; - /** - * @see #getUIClassID - * @see #readObject - */ - @NonNls - private static final String uiClassID = "ThumbnailComponentUI"; + /** + * @see #getUIClassID + * @see #readObject + */ + @NonNls + private static final String uiClassID = "ThumbnailComponentUI"; - static { - UIManager.getDefaults().put(uiClassID, ThumbnailComponentUI.class.getName()); + static { + UIManager.getDefaults().put(uiClassID, ThumbnailComponentUI.class.getName()); + } + + /** + * Image component for rendering thumbnail image. + */ + private final ImageComponent imageComponent = new ImageComponent(); + + private String format; + private long fileSize; + private String fileName; + private boolean directory; + private int imagesCount; + + public ThumbnailComponent() { + updateUI(); + } + + public ImageComponent getImageComponent() { + return imageComponent; + } + + public String getFormat() { + return format; + } + + public void setFormat(String format) { + String oldValue = this.format; + if (oldValue != null && !oldValue.equals(format) || oldValue == null && format != null) { + this.format = format; + firePropertyChange(FORMAT_PROP, oldValue, this.format); } + } - /** - * Image component for rendering thumbnail image. - */ - private final ImageComponent imageComponent = new ImageComponent(); + public long getFileSize() { + return fileSize; + } - private String format; - private long fileSize; - private String fileName; - private boolean directory; - private int imagesCount; - - public ThumbnailComponent() { - updateUI(); + public void setFileSize(long fileSize) { + long oldValue = this.fileSize; + if (oldValue != fileSize) { + this.fileSize = fileSize; + firePropertyChange(FILE_SIZE_PROP, Long.valueOf(oldValue), Long.valueOf(this.fileSize)); } + } - public ImageComponent getImageComponent() { - return imageComponent; - } + public String getFileName() { + return fileName; + } - public String getFormat() { - return format; + public void setFileName(String fileName) { + String oldValue = this.fileName; + if (oldValue != null && !oldValue.equals(fileName) || oldValue == null && fileName != null) { + this.fileName = fileName; + firePropertyChange(FILE_NAME_PROP, oldValue, this.fileName); } + } - public void setFormat(String format) { - String oldValue = this.format; - if (oldValue != null && !oldValue.equals(format) || oldValue == null && format != null) { - this.format = format; - firePropertyChange(FORMAT_PROP, oldValue, this.format); - } - } + public boolean isDirectory() { + return directory; + } - public long getFileSize() { - return fileSize; + public void setDirectory(boolean directory) { + boolean oldValue = this.directory; + if (oldValue != directory) { + this.directory = directory; + firePropertyChange(DIRECTORY_PROP, oldValue, this.directory); } + } - public void setFileSize(long fileSize) { - long oldValue = this.fileSize; - if (oldValue != fileSize) { - this.fileSize = fileSize; - firePropertyChange(FILE_SIZE_PROP, Long.valueOf(oldValue), Long.valueOf(this.fileSize)); - } - } + public int getImagesCount() { + return imagesCount; + } - public String getFileName() { - return fileName; + public void setImagesCount(int imagesCount) { + int oldValue = this.imagesCount; + if (oldValue != imagesCount) { + this.imagesCount = imagesCount; + firePropertyChange(IMAGES_COUNT_PROP, oldValue, this.imagesCount); } + } - public void setFileName(String fileName) { - String oldValue = this.fileName; - if (oldValue != null && !oldValue.equals(fileName) || oldValue == null && fileName != null) { - this.fileName = fileName; - firePropertyChange(FILE_NAME_PROP, oldValue, this.fileName); - } - } + public String getFileSizeText() { + return StringUtil.formatFileSize(fileSize); + } - public boolean isDirectory() { - return directory; - } + @Override + public void updateUI() { + setUI(UIManager.getUI(this)); + } - public void setDirectory(boolean directory) { - boolean oldValue = this.directory; - if (oldValue != directory) { - this.directory = directory; - firePropertyChange(DIRECTORY_PROP, oldValue, this.directory); - } - } - - public int getImagesCount() { - return imagesCount; - } - - public void setImagesCount(int imagesCount) { - int oldValue = this.imagesCount; - if (oldValue != imagesCount) { - this.imagesCount = imagesCount; - firePropertyChange(IMAGES_COUNT_PROP, oldValue, this.imagesCount); - } - } - - public String getFileSizeText() { - return StringUtil.formatFileSize(fileSize); - } - - @Override - public void updateUI() { - setUI(UIManager.getUI(this)); - } - - @Override - public String getUIClassID() { - return uiClassID; - } + @Override + public String getUIClassID() { + return uiClassID; + } } \ No newline at end of file diff --git a/images/src/org/intellij/images/ui/ThumbnailComponentUI.java b/images/src/org/intellij/images/ui/ThumbnailComponentUI.java index cb3c2e3de894..0603355ba3ca 100644 --- a/images/src/org/intellij/images/ui/ThumbnailComponentUI.java +++ b/images/src/org/intellij/images/ui/ThumbnailComponentUI.java @@ -22,249 +22,257 @@ import java.awt.image.BufferedImage; * @author Alexey Efimov */ public class ThumbnailComponentUI extends ComponentUI { - @NonNls - private static final String DOTS = "..."; + @NonNls + private static final String DOTS = "..."; - private static final Color LINE_COLOR = new Color(0x8E, 0xA8, 0xCE); - private static final Color PNG_COLOR = new Color(0x80, 0x00, 0x80); - private static final Color GIF_COLOR = new Color(0x00, 0x80, 0x00); - private static final Color JPG_COLOR = new Color(0x80, 0x80, 0x00); - private static final Color BMP_COLOR = new Color(0x00, 0x00, 0x80); + private static final Color LINE_COLOR = new Color(0x8E, 0xA8, 0xCE); + private static final Color PNG_COLOR = new Color(0x80, 0x00, 0x80); + private static final Color GIF_COLOR = new Color(0x00, 0x80, 0x00); + private static final Color JPG_COLOR = new Color(0x80, 0x80, 0x00); + private static final Color BMP_COLOR = new Color(0x00, 0x00, 0x80); - private static final ThumbnailComponentUI ui = new ThumbnailComponentUI(); + private static final ThumbnailComponentUI ui = new ThumbnailComponentUI(); - @Override - public void paint(Graphics g, JComponent c) { - ThumbnailComponent tc = (ThumbnailComponent) c; - if (tc != null) { - UISettings.setupAntialiasing(g); - paintBackground(g, tc); + @Override + public void paint(Graphics g, JComponent c) { + ThumbnailComponent tc = (ThumbnailComponent)c; + if (tc != null) { + UISettings.setupAntialiasing(g); + paintBackground(g, tc); - if (tc.isDirectory()) { - paintDirectory(g, tc); - } else { - paintImageThumbnail(g, tc); - } + if (tc.isDirectory()) { + paintDirectory(g, tc); + } + else { + paintImageThumbnail(g, tc); + } - // File name - if (tc.isDirectory() || tc.getImageComponent().isFileNameVisible()) paintFileName(g, tc); - } + // File name + if (tc.isDirectory() || tc.getImageComponent().isFileNameVisible()) paintFileName(g, tc); + } + } + + private static void paintDirectory(Graphics g, ThumbnailComponent tc) { + // Paint directory icon + ImagesIcons.ThumbnailDirectory.paintIcon(tc, g, 5, 5); + + int imagesCount = tc.getImagesCount(); + if (imagesCount > 0) { + final String title = ImagesBundle.message("icons.count", imagesCount); + + Font font = getSmallFont(); + FontMetrics fontMetrics = g.getFontMetrics(font); + g.setColor(Color.BLACK); + g.setFont(font); + g.drawString(title, 5 + (ImagesIcons.ThumbnailDirectory.getIconWidth() - fontMetrics.stringWidth(title)) / 2, + ImagesIcons.ThumbnailDirectory + .getIconHeight() / 2 + fontMetrics.getAscent()); + } + } + + private static void paintImageThumbnail(Graphics g, ThumbnailComponent tc) { + ImageComponent imageComponent = tc.getImageComponent(); + // Paint blank + if (imageComponent.isFileSizeVisible()) ImagesIcons.ThumbnailBlank.paintIcon(tc, g, 5, 5); + + ImageDocument document = imageComponent.getDocument(); + BufferedImage image = document.getValue(); + if (image != null) { + paintImage(g, tc); + } + else { + paintError(g, tc); } - private static void paintDirectory(Graphics g, ThumbnailComponent tc) { - // Paint directory icon - ImagesIcons.ThumbnailDirectory.paintIcon(tc, g, 5, 5); + if (imageComponent.isFileSizeVisible()) paintFileSize(g, tc); + } - int imagesCount = tc.getImagesCount(); - if (imagesCount > 0) { - final String title = ImagesBundle.message("icons.count", imagesCount); + private static void paintBackground(Graphics g, ThumbnailComponent tc) { + Dimension size = tc.getSize(); + g.setColor(tc.getBackground()); + g.fillRect(0, 0, size.width, size.height); + } - Font font = getSmallFont(); - FontMetrics fontMetrics = g.getFontMetrics(font); - g.setColor(Color.BLACK); - g.setFont(font); - g.drawString(title, 5 + (ImagesIcons.ThumbnailDirectory.getIconWidth() - fontMetrics.stringWidth(title)) / 2, ImagesIcons.ThumbnailDirectory - .getIconHeight() / 2 + fontMetrics.getAscent()); - } + private static void paintImage(Graphics g, ThumbnailComponent tc) { + ImageComponent imageComponent = tc.getImageComponent(); + + int blankHeight = ImagesIcons.ThumbnailBlank.getIconHeight(); + + if (imageComponent.isFileSizeVisible()) { + // Paint image info (and reduce height of text from available height) + blankHeight -= paintImageCaps(g, imageComponent); + // Paint image format (and reduce height of text from available height) + blankHeight -= paintFormatText(tc, g); } - private static void paintImageThumbnail(Graphics g, ThumbnailComponent tc) { - ImageComponent imageComponent = tc.getImageComponent(); - // Paint blank - if (imageComponent.isFileSizeVisible()) ImagesIcons.ThumbnailBlank.paintIcon(tc, g, 5, 5); + // Paint image + paintThumbnail(g, imageComponent, blankHeight); + } - ImageDocument document = imageComponent.getDocument(); - BufferedImage image = document.getValue(); - if (image != null) { - paintImage(g, tc); - } else { - paintError(g, tc); - } + private static int paintImageCaps(Graphics g, ImageComponent imageComponent) { + String description = imageComponent.getDescription(); - if (imageComponent.isFileSizeVisible()) paintFileSize(g, tc); + Font font = getSmallFont(); + FontMetrics fontMetrics = g.getFontMetrics(font); + g.setColor(Color.BLACK); + g.setFont(font); + g.drawString(description, 8, 7 + fontMetrics.getAscent()); + + return fontMetrics.getHeight(); + } + + private static int paintFormatText(ThumbnailComponent tc, Graphics g) { + Font font = getSmallFont().deriveFont(Font.BOLD); + FontMetrics fontMetrics = g.getFontMetrics(font); + + String format = StringUtil.toUpperCase(tc.getFormat()); + int stringWidth = fontMetrics.stringWidth(format); + int x = ImagesIcons.ThumbnailBlank.getIconWidth() - stringWidth + 2; + int y = ImagesIcons.ThumbnailBlank.getIconHeight() - fontMetrics.getHeight() + 4; + g.setColor(LINE_COLOR); + g.drawLine(x - 3, y - 1, x + stringWidth + 1, y - 1); + g.drawLine(x - 4, y, x - 4, y + fontMetrics.getHeight() - 1); + g.setColor(getFormatColor(format)); + g.setFont(font); + g.drawString( + format, + x, + y + fontMetrics.getAscent() + ); + + return fontMetrics.getHeight(); + } + + private static Color getFormatColor(String format) { + if ("PNG".equals(format)) { + return PNG_COLOR; + } + else if ("GIF".equals(format)) { + return GIF_COLOR; + } + else if ("JPG".equals(format) || "JPEG".equals(format)) { + return JPG_COLOR; + } + else if ("BMP".equals(format) || "WBMP".equals(format)) { + return BMP_COLOR; + } + return Color.BLACK; + } + + private static void paintThumbnail(Graphics g, ImageComponent imageComponent, int blankHeight) { + + // Zoom image by available size + int maxWidth = ImagesIcons.ThumbnailBlank.getIconWidth() - 10; + int maxHeight = blankHeight - 10; + + BufferedImage image = imageComponent.getDocument().getValue(); + int imageWidth = image.getWidth(); + int imageHeight = image.getHeight(); + + if (imageWidth > maxWidth || imageHeight > maxHeight) { + if (imageWidth > maxWidth) { + double proportion = (double)maxWidth / (double)imageWidth; + imageWidth = maxWidth; + imageHeight = (int)((double)imageHeight * proportion); + } + if (imageHeight > maxHeight) { + double proportion = (double)maxHeight / (double)imageHeight; + imageHeight = maxHeight; + imageWidth = (int)((double)imageWidth * proportion); + } } - private static void paintBackground(Graphics g, ThumbnailComponent tc) { - Dimension size = tc.getSize(); - g.setColor(tc.getBackground()); - g.fillRect(0, 0, size.width, size.height); + imageComponent.setCanvasSize(imageWidth, imageHeight); + Dimension size = imageComponent.getSize(); + + int x = 5 + (ImagesIcons.ThumbnailBlank.getIconWidth() - size.width) / 2; + int y = 5 + (ImagesIcons.ThumbnailBlank.getIconHeight() - size.height) / 2; + + + imageComponent.paint(g.create(x, y, size.width, size.height)); + } + + private static void paintFileName(Graphics g, ThumbnailComponent tc) { + Font font = StartupUiUtil.getLabelFont(); + FontMetrics fontMetrics = g.getFontMetrics(font); + + g.setFont(font); + g.setColor(tc.getForeground()); + + String fileName = tc.getFileName(); + String title = fileName; + while (fontMetrics.stringWidth(title) > ImagesIcons.ThumbnailBlank.getIconWidth() - 8) { + title = title.substring(0, title.length() - 1); } - private static void paintImage(Graphics g, ThumbnailComponent tc) { - ImageComponent imageComponent = tc.getImageComponent(); - - int blankHeight = ImagesIcons.ThumbnailBlank.getIconHeight(); - - if (imageComponent.isFileSizeVisible()) { - // Paint image info (and reduce height of text from available height) - blankHeight -= paintImageCaps(g, imageComponent); - // Paint image format (and reduce height of text from available height) - blankHeight -= paintFormatText(tc, g); - } - - // Paint image - paintThumbnail(g, imageComponent, blankHeight); + if (fileName.equals(title)) { + // Center + g.drawString(fileName, 6 + (ImagesIcons.ThumbnailBlank.getIconWidth() - 2 - fontMetrics.stringWidth(title)) / 2, + ImagesIcons.ThumbnailBlank + .getIconHeight() + 8 + fontMetrics.getAscent()); } - - private static int paintImageCaps(Graphics g, ImageComponent imageComponent) { - String description = imageComponent.getDescription(); - - Font font = getSmallFont(); - FontMetrics fontMetrics = g.getFontMetrics(font); - g.setColor(Color.BLACK); - g.setFont(font); - g.drawString(description, 8, 7 + fontMetrics.getAscent()); - - return fontMetrics.getHeight(); + else { + int dotsWidth = fontMetrics.stringWidth(DOTS); + while (fontMetrics.stringWidth(title) > ImagesIcons.ThumbnailBlank.getIconWidth() - 8 - dotsWidth) { + title = title.substring(0, title.length() - 1); + } + g.drawString(title + DOTS, 6, ImagesIcons.ThumbnailBlank.getIconHeight() + 8 + fontMetrics.getAscent()); } + } - private static int paintFormatText(ThumbnailComponent tc, Graphics g) { - Font font = getSmallFont().deriveFont(Font.BOLD); - FontMetrics fontMetrics = g.getFontMetrics(font); + private static void paintFileSize(Graphics g, ThumbnailComponent tc) { + Font font = getSmallFont(); + FontMetrics fontMetrics = g.getFontMetrics(font); + g.setColor(Color.BLACK); + g.setFont(font); + g.drawString( + tc.getFileSizeText(), + 8, + ImagesIcons.ThumbnailBlank.getIconHeight() + 4 - fontMetrics.getHeight() + fontMetrics.getAscent() + ); + } - String format = StringUtil.toUpperCase(tc.getFormat()); - int stringWidth = fontMetrics.stringWidth(format); - int x = ImagesIcons.ThumbnailBlank.getIconWidth() - stringWidth + 2; - int y = ImagesIcons.ThumbnailBlank.getIconHeight() - fontMetrics.getHeight() + 4; - g.setColor(LINE_COLOR); - g.drawLine(x - 3, y - 1, x + stringWidth + 1, y - 1); - g.drawLine(x - 4, y, x - 4, y + fontMetrics.getHeight() - 1); - g.setColor(getFormatColor(format)); - g.setFont(font); - g.drawString( - format, - x, - y + fontMetrics.getAscent() - ); + private static void paintError(Graphics g, ThumbnailComponent tc) { + Font font = getSmallFont(); + FontMetrics fontMetrics = g.getFontMetrics(font); - return fontMetrics.getHeight(); - } + Messages.getErrorIcon().paintIcon( + tc, + g, + 5 + (ImagesIcons.ThumbnailBlank.getIconWidth() - Messages.getErrorIcon().getIconWidth()) / 2, + 5 + (ImagesIcons.ThumbnailBlank.getIconHeight() - Messages.getErrorIcon().getIconHeight()) / 2 + ); - private static Color getFormatColor(String format) { - if ("PNG".equals(format)) { - return PNG_COLOR; - } else if ("GIF".equals(format)) { - return GIF_COLOR; - } else if ("JPG".equals(format) || "JPEG".equals(format)) { - return JPG_COLOR; - } else if ("BMP".equals(format) || "WBMP".equals(format)) { - return BMP_COLOR; - } - return Color.BLACK; - } + // Error + String error = getSubmnailComponentErrorString(); + g.setColor(JBColor.RED); + g.setFont(font); + g.drawString(error, 8, 8 + fontMetrics.getAscent()); + } - private static void paintThumbnail(Graphics g, ImageComponent imageComponent, int blankHeight) { + private static String getSubmnailComponentErrorString() { + return ImagesBundle.message("thumbnails.component.error.text"); + } - // Zoom image by available size - int maxWidth = ImagesIcons.ThumbnailBlank.getIconWidth() - 10; - int maxHeight = blankHeight - 10; + private static Font getSmallFont() { + Font labelFont = StartupUiUtil.getLabelFont(); + return labelFont.deriveFont(labelFont.getSize2D() - 2.0f); + } - BufferedImage image = imageComponent.getDocument().getValue(); - int imageWidth = image.getWidth(); - int imageHeight = image.getHeight(); + @Override + public Dimension getPreferredSize(JComponent c) { + Font labelFont = StartupUiUtil.getLabelFont(); + FontMetrics fontMetrics = c.getFontMetrics(labelFont); + return new Dimension( + ImagesIcons.ThumbnailBlank.getIconWidth() + 10, + ImagesIcons.ThumbnailBlank.getIconHeight() + fontMetrics.getHeight() + 15 + ); + } - if (imageWidth > maxWidth || imageHeight > maxHeight) { - if (imageWidth > maxWidth) { - double proportion = (double) maxWidth / (double) imageWidth; - imageWidth = maxWidth; - imageHeight = (int) ((double) imageHeight * proportion); - } - if (imageHeight > maxHeight) { - double proportion = (double) maxHeight / (double) imageHeight; - imageHeight = maxHeight; - imageWidth = (int) ((double) imageWidth * proportion); - } - } - - imageComponent.setCanvasSize(imageWidth, imageHeight); - Dimension size = imageComponent.getSize(); - - int x = 5 + (ImagesIcons.ThumbnailBlank.getIconWidth() - size.width) / 2; - int y = 5 + (ImagesIcons.ThumbnailBlank.getIconHeight() - size.height) / 2; - - - imageComponent.paint(g.create(x, y, size.width, size.height)); - } - - private static void paintFileName(Graphics g, ThumbnailComponent tc) { - Font font = StartupUiUtil.getLabelFont(); - FontMetrics fontMetrics = g.getFontMetrics(font); - - g.setFont(font); - g.setColor(tc.getForeground()); - - String fileName = tc.getFileName(); - String title = fileName; - while (fontMetrics.stringWidth(title) > ImagesIcons.ThumbnailBlank.getIconWidth() - 8) { - title = title.substring(0, title.length() - 1); - } - - if (fileName.equals(title)) { - // Center - g.drawString(fileName, 6 + (ImagesIcons.ThumbnailBlank.getIconWidth() - 2 - fontMetrics.stringWidth(title)) / 2, ImagesIcons.ThumbnailBlank - .getIconHeight() + 8 + fontMetrics.getAscent()); - } else { - int dotsWidth = fontMetrics.stringWidth(DOTS); - while (fontMetrics.stringWidth(title) > ImagesIcons.ThumbnailBlank.getIconWidth() - 8 - dotsWidth) { - title = title.substring(0, title.length() - 1); - } - g.drawString(title + DOTS, 6, ImagesIcons.ThumbnailBlank.getIconHeight() + 8 + fontMetrics.getAscent()); - } - } - - private static void paintFileSize(Graphics g, ThumbnailComponent tc) { - Font font = getSmallFont(); - FontMetrics fontMetrics = g.getFontMetrics(font); - g.setColor(Color.BLACK); - g.setFont(font); - g.drawString( - tc.getFileSizeText(), - 8, - ImagesIcons.ThumbnailBlank.getIconHeight() + 4 - fontMetrics.getHeight() + fontMetrics.getAscent() - ); - } - - private static void paintError(Graphics g, ThumbnailComponent tc) { - Font font = getSmallFont(); - FontMetrics fontMetrics = g.getFontMetrics(font); - - Messages.getErrorIcon().paintIcon( - tc, - g, - 5 + (ImagesIcons.ThumbnailBlank.getIconWidth() - Messages.getErrorIcon().getIconWidth()) / 2, - 5 + (ImagesIcons.ThumbnailBlank.getIconHeight() - Messages.getErrorIcon().getIconHeight()) / 2 - ); - - // Error - String error = getSubmnailComponentErrorString(); - g.setColor(JBColor.RED); - g.setFont(font); - g.drawString(error, 8, 8 + fontMetrics.getAscent()); - } - - private static String getSubmnailComponentErrorString() { - return ImagesBundle.message("thumbnails.component.error.text"); - } - - private static Font getSmallFont() { - Font labelFont = StartupUiUtil.getLabelFont(); - return labelFont.deriveFont(labelFont.getSize2D() - 2.0f); - } - - @Override - public Dimension getPreferredSize(JComponent c) { - Font labelFont = StartupUiUtil.getLabelFont(); - FontMetrics fontMetrics = c.getFontMetrics(labelFont); - return new Dimension( - ImagesIcons.ThumbnailBlank.getIconWidth() + 10, - ImagesIcons.ThumbnailBlank.getIconHeight() + fontMetrics.getHeight() + 15 - ); - } - - @SuppressWarnings({"UnusedDeclaration"}) - public static ComponentUI createUI(JComponent c) { - return ui; - } + @SuppressWarnings({"UnusedDeclaration"}) + public static ComponentUI createUI(JComponent c) { + return ui; + } }