com.nokia.carbide.cpp.internal.project.ui.editors.images.AddImagesDialog.java Source code

Java tutorial

Introduction

Here is the source code for com.nokia.carbide.cpp.internal.project.ui.editors.images.AddImagesDialog.java

Source

/*
* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of the License "Eclipse Public License v1.0"
* which accompanies this distribution, and is available
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
*
* Initial Contributors:
* Nokia Corporation - initial contribution.
*
* Contributors:
*
* Description: 
*
*/
package com.nokia.carbide.cpp.internal.project.ui.editors.images;

import com.nokia.carbide.cpp.epoc.engine.image.*;
import com.nokia.carbide.cpp.ui.images.IFileImageModel;
import com.nokia.cpp.internal.api.utils.core.*;
import com.nokia.sdt.utils.ui.ThumbnailWithDescriptionComposite;

import org.eclipse.core.runtime.IPath;
import org.eclipse.jface.dialogs.IDialogSettings;
import org.eclipse.jface.viewers.*;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.*;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.*;

import java.text.MessageFormat;
import java.util.*;
import java.util.List;

/**
 * This is the dialog that allows the user to add images from the
 * project or the filesystem to a multi-image file.
 *
 */
public abstract class AddImagesDialog extends SelectOrAddImagesDialogBase {
    protected MultiImageEditorContextBase editorContext;
    TableViewer imageMaskPairTableViewer;
    private List<IImageSourceReference> newImageSources;

    /**
     * @param parentShell
     * @param editorContext 
     */
    protected AddImagesDialog(Shell parentShell, MultiImageEditorContextBase editorContext) {
        super(parentShell);
        setShellStyle(getShellStyle() | SWT.RESIZE | SWT.MIN | SWT.MAX);
        this.editorContext = editorContext;
        this.newImageSources = new ArrayList<IImageSourceReference>();
    }

    /* (non-Javadoc)
     * @see com.nokia.carbide.cpp.ui.internal.images.AddImagesDialogBase#getDialogSettings()
     */
    @Override
    protected IDialogSettings getDialogSettings() {
        return editorContext.getDialogSettings();
    }

    /* (non-Javadoc)
     * @see com.nokia.carbide.cpp.internal.project.ui.editors.images.AddImagesToProjectDialogBase#createDialogContents(org.eclipse.swt.widgets.Composite)
     */
    @Override
    protected void createDialogContents(Composite composite) {
        createDialogTopHalf(composite);
        createDialogBottomHalf(composite);
    }

    /** Create the bottom half of the dialog,. */
    protected abstract void createDialogTopHalf(Composite parent);

