blob: 48ef7c366ce7fe3d158c9c99b0d520b6315838a1 [file] [log] [blame]
/*
* 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));
}
}