| /* |
| * Copyright (C) 2013 The Android Open Source Project |
| * |
| * 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 com.android.tools.idea.actions; |
| |
| import com.android.SdkConstants; |
| import com.android.tools.idea.rendering.ImageUtils; |
| import com.intellij.openapi.actionSystem.AnAction; |
| import com.intellij.openapi.actionSystem.AnActionEvent; |
| import com.intellij.openapi.actionSystem.CommonDataKeys; |
| import com.intellij.openapi.fileChooser.FileChooserFactory; |
| import com.intellij.openapi.fileChooser.FileSaverDescriptor; |
| import com.intellij.openapi.fileChooser.FileSaverDialog; |
| import com.intellij.openapi.progress.ProgressIndicator; |
| import com.intellij.openapi.progress.Task; |
| import com.intellij.openapi.project.Project; |
| import com.intellij.openapi.ui.Messages; |
| import com.intellij.openapi.util.text.StringUtil; |
| import com.intellij.openapi.vfs.LocalFileSystem; |
| import com.intellij.openapi.vfs.VfsUtilCore; |
| import com.intellij.openapi.vfs.VirtualFile; |
| import com.intellij.openapi.vfs.VirtualFileWrapper; |
| import org.jetbrains.android.util.AndroidBundle; |
| import org.jetbrains.annotations.Contract; |
| import org.jetbrains.annotations.NotNull; |
| import org.jetbrains.annotations.Nullable; |
| |
| import javax.imageio.ImageIO; |
| import java.awt.image.BufferedImage; |
| import java.io.File; |
| import java.io.IOException; |
| |
| public class ConvertToNinePatchAction extends AnAction { |
| public ConvertToNinePatchAction() { |
| super(AndroidBundle.message("android.9patch.creator.title")); |
| } |
| |
| @Override |
| public void update(AnActionEvent e) { |
| final VirtualFile file = CommonDataKeys.VIRTUAL_FILE.getData(e.getDataContext()); |
| final boolean isPng = isPngFile(file); |
| e.getPresentation().setEnabled(isPng); |
| e.getPresentation().setVisible(isPng); |
| } |
| |
| @Contract("null -> false") |
| private static boolean isPngFile(@Nullable VirtualFile file) { |
| return file != null && SdkConstants.EXT_PNG.equalsIgnoreCase(file.getExtension()) |
| && !StringUtil.endsWithIgnoreCase(file.getName(), SdkConstants.DOT_9PNG); |
| } |
| |
| @Override |
| public void actionPerformed(AnActionEvent e) { |
| final VirtualFile pngFile = CommonDataKeys.VIRTUAL_FILE.getData(e.getDataContext()); |
| if (!isPngFile(pngFile)) { |
| return; |
| } |
| |
| FileSaverDescriptor descriptor = |
| new FileSaverDescriptor(AndroidBundle.message("android.9patch.creator.save.title"), "", SdkConstants.EXT_PNG); |
| FileSaverDialog saveFileDialog = FileChooserFactory.getInstance().createSaveFileDialog(descriptor, (Project)null); |
| VirtualFileWrapper fileWrapper = saveFileDialog.save(pngFile.getParent(), |
| pngFile.getNameWithoutExtension().concat(SdkConstants.DOT_9PNG)); |
| if (fileWrapper == null) { |
| return; |
| } |
| |
| final File patchFile = fileWrapper.getFile(); |
| new Task.Modal(null, "Creating 9-Patch File", false) { |
| private IOException myException; |
| |
| @Override |
| public void run(@NotNull ProgressIndicator indicator) { |
| indicator.setIndeterminate(true); |
| try { |
| BufferedImage pngImage = ImageIO.read(VfsUtilCore.virtualToIoFile(pngFile)); |
| BufferedImage patchImage = ImageUtils.addMargin(pngImage, 1); |
| ImageIO.write(patchImage, SdkConstants.EXT_PNG, patchFile); |
| LocalFileSystem.getInstance().refreshAndFindFileByIoFile(patchFile); |
| } |
| catch (IOException e) { |
| myException = e; |
| } |
| } |
| |
| @Override |
| public void onSuccess() { |
| if (myException != null) { |
| Messages.showErrorDialog(AndroidBundle.message("android.9patch.creator.error", myException.getMessage()), |
| AndroidBundle.message("android.9patch.creator.error.title")); |
| } |
| } |
| }.queue(); |
| } |
| } |