    /* (non-Javadoc)
     * @see com.nokia.carbide.cpp.internal.project.ui.editors.images.AddImagesToProjectDialogBase#createDialogBottomHalf(org.eclipse.swt.widgets.Composite)
     */
    protected void createDialogBottomHalf(Composite parent) {
        SashForm sash = new SashForm(parent, SWT.VERTICAL | SWT.SMOOTH | SWT.BORDER);
        sash.setLayout(new GridLayout());
        sash.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));

        createThumbnailViewer(sash);

        Composite tableInfo = new Composite(sash, SWT.NONE);
        tableInfo.setLayout(new GridLayout());
        tableInfo.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));

        CLabel label2 = new CLabel(tableInfo, SWT.WRAP);
        label2.setText(Messages.getString("AddImagesDialog.DetectedImagePairsLabel")); //$NON-NLS-1$
        label2.setLayoutData(new GridData(SWT.LEFT, SWT.LEFT, false, false));

        createTableViewer(tableInfo);
    }

    /* (non-Javadoc)
     * @see com.nokia.carbide.cpp.internal.project.ui.editors.images.AddImagesToProjectDialogBase#configureThumbnailViewer(com.nokia.sdt.utils.ui.ThumbnailWithDescriptionComposite)
     */
    @Override
    protected void configureThumbnailViewer(ThumbnailWithDescriptionComposite thumbAndDesc) {
        thumbAndDesc.getDescriptionText()
                .setText(MessageFormat.format(Messages.getString("AddImagesDialog.HelpDescription"), //$NON-NLS-1$
                        new Object[] { editorContext.getTargetFileName() }));

    }

    /* (non-Javadoc)
     * @see com.nokia.carbide.cpp.internal.project.ui.editors.images.AddImagesDialogBase#handleThumbnailViewerSelectionChanged(org.eclipse.jface.viewers.IStructuredSelection)
     */
    @Override
    protected void handleThumbnailViewerSelectionChanged(IStructuredSelection selection) {
        super.handleThumbnailViewerSelectionChanged(selection);
        BusyIndicator.showWhile(getShell().getDisplay(), new Runnable() {

            public void run() {
                rePairImages();
                if (imageMaskPairTableViewer != null && !imageMaskPairTableViewer.getControl().isDisposed())
                    imageMaskPairTableViewer.refresh();
            }

        });

    }

    /**
     * Create the table viewer in which the pairings of images + masks
     * are shown.
     * @param parent
     */
    protected void createTableViewer(Composite parent) {
        imageMaskPairTableViewer = new TableViewer(parent, SWT.READ_ONLY | SWT.FLAT | SWT.FULL_SELECTION);
        final Table table = imageMaskPairTableViewer.getTable();
        GridData gridData = new GridData(SWT.FILL, SWT.FILL, true, true);
        gridData.minimumHeight = 75;
        table.setLayoutData(gridData);
        //table.setEnabled(false); // yuck
        imageMaskPairTableViewer.addPostSelectionChangedListener(new ISelectionChangedListener() {

            public void selectionChanged(SelectionChangedEvent event) {
                // need to ignore this...
            }

        });

        TableColumn column = new TableColumn(table, SWT.LEFT);
        column.setResizable(true);
        column.setText(Messages.getString("AddImagesDialog.ImageColumnHeader")); //$NON-NLS-1$
        column = new TableColumn(table, SWT.LEFT);
        column.setResizable(true);
        column.setText(Messages.getString("AddImagesDialog.MaskColumnHeader")); //$NON-NLS-1$
        table.setHeaderVisible(true);
        table.setLinesVisible(true);

        imageMaskPairTableViewer.setContentProvider(new IStructuredContentProvider() {

            public Object[] getElements(Object inputElement) {
                return newImageSources.toArray();
            }

            public void dispose() {
            }

            public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
                viewer.refresh();
            }

        });
        imageMaskPairTableViewer.setLabelProvider(new ITableLabelProvider() {

            public Image getColumnImage(Object element, int columnIndex) {
                return null;
            }

            public String getColumnText(Object element, int columnIndex) {
                IImageSourceReference source = (IImageSourceReference) element;
                if (columnIndex == 0)
                    return source.getPath().lastSegment();
                else if (source instanceof IBitmapSourceReference
                        && ((IBitmapSourceReference) source).getMaskPath() != null) {
                    return ((IBitmapSourceReference) source).getMaskPath().lastSegment();
                } else
                    return null;
            }

            public void dispose() {

            }

            public boolean isLabelProperty(Object element, String property) {
                return true;
            }

            public void addListener(ILabelProviderListener listener) {
            }

            public void removeListener(ILabelProviderListener listener) {
            }

        });
        imageMaskPairTableViewer.setInput(new Object());

        TableLayout tableLayout = new TableLayout();
        table.setLayout(tableLayout);

        tableLayout.addColumnData(new ColumnWeightData(100));
        tableLayout.addColumnData(new ColumnWeightData(100));

    }

    /**
     * Pair image and mask files automatically.
     */
    void rePairImages() {
        Set<Object> remainingImages = new HashSet<Object>(selectedImages);
        newImageSources.clear();
        for (Object item : selectedImages) {
            IPath path;
            if (!remainingImages.contains(item))
                continue;
            if (item instanceof IPath)
                path = (IPath) item;
            else if (item instanceof IFileImageModel)
                path = ((IFileImageModel) item).getSourceLocation();
            else
                continue;
            if (isMaskFile(path))
                continue;
            if (isBitmapFile(path)) {
                Object maskItem = findMatchingFile(remainingImages, path);
                IPath maskPath;
                if (maskItem instanceof IPath)
                    maskPath = (IPath) maskItem;
                else if (maskItem instanceof IFileImageModel)
                    maskPath = ((IFileImageModel) maskItem).getSourceLocation();
                else
                    continue;
                // maskPath may be null
                IBitmapSourceReference bmSource = editorContext.createBitmapSourceReference();
                bmSource.setPath(path);
                bmSource.setMaskPath(maskPath);
                newImageSources.add(bmSource);
                remainingImages.remove(item);
                if (maskPath != null)
                    remainingImages.remove(maskItem);
            } else if (isSVGFile(path)) {
                ISVGSourceReference svgSource = editorContext.createSVGSourceReference();
                svgSource.setPath(path);
                newImageSources.add(svgSource);
                remainingImages.remove(item);
            }
        }

        // add remaining entries 
        for (Object item : remainingImages) {
            IPath path;
            if (item instanceof IPath)
                path = (IPath) item;
            else if (item instanceof IFileImageModel)
                path = ((IFileImageModel) item).getSourceLocation();
            else
                continue;
            if (isBitmapFile(path)) {
                IBitmapSourceReference bmSource = editorContext.createBitmapSourceReference();
                bmSource.setPath(path);
                newImageSources.add(bmSource);
            } else if (isSVGFile(path)) {
                ISVGSourceReference svgSource = editorContext.createSVGSourceReference();
                svgSource.setPath(path);
                newImageSources.add(svgSource);
            }
        }
    }

    /**
     * Find a matching file 
     * @param pattern
     * @return
     */
    private Object findMatchingFile(Collection<Object> images, IPath fileName) {
        String baseName = fileName.removeFileExtension().lastSegment();
        for (Object item : images) {
            IPath path;
            if (item instanceof IPath)
                path = (IPath) item;
            else if (item instanceof IFileImageModel)
                path = ((IFileImageModel) item).getSourceLocation();
            else
                continue;
            String lowerFile = path.lastSegment().toLowerCase();
            //_mask.bmp|_mask_soft.bmp|M.bmp
            if (lowerFile.startsWith(baseName)) {
                if (lowerFile.equals(baseName + "_mask.bmp") || lowerFile.equals(baseName + "_mask_soft.bmp")
                        || lowerFile.equals(baseName + "m.bmp")) {
                    return item;
                }
            }
        }
        return null;
    }

    /**
     * @param path
     * @return
     */
    private boolean isSVGFile(IPath path) {
        return FileUtils.getSafeFileExtension(path).toLowerCase().equals("svg") //$NON-NLS-1$
                && editorContext.isValidPath(path);
    }

    /**
     * @param path
     * @return
     */
    private boolean isBitmapFile(IPath path) {
        return FileUtils.getSafeFileExtension(path).toLowerCase().equals("bmp") //$NON-NLS-1$
                && editorContext.isValidPath(path);

    }

    /**
     * @param path
     * @return
     */
    private boolean isMaskFile(IPath path) {
        return path.lastSegment().toLowerCase().matches(".*(_mask|_mask_soft)\\.bmp") //$NON-NLS-1$
                || path.lastSegment().matches(".*M\\.bmp"); // another rare style //$NON-NLS-1$
    }

    public List<IImageSourceReference> getImageSourceReferences() {
        return newImageSources;
    }
}