/* * 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.ide.eclipse.adt.internal.editors.draw9patch; import static com.android.SdkConstants.DOT_9PNG; import com.android.ide.eclipse.adt.AdtPlugin; import com.android.ide.eclipse.adt.internal.editors.draw9patch.graphics.NinePatchedImage; import com.android.ide.eclipse.adt.internal.editors.draw9patch.ui.ImageViewer; import com.android.ide.eclipse.adt.internal.editors.draw9patch.ui.MainFrame; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.window.Window; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.ImageData; import org.eclipse.swt.graphics.ImageLoader; import org.eclipse.swt.widgets.Composite; import org.eclipse.ui.IEditorInput; import org.eclipse.ui.IEditorSite; import org.eclipse.ui.PartInitException; import org.eclipse.ui.dialogs.SaveAsDialog; import org.eclipse.ui.part.EditorPart; import org.eclipse.ui.part.FileEditorInput; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; /** * Draw9Patch editor part. */ public class Draw9PatchEditor extends EditorPart implements ImageViewer.UpdateListener { private IProject mProject = null; private FileEditorInput mFileEditorInput = null; private String mFileName = null; private NinePatchedImage mNinePatchedImage = null; private MainFrame mMainFrame = null; @Override public void init(IEditorSite site, IEditorInput input) throws PartInitException { setSite(site); setInput(input); setPartName(input.getName()); // The contract of init() mentions we need to fail if we can't // understand the input. if (input instanceof FileEditorInput) { // We try to open a file that is part of the current workspace mFileEditorInput = (FileEditorInput) input; mFileName = mFileEditorInput.getName(); mProject = mFileEditorInput.getFile().getProject(); } else { throw new PartInitException("Input is not of type FileEditorInput " + //$NON-NLS-1$ "nor FileStoreEditorInput: " + //$NON-NLS-1$ input == null ? "null" : input.toString()); //$NON-NLS-1$ } } @Override public boolean isSaveAsAllowed() { return true; } @Override public void doSaveAs() { IPath relativePath = null; if ((relativePath = showSaveAsDialog()) != null) { mFileEditorInput = new FileEditorInput(ResourcesPlugin.getWorkspace().getRoot() .getFile(relativePath)); mFileName = mFileEditorInput.getName(); setInput(mFileEditorInput); doSave(new NullProgressMonitor()); } } @Override public void doSave(final IProgressMonitor monitor) { boolean hasNinePatchExtension = mFileName.endsWith(DOT_9PNG); boolean doConvert = false; if (!hasNinePatchExtension) { String patchedName = NinePatchedImage.getNinePatchedFileName(mFileName); doConvert = MessageDialog .openQuestion(AdtPlugin.getDisplay().getActiveShell(), "Warning", String.format( "The file \"%s\" doesn't seem to be a 9-patch file. \n" + "Do you want to convert and save as \"%s\" ?", mFileName, patchedName)); if (doConvert) { IFile destFile = mProject.getFile(NinePatchedImage.getNinePatchedFileName( mFileEditorInput.getFile().getProjectRelativePath().toOSString())); if (!destFile.exists()) { mFileEditorInput = new FileEditorInput(destFile); mFileName = mFileEditorInput.getName(); } else { IPath relativePath = null; if ((relativePath = showSaveAsDialog()) != null) { mFileEditorInput = new FileEditorInput(ResourcesPlugin.getWorkspace() .getRoot().getFile(relativePath)); mFileName = mFileEditorInput.getName(); } else { doConvert = false; } } } } if (hasNinePatchExtension || doConvert) { ImageLoader loader = new ImageLoader(); loader.data = new ImageData[] { mNinePatchedImage.getRawImageData() }; IFile file = mFileEditorInput.getFile(); ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); loader.save(outputStream, SWT.IMAGE_PNG); byte[] byteArray = outputStream.toByteArray(); try { if (file.exists()) { file.setContents(new ByteArrayInputStream(byteArray), true, false, monitor); } else { file.create(new ByteArrayInputStream(byteArray), true, monitor); } mNinePatchedImage.clearDirtyFlag(); AdtPlugin.getDisplay().asyncExec(new Runnable() { @Override public void run() { setPartName(mFileName); firePropertyChange(PROP_DIRTY); } }); } catch (CoreException e) { AdtPlugin.log(e, null); } } } @Override public void createPartControl(Composite parent) { mMainFrame = new MainFrame(parent, SWT.NULL); ImageViewer imageViewer = mMainFrame.getImageEditorPanel().getImageViewer(); imageViewer.addUpdateListener(this); mNinePatchedImage = imageViewer.loadFile(mFileEditorInput.getPath().toOSString()); if (mNinePatchedImage.hasNinePatchExtension()) { if (!mNinePatchedImage.ensure9Patch() && showConvertMessageBox(mFileName)) { // Reload image mNinePatchedImage = imageViewer.loadFile(mFileEditorInput.getPath().toOSString()); mNinePatchedImage.convertToNinePatch(); } } else { mNinePatchedImage.convertToNinePatch(); } imageViewer.startDisplay(); parent.layout(); } @Override public void setFocus() { mMainFrame.forceFocus(); } @Override public boolean isDirty() { return mNinePatchedImage.isDirty(); } @Override public void update(NinePatchedImage image) { if (image.isDirty()) { firePropertyChange(PROP_DIRTY); } } private IPath showSaveAsDialog() { SaveAsDialog dialog = new SaveAsDialog(AdtPlugin.getDisplay().getActiveShell()); IFile dest = mProject.getFile(NinePatchedImage.getNinePatchedFileName( mFileEditorInput.getFile().getProjectRelativePath().toOSString())); dialog.setOriginalFile(dest); dialog.create(); if (dialog.open() == Window.CANCEL) { return null; } return dialog.getResult(); } private static boolean showConvertMessageBox(String fileName) { return MessageDialog.openQuestion( AdtPlugin.getDisplay().getActiveShell(), "Warning", String.format("The file \"%s\" doesn't seem to be a 9-patch file. \n" + "Do you want to convert?", fileName)); } }