com.android.ide.eclipse.adt.internal.editors.draw9patch.Draw9PatchEditor.java Source code

Java tutorial

Introduction

Here is the source code for com.android.ide.eclipse.adt.internal.editors.draw9patch.Draw9PatchEditor.java

Source

/*
 * 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));
    }
}